]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
Merge tag 'imx-soc-3.10' of git://git.linaro.org/people/shawnguo/linux-2.6 into next...
authorOlof Johansson <olof@lixom.net>
Sat, 13 Apr 2013 06:55:05 +0000 (23:55 -0700)
committerOlof Johansson <olof@lixom.net>
Sat, 13 Apr 2013 06:55:05 +0000 (23:55 -0700)
From Shawn Guo:
The imx soc changes for 3.10:

* Enable anatop, well bisa and RBC for suspend to optimize the power
  consumption a little bit
* Clock changes for TVE, LDB, PATA, SRTC support
* Add System Reset Controller (SRC) support for imx5 and imx6
* Add initial imx6dl support based on imx6q code
* Kconfig for cpufreq-cpu0, defconfig updates and few other changes

* tag 'imx-soc-3.10' of git://git.linaro.org/people/shawnguo/linux-2.6: (275 commits)
  ARM i.MX53: set CLK_SET_RATE_PARENT flag on the tve_ext_sel clock
  ARM i.MX53: tve_di clock is not part of the CCM, but of TVE
  ARM i.MX53: make tve_ext_sel propagate rate change to PLL
  ARM i.MX53: Remove unused tve_gate clkdev entry
  ARM i.MX5: Remove tve_sel clock from i.MX53 clock tree
  ARM: i.MX5: Add PATA and SRTC clocks
  ARM: imx: do not bring up unavailable cores
  ARM: imx: add initial imx6dl support
  ARM: imx1: mm: add call to mxc_device_init
  ARM: imx_v4_v5_defconfig: Add CONFIG_GPIO_SYSFS
  ARM: imx_v6_v7_defconfig: Select CONFIG_PERF_EVENTS
  ARM: i.MX53 Add the cko1, cko2 clock outputs.
  staging: drm/imx: Use SRC to reset IPU
  ARM i.MX6q: Add GPU, VPU, IPU, and OpenVG resets to System Reset Controller (SRC)
  ARM: imx: do not use regmap_read for ANADIG_DIGPROG
  ARM i.MX6q: set the LDB serial clock parent to the video PLL
  ARM i.MX6q: Add audio/video PLL post dividers for i.MX6q rev 1.1
  ARM i.MX6q: fix ldb di divider and selector clocks
  ARM i.MX53: fix ldb di divider and selector clocks
  ARM i.MX: Add imx_clk_divider_flags and imx_clk_mux_flags
  ...

Signed-off-by: Olof Johansson <olof@lixom.net>
Trivial change/change conflict in arch/arm/mach-imx/mach-imx6q.c resolved.

188 files changed:
Documentation/devicetree/bindings/gpio/gpio.txt
Documentation/devicetree/bindings/pinctrl/pinctrl-single.txt
Documentation/devicetree/bindings/timer/cadence,ttc-timer.txt [new file with mode: 0644]
arch/arm/Kconfig
arch/arm/boot/dts/r8a73a4.dtsi [new file with mode: 0644]
arch/arm/boot/dts/r8a7778.dtsi [new file with mode: 0644]
arch/arm/boot/dts/r8a7779.dtsi [new file with mode: 0644]
arch/arm/boot/dts/r8a7790.dtsi [new file with mode: 0644]
arch/arm/boot/dts/sh73a0.dtsi
arch/arm/boot/dts/spear1310.dtsi
arch/arm/boot/dts/spear1340.dtsi
arch/arm/boot/dts/spear310.dtsi
arch/arm/boot/dts/spear320.dtsi
arch/arm/boot/dts/zynq-7000.dtsi
arch/arm/boot/dts/zynq-zc702.dts
arch/arm/include/asm/irq.h
arch/arm/include/asm/mach/irq.h
arch/arm/include/asm/smp_twd.h
arch/arm/kernel/smp_twd.c
arch/arm/mach-at91/gpio.c
arch/arm/mach-exynos/common.c
arch/arm/mach-exynos/platsmp.c
arch/arm/mach-highbank/highbank.c
arch/arm/mach-highbank/platsmp.c
arch/arm/mach-imx/mach-imx6q.c
arch/arm/mach-imx/platsmp.c
arch/arm/mach-msm/platsmp.c
arch/arm/mach-omap2/omap-smp.c
arch/arm/mach-omap2/timer.c
arch/arm/mach-prima2/platsmp.c
arch/arm/mach-s3c24xx/irq.c
arch/arm/mach-shmobile/Kconfig
arch/arm/mach-shmobile/Makefile
arch/arm/mach-shmobile/board-ag5evm.c
arch/arm/mach-shmobile/board-ap4evb.c
arch/arm/mach-shmobile/board-armadillo800eva.c
arch/arm/mach-shmobile/board-bonito.c
arch/arm/mach-shmobile/board-kota2.c
arch/arm/mach-shmobile/board-kzm9g.c
arch/arm/mach-shmobile/board-mackerel.c
arch/arm/mach-shmobile/board-marzen.c
arch/arm/mach-shmobile/clock-r8a73a4.c [new file with mode: 0644]
arch/arm/mach-shmobile/clock-r8a7740.c
arch/arm/mach-shmobile/clock-r8a7778.c [new file with mode: 0644]
arch/arm/mach-shmobile/clock-r8a7779.c
arch/arm/mach-shmobile/clock-r8a7790.c [new file with mode: 0644]
arch/arm/mach-shmobile/clock-sh7372.c
arch/arm/mach-shmobile/clock-sh73a0.c
arch/arm/mach-shmobile/clock.c
arch/arm/mach-shmobile/headsmp-scu.S [moved from arch/arm/mach-shmobile/headsmp-sh73a0.S with 85% similarity]
arch/arm/mach-shmobile/hotplug.c [deleted file]
arch/arm/mach-shmobile/include/mach/clock.h [new file with mode: 0644]
arch/arm/mach-shmobile/include/mach/common.h
arch/arm/mach-shmobile/include/mach/irqs.h
arch/arm/mach-shmobile/include/mach/r8a73a4.h [new file with mode: 0644]
arch/arm/mach-shmobile/include/mach/r8a7740.h
arch/arm/mach-shmobile/include/mach/r8a7778.h [new file with mode: 0644]
arch/arm/mach-shmobile/include/mach/r8a7779.h
arch/arm/mach-shmobile/include/mach/r8a7790.h [new file with mode: 0644]
arch/arm/mach-shmobile/include/mach/sh7372.h
arch/arm/mach-shmobile/include/mach/sh73a0.h
arch/arm/mach-shmobile/intc-r8a7740.c
arch/arm/mach-shmobile/intc-r8a7779.c
arch/arm/mach-shmobile/intc-sh73a0.c
arch/arm/mach-shmobile/setup-emev2.c
arch/arm/mach-shmobile/setup-r8a73a4.c [new file with mode: 0644]
arch/arm/mach-shmobile/setup-r8a7740.c
arch/arm/mach-shmobile/setup-r8a7778.c [new file with mode: 0644]
arch/arm/mach-shmobile/setup-r8a7779.c
arch/arm/mach-shmobile/setup-r8a7790.c [new file with mode: 0644]
arch/arm/mach-shmobile/setup-sh73a0.c
arch/arm/mach-shmobile/smp-emev2.c
arch/arm/mach-shmobile/smp-r8a7779.c
arch/arm/mach-shmobile/smp-sh73a0.c
arch/arm/mach-socfpga/platsmp.c
arch/arm/mach-spear13xx/platsmp.c
arch/arm/mach-spear13xx/spear13xx.c
arch/arm/mach-tegra/platsmp.c
arch/arm/mach-ux500/platsmp.c
arch/arm/mach-ux500/timer.c
arch/arm/mach-vexpress/v2m.c
arch/arm/mach-virt/platsmp.c
arch/arm/mach-zynq/Kconfig
arch/arm/mach-zynq/Makefile
arch/arm/mach-zynq/common.c
arch/arm/mach-zynq/common.h
arch/arm/mach-zynq/headsmp.S [new file with mode: 0644]
arch/arm/mach-zynq/hotplug.c [new file with mode: 0644]
arch/arm/mach-zynq/platsmp.c [new file with mode: 0644]
arch/arm/mach-zynq/slcr.c [new file with mode: 0644]
arch/arm/mach-zynq/timer.c [deleted file]
arch/arm/plat-samsung/irq-vic-timer.c
arch/arm/plat-samsung/s5p-irq-gpioint.c
arch/arm/plat-versatile/platsmp.c
arch/sh/kernel/cpu/sh2a/pinmux-sh7203.c
arch/sh/kernel/cpu/sh2a/pinmux-sh7264.c
arch/sh/kernel/cpu/sh2a/pinmux-sh7269.c
arch/sh/kernel/cpu/sh3/pinmux-sh7720.c
arch/sh/kernel/cpu/sh4a/pinmux-sh7722.c
arch/sh/kernel/cpu/sh4a/pinmux-sh7723.c
arch/sh/kernel/cpu/sh4a/pinmux-sh7724.c
arch/sh/kernel/cpu/sh4a/pinmux-sh7757.c
arch/sh/kernel/cpu/sh4a/pinmux-sh7785.c
arch/sh/kernel/cpu/sh4a/pinmux-sh7786.c
arch/sh/kernel/cpu/sh4a/pinmux-shx3.c
drivers/clocksource/Kconfig
drivers/clocksource/Makefile
drivers/clocksource/bcm2835_timer.c
drivers/clocksource/cadence_ttc_timer.c [new file with mode: 0644]
drivers/clocksource/clksrc-of.c
drivers/clocksource/tegra20_timer.c
drivers/clocksource/vt8500_timer.c
drivers/gpio/Kconfig
drivers/gpio/Makefile
drivers/gpio/gpio-msm-v2.c
drivers/gpio/gpio-mxc.c
drivers/gpio/gpio-omap.c
drivers/gpio/gpio-pl061.c
drivers/gpio/gpio-pxa.c
drivers/gpio/gpio-rcar.c [new file with mode: 0644]
drivers/gpio/gpio-tegra.c
drivers/gpio/gpiolib-of.c
drivers/irqchip/Kconfig
drivers/irqchip/Makefile
drivers/irqchip/exynos-combiner.c
drivers/irqchip/irq-gic.c
drivers/irqchip/irq-renesas-intc-irqpin.c [new file with mode: 0644]
drivers/irqchip/irq-renesas-irqc.c [new file with mode: 0644]
drivers/irqchip/irq-vic.c
drivers/pinctrl/Kconfig
drivers/pinctrl/core.c
drivers/pinctrl/devicetree.c
drivers/pinctrl/mvebu/pinctrl-mvebu.c
drivers/pinctrl/pinconf-generic.c
drivers/pinctrl/pinconf.c
drivers/pinctrl/pinconf.h
drivers/pinctrl/pinctrl-abx500.c
drivers/pinctrl/pinctrl-at91.c
drivers/pinctrl/pinctrl-bcm2835.c
drivers/pinctrl/pinctrl-exynos.c
drivers/pinctrl/pinctrl-exynos5440.c
drivers/pinctrl/pinctrl-falcon.c
drivers/pinctrl/pinctrl-imx.c
drivers/pinctrl/pinctrl-lantiq.c
drivers/pinctrl/pinctrl-mxs.c
drivers/pinctrl/pinctrl-nomadik.c
drivers/pinctrl/pinctrl-pxa3xx.c
drivers/pinctrl/pinctrl-samsung.c
drivers/pinctrl/pinctrl-single.c
drivers/pinctrl/pinctrl-sirf.c
drivers/pinctrl/pinctrl-sunxi.c
drivers/pinctrl/pinctrl-tegra.c
drivers/pinctrl/pinctrl-u300.c
drivers/pinctrl/pinctrl-xway.c
drivers/pinctrl/sh-pfc/Kconfig
drivers/pinctrl/sh-pfc/Makefile
drivers/pinctrl/sh-pfc/core.c
drivers/pinctrl/sh-pfc/core.h
drivers/pinctrl/sh-pfc/gpio.c
drivers/pinctrl/sh-pfc/pfc-r8a73a4.c [new file with mode: 0644]
drivers/pinctrl/sh-pfc/pfc-r8a7740.c
drivers/pinctrl/sh-pfc/pfc-r8a7779.c
drivers/pinctrl/sh-pfc/pfc-sh7203.c
drivers/pinctrl/sh-pfc/pfc-sh7264.c
drivers/pinctrl/sh-pfc/pfc-sh7269.c
drivers/pinctrl/sh-pfc/pfc-sh7372.c
drivers/pinctrl/sh-pfc/pfc-sh73a0.c
drivers/pinctrl/sh-pfc/pfc-sh7720.c
drivers/pinctrl/sh-pfc/pfc-sh7722.c
drivers/pinctrl/sh-pfc/pfc-sh7723.c
drivers/pinctrl/sh-pfc/pfc-sh7724.c
drivers/pinctrl/sh-pfc/pfc-sh7734.c
drivers/pinctrl/sh-pfc/pfc-sh7757.c
drivers/pinctrl/sh-pfc/pfc-sh7785.c
drivers/pinctrl/sh-pfc/pfc-sh7786.c
drivers/pinctrl/sh-pfc/pfc-shx3.c
drivers/pinctrl/sh-pfc/pinctrl.c
drivers/pinctrl/sh-pfc/sh_pfc.h
drivers/pinctrl/spear/pinctrl-plgpio.c
drivers/pinctrl/spear/pinctrl-spear.c
drivers/staging/imx-drm/ipu-v3/ipu-common.c
include/linux/clocksource.h
include/linux/irqchip/arm-gic.h
include/linux/irqchip/chained_irq.h [new file with mode: 0644]
include/linux/pinctrl/pinctrl.h
include/linux/platform_data/gpio-rcar.h [new file with mode: 0644]
include/linux/platform_data/irq-renesas-intc-irqpin.h [new file with mode: 0644]
include/linux/platform_data/irq-renesas-irqc.h [new file with mode: 0644]

index a33628759d36e10a0c4b2c181458311134561eaa..d933af37069791f8a0e15a6f31f5edf3358d6377 100644 (file)
@@ -98,7 +98,7 @@ announce the pinrange to the pin ctrl subsystem. For example,
                compatible = "fsl,qe-pario-bank-e", "fsl,qe-pario-bank";
                reg = <0x1460 0x18>;
                gpio-controller;
-               gpio-ranges = <&pinctrl1 20 10>, <&pinctrl2 50 20>;
+               gpio-ranges = <&pinctrl1 0 20 10>, <&pinctrl2 10 50 20>;
 
     }
 
@@ -107,8 +107,8 @@ where,
 
    Next values specify the base pin and number of pins for the range
    handled by 'qe_pio_e' gpio. In the given example from base pin 20 to
-   pin 29 under pinctrl1 and pin 50 to pin 69 under pinctrl2 is handled
-   by this gpio controller.
+   pin 29 under pinctrl1 with gpio offset 0 and pin 50 to pin 69 under
+   pinctrl2 with gpio offset 10 is handled by this gpio controller.
 
 The pinctrl node must have "#gpio-range-cells" property to show number of
 arguments to pass with phandle from gpio controllers node.
index 2c81e45f1374ccd7b5b79c1bb2872639c4d04652..fa1746b639b9e97d4d87e5a271655cc7ea04b455 100644 (file)
@@ -1,7 +1,9 @@
 One-register-per-pin type device tree based pinctrl driver
 
 Required properties:
-- compatible : "pinctrl-single"
+- compatible : "pinctrl-single" or "pinconf-single".
+  "pinctrl-single" means that pinconf isn't supported.
+  "pinconf-single" means that generic pinconf is supported.
 
 - reg : offset and length of the register set for the mux registers
 
@@ -14,9 +16,61 @@ Optional properties:
 - pinctrl-single,function-off : function off mode for disabled state if
   available and same for all registers; if not specified, disabling of
   pin functions is ignored
+
 - pinctrl-single,bit-per-mux : boolean to indicate that one register controls
   more than one pin
 
+- pinctrl-single,drive-strength : array of value that are used to configure
+  drive strength in the pinmux register. They're value of drive strength
+  current and drive strength mask.
+
+               /* drive strength current, mask */
+               pinctrl-single,power-source = <0x30 0xf0>;
+
+- pinctrl-single,bias-pullup : array of value that are used to configure the
+  input bias pullup in the pinmux register.
+
+               /* input, enabled pullup bits, disabled pullup bits, mask */
+               pinctrl-single,bias-pullup = <0 1 0 1>;
+
+- pinctrl-single,bias-pulldown : array of value that are used to configure the
+  input bias pulldown in the pinmux register.
+
+               /* input, enabled pulldown bits, disabled pulldown bits, mask */
+               pinctrl-single,bias-pulldown = <2 2 0 2>;
+
+  * Two bits to control input bias pullup and pulldown: User should use
+    pinctrl-single,bias-pullup & pinctrl-single,bias-pulldown. One bit means
+    pullup, and the other one bit means pulldown.
+  * Three bits to control input bias enable, pullup and pulldown. User should
+    use pinctrl-single,bias-pullup & pinctrl-single,bias-pulldown. Input bias
+    enable bit should be included in pullup or pulldown bits.
+  * Although driver could set PIN_CONFIG_BIAS_DISABLE, there's no property as
+    pinctrl-single,bias-disable. Because pinctrl single driver could implement
+    it by calling pulldown, pullup disabled.
+
+- pinctrl-single,input-schmitt : array of value that are used to configure
+  input schmitt in the pinmux register. In some silicons, there're two input
+  schmitt value (rising-edge & falling-edge) in the pinmux register.
+
+               /* input schmitt value, mask */
+               pinctrl-single,input-schmitt = <0x30 0x70>;
+
+- pinctrl-single,input-schmitt-enable : array of value that are used to
+  configure input schmitt enable or disable in the pinmux register.
+
+               /* input, enable bits, disable bits, mask */
+               pinctrl-single,input-schmitt-enable = <0x30 0x40 0 0x70>;
+
+- pinctrl-single,gpio-range : list of value that are used to configure a GPIO
+  range. They're value of subnode phandle, pin base in pinctrl device, pin
+  number in this range, GPIO function value of this GPIO range.
+  The number of parameters is depend on #pinctrl-single,gpio-range-cells
+  property.
+
+               /* pin base, nr pins & gpio function */
+               pinctrl-single,gpio-range = <&range 0 3 0 &range 3 9 1>;
+
 This driver assumes that there is only one register for each pin (unless the
 pinctrl-single,bit-per-mux is set), and uses the common pinctrl bindings as
 specified in the pinctrl-bindings.txt document in this directory.
@@ -42,6 +96,20 @@ Where 0xdc is the offset from the pinctrl register base address for the
 device pinctrl register, 0x18 is the desired value, and 0xff is the sub mask to
 be used when applying this change to the register.
 
+
+Optional sub-node: In case some pins could be configured as GPIO in the pinmux
+register, those pins could be defined as a GPIO range. This sub-node is required
+by pinctrl-single,gpio-range property.
+
+Required properties in sub-node:
+- #pinctrl-single,gpio-range-cells : the number of parameters after phandle in
+  pinctrl-single,gpio-range property.
+
+       range: gpio-range {
+               #pinctrl-single,gpio-range-cells = <3>;
+       };
+
+
 Example:
 
 /* SoC common file */
@@ -76,6 +144,29 @@ control_devconf0: pinmux@48002274 {
        pinctrl-single,function-mask = <0x5F>;
 };
 
+/* third controller instance for pins in gpio domain */
+pmx_gpio: pinmux@d401e000 {
+       compatible = "pinconf-single";
+       reg = <0xd401e000 0x0330>;
+       #address-cells = <1>;
+       #size-cells = <1>;
+       ranges;
+
+       pinctrl-single,register-width = <32>;
+       pinctrl-single,function-mask = <7>;
+
+       /* sparse GPIO range could be supported */
+       pinctrl-single,gpio-range = <&range 0 3 0 &range 3 9 1
+                               &range 12 1 0 &range 13 29 1
+                               &range 43 1 0 &range 44 49 1
+                               &range 94 1 1 &range 96 2 1>;
+
+       range: gpio-range {
+               #pinctrl-single,gpio-range-cells = <3>;
+       };
+};
+
+
 /* board specific .dts file */
 
 &pmx_core {
@@ -96,6 +187,15 @@ control_devconf0: pinmux@48002274 {
                >;
        };
 
+       uart0_pins: pinmux_uart0_pins {
+               pinctrl-single,pins = <
+                       0x208 0         /* UART0_RXD (IOCFG138) */
+                       0x20c 0         /* UART0_TXD (IOCFG139) */
+               >;
+               pinctrl-single,bias-pulldown = <0 2 2>;
+               pinctrl-single,bias-pullup = <0 1 1>;
+       };
+
        /* map uart2 pins */
        uart2_pins: pinmux_uart2_pins {
                pinctrl-single,pins = <
@@ -122,6 +222,11 @@ control_devconf0: pinmux@48002274 {
 
 };
 
+&uart1 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&uart0_pins>;
+};
+
 &uart2 {
        pinctrl-names = "default";
        pinctrl-0 = <&uart2_pins>;
diff --git a/Documentation/devicetree/bindings/timer/cadence,ttc-timer.txt b/Documentation/devicetree/bindings/timer/cadence,ttc-timer.txt
new file mode 100644 (file)
index 0000000..993695c
--- /dev/null
@@ -0,0 +1,17 @@
+Cadence TTC - Triple Timer Counter
+
+Required properties:
+- compatible : Should be "cdns,ttc".
+- reg : Specifies base physical address and size of the registers.
+- interrupts : A list of 3 interrupts; one per timer channel.
+- clocks: phandle to the source clock
+
+Example:
+
+ttc0: ttc0@f8001000 {
+       interrupt-parent = <&intc>;
+       interrupts = < 0 10 4 0 11 4 0 12 4 >;
+       compatible = "cdns,ttc";
+       reg = <0xF8001000 0x1000>;
+       clocks = <&cpu_clk 3>;
+};
index e904ddcccc286d157e3f4c70cf6eec6d6df2bbd5..8d39c8ba9691baecba334d27b2683b16b66228d6 100644 (file)
@@ -723,7 +723,7 @@ config ARCH_SHMOBILE
        select MULTI_IRQ_HANDLER
        select NEED_MACH_MEMORY_H
        select NO_IOPORT
-       select PINCTRL
+       select PINCTRL if ARCH_WANT_OPTIONAL_GPIOLIB
        select PM_GENERIC_DOMAINS if PM
        select SPARSE_IRQ
        help
@@ -1603,6 +1603,7 @@ config HAVE_ARM_ARCH_TIMER
 config HAVE_ARM_TWD
        bool
        depends on SMP
+       select CLKSRC_OF if OF
        help
          This options enables support for the ARM timer and watchdog unit
 
diff --git a/arch/arm/boot/dts/r8a73a4.dtsi b/arch/arm/boot/dts/r8a73a4.dtsi
new file mode 100644 (file)
index 0000000..fde2a33
--- /dev/null
@@ -0,0 +1,94 @@
+/*
+ * Device Tree Source for the r8a73a4 SoC
+ *
+ * Copyright (C) 2013 Renesas Solutions Corp.
+ * Copyright (C) 2013 Magnus Damm
+ *
+ * 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.
+ */
+
+/ {
+       compatible = "renesas,r8a73a4";
+       interrupt-parent = <&gic>;
+       #address-cells = <2>;
+       #size-cells = <2>;
+
+       cpus {
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               cpu0: cpu@0 {
+                       device_type = "cpu";
+                       compatible = "arm,cortex-a15";
+                       reg = <0>;
+                       clock-frequency = <1500000000>;
+               };
+       };
+
+       gic: interrupt-controller@f1001000 {
+               compatible = "arm,cortex-a15-gic";
+               #interrupt-cells = <3>;
+               #address-cells = <0>;
+               interrupt-controller;
+               reg = <0 0xf1001000 0 0x1000>,
+                       <0 0xf1002000 0 0x1000>,
+                       <0 0xf1004000 0 0x2000>,
+                       <0 0xf1006000 0 0x2000>;
+               interrupts = <1 9 0xf04>;
+
+               gic-cpuif@4 {
+                       compatible = "arm,gic-cpuif";
+                       cpuif-id = <4>;
+                       cpu = <&cpu0>;
+               };
+       };
+
+       timer {
+               compatible = "arm,armv7-timer";
+               interrupts = <1 13 0xf08>,
+                               <1 14 0xf08>,
+                               <1 11 0xf08>,
+                               <1 10 0xf08>;
+       };
+
+       irqc0: interrupt-controller@e61c0000 {
+               compatible = "renesas,irqc";
+               #interrupt-cells = <2>;
+               interrupt-controller;
+               reg = <0 0xe61c0000 0 0x200>;
+               interrupt-parent = <&gic>;
+               interrupts = <0 0 4>, <0 1 4>, <0 2 4>, <0 3 4>,
+                               <0 4 4>, <0 5 4>, <0 6 4>, <0 7 4>,
+                               <0 8 4>, <0 9 4>, <0 10 4>, <0 11 4>,
+                               <0 12 4>, <0 13 4>, <0 14 4>, <0 15 4>,
+                               <0 16 4>, <0 17 4>, <0 18 4>, <0 19 4>,
+                               <0 20 4>, <0 21 4>, <0 22 4>, <0 23 4>,
+                               <0 24 4>, <0 25 4>, <0 26 4>, <0 27 4>,
+                               <0 28 4>, <0 29 4>, <0 30 4>, <0 31 4>;
+       };
+
+       irqc1: interrupt-controller@e61c0200 {
+               compatible = "renesas,irqc";
+               #interrupt-cells = <2>;
+               interrupt-controller;
+               reg = <0 0xe61c0200 0 0x200>;
+               interrupt-parent = <&gic>;
+               interrupts = <0 32 4>, <0 33 4>, <0 34 4>, <0 35 4>,
+                               <0 36 4>, <0 37 4>, <0 38 4>, <0 39 4>,
+                               <0 40 4>, <0 41 4>, <0 42 4>, <0 43 4>,
+                               <0 44 4>, <0 45 4>, <0 46 4>, <0 47 4>,
+                               <0 48 4>, <0 49 4>, <0 50 4>, <0 51 4>,
+                               <0 52 4>, <0 53 4>, <0 54 4>, <0 55 4>,
+                               <0 56 4>, <0 57 4>;
+       };
+
+       thermal@e61f0000 {
+               compatible = "renesas,rcar-thermal";
+               reg = <0 0xe61f0000 0 0x14>, <0 0xe61f0100 0 0x38>,
+                        <0 0xe61f0200 0 0x38>, <0 0xe61f0300 0 0x38>;
+               interrupt-parent = <&gic>;
+               interrupts = <0 69 4>;
+       };
+};
diff --git a/arch/arm/boot/dts/r8a7778.dtsi b/arch/arm/boot/dts/r8a7778.dtsi
new file mode 100644 (file)
index 0000000..4743735
--- /dev/null
@@ -0,0 +1,35 @@
+/*
+ * Device Tree Source for Renesas r8a7778
+ *
+ * Copyright (C) 2013  Renesas Solutions Corp.
+ * Copyright (C) 2013  Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
+ *
+ * based on r8a7779
+ *
+ * Copyright (C) 2013 Renesas Solutions Corp.
+ * Copyright (C) 2013 Simon Horman
+ *
+ * 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/ "skeleton.dtsi"
+
+/ {
+       compatible = "renesas,r8a7778";
+
+       cpus {
+               cpu@0 {
+                       compatible = "arm,cortex-a9";
+               };
+       };
+
+       gic: interrupt-controller@fe438000 {
+               compatible = "arm,cortex-a9-gic";
+               #interrupt-cells = <3>;
+               interrupt-controller;
+               reg = <0xfe438000 0x1000>,
+                     <0xfe430000 0x100>;
+       };
+};
diff --git a/arch/arm/boot/dts/r8a7779.dtsi b/arch/arm/boot/dts/r8a7779.dtsi
new file mode 100644 (file)
index 0000000..fe5c6f2
--- /dev/null
@@ -0,0 +1,98 @@
+/*
+ * Device Tree Source for Renesas r8a7779
+ *
+ * Copyright (C) 2013 Renesas Solutions Corp.
+ * Copyright (C) 2013 Simon Horman
+ *
+ * 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/ "skeleton.dtsi"
+
+/ {
+       compatible = "renesas,r8a7779";
+
+       cpus {
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               cpu@0 {
+                       device_type = "cpu";
+                       compatible = "arm,cortex-a9";
+                       reg = <0>;
+               };
+               cpu@1 {
+                       device_type = "cpu";
+                       compatible = "arm,cortex-a9";
+                       reg = <1>;
+               };
+               cpu@2 {
+                       device_type = "cpu";
+                       compatible = "arm,cortex-a9";
+                       reg = <2>;
+               };
+               cpu@3 {
+                       device_type = "cpu";
+                       compatible = "arm,cortex-a9";
+                       reg = <3>;
+               };
+       };
+
+        gic: interrupt-controller@f0001000 {
+                compatible = "arm,cortex-a9-gic";
+                #interrupt-cells = <3>;
+                interrupt-controller;
+                reg = <0xf0001000 0x1000>,
+                      <0xf0000100 0x100>;
+        };
+
+       i2c0: i2c@0xffc70000 {
+               #address-cells = <1>;
+               #size-cells = <0>;
+               compatible = "renesas,rmobile-iic";
+               reg = <0xffc70000 0x1000>;
+               interrupt-parent = <&gic>;
+               interrupts = <0 79 0x4>;
+       };
+
+       i2c1: i2c@0xffc71000 {
+               #address-cells = <1>;
+               #size-cells = <0>;
+               compatible = "renesas,rmobile-iic";
+               reg = <0xffc71000 0x1000>;
+               interrupt-parent = <&gic>;
+               interrupts = <0 82 0x4>;
+       };
+
+       i2c2: i2c@0xffc72000 {
+               #address-cells = <1>;
+               #size-cells = <0>;
+               compatible = "renesas,rmobile-iic";
+               reg = <0xffc72000 0x1000>;
+               interrupt-parent = <&gic>;
+               interrupts = <0 80 0x4>;
+       };
+
+       i2c3: i2c@0xffc73000 {
+               #address-cells = <1>;
+               #size-cells = <0>;
+               compatible = "renesas,rmobile-iic";
+               reg = <0xffc73000 0x1000>;
+               interrupt-parent = <&gic>;
+               interrupts = <0 81 0x4>;
+       };
+
+       thermal@ffc48000 {
+               compatible = "renesas,rcar-thermal";
+               reg = <0xffc48000 0x38>;
+       };
+
+       sata: sata@fc600000 {
+               compatible = "renesas,rcar-sata";
+               reg = <0xfc600000 0x2000>;
+               interrupt-parent = <&gic>;
+               interrupts = <0 100 0x4>;
+       };
+};
diff --git a/arch/arm/boot/dts/r8a7790.dtsi b/arch/arm/boot/dts/r8a7790.dtsi
new file mode 100644 (file)
index 0000000..7a17110
--- /dev/null
@@ -0,0 +1,63 @@
+/*
+ * Device Tree Source for the r8a7790 SoC
+ *
+ * Copyright (C) 2013 Renesas Solutions Corp.
+ *
+ * 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.
+ */
+
+/ {
+       compatible = "renesas,r8a7790";
+       interrupt-parent = <&gic>;
+       #address-cells = <2>;
+       #size-cells = <2>;
+
+       cpus {
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               cpu0: cpu@0 {
+                       device_type = "cpu";
+                       compatible = "arm,cortex-a15";
+                       reg = <0>;
+                       clock-frequency = <1300000000>;
+               };
+       };
+
+       gic: interrupt-controller@f1001000 {
+               compatible = "arm,cortex-a15-gic";
+               #interrupt-cells = <3>;
+               #address-cells = <0>;
+               interrupt-controller;
+               reg = <0 0xf1001000 0 0x1000>,
+                       <0 0xf1002000 0 0x1000>,
+                       <0 0xf1004000 0 0x2000>,
+                       <0 0xf1006000 0 0x2000>;
+               interrupts = <1 9 0xf04>;
+
+               gic-cpuif@4 {
+                       compatible = "arm,gic-cpuif";
+                       cpuif-id = <4>;
+                       cpu = <&cpu0>;
+               };
+       };
+
+       timer {
+               compatible = "arm,armv7-timer";
+               interrupts = <1 13 0xf08>,
+                               <1 14 0xf08>,
+                               <1 11 0xf08>,
+                               <1 10 0xf08>;
+       };
+
+       irqc0: interrupt-controller@e61c0000 {
+               compatible = "renesas,irqc";
+               #interrupt-cells = <2>;
+               interrupt-controller;
+               reg = <0 0xe61c0000 0 0x200>;
+               interrupt-parent = <&gic>;
+               interrupts = <0 0 4>, <0 1 4>, <0 2 4>, <0 3 4>;
+       };
+};
index 8a59465d0231c63abe3d49329747226360f48841..7e71e3a8576707a0e2ffd23de35483174d54129a 100644 (file)
                      <0xf0000100 0x100>;
        };
 
+       irqpin0: irqpin@e6900000 {
+               compatible = "renesas,intc-irqpin";
+               #interrupt-cells = <2>;
+               interrupt-controller;
+               reg = <0xe6900000 4>,
+                       <0xe6900010 4>,
+                       <0xe6900020 1>,
+                       <0xe6900040 1>,
+                       <0xe6900060 1>;
+               interrupt-parent = <&gic>;
+               interrupts = <0 1 0x4
+                             0 2 0x4
+                             0 3 0x4
+                             0 4 0x4
+                             0 5 0x4
+                             0 6 0x4
+                             0 7 0x4
+                             0 8 0x4>;
+       };
+
+       irqpin1: irqpin@e6900004 {
+               compatible = "renesas,intc-irqpin";
+               #interrupt-cells = <2>;
+               interrupt-controller;
+               reg = <0xe6900004 4>,
+                       <0xe6900014 4>,
+                       <0xe6900024 1>,
+                       <0xe6900044 1>,
+                       <0xe6900064 1>;
+               interrupt-parent = <&gic>;
+               interrupts = <0 9 0x4
+                             0 10 0x4
+                             0 11 0x4
+                             0 12 0x4
+                             0 13 0x4
+                             0 14 0x4
+                             0 15 0x4
+                             0 16 0x4>;
+               control-parent;
+       };
+
+       irqpin2: irqpin@e6900008 {
+               compatible = "renesas,intc-irqpin";
+               #interrupt-cells = <2>;
+               interrupt-controller;
+               reg = <0xe6900008 4>,
+                       <0xe6900018 4>,
+                       <0xe6900028 1>,
+                       <0xe6900048 1>,
+                       <0xe6900068 1>;
+               interrupt-parent = <&gic>;
+               interrupts = <0 17 0x4
+                             0 18 0x4
+                             0 19 0x4
+                             0 20 0x4
+                             0 21 0x4
+                             0 22 0x4
+                             0 23 0x4
+                             0 24 0x4>;
+       };
+
+       irqpin3: irqpin@e690000c {
+               compatible = "renesas,intc-irqpin";
+               #interrupt-cells = <2>;
+               interrupt-controller;
+               reg = <0xe690000c 4>,
+                       <0xe690001c 4>,
+                       <0xe690002c 1>,
+                       <0xe690004c 1>,
+                       <0xe690006c 1>;
+               interrupt-parent = <&gic>;
+               interrupts = <0 25 0x4
+                             0 26 0x4
+                             0 27 0x4
+                             0 28 0x4
+                             0 29 0x4
+                             0 30 0x4
+                             0 31 0x4
+                             0 32 0x4>;
+       };
+
        i2c0: i2c@0xe6820000 {
                #address-cells = <1>;
                #size-cells = <0>;
index 1513c1927cc8f2b2e3d7e64e3eabfd0c4ec1ff96..122ae94076c8a7785e2bf1e92c97dfee77bbc674 100644 (file)
@@ -89,7 +89,7 @@
                pinmux: pinmux@e0700000 {
                        compatible = "st,spear1310-pinmux";
                        reg = <0xe0700000 0x1000>;
-                       #gpio-range-cells = <2>;
+                       #gpio-range-cells = <3>;
                };
 
                apb {
                                interrupt-controller;
                                gpio-controller;
                                #gpio-cells = <2>;
-                               gpio-ranges = <&pinmux 0 246>;
+                               gpio-ranges = <&pinmux 0 246>;
                                status = "disabled";
 
                                st-plgpio,ngpio = <246>;
index 34da11aa679504616359ec759568d31160eb829a..c511c4772efdd8f85b17dac9fac18030f0782845 100644 (file)
@@ -63,7 +63,7 @@
                pinmux: pinmux@e0700000 {
                        compatible = "st,spear1340-pinmux";
                        reg = <0xe0700000 0x1000>;
-                       #gpio-range-cells = <2>;
+                       #gpio-range-cells = <3>;
                };
 
                pwm: pwm@e0180000 {
                                interrupt-controller;
                                gpio-controller;
                                #gpio-cells = <2>;
-                               gpio-ranges = <&pinmux 0 252>;
+                               gpio-ranges = <&pinmux 0 252>;
                                status = "disabled";
 
                                st-plgpio,ngpio = <250>;
index ab45b8c81982d17937052943370517bdfb6cb261..95372080eea60b38f3397cebf52bfb5364900e1c 100644 (file)
@@ -25,7 +25,7 @@
                pinmux: pinmux@b4000000 {
                        compatible = "st,spear310-pinmux";
                        reg = <0xb4000000 0x1000>;
-                       #gpio-range-cells = <2>;
+                       #gpio-range-cells = <3>;
                };
 
                fsmc: flash@44000000 {
                                interrupt-controller;
                                gpio-controller;
                                #gpio-cells = <2>;
-                               gpio-ranges = <&pinmux 0 102>;
+                               gpio-ranges = <&pinmux 0 102>;
                                status = "disabled";
 
                                st-plgpio,ngpio = <102>;
index caa5520b1fd4e4e243f194c821d4b196833a1bee..ffea342aeec99575612c38224f05aeaa70594640 100644 (file)
@@ -24,7 +24,7 @@
                pinmux: pinmux@b3000000 {
                        compatible = "st,spear320-pinmux";
                        reg = <0xb3000000 0x1000>;
-                       #gpio-range-cells = <2>;
+                       #gpio-range-cells = <3>;
                };
 
                clcd@90000000 {
                                interrupt-controller;
                                gpio-controller;
                                #gpio-cells = <2>;
-                               gpio-ranges = <&pinmux 0 102>;
+                               gpio-ranges = <&pinmux 0 102>;
                                status = "disabled";
 
                                st-plgpio,ngpio = <102>;
index 5914b5654591083f9a14e8d8cab15bd1fc47a3ef..2a1df1bc4b9927c6b7bc00d79485f6243950eba6 100644 (file)
                };
 
                ttc0: ttc0@f8001000 {
-                       #address-cells = <1>;
-                       #size-cells = <0>;
-                       compatible = "xlnx,ttc";
+                       interrupt-parent = <&intc>;
+                       interrupts = < 0 10 4 0 11 4 0 12 4 >;
+                       compatible = "cdns,ttc";
                        reg = <0xF8001000 0x1000>;
                        clocks = <&cpu_clk 3>;
                        clock-names = "cpu_1x";
                        clock-ranges;
-
-                       ttc0_0: ttc0.0 {
-                               status = "disabled";
-                               reg = <0>;
-                               interrupts = <0 10 4>;
-                       };
-                       ttc0_1: ttc0.1 {
-                               status = "disabled";
-                               reg = <1>;
-                               interrupts = <0 11 4>;
-                       };
-                       ttc0_2: ttc0.2 {
-                               status = "disabled";
-                               reg = <2>;
-                               interrupts = <0 12 4>;
-                       };
                };
 
                ttc1: ttc1@f8002000 {
-                       #interrupt-parent = <&intc>;
-                       #address-cells = <1>;
-                       #size-cells = <0>;
-                       compatible = "xlnx,ttc";
+                       interrupt-parent = <&intc>;
+                       interrupts = < 0 37 4 0 38 4 0 39 4 >;
+                       compatible = "cdns,ttc";
                        reg = <0xF8002000 0x1000>;
                        clocks = <&cpu_clk 3>;
                        clock-names = "cpu_1x";
                        clock-ranges;
-
-                       ttc1_0: ttc1.0 {
-                               status = "disabled";
-                               reg = <0>;
-                               interrupts = <0 37 4>;
-                       };
-                       ttc1_1: ttc1.1 {
-                               status = "disabled";
-                               reg = <1>;
-                               interrupts = <0 38 4>;
-                       };
-                       ttc1_2: ttc1.2 {
-                               status = "disabled";
-                               reg = <2>;
-                               interrupts = <0 39 4>;
-                       };
                };
+               scutimer: scutimer@f8f00600 {
+                       interrupt-parent = <&intc>;
+                       interrupts = < 1 13 0x301 >;
+                       compatible = "arm,cortex-a9-twd-timer";
+                       reg = < 0xf8f00600 0x20 >;
+                       clocks = <&cpu_clk 1>;
+               } ;
        };
 };
index c772942a399af0bf6d6682baea61a195c5ba4c3b..86f44d5b0265bf8fe3b7c6da4370d409e7f9b7d0 100644 (file)
 &ps_clk {
        clock-frequency = <33333330>;
 };
-
-&ttc0_0 {
-       status = "ok";
-       compatible = "xlnx,ttc-counter-clocksource";
-};
-
-&ttc0_1 {
-       status = "ok";
-       compatible = "xlnx,ttc-counter-clockevent";
-};
index 35c21c375d81c19121495c66114ead04044f0fa3..53c15dec7af6aa09faee9b1851782f9244365e56 100644 (file)
@@ -30,6 +30,11 @@ extern void asm_do_IRQ(unsigned int, struct pt_regs *);
 void handle_IRQ(unsigned int, struct pt_regs *);
 void init_IRQ(void);
 
+#ifdef CONFIG_MULTI_IRQ_HANDLER
+extern void (*handle_arch_irq)(struct pt_regs *);
+extern void set_handle_irq(void (*handle_irq)(struct pt_regs *));
+#endif
+
 #endif
 
 #endif
index 18c883023339a39ad246e6de7a066106365e3078..2092ee1e1300075c628b9e4cf89b0045cb118a04 100644 (file)
@@ -20,11 +20,6 @@ struct seq_file;
 extern void init_FIQ(int);
 extern int show_fiq_list(struct seq_file *, int);
 
-#ifdef CONFIG_MULTI_IRQ_HANDLER
-extern void (*handle_arch_irq)(struct pt_regs *);
-extern void set_handle_irq(void (*handle_irq)(struct pt_regs *));
-#endif
-
 /*
  * This is for easy migration, but should be changed in the source
  */
@@ -35,35 +30,4 @@ do {                                                 \
        raw_spin_unlock(&desc->lock);                   \
 } while(0)
 
-#ifndef __ASSEMBLY__
-/*
- * Entry/exit functions for chained handlers where the primary IRQ chip
- * may implement either fasteoi or level-trigger flow control.
- */
-static inline void chained_irq_enter(struct irq_chip *chip,
-                                    struct irq_desc *desc)
-{
-       /* FastEOI controllers require no action on entry. */
-       if (chip->irq_eoi)
-               return;
-
-       if (chip->irq_mask_ack) {
-               chip->irq_mask_ack(&desc->irq_data);
-       } else {
-               chip->irq_mask(&desc->irq_data);
-               if (chip->irq_ack)
-                       chip->irq_ack(&desc->irq_data);
-       }
-}
-
-static inline void chained_irq_exit(struct irq_chip *chip,
-                                   struct irq_desc *desc)
-{
-       if (chip->irq_eoi)
-               chip->irq_eoi(&desc->irq_data);
-       else
-               chip->irq_unmask(&desc->irq_data);
-}
-#endif
-
 #endif
index 0f01f4677bd27569df340029cabe9f602a1e0eeb..7b2899c2f7fc8a4f07221bb599df93c6c4756f5f 100644 (file)
@@ -34,12 +34,4 @@ struct twd_local_timer name __initdata = {   \
 
 int twd_local_timer_register(struct twd_local_timer *);
 
-#ifdef CONFIG_HAVE_ARM_TWD
-void twd_local_timer_of_register(void);
-#else
-static inline void twd_local_timer_of_register(void)
-{
-}
-#endif
-
 #endif
index 3f256503748005346d5f1388aa1ed30978433b03..90525d9d290b9c25e3b40d5bdeedfc6a6f524cf6 100644 (file)
@@ -362,25 +362,13 @@ int __init twd_local_timer_register(struct twd_local_timer *tlt)
 }
 
 #ifdef CONFIG_OF
-const static struct of_device_id twd_of_match[] __initconst = {
-       { .compatible = "arm,cortex-a9-twd-timer",      },
-       { .compatible = "arm,cortex-a5-twd-timer",      },
-       { .compatible = "arm,arm11mp-twd-timer",        },
-       { },
-};
-
-void __init twd_local_timer_of_register(void)
+static void __init twd_local_timer_of_register(struct device_node *np)
 {
-       struct device_node *np;
        int err;
 
        if (!is_smp() || !setup_max_cpus)
                return;
 
-       np = of_find_matching_node(NULL, twd_of_match);
-       if (!np)
-               return;
-
        twd_ppi = irq_of_parse_and_map(np, 0);
        if (!twd_ppi) {
                err = -EINVAL;
@@ -398,4 +386,7 @@ void __init twd_local_timer_of_register(void)
 out:
        WARN(err, "twd_local_timer_of_register failed (%d)\n", err);
 }
+CLOCKSOURCE_OF_DECLARE(arm_twd_a9, "arm,cortex-a9-twd-timer", twd_local_timer_of_register);
+CLOCKSOURCE_OF_DECLARE(arm_twd_a5, "arm,cortex-a5-twd-timer", twd_local_timer_of_register);
+CLOCKSOURCE_OF_DECLARE(arm_twd_11mp, "arm,arm11mp-twd-timer", twd_local_timer_of_register);
 #endif
index c5d7e1e9d7578cffc8265e9205c2a8e8162a311a..a5afcf76550e3d592f1e7eaf8024327cb6716de3 100644 (file)
 #include <linux/module.h>
 #include <linux/io.h>
 #include <linux/irqdomain.h>
+#include <linux/irqchip/chained_irq.h>
 #include <linux/of_address.h>
 
-#include <asm/mach/irq.h>
-
 #include <mach/hardware.h>
 #include <mach/at91_pio.h>
 
index d63d399c7bae2801e2c1e9f03590cfa13ad77674..7bc0f9aa8b331cb8ec072639b5e7ef9d7141b05e 100644 (file)
@@ -26,6 +26,7 @@
 #include <linux/irqchip.h>
 #include <linux/of_address.h>
 #include <linux/irqchip/arm-gic.h>
+#include <linux/irqchip/chained_irq.h>
 
 #include <asm/proc-fns.h>
 #include <asm/exception.h>
index 60f7c5be057d3c2440f7613b4ccdecd897753249..95e04bd5813fad587591d4fe25bf41800f087d96 100644 (file)
@@ -20,7 +20,6 @@
 #include <linux/jiffies.h>
 #include <linux/smp.h>
 #include <linux/io.h>
-#include <linux/irqchip/arm-gic.h>
 
 #include <asm/cacheflush.h>
 #include <asm/smp_plat.h>
@@ -75,13 +74,6 @@ static DEFINE_SPINLOCK(boot_lock);
 
 static void __cpuinit exynos_secondary_init(unsigned int cpu)
 {
-       /*
-        * if any interrupts are already enabled for the primary
-        * core (e.g. timer irq), then they will not have been enabled
-        * for us: do so
-        */
-       gic_secondary_init(0);
-
        /*
         * let the primary processor know we're out of the
         * pen, then head off into the C entry point
index a4f9f50247d4e9e4f5dc008436145b9a204bc2cb..76c1170b35284a0c96646413bb29476add96c7c3 100644 (file)
@@ -32,7 +32,6 @@
 #include <asm/cacheflush.h>
 #include <asm/cputype.h>
 #include <asm/smp_plat.h>
-#include <asm/smp_twd.h>
 #include <asm/hardware/arm_timer.h>
 #include <asm/hardware/timer-sp.h>
 #include <asm/hardware/cache-l2x0.h>
@@ -119,10 +118,10 @@ static void __init highbank_timer_init(void)
        sp804_clocksource_and_sched_clock_init(timer_base + 0x20, "timer1");
        sp804_clockevents_init(timer_base, irq, "timer0");
 
-       twd_local_timer_of_register();
-
        arch_timer_of_register();
        arch_timer_sched_clock_init();
+
+       clocksource_of_init();
 }
 
 static void highbank_power_off(void)
index 8797a7001720a3148a617a68ca8e1e46501072a1..a984573e0d02323c62cdfe11aadb12ae3f37ecda 100644 (file)
@@ -17,7 +17,6 @@
 #include <linux/init.h>
 #include <linux/smp.h>
 #include <linux/io.h>
-#include <linux/irqchip/arm-gic.h>
 
 #include <asm/smp_scu.h>
 
 
 extern void secondary_startup(void);
 
-static void __cpuinit highbank_secondary_init(unsigned int cpu)
-{
-       gic_secondary_init(0);
-}
-
 static int __cpuinit highbank_boot_secondary(unsigned int cpu, struct task_struct *idle)
 {
        highbank_set_cpu_jump(cpu, secondary_startup);
@@ -67,7 +61,6 @@ static void __init highbank_smp_prepare_cpus(unsigned int max_cpus)
 struct smp_operations highbank_smp_ops __initdata = {
        .smp_init_cpus          = highbank_smp_init_cpus,
        .smp_prepare_cpus       = highbank_smp_prepare_cpus,
-       .smp_secondary_init     = highbank_secondary_init,
        .smp_boot_secondary     = highbank_boot_secondary,
 #ifdef CONFIG_HOTPLUG_CPU
        .cpu_die                = highbank_cpu_die,
index 8aa9d9065e8edb7b61f20c1e3eecd18d590fb3ba..7230aede4ca26fe85f169c8caf146c410158e345 100644 (file)
@@ -12,6 +12,7 @@
 
 #include <linux/clk.h>
 #include <linux/clkdev.h>
+#include <linux/clocksource.h>
 #include <linux/cpu.h>
 #include <linux/delay.h>
 #include <linux/export.h>
 #include <linux/regmap.h>
 #include <linux/micrel_phy.h>
 #include <linux/mfd/syscon.h>
-#include <asm/smp_twd.h>
 #include <asm/hardware/cache-l2x0.h>
 #include <asm/mach/arch.h>
 #include <asm/mach/map.h>
-#include <asm/mach/time.h>
 #include <asm/system_misc.h>
 
 #include "common.h"
@@ -266,7 +265,7 @@ static void __init imx6q_init_irq(void)
 static void __init imx6q_timer_init(void)
 {
        mx6q_clocks_init();
-       twd_local_timer_of_register();
+       clocksource_of_init();
        imx_print_silicon_rev(cpu_is_imx6dl() ? "i.MX6DL" : "i.MX6Q",
                              imx6q_revision());
 }
index 7061bdedfdb01616eb3caac3380895ef67a636ae..4a69305db65e395366187a84cde322e37fc99e94 100644 (file)
@@ -12,7 +12,6 @@
 
 #include <linux/init.h>
 #include <linux/smp.h>
-#include <linux/irqchip/arm-gic.h>
 #include <asm/page.h>
 #include <asm/smp_scu.h>
 #include <asm/mach/map.h>
@@ -52,16 +51,6 @@ void imx_scu_standby_enable(void)
        writel_relaxed(val, scu_base);
 }
 
-static void __cpuinit imx_secondary_init(unsigned int cpu)
-{
-       /*
-        * if any interrupts are already enabled for the primary
-        * core (e.g. timer irq), then they will not have been enabled
-        * for us: do so
-        */
-       gic_secondary_init(0);
-}
-
 static int __cpuinit imx_boot_secondary(unsigned int cpu, struct task_struct *idle)
 {
        imx_set_cpu_jump(cpu, v7_secondary_startup);
@@ -96,7 +85,6 @@ static void __init imx_smp_prepare_cpus(unsigned int max_cpus)
 struct smp_operations  imx_smp_ops __initdata = {
        .smp_init_cpus          = imx_smp_init_cpus,
        .smp_prepare_cpus       = imx_smp_prepare_cpus,
-       .smp_secondary_init     = imx_secondary_init,
        .smp_boot_secondary     = imx_boot_secondary,
 #ifdef CONFIG_HOTPLUG_CPU
        .cpu_die                = imx_cpu_die,
index 42932865416a622053736e895f667928edac5246..00cdb0a5dac8e7f81710922eb59795ffa1fe8f55 100644 (file)
@@ -15,7 +15,6 @@
 #include <linux/jiffies.h>
 #include <linux/smp.h>
 #include <linux/io.h>
-#include <linux/irqchip/arm-gic.h>
 
 #include <asm/cacheflush.h>
 #include <asm/cputype.h>
@@ -41,13 +40,6 @@ static inline int get_core_count(void)
 
 static void __cpuinit msm_secondary_init(unsigned int cpu)
 {
-       /*
-        * if any interrupts are already enabled for the primary
-        * core (e.g. timer irq), then they will not have been enabled
-        * for us: do so
-        */
-       gic_secondary_init(0);
-
        /*
         * let the primary processor know we're out of the
         * pen, then head off into the C entry point
index d9727218dd0a3089792a1ef25737987ce9034f5b..e7a449758ab540d673de36949a6ece188559fafd 100644 (file)
@@ -66,13 +66,6 @@ static void __cpuinit omap4_secondary_init(unsigned int cpu)
                omap_secure_dispatcher(OMAP4_PPA_CPU_ACTRL_SMP_INDEX,
                                                        4, 0, 0, 0, 0, 0);
 
-       /*
-        * If any interrupts are already enabled for the primary
-        * core (e.g. timer irq), then they will not have been enabled
-        * for us: do so
-        */
-       gic_secondary_init(0);
-
        /*
         * Synchronise with the boot thread.
         */
index f62b509ed08de75e6f4191bc8cf43dc130c7cb2d..ee7a6bf67c9e1ed16c241ed61f75dc45b6671314 100644 (file)
@@ -601,7 +601,7 @@ void __init omap4_local_timer_init(void)
                int err;
 
                if (of_have_populated_dt()) {
-                       twd_local_timer_of_register();
+                       clocksource_of_init();
                        return;
                }
 
index 4b788310f6a6c2acb51474e97f1187ec95f80474..c7c92e78f0cfc30ddc0480704866fd81678d489a 100644 (file)
@@ -11,7 +11,6 @@
 #include <linux/delay.h>
 #include <linux/of.h>
 #include <linux/of_address.h>
-#include <linux/irqchip/arm-gic.h>
 #include <asm/page.h>
 #include <asm/mach/map.h>
 #include <asm/smp_plat.h>
@@ -48,13 +47,6 @@ void __init sirfsoc_map_scu(void)
 
 static void __cpuinit sirfsoc_secondary_init(unsigned int cpu)
 {
-       /*
-        * if any interrupts are already enabled for the primary
-        * core (e.g. timer irq), then they will not have been enabled
-        * for us: do so
-        */
-       gic_secondary_init(0);
-
        /*
         * let the primary processor know we're out of the
         * pen, then head off into the C entry point
index cb9f5e011e73a1fb5f055dc6a3c6498aa095f7e0..b6fac28a00343c0199fb7363932deef42be08688 100644 (file)
@@ -25,6 +25,7 @@
 #include <linux/ioport.h>
 #include <linux/device.h>
 #include <linux/irqdomain.h>
+#include <linux/irqchip/chained_irq.h>
 
 #include <asm/mach/irq.h>
 
index 9255546e7bf64fb98fce8bbfb3bb7830ce51f2cd..ff674c5f2d03798f6ca5ffc6c3b3760828e3df86 100644 (file)
@@ -16,12 +16,30 @@ config ARCH_SH73A0
        select CPU_V7
        select I2C
        select SH_CLK_CPG
+       select RENESAS_INTC_IRQPIN
+
+config ARCH_R8A73A4
+       bool "R-Mobile APE6 (R8A73A40)"
+       select ARCH_WANT_OPTIONAL_GPIOLIB
+       select ARM_GIC
+       select CPU_V7
+       select ARM_ARCH_TIMER
+       select SH_CLK_CPG
+       select RENESAS_IRQC
 
 config ARCH_R8A7740
        bool "R-Mobile A1 (R8A77400)"
        select ARCH_WANT_OPTIONAL_GPIOLIB
+       select ARM_GIC
        select CPU_V7
        select SH_CLK_CPG
+       select RENESAS_INTC_IRQPIN
+
+config ARCH_R8A7778
+       bool "R-Car M1 (R8A77780)"
+       select CPU_V7
+       select SH_CLK_CPG
+       select ARM_GIC
 
 config ARCH_R8A7779
        bool "R-Car H1 (R8A77790)"
@@ -31,6 +49,16 @@ config ARCH_R8A7779
        select SH_CLK_CPG
        select USB_ARCH_HAS_EHCI
        select USB_ARCH_HAS_OHCI
+       select RENESAS_INTC_IRQPIN
+
+config ARCH_R8A7790
+       bool "R-Car H2 (R8A77900)"
+       select ARCH_WANT_OPTIONAL_GPIOLIB
+       select ARM_GIC
+       select CPU_V7
+       select ARM_ARCH_TIMER
+       select SH_CLK_CPG
+       select RENESAS_IRQC
 
 config ARCH_EMEV2
        bool "Emma Mobile EV2"
index e1fac57514b93ea55f36f336c4617c429bd13985..709b9b421f93bbf995124764a002ac6d0c9d1e2d 100644 (file)
@@ -8,16 +8,18 @@ obj-y                         := timer.o console.o clock.o
 # CPU objects
 obj-$(CONFIG_ARCH_SH7372)      += setup-sh7372.o clock-sh7372.o intc-sh7372.o
 obj-$(CONFIG_ARCH_SH73A0)      += setup-sh73a0.o clock-sh73a0.o intc-sh73a0.o
+obj-$(CONFIG_ARCH_R8A73A4)     += setup-r8a73a4.o clock-r8a73a4.o
 obj-$(CONFIG_ARCH_R8A7740)     += setup-r8a7740.o clock-r8a7740.o intc-r8a7740.o
+obj-$(CONFIG_ARCH_R8A7778)     += setup-r8a7778.o clock-r8a7778.o
 obj-$(CONFIG_ARCH_R8A7779)     += setup-r8a7779.o clock-r8a7779.o intc-r8a7779.o
+obj-$(CONFIG_ARCH_R8A7790)     += setup-r8a7790.o clock-r8a7790.o
 obj-$(CONFIG_ARCH_EMEV2)       += setup-emev2.o clock-emev2.o
 
 # SMP objects
 smp-y                          := platsmp.o headsmp.o
-smp-$(CONFIG_HOTPLUG_CPU)      += hotplug.o
-smp-$(CONFIG_ARCH_SH73A0)      += smp-sh73a0.o headsmp-sh73a0.o
-smp-$(CONFIG_ARCH_R8A7779)     += smp-r8a7779.o
-smp-$(CONFIG_ARCH_EMEV2)       += smp-emev2.o
+smp-$(CONFIG_ARCH_SH73A0)      += smp-sh73a0.o headsmp-scu.o
+smp-$(CONFIG_ARCH_R8A7779)     += smp-r8a7779.o headsmp-scu.o
+smp-$(CONFIG_ARCH_EMEV2)       += smp-emev2.o headsmp-scu.o
 
 # IRQ objects
 obj-$(CONFIG_ARCH_SH7372)      += entry-intc.o
index 8ff53a19c48c6a2d60bd2dda11346b04a28dd19b..c7540710906fa596f8fc4e60b47783e4d3f7270b 100644 (file)
@@ -23,6 +23,8 @@
 #include <linux/init.h>
 #include <linux/interrupt.h>
 #include <linux/irq.h>
+#include <linux/pinctrl/machine.h>
+#include <linux/pinctrl/pinconf-generic.h>
 #include <linux/platform_device.h>
 #include <linux/delay.h>
 #include <linux/io.h>
@@ -304,9 +306,9 @@ static int lcd_backlight_set_brightness(int brightness)
 
        if (brightness == 0) {
                /* Reset the chip */
-               gpio_set_value(GPIO_PORT235, 0);
+               gpio_set_value(235, 0);
                mdelay(24);
-               gpio_set_value(GPIO_PORT235, 1);
+               gpio_set_value(235, 1);
                return 0;
        }
 
@@ -406,7 +408,7 @@ static struct sh_mobile_sdhi_info sdhi0_info = {
        .tmio_flags     = TMIO_MMC_HAS_IDLE_WAIT | TMIO_MMC_USE_GPIO_CD,
        .tmio_caps      = MMC_CAP_SD_HIGHSPEED,
        .tmio_ocr_mask  = MMC_VDD_27_28 | MMC_VDD_28_29,
-       .cd_gpio        = GPIO_PORT251,
+       .cd_gpio        = 251,
 };
 
 static struct resource sdhi0_resources[] = {
@@ -461,7 +463,7 @@ static struct regulator_init_data cn4_power_init_data = {
 static struct fixed_voltage_config cn4_power_info = {
        .supply_name = "CN4 SD/MMC Vdd",
        .microvolts = 3300000,
-       .gpio = GPIO_PORT114,
+       .gpio = 114,
        .enable_high = 1,
        .init_data = &cn4_power_init_data,
 };
@@ -479,10 +481,10 @@ static void ag5evm_sdhi1_set_pwr(struct platform_device *pdev, int state)
        static int power_gpio = -EINVAL;
 
        if (power_gpio < 0) {
-               int ret = gpio_request_one(GPIO_PORT114, GPIOF_OUT_INIT_LOW,
+               int ret = gpio_request_one(114, GPIOF_OUT_INIT_LOW,
                                           "sdhi1_power");
                if (!ret)
-                       power_gpio = GPIO_PORT114;
+                       power_gpio = 114;
        }
 
        /*
@@ -493,7 +495,7 @@ static void ag5evm_sdhi1_set_pwr(struct platform_device *pdev, int state)
         * regulator driver. We have to live with the race in case the driver
         * gets unloaded and the GPIO freed between these two steps.
         */
-       gpio_set_value(GPIO_PORT114, state);
+       gpio_set_value(114, state);
 }
 
 static struct sh_mobile_sdhi_info sh_sdhi1_info = {
@@ -550,6 +552,77 @@ static struct platform_device *ag5evm_devices[] __initdata = {
        &sdhi1_device,
 };
 
+static unsigned long pin_pullup_conf[] = {
+       PIN_CONF_PACKED(PIN_CONFIG_BIAS_PULL_UP, 0),
+};
+
+static const struct pinctrl_map ag5evm_pinctrl_map[] = {
+       /* FSIA */
+       PIN_MAP_MUX_GROUP_DEFAULT("sh_fsi2.0", "pfc-sh73a0",
+                                 "fsia_mclk_in", "fsia"),
+       PIN_MAP_MUX_GROUP_DEFAULT("sh_fsi2.0", "pfc-sh73a0",
+                                 "fsia_sclk_in", "fsia"),
+       PIN_MAP_MUX_GROUP_DEFAULT("sh_fsi2.0", "pfc-sh73a0",
+                                 "fsia_data_in", "fsia"),
+       PIN_MAP_MUX_GROUP_DEFAULT("sh_fsi2.0", "pfc-sh73a0",
+                                 "fsia_data_out", "fsia"),
+       /* I2C2 & I2C3 */
+       PIN_MAP_MUX_GROUP_DEFAULT("i2c-sh_mobile.2", "pfc-sh73a0",
+                                 "i2c2_0", "i2c2"),
+       PIN_MAP_MUX_GROUP_DEFAULT("i2c-sh_mobile.3", "pfc-sh73a0",
+                                 "i2c3_0", "i2c3"),
+       /* IrDA */
+       PIN_MAP_MUX_GROUP_DEFAULT("sh_irda.0", "pfc-sh73a0",
+                                 "irda_0", "irda"),
+       /* KEYSC */
+       PIN_MAP_MUX_GROUP_DEFAULT("sh_keysc.0", "pfc-sh73a0",
+                                 "keysc_in8", "keysc"),
+       PIN_MAP_MUX_GROUP_DEFAULT("sh_keysc.0", "pfc-sh73a0",
+                                 "keysc_out04", "keysc"),
+       PIN_MAP_MUX_GROUP_DEFAULT("sh_keysc.0", "pfc-sh73a0",
+                                 "keysc_out5", "keysc"),
+       PIN_MAP_MUX_GROUP_DEFAULT("sh_keysc.0", "pfc-sh73a0",
+                                 "keysc_out6_0", "keysc"),
+       PIN_MAP_MUX_GROUP_DEFAULT("sh_keysc.0", "pfc-sh73a0",
+                                 "keysc_out7_0", "keysc"),
+       PIN_MAP_MUX_GROUP_DEFAULT("sh_keysc.0", "pfc-sh73a0",
+                                 "keysc_out8_0", "keysc"),
+       PIN_MAP_MUX_GROUP_DEFAULT("sh_keysc.0", "pfc-sh73a0",
+                                 "keysc_out9_2", "keysc"),
+       PIN_MAP_CONFIGS_GROUP_DEFAULT("sh_keysc.0", "pfc-sh73a0",
+                                     "keysc_in8", pin_pullup_conf),
+       /* MMCIF */
+       PIN_MAP_MUX_GROUP_DEFAULT("sh_mmcif.0", "pfc-sh73a0",
+                                 "mmc0_data8_0", "mmc0"),
+       PIN_MAP_MUX_GROUP_DEFAULT("sh_mmcif.0", "pfc-sh73a0",
+                                 "mmc0_ctrl_0", "mmc0"),
+       PIN_MAP_CONFIGS_PIN_DEFAULT("sh_mmcif.0", "pfc-sh73a0",
+                                   "PORT279", pin_pullup_conf),
+       PIN_MAP_CONFIGS_GROUP_DEFAULT("sh_mmcif.0", "pfc-sh73a0",
+                                     "mmc0_data8_0", pin_pullup_conf),
+       /* SCIFA2 */
+       PIN_MAP_MUX_GROUP_DEFAULT("sh-sci.2", "pfc-sh73a0",
+                                 "scifa2_data_0", "scifa2"),
+       PIN_MAP_MUX_GROUP_DEFAULT("sh-sci.2", "pfc-sh73a0",
+                                 "scifa2_ctrl_0", "scifa2"),
+       /* SDHI0 (CN15 [SD I/F]) */
+       PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.0", "pfc-sh73a0",
+                                 "sdhi0_data4", "sdhi0"),
+       PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.0", "pfc-sh73a0",
+                                 "sdhi0_ctrl", "sdhi0"),
+       PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.0", "pfc-sh73a0",
+                                 "sdhi0_wp", "sdhi0"),
+       /* SDHI1 (CN4 [WLAN I/F]) */
+       PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.1", "pfc-sh73a0",
+                                 "sdhi1_data4", "sdhi1"),
+       PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.1", "pfc-sh73a0",
+                                 "sdhi1_ctrl", "sdhi1"),
+       PIN_MAP_CONFIGS_GROUP_DEFAULT("sh_mobile_sdhi.1", "pfc-sh73a0",
+                                     "sdhi1_data4", pin_pullup_conf),
+       PIN_MAP_CONFIGS_PIN_DEFAULT("sh_mobile_sdhi.1", "pfc-sh73a0",
+                                   "PORT263", pin_pullup_conf),
+};
+
 static void __init ag5evm_init(void)
 {
        regulator_register_always_on(0, "fixed-1.8V", fixed1v8_power_consumers,
@@ -558,96 +631,27 @@ static void __init ag5evm_init(void)
                                     ARRAY_SIZE(fixed2v8_power_consumers), 3300000);
        regulator_register_fixed(3, dummy_supplies, ARRAY_SIZE(dummy_supplies));
 
+       pinctrl_register_mappings(ag5evm_pinctrl_map,
+                                 ARRAY_SIZE(ag5evm_pinctrl_map));
        sh73a0_pinmux_init();
 
-       /* enable SCIFA2 */
-       gpio_request(GPIO_FN_SCIFA2_TXD1, NULL);
-       gpio_request(GPIO_FN_SCIFA2_RXD1, NULL);
-       gpio_request(GPIO_FN_SCIFA2_RTS1_, NULL);
-       gpio_request(GPIO_FN_SCIFA2_CTS1_, NULL);
-
-       /* enable KEYSC */
-       gpio_request(GPIO_FN_KEYIN0_PU, NULL);
-       gpio_request(GPIO_FN_KEYIN1_PU, NULL);
-       gpio_request(GPIO_FN_KEYIN2_PU, NULL);
-       gpio_request(GPIO_FN_KEYIN3_PU, NULL);
-       gpio_request(GPIO_FN_KEYIN4_PU, NULL);
-       gpio_request(GPIO_FN_KEYIN5_PU, NULL);
-       gpio_request(GPIO_FN_KEYIN6_PU, NULL);
-       gpio_request(GPIO_FN_KEYIN7_PU, NULL);
-       gpio_request(GPIO_FN_KEYOUT0, NULL);
-       gpio_request(GPIO_FN_KEYOUT1, NULL);
-       gpio_request(GPIO_FN_KEYOUT2, NULL);
-       gpio_request(GPIO_FN_KEYOUT3, NULL);
-       gpio_request(GPIO_FN_KEYOUT4, NULL);
-       gpio_request(GPIO_FN_KEYOUT5, NULL);
-       gpio_request(GPIO_FN_PORT59_KEYOUT6, NULL);
-       gpio_request(GPIO_FN_PORT58_KEYOUT7, NULL);
-       gpio_request(GPIO_FN_KEYOUT8, NULL);
-       gpio_request(GPIO_FN_PORT149_KEYOUT9, NULL);
-
-       /* enable I2C channel 2 and 3 */
-       gpio_request(GPIO_FN_PORT236_I2C_SDA2, NULL);
-       gpio_request(GPIO_FN_PORT237_I2C_SCL2, NULL);
-       gpio_request(GPIO_FN_PORT248_I2C_SCL3, NULL);
-       gpio_request(GPIO_FN_PORT249_I2C_SDA3, NULL);
-
        /* enable MMCIF */
-       gpio_request(GPIO_FN_MMCCLK0, NULL);
-       gpio_request(GPIO_FN_MMCCMD0_PU, NULL);
-       gpio_request(GPIO_FN_MMCD0_0_PU, NULL);
-       gpio_request(GPIO_FN_MMCD0_1_PU, NULL);
-       gpio_request(GPIO_FN_MMCD0_2_PU, NULL);
-       gpio_request(GPIO_FN_MMCD0_3_PU, NULL);
-       gpio_request(GPIO_FN_MMCD0_4_PU, NULL);
-       gpio_request(GPIO_FN_MMCD0_5_PU, NULL);
-       gpio_request(GPIO_FN_MMCD0_6_PU, NULL);
-       gpio_request(GPIO_FN_MMCD0_7_PU, NULL);
-       gpio_request_one(GPIO_PORT208, GPIOF_OUT_INIT_HIGH, NULL); /* Reset */
+       gpio_request_one(208, GPIOF_OUT_INIT_HIGH, NULL); /* Reset */
 
        /* enable SMSC911X */
-       gpio_request_one(GPIO_PORT144, GPIOF_IN, NULL); /* PINTA2 */
-       gpio_request_one(GPIO_PORT145, GPIOF_OUT_INIT_HIGH, NULL); /* RESET */
-
-       /* FSI A */
-       gpio_request(GPIO_FN_FSIACK, NULL);
-       gpio_request(GPIO_FN_FSIAILR, NULL);
-       gpio_request(GPIO_FN_FSIAIBT, NULL);
-       gpio_request(GPIO_FN_FSIAISLD, NULL);
-       gpio_request(GPIO_FN_FSIAOSLD, NULL);
-
-       /* IrDA */
-       gpio_request(GPIO_FN_PORT241_IRDA_OUT, NULL);
-       gpio_request(GPIO_FN_PORT242_IRDA_IN,  NULL);
-       gpio_request(GPIO_FN_PORT243_IRDA_FIRSEL, NULL);
+       gpio_request_one(144, GPIOF_IN, NULL); /* PINTA2 */
+       gpio_request_one(145, GPIOF_OUT_INIT_HIGH, NULL); /* RESET */
 
        /* LCD panel */
-       gpio_request_one(GPIO_PORT217, GPIOF_OUT_INIT_LOW, NULL); /* RESET */
+       gpio_request_one(217, GPIOF_OUT_INIT_LOW, NULL); /* RESET */
        mdelay(1);
-       gpio_set_value(GPIO_PORT217, 1);
+       gpio_set_value(217, 1);
        mdelay(100);
 
        /* LCD backlight controller */
-       gpio_request_one(GPIO_PORT235, GPIOF_OUT_INIT_LOW, NULL); /* RESET */
+       gpio_request_one(235, GPIOF_OUT_INIT_LOW, NULL); /* RESET */
        lcd_backlight_set_brightness(0);
 
-       /* enable SDHI0 on CN15 [SD I/F] */
-       gpio_request(GPIO_FN_SDHIWP0, NULL);
-       gpio_request(GPIO_FN_SDHICMD0, NULL);
-       gpio_request(GPIO_FN_SDHICLK0, NULL);
-       gpio_request(GPIO_FN_SDHID0_3, NULL);
-       gpio_request(GPIO_FN_SDHID0_2, NULL);
-       gpio_request(GPIO_FN_SDHID0_1, NULL);
-       gpio_request(GPIO_FN_SDHID0_0, NULL);
-
-       /* enable SDHI1 on CN4 [WLAN I/F] */
-       gpio_request(GPIO_FN_SDHICLK1, NULL);
-       gpio_request(GPIO_FN_SDHICMD1_PU, NULL);
-       gpio_request(GPIO_FN_SDHID1_3_PU, NULL);
-       gpio_request(GPIO_FN_SDHID1_2_PU, NULL);
-       gpio_request(GPIO_FN_SDHID1_1_PU, NULL);
-       gpio_request(GPIO_FN_SDHID1_0_PU, NULL);
-
 #ifdef CONFIG_CACHE_L2X0
        /* Shared attribute override enable, 64K*8way */
        l2x0_init(IOMEM(0xf0100000), 0x00460000, 0xc2000fff);
index 38f1259a0daf4d6b4c82a53d3f43042f0a975db2..45f78cadec1dffbbcce57cb0976e491542c26b2c 100644 (file)
@@ -34,6 +34,7 @@
 #include <linux/i2c.h>
 #include <linux/i2c/tsc2007.h>
 #include <linux/io.h>
+#include <linux/pinctrl/machine.h>
 #include <linux/regulator/fixed.h>
 #include <linux/regulator/machine.h>
 #include <linux/smsc911x.h>
@@ -273,11 +274,11 @@ static struct platform_device smc911x_device = {
 
 /*
  * The card detect pin of the top SD/MMC slot (CN7) is active low and is
- * connected to GPIO A22 of SH7372 (GPIO_PORT41).
+ * connected to GPIO A22 of SH7372 (GPIO 41).
  */
 static int slot_cn7_get_cd(struct platform_device *pdev)
 {
-       return !gpio_get_value(GPIO_PORT41);
+       return !gpio_get_value(41);
 }
 /* MERAM */
 static struct sh_mobile_meram_info meram_info = {
@@ -838,22 +839,22 @@ static struct platform_device fsi_hdmi_device = {
 static struct gpio_led ap4evb_leds[] = {
        {
                .name                   = "led4",
-               .gpio                   = GPIO_PORT185,
+               .gpio                   = 185,
                .default_state  = LEDS_GPIO_DEFSTATE_ON,
        },
        {
                .name                   = "led2",
-               .gpio                   = GPIO_PORT186,
+               .gpio                   = 186,
                .default_state  = LEDS_GPIO_DEFSTATE_ON,
        },
        {
                .name                   = "led3",
-               .gpio                   = GPIO_PORT187,
+               .gpio                   = 187,
                .default_state  = LEDS_GPIO_DEFSTATE_ON,
        },
        {
                .name                   = "led1",
-               .gpio                   = GPIO_PORT188,
+               .gpio                   = 188,
                .default_state  = LEDS_GPIO_DEFSTATE_ON,
        }
 };
@@ -1026,10 +1027,10 @@ out:
 /* TouchScreen */
 #ifdef CONFIG_AP4EVB_QHD
 # define GPIO_TSC_IRQ  GPIO_FN_IRQ28_123
-# define GPIO_TSC_PORT GPIO_PORT123
+# define GPIO_TSC_PORT 123
 #else /* WVGA */
 # define GPIO_TSC_IRQ  GPIO_FN_IRQ7_40
-# define GPIO_TSC_PORT GPIO_PORT40
+# define GPIO_TSC_PORT 40
 #endif
 
 #define IRQ28  evt2irq(0x3380) /* IRQ28A */
@@ -1084,6 +1085,28 @@ static struct i2c_board_info i2c1_devices[] = {
 };
 
 
+static const struct pinctrl_map ap4evb_pinctrl_map[] = {
+       /* MMCIF */
+       PIN_MAP_MUX_GROUP_DEFAULT("sh_mmcif.0", "pfc-sh7372",
+                                 "mmc0_data8_0", "mmc0"),
+       PIN_MAP_MUX_GROUP_DEFAULT("sh_mmcif.0", "pfc-sh7372",
+                                 "mmc0_ctrl_0", "mmc0"),
+       /* SDHI0 */
+       PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.0", "pfc-sh7372",
+                                 "sdhi0_data4", "sdhi0"),
+       PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.0", "pfc-sh7372",
+                                 "sdhi0_ctrl", "sdhi0"),
+       PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.0", "pfc-sh7372",
+                                 "sdhi0_cd", "sdhi0"),
+       PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.0", "pfc-sh7372",
+                                 "sdhi0_wp", "sdhi0"),
+       /* SDHI1 */
+       PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.1", "pfc-sh7372",
+                                 "sdhi1_data4", "sdhi1"),
+       PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.1", "pfc-sh7372",
+                                 "sdhi1_ctrl", "sdhi1"),
+};
+
 #define GPIO_PORT9CR   IOMEM(0xE6051009)
 #define GPIO_PORT10CR  IOMEM(0xE605100A)
 #define USCCR1         IOMEM(0xE6058144)
@@ -1110,6 +1133,8 @@ static void __init ap4evb_init(void)
        /* External clock source */
        clk_set_rate(&sh7372_dv_clki_clk, 27000000);
 
+       pinctrl_register_mappings(ap4evb_pinctrl_map,
+                                 ARRAY_SIZE(ap4evb_pinctrl_map));
        sh7372_pinmux_init();
 
        /* enable SCIFA0 */
@@ -1121,40 +1146,10 @@ static void __init ap4evb_init(void)
        gpio_request(GPIO_FN_IRQ6_39,   NULL);
 
        /* enable Debug switch (S6) */
-       gpio_request_one(GPIO_PORT32, GPIOF_IN | GPIOF_EXPORT, NULL);
-       gpio_request_one(GPIO_PORT33, GPIOF_IN | GPIOF_EXPORT, NULL);
-       gpio_request_one(GPIO_PORT34, GPIOF_IN | GPIOF_EXPORT, NULL);
-       gpio_request_one(GPIO_PORT35, GPIOF_IN | GPIOF_EXPORT, NULL);
-
-       /* SDHI0 */
-       gpio_request(GPIO_FN_SDHICD0, NULL);
-       gpio_request(GPIO_FN_SDHIWP0, NULL);
-       gpio_request(GPIO_FN_SDHICMD0, NULL);
-       gpio_request(GPIO_FN_SDHICLK0, NULL);
-       gpio_request(GPIO_FN_SDHID0_3, NULL);
-       gpio_request(GPIO_FN_SDHID0_2, NULL);
-       gpio_request(GPIO_FN_SDHID0_1, NULL);
-       gpio_request(GPIO_FN_SDHID0_0, NULL);
-
-       /* SDHI1 */
-       gpio_request(GPIO_FN_SDHICMD1, NULL);
-       gpio_request(GPIO_FN_SDHICLK1, NULL);
-       gpio_request(GPIO_FN_SDHID1_3, NULL);
-       gpio_request(GPIO_FN_SDHID1_2, NULL);
-       gpio_request(GPIO_FN_SDHID1_1, NULL);
-       gpio_request(GPIO_FN_SDHID1_0, NULL);
-
-       /* MMCIF */
-       gpio_request(GPIO_FN_MMCD0_0, NULL);
-       gpio_request(GPIO_FN_MMCD0_1, NULL);
-       gpio_request(GPIO_FN_MMCD0_2, NULL);
-       gpio_request(GPIO_FN_MMCD0_3, NULL);
-       gpio_request(GPIO_FN_MMCD0_4, NULL);
-       gpio_request(GPIO_FN_MMCD0_5, NULL);
-       gpio_request(GPIO_FN_MMCD0_6, NULL);
-       gpio_request(GPIO_FN_MMCD0_7, NULL);
-       gpio_request(GPIO_FN_MMCCMD0, NULL);
-       gpio_request(GPIO_FN_MMCCLK0, NULL);
+       gpio_request_one(32, GPIOF_IN | GPIOF_EXPORT, NULL);
+       gpio_request_one(33, GPIOF_IN | GPIOF_EXPORT, NULL);
+       gpio_request_one(34, GPIOF_IN | GPIOF_EXPORT, NULL);
+       gpio_request_one(35, GPIOF_IN | GPIOF_EXPORT, NULL);
 
        /* USB enable */
        gpio_request(GPIO_FN_VBUS0_1,    NULL);
@@ -1172,15 +1167,15 @@ static void __init ap4evb_init(void)
        gpio_request(GPIO_FN_FSIAILR,   NULL);
        gpio_request(GPIO_FN_FSIAISLD,  NULL);
        gpio_request(GPIO_FN_FSIAOSLD,  NULL);
-       gpio_request_one(GPIO_PORT161, GPIOF_OUT_INIT_LOW, NULL); /* slave */
+       gpio_request_one(161, GPIOF_OUT_INIT_LOW, NULL); /* slave */
 
-       gpio_request(GPIO_PORT9, NULL);
-       gpio_request(GPIO_PORT10, NULL);
+       gpio_request(9, NULL);
+       gpio_request(10, NULL);
        gpio_direction_none(GPIO_PORT9CR);  /* FSIAOBT needs no direction */
        gpio_direction_none(GPIO_PORT10CR); /* FSIAOLR needs no direction */
 
        /* card detect pin for MMC slot (CN7) */
-       gpio_request_one(GPIO_PORT41, GPIOF_IN, NULL);
+       gpio_request_one(41, GPIOF_IN, NULL);
 
        /* setup FSI2 port B (HDMI) */
        gpio_request(GPIO_FN_FSIBCK, NULL);
@@ -1268,8 +1263,8 @@ static void __init ap4evb_init(void)
        gpio_request(GPIO_FN_LCDDISP,  NULL);
        gpio_request(GPIO_FN_LCDDCK,   NULL);
 
-       gpio_request_one(GPIO_PORT189, GPIOF_OUT_INIT_HIGH, NULL); /* backlight */
-       gpio_request_one(GPIO_PORT151, GPIOF_OUT_INIT_HIGH, NULL); /* LCDDON */
+       gpio_request_one(189, GPIOF_OUT_INIT_HIGH, NULL); /* backlight */
+       gpio_request_one(151, GPIOF_OUT_INIT_HIGH, NULL); /* LCDDON */
 
        lcdc_info.clock_source                  = LCDC_CLK_BUS;
        lcdc_info.ch[0].interface_type          = RGB18;
index f2ec0777cfbe89ca5c998dfe1b6d581b5d5320bf..9415cb4e61996fbe41908e38eb1482d091c86333 100644 (file)
@@ -28,6 +28,7 @@
 #include <linux/platform_device.h>
 #include <linux/gpio.h>
 #include <linux/gpio_keys.h>
+#include <linux/pinctrl/machine.h>
 #include <linux/regulator/fixed.h>
 #include <linux/regulator/machine.h>
 #include <linux/sh_eth.h>
  * see
  *     usbhsf_power_ctrl()
  */
-#define IRQ7           evt2irq(0x02e0)
+#define IRQ7           irq_pin(7)
 #define USBCR1         IOMEM(0xe605810a)
 #define USBH           0xC6700000
 #define USBH_USBCTR    0x10834
@@ -227,7 +228,7 @@ static void usbhsf_power_ctrl(struct platform_device *pdev,
 
 static int usbhsf_get_vbus(struct platform_device *pdev)
 {
-       return gpio_get_value(GPIO_PORT209);
+       return gpio_get_value(209);
 }
 
 static irqreturn_t usbhsf_interrupt(int irq, void *data)
@@ -330,7 +331,7 @@ static struct resource usbhsf_resources[] = {
                .flags  = IORESOURCE_MEM,
        },
        {
-               .start  = evt2irq(0x0A20),
+               .start  = gic_spi(51),
                .flags  = IORESOURCE_IRQ,
        },
 };
@@ -363,7 +364,7 @@ static struct resource sh_eth_resources[] = {
                .end    = 0xe9a02000 - 1,
                .flags  = IORESOURCE_MEM,
        }, {
-               .start  = evt2irq(0x0500),
+               .start  = gic_spi(110),
                .flags  = IORESOURCE_IRQ,
        },
 };
@@ -417,7 +418,7 @@ static struct resource lcdc0_resources[] = {
                .flags  = IORESOURCE_MEM,
        },
        [1] = {
-               .start  = intcs_evt2irq(0x580),
+               .start  = gic_spi(177),
                .flags  = IORESOURCE_IRQ,
        },
 };
@@ -452,7 +453,7 @@ static struct resource hdmi_resources[] = {
                .flags  = IORESOURCE_MEM,
        },
        [1] = {
-               .start  = evt2irq(0x1700),
+               .start  = gic_spi(131),
                .flags  = IORESOURCE_IRQ,
        },
        [2] = {
@@ -514,7 +515,7 @@ static struct resource hdmi_lcdc_resources[] = {
                .flags  = IORESOURCE_MEM,
        },
        [1] = {
-               .start  = intcs_evt2irq(0x1780),
+               .start  = gic_spi(178),
                .flags  = IORESOURCE_IRQ,
        },
 };
@@ -535,10 +536,10 @@ static struct platform_device hdmi_lcdc_device = {
        { .code = c, .gpio = g, .desc = d, .active_low = 1, __VA_ARGS__ }
 
 static struct gpio_keys_button gpio_buttons[] = {
-       GPIO_KEY(KEY_POWER,     GPIO_PORT99,    "SW3", .wakeup = 1),
-       GPIO_KEY(KEY_BACK,      GPIO_PORT100,   "SW4"),
-       GPIO_KEY(KEY_MENU,      GPIO_PORT97,    "SW5"),
-       GPIO_KEY(KEY_HOME,      GPIO_PORT98,    "SW6"),
+       GPIO_KEY(KEY_POWER,     99,     "SW3", .wakeup = 1),
+       GPIO_KEY(KEY_BACK,      100,    "SW4"),
+       GPIO_KEY(KEY_MENU,      97,     "SW5"),
+       GPIO_KEY(KEY_HOME,      98,     "SW6"),
 };
 
 static struct gpio_keys_platform_data gpio_key_info = {
@@ -574,7 +575,7 @@ static struct regulator_consumer_supply fixed3v3_power_consumers[] =
  * We can use IRQ31 as card detect irq,
  * but it needs chattering removal operation
  */
-#define IRQ31  evt2irq(0x33E0)
+#define IRQ31  irq_pin(31)
 static struct sh_mobile_sdhi_info sdhi0_info = {
        .dma_slave_tx   = SHDMA_SLAVE_SDHI0_TX,
        .dma_slave_rx   = SHDMA_SLAVE_SDHI0_RX,
@@ -596,12 +597,12 @@ static struct resource sdhi0_resources[] = {
         */
        {
                .name   = SH_MOBILE_SDHI_IRQ_SDCARD,
-               .start  = evt2irq(0x0E20),
+               .start  = gic_spi(118),
                .flags  = IORESOURCE_IRQ,
        },
        {
                .name   = SH_MOBILE_SDHI_IRQ_SDIO,
-               .start  = evt2irq(0x0E40),
+               .start  = gic_spi(119),
                .flags  = IORESOURCE_IRQ,
        },
 };
@@ -633,15 +634,15 @@ static struct resource sdhi1_resources[] = {
                .flags  = IORESOURCE_MEM,
        },
        [1] = {
-               .start  = evt2irq(0x0E80),
+               .start  = gic_spi(121),
                .flags  = IORESOURCE_IRQ,
        },
        [2] = {
-               .start  = evt2irq(0x0EA0),
+               .start  = gic_spi(122),
                .flags  = IORESOURCE_IRQ,
        },
        [3] = {
-               .start  = evt2irq(0x0EC0),
+               .start  = gic_spi(123),
                .flags  = IORESOURCE_IRQ,
        },
 };
@@ -656,6 +657,17 @@ static struct platform_device sdhi1_device = {
        .resource       = sdhi1_resources,
 };
 
+static const struct pinctrl_map eva_sdhi1_pinctrl_map[] = {
+       PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.1", "pfc-r8a7740",
+                                 "sdhi1_data4", "sdhi1"),
+       PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.1", "pfc-r8a7740",
+                                 "sdhi1_ctrl", "sdhi1"),
+       PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.1", "pfc-r8a7740",
+                                 "sdhi1_cd", "sdhi1"),
+       PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.1", "pfc-r8a7740",
+                                 "sdhi1_wp", "sdhi1"),
+};
+
 /* MMCIF */
 static struct sh_mmcif_plat_data sh_mmcif_plat = {
        .sup_pclk       = 0,
@@ -674,12 +686,12 @@ static struct resource sh_mmcif_resources[] = {
        },
        [1] = {
                /* MMC ERR */
-               .start  = evt2irq(0x1AC0),
+               .start  = gic_spi(56),
                .flags  = IORESOURCE_IRQ,
        },
        [2] = {
                /* MMC NOR */
-               .start  = evt2irq(0x1AE0),
+               .start  = gic_spi(57),
                .flags  = IORESOURCE_IRQ,
        },
 };
@@ -708,9 +720,9 @@ static int mt9t111_power(struct device *dev, int mode)
                /* video1 (= CON1 camera) expect 24MHz */
                clk_set_rate(mclk, clk_round_rate(mclk, 24000000));
                clk_enable(mclk);
-               gpio_set_value(GPIO_PORT158, 1);
+               gpio_set_value(158, 1);
        } else {
-               gpio_set_value(GPIO_PORT158, 0);
+               gpio_set_value(158, 0);
                clk_disable(mclk);
        }
 
@@ -756,7 +768,7 @@ static struct resource ceu0_resources[] = {
                .flags  = IORESOURCE_MEM,
        },
        [1] = {
-               .start  = intcs_evt2irq(0x0500),
+               .start  = gic_spi(160),
                .flags  = IORESOURCE_IRQ,
        },
        [2] = {
@@ -798,7 +810,7 @@ static struct resource fsi_resources[] = {
                .flags  = IORESOURCE_MEM,
        },
        [1] = {
-               .start  = evt2irq(0x1840),
+               .start  = gic_spi(9),
                .flags  = IORESOURCE_IRQ,
        },
 };
@@ -864,8 +876,8 @@ static struct platform_device fsi_hdmi_device = {
 
 /* RTC: RTC connects i2c-gpio. */
 static struct i2c_gpio_platform_data i2c_gpio_data = {
-       .sda_pin        = GPIO_PORT208,
-       .scl_pin        = GPIO_PORT91,
+       .sda_pin        = 208,
+       .scl_pin        = 91,
        .udelay         = 5, /* 100 kHz */
 };
 
@@ -881,7 +893,7 @@ static struct platform_device i2c_gpio_device = {
 static struct i2c_board_info i2c0_devices[] = {
        {
                I2C_BOARD_INFO("st1232-ts", 0x55),
-               .irq = evt2irq(0x0340),
+               .irq = irq_pin(10),
        },
        {
                I2C_BOARD_INFO("wm8978", 0x1a),
@@ -914,6 +926,28 @@ static struct platform_device *eva_devices[] __initdata = {
        &i2c_gpio_device,
 };
 
+static const struct pinctrl_map eva_pinctrl_map[] = {
+       /* LCD0 */
+       PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_lcdc_fb.0", "pfc-r8a7740",
+                                 "lcd0_data24_0", "lcd0"),
+       PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_lcdc_fb.0", "pfc-r8a7740",
+                                 "lcd0_lclk_1", "lcd0"),
+       PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_lcdc_fb.0", "pfc-r8a7740",
+                                 "lcd0_sync", "lcd0"),
+       /* MMCIF */
+       PIN_MAP_MUX_GROUP_DEFAULT("sh_mmcif.0", "pfc-r8a7740",
+                                 "mmc0_data8_1", "mmc0"),
+       PIN_MAP_MUX_GROUP_DEFAULT("sh_mmcif.0", "pfc-r8a7740",
+                                 "mmc0_ctrl_1", "mmc0"),
+       /* SDHI0 */
+       PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.0", "pfc-r8a7740",
+                                 "sdhi0_data4", "sdhi0"),
+       PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.0", "pfc-r8a7740",
+                                 "sdhi0_ctrl", "sdhi0"),
+       PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.0", "pfc-r8a7740",
+                                 "sdhi0_wp", "sdhi0"),
+};
+
 static void __init eva_clock_init(void)
 {
        struct clk *system      = clk_get(NULL, "system_clk");
@@ -961,6 +995,8 @@ static void __init eva_init(void)
        regulator_register_always_on(0, "fixed-3.3V", fixed3v3_power_consumers,
                                     ARRAY_SIZE(fixed3v3_power_consumers), 3300000);
 
+       pinctrl_register_mappings(eva_pinctrl_map, ARRAY_SIZE(eva_pinctrl_map));
+
        r8a7740_pinmux_init();
        r8a7740_meram_workaround();
 
@@ -970,42 +1006,13 @@ static void __init eva_init(void)
 
        /* LCDC0 */
        gpio_request(GPIO_FN_LCDC0_SELECT,      NULL);
-       gpio_request(GPIO_FN_LCD0_D0,           NULL);
-       gpio_request(GPIO_FN_LCD0_D1,           NULL);
-       gpio_request(GPIO_FN_LCD0_D2,           NULL);
-       gpio_request(GPIO_FN_LCD0_D3,           NULL);
-       gpio_request(GPIO_FN_LCD0_D4,           NULL);
-       gpio_request(GPIO_FN_LCD0_D5,           NULL);
-       gpio_request(GPIO_FN_LCD0_D6,           NULL);
-       gpio_request(GPIO_FN_LCD0_D7,           NULL);
-       gpio_request(GPIO_FN_LCD0_D8,           NULL);
-       gpio_request(GPIO_FN_LCD0_D9,           NULL);
-       gpio_request(GPIO_FN_LCD0_D10,          NULL);
-       gpio_request(GPIO_FN_LCD0_D11,          NULL);
-       gpio_request(GPIO_FN_LCD0_D12,          NULL);
-       gpio_request(GPIO_FN_LCD0_D13,          NULL);
-       gpio_request(GPIO_FN_LCD0_D14,          NULL);
-       gpio_request(GPIO_FN_LCD0_D15,          NULL);
-       gpio_request(GPIO_FN_LCD0_D16,          NULL);
-       gpio_request(GPIO_FN_LCD0_D17,          NULL);
-       gpio_request(GPIO_FN_LCD0_D18_PORT40,   NULL);
-       gpio_request(GPIO_FN_LCD0_D19_PORT4,    NULL);
-       gpio_request(GPIO_FN_LCD0_D20_PORT3,    NULL);
-       gpio_request(GPIO_FN_LCD0_D21_PORT2,    NULL);
-       gpio_request(GPIO_FN_LCD0_D22_PORT0,    NULL);
-       gpio_request(GPIO_FN_LCD0_D23_PORT1,    NULL);
-       gpio_request(GPIO_FN_LCD0_DCK,          NULL);
-       gpio_request(GPIO_FN_LCD0_VSYN,         NULL);
-       gpio_request(GPIO_FN_LCD0_HSYN,         NULL);
-       gpio_request(GPIO_FN_LCD0_DISP,         NULL);
-       gpio_request(GPIO_FN_LCD0_LCLK_PORT165, NULL);
-
-       gpio_request_one(GPIO_PORT61, GPIOF_OUT_INIT_HIGH, NULL); /* LCDDON */
-       gpio_request_one(GPIO_PORT202, GPIOF_OUT_INIT_LOW, NULL); /* LCD0_LED_CONT */
+
+       gpio_request_one(61, GPIOF_OUT_INIT_HIGH, NULL); /* LCDDON */
+       gpio_request_one(202, GPIOF_OUT_INIT_LOW, NULL); /* LCD0_LED_CONT */
 
        /* Touchscreen */
        gpio_request(GPIO_FN_IRQ10,     NULL); /* TP_INT */
-       gpio_request_one(GPIO_PORT166, GPIOF_OUT_INIT_HIGH, NULL); /* TP_RST_B */
+       gpio_request_one(166, GPIOF_OUT_INIT_HIGH, NULL); /* TP_RST_B */
 
        /* GETHER */
        gpio_request(GPIO_FN_ET_CRS,            NULL);
@@ -1028,12 +1035,12 @@ static void __init eva_init(void)
        gpio_request(GPIO_FN_ET_RX_DV,          NULL);
        gpio_request(GPIO_FN_ET_RX_CLK,         NULL);
 
-       gpio_request_one(GPIO_PORT18, GPIOF_OUT_INIT_HIGH, NULL); /* PHY_RST */
+       gpio_request_one(18, GPIOF_OUT_INIT_HIGH, NULL); /* PHY_RST */
 
        /* USB */
-       gpio_request_one(GPIO_PORT159, GPIOF_IN, NULL); /* USB_DEVICE_MODE */
+       gpio_request_one(159, GPIOF_IN, NULL); /* USB_DEVICE_MODE */
 
-       if (gpio_get_value(GPIO_PORT159)) {
+       if (gpio_get_value(159)) {
                /* USB Host */
        } else {
                /* USB Func */
@@ -1042,47 +1049,22 @@ static void __init eva_init(void)
                 * OTOH, usbhs interrupt needs its value (HI/LOW) to decide
                 * USB connection/disconnection (usbhsf_get_vbus()).
                 * This means we needs to select GPIO_FN_IRQ7_PORT209 first,
-                * and select GPIO_PORT209 here
+                * and select GPIO 209 here
                 */
                gpio_request(GPIO_FN_IRQ7_PORT209, NULL);
-               gpio_request_one(GPIO_PORT209, GPIOF_IN, NULL);
+               gpio_request_one(209, GPIOF_IN, NULL);
 
                platform_device_register(&usbhsf_device);
                usb = &usbhsf_device;
        }
 
        /* SDHI0 */
-       gpio_request(GPIO_FN_SDHI0_CMD, NULL);
-       gpio_request(GPIO_FN_SDHI0_CLK, NULL);
-       gpio_request(GPIO_FN_SDHI0_D0, NULL);
-       gpio_request(GPIO_FN_SDHI0_D1, NULL);
-       gpio_request(GPIO_FN_SDHI0_D2, NULL);
-       gpio_request(GPIO_FN_SDHI0_D3, NULL);
-       gpio_request(GPIO_FN_SDHI0_WP, NULL);
-
-       gpio_request_one(GPIO_PORT17, GPIOF_OUT_INIT_LOW, NULL);  /* SDHI0_18/33_B */
-       gpio_request_one(GPIO_PORT74, GPIOF_OUT_INIT_HIGH, NULL); /* SDHI0_PON */
-       gpio_request_one(GPIO_PORT75, GPIOF_OUT_INIT_HIGH, NULL); /* SDSLOT1_PON */
+       gpio_request_one(17, GPIOF_OUT_INIT_LOW, NULL);  /* SDHI0_18/33_B */
+       gpio_request_one(74, GPIOF_OUT_INIT_HIGH, NULL); /* SDHI0_PON */
+       gpio_request_one(75, GPIOF_OUT_INIT_HIGH, NULL); /* SDSLOT1_PON */
 
        /* we can use GPIO_FN_IRQ31_PORT167 here for SDHI0 CD irq */
 
-       /*
-        * MMCIF
-        *
-        * Here doesn't care SW1.4 status,
-        * since CON2 is not mounted.
-        */
-       gpio_request(GPIO_FN_MMC1_CLK_PORT103,  NULL);
-       gpio_request(GPIO_FN_MMC1_CMD_PORT104,  NULL);
-       gpio_request(GPIO_FN_MMC1_D0_PORT149,   NULL);
-       gpio_request(GPIO_FN_MMC1_D1_PORT148,   NULL);
-       gpio_request(GPIO_FN_MMC1_D2_PORT147,   NULL);
-       gpio_request(GPIO_FN_MMC1_D3_PORT146,   NULL);
-       gpio_request(GPIO_FN_MMC1_D4_PORT145,   NULL);
-       gpio_request(GPIO_FN_MMC1_D5_PORT144,   NULL);
-       gpio_request(GPIO_FN_MMC1_D6_PORT143,   NULL);
-       gpio_request(GPIO_FN_MMC1_D7_PORT142,   NULL);
-
        /* CEU0 */
        gpio_request(GPIO_FN_VIO0_D7,           NULL);
        gpio_request(GPIO_FN_VIO0_D6,           NULL);
@@ -1099,10 +1081,10 @@ static void __init eva_init(void)
        gpio_request(GPIO_FN_VIO_CKO,           NULL);
 
        /* CON1/CON15 Camera */
-       gpio_request_one(GPIO_PORT173, GPIOF_OUT_INIT_LOW, NULL);  /* STANDBY */
-       gpio_request_one(GPIO_PORT172, GPIOF_OUT_INIT_HIGH, NULL); /* RST */
+       gpio_request_one(173, GPIOF_OUT_INIT_LOW, NULL);  /* STANDBY */
+       gpio_request_one(172, GPIOF_OUT_INIT_HIGH, NULL); /* RST */
        /* see mt9t111_power() */
-       gpio_request_one(GPIO_PORT158, GPIOF_OUT_INIT_LOW, NULL);  /* CAM_PON */
+       gpio_request_one(158, GPIOF_OUT_INIT_LOW, NULL);  /* CAM_PON */
 
        /* FSI-WM8978 */
        gpio_request(GPIO_FN_FSIAIBT,           NULL);
@@ -1111,8 +1093,8 @@ static void __init eva_init(void)
        gpio_request(GPIO_FN_FSIAOSLD,          NULL);
        gpio_request(GPIO_FN_FSIAISLD_PORT5,    NULL);
 
-       gpio_request(GPIO_PORT7, NULL);
-       gpio_request(GPIO_PORT8, NULL);
+       gpio_request(7, NULL);
+       gpio_request(8, NULL);
        gpio_direction_none(GPIO_PORT7CR); /* FSIAOBT needs no direction */
        gpio_direction_none(GPIO_PORT8CR); /* FSIAOLR needs no direction */
 
@@ -1129,28 +1111,22 @@ static void __init eva_init(void)
         * DBGMD/LCDC0/FSIA MUX
         * DBGMD_SELECT_B should be set after setting PFC Function.
         */
-       gpio_request_one(GPIO_PORT176, GPIOF_OUT_INIT_HIGH, NULL);
+       gpio_request_one(176, GPIOF_OUT_INIT_HIGH, NULL);
 
        /*
         * We can switch CON8/CON14 by SW1.5,
         * but it needs after DBGMD_SELECT_B
         */
-       gpio_request_one(GPIO_PORT6, GPIOF_IN, NULL);
-       if (gpio_get_value(GPIO_PORT6)) {
+       gpio_request_one(6, GPIOF_IN, NULL);
+       if (gpio_get_value(6)) {
                /* CON14 enable */
        } else {
                /* CON8 (SDHI1) enable */
-               gpio_request(GPIO_FN_SDHI1_CLK, NULL);
-               gpio_request(GPIO_FN_SDHI1_CMD, NULL);
-               gpio_request(GPIO_FN_SDHI1_D0,  NULL);
-               gpio_request(GPIO_FN_SDHI1_D1,  NULL);
-               gpio_request(GPIO_FN_SDHI1_D2,  NULL);
-               gpio_request(GPIO_FN_SDHI1_D3,  NULL);
-               gpio_request(GPIO_FN_SDHI1_CD,  NULL);
-               gpio_request(GPIO_FN_SDHI1_WP,  NULL);
+               pinctrl_register_mappings(eva_sdhi1_pinctrl_map,
+                                         ARRAY_SIZE(eva_sdhi1_pinctrl_map));
 
                /* SDSLOT2_PON */
-               gpio_request_one(GPIO_PORT16, GPIOF_OUT_INIT_HIGH, NULL);
+               gpio_request_one(16, GPIOF_OUT_INIT_HIGH, NULL);
 
                platform_device_register(&sdhi1_device);
        }
@@ -1207,7 +1183,6 @@ DT_MACHINE_START(ARMADILLO800EVA_DT, "armadillo800eva")
        .map_io         = r8a7740_map_io,
        .init_early     = eva_add_early_devices,
        .init_irq       = r8a7740_init_irq,
-       .handle_irq     = shmobile_handle_irq_intc,
        .init_machine   = eva_init,
        .init_late      = shmobile_init_late,
        .init_time      = eva_earlytimer_init,
index e50f866915396ea36712806dc22b35644fb3a1a5..70d992c540aeb7b6cc599596d407b7403253b62d 100644 (file)
@@ -24,6 +24,7 @@
 #include <linux/init.h>
 #include <linux/interrupt.h>
 #include <linux/irq.h>
+#include <linux/pinctrl/machine.h>
 #include <linux/platform_device.h>
 #include <linux/gpio.h>
 #include <linux/regulator/fixed.h>
@@ -288,6 +289,16 @@ static struct platform_device lcdc0_device = {
        },
 };
 
+static const struct pinctrl_map lcdc0_pinctrl_map[] = {
+       /* LCD0 */
+       PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_lcdc_fb.0", "pfc-r8a7740",
+                                 "lcd0_data24_1", "lcd0"),
+       PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_lcdc_fb.0", "pfc-r8a7740",
+                                 "lcd0_lclk_1", "lcd0"),
+       PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_lcdc_fb.0", "pfc-r8a7740",
+                                 "lcd0_sync", "lcd0"),
+};
+
 /*
  * SMSC 9221
  */
@@ -392,8 +403,8 @@ static void __init bonito_init(void)
        /*
         * base board settings
         */
-       gpio_request_one(GPIO_PORT176, GPIOF_IN, NULL);
-       if (!gpio_get_value(GPIO_PORT176)) {
+       gpio_request_one(176, GPIOF_IN, NULL);
+       if (!gpio_get_value(176)) {
                u16 bsw2;
                u16 bsw3;
                u16 bsw4;
@@ -430,38 +441,11 @@ static void __init bonito_init(void)
                 */
                if (BIT_ON(bsw2, 3) &&  /* S38.1 = OFF */
                    BIT_ON(bsw2, 2)) {  /* S38.2 = OFF */
-                       gpio_request(GPIO_FN_LCDC0_SELECT,      NULL);
-                       gpio_request(GPIO_FN_LCD0_D0,           NULL);
-                       gpio_request(GPIO_FN_LCD0_D1,           NULL);
-                       gpio_request(GPIO_FN_LCD0_D2,           NULL);
-                       gpio_request(GPIO_FN_LCD0_D3,           NULL);
-                       gpio_request(GPIO_FN_LCD0_D4,           NULL);
-                       gpio_request(GPIO_FN_LCD0_D5,           NULL);
-                       gpio_request(GPIO_FN_LCD0_D6,           NULL);
-                       gpio_request(GPIO_FN_LCD0_D7,           NULL);
-                       gpio_request(GPIO_FN_LCD0_D8,           NULL);
-                       gpio_request(GPIO_FN_LCD0_D9,           NULL);
-                       gpio_request(GPIO_FN_LCD0_D10,          NULL);
-                       gpio_request(GPIO_FN_LCD0_D11,          NULL);
-                       gpio_request(GPIO_FN_LCD0_D12,          NULL);
-                       gpio_request(GPIO_FN_LCD0_D13,          NULL);
-                       gpio_request(GPIO_FN_LCD0_D14,          NULL);
-                       gpio_request(GPIO_FN_LCD0_D15,          NULL);
-                       gpio_request(GPIO_FN_LCD0_D16,          NULL);
-                       gpio_request(GPIO_FN_LCD0_D17,          NULL);
-                       gpio_request(GPIO_FN_LCD0_D18_PORT163,  NULL);
-                       gpio_request(GPIO_FN_LCD0_D19_PORT162,  NULL);
-                       gpio_request(GPIO_FN_LCD0_D20_PORT161,  NULL);
-                       gpio_request(GPIO_FN_LCD0_D21_PORT158,  NULL);
-                       gpio_request(GPIO_FN_LCD0_D22_PORT160,  NULL);
-                       gpio_request(GPIO_FN_LCD0_D23_PORT159,  NULL);
-                       gpio_request(GPIO_FN_LCD0_DCK,          NULL);
-                       gpio_request(GPIO_FN_LCD0_VSYN,         NULL);
-                       gpio_request(GPIO_FN_LCD0_HSYN,         NULL);
-                       gpio_request(GPIO_FN_LCD0_DISP,         NULL);
-                       gpio_request(GPIO_FN_LCD0_LCLK_PORT165, NULL);
-
-                       gpio_request_one(GPIO_PORT61, GPIOF_OUT_INIT_HIGH,
+                       pinctrl_register_mappings(lcdc0_pinctrl_map,
+                                                 ARRAY_SIZE(lcdc0_pinctrl_map));
+                       gpio_request(GPIO_FN_LCDC0_SELECT, NULL);
+
+                       gpio_request_one(61, GPIOF_OUT_INIT_HIGH,
                                         NULL); /* LCDDON */
 
                        /* backlight on */
index 2ccc860403efce51bb394f9d4d92168dab89c18e..ef5ca0ef0cb5179b666ce4dc2f298fcda6ed1bf6 100644 (file)
@@ -24,6 +24,8 @@
 #include <linux/init.h>
 #include <linux/interrupt.h>
 #include <linux/irq.h>
+#include <linux/pinctrl/machine.h>
+#include <linux/pinctrl/pinconf-generic.h>
 #include <linux/platform_device.h>
 #include <linux/delay.h>
 #include <linux/io.h>
@@ -135,17 +137,17 @@ static struct platform_device keysc_device = {
 #define GPIO_KEY(c, g, d) { .code = c, .gpio = g, .desc = d, .active_low = 1 }
 
 static struct gpio_keys_button gpio_buttons[] = {
-       GPIO_KEY(KEY_VOLUMEUP, GPIO_PORT56, "+"), /* S2: VOL+ [IRQ9] */
-       GPIO_KEY(KEY_VOLUMEDOWN, GPIO_PORT54, "-"), /* S3: VOL- [IRQ10] */
-       GPIO_KEY(KEY_MENU, GPIO_PORT27, "Menu"), /* S4: MENU [IRQ30] */
-       GPIO_KEY(KEY_HOMEPAGE, GPIO_PORT26, "Home"), /* S5: HOME [IRQ31] */
-       GPIO_KEY(KEY_BACK, GPIO_PORT11, "Back"), /* S6: BACK [IRQ0] */
-       GPIO_KEY(KEY_PHONE, GPIO_PORT238, "Tel"), /* S7: TEL [IRQ11] */
-       GPIO_KEY(KEY_POWER, GPIO_PORT239, "C1"), /* S8: CAM [IRQ13] */
-       GPIO_KEY(KEY_MAIL, GPIO_PORT224, "Mail"), /* S9: MAIL [IRQ3] */
-       /* Omitted button "C3?": GPIO_PORT223 - S10: CUST [IRQ8] */
-       GPIO_KEY(KEY_CAMERA, GPIO_PORT164, "C2"), /* S11: CAM_HALF [IRQ25] */
-       /* Omitted button "?": GPIO_PORT152 - S12: CAM_FULL [No IRQ] */
+       GPIO_KEY(KEY_VOLUMEUP, 56, "+"), /* S2: VOL+ [IRQ9] */
+       GPIO_KEY(KEY_VOLUMEDOWN, 54, "-"), /* S3: VOL- [IRQ10] */
+       GPIO_KEY(KEY_MENU, 27, "Menu"), /* S4: MENU [IRQ30] */
+       GPIO_KEY(KEY_HOMEPAGE, 26, "Home"), /* S5: HOME [IRQ31] */
+       GPIO_KEY(KEY_BACK, 11, "Back"), /* S6: BACK [IRQ0] */
+       GPIO_KEY(KEY_PHONE, 238, "Tel"), /* S7: TEL [IRQ11] */
+       GPIO_KEY(KEY_POWER, 239, "C1"), /* S8: CAM [IRQ13] */
+       GPIO_KEY(KEY_MAIL, 224, "Mail"), /* S9: MAIL [IRQ3] */
+       /* Omitted button "C3?": 223 - S10: CUST [IRQ8] */
+       GPIO_KEY(KEY_CAMERA, 164, "C2"), /* S11: CAM_HALF [IRQ25] */
+       /* Omitted button "?": 152 - S12: CAM_FULL [No IRQ] */
 };
 
 static struct gpio_keys_platform_data gpio_key_info = {
@@ -165,9 +167,9 @@ static struct platform_device gpio_keys_device = {
 #define GPIO_LED(n, g) { .name = n, .gpio = g }
 
 static struct gpio_led gpio_leds[] = {
-       GPIO_LED("G", GPIO_PORT20), /* PORT20 [GPO0] -> LED7 -> "G" */
-       GPIO_LED("H", GPIO_PORT21), /* PORT21 [GPO1] -> LED8 -> "H" */
-       GPIO_LED("J", GPIO_PORT22), /* PORT22 [GPO2] -> LED9 -> "J" */
+       GPIO_LED("G", 20), /* PORT20 [GPO0] -> LED7 -> "G" */
+       GPIO_LED("H", 21), /* PORT21 [GPO1] -> LED8 -> "H" */
+       GPIO_LED("J", 22), /* PORT22 [GPO2] -> LED9 -> "J" */
 };
 
 static struct gpio_led_platform_data gpio_leds_info = {
@@ -187,7 +189,7 @@ static struct platform_device gpio_leds_device = {
 static struct led_renesas_tpu_config led_renesas_tpu12_pdata = {
        .name           = "V2513",
        .pin_gpio_fn    = GPIO_FN_TPU1TO2,
-       .pin_gpio       = GPIO_PORT153,
+       .pin_gpio       = 153,
        .channel_offset = 0x90,
        .timer_bit = 2,
        .max_brightness = 1000,
@@ -215,7 +217,7 @@ static struct platform_device leds_tpu12_device = {
 static struct led_renesas_tpu_config led_renesas_tpu41_pdata = {
        .name           = "V2514",
        .pin_gpio_fn    = GPIO_FN_TPU4TO1,
-       .pin_gpio       = GPIO_PORT199,
+       .pin_gpio       = 199,
        .channel_offset = 0x50,
        .timer_bit = 1,
        .max_brightness = 1000,
@@ -243,7 +245,7 @@ static struct platform_device leds_tpu41_device = {
 static struct led_renesas_tpu_config led_renesas_tpu21_pdata = {
        .name           = "V2515",
        .pin_gpio_fn    = GPIO_FN_TPU2TO1,
-       .pin_gpio       = GPIO_PORT197,
+       .pin_gpio       = 197,
        .channel_offset = 0x50,
        .timer_bit = 1,
        .max_brightness = 1000,
@@ -271,7 +273,7 @@ static struct platform_device leds_tpu21_device = {
 static struct led_renesas_tpu_config led_renesas_tpu30_pdata = {
        .name           = "KEYLED",
        .pin_gpio_fn    = GPIO_FN_TPU3TO0,
-       .pin_gpio       = GPIO_PORT163,
+       .pin_gpio       = 163,
        .channel_offset = 0x10,
        .timer_bit = 0,
        .max_brightness = 1000,
@@ -433,6 +435,85 @@ static struct platform_device *kota2_devices[] __initdata = {
        &sdhi1_device,
 };
 
+static unsigned long pin_pullup_conf[] = {
+       PIN_CONF_PACKED(PIN_CONFIG_BIAS_PULL_UP, 0),
+};
+
+static const struct pinctrl_map kota2_pinctrl_map[] = {
+       /* KEYSC */
+       PIN_MAP_MUX_GROUP_DEFAULT("sh_keysc.0", "pfc-sh73a0",
+                                 "keysc_in8", "keysc"),
+       PIN_MAP_MUX_GROUP_DEFAULT("sh_keysc.0", "pfc-sh73a0",
+                                 "keysc_out04", "keysc"),
+       PIN_MAP_MUX_GROUP_DEFAULT("sh_keysc.0", "pfc-sh73a0",
+                                 "keysc_out5", "keysc"),
+       PIN_MAP_MUX_GROUP_DEFAULT("sh_keysc.0", "pfc-sh73a0",
+                                 "keysc_out6_0", "keysc"),
+       PIN_MAP_MUX_GROUP_DEFAULT("sh_keysc.0", "pfc-sh73a0",
+                                 "keysc_out7_0", "keysc"),
+       PIN_MAP_MUX_GROUP_DEFAULT("sh_keysc.0", "pfc-sh73a0",
+                                 "keysc_out8_0", "keysc"),
+       PIN_MAP_CONFIGS_GROUP_DEFAULT("sh_keysc.0", "pfc-sh73a0",
+                                     "keysc_in8", pin_pullup_conf),
+       /* MMCIF */
+       PIN_MAP_MUX_GROUP_DEFAULT("sh_mmcif.0", "pfc-sh73a0",
+                                 "mmc0_data8_0", "mmc0"),
+       PIN_MAP_MUX_GROUP_DEFAULT("sh_mmcif.0", "pfc-sh73a0",
+                                 "mmc0_ctrl_0", "mmc0"),
+       PIN_MAP_CONFIGS_PIN_DEFAULT("sh_mmcif.0", "pfc-sh73a0",
+                                   "PORT279", pin_pullup_conf),
+       PIN_MAP_CONFIGS_GROUP_DEFAULT("sh_mmcif.0", "pfc-sh73a0",
+                                     "mmc0_data8_0", pin_pullup_conf),
+       /* SCIFA2 (UART2) */
+       PIN_MAP_MUX_GROUP_DEFAULT("sh-sci.2", "pfc-sh73a0",
+                                 "scifa2_data_0", "scifa2"),
+       PIN_MAP_MUX_GROUP_DEFAULT("sh-sci.2", "pfc-sh73a0",
+                                 "scifa2_ctrl_0", "scifa2"),
+       /* SCIFA4 (UART1) */
+       PIN_MAP_MUX_GROUP_DEFAULT("sh-sci.4", "pfc-sh73a0",
+                                 "scifa4_data", "scifa4"),
+       PIN_MAP_MUX_GROUP_DEFAULT("sh-sci.4", "pfc-sh73a0",
+                                 "scifa4_ctrl", "scifa4"),
+       /* SCIFB (BT) */
+       PIN_MAP_MUX_GROUP_DEFAULT("sh-sci.8", "pfc-sh73a0",
+                                 "scifb_data_0", "scifb"),
+       PIN_MAP_MUX_GROUP_DEFAULT("sh-sci.8", "pfc-sh73a0",
+                                 "scifb_clk_0", "scifb"),
+       PIN_MAP_MUX_GROUP_DEFAULT("sh-sci.8", "pfc-sh73a0",
+                                 "scifb_ctrl_0", "scifb"),
+       /* SDHI0 (microSD) */
+       PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.0", "pfc-sh73a0",
+                                 "sdhi0_data4", "sdhi0"),
+       PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.0", "pfc-sh73a0",
+                                 "sdhi0_ctrl", "sdhi0"),
+       PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.0", "pfc-sh73a0",
+                                 "sdhi0_cd", "sdhi0"),
+       PIN_MAP_CONFIGS_GROUP_DEFAULT("sh_mobile_sdhi.0", "pfc-sh73a0",
+                                     "sdhi0_data4", pin_pullup_conf),
+       PIN_MAP_CONFIGS_PIN_DEFAULT("sh_mobile_sdhi.0", "pfc-sh73a0",
+                                   "PORT256", pin_pullup_conf),
+       PIN_MAP_CONFIGS_PIN_DEFAULT("sh_mobile_sdhi.0", "pfc-sh73a0",
+                                   "PORT251", pin_pullup_conf),
+       /* SDHI1 (BCM4330) */
+       PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.1", "pfc-sh73a0",
+                                 "sdhi1_data4", "sdhi1"),
+       PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.1", "pfc-sh73a0",
+                                 "sdhi1_ctrl", "sdhi1"),
+       PIN_MAP_CONFIGS_GROUP_DEFAULT("sh_mobile_sdhi.1", "pfc-sh73a0",
+                                     "sdhi1_data4", pin_pullup_conf),
+       PIN_MAP_CONFIGS_PIN_DEFAULT("sh_mobile_sdhi.1", "pfc-sh73a0",
+                                   "PORT263", pin_pullup_conf),
+       /* SMSC911X */
+       PIN_MAP_MUX_GROUP_DEFAULT("smsc911x.0", "pfc-sh73a0",
+                                 "bsc_data_0_7", "bsc"),
+       PIN_MAP_MUX_GROUP_DEFAULT("smsc911x.0", "pfc-sh73a0",
+                                 "bsc_data_8_15", "bsc"),
+       PIN_MAP_MUX_GROUP_DEFAULT("smsc911x.0", "pfc-sh73a0",
+                                 "bsc_cs5_a", "bsc"),
+       PIN_MAP_MUX_GROUP_DEFAULT("smsc911x.0", "pfc-sh73a0",
+                                 "bsc_we0", "bsc"),
+};
+
 static void __init kota2_init(void)
 {
        regulator_register_always_on(0, "fixed-1.8V", fixed1v8_power_consumers,
@@ -441,97 +522,16 @@ static void __init kota2_init(void)
                                     ARRAY_SIZE(fixed3v3_power_consumers), 3300000);
        regulator_register_fixed(2, dummy_supplies, ARRAY_SIZE(dummy_supplies));
 
+       pinctrl_register_mappings(kota2_pinctrl_map,
+                                 ARRAY_SIZE(kota2_pinctrl_map));
        sh73a0_pinmux_init();
 
-       /* SCIFA2 (UART2) */
-       gpio_request(GPIO_FN_SCIFA2_TXD1, NULL);
-       gpio_request(GPIO_FN_SCIFA2_RXD1, NULL);
-       gpio_request(GPIO_FN_SCIFA2_RTS1_, NULL);
-       gpio_request(GPIO_FN_SCIFA2_CTS1_, NULL);
-
-       /* SCIFA4 (UART1) */
-       gpio_request(GPIO_FN_SCIFA4_TXD, NULL);
-       gpio_request(GPIO_FN_SCIFA4_RXD, NULL);
-       gpio_request(GPIO_FN_SCIFA4_RTS_, NULL);
-       gpio_request(GPIO_FN_SCIFA4_CTS_, NULL);
-
        /* SMSC911X */
-       gpio_request(GPIO_FN_D0_NAF0, NULL);
-       gpio_request(GPIO_FN_D1_NAF1, NULL);
-       gpio_request(GPIO_FN_D2_NAF2, NULL);
-       gpio_request(GPIO_FN_D3_NAF3, NULL);
-       gpio_request(GPIO_FN_D4_NAF4, NULL);
-       gpio_request(GPIO_FN_D5_NAF5, NULL);
-       gpio_request(GPIO_FN_D6_NAF6, NULL);
-       gpio_request(GPIO_FN_D7_NAF7, NULL);
-       gpio_request(GPIO_FN_D8_NAF8, NULL);
-       gpio_request(GPIO_FN_D9_NAF9, NULL);
-       gpio_request(GPIO_FN_D10_NAF10, NULL);
-       gpio_request(GPIO_FN_D11_NAF11, NULL);
-       gpio_request(GPIO_FN_D12_NAF12, NULL);
-       gpio_request(GPIO_FN_D13_NAF13, NULL);
-       gpio_request(GPIO_FN_D14_NAF14, NULL);
-       gpio_request(GPIO_FN_D15_NAF15, NULL);
-       gpio_request(GPIO_FN_CS5A_, NULL);
-       gpio_request(GPIO_FN_WE0__FWE, NULL);
-       gpio_request_one(GPIO_PORT144, GPIOF_IN, NULL); /* PINTA2 */
-       gpio_request_one(GPIO_PORT145, GPIOF_OUT_INIT_HIGH, NULL); /* RESET */
-
-       /* KEYSC */
-       gpio_request(GPIO_FN_KEYIN0_PU, NULL);
-       gpio_request(GPIO_FN_KEYIN1_PU, NULL);
-       gpio_request(GPIO_FN_KEYIN2_PU, NULL);
-       gpio_request(GPIO_FN_KEYIN3_PU, NULL);
-       gpio_request(GPIO_FN_KEYIN4_PU, NULL);
-       gpio_request(GPIO_FN_KEYIN5_PU, NULL);
-       gpio_request(GPIO_FN_KEYIN6_PU, NULL);
-       gpio_request(GPIO_FN_KEYIN7_PU, NULL);
-       gpio_request(GPIO_FN_KEYOUT0, NULL);
-       gpio_request(GPIO_FN_KEYOUT1, NULL);
-       gpio_request(GPIO_FN_KEYOUT2, NULL);
-       gpio_request(GPIO_FN_KEYOUT3, NULL);
-       gpio_request(GPIO_FN_KEYOUT4, NULL);
-       gpio_request(GPIO_FN_KEYOUT5, NULL);
-       gpio_request(GPIO_FN_PORT59_KEYOUT6, NULL);
-       gpio_request(GPIO_FN_PORT58_KEYOUT7, NULL);
-       gpio_request(GPIO_FN_KEYOUT8, NULL);
+       gpio_request_one(144, GPIOF_IN, NULL); /* PINTA2 */
+       gpio_request_one(145, GPIOF_OUT_INIT_HIGH, NULL); /* RESET */
 
        /* MMCIF */
-       gpio_request(GPIO_FN_MMCCLK0, NULL);
-       gpio_request(GPIO_FN_MMCD0_0, NULL);
-       gpio_request(GPIO_FN_MMCD0_1, NULL);
-       gpio_request(GPIO_FN_MMCD0_2, NULL);
-       gpio_request(GPIO_FN_MMCD0_3, NULL);
-       gpio_request(GPIO_FN_MMCD0_4, NULL);
-       gpio_request(GPIO_FN_MMCD0_5, NULL);
-       gpio_request(GPIO_FN_MMCD0_6, NULL);
-       gpio_request(GPIO_FN_MMCD0_7, NULL);
-       gpio_request(GPIO_FN_MMCCMD0, NULL);
-       gpio_request_one(GPIO_PORT208, GPIOF_OUT_INIT_HIGH, NULL); /* Reset */
-
-       /* SDHI0 (microSD) */
-       gpio_request(GPIO_FN_SDHICD0_PU, NULL);
-       gpio_request(GPIO_FN_SDHICMD0_PU, NULL);
-       gpio_request(GPIO_FN_SDHICLK0, NULL);
-       gpio_request(GPIO_FN_SDHID0_3_PU, NULL);
-       gpio_request(GPIO_FN_SDHID0_2_PU, NULL);
-       gpio_request(GPIO_FN_SDHID0_1_PU, NULL);
-       gpio_request(GPIO_FN_SDHID0_0_PU, NULL);
-
-       /* SCIFB (BT) */
-       gpio_request(GPIO_FN_PORT159_SCIFB_SCK, NULL);
-       gpio_request(GPIO_FN_PORT160_SCIFB_TXD, NULL);
-       gpio_request(GPIO_FN_PORT161_SCIFB_CTS_, NULL);
-       gpio_request(GPIO_FN_PORT162_SCIFB_RXD, NULL);
-       gpio_request(GPIO_FN_PORT163_SCIFB_RTS_, NULL);
-
-       /* SDHI1 (BCM4330) */
-       gpio_request(GPIO_FN_SDHICLK1, NULL);
-       gpio_request(GPIO_FN_SDHICMD1_PU, NULL);
-       gpio_request(GPIO_FN_SDHID1_3_PU, NULL);
-       gpio_request(GPIO_FN_SDHID1_2_PU, NULL);
-       gpio_request(GPIO_FN_SDHID1_1_PU, NULL);
-       gpio_request(GPIO_FN_SDHID1_0_PU, NULL);
+       gpio_request_one(208, GPIOF_OUT_INIT_HIGH, NULL); /* Reset */
 
 #ifdef CONFIG_CACHE_L2X0
        /* Early BRESP enable, Shared attribute override enable, 64K*8way */
index 7f3a6b7e7b7cfdfd1697560d2e3ecb6b3a6c6f38..446d04db404f8ab09ba35ba33b878ea1632f7d4c 100644 (file)
@@ -30,6 +30,8 @@
 #include <linux/mmc/sh_mmcif.h>
 #include <linux/mmc/sh_mobile_sdhi.h>
 #include <linux/mfd/tmio.h>
+#include <linux/pinctrl/machine.h>
+#include <linux/pinctrl/pinconf-generic.h>
 #include <linux/platform_device.h>
 #include <linux/regulator/fixed.h>
 #include <linux/regulator/machine.h>
@@ -81,7 +83,7 @@ static struct resource smsc9221_resources[] = {
                .flags  = IORESOURCE_MEM,
        },
        [1] = {
-               .start  = intcs_evt2irq(0x260), /* IRQ3 */
+               .start  = irq_pin(3), /* IRQ3 */
                .flags  = IORESOURCE_IRQ,
        },
 };
@@ -115,7 +117,7 @@ static struct resource usb_resources[] = {
                .flags  = IORESOURCE_MEM,
        },
        [1] = {
-               .start  = intcs_evt2irq(0x220), /* IRQ1 */
+               .start  = irq_pin(1), /* IRQ1 */
                .flags  = IORESOURCE_IRQ,
        },
 };
@@ -138,7 +140,7 @@ struct usbhs_private {
        struct renesas_usbhs_platform_info info;
 };
 
-#define IRQ15                  intcs_evt2irq(0x03e0)
+#define IRQ15                  irq_pin(15)
 #define USB_PHY_MODE           (1 << 4)
 #define USB_PHY_INT_EN         ((1 << 3) | (1 << 2))
 #define USB_PHY_ON             (1 << 1)
@@ -433,7 +435,7 @@ static struct sh_mobile_sdhi_info sdhi2_info = {
                          TMIO_MMC_WRPROTECT_DISABLE,
        .tmio_caps      = MMC_CAP_SD_HIGHSPEED,
        .tmio_ocr_mask  = MMC_VDD_27_28 | MMC_VDD_28_29,
-       .cd_gpio        = GPIO_PORT13,
+       .cd_gpio        = 13,
 };
 
 static struct resource sdhi2_resources[] = {
@@ -563,25 +565,25 @@ static struct i2c_board_info i2c0_devices[] = {
        },
        {
                I2C_BOARD_INFO("ak8975", 0x0c),
-               .irq = intcs_evt2irq(0x3380), /* IRQ28 */
+               .irq = irq_pin(28), /* IRQ28 */
        },
        {
                I2C_BOARD_INFO("adxl34x", 0x1d),
-               .irq = intcs_evt2irq(0x3340), /* IRQ26 */
+               .irq = irq_pin(26), /* IRQ26 */
        },
 };
 
 static struct i2c_board_info i2c1_devices[] = {
        {
                I2C_BOARD_INFO("st1232-ts", 0x55),
-               .irq = intcs_evt2irq(0x300), /* IRQ8 */
+               .irq = irq_pin(8), /* IRQ8 */
        },
 };
 
 static struct i2c_board_info i2c3_devices[] = {
        {
                I2C_BOARD_INFO("pcf8575", 0x20),
-               .irq            = intcs_evt2irq(0x3260), /* IRQ19 */
+               .irq = irq_pin(19), /* IRQ19 */
                .platform_data = &pcf8575_pdata,
        },
 };
@@ -599,6 +601,64 @@ static struct platform_device *kzm_devices[] __initdata = {
        &fsi_ak4648_device,
 };
 
+static unsigned long pin_pullup_conf[] = {
+       PIN_CONF_PACKED(PIN_CONFIG_BIAS_PULL_UP, 0),
+};
+
+static const struct pinctrl_map kzm_pinctrl_map[] = {
+       /* FSIA (AK4648) */
+       PIN_MAP_MUX_GROUP_DEFAULT("sh_fsi2.0", "pfc-sh73a0",
+                                 "fsia_mclk_in", "fsia"),
+       PIN_MAP_MUX_GROUP_DEFAULT("sh_fsi2.0", "pfc-sh73a0",
+                                 "fsia_sclk_in", "fsia"),
+       PIN_MAP_MUX_GROUP_DEFAULT("sh_fsi2.0", "pfc-sh73a0",
+                                 "fsia_data_in", "fsia"),
+       PIN_MAP_MUX_GROUP_DEFAULT("sh_fsi2.0", "pfc-sh73a0",
+                                 "fsia_data_out", "fsia"),
+       /* I2C3 */
+       PIN_MAP_MUX_GROUP_DEFAULT("i2c-sh_mobile.3", "pfc-sh73a0",
+                                 "i2c3_1", "i2c3"),
+       /* LCD */
+       PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_lcdc_fb.0", "pfc-sh73a0",
+                                 "lcd_data24", "lcd"),
+       PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_lcdc_fb.0", "pfc-sh73a0",
+                                 "lcd_sync", "lcd"),
+       /* MMCIF */
+       PIN_MAP_MUX_GROUP_DEFAULT("sh_mmcif.0", "pfc-sh73a0",
+                                 "mmc0_data8_0", "mmc0"),
+       PIN_MAP_MUX_GROUP_DEFAULT("sh_mmcif.0", "pfc-sh73a0",
+                                 "mmc0_ctrl_0", "mmc0"),
+       PIN_MAP_CONFIGS_PIN_DEFAULT("sh_mmcif.0", "pfc-sh73a0",
+                                   "PORT279", pin_pullup_conf),
+       PIN_MAP_CONFIGS_GROUP_DEFAULT("sh_mmcif.0", "pfc-sh73a0",
+                                     "mmc0_data8_0", pin_pullup_conf),
+       /* SCIFA4 */
+       PIN_MAP_MUX_GROUP_DEFAULT("sh-sci.4", "pfc-sh73a0",
+                                 "scifa4_data", "scifa4"),
+       PIN_MAP_MUX_GROUP_DEFAULT("sh-sci.4", "pfc-sh73a0",
+                                 "scifa4_ctrl", "scifa4"),
+       /* SDHI0 */
+       PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.0", "pfc-sh73a0",
+                                 "sdhi0_data4", "sdhi0"),
+       PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.0", "pfc-sh73a0",
+                                 "sdhi0_ctrl", "sdhi0"),
+       PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.0", "pfc-sh73a0",
+                                 "sdhi0_cd", "sdhi0"),
+       PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.0", "pfc-sh73a0",
+                                 "sdhi0_wp", "sdhi0"),
+       /* SDHI2 */
+       PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.2", "pfc-sh73a0",
+                                 "sdhi2_data4", "sdhi2"),
+       PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.2", "pfc-sh73a0",
+                                 "sdhi2_ctrl", "sdhi2"),
+       /* SMSC */
+       PIN_MAP_MUX_GROUP_DEFAULT("smsc911x.0", "pfc-sh73a0",
+                                 "bsc_cs4", "bsc"),
+       /* USB */
+       PIN_MAP_MUX_GROUP_DEFAULT("renesas_usbhs", "pfc-sh73a0",
+                                 "usb_vbus", "usb"),
+};
+
 /*
  * FIXME
  *
@@ -660,100 +720,26 @@ static void __init kzm_init(void)
                                     ARRAY_SIZE(fixed2v8_power_consumers), 2800000);
        regulator_register_fixed(2, dummy_supplies, ARRAY_SIZE(dummy_supplies));
 
-       sh73a0_pinmux_init();
-
-       /* enable SCIFA4 */
-       gpio_request(GPIO_FN_SCIFA4_TXD, NULL);
-       gpio_request(GPIO_FN_SCIFA4_RXD, NULL);
-       gpio_request(GPIO_FN_SCIFA4_RTS_, NULL);
-       gpio_request(GPIO_FN_SCIFA4_CTS_, NULL);
+       pinctrl_register_mappings(kzm_pinctrl_map, ARRAY_SIZE(kzm_pinctrl_map));
 
-       /* CS4 for SMSC/USB */
-       gpio_request(GPIO_FN_CS4_, NULL); /* CS4 */
+       sh73a0_pinmux_init();
 
        /* SMSC */
-       gpio_request_one(GPIO_PORT224, GPIOF_IN, NULL); /* IRQ3 */
+       gpio_request_one(224, GPIOF_IN, NULL); /* IRQ3 */
 
        /* LCDC */
-       gpio_request(GPIO_FN_LCDD23,    NULL);
-       gpio_request(GPIO_FN_LCDD22,    NULL);
-       gpio_request(GPIO_FN_LCDD21,    NULL);
-       gpio_request(GPIO_FN_LCDD20,    NULL);
-       gpio_request(GPIO_FN_LCDD19,    NULL);
-       gpio_request(GPIO_FN_LCDD18,    NULL);
-       gpio_request(GPIO_FN_LCDD17,    NULL);
-       gpio_request(GPIO_FN_LCDD16,    NULL);
-       gpio_request(GPIO_FN_LCDD15,    NULL);
-       gpio_request(GPIO_FN_LCDD14,    NULL);
-       gpio_request(GPIO_FN_LCDD13,    NULL);
-       gpio_request(GPIO_FN_LCDD12,    NULL);
-       gpio_request(GPIO_FN_LCDD11,    NULL);
-       gpio_request(GPIO_FN_LCDD10,    NULL);
-       gpio_request(GPIO_FN_LCDD9,     NULL);
-       gpio_request(GPIO_FN_LCDD8,     NULL);
-       gpio_request(GPIO_FN_LCDD7,     NULL);
-       gpio_request(GPIO_FN_LCDD6,     NULL);
-       gpio_request(GPIO_FN_LCDD5,     NULL);
-       gpio_request(GPIO_FN_LCDD4,     NULL);
-       gpio_request(GPIO_FN_LCDD3,     NULL);
-       gpio_request(GPIO_FN_LCDD2,     NULL);
-       gpio_request(GPIO_FN_LCDD1,     NULL);
-       gpio_request(GPIO_FN_LCDD0,     NULL);
-       gpio_request(GPIO_FN_LCDDISP,   NULL);
-       gpio_request(GPIO_FN_LCDDCK,    NULL);
-
-       gpio_request_one(GPIO_PORT222, GPIOF_OUT_INIT_HIGH, NULL); /* LCDCDON */
-       gpio_request_one(GPIO_PORT226, GPIOF_OUT_INIT_HIGH, NULL); /* SC */
+       gpio_request_one(222, GPIOF_OUT_INIT_HIGH, NULL); /* LCDCDON */
+       gpio_request_one(226, GPIOF_OUT_INIT_HIGH, NULL); /* SC */
 
        /* Touchscreen */
-       gpio_request_one(GPIO_PORT223, GPIOF_IN, NULL); /* IRQ8 */
-
-       /* enable MMCIF */
-       gpio_request(GPIO_FN_MMCCLK0,           NULL);
-       gpio_request(GPIO_FN_MMCCMD0_PU,        NULL);
-       gpio_request(GPIO_FN_MMCD0_0_PU,        NULL);
-       gpio_request(GPIO_FN_MMCD0_1_PU,        NULL);
-       gpio_request(GPIO_FN_MMCD0_2_PU,        NULL);
-       gpio_request(GPIO_FN_MMCD0_3_PU,        NULL);
-       gpio_request(GPIO_FN_MMCD0_4_PU,        NULL);
-       gpio_request(GPIO_FN_MMCD0_5_PU,        NULL);
-       gpio_request(GPIO_FN_MMCD0_6_PU,        NULL);
-       gpio_request(GPIO_FN_MMCD0_7_PU,        NULL);
+       gpio_request_one(223, GPIOF_IN, NULL); /* IRQ8 */
 
        /* enable SD */
-       gpio_request(GPIO_FN_SDHIWP0,           NULL);
-       gpio_request(GPIO_FN_SDHICD0,           NULL);
-       gpio_request(GPIO_FN_SDHICMD0,          NULL);
-       gpio_request(GPIO_FN_SDHICLK0,          NULL);
-       gpio_request(GPIO_FN_SDHID0_3,          NULL);
-       gpio_request(GPIO_FN_SDHID0_2,          NULL);
-       gpio_request(GPIO_FN_SDHID0_1,          NULL);
-       gpio_request(GPIO_FN_SDHID0_0,          NULL);
        gpio_request(GPIO_FN_SDHI0_VCCQ_MC0_ON, NULL);
-       gpio_request_one(GPIO_PORT15, GPIOF_OUT_INIT_HIGH, NULL); /* power */
+       gpio_request_one(15, GPIOF_OUT_INIT_HIGH, NULL); /* power */
 
        /* enable Micro SD */
-       gpio_request(GPIO_FN_SDHID2_0,          NULL);
-       gpio_request(GPIO_FN_SDHID2_1,          NULL);
-       gpio_request(GPIO_FN_SDHID2_2,          NULL);
-       gpio_request(GPIO_FN_SDHID2_3,          NULL);
-       gpio_request(GPIO_FN_SDHICMD2,          NULL);
-       gpio_request(GPIO_FN_SDHICLK2,          NULL);
-       gpio_request_one(GPIO_PORT14, GPIOF_OUT_INIT_HIGH, NULL); /* power */
-
-       /* I2C 3 */
-       gpio_request(GPIO_FN_PORT27_I2C_SCL3, NULL);
-       gpio_request(GPIO_FN_PORT28_I2C_SDA3, NULL);
-
-       /* enable FSI2 port A (ak4648) */
-       gpio_request(GPIO_FN_FSIACK,    NULL);
-       gpio_request(GPIO_FN_FSIAILR,   NULL);
-       gpio_request(GPIO_FN_FSIAIBT,   NULL);
-       gpio_request(GPIO_FN_FSIAISLD,  NULL);
-       gpio_request(GPIO_FN_FSIAOSLD,  NULL);
-
-       /* enable USB */
-       gpio_request(GPIO_FN_VBUS_0,    NULL);
+       gpio_request_one(14, GPIOF_OUT_INIT_HIGH, NULL); /* power */
 
 #ifdef CONFIG_CACHE_L2X0
        /* Early BRESP enable, Shared attribute override enable, 64K*8way */
index db968a585ff0c6ab296e2416369769c7517a4796..336ccb4a0f2adb8ca3b58f27128bcbc0bc540279 100644 (file)
@@ -40,6 +40,7 @@
 #include <linux/mtd/partitions.h>
 #include <linux/mtd/physmap.h>
 #include <linux/mtd/sh_flctl.h>
+#include <linux/pinctrl/machine.h>
 #include <linux/pm_clock.h>
 #include <linux/regulator/fixed.h>
 #include <linux/regulator/machine.h>
@@ -363,7 +364,7 @@ static struct fb_videomode mackerel_lcdc_modes[] = {
 
 static int mackerel_set_brightness(int brightness)
 {
-       gpio_set_value(GPIO_PORT31, brightness);
+       gpio_set_value(31, brightness);
 
        return 0;
 }
@@ -819,22 +820,22 @@ static struct platform_device usbhs1_device = {
 static struct gpio_led mackerel_leds[] = {
        {
                .name           = "led0",
-               .gpio           = GPIO_PORT0,
+               .gpio           = 0,
                .default_state  = LEDS_GPIO_DEFSTATE_ON,
        },
        {
                .name           = "led1",
-               .gpio           = GPIO_PORT1,
+               .gpio           = 1,
                .default_state  = LEDS_GPIO_DEFSTATE_ON,
        },
        {
                .name           = "led2",
-               .gpio           = GPIO_PORT2,
+               .gpio           = 2,
                .default_state  = LEDS_GPIO_DEFSTATE_ON,
        },
        {
                .name           = "led3",
-               .gpio           = GPIO_PORT159,
+               .gpio           = 159,
                .default_state  = LEDS_GPIO_DEFSTATE_ON,
        }
 };
@@ -964,11 +965,11 @@ static struct platform_device nand_flash_device = {
 
 /*
  * The card detect pin of the top SD/MMC slot (CN7) is active low and is
- * connected to GPIO A22 of SH7372 (GPIO_PORT41).
+ * connected to GPIO A22 of SH7372 (GPIO 41).
  */
 static int slot_cn7_get_cd(struct platform_device *pdev)
 {
-       return !gpio_get_value(GPIO_PORT41);
+       return !gpio_get_value(41);
 }
 
 /* SDHI0 */
@@ -977,7 +978,7 @@ static struct sh_mobile_sdhi_info sdhi0_info = {
        .dma_slave_rx   = SHDMA_SLAVE_SDHI0_RX,
        .tmio_flags     = TMIO_MMC_USE_GPIO_CD,
        .tmio_caps      = MMC_CAP_SD_HIGHSPEED | MMC_CAP_SDIO_IRQ,
-       .cd_gpio        = GPIO_PORT172,
+       .cd_gpio        = 172,
 };
 
 static struct resource sdhi0_resources[] = {
@@ -1060,11 +1061,11 @@ static struct platform_device sdhi1_device = {
 
 /*
  * The card detect pin of the top SD/MMC slot (CN23) is active low and is
- * connected to GPIO SCIFB_SCK of SH7372 (GPIO_PORT162).
+ * connected to GPIO SCIFB_SCK of SH7372 (162).
  */
 static int slot_cn23_get_cd(struct platform_device *pdev)
 {
-       return !gpio_get_value(GPIO_PORT162);
+       return !gpio_get_value(162);
 }
 
 /* SDHI2 */
@@ -1328,6 +1329,33 @@ static struct i2c_board_info i2c1_devices[] = {
        },
 };
 
+static const struct pinctrl_map mackerel_pinctrl_map[] = {
+       /* MMCIF */
+       PIN_MAP_MUX_GROUP_DEFAULT("sh_mmcif.0", "pfc-sh7372",
+                                 "mmc0_data8_0", "mmc0"),
+       PIN_MAP_MUX_GROUP_DEFAULT("sh_mmcif.0", "pfc-sh7372",
+                                 "mmc0_ctrl_0", "mmc0"),
+       /* SDHI0 */
+       PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.0", "pfc-sh7372",
+                                 "sdhi0_data4", "sdhi0"),
+       PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.0", "pfc-sh7372",
+                                 "sdhi0_ctrl", "sdhi0"),
+       PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.0", "pfc-sh7372",
+                                 "sdhi0_wp", "sdhi0"),
+       /* SDHI1 */
+#if !defined(CONFIG_MMC_SH_MMCIF) && !defined(CONFIG_MMC_SH_MMCIF_MODULE)
+       PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.1", "pfc-sh7372",
+                                 "sdhi1_data4", "sdhi1"),
+       PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.1", "pfc-sh7372",
+                                 "sdhi1_ctrl", "sdhi1"),
+#endif
+       /* SDHI2 */
+       PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.2", "pfc-sh7372",
+                                 "sdhi2_data4", "sdhi2"),
+       PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.2", "pfc-sh7372",
+                                 "sdhi2_ctrl", "sdhi2"),
+};
+
 #define GPIO_PORT9CR   IOMEM(0xE6051009)
 #define GPIO_PORT10CR  IOMEM(0xE605100A)
 #define GPIO_PORT167CR IOMEM(0xE60520A7)
@@ -1364,6 +1392,8 @@ static void __init mackerel_init(void)
        /* External clock source */
        clk_set_rate(&sh7372_dv_clki_clk, 27000000);
 
+       pinctrl_register_mappings(mackerel_pinctrl_map,
+                                 ARRAY_SIZE(mackerel_pinctrl_map));
        sh7372_pinmux_init();
 
        /* enable SCIFA0 */
@@ -1403,9 +1433,9 @@ static void __init mackerel_init(void)
        gpio_request(GPIO_FN_LCDDCK,   NULL);
 
        /* backlight, off by default */
-       gpio_request_one(GPIO_PORT31, GPIOF_OUT_INIT_LOW, NULL);
+       gpio_request_one(31, GPIOF_OUT_INIT_LOW, NULL);
 
-       gpio_request_one(GPIO_PORT151, GPIOF_OUT_INIT_HIGH, NULL); /* LCDDON */
+       gpio_request_one(151, GPIOF_OUT_INIT_HIGH, NULL); /* LCDDON */
 
        /* USBHS0 */
        gpio_request(GPIO_FN_VBUS0_0, NULL);
@@ -1421,10 +1451,10 @@ static void __init mackerel_init(void)
        gpio_request(GPIO_FN_FSIAILR,   NULL);
        gpio_request(GPIO_FN_FSIAISLD,  NULL);
        gpio_request(GPIO_FN_FSIAOSLD,  NULL);
-       gpio_request_one(GPIO_PORT161, GPIOF_OUT_INIT_LOW, NULL); /* slave */
+       gpio_request_one(161, GPIOF_OUT_INIT_LOW, NULL); /* slave */
 
-       gpio_request(GPIO_PORT9,  NULL);
-       gpio_request(GPIO_PORT10, NULL);
+       gpio_request(9,  NULL);
+       gpio_request(10, NULL);
        gpio_direction_none(GPIO_PORT9CR);  /* FSIAOBT needs no direction */
        gpio_direction_none(GPIO_PORT10CR); /* FSIAOLR needs no direction */
 
@@ -1453,52 +1483,14 @@ static void __init mackerel_init(void)
        gpio_request(GPIO_FN_IRQ21,     NULL);
        irq_set_irq_type(IRQ21, IRQ_TYPE_LEVEL_HIGH);
 
-       /* enable SDHI0 */
-       gpio_request(GPIO_FN_SDHIWP0, NULL);
-       gpio_request(GPIO_FN_SDHICMD0, NULL);
-       gpio_request(GPIO_FN_SDHICLK0, NULL);
-       gpio_request(GPIO_FN_SDHID0_3, NULL);
-       gpio_request(GPIO_FN_SDHID0_2, NULL);
-       gpio_request(GPIO_FN_SDHID0_1, NULL);
-       gpio_request(GPIO_FN_SDHID0_0, NULL);
-
        /* SDHI0 PORT172 card-detect IRQ26 */
        gpio_request(GPIO_FN_IRQ26_172, NULL);
 
-#if !defined(CONFIG_MMC_SH_MMCIF) && !defined(CONFIG_MMC_SH_MMCIF_MODULE)
-       /* enable SDHI1 */
-       gpio_request(GPIO_FN_SDHICMD1, NULL);
-       gpio_request(GPIO_FN_SDHICLK1, NULL);
-       gpio_request(GPIO_FN_SDHID1_3, NULL);
-       gpio_request(GPIO_FN_SDHID1_2, NULL);
-       gpio_request(GPIO_FN_SDHID1_1, NULL);
-       gpio_request(GPIO_FN_SDHID1_0, NULL);
-#endif
        /* card detect pin for MMC slot (CN7) */
-       gpio_request_one(GPIO_PORT41, GPIOF_IN, NULL);
-
-       /* enable SDHI2 */
-       gpio_request(GPIO_FN_SDHICMD2, NULL);
-       gpio_request(GPIO_FN_SDHICLK2, NULL);
-       gpio_request(GPIO_FN_SDHID2_3, NULL);
-       gpio_request(GPIO_FN_SDHID2_2, NULL);
-       gpio_request(GPIO_FN_SDHID2_1, NULL);
-       gpio_request(GPIO_FN_SDHID2_0, NULL);
+       gpio_request_one(41, GPIOF_IN, NULL);
 
        /* card detect pin for microSD slot (CN23) */
-       gpio_request_one(GPIO_PORT162, GPIOF_IN, NULL);
-
-       /* MMCIF */
-       gpio_request(GPIO_FN_MMCD0_0, NULL);
-       gpio_request(GPIO_FN_MMCD0_1, NULL);
-       gpio_request(GPIO_FN_MMCD0_2, NULL);
-       gpio_request(GPIO_FN_MMCD0_3, NULL);
-       gpio_request(GPIO_FN_MMCD0_4, NULL);
-       gpio_request(GPIO_FN_MMCD0_5, NULL);
-       gpio_request(GPIO_FN_MMCD0_6, NULL);
-       gpio_request(GPIO_FN_MMCD0_7, NULL);
-       gpio_request(GPIO_FN_MMCCMD0, NULL);
-       gpio_request(GPIO_FN_MMCCLK0, NULL);
+       gpio_request_one(162, GPIOF_IN, NULL);
 
        /* FLCTL */
        gpio_request(GPIO_FN_D0_NAF0, NULL);
index fec49ebc359a56497b1aa7cf819177edd0293728..a88f7f3594c739e213b94331c6ca08888af97ecc 100644 (file)
@@ -25,8 +25,9 @@
 #include <linux/platform_device.h>
 #include <linux/delay.h>
 #include <linux/io.h>
-#include <linux/gpio.h>
+#include <linux/leds.h>
 #include <linux/dma-mapping.h>
+#include <linux/pinctrl/machine.h>
 #include <linux/regulator/fixed.h>
 #include <linux/regulator/machine.h>
 #include <linux/smsc911x.h>
@@ -168,12 +169,43 @@ static struct platform_device usb_phy_device = {
        .num_resources  = ARRAY_SIZE(usb_phy_resources),
 };
 
+/* LEDS */
+static struct gpio_led marzen_leds[] = {
+       {
+               .name           = "led2",
+               .gpio           = 157,
+               .default_state  = LEDS_GPIO_DEFSTATE_ON,
+       }, {
+               .name           = "led3",
+               .gpio           = 158,
+               .default_state  = LEDS_GPIO_DEFSTATE_ON,
+       }, {
+               .name           = "led4",
+               .gpio           = 159,
+               .default_state  = LEDS_GPIO_DEFSTATE_ON,
+       },
+};
+
+static struct gpio_led_platform_data marzen_leds_pdata = {
+       .leds           = marzen_leds,
+       .num_leds       = ARRAY_SIZE(marzen_leds),
+};
+
+static struct platform_device leds_device = {
+       .name   = "leds-gpio",
+       .id     = 0,
+       .dev    = {
+               .platform_data  = &marzen_leds_pdata,
+       },
+};
+
 static struct platform_device *marzen_devices[] __initdata = {
        &eth_device,
        &sdhi0_device,
        &thermal_device,
        &hspi_device,
        &usb_phy_device,
+       &leds_device,
 };
 
 /* USB */
@@ -327,6 +359,41 @@ void __init marzen_init_late(void)
                             ARRAY_SIZE(marzen_late_devices));
 }
 
+static const struct pinctrl_map marzen_pinctrl_map[] = {
+       /* HSPI0 */
+       PIN_MAP_MUX_GROUP_DEFAULT("sh-hspi.0", "pfc-r8a7779",
+                                 "hspi0", "hspi0"),
+       /* SCIF2 (CN18: DEBUG0) */
+       PIN_MAP_MUX_GROUP_DEFAULT("sh-sci.2", "pfc-r8a7779",
+                                 "scif2_data_c", "scif2"),
+       /* SCIF4 (CN19: DEBUG1) */
+       PIN_MAP_MUX_GROUP_DEFAULT("sh-sci.4", "pfc-r8a7779",
+                                 "scif4_data", "scif4"),
+       /* SDHI0 */
+       PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.0", "pfc-r8a7779",
+                                 "sdhi0_data4", "sdhi0"),
+       PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.0", "pfc-r8a7779",
+                                 "sdhi0_ctrl", "sdhi0"),
+       PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.0", "pfc-r8a7779",
+                                 "sdhi0_cd", "sdhi0"),
+       PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.0", "pfc-r8a7779",
+                                 "sdhi0_wp", "sdhi0"),
+       /* SMSC */
+       PIN_MAP_MUX_GROUP_DEFAULT("smsc911x", "pfc-r8a7779",
+                                 "intc_irq1_b", "intc"),
+       PIN_MAP_MUX_GROUP_DEFAULT("smsc911x", "pfc-r8a7779",
+                                 "lbsc_ex_cs0", "lbsc"),
+       /* USB0 */
+       PIN_MAP_MUX_GROUP_DEFAULT("ehci-platform.0", "pfc-r8a7779",
+                                 "usb0", "usb0"),
+       /* USB1 */
+       PIN_MAP_MUX_GROUP_DEFAULT("ehci-platform.0", "pfc-r8a7779",
+                                 "usb1", "usb1"),
+       /* USB2 */
+       PIN_MAP_MUX_GROUP_DEFAULT("ehci-platform.1", "pfc-r8a7779",
+                                 "usb2", "usb2"),
+};
+
 static void __init marzen_init(void)
 {
        regulator_register_always_on(0, "fixed-3.3V", fixed3v3_power_consumers,
@@ -334,44 +401,10 @@ static void __init marzen_init(void)
        regulator_register_fixed(1, dummy_supplies,
                                ARRAY_SIZE(dummy_supplies));
 
+       pinctrl_register_mappings(marzen_pinctrl_map,
+                                 ARRAY_SIZE(marzen_pinctrl_map));
        r8a7779_pinmux_init();
 
-       /* SCIF2 (CN18: DEBUG0) */
-       gpio_request(GPIO_FN_TX2_C, NULL);
-       gpio_request(GPIO_FN_RX2_C, NULL);
-
-       /* SCIF4 (CN19: DEBUG1) */
-       gpio_request(GPIO_FN_TX4, NULL);
-       gpio_request(GPIO_FN_RX4, NULL);
-
-       /* LAN89218 */
-       gpio_request(GPIO_FN_EX_CS0, NULL); /* nCS */
-       gpio_request(GPIO_FN_IRQ1_B, NULL); /* IRQ + PME */
-
-       /* SD0 (CN20) */
-       gpio_request(GPIO_FN_SD0_CLK, NULL);
-       gpio_request(GPIO_FN_SD0_CMD, NULL);
-       gpio_request(GPIO_FN_SD0_DAT0, NULL);
-       gpio_request(GPIO_FN_SD0_DAT1, NULL);
-       gpio_request(GPIO_FN_SD0_DAT2, NULL);
-       gpio_request(GPIO_FN_SD0_DAT3, NULL);
-       gpio_request(GPIO_FN_SD0_CD, NULL);
-       gpio_request(GPIO_FN_SD0_WP, NULL);
-
-       /* HSPI 0 */
-       gpio_request(GPIO_FN_HSPI_CLK0, NULL);
-       gpio_request(GPIO_FN_HSPI_CS0,  NULL);
-       gpio_request(GPIO_FN_HSPI_TX0,  NULL);
-       gpio_request(GPIO_FN_HSPI_RX0,  NULL);
-
-       /* USB (CN21) */
-       gpio_request(GPIO_FN_USB_OVC0, NULL);
-       gpio_request(GPIO_FN_USB_OVC1, NULL);
-       gpio_request(GPIO_FN_USB_OVC2, NULL);
-
-       /* USB (CN22) */
-       gpio_request(GPIO_FN_USB_PENC2, NULL);
-
        r8a7779_add_standard_devices();
        platform_add_devices(marzen_devices, ARRAY_SIZE(marzen_devices));
 }
diff --git a/arch/arm/mach-shmobile/clock-r8a73a4.c b/arch/arm/mach-shmobile/clock-r8a73a4.c
new file mode 100644 (file)
index 0000000..e710c00
--- /dev/null
@@ -0,0 +1,115 @@
+/*
+ * r8a73a4 clock framework support
+ *
+ * Copyright (C) 2013  Renesas Solutions Corp.
+ * Copyright (C) 2013  Magnus Damm
+ *
+ * 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 of the License.
+ *
+ * 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., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ */
+#include <linux/init.h>
+#include <linux/io.h>
+#include <linux/kernel.h>
+#include <linux/sh_clk.h>
+#include <linux/clkdev.h>
+#include <mach/common.h>
+
+#define CPG_BASE 0xe6150000
+#define CPG_LEN 0x270
+
+#define MPCKCR 0xe6150080
+#define SMSTPCR2 0xe6150138
+#define SMSTPCR5 0xe6150144
+
+static struct clk_mapping cpg_mapping = {
+       .phys   = CPG_BASE,
+       .len    = CPG_LEN,
+};
+
+static struct clk extalr_clk = {
+       .rate   = 32768,
+       .mapping        = &cpg_mapping,
+};
+
+static struct clk extal1_clk = {
+       .rate   = 26000000,
+       .mapping        = &cpg_mapping,
+};
+
+static struct clk extal2_clk = {
+       .rate   = 48000000,
+       .mapping        = &cpg_mapping,
+};
+
+static struct clk *main_clks[] = {
+       &extalr_clk,
+       &extal1_clk,
+       &extal2_clk,
+};
+
+enum {
+       MSTP217, MSTP216, MSTP207, MSTP206, MSTP204, MSTP203,
+       MSTP522,
+       MSTP_NR
+};
+
+static struct clk mstp_clks[MSTP_NR] = {
+       [MSTP204] = SH_CLK_MSTP32(&extal2_clk, SMSTPCR2, 4, 0), /* SCIFA0 */
+       [MSTP203] = SH_CLK_MSTP32(&extal2_clk, SMSTPCR2, 3, 0), /* SCIFA1 */
+       [MSTP206] = SH_CLK_MSTP32(&extal2_clk, SMSTPCR2, 6, 0), /* SCIFB0 */
+       [MSTP207] = SH_CLK_MSTP32(&extal2_clk, SMSTPCR2, 7, 0), /* SCIFB1 */
+       [MSTP216] = SH_CLK_MSTP32(&extal2_clk, SMSTPCR2, 16, 0), /* SCIFB2 */
+       [MSTP217] = SH_CLK_MSTP32(&extal2_clk, SMSTPCR2, 17, 0), /* SCIFB3 */
+       [MSTP522] = SH_CLK_MSTP32(&extal2_clk, SMSTPCR5, 22, 0), /* Thermal */
+};
+
+static struct clk_lookup lookups[] = {
+       CLKDEV_DEV_ID("sh-sci.0", &mstp_clks[MSTP204]),
+       CLKDEV_DEV_ID("sh-sci.1", &mstp_clks[MSTP203]),
+       CLKDEV_DEV_ID("sh-sci.2", &mstp_clks[MSTP206]),
+       CLKDEV_DEV_ID("sh-sci.3", &mstp_clks[MSTP207]),
+       CLKDEV_DEV_ID("sh-sci.4", &mstp_clks[MSTP216]),
+       CLKDEV_DEV_ID("sh-sci.5", &mstp_clks[MSTP217]),
+       CLKDEV_DEV_ID("rcar_thermal", &mstp_clks[MSTP522]),
+
+       /* for DT */
+       CLKDEV_DEV_ID("e61f0000.thermal", &mstp_clks[MSTP522]),
+};
+
+void __init r8a73a4_clock_init(void)
+{
+       void __iomem *cpg_base, *reg;
+       int k, ret = 0;
+
+       /* fix MPCLK to EXTAL2 for now.
+        * this is needed until more detailed clock topology is supported
+        */
+       cpg_base = ioremap_nocache(CPG_BASE, CPG_LEN);
+       BUG_ON(!cpg_base);
+       reg = cpg_base + (MPCKCR - CPG_BASE);
+       iowrite32(ioread32(reg) | 1 << 7 | 0x0c, reg); /* set CKSEL */
+       iounmap(cpg_base);
+
+       for (k = 0; !ret && (k < ARRAY_SIZE(main_clks)); k++)
+               ret = clk_register(main_clks[k]);
+
+       if (!ret)
+               ret = sh_clk_mstp_register(mstp_clks, MSTP_NR);
+
+       clkdev_add_table(lookups, ARRAY_SIZE(lookups));
+
+       if (!ret)
+               shmobile_clk_init();
+       else
+               panic("failed to setup r8a73a4 clocks\n");
+}
index 19ce885a3b4372af27579b3eeb68446c9b8cfcb7..c0d39aa6de5092f0137c0ee187a0376b4edcb00e 100644 (file)
@@ -22,6 +22,7 @@
 #include <linux/io.h>
 #include <linux/sh_clk.h>
 #include <linux/clkdev.h>
+#include <mach/clock.h>
 #include <mach/common.h>
 #include <mach/r8a7740.h>
 
@@ -97,42 +98,13 @@ static struct clk dv_clk = {
        .rate   = 27000000,
 };
 
-static unsigned long div_recalc(struct clk *clk)
-{
-       return clk->parent->rate / (int)(clk->priv);
-}
-
-static struct sh_clk_ops div_clk_ops = {
-       .recalc = div_recalc,
-};
-
-/* extal1 / 2 */
-static struct clk extal1_div2_clk = {
-       .ops    = &div_clk_ops,
-       .priv   = (void *)2,
-       .parent = &extal1_clk,
-};
-
-/* extal1 / 1024 */
-static struct clk extal1_div1024_clk = {
-       .ops    = &div_clk_ops,
-       .priv   = (void *)1024,
-       .parent = &extal1_clk,
-};
-
-/* extal1 / 2 / 1024 */
-static struct clk extal1_div2048_clk = {
-       .ops    = &div_clk_ops,
-       .priv   = (void *)1024,
-       .parent = &extal1_div2_clk,
-};
+SH_CLK_RATIO(div2,     1, 2);
+SH_CLK_RATIO(div1k,    1, 1024);
 
-/* extal2 / 2 */
-static struct clk extal2_div2_clk = {
-       .ops    = &div_clk_ops,
-       .priv   = (void *)2,
-       .parent = &extal2_clk,
-};
+SH_FIXED_RATIO_CLK(extal1_div2_clk,    extal1_clk,             div2);
+SH_FIXED_RATIO_CLK(extal1_div1024_clk, extal1_clk,             div1k);
+SH_FIXED_RATIO_CLK(extal1_div2048_clk, extal1_div2_clk,        div1k);
+SH_FIXED_RATIO_CLK(extal2_div2_clk,    extal2_clk,             div2);
 
 static struct sh_clk_ops followparent_clk_ops = {
        .recalc = followparent_recalc,
@@ -143,11 +115,7 @@ static struct clk system_clk = {
        .ops    = &followparent_clk_ops,
 };
 
-static struct clk system_div2_clk = {
-       .ops    = &div_clk_ops,
-       .priv   = (void *)2,
-       .parent = &system_clk,
-};
+SH_FIXED_RATIO_CLK(system_div2_clk, system_clk,        div2);
 
 /* r_clk */
 static struct clk r_clk = {
@@ -184,11 +152,7 @@ static struct clk pllc1_clk = {
 };
 
 /* PLLC1 / 2 */
-static struct clk pllc1_div2_clk = {
-       .ops            = &div_clk_ops,
-       .priv           = (void *)2,
-       .parent         = &pllc1_clk,
-};
+SH_FIXED_RATIO_CLK(pllc1_div2_clk, pllc1_clk, div2);
 
 /* USB clock */
 /*
@@ -323,6 +287,7 @@ struct clk *main_clks[] = {
        &fsibck_clk,
 };
 
+/* DIV4 clocks */
 static void div4_kick(struct clk *clk)
 {
        unsigned long value;
@@ -346,6 +311,26 @@ static struct clk_div4_table div4_table = {
        .kick = div4_kick,
 };
 
+enum {
+       DIV4_I, DIV4_ZG, DIV4_B, DIV4_M1, DIV4_HP,
+       DIV4_HPP, DIV4_USBP, DIV4_S, DIV4_ZB, DIV4_M3, DIV4_CP,
+       DIV4_NR
+};
+
+struct clk div4_clks[DIV4_NR] = {
+       [DIV4_I]        = SH_CLK_DIV4(&pllc1_clk, FRQCRA, 20, 0x6fff, CLK_ENABLE_ON_INIT),
+       [DIV4_ZG]       = SH_CLK_DIV4(&pllc1_clk, FRQCRA, 16, 0x6fff, CLK_ENABLE_ON_INIT),
+       [DIV4_B]        = SH_CLK_DIV4(&pllc1_clk, FRQCRA,  8, 0x6fff, CLK_ENABLE_ON_INIT),
+       [DIV4_M1]       = SH_CLK_DIV4(&pllc1_clk, FRQCRA,  4, 0x6fff, CLK_ENABLE_ON_INIT),
+       [DIV4_HP]       = SH_CLK_DIV4(&pllc1_clk, FRQCRB,  4, 0x6fff, 0),
+       [DIV4_HPP]      = SH_CLK_DIV4(&pllc1_clk, FRQCRC, 20, 0x6fff, 0),
+       [DIV4_USBP]     = SH_CLK_DIV4(&pllc1_clk, FRQCRC, 16, 0x6fff, 0),
+       [DIV4_S]        = SH_CLK_DIV4(&pllc1_clk, FRQCRC, 12, 0x6fff, 0),
+       [DIV4_ZB]       = SH_CLK_DIV4(&pllc1_clk, FRQCRC,  8, 0x6fff, 0),
+       [DIV4_M3]       = SH_CLK_DIV4(&pllc1_clk, FRQCRC,  4, 0x6fff, 0),
+       [DIV4_CP]       = SH_CLK_DIV4(&pllc1_clk, FRQCRC,  0, 0x6fff, 0),
+};
+
 /* DIV6 reparent */
 enum {
        DIV6_HDMI,
@@ -391,6 +376,16 @@ static struct clk div6_reparent_clks[DIV6_REPARENT_NR] = {
                                      fsib_parents, ARRAY_SIZE(fsib_parents), 6, 2),
 };
 
+/* DIV6 clocks */
+enum {
+       DIV6_SUB,
+       DIV6_NR
+};
+
+static struct clk div6_clks[DIV6_NR] = {
+       [DIV6_SUB]      = SH_CLK_DIV6(&pllc1_div2_clk, SUBCKCR, 0),
+};
+
 /* HDMI1/2 clock */
 static unsigned long hdmi12_recalc(struct clk *clk)
 {
@@ -455,35 +450,6 @@ static struct clk fsidivs[] = {
 };
 
 /* MSTP */
-enum {
-       DIV4_I, DIV4_ZG, DIV4_B, DIV4_M1, DIV4_HP,
-       DIV4_HPP, DIV4_USBP, DIV4_S, DIV4_ZB, DIV4_M3, DIV4_CP,
-       DIV4_NR
-};
-
-struct clk div4_clks[DIV4_NR] = {
-       [DIV4_I]        = SH_CLK_DIV4(&pllc1_clk, FRQCRA, 20, 0x6fff, CLK_ENABLE_ON_INIT),
-       [DIV4_ZG]       = SH_CLK_DIV4(&pllc1_clk, FRQCRA, 16, 0x6fff, CLK_ENABLE_ON_INIT),
-       [DIV4_B]        = SH_CLK_DIV4(&pllc1_clk, FRQCRA,  8, 0x6fff, CLK_ENABLE_ON_INIT),
-       [DIV4_M1]       = SH_CLK_DIV4(&pllc1_clk, FRQCRA,  4, 0x6fff, CLK_ENABLE_ON_INIT),
-       [DIV4_HP]       = SH_CLK_DIV4(&pllc1_clk, FRQCRB,  4, 0x6fff, 0),
-       [DIV4_HPP]      = SH_CLK_DIV4(&pllc1_clk, FRQCRC, 20, 0x6fff, 0),
-       [DIV4_USBP]     = SH_CLK_DIV4(&pllc1_clk, FRQCRC, 16, 0x6fff, 0),
-       [DIV4_S]        = SH_CLK_DIV4(&pllc1_clk, FRQCRC, 12, 0x6fff, 0),
-       [DIV4_ZB]       = SH_CLK_DIV4(&pllc1_clk, FRQCRC,  8, 0x6fff, 0),
-       [DIV4_M3]       = SH_CLK_DIV4(&pllc1_clk, FRQCRC,  4, 0x6fff, 0),
-       [DIV4_CP]       = SH_CLK_DIV4(&pllc1_clk, FRQCRC,  0, 0x6fff, 0),
-};
-
-enum {
-       DIV6_SUB,
-       DIV6_NR
-};
-
-static struct clk div6_clks[DIV6_NR] = {
-       [DIV6_SUB]      = SH_CLK_DIV6(&pllc1_div2_clk, SUBCKCR, 0),
-};
-
 enum {
        MSTP128, MSTP127, MSTP125,
        MSTP116, MSTP111, MSTP100, MSTP117,
@@ -593,29 +559,42 @@ static struct clk_lookup lookups[] = {
        CLKDEV_DEV_ID("sh_mobile_ceu.1",        &mstp_clks[MSTP128]),
 
        CLKDEV_DEV_ID("sh-sci.4",               &mstp_clks[MSTP200]),
+       CLKDEV_DEV_ID("e6c80000.sci",           &mstp_clks[MSTP200]),
        CLKDEV_DEV_ID("sh-sci.3",               &mstp_clks[MSTP201]),
+       CLKDEV_DEV_ID("e6c70000.sci",           &mstp_clks[MSTP201]),
        CLKDEV_DEV_ID("sh-sci.2",               &mstp_clks[MSTP202]),
+       CLKDEV_DEV_ID("e6c60000.sci",           &mstp_clks[MSTP202]),
        CLKDEV_DEV_ID("sh-sci.1",               &mstp_clks[MSTP203]),
+       CLKDEV_DEV_ID("e6c50000.sci",           &mstp_clks[MSTP203]),
        CLKDEV_DEV_ID("sh-sci.0",               &mstp_clks[MSTP204]),
+       CLKDEV_DEV_ID("e6c40000.sci",           &mstp_clks[MSTP204]),
        CLKDEV_DEV_ID("sh-sci.8",               &mstp_clks[MSTP206]),
+       CLKDEV_DEV_ID("e6c30000.sci",           &mstp_clks[MSTP206]),
        CLKDEV_DEV_ID("sh-sci.5",               &mstp_clks[MSTP207]),
+       CLKDEV_DEV_ID("e6cb0000.sci",           &mstp_clks[MSTP207]),
        CLKDEV_DEV_ID("sh-dma-engine.3",        &mstp_clks[MSTP214]),
        CLKDEV_DEV_ID("sh-dma-engine.2",        &mstp_clks[MSTP216]),
        CLKDEV_DEV_ID("sh-dma-engine.1",        &mstp_clks[MSTP217]),
        CLKDEV_DEV_ID("sh-dma-engine.0",        &mstp_clks[MSTP218]),
        CLKDEV_DEV_ID("sh-sci.7",               &mstp_clks[MSTP222]),
+       CLKDEV_DEV_ID("e6cd0000.sci",           &mstp_clks[MSTP222]),
        CLKDEV_DEV_ID("sh-sci.6",               &mstp_clks[MSTP230]),
+       CLKDEV_DEV_ID("e6cc0000.sci",           &mstp_clks[MSTP230]),
 
        CLKDEV_DEV_ID("sh_cmt.10",              &mstp_clks[MSTP329]),
        CLKDEV_DEV_ID("sh_fsi2",                &mstp_clks[MSTP328]),
        CLKDEV_DEV_ID("i2c-sh_mobile.1",        &mstp_clks[MSTP323]),
        CLKDEV_DEV_ID("renesas_usbhs",          &mstp_clks[MSTP320]),
        CLKDEV_DEV_ID("sh_mobile_sdhi.0",       &mstp_clks[MSTP314]),
+       CLKDEV_DEV_ID("e6850000.sdhi",          &mstp_clks[MSTP314]),
        CLKDEV_DEV_ID("sh_mobile_sdhi.1",       &mstp_clks[MSTP313]),
+       CLKDEV_DEV_ID("e6860000.sdhi",          &mstp_clks[MSTP313]),
        CLKDEV_DEV_ID("sh_mmcif",               &mstp_clks[MSTP312]),
+       CLKDEV_DEV_ID("e6bd0000.mmcif",         &mstp_clks[MSTP312]),
        CLKDEV_DEV_ID("sh-eth",                 &mstp_clks[MSTP309]),
 
        CLKDEV_DEV_ID("sh_mobile_sdhi.2",       &mstp_clks[MSTP415]),
+       CLKDEV_DEV_ID("e6870000.sdhi",          &mstp_clks[MSTP415]),
 
        /* ICK */
        CLKDEV_ICK_ID("host",   "renesas_usbhs",        &mstp_clks[MSTP416]),
diff --git a/arch/arm/mach-shmobile/clock-r8a7778.c b/arch/arm/mach-shmobile/clock-r8a7778.c
new file mode 100644 (file)
index 0000000..cd68552
--- /dev/null
@@ -0,0 +1,107 @@
+/*
+ * r8a7778 clock framework support
+ *
+ * Copyright (C) 2013  Renesas Solutions Corp.
+ * Copyright (C) 2013  Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
+ *
+ * based on r8a7779
+ *
+ * Copyright (C) 2011  Renesas Solutions Corp.
+ * Copyright (C) 2011  Magnus Damm
+ *
+ * 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
+ *
+ * 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/io.h>
+#include <linux/sh_clk.h>
+#include <linux/clkdev.h>
+#include <mach/common.h>
+
+#define MSTPCR0                IOMEM(0xffc80030)
+#define MSTPCR1                IOMEM(0xffc80034)
+#define MSTPCR3                IOMEM(0xffc8003c)
+#define MSTPSR1                IOMEM(0xffc80044)
+#define MSTPSR4                IOMEM(0xffc80048)
+#define MSTPSR6                IOMEM(0xffc8004c)
+#define MSTPCR4                IOMEM(0xffc80050)
+#define MSTPCR5                IOMEM(0xffc80054)
+#define MSTPCR6                IOMEM(0xffc80058)
+
+/* ioremap() through clock mapping mandatory to avoid
+ * collision with ARM coherent DMA virtual memory range.
+ */
+
+static struct clk_mapping cpg_mapping = {
+       .phys   = 0xffc80000,
+       .len    = 0x80,
+};
+
+static struct clk clkp = {
+       .rate   = 62500000, /* FIXME: shortcut */
+       .flags  = CLK_ENABLE_ON_INIT,
+       .mapping = &cpg_mapping,
+};
+
+static struct clk *main_clks[] = {
+       &clkp,
+};
+
+enum {
+       MSTP114,
+       MSTP026, MSTP025, MSTP024, MSTP023, MSTP022, MSTP021,
+       MSTP016, MSTP015,
+       MSTP_NR };
+
+static struct clk mstp_clks[MSTP_NR] = {
+       [MSTP114] = SH_CLK_MSTP32(&clkp, MSTPCR1, 14, 0), /* Ether */
+       [MSTP026] = SH_CLK_MSTP32(&clkp, MSTPCR0, 26, 0), /* SCIF0 */
+       [MSTP025] = SH_CLK_MSTP32(&clkp, MSTPCR0, 25, 0), /* SCIF1 */
+       [MSTP024] = SH_CLK_MSTP32(&clkp, MSTPCR0, 24, 0), /* SCIF2 */
+       [MSTP023] = SH_CLK_MSTP32(&clkp, MSTPCR0, 23, 0), /* SCIF3 */
+       [MSTP022] = SH_CLK_MSTP32(&clkp, MSTPCR0, 22, 0), /* SCIF4 */
+       [MSTP021] = SH_CLK_MSTP32(&clkp, MSTPCR0, 21, 0), /* SCIF5 */
+       [MSTP016] = SH_CLK_MSTP32(&clkp, MSTPCR0, 16, 0), /* TMU0 */
+       [MSTP015] = SH_CLK_MSTP32(&clkp, MSTPCR0, 15, 0), /* TMU1 */
+};
+
+static struct clk_lookup lookups[] = {
+       /* MSTP32 clocks */
+       CLKDEV_DEV_ID("sh-eth", &mstp_clks[MSTP114]), /* Ether */
+       CLKDEV_DEV_ID("sh-sci.0", &mstp_clks[MSTP026]), /* SCIF0 */
+       CLKDEV_DEV_ID("sh-sci.1", &mstp_clks[MSTP025]), /* SCIF1 */
+       CLKDEV_DEV_ID("sh-sci.2", &mstp_clks[MSTP024]), /* SCIF2 */
+       CLKDEV_DEV_ID("sh-sci.3", &mstp_clks[MSTP023]), /* SCIF3 */
+       CLKDEV_DEV_ID("sh-sci.4", &mstp_clks[MSTP022]), /* SCIF4 */
+       CLKDEV_DEV_ID("sh-sci.5", &mstp_clks[MSTP021]), /* SCIF6 */
+       CLKDEV_DEV_ID("sh_tmu.0", &mstp_clks[MSTP016]), /* TMU00 */
+       CLKDEV_DEV_ID("sh_tmu.1", &mstp_clks[MSTP015]), /* TMU01 */
+};
+
+void __init r8a7778_clock_init(void)
+{
+       int k, ret = 0;
+
+       for (k = 0; !ret && (k < ARRAY_SIZE(main_clks)); k++)
+               ret = clk_register(main_clks[k]);
+
+       if (!ret)
+               ret = sh_clk_mstp_register(mstp_clks, MSTP_NR);
+
+       clkdev_add_table(lookups, ARRAY_SIZE(lookups));
+
+       if (!ret)
+               shmobile_clk_init();
+       else
+               panic("failed to setup r8a7778 clocks\n");
+}
index 1db36537255c250a834e373e5a56e3de7f23dc70..31d5cd4d97879f7d9243c9310eb0ea1dd8c7f047 100644 (file)
  * 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/bitops.h>
 #include <linux/init.h>
 #include <linux/kernel.h>
 #include <linux/io.h>
 #include <linux/sh_clk.h>
 #include <linux/clkdev.h>
+#include <mach/clock.h>
 #include <mach/common.h>
 
+/*
+ *             MD1 = 1                 MD1 = 0
+ *             (PLLA = 1500)           (PLLA = 1600)
+ *             (MHz)                   (MHz)
+ *------------------------------------------------+--------------------
+ * clkz                1000   (2/3)            800   (1/2)
+ * clkzs        250   (1/6)            200   (1/8)
+ * clki                 750   (1/2)            800   (1/2)
+ * clks                 250   (1/6)            200   (1/8)
+ * clks1        125   (1/12)           100   (1/16)
+ * clks3        187.5 (1/8)            200   (1/8)
+ * clks4         93.7 (1/16)           100   (1/16)
+ * clkp                  62.5 (1/24)            50   (1/32)
+ * clkg                  62.5 (1/24)            66.6 (1/24)
+ * clkb, CLKOUT
+ * (MD2 = 0)     62.5 (1/24)            66.6 (1/24)
+ * (MD2 = 1)     41.6 (1/36)            50   (1/32)
+*/
+
+#define MD(nr) BIT(nr)
+
 #define FRQMR          IOMEM(0xffc80014)
 #define MSTPCR0                IOMEM(0xffc80030)
 #define MSTPCR1                IOMEM(0xffc80034)
@@ -36,6 +59,9 @@
 #define MSTPCR6                IOMEM(0xffc80058)
 #define MSTPCR7                IOMEM(0xffc80040)
 
+#define MODEMR         0xffcc0020
+
+
 /* ioremap() through clock mapping mandatory to avoid
  * collision with ARM coherent DMA virtual memory range.
  */
@@ -50,44 +76,44 @@ static struct clk_mapping cpg_mapping = {
  * from the platform code.
  */
 static struct clk plla_clk = {
-       .rate           = 1500000000,
+       /* .rate will be updated on r8a7779_clock_init() */
        .mapping        = &cpg_mapping,
 };
 
+/*
+ * clock ratio of these clock will be updated
+ * on r8a7779_clock_init()
+ */
+SH_FIXED_RATIO_CLK_SET(clkz_clk,       plla_clk, 1, 1);
+SH_FIXED_RATIO_CLK_SET(clkzs_clk,      plla_clk, 1, 1);
+SH_FIXED_RATIO_CLK_SET(clki_clk,       plla_clk, 1, 1);
+SH_FIXED_RATIO_CLK_SET(clks_clk,       plla_clk, 1, 1);
+SH_FIXED_RATIO_CLK_SET(clks1_clk,      plla_clk, 1, 1);
+SH_FIXED_RATIO_CLK_SET(clks3_clk,      plla_clk, 1, 1);
+SH_FIXED_RATIO_CLK_SET(clks4_clk,      plla_clk, 1, 1);
+SH_FIXED_RATIO_CLK_SET(clkb_clk,       plla_clk, 1, 1);
+SH_FIXED_RATIO_CLK_SET(clkout_clk,     plla_clk, 1, 1);
+SH_FIXED_RATIO_CLK_SET(clkp_clk,       plla_clk, 1, 1);
+SH_FIXED_RATIO_CLK_SET(clkg_clk,       plla_clk, 1, 1);
+
 static struct clk *main_clks[] = {
        &plla_clk,
-};
-
-static int divisors[] = { 0, 0, 0, 6, 8, 12, 16, 0, 24, 32, 36, 0, 0, 0, 0, 0 };
-
-static struct clk_div_mult_table div4_div_mult_table = {
-       .divisors = divisors,
-       .nr_divisors = ARRAY_SIZE(divisors),
-};
-
-static struct clk_div4_table div4_table = {
-       .div_mult_table = &div4_div_mult_table,
-};
-
-enum { DIV4_S, DIV4_OUT, DIV4_S4, DIV4_S3, DIV4_S1, DIV4_P, DIV4_NR };
-
-static struct clk div4_clks[DIV4_NR] = {
-       [DIV4_S]        = SH_CLK_DIV4(&plla_clk, FRQMR, 20,
-                                     0x0018, CLK_ENABLE_ON_INIT),
-       [DIV4_OUT]      = SH_CLK_DIV4(&plla_clk, FRQMR, 16,
-                                     0x0700, CLK_ENABLE_ON_INIT),
-       [DIV4_S4]       = SH_CLK_DIV4(&plla_clk, FRQMR, 12,
-                                     0x0040, CLK_ENABLE_ON_INIT),
-       [DIV4_S3]       = SH_CLK_DIV4(&plla_clk, FRQMR, 8,
-                                     0x0010, CLK_ENABLE_ON_INIT),
-       [DIV4_S1]       = SH_CLK_DIV4(&plla_clk, FRQMR, 4,
-                                     0x0060, CLK_ENABLE_ON_INIT),
-       [DIV4_P]        = SH_CLK_DIV4(&plla_clk, FRQMR, 0,
-                                     0x0300, CLK_ENABLE_ON_INIT),
+       &clkz_clk,
+       &clkzs_clk,
+       &clki_clk,
+       &clks_clk,
+       &clks1_clk,
+       &clks3_clk,
+       &clks4_clk,
+       &clkb_clk,
+       &clkout_clk,
+       &clkp_clk,
+       &clkg_clk,
 };
 
 enum { MSTP323, MSTP322, MSTP321, MSTP320,
-       MSTP101, MSTP100,
+       MSTP115, MSTP114,
+       MSTP103, MSTP101, MSTP100,
        MSTP030,
        MSTP029, MSTP028, MSTP027, MSTP026, MSTP025, MSTP024, MSTP023, MSTP022, MSTP021,
        MSTP016, MSTP015, MSTP014,
@@ -95,50 +121,29 @@ enum { MSTP323, MSTP322, MSTP321, MSTP320,
        MSTP_NR };
 
 static struct clk mstp_clks[MSTP_NR] = {
-       [MSTP323] = SH_CLK_MSTP32(&div4_clks[DIV4_P], MSTPCR3, 23, 0), /* SDHI0 */
-       [MSTP322] = SH_CLK_MSTP32(&div4_clks[DIV4_P], MSTPCR3, 22, 0), /* SDHI1 */
-       [MSTP321] = SH_CLK_MSTP32(&div4_clks[DIV4_P], MSTPCR3, 21, 0), /* SDHI2 */
-       [MSTP320] = SH_CLK_MSTP32(&div4_clks[DIV4_P], MSTPCR3, 20, 0), /* SDHI3 */
-       [MSTP101] = SH_CLK_MSTP32(&div4_clks[DIV4_P], MSTPCR1,  1, 0), /* USB2 */
-       [MSTP100] = SH_CLK_MSTP32(&div4_clks[DIV4_P], MSTPCR1,  0, 0), /* USB0/1 */
-       [MSTP030] = SH_CLK_MSTP32(&div4_clks[DIV4_P], MSTPCR0, 30, 0), /* I2C0 */
-       [MSTP029] = SH_CLK_MSTP32(&div4_clks[DIV4_P], MSTPCR0, 29, 0), /* I2C1 */
-       [MSTP028] = SH_CLK_MSTP32(&div4_clks[DIV4_P], MSTPCR0, 28, 0), /* I2C2 */
-       [MSTP027] = SH_CLK_MSTP32(&div4_clks[DIV4_P], MSTPCR0, 27, 0), /* I2C3 */
-       [MSTP026] = SH_CLK_MSTP32(&div4_clks[DIV4_P], MSTPCR0, 26, 0), /* SCIF0 */
-       [MSTP025] = SH_CLK_MSTP32(&div4_clks[DIV4_P], MSTPCR0, 25, 0), /* SCIF1 */
-       [MSTP024] = SH_CLK_MSTP32(&div4_clks[DIV4_P], MSTPCR0, 24, 0), /* SCIF2 */
-       [MSTP023] = SH_CLK_MSTP32(&div4_clks[DIV4_P], MSTPCR0, 23, 0), /* SCIF3 */
-       [MSTP022] = SH_CLK_MSTP32(&div4_clks[DIV4_P], MSTPCR0, 22, 0), /* SCIF4 */
-       [MSTP021] = SH_CLK_MSTP32(&div4_clks[DIV4_P], MSTPCR0, 21, 0), /* SCIF5 */
-       [MSTP016] = SH_CLK_MSTP32(&div4_clks[DIV4_P], MSTPCR0, 16, 0), /* TMU0 */
-       [MSTP015] = SH_CLK_MSTP32(&div4_clks[DIV4_P], MSTPCR0, 15, 0), /* TMU1 */
-       [MSTP014] = SH_CLK_MSTP32(&div4_clks[DIV4_P], MSTPCR0, 14, 0), /* TMU2 */
-       [MSTP007] = SH_CLK_MSTP32(&div4_clks[DIV4_S], MSTPCR0,  7, 0), /* HSPI */
-};
-
-static unsigned long mul4_recalc(struct clk *clk)
-{
-       return clk->parent->rate * 4;
-}
-
-static struct sh_clk_ops mul4_clk_ops = {
-       .recalc         = mul4_recalc,
-};
-
-struct clk clkz_clk = {
-       .ops            = &mul4_clk_ops,
-       .parent         = &div4_clks[DIV4_S],
-};
-
-struct clk clkzs_clk = {
-       /* clks x 4 / 4 = clks */
-       .parent         = &div4_clks[DIV4_S],
-};
-
-static struct clk *late_main_clks[] = {
-       &clkz_clk,
-       &clkzs_clk,
+       [MSTP323] = SH_CLK_MSTP32(&clkp_clk, MSTPCR3, 23, 0), /* SDHI0 */
+       [MSTP322] = SH_CLK_MSTP32(&clkp_clk, MSTPCR3, 22, 0), /* SDHI1 */
+       [MSTP321] = SH_CLK_MSTP32(&clkp_clk, MSTPCR3, 21, 0), /* SDHI2 */
+       [MSTP320] = SH_CLK_MSTP32(&clkp_clk, MSTPCR3, 20, 0), /* SDHI3 */
+       [MSTP115] = SH_CLK_MSTP32(&clkp_clk, MSTPCR1, 15, 0), /* SATA */
+       [MSTP114] = SH_CLK_MSTP32(&clkp_clk, MSTPCR1, 14, 0), /* Ether */
+       [MSTP103] = SH_CLK_MSTP32(&clks_clk, MSTPCR1,  3, 0), /* DU */
+       [MSTP101] = SH_CLK_MSTP32(&clkp_clk, MSTPCR1,  1, 0), /* USB2 */
+       [MSTP100] = SH_CLK_MSTP32(&clkp_clk, MSTPCR1,  0, 0), /* USB0/1 */
+       [MSTP030] = SH_CLK_MSTP32(&clkp_clk, MSTPCR0, 30, 0), /* I2C0 */
+       [MSTP029] = SH_CLK_MSTP32(&clkp_clk, MSTPCR0, 29, 0), /* I2C1 */
+       [MSTP028] = SH_CLK_MSTP32(&clkp_clk, MSTPCR0, 28, 0), /* I2C2 */
+       [MSTP027] = SH_CLK_MSTP32(&clkp_clk, MSTPCR0, 27, 0), /* I2C3 */
+       [MSTP026] = SH_CLK_MSTP32(&clkp_clk, MSTPCR0, 26, 0), /* SCIF0 */
+       [MSTP025] = SH_CLK_MSTP32(&clkp_clk, MSTPCR0, 25, 0), /* SCIF1 */
+       [MSTP024] = SH_CLK_MSTP32(&clkp_clk, MSTPCR0, 24, 0), /* SCIF2 */
+       [MSTP023] = SH_CLK_MSTP32(&clkp_clk, MSTPCR0, 23, 0), /* SCIF3 */
+       [MSTP022] = SH_CLK_MSTP32(&clkp_clk, MSTPCR0, 22, 0), /* SCIF4 */
+       [MSTP021] = SH_CLK_MSTP32(&clkp_clk, MSTPCR0, 21, 0), /* SCIF5 */
+       [MSTP016] = SH_CLK_MSTP32(&clkp_clk, MSTPCR0, 16, 0), /* TMU0 */
+       [MSTP015] = SH_CLK_MSTP32(&clkp_clk, MSTPCR0, 15, 0), /* TMU1 */
+       [MSTP014] = SH_CLK_MSTP32(&clkp_clk, MSTPCR0, 14, 0), /* TMU2 */
+       [MSTP007] = SH_CLK_MSTP32(&clks_clk, MSTPCR0,  7, 0), /* HSPI */
 };
 
 static struct clk_lookup lookups[] = {
@@ -148,14 +153,17 @@ static struct clk_lookup lookups[] = {
        CLKDEV_CON_ID("clkzs_clk", &clkzs_clk),
 
        /* DIV4 clocks */
-       CLKDEV_CON_ID("shyway_clk",     &div4_clks[DIV4_S]),
-       CLKDEV_CON_ID("bus_clk",        &div4_clks[DIV4_OUT]),
-       CLKDEV_CON_ID("shyway4_clk",    &div4_clks[DIV4_S4]),
-       CLKDEV_CON_ID("shyway3_clk",    &div4_clks[DIV4_S3]),
-       CLKDEV_CON_ID("shyway1_clk",    &div4_clks[DIV4_S1]),
-       CLKDEV_CON_ID("peripheral_clk", &div4_clks[DIV4_P]),
+       CLKDEV_CON_ID("shyway_clk",     &clks_clk),
+       CLKDEV_CON_ID("bus_clk",        &clkout_clk),
+       CLKDEV_CON_ID("shyway4_clk",    &clks4_clk),
+       CLKDEV_CON_ID("shyway3_clk",    &clks3_clk),
+       CLKDEV_CON_ID("shyway1_clk",    &clks1_clk),
+       CLKDEV_CON_ID("peripheral_clk", &clkp_clk),
 
        /* MSTP32 clocks */
+       CLKDEV_DEV_ID("sata_rcar", &mstp_clks[MSTP115]), /* SATA */
+       CLKDEV_DEV_ID("fc600000.sata", &mstp_clks[MSTP115]), /* SATA w/DT */
+       CLKDEV_DEV_ID("sh-eth", &mstp_clks[MSTP114]), /* Ether */
        CLKDEV_DEV_ID("ehci-platform.1", &mstp_clks[MSTP101]), /* USB EHCI port2 */
        CLKDEV_DEV_ID("ohci-platform.1", &mstp_clks[MSTP101]), /* USB OHCI port2 */
        CLKDEV_DEV_ID("ehci-platform.0", &mstp_clks[MSTP100]), /* USB EHCI port0/1 */
@@ -180,24 +188,65 @@ static struct clk_lookup lookups[] = {
        CLKDEV_DEV_ID("sh_mobile_sdhi.1", &mstp_clks[MSTP322]), /* SDHI1 */
        CLKDEV_DEV_ID("sh_mobile_sdhi.2", &mstp_clks[MSTP321]), /* SDHI2 */
        CLKDEV_DEV_ID("sh_mobile_sdhi.3", &mstp_clks[MSTP320]), /* SDHI3 */
+       CLKDEV_DEV_ID("rcar-du.0", &mstp_clks[MSTP103]), /* DU */
 };
 
 void __init r8a7779_clock_init(void)
 {
+       void __iomem *modemr = ioremap_nocache(MODEMR, PAGE_SIZE);
+       u32 mode;
        int k, ret = 0;
 
+       BUG_ON(!modemr);
+       mode = ioread32(modemr);
+       iounmap(modemr);
+
+       if (mode & MD(1)) {
+               plla_clk.rate = 1500000000;
+
+               SH_CLK_SET_RATIO(&clkz_clk_ratio,       2, 3);
+               SH_CLK_SET_RATIO(&clkzs_clk_ratio,      1, 6);
+               SH_CLK_SET_RATIO(&clki_clk_ratio,       1, 2);
+               SH_CLK_SET_RATIO(&clks_clk_ratio,       1, 6);
+               SH_CLK_SET_RATIO(&clks1_clk_ratio,      1, 12);
+               SH_CLK_SET_RATIO(&clks3_clk_ratio,      1, 8);
+               SH_CLK_SET_RATIO(&clks4_clk_ratio,      1, 16);
+               SH_CLK_SET_RATIO(&clkp_clk_ratio,       1, 24);
+               SH_CLK_SET_RATIO(&clkg_clk_ratio,       1, 24);
+               if (mode & MD(2)) {
+                       SH_CLK_SET_RATIO(&clkb_clk_ratio,       1, 36);
+                       SH_CLK_SET_RATIO(&clkout_clk_ratio,     1, 36);
+               } else {
+                       SH_CLK_SET_RATIO(&clkb_clk_ratio,       1, 24);
+                       SH_CLK_SET_RATIO(&clkout_clk_ratio,     1, 24);
+               }
+       } else {
+               plla_clk.rate = 1600000000;
+
+               SH_CLK_SET_RATIO(&clkz_clk_ratio,       1, 2);
+               SH_CLK_SET_RATIO(&clkzs_clk_ratio,      1, 8);
+               SH_CLK_SET_RATIO(&clki_clk_ratio,       1, 2);
+               SH_CLK_SET_RATIO(&clks_clk_ratio,       1, 8);
+               SH_CLK_SET_RATIO(&clks1_clk_ratio,      1, 16);
+               SH_CLK_SET_RATIO(&clks3_clk_ratio,      1, 8);
+               SH_CLK_SET_RATIO(&clks4_clk_ratio,      1, 16);
+               SH_CLK_SET_RATIO(&clkp_clk_ratio,       1, 32);
+               SH_CLK_SET_RATIO(&clkg_clk_ratio,       1, 24);
+               if (mode & MD(2)) {
+                       SH_CLK_SET_RATIO(&clkb_clk_ratio,       1, 32);
+                       SH_CLK_SET_RATIO(&clkout_clk_ratio,     1, 32);
+               } else {
+                       SH_CLK_SET_RATIO(&clkb_clk_ratio,       1, 24);
+                       SH_CLK_SET_RATIO(&clkout_clk_ratio,     1, 24);
+               }
+       }
+
        for (k = 0; !ret && (k < ARRAY_SIZE(main_clks)); k++)
                ret = clk_register(main_clks[k]);
 
-       if (!ret)
-               ret = sh_clk_div4_register(div4_clks, DIV4_NR, &div4_table);
-
        if (!ret)
                ret = sh_clk_mstp_register(mstp_clks, MSTP_NR);
 
-       for (k = 0; !ret && (k < ARRAY_SIZE(late_main_clks)); k++)
-               ret = clk_register(late_main_clks[k]);
-
        clkdev_add_table(lookups, ARRAY_SIZE(lookups));
 
        if (!ret)
diff --git a/arch/arm/mach-shmobile/clock-r8a7790.c b/arch/arm/mach-shmobile/clock-r8a7790.c
new file mode 100644 (file)
index 0000000..bad9bf2
--- /dev/null
@@ -0,0 +1,93 @@
+/*
+ * r8a7790 clock framework support
+ *
+ * Copyright (C) 2013  Renesas Solutions Corp.
+ * Copyright (C) 2013  Magnus Damm
+ *
+ * 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 of the License.
+ *
+ * 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., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ */
+#include <linux/init.h>
+#include <linux/io.h>
+#include <linux/kernel.h>
+#include <linux/sh_clk.h>
+#include <linux/clkdev.h>
+#include <mach/common.h>
+
+#define CPG_BASE 0xe6150000
+#define CPG_LEN 0x1000
+
+#define SMSTPCR2 0xe6150138
+#define SMSTPCR7 0xe615014c
+
+static struct clk_mapping cpg_mapping = {
+       .phys   = CPG_BASE,
+       .len    = CPG_LEN,
+};
+
+static struct clk p_clk = {
+       .rate   = 65000000, /* shortcut for now */
+       .mapping        = &cpg_mapping,
+};
+
+static struct clk mp_clk = {
+       .rate   = 52000000,  /* shortcut for now */
+       .mapping        = &cpg_mapping,
+};
+
+static struct clk *main_clks[] = {
+       &p_clk,
+       &mp_clk,
+};
+
+enum { MSTP721, MSTP720,
+       MSTP216, MSTP207, MSTP206, MSTP204, MSTP203, MSTP202, MSTP_NR };
+static struct clk mstp_clks[MSTP_NR] = {
+       [MSTP721] = SH_CLK_MSTP32(&p_clk, SMSTPCR7, 21, 0), /* SCIF0 */
+       [MSTP720] = SH_CLK_MSTP32(&p_clk, SMSTPCR7, 20, 0), /* SCIF1 */
+       [MSTP216] = SH_CLK_MSTP32(&mp_clk, SMSTPCR2, 16, 0), /* SCIFB2 */
+       [MSTP207] = SH_CLK_MSTP32(&mp_clk, SMSTPCR2, 7, 0), /* SCIFB1 */
+       [MSTP206] = SH_CLK_MSTP32(&mp_clk, SMSTPCR2, 6, 0), /* SCIFB0 */
+       [MSTP204] = SH_CLK_MSTP32(&mp_clk, SMSTPCR2, 4, 0), /* SCIFA0 */
+       [MSTP203] = SH_CLK_MSTP32(&mp_clk, SMSTPCR2, 3, 0), /* SCIFA1 */
+       [MSTP202] = SH_CLK_MSTP32(&mp_clk, SMSTPCR2, 2, 0), /* SCIFA2 */
+};
+
+static struct clk_lookup lookups[] = {
+       CLKDEV_DEV_ID("sh-sci.0", &mstp_clks[MSTP204]),
+       CLKDEV_DEV_ID("sh-sci.1", &mstp_clks[MSTP203]),
+       CLKDEV_DEV_ID("sh-sci.2", &mstp_clks[MSTP206]),
+       CLKDEV_DEV_ID("sh-sci.3", &mstp_clks[MSTP207]),
+       CLKDEV_DEV_ID("sh-sci.4", &mstp_clks[MSTP216]),
+       CLKDEV_DEV_ID("sh-sci.5", &mstp_clks[MSTP202]),
+       CLKDEV_DEV_ID("sh-sci.6", &mstp_clks[MSTP721]),
+       CLKDEV_DEV_ID("sh-sci.7", &mstp_clks[MSTP720]),
+};
+
+void __init r8a7790_clock_init(void)
+{
+       int k, ret = 0;
+
+       for (k = 0; !ret && (k < ARRAY_SIZE(main_clks)); k++)
+               ret = clk_register(main_clks[k]);
+
+       if (!ret)
+               ret = sh_clk_mstp_register(mstp_clks, MSTP_NR);
+
+       clkdev_add_table(lookups, ARRAY_SIZE(lookups));
+
+       if (!ret)
+               shmobile_clk_init();
+       else
+               panic("failed to setup r8a7790 clocks\n");
+}
index 45d21fe317f4706f9f0f1c75645522917f415fe5..7e105932c09d709f53a734f8633dcfde2b6a6efe 100644 (file)
@@ -21,6 +21,7 @@
 #include <linux/io.h>
 #include <linux/sh_clk.h>
 #include <linux/clkdev.h>
+#include <mach/clock.h>
 #include <mach/common.h>
 
 /* SH7372 registers */
@@ -83,39 +84,12 @@ struct clk sh7372_extal2_clk = {
        .rate           = 48000000,
 };
 
-/* A fixed divide-by-2 block */
-static unsigned long div2_recalc(struct clk *clk)
-{
-       return clk->parent->rate / 2;
-}
-
-static struct sh_clk_ops div2_clk_ops = {
-       .recalc         = div2_recalc,
-};
+SH_CLK_RATIO(div2, 1, 2);
 
-/* Divide dv_clki by two */
-struct clk sh7372_dv_clki_div2_clk = {
-       .ops            = &div2_clk_ops,
-       .parent         = &sh7372_dv_clki_clk,
-};
-
-/* Divide extal1 by two */
-static struct clk extal1_div2_clk = {
-       .ops            = &div2_clk_ops,
-       .parent         = &sh7372_extal1_clk,
-};
-
-/* Divide extal2 by two */
-static struct clk extal2_div2_clk = {
-       .ops            = &div2_clk_ops,
-       .parent         = &sh7372_extal2_clk,
-};
-
-/* Divide extal2 by four */
-static struct clk extal2_div4_clk = {
-       .ops            = &div2_clk_ops,
-       .parent         = &extal2_div2_clk,
-};
+SH_FIXED_RATIO_CLKg(sh7372_dv_clki_div2_clk,   sh7372_dv_clki_clk,     div2);
+SH_FIXED_RATIO_CLK(extal1_div2_clk,            sh7372_extal1_clk,      div2);
+SH_FIXED_RATIO_CLK(extal2_div2_clk,            sh7372_extal2_clk,      div2);
+SH_FIXED_RATIO_CLK(extal2_div4_clk,            extal2_div2_clk,        div2);
 
 /* PLLC0 and PLLC1 */
 static unsigned long pllc01_recalc(struct clk *clk)
@@ -147,10 +121,7 @@ static struct clk pllc1_clk = {
 };
 
 /* Divide PLLC1 by two */
-static struct clk pllc1_div2_clk = {
-       .ops            = &div2_clk_ops,
-       .parent         = &pllc1_clk,
-};
+SH_FIXED_RATIO_CLK(pllc1_div2_clk,     pllc1_clk,      div2);
 
 /* PLLC2 */
 
@@ -342,7 +313,7 @@ static struct clk_div4_table div4_table = {
 };
 
 enum { DIV4_I, DIV4_ZG, DIV4_B, DIV4_M1, DIV4_CSIR,
-       DIV4_ZTR, DIV4_ZT, DIV4_ZX, DIV4_HP,
+       DIV4_ZX, DIV4_HP,
        DIV4_ISPB, DIV4_S, DIV4_ZB, DIV4_ZB3, DIV4_CP,
        DIV4_DDRP, DIV4_NR };
 
@@ -355,8 +326,6 @@ static struct clk div4_clks[DIV4_NR] = {
        [DIV4_B] = DIV4(FRQCRA, 8, 0x6fff, CLK_ENABLE_ON_INIT),
        [DIV4_M1] = DIV4(FRQCRA, 4, 0x6fff, CLK_ENABLE_ON_INIT),
        [DIV4_CSIR] = DIV4(FRQCRA, 0, 0x6fff, 0),
-       [DIV4_ZTR] = DIV4(FRQCRB, 20, 0x6fff, 0),
-       [DIV4_ZT] = DIV4(FRQCRB, 16, 0x6fff, 0),
        [DIV4_ZX] = DIV4(FRQCRB, 12, 0x6fff, 0),
        [DIV4_HP] = DIV4(FRQCRB, 4, 0x6fff, 0),
        [DIV4_ISPB] = DIV4(FRQCRC, 20, 0x6fff, 0),
@@ -516,8 +485,6 @@ static struct clk_lookup lookups[] = {
        CLKDEV_CON_ID("b_clk", &div4_clks[DIV4_B]),
        CLKDEV_CON_ID("m1_clk", &div4_clks[DIV4_M1]),
        CLKDEV_CON_ID("csir_clk", &div4_clks[DIV4_CSIR]),
-       CLKDEV_CON_ID("ztr_clk", &div4_clks[DIV4_ZTR]),
-       CLKDEV_CON_ID("zt_clk", &div4_clks[DIV4_ZT]),
        CLKDEV_CON_ID("zx_clk", &div4_clks[DIV4_ZX]),
        CLKDEV_CON_ID("hp_clk", &div4_clks[DIV4_HP]),
        CLKDEV_CON_ID("ispb_clk", &div4_clks[DIV4_ISPB]),
@@ -654,5 +621,4 @@ void __init sh7372_clock_init(void)
                shmobile_clk_init();
        else
                panic("failed to setup sh7372 clocks\n");
-
 }
index afa5423a0f93871351669830a07dddbaf808b616..784fbaa4cc55e6bbe826df552e876737ce6dd7c4 100644 (file)
@@ -21,6 +21,8 @@
 #include <linux/io.h>
 #include <linux/sh_clk.h>
 #include <linux/clkdev.h>
+#include <asm/processor.h>
+#include <mach/clock.h>
 #include <mach/common.h>
 
 #define FRQCRA         IOMEM(0xe6150000)
@@ -82,61 +84,16 @@ struct clk sh73a0_extal2_clk = {
        .rate           = 48000000,
 };
 
-/* A fixed divide-by-2 block */
-static unsigned long div2_recalc(struct clk *clk)
-{
-       return clk->parent->rate / 2;
-}
-
-static struct sh_clk_ops div2_clk_ops = {
-       .recalc         = div2_recalc,
-};
-
-static unsigned long div7_recalc(struct clk *clk)
-{
-       return clk->parent->rate / 7;
-}
-
-static struct sh_clk_ops div7_clk_ops = {
-       .recalc         = div7_recalc,
-};
-
-static unsigned long div13_recalc(struct clk *clk)
-{
-       return clk->parent->rate / 13;
-}
-
-static struct sh_clk_ops div13_clk_ops = {
-       .recalc         = div13_recalc,
-};
-
-/* Divide extal1 by two */
-static struct clk extal1_div2_clk = {
-       .ops            = &div2_clk_ops,
-       .parent         = &sh73a0_extal1_clk,
-};
-
-/* Divide extal2 by two */
-static struct clk extal2_div2_clk = {
-       .ops            = &div2_clk_ops,
-       .parent         = &sh73a0_extal2_clk,
-};
-
 static struct sh_clk_ops main_clk_ops = {
        .recalc         = followparent_recalc,
 };
 
 /* Main clock */
 static struct clk main_clk = {
+       /* .parent wll be set on sh73a0_clock_init() */
        .ops            = &main_clk_ops,
 };
 
-/* Divide Main clock by two */
-static struct clk main_div2_clk = {
-       .ops            = &div2_clk_ops,
-       .parent         = &main_clk,
-};
-
 /* PLL0, PLL1, PLL2, PLL3 */
 static unsigned long pll_recalc(struct clk *clk)
 {
@@ -192,21 +149,17 @@ static struct clk pll3_clk = {
        .enable_bit     = 3,
 };
 
-/* Divide PLL */
-static struct clk pll1_div2_clk = {
-       .ops            = &div2_clk_ops,
-       .parent         = &pll1_clk,
-};
-
-static struct clk pll1_div7_clk = {
-       .ops            = &div7_clk_ops,
-       .parent         = &pll1_clk,
-};
+/* A fixed divide block */
+SH_CLK_RATIO(div2,  1, 2);
+SH_CLK_RATIO(div7,  1, 7);
+SH_CLK_RATIO(div13, 1, 13);
 
-static struct clk pll1_div13_clk = {
-       .ops            = &div13_clk_ops,
-       .parent         = &pll1_clk,
-};
+SH_FIXED_RATIO_CLK(extal1_div2_clk,    sh73a0_extal1_clk,      div2);
+SH_FIXED_RATIO_CLK(extal2_div2_clk,    sh73a0_extal2_clk,      div2);
+SH_FIXED_RATIO_CLK(main_div2_clk,      main_clk,               div2);
+SH_FIXED_RATIO_CLK(pll1_div2_clk,      pll1_clk,               div2);
+SH_FIXED_RATIO_CLK(pll1_div7_clk,      pll1_clk,               div7);
+SH_FIXED_RATIO_CLK(pll1_div13_clk,     pll1_clk,               div13);
 
 /* External input clock */
 struct clk sh73a0_extcki_clk = {
@@ -234,14 +187,24 @@ static struct clk *main_clks[] = {
        &sh73a0_extalr_clk,
 };
 
-static void div4_kick(struct clk *clk)
+static int frqcr_kick(void)
 {
-       unsigned long value;
+       int i;
+
+       /* set KICK bit in FRQCRB to update hardware setting, check success */
+       __raw_writel(__raw_readl(FRQCRB) | (1 << 31), FRQCRB);
+       for (i = 1000; i; i--)
+               if (__raw_readl(FRQCRB) & (1 << 31))
+                       cpu_relax();
+               else
+                       return i;
 
-       /* set KICK bit in FRQCRB to update hardware setting */
-       value = __raw_readl(FRQCRB);
-       value |= (1 << 31);
-       __raw_writel(value, FRQCRB);
+       return -ETIMEDOUT;
+}
+
+static void div4_kick(struct clk *clk)
+{
+       frqcr_kick();
 }
 
 static int divisors[] = { 2, 3, 4, 6, 8, 12, 16, 18,
@@ -258,25 +221,37 @@ static struct clk_div4_table div4_table = {
 };
 
 enum { DIV4_I, DIV4_ZG, DIV4_M3, DIV4_B, DIV4_M1, DIV4_M2,
-       DIV4_Z, DIV4_ZTR, DIV4_ZT, DIV4_ZX, DIV4_HP, DIV4_NR };
+       DIV4_Z, DIV4_ZX, DIV4_HP, DIV4_NR };
 
 #define DIV4(_reg, _bit, _mask, _flags) \
        SH_CLK_DIV4(&pll1_clk, _reg, _bit, _mask, _flags)
 
 static struct clk div4_clks[DIV4_NR] = {
        [DIV4_I] = DIV4(FRQCRA, 20, 0xdff, CLK_ENABLE_ON_INIT),
-       [DIV4_ZG] = DIV4(FRQCRA, 16, 0xd7f, CLK_ENABLE_ON_INIT),
+       [DIV4_ZG] = SH_CLK_DIV4(&pll0_clk, FRQCRA, 16, 0xd7f, CLK_ENABLE_ON_INIT),
        [DIV4_M3] = DIV4(FRQCRA, 12, 0x1dff, CLK_ENABLE_ON_INIT),
        [DIV4_B] = DIV4(FRQCRA, 8, 0xdff, CLK_ENABLE_ON_INIT),
        [DIV4_M1] = DIV4(FRQCRA, 4, 0x1dff, 0),
        [DIV4_M2] = DIV4(FRQCRA, 0, 0x1dff, 0),
-       [DIV4_Z] = DIV4(FRQCRB, 24, 0x97f, 0),
-       [DIV4_ZTR] = DIV4(FRQCRB, 20, 0xdff, 0),
-       [DIV4_ZT] = DIV4(FRQCRB, 16, 0xdff, 0),
+       [DIV4_Z] = SH_CLK_DIV4(&pll0_clk, FRQCRB, 24, 0x97f, 0),
        [DIV4_ZX] = DIV4(FRQCRB, 12, 0xdff, 0),
        [DIV4_HP] = DIV4(FRQCRB, 4, 0xdff, 0),
 };
 
+static unsigned long twd_recalc(struct clk *clk)
+{
+       return clk_get_rate(clk->parent) / 4;
+}
+
+static struct sh_clk_ops twd_clk_ops = {
+       .recalc = twd_recalc,
+};
+
+static struct clk twd_clk = {
+       .parent = &div4_clks[DIV4_Z],
+       .ops = &twd_clk_ops,
+};
+
 enum { DIV6_VCK1, DIV6_VCK2, DIV6_VCK3, DIV6_ZB1,
        DIV6_FLCTL, DIV6_SDHI0, DIV6_SDHI1, DIV6_SDHI2,
        DIV6_FSIA, DIV6_FSIB, DIV6_SUB,
@@ -471,6 +446,7 @@ static struct clk dsi1phy_clk = {
 static struct clk *late_main_clks[] = {
        &dsi0phy_clk,
        &dsi1phy_clk,
+       &twd_clk,
 };
 
 enum { MSTP001,
@@ -535,6 +511,7 @@ static struct clk mstp_clks[MSTP_NR] = {
 static struct clk_lookup lookups[] = {
        /* main clocks */
        CLKDEV_CON_ID("r_clk", &r_clk),
+       CLKDEV_DEV_ID("smp_twd", &twd_clk), /* smp_twd */
 
        /* DIV6 clocks */
        CLKDEV_CON_ID("vck1_clk", &div6_clks[DIV6_VCK1]),
@@ -581,10 +558,13 @@ static struct clk_lookup lookups[] = {
        CLKDEV_DEV_ID("e6822000.i2c", &mstp_clks[MSTP323]), /* I2C1 */
        CLKDEV_DEV_ID("renesas_usbhs", &mstp_clks[MSTP322]), /* USB */
        CLKDEV_DEV_ID("sh_mobile_sdhi.0", &mstp_clks[MSTP314]), /* SDHI0 */
+       CLKDEV_DEV_ID("ee100000.sdhi", &mstp_clks[MSTP314]), /* SDHI0 */
        CLKDEV_DEV_ID("sh_mobile_sdhi.1", &mstp_clks[MSTP313]), /* SDHI1 */
+       CLKDEV_DEV_ID("ee120000.sdhi", &mstp_clks[MSTP313]), /* SDHI1 */
        CLKDEV_DEV_ID("sh_mmcif.0", &mstp_clks[MSTP312]), /* MMCIF0 */
        CLKDEV_DEV_ID("e6bd0000.mmcif", &mstp_clks[MSTP312]), /* MMCIF0 */
        CLKDEV_DEV_ID("sh_mobile_sdhi.2", &mstp_clks[MSTP311]), /* SDHI2 */
+       CLKDEV_DEV_ID("ee140000.sdhi", &mstp_clks[MSTP311]), /* SDHI2 */
        CLKDEV_DEV_ID("leds-renesas-tpu.12", &mstp_clks[MSTP303]), /* TPU1 */
        CLKDEV_DEV_ID("leds-renesas-tpu.21", &mstp_clks[MSTP302]), /* TPU2 */
        CLKDEV_DEV_ID("leds-renesas-tpu.30", &mstp_clks[MSTP301]), /* TPU3 */
index e816ca9bd2131949e8847d82ba6028ceb147282c..ad7df629d995413d7e73338e9a984dbf5870c7e8 100644 (file)
 #include <linux/init.h>
 #include <linux/sh_clk.h>
 #include <linux/export.h>
+#include <mach/clock.h>
+#include <mach/common.h>
+
+unsigned long shmobile_fixed_ratio_clk_recalc(struct clk *clk)
+{
+       struct clk_ratio *p = clk->priv;
+
+       return clk->parent->rate / p->div * p->mul;
+};
+
+struct sh_clk_ops shmobile_fixed_ratio_clk_ops = {
+       .recalc = shmobile_fixed_ratio_clk_recalc,
+};
 
 int __init shmobile_clk_init(void)
 {
similarity index 85%
rename from arch/arm/mach-shmobile/headsmp-sh73a0.S
rename to arch/arm/mach-shmobile/headsmp-scu.S
index bec4c0d9b713979593e75c7c4c60ed9770fb3e7f..7d113f898e7f62b57440348d6ce201d5c2441643 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * SMP support for SoC sh73a0
+ * Shared SCU setup for mach-shmobile
  *
  * Copyright (C) 2012 Bastian Hecht
  *
  * the physical address as the MMU is still turned off.
  */
        .align  12
-ENTRY(sh73a0_secondary_vector)
+ENTRY(shmobile_secondary_vector_scu)
        mrc     p15, 0, r0, c0, c0, 5   @ read MIPDR
        and     r0, r0, #3              @ mask out cpu ID
        lsl     r0, r0, #3              @ we will shift by cpu_id * 8 bits
-       mov     r1, #0xf0000000         @ SCU base address
+       ldr     r1, 2f
+       ldr     r1, [r1]                @ SCU base address
        ldr     r2, [r1, #8]            @ SCU Power Status Register
        mov     r3, #3
        bic     r2, r2, r3, lsl r0      @ Clear bits of our CPU (Run Mode)
@@ -47,4 +48,10 @@ ENTRY(sh73a0_secondary_vector)
 
        ldr     pc, 1f
 1:     .long shmobile_invalidate_start - PAGE_OFFSET + PLAT_PHYS_OFFSET
-ENDPROC(sh73a0_secondary_vector)
+2:     .long shmobile_scu_base - PAGE_OFFSET + PLAT_PHYS_OFFSET
+ENDPROC(shmobile_secondary_vector_scu)
+
+       .text
+       .globl  shmobile_scu_base
+shmobile_scu_base:
+       .space  4
diff --git a/arch/arm/mach-shmobile/hotplug.c b/arch/arm/mach-shmobile/hotplug.c
deleted file mode 100644 (file)
index a1524e3..0000000
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * SMP support for R-Mobile / SH-Mobile
- *
- * Copyright (C) 2010  Magnus Damm
- *
- * Based on realview, Copyright (C) 2002 ARM Ltd, 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 as
- * published by the Free Software Foundation.
- */
-#include <linux/kernel.h>
-#include <linux/errno.h>
-#include <linux/smp.h>
-#include <linux/cpumask.h>
-#include <linux/delay.h>
-#include <linux/of.h>
-#include <mach/common.h>
-#include <mach/r8a7779.h>
-#include <mach/emev2.h>
-#include <asm/cacheflush.h>
-#include <asm/mach-types.h>
-
-static cpumask_t dead_cpus;
-
-void shmobile_cpu_die(unsigned int cpu)
-{
-       /* hardware shutdown code running on the CPU that is being offlined */
-       flush_cache_all();
-       dsb();
-
-       /* notify platform_cpu_kill() that hardware shutdown is finished */
-       cpumask_set_cpu(cpu, &dead_cpus);
-
-       /* wait for SoC code in platform_cpu_kill() to shut off CPU core
-        * power. CPU bring up starts from the reset vector.
-        */
-       while (1) {
-               /*
-                * here's the WFI
-                */
-               asm(".word      0xe320f003\n"
-                   :
-                   :
-                   : "memory", "cc");
-       }
-}
-
-int shmobile_cpu_disable(unsigned int cpu)
-{
-       cpumask_clear_cpu(cpu, &dead_cpus);
-       /*
-        * we don't allow CPU 0 to be shutdown (it is still too special
-        * e.g. clock tick interrupts)
-        */
-       return cpu == 0 ? -EPERM : 0;
-}
-
-int shmobile_cpu_disable_any(unsigned int cpu)
-{
-       cpumask_clear_cpu(cpu, &dead_cpus);
-       return 0;
-}
-
-int shmobile_cpu_is_dead(unsigned int cpu)
-{
-       return cpumask_test_cpu(cpu, &dead_cpus);
-}
diff --git a/arch/arm/mach-shmobile/include/mach/clock.h b/arch/arm/mach-shmobile/include/mach/clock.h
new file mode 100644 (file)
index 0000000..76ac612
--- /dev/null
@@ -0,0 +1,39 @@
+#ifndef CLOCK_H
+#define CLOCK_H
+
+unsigned long shmobile_fixed_ratio_clk_recalc(struct clk *clk);
+extern struct sh_clk_ops shmobile_fixed_ratio_clk_ops;
+
+/* clock ratio */
+struct clk_ratio {
+       int mul;
+       int div;
+};
+
+#define SH_CLK_RATIO(name, m, d)               \
+static struct clk_ratio name ##_ratio = {      \
+       .mul = m,                               \
+       .div = d,                               \
+}
+
+#define SH_FIXED_RATIO_CLKg(name, p, r)        \
+struct clk name = {                    \
+       .parent = &p,                           \
+       .ops    = &shmobile_fixed_ratio_clk_ops,\
+       .priv   = &r ## _ratio,                 \
+}
+
+#define SH_FIXED_RATIO_CLK(name, p, r)         \
+static SH_FIXED_RATIO_CLKg(name, p, r);
+
+#define SH_FIXED_RATIO_CLK_SET(name, p, m, d)  \
+       SH_CLK_RATIO(name, m, d);               \
+       SH_FIXED_RATIO_CLK(name, p, name);
+
+#define SH_CLK_SET_RATIO(p, m, d)      \
+{                      \
+       (p)->mul = m;   \
+       (p)->div = d;   \
+}
+
+#endif
index e48606d8a2be31214168c0616ae6bc9d81ddc458..e002cfd9d2df208803e3328b94f9b0eeb46a43b5 100644 (file)
@@ -8,6 +8,7 @@ extern void shmobile_setup_delay(unsigned int max_cpu_core_mhz,
 struct twd_local_timer;
 extern void shmobile_setup_console(void);
 extern void shmobile_secondary_vector(void);
+extern void shmobile_secondary_vector_scu(void);
 struct clk;
 extern int shmobile_clk_init(void);
 extern void shmobile_handle_irq_intc(struct pt_regs *);
@@ -18,58 +19,6 @@ extern int shmobile_enter_wfi(struct cpuidle_device *dev,
                              struct cpuidle_driver *drv, int index);
 extern void shmobile_cpuidle_set_driver(struct cpuidle_driver *drv);
 
-extern void sh7372_init_irq(void);
-extern void sh7372_map_io(void);
-extern void sh7372_earlytimer_init(void);
-extern void sh7372_add_early_devices(void);
-extern void sh7372_add_standard_devices(void);
-extern void sh7372_add_early_devices_dt(void);
-extern void sh7372_add_standard_devices_dt(void);
-extern void sh7372_clock_init(void);
-extern void sh7372_pinmux_init(void);
-extern void sh7372_pm_init(void);
-extern void sh7372_resume_core_standby_sysc(void);
-extern int sh7372_do_idle_sysc(unsigned long sleep_mode);
-extern struct clk sh7372_extal1_clk;
-extern struct clk sh7372_extal2_clk;
-
-extern void sh73a0_init_irq(void);
-extern void sh73a0_init_irq_dt(void);
-extern void sh73a0_map_io(void);
-extern void sh73a0_earlytimer_init(void);
-extern void sh73a0_add_early_devices(void);
-extern void sh73a0_add_early_devices_dt(void);
-extern void sh73a0_add_standard_devices(void);
-extern void sh73a0_add_standard_devices_dt(void);
-extern void sh73a0_clock_init(void);
-extern void sh73a0_pinmux_init(void);
-extern void sh73a0_pm_init(void);
-extern void sh73a0_secondary_vector(void);
-extern struct clk sh73a0_extal1_clk;
-extern struct clk sh73a0_extal2_clk;
-extern struct clk sh73a0_extcki_clk;
-extern struct clk sh73a0_extalr_clk;
-
-extern void r8a7740_init_irq(void);
-extern void r8a7740_map_io(void);
-extern void r8a7740_add_early_devices(void);
-extern void r8a7740_add_standard_devices(void);
-extern void r8a7740_clock_init(u8 md_ck);
-extern void r8a7740_pinmux_init(void);
-extern void r8a7740_pm_init(void);
-
-extern void r8a7779_init_irq(void);
-extern void r8a7779_map_io(void);
-extern void r8a7779_earlytimer_init(void);
-extern void r8a7779_add_early_devices(void);
-extern void r8a7779_add_standard_devices(void);
-extern void r8a7779_clock_init(void);
-extern void r8a7779_pinmux_init(void);
-extern void r8a7779_pm_init(void);
-extern void r8a7740_meram_workaround(void);
-
-extern void r8a7779_register_twd(void);
-
 #ifdef CONFIG_SUSPEND
 int shmobile_suspend_init(void);
 #else
@@ -82,16 +31,7 @@ int shmobile_cpuidle_init(void);
 static inline int shmobile_cpuidle_init(void) { return 0; }
 #endif
 
-extern void shmobile_cpu_die(unsigned int cpu);
-extern int shmobile_cpu_disable(unsigned int cpu);
-extern int shmobile_cpu_disable_any(unsigned int cpu);
-
-#ifdef CONFIG_HOTPLUG_CPU
-extern int shmobile_cpu_is_dead(unsigned int cpu);
-#else
-static inline int shmobile_cpu_is_dead(unsigned int cpu) { return 1; }
-#endif
-
+extern void __iomem *shmobile_scu_base;
 extern void shmobile_smp_init_cpus(unsigned int ncores);
 
 static inline void __init shmobile_init_late(void)
index 06a5da3c305090e0176373d2576f6de68feb2922..b2074e2acb15f2641f5b92fc65fad9ff619c54cb 100644 (file)
@@ -5,10 +5,15 @@
 
 /* GIC */
 #define gic_spi(nr)            ((nr) + 32)
+#define gic_iid(nr)            (nr) /* ICCIAR / interrupt ID */
 
 /* INTCS */
 #define INTCS_VECT_BASE                0x3400
 #define INTCS_VECT(n, vect)    INTC_VECT((n), INTCS_VECT_BASE + (vect))
 #define intcs_evt2irq(evt)     evt2irq(INTCS_VECT_BASE + (evt))
 
+/* External IRQ pins */
+#define IRQPIN_BASE            2000
+#define irq_pin(nr)            ((nr) + IRQPIN_BASE)
+
 #endif /* __ASM_MACH_IRQS_H */
diff --git a/arch/arm/mach-shmobile/include/mach/r8a73a4.h b/arch/arm/mach-shmobile/include/mach/r8a73a4.h
new file mode 100644 (file)
index 0000000..f043103
--- /dev/null
@@ -0,0 +1,8 @@
+#ifndef __ASM_R8A73A4_H__
+#define __ASM_R8A73A4_H__
+
+void r8a73a4_add_standard_devices(void);
+void r8a73a4_clock_init(void);
+void r8a73a4_pinmux_init(void);
+
+#endif /* __ASM_R8A73A4_H__ */
index 59d252f4cf975b3ecd64ffde955f8e6f387f7651..abdc4d4efa28938bdb3b37ab494787e4ba22e540 100644 (file)
@@ -241,48 +241,9 @@ enum {
 
        /* LCD0 */
        GPIO_FN_LCDC0_SELECT,
-       GPIO_FN_LCD0_D0,        GPIO_FN_LCD0_D1,        GPIO_FN_LCD0_D2,
-       GPIO_FN_LCD0_D3,        GPIO_FN_LCD0_D4,        GPIO_FN_LCD0_D5,
-       GPIO_FN_LCD0_D6,        GPIO_FN_LCD0_D7,        GPIO_FN_LCD0_D8,
-       GPIO_FN_LCD0_D9,        GPIO_FN_LCD0_D10,       GPIO_FN_LCD0_D11,
-       GPIO_FN_LCD0_D12,       GPIO_FN_LCD0_D13,       GPIO_FN_LCD0_D14,
-       GPIO_FN_LCD0_D15,       GPIO_FN_LCD0_D16,       GPIO_FN_LCD0_D17,
-       GPIO_FN_LCD0_DON,       GPIO_FN_LCD0_VCPWC,     GPIO_FN_LCD0_VEPWC,
-
-       GPIO_FN_LCD0_DCK,       GPIO_FN_LCD0_VSYN, /* for RGB */
-       GPIO_FN_LCD0_HSYN,      GPIO_FN_LCD0_DISP, /* for RGB */
-
-       GPIO_FN_LCD0_WR,        GPIO_FN_LCD0_RD, /* for SYS */
-       GPIO_FN_LCD0_CS,        GPIO_FN_LCD0_RS, /* for SYS */
-
-       GPIO_FN_LCD0_D18_PORT163,       GPIO_FN_LCD0_D19_PORT162,
-       GPIO_FN_LCD0_D20_PORT161,       GPIO_FN_LCD0_D21_PORT158,
-       GPIO_FN_LCD0_D22_PORT160,       GPIO_FN_LCD0_D23_PORT159,
-       GPIO_FN_LCD0_LCLK_PORT165,       /* MSEL5CR_6_1 */
-
-       GPIO_FN_LCD0_D18_PORT40,        GPIO_FN_LCD0_D19_PORT4,
-       GPIO_FN_LCD0_D20_PORT3,         GPIO_FN_LCD0_D21_PORT2,
-       GPIO_FN_LCD0_D22_PORT0,         GPIO_FN_LCD0_D23_PORT1,
-       GPIO_FN_LCD0_LCLK_PORT102,      /* MSEL5CR_6_0 */
 
        /* LCD1 */
        GPIO_FN_LCDC1_SELECT,
-       GPIO_FN_LCD1_D0,        GPIO_FN_LCD1_D1,        GPIO_FN_LCD1_D2,
-       GPIO_FN_LCD1_D3,        GPIO_FN_LCD1_D4,        GPIO_FN_LCD1_D5,
-       GPIO_FN_LCD1_D6,        GPIO_FN_LCD1_D7,        GPIO_FN_LCD1_D8,
-       GPIO_FN_LCD1_D9,        GPIO_FN_LCD1_D10,       GPIO_FN_LCD1_D11,
-       GPIO_FN_LCD1_D12,       GPIO_FN_LCD1_D13,       GPIO_FN_LCD1_D14,
-       GPIO_FN_LCD1_D15,       GPIO_FN_LCD1_D16,       GPIO_FN_LCD1_D17,
-       GPIO_FN_LCD1_D18,       GPIO_FN_LCD1_D19,       GPIO_FN_LCD1_D20,
-       GPIO_FN_LCD1_D21,       GPIO_FN_LCD1_D22,       GPIO_FN_LCD1_D23,
-       GPIO_FN_LCD1_DON,       GPIO_FN_LCD1_VCPWC,
-       GPIO_FN_LCD1_LCLK,      GPIO_FN_LCD1_VEPWC,
-
-       GPIO_FN_LCD1_DCK,       GPIO_FN_LCD1_VSYN, /* for RGB */
-       GPIO_FN_LCD1_HSYN,      GPIO_FN_LCD1_DISP, /* for RGB */
-
-       GPIO_FN_LCD1_WR,        GPIO_FN_LCD1_RD, /* for SYS */
-       GPIO_FN_LCD1_CS,        GPIO_FN_LCD1_RS, /* for SYS */
 
        /* RSPI */
        GPIO_FN_RSPI_SSL0_A,    GPIO_FN_RSPI_SSL1_A,
@@ -346,26 +307,6 @@ enum {
        GPIO_FN_SIM_D_PORT22, /* SIM_D  Port 22/199 */
        GPIO_FN_SIM_D_PORT199,
 
-       /* SDHI0 */
-       GPIO_FN_SDHI0_D0,       GPIO_FN_SDHI0_D1,       GPIO_FN_SDHI0_D2,
-       GPIO_FN_SDHI0_D3,       GPIO_FN_SDHI0_CD,       GPIO_FN_SDHI0_WP,
-       GPIO_FN_SDHI0_CMD,      GPIO_FN_SDHI0_CLK,
-
-       /* SDHI1 */
-       GPIO_FN_SDHI1_D0,       GPIO_FN_SDHI1_D1,       GPIO_FN_SDHI1_D2,
-       GPIO_FN_SDHI1_D3,       GPIO_FN_SDHI1_CD,       GPIO_FN_SDHI1_WP,
-       GPIO_FN_SDHI1_CMD,      GPIO_FN_SDHI1_CLK,
-
-       /* SDHI2 */
-       GPIO_FN_SDHI2_D0,       GPIO_FN_SDHI2_D1,       GPIO_FN_SDHI2_D2,
-       GPIO_FN_SDHI2_D3,       GPIO_FN_SDHI2_CLK,      GPIO_FN_SDHI2_CMD,
-
-       GPIO_FN_SDHI2_CD_PORT24, /* MSEL5CR_19_0 */
-       GPIO_FN_SDHI2_WP_PORT25,
-
-       GPIO_FN_SDHI2_WP_PORT177, /* MSEL5CR_19_1 */
-       GPIO_FN_SDHI2_CD_PORT202,
-
        /* MSIOF2 */
        GPIO_FN_MSIOF2_TXD,     GPIO_FN_MSIOF2_RXD,     GPIO_FN_MSIOF2_TSCK,
        GPIO_FN_MSIOF2_SS2,     GPIO_FN_MSIOF2_TSYNC,   GPIO_FN_MSIOF2_SS1,
@@ -417,21 +358,6 @@ enum {
        GPIO_FN_MEMC_DREQ1,
        GPIO_FN_MEMC_A0,
 
-       /* MMC */
-       GPIO_FN_MMC0_D0_PORT68,         GPIO_FN_MMC0_D1_PORT69,
-       GPIO_FN_MMC0_D2_PORT70,         GPIO_FN_MMC0_D3_PORT71,
-       GPIO_FN_MMC0_D4_PORT72,         GPIO_FN_MMC0_D5_PORT73,
-       GPIO_FN_MMC0_D6_PORT74,         GPIO_FN_MMC0_D7_PORT75,
-       GPIO_FN_MMC0_CLK_PORT66,
-       GPIO_FN_MMC0_CMD_PORT67,        /* MSEL4CR_15_0 */
-
-       GPIO_FN_MMC1_D0_PORT149,        GPIO_FN_MMC1_D1_PORT148,
-       GPIO_FN_MMC1_D2_PORT147,        GPIO_FN_MMC1_D3_PORT146,
-       GPIO_FN_MMC1_D4_PORT145,        GPIO_FN_MMC1_D5_PORT144,
-       GPIO_FN_MMC1_D6_PORT143,        GPIO_FN_MMC1_D7_PORT142,
-       GPIO_FN_MMC1_CLK_PORT103,
-       GPIO_FN_MMC1_CMD_PORT104,       /* MSEL4CR_15_1 */
-
        /* MSIOF0 */
        GPIO_FN_MSIOF0_SS1,     GPIO_FN_MSIOF0_SS2,
        GPIO_FN_MSIOF0_RXD,     GPIO_FN_MSIOF0_TXD,
@@ -606,6 +532,15 @@ enum {
        SHDMA_SLAVE_USBHS_RX,
 };
 
+extern void r8a7740_meram_workaround(void);
+extern void r8a7740_init_irq(void);
+extern void r8a7740_map_io(void);
+extern void r8a7740_add_early_devices(void);
+extern void r8a7740_add_standard_devices(void);
+extern void r8a7740_clock_init(u8 md_ck);
+extern void r8a7740_pinmux_init(void);
+extern void r8a7740_pm_init(void);
+
 #ifdef CONFIG_PM
 extern void __init r8a7740_init_pm_domains(void);
 #else
diff --git a/arch/arm/mach-shmobile/include/mach/r8a7778.h b/arch/arm/mach-shmobile/include/mach/r8a7778.h
new file mode 100644 (file)
index 0000000..951149e
--- /dev/null
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2013  Renesas Solutions Corp.
+ * Copyright (C) 2013  Kuninori Morimoto <kuninori.morimoto.gx@renesas.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 of the License.
+ *
+ * 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., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ */
+#ifndef __ASM_R8A7778_H__
+#define __ASM_R8A7778_H__
+
+#include <linux/sh_eth.h>
+
+extern void r8a7778_add_standard_devices(void);
+extern void r8a7778_add_standard_devices_dt(void);
+extern void r8a7778_add_ether_device(struct sh_eth_plat_data *pdata);
+extern void r8a7778_init_delay(void);
+extern void r8a7778_init_irq(void);
+extern void r8a7778_init_irq_dt(void);
+extern void r8a7778_clock_init(void);
+extern void r8a7778_init_irq_extpin(int irlm);
+
+#endif /* __ASM_R8A7778_H__ */
index 8ab0cd6ad6b0c7c8a4d75b35ddbb3a92e9870003..188b295938a5cab5a9599f3874444074323ad97f 100644 (file)
@@ -3,327 +3,7 @@
 
 #include <linux/sh_clk.h>
 #include <linux/pm_domain.h>
-
-/* Pin Function Controller:
- * GPIO_FN_xx - GPIO used to select pin function
- * GPIO_GP_x_x - GPIO mapped to real I/O pin on CPU
- */
-enum {
-       GPIO_GP_0_0, GPIO_GP_0_1, GPIO_GP_0_2, GPIO_GP_0_3,
-       GPIO_GP_0_4, GPIO_GP_0_5, GPIO_GP_0_6, GPIO_GP_0_7,
-       GPIO_GP_0_8, GPIO_GP_0_9, GPIO_GP_0_10, GPIO_GP_0_11,
-       GPIO_GP_0_12, GPIO_GP_0_13, GPIO_GP_0_14, GPIO_GP_0_15,
-       GPIO_GP_0_16, GPIO_GP_0_17, GPIO_GP_0_18, GPIO_GP_0_19,
-       GPIO_GP_0_20, GPIO_GP_0_21, GPIO_GP_0_22, GPIO_GP_0_23,
-       GPIO_GP_0_24, GPIO_GP_0_25, GPIO_GP_0_26, GPIO_GP_0_27,
-       GPIO_GP_0_28, GPIO_GP_0_29, GPIO_GP_0_30, GPIO_GP_0_31,
-
-       GPIO_GP_1_0, GPIO_GP_1_1, GPIO_GP_1_2, GPIO_GP_1_3,
-       GPIO_GP_1_4, GPIO_GP_1_5, GPIO_GP_1_6, GPIO_GP_1_7,
-       GPIO_GP_1_8, GPIO_GP_1_9, GPIO_GP_1_10, GPIO_GP_1_11,
-       GPIO_GP_1_12, GPIO_GP_1_13, GPIO_GP_1_14, GPIO_GP_1_15,
-       GPIO_GP_1_16, GPIO_GP_1_17, GPIO_GP_1_18, GPIO_GP_1_19,
-       GPIO_GP_1_20, GPIO_GP_1_21, GPIO_GP_1_22, GPIO_GP_1_23,
-       GPIO_GP_1_24, GPIO_GP_1_25, GPIO_GP_1_26, GPIO_GP_1_27,
-       GPIO_GP_1_28, GPIO_GP_1_29, GPIO_GP_1_30, GPIO_GP_1_31,
-
-       GPIO_GP_2_0, GPIO_GP_2_1, GPIO_GP_2_2, GPIO_GP_2_3,
-       GPIO_GP_2_4, GPIO_GP_2_5, GPIO_GP_2_6, GPIO_GP_2_7,
-       GPIO_GP_2_8, GPIO_GP_2_9, GPIO_GP_2_10, GPIO_GP_2_11,
-       GPIO_GP_2_12, GPIO_GP_2_13, GPIO_GP_2_14, GPIO_GP_2_15,
-       GPIO_GP_2_16, GPIO_GP_2_17, GPIO_GP_2_18, GPIO_GP_2_19,
-       GPIO_GP_2_20, GPIO_GP_2_21, GPIO_GP_2_22, GPIO_GP_2_23,
-       GPIO_GP_2_24, GPIO_GP_2_25, GPIO_GP_2_26, GPIO_GP_2_27,
-       GPIO_GP_2_28, GPIO_GP_2_29, GPIO_GP_2_30, GPIO_GP_2_31,
-
-       GPIO_GP_3_0, GPIO_GP_3_1, GPIO_GP_3_2, GPIO_GP_3_3,
-       GPIO_GP_3_4, GPIO_GP_3_5, GPIO_GP_3_6, GPIO_GP_3_7,
-       GPIO_GP_3_8, GPIO_GP_3_9, GPIO_GP_3_10, GPIO_GP_3_11,
-       GPIO_GP_3_12, GPIO_GP_3_13, GPIO_GP_3_14, GPIO_GP_3_15,
-       GPIO_GP_3_16, GPIO_GP_3_17, GPIO_GP_3_18, GPIO_GP_3_19,
-       GPIO_GP_3_20, GPIO_GP_3_21, GPIO_GP_3_22, GPIO_GP_3_23,
-       GPIO_GP_3_24, GPIO_GP_3_25, GPIO_GP_3_26, GPIO_GP_3_27,
-       GPIO_GP_3_28, GPIO_GP_3_29, GPIO_GP_3_30, GPIO_GP_3_31,
-
-       GPIO_GP_4_0, GPIO_GP_4_1, GPIO_GP_4_2, GPIO_GP_4_3,
-       GPIO_GP_4_4, GPIO_GP_4_5, GPIO_GP_4_6, GPIO_GP_4_7,
-       GPIO_GP_4_8, GPIO_GP_4_9, GPIO_GP_4_10, GPIO_GP_4_11,
-       GPIO_GP_4_12, GPIO_GP_4_13, GPIO_GP_4_14, GPIO_GP_4_15,
-       GPIO_GP_4_16, GPIO_GP_4_17, GPIO_GP_4_18, GPIO_GP_4_19,
-       GPIO_GP_4_20, GPIO_GP_4_21, GPIO_GP_4_22, GPIO_GP_4_23,
-       GPIO_GP_4_24, GPIO_GP_4_25, GPIO_GP_4_26, GPIO_GP_4_27,
-       GPIO_GP_4_28, GPIO_GP_4_29, GPIO_GP_4_30, GPIO_GP_4_31,
-
-       GPIO_GP_5_0, GPIO_GP_5_1, GPIO_GP_5_2, GPIO_GP_5_3,
-       GPIO_GP_5_4, GPIO_GP_5_5, GPIO_GP_5_6, GPIO_GP_5_7,
-       GPIO_GP_5_8, GPIO_GP_5_9, GPIO_GP_5_10, GPIO_GP_5_11,
-       GPIO_GP_5_12, GPIO_GP_5_13, GPIO_GP_5_14, GPIO_GP_5_15,
-       GPIO_GP_5_16, GPIO_GP_5_17, GPIO_GP_5_18, GPIO_GP_5_19,
-       GPIO_GP_5_20, GPIO_GP_5_21, GPIO_GP_5_22, GPIO_GP_5_23,
-       GPIO_GP_5_24, GPIO_GP_5_25, GPIO_GP_5_26, GPIO_GP_5_27,
-       GPIO_GP_5_28, GPIO_GP_5_29, GPIO_GP_5_30, GPIO_GP_5_31,
-
-       GPIO_GP_6_0, GPIO_GP_6_1, GPIO_GP_6_2, GPIO_GP_6_3,
-       GPIO_GP_6_4, GPIO_GP_6_5, GPIO_GP_6_6, GPIO_GP_6_7,
-       GPIO_GP_6_8,
-
-       GPIO_FN_AVS1, GPIO_FN_AVS2, GPIO_FN_A17, GPIO_FN_A18,
-       GPIO_FN_A19,
-
-       /* IPSR0 */
-       GPIO_FN_USB_PENC2, GPIO_FN_SCK0, GPIO_FN_PWM1, GPIO_FN_PWMFSW0,
-       GPIO_FN_SCIF_CLK, GPIO_FN_TCLK0_C, GPIO_FN_BS, GPIO_FN_SD1_DAT2,
-       GPIO_FN_MMC0_D2, GPIO_FN_FD2, GPIO_FN_ATADIR0, GPIO_FN_SDSELF,
-       GPIO_FN_HCTS1, GPIO_FN_TX4_C, GPIO_FN_A0, GPIO_FN_SD1_DAT3,
-       GPIO_FN_MMC0_D3, GPIO_FN_FD3, GPIO_FN_A20, GPIO_FN_TX5_D,
-       GPIO_FN_HSPI_TX2_B, GPIO_FN_A21, GPIO_FN_SCK5_D, GPIO_FN_HSPI_CLK2_B,
-       GPIO_FN_A22, GPIO_FN_RX5_D, GPIO_FN_HSPI_RX2_B, GPIO_FN_VI1_R0,
-       GPIO_FN_A23, GPIO_FN_FCLE, GPIO_FN_HSPI_CLK2, GPIO_FN_VI1_R1,
-       GPIO_FN_A24, GPIO_FN_SD1_CD, GPIO_FN_MMC0_D4, GPIO_FN_FD4,
-       GPIO_FN_HSPI_CS2, GPIO_FN_VI1_R2, GPIO_FN_SSI_WS78_B, GPIO_FN_A25,
-       GPIO_FN_SD1_WP, GPIO_FN_MMC0_D5, GPIO_FN_FD5, GPIO_FN_HSPI_RX2,
-       GPIO_FN_VI1_R3, GPIO_FN_TX5_B, GPIO_FN_SSI_SDATA7_B, GPIO_FN_CTS0_B,
-       GPIO_FN_CLKOUT, GPIO_FN_TX3C_IRDA_TX_C, GPIO_FN_PWM0_B, GPIO_FN_CS0,
-       GPIO_FN_HSPI_CS2_B, GPIO_FN_CS1_A26, GPIO_FN_HSPI_TX2,
-       GPIO_FN_SDSELF_B, GPIO_FN_RD_WR, GPIO_FN_FWE, GPIO_FN_ATAG0,
-       GPIO_FN_VI1_R7, GPIO_FN_HRTS1, GPIO_FN_RX4_C,
-
-       /* IPSR1 */
-       GPIO_FN_EX_CS0, GPIO_FN_RX3_C_IRDA_RX_C, GPIO_FN_MMC0_D6,
-       GPIO_FN_FD6, GPIO_FN_EX_CS1, GPIO_FN_MMC0_D7, GPIO_FN_FD7,
-       GPIO_FN_EX_CS2, GPIO_FN_SD1_CLK, GPIO_FN_MMC0_CLK, GPIO_FN_FALE,
-       GPIO_FN_ATACS00, GPIO_FN_EX_CS3, GPIO_FN_SD1_CMD, GPIO_FN_MMC0_CMD,
-       GPIO_FN_FRE, GPIO_FN_ATACS10, GPIO_FN_VI1_R4, GPIO_FN_RX5_B,
-       GPIO_FN_HSCK1, GPIO_FN_SSI_SDATA8_B, GPIO_FN_RTS0_B_TANS_B,
-       GPIO_FN_SSI_SDATA9, GPIO_FN_EX_CS4, GPIO_FN_SD1_DAT0, GPIO_FN_MMC0_D0,
-       GPIO_FN_FD0, GPIO_FN_ATARD0, GPIO_FN_VI1_R5, GPIO_FN_SCK5_B,
-       GPIO_FN_HTX1, GPIO_FN_TX2_E, GPIO_FN_TX0_B, GPIO_FN_SSI_SCK9,
-       GPIO_FN_EX_CS5, GPIO_FN_SD1_DAT1, GPIO_FN_MMC0_D1, GPIO_FN_FD1,
-       GPIO_FN_ATAWR0, GPIO_FN_VI1_R6, GPIO_FN_HRX1, GPIO_FN_RX2_E,
-       GPIO_FN_RX0_B, GPIO_FN_SSI_WS9, GPIO_FN_MLB_CLK, GPIO_FN_PWM2,
-       GPIO_FN_SCK4, GPIO_FN_MLB_SIG, GPIO_FN_PWM3, GPIO_FN_TX4,
-       GPIO_FN_MLB_DAT, GPIO_FN_PWM4, GPIO_FN_RX4, GPIO_FN_HTX0,
-       GPIO_FN_TX1, GPIO_FN_SDATA, GPIO_FN_CTS0_C, GPIO_FN_SUB_TCK,
-       GPIO_FN_CC5_STATE2, GPIO_FN_CC5_STATE10, GPIO_FN_CC5_STATE18,
-       GPIO_FN_CC5_STATE26, GPIO_FN_CC5_STATE34,
-
-       /* IPSR2 */
-       GPIO_FN_HRX0, GPIO_FN_RX1, GPIO_FN_SCKZ, GPIO_FN_RTS0_C_TANS_C,
-       GPIO_FN_SUB_TDI, GPIO_FN_CC5_STATE3, GPIO_FN_CC5_STATE11,
-       GPIO_FN_CC5_STATE19, GPIO_FN_CC5_STATE27, GPIO_FN_CC5_STATE35,
-       GPIO_FN_HSCK0, GPIO_FN_SCK1, GPIO_FN_MTS, GPIO_FN_PWM5,
-       GPIO_FN_SCK0_C, GPIO_FN_SSI_SDATA9_B, GPIO_FN_SUB_TDO,
-       GPIO_FN_CC5_STATE0, GPIO_FN_CC5_STATE8, GPIO_FN_CC5_STATE16,
-       GPIO_FN_CC5_STATE24, GPIO_FN_CC5_STATE32, GPIO_FN_HCTS0, GPIO_FN_CTS1,
-       GPIO_FN_STM, GPIO_FN_PWM0_D, GPIO_FN_RX0_C, GPIO_FN_SCIF_CLK_C,
-       GPIO_FN_SUB_TRST, GPIO_FN_TCLK1_B, GPIO_FN_CC5_OSCOUT, GPIO_FN_HRTS0,
-       GPIO_FN_RTS1_TANS, GPIO_FN_MDATA, GPIO_FN_TX0_C, GPIO_FN_SUB_TMS,
-       GPIO_FN_CC5_STATE1, GPIO_FN_CC5_STATE9, GPIO_FN_CC5_STATE17,
-       GPIO_FN_CC5_STATE25, GPIO_FN_CC5_STATE33, GPIO_FN_DU0_DR0,
-       GPIO_FN_LCDOUT0, GPIO_FN_DREQ0, GPIO_FN_GPS_CLK_B, GPIO_FN_AUDATA0,
-       GPIO_FN_TX5_C, GPIO_FN_DU0_DR1, GPIO_FN_LCDOUT1, GPIO_FN_DACK0,
-       GPIO_FN_DRACK0, GPIO_FN_GPS_SIGN_B, GPIO_FN_AUDATA1, GPIO_FN_RX5_C,
-       GPIO_FN_DU0_DR2, GPIO_FN_LCDOUT2, GPIO_FN_DU0_DR3, GPIO_FN_LCDOUT3,
-       GPIO_FN_DU0_DR4, GPIO_FN_LCDOUT4, GPIO_FN_DU0_DR5, GPIO_FN_LCDOUT5,
-       GPIO_FN_DU0_DR6, GPIO_FN_LCDOUT6, GPIO_FN_DU0_DR7, GPIO_FN_LCDOUT7,
-       GPIO_FN_DU0_DG0, GPIO_FN_LCDOUT8, GPIO_FN_DREQ1, GPIO_FN_SCL2,
-       GPIO_FN_AUDATA2,
-
-       /* IPSR3 */
-       GPIO_FN_DU0_DG1, GPIO_FN_LCDOUT9, GPIO_FN_DACK1, GPIO_FN_SDA2,
-       GPIO_FN_AUDATA3, GPIO_FN_DU0_DG2, GPIO_FN_LCDOUT10, GPIO_FN_DU0_DG3,
-       GPIO_FN_LCDOUT11, GPIO_FN_DU0_DG4, GPIO_FN_LCDOUT12, GPIO_FN_DU0_DG5,
-       GPIO_FN_LCDOUT13, GPIO_FN_DU0_DG6, GPIO_FN_LCDOUT14, GPIO_FN_DU0_DG7,
-       GPIO_FN_LCDOUT15, GPIO_FN_DU0_DB0, GPIO_FN_LCDOUT16, GPIO_FN_EX_WAIT1,
-       GPIO_FN_SCL1, GPIO_FN_TCLK1, GPIO_FN_AUDATA4, GPIO_FN_DU0_DB1,
-       GPIO_FN_LCDOUT17, GPIO_FN_EX_WAIT2, GPIO_FN_SDA1, GPIO_FN_GPS_MAG_B,
-       GPIO_FN_AUDATA5, GPIO_FN_SCK5_C, GPIO_FN_DU0_DB2, GPIO_FN_LCDOUT18,
-       GPIO_FN_DU0_DB3, GPIO_FN_LCDOUT19, GPIO_FN_DU0_DB4, GPIO_FN_LCDOUT20,
-       GPIO_FN_DU0_DB5, GPIO_FN_LCDOUT21, GPIO_FN_DU0_DB6, GPIO_FN_LCDOUT22,
-       GPIO_FN_DU0_DB7, GPIO_FN_LCDOUT23, GPIO_FN_DU0_DOTCLKIN,
-       GPIO_FN_QSTVA_QVS, GPIO_FN_TX3_D_IRDA_TX_D, GPIO_FN_SCL3_B,
-       GPIO_FN_DU0_DOTCLKOUT0, GPIO_FN_QCLK, GPIO_FN_DU0_DOTCLKOUT1,
-       GPIO_FN_QSTVB_QVE, GPIO_FN_RX3_D_IRDA_RX_D, GPIO_FN_SDA3_B,
-       GPIO_FN_SDA2_C, GPIO_FN_DACK0_B, GPIO_FN_DRACK0_B,
-       GPIO_FN_DU0_EXHSYNC_DU0_HSYNC, GPIO_FN_QSTH_QHS,
-       GPIO_FN_DU0_EXVSYNC_DU0_VSYNC, GPIO_FN_QSTB_QHE,
-       GPIO_FN_DU0_EXODDF_DU0_ODDF_DISP_CDE, GPIO_FN_QCPV_QDE,
-       GPIO_FN_CAN1_TX, GPIO_FN_TX2_C, GPIO_FN_SCL2_C, GPIO_FN_REMOCON,
-
-       /* IPSR4 */
-       GPIO_FN_DU0_DISP, GPIO_FN_QPOLA, GPIO_FN_CAN_CLK_C, GPIO_FN_SCK2_C,
-       GPIO_FN_DU0_CDE, GPIO_FN_QPOLB, GPIO_FN_CAN1_RX, GPIO_FN_RX2_C,
-       GPIO_FN_DREQ0_B, GPIO_FN_SSI_SCK78_B, GPIO_FN_SCK0_B, GPIO_FN_DU1_DR0,
-       GPIO_FN_VI2_DATA0_VI2_B0, GPIO_FN_PWM6, GPIO_FN_SD3_CLK,
-       GPIO_FN_TX3_E_IRDA_TX_E, GPIO_FN_AUDCK, GPIO_FN_PWMFSW0_B,
-       GPIO_FN_DU1_DR1, GPIO_FN_VI2_DATA1_VI2_B1, GPIO_FN_PWM0,
-       GPIO_FN_SD3_CMD, GPIO_FN_RX3_E_IRDA_RX_E, GPIO_FN_AUDSYNC,
-       GPIO_FN_CTS0_D, GPIO_FN_DU1_DR2, GPIO_FN_VI2_G0, GPIO_FN_DU1_DR3,
-       GPIO_FN_VI2_G1, GPIO_FN_DU1_DR4, GPIO_FN_VI2_G2, GPIO_FN_DU1_DR5,
-       GPIO_FN_VI2_G3, GPIO_FN_DU1_DR6, GPIO_FN_VI2_G4, GPIO_FN_DU1_DR7,
-       GPIO_FN_VI2_G5, GPIO_FN_DU1_DG0, GPIO_FN_VI2_DATA2_VI2_B2,
-       GPIO_FN_SCL1_B, GPIO_FN_SD3_DAT2, GPIO_FN_SCK3_E, GPIO_FN_AUDATA6,
-       GPIO_FN_TX0_D, GPIO_FN_DU1_DG1, GPIO_FN_VI2_DATA3_VI2_B3,
-       GPIO_FN_SDA1_B, GPIO_FN_SD3_DAT3, GPIO_FN_SCK5, GPIO_FN_AUDATA7,
-       GPIO_FN_RX0_D, GPIO_FN_DU1_DG2, GPIO_FN_VI2_G6, GPIO_FN_DU1_DG3,
-       GPIO_FN_VI2_G7, GPIO_FN_DU1_DG4, GPIO_FN_VI2_R0, GPIO_FN_DU1_DG5,
-       GPIO_FN_VI2_R1, GPIO_FN_DU1_DG6, GPIO_FN_VI2_R2, GPIO_FN_DU1_DG7,
-       GPIO_FN_VI2_R3, GPIO_FN_DU1_DB0, GPIO_FN_VI2_DATA4_VI2_B4,
-       GPIO_FN_SCL2_B, GPIO_FN_SD3_DAT0, GPIO_FN_TX5, GPIO_FN_SCK0_D,
-
-       /* IPSR5 */
-       GPIO_FN_DU1_DB1, GPIO_FN_VI2_DATA5_VI2_B5, GPIO_FN_SDA2_B,
-       GPIO_FN_SD3_DAT1, GPIO_FN_RX5, GPIO_FN_RTS0_D_TANS_D,
-       GPIO_FN_DU1_DB2, GPIO_FN_VI2_R4, GPIO_FN_DU1_DB3, GPIO_FN_VI2_R5,
-       GPIO_FN_DU1_DB4, GPIO_FN_VI2_R6, GPIO_FN_DU1_DB5, GPIO_FN_VI2_R7,
-       GPIO_FN_DU1_DB6, GPIO_FN_SCL2_D, GPIO_FN_DU1_DB7, GPIO_FN_SDA2_D,
-       GPIO_FN_DU1_DOTCLKIN, GPIO_FN_VI2_CLKENB, GPIO_FN_HSPI_CS1,
-       GPIO_FN_SCL1_D, GPIO_FN_DU1_DOTCLKOUT, GPIO_FN_VI2_FIELD,
-       GPIO_FN_SDA1_D, GPIO_FN_DU1_EXHSYNC_DU1_HSYNC, GPIO_FN_VI2_HSYNC,
-       GPIO_FN_VI3_HSYNC, GPIO_FN_DU1_EXVSYNC_DU1_VSYNC, GPIO_FN_VI2_VSYNC,
-       GPIO_FN_VI3_VSYNC, GPIO_FN_DU1_EXODDF_DU1_ODDF_DISP_CDE,
-       GPIO_FN_VI2_CLK, GPIO_FN_TX3_B_IRDA_TX_B, GPIO_FN_SD3_CD,
-       GPIO_FN_HSPI_TX1, GPIO_FN_VI1_CLKENB, GPIO_FN_VI3_CLKENB,
-       GPIO_FN_AUDIO_CLKC, GPIO_FN_TX2_D, GPIO_FN_SPEEDIN,
-       GPIO_FN_GPS_SIGN_D, GPIO_FN_DU1_DISP, GPIO_FN_VI2_DATA6_VI2_B6,
-       GPIO_FN_TCLK0, GPIO_FN_QSTVA_B_QVS_B, GPIO_FN_HSPI_CLK1,
-       GPIO_FN_SCK2_D, GPIO_FN_AUDIO_CLKOUT_B, GPIO_FN_GPS_MAG_D,
-       GPIO_FN_DU1_CDE, GPIO_FN_VI2_DATA7_VI2_B7, GPIO_FN_RX3_B_IRDA_RX_B,
-       GPIO_FN_SD3_WP, GPIO_FN_HSPI_RX1, GPIO_FN_VI1_FIELD, GPIO_FN_VI3_FIELD,
-       GPIO_FN_AUDIO_CLKOUT, GPIO_FN_RX2_D, GPIO_FN_GPS_CLK_C,
-       GPIO_FN_GPS_CLK_D, GPIO_FN_AUDIO_CLKA, GPIO_FN_CAN_TXCLK,
-       GPIO_FN_AUDIO_CLKB, GPIO_FN_USB_OVC2, GPIO_FN_CAN_DEBUGOUT0,
-       GPIO_FN_MOUT0,
-
-       /* IPSR6 */
-       GPIO_FN_SSI_SCK0129, GPIO_FN_CAN_DEBUGOUT1, GPIO_FN_MOUT1,
-       GPIO_FN_SSI_WS0129, GPIO_FN_CAN_DEBUGOUT2, GPIO_FN_MOUT2,
-       GPIO_FN_SSI_SDATA0, GPIO_FN_CAN_DEBUGOUT3, GPIO_FN_MOUT5,
-       GPIO_FN_SSI_SDATA1, GPIO_FN_CAN_DEBUGOUT4, GPIO_FN_MOUT6,
-       GPIO_FN_SSI_SDATA2, GPIO_FN_CAN_DEBUGOUT5, GPIO_FN_SSI_SCK34,
-       GPIO_FN_CAN_DEBUGOUT6, GPIO_FN_CAN0_TX_B, GPIO_FN_IERX,
-       GPIO_FN_SSI_SCK9_C, GPIO_FN_SSI_WS34, GPIO_FN_CAN_DEBUGOUT7,
-       GPIO_FN_CAN0_RX_B, GPIO_FN_IETX, GPIO_FN_SSI_WS9_C,
-       GPIO_FN_SSI_SDATA3, GPIO_FN_PWM0_C, GPIO_FN_CAN_DEBUGOUT8,
-       GPIO_FN_CAN_CLK_B, GPIO_FN_IECLK, GPIO_FN_SCIF_CLK_B, GPIO_FN_TCLK0_B,
-       GPIO_FN_SSI_SDATA4, GPIO_FN_CAN_DEBUGOUT9, GPIO_FN_SSI_SDATA9_C,
-       GPIO_FN_SSI_SCK5, GPIO_FN_ADICLK, GPIO_FN_CAN_DEBUGOUT10,
-       GPIO_FN_SCK3, GPIO_FN_TCLK0_D, GPIO_FN_SSI_WS5, GPIO_FN_ADICS_SAMP,
-       GPIO_FN_CAN_DEBUGOUT11, GPIO_FN_TX3_IRDA_TX, GPIO_FN_SSI_SDATA5,
-       GPIO_FN_ADIDATA, GPIO_FN_CAN_DEBUGOUT12, GPIO_FN_RX3_IRDA_RX,
-       GPIO_FN_SSI_SCK6, GPIO_FN_ADICHS0, GPIO_FN_CAN0_TX, GPIO_FN_IERX_B,
-
-       /* IPSR7 */
-       GPIO_FN_SSI_WS6, GPIO_FN_ADICHS1, GPIO_FN_CAN0_RX, GPIO_FN_IETX_B,
-       GPIO_FN_SSI_SDATA6, GPIO_FN_ADICHS2, GPIO_FN_CAN_CLK, GPIO_FN_IECLK_B,
-       GPIO_FN_SSI_SCK78, GPIO_FN_CAN_DEBUGOUT13, GPIO_FN_IRQ0_B,
-       GPIO_FN_SSI_SCK9_B, GPIO_FN_HSPI_CLK1_C, GPIO_FN_SSI_WS78,
-       GPIO_FN_CAN_DEBUGOUT14, GPIO_FN_IRQ1_B, GPIO_FN_SSI_WS9_B,
-       GPIO_FN_HSPI_CS1_C, GPIO_FN_SSI_SDATA7, GPIO_FN_CAN_DEBUGOUT15,
-       GPIO_FN_IRQ2_B, GPIO_FN_TCLK1_C, GPIO_FN_HSPI_TX1_C,
-       GPIO_FN_SSI_SDATA8, GPIO_FN_VSP, GPIO_FN_IRQ3_B, GPIO_FN_HSPI_RX1_C,
-       GPIO_FN_SD0_CLK, GPIO_FN_ATACS01, GPIO_FN_SCK1_B, GPIO_FN_SD0_CMD,
-       GPIO_FN_ATACS11, GPIO_FN_TX1_B, GPIO_FN_CC5_TDO, GPIO_FN_SD0_DAT0,
-       GPIO_FN_ATADIR1, GPIO_FN_RX1_B, GPIO_FN_CC5_TRST, GPIO_FN_SD0_DAT1,
-       GPIO_FN_ATAG1, GPIO_FN_SCK2_B, GPIO_FN_CC5_TMS, GPIO_FN_SD0_DAT2,
-       GPIO_FN_ATARD1, GPIO_FN_TX2_B, GPIO_FN_CC5_TCK, GPIO_FN_SD0_DAT3,
-       GPIO_FN_ATAWR1, GPIO_FN_RX2_B, GPIO_FN_CC5_TDI, GPIO_FN_SD0_CD,
-       GPIO_FN_DREQ2,  GPIO_FN_RTS1_B_TANS_B, GPIO_FN_SD0_WP, GPIO_FN_DACK2,
-       GPIO_FN_CTS1_B,
-
-       /* IPSR8 */
-       GPIO_FN_HSPI_CLK0, GPIO_FN_CTS0, GPIO_FN_USB_OVC0, GPIO_FN_AD_CLK,
-       GPIO_FN_CC5_STATE4, GPIO_FN_CC5_STATE12, GPIO_FN_CC5_STATE20,
-       GPIO_FN_CC5_STATE28, GPIO_FN_CC5_STATE36, GPIO_FN_HSPI_CS0,
-       GPIO_FN_RTS0_TANS, GPIO_FN_USB_OVC1, GPIO_FN_AD_DI,
-       GPIO_FN_CC5_STATE5, GPIO_FN_CC5_STATE13, GPIO_FN_CC5_STATE21,
-       GPIO_FN_CC5_STATE29, GPIO_FN_CC5_STATE37, GPIO_FN_HSPI_TX0,
-       GPIO_FN_TX0, GPIO_FN_CAN_DEBUG_HW_TRIGGER, GPIO_FN_AD_DO,
-       GPIO_FN_CC5_STATE6, GPIO_FN_CC5_STATE14, GPIO_FN_CC5_STATE22,
-       GPIO_FN_CC5_STATE30, GPIO_FN_CC5_STATE38, GPIO_FN_HSPI_RX0,
-       GPIO_FN_RX0, GPIO_FN_CAN_STEP0, GPIO_FN_AD_NCS, GPIO_FN_CC5_STATE7,
-       GPIO_FN_CC5_STATE15, GPIO_FN_CC5_STATE23, GPIO_FN_CC5_STATE31,
-       GPIO_FN_CC5_STATE39, GPIO_FN_FMCLK, GPIO_FN_RDS_CLK, GPIO_FN_PCMOE,
-       GPIO_FN_BPFCLK, GPIO_FN_PCMWE, GPIO_FN_FMIN, GPIO_FN_RDS_DATA,
-       GPIO_FN_VI0_CLK, GPIO_FN_MMC1_CLK, GPIO_FN_VI0_CLKENB, GPIO_FN_TX1_C,
-       GPIO_FN_HTX1_B, GPIO_FN_MT1_SYNC, GPIO_FN_VI0_FIELD, GPIO_FN_RX1_C,
-       GPIO_FN_HRX1_B, GPIO_FN_VI0_HSYNC, GPIO_FN_VI0_DATA0_B_VI0_B0_B,
-       GPIO_FN_CTS1_C, GPIO_FN_TX4_D, GPIO_FN_MMC1_CMD, GPIO_FN_HSCK1_B,
-       GPIO_FN_VI0_VSYNC, GPIO_FN_VI0_DATA1_B_VI0_B1_B,
-       GPIO_FN_RTS1_C_TANS_C, GPIO_FN_RX4_D, GPIO_FN_PWMFSW0_C,
-
-       /* IPSR9 */
-       GPIO_FN_VI0_DATA0_VI0_B0, GPIO_FN_HRTS1_B, GPIO_FN_MT1_VCXO,
-       GPIO_FN_VI0_DATA1_VI0_B1, GPIO_FN_HCTS1_B, GPIO_FN_MT1_PWM,
-       GPIO_FN_VI0_DATA2_VI0_B2, GPIO_FN_MMC1_D0, GPIO_FN_VI0_DATA3_VI0_B3,
-       GPIO_FN_MMC1_D1, GPIO_FN_VI0_DATA4_VI0_B4, GPIO_FN_MMC1_D2,
-       GPIO_FN_VI0_DATA5_VI0_B5, GPIO_FN_MMC1_D3, GPIO_FN_VI0_DATA6_VI0_B6,
-       GPIO_FN_MMC1_D4, GPIO_FN_ARM_TRACEDATA_0, GPIO_FN_VI0_DATA7_VI0_B7,
-       GPIO_FN_MMC1_D5, GPIO_FN_ARM_TRACEDATA_1, GPIO_FN_VI0_G0,
-       GPIO_FN_SSI_SCK78_C, GPIO_FN_IRQ0, GPIO_FN_ARM_TRACEDATA_2,
-       GPIO_FN_VI0_G1, GPIO_FN_SSI_WS78_C, GPIO_FN_IRQ1,
-       GPIO_FN_ARM_TRACEDATA_3, GPIO_FN_VI0_G2, GPIO_FN_ETH_TXD1,
-       GPIO_FN_MMC1_D6, GPIO_FN_ARM_TRACEDATA_4, GPIO_FN_TS_SPSYNC0,
-       GPIO_FN_VI0_G3, GPIO_FN_ETH_CRS_DV, GPIO_FN_MMC1_D7,
-       GPIO_FN_ARM_TRACEDATA_5, GPIO_FN_TS_SDAT0, GPIO_FN_VI0_G4,
-       GPIO_FN_ETH_TX_EN, GPIO_FN_SD2_DAT0_B, GPIO_FN_ARM_TRACEDATA_6,
-       GPIO_FN_VI0_G5, GPIO_FN_ETH_RX_ER, GPIO_FN_SD2_DAT1_B,
-       GPIO_FN_ARM_TRACEDATA_7, GPIO_FN_VI0_G6, GPIO_FN_ETH_RXD0,
-       GPIO_FN_SD2_DAT2_B, GPIO_FN_ARM_TRACEDATA_8, GPIO_FN_VI0_G7,
-       GPIO_FN_ETH_RXD1, GPIO_FN_SD2_DAT3_B, GPIO_FN_ARM_TRACEDATA_9,
-
-       /* IPSR10 */
-       GPIO_FN_VI0_R0, GPIO_FN_SSI_SDATA7_C, GPIO_FN_SCK1_C, GPIO_FN_DREQ1_B,
-       GPIO_FN_ARM_TRACEDATA_10, GPIO_FN_DREQ0_C, GPIO_FN_VI0_R1,
-       GPIO_FN_SSI_SDATA8_C, GPIO_FN_DACK1_B, GPIO_FN_ARM_TRACEDATA_11,
-       GPIO_FN_DACK0_C, GPIO_FN_DRACK0_C, GPIO_FN_VI0_R2, GPIO_FN_ETH_LINK,
-       GPIO_FN_SD2_CLK_B, GPIO_FN_IRQ2, GPIO_FN_ARM_TRACEDATA_12,
-       GPIO_FN_VI0_R3, GPIO_FN_ETH_MAGIC, GPIO_FN_SD2_CMD_B, GPIO_FN_IRQ3,
-       GPIO_FN_ARM_TRACEDATA_13, GPIO_FN_VI0_R4, GPIO_FN_ETH_REFCLK,
-       GPIO_FN_SD2_CD_B, GPIO_FN_HSPI_CLK1_B, GPIO_FN_ARM_TRACEDATA_14,
-       GPIO_FN_MT1_CLK, GPIO_FN_TS_SCK0, GPIO_FN_VI0_R5, GPIO_FN_ETH_TXD0,
-       GPIO_FN_SD2_WP_B, GPIO_FN_HSPI_CS1_B, GPIO_FN_ARM_TRACEDATA_15,
-       GPIO_FN_MT1_D, GPIO_FN_TS_SDEN0, GPIO_FN_VI0_R6, GPIO_FN_ETH_MDC,
-       GPIO_FN_DREQ2_C, GPIO_FN_HSPI_TX1_B, GPIO_FN_TRACECLK,
-       GPIO_FN_MT1_BEN, GPIO_FN_PWMFSW0_D, GPIO_FN_VI0_R7, GPIO_FN_ETH_MDIO,
-       GPIO_FN_DACK2_C, GPIO_FN_HSPI_RX1_B, GPIO_FN_SCIF_CLK_D,
-       GPIO_FN_TRACECTL, GPIO_FN_MT1_PEN, GPIO_FN_VI1_CLK, GPIO_FN_SIM_D,
-       GPIO_FN_SDA3, GPIO_FN_VI1_HSYNC, GPIO_FN_VI3_CLK, GPIO_FN_SSI_SCK4,
-       GPIO_FN_GPS_SIGN_C, GPIO_FN_PWMFSW0_E, GPIO_FN_VI1_VSYNC,
-       GPIO_FN_AUDIO_CLKOUT_C, GPIO_FN_SSI_WS4, GPIO_FN_SIM_CLK,
-       GPIO_FN_GPS_MAG_C, GPIO_FN_SPV_TRST, GPIO_FN_SCL3,
-
-       /* IPSR11 */
-       GPIO_FN_VI1_DATA0_VI1_B0, GPIO_FN_SD2_DAT0, GPIO_FN_SIM_RST,
-       GPIO_FN_SPV_TCK, GPIO_FN_ADICLK_B, GPIO_FN_VI1_DATA1_VI1_B1,
-       GPIO_FN_SD2_DAT1, GPIO_FN_MT0_CLK, GPIO_FN_SPV_TMS,
-       GPIO_FN_ADICS_B_SAMP_B, GPIO_FN_VI1_DATA2_VI1_B2, GPIO_FN_SD2_DAT2,
-       GPIO_FN_MT0_D, GPIO_FN_SPVTDI, GPIO_FN_ADIDATA_B,
-       GPIO_FN_VI1_DATA3_VI1_B3, GPIO_FN_SD2_DAT3, GPIO_FN_MT0_BEN,
-       GPIO_FN_SPV_TDO, GPIO_FN_ADICHS0_B, GPIO_FN_VI1_DATA4_VI1_B4,
-       GPIO_FN_SD2_CLK, GPIO_FN_MT0_PEN, GPIO_FN_SPA_TRST,
-       GPIO_FN_HSPI_CLK1_D, GPIO_FN_ADICHS1_B, GPIO_FN_VI1_DATA5_VI1_B5,
-       GPIO_FN_SD2_CMD, GPIO_FN_MT0_SYNC, GPIO_FN_SPA_TCK,
-       GPIO_FN_HSPI_CS1_D, GPIO_FN_ADICHS2_B, GPIO_FN_VI1_DATA6_VI1_B6,
-       GPIO_FN_SD2_CD, GPIO_FN_MT0_VCXO, GPIO_FN_SPA_TMS, GPIO_FN_HSPI_TX1_D,
-       GPIO_FN_VI1_DATA7_VI1_B7, GPIO_FN_SD2_WP, GPIO_FN_MT0_PWM,
-       GPIO_FN_SPA_TDI, GPIO_FN_HSPI_RX1_D, GPIO_FN_VI1_G0, GPIO_FN_VI3_DATA0,
-       GPIO_FN_DU1_DOTCLKOUT1, GPIO_FN_TS_SCK1, GPIO_FN_DREQ2_B, GPIO_FN_TX2,
-       GPIO_FN_SPA_TDO, GPIO_FN_HCTS0_B, GPIO_FN_VI1_G1, GPIO_FN_VI3_DATA1,
-       GPIO_FN_SSI_SCK1, GPIO_FN_TS_SDEN1, GPIO_FN_DACK2_B, GPIO_FN_RX2,
-       GPIO_FN_HRTS0_B,
-
-       /* IPSR12 */
-       GPIO_FN_VI1_G2, GPIO_FN_VI3_DATA2, GPIO_FN_SSI_WS1, GPIO_FN_TS_SPSYNC1,
-       GPIO_FN_SCK2, GPIO_FN_HSCK0_B, GPIO_FN_VI1_G3, GPIO_FN_VI3_DATA3,
-       GPIO_FN_SSI_SCK2, GPIO_FN_TS_SDAT1, GPIO_FN_SCL1_C, GPIO_FN_HTX0_B,
-       GPIO_FN_VI1_G4, GPIO_FN_VI3_DATA4, GPIO_FN_SSI_WS2, GPIO_FN_SDA1_C,
-       GPIO_FN_SIM_RST_B, GPIO_FN_HRX0_B, GPIO_FN_VI1_G5, GPIO_FN_VI3_DATA5,
-       GPIO_FN_GPS_CLK, GPIO_FN_FSE, GPIO_FN_TX4_B, GPIO_FN_SIM_D_B,
-       GPIO_FN_VI1_G6, GPIO_FN_VI3_DATA6, GPIO_FN_GPS_SIGN, GPIO_FN_FRB,
-       GPIO_FN_RX4_B, GPIO_FN_SIM_CLK_B, GPIO_FN_VI1_G7, GPIO_FN_VI3_DATA7,
-       GPIO_FN_GPS_MAG, GPIO_FN_FCE, GPIO_FN_SCK4_B,
-};
+#include <linux/sh_eth.h>
 
 struct platform_device;
 
@@ -343,6 +23,20 @@ static inline struct r8a7779_pm_ch *to_r8a7779_ch(struct generic_pm_domain *d)
        return &container_of(d, struct r8a7779_pm_domain, genpd)->ch;
 }
 
+extern void r8a7779_init_delay(void);
+extern void r8a7779_init_irq(void);
+extern void r8a7779_init_irq_extpin(int irlm);
+extern void r8a7779_init_irq_dt(void);
+extern void r8a7779_map_io(void);
+extern void r8a7779_earlytimer_init(void);
+extern void r8a7779_add_early_devices(void);
+extern void r8a7779_add_standard_devices(void);
+extern void r8a7779_add_standard_devices_dt(void);
+extern void r8a7779_add_ether_device(struct sh_eth_plat_data *pdata);
+extern void r8a7779_clock_init(void);
+extern void r8a7779_pinmux_init(void);
+extern void r8a7779_pm_init(void);
+extern void r8a7779_register_twd(void);
 extern int r8a7779_sysc_power_down(struct r8a7779_pm_ch *r8a7779_ch);
 extern int r8a7779_sysc_power_up(struct r8a7779_pm_ch *r8a7779_ch);
 
diff --git a/arch/arm/mach-shmobile/include/mach/r8a7790.h b/arch/arm/mach-shmobile/include/mach/r8a7790.h
new file mode 100644 (file)
index 0000000..2e919e6
--- /dev/null
@@ -0,0 +1,9 @@
+#ifndef __ASM_R8A7790_H__
+#define __ASM_R8A7790_H__
+
+void r8a7790_add_standard_devices(void);
+void r8a7790_clock_init(void);
+void r8a7790_pinmux_init(void);
+void r8a7790_timer_init(void);
+
+#endif /* __ASM_R8A7790_H__ */
index b582facc1cf6b174d3bcbfe56ef2bb0ac0a6634f..fd7cba024c392a83e73f9d1f0f620aaa0f3cf1f6 100644 (file)
@@ -294,21 +294,6 @@ enum {
        GPIO_FN_D12_NAF12,      GPIO_FN_D13_NAF13,      GPIO_FN_D14_NAF14,
        GPIO_FN_D15_NAF15,
 
-       /*
-        * MMCIF(1)             (PORT 84, 85, 86, 87, 88, 89,
-        *                            90, 91, 92, 99)
-        */
-       GPIO_FN_MMCD0_0,        GPIO_FN_MMCD0_1,        GPIO_FN_MMCD0_2,
-       GPIO_FN_MMCD0_3,        GPIO_FN_MMCD0_4,        GPIO_FN_MMCD0_5,
-       GPIO_FN_MMCD0_6,        GPIO_FN_MMCD0_7,
-       GPIO_FN_MMCCMD0,        GPIO_FN_MMCCLK0,
-
-       /* MMCIF(2)             (PORT 54, 55, 56, 57, 58, 59, 60, 61, 66, 67) */
-       GPIO_FN_MMCD1_0,        GPIO_FN_MMCD1_1,        GPIO_FN_MMCD1_2,
-       GPIO_FN_MMCD1_3,        GPIO_FN_MMCD1_4,        GPIO_FN_MMCD1_5,
-       GPIO_FN_MMCD1_6,        GPIO_FN_MMCD1_7,
-       GPIO_FN_MMCCLK1,        GPIO_FN_MMCCMD1,
-
        /* SPU2         (PORT 65) */
        GPIO_FN_VINT_I,
 
@@ -416,20 +401,6 @@ enum {
        /* HDMI         (PORT 169, 170) */
        GPIO_FN_HDMI_HPD,       GPIO_FN_HDMI_CEC,
 
-       /* SDHI0        (PORT 171, 172, 173, 174, 175, 176, 177, 178) */
-       GPIO_FN_SDHICLK0,       GPIO_FN_SDHICD0,
-       GPIO_FN_SDHICMD0,       GPIO_FN_SDHIWP0,
-       GPIO_FN_SDHID0_0,       GPIO_FN_SDHID0_1,
-       GPIO_FN_SDHID0_2,       GPIO_FN_SDHID0_3,
-
-       /* SDHI1        (PORT 179, 180, 181, 182, 183, 184) */
-       GPIO_FN_SDHICLK1,       GPIO_FN_SDHICMD1,       GPIO_FN_SDHID1_0,
-       GPIO_FN_SDHID1_1,       GPIO_FN_SDHID1_2,       GPIO_FN_SDHID1_3,
-
-       /* SDHI2        (PORT 185, 186, 187, 188, 189, 190) */
-       GPIO_FN_SDHICLK2,       GPIO_FN_SDHICMD2,       GPIO_FN_SDHID2_0,
-       GPIO_FN_SDHID2_1,       GPIO_FN_SDHID2_2,       GPIO_FN_SDHID2_3,
-
        /* SDENC        see MSEL4CR 19 */
        GPIO_FN_SDENC_CPG,
        GPIO_FN_SDENC_DV_CLKI,
@@ -478,6 +449,18 @@ extern struct clk sh7372_dv_clki_clk;
 extern struct clk sh7372_dv_clki_div2_clk;
 extern struct clk sh7372_pllc2_clk;
 
+extern void sh7372_init_irq(void);
+extern void sh7372_map_io(void);
+extern void sh7372_earlytimer_init(void);
+extern void sh7372_add_early_devices(void);
+extern void sh7372_add_standard_devices(void);
+extern void sh7372_add_early_devices_dt(void);
+extern void sh7372_add_standard_devices_dt(void);
+extern void sh7372_clock_init(void);
+extern void sh7372_pinmux_init(void);
+extern void sh7372_pm_init(void);
+extern void sh7372_resume_core_standby_sysc(void);
+extern int  sh7372_do_idle_sysc(unsigned long sleep_mode);
 extern void sh7372_intcs_suspend(void);
 extern void sh7372_intcs_resume(void);
 extern void sh7372_intca_suspend(void);
index 606d31d02a4ef86efe9b0c63b696fac4023afeeb..eb7a4320d487e1327dc6c961fa5bbae033f0770d 100644 (file)
@@ -94,8 +94,7 @@ enum {
        GPIO_PORT305, GPIO_PORT306, GPIO_PORT307, GPIO_PORT308, GPIO_PORT309,
 
        /* Table 25-1 (Function 0-7) */
-       GPIO_FN_VBUS_0,
-       GPIO_FN_GPI0,
+       GPIO_FN_GPI0 = 310,
        GPIO_FN_GPI1,
        GPIO_FN_GPI2,
        GPIO_FN_GPI3,
@@ -103,15 +102,11 @@ enum {
        GPIO_FN_GPI5,
        GPIO_FN_GPI6,
        GPIO_FN_GPI7,
-       GPIO_FN_SCIFA7_RXD,
-       GPIO_FN_SCIFA7_CTS_,
        GPIO_FN_GPO7, GPIO_FN_MFG0_OUT2,
        GPIO_FN_GPO6, GPIO_FN_MFG1_OUT2,
-       GPIO_FN_GPO5, GPIO_FN_SCIFA0_SCK, GPIO_FN_FSICOSLDT3, \
+       GPIO_FN_GPO5,
        GPIO_FN_PORT16_VIO_CKOR,
-       GPIO_FN_SCIFA0_TXD,
-       GPIO_FN_SCIFA7_TXD,
-       GPIO_FN_SCIFA7_RTS_, GPIO_FN_PORT19_VIO_CKO2,
+       GPIO_FN_PORT19_VIO_CKO2,
        GPIO_FN_GPO0,
        GPIO_FN_GPO1,
        GPIO_FN_GPO2, GPIO_FN_STATUS0,
@@ -119,83 +114,44 @@ enum {
        GPIO_FN_GPO4, GPIO_FN_STATUS2,
        GPIO_FN_VINT,
        GPIO_FN_TCKON,
-       GPIO_FN_XDVFS1, GPIO_FN_PORT27_I2C_SCL2, GPIO_FN_PORT27_I2C_SCL3, \
+       GPIO_FN_XDVFS1,
        GPIO_FN_MFG0_OUT1, GPIO_FN_PORT27_IROUT,
-       GPIO_FN_XDVFS2, GPIO_FN_PORT28_I2C_SDA2, GPIO_FN_PORT28_I2C_SDA3, \
+       GPIO_FN_XDVFS2,
        GPIO_FN_PORT28_TPU1TO1,
        GPIO_FN_SIM_RST, GPIO_FN_PORT29_TPU1TO1,
        GPIO_FN_SIM_CLK, GPIO_FN_PORT30_VIO_CKOR,
        GPIO_FN_SIM_D, GPIO_FN_PORT31_IROUT,
-       GPIO_FN_SCIFA4_TXD,
-       GPIO_FN_SCIFA4_RXD, GPIO_FN_XWUP,
-       GPIO_FN_SCIFA4_RTS_,
-       GPIO_FN_SCIFA4_CTS_,
-       GPIO_FN_FSIBOBT, GPIO_FN_FSIBIBT,
-       GPIO_FN_FSIBOLR, GPIO_FN_FSIBILR,
-       GPIO_FN_FSIBOSLD,
-       GPIO_FN_FSIBISLD,
+       GPIO_FN_XWUP,
        GPIO_FN_VACK,
        GPIO_FN_XTAL1L,
-       GPIO_FN_SCIFA0_RTS_, GPIO_FN_FSICOSLDT2,
-       GPIO_FN_SCIFA0_RXD,
-       GPIO_FN_SCIFA0_CTS_, GPIO_FN_FSICOSLDT1,
-       GPIO_FN_FSICOBT, GPIO_FN_FSICIBT, GPIO_FN_FSIDOBT, GPIO_FN_FSIDIBT,
-       GPIO_FN_FSICOLR, GPIO_FN_FSICILR, GPIO_FN_FSIDOLR, GPIO_FN_FSIDILR,
-       GPIO_FN_FSICOSLD, GPIO_FN_PORT47_FSICSPDIF,
-       GPIO_FN_FSICISLD, GPIO_FN_FSIDISLD,
-       GPIO_FN_FSIACK, GPIO_FN_PORT49_IRDA_OUT, GPIO_FN_PORT49_IROUT, \
-       GPIO_FN_FSIAOMC,
-       GPIO_FN_FSIAOLR, GPIO_FN_BBIF2_TSYNC2, GPIO_FN_TPU2TO2, GPIO_FN_FSIAILR,
-
-       GPIO_FN_FSIAOBT, GPIO_FN_BBIF2_TSCK2, GPIO_FN_TPU2TO3, GPIO_FN_FSIAIBT,
-       GPIO_FN_FSIAOSLD, GPIO_FN_BBIF2_TXD2,
-       GPIO_FN_FSIASPDIF, GPIO_FN_PORT53_IRDA_IN, GPIO_FN_TPU3TO3, \
-       GPIO_FN_FSIBSPDIF, GPIO_FN_PORT53_FSICSPDIF,
-       GPIO_FN_FSIBCK, GPIO_FN_PORT54_IRDA_FIRSEL, GPIO_FN_TPU3TO2, \
-       GPIO_FN_FSIBOMC, GPIO_FN_FSICCK, GPIO_FN_FSICOMC,
-       GPIO_FN_FSIAISLD, GPIO_FN_TPU0TO0,
+       GPIO_FN_PORT49_IROUT,
+       GPIO_FN_BBIF2_TSYNC2, GPIO_FN_TPU2TO2,
+
+       GPIO_FN_BBIF2_TSCK2, GPIO_FN_TPU2TO3,
+       GPIO_FN_BBIF2_TXD2,
+       GPIO_FN_TPU3TO3,
+       GPIO_FN_TPU3TO2,
+       GPIO_FN_TPU0TO0,
        GPIO_FN_A0, GPIO_FN_BS_,
-       GPIO_FN_A12, GPIO_FN_PORT58_KEYOUT7, GPIO_FN_TPU4TO2,
-       GPIO_FN_A13, GPIO_FN_PORT59_KEYOUT6, GPIO_FN_TPU0TO1,
-       GPIO_FN_A14, GPIO_FN_KEYOUT5,
-       GPIO_FN_A15, GPIO_FN_KEYOUT4,
-       GPIO_FN_A16, GPIO_FN_KEYOUT3, GPIO_FN_MSIOF0_SS1,
-       GPIO_FN_A17, GPIO_FN_KEYOUT2, GPIO_FN_MSIOF0_TSYNC,
-       GPIO_FN_A18, GPIO_FN_KEYOUT1, GPIO_FN_MSIOF0_TSCK,
-       GPIO_FN_A19, GPIO_FN_KEYOUT0, GPIO_FN_MSIOF0_TXD,
-       GPIO_FN_A20, GPIO_FN_KEYIN0, GPIO_FN_MSIOF0_RSCK,
-       GPIO_FN_A21, GPIO_FN_KEYIN1, GPIO_FN_MSIOF0_RSYNC,
-       GPIO_FN_A22, GPIO_FN_KEYIN2, GPIO_FN_MSIOF0_MCK0,
-       GPIO_FN_A23, GPIO_FN_KEYIN3, GPIO_FN_MSIOF0_MCK1,
-       GPIO_FN_A24, GPIO_FN_KEYIN4, GPIO_FN_MSIOF0_RXD,
-       GPIO_FN_A25, GPIO_FN_KEYIN5, GPIO_FN_MSIOF0_SS2,
-       GPIO_FN_A26, GPIO_FN_KEYIN6,
-       GPIO_FN_KEYIN7,
-       GPIO_FN_D0_NAF0,
-       GPIO_FN_D1_NAF1,
-       GPIO_FN_D2_NAF2,
-       GPIO_FN_D3_NAF3,
-       GPIO_FN_D4_NAF4,
-       GPIO_FN_D5_NAF5,
-       GPIO_FN_D6_NAF6,
-       GPIO_FN_D7_NAF7,
-       GPIO_FN_D8_NAF8,
-       GPIO_FN_D9_NAF9,
-       GPIO_FN_D10_NAF10,
-       GPIO_FN_D11_NAF11,
-       GPIO_FN_D12_NAF12,
-       GPIO_FN_D13_NAF13,
-       GPIO_FN_D14_NAF14,
-       GPIO_FN_D15_NAF15,
-       GPIO_FN_CS4_,
-       GPIO_FN_CS5A_, GPIO_FN_PORT91_RDWR,
-       GPIO_FN_CS5B_, GPIO_FN_FCE1_,
-       GPIO_FN_CS6B_, GPIO_FN_DACK0,
-       GPIO_FN_FCE0_, GPIO_FN_CS6A_,
+       GPIO_FN_A12, GPIO_FN_TPU4TO2,
+       GPIO_FN_A13, GPIO_FN_TPU0TO1,
+       GPIO_FN_A14,
+       GPIO_FN_A15,
+       GPIO_FN_A16, GPIO_FN_MSIOF0_SS1,
+       GPIO_FN_A17, GPIO_FN_MSIOF0_TSYNC,
+       GPIO_FN_A18, GPIO_FN_MSIOF0_TSCK,
+       GPIO_FN_A19, GPIO_FN_MSIOF0_TXD,
+       GPIO_FN_A20, GPIO_FN_MSIOF0_RSCK,
+       GPIO_FN_A21, GPIO_FN_MSIOF0_RSYNC,
+       GPIO_FN_A22, GPIO_FN_MSIOF0_MCK0,
+       GPIO_FN_A23, GPIO_FN_MSIOF0_MCK1,
+       GPIO_FN_A24, GPIO_FN_MSIOF0_RXD,
+       GPIO_FN_A25, GPIO_FN_MSIOF0_SS2,
+       GPIO_FN_A26,
+       GPIO_FN_FCE1_,
+       GPIO_FN_DACK0,
+       GPIO_FN_FCE0_,
        GPIO_FN_WAIT_, GPIO_FN_DREQ0,
-       GPIO_FN_RD__FSC,
-       GPIO_FN_WE0__FWE, GPIO_FN_RDWR_FWE,
-       GPIO_FN_WE1_,
        GPIO_FN_FRB,
        GPIO_FN_CKO,
        GPIO_FN_NBRSTOUT_,
@@ -204,145 +160,118 @@ enum {
        GPIO_FN_BBIF2_RXD,
        GPIO_FN_BBIF2_SYNC,
        GPIO_FN_BBIF2_SCK,
-       GPIO_FN_SCIFA3_CTS_, GPIO_FN_MFG3_IN2,
-       GPIO_FN_SCIFA3_RXD, GPIO_FN_MFG3_IN1,
-       GPIO_FN_BBIF1_SS2, GPIO_FN_SCIFA3_RTS_, GPIO_FN_MFG3_OUT1,
-       GPIO_FN_SCIFA3_TXD,
+       GPIO_FN_MFG3_IN2,
+       GPIO_FN_MFG3_IN1,
+       GPIO_FN_BBIF1_SS2, GPIO_FN_MFG3_OUT1,
        GPIO_FN_HSI_RX_DATA, GPIO_FN_BBIF1_RXD,
        GPIO_FN_HSI_TX_WAKE, GPIO_FN_BBIF1_TSCK,
        GPIO_FN_HSI_TX_DATA, GPIO_FN_BBIF1_TSYNC,
        GPIO_FN_HSI_TX_READY, GPIO_FN_BBIF1_TXD,
-       GPIO_FN_HSI_RX_READY, GPIO_FN_BBIF1_RSCK, GPIO_FN_PORT115_I2C_SCL2, \
-       GPIO_FN_PORT115_I2C_SCL3,
-       GPIO_FN_HSI_RX_WAKE, GPIO_FN_BBIF1_RSYNC, GPIO_FN_PORT116_I2C_SDA2, \
-       GPIO_FN_PORT116_I2C_SDA3,
+       GPIO_FN_HSI_RX_READY, GPIO_FN_BBIF1_RSCK,
+       GPIO_FN_HSI_RX_WAKE, GPIO_FN_BBIF1_RSYNC,
        GPIO_FN_HSI_RX_FLAG, GPIO_FN_BBIF1_SS1, GPIO_FN_BBIF1_FLOW,
        GPIO_FN_HSI_TX_FLAG,
-       GPIO_FN_VIO_VD, GPIO_FN_PORT128_LCD2VSYN, GPIO_FN_VIO2_VD, \
-       GPIO_FN_LCD2D0,
-
-       GPIO_FN_VIO_HD, GPIO_FN_PORT129_LCD2HSYN, GPIO_FN_PORT129_LCD2CS_, \
-       GPIO_FN_VIO2_HD, GPIO_FN_LCD2D1,
-       GPIO_FN_VIO_D0, GPIO_FN_PORT130_MSIOF2_RXD, GPIO_FN_LCD2D10,
-       GPIO_FN_VIO_D1, GPIO_FN_PORT131_KEYOUT6, GPIO_FN_PORT131_MSIOF2_SS1, \
-       GPIO_FN_PORT131_KEYOUT11, GPIO_FN_LCD2D11,
-       GPIO_FN_VIO_D2, GPIO_FN_PORT132_KEYOUT7, GPIO_FN_PORT132_MSIOF2_SS2, \
-       GPIO_FN_PORT132_KEYOUT10, GPIO_FN_LCD2D12,
-       GPIO_FN_VIO_D3, GPIO_FN_MSIOF2_TSYNC, GPIO_FN_LCD2D13,
-       GPIO_FN_VIO_D4, GPIO_FN_MSIOF2_TXD, GPIO_FN_LCD2D14,
-       GPIO_FN_VIO_D5, GPIO_FN_MSIOF2_TSCK, GPIO_FN_LCD2D15,
-       GPIO_FN_VIO_D6, GPIO_FN_PORT136_KEYOUT8, GPIO_FN_LCD2D16,
-       GPIO_FN_VIO_D7, GPIO_FN_PORT137_KEYOUT9, GPIO_FN_LCD2D17,
-       GPIO_FN_VIO_D8, GPIO_FN_PORT138_KEYOUT8, GPIO_FN_VIO2_D0, \
-       GPIO_FN_LCD2D6,
-       GPIO_FN_VIO_D9, GPIO_FN_PORT139_KEYOUT9, GPIO_FN_VIO2_D1, \
-       GPIO_FN_LCD2D7,
-       GPIO_FN_VIO_D10, GPIO_FN_TPU0TO2, GPIO_FN_VIO2_D2, GPIO_FN_LCD2D8,
-       GPIO_FN_VIO_D11, GPIO_FN_TPU0TO3, GPIO_FN_VIO2_D3, GPIO_FN_LCD2D9,
-       GPIO_FN_VIO_D12, GPIO_FN_PORT142_KEYOUT10, GPIO_FN_VIO2_D4, \
-       GPIO_FN_LCD2D2,
-       GPIO_FN_VIO_D13, GPIO_FN_PORT143_KEYOUT11, GPIO_FN_PORT143_KEYOUT6, \
-       GPIO_FN_VIO2_D5, GPIO_FN_LCD2D3,
-       GPIO_FN_VIO_D14, GPIO_FN_PORT144_KEYOUT7, GPIO_FN_VIO2_D6, \
-       GPIO_FN_LCD2D4,
-       GPIO_FN_VIO_D15, GPIO_FN_TPU1TO3, GPIO_FN_PORT145_LCD2DISP, \
-       GPIO_FN_PORT145_LCD2RS, GPIO_FN_VIO2_D7, GPIO_FN_LCD2D5,
-       GPIO_FN_VIO_CLK, GPIO_FN_LCD2DCK, GPIO_FN_PORT146_LCD2WR_, \
-       GPIO_FN_VIO2_CLK, GPIO_FN_LCD2D18,
-       GPIO_FN_VIO_FIELD, GPIO_FN_LCD2RD_, GPIO_FN_VIO2_FIELD, GPIO_FN_LCD2D19,
+       GPIO_FN_VIO_VD, GPIO_FN_VIO2_VD,
+
+       GPIO_FN_VIO_HD,
+       GPIO_FN_VIO2_HD,
+       GPIO_FN_VIO_D0, GPIO_FN_PORT130_MSIOF2_RXD,
+       GPIO_FN_VIO_D1, GPIO_FN_PORT131_MSIOF2_SS1,
+       GPIO_FN_VIO_D2, GPIO_FN_PORT132_MSIOF2_SS2,
+       GPIO_FN_VIO_D3, GPIO_FN_MSIOF2_TSYNC,
+       GPIO_FN_VIO_D4, GPIO_FN_MSIOF2_TXD,
+       GPIO_FN_VIO_D5, GPIO_FN_MSIOF2_TSCK,
+       GPIO_FN_VIO_D6,
+       GPIO_FN_VIO_D7,
+       GPIO_FN_VIO_D8, GPIO_FN_VIO2_D0,
+       GPIO_FN_VIO_D9, GPIO_FN_VIO2_D1,
+       GPIO_FN_VIO_D10, GPIO_FN_TPU0TO2, GPIO_FN_VIO2_D2,
+       GPIO_FN_VIO_D11, GPIO_FN_TPU0TO3, GPIO_FN_VIO2_D3,
+       GPIO_FN_VIO_D12, GPIO_FN_VIO2_D4,
+       GPIO_FN_VIO_D13,
+       GPIO_FN_VIO2_D5,
+       GPIO_FN_VIO_D14, GPIO_FN_VIO2_D6,
+       GPIO_FN_VIO_D15, GPIO_FN_TPU1TO3,
+       GPIO_FN_VIO2_D7,
+       GPIO_FN_VIO_CLK,
+       GPIO_FN_VIO2_CLK,
+       GPIO_FN_VIO_FIELD, GPIO_FN_VIO2_FIELD,
        GPIO_FN_VIO_CKO,
-       GPIO_FN_A27, GPIO_FN_PORT149_RDWR, GPIO_FN_MFG0_IN1, \
-       GPIO_FN_PORT149_KEYOUT9,
+       GPIO_FN_A27, GPIO_FN_MFG0_IN1,
        GPIO_FN_MFG0_IN2,
        GPIO_FN_TS_SPSYNC3, GPIO_FN_MSIOF2_RSCK,
        GPIO_FN_TS_SDAT3, GPIO_FN_MSIOF2_RSYNC,
        GPIO_FN_TPU1TO2, GPIO_FN_TS_SDEN3, GPIO_FN_PORT153_MSIOF2_SS1,
-       GPIO_FN_SCIFA2_TXD1, GPIO_FN_MSIOF2_MCK0,
-       GPIO_FN_SCIFA2_RXD1, GPIO_FN_MSIOF2_MCK1,
-       GPIO_FN_SCIFA2_RTS1_, GPIO_FN_PORT156_MSIOF2_SS2,
-       GPIO_FN_SCIFA2_CTS1_, GPIO_FN_PORT157_MSIOF2_RXD,
-       GPIO_FN_DINT_, GPIO_FN_SCIFA2_SCK1, GPIO_FN_TS_SCK3,
-       GPIO_FN_PORT159_SCIFB_SCK, GPIO_FN_PORT159_SCIFA5_SCK, GPIO_FN_NMI,
-       GPIO_FN_PORT160_SCIFB_TXD, GPIO_FN_PORT160_SCIFA5_TXD,
-       GPIO_FN_PORT161_SCIFB_CTS_, GPIO_FN_PORT161_SCIFA5_CTS_,
-       GPIO_FN_PORT162_SCIFB_RXD, GPIO_FN_PORT162_SCIFA5_RXD,
-       GPIO_FN_PORT163_SCIFB_RTS_, GPIO_FN_PORT163_SCIFA5_RTS_, \
+       GPIO_FN_MSIOF2_MCK0,
+       GPIO_FN_MSIOF2_MCK1,
+       GPIO_FN_PORT156_MSIOF2_SS2,
+       GPIO_FN_PORT157_MSIOF2_RXD,
+       GPIO_FN_DINT_, GPIO_FN_TS_SCK3,
+       GPIO_FN_NMI,
        GPIO_FN_TPU3TO0,
-       GPIO_FN_LCDD0,
-       GPIO_FN_LCDD1, GPIO_FN_PORT193_SCIFA5_CTS_, GPIO_FN_BBIF2_TSYNC1,
-       GPIO_FN_LCDD2, GPIO_FN_PORT194_SCIFA5_RTS_, GPIO_FN_BBIF2_TSCK1,
-       GPIO_FN_LCDD3, GPIO_FN_PORT195_SCIFA5_RXD, GPIO_FN_BBIF2_TXD1,
-       GPIO_FN_LCDD4, GPIO_FN_PORT196_SCIFA5_TXD,
-       GPIO_FN_LCDD5, GPIO_FN_PORT197_SCIFA5_SCK, GPIO_FN_MFG2_OUT2, \
+       GPIO_FN_BBIF2_TSYNC1,
+       GPIO_FN_BBIF2_TSCK1,
+       GPIO_FN_BBIF2_TXD1,
+       GPIO_FN_MFG2_OUT2,
        GPIO_FN_TPU2TO1,
-       GPIO_FN_LCDD6,
-       GPIO_FN_LCDD7, GPIO_FN_TPU4TO1, GPIO_FN_MFG4_OUT2,
-       GPIO_FN_LCDD8, GPIO_FN_D16,
-       GPIO_FN_LCDD9, GPIO_FN_D17,
-       GPIO_FN_LCDD10, GPIO_FN_D18,
-       GPIO_FN_LCDD11, GPIO_FN_D19,
-       GPIO_FN_LCDD12, GPIO_FN_D20,
-       GPIO_FN_LCDD13, GPIO_FN_D21,
-       GPIO_FN_LCDD14, GPIO_FN_D22,
-       GPIO_FN_LCDD15, GPIO_FN_PORT207_MSIOF0L_SS1, GPIO_FN_D23,
-       GPIO_FN_LCDD16, GPIO_FN_PORT208_MSIOF0L_SS2, GPIO_FN_D24,
-       GPIO_FN_LCDD17, GPIO_FN_D25,
-       GPIO_FN_LCDD18, GPIO_FN_DREQ2, GPIO_FN_PORT210_MSIOF0L_SS1, GPIO_FN_D26,
-       GPIO_FN_LCDD19, GPIO_FN_PORT211_MSIOF0L_SS2, GPIO_FN_D27,
-       GPIO_FN_LCDD20, GPIO_FN_TS_SPSYNC1, GPIO_FN_MSIOF0L_MCK0, GPIO_FN_D28,
-       GPIO_FN_LCDD21, GPIO_FN_TS_SDAT1, GPIO_FN_MSIOF0L_MCK1, GPIO_FN_D29,
-       GPIO_FN_LCDD22, GPIO_FN_TS_SDEN1, GPIO_FN_MSIOF0L_RSCK, GPIO_FN_D30,
-       GPIO_FN_LCDD23, GPIO_FN_TS_SCK1, GPIO_FN_MSIOF0L_RSYNC, GPIO_FN_D31,
-       GPIO_FN_LCDDCK, GPIO_FN_LCDWR_,
-       GPIO_FN_LCDRD_, GPIO_FN_DACK2, GPIO_FN_PORT217_LCD2RS, \
-       GPIO_FN_MSIOF0L_TSYNC, GPIO_FN_VIO2_FIELD3, GPIO_FN_PORT217_LCD2DISP,
-       GPIO_FN_LCDHSYN, GPIO_FN_LCDCS_, GPIO_FN_LCDCS2_, GPIO_FN_DACK3, \
+       GPIO_FN_TPU4TO1, GPIO_FN_MFG4_OUT2,
+       GPIO_FN_D16,
+       GPIO_FN_D17,
+       GPIO_FN_D18,
+       GPIO_FN_D19,
+       GPIO_FN_D20,
+       GPIO_FN_D21,
+       GPIO_FN_D22,
+       GPIO_FN_PORT207_MSIOF0L_SS1, GPIO_FN_D23,
+       GPIO_FN_PORT208_MSIOF0L_SS2, GPIO_FN_D24,
+       GPIO_FN_D25,
+       GPIO_FN_DREQ2, GPIO_FN_PORT210_MSIOF0L_SS1, GPIO_FN_D26,
+       GPIO_FN_PORT211_MSIOF0L_SS2, GPIO_FN_D27,
+       GPIO_FN_TS_SPSYNC1, GPIO_FN_MSIOF0L_MCK0, GPIO_FN_D28,
+       GPIO_FN_TS_SDAT1, GPIO_FN_MSIOF0L_MCK1, GPIO_FN_D29,
+       GPIO_FN_TS_SDEN1, GPIO_FN_MSIOF0L_RSCK, GPIO_FN_D30,
+       GPIO_FN_TS_SCK1, GPIO_FN_MSIOF0L_RSYNC, GPIO_FN_D31,
+       GPIO_FN_DACK2,
+       GPIO_FN_MSIOF0L_TSYNC, GPIO_FN_VIO2_FIELD3,
+       GPIO_FN_DACK3,
        GPIO_FN_PORT218_VIO_CKOR,
-       GPIO_FN_LCDDISP, GPIO_FN_LCDRS, GPIO_FN_PORT219_LCD2WR_, \
        GPIO_FN_DREQ3, GPIO_FN_MSIOF0L_TSCK, GPIO_FN_VIO2_CLK3, \
-       GPIO_FN_LCD2DCK_2,
-       GPIO_FN_LCDVSYN, GPIO_FN_LCDVSYN2,
-       GPIO_FN_LCDLCLK, GPIO_FN_DREQ1, GPIO_FN_PORT221_LCD2CS_, \
+       GPIO_FN_DREQ1,
        GPIO_FN_PWEN, GPIO_FN_MSIOF0L_RXD, GPIO_FN_VIO2_HD3, \
-       GPIO_FN_PORT221_LCD2HSYN,
-       GPIO_FN_LCDDON, GPIO_FN_LCDDON2, GPIO_FN_DACK1, GPIO_FN_OVCN, \
-       GPIO_FN_MSIOF0L_TXD, GPIO_FN_VIO2_VD3, GPIO_FN_PORT222_LCD2VSYN,
-
-       GPIO_FN_SCIFA1_TXD, GPIO_FN_OVCN2,
-       GPIO_FN_EXTLP, GPIO_FN_SCIFA1_SCK, GPIO_FN_PORT226_VIO_CKO2,
-       GPIO_FN_SCIFA1_RTS_, GPIO_FN_IDIN,
-       GPIO_FN_SCIFA1_RXD,
-       GPIO_FN_SCIFA1_CTS_, GPIO_FN_MFG1_IN1,
-       GPIO_FN_MSIOF1_TXD, GPIO_FN_SCIFA2_TXD2,
-       GPIO_FN_MSIOF1_TSYNC, GPIO_FN_SCIFA2_CTS2_,
-       GPIO_FN_MSIOF1_TSCK, GPIO_FN_SCIFA2_SCK2,
-       GPIO_FN_MSIOF1_RXD, GPIO_FN_SCIFA2_RXD2,
-       GPIO_FN_MSIOF1_RSCK, GPIO_FN_SCIFA2_RTS2_, GPIO_FN_VIO2_CLK2, \
-       GPIO_FN_LCD2D20,
+       GPIO_FN_DACK1, GPIO_FN_OVCN,
+       GPIO_FN_MSIOF0L_TXD, GPIO_FN_VIO2_VD3,
+
+       GPIO_FN_OVCN2,
+       GPIO_FN_EXTLP, GPIO_FN_PORT226_VIO_CKO2,
+       GPIO_FN_IDIN,
+       GPIO_FN_MFG1_IN1,
+       GPIO_FN_MSIOF1_TXD,
+       GPIO_FN_MSIOF1_TSYNC,
+       GPIO_FN_MSIOF1_TSCK,
+       GPIO_FN_MSIOF1_RXD,
+       GPIO_FN_MSIOF1_RSCK, GPIO_FN_VIO2_CLK2,
        GPIO_FN_MSIOF1_RSYNC, GPIO_FN_MFG1_IN2, GPIO_FN_VIO2_VD2, \
-       GPIO_FN_LCD2D21,
-       GPIO_FN_MSIOF1_MCK0, GPIO_FN_PORT236_I2C_SDA2,
-       GPIO_FN_MSIOF1_MCK1, GPIO_FN_PORT237_I2C_SCL2,
-       GPIO_FN_MSIOF1_SS1, GPIO_FN_VIO2_FIELD2, GPIO_FN_LCD2D22,
-       GPIO_FN_MSIOF1_SS2, GPIO_FN_VIO2_HD2, GPIO_FN_LCD2D23,
-       GPIO_FN_SCIFA6_TXD,
-       GPIO_FN_PORT241_IRDA_OUT, GPIO_FN_PORT241_IROUT, GPIO_FN_MFG4_OUT1, \
+       GPIO_FN_MSIOF1_MCK0,
+       GPIO_FN_MSIOF1_MCK1,
+       GPIO_FN_MSIOF1_SS1, GPIO_FN_VIO2_FIELD2,
+       GPIO_FN_MSIOF1_SS2, GPIO_FN_VIO2_HD2,
+       GPIO_FN_PORT241_IROUT, GPIO_FN_MFG4_OUT1, \
        GPIO_FN_TPU4TO0,
-       GPIO_FN_PORT242_IRDA_IN, GPIO_FN_MFG4_IN2,
-       GPIO_FN_PORT243_IRDA_FIRSEL, GPIO_FN_PORT243_VIO_CKO2,
-       GPIO_FN_PORT244_SCIFA5_CTS_, GPIO_FN_MFG2_IN1, \
-       GPIO_FN_PORT244_SCIFB_CTS_, GPIO_FN_MSIOF2R_RXD,
-       GPIO_FN_PORT245_SCIFA5_RTS_, GPIO_FN_MFG2_IN2, \
-       GPIO_FN_PORT245_SCIFB_RTS_, GPIO_FN_MSIOF2R_TXD,
-       GPIO_FN_PORT246_SCIFA5_RXD, GPIO_FN_MFG1_OUT1, \
-       GPIO_FN_PORT246_SCIFB_RXD, GPIO_FN_TPU1TO0,
-       GPIO_FN_PORT247_SCIFA5_TXD, GPIO_FN_MFG3_OUT2, \
-       GPIO_FN_PORT247_SCIFB_TXD, GPIO_FN_TPU3TO1,
-       GPIO_FN_PORT248_SCIFA5_SCK, GPIO_FN_MFG2_OUT1, \
-       GPIO_FN_PORT248_SCIFB_SCK, GPIO_FN_TPU2TO0, \
-       GPIO_FN_PORT248_I2C_SCL3, GPIO_FN_MSIOF2R_TSCK,
+       GPIO_FN_MFG4_IN2,
+       GPIO_FN_PORT243_VIO_CKO2,
+       GPIO_FN_MFG2_IN1,
+       GPIO_FN_MSIOF2R_RXD,
+       GPIO_FN_MFG2_IN2,
+       GPIO_FN_MSIOF2R_TXD,
+       GPIO_FN_MFG1_OUT1,
+       GPIO_FN_TPU1TO0,
+       GPIO_FN_MFG3_OUT2,
+       GPIO_FN_TPU3TO1,
+       GPIO_FN_MFG2_OUT1,
+       GPIO_FN_TPU2TO0,
+       GPIO_FN_MSIOF2R_TSCK,
        GPIO_FN_PORT249_IROUT, GPIO_FN_MFG4_IN1, \
-       GPIO_FN_PORT249_I2C_SDA3, GPIO_FN_MSIOF2R_TSYNC,
+       GPIO_FN_MSIOF2R_TSYNC,
        GPIO_FN_SDHICLK0,
        GPIO_FN_SDHICD0,
        GPIO_FN_SDHID0_0,
@@ -435,54 +364,12 @@ enum {
        GPIO_FN_IRQ9_MEM_INT,
        GPIO_FN_IRQ9_MCP_INT,
        GPIO_FN_A11,
-       GPIO_FN_KEYOUT8,
        GPIO_FN_TPU4TO3,
        GPIO_FN_RESETA_N_PU_ON,
        GPIO_FN_RESETA_N_PU_OFF,
        GPIO_FN_EDBGREQ_PD,
        GPIO_FN_EDBGREQ_PU,
 
-       /* Functions with pull-ups */
-       GPIO_FN_KEYIN0_PU,
-       GPIO_FN_KEYIN1_PU,
-       GPIO_FN_KEYIN2_PU,
-       GPIO_FN_KEYIN3_PU,
-       GPIO_FN_KEYIN4_PU,
-       GPIO_FN_KEYIN5_PU,
-       GPIO_FN_KEYIN6_PU,
-       GPIO_FN_KEYIN7_PU,
-       GPIO_FN_SDHICD0_PU,
-       GPIO_FN_SDHID0_0_PU,
-       GPIO_FN_SDHID0_1_PU,
-       GPIO_FN_SDHID0_2_PU,
-       GPIO_FN_SDHID0_3_PU,
-       GPIO_FN_SDHICMD0_PU,
-       GPIO_FN_SDHIWP0_PU,
-       GPIO_FN_SDHID1_0_PU,
-       GPIO_FN_SDHID1_1_PU,
-       GPIO_FN_SDHID1_2_PU,
-       GPIO_FN_SDHID1_3_PU,
-       GPIO_FN_SDHICMD1_PU,
-       GPIO_FN_SDHID2_0_PU,
-       GPIO_FN_SDHID2_1_PU,
-       GPIO_FN_SDHID2_2_PU,
-       GPIO_FN_SDHID2_3_PU,
-       GPIO_FN_SDHICMD2_PU,
-       GPIO_FN_MMCCMD0_PU,
-       GPIO_FN_MMCCMD1_PU,
-       GPIO_FN_MMCD0_0_PU,
-       GPIO_FN_MMCD0_1_PU,
-       GPIO_FN_MMCD0_2_PU,
-       GPIO_FN_MMCD0_3_PU,
-       GPIO_FN_MMCD0_4_PU,
-       GPIO_FN_MMCD0_5_PU,
-       GPIO_FN_MMCD0_6_PU,
-       GPIO_FN_MMCD0_7_PU,
-       GPIO_FN_FSIACK_PU,
-       GPIO_FN_FSIAILR_PU,
-       GPIO_FN_FSIAIBT_PU,
-       GPIO_FN_FSIAISLD_PU,
-
        /* end of GPIO */
        GPIO_NR,
 };
@@ -557,6 +444,21 @@ enum {
 #define SH73A0_PINT0_IRQ(irq) ((irq) + 700)
 #define SH73A0_PINT1_IRQ(irq) ((irq) + 732)
 
+extern void sh73a0_init_delay(void);
+extern void sh73a0_init_irq(void);
+extern void sh73a0_init_irq_dt(void);
+extern void sh73a0_map_io(void);
+extern void sh73a0_earlytimer_init(void);
+extern void sh73a0_add_early_devices(void);
+extern void sh73a0_add_standard_devices(void);
+extern void sh73a0_add_standard_devices_dt(void);
+extern void sh73a0_clock_init(void);
+extern void sh73a0_pinmux_init(void);
+extern void sh73a0_pm_init(void);
+extern struct clk sh73a0_extal1_clk;
+extern struct clk sh73a0_extal2_clk;
+extern struct clk sh73a0_extcki_clk;
+extern struct clk sh73a0_extalr_clk;
 extern struct smp_operations sh73a0_smp_ops;
 
 #endif /* __ASM_SH73A0_H__ */
index 9a69a31918ba074d01501f210bfe162e0a216b56..b741c8409a5a5e0f9eb219ee8dba3d0ad3147dc4 100644 (file)
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  */
 
-#include <linux/kernel.h>
 #include <linux/init.h>
-#include <linux/interrupt.h>
-#include <linux/irq.h>
 #include <linux/io.h>
-#include <linux/sh_intc.h>
-#include <mach/intc.h>
-#include <mach/irqs.h>
-#include <asm/mach-types.h>
-#include <asm/mach/arch.h>
-
-/*
- *             INTCA
- */
-enum {
-       UNUSED_INTCA = 0,
-
-       /* interrupt sources INTCA */
-       DIRC,
-       ATAPI,
-       IIC1_ALI, IIC1_TACKI, IIC1_WAITI, IIC1_DTEI,
-       AP_ARM_COMMTX, AP_ARM_COMMRX,
-       MFI, MFIS,
-       BBIF1, BBIF2,
-       USBHSDMAC,
-       USBF_OUL_SOF, USBF_IXL_INT,
-       SGX540,
-       CMT1_0, CMT1_1, CMT1_2, CMT1_3,
-       CMT2,
-       CMT3,
-       KEYSC,
-       SCIFA0, SCIFA1, SCIFA2, SCIFA3,
-       MSIOF2, MSIOF1,
-       SCIFA4, SCIFA5, SCIFB,
-       FLCTL_FLSTEI, FLCTL_FLTENDI, FLCTL_FLTREQ0I, FLCTL_FLTREQ1I,
-       SDHI0_0, SDHI0_1, SDHI0_2, SDHI0_3,
-       SDHI1_0, SDHI1_1, SDHI1_2, SDHI1_3,
-       AP_ARM_L2CINT,
-       IRDA,
-       TPU0,
-       SCIFA6, SCIFA7,
-       GbEther,
-       ICBS0,
-       DDM,
-       SDHI2_0, SDHI2_1, SDHI2_2, SDHI2_3,
-       RWDT0,
-       DMAC1_1_DEI0, DMAC1_1_DEI1, DMAC1_1_DEI2, DMAC1_1_DEI3,
-       DMAC1_2_DEI4, DMAC1_2_DEI5, DMAC1_2_DADERR,
-       DMAC2_1_DEI0, DMAC2_1_DEI1, DMAC2_1_DEI2, DMAC2_1_DEI3,
-       DMAC2_2_DEI4, DMAC2_2_DEI5, DMAC2_2_DADERR,
-       DMAC3_1_DEI0, DMAC3_1_DEI1, DMAC3_1_DEI2, DMAC3_1_DEI3,
-       DMAC3_2_DEI4, DMAC3_2_DEI5, DMAC3_2_DADERR,
-       SHWYSTAT_RT, SHWYSTAT_HS, SHWYSTAT_COM,
-       HDMI,
-       USBH_INT, USBH_OHCI, USBH_EHCI, USBH_PME, USBH_BIND,
-       RSPI_OVRF, RSPI_SPTEF, RSPI_SPRF,
-       SPU2_0, SPU2_1,
-       FSI, FMSI,
-       HDMI_SSS, HDMI_KEY,
-       IPMMU,
-       AP_ARM_CTIIRQ, AP_ARM_PMURQ,
-       MFIS2,
-       CPORTR2S,
-       CMT14, CMT15,
-       MMCIF_0, MMCIF_1, MMCIF_2,
-       SIM_ERI, SIM_RXI, SIM_TXI, SIM_TEI,
-       STPRO_0, STPRO_1, STPRO_2, STPRO_3, STPRO_4,
-
-       /* interrupt groups INTCA */
-       DMAC1_1, DMAC1_2,
-       DMAC2_1, DMAC2_2,
-       DMAC3_1, DMAC3_2,
-       AP_ARM1, AP_ARM2,
-       SDHI0, SDHI1, SDHI2,
-       SHWYSTAT,
-       USBF, USBH1, USBH2,
-       RSPI, SPU2, FLCTL, IIC1,
-};
-
-static struct intc_vect intca_vectors[] __initdata = {
-       INTC_VECT(DIRC,                 0x0560),
-       INTC_VECT(ATAPI,                0x05E0),
-       INTC_VECT(IIC1_ALI,             0x0780),
-       INTC_VECT(IIC1_TACKI,           0x07A0),
-       INTC_VECT(IIC1_WAITI,           0x07C0),
-       INTC_VECT(IIC1_DTEI,            0x07E0),
-       INTC_VECT(AP_ARM_COMMTX,        0x0840),
-       INTC_VECT(AP_ARM_COMMRX,        0x0860),
-       INTC_VECT(MFI,                  0x0900),
-       INTC_VECT(MFIS,                 0x0920),
-       INTC_VECT(BBIF1,                0x0940),
-       INTC_VECT(BBIF2,                0x0960),
-       INTC_VECT(USBHSDMAC,            0x0A00),
-       INTC_VECT(USBF_OUL_SOF,         0x0A20),
-       INTC_VECT(USBF_IXL_INT,         0x0A40),
-       INTC_VECT(SGX540,               0x0A60),
-       INTC_VECT(CMT1_0,               0x0B00),
-       INTC_VECT(CMT1_1,               0x0B20),
-       INTC_VECT(CMT1_2,               0x0B40),
-       INTC_VECT(CMT1_3,               0x0B60),
-       INTC_VECT(CMT2,                 0x0B80),
-       INTC_VECT(CMT3,                 0x0BA0),
-       INTC_VECT(KEYSC,                0x0BE0),
-       INTC_VECT(SCIFA0,               0x0C00),
-       INTC_VECT(SCIFA1,               0x0C20),
-       INTC_VECT(SCIFA2,               0x0C40),
-       INTC_VECT(SCIFA3,               0x0C60),
-       INTC_VECT(MSIOF2,               0x0C80),
-       INTC_VECT(MSIOF1,               0x0D00),
-       INTC_VECT(SCIFA4,               0x0D20),
-       INTC_VECT(SCIFA5,               0x0D40),
-       INTC_VECT(SCIFB,                0x0D60),
-       INTC_VECT(FLCTL_FLSTEI,         0x0D80),
-       INTC_VECT(FLCTL_FLTENDI,        0x0DA0),
-       INTC_VECT(FLCTL_FLTREQ0I,       0x0DC0),
-       INTC_VECT(FLCTL_FLTREQ1I,       0x0DE0),
-       INTC_VECT(SDHI0_0,              0x0E00),
-       INTC_VECT(SDHI0_1,              0x0E20),
-       INTC_VECT(SDHI0_2,              0x0E40),
-       INTC_VECT(SDHI0_3,              0x0E60),
-       INTC_VECT(SDHI1_0,              0x0E80),
-       INTC_VECT(SDHI1_1,              0x0EA0),
-       INTC_VECT(SDHI1_2,              0x0EC0),
-       INTC_VECT(SDHI1_3,              0x0EE0),
-       INTC_VECT(AP_ARM_L2CINT,        0x0FA0),
-       INTC_VECT(IRDA,                 0x0480),
-       INTC_VECT(TPU0,                 0x04A0),
-       INTC_VECT(SCIFA6,               0x04C0),
-       INTC_VECT(SCIFA7,               0x04E0),
-       INTC_VECT(GbEther,              0x0500),
-       INTC_VECT(ICBS0,                0x0540),
-       INTC_VECT(DDM,                  0x1140),
-       INTC_VECT(SDHI2_0,              0x1200),
-       INTC_VECT(SDHI2_1,              0x1220),
-       INTC_VECT(SDHI2_2,              0x1240),
-       INTC_VECT(SDHI2_3,              0x1260),
-       INTC_VECT(RWDT0,                0x1280),
-       INTC_VECT(DMAC1_1_DEI0,         0x2000),
-       INTC_VECT(DMAC1_1_DEI1,         0x2020),
-       INTC_VECT(DMAC1_1_DEI2,         0x2040),
-       INTC_VECT(DMAC1_1_DEI3,         0x2060),
-       INTC_VECT(DMAC1_2_DEI4,         0x2080),
-       INTC_VECT(DMAC1_2_DEI5,         0x20A0),
-       INTC_VECT(DMAC1_2_DADERR,       0x20C0),
-       INTC_VECT(DMAC2_1_DEI0,         0x2100),
-       INTC_VECT(DMAC2_1_DEI1,         0x2120),
-       INTC_VECT(DMAC2_1_DEI2,         0x2140),
-       INTC_VECT(DMAC2_1_DEI3,         0x2160),
-       INTC_VECT(DMAC2_2_DEI4,         0x2180),
-       INTC_VECT(DMAC2_2_DEI5,         0x21A0),
-       INTC_VECT(DMAC2_2_DADERR,       0x21C0),
-       INTC_VECT(DMAC3_1_DEI0,         0x2200),
-       INTC_VECT(DMAC3_1_DEI1,         0x2220),
-       INTC_VECT(DMAC3_1_DEI2,         0x2240),
-       INTC_VECT(DMAC3_1_DEI3,         0x2260),
-       INTC_VECT(DMAC3_2_DEI4,         0x2280),
-       INTC_VECT(DMAC3_2_DEI5,         0x22A0),
-       INTC_VECT(DMAC3_2_DADERR,       0x22C0),
-       INTC_VECT(SHWYSTAT_RT,          0x1300),
-       INTC_VECT(SHWYSTAT_HS,          0x1320),
-       INTC_VECT(SHWYSTAT_COM,         0x1340),
-       INTC_VECT(USBH_INT,             0x1540),
-       INTC_VECT(USBH_OHCI,            0x1560),
-       INTC_VECT(USBH_EHCI,            0x1580),
-       INTC_VECT(USBH_PME,             0x15A0),
-       INTC_VECT(USBH_BIND,            0x15C0),
-       INTC_VECT(HDMI,                 0x1700),
-       INTC_VECT(RSPI_OVRF,            0x1780),
-       INTC_VECT(RSPI_SPTEF,           0x17A0),
-       INTC_VECT(RSPI_SPRF,            0x17C0),
-       INTC_VECT(SPU2_0,               0x1800),
-       INTC_VECT(SPU2_1,               0x1820),
-       INTC_VECT(FSI,                  0x1840),
-       INTC_VECT(FMSI,                 0x1860),
-       INTC_VECT(HDMI_SSS,             0x18A0),
-       INTC_VECT(HDMI_KEY,             0x18C0),
-       INTC_VECT(IPMMU,                0x1920),
-       INTC_VECT(AP_ARM_CTIIRQ,        0x1980),
-       INTC_VECT(AP_ARM_PMURQ,         0x19A0),
-       INTC_VECT(MFIS2,                0x1A00),
-       INTC_VECT(CPORTR2S,             0x1A20),
-       INTC_VECT(CMT14,                0x1A40),
-       INTC_VECT(CMT15,                0x1A60),
-       INTC_VECT(MMCIF_0,              0x1AA0),
-       INTC_VECT(MMCIF_1,              0x1AC0),
-       INTC_VECT(MMCIF_2,              0x1AE0),
-       INTC_VECT(SIM_ERI,              0x1C00),
-       INTC_VECT(SIM_RXI,              0x1C20),
-       INTC_VECT(SIM_TXI,              0x1C40),
-       INTC_VECT(SIM_TEI,              0x1C60),
-       INTC_VECT(STPRO_0,              0x1C80),
-       INTC_VECT(STPRO_1,              0x1CA0),
-       INTC_VECT(STPRO_2,              0x1CC0),
-       INTC_VECT(STPRO_3,              0x1CE0),
-       INTC_VECT(STPRO_4,              0x1D00),
-};
-
-static struct intc_group intca_groups[] __initdata = {
-       INTC_GROUP(DMAC1_1,
-                  DMAC1_1_DEI0, DMAC1_1_DEI1, DMAC1_1_DEI2, DMAC1_1_DEI3),
-       INTC_GROUP(DMAC1_2,
-                  DMAC1_2_DEI4, DMAC1_2_DEI5, DMAC1_2_DADERR),
-       INTC_GROUP(DMAC2_1,
-                  DMAC2_1_DEI0, DMAC2_1_DEI1, DMAC2_1_DEI2, DMAC2_1_DEI3),
-       INTC_GROUP(DMAC2_2,
-                  DMAC2_2_DEI4, DMAC2_2_DEI5, DMAC2_2_DADERR),
-       INTC_GROUP(DMAC3_1,
-                  DMAC3_1_DEI0, DMAC3_1_DEI1, DMAC3_1_DEI2, DMAC3_1_DEI3),
-       INTC_GROUP(DMAC3_2,
-                  DMAC3_2_DEI4, DMAC3_2_DEI5, DMAC3_2_DADERR),
-       INTC_GROUP(AP_ARM1,
-                  AP_ARM_COMMTX, AP_ARM_COMMRX),
-       INTC_GROUP(AP_ARM2,
-                  AP_ARM_CTIIRQ, AP_ARM_PMURQ),
-       INTC_GROUP(USBF,
-                  USBF_OUL_SOF, USBF_IXL_INT),
-       INTC_GROUP(SDHI0,
-                  SDHI0_0, SDHI0_1, SDHI0_2, SDHI0_3),
-       INTC_GROUP(SDHI1,
-                  SDHI1_0, SDHI1_1, SDHI1_2, SDHI1_3),
-       INTC_GROUP(SDHI2,
-                  SDHI2_0, SDHI2_1, SDHI2_2, SDHI2_3),
-       INTC_GROUP(SHWYSTAT,
-                  SHWYSTAT_RT, SHWYSTAT_HS, SHWYSTAT_COM),
-       INTC_GROUP(USBH1, /* FIXME */
-                  USBH_INT, USBH_OHCI),
-       INTC_GROUP(USBH2, /* FIXME */
-                  USBH_EHCI,
-                  USBH_PME, USBH_BIND),
-       INTC_GROUP(RSPI,
-                  RSPI_OVRF, RSPI_SPTEF, RSPI_SPRF),
-       INTC_GROUP(SPU2,
-                  SPU2_0, SPU2_1),
-       INTC_GROUP(FLCTL,
-                  FLCTL_FLSTEI, FLCTL_FLTENDI, FLCTL_FLTREQ0I, FLCTL_FLTREQ1I),
-       INTC_GROUP(IIC1,
-                  IIC1_ALI, IIC1_TACKI, IIC1_WAITI, IIC1_DTEI),
-};
-
-static struct intc_mask_reg intca_mask_registers[] __initdata = {
-       { /* IMR0A / IMCR0A */ 0xe6940080, 0xe69400c0, 8,
-         { DMAC2_1_DEI3, DMAC2_1_DEI2, DMAC2_1_DEI1, DMAC2_1_DEI0,
-           0, 0, AP_ARM_COMMTX, AP_ARM_COMMRX } },
-       { /* IMR1A / IMCR1A */ 0xe6940084, 0xe69400c4, 8,
-         { ATAPI, 0, DIRC, 0,
-           DMAC1_1_DEI3, DMAC1_1_DEI2, DMAC1_1_DEI1, DMAC1_1_DEI0 } },
-       { /* IMR2A / IMCR2A */ 0xe6940088, 0xe69400c8, 8,
-         { 0, 0, 0, 0,
-           BBIF1, BBIF2, MFIS, MFI } },
-       { /* IMR3A / IMCR3A */ 0xe694008c, 0xe69400cc, 8,
-         { DMAC3_1_DEI3, DMAC3_1_DEI2, DMAC3_1_DEI1, DMAC3_1_DEI0,
-           DMAC3_2_DADERR, DMAC3_2_DEI5, DMAC3_2_DEI4, IRDA } },
-       { /* IMR4A / IMCR4A */ 0xe6940090, 0xe69400d0, 8,
-         { DDM, 0, 0, 0,
-           0, 0, 0, 0 } },
-       { /* IMR5A / IMCR5A */ 0xe6940094, 0xe69400d4, 8,
-         { KEYSC, DMAC1_2_DADERR, DMAC1_2_DEI5, DMAC1_2_DEI4,
-           SCIFA3, SCIFA2, SCIFA1, SCIFA0 } },
-       { /* IMR6A / IMCR6A */ 0xe6940098, 0xe69400d8, 8,
-         { SCIFB, SCIFA5, SCIFA4, MSIOF1,
-           0, 0, MSIOF2, 0 } },
-       { /* IMR7A / IMCR7A */ 0xe694009c, 0xe69400dc, 8,
-         { SDHI0_3, SDHI0_2, SDHI0_1, SDHI0_0,
-           FLCTL_FLTREQ1I, FLCTL_FLTREQ0I, FLCTL_FLTENDI, FLCTL_FLSTEI } },
-       { /* IMR8A / IMCR8A */ 0xe69400a0, 0xe69400e0, 8,
-         { SDHI1_3, SDHI1_2, SDHI1_1, SDHI1_0,
-           0, USBHSDMAC, 0, AP_ARM_L2CINT } },
-       { /* IMR9A / IMCR9A */ 0xe69400a4, 0xe69400e4, 8,
-         { CMT1_3, CMT1_2, CMT1_1, CMT1_0,
-           CMT2, USBF_IXL_INT, USBF_OUL_SOF, SGX540 } },
-       { /* IMR10A / IMCR10A */ 0xe69400a8, 0xe69400e8, 8,
-         { 0, DMAC2_2_DADERR, DMAC2_2_DEI5, DMAC2_2_DEI4,
-           0, 0, 0, 0 } },
-       { /* IMR11A / IMCR11A */ 0xe69400ac, 0xe69400ec, 8,
-         { IIC1_DTEI, IIC1_WAITI, IIC1_TACKI, IIC1_ALI,
-           ICBS0, 0, 0, 0 } },
-       { /* IMR12A / IMCR12A */ 0xe69400b0, 0xe69400f0, 8,
-         { 0, 0, TPU0, SCIFA6,
-           SCIFA7, GbEther, 0, 0 } },
-       { /* IMR13A / IMCR13A */ 0xe69400b4, 0xe69400f4, 8,
-         { SDHI2_3, SDHI2_2, SDHI2_1, SDHI2_0,
-           0, CMT3, 0, RWDT0 } },
-       { /* IMR0A3 / IMCR0A3 */ 0xe6950080, 0xe69500c0, 8,
-         { SHWYSTAT_RT, SHWYSTAT_HS, SHWYSTAT_COM, 0,
-           0, 0, 0, 0 } },
-         /* IMR1A3 / IMCR1A3 */
-       { /* IMR2A3 / IMCR2A3 */ 0xe6950088, 0xe69500c8, 8,
-         { 0, 0, USBH_INT, USBH_OHCI,
-           USBH_EHCI, USBH_PME, USBH_BIND, 0 } },
-         /* IMR3A3 / IMCR3A3 */
-       { /* IMR4A3 / IMCR4A3 */ 0xe6950090, 0xe69500d0, 8,
-         { HDMI, 0, 0, 0,
-           RSPI_OVRF, RSPI_SPTEF, RSPI_SPRF, 0 } },
-       { /* IMR5A3 / IMCR5A3 */ 0xe6950094, 0xe69500d4, 8,
-         { SPU2_0, SPU2_1, FSI, FMSI,
-           0, HDMI_SSS, HDMI_KEY, 0 } },
-       { /* IMR6A3 / IMCR6A3 */ 0xe6950098, 0xe69500d8, 8,
-         { 0, IPMMU, 0, 0,
-           AP_ARM_CTIIRQ, AP_ARM_PMURQ, 0, 0 } },
-       { /* IMR7A3 / IMCR7A3 */ 0xe695009c, 0xe69500dc, 8,
-         { MFIS2, CPORTR2S, CMT14, CMT15,
-           0, MMCIF_0, MMCIF_1, MMCIF_2 } },
-         /* IMR8A3 / IMCR8A3 */
-       { /* IMR9A3 / IMCR9A3 */ 0xe69500a4, 0xe69500e4, 8,
-         { SIM_ERI, SIM_RXI, SIM_TXI, SIM_TEI,
-           STPRO_0, STPRO_1, STPRO_2, STPRO_3 } },
-       { /* IMR10A3 / IMCR10A3 */ 0xe69500a8, 0xe69500e8, 8,
-         { STPRO_4, 0, 0, 0,
-           0, 0, 0, 0 } },
-};
-
-static struct intc_prio_reg intca_prio_registers[] __initdata = {
-       { 0xe6940000, 0, 16, 4, /* IPRAA */ { DMAC3_1, DMAC3_2, CMT2, ICBS0 } },
-       { 0xe6940004, 0, 16, 4, /* IPRBA */ { IRDA, 0, BBIF1, BBIF2 } },
-       { 0xe6940008, 0, 16, 4, /* IPRCA */ { ATAPI, 0, CMT1_1, AP_ARM1 } },
-       { 0xe694000c, 0, 16, 4, /* IPRDA */ { 0, 0, CMT1_2, 0 } },
-       { 0xe6940010, 0, 16, 4, /* IPREA */ { DMAC1_1, MFIS, MFI, USBF } },
-       { 0xe6940014, 0, 16, 4, /* IPRFA */ { KEYSC, DMAC1_2,
-                                             SGX540, CMT1_0 } },
-       { 0xe6940018, 0, 16, 4, /* IPRGA */ { SCIFA0, SCIFA1,
-                                             SCIFA2, SCIFA3 } },
-       { 0xe694001c, 0, 16, 4, /* IPRGH */ { MSIOF2, USBHSDMAC,
-                                             FLCTL, SDHI0 } },
-       { 0xe6940020, 0, 16, 4, /* IPRIA */ { MSIOF1, SCIFA4, 0, IIC1 } },
-       { 0xe6940024, 0, 16, 4, /* IPRJA */ { DMAC2_1, DMAC2_2,
-                                             AP_ARM_L2CINT, 0 } },
-       { 0xe6940028, 0, 16, 4, /* IPRKA */ { 0, CMT1_3, 0, SDHI1 } },
-       { 0xe694002c, 0, 16, 4, /* IPRLA */ { TPU0, SCIFA6,
-                                             SCIFA7, GbEther } },
-       { 0xe6940030, 0, 16, 4, /* IPRMA */ { 0, CMT3, 0, RWDT0 } },
-       { 0xe6940034, 0, 16, 4, /* IPRNA */ { SCIFB, SCIFA5, 0, DDM } },
-       { 0xe6940038, 0, 16, 4, /* IPROA */ { 0, 0, DIRC, SDHI2 } },
-       { 0xe6950000, 0, 16, 4, /* IPRAA3 */ { SHWYSTAT, 0, 0, 0 } },
-                               /* IPRBA3 */
-                               /* IPRCA3 */
-                               /* IPRDA3 */
-       { 0xe6950010, 0, 16, 4, /* IPREA3 */ { USBH1, 0, 0, 0 } },
-       { 0xe6950014, 0, 16, 4, /* IPRFA3 */ { USBH2, 0, 0, 0 } },
-                               /* IPRGA3 */
-                               /* IPRHA3 */
-       { 0xe6950020, 0, 16, 4, /* IPRIA3 */ { HDMI, 0, 0, 0 } },
-       { 0xe6950024, 0, 16, 4, /* IPRJA3 */ { RSPI, 0, 0, 0 } },
-       { 0xe6950028, 0, 16, 4, /* IPRKA3 */ { SPU2, 0, FSI, FMSI } },
-       { 0xe695002c, 0, 16, 4, /* IPRLA3 */ { 0, HDMI_SSS, HDMI_KEY, 0 } },
-       { 0xe6950030, 0, 16, 4, /* IPRMA3 */ { IPMMU, 0, 0, 0 } },
-       { 0xe6950034, 0, 16, 4, /* IPRNA3 */ { AP_ARM2, 0, 0, 0 } },
-       { 0xe6950038, 0, 16, 4, /* IPROA3 */ { MFIS2, CPORTR2S,
-                                              CMT14, CMT15 } },
-       { 0xe695003c, 0, 16, 4, /* IPRPA3 */ { 0, MMCIF_0, MMCIF_1, MMCIF_2 } },
-                               /* IPRQA3 */
-                               /* IPRRA3 */
-       { 0xe6950048, 0, 16, 4, /* IPRSA3 */ { SIM_ERI, SIM_RXI,
-                                              SIM_TXI, SIM_TEI } },
-       { 0xe695004c, 0, 16, 4, /* IPRTA3 */ { STPRO_0, STPRO_1,
-                                              STPRO_2, STPRO_3 } },
-       { 0xe6950050, 0, 16, 4, /* IPRUA3 */ { STPRO_4, 0, 0, 0 } },
-};
-
-static DECLARE_INTC_DESC(intca_desc, "r8a7740-intca",
-                        intca_vectors, intca_groups,
-                        intca_mask_registers, intca_prio_registers,
-                        NULL);
-
-INTC_IRQ_PINS_32(intca_irq_pins, 0xe6900000,
-                INTC_VECT, "r8a7740-intca-irq-pins");
-
-
-/*
- *             INTCS
- */
-enum {
-       UNUSED_INTCS = 0,
-
-       INTCS,
-
-       /* interrupt sources INTCS */
-
-       /* HUDI */
-       /* STPRO */
-       /* RTDMAC(1) */
-       VPU5HA2,
-       _2DG_TRAP, _2DG_GPM_INT, _2DG_CER_INT,
-       /* MFI */
-       /* BBIF2 */
-       VPU5F,
-       _2DG_BRK_INT,
-       /* SGX540 */
-       /* 2DDMAC */
-       /* IPMMU */
-       /* RTDMAC 2 */
-       /* KEYSC */
-       /* MSIOF */
-       IIC0_ALI, IIC0_TACKI, IIC0_WAITI, IIC0_DTEI,
-       TMU0_0, TMU0_1, TMU0_2,
-       CMT0,
-       /* CMT2 */
-       LMB,
-       CTI,
-       VOU,
-       /* RWDT0 */
-       ICB,
-       VIO6C,
-       CEU20, CEU21,
-       JPU,
-       LCDC0,
-       LCRC,
-       /* RTDMAC2(1) */
-       /* RTDMAC2(2) */
-       LCDC1,
-       /* SPU2 */
-       /* FSI */
-       /* FMSI */
-       TMU1_0, TMU1_1, TMU1_2,
-       CMT4,
-       DISP,
-       DSRV,
-       /* MFIS2 */
-       CPORTS2R,
-
-       /* interrupt groups INTCS */
-       _2DG1,
-       IIC0, TMU1,
-};
-
-static struct intc_vect intcs_vectors[] = {
-       /* HUDI */
-       /* STPRO */
-       /* RTDMAC(1) */
-       INTCS_VECT(VPU5HA2,             0x0880),
-       INTCS_VECT(_2DG_TRAP,           0x08A0),
-       INTCS_VECT(_2DG_GPM_INT,        0x08C0),
-       INTCS_VECT(_2DG_CER_INT,        0x08E0),
-       /* MFI */
-       /* BBIF2 */
-       INTCS_VECT(VPU5F,               0x0980),
-       INTCS_VECT(_2DG_BRK_INT,        0x09A0),
-       /* SGX540 */
-       /* 2DDMAC */
-       /* IPMMU */
-       /* RTDMAC(2) */
-       /* KEYSC */
-       /* MSIOF */
-       INTCS_VECT(IIC0_ALI,            0x0E00),
-       INTCS_VECT(IIC0_TACKI,          0x0E20),
-       INTCS_VECT(IIC0_WAITI,          0x0E40),
-       INTCS_VECT(IIC0_DTEI,           0x0E60),
-       INTCS_VECT(TMU0_0,              0x0E80),
-       INTCS_VECT(TMU0_1,              0x0EA0),
-       INTCS_VECT(TMU0_2,              0x0EC0),
-       INTCS_VECT(CMT0,                0x0F00),
-       /* CMT2 */
-       INTCS_VECT(LMB,                 0x0F60),
-       INTCS_VECT(CTI,                 0x0400),
-       INTCS_VECT(VOU,                 0x0420),
-       /* RWDT0 */
-       INTCS_VECT(ICB,                 0x0480),
-       INTCS_VECT(VIO6C,               0x04E0),
-       INTCS_VECT(CEU20,               0x0500),
-       INTCS_VECT(CEU21,               0x0520),
-       INTCS_VECT(JPU,                 0x0560),
-       INTCS_VECT(LCDC0,               0x0580),
-       INTCS_VECT(LCRC,                0x05A0),
-       /* RTDMAC2(1) */
-       /* RTDMAC2(2) */
-       INTCS_VECT(LCDC1,               0x1780),
-       /* SPU2 */
-       /* FSI */
-       /* FMSI */
-       INTCS_VECT(TMU1_0,              0x1900),
-       INTCS_VECT(TMU1_1,              0x1920),
-       INTCS_VECT(TMU1_2,              0x1940),
-       INTCS_VECT(CMT4,                0x1980),
-       INTCS_VECT(DISP,                0x19A0),
-       INTCS_VECT(DSRV,                0x19C0),
-       /* MFIS2 */
-       INTCS_VECT(CPORTS2R,            0x1A20),
-
-       INTC_VECT(INTCS,                0xf80),
-};
-
-static struct intc_group intcs_groups[] __initdata = {
-       INTC_GROUP(_2DG1, /*FIXME*/
-                  _2DG_CER_INT, _2DG_GPM_INT, _2DG_TRAP),
-       INTC_GROUP(IIC0,
-                  IIC0_DTEI, IIC0_WAITI, IIC0_TACKI, IIC0_ALI),
-       INTC_GROUP(TMU1,
-                  TMU1_0, TMU1_1, TMU1_2),
-};
-
-static struct intc_mask_reg intcs_mask_registers[] = {
-         /* IMR0SA / IMCR0SA */ /* all 0 */
-       { /* IMR1SA / IMCR1SA */ 0xffd20184, 0xffd201c4, 8,
-         { _2DG_CER_INT, _2DG_GPM_INT, _2DG_TRAP, VPU5HA2,
-           0, 0, 0, 0 /*STPRO*/ } },
-       { /* IMR2SA / IMCR2SA */ 0xffd20188, 0xffd201c8, 8,
-         { 0/*STPRO*/, 0, CEU21, VPU5F,
-           0/*BBIF2*/, 0, 0, 0/*MFI*/ } },
-       { /* IMR3SA / IMCR3SA */ 0xffd2018c, 0xffd201cc, 8,
-         { 0, 0, 0, 0, /*2DDMAC*/
-           VIO6C, 0, 0, ICB } },
-       { /* IMR4SA / IMCR4SA */ 0xffd20190, 0xffd201d0, 8,
-         { 0, 0, VOU, CTI,
-           JPU, 0, LCRC, LCDC0 } },
-         /* IMR5SA / IMCR5SA */ /*KEYSC/RTDMAC2/RTDMAC1*/
-         /* IMR6SA / IMCR6SA */ /*MSIOF/SGX540*/
-       { /* IMR7SA / IMCR7SA */ 0xffd2019c, 0xffd201dc, 8,
-         { 0, TMU0_2, TMU0_1, TMU0_0,
-           0, 0, 0, 0 } },
-       { /* IMR8SA / IMCR8SA */ 0xffd201a0, 0xffd201e0, 8,
-         { 0, 0, 0, 0,
-           CEU20, 0, 0, 0 } },
-       { /* IMR9SA / IMCR9SA */ 0xffd201a4, 0xffd201e4, 8,
-         { 0, 0/*RWDT0*/, 0/*CMT2*/, CMT0,
-           0, 0, 0, 0 } },
-         /* IMR10SA / IMCR10SA */ /*IPMMU*/
-       { /* IMR11SA / IMCR11SA */ 0xffd201ac, 0xffd201ec, 8,
-         { IIC0_DTEI, IIC0_WAITI, IIC0_TACKI, IIC0_ALI,
-           0, _2DG_BRK_INT, LMB, 0 } },
-         /* IMR12SA / IMCR12SA */
-         /* IMR13SA / IMCR13SA */
-         /* IMR0SA3 / IMCR0SA3 */ /*RTDMAC2(1)/RTDMAC2(2)*/
-         /* IMR1SA3 / IMCR1SA3 */
-         /* IMR2SA3 / IMCR2SA3 */
-         /* IMR3SA3 / IMCR3SA3 */
-       { /* IMR4SA3 / IMCR4SA3 */ 0xffd50190, 0xffd501d0, 8,
-         { 0, 0, 0, 0,
-           LCDC1, 0, 0, 0 } },
-         /* IMR5SA3 / IMCR5SA3 */ /* SPU2/FSI/FMSI */
-       { /* IMR6SA3 / IMCR6SA3 */ 0xffd50198, 0xffd501d8, 8,
-         { TMU1_0, TMU1_1, TMU1_2, 0,
-           CMT4, DISP, DSRV, 0 } },
-       { /* IMR7SA3 / IMCR7SA3 */ 0xffd5019c, 0xffd501dc, 8,
-         { 0/*MFIS2*/, CPORTS2R, 0, 0,
-           0, 0, 0, 0 } },
-       { /* INTAMASK */ 0xffd20104, 0, 16,
-         { 0, 0, 0, 0, 0, 0, 0, 0,
-           0, 0, 0, 0, 0, 0, 0, INTCS } },
-};
-
-/* Priority is needed for INTCA to receive the INTCS interrupt */
-static struct intc_prio_reg intcs_prio_registers[] = {
-       { 0xffd20000, 0, 16, 4, /* IPRAS */ { CTI, VOU, 0/*2DDMAC*/, ICB } },
-       { 0xffd20004, 0, 16, 4, /* IPRBS */ { JPU, LCDC0, 0, LCRC } },
-                               /* IPRCS */ /*BBIF2*/
-                               /* IPRDS */
-       { 0xffd20010, 0, 16, 4, /* IPRES */ { 0/*RTDMAC(1)*/, VPU5HA2,
-                                             0/*MFI*/, VPU5F } },
-       { 0xffd20014, 0, 16, 4, /* IPRFS */ { 0/*KEYSC*/, 0/*RTDMAC(2)*/,
-                                             0/*CMT2*/, CMT0 } },
-       { 0xffd20018, 0, 16, 4, /* IPRGS */ { TMU0_0, TMU0_1,
-                                             TMU0_2, _2DG1 } },
-       { 0xffd2001c, 0, 16, 4, /* IPRHS */ { 0, 0/*STPRO*/, 0/*STPRO*/,
-                                             _2DG_BRK_INT/*FIXME*/ } },
-       { 0xffd20020, 0, 16, 4, /* IPRIS */ { 0, 0/*MSIOF*/, 0, IIC0 } },
-       { 0xffd20024, 0, 16, 4, /* IPRJS */ { CEU20, 0/*SGX540*/, 0, 0 } },
-       { 0xffd20028, 0, 16, 4, /* IPRKS */ { VIO6C, 0, LMB, 0 } },
-       { 0xffd2002c, 0, 16, 4, /* IPRLS */ { 0/*IPMMU*/, 0, CEU21, 0 } },
-                               /* IPRMS */ /*RWDT0*/
-                               /* IPRAS3 */ /*RTDMAC2(1)*/
-                               /* IPRBS3 */ /*RTDMAC2(2)*/
-                               /* IPRCS3 */
-                               /* IPRDS3 */
-                               /* IPRES3 */
-                               /* IPRFS3 */
-                               /* IPRGS3 */
-                               /* IPRHS3 */
-                               /* IPRIS3 */
-       { 0xffd50024, 0, 16, 4, /* IPRJS3 */ { LCDC1, 0, 0, 0 } },
-                               /* IPRKS3 */ /*SPU2/FSI/FMSi*/
-                               /* IPRLS3 */
-       { 0xffd50030, 0, 16, 4, /* IPRMS3 */ { TMU1, 0, 0, 0 } },
-       { 0xffd50034, 0, 16, 4, /* IPRNS3 */ { CMT4, DISP, DSRV, 0 } },
-       { 0xffd50038, 0, 16, 4, /* IPROS3 */ { 0/*MFIS2*/, CPORTS2R, 0, 0 } },
-                               /* IPRPS3 */
-};
-
-static struct resource intcs_resources[] __initdata = {
-       [0] = {
-               .start  = 0xffd20000,
-               .end    = 0xffd201ff,
-               .flags  = IORESOURCE_MEM,
-       },
-       [1] = {
-               .start  = 0xffd50000,
-               .end    = 0xffd501ff,
-               .flags  = IORESOURCE_MEM,
-       }
-};
-
-static struct intc_desc intcs_desc __initdata = {
-       .name = "r8a7740-intcs",
-       .resource = intcs_resources,
-       .num_resources = ARRAY_SIZE(intcs_resources),
-       .hw = INTC_HW_DESC(intcs_vectors, intcs_groups, intcs_mask_registers,
-                          intcs_prio_registers, NULL, NULL),
-};
-
-static void intcs_demux(unsigned int irq, struct irq_desc *desc)
-{
-       void __iomem *reg = (void *)irq_get_handler_data(irq);
-       unsigned int evtcodeas = ioread32(reg);
-
-       generic_handle_irq(intcs_evt2irq(evtcodeas));
-}
+#include <linux/irqchip/arm-gic.h>
 
 void __init r8a7740_init_irq(void)
 {
-       void __iomem *intevtsa = ioremap_nocache(0xffd20100, PAGE_SIZE);
-
-       register_intc_controller(&intca_desc);
-       register_intc_controller(&intca_irq_pins_desc);
-       register_intc_controller(&intcs_desc);
-
-       /* demux using INTEVTSA */
-       irq_set_handler_data(evt2irq(0xf80), (void *)intevtsa);
-       irq_set_chained_handler(evt2irq(0xf80), intcs_demux);
+       void __iomem *gic_dist_base = ioremap_nocache(0xc2800000, 0x1000);
+       void __iomem *gic_cpu_base = ioremap_nocache(0xc2000000, 0x1000);
+       void __iomem *intc_prio_base = ioremap_nocache(0xe6900010, 0x10);
+       void __iomem *intc_msk_base = ioremap_nocache(0xe6900040, 0x10);
+       void __iomem *pfc_inta_ctrl = ioremap_nocache(0xe605807c, 0x4);
+
+       /* initialize the Generic Interrupt Controller PL390 r0p0 */
+       gic_init(0, 29, gic_dist_base, gic_cpu_base);
+
+       /* route signals to GIC */
+       iowrite32(0x0, pfc_inta_ctrl);
+
+       /*
+        * To mask the shared interrupt to SPI 149 we must ensure to set
+        * PRIO *and* MASK. Else we run into IRQ floods when registering
+        * the intc_irqpin devices
+        */
+       iowrite32(0x0, intc_prio_base + 0x0);
+       iowrite32(0x0, intc_prio_base + 0x4);
+       iowrite32(0x0, intc_prio_base + 0x8);
+       iowrite32(0x0, intc_prio_base + 0xc);
+       iowrite8(0xff, intc_msk_base + 0x0);
+       iowrite8(0xff, intc_msk_base + 0x4);
+       iowrite8(0xff, intc_msk_base + 0x8);
+       iowrite8(0xff, intc_msk_base + 0xc);
+
+       iounmap(intc_prio_base);
+       iounmap(intc_msk_base);
+       iounmap(pfc_inta_ctrl);
 }
index 8807c27f71f968c15721af91f099b3ee4771cad7..b86dc8908724f3cb38a651897623b021aeb37c28 100644 (file)
  */
 #include <linux/kernel.h>
 #include <linux/init.h>
+#include <linux/platform_device.h>
 #include <linux/interrupt.h>
 #include <linux/irq.h>
 #include <linux/io.h>
 #include <linux/irqchip/arm-gic.h>
+#include <linux/platform_data/irq-renesas-intc-irqpin.h>
+#include <linux/irqchip.h>
 #include <mach/common.h>
 #include <mach/intc.h>
+#include <mach/irqs.h>
 #include <mach/r8a7779.h>
 #include <asm/mach-types.h>
 #include <asm/mach/arch.h>
 #define INT2NTSR0 IOMEM(0xfe700060)
 #define INT2NTSR1 IOMEM(0xfe700064)
 
+static struct renesas_intc_irqpin_config irqpin0_platform_data = {
+       .irq_base = irq_pin(0), /* IRQ0 -> IRQ3 */
+       .sense_bitfield_width = 2,
+};
+
+static struct resource irqpin0_resources[] = {
+       DEFINE_RES_MEM(0xfe78001c, 4), /* ICR1 */
+       DEFINE_RES_MEM(0xfe780010, 4), /* INTPRI */
+       DEFINE_RES_MEM(0xfe780024, 4), /* INTREQ */
+       DEFINE_RES_MEM(0xfe780044, 4), /* INTMSK0 */
+       DEFINE_RES_MEM(0xfe780064, 4), /* INTMSKCLR0 */
+       DEFINE_RES_IRQ(gic_spi(27)), /* IRQ0 */
+       DEFINE_RES_IRQ(gic_spi(28)), /* IRQ1 */
+       DEFINE_RES_IRQ(gic_spi(29)), /* IRQ2 */
+       DEFINE_RES_IRQ(gic_spi(30)), /* IRQ3 */
+};
+
+static struct platform_device irqpin0_device = {
+       .name           = "renesas_intc_irqpin",
+       .id             = 0,
+       .resource       = irqpin0_resources,
+       .num_resources  = ARRAY_SIZE(irqpin0_resources),
+       .dev            = {
+               .platform_data  = &irqpin0_platform_data,
+       },
+};
+
+void __init r8a7779_init_irq_extpin(int irlm)
+{
+       void __iomem *icr0 = ioremap_nocache(0xfe780000, PAGE_SIZE);
+       unsigned long tmp;
+
+       if (icr0) {
+               tmp = ioread32(icr0);
+               if (irlm)
+                       tmp |= 1 << 23; /* IRQ0 -> IRQ3 as individual pins */
+               else
+                       tmp &= ~(1 << 23); /* IRL mode - not supported */
+               tmp |= (1 << 21); /* LVLMODE = 1 */
+               iowrite32(tmp, icr0);
+               iounmap(icr0);
+
+               if (irlm)
+                       platform_device_register(&irqpin0_device);
+       } else
+               pr_warn("r8a7779: unable to setup external irq pin mode\n");
+}
+
 static int r8a7779_set_wake(struct irq_data *data, unsigned int on)
 {
        return 0; /* always allow wakeup */
 }
 
-void __init r8a7779_init_irq(void)
+static void __init r8a7779_init_irq_common(void)
 {
-       void __iomem *gic_dist_base = IOMEM(0xf0001000);
-       void __iomem *gic_cpu_base = IOMEM(0xf0000100);
-
-       /* use GIC to handle interrupts */
-       gic_init(0, 29, gic_dist_base, gic_cpu_base);
        gic_arch_extn.irq_set_wake = r8a7779_set_wake;
 
        /* route all interrupts to ARM */
@@ -63,3 +110,22 @@ void __init r8a7779_init_irq(void)
        __raw_writel(0xbffffffc, INT2SMSKCR3);
        __raw_writel(0x003fee3f, INT2SMSKCR4);
 }
+
+void __init r8a7779_init_irq(void)
+{
+       void __iomem *gic_dist_base = IOMEM(0xf0001000);
+       void __iomem *gic_cpu_base = IOMEM(0xf0000100);
+
+       /* use GIC to handle interrupts */
+       gic_init(0, 29, gic_dist_base, gic_cpu_base);
+
+       r8a7779_init_irq_common();
+}
+
+#ifdef CONFIG_OF
+void __init r8a7779_init_irq_dt(void)
+{
+       irqchip_init();
+       r8a7779_init_irq_common();
+}
+#endif
index 91faba666d462916ec37822450b127674e8446db..19a26f4579b31e47b2437b2fe4128c7dc7dd6a3d 100644 (file)
@@ -260,108 +260,6 @@ static int sh73a0_set_wake(struct irq_data *data, unsigned int on)
        return 0; /* always allow wakeup */
 }
 
-#define RELOC_BASE 0x1200
-
-/* INTCA IRQ pins at INTCS + RELOC_BASE to make space for GIC+INTC handling */
-#define INTCS_VECT_RELOC(n, vect) INTCS_VECT((n), (vect) + RELOC_BASE)
-
-INTC_IRQ_PINS_32(intca_irq_pins, 0xe6900000,
-                INTCS_VECT_RELOC, "sh73a0-intca-irq-pins");
-
-static int to_gic_irq(struct irq_data *data)
-{
-       unsigned int vect = irq2evt(data->irq) - INTCS_VECT_BASE;
-
-       if (vect >= 0x3200)
-               vect -= 0x3000;
-       else
-               vect -= 0x0200;
-
-       return gic_spi((vect >> 5) + 1);
-}
-
-static int to_intca_reloc_irq(struct irq_data *data)
-{
-       return data->irq + (RELOC_BASE >> 5);
-}
-
-#define irq_cb(cb, irq) irq_get_chip(irq)->cb(irq_get_irq_data(irq))
-#define irq_cbp(cb, irq, p...) irq_get_chip(irq)->cb(irq_get_irq_data(irq), p)
-
-static void intca_gic_enable(struct irq_data *data)
-{
-       irq_cb(irq_unmask, to_intca_reloc_irq(data));
-       irq_cb(irq_unmask, to_gic_irq(data));
-}
-
-static void intca_gic_disable(struct irq_data *data)
-{
-       irq_cb(irq_mask, to_gic_irq(data));
-       irq_cb(irq_mask, to_intca_reloc_irq(data));
-}
-
-static void intca_gic_mask_ack(struct irq_data *data)
-{
-       irq_cb(irq_mask, to_gic_irq(data));
-       irq_cb(irq_mask_ack, to_intca_reloc_irq(data));
-}
-
-static void intca_gic_eoi(struct irq_data *data)
-{
-       irq_cb(irq_eoi, to_gic_irq(data));
-}
-
-static int intca_gic_set_type(struct irq_data *data, unsigned int type)
-{
-       return irq_cbp(irq_set_type, to_intca_reloc_irq(data), type);
-}
-
-#ifdef CONFIG_SMP
-static int intca_gic_set_affinity(struct irq_data *data,
-                                 const struct cpumask *cpumask,
-                                 bool force)
-{
-       return irq_cbp(irq_set_affinity, to_gic_irq(data), cpumask, force);
-}
-#endif
-
-struct irq_chip intca_gic_irq_chip = {
-       .name                   = "INTCA-GIC",
-       .irq_mask               = intca_gic_disable,
-       .irq_unmask             = intca_gic_enable,
-       .irq_mask_ack           = intca_gic_mask_ack,
-       .irq_eoi                = intca_gic_eoi,
-       .irq_enable             = intca_gic_enable,
-       .irq_disable            = intca_gic_disable,
-       .irq_shutdown           = intca_gic_disable,
-       .irq_set_type           = intca_gic_set_type,
-       .irq_set_wake           = sh73a0_set_wake,
-#ifdef CONFIG_SMP
-       .irq_set_affinity       = intca_gic_set_affinity,
-#endif
-};
-
-static int to_intc_vect(int irq)
-{
-       unsigned int irq_pin = irq - gic_spi(1);
-       unsigned int offs;
-
-       if (irq_pin < 16)
-               offs = 0x0200;
-       else
-               offs = 0x3000;
-
-       return offs + (irq_pin << 5);
-}
-
-static irqreturn_t sh73a0_irq_pin_demux(int irq, void *dev_id)
-{
-       generic_handle_irq(intcs_evt2irq(to_intc_vect(irq)));
-       return IRQ_HANDLED;
-}
-
-static struct irqaction sh73a0_irq_pin_cascade[32];
-
 #define PINTER0_PHYS 0xe69000a0
 #define PINTER1_PHYS 0xe69000a4
 #define PINTER0_VIRT IOMEM(0xe69000a0)
@@ -422,13 +320,11 @@ void __init sh73a0_init_irq(void)
        void __iomem *gic_dist_base = IOMEM(0xf0001000);
        void __iomem *gic_cpu_base = IOMEM(0xf0000100);
        void __iomem *intevtsa = ioremap_nocache(0xffd20100, PAGE_SIZE);
-       int k, n;
 
        gic_init(0, 29, gic_dist_base, gic_cpu_base);
        gic_arch_extn.irq_set_wake = sh73a0_set_wake;
 
        register_intc_controller(&intcs_desc);
-       register_intc_controller(&intca_irq_pins_desc);
        register_intc_controller(&intc_pint0_desc);
        register_intc_controller(&intc_pint1_desc);
 
@@ -438,19 +334,6 @@ void __init sh73a0_init_irq(void)
        sh73a0_intcs_cascade.dev_id = intevtsa;
        setup_irq(gic_spi(50), &sh73a0_intcs_cascade);
 
-       /* IRQ pins require special handling through INTCA and GIC */
-       for (k = 0; k < 32; k++) {
-               sh73a0_irq_pin_cascade[k].name = "INTCA-GIC cascade";
-               sh73a0_irq_pin_cascade[k].handler = sh73a0_irq_pin_demux;
-               setup_irq(gic_spi(1 + k), &sh73a0_irq_pin_cascade[k]);
-
-               n = intcs_evt2irq(to_intc_vect(gic_spi(1 + k)));
-               WARN_ON(irq_alloc_desc_at(n, numa_node_id()) != n);
-               irq_set_chip_and_handler_name(n, &intca_gic_irq_chip,
-                                             handle_level_irq, "level");
-               set_irq_flags(n, IRQF_VALID); /* yuck */
-       }
-
        /* PINT pins are sanely tied to the GIC as SPI */
        sh73a0_pint0_cascade.name = "PINT0 cascade";
        sh73a0_pint0_cascade.handler = sh73a0_pint0_demux;
@@ -460,11 +343,3 @@ void __init sh73a0_init_irq(void)
        sh73a0_pint1_cascade.handler = sh73a0_pint1_demux;
        setup_irq(gic_spi(34), &sh73a0_pint1_cascade);
 }
-
-#ifdef CONFIG_OF
-void __init sh73a0_init_irq_dt(void)
-{
-       irqchip_init();
-       gic_arch_extn.irq_set_wake = sh73a0_set_wake;
-}
-#endif
index 47662a581c0a59d172529f06970b4e2ecb271e3d..e4545c152722e3361fd273fefb90c54f26753dea 100644 (file)
@@ -404,7 +404,7 @@ void __init emev2_add_standard_devices(void)
                             ARRAY_SIZE(emev2_late_devices));
 }
 
-void __init emev2_init_delay(void)
+static void __init emev2_init_delay(void)
 {
        shmobile_setup_delay(533, 1, 3); /* Cortex-A9 @ 533MHz */
 }
@@ -439,7 +439,7 @@ static const struct of_dev_auxdata emev2_auxdata_lookup[] __initconst = {
        { }
 };
 
-void __init emev2_add_standard_devices_dt(void)
+static void __init emev2_add_standard_devices_dt(void)
 {
        of_platform_populate(NULL, of_default_bus_match_table,
                             emev2_auxdata_lookup, NULL);
diff --git a/arch/arm/mach-shmobile/setup-r8a73a4.c b/arch/arm/mach-shmobile/setup-r8a73a4.c
new file mode 100644 (file)
index 0000000..c5a75a7
--- /dev/null
@@ -0,0 +1,202 @@
+/*
+ * r8a73a4 processor support
+ *
+ * Copyright (C) 2013  Renesas Solutions Corp.
+ * Copyright (C) 2013  Magnus Damm
+ *
+ * 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 of the License.
+ *
+ * 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., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ */
+#include <linux/irq.h>
+#include <linux/irqchip.h>
+#include <linux/kernel.h>
+#include <linux/of_platform.h>
+#include <linux/platform_data/irq-renesas-irqc.h>
+#include <linux/serial_sci.h>
+#include <mach/common.h>
+#include <mach/irqs.h>
+#include <mach/r8a73a4.h>
+#include <asm/mach/arch.h>
+
+static const struct resource pfc_resources[] = {
+       DEFINE_RES_MEM(0xe6050000, 0x9000),
+};
+
+void __init r8a73a4_pinmux_init(void)
+{
+       platform_device_register_simple("pfc-r8a73a4", -1, pfc_resources,
+                                       ARRAY_SIZE(pfc_resources));
+}
+
+#define SCIF_COMMON(scif_type, baseaddr, irq)                  \
+       .type           = scif_type,                            \
+       .mapbase        = baseaddr,                             \
+       .flags          = UPF_BOOT_AUTOCONF | UPF_IOREMAP,      \
+       .scbrr_algo_id  = SCBRR_ALGO_4,                         \
+       .irqs           = SCIx_IRQ_MUXED(irq)
+
+#define SCIFA_DATA(index, baseaddr, irq)               \
+[index] = {                                            \
+       SCIF_COMMON(PORT_SCIFA, baseaddr, irq),         \
+       .scscr = SCSCR_RE | SCSCR_TE | SCSCR_CKE0,      \
+}
+
+#define SCIFB_DATA(index, baseaddr, irq)       \
+[index] = {                                    \
+       SCIF_COMMON(PORT_SCIFB, baseaddr, irq), \
+       .scscr = SCSCR_RE | SCSCR_TE,           \
+}
+
+enum { SCIFA0, SCIFA1, SCIFB0, SCIFB1, SCIFB2, SCIFB3 };
+
+static const struct plat_sci_port scif[] = {
+       SCIFA_DATA(SCIFA0, 0xe6c40000, gic_spi(144)), /* SCIFA0 */
+       SCIFA_DATA(SCIFA1, 0xe6c50000, gic_spi(145)), /* SCIFA1 */
+       SCIFB_DATA(SCIFB0, 0xe6c50000, gic_spi(145)), /* SCIFB0 */
+       SCIFB_DATA(SCIFB1, 0xe6c30000, gic_spi(149)), /* SCIFB1 */
+       SCIFB_DATA(SCIFB2, 0xe6ce0000, gic_spi(150)), /* SCIFB2 */
+       SCIFB_DATA(SCIFB3, 0xe6cf0000, gic_spi(151)), /* SCIFB3 */
+};
+
+static inline void r8a73a4_register_scif(int idx)
+{
+       platform_device_register_data(&platform_bus, "sh-sci", idx, &scif[idx],
+                                     sizeof(struct plat_sci_port));
+}
+
+static const struct renesas_irqc_config irqc0_data = {
+       .irq_base = irq_pin(0), /* IRQ0 -> IRQ31 */
+};
+
+static const struct resource irqc0_resources[] = {
+       DEFINE_RES_MEM(0xe61c0000, 0x200), /* IRQC Event Detector Block_0 */
+       DEFINE_RES_IRQ(gic_spi(0)), /* IRQ0 */
+       DEFINE_RES_IRQ(gic_spi(1)), /* IRQ1 */
+       DEFINE_RES_IRQ(gic_spi(2)), /* IRQ2 */
+       DEFINE_RES_IRQ(gic_spi(3)), /* IRQ3 */
+       DEFINE_RES_IRQ(gic_spi(4)), /* IRQ4 */
+       DEFINE_RES_IRQ(gic_spi(5)), /* IRQ5 */
+       DEFINE_RES_IRQ(gic_spi(6)), /* IRQ6 */
+       DEFINE_RES_IRQ(gic_spi(7)), /* IRQ7 */
+       DEFINE_RES_IRQ(gic_spi(8)), /* IRQ8 */
+       DEFINE_RES_IRQ(gic_spi(9)), /* IRQ9 */
+       DEFINE_RES_IRQ(gic_spi(10)), /* IRQ10 */
+       DEFINE_RES_IRQ(gic_spi(11)), /* IRQ11 */
+       DEFINE_RES_IRQ(gic_spi(12)), /* IRQ12 */
+       DEFINE_RES_IRQ(gic_spi(13)), /* IRQ13 */
+       DEFINE_RES_IRQ(gic_spi(14)), /* IRQ14 */
+       DEFINE_RES_IRQ(gic_spi(15)), /* IRQ15 */
+       DEFINE_RES_IRQ(gic_spi(16)), /* IRQ16 */
+       DEFINE_RES_IRQ(gic_spi(17)), /* IRQ17 */
+       DEFINE_RES_IRQ(gic_spi(18)), /* IRQ18 */
+       DEFINE_RES_IRQ(gic_spi(19)), /* IRQ19 */
+       DEFINE_RES_IRQ(gic_spi(20)), /* IRQ20 */
+       DEFINE_RES_IRQ(gic_spi(21)), /* IRQ21 */
+       DEFINE_RES_IRQ(gic_spi(22)), /* IRQ22 */
+       DEFINE_RES_IRQ(gic_spi(23)), /* IRQ23 */
+       DEFINE_RES_IRQ(gic_spi(24)), /* IRQ24 */
+       DEFINE_RES_IRQ(gic_spi(25)), /* IRQ25 */
+       DEFINE_RES_IRQ(gic_spi(26)), /* IRQ26 */
+       DEFINE_RES_IRQ(gic_spi(27)), /* IRQ27 */
+       DEFINE_RES_IRQ(gic_spi(28)), /* IRQ28 */
+       DEFINE_RES_IRQ(gic_spi(29)), /* IRQ29 */
+       DEFINE_RES_IRQ(gic_spi(30)), /* IRQ30 */
+       DEFINE_RES_IRQ(gic_spi(31)), /* IRQ31 */
+};
+
+static const struct renesas_irqc_config irqc1_data = {
+       .irq_base = irq_pin(32), /* IRQ32 -> IRQ57 */
+};
+
+static const struct resource irqc1_resources[] = {
+       DEFINE_RES_MEM(0xe61c0200, 0x200), /* IRQC Event Detector Block_1 */
+       DEFINE_RES_IRQ(gic_spi(32)), /* IRQ32 */
+       DEFINE_RES_IRQ(gic_spi(33)), /* IRQ33 */
+       DEFINE_RES_IRQ(gic_spi(34)), /* IRQ34 */
+       DEFINE_RES_IRQ(gic_spi(35)), /* IRQ35 */
+       DEFINE_RES_IRQ(gic_spi(36)), /* IRQ36 */
+       DEFINE_RES_IRQ(gic_spi(37)), /* IRQ37 */
+       DEFINE_RES_IRQ(gic_spi(38)), /* IRQ38 */
+       DEFINE_RES_IRQ(gic_spi(39)), /* IRQ39 */
+       DEFINE_RES_IRQ(gic_spi(40)), /* IRQ40 */
+       DEFINE_RES_IRQ(gic_spi(41)), /* IRQ41 */
+       DEFINE_RES_IRQ(gic_spi(42)), /* IRQ42 */
+       DEFINE_RES_IRQ(gic_spi(43)), /* IRQ43 */
+       DEFINE_RES_IRQ(gic_spi(44)), /* IRQ44 */
+       DEFINE_RES_IRQ(gic_spi(45)), /* IRQ45 */
+       DEFINE_RES_IRQ(gic_spi(46)), /* IRQ46 */
+       DEFINE_RES_IRQ(gic_spi(47)), /* IRQ47 */
+       DEFINE_RES_IRQ(gic_spi(48)), /* IRQ48 */
+       DEFINE_RES_IRQ(gic_spi(49)), /* IRQ49 */
+       DEFINE_RES_IRQ(gic_spi(50)), /* IRQ50 */
+       DEFINE_RES_IRQ(gic_spi(51)), /* IRQ51 */
+       DEFINE_RES_IRQ(gic_spi(52)), /* IRQ52 */
+       DEFINE_RES_IRQ(gic_spi(53)), /* IRQ53 */
+       DEFINE_RES_IRQ(gic_spi(54)), /* IRQ54 */
+       DEFINE_RES_IRQ(gic_spi(55)), /* IRQ55 */
+       DEFINE_RES_IRQ(gic_spi(56)), /* IRQ56 */
+       DEFINE_RES_IRQ(gic_spi(57)), /* IRQ57 */
+};
+
+#define r8a73a4_register_irqc(idx)                                     \
+       platform_device_register_resndata(&platform_bus, "renesas_irqc", \
+                                         idx, irqc##idx##_resources,   \
+                                         ARRAY_SIZE(irqc##idx##_resources), \
+                                         &irqc##idx##_data,            \
+                                         sizeof(struct renesas_irqc_config))
+
+/* Thermal0 -> Thermal2 */
+static const struct resource thermal0_resources[] = {
+       DEFINE_RES_MEM(0xe61f0000, 0x14),
+       DEFINE_RES_MEM(0xe61f0100, 0x38),
+       DEFINE_RES_MEM(0xe61f0200, 0x38),
+       DEFINE_RES_MEM(0xe61f0300, 0x38),
+       DEFINE_RES_IRQ(gic_spi(69)),
+};
+
+#define r8a73a4_register_thermal()                                     \
+       platform_device_register_simple("rcar_thermal", -1,             \
+                                       thermal0_resources,             \
+                                       ARRAY_SIZE(thermal0_resources))
+
+void __init r8a73a4_add_standard_devices(void)
+{
+       r8a73a4_register_scif(SCIFA0);
+       r8a73a4_register_scif(SCIFA1);
+       r8a73a4_register_scif(SCIFB0);
+       r8a73a4_register_scif(SCIFB1);
+       r8a73a4_register_scif(SCIFB2);
+       r8a73a4_register_scif(SCIFB3);
+       r8a73a4_register_irqc(0);
+       r8a73a4_register_irqc(1);
+       r8a73a4_register_thermal();
+}
+
+#ifdef CONFIG_USE_OF
+void __init r8a73a4_add_standard_devices_dt(void)
+{
+       of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
+}
+
+static const char *r8a73a4_boards_compat_dt[] __initdata = {
+       "renesas,r8a73a4",
+       NULL,
+};
+
+DT_MACHINE_START(R8A73A4_DT, "Generic R8A73A4 (Flattened Device Tree)")
+       .init_irq       = irqchip_init,
+       .init_machine   = r8a73a4_add_standard_devices_dt,
+       .init_time      = shmobile_timer_init,
+       .dt_compat      = r8a73a4_boards_compat_dt,
+MACHINE_END
+#endif /* CONFIG_USE_OF */
index 8b85d4d8fab6692861dbd7a642b7a803ef8afbd6..228d7aba4a7ce390682bd22653117d25958a20c6 100644 (file)
@@ -22,6 +22,7 @@
 #include <linux/kernel.h>
 #include <linux/init.h>
 #include <linux/io.h>
+#include <linux/platform_data/irq-renesas-intc-irqpin.h>
 #include <linux/platform_device.h>
 #include <linux/of_platform.h>
 #include <linux/serial_sci.h>
@@ -94,6 +95,126 @@ void __init r8a7740_pinmux_init(void)
        platform_device_register(&r8a7740_pfc_device);
 }
 
+static struct renesas_intc_irqpin_config irqpin0_platform_data = {
+       .irq_base = irq_pin(0), /* IRQ0 -> IRQ7 */
+};
+
+static struct resource irqpin0_resources[] = {
+       DEFINE_RES_MEM(0xe6900000, 4), /* ICR1A */
+       DEFINE_RES_MEM(0xe6900010, 4), /* INTPRI00A */
+       DEFINE_RES_MEM(0xe6900020, 1), /* INTREQ00A */
+       DEFINE_RES_MEM(0xe6900040, 1), /* INTMSK00A */
+       DEFINE_RES_MEM(0xe6900060, 1), /* INTMSKCLR00A */
+       DEFINE_RES_IRQ(gic_spi(149)), /* IRQ0 */
+       DEFINE_RES_IRQ(gic_spi(149)), /* IRQ1 */
+       DEFINE_RES_IRQ(gic_spi(149)), /* IRQ2 */
+       DEFINE_RES_IRQ(gic_spi(149)), /* IRQ3 */
+       DEFINE_RES_IRQ(gic_spi(149)), /* IRQ4 */
+       DEFINE_RES_IRQ(gic_spi(149)), /* IRQ5 */
+       DEFINE_RES_IRQ(gic_spi(149)), /* IRQ6 */
+       DEFINE_RES_IRQ(gic_spi(149)), /* IRQ7 */
+};
+
+static struct platform_device irqpin0_device = {
+       .name           = "renesas_intc_irqpin",
+       .id             = 0,
+       .resource       = irqpin0_resources,
+       .num_resources  = ARRAY_SIZE(irqpin0_resources),
+       .dev            = {
+               .platform_data  = &irqpin0_platform_data,
+       },
+};
+
+static struct renesas_intc_irqpin_config irqpin1_platform_data = {
+       .irq_base = irq_pin(8), /* IRQ8 -> IRQ15 */
+};
+
+static struct resource irqpin1_resources[] = {
+       DEFINE_RES_MEM(0xe6900004, 4), /* ICR2A */
+       DEFINE_RES_MEM(0xe6900014, 4), /* INTPRI10A */
+       DEFINE_RES_MEM(0xe6900024, 1), /* INTREQ10A */
+       DEFINE_RES_MEM(0xe6900044, 1), /* INTMSK10A */
+       DEFINE_RES_MEM(0xe6900064, 1), /* INTMSKCLR10A */
+       DEFINE_RES_IRQ(gic_spi(149)), /* IRQ8 */
+       DEFINE_RES_IRQ(gic_spi(149)), /* IRQ9 */
+       DEFINE_RES_IRQ(gic_spi(149)), /* IRQ10 */
+       DEFINE_RES_IRQ(gic_spi(149)), /* IRQ11 */
+       DEFINE_RES_IRQ(gic_spi(149)), /* IRQ12 */
+       DEFINE_RES_IRQ(gic_spi(149)), /* IRQ13 */
+       DEFINE_RES_IRQ(gic_spi(149)), /* IRQ14 */
+       DEFINE_RES_IRQ(gic_spi(149)), /* IRQ15 */
+};
+
+static struct platform_device irqpin1_device = {
+       .name           = "renesas_intc_irqpin",
+       .id             = 1,
+       .resource       = irqpin1_resources,
+       .num_resources  = ARRAY_SIZE(irqpin1_resources),
+       .dev            = {
+               .platform_data  = &irqpin1_platform_data,
+       },
+};
+
+static struct renesas_intc_irqpin_config irqpin2_platform_data = {
+       .irq_base = irq_pin(16), /* IRQ16 -> IRQ23 */
+};
+
+static struct resource irqpin2_resources[] = {
+       DEFINE_RES_MEM(0xe6900008, 4), /* ICR3A */
+       DEFINE_RES_MEM(0xe6900018, 4), /* INTPRI30A */
+       DEFINE_RES_MEM(0xe6900028, 1), /* INTREQ30A */
+       DEFINE_RES_MEM(0xe6900048, 1), /* INTMSK30A */
+       DEFINE_RES_MEM(0xe6900068, 1), /* INTMSKCLR30A */
+       DEFINE_RES_IRQ(gic_spi(149)), /* IRQ16 */
+       DEFINE_RES_IRQ(gic_spi(149)), /* IRQ17 */
+       DEFINE_RES_IRQ(gic_spi(149)), /* IRQ18 */
+       DEFINE_RES_IRQ(gic_spi(149)), /* IRQ19 */
+       DEFINE_RES_IRQ(gic_spi(149)), /* IRQ20 */
+       DEFINE_RES_IRQ(gic_spi(149)), /* IRQ21 */
+       DEFINE_RES_IRQ(gic_spi(149)), /* IRQ22 */
+       DEFINE_RES_IRQ(gic_spi(149)), /* IRQ23 */
+};
+
+static struct platform_device irqpin2_device = {
+       .name           = "renesas_intc_irqpin",
+       .id             = 2,
+       .resource       = irqpin2_resources,
+       .num_resources  = ARRAY_SIZE(irqpin2_resources),
+       .dev            = {
+               .platform_data  = &irqpin2_platform_data,
+       },
+};
+
+static struct renesas_intc_irqpin_config irqpin3_platform_data = {
+       .irq_base = irq_pin(24), /* IRQ24 -> IRQ31 */
+};
+
+static struct resource irqpin3_resources[] = {
+       DEFINE_RES_MEM(0xe690000c, 4), /* ICR3A */
+       DEFINE_RES_MEM(0xe690001c, 4), /* INTPRI30A */
+       DEFINE_RES_MEM(0xe690002c, 1), /* INTREQ30A */
+       DEFINE_RES_MEM(0xe690004c, 1), /* INTMSK30A */
+       DEFINE_RES_MEM(0xe690006c, 1), /* INTMSKCLR30A */
+       DEFINE_RES_IRQ(gic_spi(149)), /* IRQ24 */
+       DEFINE_RES_IRQ(gic_spi(149)), /* IRQ25 */
+       DEFINE_RES_IRQ(gic_spi(149)), /* IRQ26 */
+       DEFINE_RES_IRQ(gic_spi(149)), /* IRQ27 */
+       DEFINE_RES_IRQ(gic_spi(149)), /* IRQ28 */
+       DEFINE_RES_IRQ(gic_spi(149)), /* IRQ29 */
+       DEFINE_RES_IRQ(gic_spi(149)), /* IRQ30 */
+       DEFINE_RES_IRQ(gic_spi(149)), /* IRQ31 */
+};
+
+static struct platform_device irqpin3_device = {
+       .name           = "renesas_intc_irqpin",
+       .id             = 3,
+       .resource       = irqpin3_resources,
+       .num_resources  = ARRAY_SIZE(irqpin3_resources),
+       .dev            = {
+               .platform_data  = &irqpin3_platform_data,
+       },
+};
+
 /* SCIFA0 */
 static struct plat_sci_port scif0_platform_data = {
        .mapbase        = 0xe6c40000,
@@ -101,7 +222,7 @@ static struct plat_sci_port scif0_platform_data = {
        .scscr          = SCSCR_RE | SCSCR_TE,
        .scbrr_algo_id  = SCBRR_ALGO_4,
        .type           = PORT_SCIFA,
-       .irqs           = SCIx_IRQ_MUXED(evt2irq(0x0c00)),
+       .irqs           = SCIx_IRQ_MUXED(gic_spi(100)),
 };
 
 static struct platform_device scif0_device = {
@@ -119,7 +240,7 @@ static struct plat_sci_port scif1_platform_data = {
        .scscr          = SCSCR_RE | SCSCR_TE,
        .scbrr_algo_id  = SCBRR_ALGO_4,
        .type           = PORT_SCIFA,
-       .irqs           = SCIx_IRQ_MUXED(evt2irq(0x0c20)),
+       .irqs           = SCIx_IRQ_MUXED(gic_spi(101)),
 };
 
 static struct platform_device scif1_device = {
@@ -137,7 +258,7 @@ static struct plat_sci_port scif2_platform_data = {
        .scscr          = SCSCR_RE | SCSCR_TE,
        .scbrr_algo_id  = SCBRR_ALGO_4,
        .type           = PORT_SCIFA,
-       .irqs           = SCIx_IRQ_MUXED(evt2irq(0x0c40)),
+       .irqs           = SCIx_IRQ_MUXED(gic_spi(102)),
 };
 
 static struct platform_device scif2_device = {
@@ -155,7 +276,7 @@ static struct plat_sci_port scif3_platform_data = {
        .scscr          = SCSCR_RE | SCSCR_TE,
        .scbrr_algo_id  = SCBRR_ALGO_4,
        .type           = PORT_SCIFA,
-       .irqs           = SCIx_IRQ_MUXED(evt2irq(0x0c60)),
+       .irqs           = SCIx_IRQ_MUXED(gic_spi(103)),
 };
 
 static struct platform_device scif3_device = {
@@ -173,7 +294,7 @@ static struct plat_sci_port scif4_platform_data = {
        .scscr          = SCSCR_RE | SCSCR_TE,
        .scbrr_algo_id  = SCBRR_ALGO_4,
        .type           = PORT_SCIFA,
-       .irqs           = SCIx_IRQ_MUXED(evt2irq(0x0d20)),
+       .irqs           = SCIx_IRQ_MUXED(gic_spi(104)),
 };
 
 static struct platform_device scif4_device = {
@@ -191,7 +312,7 @@ static struct plat_sci_port scif5_platform_data = {
        .scscr          = SCSCR_RE | SCSCR_TE,
        .scbrr_algo_id  = SCBRR_ALGO_4,
        .type           = PORT_SCIFA,
-       .irqs           = SCIx_IRQ_MUXED(evt2irq(0x0d40)),
+       .irqs           = SCIx_IRQ_MUXED(gic_spi(105)),
 };
 
 static struct platform_device scif5_device = {
@@ -209,7 +330,7 @@ static struct plat_sci_port scif6_platform_data = {
        .scscr          = SCSCR_RE | SCSCR_TE,
        .scbrr_algo_id  = SCBRR_ALGO_4,
        .type           = PORT_SCIFA,
-       .irqs           = SCIx_IRQ_MUXED(evt2irq(0x04c0)),
+       .irqs           = SCIx_IRQ_MUXED(gic_spi(106)),
 };
 
 static struct platform_device scif6_device = {
@@ -227,7 +348,7 @@ static struct plat_sci_port scif7_platform_data = {
        .scscr          = SCSCR_RE | SCSCR_TE,
        .scbrr_algo_id  = SCBRR_ALGO_4,
        .type           = PORT_SCIFA,
-       .irqs           = SCIx_IRQ_MUXED(evt2irq(0x04e0)),
+       .irqs           = SCIx_IRQ_MUXED(gic_spi(107)),
 };
 
 static struct platform_device scif7_device = {
@@ -245,7 +366,7 @@ static struct plat_sci_port scifb_platform_data = {
        .scscr          = SCSCR_RE | SCSCR_TE,
        .scbrr_algo_id  = SCBRR_ALGO_4,
        .type           = PORT_SCIFB,
-       .irqs           = SCIx_IRQ_MUXED(evt2irq(0x0d60)),
+       .irqs           = SCIx_IRQ_MUXED(gic_spi(108)),
 };
 
 static struct platform_device scifb_device = {
@@ -273,7 +394,7 @@ static struct resource cmt10_resources[] = {
                .flags  = IORESOURCE_MEM,
        },
        [1] = {
-               .start  = evt2irq(0x0b00),
+               .start  = gic_spi(58),
                .flags  = IORESOURCE_IRQ,
        },
 };
@@ -304,7 +425,7 @@ static struct resource tmu00_resources[] = {
                .flags  = IORESOURCE_MEM,
        },
        [1] = {
-               .start  = intcs_evt2irq(0xe80),
+               .start  = gic_spi(198),
                .flags  = IORESOURCE_IRQ,
        },
 };
@@ -334,7 +455,7 @@ static struct resource tmu01_resources[] = {
                .flags  = IORESOURCE_MEM,
        },
        [1] = {
-               .start  = intcs_evt2irq(0xea0),
+               .start  = gic_spi(199),
                .flags  = IORESOURCE_IRQ,
        },
 };
@@ -364,7 +485,7 @@ static struct resource tmu02_resources[] = {
                .flags  = IORESOURCE_MEM,
        },
        [1] = {
-               .start  = intcs_evt2irq(0xec0),
+               .start  = gic_spi(200),
                .flags  = IORESOURCE_IRQ,
        },
 };
@@ -411,6 +532,10 @@ static struct platform_device ipmmu_device = {
 };
 
 static struct platform_device *r8a7740_early_devices[] __initdata = {
+       &irqpin0_device,
+       &irqpin1_device,
+       &irqpin2_device,
+       &irqpin3_device,
        &scif0_device,
        &scif1_device,
        &scif2_device,
@@ -525,14 +650,14 @@ static struct resource r8a7740_dmae0_resources[] = {
        },
        {
                .name   = "error_irq",
-               .start  = evt2irq(0x20c0),
-               .end    = evt2irq(0x20c0),
+               .start  = gic_spi(34),
+               .end    = gic_spi(34),
                .flags  = IORESOURCE_IRQ,
        },
        {
                /* IRQ for channels 0-5 */
-               .start  = evt2irq(0x2000),
-               .end    = evt2irq(0x20a0),
+               .start  = gic_spi(28),
+               .end    = gic_spi(33),
                .flags  = IORESOURCE_IRQ,
        },
 };
@@ -553,14 +678,14 @@ static struct resource r8a7740_dmae1_resources[] = {
        },
        {
                .name   = "error_irq",
-               .start  = evt2irq(0x21c0),
-               .end    = evt2irq(0x21c0),
+               .start  = gic_spi(41),
+               .end    = gic_spi(41),
                .flags  = IORESOURCE_IRQ,
        },
        {
                /* IRQ for channels 0-5 */
-               .start  = evt2irq(0x2100),
-               .end    = evt2irq(0x21a0),
+               .start  = gic_spi(35),
+               .end    = gic_spi(40),
                .flags  = IORESOURCE_IRQ,
        },
 };
@@ -581,14 +706,14 @@ static struct resource r8a7740_dmae2_resources[] = {
        },
        {
                .name   = "error_irq",
-               .start  = evt2irq(0x22c0),
-               .end    = evt2irq(0x22c0),
+               .start  = gic_spi(48),
+               .end    = gic_spi(48),
                .flags  = IORESOURCE_IRQ,
        },
        {
                /* IRQ for channels 0-5 */
-               .start  = evt2irq(0x2200),
-               .end    = evt2irq(0x22a0),
+               .start  = gic_spi(42),
+               .end    = gic_spi(47),
                .flags  = IORESOURCE_IRQ,
        },
 };
@@ -677,8 +802,8 @@ static struct resource r8a7740_usb_dma_resources[] = {
        },
        {
                /* IRQ for channels */
-               .start  = evt2irq(0x0a00),
-               .end    = evt2irq(0x0a00),
+               .start  = gic_spi(49),
+               .end    = gic_spi(49),
                .flags  = IORESOURCE_IRQ,
        },
 };
@@ -702,8 +827,8 @@ static struct resource i2c0_resources[] = {
                .flags  = IORESOURCE_MEM,
        },
        [1] = {
-               .start  = intcs_evt2irq(0xe00),
-               .end    = intcs_evt2irq(0xe60),
+               .start  = gic_spi(201),
+               .end    = gic_spi(204),
                .flags  = IORESOURCE_IRQ,
        },
 };
@@ -716,8 +841,8 @@ static struct resource i2c1_resources[] = {
                .flags  = IORESOURCE_MEM,
        },
        [1] = {
-               .start  = evt2irq(0x780), /* IIC1_ALI1 */
-               .end    = evt2irq(0x7e0), /* IIC1_DTEI1 */
+               .start  = gic_spi(70), /* IIC1_ALI1 */
+               .end    = gic_spi(73), /* IIC1_DTEI1 */
                .flags  = IORESOURCE_IRQ,
        },
 };
@@ -738,8 +863,8 @@ static struct platform_device i2c1_device = {
 
 static struct resource pmu_resources[] = {
        [0] = {
-               .start  = evt2irq(0x19a0),
-               .end    = evt2irq(0x19a0),
+               .start  = gic_spi(83),
+               .end    = gic_spi(83),
                .flags  = IORESOURCE_IRQ,
        },
 };
@@ -904,7 +1029,6 @@ DT_MACHINE_START(R8A7740_DT, "Generic R8A7740 (Flattened Device Tree)")
        .map_io         = r8a7740_map_io,
        .init_early     = r8a7740_add_early_devices_dt,
        .init_irq       = r8a7740_init_irq,
-       .handle_irq     = shmobile_handle_irq_intc,
        .init_machine   = r8a7740_add_standard_devices_dt,
        .init_time      = shmobile_timer_init,
        .dt_compat      = r8a7740_boards_compat_dt,
diff --git a/arch/arm/mach-shmobile/setup-r8a7778.c b/arch/arm/mach-shmobile/setup-r8a7778.c
new file mode 100644 (file)
index 0000000..30b4a33
--- /dev/null
@@ -0,0 +1,244 @@
+/*
+ * r8a7778 processor support
+ *
+ * Copyright (C) 2013  Renesas Solutions Corp.
+ * Copyright (C) 2013  Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
+ * Copyright (C) 2013  Cogent Embedded, 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; version 2 of the License.
+ *
+ * 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., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ */
+
+#include <linux/kernel.h>
+#include <linux/io.h>
+#include <linux/irqchip/arm-gic.h>
+#include <linux/of.h>
+#include <linux/of_platform.h>
+#include <linux/platform_data/irq-renesas-intc-irqpin.h>
+#include <linux/platform_device.h>
+#include <linux/irqchip.h>
+#include <linux/serial_sci.h>
+#include <linux/sh_timer.h>
+#include <mach/irqs.h>
+#include <mach/r8a7778.h>
+#include <mach/common.h>
+#include <asm/mach/arch.h>
+#include <asm/hardware/cache-l2x0.h>
+
+/* SCIF */
+#define SCIF_INFO(baseaddr, irq)                               \
+{                                                              \
+       .mapbase        = baseaddr,                             \
+       .flags          = UPF_BOOT_AUTOCONF | UPF_IOREMAP,      \
+       .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_CKE1,     \
+       .scbrr_algo_id  = SCBRR_ALGO_2,                         \
+       .type           = PORT_SCIF,                            \
+       .irqs           = SCIx_IRQ_MUXED(irq),                  \
+}
+
+static struct plat_sci_port scif_platform_data[] = {
+       SCIF_INFO(0xffe40000, gic_iid(0x66)),
+       SCIF_INFO(0xffe41000, gic_iid(0x67)),
+       SCIF_INFO(0xffe42000, gic_iid(0x68)),
+       SCIF_INFO(0xffe43000, gic_iid(0x69)),
+       SCIF_INFO(0xffe44000, gic_iid(0x6a)),
+       SCIF_INFO(0xffe45000, gic_iid(0x6b)),
+};
+
+/* TMU */
+static struct resource sh_tmu0_resources[] = {
+       DEFINE_RES_MEM(0xffd80008, 12),
+       DEFINE_RES_IRQ(gic_iid(0x40)),
+};
+
+static struct sh_timer_config sh_tmu0_platform_data = {
+       .name                   = "TMU00",
+       .channel_offset         = 0x4,
+       .timer_bit              = 0,
+       .clockevent_rating      = 200,
+};
+
+static struct resource sh_tmu1_resources[] = {
+       DEFINE_RES_MEM(0xffd80014, 12),
+       DEFINE_RES_IRQ(gic_iid(0x41)),
+};
+
+static struct sh_timer_config sh_tmu1_platform_data = {
+       .name                   = "TMU01",
+       .channel_offset         = 0x10,
+       .timer_bit              = 1,
+       .clocksource_rating     = 200,
+};
+
+/* Ether */
+static struct resource ether_resources[] = {
+       DEFINE_RES_MEM(0xfde00000, 0x400),
+       DEFINE_RES_IRQ(gic_iid(0x89)),
+};
+
+#define r8a7778_register_tmu(idx)                      \
+       platform_device_register_resndata(              \
+               &platform_bus, "sh_tmu", idx,           \
+               sh_tmu##idx##_resources,                \
+               ARRAY_SIZE(sh_tmu##idx##_resources),    \
+               &sh_tmu##idx##_platform_data,           \
+               sizeof(sh_tmu##idx##_platform_data))
+
+void __init r8a7778_add_standard_devices(void)
+{
+       int i;
+
+#ifdef CONFIG_CACHE_L2X0
+       void __iomem *base = ioremap_nocache(0xf0100000, 0x1000);
+       if (base) {
+               /*
+                * Early BRESP enable, Shared attribute override enable, 64K*16way
+                * don't call iounmap(base)
+                */
+               l2x0_init(base, 0x40470000, 0x82000fff);
+       }
+#endif
+
+       for (i = 0; i < ARRAY_SIZE(scif_platform_data); i++)
+               platform_device_register_data(&platform_bus, "sh-sci", i,
+                                             &scif_platform_data[i],
+                                             sizeof(struct plat_sci_port));
+
+       r8a7778_register_tmu(0);
+       r8a7778_register_tmu(1);
+}
+
+void __init r8a7778_add_ether_device(struct sh_eth_plat_data *pdata)
+{
+       platform_device_register_resndata(&platform_bus, "sh_eth", -1,
+                                         ether_resources,
+                                         ARRAY_SIZE(ether_resources),
+                                         pdata, sizeof(*pdata));
+}
+
+static struct renesas_intc_irqpin_config irqpin_platform_data = {
+       .irq_base = irq_pin(0), /* IRQ0 -> IRQ3 */
+       .sense_bitfield_width = 2,
+};
+
+static struct resource irqpin_resources[] = {
+       DEFINE_RES_MEM(0xfe78001c, 4), /* ICR1 */
+       DEFINE_RES_MEM(0xfe780010, 4), /* INTPRI */
+       DEFINE_RES_MEM(0xfe780024, 4), /* INTREQ */
+       DEFINE_RES_MEM(0xfe780044, 4), /* INTMSK0 */
+       DEFINE_RES_MEM(0xfe780064, 4), /* INTMSKCLR0 */
+       DEFINE_RES_IRQ(gic_iid(0x3b)), /* IRQ0 */
+       DEFINE_RES_IRQ(gic_iid(0x3c)), /* IRQ1 */
+       DEFINE_RES_IRQ(gic_iid(0x3d)), /* IRQ2 */
+       DEFINE_RES_IRQ(gic_iid(0x3e)), /* IRQ3 */
+};
+
+void __init r8a7778_init_irq_extpin(int irlm)
+{
+       void __iomem *icr0 = ioremap_nocache(0xfe780000, PAGE_SIZE);
+       unsigned long tmp;
+
+       if (!icr0) {
+               pr_warn("r8a7778: unable to setup external irq pin mode\n");
+               return;
+       }
+
+       tmp = ioread32(icr0);
+       if (irlm)
+               tmp |= 1 << 23; /* IRQ0 -> IRQ3 as individual pins */
+       else
+               tmp &= ~(1 << 23); /* IRL mode - not supported */
+       tmp |= (1 << 21); /* LVLMODE = 1 */
+       iowrite32(tmp, icr0);
+       iounmap(icr0);
+
+       if (irlm)
+               platform_device_register_resndata(
+                       &platform_bus, "renesas_intc_irqpin", -1,
+                       irqpin_resources, ARRAY_SIZE(irqpin_resources),
+                       &irqpin_platform_data, sizeof(irqpin_platform_data));
+}
+
+#define INT2SMSKCR0    0x82288 /* 0xfe782288 */
+#define INT2SMSKCR1    0x8228c /* 0xfe78228c */
+
+#define INT2NTSR0      0x00018 /* 0xfe700018 */
+#define INT2NTSR1      0x0002c /* 0xfe70002c */
+static void __init r8a7778_init_irq_common(void)
+{
+       void __iomem *base = ioremap_nocache(0xfe700000, 0x00100000);
+
+       BUG_ON(!base);
+
+       /* route all interrupts to ARM */
+       __raw_writel(0x73ffffff, base + INT2NTSR0);
+       __raw_writel(0xffffffff, base + INT2NTSR1);
+
+       /* unmask all known interrupts in INTCS2 */
+       __raw_writel(0x08330773, base + INT2SMSKCR0);
+       __raw_writel(0x00311110, base + INT2SMSKCR1);
+
+       iounmap(base);
+}
+
+void __init r8a7778_init_irq(void)
+{
+       void __iomem *gic_dist_base;
+       void __iomem *gic_cpu_base;
+
+       gic_dist_base = ioremap_nocache(0xfe438000, PAGE_SIZE);
+       gic_cpu_base  = ioremap_nocache(0xfe430000, PAGE_SIZE);
+       BUG_ON(!gic_dist_base || !gic_cpu_base);
+
+       /* use GIC to handle interrupts */
+       gic_init(0, 29, gic_dist_base, gic_cpu_base);
+
+       r8a7778_init_irq_common();
+}
+
+void __init r8a7778_init_delay(void)
+{
+       shmobile_setup_delay(800, 1, 3); /* Cortex-A9 @ 800MHz */
+}
+
+#ifdef CONFIG_USE_OF
+void __init r8a7778_init_irq_dt(void)
+{
+       irqchip_init();
+       r8a7778_init_irq_common();
+}
+
+static const struct of_dev_auxdata r8a7778_auxdata_lookup[] __initconst = {
+       {},
+};
+
+void __init r8a7778_add_standard_devices_dt(void)
+{
+       of_platform_populate(NULL, of_default_bus_match_table,
+                            r8a7778_auxdata_lookup, NULL);
+}
+
+static const char *r8a7778_compat_dt[] __initdata = {
+       "renesas,r8a7778",
+       NULL,
+};
+
+DT_MACHINE_START(R8A7778_DT, "Generic R8A7778 (Flattened Device Tree)")
+       .init_early     = r8a7778_init_delay,
+       .init_irq       = r8a7778_init_irq_dt,
+       .init_machine   = r8a7778_add_standard_devices_dt,
+       .init_time      = shmobile_timer_init,
+       .dt_compat      = r8a7778_compat_dt,
+MACHINE_END
+
+#endif /* CONFIG_USE_OF */
index c54ff9b29fe541aaa211f792bc9c3978a41f9724..b0b394842ea5011b31b678a8b53b012cea2580ba 100644 (file)
@@ -1,8 +1,9 @@
 /*
  * r8a7779 processor support
  *
- * Copyright (C) 2011  Renesas Solutions Corp.
+ * Copyright (C) 2011, 2013  Renesas Solutions Corp.
  * Copyright (C) 2011  Magnus Damm
+ * Copyright (C) 2013  Cogent Embedded, 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
@@ -21,6 +22,8 @@
 #include <linux/init.h>
 #include <linux/interrupt.h>
 #include <linux/irq.h>
+#include <linux/of_platform.h>
+#include <linux/platform_data/gpio-rcar.h>
 #include <linux/platform_device.h>
 #include <linux/delay.h>
 #include <linux/input.h>
@@ -28,6 +31,7 @@
 #include <linux/serial_sci.h>
 #include <linux/sh_intc.h>
 #include <linux/sh_timer.h>
+#include <linux/dma-mapping.h>
 #include <mach/hardware.h>
 #include <mach/irqs.h>
 #include <mach/r8a7779.h>
@@ -66,11 +70,6 @@ static struct resource r8a7779_pfc_resources[] = {
                .end    = 0xfffc023b,
                .flags  = IORESOURCE_MEM,
        },
-       [1] = {
-               .start  = 0xffc40000,
-               .end    = 0xffc46fff,
-               .flags  = IORESOURCE_MEM,
-       }
 };
 
 static struct platform_device r8a7779_pfc_device = {
@@ -80,9 +79,59 @@ static struct platform_device r8a7779_pfc_device = {
        .num_resources  = ARRAY_SIZE(r8a7779_pfc_resources),
 };
 
+#define R8A7779_GPIO(idx, npins) \
+static struct resource r8a7779_gpio##idx##_resources[] = {             \
+       [0] = {                                                         \
+               .start  = 0xffc40000 + 0x1000 * (idx),                  \
+               .end    = 0xffc4002b + 0x1000 * (idx),                  \
+               .flags  = IORESOURCE_MEM,                               \
+       },                                                              \
+       [1] = {                                                         \
+               .start  = gic_iid(0xad + (idx)),                        \
+               .flags  = IORESOURCE_IRQ,                               \
+       }                                                               \
+};                                                                     \
+                                                                       \
+static struct gpio_rcar_config r8a7779_gpio##idx##_platform_data = {   \
+       .gpio_base      = 32 * (idx),                                   \
+       .irq_base       = 0,                                            \
+       .number_of_pins = npins,                                        \
+       .pctl_name      = "pfc-r8a7779",                                \
+};                                                                     \
+                                                                       \
+static struct platform_device r8a7779_gpio##idx##_device = {           \
+       .name           = "gpio_rcar",                                  \
+       .id             = idx,                                          \
+       .resource       = r8a7779_gpio##idx##_resources,                \
+       .num_resources  = ARRAY_SIZE(r8a7779_gpio##idx##_resources),    \
+       .dev            = {                                             \
+               .platform_data  = &r8a7779_gpio##idx##_platform_data,   \
+       },                                                              \
+}
+
+R8A7779_GPIO(0, 32);
+R8A7779_GPIO(1, 32);
+R8A7779_GPIO(2, 32);
+R8A7779_GPIO(3, 32);
+R8A7779_GPIO(4, 32);
+R8A7779_GPIO(5, 32);
+R8A7779_GPIO(6, 9);
+
+static struct platform_device *r8a7779_pinctrl_devices[] __initdata = {
+       &r8a7779_pfc_device,
+       &r8a7779_gpio0_device,
+       &r8a7779_gpio1_device,
+       &r8a7779_gpio2_device,
+       &r8a7779_gpio3_device,
+       &r8a7779_gpio4_device,
+       &r8a7779_gpio5_device,
+       &r8a7779_gpio6_device,
+};
+
 void __init r8a7779_pinmux_init(void)
 {
-       platform_device_register(&r8a7779_pfc_device);
+       platform_add_devices(r8a7779_pinctrl_devices,
+                           ARRAY_SIZE(r8a7779_pinctrl_devices));
 }
 
 static struct plat_sci_port scif0_platform_data = {
@@ -91,7 +140,7 @@ static struct plat_sci_port scif0_platform_data = {
        .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_CKE1,
        .scbrr_algo_id  = SCBRR_ALGO_2,
        .type           = PORT_SCIF,
-       .irqs           = SCIx_IRQ_MUXED(gic_spi(88)),
+       .irqs           = SCIx_IRQ_MUXED(gic_iid(0x78)),
 };
 
 static struct platform_device scif0_device = {
@@ -108,7 +157,7 @@ static struct plat_sci_port scif1_platform_data = {
        .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_CKE1,
        .scbrr_algo_id  = SCBRR_ALGO_2,
        .type           = PORT_SCIF,
-       .irqs           = SCIx_IRQ_MUXED(gic_spi(89)),
+       .irqs           = SCIx_IRQ_MUXED(gic_iid(0x79)),
 };
 
 static struct platform_device scif1_device = {
@@ -125,7 +174,7 @@ static struct plat_sci_port scif2_platform_data = {
        .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_CKE1,
        .scbrr_algo_id  = SCBRR_ALGO_2,
        .type           = PORT_SCIF,
-       .irqs           = SCIx_IRQ_MUXED(gic_spi(90)),
+       .irqs           = SCIx_IRQ_MUXED(gic_iid(0x7a)),
 };
 
 static struct platform_device scif2_device = {
@@ -142,7 +191,7 @@ static struct plat_sci_port scif3_platform_data = {
        .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_CKE1,
        .scbrr_algo_id  = SCBRR_ALGO_2,
        .type           = PORT_SCIF,
-       .irqs           = SCIx_IRQ_MUXED(gic_spi(91)),
+       .irqs           = SCIx_IRQ_MUXED(gic_iid(0x7b)),
 };
 
 static struct platform_device scif3_device = {
@@ -159,7 +208,7 @@ static struct plat_sci_port scif4_platform_data = {
        .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_CKE1,
        .scbrr_algo_id  = SCBRR_ALGO_2,
        .type           = PORT_SCIF,
-       .irqs           = SCIx_IRQ_MUXED(gic_spi(92)),
+       .irqs           = SCIx_IRQ_MUXED(gic_iid(0x7c)),
 };
 
 static struct platform_device scif4_device = {
@@ -176,7 +225,7 @@ static struct plat_sci_port scif5_platform_data = {
        .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_CKE1,
        .scbrr_algo_id  = SCBRR_ALGO_2,
        .type           = PORT_SCIF,
-       .irqs           = SCIx_IRQ_MUXED(gic_spi(93)),
+       .irqs           = SCIx_IRQ_MUXED(gic_iid(0x7d)),
 };
 
 static struct platform_device scif5_device = {
@@ -203,7 +252,7 @@ static struct resource tmu00_resources[] = {
                .flags  = IORESOURCE_MEM,
        },
        [1] = {
-               .start  = gic_spi(32),
+               .start  = gic_iid(0x40),
                .flags  = IORESOURCE_IRQ,
        },
 };
@@ -233,7 +282,7 @@ static struct resource tmu01_resources[] = {
                .flags  = IORESOURCE_MEM,
        },
        [1] = {
-               .start  = gic_spi(33),
+               .start  = gic_iid(0x41),
                .flags  = IORESOURCE_IRQ,
        },
 };
@@ -255,7 +304,7 @@ static struct resource rcar_i2c0_res[] = {
                .end    = 0xffc70fff,
                .flags  = IORESOURCE_MEM,
        }, {
-               .start  = gic_spi(79),
+               .start  = gic_iid(0x6f),
                .flags  = IORESOURCE_IRQ,
        },
 };
@@ -273,7 +322,7 @@ static struct resource rcar_i2c1_res[] = {
                .end    = 0xffc71fff,
                .flags  = IORESOURCE_MEM,
        }, {
-               .start  = gic_spi(82),
+               .start  = gic_iid(0x72),
                .flags  = IORESOURCE_IRQ,
        },
 };
@@ -291,7 +340,7 @@ static struct resource rcar_i2c2_res[] = {
                .end    = 0xffc72fff,
                .flags  = IORESOURCE_MEM,
        }, {
-               .start  = gic_spi(80),
+               .start  = gic_iid(0x70),
                .flags  = IORESOURCE_IRQ,
        },
 };
@@ -309,7 +358,7 @@ static struct resource rcar_i2c3_res[] = {
                .end    = 0xffc73fff,
                .flags  = IORESOURCE_MEM,
        }, {
-               .start  = gic_spi(81),
+               .start  = gic_iid(0x71),
                .flags  = IORESOURCE_IRQ,
        },
 };
@@ -321,7 +370,43 @@ static struct platform_device i2c3_device = {
        .num_resources  = ARRAY_SIZE(rcar_i2c3_res),
 };
 
-static struct platform_device *r8a7779_early_devices[] __initdata = {
+static struct resource sata_resources[] = {
+       [0] = {
+               .name   = "rcar-sata",
+               .start  = 0xfc600000,
+               .end    = 0xfc601fff,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start  = gic_iid(0x84),
+               .flags  = IORESOURCE_IRQ,
+       },
+};
+
+static struct platform_device sata_device = {
+       .name           = "sata_rcar",
+       .id             = -1,
+       .resource       = sata_resources,
+       .num_resources  = ARRAY_SIZE(sata_resources),
+       .dev            = {
+               .dma_mask               = &sata_device.dev.coherent_dma_mask,
+               .coherent_dma_mask      = DMA_BIT_MASK(32),
+       },
+};
+
+/* Ether */
+static struct resource ether_resources[] = {
+       {
+               .start  = 0xfde00000,
+               .end    = 0xfde003ff,
+               .flags  = IORESOURCE_MEM,
+       }, {
+               .start  = gic_iid(0xb4),
+               .flags  = IORESOURCE_IRQ,
+       },
+};
+
+static struct platform_device *r8a7779_devices_dt[] __initdata = {
        &scif0_device,
        &scif1_device,
        &scif2_device,
@@ -330,13 +415,14 @@ static struct platform_device *r8a7779_early_devices[] __initdata = {
        &scif5_device,
        &tmu00_device,
        &tmu01_device,
+};
+
+static struct platform_device *r8a7779_late_devices[] __initdata = {
        &i2c0_device,
        &i2c1_device,
        &i2c2_device,
        &i2c3_device,
-};
-
-static struct platform_device *r8a7779_late_devices[] __initdata = {
+       &sata_device,
 };
 
 void __init r8a7779_add_standard_devices(void)
@@ -349,12 +435,20 @@ void __init r8a7779_add_standard_devices(void)
 
        r8a7779_init_pm_domains();
 
-       platform_add_devices(r8a7779_early_devices,
-                           ARRAY_SIZE(r8a7779_early_devices));
+       platform_add_devices(r8a7779_devices_dt,
+                           ARRAY_SIZE(r8a7779_devices_dt));
        platform_add_devices(r8a7779_late_devices,
                            ARRAY_SIZE(r8a7779_late_devices));
 }
 
+void __init r8a7779_add_ether_device(struct sh_eth_plat_data *pdata)
+{
+       platform_device_register_resndata(&platform_bus, "sh_eth", -1,
+                                         ether_resources,
+                                         ARRAY_SIZE(ether_resources),
+                                         pdata, sizeof(*pdata));
+}
+
 /* do nothing for !CONFIG_SMP or !CONFIG_HAVE_TWD */
 void __init __weak r8a7779_register_twd(void) { }
 
@@ -367,8 +461,8 @@ void __init r8a7779_earlytimer_init(void)
 
 void __init r8a7779_add_early_devices(void)
 {
-       early_platform_add_devices(r8a7779_early_devices,
-                                  ARRAY_SIZE(r8a7779_early_devices));
+       early_platform_add_devices(r8a7779_devices_dt,
+                                  ARRAY_SIZE(r8a7779_devices_dt));
 
        /* Early serial console setup is not included here due to
         * memory map collisions. The SCIF serial ports in r8a7779
@@ -386,3 +480,40 @@ void __init r8a7779_add_early_devices(void)
         * command line in case of the marzen board.
         */
 }
+
+#ifdef CONFIG_USE_OF
+void __init r8a7779_init_delay(void)
+{
+       shmobile_setup_delay(1000, 2, 4); /* Cortex-A9 @ 1000MHz */
+}
+
+static const struct of_dev_auxdata r8a7779_auxdata_lookup[] __initconst = {
+       {},
+};
+
+void __init r8a7779_add_standard_devices_dt(void)
+{
+       /* clocks are setup late during boot in the case of DT */
+       r8a7779_clock_init();
+
+       platform_add_devices(r8a7779_devices_dt,
+                            ARRAY_SIZE(r8a7779_devices_dt));
+       of_platform_populate(NULL, of_default_bus_match_table,
+                            r8a7779_auxdata_lookup, NULL);
+}
+
+static const char *r8a7779_compat_dt[] __initdata = {
+       "renesas,r8a7779",
+       NULL,
+};
+
+DT_MACHINE_START(R8A7779_DT, "Generic R8A7779 (Flattened Device Tree)")
+       .map_io         = r8a7779_map_io,
+       .init_early     = r8a7779_init_delay,
+       .nr_irqs        = NR_IRQS_LEGACY,
+       .init_irq       = r8a7779_init_irq_dt,
+       .init_machine   = r8a7779_add_standard_devices_dt,
+       .init_time      = shmobile_timer_init,
+       .dt_compat      = r8a7779_compat_dt,
+MACHINE_END
+#endif /* CONFIG_USE_OF */
diff --git a/arch/arm/mach-shmobile/setup-r8a7790.c b/arch/arm/mach-shmobile/setup-r8a7790.c
new file mode 100644 (file)
index 0000000..49de2d5
--- /dev/null
@@ -0,0 +1,150 @@
+/*
+ * r8a7790 processor support
+ *
+ * Copyright (C) 2013  Renesas Solutions Corp.
+ * Copyright (C) 2013  Magnus Damm
+ *
+ * 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 of the License.
+ *
+ * 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., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ */
+
+#include <linux/irq.h>
+#include <linux/irqchip.h>
+#include <linux/kernel.h>
+#include <linux/of_platform.h>
+#include <linux/serial_sci.h>
+#include <linux/platform_data/irq-renesas-irqc.h>
+#include <mach/common.h>
+#include <mach/irqs.h>
+#include <mach/r8a7790.h>
+#include <asm/mach/arch.h>
+
+static const struct resource pfc_resources[] = {
+       DEFINE_RES_MEM(0xe6060000, 0x250),
+       DEFINE_RES_MEM(0xe6050000, 0x5050),
+};
+
+void __init r8a7790_pinmux_init(void)
+{
+       platform_device_register_simple("pfc-r8a7790", -1, pfc_resources,
+                                       ARRAY_SIZE(pfc_resources));
+}
+
+#define SCIF_COMMON(scif_type, baseaddr, irq)                  \
+       .type           = scif_type,                            \
+       .mapbase        = baseaddr,                             \
+       .flags          = UPF_BOOT_AUTOCONF | UPF_IOREMAP,      \
+       .irqs           = SCIx_IRQ_MUXED(irq)
+
+#define SCIFA_DATA(index, baseaddr, irq)               \
+[index] = {                                            \
+       SCIF_COMMON(PORT_SCIFA, baseaddr, irq),         \
+       .scbrr_algo_id  = SCBRR_ALGO_4,                 \
+       .scscr = SCSCR_RE | SCSCR_TE | SCSCR_CKE0,      \
+}
+
+#define SCIFB_DATA(index, baseaddr, irq)       \
+[index] = {                                    \
+       SCIF_COMMON(PORT_SCIFB, baseaddr, irq), \
+       .scbrr_algo_id  = SCBRR_ALGO_4,         \
+       .scscr = SCSCR_RE | SCSCR_TE,           \
+}
+
+#define SCIF_DATA(index, baseaddr, irq)                \
+[index] = {                                            \
+       SCIF_COMMON(PORT_SCIF, baseaddr, irq),          \
+       .scbrr_algo_id  = SCBRR_ALGO_2,                 \
+       .scscr = SCSCR_RE | SCSCR_TE | SCSCR_CKE1,      \
+}
+
+enum { SCIFA0, SCIFA1, SCIFB0, SCIFB1, SCIFB2, SCIFA2, SCIF0, SCIF1 };
+
+static const struct plat_sci_port scif[] = {
+       SCIFA_DATA(SCIFA0, 0xe6c40000, gic_spi(144)), /* SCIFA0 */
+       SCIFA_DATA(SCIFA1, 0xe6c50000, gic_spi(145)), /* SCIFA1 */
+       SCIFB_DATA(SCIFB0, 0xe6c20000, gic_spi(148)), /* SCIFB0 */
+       SCIFB_DATA(SCIFB1, 0xe6c30000, gic_spi(149)), /* SCIFB1 */
+       SCIFB_DATA(SCIFB2, 0xe6ce0000, gic_spi(150)), /* SCIFB2 */
+       SCIFA_DATA(SCIFA2, 0xe6c60000, gic_spi(151)), /* SCIFA2 */
+       SCIF_DATA(SCIF0, 0xe6e60000, gic_spi(152)), /* SCIF0 */
+       SCIF_DATA(SCIF1, 0xe6e68000, gic_spi(153)), /* SCIF1 */
+};
+
+static inline void r8a7790_register_scif(int idx)
+{
+       platform_device_register_data(&platform_bus, "sh-sci", idx, &scif[idx],
+                                     sizeof(struct plat_sci_port));
+}
+
+static struct renesas_irqc_config irqc0_data = {
+       .irq_base = irq_pin(0), /* IRQ0 -> IRQ3 */
+};
+
+static struct resource irqc0_resources[] = {
+       DEFINE_RES_MEM(0xe61c0000, 0x200), /* IRQC Event Detector Block_0 */
+       DEFINE_RES_IRQ(gic_spi(0)), /* IRQ0 */
+       DEFINE_RES_IRQ(gic_spi(1)), /* IRQ1 */
+       DEFINE_RES_IRQ(gic_spi(2)), /* IRQ2 */
+       DEFINE_RES_IRQ(gic_spi(3)), /* IRQ3 */
+};
+
+#define r8a7790_register_irqc(idx)                                     \
+       platform_device_register_resndata(&platform_bus, "renesas_irqc", \
+                                         idx, irqc##idx##_resources,   \
+                                         ARRAY_SIZE(irqc##idx##_resources), \
+                                         &irqc##idx##_data,            \
+                                         sizeof(struct renesas_irqc_config))
+
+void __init r8a7790_add_standard_devices(void)
+{
+       r8a7790_register_scif(SCIFA0);
+       r8a7790_register_scif(SCIFA1);
+       r8a7790_register_scif(SCIFB0);
+       r8a7790_register_scif(SCIFB1);
+       r8a7790_register_scif(SCIFB2);
+       r8a7790_register_scif(SCIFA2);
+       r8a7790_register_scif(SCIF0);
+       r8a7790_register_scif(SCIF1);
+       r8a7790_register_irqc(0);
+}
+
+void __init r8a7790_timer_init(void)
+{
+       void __iomem *cntcr;
+
+       /* make sure arch timer is started by setting bit 0 of CNTCT */
+       cntcr = ioremap(0xe6080000, PAGE_SIZE);
+       iowrite32(1, cntcr);
+       iounmap(cntcr);
+
+       shmobile_timer_init();
+}
+
+#ifdef CONFIG_USE_OF
+void __init r8a7790_add_standard_devices_dt(void)
+{
+       of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
+}
+
+static const char *r8a7790_boards_compat_dt[] __initdata = {
+       "renesas,r8a7790",
+       NULL,
+};
+
+DT_MACHINE_START(R8A7790_DT, "Generic R8A7790 (Flattened Device Tree)")
+       .init_irq       = irqchip_init,
+       .init_machine   = r8a7790_add_standard_devices_dt,
+       .init_time      = r8a7790_timer_init,
+       .dt_compat      = r8a7790_boards_compat_dt,
+MACHINE_END
+#endif /* CONFIG_USE_OF */
index bdab575f88bcf0bc57fe267d8369a6603c9fcc26..e8cd93a5c5503cdbd86342f0e3742fedcdca531b 100644 (file)
@@ -22,6 +22,7 @@
 #include <linux/init.h>
 #include <linux/interrupt.h>
 #include <linux/irq.h>
+#include <linux/irqchip.h>
 #include <linux/platform_device.h>
 #include <linux/of_platform.h>
 #include <linux/delay.h>
@@ -32,6 +33,7 @@
 #include <linux/sh_intc.h>
 #include <linux/sh_timer.h>
 #include <linux/platform_data/sh_ipmmu.h>
+#include <linux/platform_data/irq-renesas-intc-irqpin.h>
 #include <mach/dma-register.h>
 #include <mach/hardware.h>
 #include <mach/irqs.h>
@@ -810,7 +812,128 @@ static struct platform_device ipmmu_device = {
        .num_resources  = ARRAY_SIZE(ipmmu_resources),
 };
 
-static struct platform_device *sh73a0_early_devices_dt[] __initdata = {
+static struct renesas_intc_irqpin_config irqpin0_platform_data = {
+       .irq_base = irq_pin(0), /* IRQ0 -> IRQ7 */
+};
+
+static struct resource irqpin0_resources[] = {
+       DEFINE_RES_MEM(0xe6900000, 4), /* ICR1A */
+       DEFINE_RES_MEM(0xe6900010, 4), /* INTPRI00A */
+       DEFINE_RES_MEM(0xe6900020, 1), /* INTREQ00A */
+       DEFINE_RES_MEM(0xe6900040, 1), /* INTMSK00A */
+       DEFINE_RES_MEM(0xe6900060, 1), /* INTMSKCLR00A */
+       DEFINE_RES_IRQ(gic_spi(1)), /* IRQ0 */
+       DEFINE_RES_IRQ(gic_spi(2)), /* IRQ1 */
+       DEFINE_RES_IRQ(gic_spi(3)), /* IRQ2 */
+       DEFINE_RES_IRQ(gic_spi(4)), /* IRQ3 */
+       DEFINE_RES_IRQ(gic_spi(5)), /* IRQ4 */
+       DEFINE_RES_IRQ(gic_spi(6)), /* IRQ5 */
+       DEFINE_RES_IRQ(gic_spi(7)), /* IRQ6 */
+       DEFINE_RES_IRQ(gic_spi(8)), /* IRQ7 */
+};
+
+static struct platform_device irqpin0_device = {
+       .name           = "renesas_intc_irqpin",
+       .id             = 0,
+       .resource       = irqpin0_resources,
+       .num_resources  = ARRAY_SIZE(irqpin0_resources),
+       .dev            = {
+               .platform_data  = &irqpin0_platform_data,
+       },
+};
+
+static struct renesas_intc_irqpin_config irqpin1_platform_data = {
+       .irq_base = irq_pin(8), /* IRQ8 -> IRQ15 */
+       .control_parent = true, /* Disable spurious IRQ10 */
+};
+
+static struct resource irqpin1_resources[] = {
+       DEFINE_RES_MEM(0xe6900004, 4), /* ICR2A */
+       DEFINE_RES_MEM(0xe6900014, 4), /* INTPRI10A */
+       DEFINE_RES_MEM(0xe6900024, 1), /* INTREQ10A */
+       DEFINE_RES_MEM(0xe6900044, 1), /* INTMSK10A */
+       DEFINE_RES_MEM(0xe6900064, 1), /* INTMSKCLR10A */
+       DEFINE_RES_IRQ(gic_spi(9)), /* IRQ8 */
+       DEFINE_RES_IRQ(gic_spi(10)), /* IRQ9 */
+       DEFINE_RES_IRQ(gic_spi(11)), /* IRQ10 */
+       DEFINE_RES_IRQ(gic_spi(12)), /* IRQ11 */
+       DEFINE_RES_IRQ(gic_spi(13)), /* IRQ12 */
+       DEFINE_RES_IRQ(gic_spi(14)), /* IRQ13 */
+       DEFINE_RES_IRQ(gic_spi(15)), /* IRQ14 */
+       DEFINE_RES_IRQ(gic_spi(16)), /* IRQ15 */
+};
+
+static struct platform_device irqpin1_device = {
+       .name           = "renesas_intc_irqpin",
+       .id             = 1,
+       .resource       = irqpin1_resources,
+       .num_resources  = ARRAY_SIZE(irqpin1_resources),
+       .dev            = {
+               .platform_data  = &irqpin1_platform_data,
+       },
+};
+
+static struct renesas_intc_irqpin_config irqpin2_platform_data = {
+       .irq_base = irq_pin(16), /* IRQ16 -> IRQ23 */
+};
+
+static struct resource irqpin2_resources[] = {
+       DEFINE_RES_MEM(0xe6900008, 4), /* ICR3A */
+       DEFINE_RES_MEM(0xe6900018, 4), /* INTPRI20A */
+       DEFINE_RES_MEM(0xe6900028, 1), /* INTREQ20A */
+       DEFINE_RES_MEM(0xe6900048, 1), /* INTMSK20A */
+       DEFINE_RES_MEM(0xe6900068, 1), /* INTMSKCLR20A */
+       DEFINE_RES_IRQ(gic_spi(17)), /* IRQ16 */
+       DEFINE_RES_IRQ(gic_spi(18)), /* IRQ17 */
+       DEFINE_RES_IRQ(gic_spi(19)), /* IRQ18 */
+       DEFINE_RES_IRQ(gic_spi(20)), /* IRQ19 */
+       DEFINE_RES_IRQ(gic_spi(21)), /* IRQ20 */
+       DEFINE_RES_IRQ(gic_spi(22)), /* IRQ21 */
+       DEFINE_RES_IRQ(gic_spi(23)), /* IRQ22 */
+       DEFINE_RES_IRQ(gic_spi(24)), /* IRQ23 */
+};
+
+static struct platform_device irqpin2_device = {
+       .name           = "renesas_intc_irqpin",
+       .id             = 2,
+       .resource       = irqpin2_resources,
+       .num_resources  = ARRAY_SIZE(irqpin2_resources),
+       .dev            = {
+               .platform_data  = &irqpin2_platform_data,
+       },
+};
+
+static struct renesas_intc_irqpin_config irqpin3_platform_data = {
+       .irq_base = irq_pin(24), /* IRQ24 -> IRQ31 */
+};
+
+static struct resource irqpin3_resources[] = {
+       DEFINE_RES_MEM(0xe690000c, 4), /* ICR4A */
+       DEFINE_RES_MEM(0xe690001c, 4), /* INTPRI30A */
+       DEFINE_RES_MEM(0xe690002c, 1), /* INTREQ30A */
+       DEFINE_RES_MEM(0xe690004c, 1), /* INTMSK30A */
+       DEFINE_RES_MEM(0xe690006c, 1), /* INTMSKCLR30A */
+       DEFINE_RES_IRQ(gic_spi(25)), /* IRQ24 */
+       DEFINE_RES_IRQ(gic_spi(26)), /* IRQ25 */
+       DEFINE_RES_IRQ(gic_spi(27)), /* IRQ26 */
+       DEFINE_RES_IRQ(gic_spi(28)), /* IRQ27 */
+       DEFINE_RES_IRQ(gic_spi(29)), /* IRQ28 */
+       DEFINE_RES_IRQ(gic_spi(30)), /* IRQ29 */
+       DEFINE_RES_IRQ(gic_spi(31)), /* IRQ30 */
+       DEFINE_RES_IRQ(gic_spi(32)), /* IRQ31 */
+};
+
+static struct platform_device irqpin3_device = {
+       .name           = "renesas_intc_irqpin",
+       .id             = 3,
+       .resource       = irqpin3_resources,
+       .num_resources  = ARRAY_SIZE(irqpin3_resources),
+       .dev            = {
+               .platform_data  = &irqpin3_platform_data,
+       },
+};
+
+static struct platform_device *sh73a0_devices_dt[] __initdata = {
        &scif0_device,
        &scif1_device,
        &scif2_device,
@@ -838,6 +961,10 @@ static struct platform_device *sh73a0_late_devices[] __initdata = {
        &dma0_device,
        &mpdma0_device,
        &pmu_device,
+       &irqpin0_device,
+       &irqpin1_device,
+       &irqpin2_device,
+       &irqpin3_device,
 };
 
 #define SRCR2          IOMEM(0xe61580b0)
@@ -847,8 +974,8 @@ void __init sh73a0_add_standard_devices(void)
        /* Clear software reset bit on SY-DMAC module */
        __raw_writel(__raw_readl(SRCR2) & ~(1 << 18), SRCR2);
 
-       platform_add_devices(sh73a0_early_devices_dt,
-                           ARRAY_SIZE(sh73a0_early_devices_dt));
+       platform_add_devices(sh73a0_devices_dt,
+                           ARRAY_SIZE(sh73a0_devices_dt));
        platform_add_devices(sh73a0_early_devices,
                            ARRAY_SIZE(sh73a0_early_devices));
        platform_add_devices(sh73a0_late_devices,
@@ -867,8 +994,8 @@ void __init sh73a0_earlytimer_init(void)
 
 void __init sh73a0_add_early_devices(void)
 {
-       early_platform_add_devices(sh73a0_early_devices_dt,
-                                  ARRAY_SIZE(sh73a0_early_devices_dt));
+       early_platform_add_devices(sh73a0_devices_dt,
+                                  ARRAY_SIZE(sh73a0_devices_dt));
        early_platform_add_devices(sh73a0_early_devices,
                                   ARRAY_SIZE(sh73a0_early_devices));
 
@@ -878,23 +1005,9 @@ void __init sh73a0_add_early_devices(void)
 
 #ifdef CONFIG_USE_OF
 
-/* Please note that the clock initialisation shcheme used in
- * sh73a0_add_early_devices_dt() and sh73a0_add_standard_devices_dt()
- * does not work with SMP as there is a yet to be resolved lock-up in
- * workqueue initialisation.
- *
- * CONFIG_SMP should be disabled when using this code.
- */
-
-void __init sh73a0_add_early_devices_dt(void)
+void __init sh73a0_init_delay(void)
 {
        shmobile_setup_delay(1196, 44, 46); /* Cortex-A9 @ 1196MHz */
-
-       early_platform_add_devices(sh73a0_early_devices_dt,
-                                  ARRAY_SIZE(sh73a0_early_devices_dt));
-
-       /* setup early console here as well */
-       shmobile_setup_console();
 }
 
 static const struct of_dev_auxdata sh73a0_auxdata_lookup[] __initconst = {
@@ -906,8 +1019,8 @@ void __init sh73a0_add_standard_devices_dt(void)
        /* clocks are setup late during boot in the case of DT */
        sh73a0_clock_init();
 
-       platform_add_devices(sh73a0_early_devices_dt,
-                            ARRAY_SIZE(sh73a0_early_devices_dt));
+       platform_add_devices(sh73a0_devices_dt,
+                            ARRAY_SIZE(sh73a0_devices_dt));
        of_platform_populate(NULL, of_default_bus_match_table,
                             sh73a0_auxdata_lookup, NULL);
 }
@@ -918,10 +1031,11 @@ static const char *sh73a0_boards_compat_dt[] __initdata = {
 };
 
 DT_MACHINE_START(SH73A0_DT, "Generic SH73A0 (Flattened Device Tree)")
+       .smp            = smp_ops(sh73a0_smp_ops),
        .map_io         = sh73a0_map_io,
-       .init_early     = sh73a0_add_early_devices_dt,
+       .init_early     = sh73a0_init_delay,
        .nr_irqs        = NR_IRQS_LEGACY,
-       .init_irq       = sh73a0_init_irq_dt,
+       .init_irq       = irqchip_init,
        .init_machine   = sh73a0_add_standard_devices_dt,
        .init_time      = shmobile_timer_init,
        .dt_compat      = sh73a0_boards_compat_dt,
index 953eb1f9388d672bd763d0287ea32f214438e840..e38691b4d0ddc0fc2f57856567432d6a8d60d2f3 100644 (file)
 #include <linux/spinlock.h>
 #include <linux/io.h>
 #include <linux/delay.h>
-#include <linux/irqchip/arm-gic.h>
 #include <mach/common.h>
 #include <mach/emev2.h>
 #include <asm/smp_plat.h>
 #include <asm/smp_scu.h>
-#include <asm/cacheflush.h>
 
 #define EMEV2_SCU_BASE 0x1e000000
 
-static DEFINE_SPINLOCK(scu_lock);
-static void __iomem *scu_base;
-
-static void modify_scu_cpu_psr(unsigned long set, unsigned long clr)
-{
-       unsigned long tmp;
-
-       /* we assume this code is running on a different cpu
-        * than the one that is changing coherency setting */
-       spin_lock(&scu_lock);
-       tmp = readl(scu_base + 8);
-       tmp &= ~clr;
-       tmp |= set;
-       writel(tmp, scu_base + 8);
-       spin_unlock(&scu_lock);
-
-}
-
-static unsigned int __init emev2_get_core_count(void)
-{
-       if (!scu_base) {
-               scu_base = ioremap(EMEV2_SCU_BASE, PAGE_SIZE);
-               emev2_clock_init(); /* need ioremapped SMU */
-       }
-
-       WARN_ON_ONCE(!scu_base);
-
-       return scu_base ? scu_get_core_count(scu_base) : 1;
-}
-
-static int emev2_platform_cpu_kill(unsigned int cpu)
-{
-       return 0; /* not supported yet */
-}
-
-static int __maybe_unused emev2_cpu_kill(unsigned int cpu)
-{
-       int k;
-
-       /* this function is running on another CPU than the offline target,
-        * here we need wait for shutdown code in platform_cpu_die() to
-        * finish before asking SoC-specific code to power off the CPU core.
-        */
-       for (k = 0; k < 1000; k++) {
-               if (shmobile_cpu_is_dead(cpu))
-                       return emev2_platform_cpu_kill(cpu);
-               mdelay(1);
-       }
-
-       return 0;
-}
-
-
-static void __cpuinit emev2_secondary_init(unsigned int cpu)
-{
-       gic_secondary_init(0);
-}
-
 static int __cpuinit emev2_boot_secondary(unsigned int cpu, struct task_struct *idle)
 {
-       cpu = cpu_logical_map(cpu);
-
-       /* enable cache coherency */
-       modify_scu_cpu_psr(0, 3 << (cpu * 8));
-
-       /* Tell ROM loader about our vector (in headsmp.S) */
-       emev2_set_boot_vector(__pa(shmobile_secondary_vector));
-
-       arch_send_wakeup_ipi_mask(cpumask_of(cpu));
+       arch_send_wakeup_ipi_mask(cpumask_of(cpu_logical_map(cpu)));
        return 0;
 }
 
 static void __init emev2_smp_prepare_cpus(unsigned int max_cpus)
 {
-       int cpu = cpu_logical_map(0);
+       scu_enable(shmobile_scu_base);
 
-       scu_enable(scu_base);
+       /* Tell ROM loader about our vector (in headsmp-scu.S) */
+       emev2_set_boot_vector(__pa(shmobile_secondary_vector_scu));
 
-       /* enable cache coherency on CPU0 */
-       modify_scu_cpu_psr(0, 3 << (cpu * 8));
+       /* enable cache coherency on booting CPU */
+       scu_power_mode(shmobile_scu_base, SCU_PM_NORMAL);
 }
 
 static void __init emev2_smp_init_cpus(void)
 {
-       unsigned int ncores = emev2_get_core_count();
+       unsigned int ncores;
+
+       /* setup EMEV2 specific SCU base */
+       shmobile_scu_base = ioremap(EMEV2_SCU_BASE, PAGE_SIZE);
+       emev2_clock_init(); /* need ioremapped SMU */
+
+       ncores = shmobile_scu_base ? scu_get_core_count(shmobile_scu_base) : 1;
 
        shmobile_smp_init_cpus(ncores);
 }
@@ -124,11 +63,5 @@ static void __init emev2_smp_init_cpus(void)
 struct smp_operations emev2_smp_ops __initdata = {
        .smp_init_cpus          = emev2_smp_init_cpus,
        .smp_prepare_cpus       = emev2_smp_prepare_cpus,
-       .smp_secondary_init     = emev2_secondary_init,
        .smp_boot_secondary     = emev2_boot_secondary,
-#ifdef CONFIG_HOTPLUG_CPU
-       .cpu_kill               = emev2_cpu_kill,
-       .cpu_die                = shmobile_cpu_die,
-       .cpu_disable            = shmobile_cpu_disable,
-#endif
 };
index 3a4acf23edcf5c920ba1c4e9a665d676d704ab47..a853bf182ed5ef2d4f21f11718f7983ba90f932f 100644 (file)
 #include <linux/spinlock.h>
 #include <linux/io.h>
 #include <linux/delay.h>
-#include <linux/irqchip/arm-gic.h>
 #include <mach/common.h>
 #include <mach/r8a7779.h>
+#include <asm/cacheflush.h>
 #include <asm/smp_plat.h>
 #include <asm/smp_scu.h>
 #include <asm/smp_twd.h>
 
 #define AVECR IOMEM(0xfe700040)
+#define R8A7779_SCU_BASE 0xf0000000
 
 static struct r8a7779_pm_ch r8a7779_ch_cpu1 = {
        .chan_offs = 0x40, /* PWRSR0 .. PWRER0 */
@@ -56,44 +57,14 @@ static struct r8a7779_pm_ch *r8a7779_ch_cpu[4] = {
        [3] = &r8a7779_ch_cpu3,
 };
 
-static void __iomem *scu_base_addr(void)
-{
-       return (void __iomem *)0xf0000000;
-}
-
-static DEFINE_SPINLOCK(scu_lock);
-static unsigned long tmp;
-
 #ifdef CONFIG_HAVE_ARM_TWD
-static DEFINE_TWD_LOCAL_TIMER(twd_local_timer, 0xf0000600, 29);
-
+static DEFINE_TWD_LOCAL_TIMER(twd_local_timer, R8A7779_SCU_BASE + 0x600, 29);
 void __init r8a7779_register_twd(void)
 {
        twd_local_timer_register(&twd_local_timer);
 }
 #endif
 
-static void modify_scu_cpu_psr(unsigned long set, unsigned long clr)
-{
-       void __iomem *scu_base = scu_base_addr();
-
-       spin_lock(&scu_lock);
-       tmp = __raw_readl(scu_base + 8);
-       tmp &= ~clr;
-       tmp |= set;
-       spin_unlock(&scu_lock);
-
-       /* disable cache coherency after releasing the lock */
-       __raw_writel(tmp, scu_base + 8);
-}
-
-static unsigned int __init r8a7779_get_core_count(void)
-{
-       void __iomem *scu_base = scu_base_addr();
-
-       return scu_get_core_count(scu_base);
-}
-
 static int r8a7779_platform_cpu_kill(unsigned int cpu)
 {
        struct r8a7779_pm_ch *ch = NULL;
@@ -101,9 +72,6 @@ static int r8a7779_platform_cpu_kill(unsigned int cpu)
 
        cpu = cpu_logical_map(cpu);
 
-       /* disable cache coherency */
-       modify_scu_cpu_psr(3 << (cpu * 8), 0);
-
        if (cpu < ARRAY_SIZE(r8a7779_ch_cpu))
                ch = r8a7779_ch_cpu[cpu];
 
@@ -113,30 +81,6 @@ static int r8a7779_platform_cpu_kill(unsigned int cpu)
        return ret ? ret : 1;
 }
 
-static int __maybe_unused r8a7779_cpu_kill(unsigned int cpu)
-{
-       int k;
-
-       /* this function is running on another CPU than the offline target,
-        * here we need wait for shutdown code in platform_cpu_die() to
-        * finish before asking SoC-specific code to power off the CPU core.
-        */
-       for (k = 0; k < 1000; k++) {
-               if (shmobile_cpu_is_dead(cpu))
-                       return r8a7779_platform_cpu_kill(cpu);
-
-               mdelay(1);
-       }
-
-       return 0;
-}
-
-
-static void __cpuinit r8a7779_secondary_init(unsigned int cpu)
-{
-       gic_secondary_init(0);
-}
-
 static int __cpuinit r8a7779_boot_secondary(unsigned int cpu, struct task_struct *idle)
 {
        struct r8a7779_pm_ch *ch = NULL;
@@ -144,9 +88,6 @@ static int __cpuinit r8a7779_boot_secondary(unsigned int cpu, struct task_struct
 
        cpu = cpu_logical_map(cpu);
 
-       /* enable cache coherency */
-       modify_scu_cpu_psr(0, 3 << (cpu * 8));
-
        if (cpu < ARRAY_SIZE(r8a7779_ch_cpu))
                ch = r8a7779_ch_cpu[cpu];
 
@@ -158,15 +99,13 @@ static int __cpuinit r8a7779_boot_secondary(unsigned int cpu, struct task_struct
 
 static void __init r8a7779_smp_prepare_cpus(unsigned int max_cpus)
 {
-       int cpu = cpu_logical_map(0);
-
-       scu_enable(scu_base_addr());
+       scu_enable(shmobile_scu_base);
 
-       /* Map the reset vector (in headsmp.S) */
-       __raw_writel(__pa(shmobile_secondary_vector), AVECR);
+       /* Map the reset vector (in headsmp-scu.S) */
+       __raw_writel(__pa(shmobile_secondary_vector_scu), AVECR);
 
-       /* enable cache coherency on CPU0 */
-       modify_scu_cpu_psr(0, 3 << (cpu * 8));
+       /* enable cache coherency on booting CPU */
+       scu_power_mode(shmobile_scu_base, SCU_PM_NORMAL);
 
        r8a7779_pm_init();
 
@@ -178,19 +117,68 @@ static void __init r8a7779_smp_prepare_cpus(unsigned int max_cpus)
 
 static void __init r8a7779_smp_init_cpus(void)
 {
-       unsigned int ncores = r8a7779_get_core_count();
+       /* setup r8a7779 specific SCU base */
+       shmobile_scu_base = IOMEM(R8A7779_SCU_BASE);
+
+       shmobile_smp_init_cpus(scu_get_core_count(shmobile_scu_base));
+}
+
+#ifdef CONFIG_HOTPLUG_CPU
+static int r8a7779_scu_psr_core_disabled(int cpu)
+{
+       unsigned long mask = 3 << (cpu * 8);
+
+       if ((__raw_readl(shmobile_scu_base + 8) & mask) == mask)
+               return 1;
+
+       return 0;
+}
+
+static int r8a7779_cpu_kill(unsigned int cpu)
+{
+       int k;
 
-       shmobile_smp_init_cpus(ncores);
+       /* this function is running on another CPU than the offline target,
+        * here we need wait for shutdown code in platform_cpu_die() to
+        * finish before asking SoC-specific code to power off the CPU core.
+        */
+       for (k = 0; k < 1000; k++) {
+               if (r8a7779_scu_psr_core_disabled(cpu))
+                       return r8a7779_platform_cpu_kill(cpu);
+
+               mdelay(1);
+       }
+
+       return 0;
+}
+
+static void r8a7779_cpu_die(unsigned int cpu)
+{
+       dsb();
+       flush_cache_all();
+
+       /* disable cache coherency */
+       scu_power_mode(shmobile_scu_base, SCU_PM_POWEROFF);
+
+       /* Endless loop until power off from r8a7779_cpu_kill() */
+       while (1)
+               cpu_do_idle();
+}
+
+static int r8a7779_cpu_disable(unsigned int cpu)
+{
+       /* only CPU1->3 have power domains, do not allow hotplug of CPU0 */
+       return cpu == 0 ? -EPERM : 0;
 }
+#endif /* CONFIG_HOTPLUG_CPU */
 
 struct smp_operations r8a7779_smp_ops  __initdata = {
        .smp_init_cpus          = r8a7779_smp_init_cpus,
        .smp_prepare_cpus       = r8a7779_smp_prepare_cpus,
-       .smp_secondary_init     = r8a7779_secondary_init,
        .smp_boot_secondary     = r8a7779_boot_secondary,
 #ifdef CONFIG_HOTPLUG_CPU
        .cpu_kill               = r8a7779_cpu_kill,
-       .cpu_die                = shmobile_cpu_die,
-       .cpu_disable            = shmobile_cpu_disable,
+       .cpu_die                = r8a7779_cpu_die,
+       .cpu_disable            = r8a7779_cpu_disable,
 #endif
 };
index acb46a94ccdfb8ec967ed5e52e5a9593f531c414..bf79626ee5a487624c567d5ec0c88f199f400aaa 100644 (file)
@@ -23,7 +23,6 @@
 #include <linux/spinlock.h>
 #include <linux/io.h>
 #include <linux/delay.h>
-#include <linux/irqchip/arm-gic.h>
 #include <mach/common.h>
 #include <asm/cacheflush.h>
 #include <asm/smp_plat.h>
 
 #define PSTR_SHUTDOWN_MODE     3
 
-static void __iomem *scu_base_addr(void)
-{
-       return (void __iomem *)0xf0000000;
-}
+#define SH73A0_SCU_BASE 0xf0000000
 
 #ifdef CONFIG_HAVE_ARM_TWD
-static DEFINE_TWD_LOCAL_TIMER(twd_local_timer, 0xf0000600, 29);
+static DEFINE_TWD_LOCAL_TIMER(twd_local_timer, SH73A0_SCU_BASE + 0x600, 29);
 void __init sh73a0_register_twd(void)
 {
        twd_local_timer_register(&twd_local_timer);
 }
 #endif
 
-static unsigned int __init sh73a0_get_core_count(void)
-{
-       void __iomem *scu_base = scu_base_addr();
-
-       return scu_get_core_count(scu_base);
-}
-
-static void __cpuinit sh73a0_secondary_init(unsigned int cpu)
-{
-       gic_secondary_init(0);
-}
-
 static int __cpuinit sh73a0_boot_secondary(unsigned int cpu, struct task_struct *idle)
 {
        cpu = cpu_logical_map(cpu);
@@ -78,21 +62,22 @@ static int __cpuinit sh73a0_boot_secondary(unsigned int cpu, struct task_struct
 
 static void __init sh73a0_smp_prepare_cpus(unsigned int max_cpus)
 {
-       scu_enable(scu_base_addr());
+       scu_enable(shmobile_scu_base);
 
-       /* Map the reset vector (in headsmp-sh73a0.S) */
+       /* Map the reset vector (in headsmp-scu.S) */
        __raw_writel(0, APARMBAREA);      /* 4k */
-       __raw_writel(__pa(sh73a0_secondary_vector), SBAR);
+       __raw_writel(__pa(shmobile_secondary_vector_scu), SBAR);
 
        /* enable cache coherency on booting CPU */
-       scu_power_mode(scu_base_addr(), SCU_PM_NORMAL);
+       scu_power_mode(shmobile_scu_base, SCU_PM_NORMAL);
 }
 
 static void __init sh73a0_smp_init_cpus(void)
 {
-       unsigned int ncores = sh73a0_get_core_count();
+       /* setup sh73a0 specific SCU base */
+       shmobile_scu_base = IOMEM(SH73A0_SCU_BASE);
 
-       shmobile_smp_init_cpus(ncores);
+       shmobile_smp_init_cpus(scu_get_core_count(shmobile_scu_base));
 }
 
 #ifdef CONFIG_HOTPLUG_CPU
@@ -128,21 +113,25 @@ static void sh73a0_cpu_die(unsigned int cpu)
        flush_cache_all();
 
        /* Set power off mode. This takes the CPU out of the MP cluster */
-       scu_power_mode(scu_base_addr(), SCU_PM_POWEROFF);
+       scu_power_mode(shmobile_scu_base, SCU_PM_POWEROFF);
 
        /* Enter shutdown mode */
        cpu_do_idle();
 }
+
+static int sh73a0_cpu_disable(unsigned int cpu)
+{
+       return 0; /* CPU0 and CPU1 supported */
+}
 #endif /* CONFIG_HOTPLUG_CPU */
 
 struct smp_operations sh73a0_smp_ops __initdata = {
        .smp_init_cpus          = sh73a0_smp_init_cpus,
        .smp_prepare_cpus       = sh73a0_smp_prepare_cpus,
-       .smp_secondary_init     = sh73a0_secondary_init,
        .smp_boot_secondary     = sh73a0_boot_secondary,
 #ifdef CONFIG_HOTPLUG_CPU
        .cpu_kill               = sh73a0_cpu_kill,
        .cpu_die                = sh73a0_cpu_die,
-       .cpu_disable            = shmobile_cpu_disable_any,
+       .cpu_disable            = sh73a0_cpu_disable,
 #endif
 };
index 84c60fa8daa0298d290a06554683fdb22dd921c6..ca14d1d5ac7f9f1d05d540bfbe5ca0781c5f47f5 100644 (file)
@@ -22,7 +22,6 @@
 #include <linux/io.h>
 #include <linux/of.h>
 #include <linux/of_address.h>
-#include <linux/irqchip/arm-gic.h>
 
 #include <asm/cacheflush.h>
 #include <asm/smp_scu.h>
 extern void __iomem *sys_manager_base_addr;
 extern void __iomem *rst_manager_base_addr;
 
-static void __cpuinit socfpga_secondary_init(unsigned int cpu)
-{
-       /*
-        * if any interrupts are already enabled for the primary
-        * core (e.g. timer irq), then they will not have been enabled
-        * for us: do so
-        */
-       gic_secondary_init(0);
-}
-
 static int __cpuinit socfpga_boot_secondary(unsigned int cpu, struct task_struct *idle)
 {
        int trampoline_size = &secondary_trampoline_end - &secondary_trampoline;
@@ -109,7 +98,6 @@ static void socfpga_cpu_die(unsigned int cpu)
 struct smp_operations socfpga_smp_ops __initdata = {
        .smp_init_cpus          = socfpga_smp_init_cpus,
        .smp_prepare_cpus       = socfpga_smp_prepare_cpus,
-       .smp_secondary_init     = socfpga_secondary_init,
        .smp_boot_secondary     = socfpga_boot_secondary,
 #ifdef CONFIG_HOTPLUG_CPU
        .cpu_die                = socfpga_cpu_die,
index af4ade61cd952dd13490fdec1c03e1e0b307c2bf..551c69c9a228273aebd97c7e734981ff483941e3 100644 (file)
@@ -15,7 +15,6 @@
 #include <linux/jiffies.h>
 #include <linux/io.h>
 #include <linux/smp.h>
-#include <linux/irqchip/arm-gic.h>
 #include <asm/cacheflush.h>
 #include <asm/smp_scu.h>
 #include <mach/spear.h>
@@ -27,13 +26,6 @@ static void __iomem *scu_base = IOMEM(VA_SCU_BASE);
 
 static void __cpuinit spear13xx_secondary_init(unsigned int cpu)
 {
-       /*
-        * if any interrupts are already enabled for the primary
-        * core (e.g. timer irq), then they will not have been enabled
-        * for us: do so
-        */
-       gic_secondary_init(0);
-
        /*
         * let the primary processor know we're out of the
         * pen, then head off into the C entry point
index c7d2b4a8d8cc8dade91873b7a137656395b40051..25a10191b0218afb8ebbebe8a463ccf7cd869ea9 100644 (file)
 
 #include <linux/amba/pl022.h>
 #include <linux/clk.h>
+#include <linux/clocksource.h>
 #include <linux/dw_dmac.h>
 #include <linux/err.h>
 #include <linux/of.h>
 #include <asm/hardware/cache-l2x0.h>
 #include <asm/mach/map.h>
-#include <asm/smp_twd.h>
 #include <mach/dma.h>
 #include <mach/generic.h>
 #include <mach/spear.h>
@@ -179,5 +179,5 @@ void __init spear13xx_timer_init(void)
        clk_put(pclk);
 
        spear_setup_of_timer();
-       twd_local_timer_of_register();
+       clocksource_of_init();
 }
index 2c6b3d55213b49f16ee256548279b1742111bd20..9348d3c496a98fd0e81f3f940cce8cbcf96b7d75 100644 (file)
@@ -18,7 +18,6 @@
 #include <linux/jiffies.h>
 #include <linux/smp.h>
 #include <linux/io.h>
-#include <linux/irqchip/arm-gic.h>
 #include <linux/clk/tegra.h>
 
 #include <asm/cacheflush.h>
@@ -44,13 +43,6 @@ static cpumask_t tegra_cpu_init_mask;
 
 static void __cpuinit tegra_secondary_init(unsigned int cpu)
 {
-       /*
-        * if any interrupts are already enabled for the primary
-        * core (e.g. timer irq), then they will not have been enabled
-        * for us: do so
-        */
-       gic_secondary_init(0);
-
        cpumask_set_cpu(cpu, &tegra_cpu_init_mask);
 }
 
index 18f7af339dc9ff564e450e35444768e2fd91c1bf..152b1309b9af10c5b12be36824d74312aeef48f6 100644 (file)
@@ -16,7 +16,6 @@
 #include <linux/device.h>
 #include <linux/smp.h>
 #include <linux/io.h>
-#include <linux/irqchip/arm-gic.h>
 
 #include <asm/cacheflush.h>
 #include <asm/smp_plat.h>
@@ -57,13 +56,6 @@ static DEFINE_SPINLOCK(boot_lock);
 
 static void __cpuinit ux500_secondary_init(unsigned int cpu)
 {
-       /*
-        * if any interrupts are already enabled for the primary
-        * core (e.g. timer irq), then they will not have been enabled
-        * for us: do so
-        */
-       gic_secondary_init(0);
-
        /*
         * let the primary processor know we're out of the
         * pen, then head off into the C entry point
index a6af0b8732bac8255619bdb5ebb1956692d74681..d07bbe7f04a65a5ceea7f9dd954be68aef7a877e 100644 (file)
@@ -7,6 +7,7 @@
 #include <linux/io.h>
 #include <linux/errno.h>
 #include <linux/clksrc-dbx500-prcmu.h>
+#include <linux/clocksource.h>
 #include <linux/of.h>
 #include <linux/of_address.h>
 #include <linux/platform_data/clocksource-nomadik-mtu.h>
@@ -32,7 +33,7 @@ static void __init ux500_twd_init(void)
        twd_local_timer = &u8500_twd_local_timer;
 
        if (of_have_populated_dt())
-               twd_local_timer_of_register();
+               clocksource_of_init();
        else {
                err = twd_local_timer_register(twd_local_timer);
                if (err)
index 915683cb67d60a6eed062fa49cbc7781a11f761b..d0ad78998cb628c34feee844b81a4293cb28f253 100644 (file)
@@ -5,6 +5,7 @@
 #include <linux/amba/bus.h>
 #include <linux/amba/mmci.h>
 #include <linux/io.h>
+#include <linux/clocksource.h>
 #include <linux/smp.h>
 #include <linux/init.h>
 #include <linux/irqchip.h>
@@ -25,7 +26,6 @@
 #include <asm/arch_timer.h>
 #include <asm/mach-types.h>
 #include <asm/sizes.h>
-#include <asm/smp_twd.h>
 #include <asm/mach/arch.h>
 #include <asm/mach/map.h>
 #include <asm/mach/time.h>
@@ -435,6 +435,7 @@ static void __init v2m_dt_timer_init(void)
 
        vexpress_clk_of_init();
 
+       clocksource_of_init();
        do {
                node = of_find_compatible_node(node, NULL, "arm,sp804");
        } while (node && vexpress_get_site_by_node(node) != VEXPRESS_SITE_MB);
@@ -445,8 +446,7 @@ static void __init v2m_dt_timer_init(void)
                                irq_of_parse_and_map(node, 0));
        }
 
-       if (arch_timer_of_register() != 0)
-               twd_local_timer_of_register();
+       arch_timer_of_register();
 
        if (arch_timer_sched_clock_init() != 0)
                versatile_sched_clock_init(vexpress_get_24mhz_clock_base(),
index 8badaabe70a13f7918a18df5ca05e68cc65c2c72..f4143f5bfa5ba5d7e3ae836fcb6809ffbff0cd21 100644 (file)
@@ -21,8 +21,6 @@
 #include <linux/smp.h>
 #include <linux/of.h>
 
-#include <linux/irqchip/arm-gic.h>
-
 #include <asm/psci.h>
 #include <asm/smp_plat.h>
 
@@ -45,14 +43,8 @@ static int __cpuinit virt_boot_secondary(unsigned int cpu,
        return -ENODEV;
 }
 
-static void __cpuinit virt_secondary_init(unsigned int cpu)
-{
-       gic_secondary_init(0);
-}
-
 struct smp_operations __initdata virt_smp_ops = {
        .smp_init_cpus          = virt_smp_init_cpus,
        .smp_prepare_cpus       = virt_smp_prepare_cpus,
-       .smp_secondary_init     = virt_secondary_init,
        .smp_boot_secondary     = virt_boot_secondary,
 };
index adb6c0ea0e533b36b7f23f996c5ee4329d6aacbc..f4a7e630bde04dc778b89021838eee4df95806f9 100644 (file)
@@ -8,6 +8,8 @@ config ARCH_ZYNQ
        select ICST
        select MIGHT_HAVE_CACHE_L2X0
        select USE_OF
+       select HAVE_SMP
        select SPARSE_IRQ
+       select CADENCE_TTC_TIMER
        help
          Support for Xilinx Zynq ARM Cortex A9 Platform
index 397268c1b2501ac0291d8344ef3098735468f0fa..1b25d92ebf22c9d9bb513344138816568aef8212 100644 (file)
@@ -3,4 +3,8 @@
 #
 
 # Common support
-obj-y                          := common.o timer.o
+obj-y                          := common.o slcr.o
+CFLAGS_REMOVE_hotplug.o                =-march=armv6k
+CFLAGS_hotplug.o               =-Wa,-march=armv7-a -mcpu=cortex-a9
+obj-$(CONFIG_HOTPLUG_CPU)      += hotplug.o
+obj-$(CONFIG_SMP)              += headsmp.o platsmp.o
index 5c8983218183c11e774cd31395c98d31edfc536f..5bfe7035b73d96b6394046a67f5a50fcc287d782 100644 (file)
@@ -20,6 +20,7 @@
 #include <linux/platform_device.h>
 #include <linux/clk.h>
 #include <linux/clk/zynq.h>
+#include <linux/clocksource.h>
 #include <linux/of_address.h>
 #include <linux/of_irq.h>
 #include <linux/of_platform.h>
 #include <asm/mach-types.h>
 #include <asm/page.h>
 #include <asm/pgtable.h>
+#include <asm/smp_scu.h>
 #include <asm/hardware/cache-l2x0.h>
 
 #include "common.h"
 
+void __iomem *zynq_scu_base;
+
 static struct of_device_id zynq_of_bus_ids[] __initdata = {
        { .compatible = "simple-bus", },
        {}
 };
 
 /**
- * xilinx_init_machine() - System specific initialization, intended to be
- *                        called from board specific initialization.
+ * zynq_init_machine - System specific initialization, intended to be
+ *                    called from board specific initialization.
  */
-static void __init xilinx_init_machine(void)
+static void __init zynq_init_machine(void)
 {
        /*
         * 64KB way size, 8-way associativity, parity disabled
@@ -55,50 +59,56 @@ static void __init xilinx_init_machine(void)
        of_platform_bus_probe(NULL, zynq_of_bus_ids, NULL);
 }
 
-#define SCU_PERIPH_PHYS                0xF8F00000
-#define SCU_PERIPH_SIZE                SZ_8K
-#define SCU_PERIPH_VIRT                (VMALLOC_END - SCU_PERIPH_SIZE)
+static void __init zynq_timer_init(void)
+{
+       zynq_slcr_init();
+       clocksource_of_init();
+}
 
-static struct map_desc scu_desc __initdata = {
-       .virtual        = SCU_PERIPH_VIRT,
-       .pfn            = __phys_to_pfn(SCU_PERIPH_PHYS),
-       .length         = SCU_PERIPH_SIZE,
-       .type           = MT_DEVICE,
+static struct map_desc zynq_cortex_a9_scu_map __initdata = {
+       .length = SZ_256,
+       .type   = MT_DEVICE,
 };
 
-static void __init xilinx_zynq_timer_init(void)
+static void __init zynq_scu_map_io(void)
 {
-       struct device_node *np;
-       void __iomem *slcr;
-
-       np = of_find_compatible_node(NULL, NULL, "xlnx,zynq-slcr");
-       slcr = of_iomap(np, 0);
-       WARN_ON(!slcr);
+       unsigned long base;
 
-       xilinx_zynq_clocks_init(slcr);
-
-       xttcps_timer_init();
+       base = scu_a9_get_base();
+       zynq_cortex_a9_scu_map.pfn = __phys_to_pfn(base);
+       /* Expected address is in vmalloc area that's why simple assign here */
+       zynq_cortex_a9_scu_map.virtual = base;
+       iotable_init(&zynq_cortex_a9_scu_map, 1);
+       zynq_scu_base = (void __iomem *)base;
+       BUG_ON(!zynq_scu_base);
 }
 
 /**
- * xilinx_map_io() - Create memory mappings needed for early I/O.
+ * zynq_map_io - Create memory mappings needed for early I/O.
  */
-static void __init xilinx_map_io(void)
+static void __init zynq_map_io(void)
 {
        debug_ll_io_init();
-       iotable_init(&scu_desc, 1);
+       zynq_scu_map_io();
+}
+
+static void zynq_system_reset(char mode, const char *cmd)
+{
+       zynq_slcr_system_reset();
 }
 
-static const char *xilinx_dt_match[] = {
+static const char * const zynq_dt_match[] = {
        "xlnx,zynq-zc702",
        "xlnx,zynq-7000",
        NULL
 };
 
 MACHINE_START(XILINX_EP107, "Xilinx Zynq Platform")
-       .map_io         = xilinx_map_io,
+       .smp            = smp_ops(zynq_smp_ops),
+       .map_io         = zynq_map_io,
        .init_irq       = irqchip_init,
-       .init_machine   = xilinx_init_machine,
-       .init_time      = xilinx_zynq_timer_init,
-       .dt_compat      = xilinx_dt_match,
+       .init_machine   = zynq_init_machine,
+       .init_time      = zynq_timer_init,
+       .dt_compat      = zynq_dt_match,
+       .restart        = zynq_system_reset,
 MACHINE_END
index 8b4dbbaa01cf4b078b1e4b6e50413bb4316de385..fbbd0e21c404d5f98bc4c6bf5387df045ceaa66f 100644 (file)
 #ifndef __MACH_ZYNQ_COMMON_H__
 #define __MACH_ZYNQ_COMMON_H__
 
-void __init xttcps_timer_init(void);
+extern int zynq_slcr_init(void);
+extern void zynq_slcr_system_reset(void);
+extern void zynq_slcr_cpu_stop(int cpu);
+extern void zynq_slcr_cpu_start(int cpu);
+
+#ifdef CONFIG_SMP
+extern void secondary_startup(void);
+extern char zynq_secondary_trampoline;
+extern char zynq_secondary_trampoline_jump;
+extern char zynq_secondary_trampoline_end;
+extern int __cpuinit zynq_cpun_start(u32 address, int cpu);
+extern struct smp_operations zynq_smp_ops __initdata;
+#endif
+
+extern void __iomem *zynq_slcr_base;
+extern void __iomem *zynq_scu_base;
+
+/* Hotplug */
+extern void zynq_platform_cpu_die(unsigned int cpu);
 
 #endif
diff --git a/arch/arm/mach-zynq/headsmp.S b/arch/arm/mach-zynq/headsmp.S
new file mode 100644 (file)
index 0000000..d183cd2
--- /dev/null
@@ -0,0 +1,24 @@
+/*
+ * Copyright (c) 2013 Steffen Trumtrar <s.trumtrar@pengutronix.de>
+ * Copyright (c) 2012-2013 Xilinx
+ *
+ * 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/linkage.h>
+#include <linux/init.h>
+
+       __CPUINIT
+
+ENTRY(zynq_secondary_trampoline)
+       ldr     r0, [pc]
+       bx      r0
+.globl zynq_secondary_trampoline_jump
+zynq_secondary_trampoline_jump:
+       /* Space for jumping address */
+       .word   /* cpu 1 */
+.globl zynq_secondary_trampoline_end
+zynq_secondary_trampoline_end:
+
+ENDPROC(zynq_secondary_trampoline)
diff --git a/arch/arm/mach-zynq/hotplug.c b/arch/arm/mach-zynq/hotplug.c
new file mode 100644 (file)
index 0000000..c89672b
--- /dev/null
@@ -0,0 +1,104 @@
+/*
+ * Copyright (C) 2012-2013 Xilinx
+ *
+ * based on linux/arch/arm/mach-realview/hotplug.c
+ *
+ * Copyright (C) 2002 ARM Ltd.
+ * 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 as
+ * published by the Free Software Foundation.
+ */
+#include <linux/kernel.h>
+#include <linux/errno.h>
+#include <linux/smp.h>
+
+#include <asm/cacheflush.h>
+#include <asm/cp15.h>
+#include "common.h"
+
+static inline void zynq_cpu_enter_lowpower(void)
+{
+       unsigned int v;
+
+       flush_cache_all();
+       asm volatile(
+       "       mcr     p15, 0, %1, c7, c5, 0\n"
+       "       dsb\n"
+       /*
+        * Turn off coherency
+        */
+       "       mrc     p15, 0, %0, c1, c0, 1\n"
+       "       bic     %0, %0, #0x40\n"
+       "       mcr     p15, 0, %0, c1, c0, 1\n"
+       "       mrc     p15, 0, %0, c1, c0, 0\n"
+       "       bic     %0, %0, %2\n"
+       "       mcr     p15, 0, %0, c1, c0, 0\n"
+         : "=&r" (v)
+         : "r" (0), "Ir" (CR_C)
+         : "cc");
+}
+
+static inline void zynq_cpu_leave_lowpower(void)
+{
+       unsigned int v;
+
+       asm volatile(
+       "       mrc     p15, 0, %0, c1, c0, 0\n"
+       "       orr     %0, %0, %1\n"
+       "       mcr     p15, 0, %0, c1, c0, 0\n"
+       "       mrc     p15, 0, %0, c1, c0, 1\n"
+       "       orr     %0, %0, #0x40\n"
+       "       mcr     p15, 0, %0, c1, c0, 1\n"
+         : "=&r" (v)
+         : "Ir" (CR_C)
+         : "cc");
+}
+
+static inline void zynq_platform_do_lowpower(unsigned int cpu, int *spurious)
+{
+       /*
+        * there is no power-control hardware on this platform, so all
+        * we can do is put the core into WFI; this is safe as the calling
+        * code will have already disabled interrupts
+        */
+       for (;;) {
+               dsb();
+               wfi();
+
+               /*
+                * Getting here, means that we have come out of WFI without
+                * having been woken up - this shouldn't happen
+                *
+                * Just note it happening - when we're woken, we can report
+                * its occurrence.
+                */
+               (*spurious)++;
+       }
+}
+
+/*
+ * platform-specific code to shutdown a CPU
+ *
+ * Called with IRQs disabled
+ */
+void zynq_platform_cpu_die(unsigned int cpu)
+{
+       int spurious = 0;
+
+       /*
+        * we're ready for shutdown now, so do it
+        */
+       zynq_cpu_enter_lowpower();
+       zynq_platform_do_lowpower(cpu, &spurious);
+
+       /*
+        * bring this CPU back into the world of cache
+        * coherency, and then restore interrupts
+        */
+       zynq_cpu_leave_lowpower();
+
+       if (spurious)
+               pr_warn("CPU%u: %u spurious wakeup calls\n", cpu, spurious);
+}
diff --git a/arch/arm/mach-zynq/platsmp.c b/arch/arm/mach-zynq/platsmp.c
new file mode 100644 (file)
index 0000000..5fc167e
--- /dev/null
@@ -0,0 +1,136 @@
+/*
+ * This file contains Xilinx specific SMP code, used to start up
+ * the second processor.
+ *
+ * Copyright (C) 2011-2013 Xilinx
+ *
+ * based on linux/arch/arm/mach-realview/platsmp.c
+ *
+ * Copyright (C) 2002 ARM Ltd.
+ *
+ * This software is licensed under the terms of the GNU General Public
+ * License version 2, as published by the Free Software Foundation, and
+ * may be copied, distributed, and modified under those terms.
+ *
+ * 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/export.h>
+#include <linux/jiffies.h>
+#include <linux/init.h>
+#include <linux/io.h>
+#include <asm/cacheflush.h>
+#include <asm/smp_scu.h>
+#include <linux/irqchip/arm-gic.h>
+#include "common.h"
+
+/*
+ * Store number of cores in the system
+ * Because of scu_get_core_count() must be in __init section and can't
+ * be called from zynq_cpun_start() because it is in __cpuinit section.
+ */
+static int ncores;
+
+int __cpuinit zynq_cpun_start(u32 address, int cpu)
+{
+       u32 trampoline_code_size = &zynq_secondary_trampoline_end -
+                                               &zynq_secondary_trampoline;
+
+       if (cpu > ncores) {
+               pr_warn("CPU No. is not available in the system\n");
+               return -1;
+       }
+
+       /* MS: Expectation that SLCR are directly map and accessible */
+       /* Not possible to jump to non aligned address */
+       if (!(address & 3) && (!address || (address >= trampoline_code_size))) {
+               /* Store pointer to ioremap area which points to address 0x0 */
+               static u8 __iomem *zero;
+               u32 trampoline_size = &zynq_secondary_trampoline_jump -
+                                               &zynq_secondary_trampoline;
+
+               zynq_slcr_cpu_stop(cpu);
+
+               if (__pa(PAGE_OFFSET)) {
+                       zero = ioremap(0, trampoline_code_size);
+                       if (!zero) {
+                               pr_warn("BOOTUP jump vectors not accessible\n");
+                               return -1;
+                       }
+               } else {
+                       zero = (__force u8 __iomem *)PAGE_OFFSET;
+               }
+
+               /*
+                * This is elegant way how to jump to any address
+                * 0x0: Load address at 0x8 to r0
+                * 0x4: Jump by mov instruction
+                * 0x8: Jumping address
+                */
+               memcpy((__force void *)zero, &zynq_secondary_trampoline,
+                                               trampoline_size);
+               writel(address, zero + trampoline_size);
+
+               flush_cache_all();
+               outer_flush_range(0, trampoline_code_size);
+               smp_wmb();
+
+               if (__pa(PAGE_OFFSET))
+                       iounmap(zero);
+
+               zynq_slcr_cpu_start(cpu);
+
+               return 0;
+       }
+
+       pr_warn("Can't start CPU%d: Wrong starting address %x\n", cpu, address);
+
+       return -1;
+}
+EXPORT_SYMBOL(zynq_cpun_start);
+
+static int __cpuinit zynq_boot_secondary(unsigned int cpu,
+                                               struct task_struct *idle)
+{
+       return zynq_cpun_start(virt_to_phys(secondary_startup), cpu);
+}
+
+/*
+ * Initialise the CPU possible map early - this describes the CPUs
+ * which may be present or become present in the system.
+ */
+static void __init zynq_smp_init_cpus(void)
+{
+       int i;
+
+       ncores = scu_get_core_count(zynq_scu_base);
+
+       for (i = 0; i < ncores && i < CONFIG_NR_CPUS; i++)
+               set_cpu_possible(i, true);
+}
+
+static void __init zynq_smp_prepare_cpus(unsigned int max_cpus)
+{
+       int i;
+
+       /*
+        * Initialise the present map, which describes the set of CPUs
+        * actually populated at the present time.
+        */
+       for (i = 0; i < max_cpus; i++)
+               set_cpu_present(i, true);
+
+       scu_enable(zynq_scu_base);
+}
+
+struct smp_operations zynq_smp_ops __initdata = {
+       .smp_init_cpus          = zynq_smp_init_cpus,
+       .smp_prepare_cpus       = zynq_smp_prepare_cpus,
+       .smp_boot_secondary     = zynq_boot_secondary,
+#ifdef CONFIG_HOTPLUG_CPU
+       .cpu_die                = zynq_platform_cpu_die,
+#endif
+};
diff --git a/arch/arm/mach-zynq/slcr.c b/arch/arm/mach-zynq/slcr.c
new file mode 100644 (file)
index 0000000..c70969b
--- /dev/null
@@ -0,0 +1,125 @@
+/*
+ * Xilinx SLCR driver
+ *
+ * Copyright (c) 2011-2013 Xilinx 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.
+ *
+ * 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., 675 Mass Ave, Cambridge, MA
+ * 02139, USA.
+ */
+
+#include <linux/export.h>
+#include <linux/io.h>
+#include <linux/fs.h>
+#include <linux/interrupt.h>
+#include <linux/init.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/of_address.h>
+#include <linux/uaccess.h>
+#include <linux/platform_device.h>
+#include <linux/slab.h>
+#include <linux/string.h>
+#include <linux/clk/zynq.h>
+#include "common.h"
+
+#define SLCR_UNLOCK_MAGIC              0xDF0D
+#define SLCR_UNLOCK                    0x8   /* SCLR unlock register */
+
+#define SLCR_PS_RST_CTRL_OFFSET                0x200 /* PS Software Reset Control */
+
+#define SLCR_A9_CPU_CLKSTOP            0x10
+#define SLCR_A9_CPU_RST                        0x1
+
+#define SLCR_A9_CPU_RST_CTRL           0x244 /* CPU Software Reset Control */
+#define SLCR_REBOOT_STATUS             0x258 /* PS Reboot Status */
+
+void __iomem *zynq_slcr_base;
+
+/**
+ * zynq_slcr_system_reset - Reset the entire system.
+ */
+void zynq_slcr_system_reset(void)
+{
+       u32 reboot;
+
+       /*
+        * Unlock the SLCR then reset the system.
+        * Note that this seems to require raw i/o
+        * functions or there's a lockup?
+        */
+       writel(SLCR_UNLOCK_MAGIC, zynq_slcr_base + SLCR_UNLOCK);
+
+       /*
+        * Clear 0x0F000000 bits of reboot status register to workaround
+        * the FSBL not loading the bitstream after soft-reboot
+        * This is a temporary solution until we know more.
+        */
+       reboot = readl(zynq_slcr_base + SLCR_REBOOT_STATUS);
+       writel(reboot & 0xF0FFFFFF, zynq_slcr_base + SLCR_REBOOT_STATUS);
+       writel(1, zynq_slcr_base + SLCR_PS_RST_CTRL_OFFSET);
+}
+
+/**
+ * zynq_slcr_cpu_start - Start cpu
+ * @cpu:       cpu number
+ */
+void zynq_slcr_cpu_start(int cpu)
+{
+       /* enable CPUn */
+       writel(SLCR_A9_CPU_CLKSTOP << cpu,
+              zynq_slcr_base + SLCR_A9_CPU_RST_CTRL);
+       /* enable CLK for CPUn */
+       writel(0x0 << cpu, zynq_slcr_base + SLCR_A9_CPU_RST_CTRL);
+}
+
+/**
+ * zynq_slcr_cpu_stop - Stop cpu
+ * @cpu:       cpu number
+ */
+void zynq_slcr_cpu_stop(int cpu)
+{
+       /* stop CLK and reset CPUn */
+       writel((SLCR_A9_CPU_CLKSTOP | SLCR_A9_CPU_RST) << cpu,
+              zynq_slcr_base + SLCR_A9_CPU_RST_CTRL);
+}
+
+/**
+ * zynq_slcr_init
+ * Returns 0 on success, negative errno otherwise.
+ *
+ * Called early during boot from platform code to remap SLCR area.
+ */
+int __init zynq_slcr_init(void)
+{
+       struct device_node *np;
+
+       np = of_find_compatible_node(NULL, NULL, "xlnx,zynq-slcr");
+       if (!np) {
+               pr_err("%s: no slcr node found\n", __func__);
+               BUG();
+       }
+
+       zynq_slcr_base = of_iomap(np, 0);
+       if (!zynq_slcr_base) {
+               pr_err("%s: Unable to map I/O memory\n", __func__);
+               BUG();
+       }
+
+       /* unlock the SLCR so that registers can be changed */
+       writel(SLCR_UNLOCK_MAGIC, zynq_slcr_base + SLCR_UNLOCK);
+
+       pr_info("%s mapped to %p\n", np->name, zynq_slcr_base);
+
+       xilinx_zynq_clocks_init(zynq_slcr_base);
+
+       of_node_put(np);
+
+       return 0;
+}
diff --git a/arch/arm/mach-zynq/timer.c b/arch/arm/mach-zynq/timer.c
deleted file mode 100644 (file)
index f9fbc9c..0000000
+++ /dev/null
@@ -1,324 +0,0 @@
-/*
- * This file contains driver for the Xilinx PS Timer Counter IP.
- *
- *  Copyright (C) 2011 Xilinx
- *
- * based on arch/mips/kernel/time.c timer driver
- *
- * This software is licensed under the terms of the GNU General Public
- * License version 2, as published by the Free Software Foundation, and
- * may be copied, distributed, and modified under those terms.
- *
- * 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/interrupt.h>
-#include <linux/clockchips.h>
-#include <linux/of_address.h>
-#include <linux/of_irq.h>
-#include <linux/slab.h>
-#include <linux/clk-provider.h>
-#include "common.h"
-
-/*
- * Timer Register Offset Definitions of Timer 1, Increment base address by 4
- * and use same offsets for Timer 2
- */
-#define XTTCPS_CLK_CNTRL_OFFSET                0x00 /* Clock Control Reg, RW */
-#define XTTCPS_CNT_CNTRL_OFFSET                0x0C /* Counter Control Reg, RW */
-#define XTTCPS_COUNT_VAL_OFFSET                0x18 /* Counter Value Reg, RO */
-#define XTTCPS_INTR_VAL_OFFSET         0x24 /* Interval Count Reg, RW */
-#define XTTCPS_ISR_OFFSET              0x54 /* Interrupt Status Reg, RO */
-#define XTTCPS_IER_OFFSET              0x60 /* Interrupt Enable Reg, RW */
-
-#define XTTCPS_CNT_CNTRL_DISABLE_MASK  0x1
-
-/*
- * Setup the timers to use pre-scaling, using a fixed value for now that will
- * work across most input frequency, but it may need to be more dynamic
- */
-#define PRESCALE_EXPONENT      11      /* 2 ^ PRESCALE_EXPONENT = PRESCALE */
-#define PRESCALE               2048    /* The exponent must match this */
-#define CLK_CNTRL_PRESCALE     ((PRESCALE_EXPONENT - 1) << 1)
-#define CLK_CNTRL_PRESCALE_EN  1
-#define CNT_CNTRL_RESET                (1<<4)
-
-/**
- * struct xttcps_timer - This definition defines local timer structure
- *
- * @base_addr: Base address of timer
- **/
-struct xttcps_timer {
-       void __iomem    *base_addr;
-};
-
-struct xttcps_timer_clocksource {
-       struct xttcps_timer     xttc;
-       struct clocksource      cs;
-};
-
-#define to_xttcps_timer_clksrc(x) \
-               container_of(x, struct xttcps_timer_clocksource, cs)
-
-struct xttcps_timer_clockevent {
-       struct xttcps_timer             xttc;
-       struct clock_event_device       ce;
-       struct clk                      *clk;
-};
-
-#define to_xttcps_timer_clkevent(x) \
-               container_of(x, struct xttcps_timer_clockevent, ce)
-
-/**
- * xttcps_set_interval - Set the timer interval value
- *
- * @timer:     Pointer to the timer instance
- * @cycles:    Timer interval ticks
- **/
-static void xttcps_set_interval(struct xttcps_timer *timer,
-                                       unsigned long cycles)
-{
-       u32 ctrl_reg;
-
-       /* Disable the counter, set the counter value  and re-enable counter */
-       ctrl_reg = __raw_readl(timer->base_addr + XTTCPS_CNT_CNTRL_OFFSET);
-       ctrl_reg |= XTTCPS_CNT_CNTRL_DISABLE_MASK;
-       __raw_writel(ctrl_reg, timer->base_addr + XTTCPS_CNT_CNTRL_OFFSET);
-
-       __raw_writel(cycles, timer->base_addr + XTTCPS_INTR_VAL_OFFSET);
-
-       /*
-        * Reset the counter (0x10) so that it starts from 0, one-shot
-        * mode makes this needed for timing to be right.
-        */
-       ctrl_reg |= CNT_CNTRL_RESET;
-       ctrl_reg &= ~XTTCPS_CNT_CNTRL_DISABLE_MASK;
-       __raw_writel(ctrl_reg, timer->base_addr + XTTCPS_CNT_CNTRL_OFFSET);
-}
-
-/**
- * xttcps_clock_event_interrupt - Clock event timer interrupt handler
- *
- * @irq:       IRQ number of the Timer
- * @dev_id:    void pointer to the xttcps_timer instance
- *
- * returns: Always IRQ_HANDLED - success
- **/
-static irqreturn_t xttcps_clock_event_interrupt(int irq, void *dev_id)
-{
-       struct xttcps_timer_clockevent *xttce = dev_id;
-       struct xttcps_timer *timer = &xttce->xttc;
-
-       /* Acknowledge the interrupt and call event handler */
-       __raw_readl(timer->base_addr + XTTCPS_ISR_OFFSET);
-
-       xttce->ce.event_handler(&xttce->ce);
-
-       return IRQ_HANDLED;
-}
-
-/**
- * __xttc_clocksource_read - Reads the timer counter register
- *
- * returns: Current timer counter register value
- **/
-static cycle_t __xttc_clocksource_read(struct clocksource *cs)
-{
-       struct xttcps_timer *timer = &to_xttcps_timer_clksrc(cs)->xttc;
-
-       return (cycle_t)__raw_readl(timer->base_addr +
-                               XTTCPS_COUNT_VAL_OFFSET);
-}
-
-/**
- * xttcps_set_next_event - Sets the time interval for next event
- *
- * @cycles:    Timer interval ticks
- * @evt:       Address of clock event instance
- *
- * returns: Always 0 - success
- **/
-static int xttcps_set_next_event(unsigned long cycles,
-                                       struct clock_event_device *evt)
-{
-       struct xttcps_timer_clockevent *xttce = to_xttcps_timer_clkevent(evt);
-       struct xttcps_timer *timer = &xttce->xttc;
-
-       xttcps_set_interval(timer, cycles);
-       return 0;
-}
-
-/**
- * xttcps_set_mode - Sets the mode of timer
- *
- * @mode:      Mode to be set
- * @evt:       Address of clock event instance
- **/
-static void xttcps_set_mode(enum clock_event_mode mode,
-                                       struct clock_event_device *evt)
-{
-       struct xttcps_timer_clockevent *xttce = to_xttcps_timer_clkevent(evt);
-       struct xttcps_timer *timer = &xttce->xttc;
-       u32 ctrl_reg;
-
-       switch (mode) {
-       case CLOCK_EVT_MODE_PERIODIC:
-               xttcps_set_interval(timer,
-                                    DIV_ROUND_CLOSEST(clk_get_rate(xttce->clk),
-                                                      PRESCALE * HZ));
-               break;
-       case CLOCK_EVT_MODE_ONESHOT:
-       case CLOCK_EVT_MODE_UNUSED:
-       case CLOCK_EVT_MODE_SHUTDOWN:
-               ctrl_reg = __raw_readl(timer->base_addr +
-                                       XTTCPS_CNT_CNTRL_OFFSET);
-               ctrl_reg |= XTTCPS_CNT_CNTRL_DISABLE_MASK;
-               __raw_writel(ctrl_reg,
-                               timer->base_addr + XTTCPS_CNT_CNTRL_OFFSET);
-               break;
-       case CLOCK_EVT_MODE_RESUME:
-               ctrl_reg = __raw_readl(timer->base_addr +
-                                       XTTCPS_CNT_CNTRL_OFFSET);
-               ctrl_reg &= ~XTTCPS_CNT_CNTRL_DISABLE_MASK;
-               __raw_writel(ctrl_reg,
-                               timer->base_addr + XTTCPS_CNT_CNTRL_OFFSET);
-               break;
-       }
-}
-
-static void __init zynq_ttc_setup_clocksource(struct device_node *np,
-                                            void __iomem *base)
-{
-       struct xttcps_timer_clocksource *ttccs;
-       struct clk *clk;
-       int err;
-       u32 reg;
-
-       ttccs = kzalloc(sizeof(*ttccs), GFP_KERNEL);
-       if (WARN_ON(!ttccs))
-               return;
-
-       err = of_property_read_u32(np, "reg", &reg);
-       if (WARN_ON(err))
-               return;
-
-       clk = of_clk_get_by_name(np, "cpu_1x");
-       if (WARN_ON(IS_ERR(clk)))
-               return;
-
-       err = clk_prepare_enable(clk);
-       if (WARN_ON(err))
-               return;
-
-       ttccs->xttc.base_addr = base + reg * 4;
-
-       ttccs->cs.name = np->name;
-       ttccs->cs.rating = 200;
-       ttccs->cs.read = __xttc_clocksource_read;
-       ttccs->cs.mask = CLOCKSOURCE_MASK(16);
-       ttccs->cs.flags = CLOCK_SOURCE_IS_CONTINUOUS;
-
-       __raw_writel(0x0,  ttccs->xttc.base_addr + XTTCPS_IER_OFFSET);
-       __raw_writel(CLK_CNTRL_PRESCALE | CLK_CNTRL_PRESCALE_EN,
-                    ttccs->xttc.base_addr + XTTCPS_CLK_CNTRL_OFFSET);
-       __raw_writel(CNT_CNTRL_RESET,
-                    ttccs->xttc.base_addr + XTTCPS_CNT_CNTRL_OFFSET);
-
-       err = clocksource_register_hz(&ttccs->cs, clk_get_rate(clk) / PRESCALE);
-       if (WARN_ON(err))
-               return;
-}
-
-static void __init zynq_ttc_setup_clockevent(struct device_node *np,
-                                           void __iomem *base)
-{
-       struct xttcps_timer_clockevent *ttcce;
-       int err, irq;
-       u32 reg;
-
-       ttcce = kzalloc(sizeof(*ttcce), GFP_KERNEL);
-       if (WARN_ON(!ttcce))
-               return;
-
-       err = of_property_read_u32(np, "reg", &reg);
-       if (WARN_ON(err))
-               return;
-
-       ttcce->xttc.base_addr = base + reg * 4;
-
-       ttcce->clk = of_clk_get_by_name(np, "cpu_1x");
-       if (WARN_ON(IS_ERR(ttcce->clk)))
-               return;
-
-       err = clk_prepare_enable(ttcce->clk);
-       if (WARN_ON(err))
-               return;
-
-       irq = irq_of_parse_and_map(np, 0);
-       if (WARN_ON(!irq))
-               return;
-
-       ttcce->ce.name = np->name;
-       ttcce->ce.features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT;
-       ttcce->ce.set_next_event = xttcps_set_next_event;
-       ttcce->ce.set_mode = xttcps_set_mode;
-       ttcce->ce.rating = 200;
-       ttcce->ce.irq = irq;
-       ttcce->ce.cpumask = cpu_possible_mask;
-
-       __raw_writel(0x23, ttcce->xttc.base_addr + XTTCPS_CNT_CNTRL_OFFSET);
-       __raw_writel(CLK_CNTRL_PRESCALE | CLK_CNTRL_PRESCALE_EN,
-                    ttcce->xttc.base_addr + XTTCPS_CLK_CNTRL_OFFSET);
-       __raw_writel(0x1,  ttcce->xttc.base_addr + XTTCPS_IER_OFFSET);
-
-       err = request_irq(irq, xttcps_clock_event_interrupt, IRQF_TIMER,
-                         np->name, ttcce);
-       if (WARN_ON(err))
-               return;
-
-       clockevents_config_and_register(&ttcce->ce,
-                                       clk_get_rate(ttcce->clk) / PRESCALE,
-                                       1, 0xfffe);
-}
-
-static const __initconst struct of_device_id zynq_ttc_match[] = {
-       { .compatible = "xlnx,ttc-counter-clocksource",
-               .data = zynq_ttc_setup_clocksource, },
-       { .compatible = "xlnx,ttc-counter-clockevent",
-               .data = zynq_ttc_setup_clockevent, },
-       {}
-};
-
-/**
- * xttcps_timer_init - Initialize the timer
- *
- * Initializes the timer hardware and register the clock source and clock event
- * timers with Linux kernal timer framework
- **/
-void __init xttcps_timer_init(void)
-{
-       struct device_node *np;
-
-       for_each_compatible_node(np, NULL, "xlnx,ttc") {
-               struct device_node *np_chld;
-               void __iomem *base;
-
-               base = of_iomap(np, 0);
-               if (WARN_ON(!base))
-                       return;
-
-               for_each_available_child_of_node(np, np_chld) {
-                       int (*cb)(struct device_node *np, void __iomem *base);
-                       const struct of_device_id *match;
-
-                       match = of_match_node(zynq_ttc_match, np_chld);
-                       if (match) {
-                               cb = match->data;
-                               cb(np_chld, base);
-                       }
-               }
-       }
-}
index f980cf3d2baa6166fa82eb420c2b1f6d7a025716..5d205e74e49541246eee90d4347fcf18fd843536 100644 (file)
@@ -16,6 +16,7 @@
 #include <linux/kernel.h>
 #include <linux/interrupt.h>
 #include <linux/irq.h>
+#include <linux/irqchip/chained_irq.h>
 #include <linux/io.h>
 
 #include <mach/map.h>
@@ -23,8 +24,6 @@
 #include <plat/irq-vic-timer.h>
 #include <plat/regs-timer.h>
 
-#include <asm/mach/irq.h>
-
 static void s3c_irq_demux_vic_timer(unsigned int irq, struct irq_desc *desc)
 {
        struct irq_chip *chip = irq_get_chip(irq);
index bae56131a50a44e7dc7fff38beef9cc8e9d7cbe2..fafdb059043a55d9e7d4ab2878473407f199f076 100644 (file)
@@ -14,6 +14,7 @@
 #include <linux/kernel.h>
 #include <linux/interrupt.h>
 #include <linux/irq.h>
+#include <linux/irqchip/chained_irq.h>
 #include <linux/io.h>
 #include <linux/gpio.h>
 #include <linux/slab.h>
@@ -22,8 +23,6 @@
 #include <plat/gpio-core.h>
 #include <plat/gpio-cfg.h>
 
-#include <asm/mach/irq.h>
-
 #define GPIO_BASE(chip)                ((void __iomem *)((unsigned long)((chip)->base) & 0xFFFFF000u))
 
 #define CON_OFFSET             0x700
index f2ac15561778c3aa3218aea7f02715118b634155..1e1b2d7697488ddb8c73ad80ea22afb5a2dd3f7d 100644 (file)
@@ -14,7 +14,6 @@
 #include <linux/device.h>
 #include <linux/jiffies.h>
 #include <linux/smp.h>
-#include <linux/irqchip/arm-gic.h>
 
 #include <asm/cacheflush.h>
 #include <asm/smp_plat.h>
@@ -36,13 +35,6 @@ static DEFINE_SPINLOCK(boot_lock);
 
 void __cpuinit versatile_secondary_init(unsigned int cpu)
 {
-       /*
-        * if any interrupts are already enabled for the primary
-        * core (e.g. timer irq), then they will not have been enabled
-        * for us: do so
-        */
-       gic_secondary_init(0);
-
        /*
         * let the primary processor know we're out of the
         * pen, then head off into the C entry point
index 96c6c2634cb457f17a7e3af91a013532ba79d0b9..eef17dcc3a419a8cbca32526114ff274468980ae 100644 (file)
@@ -8,12 +8,23 @@
  * for more details.
  */
 
+#include <linux/bug.h>
 #include <linux/init.h>
 #include <linux/kernel.h>
+#include <linux/ioport.h>
 #include <cpu/pfc.h>
 
+static struct resource sh7203_pfc_resources[] = {
+       [0] = {
+               .start  = 0xfffe3800,
+               .end    = 0xfffe3a9f,
+               .flags  = IORESOURCE_MEM,
+       },
+};
+
 static int __init plat_pinmux_setup(void)
 {
-       return sh_pfc_register("pfc-sh7203", NULL, 0);
+       return sh_pfc_register("pfc-sh7203", sh7203_pfc_resources,
+                              ARRAY_SIZE(sh7203_pfc_resources));
 }
 arch_initcall(plat_pinmux_setup);
index b1b7c1bae127246c2f63262339a9946e752784da..569decbd6d9350d07a76c2b28175f180ce5ece0e 100644 (file)
@@ -8,12 +8,23 @@
  * for more details.
  */
 
+#include <linux/bug.h>
 #include <linux/init.h>
 #include <linux/kernel.h>
+#include <linux/ioport.h>
 #include <cpu/pfc.h>
 
+static struct resource sh7264_pfc_resources[] = {
+       [0] = {
+               .start  = 0xfffe3800,
+               .end    = 0xfffe393f,
+               .flags  = IORESOURCE_MEM,
+       },
+};
+
 static int __init plat_pinmux_setup(void)
 {
-       return sh_pfc_register("pfc-sh7264", NULL, 0);
+       return sh_pfc_register("pfc-sh7264", sh7264_pfc_resources,
+                              ARRAY_SIZE(sh7264_pfc_resources));
 }
 arch_initcall(plat_pinmux_setup);
index dc2a86830456d80b1fc5c31f439c393b2fc54df4..4c17fb6970b1574e38f566e5e7baea5fc37b9b06 100644 (file)
@@ -9,12 +9,23 @@
  * for more details.
  */
 
+#include <linux/bug.h>
 #include <linux/init.h>
+#include <linux/ioport.h>
 #include <linux/kernel.h>
 #include <cpu/pfc.h>
 
+static struct resource sh7269_pfc_resources[] = {
+       [0] = {
+               .start  = 0xfffe3800,
+               .end    = 0xfffe391f,
+               .flags  = IORESOURCE_MEM,
+       },
+};
+
 static int __init plat_pinmux_setup(void)
 {
-       return sh_pfc_register("pfc-sh7269", NULL, 0);
+       return sh_pfc_register("pfc-sh7269", sh7269_pfc_resources,
+                              ARRAY_SIZE(sh7269_pfc_resources));
 }
 arch_initcall(plat_pinmux_setup);
index 7d3744ac7b083872e29acc69e712f5e7c8ea0a0e..26e90a66ebb71de8e6874b23f069d10c1a690f47 100644 (file)
@@ -8,13 +8,23 @@
  * for more details.
  */
 
+#include <linux/bug.h>
 #include <linux/init.h>
 #include <linux/kernel.h>
+#include <linux/ioport.h>
 #include <cpu/pfc.h>
 
+static struct resource sh7720_pfc_resources[] = {
+       [0] = {
+               .start  = 0xa4050100,
+               .end    = 0xa405016f,
+               .flags  = IORESOURCE_MEM,
+       },
+};
+
 static int __init plat_pinmux_setup(void)
 {
-       return sh_pfc_register("pfc-sh7720", NULL, 0);
+       return sh_pfc_register("pfc-sh7720", sh7720_pfc_resources,
+                              ARRAY_SIZE(sh7720_pfc_resources));
 }
-
 arch_initcall(plat_pinmux_setup);
index d9bcc4290997dfb5cdb8eb805cc21f5c9ff13672..271bbc864929c587f6da4a5b23434f85601a38d2 100644 (file)
@@ -1,10 +1,20 @@
+#include <linux/bug.h>
 #include <linux/init.h>
 #include <linux/kernel.h>
+#include <linux/ioport.h>
 #include <cpu/pfc.h>
 
+static struct resource sh7722_pfc_resources[] = {
+       [0] = {
+               .start  = 0xa4050100,
+               .end    = 0xa405018f,
+               .flags  = IORESOURCE_MEM,
+       },
+};
+
 static int __init plat_pinmux_setup(void)
 {
-       return sh_pfc_register("pfc-sh7722", NULL, 0);
+       return sh_pfc_register("pfc-sh7722", sh7722_pfc_resources,
+                              ARRAY_SIZE(sh7722_pfc_resources));
 }
-
 arch_initcall(plat_pinmux_setup);
index bcec7ad7f783746ccc0afd752f05b43e274cc64c..99c637d5bf7a0163dc2b9e16ba9358ad9028a5e1 100644 (file)
@@ -8,13 +8,23 @@
  * for more details.
  */
 
+#include <linux/bug.h>
 #include <linux/init.h>
 #include <linux/kernel.h>
+#include <linux/ioport.h>
 #include <cpu/pfc.h>
 
+static struct resource sh7723_pfc_resources[] = {
+       [0] = {
+               .start  = 0xa4050100,
+               .end    = 0xa405016f,
+               .flags  = IORESOURCE_MEM,
+       },
+};
+
 static int __init plat_pinmux_setup(void)
 {
-       return sh_pfc_register("pfc-sh7723", NULL, 0);
+       return sh_pfc_register("pfc-sh7723", sh7723_pfc_resources,
+                              ARRAY_SIZE(sh7723_pfc_resources));
 }
-
 arch_initcall(plat_pinmux_setup);
index 5c3541d6aed84c2dec68b21c0413b0c2f06af56d..63be4749e34160c9b6164772248e5b43418932fd 100644 (file)
  * for more details.
  */
 
+#include <linux/bug.h>
 #include <linux/init.h>
 #include <linux/kernel.h>
+#include <linux/ioport.h>
 #include <cpu/pfc.h>
 
+static struct resource sh7724_pfc_resources[] = {
+       [0] = {
+               .start  = 0xa4050100,
+               .end    = 0xa405016f,
+               .flags  = IORESOURCE_MEM,
+       },
+};
+
 static int __init plat_pinmux_setup(void)
 {
-       return sh_pfc_register("pfc-sh7724", NULL, 0);
+       return sh_pfc_register("pfc-sh7724", sh7724_pfc_resources,
+                              ARRAY_SIZE(sh7724_pfc_resources));
 }
 arch_initcall(plat_pinmux_setup);
index cda6bd177b8c25f9ced14cfce99fdfb5727ef76a..567745d44221451daf6b5b71fc9de132f28da1cf 100644 (file)
  * for more details.
  */
 
+#include <linux/bug.h>
 #include <linux/init.h>
 #include <linux/kernel.h>
+#include <linux/ioport.h>
 #include <cpu/pfc.h>
 
+static struct resource sh7757_pfc_resources[] = {
+       [0] = {
+               .start  = 0xffec0000,
+               .end    = 0xffec008f,
+               .flags  = IORESOURCE_MEM,
+       },
+};
+
 static int __init plat_pinmux_setup(void)
 {
-       return sh_pfc_register("pfc-sh7757", NULL, 0);
+       return sh_pfc_register("pfc-sh7757", sh7757_pfc_resources,
+                              ARRAY_SIZE(sh7757_pfc_resources));
 }
 arch_initcall(plat_pinmux_setup);
index 01055b809f644d936098cd3f440a19b514c4e7be..e336ab8b5125a42d54dc0df91d0dea2ae5b5663e 100644 (file)
@@ -8,13 +8,23 @@
  * for more details.
  */
 
+#include <linux/bug.h>
 #include <linux/init.h>
 #include <linux/kernel.h>
+#include <linux/ioport.h>
 #include <cpu/pfc.h>
 
+static struct resource sh7785_pfc_resources[] = {
+       [0] = {
+               .start  = 0xffe70000,
+               .end    = 0xffe7008f,
+               .flags  = IORESOURCE_MEM,
+       },
+};
+
 static int __init plat_pinmux_setup(void)
 {
-       return sh_pfc_register("pfc-sh7785", NULL, 0);
+       return sh_pfc_register("pfc-sh7785", sh7785_pfc_resources,
+                              ARRAY_SIZE(sh7785_pfc_resources));
 }
-
 arch_initcall(plat_pinmux_setup);
index 3061778d55dad9303d92026a5072f9dc98b7a37e..9a459556a2f78ad987eb270794653201c1e1aa6f 100644 (file)
  * for more details.
  */
 
+#include <linux/bug.h>
 #include <linux/init.h>
 #include <linux/kernel.h>
+#include <linux/ioport.h>
 #include <cpu/pfc.h>
 
+static struct resource sh7786_pfc_resources[] = {
+       [0] = {
+               .start  = 0xffcc0000,
+               .end    = 0xffcc008f,
+               .flags  = IORESOURCE_MEM,
+       },
+};
+
 static int __init plat_pinmux_setup(void)
 {
-       return sh_pfc_register("pfc-sh7786", NULL, 0);
+       return sh_pfc_register("pfc-sh7786", sh7786_pfc_resources,
+                              ARRAY_SIZE(sh7786_pfc_resources));
 }
-
 arch_initcall(plat_pinmux_setup);
index ace84acc55eae26d604ef8d2c51f959f2ef42e20..444bf25c60fa215a4be3981663583116ed3a5b0a 100644 (file)
@@ -7,12 +7,23 @@
  * License.  See the file "COPYING" in the main directory of this archive
  * for more details.
  */
+#include <linux/bug.h>
 #include <linux/init.h>
 #include <linux/kernel.h>
+#include <linux/ioport.h>
 #include <cpu/pfc.h>
 
-static int __init shx3_pinmux_setup(void)
+static struct resource shx3_pfc_resources[] = {
+       [0] = {
+               .start  = 0xffc70000,
+               .end    = 0xffc7001f,
+               .flags  = IORESOURCE_MEM,
+       },
+};
+
+static int __init plat_pinmux_setup(void)
 {
-       return sh_pfc_register("pfc-shx3", NULL, 0);
+       return sh_pfc_register("pfc-shx3", shx3_pfc_resources,
+                              ARRAY_SIZE(shx3_pfc_resources));
 }
-arch_initcall(shx3_pinmux_setup);
+arch_initcall(plat_pinmux_setup);
index e507ab7df60b88d6bae4a3f69e28d8f6845924cd..3167fda9bbb3f1aced84caf4c81bebfd05519d38 100644 (file)
@@ -31,6 +31,9 @@ config SUNXI_TIMER
 config VT8500_TIMER
        bool
 
+config CADENCE_TTC_TIMER
+       bool
+
 config CLKSRC_NOMADIK_MTU
        bool
        depends on (ARCH_NOMADIK || ARCH_U8500)
index 4d8283aec5b51286ba3942ce4e3223a9281ab3cf..e74c8ce26bf0650e2511cdec9efbf9b89c11600e 100644 (file)
@@ -19,6 +19,7 @@ obj-$(CONFIG_ARCH_BCM2835)    += bcm2835_timer.o
 obj-$(CONFIG_SUNXI_TIMER)      += sunxi_timer.o
 obj-$(CONFIG_ARCH_TEGRA)       += tegra20_timer.o
 obj-$(CONFIG_VT8500_TIMER)     += vt8500_timer.o
+obj-$(CONFIG_CADENCE_TTC_TIMER)                += cadence_ttc_timer.o
 
 obj-$(CONFIG_ARM_ARCH_TIMER)           += arm_arch_timer.o
 obj-$(CONFIG_CLKSRC_METAG_GENERIC)     += metag_generic.o
index 50c68fef944be525601d9ecc9b42d2e9287cfb7c..766611d299455efa3699fe49d5aa9a42812bd226 100644 (file)
@@ -95,23 +95,13 @@ static irqreturn_t bcm2835_time_interrupt(int irq, void *dev_id)
        }
 }
 
-static struct of_device_id bcm2835_time_match[] __initconst = {
-       { .compatible = "brcm,bcm2835-system-timer" },
-       {}
-};
-
-static void __init bcm2835_timer_init(void)
+static void __init bcm2835_timer_init(struct device_node *node)
 {
-       struct device_node *node;
        void __iomem *base;
        u32 freq;
        int irq;
        struct bcm2835_timer *timer;
 
-       node = of_find_matching_node(NULL, bcm2835_time_match);
-       if (!node)
-               panic("No bcm2835 timer node");
-
        base = of_iomap(node, 0);
        if (!base)
                panic("Can't remap registers");
diff --git a/drivers/clocksource/cadence_ttc_timer.c b/drivers/clocksource/cadence_ttc_timer.c
new file mode 100644 (file)
index 0000000..685bc60
--- /dev/null
@@ -0,0 +1,436 @@
+/*
+ * This file contains driver for the Cadence Triple Timer Counter Rev 06
+ *
+ *  Copyright (C) 2011-2013 Xilinx
+ *
+ * based on arch/mips/kernel/time.c timer driver
+ *
+ * This software is licensed under the terms of the GNU General Public
+ * License version 2, as published by the Free Software Foundation, and
+ * may be copied, distributed, and modified under those terms.
+ *
+ * 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/clk.h>
+#include <linux/interrupt.h>
+#include <linux/clockchips.h>
+#include <linux/of_address.h>
+#include <linux/of_irq.h>
+#include <linux/slab.h>
+#include <linux/clk-provider.h>
+
+/*
+ * This driver configures the 2 16-bit count-up timers as follows:
+ *
+ * T1: Timer 1, clocksource for generic timekeeping
+ * T2: Timer 2, clockevent source for hrtimers
+ * T3: Timer 3, <unused>
+ *
+ * The input frequency to the timer module for emulation is 2.5MHz which is
+ * common to all the timer channels (T1, T2, and T3). With a pre-scaler of 32,
+ * the timers are clocked at 78.125KHz (12.8 us resolution).
+
+ * The input frequency to the timer module in silicon is configurable and
+ * obtained from device tree. The pre-scaler of 32 is used.
+ */
+
+/*
+ * Timer Register Offset Definitions of Timer 1, Increment base address by 4
+ * and use same offsets for Timer 2
+ */
+#define TTC_CLK_CNTRL_OFFSET           0x00 /* Clock Control Reg, RW */
+#define TTC_CNT_CNTRL_OFFSET           0x0C /* Counter Control Reg, RW */
+#define TTC_COUNT_VAL_OFFSET           0x18 /* Counter Value Reg, RO */
+#define TTC_INTR_VAL_OFFSET            0x24 /* Interval Count Reg, RW */
+#define TTC_ISR_OFFSET         0x54 /* Interrupt Status Reg, RO */
+#define TTC_IER_OFFSET         0x60 /* Interrupt Enable Reg, RW */
+
+#define TTC_CNT_CNTRL_DISABLE_MASK     0x1
+
+/*
+ * Setup the timers to use pre-scaling, using a fixed value for now that will
+ * work across most input frequency, but it may need to be more dynamic
+ */
+#define PRESCALE_EXPONENT      11      /* 2 ^ PRESCALE_EXPONENT = PRESCALE */
+#define PRESCALE               2048    /* The exponent must match this */
+#define CLK_CNTRL_PRESCALE     ((PRESCALE_EXPONENT - 1) << 1)
+#define CLK_CNTRL_PRESCALE_EN  1
+#define CNT_CNTRL_RESET                (1 << 4)
+
+/**
+ * struct ttc_timer - This definition defines local timer structure
+ *
+ * @base_addr: Base address of timer
+ * @clk:       Associated clock source
+ * @clk_rate_change_nb Notifier block for clock rate changes
+ */
+struct ttc_timer {
+       void __iomem *base_addr;
+       struct clk *clk;
+       struct notifier_block clk_rate_change_nb;
+};
+
+#define to_ttc_timer(x) \
+               container_of(x, struct ttc_timer, clk_rate_change_nb)
+
+struct ttc_timer_clocksource {
+       struct ttc_timer        ttc;
+       struct clocksource      cs;
+};
+
+#define to_ttc_timer_clksrc(x) \
+               container_of(x, struct ttc_timer_clocksource, cs)
+
+struct ttc_timer_clockevent {
+       struct ttc_timer                ttc;
+       struct clock_event_device       ce;
+};
+
+#define to_ttc_timer_clkevent(x) \
+               container_of(x, struct ttc_timer_clockevent, ce)
+
+/**
+ * ttc_set_interval - Set the timer interval value
+ *
+ * @timer:     Pointer to the timer instance
+ * @cycles:    Timer interval ticks
+ **/
+static void ttc_set_interval(struct ttc_timer *timer,
+                                       unsigned long cycles)
+{
+       u32 ctrl_reg;
+
+       /* Disable the counter, set the counter value  and re-enable counter */
+       ctrl_reg = __raw_readl(timer->base_addr + TTC_CNT_CNTRL_OFFSET);
+       ctrl_reg |= TTC_CNT_CNTRL_DISABLE_MASK;
+       __raw_writel(ctrl_reg, timer->base_addr + TTC_CNT_CNTRL_OFFSET);
+
+       __raw_writel(cycles, timer->base_addr + TTC_INTR_VAL_OFFSET);
+
+       /*
+        * Reset the counter (0x10) so that it starts from 0, one-shot
+        * mode makes this needed for timing to be right.
+        */
+       ctrl_reg |= CNT_CNTRL_RESET;
+       ctrl_reg &= ~TTC_CNT_CNTRL_DISABLE_MASK;
+       __raw_writel(ctrl_reg, timer->base_addr + TTC_CNT_CNTRL_OFFSET);
+}
+
+/**
+ * ttc_clock_event_interrupt - Clock event timer interrupt handler
+ *
+ * @irq:       IRQ number of the Timer
+ * @dev_id:    void pointer to the ttc_timer instance
+ *
+ * returns: Always IRQ_HANDLED - success
+ **/
+static irqreturn_t ttc_clock_event_interrupt(int irq, void *dev_id)
+{
+       struct ttc_timer_clockevent *ttce = dev_id;
+       struct ttc_timer *timer = &ttce->ttc;
+
+       /* Acknowledge the interrupt and call event handler */
+       __raw_readl(timer->base_addr + TTC_ISR_OFFSET);
+
+       ttce->ce.event_handler(&ttce->ce);
+
+       return IRQ_HANDLED;
+}
+
+/**
+ * __ttc_clocksource_read - Reads the timer counter register
+ *
+ * returns: Current timer counter register value
+ **/
+static cycle_t __ttc_clocksource_read(struct clocksource *cs)
+{
+       struct ttc_timer *timer = &to_ttc_timer_clksrc(cs)->ttc;
+
+       return (cycle_t)__raw_readl(timer->base_addr +
+                               TTC_COUNT_VAL_OFFSET);
+}
+
+/**
+ * ttc_set_next_event - Sets the time interval for next event
+ *
+ * @cycles:    Timer interval ticks
+ * @evt:       Address of clock event instance
+ *
+ * returns: Always 0 - success
+ **/
+static int ttc_set_next_event(unsigned long cycles,
+                                       struct clock_event_device *evt)
+{
+       struct ttc_timer_clockevent *ttce = to_ttc_timer_clkevent(evt);
+       struct ttc_timer *timer = &ttce->ttc;
+
+       ttc_set_interval(timer, cycles);
+       return 0;
+}
+
+/**
+ * ttc_set_mode - Sets the mode of timer
+ *
+ * @mode:      Mode to be set
+ * @evt:       Address of clock event instance
+ **/
+static void ttc_set_mode(enum clock_event_mode mode,
+                                       struct clock_event_device *evt)
+{
+       struct ttc_timer_clockevent *ttce = to_ttc_timer_clkevent(evt);
+       struct ttc_timer *timer = &ttce->ttc;
+       u32 ctrl_reg;
+
+       switch (mode) {
+       case CLOCK_EVT_MODE_PERIODIC:
+               ttc_set_interval(timer,
+                               DIV_ROUND_CLOSEST(clk_get_rate(ttce->ttc.clk),
+                                       PRESCALE * HZ));
+               break;
+       case CLOCK_EVT_MODE_ONESHOT:
+       case CLOCK_EVT_MODE_UNUSED:
+       case CLOCK_EVT_MODE_SHUTDOWN:
+               ctrl_reg = __raw_readl(timer->base_addr +
+                                       TTC_CNT_CNTRL_OFFSET);
+               ctrl_reg |= TTC_CNT_CNTRL_DISABLE_MASK;
+               __raw_writel(ctrl_reg,
+                               timer->base_addr + TTC_CNT_CNTRL_OFFSET);
+               break;
+       case CLOCK_EVT_MODE_RESUME:
+               ctrl_reg = __raw_readl(timer->base_addr +
+                                       TTC_CNT_CNTRL_OFFSET);
+               ctrl_reg &= ~TTC_CNT_CNTRL_DISABLE_MASK;
+               __raw_writel(ctrl_reg,
+                               timer->base_addr + TTC_CNT_CNTRL_OFFSET);
+               break;
+       }
+}
+
+static int ttc_rate_change_clocksource_cb(struct notifier_block *nb,
+               unsigned long event, void *data)
+{
+       struct clk_notifier_data *ndata = data;
+       struct ttc_timer *ttc = to_ttc_timer(nb);
+       struct ttc_timer_clocksource *ttccs = container_of(ttc,
+                       struct ttc_timer_clocksource, ttc);
+
+       switch (event) {
+       case POST_RATE_CHANGE:
+               /*
+                * Do whatever is necessary to maintain a proper time base
+                *
+                * I cannot find a way to adjust the currently used clocksource
+                * to the new frequency. __clocksource_updatefreq_hz() sounds
+                * good, but does not work. Not sure what's that missing.
+                *
+                * This approach works, but triggers two clocksource switches.
+                * The first after unregister to clocksource jiffies. And
+                * another one after the register to the newly registered timer.
+                *
+                * Alternatively we could 'waste' another HW timer to ping pong
+                * between clock sources. That would also use one register and
+                * one unregister call, but only trigger one clocksource switch
+                * for the cost of another HW timer used by the OS.
+                */
+               clocksource_unregister(&ttccs->cs);
+               clocksource_register_hz(&ttccs->cs,
+                               ndata->new_rate / PRESCALE);
+               /* fall through */
+       case PRE_RATE_CHANGE:
+       case ABORT_RATE_CHANGE:
+       default:
+               return NOTIFY_DONE;
+       }
+}
+
+static void __init ttc_setup_clocksource(struct clk *clk, void __iomem *base)
+{
+       struct ttc_timer_clocksource *ttccs;
+       int err;
+
+       ttccs = kzalloc(sizeof(*ttccs), GFP_KERNEL);
+       if (WARN_ON(!ttccs))
+               return;
+
+       ttccs->ttc.clk = clk;
+
+       err = clk_prepare_enable(ttccs->ttc.clk);
+       if (WARN_ON(err)) {
+               kfree(ttccs);
+               return;
+       }
+
+       ttccs->ttc.clk_rate_change_nb.notifier_call =
+               ttc_rate_change_clocksource_cb;
+       ttccs->ttc.clk_rate_change_nb.next = NULL;
+       if (clk_notifier_register(ttccs->ttc.clk,
+                               &ttccs->ttc.clk_rate_change_nb))
+               pr_warn("Unable to register clock notifier.\n");
+
+       ttccs->ttc.base_addr = base;
+       ttccs->cs.name = "ttc_clocksource";
+       ttccs->cs.rating = 200;
+       ttccs->cs.read = __ttc_clocksource_read;
+       ttccs->cs.mask = CLOCKSOURCE_MASK(16);
+       ttccs->cs.flags = CLOCK_SOURCE_IS_CONTINUOUS;
+
+       /*
+        * Setup the clock source counter to be an incrementing counter
+        * with no interrupt and it rolls over at 0xFFFF. Pre-scale
+        * it by 32 also. Let it start running now.
+        */
+       __raw_writel(0x0,  ttccs->ttc.base_addr + TTC_IER_OFFSET);
+       __raw_writel(CLK_CNTRL_PRESCALE | CLK_CNTRL_PRESCALE_EN,
+                    ttccs->ttc.base_addr + TTC_CLK_CNTRL_OFFSET);
+       __raw_writel(CNT_CNTRL_RESET,
+                    ttccs->ttc.base_addr + TTC_CNT_CNTRL_OFFSET);
+
+       err = clocksource_register_hz(&ttccs->cs,
+                       clk_get_rate(ttccs->ttc.clk) / PRESCALE);
+       if (WARN_ON(err)) {
+               kfree(ttccs);
+               return;
+       }
+}
+
+static int ttc_rate_change_clockevent_cb(struct notifier_block *nb,
+               unsigned long event, void *data)
+{
+       struct clk_notifier_data *ndata = data;
+       struct ttc_timer *ttc = to_ttc_timer(nb);
+       struct ttc_timer_clockevent *ttcce = container_of(ttc,
+                       struct ttc_timer_clockevent, ttc);
+
+       switch (event) {
+       case POST_RATE_CHANGE:
+       {
+               unsigned long flags;
+
+               /*
+                * clockevents_update_freq should be called with IRQ disabled on
+                * the CPU the timer provides events for. The timer we use is
+                * common to both CPUs, not sure if we need to run on both
+                * cores.
+                */
+               local_irq_save(flags);
+               clockevents_update_freq(&ttcce->ce,
+                               ndata->new_rate / PRESCALE);
+               local_irq_restore(flags);
+
+               /* fall through */
+       }
+       case PRE_RATE_CHANGE:
+       case ABORT_RATE_CHANGE:
+       default:
+               return NOTIFY_DONE;
+       }
+}
+
+static void __init ttc_setup_clockevent(struct clk *clk,
+                                               void __iomem *base, u32 irq)
+{
+       struct ttc_timer_clockevent *ttcce;
+       int err;
+
+       ttcce = kzalloc(sizeof(*ttcce), GFP_KERNEL);
+       if (WARN_ON(!ttcce))
+               return;
+
+       ttcce->ttc.clk = clk;
+
+       err = clk_prepare_enable(ttcce->ttc.clk);
+       if (WARN_ON(err)) {
+               kfree(ttcce);
+               return;
+       }
+
+       ttcce->ttc.clk_rate_change_nb.notifier_call =
+               ttc_rate_change_clockevent_cb;
+       ttcce->ttc.clk_rate_change_nb.next = NULL;
+       if (clk_notifier_register(ttcce->ttc.clk,
+                               &ttcce->ttc.clk_rate_change_nb))
+               pr_warn("Unable to register clock notifier.\n");
+
+       ttcce->ttc.base_addr = base;
+       ttcce->ce.name = "ttc_clockevent";
+       ttcce->ce.features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT;
+       ttcce->ce.set_next_event = ttc_set_next_event;
+       ttcce->ce.set_mode = ttc_set_mode;
+       ttcce->ce.rating = 200;
+       ttcce->ce.irq = irq;
+       ttcce->ce.cpumask = cpu_possible_mask;
+
+       /*
+        * Setup the clock event timer to be an interval timer which
+        * is prescaled by 32 using the interval interrupt. Leave it
+        * disabled for now.
+        */
+       __raw_writel(0x23, ttcce->ttc.base_addr + TTC_CNT_CNTRL_OFFSET);
+       __raw_writel(CLK_CNTRL_PRESCALE | CLK_CNTRL_PRESCALE_EN,
+                    ttcce->ttc.base_addr + TTC_CLK_CNTRL_OFFSET);
+       __raw_writel(0x1,  ttcce->ttc.base_addr + TTC_IER_OFFSET);
+
+       err = request_irq(irq, ttc_clock_event_interrupt,
+                         IRQF_DISABLED | IRQF_TIMER,
+                         ttcce->ce.name, ttcce);
+       if (WARN_ON(err)) {
+               kfree(ttcce);
+               return;
+       }
+
+       clockevents_config_and_register(&ttcce->ce,
+                       clk_get_rate(ttcce->ttc.clk) / PRESCALE, 1, 0xfffe);
+}
+
+/**
+ * ttc_timer_init - Initialize the timer
+ *
+ * Initializes the timer hardware and register the clock source and clock event
+ * timers with Linux kernal timer framework
+ */
+static void __init ttc_timer_init(struct device_node *timer)
+{
+       unsigned int irq;
+       void __iomem *timer_baseaddr;
+       struct clk *clk;
+       static int initialized;
+
+       if (initialized)
+               return;
+
+       initialized = 1;
+
+       /*
+        * Get the 1st Triple Timer Counter (TTC) block from the device tree
+        * and use it. Note that the event timer uses the interrupt and it's the
+        * 2nd TTC hence the irq_of_parse_and_map(,1)
+        */
+       timer_baseaddr = of_iomap(timer, 0);
+       if (!timer_baseaddr) {
+               pr_err("ERROR: invalid timer base address\n");
+               BUG();
+       }
+
+       irq = irq_of_parse_and_map(timer, 1);
+       if (irq <= 0) {
+               pr_err("ERROR: invalid interrupt number\n");
+               BUG();
+       }
+
+       clk = of_clk_get_by_name(timer, "cpu_1x");
+       if (IS_ERR(clk)) {
+               pr_err("ERROR: timer input clock not found\n");
+               BUG();
+       }
+
+       ttc_setup_clocksource(clk, timer_baseaddr);
+       ttc_setup_clockevent(clk, timer_baseaddr + 4, irq);
+
+       pr_info("%s #0 at %p, irq=%d\n", timer->name, timer_baseaddr, irq);
+}
+
+CLOCKSOURCE_OF_DECLARE(ttc, "cdns,ttc", ttc_timer_init);
index bdabdaa8d00f25be231804459f0e867f79045978..37f5325bec95936260c50b2a099ccc7fb000ba53 100644 (file)
@@ -16,6 +16,7 @@
 
 #include <linux/init.h>
 #include <linux/of.h>
+#include <linux/clocksource.h>
 
 extern struct of_device_id __clksrc_of_table[];
 
@@ -26,10 +27,10 @@ void __init clocksource_of_init(void)
 {
        struct device_node *np;
        const struct of_device_id *match;
-       void (*init_func)(void);
+       clocksource_of_init_fn init_func;
 
        for_each_matching_node_and_match(np, __clksrc_of_table, &match) {
                init_func = match->data;
-               init_func();
+               init_func(np);
        }
 }
index 0bde03feb095365602af6fe0239a5d13b26181b3..2e4d8a666c36d6ee40db523408f34a8b5927bebf 100644 (file)
@@ -154,29 +154,12 @@ static struct irqaction tegra_timer_irq = {
        .dev_id         = &tegra_clockevent,
 };
 
-static const struct of_device_id timer_match[] __initconst = {
-       { .compatible = "nvidia,tegra20-timer" },
-       {}
-};
-
-static const struct of_device_id rtc_match[] __initconst = {
-       { .compatible = "nvidia,tegra20-rtc" },
-       {}
-};
-
-static void __init tegra20_init_timer(void)
+static void __init tegra20_init_timer(struct device_node *np)
 {
-       struct device_node *np;
        struct clk *clk;
        unsigned long rate;
        int ret;
 
-       np = of_find_matching_node(NULL, timer_match);
-       if (!np) {
-               pr_err("Failed to find timer DT node\n");
-               BUG();
-       }
-
        timer_reg_base = of_iomap(np, 0);
        if (!timer_reg_base) {
                pr_err("Can't map timer registers\n");
@@ -200,30 +183,6 @@ static void __init tegra20_init_timer(void)
 
        of_node_put(np);
 
-       np = of_find_matching_node(NULL, rtc_match);
-       if (!np) {
-               pr_err("Failed to find RTC DT node\n");
-               BUG();
-       }
-
-       rtc_base = of_iomap(np, 0);
-       if (!rtc_base) {
-               pr_err("Can't map RTC registers");
-               BUG();
-       }
-
-       /*
-        * rtc registers are used by read_persistent_clock, keep the rtc clock
-        * enabled
-        */
-       clk = clk_get_sys("rtc-tegra", NULL);
-       if (IS_ERR(clk))
-               pr_warn("Unable to get rtc-tegra clock\n");
-       else
-               clk_prepare_enable(clk);
-
-       of_node_put(np);
-
        switch (rate) {
        case 12000000:
                timer_writel(0x000b, TIMERUS_USEC_CFG);
@@ -259,12 +218,34 @@ static void __init tegra20_init_timer(void)
        tegra_clockevent.irq = tegra_timer_irq.irq;
        clockevents_config_and_register(&tegra_clockevent, 1000000,
                                        0x1, 0x1fffffff);
-#ifdef CONFIG_HAVE_ARM_TWD
-       twd_local_timer_of_register();
-#endif
+}
+CLOCKSOURCE_OF_DECLARE(tegra20_timer, "nvidia,tegra20-timer", tegra20_init_timer);
+
+static void __init tegra20_init_rtc(struct device_node *np)
+{
+       struct clk *clk;
+
+       rtc_base = of_iomap(np, 0);
+       if (!rtc_base) {
+               pr_err("Can't map RTC registers");
+               BUG();
+       }
+
+       /*
+        * rtc registers are used by read_persistent_clock, keep the rtc clock
+        * enabled
+        */
+       clk = clk_get_sys("rtc-tegra", NULL);
+       if (IS_ERR(clk))
+               pr_warn("Unable to get rtc-tegra clock\n");
+       else
+               clk_prepare_enable(clk);
+
+       of_node_put(np);
+
        register_persistent_clock(NULL, tegra_read_persistent_clock);
 }
-CLOCKSOURCE_OF_DECLARE(tegra20, "nvidia,tegra20-timer", tegra20_init_timer);
+CLOCKSOURCE_OF_DECLARE(tegra20_rtc, "nvidia,tegra20-rtc", tegra20_init_rtc);
 
 #ifdef CONFIG_PM
 static u32 usec_config;
index 8efc86b5b5ddfe3b216acf331c37003776a06b9f..64f553f04fa4b0d44f8218b2d98301ccb0c08c2b 100644 (file)
@@ -129,22 +129,10 @@ static struct irqaction irq = {
        .dev_id  = &clockevent,
 };
 
-static struct of_device_id vt8500_timer_ids[] = {
-       { .compatible = "via,vt8500-timer" },
-       { }
-};
-
-static void __init vt8500_timer_init(void)
+static void __init vt8500_timer_init(struct device_node *np)
 {
-       struct device_node *np;
        int timer_irq;
 
-       np = of_find_matching_node(NULL, vt8500_timer_ids);
-       if (!np) {
-               pr_err("%s: Timer description missing from Device Tree\n",
-                                                               __func__);
-               return;
-       }
        regbase = of_iomap(np, 0);
        if (!regbase) {
                pr_err("%s: Missing iobase description in Device Tree\n",
@@ -177,4 +165,4 @@ static void __init vt8500_timer_init(void)
                                        4, 0xf0000000);
 }
 
-CLOCKSOURCE_OF_DECLARE(vt8500, "via,vt8500-timer", vt8500_timer_init)
+CLOCKSOURCE_OF_DECLARE(vt8500, "via,vt8500-timer", vt8500_timer_init);
index 93aaadf99f28c34c23be40a8e2a4f5148c450641..d766e3cbef18377b756650f5f182761fc6f18d24 100644 (file)
@@ -204,6 +204,12 @@ config GPIO_PXA
        help
          Say yes here to support the PXA GPIO device
 
+config GPIO_RCAR
+       tristate "Renesas R-Car GPIO"
+       depends on ARM
+       help
+         Say yes here to support GPIO on Renesas R-Car SoCs.
+
 config GPIO_SPEAR_SPICS
        bool "ST SPEAr13xx SPI Chip Select as GPIO support"
        depends on PLAT_SPEAR
index 22e07bc9fcb58d3ea3f5d60ab12e54fb1d15af74..b41c74d4528744e279f7a0ef323ab20d9c079c57 100644 (file)
@@ -57,6 +57,7 @@ obj-$(CONFIG_GPIO_PL061)      += gpio-pl061.o
 obj-$(CONFIG_GPIO_PXA)         += gpio-pxa.o
 obj-$(CONFIG_GPIO_RC5T583)     += gpio-rc5t583.o
 obj-$(CONFIG_GPIO_RDC321X)     += gpio-rdc321x.o
+obj-$(CONFIG_GPIO_RCAR)                += gpio-rcar.o
 obj-$(CONFIG_PLAT_SAMSUNG)     += gpio-samsung.o
 obj-$(CONFIG_ARCH_SA1100)      += gpio-sa1100.o
 obj-$(CONFIG_GPIO_SCH)         += gpio-sch.o
index 55a7e7769af6e21bb448c33afc8a1b5dc45b9fc4..dd2eddeb1e0c43e1511edd98b5617c31b3538ce7 100644 (file)
 #include <linux/init.h>
 #include <linux/interrupt.h>
 #include <linux/io.h>
+#include <linux/irqchip/chained_irq.h>
 #include <linux/irq.h>
 #include <linux/module.h>
 #include <linux/platform_device.h>
 #include <linux/spinlock.h>
 
-#include <asm/mach/irq.h>
-
 #include <mach/msm_gpiomux.h>
 #include <mach/msm_iomap.h>
 
index 7877335c4cc80a62b3311d8d6126aa973b203aff..7176743915d3df032cefa2ec33a327f7b22f799b 100644 (file)
@@ -24,6 +24,7 @@
 #include <linux/io.h>
 #include <linux/irq.h>
 #include <linux/irqdomain.h>
+#include <linux/irqchip/chained_irq.h>
 #include <linux/gpio.h>
 #include <linux/platform_device.h>
 #include <linux/slab.h>
@@ -32,7 +33,6 @@
 #include <linux/of_device.h>
 #include <linux/module.h>
 #include <asm-generic/bug.h>
-#include <asm/mach/irq.h>
 
 enum mxc_gpio_hwtype {
        IMX1_GPIO,      /* runs on i.mx1 */
index 159f5c57eb451efb2eabd3ab57dac11db56f4654..a612ea1c53cbcb514a84431d0a31501a7a6a5efe 100644 (file)
 #include <linux/of.h>
 #include <linux/of_device.h>
 #include <linux/irqdomain.h>
+#include <linux/irqchip/chained_irq.h>
 #include <linux/gpio.h>
 #include <linux/platform_data/gpio-omap.h>
 
-#include <asm/mach/irq.h>
-
 #define OFF_MODE       1
 
 static LIST_HEAD(omap_gpio_list);
index b820869ca93c812f8b894554b42b506e121429ba..5c06f30625997d175e5ff04255a7c845dc047640 100644 (file)
@@ -15,6 +15,8 @@
 #include <linux/io.h>
 #include <linux/ioport.h>
 #include <linux/irq.h>
+#include <linux/irqchip/chained_irq.h>
+#include <linux/irqdomain.h>
 #include <linux/bitops.h>
 #include <linux/workqueue.h>
 #include <linux/gpio.h>
@@ -22,8 +24,8 @@
 #include <linux/amba/bus.h>
 #include <linux/amba/pl061.h>
 #include <linux/slab.h>
+#include <linux/pinctrl/consumer.h>
 #include <linux/pm.h>
-#include <asm/mach/irq.h>
 
 #define GPIODIR 0x400
 #define GPIOIS  0x404
@@ -51,8 +53,7 @@ struct pl061_gpio {
        spinlock_t              lock;
 
        void __iomem            *base;
-       int                     irq_base;
-       struct irq_chip_generic *irq_gc;
+       struct irq_domain       *domain;
        struct gpio_chip        gc;
 
 #ifdef CONFIG_PM
@@ -60,6 +61,17 @@ struct pl061_gpio {
 #endif
 };
 
+static int pl061_gpio_request(struct gpio_chip *chip, unsigned offset)
+{
+       /*
+        * Map back to global GPIO space and request muxing, the direction
+        * parameter does not matter for this controller.
+        */
+       int gpio = chip->base + offset;
+
+       return pinctrl_request_gpio(gpio);
+}
+
 static int pl061_direction_input(struct gpio_chip *gc, unsigned offset)
 {
        struct pl061_gpio *chip = container_of(gc, struct pl061_gpio, gc);
@@ -122,24 +134,20 @@ static int pl061_to_irq(struct gpio_chip *gc, unsigned offset)
 {
        struct pl061_gpio *chip = container_of(gc, struct pl061_gpio, gc);
 
-       if (chip->irq_base <= 0)
-               return -EINVAL;
-
-       return chip->irq_base + offset;
+       return irq_create_mapping(chip->domain, offset);
 }
 
 static int pl061_irq_type(struct irq_data *d, unsigned trigger)
 {
-       struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d);
-       struct pl061_gpio *chip = gc->private;
-       int offset = d->irq - chip->irq_base;
+       struct pl061_gpio *chip = irq_data_get_irq_chip_data(d);
+       int offset = irqd_to_hwirq(d);
        unsigned long flags;
        u8 gpiois, gpioibe, gpioiev;
 
        if (offset < 0 || offset >= PL061_GPIO_NR)
                return -EINVAL;
 
-       raw_spin_lock_irqsave(&gc->lock, flags);
+       spin_lock_irqsave(&chip->lock, flags);
 
        gpioiev = readb(chip->base + GPIOIEV);
 
@@ -168,7 +176,7 @@ static int pl061_irq_type(struct irq_data *d, unsigned trigger)
 
        writeb(gpioiev, chip->base + GPIOIEV);
 
-       raw_spin_unlock_irqrestore(&gc->lock, flags);
+       spin_unlock_irqrestore(&chip->lock, flags);
 
        return 0;
 }
@@ -192,31 +200,61 @@ static void pl061_irq_handler(unsigned irq, struct irq_desc *desc)
        chained_irq_exit(irqchip, desc);
 }
 
-static void __init pl061_init_gc(struct pl061_gpio *chip, int irq_base)
+static void pl061_irq_mask(struct irq_data *d)
 {
-       struct irq_chip_type *ct;
+       struct pl061_gpio *chip = irq_data_get_irq_chip_data(d);
+       u8 mask = 1 << (irqd_to_hwirq(d) % PL061_GPIO_NR);
+       u8 gpioie;
+
+       spin_lock(&chip->lock);
+       gpioie = readb(chip->base + GPIOIE) & ~mask;
+       writeb(gpioie, chip->base + GPIOIE);
+       spin_unlock(&chip->lock);
+}
+
+static void pl061_irq_unmask(struct irq_data *d)
+{
+       struct pl061_gpio *chip = irq_data_get_irq_chip_data(d);
+       u8 mask = 1 << (irqd_to_hwirq(d) % PL061_GPIO_NR);
+       u8 gpioie;
+
+       spin_lock(&chip->lock);
+       gpioie = readb(chip->base + GPIOIE) | mask;
+       writeb(gpioie, chip->base + GPIOIE);
+       spin_unlock(&chip->lock);
+}
 
-       chip->irq_gc = irq_alloc_generic_chip("gpio-pl061", 1, irq_base,
-                                             chip->base, handle_simple_irq);
-       chip->irq_gc->private = chip;
+static struct irq_chip pl061_irqchip = {
+       .name           = "pl061 gpio",
+       .irq_mask       = pl061_irq_mask,
+       .irq_unmask     = pl061_irq_unmask,
+       .irq_set_type   = pl061_irq_type,
+};
+
+static int pl061_irq_map(struct irq_domain *d, unsigned int virq,
+                        irq_hw_number_t hw)
+{
+       struct pl061_gpio *chip = d->host_data;
 
-       ct = chip->irq_gc->chip_types;
-       ct->chip.irq_mask = irq_gc_mask_clr_bit;
-       ct->chip.irq_unmask = irq_gc_mask_set_bit;
-       ct->chip.irq_set_type = pl061_irq_type;
-       ct->chip.irq_set_wake = irq_gc_set_wake;
-       ct->regs.mask = GPIOIE;
+       irq_set_chip_and_handler_name(virq, &pl061_irqchip, handle_simple_irq,
+                                     "pl061");
+       irq_set_chip_data(virq, chip);
+       irq_set_irq_type(virq, IRQ_TYPE_NONE);
 
-       irq_setup_generic_chip(chip->irq_gc, IRQ_MSK(PL061_GPIO_NR),
-                              IRQ_GC_INIT_NESTED_LOCK, IRQ_NOREQUEST, 0);
+       return 0;
 }
 
+static const struct irq_domain_ops pl061_domain_ops = {
+       .map    = pl061_irq_map,
+       .xlate  = irq_domain_xlate_twocell,
+};
+
 static int pl061_probe(struct amba_device *adev, const struct amba_id *id)
 {
        struct device *dev = &adev->dev;
        struct pl061_platform_data *pdata = dev->platform_data;
        struct pl061_gpio *chip;
-       int ret, irq, i;
+       int ret, irq, i, irq_base;
 
        chip = devm_kzalloc(dev, sizeof(*chip), GFP_KERNEL);
        if (chip == NULL)
@@ -224,24 +262,31 @@ static int pl061_probe(struct amba_device *adev, const struct amba_id *id)
 
        if (pdata) {
                chip->gc.base = pdata->gpio_base;
-               chip->irq_base = pdata->irq_base;
-       } else if (adev->dev.of_node) {
+               irq_base = pdata->irq_base;
+               if (irq_base <= 0)
+                       return -ENODEV;
+       } else {
                chip->gc.base = -1;
-               chip->irq_base = 0;
-       } else
-               return -ENODEV;
+               irq_base = 0;
+       }
 
        if (!devm_request_mem_region(dev, adev->res.start,
-                               resource_size(&adev->res), "pl061"))
+                                    resource_size(&adev->res), "pl061"))
                return -EBUSY;
 
        chip->base = devm_ioremap(dev, adev->res.start,
-                               resource_size(&adev->res));
-       if (chip->base == NULL)
+                                 resource_size(&adev->res));
+       if (!chip->base)
                return -ENOMEM;
 
+       chip->domain = irq_domain_add_simple(adev->dev.of_node, PL061_GPIO_NR,
+                                            irq_base, &pl061_domain_ops, chip);
+       if (!chip->domain)
+               return -ENODEV;
+
        spin_lock_init(&chip->lock);
 
+       chip->gc.request = pl061_gpio_request;
        chip->gc.direction_input = pl061_direction_input;
        chip->gc.direction_output = pl061_direction_output;
        chip->gc.get = pl061_get_value;
@@ -259,12 +304,6 @@ static int pl061_probe(struct amba_device *adev, const struct amba_id *id)
        /*
         * irq_chip support
         */
-
-       if (chip->irq_base <= 0)
-               return 0;
-
-       pl061_init_gc(chip, chip->irq_base);
-
        writeb(0, chip->base + GPIOIE); /* disable irqs */
        irq = adev->irq[0];
        if (irq < 0)
index 9cc108d2b77081bc6aa666d08f394e09d2d8f623..7523b6d108d0c1336dc511980221bbc0179c1030 100644 (file)
@@ -19,6 +19,7 @@
 #include <linux/init.h>
 #include <linux/irq.h>
 #include <linux/irqdomain.h>
+#include <linux/irqchip/chained_irq.h>
 #include <linux/io.h>
 #include <linux/of.h>
 #include <linux/of_device.h>
@@ -26,8 +27,6 @@
 #include <linux/syscore_ops.h>
 #include <linux/slab.h>
 
-#include <asm/mach/irq.h>
-
 #include <mach/irqs.h>
 
 /*
diff --git a/drivers/gpio/gpio-rcar.c b/drivers/gpio/gpio-rcar.c
new file mode 100644 (file)
index 0000000..b4ca450
--- /dev/null
@@ -0,0 +1,396 @@
+/*
+ * Renesas R-Car GPIO Support
+ *
+ *  Copyright (C) 2013 Magnus Damm
+ *
+ * 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
+ *
+ * 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/gpio.h>
+#include <linux/init.h>
+#include <linux/interrupt.h>
+#include <linux/io.h>
+#include <linux/ioport.h>
+#include <linux/irq.h>
+#include <linux/irqdomain.h>
+#include <linux/module.h>
+#include <linux/pinctrl/consumer.h>
+#include <linux/platform_data/gpio-rcar.h>
+#include <linux/platform_device.h>
+#include <linux/spinlock.h>
+#include <linux/slab.h>
+
+struct gpio_rcar_priv {
+       void __iomem *base;
+       spinlock_t lock;
+       struct gpio_rcar_config config;
+       struct platform_device *pdev;
+       struct gpio_chip gpio_chip;
+       struct irq_chip irq_chip;
+       struct irq_domain *irq_domain;
+};
+
+#define IOINTSEL 0x00
+#define INOUTSEL 0x04
+#define OUTDT 0x08
+#define INDT 0x0c
+#define INTDT 0x10
+#define INTCLR 0x14
+#define INTMSK 0x18
+#define MSKCLR 0x1c
+#define POSNEG 0x20
+#define EDGLEVEL 0x24
+#define FILONOFF 0x28
+
+static inline u32 gpio_rcar_read(struct gpio_rcar_priv *p, int offs)
+{
+       return ioread32(p->base + offs);
+}
+
+static inline void gpio_rcar_write(struct gpio_rcar_priv *p, int offs,
+                                  u32 value)
+{
+       iowrite32(value, p->base + offs);
+}
+
+static void gpio_rcar_modify_bit(struct gpio_rcar_priv *p, int offs,
+                                int bit, bool value)
+{
+       u32 tmp = gpio_rcar_read(p, offs);
+
+       if (value)
+               tmp |= BIT(bit);
+       else
+               tmp &= ~BIT(bit);
+
+       gpio_rcar_write(p, offs, tmp);
+}
+
+static void gpio_rcar_irq_disable(struct irq_data *d)
+{
+       struct gpio_rcar_priv *p = irq_data_get_irq_chip_data(d);
+
+       gpio_rcar_write(p, INTMSK, ~BIT(irqd_to_hwirq(d)));
+}
+
+static void gpio_rcar_irq_enable(struct irq_data *d)
+{
+       struct gpio_rcar_priv *p = irq_data_get_irq_chip_data(d);
+
+       gpio_rcar_write(p, MSKCLR, BIT(irqd_to_hwirq(d)));
+}
+
+static void gpio_rcar_config_interrupt_input_mode(struct gpio_rcar_priv *p,
+                                                 unsigned int hwirq,
+                                                 bool active_high_rising_edge,
+                                                 bool level_trigger)
+{
+       unsigned long flags;
+
+       /* follow steps in the GPIO documentation for
+        * "Setting Edge-Sensitive Interrupt Input Mode" and
+        * "Setting Level-Sensitive Interrupt Input Mode"
+        */
+
+       spin_lock_irqsave(&p->lock, flags);
+
+       /* Configure postive or negative logic in POSNEG */
+       gpio_rcar_modify_bit(p, POSNEG, hwirq, !active_high_rising_edge);
+
+       /* Configure edge or level trigger in EDGLEVEL */
+       gpio_rcar_modify_bit(p, EDGLEVEL, hwirq, !level_trigger);
+
+       /* Select "Interrupt Input Mode" in IOINTSEL */
+       gpio_rcar_modify_bit(p, IOINTSEL, hwirq, true);
+
+       /* Write INTCLR in case of edge trigger */
+       if (!level_trigger)
+               gpio_rcar_write(p, INTCLR, BIT(hwirq));
+
+       spin_unlock_irqrestore(&p->lock, flags);
+}
+
+static int gpio_rcar_irq_set_type(struct irq_data *d, unsigned int type)
+{
+       struct gpio_rcar_priv *p = irq_data_get_irq_chip_data(d);
+       unsigned int hwirq = irqd_to_hwirq(d);
+
+       dev_dbg(&p->pdev->dev, "sense irq = %d, type = %d\n", hwirq, type);
+
+       switch (type & IRQ_TYPE_SENSE_MASK) {
+       case IRQ_TYPE_LEVEL_HIGH:
+               gpio_rcar_config_interrupt_input_mode(p, hwirq, true, true);
+               break;
+       case IRQ_TYPE_LEVEL_LOW:
+               gpio_rcar_config_interrupt_input_mode(p, hwirq, false, true);
+               break;
+       case IRQ_TYPE_EDGE_RISING:
+               gpio_rcar_config_interrupt_input_mode(p, hwirq, true, false);
+               break;
+       case IRQ_TYPE_EDGE_FALLING:
+               gpio_rcar_config_interrupt_input_mode(p, hwirq, false, false);
+               break;
+       default:
+               return -EINVAL;
+       }
+       return 0;
+}
+
+static irqreturn_t gpio_rcar_irq_handler(int irq, void *dev_id)
+{
+       struct gpio_rcar_priv *p = dev_id;
+       u32 pending;
+       unsigned int offset, irqs_handled = 0;
+
+       while ((pending = gpio_rcar_read(p, INTDT))) {
+               offset = __ffs(pending);
+               gpio_rcar_write(p, INTCLR, BIT(offset));
+               generic_handle_irq(irq_find_mapping(p->irq_domain, offset));
+               irqs_handled++;
+       }
+
+       return irqs_handled ? IRQ_HANDLED : IRQ_NONE;
+}
+
+static inline struct gpio_rcar_priv *gpio_to_priv(struct gpio_chip *chip)
+{
+       return container_of(chip, struct gpio_rcar_priv, gpio_chip);
+}
+
+static void gpio_rcar_config_general_input_output_mode(struct gpio_chip *chip,
+                                                      unsigned int gpio,
+                                                      bool output)
+{
+       struct gpio_rcar_priv *p = gpio_to_priv(chip);
+       unsigned long flags;
+
+       /* follow steps in the GPIO documentation for
+        * "Setting General Output Mode" and
+        * "Setting General Input Mode"
+        */
+
+       spin_lock_irqsave(&p->lock, flags);
+
+       /* Configure postive logic in POSNEG */
+       gpio_rcar_modify_bit(p, POSNEG, gpio, false);
+
+       /* Select "General Input/Output Mode" in IOINTSEL */
+       gpio_rcar_modify_bit(p, IOINTSEL, gpio, false);
+
+       /* Select Input Mode or Output Mode in INOUTSEL */
+       gpio_rcar_modify_bit(p, INOUTSEL, gpio, output);
+
+       spin_unlock_irqrestore(&p->lock, flags);
+}
+
+static int gpio_rcar_request(struct gpio_chip *chip, unsigned offset)
+{
+       return pinctrl_request_gpio(chip->base + offset);
+}
+
+static void gpio_rcar_free(struct gpio_chip *chip, unsigned offset)
+{
+       pinctrl_free_gpio(chip->base + offset);
+
+       /* Set the GPIO as an input to ensure that the next GPIO request won't
+        * drive the GPIO pin as an output.
+        */
+       gpio_rcar_config_general_input_output_mode(chip, offset, false);
+}
+
+static int gpio_rcar_direction_input(struct gpio_chip *chip, unsigned offset)
+{
+       gpio_rcar_config_general_input_output_mode(chip, offset, false);
+       return 0;
+}
+
+static int gpio_rcar_get(struct gpio_chip *chip, unsigned offset)
+{
+       return (int)(gpio_rcar_read(gpio_to_priv(chip), INDT) & BIT(offset));
+}
+
+static void gpio_rcar_set(struct gpio_chip *chip, unsigned offset, int value)
+{
+       struct gpio_rcar_priv *p = gpio_to_priv(chip);
+       unsigned long flags;
+
+       spin_lock_irqsave(&p->lock, flags);
+       gpio_rcar_modify_bit(p, OUTDT, offset, value);
+       spin_unlock_irqrestore(&p->lock, flags);
+}
+
+static int gpio_rcar_direction_output(struct gpio_chip *chip, unsigned offset,
+                                     int value)
+{
+       /* write GPIO value to output before selecting output mode of pin */
+       gpio_rcar_set(chip, offset, value);
+       gpio_rcar_config_general_input_output_mode(chip, offset, true);
+       return 0;
+}
+
+static int gpio_rcar_to_irq(struct gpio_chip *chip, unsigned offset)
+{
+       return irq_create_mapping(gpio_to_priv(chip)->irq_domain, offset);
+}
+
+static int gpio_rcar_irq_domain_map(struct irq_domain *h, unsigned int virq,
+                                irq_hw_number_t hw)
+{
+       struct gpio_rcar_priv *p = h->host_data;
+
+       dev_dbg(&p->pdev->dev, "map hw irq = %d, virq = %d\n", (int)hw, virq);
+
+       irq_set_chip_data(virq, h->host_data);
+       irq_set_chip_and_handler(virq, &p->irq_chip, handle_level_irq);
+       set_irq_flags(virq, IRQF_VALID); /* kill me now */
+       return 0;
+}
+
+static struct irq_domain_ops gpio_rcar_irq_domain_ops = {
+       .map    = gpio_rcar_irq_domain_map,
+};
+
+static int gpio_rcar_probe(struct platform_device *pdev)
+{
+       struct gpio_rcar_config *pdata = pdev->dev.platform_data;
+       struct gpio_rcar_priv *p;
+       struct resource *io, *irq;
+       struct gpio_chip *gpio_chip;
+       struct irq_chip *irq_chip;
+       const char *name = dev_name(&pdev->dev);
+       int ret;
+
+       p = devm_kzalloc(&pdev->dev, sizeof(*p), GFP_KERNEL);
+       if (!p) {
+               dev_err(&pdev->dev, "failed to allocate driver data\n");
+               ret = -ENOMEM;
+               goto err0;
+       }
+
+       /* deal with driver instance configuration */
+       if (pdata)
+               p->config = *pdata;
+
+       p->pdev = pdev;
+       platform_set_drvdata(pdev, p);
+       spin_lock_init(&p->lock);
+
+       io = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       irq = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
+
+       if (!io || !irq) {
+               dev_err(&pdev->dev, "missing IRQ or IOMEM\n");
+               ret = -EINVAL;
+               goto err0;
+       }
+
+       p->base = devm_ioremap_nocache(&pdev->dev, io->start,
+                                      resource_size(io));
+       if (!p->base) {
+               dev_err(&pdev->dev, "failed to remap I/O memory\n");
+               ret = -ENXIO;
+               goto err0;
+       }
+
+       gpio_chip = &p->gpio_chip;
+       gpio_chip->request = gpio_rcar_request;
+       gpio_chip->free = gpio_rcar_free;
+       gpio_chip->direction_input = gpio_rcar_direction_input;
+       gpio_chip->get = gpio_rcar_get;
+       gpio_chip->direction_output = gpio_rcar_direction_output;
+       gpio_chip->set = gpio_rcar_set;
+       gpio_chip->to_irq = gpio_rcar_to_irq;
+       gpio_chip->label = name;
+       gpio_chip->owner = THIS_MODULE;
+       gpio_chip->base = p->config.gpio_base;
+       gpio_chip->ngpio = p->config.number_of_pins;
+
+       irq_chip = &p->irq_chip;
+       irq_chip->name = name;
+       irq_chip->irq_mask = gpio_rcar_irq_disable;
+       irq_chip->irq_unmask = gpio_rcar_irq_enable;
+       irq_chip->irq_enable = gpio_rcar_irq_enable;
+       irq_chip->irq_disable = gpio_rcar_irq_disable;
+       irq_chip->irq_set_type = gpio_rcar_irq_set_type;
+       irq_chip->flags = IRQCHIP_SKIP_SET_WAKE | IRQCHIP_SET_TYPE_MASKED;
+
+       p->irq_domain = irq_domain_add_simple(pdev->dev.of_node,
+                                             p->config.number_of_pins,
+                                             p->config.irq_base,
+                                             &gpio_rcar_irq_domain_ops, p);
+       if (!p->irq_domain) {
+               ret = -ENXIO;
+               dev_err(&pdev->dev, "cannot initialize irq domain\n");
+               goto err1;
+       }
+
+       if (devm_request_irq(&pdev->dev, irq->start,
+                            gpio_rcar_irq_handler, 0, name, p)) {
+               dev_err(&pdev->dev, "failed to request IRQ\n");
+               ret = -ENOENT;
+               goto err1;
+       }
+
+       ret = gpiochip_add(gpio_chip);
+       if (ret) {
+               dev_err(&pdev->dev, "failed to add GPIO controller\n");
+               goto err1;
+       }
+
+       dev_info(&pdev->dev, "driving %d GPIOs\n", p->config.number_of_pins);
+
+       /* warn in case of mismatch if irq base is specified */
+       if (p->config.irq_base) {
+               ret = irq_find_mapping(p->irq_domain, 0);
+               if (p->config.irq_base != ret)
+                       dev_warn(&pdev->dev, "irq base mismatch (%u/%u)\n",
+                                p->config.irq_base, ret);
+       }
+
+       ret = gpiochip_add_pin_range(gpio_chip, p->config.pctl_name, 0,
+                                    gpio_chip->base, gpio_chip->ngpio);
+       if (ret < 0)
+               dev_warn(&pdev->dev, "failed to add pin range\n");
+
+       return 0;
+
+err1:
+       irq_domain_remove(p->irq_domain);
+err0:
+       return ret;
+}
+
+static int gpio_rcar_remove(struct platform_device *pdev)
+{
+       struct gpio_rcar_priv *p = platform_get_drvdata(pdev);
+       int ret;
+
+       ret = gpiochip_remove(&p->gpio_chip);
+       if (ret)
+               return ret;
+
+       irq_domain_remove(p->irq_domain);
+       return 0;
+}
+
+static struct platform_driver gpio_rcar_device_driver = {
+       .probe          = gpio_rcar_probe,
+       .remove         = gpio_rcar_remove,
+       .driver         = {
+               .name   = "gpio_rcar",
+       }
+};
+
+module_platform_driver(gpio_rcar_device_driver);
+
+MODULE_AUTHOR("Magnus Damm");
+MODULE_DESCRIPTION("Renesas R-Car GPIO Driver");
+MODULE_LICENSE("GPL v2");
index 414ad912232f9ecc1558c42e865d289920375dfc..8e21555488883d34fbc4f086baf72ec93b9bbc4f 100644 (file)
 #include <linux/platform_device.h>
 #include <linux/module.h>
 #include <linux/irqdomain.h>
+#include <linux/irqchip/chained_irq.h>
 #include <linux/pinctrl/consumer.h>
 #include <linux/pm.h>
 
-#include <asm/mach/irq.h>
-
 #define GPIO_BANK(x)           ((x) >> 5)
 #define GPIO_PORT(x)           (((x) >> 3) & 0x3)
 #define GPIO_BIT(x)            ((x) & 0x7)
index 5150df6cba0815623c9fc7c86e96ff2ad099f0ed..465f4ca57e8008f2617b3a39435f33ed4f50ec46 100644 (file)
@@ -203,22 +203,11 @@ static void of_gpiochip_add_pin_range(struct gpio_chip *chip)
                if (!pctldev)
                        break;
 
-               /*
-                * This assumes that the n GPIO pins are consecutive in the
-                * GPIO number space, and that the pins are also consecutive
-                * in their local number space. Currently it is not possible
-                * to add different ranges for one and the same GPIO chip,
-                * as the code assumes that we have one consecutive range
-                * on both, mapping 1-to-1.
-                *
-                * TODO: make the OF bindings handle multiple sparse ranges
-                * on the same GPIO chip.
-                */
                ret = gpiochip_add_pin_range(chip,
                                             pinctrl_dev_get_devname(pctldev),
-                                            0, /* offset in gpiochip */
                                             pinspec.args[0],
-                                            pinspec.args[1]);
+                                            pinspec.args[1],
+                                            pinspec.args[2]);
 
                if (ret)
                        break;
index a350969e5efe4254c65b7ed7841609bebb1b0102..4a33351c25dce61c805a9c99258f893792a1ec2a 100644 (file)
@@ -25,6 +25,14 @@ config ARM_VIC_NR
          The maximum number of VICs available in the system, for
          power management.
 
+config RENESAS_INTC_IRQPIN
+       bool
+       select IRQ_DOMAIN
+
+config RENESAS_IRQC
+       bool
+       select IRQ_DOMAIN
+
 config VERSATILE_FPGA_IRQ
        bool
        select IRQ_DOMAIN
index 98e3b87bdf1b48761df4320a9c588af26f38bb2c..e41ceb9bec227731c522b2203990b1316f608583 100644 (file)
@@ -8,4 +8,6 @@ obj-$(CONFIG_ARCH_SUNXI)                += irq-sunxi.o
 obj-$(CONFIG_ARCH_SPEAR3XX)            += spear-shirq.o
 obj-$(CONFIG_ARM_GIC)                  += irq-gic.o
 obj-$(CONFIG_ARM_VIC)                  += irq-vic.o
+obj-$(CONFIG_RENESAS_INTC_IRQPIN)      += irq-renesas-intc-irqpin.o
+obj-$(CONFIG_RENESAS_IRQC)             += irq-renesas-irqc.o
 obj-$(CONFIG_VERSATILE_FPGA_IRQ)       += irq-versatile-fpga.o
index 04d86a9803f44862f6686513f8702870d03737be..6a52013515073b8939adedb4237c162b326b67f4 100644 (file)
@@ -13,6 +13,7 @@
 #include <linux/init.h>
 #include <linux/io.h>
 #include <linux/irqdomain.h>
+#include <linux/irqchip/chained_irq.h>
 #include <linux/of_address.h>
 #include <linux/of_irq.h>
 #include <asm/mach/irq.h>
index a32e0d5aa45f43eb71c91ab9020696436212ae95..add1fd84fc4bb764b856e861b3411dec9c9ac8c5 100644 (file)
@@ -28,6 +28,7 @@
 #include <linux/module.h>
 #include <linux/list.h>
 #include <linux/smp.h>
+#include <linux/cpu.h>
 #include <linux/cpu_pm.h>
 #include <linux/cpumask.h>
 #include <linux/io.h>
 #include <linux/interrupt.h>
 #include <linux/percpu.h>
 #include <linux/slab.h>
+#include <linux/irqchip/chained_irq.h>
 #include <linux/irqchip/arm-gic.h>
 
 #include <asm/irq.h>
 #include <asm/exception.h>
 #include <asm/smp_plat.h>
-#include <asm/mach/irq.h>
 
 #include "irqchip.h"
 
@@ -323,7 +324,7 @@ static void gic_handle_cascade_irq(unsigned int irq, struct irq_desc *desc)
 
        cascade_irq = irq_find_mapping(chip_data->domain, gic_irq);
        if (unlikely(gic_irq < 32 || gic_irq > 1020))
-               do_bad_IRQ(cascade_irq, desc);
+               handle_bad_irq(cascade_irq, desc);
        else
                generic_handle_irq(cascade_irq);
 
@@ -699,6 +700,25 @@ static int gic_irq_domain_xlate(struct irq_domain *d,
        return 0;
 }
 
+#ifdef CONFIG_SMP
+static int __cpuinit gic_secondary_init(struct notifier_block *nfb,
+                                       unsigned long action, void *hcpu)
+{
+       if (action == CPU_STARTING)
+               gic_cpu_init(&gic_data[0]);
+       return NOTIFY_OK;
+}
+
+/*
+ * Notifier for enabling the GIC CPU interface. Set an arbitrarily high
+ * priority because the GIC needs to be up before the ARM generic timers.
+ */
+static struct notifier_block __cpuinitdata gic_cpu_notifier = {
+       .notifier_call = gic_secondary_init,
+       .priority = 100,
+};
+#endif
+
 const struct irq_domain_ops gic_irq_domain_ops = {
        .map = gic_irq_domain_map,
        .xlate = gic_irq_domain_xlate,
@@ -789,6 +809,7 @@ void __init gic_init_bases(unsigned int gic_nr, int irq_start,
 
 #ifdef CONFIG_SMP
        set_smp_cross_call(gic_raise_softirq);
+       register_cpu_notifier(&gic_cpu_notifier);
 #endif
 
        set_handle_irq(gic_handle_irq);
@@ -799,13 +820,6 @@ void __init gic_init_bases(unsigned int gic_nr, int irq_start,
        gic_pm_init(gic);
 }
 
-void __cpuinit gic_secondary_init(unsigned int gic_nr)
-{
-       BUG_ON(gic_nr >= MAX_GIC_NR);
-
-       gic_cpu_init(&gic_data[gic_nr]);
-}
-
 #ifdef CONFIG_OF
 static int gic_cnt __initdata = 0;
 
diff --git a/drivers/irqchip/irq-renesas-intc-irqpin.c b/drivers/irqchip/irq-renesas-intc-irqpin.c
new file mode 100644 (file)
index 0000000..5a68e5a
--- /dev/null
@@ -0,0 +1,547 @@
+/*
+ * Renesas INTC External IRQ Pin Driver
+ *
+ *  Copyright (C) 2013 Magnus Damm
+ *
+ * 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
+ *
+ * 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/init.h>
+#include <linux/platform_device.h>
+#include <linux/spinlock.h>
+#include <linux/interrupt.h>
+#include <linux/ioport.h>
+#include <linux/io.h>
+#include <linux/irq.h>
+#include <linux/irqdomain.h>
+#include <linux/err.h>
+#include <linux/slab.h>
+#include <linux/module.h>
+#include <linux/platform_data/irq-renesas-intc-irqpin.h>
+
+#define INTC_IRQPIN_MAX 8 /* maximum 8 interrupts per driver instance */
+
+#define INTC_IRQPIN_REG_SENSE 0 /* ICRn */
+#define INTC_IRQPIN_REG_PRIO 1 /* INTPRInn */
+#define INTC_IRQPIN_REG_SOURCE 2 /* INTREQnn */
+#define INTC_IRQPIN_REG_MASK 3 /* INTMSKnn */
+#define INTC_IRQPIN_REG_CLEAR 4 /* INTMSKCLRnn */
+#define INTC_IRQPIN_REG_NR 5
+
+/* INTC external IRQ PIN hardware register access:
+ *
+ * SENSE is read-write 32-bit with 2-bits or 4-bits per IRQ (*)
+ * PRIO is read-write 32-bit with 4-bits per IRQ (**)
+ * SOURCE is read-only 32-bit or 8-bit with 1-bit per IRQ (***)
+ * MASK is write-only 32-bit or 8-bit with 1-bit per IRQ (***)
+ * CLEAR is write-only 32-bit or 8-bit with 1-bit per IRQ (***)
+ *
+ * (*) May be accessed by more than one driver instance - lock needed
+ * (**) Read-modify-write access by one driver instance - lock needed
+ * (***) Accessed by one driver instance only - no locking needed
+ */
+
+struct intc_irqpin_iomem {
+       void __iomem *iomem;
+       unsigned long (*read)(void __iomem *iomem);
+       void (*write)(void __iomem *iomem, unsigned long data);
+       int width;
+};
+
+struct intc_irqpin_irq {
+       int hw_irq;
+       int requested_irq;
+       int domain_irq;
+       struct intc_irqpin_priv *p;
+};
+
+struct intc_irqpin_priv {
+       struct intc_irqpin_iomem iomem[INTC_IRQPIN_REG_NR];
+       struct intc_irqpin_irq irq[INTC_IRQPIN_MAX];
+       struct renesas_intc_irqpin_config config;
+       unsigned int number_of_irqs;
+       struct platform_device *pdev;
+       struct irq_chip irq_chip;
+       struct irq_domain *irq_domain;
+       bool shared_irqs;
+       u8 shared_irq_mask;
+};
+
+static unsigned long intc_irqpin_read32(void __iomem *iomem)
+{
+       return ioread32(iomem);
+}
+
+static unsigned long intc_irqpin_read8(void __iomem *iomem)
+{
+       return ioread8(iomem);
+}
+
+static void intc_irqpin_write32(void __iomem *iomem, unsigned long data)
+{
+       iowrite32(data, iomem);
+}
+
+static void intc_irqpin_write8(void __iomem *iomem, unsigned long data)
+{
+       iowrite8(data, iomem);
+}
+
+static inline unsigned long intc_irqpin_read(struct intc_irqpin_priv *p,
+                                            int reg)
+{
+       struct intc_irqpin_iomem *i = &p->iomem[reg];
+
+       return i->read(i->iomem);
+}
+
+static inline void intc_irqpin_write(struct intc_irqpin_priv *p,
+                                    int reg, unsigned long data)
+{
+       struct intc_irqpin_iomem *i = &p->iomem[reg];
+
+       i->write(i->iomem, data);
+}
+
+static inline unsigned long intc_irqpin_hwirq_mask(struct intc_irqpin_priv *p,
+                                                  int reg, int hw_irq)
+{
+       return BIT((p->iomem[reg].width - 1) - hw_irq);
+}
+
+static inline void intc_irqpin_irq_write_hwirq(struct intc_irqpin_priv *p,
+                                              int reg, int hw_irq)
+{
+       intc_irqpin_write(p, reg, intc_irqpin_hwirq_mask(p, reg, hw_irq));
+}
+
+static DEFINE_RAW_SPINLOCK(intc_irqpin_lock); /* only used by slow path */
+
+static void intc_irqpin_read_modify_write(struct intc_irqpin_priv *p,
+                                         int reg, int shift,
+                                         int width, int value)
+{
+       unsigned long flags;
+       unsigned long tmp;
+
+       raw_spin_lock_irqsave(&intc_irqpin_lock, flags);
+
+       tmp = intc_irqpin_read(p, reg);
+       tmp &= ~(((1 << width) - 1) << shift);
+       tmp |= value << shift;
+       intc_irqpin_write(p, reg, tmp);
+
+       raw_spin_unlock_irqrestore(&intc_irqpin_lock, flags);
+}
+
+static void intc_irqpin_mask_unmask_prio(struct intc_irqpin_priv *p,
+                                        int irq, int do_mask)
+{
+       int bitfield_width = 4; /* PRIO assumed to have fixed bitfield width */
+       int shift = (7 - irq) * bitfield_width; /* PRIO assumed to be 32-bit */
+
+       intc_irqpin_read_modify_write(p, INTC_IRQPIN_REG_PRIO,
+                                     shift, bitfield_width,
+                                     do_mask ? 0 : (1 << bitfield_width) - 1);
+}
+
+static int intc_irqpin_set_sense(struct intc_irqpin_priv *p, int irq, int value)
+{
+       int bitfield_width = p->config.sense_bitfield_width;
+       int shift = (7 - irq) * bitfield_width; /* SENSE assumed to be 32-bit */
+
+       dev_dbg(&p->pdev->dev, "sense irq = %d, mode = %d\n", irq, value);
+
+       if (value >= (1 << bitfield_width))
+               return -EINVAL;
+
+       intc_irqpin_read_modify_write(p, INTC_IRQPIN_REG_SENSE, shift,
+                                     bitfield_width, value);
+       return 0;
+}
+
+static void intc_irqpin_dbg(struct intc_irqpin_irq *i, char *str)
+{
+       dev_dbg(&i->p->pdev->dev, "%s (%d:%d:%d)\n",
+               str, i->requested_irq, i->hw_irq, i->domain_irq);
+}
+
+static void intc_irqpin_irq_enable(struct irq_data *d)
+{
+       struct intc_irqpin_priv *p = irq_data_get_irq_chip_data(d);
+       int hw_irq = irqd_to_hwirq(d);
+
+       intc_irqpin_dbg(&p->irq[hw_irq], "enable");
+       intc_irqpin_irq_write_hwirq(p, INTC_IRQPIN_REG_CLEAR, hw_irq);
+}
+
+static void intc_irqpin_irq_disable(struct irq_data *d)
+{
+       struct intc_irqpin_priv *p = irq_data_get_irq_chip_data(d);
+       int hw_irq = irqd_to_hwirq(d);
+
+       intc_irqpin_dbg(&p->irq[hw_irq], "disable");
+       intc_irqpin_irq_write_hwirq(p, INTC_IRQPIN_REG_MASK, hw_irq);
+}
+
+static void intc_irqpin_shared_irq_enable(struct irq_data *d)
+{
+       struct intc_irqpin_priv *p = irq_data_get_irq_chip_data(d);
+       int hw_irq = irqd_to_hwirq(d);
+
+       intc_irqpin_dbg(&p->irq[hw_irq], "shared enable");
+       intc_irqpin_irq_write_hwirq(p, INTC_IRQPIN_REG_CLEAR, hw_irq);
+
+       p->shared_irq_mask &= ~BIT(hw_irq);
+}
+
+static void intc_irqpin_shared_irq_disable(struct irq_data *d)
+{
+       struct intc_irqpin_priv *p = irq_data_get_irq_chip_data(d);
+       int hw_irq = irqd_to_hwirq(d);
+
+       intc_irqpin_dbg(&p->irq[hw_irq], "shared disable");
+       intc_irqpin_irq_write_hwirq(p, INTC_IRQPIN_REG_MASK, hw_irq);
+
+       p->shared_irq_mask |= BIT(hw_irq);
+}
+
+static void intc_irqpin_irq_enable_force(struct irq_data *d)
+{
+       struct intc_irqpin_priv *p = irq_data_get_irq_chip_data(d);
+       int irq = p->irq[irqd_to_hwirq(d)].requested_irq;
+
+       intc_irqpin_irq_enable(d);
+
+       /* enable interrupt through parent interrupt controller,
+        * assumes non-shared interrupt with 1:1 mapping
+        * needed for busted IRQs on some SoCs like sh73a0
+        */
+       irq_get_chip(irq)->irq_unmask(irq_get_irq_data(irq));
+}
+
+static void intc_irqpin_irq_disable_force(struct irq_data *d)
+{
+       struct intc_irqpin_priv *p = irq_data_get_irq_chip_data(d);
+       int irq = p->irq[irqd_to_hwirq(d)].requested_irq;
+
+       /* disable interrupt through parent interrupt controller,
+        * assumes non-shared interrupt with 1:1 mapping
+        * needed for busted IRQs on some SoCs like sh73a0
+        */
+       irq_get_chip(irq)->irq_mask(irq_get_irq_data(irq));
+       intc_irqpin_irq_disable(d);
+}
+
+#define INTC_IRQ_SENSE_VALID 0x10
+#define INTC_IRQ_SENSE(x) (x + INTC_IRQ_SENSE_VALID)
+
+static unsigned char intc_irqpin_sense[IRQ_TYPE_SENSE_MASK + 1] = {
+       [IRQ_TYPE_EDGE_FALLING] = INTC_IRQ_SENSE(0x00),
+       [IRQ_TYPE_EDGE_RISING] = INTC_IRQ_SENSE(0x01),
+       [IRQ_TYPE_LEVEL_LOW] = INTC_IRQ_SENSE(0x02),
+       [IRQ_TYPE_LEVEL_HIGH] = INTC_IRQ_SENSE(0x03),
+       [IRQ_TYPE_EDGE_BOTH] = INTC_IRQ_SENSE(0x04),
+};
+
+static int intc_irqpin_irq_set_type(struct irq_data *d, unsigned int type)
+{
+       unsigned char value = intc_irqpin_sense[type & IRQ_TYPE_SENSE_MASK];
+       struct intc_irqpin_priv *p = irq_data_get_irq_chip_data(d);
+
+       if (!(value & INTC_IRQ_SENSE_VALID))
+               return -EINVAL;
+
+       return intc_irqpin_set_sense(p, irqd_to_hwirq(d),
+                                    value ^ INTC_IRQ_SENSE_VALID);
+}
+
+static irqreturn_t intc_irqpin_irq_handler(int irq, void *dev_id)
+{
+       struct intc_irqpin_irq *i = dev_id;
+       struct intc_irqpin_priv *p = i->p;
+       unsigned long bit;
+
+       intc_irqpin_dbg(i, "demux1");
+       bit = intc_irqpin_hwirq_mask(p, INTC_IRQPIN_REG_SOURCE, i->hw_irq);
+
+       if (intc_irqpin_read(p, INTC_IRQPIN_REG_SOURCE) & bit) {
+               intc_irqpin_write(p, INTC_IRQPIN_REG_SOURCE, ~bit);
+               intc_irqpin_dbg(i, "demux2");
+               generic_handle_irq(i->domain_irq);
+               return IRQ_HANDLED;
+       }
+       return IRQ_NONE;
+}
+
+static irqreturn_t intc_irqpin_shared_irq_handler(int irq, void *dev_id)
+{
+       struct intc_irqpin_priv *p = dev_id;
+       unsigned int reg_source = intc_irqpin_read(p, INTC_IRQPIN_REG_SOURCE);
+       irqreturn_t status = IRQ_NONE;
+       int k;
+
+       for (k = 0; k < 8; k++) {
+               if (reg_source & BIT(7 - k)) {
+                       if (BIT(k) & p->shared_irq_mask)
+                               continue;
+
+                       status |= intc_irqpin_irq_handler(irq, &p->irq[k]);
+               }
+       }
+
+       return status;
+}
+
+static int intc_irqpin_irq_domain_map(struct irq_domain *h, unsigned int virq,
+                                     irq_hw_number_t hw)
+{
+       struct intc_irqpin_priv *p = h->host_data;
+
+       p->irq[hw].domain_irq = virq;
+       p->irq[hw].hw_irq = hw;
+
+       intc_irqpin_dbg(&p->irq[hw], "map");
+       irq_set_chip_data(virq, h->host_data);
+       irq_set_chip_and_handler(virq, &p->irq_chip, handle_level_irq);
+       set_irq_flags(virq, IRQF_VALID); /* kill me now */
+       return 0;
+}
+
+static struct irq_domain_ops intc_irqpin_irq_domain_ops = {
+       .map    = intc_irqpin_irq_domain_map,
+       .xlate  = irq_domain_xlate_twocell,
+};
+
+static int intc_irqpin_probe(struct platform_device *pdev)
+{
+       struct renesas_intc_irqpin_config *pdata = pdev->dev.platform_data;
+       struct intc_irqpin_priv *p;
+       struct intc_irqpin_iomem *i;
+       struct resource *io[INTC_IRQPIN_REG_NR];
+       struct resource *irq;
+       struct irq_chip *irq_chip;
+       void (*enable_fn)(struct irq_data *d);
+       void (*disable_fn)(struct irq_data *d);
+       const char *name = dev_name(&pdev->dev);
+       int ref_irq;
+       int ret;
+       int k;
+
+       p = devm_kzalloc(&pdev->dev, sizeof(*p), GFP_KERNEL);
+       if (!p) {
+               dev_err(&pdev->dev, "failed to allocate driver data\n");
+               ret = -ENOMEM;
+               goto err0;
+       }
+
+       /* deal with driver instance configuration */
+       if (pdata)
+               memcpy(&p->config, pdata, sizeof(*pdata));
+       if (!p->config.sense_bitfield_width)
+               p->config.sense_bitfield_width = 4; /* default to 4 bits */
+
+       p->pdev = pdev;
+       platform_set_drvdata(pdev, p);
+
+       /* get hold of manadatory IOMEM */
+       for (k = 0; k < INTC_IRQPIN_REG_NR; k++) {
+               io[k] = platform_get_resource(pdev, IORESOURCE_MEM, k);
+               if (!io[k]) {
+                       dev_err(&pdev->dev, "not enough IOMEM resources\n");
+                       ret = -EINVAL;
+                       goto err0;
+               }
+       }
+
+       /* allow any number of IRQs between 1 and INTC_IRQPIN_MAX */
+       for (k = 0; k < INTC_IRQPIN_MAX; k++) {
+               irq = platform_get_resource(pdev, IORESOURCE_IRQ, k);
+               if (!irq)
+                       break;
+
+               p->irq[k].p = p;
+               p->irq[k].requested_irq = irq->start;
+       }
+
+       p->number_of_irqs = k;
+       if (p->number_of_irqs < 1) {
+               dev_err(&pdev->dev, "not enough IRQ resources\n");
+               ret = -EINVAL;
+               goto err0;
+       }
+
+       /* ioremap IOMEM and setup read/write callbacks */
+       for (k = 0; k < INTC_IRQPIN_REG_NR; k++) {
+               i = &p->iomem[k];
+
+               switch (resource_size(io[k])) {
+               case 1:
+                       i->width = 8;
+                       i->read = intc_irqpin_read8;
+                       i->write = intc_irqpin_write8;
+                       break;
+               case 4:
+                       i->width = 32;
+                       i->read = intc_irqpin_read32;
+                       i->write = intc_irqpin_write32;
+                       break;
+               default:
+                       dev_err(&pdev->dev, "IOMEM size mismatch\n");
+                       ret = -EINVAL;
+                       goto err0;
+               }
+
+               i->iomem = devm_ioremap_nocache(&pdev->dev, io[k]->start,
+                                               resource_size(io[k]));
+               if (!i->iomem) {
+                       dev_err(&pdev->dev, "failed to remap IOMEM\n");
+                       ret = -ENXIO;
+                       goto err0;
+               }
+       }
+
+       /* mask all interrupts using priority */
+       for (k = 0; k < p->number_of_irqs; k++)
+               intc_irqpin_mask_unmask_prio(p, k, 1);
+
+       /* clear all pending interrupts */
+       intc_irqpin_write(p, INTC_IRQPIN_REG_SOURCE, 0x0);
+
+       /* scan for shared interrupt lines */
+       ref_irq = p->irq[0].requested_irq;
+       p->shared_irqs = true;
+       for (k = 1; k < p->number_of_irqs; k++) {
+               if (ref_irq != p->irq[k].requested_irq) {
+                       p->shared_irqs = false;
+                       break;
+               }
+       }
+
+       /* use more severe masking method if requested */
+       if (p->config.control_parent) {
+               enable_fn = intc_irqpin_irq_enable_force;
+               disable_fn = intc_irqpin_irq_disable_force;
+       } else if (!p->shared_irqs) {
+               enable_fn = intc_irqpin_irq_enable;
+               disable_fn = intc_irqpin_irq_disable;
+       } else {
+               enable_fn = intc_irqpin_shared_irq_enable;
+               disable_fn = intc_irqpin_shared_irq_disable;
+       }
+
+       irq_chip = &p->irq_chip;
+       irq_chip->name = name;
+       irq_chip->irq_mask = disable_fn;
+       irq_chip->irq_unmask = enable_fn;
+       irq_chip->irq_enable = enable_fn;
+       irq_chip->irq_disable = disable_fn;
+       irq_chip->irq_set_type = intc_irqpin_irq_set_type;
+       irq_chip->flags = IRQCHIP_SKIP_SET_WAKE;
+
+       p->irq_domain = irq_domain_add_simple(pdev->dev.of_node,
+                                             p->number_of_irqs,
+                                             p->config.irq_base,
+                                             &intc_irqpin_irq_domain_ops, p);
+       if (!p->irq_domain) {
+               ret = -ENXIO;
+               dev_err(&pdev->dev, "cannot initialize irq domain\n");
+               goto err0;
+       }
+
+       if (p->shared_irqs) {
+               /* request one shared interrupt */
+               if (devm_request_irq(&pdev->dev, p->irq[0].requested_irq,
+                               intc_irqpin_shared_irq_handler,
+                               IRQF_SHARED, name, p)) {
+                       dev_err(&pdev->dev, "failed to request low IRQ\n");
+                       ret = -ENOENT;
+                       goto err1;
+               }
+       } else {
+               /* request interrupts one by one */
+               for (k = 0; k < p->number_of_irqs; k++) {
+                       if (devm_request_irq(&pdev->dev,
+                                       p->irq[k].requested_irq,
+                                       intc_irqpin_irq_handler,
+                                       0, name, &p->irq[k])) {
+                               dev_err(&pdev->dev,
+                                       "failed to request low IRQ\n");
+                               ret = -ENOENT;
+                               goto err1;
+                       }
+               }
+       }
+
+       /* unmask all interrupts on prio level */
+       for (k = 0; k < p->number_of_irqs; k++)
+               intc_irqpin_mask_unmask_prio(p, k, 0);
+
+       dev_info(&pdev->dev, "driving %d irqs\n", p->number_of_irqs);
+
+       /* warn in case of mismatch if irq base is specified */
+       if (p->config.irq_base) {
+               if (p->config.irq_base != p->irq[0].domain_irq)
+                       dev_warn(&pdev->dev, "irq base mismatch (%d/%d)\n",
+                                p->config.irq_base, p->irq[0].domain_irq);
+       }
+
+       return 0;
+
+err1:
+       irq_domain_remove(p->irq_domain);
+err0:
+       return ret;
+}
+
+static int intc_irqpin_remove(struct platform_device *pdev)
+{
+       struct intc_irqpin_priv *p = platform_get_drvdata(pdev);
+
+       irq_domain_remove(p->irq_domain);
+
+       return 0;
+}
+
+static const struct of_device_id intc_irqpin_dt_ids[] = {
+       { .compatible = "renesas,intc-irqpin", },
+       {},
+};
+MODULE_DEVICE_TABLE(of, intc_irqpin_dt_ids);
+
+static struct platform_driver intc_irqpin_device_driver = {
+       .probe          = intc_irqpin_probe,
+       .remove         = intc_irqpin_remove,
+       .driver         = {
+               .name   = "renesas_intc_irqpin",
+               .of_match_table = intc_irqpin_dt_ids,
+               .owner  = THIS_MODULE,
+       }
+};
+
+static int __init intc_irqpin_init(void)
+{
+       return platform_driver_register(&intc_irqpin_device_driver);
+}
+postcore_initcall(intc_irqpin_init);
+
+static void __exit intc_irqpin_exit(void)
+{
+       platform_driver_unregister(&intc_irqpin_device_driver);
+}
+module_exit(intc_irqpin_exit);
+
+MODULE_AUTHOR("Magnus Damm");
+MODULE_DESCRIPTION("Renesas INTC External IRQ Pin Driver");
+MODULE_LICENSE("GPL v2");
diff --git a/drivers/irqchip/irq-renesas-irqc.c b/drivers/irqchip/irq-renesas-irqc.c
new file mode 100644 (file)
index 0000000..927bff3
--- /dev/null
@@ -0,0 +1,307 @@
+/*
+ * Renesas IRQC Driver
+ *
+ *  Copyright (C) 2013 Magnus Damm
+ *
+ * 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
+ *
+ * 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/init.h>
+#include <linux/platform_device.h>
+#include <linux/spinlock.h>
+#include <linux/interrupt.h>
+#include <linux/ioport.h>
+#include <linux/io.h>
+#include <linux/irq.h>
+#include <linux/irqdomain.h>
+#include <linux/err.h>
+#include <linux/slab.h>
+#include <linux/module.h>
+#include <linux/platform_data/irq-renesas-irqc.h>
+
+#define IRQC_IRQ_MAX 32 /* maximum 32 interrupts per driver instance */
+
+#define IRQC_REQ_STS 0x00
+#define IRQC_EN_STS 0x04
+#define IRQC_EN_SET 0x08
+#define IRQC_INT_CPU_BASE(n) (0x000 + ((n) * 0x10))
+#define DETECT_STATUS 0x100
+#define IRQC_CONFIG(n) (0x180 + ((n) * 0x04))
+
+struct irqc_irq {
+       int hw_irq;
+       int requested_irq;
+       int domain_irq;
+       struct irqc_priv *p;
+};
+
+struct irqc_priv {
+       void __iomem *iomem;
+       void __iomem *cpu_int_base;
+       struct irqc_irq irq[IRQC_IRQ_MAX];
+       struct renesas_irqc_config config;
+       unsigned int number_of_irqs;
+       struct platform_device *pdev;
+       struct irq_chip irq_chip;
+       struct irq_domain *irq_domain;
+};
+
+static void irqc_dbg(struct irqc_irq *i, char *str)
+{
+       dev_dbg(&i->p->pdev->dev, "%s (%d:%d:%d)\n",
+               str, i->requested_irq, i->hw_irq, i->domain_irq);
+}
+
+static void irqc_irq_enable(struct irq_data *d)
+{
+       struct irqc_priv *p = irq_data_get_irq_chip_data(d);
+       int hw_irq = irqd_to_hwirq(d);
+
+       irqc_dbg(&p->irq[hw_irq], "enable");
+       iowrite32(BIT(hw_irq), p->cpu_int_base + IRQC_EN_SET);
+}
+
+static void irqc_irq_disable(struct irq_data *d)
+{
+       struct irqc_priv *p = irq_data_get_irq_chip_data(d);
+       int hw_irq = irqd_to_hwirq(d);
+
+       irqc_dbg(&p->irq[hw_irq], "disable");
+       iowrite32(BIT(hw_irq), p->cpu_int_base + IRQC_EN_STS);
+}
+
+#define INTC_IRQ_SENSE_VALID 0x10
+#define INTC_IRQ_SENSE(x) (x + INTC_IRQ_SENSE_VALID)
+
+static unsigned char irqc_sense[IRQ_TYPE_SENSE_MASK + 1] = {
+       [IRQ_TYPE_LEVEL_LOW] = INTC_IRQ_SENSE(0x01),
+       [IRQ_TYPE_LEVEL_HIGH] = INTC_IRQ_SENSE(0x02),
+       [IRQ_TYPE_EDGE_FALLING] = INTC_IRQ_SENSE(0x04), /* Synchronous */
+       [IRQ_TYPE_EDGE_RISING] = INTC_IRQ_SENSE(0x08), /* Synchronous */
+       [IRQ_TYPE_EDGE_BOTH] = INTC_IRQ_SENSE(0x0c),  /* Synchronous */
+};
+
+static int irqc_irq_set_type(struct irq_data *d, unsigned int type)
+{
+       struct irqc_priv *p = irq_data_get_irq_chip_data(d);
+       int hw_irq = irqd_to_hwirq(d);
+       unsigned char value = irqc_sense[type & IRQ_TYPE_SENSE_MASK];
+       unsigned long tmp;
+
+       irqc_dbg(&p->irq[hw_irq], "sense");
+
+       if (!(value & INTC_IRQ_SENSE_VALID))
+               return -EINVAL;
+
+       tmp = ioread32(p->iomem + IRQC_CONFIG(hw_irq));
+       tmp &= ~0x3f;
+       tmp |= value ^ INTC_IRQ_SENSE_VALID;
+       iowrite32(tmp, p->iomem + IRQC_CONFIG(hw_irq));
+       return 0;
+}
+
+static irqreturn_t irqc_irq_handler(int irq, void *dev_id)
+{
+       struct irqc_irq *i = dev_id;
+       struct irqc_priv *p = i->p;
+       unsigned long bit = BIT(i->hw_irq);
+
+       irqc_dbg(i, "demux1");
+
+       if (ioread32(p->iomem + DETECT_STATUS) & bit) {
+               iowrite32(bit, p->iomem + DETECT_STATUS);
+               irqc_dbg(i, "demux2");
+               generic_handle_irq(i->domain_irq);
+               return IRQ_HANDLED;
+       }
+       return IRQ_NONE;
+}
+
+static int irqc_irq_domain_map(struct irq_domain *h, unsigned int virq,
+                              irq_hw_number_t hw)
+{
+       struct irqc_priv *p = h->host_data;
+
+       p->irq[hw].domain_irq = virq;
+       p->irq[hw].hw_irq = hw;
+
+       irqc_dbg(&p->irq[hw], "map");
+       irq_set_chip_data(virq, h->host_data);
+       irq_set_chip_and_handler(virq, &p->irq_chip, handle_level_irq);
+       set_irq_flags(virq, IRQF_VALID); /* kill me now */
+       return 0;
+}
+
+static struct irq_domain_ops irqc_irq_domain_ops = {
+       .map    = irqc_irq_domain_map,
+       .xlate  = irq_domain_xlate_twocell,
+};
+
+static int irqc_probe(struct platform_device *pdev)
+{
+       struct renesas_irqc_config *pdata = pdev->dev.platform_data;
+       struct irqc_priv *p;
+       struct resource *io;
+       struct resource *irq;
+       struct irq_chip *irq_chip;
+       const char *name = dev_name(&pdev->dev);
+       int ret;
+       int k;
+
+       p = kzalloc(sizeof(*p), GFP_KERNEL);
+       if (!p) {
+               dev_err(&pdev->dev, "failed to allocate driver data\n");
+               ret = -ENOMEM;
+               goto err0;
+       }
+
+       /* deal with driver instance configuration */
+       if (pdata)
+               memcpy(&p->config, pdata, sizeof(*pdata));
+
+       p->pdev = pdev;
+       platform_set_drvdata(pdev, p);
+
+       /* get hold of manadatory IOMEM */
+       io = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       if (!io) {
+               dev_err(&pdev->dev, "not enough IOMEM resources\n");
+               ret = -EINVAL;
+               goto err1;
+       }
+
+       /* allow any number of IRQs between 1 and IRQC_IRQ_MAX */
+       for (k = 0; k < IRQC_IRQ_MAX; k++) {
+               irq = platform_get_resource(pdev, IORESOURCE_IRQ, k);
+               if (!irq)
+                       break;
+
+               p->irq[k].p = p;
+               p->irq[k].requested_irq = irq->start;
+       }
+
+       p->number_of_irqs = k;
+       if (p->number_of_irqs < 1) {
+               dev_err(&pdev->dev, "not enough IRQ resources\n");
+               ret = -EINVAL;
+               goto err1;
+       }
+
+       /* ioremap IOMEM and setup read/write callbacks */
+       p->iomem = ioremap_nocache(io->start, resource_size(io));
+       if (!p->iomem) {
+               dev_err(&pdev->dev, "failed to remap IOMEM\n");
+               ret = -ENXIO;
+               goto err2;
+       }
+
+       p->cpu_int_base = p->iomem + IRQC_INT_CPU_BASE(0); /* SYS-SPI */
+
+       irq_chip = &p->irq_chip;
+       irq_chip->name = name;
+       irq_chip->irq_mask = irqc_irq_disable;
+       irq_chip->irq_unmask = irqc_irq_enable;
+       irq_chip->irq_enable = irqc_irq_enable;
+       irq_chip->irq_disable = irqc_irq_disable;
+       irq_chip->irq_set_type = irqc_irq_set_type;
+       irq_chip->flags = IRQCHIP_SKIP_SET_WAKE;
+
+       p->irq_domain = irq_domain_add_simple(pdev->dev.of_node,
+                                             p->number_of_irqs,
+                                             p->config.irq_base,
+                                             &irqc_irq_domain_ops, p);
+       if (!p->irq_domain) {
+               ret = -ENXIO;
+               dev_err(&pdev->dev, "cannot initialize irq domain\n");
+               goto err2;
+       }
+
+       /* request interrupts one by one */
+       for (k = 0; k < p->number_of_irqs; k++) {
+               if (request_irq(p->irq[k].requested_irq, irqc_irq_handler,
+                               0, name, &p->irq[k])) {
+                       dev_err(&pdev->dev, "failed to request IRQ\n");
+                       ret = -ENOENT;
+                       goto err3;
+               }
+       }
+
+       dev_info(&pdev->dev, "driving %d irqs\n", p->number_of_irqs);
+
+       /* warn in case of mismatch if irq base is specified */
+       if (p->config.irq_base) {
+               if (p->config.irq_base != p->irq[0].domain_irq)
+                       dev_warn(&pdev->dev, "irq base mismatch (%d/%d)\n",
+                                p->config.irq_base, p->irq[0].domain_irq);
+       }
+
+       return 0;
+err3:
+       for (; k >= 0; k--)
+               free_irq(p->irq[k - 1].requested_irq, &p->irq[k - 1]);
+
+       irq_domain_remove(p->irq_domain);
+err2:
+       iounmap(p->iomem);
+err1:
+       kfree(p);
+err0:
+       return ret;
+}
+
+static int irqc_remove(struct platform_device *pdev)
+{
+       struct irqc_priv *p = platform_get_drvdata(pdev);
+       int k;
+
+       for (k = 0; k < p->number_of_irqs; k++)
+               free_irq(p->irq[k].requested_irq, &p->irq[k]);
+
+       irq_domain_remove(p->irq_domain);
+       iounmap(p->iomem);
+       kfree(p);
+       return 0;
+}
+
+static const struct of_device_id irqc_dt_ids[] = {
+       { .compatible = "renesas,irqc", },
+       {},
+};
+MODULE_DEVICE_TABLE(of, irqc_dt_ids);
+
+static struct platform_driver irqc_device_driver = {
+       .probe          = irqc_probe,
+       .remove         = irqc_remove,
+       .driver         = {
+               .name   = "renesas_irqc",
+               .of_match_table = irqc_dt_ids,
+               .owner  = THIS_MODULE,
+       }
+};
+
+static int __init irqc_init(void)
+{
+       return platform_driver_register(&irqc_device_driver);
+}
+postcore_initcall(irqc_init);
+
+static void __exit irqc_exit(void)
+{
+       platform_driver_unregister(&irqc_device_driver);
+}
+module_exit(irqc_exit);
+
+MODULE_AUTHOR("Magnus Damm");
+MODULE_DESCRIPTION("Renesas IRQC Driver");
+MODULE_LICENSE("GPL v2");
index 3cf97aaebe4002381b32b1caba5cfb9ea363eecc..884d11c7355fb5d5cc0636c25b06e1ba1b856ef5 100644 (file)
@@ -23,6 +23,7 @@
 #include <linux/init.h>
 #include <linux/list.h>
 #include <linux/io.h>
+#include <linux/irq.h>
 #include <linux/irqdomain.h>
 #include <linux/of.h>
 #include <linux/of_address.h>
@@ -33,7 +34,7 @@
 #include <linux/irqchip/arm-vic.h>
 
 #include <asm/exception.h>
-#include <asm/mach/irq.h>
+#include <asm/irq.h>
 
 #include "irqchip.h"
 
index 34f51d2d90d2ed118a4aa0682a062d2d86a4ecb9..5a690ce6d60d0d42416807cad82498e952960649 100644 (file)
@@ -166,6 +166,7 @@ config PINCTRL_SINGLE
        depends on OF
        select PINMUX
        select PINCONF
+       select GENERIC_PINCONF
        help
          This selects the device tree based generic pinctrl driver.
 
index b0de6e7f1fdb8cb68566b24f04eee8722ab77862..f8a632dc877b37197fa8f34a1801a0abd9909ce6 100644 (file)
@@ -27,6 +27,7 @@
 #include <linux/pinctrl/consumer.h>
 #include <linux/pinctrl/pinctrl.h>
 #include <linux/pinctrl/machine.h>
+#include <asm-generic/gpio.h>
 #include "core.h"
 #include "devicetree.h"
 #include "pinmux.h"
@@ -276,6 +277,39 @@ pinctrl_match_gpio_range(struct pinctrl_dev *pctldev, unsigned gpio)
        return NULL;
 }
 
+/**
+ * pinctrl_ready_for_gpio_range() - check if other GPIO pins of
+ * the same GPIO chip are in range
+ * @gpio: gpio pin to check taken from the global GPIO pin space
+ *
+ * This function is complement of pinctrl_match_gpio_range(). If the return
+ * value of pinctrl_match_gpio_range() is NULL, this function could be used
+ * to check whether pinctrl device is ready or not. Maybe some GPIO pins
+ * of the same GPIO chip don't have back-end pinctrl interface.
+ * If the return value is true, it means that pinctrl device is ready & the
+ * certain GPIO pin doesn't have back-end pinctrl device. If the return value
+ * is false, it means that pinctrl device may not be ready.
+ */
+static bool pinctrl_ready_for_gpio_range(unsigned gpio)
+{
+       struct pinctrl_dev *pctldev;
+       struct pinctrl_gpio_range *range = NULL;
+       struct gpio_chip *chip = gpio_to_chip(gpio);
+
+       /* Loop over the pin controllers */
+       list_for_each_entry(pctldev, &pinctrldev_list, node) {
+               /* Loop over the ranges */
+               list_for_each_entry(range, &pctldev->gpio_ranges, node) {
+                       /* Check if any gpio range overlapped with gpio chip */
+                       if (range->base + range->npins - 1 < chip->base ||
+                           range->base > chip->base + chip->ngpio - 1)
+                               continue;
+                       return true;
+               }
+       }
+       return false;
+}
+
 /**
  * pinctrl_get_device_gpio_range() - find device for GPIO range
  * @gpio: the pin to locate the pin controller for
@@ -443,6 +477,8 @@ int pinctrl_request_gpio(unsigned gpio)
 
        ret = pinctrl_get_device_gpio_range(gpio, &pctldev, &range);
        if (ret) {
+               if (pinctrl_ready_for_gpio_range(gpio))
+                       ret = 0;
                mutex_unlock(&pinctrl_mutex);
                return ret;
        }
@@ -979,9 +1015,8 @@ static int devm_pinctrl_match(struct device *dev, void *res, void *data)
  */
 void devm_pinctrl_put(struct pinctrl *p)
 {
-       WARN_ON(devres_destroy(p->dev, devm_pinctrl_release,
+       WARN_ON(devres_release(p->dev, devm_pinctrl_release,
                               devm_pinctrl_match, p));
-       pinctrl_put(p);
 }
 EXPORT_SYMBOL_GPL(devm_pinctrl_put);
 
index fd40a11ad645a38e9a82739c9d0aaa58124db0d0..c7b7cb47712911f124f81b8f093edee5834d35e6 100644 (file)
@@ -41,7 +41,7 @@ static void dt_free_map(struct pinctrl_dev *pctldev,
                     struct pinctrl_map *map, unsigned num_maps)
 {
        if (pctldev) {
-               struct pinctrl_ops *ops = pctldev->desc->pctlops;
+               const struct pinctrl_ops *ops = pctldev->desc->pctlops;
                ops->dt_free_map(pctldev, map, num_maps);
        } else {
                /* There is no pctldev for PIN_MAP_TYPE_DUMMY_STATE */
@@ -122,7 +122,7 @@ static int dt_to_map_one_config(struct pinctrl *p, const char *statename,
 {
        struct device_node *np_pctldev;
        struct pinctrl_dev *pctldev;
-       struct pinctrl_ops *ops;
+       const struct pinctrl_ops *ops;
        int ret;
        struct pinctrl_map *map;
        unsigned num_maps;
index 2d2f0a43d36b409cf287f6d6629b506e517948a9..7f34a2b212d27e961d551ada06a21b072699bfe6 100644 (file)
@@ -263,7 +263,7 @@ static void mvebu_pinconf_group_dbg_show(struct pinctrl_dev *pctldev,
        return;
 }
 
-static struct pinconf_ops mvebu_pinconf_ops = {
+static const struct pinconf_ops mvebu_pinconf_ops = {
        .pin_config_group_get = mvebu_pinconf_group_get,
        .pin_config_group_set = mvebu_pinconf_group_set,
        .pin_config_group_dbg_show = mvebu_pinconf_group_dbg_show,
@@ -369,7 +369,7 @@ static int mvebu_pinmux_gpio_set_direction(struct pinctrl_dev *pctldev,
        return -ENOTSUPP;
 }
 
-static struct pinmux_ops mvebu_pinmux_ops = {
+static const struct pinmux_ops mvebu_pinmux_ops = {
        .get_functions_count = mvebu_pinmux_get_funcs_count,
        .get_function_name = mvebu_pinmux_get_func_name,
        .get_function_groups = mvebu_pinmux_get_groups,
@@ -470,7 +470,7 @@ static void mvebu_pinctrl_dt_free_map(struct pinctrl_dev *pctldev,
        kfree(map);
 }
 
-static struct pinctrl_ops mvebu_pinctrl_ops = {
+static const struct pinctrl_ops mvebu_pinctrl_ops = {
        .get_groups_count = mvebu_pinctrl_get_groups_count,
        .get_group_name = mvebu_pinctrl_get_group_name,
        .get_group_pins = mvebu_pinctrl_get_group_pins,
index 06c304ac6f7da2794d38e380bdd51a8a91736182..9c436858812cf36517d0d97efa9ce647f79fddb8 100644 (file)
@@ -12,6 +12,7 @@
 #define pr_fmt(fmt) "generic pinconfig core: " fmt
 
 #include <linux/kernel.h>
+#include <linux/module.h>
 #include <linux/init.h>
 #include <linux/device.h>
 #include <linux/slab.h>
@@ -120,4 +121,17 @@ void pinconf_generic_dump_group(struct pinctrl_dev *pctldev,
        }
 }
 
+void pinconf_generic_dump_config(struct pinctrl_dev *pctldev,
+                                struct seq_file *s, unsigned long config)
+{
+       int i;
+
+       for(i = 0; i < ARRAY_SIZE(conf_items); i++) {
+               if (pinconf_to_config_param(config) != conf_items[i].param)
+                       continue;
+               seq_printf(s, "%s: 0x%x", conf_items[i].display,
+                          pinconf_to_config_argument(config));
+       }
+}
+EXPORT_SYMBOL_GPL(pinconf_generic_dump_config);
 #endif
index d611ecfcbf70d8401946767f01833069ef60c431..dae927f910882f33ba436bc7a383e7c63905b178 100644 (file)
@@ -670,7 +670,7 @@ static int pinconf_dbg_config_print(struct seq_file *s, void *d)
        struct pinctrl_maps *maps_node;
        struct pinctrl_map const *map;
        struct pinctrl_dev *pctldev = NULL;
-       struct pinconf_ops *confops = NULL;
+       const struct pinconf_ops *confops = NULL;
        int i, j;
        bool found = false;
 
index bfda73d64eed527b2fce7e0a084b7459943bfb1e..92c7267244d25dbf79715bed0a89713380dc1a4c 100644 (file)
@@ -98,6 +98,8 @@ void pinconf_generic_dump_pin(struct pinctrl_dev *pctldev,
 void pinconf_generic_dump_group(struct pinctrl_dev *pctldev,
                              struct seq_file *s, const char *gname);
 
+void pinconf_generic_dump_config(struct pinctrl_dev *pctldev,
+                                struct seq_file *s, unsigned long config);
 #else
 
 static inline void pinconf_generic_dump_pin(struct pinctrl_dev *pctldev,
@@ -114,4 +116,10 @@ static inline void pinconf_generic_dump_group(struct pinctrl_dev *pctldev,
        return;
 }
 
+static inline void pinconf_generic_dump_config(struct pinctrl_dev *pctldev,
+                                              struct seq_file *s,
+                                              unsigned long config)
+{
+       return;
+}
 #endif
index c542a97c82f37cc743fa9d97e914c13dfe55aaa7..0cf3fa4a21ae1de81f8f1d5dbc7a07234758aca9 100644 (file)
@@ -656,7 +656,7 @@ static void abx500_gpio_disable_free(struct pinctrl_dev *pctldev,
 {
 }
 
-static struct pinmux_ops abx500_pinmux_ops = {
+static const struct pinmux_ops abx500_pinmux_ops = {
        .get_functions_count = abx500_pmx_get_funcs_cnt,
        .get_function_name = abx500_pmx_get_func_name,
        .get_function_groups = abx500_pmx_get_func_groups,
@@ -704,7 +704,7 @@ static void abx500_pin_dbg_show(struct pinctrl_dev *pctldev,
                                 chip->base + offset - 1);
 }
 
-static struct pinctrl_ops abx500_pinctrl_ops = {
+static const struct pinctrl_ops abx500_pinctrl_ops = {
        .get_groups_count = abx500_get_groups_cnt,
        .get_group_name = abx500_get_group_name,
        .get_group_pins = abx500_get_group_pins,
@@ -778,7 +778,7 @@ int abx500_pin_config_set(struct pinctrl_dev *pctldev,
        return ret;
 }
 
-static struct pinconf_ops abx500_pinconf_ops = {
+static const struct pinconf_ops abx500_pinconf_ops = {
        .pin_config_get = abx500_pin_config_get,
        .pin_config_set = abx500_pin_config_set,
 };
@@ -834,6 +834,7 @@ static const struct of_device_id abx500_gpio_match[] = {
        { .compatible = "stericsson,ab8505-gpio", .data = (void *)PINCTRL_AB8505, },
        { .compatible = "stericsson,ab8540-gpio", .data = (void *)PINCTRL_AB8540, },
        { .compatible = "stericsson,ab9540-gpio", .data = (void *)PINCTRL_AB9540, },
+       { }
 };
 
 static int abx500_gpio_probe(struct platform_device *pdev)
index efb7f10e902a0e1aa9701ed5506a23d204b1a9df..49bdc44100753f77b98327b1a62f825801bdc83f 100644 (file)
@@ -18,6 +18,7 @@
 #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>
@@ -27,8 +28,6 @@
 /* Since we request GPIOs from ourself */
 #include <linux/pinctrl/consumer.h>
 
-#include <asm/mach/irq.h>
-
 #include <mach/hardware.h>
 #include <mach/at91_pio.h>
 
@@ -294,7 +293,7 @@ static void at91_dt_free_map(struct pinctrl_dev *pctldev,
 {
 }
 
-static struct pinctrl_ops at91_pctrl_ops = {
+static const struct pinctrl_ops at91_pctrl_ops = {
        .get_groups_count       = at91_get_groups_count,
        .get_group_name         = at91_get_group_name,
        .get_group_pins         = at91_get_group_pins,
@@ -696,7 +695,7 @@ static void at91_gpio_disable_free(struct pinctrl_dev *pctldev,
        /* Set the pin to some default state, GPIO is usually default */
 }
 
-static struct pinmux_ops at91_pmx_ops = {
+static const struct pinmux_ops at91_pmx_ops = {
        .get_functions_count    = at91_pmx_get_funcs_count,
        .get_function_name      = at91_pmx_get_func_name,
        .get_function_groups    = at91_pmx_get_groups,
@@ -776,7 +775,7 @@ static void at91_pinconf_group_dbg_show(struct pinctrl_dev *pctldev,
 {
 }
 
-static struct pinconf_ops at91_pinconf_ops = {
+static const struct pinconf_ops at91_pinconf_ops = {
        .pin_config_get                 = at91_pinconf_get,
        .pin_config_set                 = at91_pinconf_set,
        .pin_config_dbg_show            = at91_pinconf_dbg_show,
index 4eb6d2c4e4df80c3222415ff7463b4db67b730ab..f28d4b08771abb4533e69727af6d84f492bb5043 100644 (file)
@@ -795,7 +795,7 @@ out:
        return err;
 }
 
-static struct pinctrl_ops bcm2835_pctl_ops = {
+static const struct pinctrl_ops bcm2835_pctl_ops = {
        .get_groups_count = bcm2835_pctl_get_groups_count,
        .get_group_name = bcm2835_pctl_get_group_name,
        .get_group_pins = bcm2835_pctl_get_group_pins,
@@ -872,7 +872,7 @@ static int bcm2835_pmx_gpio_set_direction(struct pinctrl_dev *pctldev,
        return 0;
 }
 
-static struct pinmux_ops bcm2835_pmx_ops = {
+static const struct pinmux_ops bcm2835_pmx_ops = {
        .get_functions_count = bcm2835_pmx_get_functions_count,
        .get_function_name = bcm2835_pmx_get_function_name,
        .get_function_groups = bcm2835_pmx_get_function_groups,
@@ -916,7 +916,7 @@ static int bcm2835_pinconf_set(struct pinctrl_dev *pctldev,
        return 0;
 }
 
-static struct pinconf_ops bcm2835_pinconf_ops = {
+static const struct pinconf_ops bcm2835_pinconf_ops = {
        .pin_config_get = bcm2835_pinconf_get,
        .pin_config_set = bcm2835_pinconf_set,
 };
index 538b9ddaadf7e63783e6d8e1349377224f576399..7265e551dddb2949e38b41f50a389cf09950f5a6 100644 (file)
 #include <linux/interrupt.h>
 #include <linux/irqdomain.h>
 #include <linux/irq.h>
+#include <linux/irqchip/chained_irq.h>
 #include <linux/of_irq.h>
 #include <linux/io.h>
 #include <linux/slab.h>
 #include <linux/err.h>
 
-#include <asm/mach/irq.h>
-
 #include "pinctrl-samsung.h"
 #include "pinctrl-exynos.h"
 
index 1376eb7305dbbf8d9a20f7f723f486e8ecb066d8..169ea3e5f777a4d414d90106ba8c3cd62f2e9f5f 100644 (file)
@@ -286,7 +286,7 @@ static void exynos5440_dt_free_map(struct pinctrl_dev *pctldev,
 }
 
 /* list of pinctrl callbacks for the pinctrl core */
-static struct pinctrl_ops exynos5440_pctrl_ops = {
+static const struct pinctrl_ops exynos5440_pctrl_ops = {
        .get_groups_count       = exynos5440_get_group_count,
        .get_group_name         = exynos5440_get_group_name,
        .get_group_pins         = exynos5440_get_group_pins,
@@ -374,7 +374,7 @@ static int exynos5440_pinmux_gpio_set_direction(struct pinctrl_dev *pctldev,
 }
 
 /* list of pinmux callbacks for the pinmux vertical in pinctrl core */
-static struct pinmux_ops exynos5440_pinmux_ops = {
+static const struct pinmux_ops exynos5440_pinmux_ops = {
        .get_functions_count    = exynos5440_get_functions_count,
        .get_function_name      = exynos5440_pinmux_get_fname,
        .get_function_groups    = exynos5440_pinmux_get_groups,
@@ -523,7 +523,7 @@ static int exynos5440_pinconf_group_get(struct pinctrl_dev *pctldev,
 }
 
 /* list of pinconfig callbacks for pinconfig vertical in the pinctrl code */
-static struct pinconf_ops exynos5440_pinconf_ops = {
+static const struct pinconf_ops exynos5440_pinconf_ops = {
        .pin_config_get         = exynos5440_pinconf_get,
        .pin_config_set         = exynos5440_pinconf_set,
        .pin_config_group_get   = exynos5440_pinconf_group_get,
index af97a1f90007130bd8d710b2ef527ea830c79b52..f9b2a1d4854f265318815a6a5fa95fa66d2a15d5 100644 (file)
@@ -353,7 +353,7 @@ static void falcon_pinconf_group_dbg_show(struct pinctrl_dev *pctrldev,
 {
 }
 
-static struct pinconf_ops falcon_pinconf_ops = {
+static const struct pinconf_ops falcon_pinconf_ops = {
        .pin_config_get                 = falcon_pinconf_get,
        .pin_config_set                 = falcon_pinconf_set,
        .pin_config_group_get           = falcon_pinconf_group_get,
index 4cebb9c6c5c5abef9baa3d33abcf5885b67a349e..0ef190449eabc05b95bfe5a259135fdb0b8d32d0 100644 (file)
@@ -207,7 +207,7 @@ static void imx_dt_free_map(struct pinctrl_dev *pctldev,
        kfree(map);
 }
 
-static struct pinctrl_ops imx_pctrl_ops = {
+static const struct pinctrl_ops imx_pctrl_ops = {
        .get_groups_count = imx_get_groups_count,
        .get_group_name = imx_get_group_name,
        .get_group_pins = imx_get_group_pins,
@@ -299,7 +299,7 @@ static int imx_pmx_get_groups(struct pinctrl_dev *pctldev, unsigned selector,
        return 0;
 }
 
-static struct pinmux_ops imx_pmx_ops = {
+static const struct pinmux_ops imx_pmx_ops = {
        .get_functions_count = imx_pmx_get_funcs_count,
        .get_function_name = imx_pmx_get_func_name,
        .get_function_groups = imx_pmx_get_groups,
@@ -397,7 +397,7 @@ static void imx_pinconf_group_dbg_show(struct pinctrl_dev *pctldev,
        }
 }
 
-static struct pinconf_ops imx_pinconf_ops = {
+static const struct pinconf_ops imx_pinconf_ops = {
        .pin_config_get = imx_pinconf_get,
        .pin_config_set = imx_pinconf_set,
        .pin_config_dbg_show = imx_pinconf_dbg_show,
index a70384611351411a8396aa23288649aa044c283b..615c5002b757e1515187a1a87278a69d9a980d8f 100644 (file)
@@ -169,7 +169,7 @@ static int ltq_pinctrl_dt_node_to_map(struct pinctrl_dev *pctldev,
        return 0;
 }
 
-static struct pinctrl_ops ltq_pctrl_ops = {
+static const struct pinctrl_ops ltq_pctrl_ops = {
        .get_groups_count       = ltq_get_group_count,
        .get_group_name         = ltq_get_group_name,
        .get_group_pins         = ltq_get_group_pins,
@@ -311,7 +311,7 @@ static int ltq_pmx_gpio_request_enable(struct pinctrl_dev *pctrldev,
        return info->apply_mux(pctrldev, mfp, pin_func);
 }
 
-static struct pinmux_ops ltq_pmx_ops = {
+static const struct pinmux_ops ltq_pmx_ops = {
        .get_functions_count    = ltq_pmx_func_count,
        .get_function_name      = ltq_pmx_func_name,
        .get_function_groups    = ltq_pmx_get_groups,
index 23af9f1f9c35e6d9d7793075ad7ec2df92070043..b45c4eb357988beaa0091835e45e09c46209ac76 100644 (file)
@@ -158,7 +158,7 @@ static void mxs_dt_free_map(struct pinctrl_dev *pctldev,
        kfree(map);
 }
 
-static struct pinctrl_ops mxs_pinctrl_ops = {
+static const struct pinctrl_ops mxs_pinctrl_ops = {
        .get_groups_count = mxs_get_groups_count,
        .get_group_name = mxs_get_group_name,
        .get_group_pins = mxs_get_group_pins,
@@ -219,7 +219,7 @@ static int mxs_pinctrl_enable(struct pinctrl_dev *pctldev, unsigned selector,
        return 0;
 }
 
-static struct pinmux_ops mxs_pinmux_ops = {
+static const struct pinmux_ops mxs_pinmux_ops = {
        .get_functions_count = mxs_pinctrl_get_funcs_count,
        .get_function_name = mxs_pinctrl_get_func_name,
        .get_function_groups = mxs_pinctrl_get_func_groups,
@@ -319,7 +319,7 @@ static void mxs_pinconf_group_dbg_show(struct pinctrl_dev *pctldev,
                seq_printf(s, "0x%lx", config);
 }
 
-static struct pinconf_ops mxs_pinconf_ops = {
+static const struct pinconf_ops mxs_pinconf_ops = {
        .pin_config_get = mxs_pinconf_get,
        .pin_config_set = mxs_pinconf_set,
        .pin_config_group_get = mxs_pinconf_group_get,
index 36d20293de5c6b479da51c5120ec68ea105c5110..3fc8b99419636976f6efc7329cce51a7d47ddb74 100644 (file)
@@ -23,6 +23,7 @@
 #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 +34,6 @@
 /* Since we request GPIOs from ourself */
 #include <linux/pinctrl/consumer.h>
 #include <linux/platform_data/pinctrl-nomadik.h>
-#include <asm/mach/irq.h>
 #include "pinctrl-nomadik.h"
 #include "core.h"
 
@@ -1764,7 +1764,7 @@ int nmk_pinctrl_dt_node_to_map(struct pinctrl_dev *pctldev,
        return 0;
 }
 
-static struct pinctrl_ops nmk_pinctrl_ops = {
+static const struct pinctrl_ops nmk_pinctrl_ops = {
        .get_groups_count = nmk_get_groups_cnt,
        .get_group_name = nmk_get_group_name,
        .get_group_pins = nmk_get_group_pins,
@@ -1975,7 +1975,7 @@ static void nmk_gpio_disable_free(struct pinctrl_dev *pctldev,
        /* Set the pin to some default state, GPIO is usually default */
 }
 
-static struct pinmux_ops nmk_pinmux_ops = {
+static const struct pinmux_ops nmk_pinmux_ops = {
        .get_functions_count = nmk_pmx_get_funcs_cnt,
        .get_function_name = nmk_pmx_get_func_name,
        .get_function_groups = nmk_pmx_get_func_groups,
@@ -2089,7 +2089,7 @@ static int nmk_pin_config_set(struct pinctrl_dev *pctldev, unsigned pin,
        return 0;
 }
 
-static struct pinconf_ops nmk_pinconf_ops = {
+static const struct pinconf_ops nmk_pinconf_ops = {
        .pin_config_get = nmk_pin_config_get,
        .pin_config_set = nmk_pin_config_set,
 };
index 1f49bb02a6afe35678437d44b27ade3264a88893..05e11de1d144cd7bf1bfaa2733eef16ece2ddd40 100644 (file)
@@ -53,7 +53,7 @@ static int pxa3xx_get_group_pins(struct pinctrl_dev *pctrldev,
        return 0;
 }
 
-static struct pinctrl_ops pxa3xx_pctrl_ops = {
+static const struct pinctrl_ops pxa3xx_pctrl_ops = {
        .get_groups_count = pxa3xx_get_groups_count,
        .get_group_name = pxa3xx_get_group_name,
        .get_group_pins = pxa3xx_get_group_pins,
@@ -161,7 +161,7 @@ static int pxa3xx_pmx_request_gpio(struct pinctrl_dev *pctrldev,
        return 0;
 }
 
-static struct pinmux_ops pxa3xx_pmx_ops = {
+static const struct pinmux_ops pxa3xx_pmx_ops = {
        .get_functions_count    = pxa3xx_pmx_get_funcs_count,
        .get_function_name      = pxa3xx_pmx_get_func_name,
        .get_function_groups    = pxa3xx_pmx_get_groups,
index f206df1756568b2e0727ac06ac65ae07d5a83b0e..3475b92b24a458b0cd344f07095e69d10be1ab31 100644 (file)
@@ -214,7 +214,7 @@ static void samsung_dt_free_map(struct pinctrl_dev *pctldev,
 }
 
 /* list of pinctrl callbacks for the pinctrl core */
-static struct pinctrl_ops samsung_pctrl_ops = {
+static const struct pinctrl_ops samsung_pctrl_ops = {
        .get_groups_count       = samsung_get_group_count,
        .get_group_name         = samsung_get_group_name,
        .get_group_pins         = samsung_get_group_pins,
@@ -357,7 +357,7 @@ static int samsung_pinmux_gpio_set_direction(struct pinctrl_dev *pctldev,
 }
 
 /* list of pinmux callbacks for the pinmux vertical in pinctrl core */
-static struct pinmux_ops samsung_pinmux_ops = {
+static const struct pinmux_ops samsung_pinmux_ops = {
        .get_functions_count    = samsung_get_functions_count,
        .get_function_name      = samsung_pinmux_get_fname,
        .get_function_groups    = samsung_pinmux_get_groups,
@@ -468,7 +468,7 @@ static int samsung_pinconf_group_get(struct pinctrl_dev *pctldev,
 }
 
 /* list of pinconfig callbacks for pinconfig vertical in the pinctrl code */
-static struct pinconf_ops samsung_pinconf_ops = {
+static const struct pinconf_ops samsung_pinconf_ops = {
        .pin_config_get         = samsung_pinconf_get,
        .pin_config_set         = samsung_pinconf_set,
        .pin_config_group_get   = samsung_pinconf_group_get,
index 5c32e880bcb24315b4b2db260294106765eb4240..e35dabd3135dc8a9df4c816bfba0f8af268605d8 100644 (file)
 
 #include <linux/pinctrl/pinctrl.h>
 #include <linux/pinctrl/pinmux.h>
+#include <linux/pinctrl/pinconf-generic.h>
 
 #include "core.h"
+#include "pinconf.h"
 
 #define DRIVER_NAME                    "pinctrl-single"
 #define PCS_MUX_PINS_NAME              "pinctrl-single,pins"
@@ -58,6 +60,33 @@ struct pcs_func_vals {
        unsigned mask;
 };
 
+/**
+ * struct pcs_conf_vals - pinconf parameter, pinconf register offset
+ * and value, enable, disable, mask
+ * @param:     config parameter
+ * @val:       user input bits in the pinconf register
+ * @enable:    enable bits in the pinconf register
+ * @disable:   disable bits in the pinconf register
+ * @mask:      mask bits in the register value
+ */
+struct pcs_conf_vals {
+       enum pin_config_param param;
+       unsigned val;
+       unsigned enable;
+       unsigned disable;
+       unsigned mask;
+};
+
+/**
+ * struct pcs_conf_type - pinconf property name, pinconf param pair
+ * @name:      property name in DTS file
+ * @param:     config parameter
+ */
+struct pcs_conf_type {
+       const char *name;
+       enum pin_config_param param;
+};
+
 /**
  * struct pcs_function - pinctrl function
  * @name:      pinctrl function name
@@ -73,6 +102,22 @@ struct pcs_function {
        unsigned nvals;
        const char **pgnames;
        int npgnames;
+       struct pcs_conf_vals *conf;
+       int nconfs;
+       struct list_head node;
+};
+
+/**
+ * struct pcs_gpiofunc_range - pin ranges with same mux value of gpio function
+ * @offset:    offset base of pins
+ * @npins:     number pins with the same mux value of gpio function
+ * @gpiofunc:  mux value of gpio function
+ * @node:      list node
+ */
+struct pcs_gpiofunc_range {
+       unsigned offset;
+       unsigned npins;
+       unsigned gpiofunc;
        struct list_head node;
 };
 
@@ -117,12 +162,14 @@ struct pcs_name {
  * @fshift:    function register shift
  * @foff:      value to turn mux off
  * @fmax:      max number of functions in fmask
+ * @is_pinconf:        whether supports pinconf
  * @names:     array of register names for pins
  * @pins:      physical pins on the SoC
  * @pgtree:    pingroup index radix tree
  * @ftree:     function index radix tree
  * @pingroups: list of pingroups
  * @functions: list of functions
+ * @gpiofuncs: list of gpio functions
  * @ngroups:   number of pingroups
  * @nfuncs:    number of functions
  * @desc:      pin controller descriptor
@@ -142,12 +189,14 @@ struct pcs_device {
        unsigned foff;
        unsigned fmax;
        bool bits_per_mux;
+       bool is_pinconf;
        struct pcs_name *names;
        struct pcs_data pins;
        struct radix_tree_root pgtree;
        struct radix_tree_root ftree;
        struct list_head pingroups;
        struct list_head functions;
+       struct list_head gpiofuncs;
        unsigned ngroups;
        unsigned nfuncs;
        struct pinctrl_desc desc;
@@ -155,6 +204,16 @@ struct pcs_device {
        void (*write)(unsigned val, void __iomem *reg);
 };
 
+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,
+                          unsigned long config);
+
+static enum pin_config_param pcs_bias[] = {
+       PIN_CONFIG_BIAS_PULL_DOWN,
+       PIN_CONFIG_BIAS_PULL_UP,
+};
+
 /*
  * REVISIT: Reads and writes could eventually use regmap or something
  * generic. But at least on omaps, some mux registers are performance
@@ -270,7 +329,7 @@ static int pcs_dt_node_to_map(struct pinctrl_dev *pctldev,
                                struct device_node *np_config,
                                struct pinctrl_map **map, unsigned *num_maps);
 
-static struct pinctrl_ops pcs_pinctrl_ops = {
+static const struct pinctrl_ops pcs_pinctrl_ops = {
        .get_groups_count = pcs_get_groups_count,
        .get_group_name = pcs_get_group_name,
        .get_group_pins = pcs_get_group_pins,
@@ -326,6 +385,28 @@ static int pcs_get_function_groups(struct pinctrl_dev *pctldev,
        return 0;
 }
 
+static int pcs_get_function(struct pinctrl_dev *pctldev, unsigned pin,
+                           struct pcs_function **func)
+{
+       struct pcs_device *pcs = pinctrl_dev_get_drvdata(pctldev);
+       struct pin_desc *pdesc = pin_desc_get(pctldev, pin);
+       const struct pinctrl_setting_mux *setting;
+       unsigned fselector;
+
+       /* If pin is not described in DTS & enabled, mux_setting is NULL. */
+       setting = pdesc->mux_setting;
+       if (!setting)
+               return -ENOTSUPP;
+       fselector = setting->func;
+       *func = radix_tree_lookup(&pcs->ftree, fselector);
+       if (!(*func)) {
+               dev_err(pcs->dev, "%s could not find function%i\n",
+                       __func__, fselector);
+               return -ENOTSUPP;
+       }
+       return 0;
+}
+
 static int pcs_enable(struct pinctrl_dev *pctldev, unsigned fselector,
        unsigned group)
 {
@@ -334,6 +415,9 @@ static int pcs_enable(struct pinctrl_dev *pctldev, unsigned fselector,
        int i;
 
        pcs = pinctrl_dev_get_drvdata(pctldev);
+       /* If function mask is null, needn't enable it. */
+       if (!pcs->fmask)
+               return 0;
        func = radix_tree_lookup(&pcs->ftree, fselector);
        if (!func)
                return -EINVAL;
@@ -368,6 +452,10 @@ static void pcs_disable(struct pinctrl_dev *pctldev, unsigned fselector,
        int i;
 
        pcs = pinctrl_dev_get_drvdata(pctldev);
+       /* If function mask is null, needn't disable it. */
+       if (!pcs->fmask)
+               return;
+
        func = radix_tree_lookup(&pcs->ftree, fselector);
        if (!func) {
                dev_err(pcs->dev, "%s could not find function%i\n",
@@ -403,12 +491,33 @@ static void pcs_disable(struct pinctrl_dev *pctldev, unsigned fselector,
 }
 
 static int pcs_request_gpio(struct pinctrl_dev *pctldev,
-                       struct pinctrl_gpio_range *range, unsigned offset)
+                           struct pinctrl_gpio_range *range, unsigned pin)
 {
-       return -ENOTSUPP;
+       struct pcs_device *pcs = pinctrl_dev_get_drvdata(pctldev);
+       struct pcs_gpiofunc_range *frange = NULL;
+       struct list_head *pos, *tmp;
+       int mux_bytes = 0;
+       unsigned data;
+
+       /* If function mask is null, return directly. */
+       if (!pcs->fmask)
+               return -ENOTSUPP;
+
+       list_for_each_safe(pos, tmp, &pcs->gpiofuncs) {
+               frange = list_entry(pos, struct pcs_gpiofunc_range, node);
+               if (pin >= frange->offset + frange->npins
+                       || pin < frange->offset)
+                       continue;
+               mux_bytes = pcs->width / BITS_PER_BYTE;
+               data = pcs->read(pcs->base + pin * mux_bytes) & ~pcs->fmask;
+               data |= frange->gpiofunc;
+               pcs->write(data, pcs->base + pin * mux_bytes);
+               break;
+       }
+       return 0;
 }
 
-static struct pinmux_ops pcs_pinmux_ops = {
+static const struct pinmux_ops pcs_pinmux_ops = {
        .get_functions_count = pcs_get_functions_count,
        .get_function_name = pcs_get_function_name,
        .get_function_groups = pcs_get_function_groups,
@@ -417,32 +526,191 @@ static struct pinmux_ops pcs_pinmux_ops = {
        .gpio_request_enable = pcs_request_gpio,
 };
 
+/* Clear BIAS value */
+static void pcs_pinconf_clear_bias(struct pinctrl_dev *pctldev, unsigned pin)
+{
+       unsigned long config;
+       int i;
+       for (i = 0; i < ARRAY_SIZE(pcs_bias); i++) {
+               config = pinconf_to_config_packed(pcs_bias[i], 0);
+               pcs_pinconf_set(pctldev, pin, config);
+       }
+}
+
+/*
+ * Check whether PIN_CONFIG_BIAS_DISABLE is valid.
+ * It's depend on that PULL_DOWN & PULL_UP configs are all invalid.
+ */
+static bool pcs_pinconf_bias_disable(struct pinctrl_dev *pctldev, unsigned pin)
+{
+       unsigned long config;
+       int i;
+
+       for (i = 0; i < ARRAY_SIZE(pcs_bias); i++) {
+               config = pinconf_to_config_packed(pcs_bias[i], 0);
+               if (!pcs_pinconf_get(pctldev, pin, &config))
+                       goto out;
+       }
+       return true;
+out:
+       return false;
+}
+
 static int pcs_pinconf_get(struct pinctrl_dev *pctldev,
                                unsigned pin, unsigned long *config)
 {
+       struct pcs_device *pcs = pinctrl_dev_get_drvdata(pctldev);
+       struct pcs_function *func;
+       enum pin_config_param param;
+       unsigned offset = 0, data = 0, i, j, ret;
+
+       ret = pcs_get_function(pctldev, pin, &func);
+       if (ret)
+               return ret;
+
+       for (i = 0; i < func->nconfs; i++) {
+               param = pinconf_to_config_param(*config);
+               if (param == PIN_CONFIG_BIAS_DISABLE) {
+                       if (pcs_pinconf_bias_disable(pctldev, pin)) {
+                               *config = 0;
+                               return 0;
+                       } else {
+                               return -ENOTSUPP;
+                       }
+               } else if (param != func->conf[i].param) {
+                       continue;
+               }
+
+               offset = pin * (pcs->width / BITS_PER_BYTE);
+               data = pcs->read(pcs->base + offset) & func->conf[i].mask;
+               switch (func->conf[i].param) {
+               /* 4 parameters */
+               case PIN_CONFIG_BIAS_PULL_DOWN:
+               case PIN_CONFIG_BIAS_PULL_UP:
+               case PIN_CONFIG_INPUT_SCHMITT_ENABLE:
+                       if ((data != func->conf[i].enable) ||
+                           (data == func->conf[i].disable))
+                               return -ENOTSUPP;
+                       *config = 0;
+                       break;
+               /* 2 parameters */
+               case PIN_CONFIG_INPUT_SCHMITT:
+                       for (j = 0; j < func->nconfs; j++) {
+                               switch (func->conf[j].param) {
+                               case PIN_CONFIG_INPUT_SCHMITT_ENABLE:
+                                       if (data != func->conf[j].enable)
+                                               return -ENOTSUPP;
+                                       break;
+                               default:
+                                       break;
+                               }
+                       }
+                       *config = data;
+                       break;
+               case PIN_CONFIG_DRIVE_STRENGTH:
+               case PIN_CONFIG_SLEW_RATE:
+               default:
+                       *config = data;
+                       break;
+               }
+               return 0;
+       }
        return -ENOTSUPP;
 }
 
 static int pcs_pinconf_set(struct pinctrl_dev *pctldev,
                                unsigned pin, unsigned long config)
 {
+       struct pcs_device *pcs = pinctrl_dev_get_drvdata(pctldev);
+       struct pcs_function *func;
+       unsigned offset = 0, shift = 0, arg = 0, i, data, ret;
+       u16 argument;
+
+       ret = pcs_get_function(pctldev, pin, &func);
+       if (ret)
+               return ret;
+
+       for (i = 0; i < func->nconfs; i++) {
+               if (pinconf_to_config_param(config) == func->conf[i].param) {
+                       offset = pin * (pcs->width / BITS_PER_BYTE);
+                       data = pcs->read(pcs->base + offset);
+                       argument = pinconf_to_config_argument(config);
+                       switch (func->conf[i].param) {
+                       /* 2 parameters */
+                       case PIN_CONFIG_INPUT_SCHMITT:
+                       case PIN_CONFIG_DRIVE_STRENGTH:
+                       case PIN_CONFIG_SLEW_RATE:
+                               shift = ffs(func->conf[i].mask) - 1;
+                               arg = pinconf_to_config_argument(config);
+                               data &= ~func->conf[i].mask;
+                               data |= (arg << shift) & func->conf[i].mask;
+                               break;
+                       /* 4 parameters */
+                       case PIN_CONFIG_BIAS_DISABLE:
+                               pcs_pinconf_clear_bias(pctldev, pin);
+                               break;
+                       case PIN_CONFIG_BIAS_PULL_DOWN:
+                       case PIN_CONFIG_BIAS_PULL_UP:
+                               if (argument)
+                                       pcs_pinconf_clear_bias(pctldev, pin);
+                               /* fall through */
+                       case PIN_CONFIG_INPUT_SCHMITT_ENABLE:
+                               data &= ~func->conf[i].mask;
+                               if (argument)
+                                       data |= func->conf[i].enable;
+                               else
+                                       data |= func->conf[i].disable;
+                               break;
+                       default:
+                               return -ENOTSUPP;
+                       }
+                       pcs->write(data, pcs->base + offset);
+                       return 0;
+               }
+       }
        return -ENOTSUPP;
 }
 
 static int pcs_pinconf_group_get(struct pinctrl_dev *pctldev,
                                unsigned group, unsigned long *config)
 {
-       return -ENOTSUPP;
+       const unsigned *pins;
+       unsigned npins, old = 0;
+       int i, ret;
+
+       ret = pcs_get_group_pins(pctldev, group, &pins, &npins);
+       if (ret)
+               return ret;
+       for (i = 0; i < npins; i++) {
+               if (pcs_pinconf_get(pctldev, pins[i], config))
+                       return -ENOTSUPP;
+               /* configs do not match between two pins */
+               if (i && (old != *config))
+                       return -ENOTSUPP;
+               old = *config;
+       }
+       return 0;
 }
 
 static int pcs_pinconf_group_set(struct pinctrl_dev *pctldev,
                                unsigned group, unsigned long config)
 {
-       return -ENOTSUPP;
+       const unsigned *pins;
+       unsigned npins;
+       int i, ret;
+
+       ret = pcs_get_group_pins(pctldev, group, &pins, &npins);
+       if (ret)
+               return ret;
+       for (i = 0; i < npins; i++) {
+               if (pcs_pinconf_set(pctldev, pins[i], config))
+                       return -ENOTSUPP;
+       }
+       return 0;
 }
 
 static void pcs_pinconf_dbg_show(struct pinctrl_dev *pctldev,
-                               struct seq_file *s, unsigned offset)
+                               struct seq_file *s, unsigned pin)
 {
 }
 
@@ -451,13 +719,22 @@ static void pcs_pinconf_group_dbg_show(struct pinctrl_dev *pctldev,
 {
 }
 
-static struct pinconf_ops pcs_pinconf_ops = {
+static void pcs_pinconf_config_dbg_show(struct pinctrl_dev *pctldev,
+                                       struct seq_file *s,
+                                       unsigned long config)
+{
+       pinconf_generic_dump_config(pctldev, s, config);
+}
+
+static const struct pinconf_ops pcs_pinconf_ops = {
        .pin_config_get = pcs_pinconf_get,
        .pin_config_set = pcs_pinconf_set,
        .pin_config_group_get = pcs_pinconf_group_get,
        .pin_config_group_set = pcs_pinconf_group_set,
        .pin_config_dbg_show = pcs_pinconf_dbg_show,
        .pin_config_group_dbg_show = pcs_pinconf_group_dbg_show,
+       .pin_config_config_dbg_show = pcs_pinconf_config_dbg_show,
+       .is_generic = true,
 };
 
 /**
@@ -648,11 +925,157 @@ static int pcs_get_pin_by_offset(struct pcs_device *pcs, unsigned offset)
        return index;
 }
 
+/*
+ * check whether data matches enable bits or disable bits
+ * Return value: 1 for matching enable bits, 0 for matching disable bits,
+ *               and negative value for matching failure.
+ */
+static int pcs_config_match(unsigned data, unsigned enable, unsigned disable)
+{
+       int ret = -EINVAL;
+
+       if (data == enable)
+               ret = 1;
+       else if (data == disable)
+               ret = 0;
+       return ret;
+}
+
+static void add_config(struct pcs_conf_vals **conf, enum pin_config_param param,
+                      unsigned value, unsigned enable, unsigned disable,
+                      unsigned mask)
+{
+       (*conf)->param = param;
+       (*conf)->val = value;
+       (*conf)->enable = enable;
+       (*conf)->disable = disable;
+       (*conf)->mask = mask;
+       (*conf)++;
+}
+
+static void add_setting(unsigned long **setting, enum pin_config_param param,
+                       unsigned arg)
+{
+       **setting = pinconf_to_config_packed(param, arg);
+       (*setting)++;
+}
+
+/* add pinconf setting with 2 parameters */
+static void pcs_add_conf2(struct pcs_device *pcs, struct device_node *np,
+                         const char *name, enum pin_config_param param,
+                         struct pcs_conf_vals **conf, unsigned long **settings)
+{
+       unsigned value[2];
+       int ret;
+
+       ret = of_property_read_u32_array(np, name, value, 2);
+       if (ret)
+               return;
+       /* set value & mask */
+       value[0] &= value[1];
+       /* skip enable & disable */
+       add_config(conf, param, value[0], 0, 0, value[1]);
+       add_setting(settings, param, value[0]);
+}
+
+/* add pinconf setting with 4 parameters */
+static void pcs_add_conf4(struct pcs_device *pcs, struct device_node *np,
+                         const char *name, enum pin_config_param param,
+                         struct pcs_conf_vals **conf, unsigned long **settings)
+{
+       unsigned value[4];
+       int ret;
+
+       /* value to set, enable, disable, mask */
+       ret = of_property_read_u32_array(np, name, value, 4);
+       if (ret)
+               return;
+       if (!value[3]) {
+               dev_err(pcs->dev, "mask field of the property can't be 0\n");
+               return;
+       }
+       value[0] &= value[3];
+       value[1] &= value[3];
+       value[2] &= value[3];
+       ret = pcs_config_match(value[0], value[1], value[2]);
+       if (ret < 0)
+               dev_dbg(pcs->dev, "failed to match enable or disable bits\n");
+       add_config(conf, param, value[0], value[1], value[2], value[3]);
+       add_setting(settings, param, ret);
+}
+
+static int pcs_parse_pinconf(struct pcs_device *pcs, struct device_node *np,
+                            struct pcs_function *func,
+                            struct pinctrl_map **map)
+
+{
+       struct pinctrl_map *m = *map;
+       int i = 0, nconfs = 0;
+       unsigned long *settings = NULL, *s = NULL;
+       struct pcs_conf_vals *conf = NULL;
+       struct pcs_conf_type prop2[] = {
+               { "pinctrl-single,drive-strength", PIN_CONFIG_DRIVE_STRENGTH, },
+               { "pinctrl-single,slew-rate", PIN_CONFIG_SLEW_RATE, },
+               { "pinctrl-single,input-schmitt", PIN_CONFIG_INPUT_SCHMITT, },
+       };
+       struct pcs_conf_type prop4[] = {
+               { "pinctrl-single,bias-pullup", PIN_CONFIG_BIAS_PULL_UP, },
+               { "pinctrl-single,bias-pulldown", PIN_CONFIG_BIAS_PULL_DOWN, },
+               { "pinctrl-single,input-schmitt-enable",
+                       PIN_CONFIG_INPUT_SCHMITT_ENABLE, },
+       };
+
+       /* If pinconf isn't supported, don't parse properties in below. */
+       if (!pcs->is_pinconf)
+               return 0;
+
+       /* cacluate how much properties are supported in current node */
+       for (i = 0; i < ARRAY_SIZE(prop2); i++) {
+               if (of_find_property(np, prop2[i].name, NULL))
+                       nconfs++;
+       }
+       for (i = 0; i < ARRAY_SIZE(prop4); i++) {
+               if (of_find_property(np, prop4[i].name, NULL))
+                       nconfs++;
+       }
+       if (!nconfs)
+               return 0;
+
+       func->conf = devm_kzalloc(pcs->dev,
+                                 sizeof(struct pcs_conf_vals) * nconfs,
+                                 GFP_KERNEL);
+       if (!func->conf)
+               return -ENOMEM;
+       func->nconfs = nconfs;
+       conf = &(func->conf[0]);
+       m++;
+       settings = devm_kzalloc(pcs->dev, sizeof(unsigned long) * nconfs,
+                               GFP_KERNEL);
+       if (!settings)
+               return -ENOMEM;
+       s = &settings[0];
+
+       for (i = 0; i < ARRAY_SIZE(prop2); i++)
+               pcs_add_conf2(pcs, np, prop2[i].name, prop2[i].param,
+                             &conf, &s);
+       for (i = 0; i < ARRAY_SIZE(prop4); i++)
+               pcs_add_conf4(pcs, np, prop4[i].name, prop4[i].param,
+                             &conf, &s);
+       m->type = PIN_MAP_TYPE_CONFIGS_GROUP;
+       m->data.configs.group_or_pin = np->name;
+       m->data.configs.configs = settings;
+       m->data.configs.num_configs = nconfs;
+       return 0;
+}
+
+static void pcs_free_pingroups(struct pcs_device *pcs);
+
 /**
  * smux_parse_one_pinctrl_entry() - parses a device tree mux entry
  * @pcs: pinctrl driver instance
  * @np: device node of the mux entry
  * @map: map entry
+ * @num_maps: number of map
  * @pgnames: pingroup names
  *
  * Note that this binding currently supports only sets of one register + value.
@@ -669,6 +1092,7 @@ static int pcs_get_pin_by_offset(struct pcs_device *pcs, unsigned offset)
 static int pcs_parse_one_pinctrl_entry(struct pcs_device *pcs,
                                                struct device_node *np,
                                                struct pinctrl_map **map,
+                                               unsigned *num_maps,
                                                const char **pgnames)
 {
        struct pcs_func_vals *vals;
@@ -741,8 +1165,18 @@ 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_parse_pinconf(pcs, np, function, map))
+                       goto free_pingroups;
+               *num_maps = 2;
+       } else {
+               *num_maps = 1;
+       }
        return 0;
 
+free_pingroups:
+       pcs_free_pingroups(pcs);
+       *num_maps = 1;
 free_function:
        pcs_remove_function(pcs, function);
 
@@ -771,7 +1205,8 @@ static int pcs_dt_node_to_map(struct pinctrl_dev *pctldev,
 
        pcs = pinctrl_dev_get_drvdata(pctldev);
 
-       *map = devm_kzalloc(pcs->dev, sizeof(**map), GFP_KERNEL);
+       /* create 2 maps. One is for pinmux, and the other is for pinconf. */
+       *map = devm_kzalloc(pcs->dev, sizeof(**map) * 2, GFP_KERNEL);
        if (!*map)
                return -ENOMEM;
 
@@ -783,13 +1218,13 @@ static int pcs_dt_node_to_map(struct pinctrl_dev *pctldev,
                goto free_map;
        }
 
-       ret = pcs_parse_one_pinctrl_entry(pcs, np_config, map, pgnames);
+       ret = pcs_parse_one_pinctrl_entry(pcs, np_config, map, num_maps,
+                                         pgnames);
        if (ret < 0) {
                dev_err(pcs->dev, "no pins entries for %s\n",
                        np_config->name);
                goto free_pgnames;
        }
-       *num_maps = 1;
 
        return 0;
 
@@ -879,6 +1314,37 @@ static void pcs_free_resources(struct pcs_device *pcs)
 
 static struct of_device_id pcs_of_match[];
 
+static int pcs_add_gpio_func(struct device_node *node, struct pcs_device *pcs)
+{
+       const char *propname = "pinctrl-single,gpio-range";
+       const char *cellname = "#pinctrl-single,gpio-range-cells";
+       struct of_phandle_args gpiospec;
+       struct pcs_gpiofunc_range *range;
+       int ret, i;
+
+       for (i = 0; ; i++) {
+               ret = of_parse_phandle_with_args(node, propname, cellname,
+                                                i, &gpiospec);
+               /* Do not treat it as error. Only treat it as end condition. */
+               if (ret) {
+                       ret = 0;
+                       break;
+               }
+               range = devm_kzalloc(pcs->dev, sizeof(*range), GFP_KERNEL);
+               if (!range) {
+                       ret = -ENOMEM;
+                       break;
+               }
+               range->offset = gpiospec.args[0];
+               range->npins = gpiospec.args[1];
+               range->gpiofunc = gpiospec.args[2];
+               mutex_lock(&pcs->mutex);
+               list_add_tail(&range->node, &pcs->gpiofuncs);
+               mutex_unlock(&pcs->mutex);
+       }
+       return ret;
+}
+
 static int pcs_probe(struct platform_device *pdev)
 {
        struct device_node *np = pdev->dev.of_node;
@@ -900,14 +1366,23 @@ static int pcs_probe(struct platform_device *pdev)
        mutex_init(&pcs->mutex);
        INIT_LIST_HEAD(&pcs->pingroups);
        INIT_LIST_HEAD(&pcs->functions);
+       INIT_LIST_HEAD(&pcs->gpiofuncs);
+       pcs->is_pinconf = match->data;
 
        PCS_GET_PROP_U32("pinctrl-single,register-width", &pcs->width,
                         "register width not specified\n");
 
-       PCS_GET_PROP_U32("pinctrl-single,function-mask", &pcs->fmask,
-                        "function register mask not specified\n");
-       pcs->fshift = ffs(pcs->fmask) - 1;
-       pcs->fmax = pcs->fmask >> pcs->fshift;
+       ret = of_property_read_u32(np, "pinctrl-single,function-mask",
+                                  &pcs->fmask);
+       if (!ret) {
+               pcs->fshift = ffs(pcs->fmask) - 1;
+               pcs->fmax = pcs->fmask >> pcs->fshift;
+       } else {
+               /* If mask property doesn't exist, function mux is invalid. */
+               pcs->fmask = 0;
+               pcs->fshift = 0;
+               pcs->fmax = 0;
+       }
 
        ret = of_property_read_u32(np, "pinctrl-single,function-off",
                                        &pcs->foff);
@@ -961,7 +1436,8 @@ 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;
-       pcs->desc.confops = &pcs_pinconf_ops;
+       if (pcs->is_pinconf)
+               pcs->desc.confops = &pcs_pinconf_ops;
        pcs->desc.owner = THIS_MODULE;
 
        ret = pcs_allocate_pin_table(pcs);
@@ -975,6 +1451,10 @@ static int pcs_probe(struct platform_device *pdev)
                goto free;
        }
 
+       ret = pcs_add_gpio_func(np, pcs);
+       if (ret < 0)
+               goto free;
+
        dev_info(pcs->dev, "%i pins at pa %p size %u\n",
                 pcs->desc.npins, pcs->base, pcs->size);
 
@@ -999,7 +1479,8 @@ static int pcs_remove(struct platform_device *pdev)
 }
 
 static struct of_device_id pcs_of_match[] = {
-       { .compatible = DRIVER_NAME, },
+       { .compatible = "pinctrl-single", .data = (void *)false },
+       { .compatible = "pinconf-single", .data = (void *)true },
        { },
 };
 MODULE_DEVICE_TABLE(of, pcs_of_match);
index d02498b30c6ef1f4a0eb33a6f3dd23ea46850324..08582fecdf1b9ea7b7b7677673497334efed52ef 100644 (file)
@@ -14,6 +14,7 @@
 #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>
@@ -25,7 +26,6 @@
 #include <linux/bitops.h>
 #include <linux/gpio.h>
 #include <linux/of_gpio.h>
-#include <asm/mach/irq.h>
 
 #define DRIVER_NAME "pinmux-sirf"
 
@@ -979,7 +979,7 @@ static void sirfsoc_dt_free_map(struct pinctrl_dev *pctldev,
        kfree(map);
 }
 
-static struct pinctrl_ops sirfsoc_pctrl_ops = {
+static const struct pinctrl_ops sirfsoc_pctrl_ops = {
        .get_groups_count = sirfsoc_get_groups_count,
        .get_group_name = sirfsoc_get_group_name,
        .get_group_pins = sirfsoc_get_group_pins,
@@ -1181,7 +1181,7 @@ static int sirfsoc_pinmux_request_gpio(struct pinctrl_dev *pmxdev,
        return 0;
 }
 
-static struct pinmux_ops sirfsoc_pinmux_ops = {
+static const struct pinmux_ops sirfsoc_pinmux_ops = {
        .enable = sirfsoc_pinmux_enable,
        .disable = sirfsoc_pinmux_disable,
        .get_functions_count = sirfsoc_pinmux_get_funcs_count,
index 80b11e3415bca3c3eb24e06f0ca96ef199561093..cb491d6ba6010e2355de62081fc9744f59d1bb1d 100644 (file)
 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(0x1, "gpio_out"),
+               SUNXI_FUNCTION(0x2, "wemac"),           /* 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(0x1, "gpio_out"),
+               SUNXI_FUNCTION(0x2, "wemac"),           /* 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(0x1, "gpio_out"),
+               SUNXI_FUNCTION(0x2, "wemac"),           /* 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(0x1, "gpio_out"),
+               SUNXI_FUNCTION(0x2, "wemac"),           /* 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(0x1, "gpio_out"),
+               SUNXI_FUNCTION(0x2, "wemac"),           /* ETXD3 */
+               SUNXI_FUNCTION(0x3, "spi1")),           /* CS1 */
        SUNXI_PIN(SUNXI_PINCTRL_PIN_PA5,
                SUNXI_FUNCTION(0x0, "gpio_in"),
-               SUNXI_FUNCTION(0x1, "gpio_out")),
+               SUNXI_FUNCTION(0x1, "gpio_out"),
+               SUNXI_FUNCTION(0x2, "wemac"),           /* ETXD2 */
+               SUNXI_FUNCTION(0x3, "spi3")),           /* CS0 */
        SUNXI_PIN(SUNXI_PINCTRL_PIN_PA6,
                SUNXI_FUNCTION(0x0, "gpio_in"),
-               SUNXI_FUNCTION(0x1, "gpio_out")),
+               SUNXI_FUNCTION(0x1, "gpio_out"),
+               SUNXI_FUNCTION(0x2, "wemac"),           /* ETXD1 */
+               SUNXI_FUNCTION(0x3, "spi3")),           /* CLK */
        SUNXI_PIN(SUNXI_PINCTRL_PIN_PA7,
                SUNXI_FUNCTION(0x0, "gpio_in"),
-               SUNXI_FUNCTION(0x1, "gpio_out")),
+               SUNXI_FUNCTION(0x1, "gpio_out"),
+               SUNXI_FUNCTION(0x2, "wemac"),           /* ETXD0 */
+               SUNXI_FUNCTION(0x3, "spi3")),           /* MOSI */
        SUNXI_PIN(SUNXI_PINCTRL_PIN_PA8,
                SUNXI_FUNCTION(0x0, "gpio_in"),
-               SUNXI_FUNCTION(0x1, "gpio_out")),
+               SUNXI_FUNCTION(0x1, "gpio_out"),
+               SUNXI_FUNCTION(0x2, "wemac"),           /* ERXCK */
+               SUNXI_FUNCTION(0x3, "spi3")),           /* MISO */
        SUNXI_PIN(SUNXI_PINCTRL_PIN_PA9,
                SUNXI_FUNCTION(0x0, "gpio_in"),
-               SUNXI_FUNCTION(0x1, "gpio_out")),
+               SUNXI_FUNCTION(0x1, "gpio_out"),
+               SUNXI_FUNCTION(0x2, "wemac"),           /* 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, "wemac"),           /* 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, "wemac"),           /* 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, "wemac"),           /* 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, "wemac"),           /* 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, "wemac"),           /* 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, "wemac"),           /* 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, "wemac"),           /* 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, "wemac"),           /* 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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(0x1, "gpio_out"),
+               SUNXI_FUNCTION(0x2, "lcd1"),            /* D0 */
+               SUNXI_FUNCTION(0x3, "pata"),            /* ATAA0 */
+               SUNXI_FUNCTION(0x4, "uart3"),           /* TX */
+               SUNXI_FUNCTION(0x7, "csi1")),           /* D0 */
        SUNXI_PIN(SUNXI_PINCTRL_PIN_PH1,
                SUNXI_FUNCTION(0x0, "gpio_in"),
-               SUNXI_FUNCTION(0x1, "gpio_out")),
+               SUNXI_FUNCTION(0x1, "gpio_out"),
+               SUNXI_FUNCTION(0x2, "lcd1"),            /* D1 */
+               SUNXI_FUNCTION(0x3, "pata"),            /* ATAA1 */
+               SUNXI_FUNCTION(0x4, "uart3"),           /* RX */
+               SUNXI_FUNCTION(0x7, "csi1")),           /* D1 */
        SUNXI_PIN(SUNXI_PINCTRL_PIN_PH2,
                SUNXI_FUNCTION(0x0, "gpio_in"),
-               SUNXI_FUNCTION(0x1, "gpio_out")),
+               SUNXI_FUNCTION(0x1, "gpio_out"),
+               SUNXI_FUNCTION(0x2, "lcd1"),            /* D2 */
+               SUNXI_FUNCTION(0x3, "pata"),            /* ATAA2 */
+               SUNXI_FUNCTION(0x4, "uart3"),           /* RTS */
+               SUNXI_FUNCTION(0x7, "csi1")),           /* D2 */
        SUNXI_PIN(SUNXI_PINCTRL_PIN_PH3,
                SUNXI_FUNCTION(0x0, "gpio_in"),
-               SUNXI_FUNCTION(0x1, "gpio_out")),
+               SUNXI_FUNCTION(0x1, "gpio_out"),
+               SUNXI_FUNCTION(0x2, "lcd1"),            /* D3 */
+               SUNXI_FUNCTION(0x3, "pata"),            /* ATAIRQ */
+               SUNXI_FUNCTION(0x4, "uart3"),           /* CTS */
+               SUNXI_FUNCTION(0x7, "csi1")),           /* D3 */
        SUNXI_PIN(SUNXI_PINCTRL_PIN_PH4,
                SUNXI_FUNCTION(0x0, "gpio_in"),
-               SUNXI_FUNCTION(0x1, "gpio_out")),
+               SUNXI_FUNCTION(0x1, "gpio_out"),
+               SUNXI_FUNCTION(0x2, "lcd1"),            /* D4 */
+               SUNXI_FUNCTION(0x3, "pata"),            /* ATAD0 */
+               SUNXI_FUNCTION(0x4, "uart4"),           /* TX */
+               SUNXI_FUNCTION(0x7, "csi1")),           /* D4 */
        SUNXI_PIN(SUNXI_PINCTRL_PIN_PH5,
                SUNXI_FUNCTION(0x0, "gpio_in"),
-               SUNXI_FUNCTION(0x1, "gpio_out")),
+               SUNXI_FUNCTION(0x1, "gpio_out"),
+               SUNXI_FUNCTION(0x2, "lcd1"),            /* D5 */
+               SUNXI_FUNCTION(0x3, "pata"),            /* ATAD1 */
+               SUNXI_FUNCTION(0x4, "uart4"),           /* RX */
+               SUNXI_FUNCTION(0x7, "csi1")),           /* D5 */
        SUNXI_PIN(SUNXI_PINCTRL_PIN_PH6,
                SUNXI_FUNCTION(0x0, "gpio_in"),
-               SUNXI_FUNCTION(0x1, "gpio_out")),
+               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(0x7, "csi1")),           /* D6 */
        SUNXI_PIN(SUNXI_PINCTRL_PIN_PH7,
                SUNXI_FUNCTION(0x0, "gpio_in"),
-               SUNXI_FUNCTION(0x1, "gpio_out")),
+               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(0x7, "csi1")),           /* D7 */
        SUNXI_PIN(SUNXI_PINCTRL_PIN_PH8,
                SUNXI_FUNCTION(0x0, "gpio_in"),
-               SUNXI_FUNCTION(0x1, "gpio_out")),
+               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(0x7, "csi1")),           /* D8 */
        SUNXI_PIN(SUNXI_PINCTRL_PIN_PH9,
                SUNXI_FUNCTION(0x0, "gpio_in"),
-               SUNXI_FUNCTION(0x1, "gpio_out")),
+               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(0x7, "csi1")),           /* D9 */
        SUNXI_PIN(SUNXI_PINCTRL_PIN_PH10,
                SUNXI_FUNCTION(0x0, "gpio_in"),
-               SUNXI_FUNCTION(0x1, "gpio_out")),
+               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(0x7, "csi1")),           /* D10 */
        SUNXI_PIN(SUNXI_PINCTRL_PIN_PH11,
                SUNXI_FUNCTION(0x0, "gpio_in"),
-               SUNXI_FUNCTION(0x1, "gpio_out")),
+               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(0x7, "csi1")),           /* D11 */
        SUNXI_PIN(SUNXI_PINCTRL_PIN_PH12,
                SUNXI_FUNCTION(0x0, "gpio_in"),
-               SUNXI_FUNCTION(0x1, "gpio_out")),
+               SUNXI_FUNCTION(0x1, "gpio_out"),
+               SUNXI_FUNCTION(0x2, "lcd1"),            /* D12 */
+               SUNXI_FUNCTION(0x3, "pata"),            /* ATAD8 */
+               SUNXI_FUNCTION(0x4, "ps2"),             /* SCK1 */
+               SUNXI_FUNCTION(0x7, "csi1")),           /* D12 */
        SUNXI_PIN(SUNXI_PINCTRL_PIN_PH13,
                SUNXI_FUNCTION(0x0, "gpio_in"),
-               SUNXI_FUNCTION(0x1, "gpio_out")),
+               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(0x7, "csi1")),           /* D13 */
        SUNXI_PIN(SUNXI_PINCTRL_PIN_PH14,
                SUNXI_FUNCTION(0x0, "gpio_in"),
-               SUNXI_FUNCTION(0x1, "gpio_out")),
+               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(0x7, "csi1")),           /* D14 */
        SUNXI_PIN(SUNXI_PINCTRL_PIN_PH15,
                SUNXI_FUNCTION(0x0, "gpio_in"),
-               SUNXI_FUNCTION(0x1, "gpio_out")),
+               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(0x7, "csi1")),           /* D15 */
        SUNXI_PIN(SUNXI_PINCTRL_PIN_PH16,
                SUNXI_FUNCTION(0x0, "gpio_in"),
-               SUNXI_FUNCTION(0x1, "gpio_out")),
+               SUNXI_FUNCTION(0x1, "gpio_out"),
+               SUNXI_FUNCTION(0x2, "lcd1"),            /* D16 */
+               SUNXI_FUNCTION(0x3, "pata"),            /* ATAD12 */
+               SUNXI_FUNCTION(0x4, "keypad"),          /* IN6 */
+               SUNXI_FUNCTION(0x7, "csi1")),           /* D16 */
        SUNXI_PIN(SUNXI_PINCTRL_PIN_PH17,
                SUNXI_FUNCTION(0x0, "gpio_in"),
-               SUNXI_FUNCTION(0x1, "gpio_out")),
+               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(0x7, "csi1")),           /* D17 */
        SUNXI_PIN(SUNXI_PINCTRL_PIN_PH18,
                SUNXI_FUNCTION(0x0, "gpio_in"),
-               SUNXI_FUNCTION(0x1, "gpio_out")),
+               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(0x7, "csi1")),           /* D18 */
        SUNXI_PIN(SUNXI_PINCTRL_PIN_PH19,
                SUNXI_FUNCTION(0x0, "gpio_in"),
-               SUNXI_FUNCTION(0x1, "gpio_out")),
+               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(0x7, "csi1")),           /* D19 */
        SUNXI_PIN(SUNXI_PINCTRL_PIN_PH20,
                SUNXI_FUNCTION(0x0, "gpio_in"),
-               SUNXI_FUNCTION(0x1, "gpio_out")),
+               SUNXI_FUNCTION(0x1, "gpio_out"),
+               SUNXI_FUNCTION(0x2, "lcd1"),            /* D20 */
+               SUNXI_FUNCTION(0x3, "pata"),            /* ATAOE */
+               SUNXI_FUNCTION(0x4, "can"),             /* TX */
+               SUNXI_FUNCTION(0x7, "csi1")),           /* D20 */
        SUNXI_PIN(SUNXI_PINCTRL_PIN_PH21,
                SUNXI_FUNCTION(0x0, "gpio_in"),
-               SUNXI_FUNCTION(0x1, "gpio_out")),
+               SUNXI_FUNCTION(0x1, "gpio_out"),
+               SUNXI_FUNCTION(0x2, "lcd1"),            /* D21 */
+               SUNXI_FUNCTION(0x3, "pata"),            /* ATADREQ */
+               SUNXI_FUNCTION(0x4, "can"),             /* RX */
+               SUNXI_FUNCTION(0x7, "csi1")),           /* D21 */
        SUNXI_PIN(SUNXI_PINCTRL_PIN_PH22,
                SUNXI_FUNCTION(0x0, "gpio_in"),
-               SUNXI_FUNCTION(0x1, "gpio_out")),
+               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(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(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(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(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(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"),
@@ -518,277 +892,401 @@ static const struct sunxi_desc_pin sun4i_a10_pins[] = {
                SUNXI_FUNCTION(0x1, "gpio_out")),
        SUNXI_PIN(SUNXI_PINCTRL_PIN_PI3,
                SUNXI_FUNCTION(0x0, "gpio_in"),
-               SUNXI_FUNCTION(0x1, "gpio_out")),
+               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(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(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(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(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(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(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(0x1, "gpio_out"),
+               SUNXI_FUNCTION(0x2, "spi0"),            /* CS0 */
+               SUNXI_FUNCTION(0x3, "uart5")),          /* TX */
        SUNXI_PIN(SUNXI_PINCTRL_PIN_PI11,
                SUNXI_FUNCTION(0x0, "gpio_in"),
-               SUNXI_FUNCTION(0x1, "gpio_out")),
+               SUNXI_FUNCTION(0x1, "gpio_out"),
+               SUNXI_FUNCTION(0x2, "spi0"),            /* CLK */
+               SUNXI_FUNCTION(0x3, "uart5")),          /* RX */
        SUNXI_PIN(SUNXI_PINCTRL_PIN_PI12,
                SUNXI_FUNCTION(0x0, "gpio_in"),
-               SUNXI_FUNCTION(0x1, "gpio_out")),
+               SUNXI_FUNCTION(0x1, "gpio_out"),
+               SUNXI_FUNCTION(0x2, "spi0"),            /* MOSI */
+               SUNXI_FUNCTION(0x3, "uart6")),          /* TX */
        SUNXI_PIN(SUNXI_PINCTRL_PIN_PI13,
                SUNXI_FUNCTION(0x0, "gpio_in"),
-               SUNXI_FUNCTION(0x1, "gpio_out")),
+               SUNXI_FUNCTION(0x1, "gpio_out"),
+               SUNXI_FUNCTION(0x2, "spi0"),            /* MISO */
+               SUNXI_FUNCTION(0x3, "uart6")),          /* RX */
        SUNXI_PIN(SUNXI_PINCTRL_PIN_PI14,
                SUNXI_FUNCTION(0x0, "gpio_in"),
-               SUNXI_FUNCTION(0x1, "gpio_out")),
+               SUNXI_FUNCTION(0x1, "gpio_out"),
+               SUNXI_FUNCTION(0x2, "spi0"),            /* CS1 */
+               SUNXI_FUNCTION(0x3, "ps2"),             /* SCK1 */
+               SUNXI_FUNCTION(0x4, "timer4")),         /* TCLKIN0 */
        SUNXI_PIN(SUNXI_PINCTRL_PIN_PI15,
                SUNXI_FUNCTION(0x0, "gpio_in"),
-               SUNXI_FUNCTION(0x1, "gpio_out")),
+               SUNXI_FUNCTION(0x1, "gpio_out"),
+               SUNXI_FUNCTION(0x2, "spi1"),            /* CS1 */
+               SUNXI_FUNCTION(0x3, "ps2"),             /* SDA1 */
+               SUNXI_FUNCTION(0x4, "timer5")),         /* TCLKIN1 */
        SUNXI_PIN(SUNXI_PINCTRL_PIN_PI16,
                SUNXI_FUNCTION(0x0, "gpio_in"),
-               SUNXI_FUNCTION(0x1, "gpio_out")),
+               SUNXI_FUNCTION(0x1, "gpio_out"),
+               SUNXI_FUNCTION(0x2, "spi1"),            /* CS0 */
+               SUNXI_FUNCTION(0x3, "uart2")),          /* RTS */
        SUNXI_PIN(SUNXI_PINCTRL_PIN_PI17,
                SUNXI_FUNCTION(0x0, "gpio_in"),
-               SUNXI_FUNCTION(0x1, "gpio_out")),
+               SUNXI_FUNCTION(0x1, "gpio_out"),
+               SUNXI_FUNCTION(0x2, "spi1"),            /* CLK */
+               SUNXI_FUNCTION(0x3, "uart2")),          /* CTS */
        SUNXI_PIN(SUNXI_PINCTRL_PIN_PI18,
                SUNXI_FUNCTION(0x0, "gpio_in"),
-               SUNXI_FUNCTION(0x1, "gpio_out")),
+               SUNXI_FUNCTION(0x1, "gpio_out"),
+               SUNXI_FUNCTION(0x2, "spi1"),            /* MOSI */
+               SUNXI_FUNCTION(0x3, "uart2")),          /* TX */
        SUNXI_PIN(SUNXI_PINCTRL_PIN_PI19,
                SUNXI_FUNCTION(0x0, "gpio_in"),
-               SUNXI_FUNCTION(0x1, "gpio_out")),
+               SUNXI_FUNCTION(0x1, "gpio_out"),
+               SUNXI_FUNCTION(0x2, "spi1"),            /* MISO */
+               SUNXI_FUNCTION(0x3, "uart2")),          /* RX */
        SUNXI_PIN(SUNXI_PINCTRL_PIN_PI20,
                SUNXI_FUNCTION(0x0, "gpio_in"),
-               SUNXI_FUNCTION(0x1, "gpio_out")),
+               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(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_a13_pins[] = {
        /* Hole */
        SUNXI_PIN(SUNXI_PINCTRL_PIN_PB0,
                SUNXI_FUNCTION(0x0, "gpio_in"),
-               SUNXI_FUNCTION(0x1, "gpio_out")),
+               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(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(0x1, "gpio_out"),
+               SUNXI_FUNCTION(0x2, "pwm")),
        SUNXI_PIN(SUNXI_PINCTRL_PIN_PB3,
                SUNXI_FUNCTION(0x0, "gpio_in"),
-               SUNXI_FUNCTION(0x1, "gpio_out")),
+               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(0x1, "gpio_out"),
+               SUNXI_FUNCTION(0x2, "ir0")),            /* RX */
        /* Hole */
        SUNXI_PIN(SUNXI_PINCTRL_PIN_PB10,
                SUNXI_FUNCTION(0x0, "gpio_in"),
-               SUNXI_FUNCTION(0x1, "gpio_out")),
+               SUNXI_FUNCTION(0x1, "gpio_out"),
+               SUNXI_FUNCTION(0x2, "spi2")),           /* CS1 */
        /* Hole */
        SUNXI_PIN(SUNXI_PINCTRL_PIN_PB15,
                SUNXI_FUNCTION(0x0, "gpio_in"),
-               SUNXI_FUNCTION(0x1, "gpio_out")),
+               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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(0x3, "csi0"),            /* PCLK */
+               SUNXI_FUNCTION(0x4, "spi2")),           /* CS0 */
        SUNXI_PIN(SUNXI_PINCTRL_PIN_PE1,
                SUNXI_FUNCTION(0x0, "gpio_in"),
-               SUNXI_FUNCTION(0x1, "gpio_out")),
+               SUNXI_FUNCTION(0x3, "csi0"),            /* MCLK */
+               SUNXI_FUNCTION(0x4, "spi2")),           /* CLK */
        SUNXI_PIN(SUNXI_PINCTRL_PIN_PE2,
                SUNXI_FUNCTION(0x0, "gpio_in"),
-               SUNXI_FUNCTION(0x1, "gpio_out")),
+               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(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(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(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(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(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(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(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(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(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(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(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(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(0x1, "gpio_out"),
+               SUNXI_FUNCTION(0x4, "mmc0")),           /* D2 */
        /* Hole */
        SUNXI_PIN(SUNXI_PINCTRL_PIN_PG0,
                SUNXI_FUNCTION(0x0, "gpio_in"),
@@ -802,24 +1300,34 @@ static const struct sunxi_desc_pin sun5i_a13_pins[] = {
        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_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 */
-       /* Hole */
+/* Hole */
        SUNXI_PIN(SUNXI_PINCTRL_PIN_PG9,
                SUNXI_FUNCTION(0x0, "gpio_in"),
-               SUNXI_FUNCTION(0x1, "gpio_out")),
+               SUNXI_FUNCTION(0x1, "gpio_out"),
+               SUNXI_FUNCTION(0x2, "spi1"),            /* CS0 */
+               SUNXI_FUNCTION(0x3, "uart3")),          /* TX */
        SUNXI_PIN(SUNXI_PINCTRL_PIN_PG10,
                SUNXI_FUNCTION(0x0, "gpio_in"),
-               SUNXI_FUNCTION(0x1, "gpio_out")),
+               SUNXI_FUNCTION(0x1, "gpio_out"),
+               SUNXI_FUNCTION(0x2, "spi1"),            /* CLK */
+               SUNXI_FUNCTION(0x3, "uart3")),          /* RX */
        SUNXI_PIN(SUNXI_PINCTRL_PIN_PG11,
                SUNXI_FUNCTION(0x0, "gpio_in"),
-               SUNXI_FUNCTION(0x1, "gpio_out")),
+               SUNXI_FUNCTION(0x1, "gpio_out"),
+               SUNXI_FUNCTION(0x2, "spi1"),            /* MOSI */
+               SUNXI_FUNCTION(0x3, "uart3")),          /* CTS */
        SUNXI_PIN(SUNXI_PINCTRL_PIN_PG12,
                SUNXI_FUNCTION(0x0, "gpio_in"),
-               SUNXI_FUNCTION(0x1, "gpio_out")),
+               SUNXI_FUNCTION(0x1, "gpio_out"),
+               SUNXI_FUNCTION(0x2, "spi1"),            /* MISO */
+               SUNXI_FUNCTION(0x3, "uart3")),          /* RTS */
 };
 
 static const struct sunxi_pinctrl_desc sun4i_a10_pinctrl_data = {
@@ -1029,7 +1537,7 @@ static void sunxi_pctrl_dt_free_map(struct pinctrl_dev *pctldev,
        kfree(map);
 }
 
-static struct pinctrl_ops sunxi_pctrl_ops = {
+static const struct pinctrl_ops sunxi_pctrl_ops = {
        .dt_node_to_map         = sunxi_pctrl_dt_node_to_map,
        .dt_free_map            = sunxi_pctrl_dt_free_map,
        .get_groups_count       = sunxi_pctrl_get_groups_count,
@@ -1098,7 +1606,7 @@ static int sunxi_pconf_group_set(struct pinctrl_dev *pctldev,
        return 0;
 }
 
-static struct pinconf_ops sunxi_pconf_ops = {
+static const struct pinconf_ops sunxi_pconf_ops = {
        .pin_config_group_get   = sunxi_pconf_group_get,
        .pin_config_group_set   = sunxi_pconf_group_set,
 };
@@ -1204,7 +1712,7 @@ error:
        return ret;
 }
 
-static struct pinmux_ops sunxi_pmx_ops = {
+static const struct pinmux_ops sunxi_pmx_ops = {
        .get_functions_count    = sunxi_pmx_get_funcs_cnt,
        .get_function_name      = sunxi_pmx_get_func_name,
        .get_function_groups    = sunxi_pmx_get_func_groups,
index f195d77a35729f6496914be6d91a7236f136084d..2fa9bc6cd7abfcf41bc9635980d0db4d2ec6b5b2 100644 (file)
@@ -316,7 +316,7 @@ static int tegra_pinctrl_dt_node_to_map(struct pinctrl_dev *pctldev,
        return 0;
 }
 
-static struct pinctrl_ops tegra_pinctrl_ops = {
+static const struct pinctrl_ops tegra_pinctrl_ops = {
        .get_groups_count = tegra_pinctrl_get_groups_count,
        .get_group_name = tegra_pinctrl_get_group_name,
        .get_group_pins = tegra_pinctrl_get_group_pins,
@@ -401,7 +401,7 @@ static void tegra_pinctrl_disable(struct pinctrl_dev *pctldev,
        pmx_writel(pmx, val, g->mux_bank, g->mux_reg);
 }
 
-static struct pinmux_ops tegra_pinmux_ops = {
+static const struct pinmux_ops tegra_pinmux_ops = {
        .get_functions_count = tegra_pinctrl_get_funcs_count,
        .get_function_name = tegra_pinctrl_get_func_name,
        .get_function_groups = tegra_pinctrl_get_func_groups,
@@ -676,7 +676,7 @@ static void tegra_pinconf_config_dbg_show(struct pinctrl_dev *pctldev,
 }
 #endif
 
-static struct pinconf_ops tegra_pinconf_ops = {
+static const struct pinconf_ops tegra_pinconf_ops = {
        .pin_config_get = tegra_pinconf_get,
        .pin_config_set = tegra_pinconf_set,
        .pin_config_group_get = tegra_pinconf_group_get,
index 2b5772550836095fbb250a6c3a76e9ae9fdce610..6a3a7503e6a02ef91759fb44e70a9003601bc3ce 100644 (file)
@@ -860,7 +860,7 @@ static void u300_pin_dbg_show(struct pinctrl_dev *pctldev, struct seq_file *s,
        seq_printf(s, " " DRIVER_NAME);
 }
 
-static struct pinctrl_ops u300_pctrl_ops = {
+static const struct pinctrl_ops u300_pctrl_ops = {
        .get_groups_count = u300_get_groups_count,
        .get_group_name = u300_get_group_name,
        .get_group_pins = u300_get_group_pins,
@@ -1003,7 +1003,7 @@ static int u300_pmx_get_groups(struct pinctrl_dev *pctldev, unsigned selector,
        return 0;
 }
 
-static struct pinmux_ops u300_pmx_ops = {
+static const struct pinmux_ops u300_pmx_ops = {
        .get_functions_count = u300_pmx_get_funcs_count,
        .get_function_name = u300_pmx_get_func_name,
        .get_function_groups = u300_pmx_get_groups,
@@ -1046,7 +1046,7 @@ static int u300_pin_config_set(struct pinctrl_dev *pctldev, unsigned pin,
        return 0;
 }
 
-static struct pinconf_ops u300_pconf_ops = {
+static const struct pinconf_ops u300_pconf_ops = {
        .is_generic = true,
        .pin_config_get = u300_pin_config_get,
        .pin_config_set = u300_pin_config_set,
index 068224efa6fada7cf78ecdcf76c0ea7b68112deb..f2977cff8366f4b89f88987f1080039a39f2f110 100644 (file)
@@ -553,7 +553,7 @@ int xway_pinconf_group_set(struct pinctrl_dev *pctldev,
        return ret;
 }
 
-static struct pinconf_ops xway_pinconf_ops = {
+static const struct pinconf_ops xway_pinconf_ops = {
        .pin_config_get = xway_pinconf_get,
        .pin_config_set = xway_pinconf_set,
        .pin_config_group_set = xway_pinconf_group_set,
index c3340f54d2ad4a56f9059c43cb5e0be08d98e7dc..0e1f99c33d47d3cfcb6677ee4736cbe37edf80d4 100644 (file)
@@ -10,6 +10,7 @@ config PINCTRL_SH_PFC
        select GPIO_SH_PFC if ARCH_REQUIRE_GPIOLIB
        select PINMUX
        select PINCONF
+       select GENERIC_PINCONF
        def_bool y
        help
          This enables pin control drivers for SH and SH Mobile platforms
@@ -21,6 +22,11 @@ config GPIO_SH_PFC
          This enables support for GPIOs within the SoC's pin function
          controller.
 
+config PINCTRL_PFC_R8A73A4
+       def_bool y
+       depends on ARCH_R8A73A4
+       select PINCTRL_SH_PFC
+
 config PINCTRL_PFC_R8A7740
        def_bool y
        depends on ARCH_R8A7740
index e8b9562c47e161feddd731ed3d4b0fb2578e8ef1..211cd8e98a8a6ca8797738f14c97b2755162b08d 100644 (file)
@@ -3,6 +3,7 @@ ifeq ($(CONFIG_GPIO_SH_PFC),y)
 sh-pfc-objs                    += gpio.o
 endif
 obj-$(CONFIG_PINCTRL_SH_PFC)   += sh-pfc.o
+obj-$(CONFIG_PINCTRL_PFC_R8A73A4)      += pfc-r8a73a4.o
 obj-$(CONFIG_PINCTRL_PFC_R8A7740)      += pfc-r8a7740.o
 obj-$(CONFIG_PINCTRL_PFC_R8A7779)      += pfc-r8a7779.o
 obj-$(CONFIG_PINCTRL_PFC_SH7203)       += pfc-sh7203.o
index 970ddff2b0b6a4eea4abfc3e262ade40f7e8f4a0..b551336924a55c4a6ce5d1ebd0f500b74250e646 100644 (file)
@@ -10,7 +10,6 @@
  */
 
 #define DRV_NAME "sh-pfc"
-#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 
 #include <linux/bitops.h>
 #include <linux/err.h>
@@ -30,10 +29,8 @@ static int sh_pfc_ioremap(struct sh_pfc *pfc, struct platform_device *pdev)
        struct resource *res;
        int k;
 
-       if (pdev->num_resources == 0) {
-               pfc->num_windows = 0;
-               return 0;
-       }
+       if (pdev->num_resources == 0)
+               return -EINVAL;
 
        pfc->window = devm_kzalloc(pfc->dev, pdev->num_resources *
                                   sizeof(*pfc->window), GFP_NOWAIT);
@@ -59,11 +56,11 @@ static void __iomem *sh_pfc_phys_to_virt(struct sh_pfc *pfc,
                                         unsigned long address)
 {
        struct sh_pfc_window *window;
-       int k;
+       unsigned int i;
 
        /* scan through physical windows and convert address */
-       for (k = 0; k < pfc->num_windows; k++) {
-               window = pfc->window + k;
+       for (i = 0; i < pfc->num_windows; i++) {
+               window = pfc->window + i;
 
                if (address < window->phys)
                        continue;
@@ -74,11 +71,33 @@ static void __iomem *sh_pfc_phys_to_virt(struct sh_pfc *pfc,
                return window->virt + (address - window->phys);
        }
 
-       /* no windows defined, register must be 1:1 mapped virt:phys */
-       return (void __iomem *)address;
+       BUG();
+       return NULL;
+}
+
+int sh_pfc_get_pin_index(struct sh_pfc *pfc, unsigned int pin)
+{
+       unsigned int offset;
+       unsigned int i;
+
+       if (pfc->info->ranges == NULL)
+               return pin;
+
+       for (i = 0, offset = 0; i < pfc->info->nr_ranges; ++i) {
+               const struct pinmux_range *range = &pfc->info->ranges[i];
+
+               if (pin <= range->end)
+                       return pin >= range->begin
+                            ? offset + pin - range->begin : -1;
+
+               offset += range->end - range->begin + 1;
+       }
+
+       return -EINVAL;
 }
 
-static int sh_pfc_enum_in_range(pinmux_enum_t enum_id, struct pinmux_range *r)
+static int sh_pfc_enum_in_range(pinmux_enum_t enum_id,
+                               const struct pinmux_range *r)
 {
        if (enum_id < r->begin)
                return 0;
@@ -89,8 +108,8 @@ static int sh_pfc_enum_in_range(pinmux_enum_t enum_id, struct pinmux_range *r)
        return 1;
 }
 
-static unsigned long sh_pfc_read_raw_reg(void __iomem *mapped_reg,
-                                        unsigned long reg_width)
+unsigned long sh_pfc_read_raw_reg(void __iomem *mapped_reg,
+                                 unsigned long reg_width)
 {
        switch (reg_width) {
        case 8:
@@ -105,8 +124,8 @@ static unsigned long sh_pfc_read_raw_reg(void __iomem *mapped_reg,
        return 0;
 }
 
-static void sh_pfc_write_raw_reg(void __iomem *mapped_reg,
-                                unsigned long reg_width, unsigned long data)
+void sh_pfc_write_raw_reg(void __iomem *mapped_reg, unsigned long reg_width,
+                         unsigned long data)
 {
        switch (reg_width) {
        case 8:
@@ -123,39 +142,8 @@ static void sh_pfc_write_raw_reg(void __iomem *mapped_reg,
        BUG();
 }
 
-int sh_pfc_read_bit(struct pinmux_data_reg *dr, unsigned long in_pos)
-{
-       unsigned long pos;
-
-       pos = dr->reg_width - (in_pos + 1);
-
-       pr_debug("read_bit: addr = %lx, pos = %ld, "
-                "r_width = %ld\n", dr->reg, pos, dr->reg_width);
-
-       return (sh_pfc_read_raw_reg(dr->mapped_reg, dr->reg_width) >> pos) & 1;
-}
-
-void sh_pfc_write_bit(struct pinmux_data_reg *dr, unsigned long in_pos,
-                     unsigned long value)
-{
-       unsigned long pos;
-
-       pos = dr->reg_width - (in_pos + 1);
-
-       pr_debug("write_bit addr = %lx, value = %d, pos = %ld, "
-                "r_width = %ld\n",
-                dr->reg, !!value, pos, dr->reg_width);
-
-       if (value)
-               set_bit(pos, &dr->reg_shadow);
-       else
-               clear_bit(pos, &dr->reg_shadow);
-
-       sh_pfc_write_raw_reg(dr->mapped_reg, dr->reg_width, dr->reg_shadow);
-}
-
 static void sh_pfc_config_reg_helper(struct sh_pfc *pfc,
-                                    struct pinmux_cfg_reg *crp,
+                                    const struct pinmux_cfg_reg *crp,
                                     unsigned long in_pos,
                                     void __iomem **mapped_regp,
                                     unsigned long *maskp,
@@ -176,24 +164,8 @@ static void sh_pfc_config_reg_helper(struct sh_pfc *pfc,
        }
 }
 
-static int sh_pfc_read_config_reg(struct sh_pfc *pfc,
-                                 struct pinmux_cfg_reg *crp,
-                                 unsigned long field)
-{
-       void __iomem *mapped_reg;
-       unsigned long mask, pos;
-
-       sh_pfc_config_reg_helper(pfc, crp, field, &mapped_reg, &mask, &pos);
-
-       pr_debug("read_reg: addr = %lx, field = %ld, "
-                "r_width = %ld, f_width = %ld\n",
-                crp->reg, field, crp->reg_width, crp->field_width);
-
-       return (sh_pfc_read_raw_reg(mapped_reg, crp->reg_width) >> pos) & mask;
-}
-
 static void sh_pfc_write_config_reg(struct sh_pfc *pfc,
-                                   struct pinmux_cfg_reg *crp,
+                                   const struct pinmux_cfg_reg *crp,
                                    unsigned long field, unsigned long value)
 {
        void __iomem *mapped_reg;
@@ -201,9 +173,9 @@ static void sh_pfc_write_config_reg(struct sh_pfc *pfc,
 
        sh_pfc_config_reg_helper(pfc, crp, field, &mapped_reg, &mask, &pos);
 
-       pr_debug("write_reg addr = %lx, value = %ld, field = %ld, "
-                "r_width = %ld, f_width = %ld\n",
-                crp->reg, value, field, crp->reg_width, crp->field_width);
+       dev_dbg(pfc->dev, "write_reg addr = %lx, value = %ld, field = %ld, "
+               "r_width = %ld, f_width = %ld\n",
+               crp->reg, value, field, crp->reg_width, crp->field_width);
 
        mask = ~(mask << pos);
        value = value << pos;
@@ -220,83 +192,11 @@ static void sh_pfc_write_config_reg(struct sh_pfc *pfc,
        sh_pfc_write_raw_reg(mapped_reg, crp->reg_width, data);
 }
 
-static int sh_pfc_setup_data_reg(struct sh_pfc *pfc, unsigned gpio)
-{
-       struct pinmux_gpio *gpiop = &pfc->info->gpios[gpio];
-       struct pinmux_data_reg *data_reg;
-       int k, n;
-
-       if (!sh_pfc_enum_in_range(gpiop->enum_id, &pfc->info->data))
-               return -1;
-
-       k = 0;
-       while (1) {
-               data_reg = pfc->info->data_regs + k;
-
-               if (!data_reg->reg_width)
-                       break;
-
-               data_reg->mapped_reg = sh_pfc_phys_to_virt(pfc, data_reg->reg);
-
-               for (n = 0; n < data_reg->reg_width; n++) {
-                       if (data_reg->enum_ids[n] == gpiop->enum_id) {
-                               gpiop->flags &= ~PINMUX_FLAG_DREG;
-                               gpiop->flags |= (k << PINMUX_FLAG_DREG_SHIFT);
-                               gpiop->flags &= ~PINMUX_FLAG_DBIT;
-                               gpiop->flags |= (n << PINMUX_FLAG_DBIT_SHIFT);
-                               return 0;
-                       }
-               }
-               k++;
-       }
-
-       BUG();
-
-       return -1;
-}
-
-static void sh_pfc_setup_data_regs(struct sh_pfc *pfc)
-{
-       struct pinmux_data_reg *drp;
-       int k;
-
-       for (k = pfc->info->first_gpio; k <= pfc->info->last_gpio; k++)
-               sh_pfc_setup_data_reg(pfc, k);
-
-       k = 0;
-       while (1) {
-               drp = pfc->info->data_regs + k;
-
-               if (!drp->reg_width)
-                       break;
-
-               drp->reg_shadow = sh_pfc_read_raw_reg(drp->mapped_reg,
-                                                     drp->reg_width);
-               k++;
-       }
-}
-
-int sh_pfc_get_data_reg(struct sh_pfc *pfc, unsigned gpio,
-                       struct pinmux_data_reg **drp, int *bitp)
-{
-       struct pinmux_gpio *gpiop = &pfc->info->gpios[gpio];
-       int k, n;
-
-       if (!sh_pfc_enum_in_range(gpiop->enum_id, &pfc->info->data))
-               return -1;
-
-       k = (gpiop->flags & PINMUX_FLAG_DREG) >> PINMUX_FLAG_DREG_SHIFT;
-       n = (gpiop->flags & PINMUX_FLAG_DBIT) >> PINMUX_FLAG_DBIT_SHIFT;
-       *drp = pfc->info->data_regs + k;
-       *bitp = n;
-       return 0;
-}
-
 static int sh_pfc_get_config_reg(struct sh_pfc *pfc, pinmux_enum_t enum_id,
-                                struct pinmux_cfg_reg **crp, int *fieldp,
-                                int *valuep, unsigned long **cntp)
+                                const struct pinmux_cfg_reg **crp, int *fieldp,
+                                int *valuep)
 {
-       struct pinmux_cfg_reg *config_reg;
+       const struct pinmux_cfg_reg *config_reg;
        unsigned long r_width, f_width, curr_width, ncomb;
        int k, m, n, pos, bit_pos;
 
@@ -324,7 +224,6 @@ static int sh_pfc_get_config_reg(struct sh_pfc *pfc, pinmux_enum_t enum_id,
                                        *crp = config_reg;
                                        *fieldp = m;
                                        *valuep = n;
-                                       *cntp = &config_reg->cnt[m];
                                        return 0;
                                }
                        }
@@ -334,50 +233,42 @@ static int sh_pfc_get_config_reg(struct sh_pfc *pfc, pinmux_enum_t enum_id,
                k++;
        }
 
-       return -1;
+       return -EINVAL;
 }
 
-int sh_pfc_gpio_to_enum(struct sh_pfc *pfc, unsigned gpio, int pos,
-                       pinmux_enum_t *enum_idp)
+static int sh_pfc_mark_to_enum(struct sh_pfc *pfc, pinmux_enum_t mark, int pos,
+                             pinmux_enum_t *enum_idp)
 {
-       pinmux_enum_t enum_id = pfc->info->gpios[gpio].enum_id;
-       pinmux_enum_t *data = pfc->info->gpio_data;
+       const pinmux_enum_t *data = pfc->info->gpio_data;
        int k;
 
-       if (!sh_pfc_enum_in_range(enum_id, &pfc->info->data)) {
-               if (!sh_pfc_enum_in_range(enum_id, &pfc->info->mark)) {
-                       pr_err("non data/mark enum_id for gpio %d\n", gpio);
-                       return -1;
-               }
-       }
-
        if (pos) {
                *enum_idp = data[pos + 1];
                return pos + 1;
        }
 
        for (k = 0; k < pfc->info->gpio_data_size; k++) {
-               if (data[k] == enum_id) {
+               if (data[k] == mark) {
                        *enum_idp = data[k + 1];
                        return k + 1;
                }
        }
 
-       pr_err("cannot locate data/mark enum_id for gpio %d\n", gpio);
-       return -1;
+       dev_err(pfc->dev, "cannot locate data/mark enum_id for mark %d\n",
+               mark);
+       return -EINVAL;
 }
 
-int sh_pfc_config_gpio(struct sh_pfc *pfc, unsigned gpio, int pinmux_type,
-                      int cfg_mode)
+int sh_pfc_config_mux(struct sh_pfc *pfc, unsigned mark, int pinmux_type)
 {
-       struct pinmux_cfg_reg *cr = NULL;
+       const struct pinmux_cfg_reg *cr = NULL;
        pinmux_enum_t enum_id;
-       struct pinmux_range *range;
+       const struct pinmux_range *range;
        int in_range, pos, field, value;
-       unsigned long *cntp;
+       int ret;
 
        switch (pinmux_type) {
-
+       case PINMUX_TYPE_GPIO:
        case PINMUX_TYPE_FUNCTION:
                range = NULL;
                break;
@@ -399,33 +290,37 @@ int sh_pfc_config_gpio(struct sh_pfc *pfc, unsigned gpio, int pinmux_type,
                break;
 
        default:
-               goto out_err;
+               return -EINVAL;
        }
 
        pos = 0;
        enum_id = 0;
        field = 0;
        value = 0;
+
+       /* Iterate over all the configuration fields we need to update. */
        while (1) {
-               pos = sh_pfc_gpio_to_enum(pfc, gpio, pos, &enum_id);
-               if (pos <= 0)
-                       goto out_err;
+               pos = sh_pfc_mark_to_enum(pfc, mark, pos, &enum_id);
+               if (pos < 0)
+                       return pos;
 
                if (!enum_id)
                        break;
 
-               /* first check if this is a function enum */
+               /* Check if the configuration field selects a function. If it
+                * doesn't, skip the field if it's not applicable to the
+                * requested pinmux type.
+                */
                in_range = sh_pfc_enum_in_range(enum_id, &pfc->info->function);
                if (!in_range) {
-                       /* not a function enum */
-                       if (range) {
-                               /*
-                                * other range exists, so this pin is
-                                * a regular GPIO pin that now is being
-                                * bound to a specific direction.
-                                *
-                                * for this case we only allow function enums
-                                * and the enums that match the other range.
+                       if (pinmux_type == PINMUX_TYPE_FUNCTION) {
+                               /* Functions are allowed to modify all
+                                * fields.
+                                */
+                               in_range = 1;
+                       } else if (pinmux_type != PINMUX_TYPE_GPIO) {
+                               /* Input/output types can only modify fields
+                                * that correspond to their respective ranges.
                                 */
                                in_range = sh_pfc_enum_in_range(enum_id, range);
 
@@ -436,60 +331,29 @@ int sh_pfc_config_gpio(struct sh_pfc *pfc, unsigned gpio, int pinmux_type,
                                 */
                                if (in_range && enum_id == range->force)
                                        continue;
-                       } else {
-                               /*
-                                * no other range exists, so this pin
-                                * must then be of the function type.
-                                *
-                                * allow function type pins to select
-                                * any combination of function/in/out
-                                * in their MARK lists.
-                                */
-                               in_range = 1;
                        }
+                       /* GPIOs are only allowed to modify function fields. */
                }
 
                if (!in_range)
                        continue;
 
-               if (sh_pfc_get_config_reg(pfc, enum_id, &cr,
-                                         &field, &value, &cntp) != 0)
-                       goto out_err;
-
-               switch (cfg_mode) {
-               case GPIO_CFG_DRYRUN:
-                       if (!*cntp ||
-                           (sh_pfc_read_config_reg(pfc, cr, field) != value))
-                               continue;
-                       break;
-
-               case GPIO_CFG_REQ:
-                       sh_pfc_write_config_reg(pfc, cr, field, value);
-                       *cntp = *cntp + 1;
-                       break;
+               ret = sh_pfc_get_config_reg(pfc, enum_id, &cr, &field, &value);
+               if (ret < 0)
+                       return ret;
 
-               case GPIO_CFG_FREE:
-                       *cntp = *cntp - 1;
-                       break;
-               }
+               sh_pfc_write_config_reg(pfc, cr, field, value);
        }
 
        return 0;
- out_err:
-       return -1;
 }
 
 static int sh_pfc_probe(struct platform_device *pdev)
 {
-       struct sh_pfc_soc_info *info;
+       const struct sh_pfc_soc_info *info;
        struct sh_pfc *pfc;
        int ret;
 
-       /*
-        * Ensure that the type encoding fits
-        */
-       BUILD_BUG_ON(PINMUX_FLAG_TYPE > ((1 << PINMUX_FLAG_DBIT_SHIFT) - 1));
-
        info = pdev->id_entry->driver_data
              ? (void *)pdev->id_entry->driver_data : pdev->dev.platform_data;
        if (info == NULL)
@@ -509,7 +373,6 @@ static int sh_pfc_probe(struct platform_device *pdev)
        spin_lock_init(&pfc->lock);
 
        pinctrl_provide_dummies();
-       sh_pfc_setup_data_regs(pfc);
 
        /*
         * Initialize pinctrl bindings first
@@ -529,13 +392,13 @@ static int sh_pfc_probe(struct platform_device *pdev)
                 * PFC state as it is, given that there are already
                 * extant users of it that have succeeded by this point.
                 */
-               pr_notice("failed to init GPIO chip, ignoring...\n");
+               dev_notice(pfc->dev, "failed to init GPIO chip, ignoring...\n");
        }
 #endif
 
        platform_set_drvdata(pdev, pfc);
 
-       pr_info("%s support registered\n", info->name);
+       dev_info(pfc->dev, "%s support registered\n", info->name);
 
        return 0;
 }
@@ -555,6 +418,9 @@ static int sh_pfc_remove(struct platform_device *pdev)
 }
 
 static const struct platform_device_id sh_pfc_id_table[] = {
+#ifdef CONFIG_PINCTRL_PFC_R8A73A4
+       { "pfc-r8a73a4", (kernel_ulong_t)&r8a73a4_pinmux_info },
+#endif
 #ifdef CONFIG_PINCTRL_PFC_R8A7740
        { "pfc-r8a7740", (kernel_ulong_t)&r8a7740_pinmux_info },
 #endif
index ba7c33c33599920d404801ad86e01989a042e24a..89cb4289d76125abe17ad3ee7b710369af233cdb 100644 (file)
@@ -26,13 +26,17 @@ struct sh_pfc_pinctrl;
 
 struct sh_pfc {
        struct device *dev;
-       struct sh_pfc_soc_info *info;
+       const struct sh_pfc_soc_info *info;
        spinlock_t lock;
 
        unsigned int num_windows;
        struct sh_pfc_window *window;
 
+       unsigned int nr_pins;
+
        struct sh_pfc_chip *gpio;
+       struct sh_pfc_chip *func;
+
        struct sh_pfc_pinctrl *pinctrl;
 };
 
@@ -42,31 +46,30 @@ int sh_pfc_unregister_gpiochip(struct sh_pfc *pfc);
 int sh_pfc_register_pinctrl(struct sh_pfc *pfc);
 int sh_pfc_unregister_pinctrl(struct sh_pfc *pfc);
 
-int sh_pfc_read_bit(struct pinmux_data_reg *dr, unsigned long in_pos);
-void sh_pfc_write_bit(struct pinmux_data_reg *dr, unsigned long in_pos,
-                     unsigned long value);
-int sh_pfc_get_data_reg(struct sh_pfc *pfc, unsigned gpio,
-                       struct pinmux_data_reg **drp, int *bitp);
-int sh_pfc_gpio_to_enum(struct sh_pfc *pfc, unsigned gpio, int pos,
-                       pinmux_enum_t *enum_idp);
-int sh_pfc_config_gpio(struct sh_pfc *pfc, unsigned gpio, int pinmux_type,
-                      int cfg_mode);
+unsigned long sh_pfc_read_raw_reg(void __iomem *mapped_reg,
+                                 unsigned long reg_width);
+void sh_pfc_write_raw_reg(void __iomem *mapped_reg, unsigned long reg_width,
+                         unsigned long data);
+
+int sh_pfc_get_pin_index(struct sh_pfc *pfc, unsigned int pin);
+int sh_pfc_config_mux(struct sh_pfc *pfc, unsigned mark, int pinmux_type);
 
-extern struct sh_pfc_soc_info r8a7740_pinmux_info;
-extern struct sh_pfc_soc_info r8a7779_pinmux_info;
-extern struct sh_pfc_soc_info sh7203_pinmux_info;
-extern struct sh_pfc_soc_info sh7264_pinmux_info;
-extern struct sh_pfc_soc_info sh7269_pinmux_info;
-extern struct sh_pfc_soc_info sh7372_pinmux_info;
-extern struct sh_pfc_soc_info sh73a0_pinmux_info;
-extern struct sh_pfc_soc_info sh7720_pinmux_info;
-extern struct sh_pfc_soc_info sh7722_pinmux_info;
-extern struct sh_pfc_soc_info sh7723_pinmux_info;
-extern struct sh_pfc_soc_info sh7724_pinmux_info;
-extern struct sh_pfc_soc_info sh7734_pinmux_info;
-extern struct sh_pfc_soc_info sh7757_pinmux_info;
-extern struct sh_pfc_soc_info sh7785_pinmux_info;
-extern struct sh_pfc_soc_info sh7786_pinmux_info;
-extern struct sh_pfc_soc_info shx3_pinmux_info;
+extern const struct sh_pfc_soc_info r8a73a4_pinmux_info;
+extern const struct sh_pfc_soc_info r8a7740_pinmux_info;
+extern const struct sh_pfc_soc_info r8a7779_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;
+extern const struct sh_pfc_soc_info sh7372_pinmux_info;
+extern const struct sh_pfc_soc_info sh73a0_pinmux_info;
+extern const struct sh_pfc_soc_info sh7720_pinmux_info;
+extern const struct sh_pfc_soc_info sh7722_pinmux_info;
+extern const struct sh_pfc_soc_info sh7723_pinmux_info;
+extern const struct sh_pfc_soc_info sh7724_pinmux_info;
+extern const struct sh_pfc_soc_info sh7734_pinmux_info;
+extern const struct sh_pfc_soc_info sh7757_pinmux_info;
+extern const struct sh_pfc_soc_info sh7785_pinmux_info;
+extern const struct sh_pfc_soc_info sh7786_pinmux_info;
+extern const struct sh_pfc_soc_info shx3_pinmux_info;
 
 #endif /* __SH_PFC_CORE_H__ */
index a535075c8b69f0aee1380ebc4fca94810dae5a69..d37efa7dcf90c78282a12503ad4a3d1cfb991e32 100644 (file)
@@ -9,8 +9,6 @@
  * for more details.
  */
 
-#define pr_fmt(fmt) KBUILD_MODNAME " gpio: " fmt
-
 #include <linux/device.h>
 #include <linux/gpio.h>
 #include <linux/init.h>
 
 #include "core.h"
 
+struct sh_pfc_gpio_data_reg {
+       const struct pinmux_data_reg *info;
+       unsigned long shadow;
+};
+
+struct sh_pfc_gpio_pin {
+       u8 dbit;
+       u8 dreg;
+};
+
 struct sh_pfc_chip {
-       struct sh_pfc           *pfc;
-       struct gpio_chip        gpio_chip;
+       struct sh_pfc                   *pfc;
+       struct gpio_chip                gpio_chip;
+
+       struct sh_pfc_window            *mem;
+       struct sh_pfc_gpio_data_reg     *regs;
+       struct sh_pfc_gpio_pin          *pins;
 };
 
 static struct sh_pfc_chip *gpio_to_pfc_chip(struct gpio_chip *gc)
@@ -36,143 +48,367 @@ static struct sh_pfc *gpio_to_pfc(struct gpio_chip *gc)
        return gpio_to_pfc_chip(gc)->pfc;
 }
 
-static int sh_gpio_request(struct gpio_chip *gc, unsigned offset)
+static void gpio_get_data_reg(struct sh_pfc_chip *chip, unsigned int gpio,
+                             struct sh_pfc_gpio_data_reg **reg,
+                             unsigned int *bit)
 {
-       return pinctrl_request_gpio(offset);
+       int idx = sh_pfc_get_pin_index(chip->pfc, gpio);
+       struct sh_pfc_gpio_pin *gpio_pin = &chip->pins[idx];
+
+       *reg = &chip->regs[gpio_pin->dreg];
+       *bit = gpio_pin->dbit;
 }
 
-static void sh_gpio_free(struct gpio_chip *gc, unsigned offset)
+static unsigned long gpio_read_data_reg(struct sh_pfc_chip *chip,
+                                       const struct pinmux_data_reg *dreg)
 {
-       pinctrl_free_gpio(offset);
+       void __iomem *mem = dreg->reg - chip->mem->phys + chip->mem->virt;
+
+       return sh_pfc_read_raw_reg(mem, dreg->reg_width);
 }
 
-static void sh_gpio_set_value(struct sh_pfc *pfc, unsigned gpio, int value)
+static void gpio_write_data_reg(struct sh_pfc_chip *chip,
+                               const struct pinmux_data_reg *dreg,
+                               unsigned long value)
 {
-       struct pinmux_data_reg *dr = NULL;
-       int bit = 0;
+       void __iomem *mem = dreg->reg - chip->mem->phys + chip->mem->virt;
 
-       if (sh_pfc_get_data_reg(pfc, gpio, &dr, &bit) != 0)
-               BUG();
-       else
-               sh_pfc_write_bit(dr, bit, value);
+       sh_pfc_write_raw_reg(mem, dreg->reg_width, value);
 }
 
-static int sh_gpio_get_value(struct sh_pfc *pfc, unsigned gpio)
+static void gpio_setup_data_reg(struct sh_pfc_chip *chip, unsigned gpio)
 {
-       struct pinmux_data_reg *dr = NULL;
-       int bit = 0;
+       struct sh_pfc *pfc = chip->pfc;
+       struct sh_pfc_gpio_pin *gpio_pin = &chip->pins[gpio];
+       const struct sh_pfc_pin *pin = &pfc->info->pins[gpio];
+       const struct pinmux_data_reg *dreg;
+       unsigned int bit;
+       unsigned int i;
+
+       for (i = 0, dreg = pfc->info->data_regs; dreg->reg; ++i, ++dreg) {
+               for (bit = 0; bit < dreg->reg_width; bit++) {
+                       if (dreg->enum_ids[bit] == pin->enum_id) {
+                               gpio_pin->dreg = i;
+                               gpio_pin->dbit = bit;
+                               return;
+                       }
+               }
+       }
 
-       if (sh_pfc_get_data_reg(pfc, gpio, &dr, &bit) != 0)
+       BUG();
+}
+
+static int gpio_setup_data_regs(struct sh_pfc_chip *chip)
+{
+       struct sh_pfc *pfc = chip->pfc;
+       const struct pinmux_data_reg *dreg;
+       unsigned int i;
+
+       /* Count the number of data registers, allocate memory and initialize
+        * them.
+        */
+       for (i = 0; pfc->info->data_regs[i].reg_width; ++i)
+               ;
+
+       chip->regs = devm_kzalloc(pfc->dev, i * sizeof(*chip->regs),
+                                 GFP_KERNEL);
+       if (chip->regs == NULL)
+               return -ENOMEM;
+
+       for (i = 0, dreg = pfc->info->data_regs; dreg->reg_width; ++i, ++dreg) {
+               chip->regs[i].info = dreg;
+               chip->regs[i].shadow = gpio_read_data_reg(chip, dreg);
+       }
+
+       for (i = 0; i < pfc->info->nr_pins; i++) {
+               if (pfc->info->pins[i].enum_id == 0)
+                       continue;
+
+               gpio_setup_data_reg(chip, i);
+       }
+
+       return 0;
+}
+
+/* -----------------------------------------------------------------------------
+ * Pin GPIOs
+ */
+
+static int gpio_pin_request(struct gpio_chip *gc, unsigned offset)
+{
+       struct sh_pfc *pfc = gpio_to_pfc(gc);
+       int idx = sh_pfc_get_pin_index(pfc, offset);
+
+       if (idx < 0 || pfc->info->pins[idx].enum_id == 0)
                return -EINVAL;
 
-       return sh_pfc_read_bit(dr, bit);
+       return pinctrl_request_gpio(offset);
+}
+
+static void gpio_pin_free(struct gpio_chip *gc, unsigned offset)
+{
+       return pinctrl_free_gpio(offset);
+}
+
+static void gpio_pin_set_value(struct sh_pfc_chip *chip, unsigned offset,
+                              int value)
+{
+       struct sh_pfc_gpio_data_reg *reg;
+       unsigned long pos;
+       unsigned int bit;
+
+       gpio_get_data_reg(chip, offset, &reg, &bit);
+
+       pos = reg->info->reg_width - (bit + 1);
+
+       if (value)
+               set_bit(pos, &reg->shadow);
+       else
+               clear_bit(pos, &reg->shadow);
+
+       gpio_write_data_reg(chip, reg->info, reg->shadow);
 }
 
-static int sh_gpio_direction_input(struct gpio_chip *gc, unsigned offset)
+static int gpio_pin_direction_input(struct gpio_chip *gc, unsigned offset)
 {
        return pinctrl_gpio_direction_input(offset);
 }
 
-static int sh_gpio_direction_output(struct gpio_chip *gc, unsigned offset,
+static int gpio_pin_direction_output(struct gpio_chip *gc, unsigned offset,
                                    int value)
 {
-       sh_gpio_set_value(gpio_to_pfc(gc), offset, value);
+       gpio_pin_set_value(gpio_to_pfc_chip(gc), offset, value);
 
        return pinctrl_gpio_direction_output(offset);
 }
 
-static int sh_gpio_get(struct gpio_chip *gc, unsigned offset)
+static int gpio_pin_get(struct gpio_chip *gc, unsigned offset)
 {
-       return sh_gpio_get_value(gpio_to_pfc(gc), offset);
+       struct sh_pfc_chip *chip = gpio_to_pfc_chip(gc);
+       struct sh_pfc_gpio_data_reg *reg;
+       unsigned long pos;
+       unsigned int bit;
+
+       gpio_get_data_reg(chip, offset, &reg, &bit);
+
+       pos = reg->info->reg_width - (bit + 1);
+
+       return (gpio_read_data_reg(chip, reg->info) >> pos) & 1;
 }
 
-static void sh_gpio_set(struct gpio_chip *gc, unsigned offset, int value)
+static void gpio_pin_set(struct gpio_chip *gc, unsigned offset, int value)
 {
-       sh_gpio_set_value(gpio_to_pfc(gc), offset, value);
+       gpio_pin_set_value(gpio_to_pfc_chip(gc), offset, value);
 }
 
-static int sh_gpio_to_irq(struct gpio_chip *gc, unsigned offset)
+static int gpio_pin_to_irq(struct gpio_chip *gc, unsigned offset)
 {
        struct sh_pfc *pfc = gpio_to_pfc(gc);
-       pinmux_enum_t enum_id;
-       pinmux_enum_t *enum_ids;
-       int i, k, pos;
-
-       pos = 0;
-       enum_id = 0;
-       while (1) {
-               pos = sh_pfc_gpio_to_enum(pfc, offset, pos, &enum_id);
-               if (pos <= 0 || !enum_id)
-                       break;
+       int i, k;
 
-               for (i = 0; i < pfc->info->gpio_irq_size; i++) {
-                       enum_ids = pfc->info->gpio_irq[i].enum_ids;
-                       for (k = 0; enum_ids[k]; k++) {
-                               if (enum_ids[k] == enum_id)
-                                       return pfc->info->gpio_irq[i].irq;
-                       }
+       for (i = 0; i < pfc->info->gpio_irq_size; i++) {
+               unsigned short *gpios = pfc->info->gpio_irq[i].gpios;
+
+               for (k = 0; gpios[k]; k++) {
+                       if (gpios[k] == offset)
+                               return pfc->info->gpio_irq[i].irq;
                }
        }
 
        return -ENOSYS;
 }
 
-static void sh_pfc_gpio_setup(struct sh_pfc_chip *chip)
+static int gpio_pin_setup(struct sh_pfc_chip *chip)
 {
        struct sh_pfc *pfc = chip->pfc;
        struct gpio_chip *gc = &chip->gpio_chip;
+       int ret;
+
+       chip->pins = devm_kzalloc(pfc->dev, pfc->nr_pins * sizeof(*chip->pins),
+                                 GFP_KERNEL);
+       if (chip->pins == NULL)
+               return -ENOMEM;
+
+       ret = gpio_setup_data_regs(chip);
+       if (ret < 0)
+               return ret;
+
+       gc->request = gpio_pin_request;
+       gc->free = gpio_pin_free;
+       gc->direction_input = gpio_pin_direction_input;
+       gc->get = gpio_pin_get;
+       gc->direction_output = gpio_pin_direction_output;
+       gc->set = gpio_pin_set;
+       gc->to_irq = gpio_pin_to_irq;
 
-       gc->request = sh_gpio_request;
-       gc->free = sh_gpio_free;
-       gc->direction_input = sh_gpio_direction_input;
-       gc->get = sh_gpio_get;
-       gc->direction_output = sh_gpio_direction_output;
-       gc->set = sh_gpio_set;
-       gc->to_irq = sh_gpio_to_irq;
+       gc->label = pfc->info->name;
+       gc->dev = pfc->dev;
+       gc->owner = THIS_MODULE;
+       gc->base = 0;
+       gc->ngpio = pfc->nr_pins;
+
+       return 0;
+}
+
+/* -----------------------------------------------------------------------------
+ * Function GPIOs
+ */
+
+static int gpio_function_request(struct gpio_chip *gc, unsigned offset)
+{
+       static bool __print_once;
+       struct sh_pfc *pfc = gpio_to_pfc(gc);
+       unsigned int mark = pfc->info->func_gpios[offset].enum_id;
+       unsigned long flags;
+       int ret;
+
+       if (!__print_once) {
+               dev_notice(pfc->dev,
+                          "Use of GPIO API for function requests is deprecated."
+                          " Convert to pinctrl\n");
+               __print_once = true;
+       }
+
+       if (mark == 0)
+               return -EINVAL;
 
-       WARN_ON(pfc->info->first_gpio != 0); /* needs testing */
+       spin_lock_irqsave(&pfc->lock, flags);
+       ret = sh_pfc_config_mux(pfc, mark, PINMUX_TYPE_FUNCTION);
+       spin_unlock_irqrestore(&pfc->lock, flags);
+
+       return ret;
+}
+
+static void gpio_function_free(struct gpio_chip *gc, unsigned offset)
+{
+}
+
+static int gpio_function_setup(struct sh_pfc_chip *chip)
+{
+       struct sh_pfc *pfc = chip->pfc;
+       struct gpio_chip *gc = &chip->gpio_chip;
+
+       gc->request = gpio_function_request;
+       gc->free = gpio_function_free;
 
        gc->label = pfc->info->name;
        gc->owner = THIS_MODULE;
-       gc->base = pfc->info->first_gpio;
-       gc->ngpio = (pfc->info->last_gpio - pfc->info->first_gpio) + 1;
+       gc->base = pfc->nr_pins;
+       gc->ngpio = pfc->info->nr_func_gpios;
+
+       return 0;
 }
 
-int sh_pfc_register_gpiochip(struct sh_pfc *pfc)
+/* -----------------------------------------------------------------------------
+ * Register/unregister
+ */
+
+static struct sh_pfc_chip *
+sh_pfc_add_gpiochip(struct sh_pfc *pfc, int(*setup)(struct sh_pfc_chip *),
+                   struct sh_pfc_window *mem)
 {
        struct sh_pfc_chip *chip;
        int ret;
 
        chip = devm_kzalloc(pfc->dev, sizeof(*chip), GFP_KERNEL);
        if (unlikely(!chip))
-               return -ENOMEM;
+               return ERR_PTR(-ENOMEM);
 
+       chip->mem = mem;
        chip->pfc = pfc;
 
-       sh_pfc_gpio_setup(chip);
+       ret = setup(chip);
+       if (ret < 0)
+               return ERR_PTR(ret);
 
        ret = gpiochip_add(&chip->gpio_chip);
        if (unlikely(ret < 0))
-               return ret;
+               return ERR_PTR(ret);
+
+       dev_info(pfc->dev, "%s handling gpio %u -> %u\n",
+                chip->gpio_chip.label, chip->gpio_chip.base,
+                chip->gpio_chip.base + chip->gpio_chip.ngpio - 1);
+
+       return chip;
+}
+
+int sh_pfc_register_gpiochip(struct sh_pfc *pfc)
+{
+       const struct pinmux_range *ranges;
+       struct pinmux_range def_range;
+       struct sh_pfc_chip *chip;
+       unsigned int nr_ranges;
+       unsigned int i;
+       int ret;
+
+       if (pfc->info->data_regs == NULL)
+               return 0;
+
+       /* Find the memory window that contain the GPIO registers. Boards that
+        * register a separate GPIO device will not supply a memory resource
+        * that covers the data registers. In that case don't try to handle
+        * GPIOs.
+        */
+       for (i = 0; i < pfc->num_windows; ++i) {
+               struct sh_pfc_window *window = &pfc->window[i];
+
+               if (pfc->info->data_regs[0].reg >= window->phys &&
+                   pfc->info->data_regs[0].reg < window->phys + window->size)
+                       break;
+       }
+
+       if (i == pfc->num_windows)
+               return 0;
+
+       /* Register the real GPIOs chip. */
+       chip = sh_pfc_add_gpiochip(pfc, gpio_pin_setup, &pfc->window[i]);
+       if (IS_ERR(chip))
+               return PTR_ERR(chip);
 
        pfc->gpio = chip;
 
-       pr_info("%s handling gpio %d -> %d\n",
-               pfc->info->name, pfc->info->first_gpio,
-               pfc->info->last_gpio);
+       /* Register the GPIO to pin mappings. */
+       if (pfc->info->ranges == NULL) {
+               def_range.begin = 0;
+               def_range.end = pfc->info->nr_pins - 1;
+               ranges = &def_range;
+               nr_ranges = 1;
+       } else {
+               ranges = pfc->info->ranges;
+               nr_ranges = pfc->info->nr_ranges;
+       }
+
+       for (i = 0; i < nr_ranges; ++i) {
+               const struct pinmux_range *range = &ranges[i];
+
+               ret = gpiochip_add_pin_range(&chip->gpio_chip,
+                                            dev_name(pfc->dev),
+                                            range->begin, range->begin,
+                                            range->end - range->begin + 1);
+               if (ret < 0)
+                       return ret;
+       }
+
+       /* Register the function GPIOs chip. */
+       if (pfc->info->nr_func_gpios == 0)
+               return 0;
+
+       chip = sh_pfc_add_gpiochip(pfc, gpio_function_setup, NULL);
+       if (IS_ERR(chip))
+               return PTR_ERR(chip);
+
+       pfc->func = chip;
 
        return 0;
 }
 
 int sh_pfc_unregister_gpiochip(struct sh_pfc *pfc)
 {
-       struct sh_pfc_chip *chip = pfc->gpio;
+       int err;
        int ret;
 
-       ret = gpiochip_remove(&chip->gpio_chip);
-       if (unlikely(ret < 0))
-               return ret;
+       ret = gpiochip_remove(&pfc->gpio->gpio_chip);
+       err = gpiochip_remove(&pfc->func->gpio_chip);
 
-       pfc->gpio = NULL;
-       return 0;
+       return ret < 0 ? ret : err;
 }
diff --git a/drivers/pinctrl/sh-pfc/pfc-r8a73a4.c b/drivers/pinctrl/sh-pfc/pfc-r8a73a4.c
new file mode 100644 (file)
index 0000000..bbff559
--- /dev/null
@@ -0,0 +1,2587 @@
+/*
+ * Copyright (C) 2012-2013  Renesas Solutions Corp.
+ * Copyright (C) 2013  Magnus Damm
+ * Copyright (C) 2012  Kuninori Morimoto <kuninori.morimoto.gx@renesas.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 of the
+ * License.
+ *
+ * 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., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ */
+#include <linux/io.h>
+#include <linux/kernel.h>
+#include <linux/pinctrl/pinconf-generic.h>
+#include <mach/irqs.h>
+#include <mach/r8a73a4.h>
+
+#include "core.h"
+#include "sh_pfc.h"
+
+#define CPU_ALL_PORT(fn, pfx, sfx)                                     \
+       /*  Port0 - Port30 */                                           \
+       PORT_10(fn, pfx, sfx),                                          \
+       PORT_10(fn, pfx##1, sfx),                                       \
+       PORT_10(fn, pfx##2, sfx),                                       \
+       PORT_1(fn,  pfx##30, sfx),                                      \
+       /* Port32 - Port40 */                                           \
+       PORT_1(fn,  pfx##32, sfx),      PORT_1(fn,  pfx##33, sfx),      \
+       PORT_1(fn,  pfx##34, sfx),      PORT_1(fn,  pfx##35, sfx),      \
+       PORT_1(fn,  pfx##36, sfx),      PORT_1(fn,  pfx##37, sfx),      \
+       PORT_1(fn,  pfx##38, sfx),      PORT_1(fn,  pfx##39, sfx),      \
+       PORT_1(fn,  pfx##40, sfx),                                      \
+       /* Port64  - Port85 */                                          \
+       PORT_1(fn, pfx##64, sfx),       PORT_1(fn, pfx##65, sfx),       \
+       PORT_1(fn, pfx##66, sfx),       PORT_1(fn, pfx##67, sfx),       \
+       PORT_1(fn, pfx##68, sfx),       PORT_1(fn, pfx##69, sfx),       \
+       PORT_10(fn, pfx##7, sfx),                                       \
+       PORT_1(fn, pfx##80, sfx),       PORT_1(fn, pfx##81, sfx),       \
+       PORT_1(fn, pfx##82, sfx),       PORT_1(fn, pfx##83, sfx),       \
+       PORT_1(fn, pfx##84, sfx),       PORT_1(fn, pfx##85, sfx),       \
+       /* Port96  - Port126 */                                         \
+       PORT_1(fn, pfx##96, sfx),       PORT_1(fn, pfx##97, sfx),       \
+       PORT_1(fn, pfx##98, sfx),       PORT_1(fn, pfx##99, sfx),       \
+       PORT_10(fn, pfx##10, sfx),                                      \
+       PORT_10(fn, pfx##11, sfx),                                      \
+       PORT_1(fn, pfx##120, sfx),      PORT_1(fn, pfx##121, sfx),      \
+       PORT_1(fn, pfx##122, sfx),      PORT_1(fn, pfx##123, sfx),      \
+       PORT_1(fn, pfx##124, sfx),      PORT_1(fn, pfx##125, sfx),      \
+       PORT_1(fn, pfx##126, sfx),                                      \
+       /* Port128 - Port134 */                                         \
+       PORT_1(fn, pfx##128, sfx),      PORT_1(fn, pfx##129, sfx),      \
+       PORT_1(fn, pfx##130, sfx),      PORT_1(fn, pfx##131, sfx),      \
+       PORT_1(fn, pfx##132, sfx),      PORT_1(fn, pfx##133, sfx),      \
+       PORT_1(fn, pfx##134, sfx),                                      \
+       /* Port160 - Port178 */                                         \
+       PORT_10(fn, pfx##16, sfx),                                      \
+       PORT_1(fn, pfx##170, sfx),      PORT_1(fn, pfx##171, sfx),      \
+       PORT_1(fn, pfx##172, sfx),      PORT_1(fn, pfx##173, sfx),      \
+       PORT_1(fn, pfx##174, sfx),      PORT_1(fn, pfx##175, sfx),      \
+       PORT_1(fn, pfx##176, sfx),      PORT_1(fn, pfx##177, sfx),      \
+       PORT_1(fn, pfx##178, sfx),                                      \
+       /* Port192 - Port222 */                                         \
+       PORT_1(fn, pfx##192, sfx),      PORT_1(fn, pfx##193, sfx),      \
+       PORT_1(fn, pfx##194, sfx),      PORT_1(fn, pfx##195, sfx),      \
+       PORT_1(fn, pfx##196, sfx),      PORT_1(fn, pfx##197, sfx),      \
+       PORT_1(fn, pfx##198, sfx),      PORT_1(fn, pfx##199, sfx),      \
+       PORT_10(fn, pfx##20, sfx),                                      \
+       PORT_10(fn, pfx##21, sfx),                                      \
+       PORT_1(fn, pfx##220, sfx),      PORT_1(fn, pfx##221, sfx),      \
+       PORT_1(fn, pfx##222, sfx),                                      \
+       /* Port224 - Port250 */                                         \
+       PORT_1(fn, pfx##224, sfx),      PORT_1(fn, pfx##225, sfx),      \
+       PORT_1(fn, pfx##226, sfx),      PORT_1(fn, pfx##227, sfx),      \
+       PORT_1(fn, pfx##228, sfx),      PORT_1(fn, pfx##229, sfx),      \
+       PORT_10(fn, pfx##23, sfx),                                      \
+       PORT_10(fn, pfx##24, sfx),                                      \
+       PORT_1(fn, pfx##250, sfx),                                      \
+       /* Port256 - Port283 */                                         \
+       PORT_1(fn, pfx##256, sfx),      PORT_1(fn, pfx##257, sfx),      \
+       PORT_1(fn, pfx##258, sfx),      PORT_1(fn, pfx##259, sfx),      \
+       PORT_10(fn, pfx##26, sfx),                                      \
+       PORT_10(fn, pfx##27, sfx),                                      \
+       PORT_1(fn, pfx##280, sfx),      PORT_1(fn, pfx##281, sfx),      \
+       PORT_1(fn, pfx##282, sfx),      PORT_1(fn, pfx##283, sfx),      \
+       /* Port288 - Port308 */                                         \
+       PORT_1(fn, pfx##288, sfx),      PORT_1(fn, pfx##289, sfx),      \
+       PORT_10(fn, pfx##29, sfx),                                      \
+       PORT_1(fn, pfx##300, sfx),      PORT_1(fn, pfx##301, sfx),      \
+       PORT_1(fn, pfx##302, sfx),      PORT_1(fn, pfx##303, sfx),      \
+       PORT_1(fn, pfx##304, sfx),      PORT_1(fn, pfx##305, sfx),      \
+       PORT_1(fn, pfx##306, sfx),      PORT_1(fn, pfx##307, sfx),      \
+       PORT_1(fn, pfx##308, sfx),                                      \
+       /* Port320 - Port329 */                                         \
+       PORT_10(fn, pfx##32, sfx)
+
+
+enum {
+       PINMUX_RESERVED = 0,
+
+       /* PORT0_DATA -> PORT329_DATA */
+       PINMUX_DATA_BEGIN,
+       PORT_ALL(DATA),
+       PINMUX_DATA_END,
+
+       /* PORT0_IN -> PORT329_IN */
+       PINMUX_INPUT_BEGIN,
+       PORT_ALL(IN),
+       PINMUX_INPUT_END,
+
+       /* PORT0_OUT -> PORT329_OUT */
+       PINMUX_OUTPUT_BEGIN,
+       PORT_ALL(OUT),
+       PINMUX_OUTPUT_END,
+
+       PINMUX_FUNCTION_BEGIN,
+       PORT_ALL(FN_IN), /* PORT0_FN_IN -> PORT329_FN_IN */
+       PORT_ALL(FN_OUT), /* PORT0_FN_OUT -> PORT329_FN_OUT */
+       PORT_ALL(FN0), /* PORT0_FN0 -> PORT329_FN0 */
+       PORT_ALL(FN1), /* PORT0_FN1 -> PORT329_FN1 */
+       PORT_ALL(FN2), /* PORT0_FN2 -> PORT329_FN2 */
+       PORT_ALL(FN3), /* PORT0_FN3 -> PORT329_FN3 */
+       PORT_ALL(FN4), /* PORT0_FN4 -> PORT329_FN4 */
+       PORT_ALL(FN5), /* PORT0_FN5 -> PORT329_FN5 */
+       PORT_ALL(FN6), /* PORT0_FN6 -> PORT329_FN6 */
+       PORT_ALL(FN7), /* PORT0_FN7 -> PORT329_FN7 */
+
+       MSEL1CR_31_0, MSEL1CR_31_1,
+       MSEL1CR_27_0, MSEL1CR_27_1,
+       MSEL1CR_25_0, MSEL1CR_25_1,
+       MSEL1CR_24_0, MSEL1CR_24_1,
+       MSEL1CR_22_0, MSEL1CR_22_1,
+       MSEL1CR_21_0, MSEL1CR_21_1,
+       MSEL1CR_20_0, MSEL1CR_20_1,
+       MSEL1CR_19_0, MSEL1CR_19_1,
+       MSEL1CR_18_0, MSEL1CR_18_1,
+       MSEL1CR_17_0, MSEL1CR_17_1,
+       MSEL1CR_16_0, MSEL1CR_16_1,
+       MSEL1CR_15_0, MSEL1CR_15_1,
+       MSEL1CR_14_0, MSEL1CR_14_1,
+       MSEL1CR_13_0, MSEL1CR_13_1,
+       MSEL1CR_12_0, MSEL1CR_12_1,
+       MSEL1CR_11_0, MSEL1CR_11_1,
+       MSEL1CR_10_0, MSEL1CR_10_1,
+       MSEL1CR_09_0, MSEL1CR_09_1,
+       MSEL1CR_08_0, MSEL1CR_08_1,
+       MSEL1CR_07_0, MSEL1CR_07_1,
+       MSEL1CR_06_0, MSEL1CR_06_1,
+       MSEL1CR_05_0, MSEL1CR_05_1,
+       MSEL1CR_04_0, MSEL1CR_04_1,
+       MSEL1CR_03_0, MSEL1CR_03_1,
+       MSEL1CR_02_0, MSEL1CR_02_1,
+       MSEL1CR_01_0, MSEL1CR_01_1,
+       MSEL1CR_00_0, MSEL1CR_00_1,
+
+       MSEL3CR_31_0, MSEL3CR_31_1,
+       MSEL3CR_28_0, MSEL3CR_28_1,
+       MSEL3CR_27_0, MSEL3CR_27_1,
+       MSEL3CR_26_0, MSEL3CR_26_1,
+       MSEL3CR_23_0, MSEL3CR_23_1,
+       MSEL3CR_22_0, MSEL3CR_22_1,
+       MSEL3CR_21_0, MSEL3CR_21_1,
+       MSEL3CR_20_0, MSEL3CR_20_1,
+       MSEL3CR_19_0, MSEL3CR_19_1,
+       MSEL3CR_18_0, MSEL3CR_18_1,
+       MSEL3CR_17_0, MSEL3CR_17_1,
+       MSEL3CR_16_0, MSEL3CR_16_1,
+       MSEL3CR_15_0, MSEL3CR_15_1,
+       MSEL3CR_12_0, MSEL3CR_12_1,
+       MSEL3CR_11_0, MSEL3CR_11_1,
+       MSEL3CR_10_0, MSEL3CR_10_1,
+       MSEL3CR_09_0, MSEL3CR_09_1,
+       MSEL3CR_06_0, MSEL3CR_06_1,
+       MSEL3CR_03_0, MSEL3CR_03_1,
+       MSEL3CR_01_0, MSEL3CR_01_1,
+       MSEL3CR_00_0, MSEL3CR_00_1,
+
+       MSEL4CR_30_0, MSEL4CR_30_1,
+       MSEL4CR_29_0, MSEL4CR_29_1,
+       MSEL4CR_28_0, MSEL4CR_28_1,
+       MSEL4CR_27_0, MSEL4CR_27_1,
+       MSEL4CR_26_0, MSEL4CR_26_1,
+       MSEL4CR_25_0, MSEL4CR_25_1,
+       MSEL4CR_24_0, MSEL4CR_24_1,
+       MSEL4CR_23_0, MSEL4CR_23_1,
+       MSEL4CR_22_0, MSEL4CR_22_1,
+       MSEL4CR_21_0, MSEL4CR_21_1,
+       MSEL4CR_20_0, MSEL4CR_20_1,
+       MSEL4CR_19_0, MSEL4CR_19_1,
+       MSEL4CR_18_0, MSEL4CR_18_1,
+       MSEL4CR_17_0, MSEL4CR_17_1,
+       MSEL4CR_16_0, MSEL4CR_16_1,
+       MSEL4CR_15_0, MSEL4CR_15_1,
+       MSEL4CR_14_0, MSEL4CR_14_1,
+       MSEL4CR_13_0, MSEL4CR_13_1,
+       MSEL4CR_12_0, MSEL4CR_12_1,
+       MSEL4CR_11_0, MSEL4CR_11_1,
+       MSEL4CR_10_0, MSEL4CR_10_1,
+       MSEL4CR_09_0, MSEL4CR_09_1,
+       MSEL4CR_07_0, MSEL4CR_07_1,
+       MSEL4CR_04_0, MSEL4CR_04_1,
+       MSEL4CR_01_0, MSEL4CR_01_1,
+
+       MSEL5CR_31_0, MSEL5CR_31_1,
+       MSEL5CR_30_0, MSEL5CR_30_1,
+       MSEL5CR_29_0, MSEL5CR_29_1,
+       MSEL5CR_28_0, MSEL5CR_28_1,
+       MSEL5CR_27_0, MSEL5CR_27_1,
+       MSEL5CR_26_0, MSEL5CR_26_1,
+       MSEL5CR_25_0, MSEL5CR_25_1,
+       MSEL5CR_24_0, MSEL5CR_24_1,
+       MSEL5CR_23_0, MSEL5CR_23_1,
+       MSEL5CR_22_0, MSEL5CR_22_1,
+       MSEL5CR_21_0, MSEL5CR_21_1,
+       MSEL5CR_20_0, MSEL5CR_20_1,
+       MSEL5CR_19_0, MSEL5CR_19_1,
+       MSEL5CR_18_0, MSEL5CR_18_1,
+       MSEL5CR_17_0, MSEL5CR_17_1,
+       MSEL5CR_16_0, MSEL5CR_16_1,
+       MSEL5CR_15_0, MSEL5CR_15_1,
+       MSEL5CR_14_0, MSEL5CR_14_1,
+       MSEL5CR_13_0, MSEL5CR_13_1,
+       MSEL5CR_12_0, MSEL5CR_12_1,
+       MSEL5CR_11_0, MSEL5CR_11_1,
+       MSEL5CR_10_0, MSEL5CR_10_1,
+       MSEL5CR_09_0, MSEL5CR_09_1,
+       MSEL5CR_08_0, MSEL5CR_08_1,
+       MSEL5CR_07_0, MSEL5CR_07_1,
+       MSEL5CR_06_0, MSEL5CR_06_1,
+
+       MSEL8CR_16_0, MSEL8CR_16_1,
+       MSEL8CR_01_0, MSEL8CR_01_1,
+       MSEL8CR_00_0, MSEL8CR_00_1,
+
+       PINMUX_FUNCTION_END,
+
+       PINMUX_MARK_BEGIN,
+
+
+#define F1(a)  a##_MARK
+#define F2(a)  a##_MARK
+#define F3(a)  a##_MARK
+#define F4(a)  a##_MARK
+#define F5(a)  a##_MARK
+#define F6(a)  a##_MARK
+#define F7(a)  a##_MARK
+#define IRQ(a) IRQ##a##_MARK
+
+       F1(LCDD0), F3(PDM2_CLK_0), F7(DU0_DR0), IRQ(0), /* Port0 */
+       F1(LCDD1), F3(PDM2_DATA_1), F7(DU0_DR19), IRQ(1),
+       F1(LCDD2), F3(PDM3_CLK_2), F7(DU0_DR2), IRQ(2),
+       F1(LCDD3), F3(PDM3_DATA_3), F7(DU0_DR3), IRQ(3),
+       F1(LCDD4), F3(PDM4_CLK_4), F7(DU0_DR4), IRQ(4),
+       F1(LCDD5), F3(PDM4_DATA_5), F7(DU0_DR5), IRQ(5),
+       F1(LCDD6), F3(PDM0_OUTCLK_6), F7(DU0_DR6), IRQ(6),
+       F1(LCDD7), F3(PDM0_OUTDATA_7), F7(DU0_DR7), IRQ(7),
+       F1(LCDD8), F3(PDM1_OUTCLK_8), F7(DU0_DG0), IRQ(8),
+       F1(LCDD9), F3(PDM1_OUTDATA_9), F7(DU0_DG1), IRQ(9),
+       F1(LCDD10), F3(FSICCK), F7(DU0_DG2), IRQ(10), /* Port10 */
+       F1(LCDD11), F3(FSICISLD), F7(DU0_DG3), IRQ(11),
+       F1(LCDD12), F3(FSICOMC), F7(DU0_DG4), IRQ(12),
+       F1(LCDD13), F3(FSICOLR), F4(FSICILR), F7(DU0_DG5), IRQ(13),
+       F1(LCDD14), F3(FSICOBT), F4(FSICIBT), F7(DU0_DG6), IRQ(14),
+       F1(LCDD15), F3(FSICOSLD), F7(DU0_DG7), IRQ(15),
+       F1(LCDD16), F4(TPU1TO1), F7(DU0_DB0),
+       F1(LCDD17), F4(SF_IRQ_00), F7(DU0_DB1),
+       F1(LCDD18), F4(SF_IRQ_01), F7(DU0_DB2),
+       F1(LCDD19), F3(SCIFB3_RTS_19), F7(DU0_DB3),
+       F1(LCDD20), F3(SCIFB3_CTS_20), F7(DU0_DB4), /* Port20 */
+       F1(LCDD21), F3(SCIFB3_TXD_21), F7(DU0_DB5),
+       F1(LCDD22), F3(SCIFB3_RXD_22), F7(DU0_DB6),
+       F1(LCDD23), F3(SCIFB3_SCK_23), F7(DU0_DB7),
+       F1(LCDHSYN), F2(LCDCS), F3(SCIFB1_RTS_24),
+       F7(DU0_EXHSYNC_N_CSYNC_N_HSYNC_N),
+       F1(LCDVSYN), F3(SCIFB1_CTS_25), F7(DU0_EXVSYNC_N_VSYNC_N_CSYNC_N),
+       F1(LCDDCK), F2(LCDWR), F3(SCIFB1_TXD_26), F7(DU0_DOTCLKIN),
+       F1(LCDDISP), F2(LCDRS), F3(SCIFB1_RXD_27), F7(DU0_DOTCLKOUT),
+       F1(LCDRD_N), F3(SCIFB1_SCK_28), F7(DU0_DOTCLKOUTB),
+       F1(LCDLCLK), F4(SF_IRQ_02), F7(DU0_DISP_CSYNC_N_DE),
+       F1(LCDDON), F4(SF_IRQ_03), F7(DU0_ODDF_N_CLAMP), /* Port30 */
+
+       F1(SCIFA0_RTS), F5(SIM0_DET), F7(CSCIF0_RTS), /* Port32 */
+       F1(SCIFA0_CTS), F5(SIM1_DET), F7(CSCIF0_CTS),
+       F1(SCIFA0_SCK), F5(SIM0_PWRON), F7(CSCIF0_SCK),
+       F1(SCIFA1_RTS), F7(CSCIF1_RTS),
+       F1(SCIFA1_CTS), F7(CSCIF1_CTS),
+       F1(SCIFA1_SCK), F7(CSCIF1_SCK),
+       F1(SCIFB0_RTS), F3(TPU0TO1), F4(SCIFB3_RTS_38), F7(CHSCIF0_HRTS),
+       F1(SCIFB0_CTS), F3(TPU0TO2), F4(SCIFB3_CTS_39), F7(CHSCIF0_HCTS),
+       F1(SCIFB0_SCK), F3(TPU0TO3), F4(SCIFB3_SCK_40),
+       F7(CHSCIF0_HSCK), /* Port40 */
+
+       F1(PDM0_DATA), /* Port64 */
+       F1(PDM1_DATA),
+       F1(HSI_RX_WAKE), F2(SCIFB2_CTS_66), F3(MSIOF3_SYNC), F5(GenIO4),
+       IRQ(40),
+       F1(HSI_RX_READY), F2(SCIFB1_TXD_67), F5(GIO_OUT3_67), F7(CHSCIF1_HTX),
+       F1(HSI_RX_FLAG), F2(SCIFB2_TXD_68), F3(MSIOF3_TXD), F5(GIO_OUT4_68),
+       F1(HSI_RX_DATA), F2(SCIFB2_RXD_69), F3(MSIOF3_RXD), F5(GIO_OUT5_69),
+       F1(HSI_TX_FLAG), F2(SCIFB1_RTS_70), F5(GIO_OUT1_70), F6(HSIC_TSTCLK0),
+       F7(CHSCIF1_HRTS), /* Port70 */
+       F1(HSI_TX_DATA), F2(SCIFB1_CTS_71), F5(GIO_OUT2_71), F6(HSIC_TSTCLK1),
+       F7(CHSCIF1_HCTS),
+       F1(HSI_TX_WAKE), F2(SCIFB1_RXD_72), F5(GenIO8), F7(CHSCIF1_HRX),
+       F1(HSI_TX_READY), F2(SCIFB2_RTS_73), F3(MSIOF3_SCK), F5(GIO_OUT0_73),
+       F1(IRDA_OUT), F1(IRDA_IN), F1(IRDA_FIRSEL), F1(TPU0TO0),
+       F1(DIGRFEN), F1(GPS_TIMESTAMP), F1(TXP), /* Port80 */
+       F1(TXP2), F1(COEX_0), F1(COEX_1), IRQ(19), IRQ(18), /* Port85 */
+
+       F1(KEYIN0), /* Port96 */
+       F1(KEYIN1), F1(KEYIN2), F1(KEYIN3), F1(KEYIN4), /* Port100 */
+       F1(KEYIN5), F1(KEYIN6), IRQ(41), F1(KEYIN7), IRQ(42),
+       F2(KEYOUT0), F2(KEYOUT1), F2(KEYOUT2), F2(KEYOUT3),
+       F2(KEYOUT4), F2(KEYOUT5), IRQ(43), F2(KEYOUT6), IRQ(44), /* Port110 */
+       F2(KEYOUT7), F5(RFANAEN), IRQ(45),
+       F1(KEYIN8), F2(KEYOUT8), F4(SF_IRQ_04), IRQ(46),
+       F1(KEYIN9), F2(KEYOUT9), F4(SF_IRQ_05), IRQ(47),
+       F1(KEYIN10), F2(KEYOUT10), F4(SF_IRQ_06), IRQ(48),
+       F1(KEYIN11), F2(KEYOUT11), F4(SF_IRQ_07), IRQ(49),
+       F1(SCIFA0_TXD), F7(CSCIF0_TX), F1(SCIFA0_RXD), F7(CSCIF0_RX),
+       F1(SCIFA1_TXD), F7(CSCIF1_TX), F1(SCIFA1_RXD), F7(CSCIF1_RX),
+       F3(SF_PORT_1_120), F4(SCIFB3_RXD_120), F7(DU0_CDE), /* Port120 */
+       F3(SF_PORT_0_121), F4(SCIFB3_TXD_121),
+       F1(SCIFB0_TXD), F7(CHSCIF0_HTX),
+       F1(SCIFB0_RXD), F7(CHSCIF0_HRX), F3(ISP_STROBE_124),
+       F1(STP_ISD_0), F2(PDM4_CLK_125), F3(MSIOF2_TXD), F5(SIM0_VOLTSEL0),
+       F1(TS_SDEN), F2(MSIOF7_SYNC), F3(STP_ISEN_1),
+       F1(STP_ISEN_0), F2(PDM1_OUTDATA_128), F3(MSIOF2_SYNC),
+       F5(SIM1_VOLTSEL1), F1(TS_SPSYNC), F2(MSIOF7_RXD), F3(STP_ISSYNC_1),
+       F1(STP_ISSYNC_0), F2(PDM4_DATA_130), F3(MSIOF2_RXD),
+       F5(SIM0_VOLTSEL1), /* Port130 */
+       F1(STP_OPWM_0), F5(SIM1_PWRON), F1(TS_SCK), F2(MSIOF7_SCK),
+       F3(STP_ISCLK_1), F1(STP_ISCLK_0), F2(PDM1_OUTCLK_133), F3(MSIOF2_SCK),
+       F5(SIM1_VOLTSEL0), F1(TS_SDAT), F2(MSIOF7_TXD), F3(STP_ISD_1),
+       IRQ(20), /* Port160 */
+       IRQ(21), IRQ(22), IRQ(23),
+       F1(MMCD0_0), F1(MMCD0_1), F1(MMCD0_2), F1(MMCD0_3),
+       F1(MMCD0_4), F1(MMCD0_5), F1(MMCD0_6), /* Port170 */
+       F1(MMCD0_7), F1(MMCCMD0), F1(MMCCLK0), F1(MMCRST),
+       IRQ(24), IRQ(25), IRQ(26), IRQ(27),
+       F1(A10), F2(MMCD1_7), IRQ(31), /* Port192 */
+       F1(A9), F2(MMCD1_6), IRQ(32),
+       F1(A8), F2(MMCD1_5), IRQ(33),
+       F1(A7), F2(MMCD1_4), IRQ(34),
+       F1(A6), F2(MMCD1_3), IRQ(35),
+       F1(A5), F2(MMCD1_2), IRQ(36),
+       F1(A4), F2(MMCD1_1), IRQ(37),
+       F1(A3), F2(MMCD1_0), IRQ(38),
+       F1(A2), F2(MMCCMD1), IRQ(39), /* Port200 */
+       F1(A1),
+       F1(A0), F2(BS),
+       F1(CKO), F2(MMCCLK1),
+       F1(CS0_N), F5(SIM0_GPO1),
+       F1(CS2_N), F5(SIM0_GPO2),
+       F1(CS4_N), F2(VIO_VD), F5(SIM1_GPO0),
+       F1(D15), F5(GIO_OUT15),
+       F1(D14), F5(GIO_OUT14),
+       F1(D13), F5(GIO_OUT13),
+       F1(D12), F5(GIO_OUT12), /* Port210 */
+       F1(D11), F5(WGM_TXP2),
+       F1(D10), F5(WGM_GPS_TIMEM_ASK_RFCLK),
+       F1(D9), F2(VIO_D9), F5(GIO_OUT9),
+       F1(D8), F2(VIO_D8), F5(GIO_OUT8),
+       F1(D7), F2(VIO_D7), F5(GIO_OUT7),
+       F1(D6), F2(VIO_D6), F5(GIO_OUT6),
+       F1(D5), F2(VIO_D5), F5(GIO_OUT5_217),
+       F1(D4), F2(VIO_D4), F5(GIO_OUT4_218),
+       F1(D3), F2(VIO_D3), F5(GIO_OUT3_219),
+       F1(D2), F2(VIO_D2), F5(GIO_OUT2_220), /* Port220 */
+       F1(D1), F2(VIO_D1), F5(GIO_OUT1_221),
+       F1(D0), F2(VIO_D0), F5(GIO_OUT0_222),
+       F1(RDWR_224), F2(VIO_HD), F5(SIM1_GPO2),
+       F1(RD_N), F1(WAIT_N), F2(VIO_CLK), F5(SIM1_GPO1),
+       F1(WE0_N), F2(RDWR_227),
+       F1(WE1_N), F5(SIM0_GPO0),
+       F1(PWMO), F2(VIO_CKO1_229),
+       F1(SLIM_CLK), F2(VIO_CKO4_230), /* Port230 */
+       F1(SLIM_DATA), F2(VIO_CKO5_231), F2(VIO_CKO2_232), F4(SF_PORT_0_232),
+       F2(VIO_CKO3_233), F4(SF_PORT_1_233),
+       F1(FSIACK), F2(PDM3_CLK_234), F3(ISP_IRIS1_234),
+       F1(FSIAISLD), F2(PDM3_DATA_235),
+       F1(FSIAOMC), F2(PDM0_OUTCLK_236), F3(ISP_IRIS0_236),
+       F1(FSIAOLR), F2(FSIAILR), F1(FSIAOBT), F2(FSIAIBT),
+       F1(FSIAOSLD), F2(PDM0_OUTDATA_239),
+       F1(FSIBISLD), /* Port240 */
+       F1(FSIBOLR), F2(FSIBILR), F1(FSIBOMC), F3(ISP_SHUTTER1_242),
+       F1(FSIBOBT), F2(FSIBIBT), F1(FSIBOSLD), F2(FSIASPDIF),
+       F1(FSIBCK), F3(ISP_SHUTTER0_245),
+       F1(ISP_IRIS1_246), F1(ISP_IRIS0_247), F1(ISP_SHUTTER1_248),
+       F1(ISP_SHUTTER0_249), F1(ISP_STROBE_250), /* Port250 */
+       F1(MSIOF0_SYNC), F1(MSIOF0_RXD), F1(MSIOF0_SCK), F1(MSIOF0_SS2),
+       F3(VIO_CKO3_259), F1(MSIOF0_TXD), /* Port260 */
+       F2(SCIFB1_SCK_261), F7(CHSCIF1_HSCK), F2(SCIFB2_SCK_262),
+       F1(MSIOF1_SS2), F4(MSIOF5_SS2), F1(MSIOF1_TXD), F4(MSIOF5_TXD),
+       F1(MSIOF1_RXD), F4(MSIOF5_RXD), F1(MSIOF1_SS1), F4(MSIOF5_SS1),
+       F1(MSIOF0_SS1), F1(MSIOF1_SCK), F4(MSIOF5_SCK),
+       F1(MSIOF1_SYNC), F4(MSIOF5_SYNC),
+       F1(MSIOF2_SS1), F3(VIO_CKO5_270), /* Port270 */
+       F1(MSIOF2_SS2), F3(VIO_CKO2_271), F1(MSIOF3_SS2), F3(VIO_CKO1_272),
+       F1(MSIOF3_SS1), F3(VIO_CKO4_273), F1(MSIOF4_SS2), F4(TPU1TO0),
+       F1(IC_DP), F1(SIM0_RST), F1(IC_DM), F1(SIM0_BSICOMP),
+       F1(SIM0_CLK), F1(SIM0_IO), /* Port280 */
+       F1(SIM1_IO), F2(PDM2_DATA_281), F1(SIM1_CLK), F2(PDM2_CLK_282),
+       F1(SIM1_RST), F1(SDHID1_0), F3(STMDATA0_2),
+       F1(SDHID1_1), F3(STMDATA1_2), IRQ(51), /* Port290 */
+       F1(SDHID1_2), F3(STMDATA2_2), F1(SDHID1_3), F3(STMDATA3_2),
+       F1(SDHICLK1), F3(STMCLK_2), F1(SDHICMD1), F3(STMSIDI_2),
+       F1(SDHID2_0), F2(MSIOF4_TXD), F3(SCIFB2_TXD_295), F4(MSIOF6_TXD),
+       F1(SDHID2_1), F4(MSIOF6_SS2), IRQ(52),
+       F1(SDHID2_2), F2(MSIOF4_RXD), F3(SCIFB2_RXD_297), F4(MSIOF6_RXD),
+       F1(SDHID2_3), F2(MSIOF4_SYNC), F3(SCIFB2_CTS_298), F4(MSIOF6_SYNC),
+       F1(SDHICLK2), F2(MSIOF4_SCK), F3(SCIFB2_SCK_299), F4(MSIOF6_SCK),
+       F1(SDHICMD2), F2(MSIOF4_SS1), F3(SCIFB2_RTS_300),
+       F4(MSIOF6_SS1), /* Port300 */
+       F1(SDHICD0), IRQ(50), F1(SDHID0_0), F3(STMDATA0_1),
+       F1(SDHID0_1), F3(STMDATA1_1), F1(SDHID0_2), F3(STMDATA2_1),
+       F1(SDHID0_3), F3(STMDATA3_1), F1(SDHICMD0), F3(STMSIDI_1),
+       F1(SDHIWP0), F1(SDHICLK0), F3(STMCLK_1), IRQ(16), /* Port320 */
+       IRQ(17), IRQ(28), IRQ(29), IRQ(30), IRQ(53), IRQ(54),
+       IRQ(55), IRQ(56), IRQ(57),
+       PINMUX_MARK_END,
+};
+
+#define _PORT_DATA(pfx, sfx)   PORT_DATA_IO(pfx)
+#define PINMUX_DATA_ALL()    CPU_ALL_PORT(_PORT_DATA, , unused)
+
+static const pinmux_enum_t pinmux_data[] = {
+       /* specify valid pin states for each pin in GPIO mode */
+       PINMUX_DATA_ALL(),
+
+       /* Port0 */
+       PINMUX_DATA(LCDD0_MARK,         PORT0_FN1),
+       PINMUX_DATA(PDM2_CLK_0_MARK,    PORT0_FN3),
+       PINMUX_DATA(DU0_DR0_MARK,       PORT0_FN7),
+       PINMUX_DATA(IRQ0_MARK,          PORT0_FN0),
+
+       /* Port1 */
+       PINMUX_DATA(LCDD1_MARK,         PORT1_FN1),
+       PINMUX_DATA(PDM2_DATA_1_MARK,   PORT1_FN3,      MSEL3CR_12_0),
+       PINMUX_DATA(DU0_DR19_MARK,      PORT1_FN7),
+       PINMUX_DATA(IRQ1_MARK,          PORT1_FN0),
+
+       /* Port2 */
+       PINMUX_DATA(LCDD2_MARK,         PORT2_FN1),
+       PINMUX_DATA(PDM3_CLK_2_MARK,    PORT2_FN3),
+       PINMUX_DATA(DU0_DR2_MARK,       PORT2_FN7),
+       PINMUX_DATA(IRQ2_MARK,          PORT2_FN0),
+
+       /* Port3 */
+       PINMUX_DATA(LCDD3_MARK,         PORT3_FN1),
+       PINMUX_DATA(PDM3_DATA_3_MARK,   PORT3_FN3,      MSEL3CR_12_0),
+       PINMUX_DATA(DU0_DR3_MARK,       PORT3_FN7),
+       PINMUX_DATA(IRQ3_MARK,          PORT3_FN0),
+
+       /* Port4 */
+       PINMUX_DATA(LCDD4_MARK,         PORT4_FN1),
+       PINMUX_DATA(PDM4_CLK_4_MARK,    PORT4_FN3),
+       PINMUX_DATA(DU0_DR4_MARK,       PORT4_FN7),
+       PINMUX_DATA(IRQ4_MARK,          PORT4_FN0),
+
+       /* Port5 */
+       PINMUX_DATA(LCDD5_MARK,         PORT5_FN1),
+       PINMUX_DATA(PDM4_DATA_5_MARK,   PORT5_FN3,      MSEL3CR_12_0),
+       PINMUX_DATA(DU0_DR5_MARK,       PORT5_FN7),
+       PINMUX_DATA(IRQ5_MARK,          PORT5_FN0),
+
+       /* Port6 */
+       PINMUX_DATA(LCDD6_MARK,         PORT6_FN1),
+       PINMUX_DATA(PDM0_OUTCLK_6_MARK, PORT6_FN3),
+       PINMUX_DATA(DU0_DR6_MARK,       PORT6_FN7),
+       PINMUX_DATA(IRQ6_MARK,          PORT6_FN0),
+
+       /* Port7 */
+       PINMUX_DATA(LCDD7_MARK,                 PORT7_FN1),
+       PINMUX_DATA(PDM0_OUTDATA_7_MARK,        PORT7_FN3),
+       PINMUX_DATA(DU0_DR7_MARK,               PORT7_FN7),
+       PINMUX_DATA(IRQ7_MARK,                  PORT7_FN0),
+
+       /* Port8 */
+       PINMUX_DATA(LCDD8_MARK,         PORT8_FN1),
+       PINMUX_DATA(PDM1_OUTCLK_8_MARK, PORT8_FN3),
+       PINMUX_DATA(DU0_DG0_MARK,       PORT8_FN7),
+       PINMUX_DATA(IRQ8_MARK,          PORT8_FN0),
+
+       /* Port9 */
+       PINMUX_DATA(LCDD9_MARK,         PORT9_FN1),
+       PINMUX_DATA(PDM1_OUTDATA_9_MARK, PORT9_FN3),
+       PINMUX_DATA(DU0_DG1_MARK,       PORT9_FN7),
+       PINMUX_DATA(IRQ9_MARK,          PORT9_FN0),
+
+       /* Port10 */
+       PINMUX_DATA(LCDD10_MARK,                PORT10_FN1),
+       PINMUX_DATA(FSICCK_MARK,                PORT10_FN3),
+       PINMUX_DATA(DU0_DG2_MARK,               PORT10_FN7),
+       PINMUX_DATA(IRQ10_MARK,                 PORT10_FN0),
+
+       /* Port11 */
+       PINMUX_DATA(LCDD11_MARK,                PORT11_FN1),
+       PINMUX_DATA(FSICISLD_MARK,              PORT11_FN3),
+       PINMUX_DATA(DU0_DG3_MARK,               PORT11_FN7),
+       PINMUX_DATA(IRQ11_MARK,                 PORT11_FN0),
+
+       /* Port12 */
+       PINMUX_DATA(LCDD12_MARK,                PORT12_FN1),
+       PINMUX_DATA(FSICOMC_MARK,               PORT12_FN3),
+       PINMUX_DATA(DU0_DG4_MARK,               PORT12_FN7),
+       PINMUX_DATA(IRQ12_MARK,                 PORT12_FN0),
+
+       /* Port13 */
+       PINMUX_DATA(LCDD13_MARK,                PORT13_FN1),
+       PINMUX_DATA(FSICOLR_MARK,               PORT13_FN3),
+       PINMUX_DATA(FSICILR_MARK,               PORT13_FN4),
+       PINMUX_DATA(DU0_DG5_MARK,               PORT13_FN7),
+       PINMUX_DATA(IRQ13_MARK,                 PORT13_FN0),
+
+       /* Port14 */
+       PINMUX_DATA(LCDD14_MARK,                PORT14_FN1),
+       PINMUX_DATA(FSICOBT_MARK,               PORT14_FN3),
+       PINMUX_DATA(FSICIBT_MARK,               PORT14_FN4),
+       PINMUX_DATA(DU0_DG6_MARK,               PORT14_FN7),
+       PINMUX_DATA(IRQ14_MARK,                 PORT14_FN0),
+
+       /* Port15 */
+       PINMUX_DATA(LCDD15_MARK,                PORT15_FN1),
+       PINMUX_DATA(FSICOSLD_MARK,              PORT15_FN3),
+       PINMUX_DATA(DU0_DG7_MARK,               PORT15_FN7),
+       PINMUX_DATA(IRQ15_MARK,                 PORT15_FN0),
+
+       /* Port16 */
+       PINMUX_DATA(LCDD16_MARK,                PORT16_FN1),
+       PINMUX_DATA(TPU1TO1_MARK,               PORT16_FN4),
+       PINMUX_DATA(DU0_DB0_MARK,               PORT16_FN7),
+
+       /* Port17 */
+       PINMUX_DATA(LCDD17_MARK,                PORT17_FN1),
+       PINMUX_DATA(SF_IRQ_00_MARK,             PORT17_FN4),
+       PINMUX_DATA(DU0_DB1_MARK,               PORT17_FN7),
+
+       /* Port18 */
+       PINMUX_DATA(LCDD18_MARK,                PORT18_FN1),
+       PINMUX_DATA(SF_IRQ_01_MARK,             PORT18_FN4),
+       PINMUX_DATA(DU0_DB2_MARK,               PORT18_FN7),
+
+       /* Port19 */
+       PINMUX_DATA(LCDD19_MARK,                PORT19_FN1),
+       PINMUX_DATA(SCIFB3_RTS_19_MARK,         PORT19_FN3),
+       PINMUX_DATA(DU0_DB3_MARK,               PORT19_FN7),
+
+       /* Port20 */
+       PINMUX_DATA(LCDD20_MARK,                PORT20_FN1),
+       PINMUX_DATA(SCIFB3_CTS_20_MARK,         PORT20_FN3,     MSEL3CR_09_0),
+       PINMUX_DATA(DU0_DB4_MARK,               PORT20_FN7),
+
+       /* Port21 */
+       PINMUX_DATA(LCDD21_MARK,                PORT21_FN1),
+       PINMUX_DATA(SCIFB3_TXD_21_MARK,         PORT21_FN3,     MSEL3CR_09_0),
+       PINMUX_DATA(DU0_DB5_MARK,               PORT21_FN7),
+
+       /* Port22 */
+       PINMUX_DATA(LCDD22_MARK,                PORT22_FN1),
+       PINMUX_DATA(SCIFB3_RXD_22_MARK,         PORT22_FN3,     MSEL3CR_09_0),
+       PINMUX_DATA(DU0_DB6_MARK,               PORT22_FN7),
+
+       /* Port23 */
+       PINMUX_DATA(LCDD23_MARK,                PORT23_FN1),
+       PINMUX_DATA(SCIFB3_SCK_23_MARK,         PORT23_FN3),
+       PINMUX_DATA(DU0_DB7_MARK,               PORT23_FN7),
+
+       /* Port24 */
+       PINMUX_DATA(LCDHSYN_MARK,                       PORT24_FN1),
+       PINMUX_DATA(LCDCS_MARK,                         PORT24_FN2),
+       PINMUX_DATA(SCIFB1_RTS_24_MARK,                 PORT24_FN3),
+       PINMUX_DATA(DU0_EXHSYNC_N_CSYNC_N_HSYNC_N_MARK, PORT24_FN7),
+
+       /* Port25 */
+       PINMUX_DATA(LCDVSYN_MARK,                       PORT25_FN1),
+       PINMUX_DATA(SCIFB1_CTS_25_MARK, PORT25_FN3, MSEL3CR_11_0),
+       PINMUX_DATA(DU0_EXVSYNC_N_VSYNC_N_CSYNC_N_MARK, PORT25_FN7),
+
+       /* Port26 */
+       PINMUX_DATA(LCDDCK_MARK,                PORT26_FN1),
+       PINMUX_DATA(LCDWR_MARK,                 PORT26_FN2),
+       PINMUX_DATA(SCIFB1_TXD_26_MARK,         PORT26_FN3,     MSEL3CR_11_0),
+       PINMUX_DATA(DU0_DOTCLKIN_MARK,          PORT26_FN7),
+
+       /* Port27 */
+       PINMUX_DATA(LCDDISP_MARK,               PORT27_FN1),
+       PINMUX_DATA(LCDRS_MARK,                 PORT27_FN2),
+       PINMUX_DATA(SCIFB1_RXD_27_MARK,         PORT27_FN3,     MSEL3CR_11_0),
+       PINMUX_DATA(DU0_DOTCLKOUT_MARK,         PORT27_FN7),
+
+       /* Port28 */
+       PINMUX_DATA(LCDRD_N_MARK,               PORT28_FN1),
+       PINMUX_DATA(SCIFB1_SCK_28_MARK,         PORT28_FN3),
+       PINMUX_DATA(DU0_DOTCLKOUTB_MARK,        PORT28_FN7),
+
+       /* Port29 */
+       PINMUX_DATA(LCDLCLK_MARK,               PORT29_FN1),
+       PINMUX_DATA(SF_IRQ_02_MARK,             PORT29_FN4),
+       PINMUX_DATA(DU0_DISP_CSYNC_N_DE_MARK,   PORT29_FN7),
+
+       /* Port30 */
+       PINMUX_DATA(LCDDON_MARK,                PORT30_FN1),
+       PINMUX_DATA(SF_IRQ_03_MARK,             PORT30_FN4),
+       PINMUX_DATA(DU0_ODDF_N_CLAMP_MARK,      PORT30_FN7),
+
+       /* Port32 */
+       PINMUX_DATA(SCIFA0_RTS_MARK,            PORT32_FN1),
+       PINMUX_DATA(SIM0_DET_MARK,              PORT32_FN5),
+       PINMUX_DATA(CSCIF0_RTS_MARK,            PORT32_FN7),
+
+       /* Port33 */
+       PINMUX_DATA(SCIFA0_CTS_MARK,            PORT33_FN1),
+       PINMUX_DATA(SIM1_DET_MARK,              PORT33_FN5),
+       PINMUX_DATA(CSCIF0_CTS_MARK,            PORT33_FN7),
+
+       /* Port34 */
+       PINMUX_DATA(SCIFA0_SCK_MARK,            PORT34_FN1),
+       PINMUX_DATA(SIM0_PWRON_MARK,            PORT34_FN5),
+       PINMUX_DATA(CSCIF0_SCK_MARK,            PORT34_FN7),
+
+       /* Port35 */
+       PINMUX_DATA(SCIFA1_RTS_MARK,            PORT35_FN1),
+       PINMUX_DATA(CSCIF1_RTS_MARK,            PORT35_FN7),
+
+       /* Port36 */
+       PINMUX_DATA(SCIFA1_CTS_MARK,            PORT36_FN1),
+       PINMUX_DATA(CSCIF1_CTS_MARK,            PORT36_FN7),
+
+       /* Port37 */
+       PINMUX_DATA(SCIFA1_SCK_MARK,            PORT37_FN1),
+       PINMUX_DATA(CSCIF1_SCK_MARK,            PORT37_FN7),
+
+       /* Port38 */
+       PINMUX_DATA(SCIFB0_RTS_MARK,            PORT38_FN1),
+       PINMUX_DATA(TPU0TO1_MARK,               PORT38_FN3),
+       PINMUX_DATA(SCIFB3_RTS_38_MARK,         PORT38_FN4),
+       PINMUX_DATA(CHSCIF0_HRTS_MARK,          PORT38_FN7),
+
+       /* Port39 */
+       PINMUX_DATA(SCIFB0_CTS_MARK,            PORT39_FN1),
+       PINMUX_DATA(TPU0TO2_MARK,               PORT39_FN3),
+       PINMUX_DATA(SCIFB3_CTS_39_MARK,         PORT39_FN4,     MSEL3CR_09_1),
+       PINMUX_DATA(CHSCIF0_HCTS_MARK,          PORT39_FN7),
+
+       /* Port40 */
+       PINMUX_DATA(SCIFB0_SCK_MARK,            PORT40_FN1),
+       PINMUX_DATA(TPU0TO3_MARK,               PORT40_FN3),
+       PINMUX_DATA(SCIFB3_SCK_40_MARK,         PORT40_FN4),
+       PINMUX_DATA(CHSCIF0_HSCK_MARK,          PORT40_FN7),
+
+       /* Port64 */
+       PINMUX_DATA(PDM0_DATA_MARK,             PORT64_FN1),
+
+       /* Port65 */
+       PINMUX_DATA(PDM1_DATA_MARK,             PORT65_FN1),
+
+       /* Port66 */
+       PINMUX_DATA(HSI_RX_WAKE_MARK,           PORT66_FN1),
+       PINMUX_DATA(SCIFB2_CTS_66_MARK,         PORT66_FN2,     MSEL3CR_10_0),
+       PINMUX_DATA(MSIOF3_SYNC_MARK,           PORT66_FN3),
+       PINMUX_DATA(GenIO4_MARK,                PORT66_FN5),
+       PINMUX_DATA(IRQ40_MARK,                 PORT66_FN0),
+
+       /* Port67 */
+       PINMUX_DATA(HSI_RX_READY_MARK,          PORT67_FN1),
+       PINMUX_DATA(SCIFB1_TXD_67_MARK,         PORT67_FN2,     MSEL3CR_11_1),
+       PINMUX_DATA(GIO_OUT3_67_MARK,           PORT67_FN5),
+       PINMUX_DATA(CHSCIF1_HTX_MARK,           PORT67_FN7),
+
+       /* Port68 */
+       PINMUX_DATA(HSI_RX_FLAG_MARK,           PORT68_FN1),
+       PINMUX_DATA(SCIFB2_TXD_68_MARK,         PORT68_FN2,     MSEL3CR_10_0),
+       PINMUX_DATA(MSIOF3_TXD_MARK,            PORT68_FN3),
+       PINMUX_DATA(GIO_OUT4_68_MARK,           PORT68_FN5),
+
+       /* Port69 */
+       PINMUX_DATA(HSI_RX_DATA_MARK,           PORT69_FN1),
+       PINMUX_DATA(SCIFB2_RXD_69_MARK,         PORT69_FN2,     MSEL3CR_10_0),
+       PINMUX_DATA(MSIOF3_RXD_MARK,            PORT69_FN3),
+       PINMUX_DATA(GIO_OUT5_69_MARK,           PORT69_FN5),
+
+       /* Port70 */
+       PINMUX_DATA(HSI_TX_FLAG_MARK,           PORT70_FN1),
+       PINMUX_DATA(SCIFB1_RTS_70_MARK,         PORT70_FN2),
+       PINMUX_DATA(GIO_OUT1_70_MARK,           PORT70_FN5),
+       PINMUX_DATA(HSIC_TSTCLK0_MARK,          PORT70_FN6),
+       PINMUX_DATA(CHSCIF1_HRTS_MARK,          PORT70_FN7),
+
+       /* Port71 */
+       PINMUX_DATA(HSI_TX_DATA_MARK,           PORT71_FN1),
+       PINMUX_DATA(SCIFB1_CTS_71_MARK,         PORT71_FN2,     MSEL3CR_11_1),
+       PINMUX_DATA(GIO_OUT2_71_MARK,           PORT71_FN5),
+       PINMUX_DATA(HSIC_TSTCLK1_MARK,          PORT71_FN6),
+       PINMUX_DATA(CHSCIF1_HCTS_MARK,          PORT71_FN7),
+
+       /* Port72 */
+       PINMUX_DATA(HSI_TX_WAKE_MARK,           PORT72_FN1),
+       PINMUX_DATA(SCIFB1_RXD_72_MARK,         PORT72_FN2,     MSEL3CR_11_1),
+       PINMUX_DATA(GenIO8_MARK,                PORT72_FN5),
+       PINMUX_DATA(CHSCIF1_HRX_MARK,           PORT72_FN7),
+
+       /* Port73 */
+       PINMUX_DATA(HSI_TX_READY_MARK,          PORT73_FN1),
+       PINMUX_DATA(SCIFB2_RTS_73_MARK,         PORT73_FN2),
+       PINMUX_DATA(MSIOF3_SCK_MARK,            PORT73_FN3),
+       PINMUX_DATA(GIO_OUT0_73_MARK,           PORT73_FN5),
+
+       /* Port74 - Port85 */
+       PINMUX_DATA(IRDA_OUT_MARK,              PORT74_FN1),
+       PINMUX_DATA(IRDA_IN_MARK,               PORT75_FN1),
+       PINMUX_DATA(IRDA_FIRSEL_MARK,           PORT76_FN1),
+       PINMUX_DATA(TPU0TO0_MARK,               PORT77_FN1),
+       PINMUX_DATA(DIGRFEN_MARK,               PORT78_FN1),
+       PINMUX_DATA(GPS_TIMESTAMP_MARK,         PORT79_FN1),
+       PINMUX_DATA(TXP_MARK,                   PORT80_FN1),
+       PINMUX_DATA(TXP2_MARK,                  PORT81_FN1),
+       PINMUX_DATA(COEX_0_MARK,                PORT82_FN1),
+       PINMUX_DATA(COEX_1_MARK,                PORT83_FN1),
+       PINMUX_DATA(IRQ19_MARK,                 PORT84_FN0),
+       PINMUX_DATA(IRQ18_MARK,                 PORT85_FN0),
+
+       /* Port96 - Port101 */
+       PINMUX_DATA(KEYIN0_MARK,                PORT96_FN1),
+       PINMUX_DATA(KEYIN1_MARK,                PORT97_FN1),
+       PINMUX_DATA(KEYIN2_MARK,                PORT98_FN1),
+       PINMUX_DATA(KEYIN3_MARK,                PORT99_FN1),
+       PINMUX_DATA(KEYIN4_MARK,                PORT100_FN1),
+       PINMUX_DATA(KEYIN5_MARK,                PORT101_FN1),
+
+       /* Port102 */
+       PINMUX_DATA(KEYIN6_MARK,                PORT102_FN1),
+       PINMUX_DATA(IRQ41_MARK,                 PORT102_FN0),
+
+       /* Port103 */
+       PINMUX_DATA(KEYIN7_MARK,                PORT103_FN1),
+       PINMUX_DATA(IRQ42_MARK,                 PORT103_FN0),
+
+       /* Port104 - Port108 */
+       PINMUX_DATA(KEYOUT0_MARK,               PORT104_FN2),
+       PINMUX_DATA(KEYOUT1_MARK,               PORT105_FN2),
+       PINMUX_DATA(KEYOUT2_MARK,               PORT106_FN2),
+       PINMUX_DATA(KEYOUT3_MARK,               PORT107_FN2),
+       PINMUX_DATA(KEYOUT4_MARK,               PORT108_FN2),
+
+       /* Port109 */
+       PINMUX_DATA(KEYOUT5_MARK,               PORT109_FN2),
+       PINMUX_DATA(IRQ43_MARK,                 PORT109_FN0),
+
+       /* Port110 */
+       PINMUX_DATA(KEYOUT6_MARK,               PORT110_FN2),
+       PINMUX_DATA(IRQ44_MARK,                 PORT110_FN0),
+
+       /* Port111 */
+       PINMUX_DATA(KEYOUT7_MARK,               PORT111_FN2),
+       PINMUX_DATA(RFANAEN_MARK,               PORT111_FN5),
+       PINMUX_DATA(IRQ45_MARK,                 PORT111_FN0),
+
+       /* Port112 */
+       PINMUX_DATA(KEYIN8_MARK,                PORT112_FN1),
+       PINMUX_DATA(KEYOUT8_MARK,               PORT112_FN2),
+       PINMUX_DATA(SF_IRQ_04_MARK,             PORT112_FN4),
+       PINMUX_DATA(IRQ46_MARK,                 PORT112_FN0),
+
+       /* Port113 */
+       PINMUX_DATA(KEYIN9_MARK,                PORT113_FN1),
+       PINMUX_DATA(KEYOUT9_MARK,               PORT113_FN2),
+       PINMUX_DATA(SF_IRQ_05_MARK,             PORT113_FN4),
+       PINMUX_DATA(IRQ47_MARK,                 PORT113_FN0),
+
+       /* Port114 */
+       PINMUX_DATA(KEYIN10_MARK,               PORT114_FN1),
+       PINMUX_DATA(KEYOUT10_MARK,              PORT114_FN2),
+       PINMUX_DATA(SF_IRQ_06_MARK,             PORT114_FN4),
+       PINMUX_DATA(IRQ48_MARK,                 PORT114_FN0),
+
+       /* Port115 */
+       PINMUX_DATA(KEYIN11_MARK,               PORT115_FN1),
+       PINMUX_DATA(KEYOUT11_MARK,              PORT115_FN2),
+       PINMUX_DATA(SF_IRQ_07_MARK,             PORT115_FN4),
+       PINMUX_DATA(IRQ49_MARK,                 PORT115_FN0),
+
+       /* Port116 */
+       PINMUX_DATA(SCIFA0_TXD_MARK,            PORT116_FN1),
+       PINMUX_DATA(CSCIF0_TX_MARK,             PORT116_FN7),
+
+       /* Port117 */
+       PINMUX_DATA(SCIFA0_RXD_MARK,            PORT117_FN1),
+       PINMUX_DATA(CSCIF0_RX_MARK,             PORT117_FN7),
+
+       /* Port118 */
+       PINMUX_DATA(SCIFA1_TXD_MARK,            PORT118_FN1),
+       PINMUX_DATA(CSCIF1_TX_MARK,             PORT118_FN7),
+
+       /* Port119 */
+       PINMUX_DATA(SCIFA1_RXD_MARK,            PORT119_FN1),
+       PINMUX_DATA(CSCIF1_RX_MARK,             PORT119_FN7),
+
+       /* Port120 */
+       PINMUX_DATA(SF_PORT_1_120_MARK,         PORT120_FN3),
+       PINMUX_DATA(SCIFB3_RXD_120_MARK,        PORT120_FN4,    MSEL3CR_09_1),
+       PINMUX_DATA(DU0_CDE_MARK,               PORT120_FN7),
+
+       /* Port121 */
+       PINMUX_DATA(SF_PORT_0_121_MARK,         PORT121_FN3),
+       PINMUX_DATA(SCIFB3_TXD_121_MARK,        PORT121_FN4,    MSEL3CR_09_1),
+
+       /* Port122 */
+       PINMUX_DATA(SCIFB0_TXD_MARK,            PORT122_FN1),
+       PINMUX_DATA(CHSCIF0_HTX_MARK,           PORT122_FN7),
+
+       /* Port123 */
+       PINMUX_DATA(SCIFB0_RXD_MARK,            PORT123_FN1),
+       PINMUX_DATA(CHSCIF0_HRX_MARK,           PORT123_FN7),
+
+       /* Port124 */
+       PINMUX_DATA(ISP_STROBE_124_MARK,        PORT124_FN3),
+
+       /* Port125 */
+       PINMUX_DATA(STP_ISD_0_MARK,             PORT125_FN1),
+       PINMUX_DATA(PDM4_CLK_125_MARK,          PORT125_FN2),
+       PINMUX_DATA(MSIOF2_TXD_MARK,            PORT125_FN3),
+       PINMUX_DATA(SIM0_VOLTSEL0_MARK,         PORT125_FN5),
+
+       /* Port126 */
+       PINMUX_DATA(TS_SDEN_MARK,               PORT126_FN1),
+       PINMUX_DATA(MSIOF7_SYNC_MARK,           PORT126_FN2),
+       PINMUX_DATA(STP_ISEN_1_MARK,            PORT126_FN3),
+
+       /* Port128 */
+       PINMUX_DATA(STP_ISEN_0_MARK,            PORT128_FN1),
+       PINMUX_DATA(PDM1_OUTDATA_128_MARK,      PORT128_FN2),
+       PINMUX_DATA(MSIOF2_SYNC_MARK,           PORT128_FN3),
+       PINMUX_DATA(SIM1_VOLTSEL1_MARK,         PORT128_FN5),
+
+       /* Port129 */
+       PINMUX_DATA(TS_SPSYNC_MARK,             PORT129_FN1),
+       PINMUX_DATA(MSIOF7_RXD_MARK,            PORT129_FN2),
+       PINMUX_DATA(STP_ISSYNC_1_MARK,          PORT129_FN3),
+
+       /* Port130 */
+       PINMUX_DATA(STP_ISSYNC_0_MARK,          PORT130_FN1),
+       PINMUX_DATA(PDM4_DATA_130_MARK,         PORT130_FN2,    MSEL3CR_12_1),
+       PINMUX_DATA(MSIOF2_RXD_MARK,            PORT130_FN3),
+       PINMUX_DATA(SIM0_VOLTSEL1_MARK,         PORT130_FN5),
+
+       /* Port131 */
+       PINMUX_DATA(STP_OPWM_0_MARK,            PORT131_FN1),
+       PINMUX_DATA(SIM1_PWRON_MARK,            PORT131_FN5),
+
+       /* Port132 */
+       PINMUX_DATA(TS_SCK_MARK,                PORT132_FN1),
+       PINMUX_DATA(MSIOF7_SCK_MARK,            PORT132_FN2),
+       PINMUX_DATA(STP_ISCLK_1_MARK,           PORT132_FN3),
+
+       /* Port133 */
+       PINMUX_DATA(STP_ISCLK_0_MARK,           PORT133_FN1),
+       PINMUX_DATA(PDM1_OUTCLK_133_MARK,       PORT133_FN2),
+       PINMUX_DATA(MSIOF2_SCK_MARK,            PORT133_FN3),
+       PINMUX_DATA(SIM1_VOLTSEL0_MARK,         PORT133_FN5),
+
+       /* Port134 */
+       PINMUX_DATA(TS_SDAT_MARK,               PORT134_FN1),
+       PINMUX_DATA(MSIOF7_TXD_MARK,            PORT134_FN2),
+       PINMUX_DATA(STP_ISD_1_MARK,             PORT134_FN3),
+
+       /* Port160 - Port178 */
+       PINMUX_DATA(IRQ20_MARK,                 PORT160_FN0),
+       PINMUX_DATA(IRQ21_MARK,                 PORT161_FN0),
+       PINMUX_DATA(IRQ22_MARK,                 PORT162_FN0),
+       PINMUX_DATA(IRQ23_MARK,                 PORT163_FN0),
+       PINMUX_DATA(MMCD0_0_MARK,               PORT164_FN1),
+       PINMUX_DATA(MMCD0_1_MARK,               PORT165_FN1),
+       PINMUX_DATA(MMCD0_2_MARK,               PORT166_FN1),
+       PINMUX_DATA(MMCD0_3_MARK,               PORT167_FN1),
+       PINMUX_DATA(MMCD0_4_MARK,               PORT168_FN1),
+       PINMUX_DATA(MMCD0_5_MARK,               PORT169_FN1),
+       PINMUX_DATA(MMCD0_6_MARK,               PORT170_FN1),
+       PINMUX_DATA(MMCD0_7_MARK,               PORT171_FN1),
+       PINMUX_DATA(MMCCMD0_MARK,               PORT172_FN1),
+       PINMUX_DATA(MMCCLK0_MARK,               PORT173_FN1),
+       PINMUX_DATA(MMCRST_MARK,                PORT174_FN1),
+       PINMUX_DATA(IRQ24_MARK,                 PORT175_FN0),
+       PINMUX_DATA(IRQ25_MARK,                 PORT176_FN0),
+       PINMUX_DATA(IRQ26_MARK,                 PORT177_FN0),
+       PINMUX_DATA(IRQ27_MARK,                 PORT178_FN0),
+
+       /* Port192 - Port200 FN1 */
+       PINMUX_DATA(A10_MARK,           PORT192_FN1),
+       PINMUX_DATA(A9_MARK,            PORT193_FN1),
+       PINMUX_DATA(A8_MARK,            PORT194_FN1),
+       PINMUX_DATA(A7_MARK,            PORT195_FN1),
+       PINMUX_DATA(A6_MARK,            PORT196_FN1),
+       PINMUX_DATA(A5_MARK,            PORT197_FN1),
+       PINMUX_DATA(A4_MARK,            PORT198_FN1),
+       PINMUX_DATA(A3_MARK,            PORT199_FN1),
+       PINMUX_DATA(A2_MARK,            PORT200_FN1),
+
+       /* Port192 - Port200 FN2 */
+       PINMUX_DATA(MMCD1_7_MARK,               PORT192_FN2),
+       PINMUX_DATA(MMCD1_6_MARK,               PORT193_FN2),
+       PINMUX_DATA(MMCD1_5_MARK,               PORT194_FN2),
+       PINMUX_DATA(MMCD1_4_MARK,               PORT195_FN2),
+       PINMUX_DATA(MMCD1_3_MARK,               PORT196_FN2),
+       PINMUX_DATA(MMCD1_2_MARK,               PORT197_FN2),
+       PINMUX_DATA(MMCD1_1_MARK,               PORT198_FN2),
+       PINMUX_DATA(MMCD1_0_MARK,               PORT199_FN2),
+       PINMUX_DATA(MMCCMD1_MARK,               PORT200_FN2),
+
+       /* Port192 - Port200 IRQ */
+       PINMUX_DATA(IRQ31_MARK,                 PORT192_FN0),
+       PINMUX_DATA(IRQ32_MARK,                 PORT193_FN0),
+       PINMUX_DATA(IRQ33_MARK,                 PORT194_FN0),
+       PINMUX_DATA(IRQ34_MARK,                 PORT195_FN0),
+       PINMUX_DATA(IRQ35_MARK,                 PORT196_FN0),
+       PINMUX_DATA(IRQ36_MARK,                 PORT197_FN0),
+       PINMUX_DATA(IRQ37_MARK,                 PORT198_FN0),
+       PINMUX_DATA(IRQ38_MARK,                 PORT199_FN0),
+       PINMUX_DATA(IRQ39_MARK,                 PORT200_FN0),
+
+       /* Port201 */
+       PINMUX_DATA(A1_MARK,            PORT201_FN1),
+
+       /* Port202 */
+       PINMUX_DATA(A0_MARK,            PORT202_FN1),
+       PINMUX_DATA(BS_MARK,            PORT202_FN2),
+
+       /* Port203 */
+       PINMUX_DATA(CKO_MARK,           PORT203_FN1),
+       PINMUX_DATA(MMCCLK1_MARK,       PORT203_FN2),
+
+       /* Port204 */
+       PINMUX_DATA(CS0_N_MARK,         PORT204_FN1),
+       PINMUX_DATA(SIM0_GPO1_MARK,     PORT204_FN5),
+
+       /* Port205 */
+       PINMUX_DATA(CS2_N_MARK,         PORT205_FN1),
+       PINMUX_DATA(SIM0_GPO2_MARK,     PORT205_FN5),
+
+       /* Port206 */
+       PINMUX_DATA(CS4_N_MARK,         PORT206_FN1),
+       PINMUX_DATA(VIO_VD_MARK,        PORT206_FN2),
+       PINMUX_DATA(SIM1_GPO0_MARK,     PORT206_FN5),
+
+       /* Port207 - Port212 FN1 */
+       PINMUX_DATA(D15_MARK,           PORT207_FN1),
+       PINMUX_DATA(D14_MARK,           PORT208_FN1),
+       PINMUX_DATA(D13_MARK,           PORT209_FN1),
+       PINMUX_DATA(D12_MARK,           PORT210_FN1),
+       PINMUX_DATA(D11_MARK,           PORT211_FN1),
+       PINMUX_DATA(D10_MARK,           PORT212_FN1),
+
+       /* Port207 - Port212 FN5 */
+       PINMUX_DATA(GIO_OUT15_MARK,                     PORT207_FN5),
+       PINMUX_DATA(GIO_OUT14_MARK,                     PORT208_FN5),
+       PINMUX_DATA(GIO_OUT13_MARK,                     PORT209_FN5),
+       PINMUX_DATA(GIO_OUT12_MARK,                     PORT210_FN5),
+       PINMUX_DATA(WGM_TXP2_MARK,                      PORT211_FN5),
+       PINMUX_DATA(WGM_GPS_TIMEM_ASK_RFCLK_MARK,       PORT212_FN5),
+
+       /* Port213 - Port222 FN1 */
+       PINMUX_DATA(D9_MARK,            PORT213_FN1),
+       PINMUX_DATA(D8_MARK,            PORT214_FN1),
+       PINMUX_DATA(D7_MARK,            PORT215_FN1),
+       PINMUX_DATA(D6_MARK,            PORT216_FN1),
+       PINMUX_DATA(D5_MARK,            PORT217_FN1),
+       PINMUX_DATA(D4_MARK,            PORT218_FN1),
+       PINMUX_DATA(D3_MARK,            PORT219_FN1),
+       PINMUX_DATA(D2_MARK,            PORT220_FN1),
+       PINMUX_DATA(D1_MARK,            PORT221_FN1),
+       PINMUX_DATA(D0_MARK,            PORT222_FN1),
+
+       /* Port213 - Port222 FN2 */
+       PINMUX_DATA(VIO_D9_MARK,        PORT213_FN2),
+       PINMUX_DATA(VIO_D8_MARK,        PORT214_FN2),
+       PINMUX_DATA(VIO_D7_MARK,        PORT215_FN2),
+       PINMUX_DATA(VIO_D6_MARK,        PORT216_FN2),
+       PINMUX_DATA(VIO_D5_MARK,        PORT217_FN2),
+       PINMUX_DATA(VIO_D4_MARK,        PORT218_FN2),
+       PINMUX_DATA(VIO_D3_MARK,        PORT219_FN2),
+       PINMUX_DATA(VIO_D2_MARK,        PORT220_FN2),
+       PINMUX_DATA(VIO_D1_MARK,        PORT221_FN2),
+       PINMUX_DATA(VIO_D0_MARK,        PORT222_FN2),
+
+       /* Port213 - Port222 FN5 */
+       PINMUX_DATA(GIO_OUT9_MARK,      PORT213_FN5),
+       PINMUX_DATA(GIO_OUT8_MARK,      PORT214_FN5),
+       PINMUX_DATA(GIO_OUT7_MARK,      PORT215_FN5),
+       PINMUX_DATA(GIO_OUT6_MARK,      PORT216_FN5),
+       PINMUX_DATA(GIO_OUT5_217_MARK,  PORT217_FN5),
+       PINMUX_DATA(GIO_OUT4_218_MARK,  PORT218_FN5),
+       PINMUX_DATA(GIO_OUT3_219_MARK,  PORT219_FN5),
+       PINMUX_DATA(GIO_OUT2_220_MARK,  PORT220_FN5),
+       PINMUX_DATA(GIO_OUT1_221_MARK,  PORT221_FN5),
+       PINMUX_DATA(GIO_OUT0_222_MARK,  PORT222_FN5),
+
+       /* Port224 */
+       PINMUX_DATA(RDWR_224_MARK,      PORT224_FN1),
+       PINMUX_DATA(VIO_HD_MARK,        PORT224_FN2),
+       PINMUX_DATA(SIM1_GPO2_MARK,     PORT224_FN5),
+
+       /* Port225 */
+       PINMUX_DATA(RD_N_MARK,          PORT225_FN1),
+
+       /* Port226 */
+       PINMUX_DATA(WAIT_N_MARK,        PORT226_FN1),
+       PINMUX_DATA(VIO_CLK_MARK,       PORT226_FN2),
+       PINMUX_DATA(SIM1_GPO1_MARK,     PORT226_FN5),
+
+       /* Port227 */
+       PINMUX_DATA(WE0_N_MARK,         PORT227_FN1),
+       PINMUX_DATA(RDWR_227_MARK,      PORT227_FN2),
+
+       /* Port228 */
+       PINMUX_DATA(WE1_N_MARK,         PORT228_FN1),
+       PINMUX_DATA(SIM0_GPO0_MARK,     PORT228_FN5),
+
+       /* Port229 */
+       PINMUX_DATA(PWMO_MARK,          PORT229_FN1),
+       PINMUX_DATA(VIO_CKO1_229_MARK,  PORT229_FN2),
+
+       /* Port230 */
+       PINMUX_DATA(SLIM_CLK_MARK,      PORT230_FN1),
+       PINMUX_DATA(VIO_CKO4_230_MARK,  PORT230_FN2),
+
+       /* Port231 */
+       PINMUX_DATA(SLIM_DATA_MARK,     PORT231_FN1),
+       PINMUX_DATA(VIO_CKO5_231_MARK,  PORT231_FN2),
+
+       /* Port232 */
+       PINMUX_DATA(VIO_CKO2_232_MARK,  PORT232_FN2),
+       PINMUX_DATA(SF_PORT_0_232_MARK, PORT232_FN4),
+
+       /* Port233 */
+       PINMUX_DATA(VIO_CKO3_233_MARK,  PORT233_FN2),
+       PINMUX_DATA(SF_PORT_1_233_MARK, PORT233_FN4),
+
+       /* Port234 */
+       PINMUX_DATA(FSIACK_MARK,        PORT234_FN1),
+       PINMUX_DATA(PDM3_CLK_234_MARK,  PORT234_FN2),
+       PINMUX_DATA(ISP_IRIS1_234_MARK, PORT234_FN3),
+
+       /* Port235 */
+       PINMUX_DATA(FSIAISLD_MARK,      PORT235_FN1),
+       PINMUX_DATA(PDM3_DATA_235_MARK, PORT235_FN2,    MSEL3CR_12_1),
+
+       /* Port236 */
+       PINMUX_DATA(FSIAOMC_MARK,               PORT236_FN1),
+       PINMUX_DATA(PDM0_OUTCLK_236_MARK,       PORT236_FN2),
+       PINMUX_DATA(ISP_IRIS0_236_MARK,         PORT236_FN3),
+
+       /* Port237 */
+       PINMUX_DATA(FSIAOLR_MARK,       PORT237_FN1),
+       PINMUX_DATA(FSIAILR_MARK,       PORT237_FN2),
+
+       /* Port238 */
+       PINMUX_DATA(FSIAOBT_MARK,       PORT238_FN1),
+       PINMUX_DATA(FSIAIBT_MARK,       PORT238_FN2),
+
+       /* Port239 */
+       PINMUX_DATA(FSIAOSLD_MARK,              PORT239_FN1),
+       PINMUX_DATA(PDM0_OUTDATA_239_MARK,      PORT239_FN2),
+
+       /* Port240 */
+       PINMUX_DATA(FSIBISLD_MARK,      PORT240_FN1),
+
+       /* Port241 */
+       PINMUX_DATA(FSIBOLR_MARK,       PORT241_FN1),
+       PINMUX_DATA(FSIBILR_MARK,       PORT241_FN2),
+
+       /* Port242 */
+       PINMUX_DATA(FSIBOMC_MARK,               PORT242_FN1),
+       PINMUX_DATA(ISP_SHUTTER1_242_MARK,      PORT242_FN3),
+
+       /* Port243 */
+       PINMUX_DATA(FSIBOBT_MARK,       PORT243_FN1),
+       PINMUX_DATA(FSIBIBT_MARK,       PORT243_FN2),
+
+       /* Port244 */
+       PINMUX_DATA(FSIBOSLD_MARK,      PORT244_FN1),
+       PINMUX_DATA(FSIASPDIF_MARK,     PORT244_FN2),
+
+       /* Port245 */
+       PINMUX_DATA(FSIBCK_MARK,                PORT245_FN1),
+       PINMUX_DATA(ISP_SHUTTER0_245_MARK,      PORT245_FN3),
+
+       /* Port246 - Port250 FN1 */
+       PINMUX_DATA(ISP_IRIS1_246_MARK,         PORT246_FN1),
+       PINMUX_DATA(ISP_IRIS0_247_MARK,         PORT247_FN1),
+       PINMUX_DATA(ISP_SHUTTER1_248_MARK,      PORT248_FN1),
+       PINMUX_DATA(ISP_SHUTTER0_249_MARK,      PORT249_FN1),
+       PINMUX_DATA(ISP_STROBE_250_MARK,        PORT250_FN1),
+
+       /* Port256 - Port258 */
+       PINMUX_DATA(MSIOF0_SYNC_MARK,           PORT256_FN1),
+       PINMUX_DATA(MSIOF0_RXD_MARK,            PORT257_FN1),
+       PINMUX_DATA(MSIOF0_SCK_MARK,            PORT258_FN1),
+
+       /* Port259 */
+       PINMUX_DATA(MSIOF0_SS2_MARK,            PORT259_FN1),
+       PINMUX_DATA(VIO_CKO3_259_MARK,          PORT259_FN3),
+
+       /* Port260 */
+       PINMUX_DATA(MSIOF0_TXD_MARK,            PORT260_FN1),
+
+       /* Port261 */
+       PINMUX_DATA(SCIFB1_SCK_261_MARK,        PORT261_FN2),
+       PINMUX_DATA(CHSCIF1_HSCK_MARK,          PORT261_FN7),
+
+       /* Port262 */
+       PINMUX_DATA(SCIFB2_SCK_262_MARK,        PORT262_FN2),
+
+       /* Port263 - Port266 FN1 */
+       PINMUX_DATA(MSIOF1_SS2_MARK,            PORT263_FN1),
+       PINMUX_DATA(MSIOF1_TXD_MARK,            PORT264_FN1),
+       PINMUX_DATA(MSIOF1_RXD_MARK,            PORT265_FN1),
+       PINMUX_DATA(MSIOF1_SS1_MARK,            PORT266_FN1),
+
+       /* Port263 - Port266 FN4 */
+       PINMUX_DATA(MSIOF5_SS2_MARK,            PORT263_FN4),
+       PINMUX_DATA(MSIOF5_TXD_MARK,            PORT264_FN4),
+       PINMUX_DATA(MSIOF5_RXD_MARK,            PORT265_FN4),
+       PINMUX_DATA(MSIOF5_SS1_MARK,            PORT266_FN4),
+
+       /* Port267 */
+       PINMUX_DATA(MSIOF0_SS1_MARK,            PORT267_FN1),
+
+       /* Port268 */
+       PINMUX_DATA(MSIOF1_SCK_MARK,            PORT268_FN1),
+       PINMUX_DATA(MSIOF5_SCK_MARK,            PORT268_FN4),
+
+       /* Port269 */
+       PINMUX_DATA(MSIOF1_SYNC_MARK,           PORT269_FN1),
+       PINMUX_DATA(MSIOF5_SYNC_MARK,           PORT269_FN4),
+
+       /* Port270 - Port273 FN1 */
+       PINMUX_DATA(MSIOF2_SS1_MARK,            PORT270_FN1),
+       PINMUX_DATA(MSIOF2_SS2_MARK,            PORT271_FN1),
+       PINMUX_DATA(MSIOF3_SS2_MARK,            PORT272_FN1),
+       PINMUX_DATA(MSIOF3_SS1_MARK,            PORT273_FN1),
+
+       /* Port270 - Port273 FN3 */
+       PINMUX_DATA(VIO_CKO5_270_MARK,          PORT270_FN3),
+       PINMUX_DATA(VIO_CKO2_271_MARK,          PORT271_FN3),
+       PINMUX_DATA(VIO_CKO1_272_MARK,          PORT272_FN3),
+       PINMUX_DATA(VIO_CKO4_273_MARK,          PORT273_FN3),
+
+       /* Port274 */
+       PINMUX_DATA(MSIOF4_SS2_MARK,            PORT274_FN1),
+       PINMUX_DATA(TPU1TO0_MARK,               PORT274_FN4),
+
+       /* Port275 - Port280 */
+       PINMUX_DATA(IC_DP_MARK,                 PORT275_FN1),
+       PINMUX_DATA(SIM0_RST_MARK,              PORT276_FN1),
+       PINMUX_DATA(IC_DM_MARK,                 PORT277_FN1),
+       PINMUX_DATA(SIM0_BSICOMP_MARK,          PORT278_FN1),
+       PINMUX_DATA(SIM0_CLK_MARK,              PORT279_FN1),
+       PINMUX_DATA(SIM0_IO_MARK,               PORT280_FN1),
+
+       /* Port281 */
+       PINMUX_DATA(SIM1_IO_MARK,               PORT281_FN1),
+       PINMUX_DATA(PDM2_DATA_281_MARK,         PORT281_FN2,    MSEL3CR_12_1),
+
+       /* Port282 */
+       PINMUX_DATA(SIM1_CLK_MARK,              PORT282_FN1),
+       PINMUX_DATA(PDM2_CLK_282_MARK,          PORT282_FN2),
+
+       /* Port283 */
+       PINMUX_DATA(SIM1_RST_MARK,              PORT283_FN1),
+
+       /* Port289 */
+       PINMUX_DATA(SDHID1_0_MARK,              PORT289_FN1),
+       PINMUX_DATA(STMDATA0_2_MARK,            PORT289_FN3),
+
+       /* Port290 */
+       PINMUX_DATA(SDHID1_1_MARK,              PORT290_FN1),
+       PINMUX_DATA(STMDATA1_2_MARK,            PORT290_FN3),
+       PINMUX_DATA(IRQ51_MARK,                 PORT290_FN0),
+
+       /* Port291 - Port294 FN1 */
+       PINMUX_DATA(SDHID1_2_MARK,              PORT291_FN1),
+       PINMUX_DATA(SDHID1_3_MARK,              PORT292_FN1),
+       PINMUX_DATA(SDHICLK1_MARK,              PORT293_FN1),
+       PINMUX_DATA(SDHICMD1_MARK,              PORT294_FN1),
+
+       /* Port291 - Port294 FN3 */
+       PINMUX_DATA(STMDATA2_2_MARK,            PORT291_FN3),
+       PINMUX_DATA(STMDATA3_2_MARK,            PORT292_FN3),
+       PINMUX_DATA(STMCLK_2_MARK,              PORT293_FN3),
+       PINMUX_DATA(STMSIDI_2_MARK,             PORT294_FN3),
+
+       /* Port295 */
+       PINMUX_DATA(SDHID2_0_MARK,              PORT295_FN1),
+       PINMUX_DATA(MSIOF4_TXD_MARK,            PORT295_FN2),
+       PINMUX_DATA(SCIFB2_TXD_295_MARK,        PORT295_FN3,    MSEL3CR_10_1),
+       PINMUX_DATA(MSIOF6_TXD_MARK,            PORT295_FN4),
+
+       /* Port296 */
+       PINMUX_DATA(SDHID2_1_MARK,              PORT296_FN1),
+       PINMUX_DATA(MSIOF6_SS2_MARK,            PORT296_FN4),
+       PINMUX_DATA(IRQ52_MARK,                 PORT296_FN0),
+
+       /* Port297 - Port300 FN1 */
+       PINMUX_DATA(SDHID2_2_MARK,              PORT297_FN1),
+       PINMUX_DATA(SDHID2_3_MARK,              PORT298_FN1),
+       PINMUX_DATA(SDHICLK2_MARK,              PORT299_FN1),
+       PINMUX_DATA(SDHICMD2_MARK,              PORT300_FN1),
+
+       /* Port297 - Port300 FN2 */
+       PINMUX_DATA(MSIOF4_RXD_MARK,            PORT297_FN2),
+       PINMUX_DATA(MSIOF4_SYNC_MARK,           PORT298_FN2),
+       PINMUX_DATA(MSIOF4_SCK_MARK,            PORT299_FN2),
+       PINMUX_DATA(MSIOF4_SS1_MARK,            PORT300_FN2),
+
+       /* Port297 - Port300 FN3 */
+       PINMUX_DATA(SCIFB2_RXD_297_MARK,        PORT297_FN3,    MSEL3CR_10_1),
+       PINMUX_DATA(SCIFB2_CTS_298_MARK,        PORT298_FN3,    MSEL3CR_10_1),
+       PINMUX_DATA(SCIFB2_SCK_299_MARK,        PORT299_FN3),
+       PINMUX_DATA(SCIFB2_RTS_300_MARK,        PORT300_FN3),
+
+       /* Port297 - Port300 FN4 */
+       PINMUX_DATA(MSIOF6_RXD_MARK,            PORT297_FN4),
+       PINMUX_DATA(MSIOF6_SYNC_MARK,           PORT298_FN4),
+       PINMUX_DATA(MSIOF6_SCK_MARK,            PORT299_FN4),
+       PINMUX_DATA(MSIOF6_SS1_MARK,            PORT300_FN4),
+
+       /* Port301 */
+       PINMUX_DATA(SDHICD0_MARK,               PORT301_FN1),
+       PINMUX_DATA(IRQ50_MARK,                 PORT301_FN0),
+
+       /* Port302 - Port306 FN1 */
+       PINMUX_DATA(SDHID0_0_MARK,              PORT302_FN1),
+       PINMUX_DATA(SDHID0_1_MARK,              PORT303_FN1),
+       PINMUX_DATA(SDHID0_2_MARK,              PORT304_FN1),
+       PINMUX_DATA(SDHID0_3_MARK,              PORT305_FN1),
+       PINMUX_DATA(SDHICMD0_MARK,              PORT306_FN1),
+
+       /* Port302 - Port306 FN3 */
+       PINMUX_DATA(STMDATA0_1_MARK,            PORT302_FN3),
+       PINMUX_DATA(STMDATA1_1_MARK,            PORT303_FN3),
+       PINMUX_DATA(STMDATA2_1_MARK,            PORT304_FN3),
+       PINMUX_DATA(STMDATA3_1_MARK,            PORT305_FN3),
+       PINMUX_DATA(STMSIDI_1_MARK,             PORT306_FN3),
+
+       /* Port307 */
+       PINMUX_DATA(SDHIWP0_MARK,               PORT307_FN1),
+
+       /* Port308 */
+       PINMUX_DATA(SDHICLK0_MARK,              PORT308_FN1),
+       PINMUX_DATA(STMCLK_1_MARK,              PORT308_FN3),
+
+       /* Port320 - Port329 */
+       PINMUX_DATA(IRQ16_MARK,                 PORT320_FN0),
+       PINMUX_DATA(IRQ17_MARK,                 PORT321_FN0),
+       PINMUX_DATA(IRQ28_MARK,                 PORT322_FN0),
+       PINMUX_DATA(IRQ29_MARK,                 PORT323_FN0),
+       PINMUX_DATA(IRQ30_MARK,                 PORT324_FN0),
+       PINMUX_DATA(IRQ53_MARK,                 PORT325_FN0),
+       PINMUX_DATA(IRQ54_MARK,                 PORT326_FN0),
+       PINMUX_DATA(IRQ55_MARK,                 PORT327_FN0),
+       PINMUX_DATA(IRQ56_MARK,                 PORT328_FN0),
+       PINMUX_DATA(IRQ57_MARK,                 PORT329_FN0),
+};
+
+#define R8A73A4_PIN(pin, cfgs)                 \
+       {                                       \
+               .name = __stringify(PORT##pin), \
+               .enum_id = PORT##pin##_DATA,    \
+               .configs = cfgs,                \
+       }
+
+#define __O    (SH_PFC_PIN_CFG_OUTPUT)
+#define __IO   (SH_PFC_PIN_CFG_INPUT | SH_PFC_PIN_CFG_OUTPUT)
+#define __PUD  (SH_PFC_PIN_CFG_PULL_DOWN | SH_PFC_PIN_CFG_PULL_UP)
+
+#define R8A73A4_PIN_IO_PU_PD(pin)       R8A73A4_PIN(pin, __IO | __PUD)
+#define R8A73A4_PIN_O(pin)              R8A73A4_PIN(pin, __O)
+
+static 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),
+       R8A73A4_PIN_IO_PU_PD(6), R8A73A4_PIN_IO_PU_PD(7),
+       R8A73A4_PIN_IO_PU_PD(8), R8A73A4_PIN_IO_PU_PD(9),
+       R8A73A4_PIN_IO_PU_PD(10), R8A73A4_PIN_IO_PU_PD(11),
+       R8A73A4_PIN_IO_PU_PD(12), R8A73A4_PIN_IO_PU_PD(13),
+       R8A73A4_PIN_IO_PU_PD(14), R8A73A4_PIN_IO_PU_PD(15),
+       R8A73A4_PIN_IO_PU_PD(16), R8A73A4_PIN_IO_PU_PD(17),
+       R8A73A4_PIN_IO_PU_PD(18), R8A73A4_PIN_IO_PU_PD(19),
+       R8A73A4_PIN_IO_PU_PD(20), R8A73A4_PIN_IO_PU_PD(21),
+       R8A73A4_PIN_IO_PU_PD(22), R8A73A4_PIN_IO_PU_PD(23),
+       R8A73A4_PIN_IO_PU_PD(24), R8A73A4_PIN_IO_PU_PD(25),
+       R8A73A4_PIN_IO_PU_PD(26), R8A73A4_PIN_IO_PU_PD(27),
+       R8A73A4_PIN_IO_PU_PD(28), R8A73A4_PIN_IO_PU_PD(29),
+       R8A73A4_PIN_IO_PU_PD(30),
+       R8A73A4_PIN_IO_PU_PD(32), R8A73A4_PIN_IO_PU_PD(33),
+       R8A73A4_PIN_IO_PU_PD(34), R8A73A4_PIN_IO_PU_PD(35),
+       R8A73A4_PIN_IO_PU_PD(36), R8A73A4_PIN_IO_PU_PD(37),
+       R8A73A4_PIN_IO_PU_PD(38), R8A73A4_PIN_IO_PU_PD(39),
+       R8A73A4_PIN_IO_PU_PD(40),
+       R8A73A4_PIN_IO_PU_PD(64), R8A73A4_PIN_IO_PU_PD(65),
+       R8A73A4_PIN_IO_PU_PD(66), R8A73A4_PIN_IO_PU_PD(67),
+       R8A73A4_PIN_IO_PU_PD(68), R8A73A4_PIN_IO_PU_PD(69),
+       R8A73A4_PIN_IO_PU_PD(70), R8A73A4_PIN_IO_PU_PD(71),
+       R8A73A4_PIN_IO_PU_PD(72), R8A73A4_PIN_IO_PU_PD(73),
+       R8A73A4_PIN_O(74), R8A73A4_PIN_IO_PU_PD(75),
+       R8A73A4_PIN_IO_PU_PD(76), R8A73A4_PIN_IO_PU_PD(77),
+       R8A73A4_PIN_IO_PU_PD(78), R8A73A4_PIN_IO_PU_PD(79),
+       R8A73A4_PIN_IO_PU_PD(80), R8A73A4_PIN_IO_PU_PD(81),
+       R8A73A4_PIN_IO_PU_PD(82), R8A73A4_PIN_IO_PU_PD(83),
+       R8A73A4_PIN_IO_PU_PD(84), R8A73A4_PIN_IO_PU_PD(85),
+       R8A73A4_PIN_IO_PU_PD(96), R8A73A4_PIN_IO_PU_PD(97),
+       R8A73A4_PIN_IO_PU_PD(98), R8A73A4_PIN_IO_PU_PD(99),
+       R8A73A4_PIN_IO_PU_PD(100), R8A73A4_PIN_IO_PU_PD(101),
+       R8A73A4_PIN_IO_PU_PD(102), R8A73A4_PIN_IO_PU_PD(103),
+       R8A73A4_PIN_IO_PU_PD(104), R8A73A4_PIN_IO_PU_PD(105),
+       R8A73A4_PIN_IO_PU_PD(106), R8A73A4_PIN_IO_PU_PD(107),
+       R8A73A4_PIN_IO_PU_PD(108), R8A73A4_PIN_IO_PU_PD(109),
+       R8A73A4_PIN_IO_PU_PD(110), R8A73A4_PIN_IO_PU_PD(111),
+       R8A73A4_PIN_IO_PU_PD(112), R8A73A4_PIN_IO_PU_PD(113),
+       R8A73A4_PIN_IO_PU_PD(114), R8A73A4_PIN_IO_PU_PD(115),
+       R8A73A4_PIN_IO_PU_PD(116), R8A73A4_PIN_IO_PU_PD(117),
+       R8A73A4_PIN_IO_PU_PD(118), R8A73A4_PIN_IO_PU_PD(119),
+       R8A73A4_PIN_IO_PU_PD(120), R8A73A4_PIN_IO_PU_PD(121),
+       R8A73A4_PIN_IO_PU_PD(122), R8A73A4_PIN_IO_PU_PD(123),
+       R8A73A4_PIN_IO_PU_PD(124), R8A73A4_PIN_IO_PU_PD(125),
+       R8A73A4_PIN_IO_PU_PD(126),
+       R8A73A4_PIN_IO_PU_PD(128), R8A73A4_PIN_IO_PU_PD(129),
+       R8A73A4_PIN_IO_PU_PD(130), R8A73A4_PIN_IO_PU_PD(131),
+       R8A73A4_PIN_IO_PU_PD(132), R8A73A4_PIN_IO_PU_PD(133),
+       R8A73A4_PIN_IO_PU_PD(134),
+       R8A73A4_PIN_IO_PU_PD(160), R8A73A4_PIN_IO_PU_PD(161),
+       R8A73A4_PIN_IO_PU_PD(162), R8A73A4_PIN_IO_PU_PD(163),
+       R8A73A4_PIN_IO_PU_PD(164), R8A73A4_PIN_IO_PU_PD(165),
+       R8A73A4_PIN_IO_PU_PD(166), R8A73A4_PIN_IO_PU_PD(167),
+       R8A73A4_PIN_IO_PU_PD(168), R8A73A4_PIN_IO_PU_PD(169),
+       R8A73A4_PIN_IO_PU_PD(170), R8A73A4_PIN_IO_PU_PD(171),
+       R8A73A4_PIN_IO_PU_PD(172), R8A73A4_PIN_IO_PU_PD(173),
+       R8A73A4_PIN_IO_PU_PD(174), R8A73A4_PIN_IO_PU_PD(175),
+       R8A73A4_PIN_IO_PU_PD(176), R8A73A4_PIN_IO_PU_PD(177),
+       R8A73A4_PIN_IO_PU_PD(178),
+       R8A73A4_PIN_IO_PU_PD(192), R8A73A4_PIN_IO_PU_PD(193),
+       R8A73A4_PIN_IO_PU_PD(194), R8A73A4_PIN_IO_PU_PD(195),
+       R8A73A4_PIN_IO_PU_PD(196), R8A73A4_PIN_IO_PU_PD(197),
+       R8A73A4_PIN_IO_PU_PD(198), R8A73A4_PIN_IO_PU_PD(199),
+       R8A73A4_PIN_IO_PU_PD(200), R8A73A4_PIN_IO_PU_PD(201),
+       R8A73A4_PIN_IO_PU_PD(202), R8A73A4_PIN_IO_PU_PD(203),
+       R8A73A4_PIN_IO_PU_PD(204), R8A73A4_PIN_IO_PU_PD(205),
+       R8A73A4_PIN_IO_PU_PD(206), R8A73A4_PIN_IO_PU_PD(207),
+       R8A73A4_PIN_IO_PU_PD(208), R8A73A4_PIN_IO_PU_PD(209),
+       R8A73A4_PIN_IO_PU_PD(210), R8A73A4_PIN_IO_PU_PD(211),
+       R8A73A4_PIN_IO_PU_PD(212), R8A73A4_PIN_IO_PU_PD(213),
+       R8A73A4_PIN_IO_PU_PD(214), R8A73A4_PIN_IO_PU_PD(215),
+       R8A73A4_PIN_IO_PU_PD(216), R8A73A4_PIN_IO_PU_PD(217),
+       R8A73A4_PIN_IO_PU_PD(218), R8A73A4_PIN_IO_PU_PD(219),
+       R8A73A4_PIN_IO_PU_PD(220), R8A73A4_PIN_IO_PU_PD(221),
+       R8A73A4_PIN_IO_PU_PD(222),
+       R8A73A4_PIN_IO_PU_PD(224), R8A73A4_PIN_IO_PU_PD(225),
+       R8A73A4_PIN_IO_PU_PD(226), R8A73A4_PIN_IO_PU_PD(227),
+       R8A73A4_PIN_IO_PU_PD(228), R8A73A4_PIN_IO_PU_PD(229),
+       R8A73A4_PIN_IO_PU_PD(230), R8A73A4_PIN_IO_PU_PD(231),
+       R8A73A4_PIN_IO_PU_PD(232), R8A73A4_PIN_IO_PU_PD(233),
+       R8A73A4_PIN_IO_PU_PD(234), R8A73A4_PIN_IO_PU_PD(235),
+       R8A73A4_PIN_IO_PU_PD(236), R8A73A4_PIN_IO_PU_PD(237),
+       R8A73A4_PIN_IO_PU_PD(238), R8A73A4_PIN_IO_PU_PD(239),
+       R8A73A4_PIN_IO_PU_PD(240), R8A73A4_PIN_IO_PU_PD(241),
+       R8A73A4_PIN_IO_PU_PD(242), R8A73A4_PIN_IO_PU_PD(243),
+       R8A73A4_PIN_IO_PU_PD(244), R8A73A4_PIN_IO_PU_PD(245),
+       R8A73A4_PIN_IO_PU_PD(246), R8A73A4_PIN_IO_PU_PD(247),
+       R8A73A4_PIN_IO_PU_PD(248), R8A73A4_PIN_IO_PU_PD(249),
+       R8A73A4_PIN_IO_PU_PD(250),
+       R8A73A4_PIN_IO_PU_PD(256), R8A73A4_PIN_IO_PU_PD(257),
+       R8A73A4_PIN_IO_PU_PD(258), R8A73A4_PIN_IO_PU_PD(259),
+       R8A73A4_PIN_IO_PU_PD(260), R8A73A4_PIN_IO_PU_PD(261),
+       R8A73A4_PIN_IO_PU_PD(262), R8A73A4_PIN_IO_PU_PD(263),
+       R8A73A4_PIN_IO_PU_PD(264), R8A73A4_PIN_IO_PU_PD(265),
+       R8A73A4_PIN_IO_PU_PD(266), R8A73A4_PIN_IO_PU_PD(267),
+       R8A73A4_PIN_IO_PU_PD(268), R8A73A4_PIN_IO_PU_PD(269),
+       R8A73A4_PIN_IO_PU_PD(270), R8A73A4_PIN_IO_PU_PD(271),
+       R8A73A4_PIN_IO_PU_PD(272), R8A73A4_PIN_IO_PU_PD(273),
+       R8A73A4_PIN_IO_PU_PD(274), R8A73A4_PIN_IO_PU_PD(275),
+       R8A73A4_PIN_IO_PU_PD(276), R8A73A4_PIN_IO_PU_PD(277),
+       R8A73A4_PIN_IO_PU_PD(278), R8A73A4_PIN_IO_PU_PD(279),
+       R8A73A4_PIN_IO_PU_PD(280), R8A73A4_PIN_IO_PU_PD(281),
+       R8A73A4_PIN_IO_PU_PD(282), R8A73A4_PIN_IO_PU_PD(283),
+       R8A73A4_PIN_O(288), R8A73A4_PIN_IO_PU_PD(289),
+       R8A73A4_PIN_IO_PU_PD(290), R8A73A4_PIN_IO_PU_PD(291),
+       R8A73A4_PIN_IO_PU_PD(292), R8A73A4_PIN_IO_PU_PD(293),
+       R8A73A4_PIN_IO_PU_PD(294), R8A73A4_PIN_IO_PU_PD(295),
+       R8A73A4_PIN_IO_PU_PD(296), R8A73A4_PIN_IO_PU_PD(297),
+       R8A73A4_PIN_IO_PU_PD(298), R8A73A4_PIN_IO_PU_PD(299),
+       R8A73A4_PIN_IO_PU_PD(300), R8A73A4_PIN_IO_PU_PD(301),
+       R8A73A4_PIN_IO_PU_PD(302), R8A73A4_PIN_IO_PU_PD(303),
+       R8A73A4_PIN_IO_PU_PD(304), R8A73A4_PIN_IO_PU_PD(305),
+       R8A73A4_PIN_IO_PU_PD(306), R8A73A4_PIN_IO_PU_PD(307),
+       R8A73A4_PIN_IO_PU_PD(308),
+       R8A73A4_PIN_IO_PU_PD(320), R8A73A4_PIN_IO_PU_PD(321),
+       R8A73A4_PIN_IO_PU_PD(322), R8A73A4_PIN_IO_PU_PD(323),
+       R8A73A4_PIN_IO_PU_PD(324), R8A73A4_PIN_IO_PU_PD(325),
+       R8A73A4_PIN_IO_PU_PD(326), R8A73A4_PIN_IO_PU_PD(327),
+       R8A73A4_PIN_IO_PU_PD(328), R8A73A4_PIN_IO_PU_PD(329),
+};
+
+static const struct pinmux_range pinmux_ranges[] = {
+       {.begin = 0, .end = 30,},
+       {.begin = 32, .end = 40,},
+       {.begin = 64, .end = 85,},
+       {.begin = 96, .end = 126,},
+       {.begin = 128, .end = 134,},
+       {.begin = 160, .end = 178,},
+       {.begin = 192, .end = 222,},
+       {.begin = 224, .end = 250,},
+       {.begin = 256, .end = 283,},
+       {.begin = 288, .end = 308,},
+       {.begin = 320, .end = 329,},
+};
+
+/* - IRQC ------------------------------------------------------------------- */
+#define IRQC_PINS_MUX(pin, irq_mark)                           \
+static const unsigned int irqc_irq##irq_mark##_pins[] = {      \
+       pin,                                                    \
+};                                                             \
+static const unsigned int irqc_irq##irq_mark##_mux[] = {       \
+       IRQ##irq_mark##_MARK,                                   \
+}
+IRQC_PINS_MUX(0, 0);
+IRQC_PINS_MUX(1, 1);
+IRQC_PINS_MUX(2, 2);
+IRQC_PINS_MUX(3, 3);
+IRQC_PINS_MUX(4, 4);
+IRQC_PINS_MUX(5, 5);
+IRQC_PINS_MUX(6, 6);
+IRQC_PINS_MUX(7, 7);
+IRQC_PINS_MUX(8, 8);
+IRQC_PINS_MUX(9, 9);
+IRQC_PINS_MUX(10, 10);
+IRQC_PINS_MUX(11, 11);
+IRQC_PINS_MUX(12, 12);
+IRQC_PINS_MUX(13, 13);
+IRQC_PINS_MUX(14, 14);
+IRQC_PINS_MUX(15, 15);
+IRQC_PINS_MUX(66, 40);
+IRQC_PINS_MUX(84, 19);
+IRQC_PINS_MUX(85, 18);
+IRQC_PINS_MUX(102, 41);
+IRQC_PINS_MUX(103, 42);
+IRQC_PINS_MUX(109, 43);
+IRQC_PINS_MUX(110, 44);
+IRQC_PINS_MUX(111, 45);
+IRQC_PINS_MUX(112, 46);
+IRQC_PINS_MUX(113, 47);
+IRQC_PINS_MUX(114, 48);
+IRQC_PINS_MUX(115, 49);
+IRQC_PINS_MUX(160, 20);
+IRQC_PINS_MUX(161, 21);
+IRQC_PINS_MUX(162, 22);
+IRQC_PINS_MUX(163, 23);
+IRQC_PINS_MUX(175, 24);
+IRQC_PINS_MUX(176, 25);
+IRQC_PINS_MUX(177, 26);
+IRQC_PINS_MUX(178, 27);
+IRQC_PINS_MUX(192, 31);
+IRQC_PINS_MUX(193, 32);
+IRQC_PINS_MUX(194, 33);
+IRQC_PINS_MUX(195, 34);
+IRQC_PINS_MUX(196, 35);
+IRQC_PINS_MUX(197, 36);
+IRQC_PINS_MUX(198, 37);
+IRQC_PINS_MUX(199, 38);
+IRQC_PINS_MUX(200, 39);
+IRQC_PINS_MUX(290, 51);
+IRQC_PINS_MUX(296, 52);
+IRQC_PINS_MUX(301, 50);
+IRQC_PINS_MUX(320, 16);
+IRQC_PINS_MUX(321, 17);
+IRQC_PINS_MUX(322, 28);
+IRQC_PINS_MUX(323, 29);
+IRQC_PINS_MUX(324, 30);
+IRQC_PINS_MUX(325, 53);
+IRQC_PINS_MUX(326, 54);
+IRQC_PINS_MUX(327, 55);
+IRQC_PINS_MUX(328, 56);
+IRQC_PINS_MUX(329, 57);
+/* - SCIFA0 ----------------------------------------------------------------- */
+static const unsigned int scifa0_data_pins[] = {
+       /* SCIFA0_RXD, SCIFA0_TXD */
+       117, 116,
+};
+static const unsigned int scifa0_data_mux[] = {
+       SCIFA0_RXD_MARK, SCIFA0_TXD_MARK,
+};
+static const unsigned int scifa0_clk_pins[] = {
+       /* SCIFA0_SCK */
+       34,
+};
+static const unsigned int scifa0_clk_mux[] = {
+       SCIFA0_SCK_MARK,
+};
+static const unsigned int scifa0_ctrl_pins[] = {
+       /* SCIFA0_RTS, SCIFA0_CTS */
+       32, 33,
+};
+static const unsigned int scifa0_ctrl_mux[] = {
+       SCIFA0_RTS_MARK, SCIFA0_CTS_MARK,
+};
+/* - SCIFA1 ----------------------------------------------------------------- */
+static const unsigned int scifa1_data_pins[] = {
+       /* SCIFA1_RXD, SCIFA1_TXD */
+       119, 118,
+};
+static const unsigned int scifa1_data_mux[] = {
+       SCIFA1_RXD_MARK, SCIFA1_TXD_MARK,
+};
+static const unsigned int scifa1_clk_pins[] = {
+       /* SCIFA1_SCK */
+       37,
+};
+static const unsigned int scifa1_clk_mux[] = {
+       SCIFA1_SCK_MARK,
+};
+static const unsigned int scifa1_ctrl_pins[] = {
+       /* SCIFA1_RTS, SCIFA1_CTS */
+       35, 36,
+};
+static const unsigned int scifa1_ctrl_mux[] = {
+       SCIFA1_RTS_MARK, SCIFA1_CTS_MARK,
+};
+/* - SCIFB0 ----------------------------------------------------------------- */
+static const unsigned int scifb0_data_pins[] = {
+       /* SCIFB0_RXD, SCIFB0_TXD */
+       123, 122,
+};
+static const unsigned int scifb0_data_mux[] = {
+       SCIFB0_RXD_MARK, SCIFB0_TXD_MARK,
+};
+static const unsigned int scifb0_clk_pins[] = {
+       /* SCIFB0_SCK */
+       40,
+};
+static const unsigned int scifb0_clk_mux[] = {
+       SCIFB0_SCK_MARK,
+};
+static const unsigned int scifb0_ctrl_pins[] = {
+       /* SCIFB0_RTS, SCIFB0_CTS */
+       38, 39,
+};
+static const unsigned int scifb0_ctrl_mux[] = {
+       SCIFB0_RTS_MARK, SCIFB0_CTS_MARK,
+};
+/* - SCIFB1 ----------------------------------------------------------------- */
+static const unsigned int scifb1_data_pins[] = {
+       /* SCIFB1_RXD, SCIFB1_TXD */
+       27, 26,
+};
+static const unsigned int scifb1_data_mux[] = {
+       SCIFB1_RXD_27_MARK, SCIFB1_TXD_26_MARK,
+};
+static const unsigned int scifb1_clk_pins[] = {
+       /* SCIFB1_SCK */
+       28,
+};
+static const unsigned int scifb1_clk_mux[] = {
+       SCIFB1_SCK_28_MARK,
+};
+static const unsigned int scifb1_ctrl_pins[] = {
+       /* SCIFB1_RTS, SCIFB1_CTS */
+       24, 25,
+};
+static const unsigned int scifb1_ctrl_mux[] = {
+       SCIFB1_RTS_24_MARK, SCIFB1_CTS_25_MARK,
+};
+static const unsigned int scifb1_data_b_pins[] = {
+       /* SCIFB1_RXD, SCIFB1_TXD */
+       72, 67,
+};
+static const unsigned int scifb1_data_b_mux[] = {
+       SCIFB1_RXD_72_MARK, SCIFB1_TXD_67_MARK,
+};
+static const unsigned int scifb1_clk_b_pins[] = {
+       /* SCIFB1_SCK */
+       261,
+};
+static const unsigned int scifb1_clk_b_mux[] = {
+       SCIFB1_SCK_261_MARK,
+};
+static const unsigned int scifb1_ctrl_b_pins[] = {
+       /* SCIFB1_RTS, SCIFB1_CTS */
+       70, 71,
+};
+static const unsigned int scifb1_ctrl_b_mux[] = {
+       SCIFB1_RTS_70_MARK, SCIFB1_CTS_71_MARK,
+};
+/* - SCIFB2 ----------------------------------------------------------------- */
+static const unsigned int scifb2_data_pins[] = {
+       /* SCIFB2_RXD, SCIFB2_TXD */
+       69, 68,
+};
+static const unsigned int scifb2_data_mux[] = {
+       SCIFB2_RXD_69_MARK, SCIFB2_TXD_68_MARK,
+};
+static const unsigned int scifb2_clk_pins[] = {
+       /* SCIFB2_SCK */
+       262,
+};
+static const unsigned int scifb2_clk_mux[] = {
+       SCIFB2_SCK_262_MARK,
+};
+static const unsigned int scifb2_ctrl_pins[] = {
+       /* SCIFB2_RTS, SCIFB2_CTS */
+       73, 66,
+};
+static const unsigned int scifb2_ctrl_mux[] = {
+       SCIFB2_RTS_73_MARK, SCIFB2_CTS_66_MARK,
+};
+static const unsigned int scifb2_data_b_pins[] = {
+       /* SCIFB2_RXD, SCIFB2_TXD */
+       297, 295,
+};
+static const unsigned int scifb2_data_b_mux[] = {
+       SCIFB2_RXD_297_MARK, SCIFB2_TXD_295_MARK,
+};
+static const unsigned int scifb2_clk_b_pins[] = {
+       /* SCIFB2_SCK */
+       299,
+};
+static const unsigned int scifb2_clk_b_mux[] = {
+       SCIFB2_SCK_299_MARK,
+};
+static const unsigned int scifb2_ctrl_b_pins[] = {
+       /* SCIFB2_RTS, SCIFB2_CTS */
+       300, 298,
+};
+static const unsigned int scifb2_ctrl_b_mux[] = {
+       SCIFB2_RTS_300_MARK, SCIFB2_CTS_298_MARK,
+};
+/* - SCIFB3 ----------------------------------------------------------------- */
+static const unsigned int scifb3_data_pins[] = {
+       /* SCIFB3_RXD, SCIFB3_TXD */
+       22, 21,
+};
+static const unsigned int scifb3_data_mux[] = {
+       SCIFB3_RXD_22_MARK, SCIFB3_TXD_21_MARK,
+};
+static const unsigned int scifb3_clk_pins[] = {
+       /* SCIFB3_SCK */
+       23,
+};
+static const unsigned int scifb3_clk_mux[] = {
+       SCIFB3_SCK_23_MARK,
+};
+static const unsigned int scifb3_ctrl_pins[] = {
+       /* SCIFB3_RTS, SCIFB3_CTS */
+       19, 20,
+};
+static const unsigned int scifb3_ctrl_mux[] = {
+       SCIFB3_RTS_19_MARK, SCIFB3_CTS_20_MARK,
+};
+static const unsigned int scifb3_data_b_pins[] = {
+       /* SCIFB3_RXD, SCIFB3_TXD */
+       120, 121,
+};
+static const unsigned int scifb3_data_b_mux[] = {
+       SCIFB3_RXD_120_MARK, SCIFB3_TXD_121_MARK,
+};
+static const unsigned int scifb3_clk_b_pins[] = {
+       /* SCIFB3_SCK */
+       40,
+};
+static const unsigned int scifb3_clk_b_mux[] = {
+       SCIFB3_SCK_40_MARK,
+};
+static const unsigned int scifb3_ctrl_b_pins[] = {
+       /* SCIFB3_RTS, SCIFB3_CTS */
+       38, 39,
+};
+static const unsigned int scifb3_ctrl_b_mux[] = {
+       SCIFB3_RTS_38_MARK, SCIFB3_CTS_39_MARK,
+};
+
+static const struct sh_pfc_pin_group pinmux_groups[] = {
+       SH_PFC_PIN_GROUP(irqc_irq0),
+       SH_PFC_PIN_GROUP(irqc_irq1),
+       SH_PFC_PIN_GROUP(irqc_irq2),
+       SH_PFC_PIN_GROUP(irqc_irq3),
+       SH_PFC_PIN_GROUP(irqc_irq4),
+       SH_PFC_PIN_GROUP(irqc_irq5),
+       SH_PFC_PIN_GROUP(irqc_irq6),
+       SH_PFC_PIN_GROUP(irqc_irq7),
+       SH_PFC_PIN_GROUP(irqc_irq8),
+       SH_PFC_PIN_GROUP(irqc_irq9),
+       SH_PFC_PIN_GROUP(irqc_irq10),
+       SH_PFC_PIN_GROUP(irqc_irq11),
+       SH_PFC_PIN_GROUP(irqc_irq12),
+       SH_PFC_PIN_GROUP(irqc_irq13),
+       SH_PFC_PIN_GROUP(irqc_irq14),
+       SH_PFC_PIN_GROUP(irqc_irq15),
+       SH_PFC_PIN_GROUP(irqc_irq16),
+       SH_PFC_PIN_GROUP(irqc_irq17),
+       SH_PFC_PIN_GROUP(irqc_irq18),
+       SH_PFC_PIN_GROUP(irqc_irq19),
+       SH_PFC_PIN_GROUP(irqc_irq20),
+       SH_PFC_PIN_GROUP(irqc_irq21),
+       SH_PFC_PIN_GROUP(irqc_irq22),
+       SH_PFC_PIN_GROUP(irqc_irq23),
+       SH_PFC_PIN_GROUP(irqc_irq24),
+       SH_PFC_PIN_GROUP(irqc_irq25),
+       SH_PFC_PIN_GROUP(irqc_irq26),
+       SH_PFC_PIN_GROUP(irqc_irq27),
+       SH_PFC_PIN_GROUP(irqc_irq28),
+       SH_PFC_PIN_GROUP(irqc_irq29),
+       SH_PFC_PIN_GROUP(irqc_irq30),
+       SH_PFC_PIN_GROUP(irqc_irq31),
+       SH_PFC_PIN_GROUP(irqc_irq32),
+       SH_PFC_PIN_GROUP(irqc_irq33),
+       SH_PFC_PIN_GROUP(irqc_irq34),
+       SH_PFC_PIN_GROUP(irqc_irq35),
+       SH_PFC_PIN_GROUP(irqc_irq36),
+       SH_PFC_PIN_GROUP(irqc_irq37),
+       SH_PFC_PIN_GROUP(irqc_irq38),
+       SH_PFC_PIN_GROUP(irqc_irq39),
+       SH_PFC_PIN_GROUP(irqc_irq40),
+       SH_PFC_PIN_GROUP(irqc_irq41),
+       SH_PFC_PIN_GROUP(irqc_irq42),
+       SH_PFC_PIN_GROUP(irqc_irq43),
+       SH_PFC_PIN_GROUP(irqc_irq44),
+       SH_PFC_PIN_GROUP(irqc_irq45),
+       SH_PFC_PIN_GROUP(irqc_irq46),
+       SH_PFC_PIN_GROUP(irqc_irq47),
+       SH_PFC_PIN_GROUP(irqc_irq48),
+       SH_PFC_PIN_GROUP(irqc_irq49),
+       SH_PFC_PIN_GROUP(irqc_irq50),
+       SH_PFC_PIN_GROUP(irqc_irq51),
+       SH_PFC_PIN_GROUP(irqc_irq52),
+       SH_PFC_PIN_GROUP(irqc_irq53),
+       SH_PFC_PIN_GROUP(irqc_irq54),
+       SH_PFC_PIN_GROUP(irqc_irq55),
+       SH_PFC_PIN_GROUP(irqc_irq56),
+       SH_PFC_PIN_GROUP(irqc_irq57),
+       SH_PFC_PIN_GROUP(scifa0_data),
+       SH_PFC_PIN_GROUP(scifa0_clk),
+       SH_PFC_PIN_GROUP(scifa0_ctrl),
+       SH_PFC_PIN_GROUP(scifa1_data),
+       SH_PFC_PIN_GROUP(scifa1_clk),
+       SH_PFC_PIN_GROUP(scifa1_ctrl),
+       SH_PFC_PIN_GROUP(scifb0_data),
+       SH_PFC_PIN_GROUP(scifb0_clk),
+       SH_PFC_PIN_GROUP(scifb0_ctrl),
+       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_ctrl_b),
+       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(scifb3_data),
+       SH_PFC_PIN_GROUP(scifb3_clk),
+       SH_PFC_PIN_GROUP(scifb3_ctrl),
+       SH_PFC_PIN_GROUP(scifb3_data_b),
+       SH_PFC_PIN_GROUP(scifb3_clk_b),
+       SH_PFC_PIN_GROUP(scifb3_ctrl_b),
+};
+
+static const char * const irqc_groups[] = {
+       "irqc_irq0",
+       "irqc_irq1",
+       "irqc_irq2",
+       "irqc_irq3",
+       "irqc_irq4",
+       "irqc_irq5",
+       "irqc_irq6",
+       "irqc_irq7",
+       "irqc_irq8",
+       "irqc_irq9",
+       "irqc_irq10",
+       "irqc_irq11",
+       "irqc_irq12",
+       "irqc_irq13",
+       "irqc_irq14",
+       "irqc_irq15",
+       "irqc_irq16",
+       "irqc_irq17",
+       "irqc_irq18",
+       "irqc_irq19",
+       "irqc_irq20",
+       "irqc_irq21",
+       "irqc_irq22",
+       "irqc_irq23",
+       "irqc_irq24",
+       "irqc_irq25",
+       "irqc_irq26",
+       "irqc_irq27",
+       "irqc_irq28",
+       "irqc_irq29",
+       "irqc_irq30",
+       "irqc_irq31",
+       "irqc_irq32",
+       "irqc_irq33",
+       "irqc_irq34",
+       "irqc_irq35",
+       "irqc_irq36",
+       "irqc_irq37",
+       "irqc_irq38",
+       "irqc_irq39",
+       "irqc_irq40",
+       "irqc_irq41",
+       "irqc_irq42",
+       "irqc_irq43",
+       "irqc_irq44",
+       "irqc_irq45",
+       "irqc_irq46",
+       "irqc_irq47",
+       "irqc_irq48",
+       "irqc_irq49",
+       "irqc_irq50",
+       "irqc_irq51",
+       "irqc_irq52",
+       "irqc_irq53",
+       "irqc_irq54",
+       "irqc_irq55",
+       "irqc_irq56",
+       "irqc_irq57",
+};
+
+static const char * const scifa0_groups[] = {
+       "scifa0_data",
+       "scifa0_clk",
+       "scifa0_ctrl",
+};
+
+static const char * const scifa1_groups[] = {
+       "scifa1_data",
+       "scifa1_clk",
+       "scifa1_ctrl",
+};
+
+static const char * const scifb0_groups[] = {
+       "scifb0_data",
+       "scifb0_clk",
+       "scifb0_ctrl",
+};
+
+static const char * const scifb1_groups[] = {
+       "scifb1_data",
+       "scifb1_clk",
+       "scifb1_ctrl",
+       "scifb1_data_b",
+       "scifb1_clk_b",
+       "scifb1_ctrl_b",
+};
+
+static const char * const scifb2_groups[] = {
+       "scifb2_data",
+       "scifb2_clk",
+       "scifb2_ctrl",
+       "scifb2_data_b",
+       "scifb2_clk_b",
+       "scifb2_ctrl_b",
+};
+
+static const char * const scifb3_groups[] = {
+       "scifb3_data",
+       "scifb3_clk",
+       "scifb3_ctrl",
+       "scifb3_data_b",
+       "scifb3_clk_b",
+       "scifb3_ctrl_b",
+};
+
+static const struct sh_pfc_function pinmux_functions[] = {
+       SH_PFC_FUNCTION(irqc),
+       SH_PFC_FUNCTION(scifa0),
+       SH_PFC_FUNCTION(scifa1),
+       SH_PFC_FUNCTION(scifb0),
+       SH_PFC_FUNCTION(scifb1),
+       SH_PFC_FUNCTION(scifb2),
+       SH_PFC_FUNCTION(scifb3),
+};
+
+#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),
+       PORTCR(2, 0xe6050002),
+       PORTCR(3, 0xe6050003),
+       PORTCR(4, 0xe6050004),
+       PORTCR(5, 0xe6050005),
+       PORTCR(6, 0xe6050006),
+       PORTCR(7, 0xe6050007),
+       PORTCR(8, 0xe6050008),
+       PORTCR(9, 0xe6050009),
+       PORTCR(10, 0xe605000A),
+       PORTCR(11, 0xe605000B),
+       PORTCR(12, 0xe605000C),
+       PORTCR(13, 0xe605000D),
+       PORTCR(14, 0xe605000E),
+       PORTCR(15, 0xe605000F),
+       PORTCR(16, 0xe6050010),
+       PORTCR(17, 0xe6050011),
+       PORTCR(18, 0xe6050012),
+       PORTCR(19, 0xe6050013),
+       PORTCR(20, 0xe6050014),
+       PORTCR(21, 0xe6050015),
+       PORTCR(22, 0xe6050016),
+       PORTCR(23, 0xe6050017),
+       PORTCR(24, 0xe6050018),
+       PORTCR(25, 0xe6050019),
+       PORTCR(26, 0xe605001A),
+       PORTCR(27, 0xe605001B),
+       PORTCR(28, 0xe605001C),
+       PORTCR(29, 0xe605001D),
+       PORTCR(30, 0xe605001E),
+       PORTCR(32, 0xe6051020),
+       PORTCR(33, 0xe6051021),
+       PORTCR(34, 0xe6051022),
+       PORTCR(35, 0xe6051023),
+       PORTCR(36, 0xe6051024),
+       PORTCR(37, 0xe6051025),
+       PORTCR(38, 0xe6051026),
+       PORTCR(39, 0xe6051027),
+       PORTCR(40, 0xe6051028),
+       PORTCR(64, 0xe6050040),
+       PORTCR(65, 0xe6050041),
+       PORTCR(66, 0xe6050042),
+       PORTCR(67, 0xe6050043),
+       PORTCR(68, 0xe6050044),
+       PORTCR(69, 0xe6050045),
+       PORTCR(70, 0xe6050046),
+       PORTCR(71, 0xe6050047),
+       PORTCR(72, 0xe6050048),
+       PORTCR(73, 0xe6050049),
+       PORTCR(74, 0xe605004A),
+       PORTCR(75, 0xe605004B),
+       PORTCR(76, 0xe605004C),
+       PORTCR(77, 0xe605004D),
+       PORTCR(78, 0xe605004E),
+       PORTCR(79, 0xe605004F),
+       PORTCR(80, 0xe6050050),
+       PORTCR(81, 0xe6050051),
+       PORTCR(82, 0xe6050052),
+       PORTCR(83, 0xe6050053),
+       PORTCR(84, 0xe6050054),
+       PORTCR(85, 0xe6050055),
+       PORTCR(96, 0xe6051060),
+       PORTCR(97, 0xe6051061),
+       PORTCR(98, 0xe6051062),
+       PORTCR(99, 0xe6051063),
+       PORTCR(100, 0xe6051064),
+       PORTCR(101, 0xe6051065),
+       PORTCR(102, 0xe6051066),
+       PORTCR(103, 0xe6051067),
+       PORTCR(104, 0xe6051068),
+       PORTCR(105, 0xe6051069),
+       PORTCR(106, 0xe605106A),
+       PORTCR(107, 0xe605106B),
+       PORTCR(108, 0xe605106C),
+       PORTCR(109, 0xe605106D),
+       PORTCR(110, 0xe605106E),
+       PORTCR(111, 0xe605106F),
+       PORTCR(112, 0xe6051070),
+       PORTCR(113, 0xe6051071),
+       PORTCR(114, 0xe6051072),
+       PORTCR(115, 0xe6051073),
+       PORTCR(116, 0xe6051074),
+       PORTCR(117, 0xe6051075),
+       PORTCR(118, 0xe6051076),
+       PORTCR(119, 0xe6051077),
+       PORTCR(120, 0xe6051078),
+       PORTCR(121, 0xe6051079),
+       PORTCR(122, 0xe605107A),
+       PORTCR(123, 0xe605107B),
+       PORTCR(124, 0xe605107C),
+       PORTCR(125, 0xe605107D),
+       PORTCR(126, 0xe605107E),
+       PORTCR(128, 0xe6051080),
+       PORTCR(129, 0xe6051081),
+       PORTCR(130, 0xe6051082),
+       PORTCR(131, 0xe6051083),
+       PORTCR(132, 0xe6051084),
+       PORTCR(133, 0xe6051085),
+       PORTCR(134, 0xe6051086),
+       PORTCR(160, 0xe60520A0),
+       PORTCR(161, 0xe60520A1),
+       PORTCR(162, 0xe60520A2),
+       PORTCR(163, 0xe60520A3),
+       PORTCR(164, 0xe60520A4),
+       PORTCR(165, 0xe60520A5),
+       PORTCR(166, 0xe60520A6),
+       PORTCR(167, 0xe60520A7),
+       PORTCR(168, 0xe60520A8),
+       PORTCR(169, 0xe60520A9),
+       PORTCR(170, 0xe60520AA),
+       PORTCR(171, 0xe60520AB),
+       PORTCR(172, 0xe60520AC),
+       PORTCR(173, 0xe60520AD),
+       PORTCR(174, 0xe60520AE),
+       PORTCR(175, 0xe60520AF),
+       PORTCR(176, 0xe60520B0),
+       PORTCR(177, 0xe60520B1),
+       PORTCR(178, 0xe60520B2),
+       PORTCR(192, 0xe60520C0),
+       PORTCR(193, 0xe60520C1),
+       PORTCR(194, 0xe60520C2),
+       PORTCR(195, 0xe60520C3),
+       PORTCR(196, 0xe60520C4),
+       PORTCR(197, 0xe60520C5),
+       PORTCR(198, 0xe60520C6),
+       PORTCR(199, 0xe60520C7),
+       PORTCR(200, 0xe60520C8),
+       PORTCR(201, 0xe60520C9),
+       PORTCR(202, 0xe60520CA),
+       PORTCR(203, 0xe60520CB),
+       PORTCR(204, 0xe60520CC),
+       PORTCR(205, 0xe60520CD),
+       PORTCR(206, 0xe60520CE),
+       PORTCR(207, 0xe60520CF),
+       PORTCR(208, 0xe60520D0),
+       PORTCR(209, 0xe60520D1),
+       PORTCR(210, 0xe60520D2),
+       PORTCR(211, 0xe60520D3),
+       PORTCR(212, 0xe60520D4),
+       PORTCR(213, 0xe60520D5),
+       PORTCR(214, 0xe60520D6),
+       PORTCR(215, 0xe60520D7),
+       PORTCR(216, 0xe60520D8),
+       PORTCR(217, 0xe60520D9),
+       PORTCR(218, 0xe60520DA),
+       PORTCR(219, 0xe60520DB),
+       PORTCR(220, 0xe60520DC),
+       PORTCR(221, 0xe60520DD),
+       PORTCR(222, 0xe60520DE),
+       PORTCR(224, 0xe60520E0),
+       PORTCR(225, 0xe60520E1),
+       PORTCR(226, 0xe60520E2),
+       PORTCR(227, 0xe60520E3),
+       PORTCR(228, 0xe60520E4),
+       PORTCR(229, 0xe60520E5),
+       PORTCR(230, 0xe60520e6),
+       PORTCR(231, 0xe60520E7),
+       PORTCR(232, 0xe60520E8),
+       PORTCR(233, 0xe60520E9),
+       PORTCR(234, 0xe60520EA),
+       PORTCR(235, 0xe60520EB),
+       PORTCR(236, 0xe60520EC),
+       PORTCR(237, 0xe60520ED),
+       PORTCR(238, 0xe60520EE),
+       PORTCR(239, 0xe60520EF),
+       PORTCR(240, 0xe60520F0),
+       PORTCR(241, 0xe60520F1),
+       PORTCR(242, 0xe60520F2),
+       PORTCR(243, 0xe60520F3),
+       PORTCR(244, 0xe60520F4),
+       PORTCR(245, 0xe60520F5),
+       PORTCR(246, 0xe60520F6),
+       PORTCR(247, 0xe60520F7),
+       PORTCR(248, 0xe60520F8),
+       PORTCR(249, 0xe60520F9),
+       PORTCR(250, 0xe60520FA),
+       PORTCR(256, 0xe6052100),
+       PORTCR(257, 0xe6052101),
+       PORTCR(258, 0xe6052102),
+       PORTCR(259, 0xe6052103),
+       PORTCR(260, 0xe6052104),
+       PORTCR(261, 0xe6052105),
+       PORTCR(262, 0xe6052106),
+       PORTCR(263, 0xe6052107),
+       PORTCR(264, 0xe6052108),
+       PORTCR(265, 0xe6052109),
+       PORTCR(266, 0xe605210A),
+       PORTCR(267, 0xe605210B),
+       PORTCR(268, 0xe605210C),
+       PORTCR(269, 0xe605210D),
+       PORTCR(270, 0xe605210E),
+       PORTCR(271, 0xe605210F),
+       PORTCR(272, 0xe6052110),
+       PORTCR(273, 0xe6052111),
+       PORTCR(274, 0xe6052112),
+       PORTCR(275, 0xe6052113),
+       PORTCR(276, 0xe6052114),
+       PORTCR(277, 0xe6052115),
+       PORTCR(278, 0xe6052116),
+       PORTCR(279, 0xe6052117),
+       PORTCR(280, 0xe6052118),
+       PORTCR(281, 0xe6052119),
+       PORTCR(282, 0xe605211A),
+       PORTCR(283, 0xe605211B),
+       PORTCR(288, 0xe6053120),
+       PORTCR(289, 0xe6053121),
+       PORTCR(290, 0xe6053122),
+       PORTCR(291, 0xe6053123),
+       PORTCR(292, 0xe6053124),
+       PORTCR(293, 0xe6053125),
+       PORTCR(294, 0xe6053126),
+       PORTCR(295, 0xe6053127),
+       PORTCR(296, 0xe6053128),
+       PORTCR(297, 0xe6053129),
+       PORTCR(298, 0xe605312A),
+       PORTCR(299, 0xe605312B),
+       PORTCR(300, 0xe605312C),
+       PORTCR(301, 0xe605312D),
+       PORTCR(302, 0xe605312E),
+       PORTCR(303, 0xe605312F),
+       PORTCR(304, 0xe6053130),
+       PORTCR(305, 0xe6053131),
+       PORTCR(306, 0xe6053132),
+       PORTCR(307, 0xe6053133),
+       PORTCR(308, 0xe6053134),
+       PORTCR(320, 0xe6053140),
+       PORTCR(321, 0xe6053141),
+       PORTCR(322, 0xe6053142),
+       PORTCR(323, 0xe6053143),
+       PORTCR(324, 0xe6053144),
+       PORTCR(325, 0xe6053145),
+       PORTCR(326, 0xe6053146),
+       PORTCR(327, 0xe6053147),
+       PORTCR(328, 0xe6053148),
+       PORTCR(329, 0xe6053149),
+
+       { PINMUX_CFG_REG("MSEL1CR", 0xe605800c, 32, 1) {
+                       MSEL1CR_31_0, MSEL1CR_31_1,
+                       0, 0,
+                       0, 0,
+                       0, 0,
+                       MSEL1CR_27_0, MSEL1CR_27_1,
+                       0, 0,
+                       MSEL1CR_25_0, MSEL1CR_25_1,
+                       MSEL1CR_24_0, MSEL1CR_24_1,
+                       0, 0,
+                       MSEL1CR_22_0, MSEL1CR_22_1,
+                       MSEL1CR_21_0, MSEL1CR_21_1,
+                       MSEL1CR_20_0, MSEL1CR_20_1,
+                       MSEL1CR_19_0, MSEL1CR_19_1,
+                       MSEL1CR_18_0, MSEL1CR_18_1,
+                       MSEL1CR_17_0, MSEL1CR_17_1,
+                       MSEL1CR_16_0, MSEL1CR_16_1,
+                       MSEL1CR_15_0, MSEL1CR_15_1,
+                       MSEL1CR_14_0, MSEL1CR_14_1,
+                       MSEL1CR_13_0, MSEL1CR_13_1,
+                       MSEL1CR_12_0, MSEL1CR_12_1,
+                       MSEL1CR_11_0, MSEL1CR_11_1,
+                       MSEL1CR_10_0, MSEL1CR_10_1,
+                       MSEL1CR_09_0, MSEL1CR_09_1,
+                       MSEL1CR_08_0, MSEL1CR_08_1,
+                       MSEL1CR_07_0, MSEL1CR_07_1,
+                       MSEL1CR_06_0, MSEL1CR_06_1,
+                       MSEL1CR_05_0, MSEL1CR_05_1,
+                       MSEL1CR_04_0, MSEL1CR_04_1,
+                       MSEL1CR_03_0, MSEL1CR_03_1,
+                       MSEL1CR_02_0, MSEL1CR_02_1,
+                       MSEL1CR_01_0, MSEL1CR_01_1,
+                       MSEL1CR_00_0, MSEL1CR_00_1,
+               }
+       },
+       { PINMUX_CFG_REG("MSEL3CR", 0xe6058020, 32, 1) {
+                       MSEL3CR_31_0, MSEL3CR_31_1,
+                       0, 0,
+                       0, 0,
+                       MSEL3CR_28_0, MSEL3CR_28_1,
+                       MSEL3CR_27_0, MSEL3CR_27_1,
+                       MSEL3CR_26_0, MSEL3CR_26_1,
+                       0, 0,
+                       0, 0,
+                       MSEL3CR_23_0, MSEL3CR_23_1,
+                       MSEL3CR_22_0, MSEL3CR_22_1,
+                       MSEL3CR_21_0, MSEL3CR_21_1,
+                       MSEL3CR_20_0, MSEL3CR_20_1,
+                       MSEL3CR_19_0, MSEL3CR_19_1,
+                       MSEL3CR_18_0, MSEL3CR_18_1,
+                       MSEL3CR_17_0, MSEL3CR_17_1,
+                       MSEL3CR_16_0, MSEL3CR_16_1,
+                       MSEL3CR_15_0, MSEL3CR_15_1,
+                       0, 0,
+                       0, 0,
+                       MSEL3CR_12_0, MSEL3CR_12_1,
+                       MSEL3CR_11_0, MSEL3CR_11_1,
+                       MSEL3CR_10_0, MSEL3CR_10_1,
+                       MSEL3CR_09_0, MSEL3CR_09_1,
+                       0, 0,
+                       0, 0,
+                       MSEL3CR_06_0, MSEL3CR_06_1,
+                       0, 0,
+                       0, 0,
+                       MSEL3CR_03_0, MSEL3CR_03_1,
+                       0, 0,
+                       MSEL3CR_01_0, MSEL3CR_01_1,
+                       MSEL3CR_00_0, MSEL3CR_00_1,
+                       }
+       },
+       { PINMUX_CFG_REG("MSEL4CR", 0xe6058024, 32, 1) {
+                       0, 0,
+                       MSEL4CR_30_0, MSEL4CR_30_1,
+                       MSEL4CR_29_0, MSEL4CR_29_1,
+                       MSEL4CR_28_0, MSEL4CR_28_1,
+                       MSEL4CR_27_0, MSEL4CR_27_1,
+                       MSEL4CR_26_0, MSEL4CR_26_1,
+                       MSEL4CR_25_0, MSEL4CR_25_1,
+                       MSEL4CR_24_0, MSEL4CR_24_1,
+                       MSEL4CR_23_0, MSEL4CR_23_1,
+                       MSEL4CR_22_0, MSEL4CR_22_1,
+                       MSEL4CR_21_0, MSEL4CR_21_1,
+                       MSEL4CR_20_0, MSEL4CR_20_1,
+                       MSEL4CR_19_0, MSEL4CR_19_1,
+                       MSEL4CR_18_0, MSEL4CR_18_1,
+                       MSEL4CR_17_0, MSEL4CR_17_1,
+                       MSEL4CR_16_0, MSEL4CR_16_1,
+                       MSEL4CR_15_0, MSEL4CR_15_1,
+                       MSEL4CR_14_0, MSEL4CR_14_1,
+                       MSEL4CR_13_0, MSEL4CR_13_1,
+                       MSEL4CR_12_0, MSEL4CR_12_1,
+                       MSEL4CR_11_0, MSEL4CR_11_1,
+                       MSEL4CR_10_0, MSEL4CR_10_1,
+                       MSEL4CR_09_0, MSEL4CR_09_1,
+                       0, 0,
+                       MSEL4CR_07_0, MSEL4CR_07_1,
+                       0, 0,
+                       0, 0,
+                       MSEL4CR_04_0, MSEL4CR_04_1,
+                       0, 0,
+                       0, 0,
+                       MSEL4CR_01_0, MSEL4CR_01_1,
+                       0, 0,
+               }
+       },
+       { PINMUX_CFG_REG("MSEL5CR", 0xe6058028, 32, 1) {
+                       MSEL5CR_31_0, MSEL5CR_31_1,
+                       MSEL5CR_30_0, MSEL5CR_30_1,
+                       MSEL5CR_29_0, MSEL5CR_29_1,
+                       MSEL5CR_28_0, MSEL5CR_28_1,
+                       MSEL5CR_27_0, MSEL5CR_27_1,
+                       MSEL5CR_26_0, MSEL5CR_26_1,
+                       MSEL5CR_25_0, MSEL5CR_25_1,
+                       MSEL5CR_24_0, MSEL5CR_24_1,
+                       MSEL5CR_23_0, MSEL5CR_23_1,
+                       MSEL5CR_22_0, MSEL5CR_22_1,
+                       MSEL5CR_21_0, MSEL5CR_21_1,
+                       MSEL5CR_20_0, MSEL5CR_20_1,
+                       MSEL5CR_19_0, MSEL5CR_19_1,
+                       MSEL5CR_18_0, MSEL5CR_18_1,
+                       MSEL5CR_17_0, MSEL5CR_17_1,
+                       MSEL5CR_16_0, MSEL5CR_16_1,
+                       MSEL5CR_15_0, MSEL5CR_15_1,
+                       MSEL5CR_14_0, MSEL5CR_14_1,
+                       MSEL5CR_13_0, MSEL5CR_13_1,
+                       MSEL5CR_12_0, MSEL5CR_12_1,
+                       MSEL5CR_11_0, MSEL5CR_11_1,
+                       MSEL5CR_10_0, MSEL5CR_10_1,
+                       MSEL5CR_09_0, MSEL5CR_09_1,
+                       MSEL5CR_08_0, MSEL5CR_08_1,
+                       MSEL5CR_07_0, MSEL5CR_07_1,
+                       MSEL5CR_06_0, MSEL5CR_06_1,
+                       0, 0,
+                       0, 0,
+                       0, 0,
+                       0, 0,
+                       0, 0,
+                       0, 0,
+               }
+       },
+       { PINMUX_CFG_REG("MSEL8CR", 0xe6058034, 32, 1) {
+                       0, 0,
+                       0, 0,
+                       0, 0,
+                       0, 0,
+                       0, 0,
+                       0, 0,
+                       0, 0,
+                       0, 0,
+                       0, 0,
+                       0, 0,
+                       0, 0,
+                       0, 0,
+                       0, 0,
+                       0, 0,
+                       0, 0,
+                       MSEL8CR_16_0, MSEL8CR_16_1,
+                       0, 0,
+                       0, 0,
+                       0, 0,
+                       0, 0,
+                       0, 0,
+                       0, 0,
+                       0, 0,
+                       0, 0,
+                       0, 0,
+                       0, 0,
+                       0, 0,
+                       0, 0,
+                       0, 0,
+                       0, 0,
+                       MSEL8CR_01_0, MSEL8CR_01_1,
+                       MSEL8CR_00_0, MSEL8CR_00_1,
+               }
+       },
+       { },
+};
+
+static const struct pinmux_data_reg pinmux_data_regs[] = {
+
+       { PINMUX_DATA_REG("PORTL031_000DR", 0xe6054000, 32) {
+                       0, PORT30_DATA, PORT29_DATA, PORT28_DATA,
+                       PORT27_DATA, PORT26_DATA, PORT25_DATA, PORT24_DATA,
+                       PORT23_DATA, PORT22_DATA, PORT21_DATA, PORT20_DATA,
+                       PORT19_DATA, PORT18_DATA, PORT17_DATA, PORT16_DATA,
+                       PORT15_DATA, PORT14_DATA, PORT13_DATA, PORT12_DATA,
+                       PORT11_DATA, PORT10_DATA, PORT9_DATA, PORT8_DATA,
+                       PORT7_DATA, PORT6_DATA, PORT5_DATA, PORT4_DATA,
+                       PORT3_DATA, PORT2_DATA, PORT1_DATA, PORT0_DATA,
+               }
+       },
+       { PINMUX_DATA_REG("PORTD063_032DR", 0xe6055000, 32) {
+                       0, 0, 0, 0,
+                       0, 0, 0, 0,
+                       0, 0, 0, 0,
+                       0, 0, 0, 0,
+                       0, 0, 0, 0,
+                       0, 0, 0, PORT40_DATA,
+                       PORT39_DATA, PORT38_DATA, PORT37_DATA, PORT36_DATA,
+                       PORT35_DATA, PORT34_DATA, PORT33_DATA, PORT32_DATA,
+               }
+       },
+       { PINMUX_DATA_REG("PORTL095_064DR", 0xe6054004, 32) {
+                       0, 0, 0, 0,
+                       0, 0, 0, 0,
+                       0, 0, PORT85_DATA, PORT84_DATA,
+                       PORT83_DATA, PORT82_DATA, PORT81_DATA, PORT80_DATA,
+                       PORT79_DATA, PORT78_DATA, PORT77_DATA, PORT76_DATA,
+                       PORT75_DATA, PORT74_DATA, PORT73_DATA, PORT72_DATA,
+                       PORT71_DATA, PORT70_DATA, PORT69_DATA, PORT68_DATA,
+                       PORT67_DATA, PORT66_DATA, PORT65_DATA, PORT64_DATA,
+               }
+       },
+       { PINMUX_DATA_REG("PORTD127_096DR", 0xe6055004, 32) {
+                       0, PORT126_DATA, PORT125_DATA, PORT124_DATA,
+                       PORT123_DATA, PORT122_DATA, PORT121_DATA, PORT120_DATA,
+                       PORT119_DATA, PORT118_DATA, PORT117_DATA, PORT116_DATA,
+                       PORT115_DATA, PORT114_DATA, PORT113_DATA, PORT112_DATA,
+                       PORT111_DATA, PORT110_DATA, PORT109_DATA, PORT108_DATA,
+                       PORT107_DATA, PORT106_DATA, PORT105_DATA, PORT104_DATA,
+                       PORT103_DATA, PORT102_DATA, PORT101_DATA, PORT100_DATA,
+                       PORT99_DATA, PORT98_DATA, PORT97_DATA, PORT96_DATA,
+               }
+       },
+       { PINMUX_DATA_REG("PORTD159_128DR", 0xe6055008, 32) {
+                       0, 0, 0, 0,
+                       0, 0, 0, 0,
+                       0, 0, 0, 0,
+                       0, 0, 0, 0,
+                       0, 0, 0, 0,
+                       0, 0, 0, 0,
+                       0, PORT134_DATA, PORT133_DATA, PORT132_DATA,
+                       PORT131_DATA, PORT130_DATA, PORT129_DATA, PORT128_DATA,
+               }
+       },
+       { PINMUX_DATA_REG("PORTR191_160DR", 0xe6056000, 32) {
+                       0, 0, 0, 0,
+                       0, 0, 0, 0,
+                       0, 0, 0, 0,
+                       0, PORT178_DATA, PORT177_DATA, PORT176_DATA,
+                       PORT175_DATA, PORT174_DATA, PORT173_DATA, PORT172_DATA,
+                       PORT171_DATA, PORT170_DATA, PORT169_DATA, PORT168_DATA,
+                       PORT167_DATA, PORT166_DATA, PORT165_DATA, PORT164_DATA,
+                       PORT163_DATA, PORT162_DATA, PORT161_DATA, PORT160_DATA,
+               }
+       },
+       { PINMUX_DATA_REG("PORTR223_192DR", 0xe6056004, 32) {
+                       0, PORT222_DATA, PORT221_DATA, PORT220_DATA,
+                       PORT219_DATA, PORT218_DATA, PORT217_DATA, PORT216_DATA,
+                       PORT215_DATA, PORT214_DATA, PORT213_DATA, PORT212_DATA,
+                       PORT211_DATA, PORT210_DATA, PORT209_DATA, PORT208_DATA,
+                       PORT207_DATA, PORT206_DATA, PORT205_DATA, PORT204_DATA,
+                       PORT203_DATA, PORT202_DATA, PORT201_DATA, PORT200_DATA,
+                       PORT199_DATA, PORT198_DATA, PORT197_DATA, PORT196_DATA,
+                       PORT195_DATA, PORT194_DATA, PORT193_DATA, PORT192_DATA,
+               }
+       },
+       { PINMUX_DATA_REG("PORTR255_224DR", 0xe6056008, 32) {
+                       0, 0, 0, 0,
+                       0, PORT250_DATA, PORT249_DATA, PORT248_DATA,
+                       PORT247_DATA, PORT246_DATA, PORT245_DATA, PORT244_DATA,
+                       PORT243_DATA, PORT242_DATA, PORT241_DATA, PORT240_DATA,
+                       PORT239_DATA, PORT238_DATA, PORT237_DATA, PORT236_DATA,
+                       PORT235_DATA, PORT234_DATA, PORT233_DATA, PORT232_DATA,
+                       PORT231_DATA, PORT230_DATA, PORT229_DATA, PORT228_DATA,
+                       PORT227_DATA, PORT226_DATA, PORT225_DATA, PORT224_DATA,
+               }
+       },
+       { PINMUX_DATA_REG("PORTR287_256DR", 0xe605600C, 32) {
+                       0, 0, 0, 0,
+                       PORT283_DATA, PORT282_DATA, PORT281_DATA, PORT280_DATA,
+                       PORT279_DATA, PORT278_DATA, PORT277_DATA, PORT276_DATA,
+                       PORT275_DATA, PORT274_DATA, PORT273_DATA, PORT272_DATA,
+                       PORT271_DATA, PORT270_DATA, PORT269_DATA, PORT268_DATA,
+                       PORT267_DATA, PORT266_DATA, PORT265_DATA, PORT264_DATA,
+                       PORT263_DATA, PORT262_DATA, PORT261_DATA, PORT260_DATA,
+                       PORT259_DATA, PORT258_DATA, PORT257_DATA, PORT256_DATA,
+               }
+       },
+       { PINMUX_DATA_REG("PORTU319_288DR", 0xe6057000, 32) {
+                       0, 0, 0, 0,
+                       0, 0, 0, 0,
+                       0, 0, 0, PORT308_DATA,
+                       PORT307_DATA, PORT306_DATA, PORT305_DATA, PORT304_DATA,
+                       PORT303_DATA, PORT302_DATA, PORT301_DATA, PORT300_DATA,
+                       PORT299_DATA, PORT298_DATA, PORT297_DATA, PORT296_DATA,
+                       PORT295_DATA, PORT294_DATA, PORT293_DATA, PORT292_DATA,
+                       PORT291_DATA, PORT290_DATA, PORT289_DATA, PORT288_DATA,
+               }
+       },
+       { PINMUX_DATA_REG("PORTU351_320DR", 0xe6057004, 32) {
+                       0, 0, 0, 0,
+                       0, 0, 0, 0,
+                       0, 0, 0, 0,
+                       0, 0, 0, 0,
+                       0, 0, 0, 0,
+                       0, 0, PORT329_DATA, PORT328_DATA,
+                       PORT327_DATA, PORT326_DATA, PORT325_DATA, PORT324_DATA,
+                       PORT323_DATA, PORT322_DATA, PORT321_DATA, PORT320_DATA,
+               }
+       },
+       { },
+};
+
+static const struct pinmux_irq pinmux_irqs[] = {
+       PINMUX_IRQ(irq_pin(0), 0),
+       PINMUX_IRQ(irq_pin(1), 1),
+       PINMUX_IRQ(irq_pin(2), 2),
+       PINMUX_IRQ(irq_pin(3), 3),
+       PINMUX_IRQ(irq_pin(4), 4),
+       PINMUX_IRQ(irq_pin(5), 5),
+       PINMUX_IRQ(irq_pin(6), 6),
+       PINMUX_IRQ(irq_pin(7), 7),
+       PINMUX_IRQ(irq_pin(8), 8),
+       PINMUX_IRQ(irq_pin(9), 9),
+       PINMUX_IRQ(irq_pin(10), 10),
+       PINMUX_IRQ(irq_pin(11), 11),
+       PINMUX_IRQ(irq_pin(12), 12),
+       PINMUX_IRQ(irq_pin(13), 13),
+       PINMUX_IRQ(irq_pin(14), 14),
+       PINMUX_IRQ(irq_pin(15), 15),
+       PINMUX_IRQ(irq_pin(16), 320),
+       PINMUX_IRQ(irq_pin(17), 321),
+       PINMUX_IRQ(irq_pin(18), 85),
+       PINMUX_IRQ(irq_pin(19), 84),
+       PINMUX_IRQ(irq_pin(20), 160),
+       PINMUX_IRQ(irq_pin(21), 161),
+       PINMUX_IRQ(irq_pin(22), 162),
+       PINMUX_IRQ(irq_pin(23), 163),
+       PINMUX_IRQ(irq_pin(24), 175),
+       PINMUX_IRQ(irq_pin(25), 176),
+       PINMUX_IRQ(irq_pin(26), 177),
+       PINMUX_IRQ(irq_pin(27), 178),
+       PINMUX_IRQ(irq_pin(28), 322),
+       PINMUX_IRQ(irq_pin(29), 323),
+       PINMUX_IRQ(irq_pin(30), 324),
+       PINMUX_IRQ(irq_pin(31), 192),
+       PINMUX_IRQ(irq_pin(32), 193),
+       PINMUX_IRQ(irq_pin(33), 194),
+       PINMUX_IRQ(irq_pin(34), 195),
+       PINMUX_IRQ(irq_pin(35), 196),
+       PINMUX_IRQ(irq_pin(36), 197),
+       PINMUX_IRQ(irq_pin(37), 198),
+       PINMUX_IRQ(irq_pin(38), 199),
+       PINMUX_IRQ(irq_pin(39), 200),
+       PINMUX_IRQ(irq_pin(40), 66),
+       PINMUX_IRQ(irq_pin(41), 102),
+       PINMUX_IRQ(irq_pin(42), 103),
+       PINMUX_IRQ(irq_pin(43), 109),
+       PINMUX_IRQ(irq_pin(44), 110),
+       PINMUX_IRQ(irq_pin(45), 111),
+       PINMUX_IRQ(irq_pin(46), 112),
+       PINMUX_IRQ(irq_pin(47), 113),
+       PINMUX_IRQ(irq_pin(48), 114),
+       PINMUX_IRQ(irq_pin(49), 115),
+       PINMUX_IRQ(irq_pin(50), 301),
+       PINMUX_IRQ(irq_pin(51), 290),
+       PINMUX_IRQ(irq_pin(52), 296),
+       PINMUX_IRQ(irq_pin(53), 325),
+       PINMUX_IRQ(irq_pin(54), 326),
+       PINMUX_IRQ(irq_pin(55), 327),
+       PINMUX_IRQ(irq_pin(56), 328),
+       PINMUX_IRQ(irq_pin(57), 329),
+};
+
+#define PORTCR_PULMD_OFF (0 << 6)
+#define PORTCR_PULMD_DOWN (2 << 6)
+#define PORTCR_PULMD_UP (3 << 6)
+#define PORTCR_PULMD_MASK (3 << 6)
+
+static const unsigned int r8a73a4_portcr_offsets[] = {
+       0x00000000, 0x00001000, 0x00000000, 0x00001000,
+       0x00001000, 0x00002000, 0x00002000, 0x00002000,
+       0x00002000, 0x00003000, 0x00003000,
+};
+
+static unsigned int r8a73a4_pinmux_get_bias(struct sh_pfc *pfc,
+                                           unsigned int pin)
+{
+       void __iomem *addr;
+
+       addr = pfc->window->virt + r8a73a4_portcr_offsets[pin >> 5] + pin;
+
+       switch (ioread8(addr) & PORTCR_PULMD_MASK) {
+       case PORTCR_PULMD_UP:
+               return PIN_CONFIG_BIAS_PULL_UP;
+       case PORTCR_PULMD_DOWN:
+               return PIN_CONFIG_BIAS_PULL_DOWN;
+       case PORTCR_PULMD_OFF:
+       default:
+               return PIN_CONFIG_BIAS_DISABLE;
+       }
+}
+
+static void r8a73a4_pinmux_set_bias(struct sh_pfc *pfc, unsigned int pin,
+                                  unsigned int bias)
+{
+       void __iomem *addr;
+       u32 value;
+
+       addr = pfc->window->virt + r8a73a4_portcr_offsets[pin >> 5] + pin;
+       value = ioread8(addr) & ~PORTCR_PULMD_MASK;
+
+       switch (bias) {
+       case PIN_CONFIG_BIAS_PULL_UP:
+               value |= PORTCR_PULMD_UP;
+               break;
+       case PIN_CONFIG_BIAS_PULL_DOWN:
+               value |= PORTCR_PULMD_DOWN;
+               break;
+       }
+
+       iowrite8(value, addr);
+}
+
+static const struct sh_pfc_soc_operations r8a73a4_pinmux_ops = {
+       .get_bias = r8a73a4_pinmux_get_bias,
+       .set_bias = r8a73a4_pinmux_set_bias,
+};
+
+const struct sh_pfc_soc_info r8a73a4_pinmux_info = {
+       .name           = "r8a73a4_pfc",
+       .ops            = &r8a73a4_pinmux_ops,
+
+       .input = { PINMUX_INPUT_BEGIN, PINMUX_INPUT_END },
+       .output = { PINMUX_OUTPUT_BEGIN, PINMUX_OUTPUT_END },
+       .function = { PINMUX_FUNCTION_BEGIN, PINMUX_FUNCTION_END },
+
+       .pins = pinmux_pins,
+       .nr_pins = ARRAY_SIZE(pinmux_pins),
+
+       .ranges = pinmux_ranges,
+       .nr_ranges = ARRAY_SIZE(pinmux_ranges),
+
+       .groups = pinmux_groups,
+       .nr_groups = ARRAY_SIZE(pinmux_groups),
+       .functions = pinmux_functions,
+       .nr_functions = ARRAY_SIZE(pinmux_functions),
+
+       .cfg_regs       = pinmux_config_regs,
+       .data_regs      = pinmux_data_regs,
+
+       .gpio_data      = pinmux_data,
+       .gpio_data_size = ARRAY_SIZE(pinmux_data),
+
+       .gpio_irq = pinmux_irqs,
+       .gpio_irq_size = ARRAY_SIZE(pinmux_irqs),
+};
index 214788c4a606180755e8e6f02c97afb4059fa163..bbd87d29bfd072cae153467fa58c178c8059077f 100644 (file)
@@ -577,7 +577,7 @@ enum {
        PINMUX_MARK_END,
 };
 
-static pinmux_enum_t pinmux_data[] = {
+static const pinmux_enum_t pinmux_data[] = {
        /* specify valid pin states for each pin in GPIO mode */
 
        /* I/O and Pull U/D */
@@ -1654,11 +1654,532 @@ static pinmux_enum_t pinmux_data[] = {
        PINMUX_DATA(TRACEAUD_FROM_MEMC_MARK,                    MSEL5CR_30_1,   MSEL5CR_29_0),
 };
 
-static struct pinmux_gpio pinmux_gpios[] = {
-
-       /* PORT */
+static struct sh_pfc_pin pinmux_pins[] = {
        GPIO_PORT_ALL(),
+};
+
+/* - LCD0 ------------------------------------------------------------------- */
+static const unsigned int lcd0_data8_pins[] = {
+       /* D[0:7] */
+       58, 57, 56, 55, 54, 53, 52, 51,
+};
+static const unsigned int lcd0_data8_mux[] = {
+       LCD0_D0_MARK, LCD0_D1_MARK, LCD0_D2_MARK, LCD0_D3_MARK,
+       LCD0_D4_MARK, LCD0_D5_MARK, LCD0_D6_MARK, LCD0_D7_MARK,
+};
+static const unsigned int lcd0_data9_pins[] = {
+       /* D[0:8] */
+       58, 57, 56, 55, 54, 53, 52, 51,
+       50,
+};
+static const unsigned int lcd0_data9_mux[] = {
+       LCD0_D0_MARK, LCD0_D1_MARK, LCD0_D2_MARK, LCD0_D3_MARK,
+       LCD0_D4_MARK, LCD0_D5_MARK, LCD0_D6_MARK, LCD0_D7_MARK,
+       LCD0_D8_MARK,
+};
+static const unsigned int lcd0_data12_pins[] = {
+       /* D[0:11] */
+       58, 57, 56, 55, 54, 53, 52, 51,
+       50, 49, 48, 47,
+};
+static const unsigned int lcd0_data12_mux[] = {
+       LCD0_D0_MARK, LCD0_D1_MARK, LCD0_D2_MARK, LCD0_D3_MARK,
+       LCD0_D4_MARK, LCD0_D5_MARK, LCD0_D6_MARK, LCD0_D7_MARK,
+       LCD0_D8_MARK, LCD0_D9_MARK, LCD0_D10_MARK, LCD0_D11_MARK,
+};
+static const unsigned int lcd0_data16_pins[] = {
+       /* D[0:15] */
+       58, 57, 56, 55, 54, 53, 52, 51,
+       50, 49, 48, 47, 46, 45, 44, 43,
+};
+static const unsigned int lcd0_data16_mux[] = {
+       LCD0_D0_MARK, LCD0_D1_MARK, LCD0_D2_MARK, LCD0_D3_MARK,
+       LCD0_D4_MARK, LCD0_D5_MARK, LCD0_D6_MARK, LCD0_D7_MARK,
+       LCD0_D8_MARK, LCD0_D9_MARK, LCD0_D10_MARK, LCD0_D11_MARK,
+       LCD0_D12_MARK, LCD0_D13_MARK, LCD0_D14_MARK, LCD0_D15_MARK,
+};
+static const unsigned int lcd0_data18_pins[] = {
+       /* D[0:17] */
+       58, 57, 56, 55, 54, 53, 52, 51,
+       50, 49, 48, 47, 46, 45, 44, 43,
+       42, 41,
+};
+static const unsigned int lcd0_data18_mux[] = {
+       LCD0_D0_MARK, LCD0_D1_MARK, LCD0_D2_MARK, LCD0_D3_MARK,
+       LCD0_D4_MARK, LCD0_D5_MARK, LCD0_D6_MARK, LCD0_D7_MARK,
+       LCD0_D8_MARK, LCD0_D9_MARK, LCD0_D10_MARK, LCD0_D11_MARK,
+       LCD0_D12_MARK, LCD0_D13_MARK, LCD0_D14_MARK, LCD0_D15_MARK,
+       LCD0_D16_MARK, LCD0_D17_MARK,
+};
+static const unsigned int lcd0_data24_0_pins[] = {
+       /* D[0:23] */
+       58, 57, 56, 55, 54, 53, 52, 51,
+       50, 49, 48, 47, 46, 45, 44, 43,
+       42, 41, 40, 4, 3, 2, 0, 1,
+};
+static const unsigned int lcd0_data24_0_mux[] = {
+       LCD0_D0_MARK, LCD0_D1_MARK, LCD0_D2_MARK, LCD0_D3_MARK,
+       LCD0_D4_MARK, LCD0_D5_MARK, LCD0_D6_MARK, LCD0_D7_MARK,
+       LCD0_D8_MARK, LCD0_D9_MARK, LCD0_D10_MARK, LCD0_D11_MARK,
+       LCD0_D12_MARK, LCD0_D13_MARK, LCD0_D14_MARK, LCD0_D15_MARK,
+       LCD0_D16_MARK, LCD0_D17_MARK, LCD0_D18_PORT40_MARK, LCD0_D19_PORT4_MARK,
+       LCD0_D20_PORT3_MARK, LCD0_D21_PORT2_MARK, LCD0_D22_PORT0_MARK,
+       LCD0_D23_PORT1_MARK,
+};
+static const unsigned int lcd0_data24_1_pins[] = {
+       /* D[0:23] */
+       58, 57, 56, 55, 54, 53, 52, 51,
+       50, 49, 48, 47, 46, 45, 44, 43,
+       42, 41, 163, 162, 161, 158, 160, 159,
+};
+static const unsigned int lcd0_data24_1_mux[] = {
+       LCD0_D0_MARK, LCD0_D1_MARK, LCD0_D2_MARK, LCD0_D3_MARK,
+       LCD0_D4_MARK, LCD0_D5_MARK, LCD0_D6_MARK, LCD0_D7_MARK,
+       LCD0_D8_MARK, LCD0_D9_MARK, LCD0_D10_MARK, LCD0_D11_MARK,
+       LCD0_D16_MARK, LCD0_D17_MARK, LCD0_D18_PORT163_MARK,
+       LCD0_D19_PORT162_MARK, LCD0_D20_PORT161_MARK, LCD0_D21_PORT158_MARK,
+       LCD0_D22_PORT160_MARK, LCD0_D23_PORT159_MARK,
+};
+static const unsigned int lcd0_display_pins[] = {
+       /* DON, VCPWC, VEPWC */
+       61, 59, 60,
+};
+static const unsigned int lcd0_display_mux[] = {
+       LCD0_DON_MARK, LCD0_VCPWC_MARK, LCD0_VEPWC_MARK,
+};
+static const unsigned int lcd0_lclk_0_pins[] = {
+       /* LCLK */
+       102,
+};
+static const unsigned int lcd0_lclk_0_mux[] = {
+       LCD0_LCLK_PORT102_MARK,
+};
+static const unsigned int lcd0_lclk_1_pins[] = {
+       /* LCLK */
+       165,
+};
+static const unsigned int lcd0_lclk_1_mux[] = {
+       LCD0_LCLK_PORT165_MARK,
+};
+static const unsigned int lcd0_sync_pins[] = {
+       /* VSYN, HSYN, DCK, DISP */
+       63, 64, 62, 65,
+};
+static const unsigned int lcd0_sync_mux[] = {
+       LCD0_VSYN_MARK, LCD0_HSYN_MARK, LCD0_DCK_MARK, LCD0_DISP_MARK,
+};
+static const unsigned int lcd0_sys_pins[] = {
+       /* CS, WR, RD, RS */
+       64, 62, 164, 65,
+};
+static const unsigned int lcd0_sys_mux[] = {
+       LCD0_CS_MARK, LCD0_WR_MARK, LCD0_RD_MARK, LCD0_RS_MARK,
+};
+/* - LCD1 ------------------------------------------------------------------- */
+static const unsigned int lcd1_data8_pins[] = {
+       /* D[0:7] */
+       4, 3, 2, 1, 0, 91, 92, 23,
+};
+static const unsigned int lcd1_data8_mux[] = {
+       LCD1_D0_MARK, LCD1_D1_MARK, LCD1_D2_MARK, LCD1_D3_MARK,
+       LCD1_D4_MARK, LCD1_D5_MARK, LCD1_D6_MARK, LCD1_D7_MARK,
+};
+static const unsigned int lcd1_data9_pins[] = {
+       /* D[0:8] */
+       4, 3, 2, 1, 0, 91, 92, 23,
+       93,
+};
+static const unsigned int lcd1_data9_mux[] = {
+       LCD1_D0_MARK, LCD1_D1_MARK, LCD1_D2_MARK, LCD1_D3_MARK,
+       LCD1_D4_MARK, LCD1_D5_MARK, LCD1_D6_MARK, LCD1_D7_MARK,
+       LCD1_D8_MARK,
+};
+static const unsigned int lcd1_data12_pins[] = {
+       /* D[0:12] */
+       4, 3, 2, 1, 0, 91, 92, 23,
+       93, 94, 21, 201,
+};
+static const unsigned int lcd1_data12_mux[] = {
+       LCD1_D0_MARK, LCD1_D1_MARK, LCD1_D2_MARK, LCD1_D3_MARK,
+       LCD1_D4_MARK, LCD1_D5_MARK, LCD1_D6_MARK, LCD1_D7_MARK,
+       LCD1_D8_MARK, LCD1_D9_MARK, LCD1_D10_MARK, LCD1_D11_MARK,
+};
+static const unsigned int lcd1_data16_pins[] = {
+       /* D[0:15] */
+       4, 3, 2, 1, 0, 91, 92, 23,
+       93, 94, 21, 201, 200, 199, 196, 195,
+};
+static const unsigned int lcd1_data16_mux[] = {
+       LCD1_D0_MARK, LCD1_D1_MARK, LCD1_D2_MARK, LCD1_D3_MARK,
+       LCD1_D4_MARK, LCD1_D5_MARK, LCD1_D6_MARK, LCD1_D7_MARK,
+       LCD1_D8_MARK, LCD1_D9_MARK, LCD1_D10_MARK, LCD1_D11_MARK,
+       LCD1_D12_MARK, LCD1_D13_MARK, LCD1_D14_MARK, LCD1_D15_MARK,
+};
+static const unsigned int lcd1_data18_pins[] = {
+       /* D[0:17] */
+       4, 3, 2, 1, 0, 91, 92, 23,
+       93, 94, 21, 201, 200, 199, 196, 195,
+       194, 193,
+};
+static const unsigned int lcd1_data18_mux[] = {
+       LCD1_D0_MARK, LCD1_D1_MARK, LCD1_D2_MARK, LCD1_D3_MARK,
+       LCD1_D4_MARK, LCD1_D5_MARK, LCD1_D6_MARK, LCD1_D7_MARK,
+       LCD1_D8_MARK, LCD1_D9_MARK, LCD1_D10_MARK, LCD1_D11_MARK,
+       LCD1_D12_MARK, LCD1_D13_MARK, LCD1_D14_MARK, LCD1_D15_MARK,
+       LCD1_D16_MARK, LCD1_D17_MARK,
+};
+static const unsigned int lcd1_data24_pins[] = {
+       /* D[0:23] */
+       4, 3, 2, 1, 0, 91, 92, 23,
+       93, 94, 21, 201, 200, 199, 196, 195,
+       194, 193, 198, 197, 75, 74, 15, 14,
+};
+static const unsigned int lcd1_data24_mux[] = {
+       LCD1_D0_MARK, LCD1_D1_MARK, LCD1_D2_MARK, LCD1_D3_MARK,
+       LCD1_D4_MARK, LCD1_D5_MARK, LCD1_D6_MARK, LCD1_D7_MARK,
+       LCD1_D8_MARK, LCD1_D9_MARK, LCD1_D10_MARK, LCD1_D11_MARK,
+       LCD1_D12_MARK, LCD1_D13_MARK, LCD1_D14_MARK, LCD1_D15_MARK,
+       LCD1_D16_MARK, LCD1_D17_MARK, LCD1_D18_MARK, LCD1_D19_MARK,
+       LCD1_D20_MARK, LCD1_D21_MARK, LCD1_D22_MARK, LCD1_D23_MARK,
+};
+static const unsigned int lcd1_display_pins[] = {
+       /* DON, VCPWC, VEPWC */
+       100, 5, 6,
+};
+static const unsigned int lcd1_display_mux[] = {
+       LCD1_DON_MARK, LCD1_VCPWC_MARK, LCD1_VEPWC_MARK,
+};
+static const unsigned int lcd1_lclk_pins[] = {
+       /* LCLK */
+       40,
+};
+static const unsigned int lcd1_lclk_mux[] = {
+       LCD1_LCLK_MARK,
+};
+static const unsigned int lcd1_sync_pins[] = {
+       /* VSYN, HSYN, DCK, DISP */
+       98, 97, 99, 12,
+};
+static const unsigned int lcd1_sync_mux[] = {
+       LCD1_VSYN_MARK, LCD1_HSYN_MARK, LCD1_DCK_MARK, LCD1_DISP_MARK,
+};
+static const unsigned int lcd1_sys_pins[] = {
+       /* CS, WR, RD, RS */
+       97, 99, 13, 12,
+};
+static const unsigned int lcd1_sys_mux[] = {
+       LCD1_CS_MARK, LCD1_WR_MARK, LCD1_RD_MARK, LCD1_RS_MARK,
+};
+/* - MMCIF ------------------------------------------------------------------ */
+static const unsigned int mmc0_data1_0_pins[] = {
+       /* D[0] */
+       68,
+};
+static const unsigned int mmc0_data1_0_mux[] = {
+       MMC0_D0_PORT68_MARK,
+};
+static const unsigned int mmc0_data4_0_pins[] = {
+       /* D[0:3] */
+       68, 69, 70, 71,
+};
+static const unsigned int mmc0_data4_0_mux[] = {
+       MMC0_D0_PORT68_MARK, MMC0_D1_PORT69_MARK, MMC0_D2_PORT70_MARK, MMC0_D3_PORT71_MARK,
+};
+static const unsigned int mmc0_data8_0_pins[] = {
+       /* D[0:7] */
+       68, 69, 70, 71, 72, 73, 74, 75,
+};
+static const unsigned int mmc0_data8_0_mux[] = {
+       MMC0_D0_PORT68_MARK, MMC0_D1_PORT69_MARK, MMC0_D2_PORT70_MARK, MMC0_D3_PORT71_MARK,
+       MMC0_D4_PORT72_MARK, MMC0_D5_PORT73_MARK, MMC0_D6_PORT74_MARK, MMC0_D7_PORT75_MARK,
+};
+static const unsigned int mmc0_ctrl_0_pins[] = {
+       /* CMD, CLK */
+       67, 66,
+};
+static const unsigned int mmc0_ctrl_0_mux[] = {
+       MMC0_CMD_PORT67_MARK, MMC0_CLK_PORT66_MARK,
+};
+
+static const unsigned int mmc0_data1_1_pins[] = {
+       /* D[0] */
+       149,
+};
+static const unsigned int mmc0_data1_1_mux[] = {
+       MMC1_D0_PORT149_MARK,
+};
+static const unsigned int mmc0_data4_1_pins[] = {
+       /* D[0:3] */
+       149, 148, 147, 146,
+};
+static const unsigned int mmc0_data4_1_mux[] = {
+       MMC1_D0_PORT149_MARK, MMC1_D1_PORT148_MARK, MMC1_D2_PORT147_MARK, MMC1_D3_PORT146_MARK,
+};
+static const unsigned int mmc0_data8_1_pins[] = {
+       /* D[0:7] */
+       149, 148, 147, 146, 145, 144, 143, 142,
+};
+static const unsigned int mmc0_data8_1_mux[] = {
+       MMC1_D0_PORT149_MARK, MMC1_D1_PORT148_MARK, MMC1_D2_PORT147_MARK, MMC1_D3_PORT146_MARK,
+       MMC1_D4_PORT145_MARK, MMC1_D5_PORT144_MARK, MMC1_D6_PORT143_MARK, MMC1_D7_PORT142_MARK,
+};
+static const unsigned int mmc0_ctrl_1_pins[] = {
+       /* CMD, CLK */
+       104, 103,
+};
+static const unsigned int mmc0_ctrl_1_mux[] = {
+       MMC1_CMD_PORT104_MARK, MMC1_CLK_PORT103_MARK,
+};
+/* - SDHI0 ------------------------------------------------------------------ */
+static const unsigned int sdhi0_data1_pins[] = {
+       /* D0 */
+       77,
+};
+static const unsigned int sdhi0_data1_mux[] = {
+       SDHI0_D0_MARK,
+};
+static const unsigned int sdhi0_data4_pins[] = {
+       /* D[0:3] */
+       77, 78, 79, 80,
+};
+static const unsigned int sdhi0_data4_mux[] = {
+       SDHI0_D0_MARK, SDHI0_D1_MARK, SDHI0_D2_MARK, SDHI0_D3_MARK,
+};
+static const unsigned int sdhi0_ctrl_pins[] = {
+       /* CMD, CLK */
+       76, 82,
+};
+static const unsigned int sdhi0_ctrl_mux[] = {
+       SDHI0_CMD_MARK, SDHI0_CLK_MARK,
+};
+static const unsigned int sdhi0_cd_pins[] = {
+       /* CD */
+       81,
+};
+static const unsigned int sdhi0_cd_mux[] = {
+       SDHI0_CD_MARK,
+};
+static const unsigned int sdhi0_wp_pins[] = {
+       /* WP */
+       83,
+};
+static const unsigned int sdhi0_wp_mux[] = {
+       SDHI0_WP_MARK,
+};
+/* - SDHI1 ------------------------------------------------------------------ */
+static const unsigned int sdhi1_data1_pins[] = {
+       /* D0 */
+       68,
+};
+static const unsigned int sdhi1_data1_mux[] = {
+       SDHI1_D0_MARK,
+};
+static const unsigned int sdhi1_data4_pins[] = {
+       /* D[0:3] */
+       68, 69, 70, 71,
+};
+static const unsigned int sdhi1_data4_mux[] = {
+       SDHI1_D0_MARK, SDHI1_D1_MARK, SDHI1_D2_MARK, SDHI1_D3_MARK,
+};
+static const unsigned int sdhi1_ctrl_pins[] = {
+       /* CMD, CLK */
+       67, 66,
+};
+static const unsigned int sdhi1_ctrl_mux[] = {
+       SDHI1_CMD_MARK, SDHI1_CLK_MARK,
+};
+static const unsigned int sdhi1_cd_pins[] = {
+       /* CD */
+       72,
+};
+static const unsigned int sdhi1_cd_mux[] = {
+       SDHI1_CD_MARK,
+};
+static const unsigned int sdhi1_wp_pins[] = {
+       /* WP */
+       73,
+};
+static const unsigned int sdhi1_wp_mux[] = {
+       SDHI1_WP_MARK,
+};
+/* - SDHI2 ------------------------------------------------------------------ */
+static const unsigned int sdhi2_data1_pins[] = {
+       /* D0 */
+       205,
+};
+static const unsigned int sdhi2_data1_mux[] = {
+       SDHI2_D0_MARK,
+};
+static const unsigned int sdhi2_data4_pins[] = {
+       /* D[0:3] */
+       205, 206, 207, 208,
+};
+static const unsigned int sdhi2_data4_mux[] = {
+       SDHI2_D0_MARK, SDHI2_D1_MARK, SDHI2_D2_MARK, SDHI2_D3_MARK,
+};
+static const unsigned int sdhi2_ctrl_pins[] = {
+       /* CMD, CLK */
+       204, 203,
+};
+static const unsigned int sdhi2_ctrl_mux[] = {
+       SDHI2_CMD_MARK, SDHI2_CLK_MARK,
+};
+static const unsigned int sdhi2_cd_0_pins[] = {
+       /* CD */
+       202,
+};
+static const unsigned int sdhi2_cd_0_mux[] = {
+       SDHI2_CD_PORT202_MARK,
+};
+static const unsigned int sdhi2_wp_0_pins[] = {
+       /* WP */
+       177,
+};
+static const unsigned int sdhi2_wp_0_mux[] = {
+       SDHI2_WP_PORT177_MARK,
+};
+static const unsigned int sdhi2_cd_1_pins[] = {
+       /* CD */
+       24,
+};
+static const unsigned int sdhi2_cd_1_mux[] = {
+       SDHI2_CD_PORT24_MARK,
+};
+static const unsigned int sdhi2_wp_1_pins[] = {
+       /* WP */
+       25,
+};
+static const unsigned int sdhi2_wp_1_mux[] = {
+       SDHI2_WP_PORT25_MARK,
+};
 
+static const struct sh_pfc_pin_group pinmux_groups[] = {
+       SH_PFC_PIN_GROUP(lcd0_data8),
+       SH_PFC_PIN_GROUP(lcd0_data9),
+       SH_PFC_PIN_GROUP(lcd0_data12),
+       SH_PFC_PIN_GROUP(lcd0_data16),
+       SH_PFC_PIN_GROUP(lcd0_data18),
+       SH_PFC_PIN_GROUP(lcd0_data24_0),
+       SH_PFC_PIN_GROUP(lcd0_data24_1),
+       SH_PFC_PIN_GROUP(lcd0_display),
+       SH_PFC_PIN_GROUP(lcd0_lclk_0),
+       SH_PFC_PIN_GROUP(lcd0_lclk_1),
+       SH_PFC_PIN_GROUP(lcd0_sync),
+       SH_PFC_PIN_GROUP(lcd0_sys),
+       SH_PFC_PIN_GROUP(lcd1_data8),
+       SH_PFC_PIN_GROUP(lcd1_data9),
+       SH_PFC_PIN_GROUP(lcd1_data12),
+       SH_PFC_PIN_GROUP(lcd1_data16),
+       SH_PFC_PIN_GROUP(lcd1_data18),
+       SH_PFC_PIN_GROUP(lcd1_data24),
+       SH_PFC_PIN_GROUP(lcd1_display),
+       SH_PFC_PIN_GROUP(lcd1_lclk),
+       SH_PFC_PIN_GROUP(lcd1_sync),
+       SH_PFC_PIN_GROUP(lcd1_sys),
+       SH_PFC_PIN_GROUP(mmc0_data1_0),
+       SH_PFC_PIN_GROUP(mmc0_data4_0),
+       SH_PFC_PIN_GROUP(mmc0_data8_0),
+       SH_PFC_PIN_GROUP(mmc0_ctrl_0),
+       SH_PFC_PIN_GROUP(mmc0_data1_1),
+       SH_PFC_PIN_GROUP(mmc0_data4_1),
+       SH_PFC_PIN_GROUP(mmc0_data8_1),
+       SH_PFC_PIN_GROUP(mmc0_ctrl_1),
+       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_0),
+       SH_PFC_PIN_GROUP(sdhi2_wp_0),
+       SH_PFC_PIN_GROUP(sdhi2_cd_1),
+       SH_PFC_PIN_GROUP(sdhi2_wp_1),
+};
+
+static const char * const lcd0_groups[] = {
+       "lcd0_data8",
+       "lcd0_data9",
+       "lcd0_data12",
+       "lcd0_data16",
+       "lcd0_data18",
+       "lcd0_data24_0",
+       "lcd0_data24_1",
+       "lcd0_display",
+       "lcd0_lclk_0",
+       "lcd0_lclk_1",
+       "lcd0_sync",
+       "lcd0_sys",
+};
+
+static const char * const lcd1_groups[] = {
+       "lcd1_data8",
+       "lcd1_data9",
+       "lcd1_data12",
+       "lcd1_data16",
+       "lcd1_data18",
+       "lcd1_data24",
+       "lcd1_display",
+       "lcd1_lclk",
+       "lcd1_sync",
+       "lcd1_sys",
+};
+
+static const char * const mmc0_groups[] = {
+       "mmc0_data1_0",
+       "mmc0_data4_0",
+       "mmc0_data8_0",
+       "mmc0_ctrl_0",
+       "mmc0_data1_1",
+       "mmc0_data4_1",
+       "mmc0_data8_1",
+       "mmc0_ctrl_1",
+};
+
+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_0",
+       "sdhi2_wp_0",
+       "sdhi2_cd_1",
+       "sdhi2_wp_1",
+};
+
+static const struct sh_pfc_function pinmux_functions[] = {
+       SH_PFC_FUNCTION(lcd0),
+       SH_PFC_FUNCTION(lcd1),
+       SH_PFC_FUNCTION(mmc0),
+       SH_PFC_FUNCTION(sdhi0),
+       SH_PFC_FUNCTION(sdhi1),
+       SH_PFC_FUNCTION(sdhi2),
+};
+
+#define PINMUX_FN_BASE ARRAY_SIZE(pinmux_pins)
+
+static const struct pinmux_func pinmux_func_gpios[] = {
        /* IRQ */
        GPIO_FN(IRQ0_PORT2),    GPIO_FN(IRQ0_PORT13),
        GPIO_FN(IRQ1),
@@ -1792,43 +2313,6 @@ static struct pinmux_gpio pinmux_gpios[] = {
        GPIO_FN(SCIFB_RTS_PORT172),
        GPIO_FN(SCIFB_CTS_PORT173),
 
-       /* LCD0 */
-       GPIO_FN(LCD0_D0),       GPIO_FN(LCD0_D1),       GPIO_FN(LCD0_D2),
-       GPIO_FN(LCD0_D3),       GPIO_FN(LCD0_D4),       GPIO_FN(LCD0_D5),
-       GPIO_FN(LCD0_D6),       GPIO_FN(LCD0_D7),       GPIO_FN(LCD0_D8),
-       GPIO_FN(LCD0_D9),       GPIO_FN(LCD0_D10),      GPIO_FN(LCD0_D11),
-       GPIO_FN(LCD0_D12),      GPIO_FN(LCD0_D13),      GPIO_FN(LCD0_D14),
-       GPIO_FN(LCD0_D15),      GPIO_FN(LCD0_D16),      GPIO_FN(LCD0_D17),
-       GPIO_FN(LCD0_DON),      GPIO_FN(LCD0_VCPWC),    GPIO_FN(LCD0_VEPWC),
-       GPIO_FN(LCD0_DCK),      GPIO_FN(LCD0_VSYN),
-       GPIO_FN(LCD0_HSYN),     GPIO_FN(LCD0_DISP),
-       GPIO_FN(LCD0_WR),       GPIO_FN(LCD0_RD),
-       GPIO_FN(LCD0_CS),       GPIO_FN(LCD0_RS),
-
-       GPIO_FN(LCD0_D18_PORT163),      GPIO_FN(LCD0_D19_PORT162),
-       GPIO_FN(LCD0_D20_PORT161),      GPIO_FN(LCD0_D21_PORT158),
-       GPIO_FN(LCD0_D22_PORT160),      GPIO_FN(LCD0_D23_PORT159),
-       GPIO_FN(LCD0_LCLK_PORT165),     /* MSEL5CR_6_1 */
-
-       GPIO_FN(LCD0_D18_PORT40),       GPIO_FN(LCD0_D19_PORT4),
-       GPIO_FN(LCD0_D20_PORT3),        GPIO_FN(LCD0_D21_PORT2),
-       GPIO_FN(LCD0_D22_PORT0),        GPIO_FN(LCD0_D23_PORT1),
-       GPIO_FN(LCD0_LCLK_PORT102),     /* MSEL5CR_6_0 */
-
-       /* LCD1 */
-       GPIO_FN(LCD1_D0),       GPIO_FN(LCD1_D1),       GPIO_FN(LCD1_D2),
-       GPIO_FN(LCD1_D3),       GPIO_FN(LCD1_D4),       GPIO_FN(LCD1_D5),
-       GPIO_FN(LCD1_D6),       GPIO_FN(LCD1_D7),       GPIO_FN(LCD1_D8),
-       GPIO_FN(LCD1_D9),       GPIO_FN(LCD1_D10),      GPIO_FN(LCD1_D11),
-       GPIO_FN(LCD1_D12),      GPIO_FN(LCD1_D13),      GPIO_FN(LCD1_D14),
-       GPIO_FN(LCD1_D15),      GPIO_FN(LCD1_D16),      GPIO_FN(LCD1_D17),
-       GPIO_FN(LCD1_D18),      GPIO_FN(LCD1_D19),      GPIO_FN(LCD1_D20),
-       GPIO_FN(LCD1_D21),      GPIO_FN(LCD1_D22),      GPIO_FN(LCD1_D23),
-       GPIO_FN(LCD1_RS),       GPIO_FN(LCD1_RD),       GPIO_FN(LCD1_CS),
-       GPIO_FN(LCD1_WR),       GPIO_FN(LCD1_DCK),      GPIO_FN(LCD1_DON),
-       GPIO_FN(LCD1_VCPWC),    GPIO_FN(LCD1_LCLK),     GPIO_FN(LCD1_HSYN),
-       GPIO_FN(LCD1_VSYN),     GPIO_FN(LCD1_VEPWC),    GPIO_FN(LCD1_DISP),
-
        /* RSPI */
        GPIO_FN(RSPI_SSL0_A),   GPIO_FN(RSPI_SSL1_A),   GPIO_FN(RSPI_SSL2_A),
        GPIO_FN(RSPI_SSL3_A),   GPIO_FN(RSPI_CK_A),     GPIO_FN(RSPI_MOSI_A),
@@ -1889,26 +2373,6 @@ static struct pinmux_gpio pinmux_gpios[] = {
        GPIO_FN(SIM_D_PORT22), /* SIM_D  Port 22/199 */
        GPIO_FN(SIM_D_PORT199),
 
-       /* SDHI0 */
-       GPIO_FN(SDHI0_D0),      GPIO_FN(SDHI0_D1),      GPIO_FN(SDHI0_D2),
-       GPIO_FN(SDHI0_D3),      GPIO_FN(SDHI0_CD),      GPIO_FN(SDHI0_WP),
-       GPIO_FN(SDHI0_CMD),     GPIO_FN(SDHI0_CLK),
-
-       /* SDHI1 */
-       GPIO_FN(SDHI1_D0),      GPIO_FN(SDHI1_D1),      GPIO_FN(SDHI1_D2),
-       GPIO_FN(SDHI1_D3),      GPIO_FN(SDHI1_CD),      GPIO_FN(SDHI1_WP),
-       GPIO_FN(SDHI1_CMD),     GPIO_FN(SDHI1_CLK),
-
-       /* SDHI2 */
-       GPIO_FN(SDHI2_D0),      GPIO_FN(SDHI2_D1),      GPIO_FN(SDHI2_D2),
-       GPIO_FN(SDHI2_D3),      GPIO_FN(SDHI2_CLK),     GPIO_FN(SDHI2_CMD),
-
-       GPIO_FN(SDHI2_CD_PORT24), /* MSEL5CR_19_0 */
-       GPIO_FN(SDHI2_WP_PORT25),
-
-       GPIO_FN(SDHI2_WP_PORT177), /* MSEL5CR_19_1 */
-       GPIO_FN(SDHI2_CD_PORT202),
-
        /* MSIOF2 */
        GPIO_FN(MSIOF2_TXD),    GPIO_FN(MSIOF2_RXD),    GPIO_FN(MSIOF2_TSCK),
        GPIO_FN(MSIOF2_SS2),    GPIO_FN(MSIOF2_TSYNC),  GPIO_FN(MSIOF2_SS1),
@@ -1953,21 +2417,6 @@ static struct pinmux_gpio pinmux_gpios[] = {
        GPIO_FN(MEMC_WAIT),     GPIO_FN(MEMC_DREQ1),    GPIO_FN(MEMC_BUSCLK),
        GPIO_FN(MEMC_A0),
 
-       /* MMC */
-       GPIO_FN(MMC0_D0_PORT68),        GPIO_FN(MMC0_D1_PORT69),
-       GPIO_FN(MMC0_D2_PORT70),        GPIO_FN(MMC0_D3_PORT71),
-       GPIO_FN(MMC0_D4_PORT72),        GPIO_FN(MMC0_D5_PORT73),
-       GPIO_FN(MMC0_D6_PORT74),        GPIO_FN(MMC0_D7_PORT75),
-       GPIO_FN(MMC0_CLK_PORT66),
-       GPIO_FN(MMC0_CMD_PORT67),       /* MSEL4CR_15_0 */
-
-       GPIO_FN(MMC1_D0_PORT149),       GPIO_FN(MMC1_D1_PORT148),
-       GPIO_FN(MMC1_D2_PORT147),       GPIO_FN(MMC1_D3_PORT146),
-       GPIO_FN(MMC1_D4_PORT145),       GPIO_FN(MMC1_D5_PORT144),
-       GPIO_FN(MMC1_D6_PORT143),       GPIO_FN(MMC1_D7_PORT142),
-       GPIO_FN(MMC1_CLK_PORT103),
-       GPIO_FN(MMC1_CMD_PORT104),      /* MSEL4CR_15_1 */
-
        /* MSIOF0 */
        GPIO_FN(MSIOF0_SS1),    GPIO_FN(MSIOF0_SS2),    GPIO_FN(MSIOF0_RXD),
        GPIO_FN(MSIOF0_TXD),    GPIO_FN(MSIOF0_MCK0),   GPIO_FN(MSIOF0_MCK1),
@@ -2126,7 +2575,7 @@ static struct pinmux_gpio pinmux_gpios[] = {
        GPIO_FN(TRACEAUD_FROM_MEMC),
 };
 
-static struct pinmux_cfg_reg pinmux_config_regs[] = {
+static const struct pinmux_cfg_reg pinmux_config_regs[] = {
        PORTCR(0,       0xe6050000), /* PORT0CR */
        PORTCR(1,       0xe6050001), /* PORT1CR */
        PORTCR(2,       0xe6050002), /* PORT2CR */
@@ -2440,7 +2889,7 @@ static struct pinmux_cfg_reg pinmux_config_regs[] = {
        { },
 };
 
-static struct pinmux_data_reg pinmux_data_regs[] = {
+static const struct pinmux_data_reg pinmux_data_regs[] = {
        { PINMUX_DATA_REG("PORTL031_000DR", 0xe6054800, 32) {
                PORT31_DATA,    PORT30_DATA,    PORT29_DATA,    PORT28_DATA,
                PORT27_DATA,    PORT26_DATA,    PORT25_DATA,    PORT24_DATA,
@@ -2544,46 +2993,43 @@ static struct pinmux_data_reg pinmux_data_regs[] = {
        { },
 };
 
-static struct pinmux_irq pinmux_irqs[] = {
-       PINMUX_IRQ(evt2irq(0x0200), PORT2_FN0,   PORT13_FN0),   /* IRQ0A */
-       PINMUX_IRQ(evt2irq(0x0220), PORT20_FN0),                /* IRQ1A */
-       PINMUX_IRQ(evt2irq(0x0240), PORT11_FN0,  PORT12_FN0),   /* IRQ2A */
-       PINMUX_IRQ(evt2irq(0x0260), PORT10_FN0,  PORT14_FN0),   /* IRQ3A */
-       PINMUX_IRQ(evt2irq(0x0280), PORT15_FN0,  PORT172_FN0),  /* IRQ4A */
-       PINMUX_IRQ(evt2irq(0x02A0), PORT0_FN0,   PORT1_FN0),    /* IRQ5A */
-       PINMUX_IRQ(evt2irq(0x02C0), PORT121_FN0, PORT173_FN0),  /* IRQ6A */
-       PINMUX_IRQ(evt2irq(0x02E0), PORT120_FN0, PORT209_FN0),  /* IRQ7A */
-       PINMUX_IRQ(evt2irq(0x0300), PORT119_FN0),               /* IRQ8A */
-       PINMUX_IRQ(evt2irq(0x0320), PORT118_FN0, PORT210_FN0),  /* IRQ9A */
-       PINMUX_IRQ(evt2irq(0x0340), PORT19_FN0),                /* IRQ10A */
-       PINMUX_IRQ(evt2irq(0x0360), PORT104_FN0),               /* IRQ11A */
-       PINMUX_IRQ(evt2irq(0x0380), PORT42_FN0,  PORT97_FN0),   /* IRQ12A */
-       PINMUX_IRQ(evt2irq(0x03A0), PORT64_FN0,  PORT98_FN0),   /* IRQ13A */
-       PINMUX_IRQ(evt2irq(0x03C0), PORT63_FN0,  PORT99_FN0),   /* IRQ14A */
-       PINMUX_IRQ(evt2irq(0x03E0), PORT62_FN0,  PORT100_FN0),  /* IRQ15A */
-       PINMUX_IRQ(evt2irq(0x3200), PORT68_FN0,  PORT211_FN0),  /* IRQ16A */
-       PINMUX_IRQ(evt2irq(0x3220), PORT69_FN0),                /* IRQ17A */
-       PINMUX_IRQ(evt2irq(0x3240), PORT70_FN0),                /* IRQ18A */
-       PINMUX_IRQ(evt2irq(0x3260), PORT71_FN0),                /* IRQ19A */
-       PINMUX_IRQ(evt2irq(0x3280), PORT67_FN0),                /* IRQ20A */
-       PINMUX_IRQ(evt2irq(0x32A0), PORT202_FN0),               /* IRQ21A */
-       PINMUX_IRQ(evt2irq(0x32C0), PORT95_FN0),                /* IRQ22A */
-       PINMUX_IRQ(evt2irq(0x32E0), PORT96_FN0),                /* IRQ23A */
-       PINMUX_IRQ(evt2irq(0x3300), PORT180_FN0),               /* IRQ24A */
-       PINMUX_IRQ(evt2irq(0x3320), PORT38_FN0),                /* IRQ25A */
-       PINMUX_IRQ(evt2irq(0x3340), PORT58_FN0,  PORT81_FN0),   /* IRQ26A */
-       PINMUX_IRQ(evt2irq(0x3360), PORT57_FN0,  PORT168_FN0),  /* IRQ27A */
-       PINMUX_IRQ(evt2irq(0x3380), PORT56_FN0,  PORT169_FN0),  /* IRQ28A */
-       PINMUX_IRQ(evt2irq(0x33A0), PORT50_FN0,  PORT170_FN0),  /* IRQ29A */
-       PINMUX_IRQ(evt2irq(0x33C0), PORT49_FN0,  PORT171_FN0),  /* IRQ30A */
-       PINMUX_IRQ(evt2irq(0x33E0), PORT41_FN0,  PORT167_FN0),  /* IRQ31A */
-};
-
-struct sh_pfc_soc_info r8a7740_pinmux_info = {
+static const struct pinmux_irq pinmux_irqs[] = {
+       PINMUX_IRQ(irq_pin(0), GPIO_PORT2,   GPIO_PORT13),      /* IRQ0A */
+       PINMUX_IRQ(irq_pin(1), GPIO_PORT20),            /* IRQ1A */
+       PINMUX_IRQ(irq_pin(2), GPIO_PORT11,  GPIO_PORT12),      /* IRQ2A */
+       PINMUX_IRQ(irq_pin(3), GPIO_PORT10,  GPIO_PORT14),      /* IRQ3A */
+       PINMUX_IRQ(irq_pin(4), GPIO_PORT15,  GPIO_PORT172),/* IRQ4A */
+       PINMUX_IRQ(irq_pin(5), GPIO_PORT0,   GPIO_PORT1),       /* IRQ5A */
+       PINMUX_IRQ(irq_pin(6), GPIO_PORT121, GPIO_PORT173),/* IRQ6A */
+       PINMUX_IRQ(irq_pin(7), GPIO_PORT120, GPIO_PORT209),/* IRQ7A */
+       PINMUX_IRQ(irq_pin(8), GPIO_PORT119),           /* IRQ8A */
+       PINMUX_IRQ(irq_pin(9), GPIO_PORT118, GPIO_PORT210),/* IRQ9A */
+       PINMUX_IRQ(irq_pin(10), GPIO_PORT19),           /* IRQ10A */
+       PINMUX_IRQ(irq_pin(11), GPIO_PORT104),          /* IRQ11A */
+       PINMUX_IRQ(irq_pin(12), GPIO_PORT42,  GPIO_PORT97),     /* IRQ12A */
+       PINMUX_IRQ(irq_pin(13), GPIO_PORT64,  GPIO_PORT98),     /* IRQ13A */
+       PINMUX_IRQ(irq_pin(14), GPIO_PORT63,  GPIO_PORT99),     /* IRQ14A */
+       PINMUX_IRQ(irq_pin(15), GPIO_PORT62,  GPIO_PORT100),/* IRQ15A */
+       PINMUX_IRQ(irq_pin(16), GPIO_PORT68,  GPIO_PORT211),/* IRQ16A */
+       PINMUX_IRQ(irq_pin(17), GPIO_PORT69),           /* IRQ17A */
+       PINMUX_IRQ(irq_pin(18), GPIO_PORT70),           /* IRQ18A */
+       PINMUX_IRQ(irq_pin(19), GPIO_PORT71),           /* IRQ19A */
+       PINMUX_IRQ(irq_pin(20), GPIO_PORT67),           /* IRQ20A */
+       PINMUX_IRQ(irq_pin(21), GPIO_PORT202),          /* IRQ21A */
+       PINMUX_IRQ(irq_pin(22), GPIO_PORT95),           /* IRQ22A */
+       PINMUX_IRQ(irq_pin(23), GPIO_PORT96),           /* IRQ23A */
+       PINMUX_IRQ(irq_pin(24), GPIO_PORT180),          /* IRQ24A */
+       PINMUX_IRQ(irq_pin(25), GPIO_PORT38),           /* IRQ25A */
+       PINMUX_IRQ(irq_pin(26), GPIO_PORT58,  GPIO_PORT81),     /* IRQ26A */
+       PINMUX_IRQ(irq_pin(27), GPIO_PORT57,  GPIO_PORT168),/* IRQ27A */
+       PINMUX_IRQ(irq_pin(28), GPIO_PORT56,  GPIO_PORT169),/* IRQ28A */
+       PINMUX_IRQ(irq_pin(29), GPIO_PORT50,  GPIO_PORT170),/* IRQ29A */
+       PINMUX_IRQ(irq_pin(30), GPIO_PORT49,  GPIO_PORT171),/* IRQ30A */
+       PINMUX_IRQ(irq_pin(31), GPIO_PORT41,  GPIO_PORT167),/* IRQ31A */
+};
+
+const struct sh_pfc_soc_info r8a7740_pinmux_info = {
        .name           = "r8a7740_pfc",
-       .reserved_id    = PINMUX_RESERVED,
-       .data           = { PINMUX_DATA_BEGIN,
-                           PINMUX_DATA_END },
        .input          = { PINMUX_INPUT_BEGIN,
                            PINMUX_INPUT_END },
        .input_pu       = { PINMUX_INPUT_PULLUP_BEGIN,
@@ -2592,15 +3038,19 @@ struct sh_pfc_soc_info r8a7740_pinmux_info = {
                            PINMUX_INPUT_PULLDOWN_END },
        .output         = { PINMUX_OUTPUT_BEGIN,
                            PINMUX_OUTPUT_END },
-       .mark           = { PINMUX_MARK_BEGIN,
-                           PINMUX_MARK_END },
        .function       = { PINMUX_FUNCTION_BEGIN,
                            PINMUX_FUNCTION_END },
 
-       .first_gpio     = GPIO_PORT0,
-       .last_gpio      = GPIO_FN_TRACEAUD_FROM_MEMC,
+       .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),
+
+       .func_gpios     = pinmux_func_gpios,
+       .nr_func_gpios  = ARRAY_SIZE(pinmux_func_gpios),
 
-       .gpios          = pinmux_gpios,
        .cfg_regs       = pinmux_config_regs,
        .data_regs      = pinmux_data_regs,
 
index 13feaa0c0eb703e49960d2f62e35264ea8e91cbd..791a6719d8a9d0b551b70e3532433efc3c60e97f 100644 (file)
  */
 
 #include <linux/kernel.h>
-#include <mach/r8a7779.h>
 
 #include "sh_pfc.h"
 
-#define CPU_32_PORT(fn, pfx, sfx)                              \
-       PORT_10(fn, pfx, sfx), PORT_10(fn, pfx##1, sfx),        \
-       PORT_10(fn, pfx##2, sfx), PORT_1(fn, pfx##30, sfx),     \
-       PORT_1(fn, pfx##31, sfx)
-
-#define CPU_32_PORT6(fn, pfx, sfx)                             \
-       PORT_1(fn, pfx##0, sfx), PORT_1(fn, pfx##1, sfx),       \
-       PORT_1(fn, pfx##2, sfx), PORT_1(fn, pfx##3, sfx),       \
-       PORT_1(fn, pfx##4, sfx), PORT_1(fn, pfx##5, sfx),       \
-       PORT_1(fn, pfx##6, sfx), PORT_1(fn, pfx##7, sfx),       \
-       PORT_1(fn, pfx##8, sfx)
-
-#define CPU_ALL_PORT(fn, pfx, sfx)                             \
-       CPU_32_PORT(fn, pfx##_0_, sfx),                         \
-       CPU_32_PORT(fn, pfx##_1_, sfx),                         \
-       CPU_32_PORT(fn, pfx##_2_, sfx),                         \
-       CPU_32_PORT(fn, pfx##_3_, sfx),                         \
-       CPU_32_PORT(fn, pfx##_4_, sfx),                         \
-       CPU_32_PORT(fn, pfx##_5_, sfx),                         \
-       CPU_32_PORT6(fn, pfx##_6_, sfx)
-
-#define _GP_GPIO(pfx, sfx) PINMUX_GPIO(GPIO_GP##pfx, GP##pfx##_DATA)
-#define _GP_DATA(pfx, sfx) PINMUX_DATA(GP##pfx##_DATA, GP##pfx##_FN,   \
-                                      GP##pfx##_IN, GP##pfx##_OUT)
-
-#define _GP_INOUTSEL(pfx, sfx) GP##pfx##_IN, GP##pfx##_OUT
-#define _GP_INDT(pfx, sfx) GP##pfx##_DATA
-
-#define GP_ALL(str)    CPU_ALL_PORT(_PORT_ALL, GP, str)
-#define PINMUX_GPIO_GP_ALL()   CPU_ALL_PORT(_GP_GPIO, , unused)
-#define PINMUX_DATA_GP_ALL()   CPU_ALL_PORT(_GP_DATA, , unused)
-
-
-#define PORT_10_REV(fn, pfx, sfx)                              \
-       PORT_1(fn, pfx##9, sfx), PORT_1(fn, pfx##8, sfx),       \
-       PORT_1(fn, pfx##7, sfx), PORT_1(fn, pfx##6, sfx),       \
-       PORT_1(fn, pfx##5, sfx), PORT_1(fn, pfx##4, sfx),       \
-       PORT_1(fn, pfx##3, sfx), PORT_1(fn, pfx##2, sfx),       \
-       PORT_1(fn, pfx##1, sfx), PORT_1(fn, pfx##0, sfx)
-
-#define CPU_32_PORT_REV(fn, pfx, sfx)                                  \
-       PORT_1(fn, pfx##31, sfx), PORT_1(fn, pfx##30, sfx),             \
-       PORT_10_REV(fn, pfx##2, sfx), PORT_10_REV(fn, pfx##1, sfx),     \
-       PORT_10_REV(fn, pfx, sfx)
-
-#define GP_INOUTSEL(bank) CPU_32_PORT_REV(_GP_INOUTSEL, _##bank##_, unused)
-#define GP_INDT(bank) CPU_32_PORT_REV(_GP_INDT, _##bank##_, unused)
+#define PORT_GP_1(bank, pin, fn, sfx) fn(bank, pin, GP_##bank##_##pin, sfx)
+
+#define PORT_GP_32(bank, fn, sfx)                                      \
+       PORT_GP_1(bank, 0,  fn, sfx), PORT_GP_1(bank, 1,  fn, sfx),     \
+       PORT_GP_1(bank, 2,  fn, sfx), PORT_GP_1(bank, 3,  fn, sfx),     \
+       PORT_GP_1(bank, 4,  fn, sfx), PORT_GP_1(bank, 5,  fn, sfx),     \
+       PORT_GP_1(bank, 6,  fn, sfx), PORT_GP_1(bank, 7,  fn, sfx),     \
+       PORT_GP_1(bank, 8,  fn, sfx), PORT_GP_1(bank, 9,  fn, sfx),     \
+       PORT_GP_1(bank, 10, fn, sfx), PORT_GP_1(bank, 11, fn, sfx),     \
+       PORT_GP_1(bank, 12, fn, sfx), PORT_GP_1(bank, 13, fn, sfx),     \
+       PORT_GP_1(bank, 14, fn, sfx), PORT_GP_1(bank, 15, fn, sfx),     \
+       PORT_GP_1(bank, 16, fn, sfx), PORT_GP_1(bank, 17, fn, sfx),     \
+       PORT_GP_1(bank, 18, fn, sfx), PORT_GP_1(bank, 19, fn, sfx),     \
+       PORT_GP_1(bank, 20, fn, sfx), PORT_GP_1(bank, 21, fn, sfx),     \
+       PORT_GP_1(bank, 22, fn, sfx), PORT_GP_1(bank, 23, fn, sfx),     \
+       PORT_GP_1(bank, 24, fn, sfx), PORT_GP_1(bank, 25, fn, sfx),     \
+       PORT_GP_1(bank, 26, fn, sfx), PORT_GP_1(bank, 27, fn, sfx),     \
+       PORT_GP_1(bank, 28, fn, sfx), PORT_GP_1(bank, 29, fn, sfx),     \
+       PORT_GP_1(bank, 30, fn, sfx), PORT_GP_1(bank, 31, fn, sfx)
+
+#define PORT_GP_32_9(bank, fn, sfx)                                    \
+       PORT_GP_1(bank, 0, fn, sfx), PORT_GP_1(bank, 1, fn, sfx),       \
+       PORT_GP_1(bank, 2, fn, sfx), PORT_GP_1(bank, 3, fn, sfx),       \
+       PORT_GP_1(bank, 4, fn, sfx), PORT_GP_1(bank, 5, fn, sfx),       \
+       PORT_GP_1(bank, 6, fn, sfx), PORT_GP_1(bank, 7, fn, sfx),       \
+       PORT_GP_1(bank, 8, fn, sfx)
+
+#define PORT_GP_32_REV(bank, fn, sfx)                                  \
+       PORT_GP_1(bank, 31, fn, sfx), PORT_GP_1(bank, 30, fn, sfx),     \
+       PORT_GP_1(bank, 29, fn, sfx), PORT_GP_1(bank, 28, fn, sfx),     \
+       PORT_GP_1(bank, 27, fn, sfx), PORT_GP_1(bank, 26, fn, sfx),     \
+       PORT_GP_1(bank, 25, fn, sfx), PORT_GP_1(bank, 24, fn, sfx),     \
+       PORT_GP_1(bank, 23, fn, sfx), PORT_GP_1(bank, 22, fn, sfx),     \
+       PORT_GP_1(bank, 21, fn, sfx), PORT_GP_1(bank, 20, fn, sfx),     \
+       PORT_GP_1(bank, 19, fn, sfx), PORT_GP_1(bank, 18, fn, sfx),     \
+       PORT_GP_1(bank, 17, fn, sfx), PORT_GP_1(bank, 16, fn, sfx),     \
+       PORT_GP_1(bank, 15, fn, sfx), PORT_GP_1(bank, 14, fn, sfx),     \
+       PORT_GP_1(bank, 13, fn, sfx), PORT_GP_1(bank, 12, fn, sfx),     \
+       PORT_GP_1(bank, 11, fn, sfx), PORT_GP_1(bank, 10, fn, sfx),     \
+       PORT_GP_1(bank, 9,  fn, sfx), PORT_GP_1(bank, 8,  fn, sfx),     \
+       PORT_GP_1(bank, 7,  fn, sfx), PORT_GP_1(bank, 6,  fn, sfx),     \
+       PORT_GP_1(bank, 5,  fn, sfx), PORT_GP_1(bank, 4,  fn, sfx),     \
+       PORT_GP_1(bank, 3,  fn, sfx), PORT_GP_1(bank, 2,  fn, sfx),     \
+       PORT_GP_1(bank, 1,  fn, sfx), PORT_GP_1(bank, 0,  fn, sfx)
+
+#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_9(6, fn, sfx)
+
+#define _GP_PORT_ALL(bank, pin, name, sfx)     name##_##sfx
+
+#define _GP_GPIO(bank, pin, _name, sfx)                                        \
+       [(bank * 32) + pin] = {                                         \
+               .name = __stringify(_name),                             \
+               .enum_id = _name##_DATA,                                \
+       }
+
+#define _GP_DATA(bank, pin, name, sfx)                                 \
+       PINMUX_DATA(name##_DATA, name##_FN)
+
+#define GP_ALL(str)            CPU_ALL_PORT(_GP_PORT_ALL, str)
+#define PINMUX_GPIO_GP_ALL()   CPU_ALL_PORT(_GP_GPIO, unused)
+#define PINMUX_DATA_GP_ALL()   CPU_ALL_PORT(_GP_DATA, unused)
 
 #define PINMUX_IPSR_DATA(ipsr, fn) PINMUX_DATA(fn##_MARK, FN_##ipsr, FN_##fn)
 #define PINMUX_IPSR_MODSEL_DATA(ipsr, fn, ms) PINMUX_DATA(fn##_MARK, FN_##ms, \
@@ -82,14 +102,6 @@ enum {
        GP_ALL(DATA), /* GP_0_0_DATA -> GP_6_8_DATA */
        PINMUX_DATA_END,
 
-       PINMUX_INPUT_BEGIN,
-       GP_ALL(IN), /* GP_0_0_IN -> GP_6_8_IN */
-       PINMUX_INPUT_END,
-
-       PINMUX_OUTPUT_BEGIN,
-       GP_ALL(OUT), /* GP_0_0_OUT -> GP_6_8_OUT */
-       PINMUX_OUTPUT_END,
-
        PINMUX_FUNCTION_BEGIN,
        GP_ALL(FN), /* GP_0_0_FN -> GP_6_8_FN */
 
@@ -371,7 +383,7 @@ enum {
        FN_VI1_DATA6_VI1_B6, FN_SD2_CD, FN_MT0_VCXO, FN_SPA_TMS,
        FN_HSPI_TX1_D, FN_VI1_DATA7_VI1_B7, FN_SD2_WP, FN_MT0_PWM,
        FN_SPA_TDI, FN_HSPI_RX1_D, FN_VI1_G0, FN_VI3_DATA0,
-       FN_DU1_DOTCLKOUT1, FN_TS_SCK1, FN_DREQ2_B, FN_TX2,
+       FN_TS_SCK1, FN_DREQ2_B, FN_TX2,
        FN_SPA_TDO, FN_HCTS0_B, FN_VI1_G1, FN_VI3_DATA1,
        FN_SSI_SCK1, FN_TS_SDEN1, FN_DACK2_B, FN_RX2, FN_HRTS0_B,
 
@@ -447,7 +459,8 @@ enum {
        A0_MARK, SD1_DAT3_MARK, MMC0_D3_MARK, FD3_MARK,
        BS_MARK, SD1_DAT2_MARK, MMC0_D2_MARK, FD2_MARK,
        ATADIR0_MARK, SDSELF_MARK, HCTS1_MARK, TX4_C_MARK,
-       USB_PENC2_MARK, SCK0_MARK, PWM1_MARK, PWMFSW0_MARK,
+       USB_PENC0_MARK, USB_PENC1_MARK, USB_PENC2_MARK,
+       SCK0_MARK, PWM1_MARK, PWMFSW0_MARK,
        SCIF_CLK_MARK, TCLK0_C_MARK,
 
        EX_CS0_MARK, RX3_C_IRDA_RX_C_MARK, MMC0_D6_MARK,
@@ -632,7 +645,7 @@ enum {
        HSPI_CS1_D_MARK, ADICHS2_B_MARK, VI1_DATA6_VI1_B6_MARK, SD2_CD_MARK,
        MT0_VCXO_MARK, SPA_TMS_MARK, HSPI_TX1_D_MARK, VI1_DATA7_VI1_B7_MARK,
        SD2_WP_MARK, MT0_PWM_MARK, SPA_TDI_MARK, HSPI_RX1_D_MARK,
-       VI1_G0_MARK, VI3_DATA0_MARK, DU1_DOTCLKOUT1_MARK, TS_SCK1_MARK,
+       VI1_G0_MARK, VI3_DATA0_MARK, TS_SCK1_MARK,
        DREQ2_B_MARK, TX2_MARK, SPA_TDO_MARK, HCTS0_B_MARK,
        VI1_G1_MARK, VI3_DATA1_MARK, SSI_SCK1_MARK, TS_SDEN1_MARK,
        DACK2_B_MARK, RX2_MARK, HRTS0_B_MARK,
@@ -649,7 +662,7 @@ enum {
        PINMUX_MARK_END,
 };
 
-static pinmux_enum_t pinmux_data[] = {
+static const pinmux_enum_t pinmux_data[] = {
        PINMUX_DATA_GP_ALL(), /* PINMUX_DATA(GP_M_N_DATA, GP_M_N_FN...), */
 
        PINMUX_DATA(AVS1_MARK, FN_AVS1),
@@ -658,6 +671,9 @@ static pinmux_enum_t pinmux_data[] = {
        PINMUX_DATA(A18_MARK, FN_A18),
        PINMUX_DATA(A19_MARK, FN_A19),
 
+       PINMUX_DATA(USB_PENC0_MARK, FN_USB_PENC0),
+       PINMUX_DATA(USB_PENC1_MARK, FN_USB_PENC1),
+
        PINMUX_IPSR_DATA(IP0_2_0, USB_PENC2),
        PINMUX_IPSR_MODSEL_DATA(IP0_2_0, SCK0, SEL_SCIF0_0),
        PINMUX_IPSR_DATA(IP0_2_0, PWM1),
@@ -1399,7 +1415,6 @@ static pinmux_enum_t pinmux_data[] = {
        PINMUX_IPSR_MODSEL_DATA(IP11_23_21, HSPI_RX1_D, SEL_HSPI1_3),
        PINMUX_IPSR_DATA(IP11_26_24, VI1_G0),
        PINMUX_IPSR_DATA(IP11_26_24, VI3_DATA0),
-       PINMUX_IPSR_DATA(IP11_26_24, DU1_DOTCLKOUT1),
        PINMUX_IPSR_DATA(IP11_26_24, TS_SCK1),
        PINMUX_IPSR_MODSEL_DATA(IP11_26_24, DREQ2_B, SEL_EXBUS2_1),
        PINMUX_IPSR_DATA(IP11_26_24, TX2),
@@ -1450,280 +1465,1260 @@ static pinmux_enum_t pinmux_data[] = {
        PINMUX_IPSR_MODSEL_DATA(IP12_17_15, SCK4_B, SEL_SCIF4_1),
 };
 
-static struct pinmux_gpio pinmux_gpios[] = {
+static struct sh_pfc_pin pinmux_pins[] = {
        PINMUX_GPIO_GP_ALL(),
-       GPIO_FN(AVS1), GPIO_FN(AVS2), GPIO_FN(A17), GPIO_FN(A18),
-       GPIO_FN(A19),
+};
 
-       /* IPSR0 */
-       GPIO_FN(USB_PENC2), GPIO_FN(SCK0), GPIO_FN(PWM1), GPIO_FN(PWMFSW0),
-       GPIO_FN(SCIF_CLK), GPIO_FN(TCLK0_C), GPIO_FN(BS), GPIO_FN(SD1_DAT2),
-       GPIO_FN(MMC0_D2), GPIO_FN(FD2), GPIO_FN(ATADIR0), GPIO_FN(SDSELF),
-       GPIO_FN(HCTS1), GPIO_FN(TX4_C), GPIO_FN(A0), GPIO_FN(SD1_DAT3),
-       GPIO_FN(MMC0_D3), GPIO_FN(FD3), GPIO_FN(A20), GPIO_FN(TX5_D),
-       GPIO_FN(HSPI_TX2_B), GPIO_FN(A21), GPIO_FN(SCK5_D),
-       GPIO_FN(HSPI_CLK2_B), GPIO_FN(A22), GPIO_FN(RX5_D),
-       GPIO_FN(HSPI_RX2_B), GPIO_FN(VI1_R0), GPIO_FN(A23), GPIO_FN(FCLE),
-       GPIO_FN(HSPI_CLK2), GPIO_FN(VI1_R1), GPIO_FN(A24), GPIO_FN(SD1_CD),
-       GPIO_FN(MMC0_D4), GPIO_FN(FD4), GPIO_FN(HSPI_CS2), GPIO_FN(VI1_R2),
-       GPIO_FN(SSI_WS78_B), GPIO_FN(A25), GPIO_FN(SD1_WP), GPIO_FN(MMC0_D5),
-       GPIO_FN(FD5), GPIO_FN(HSPI_RX2), GPIO_FN(VI1_R3), GPIO_FN(TX5_B),
-       GPIO_FN(SSI_SDATA7_B), GPIO_FN(CTS0_B), GPIO_FN(CLKOUT),
-       GPIO_FN(TX3C_IRDA_TX_C), GPIO_FN(PWM0_B), GPIO_FN(CS0),
-       GPIO_FN(HSPI_CS2_B), GPIO_FN(CS1_A26), GPIO_FN(HSPI_TX2),
-       GPIO_FN(SDSELF_B), GPIO_FN(RD_WR), GPIO_FN(FWE), GPIO_FN(ATAG0),
-       GPIO_FN(VI1_R7), GPIO_FN(HRTS1), GPIO_FN(RX4_C),
+/* - DU0 -------------------------------------------------------------------- */
+static const unsigned int du0_rgb666_pins[] = {
+       /* R[7:2], G[7:2], B[7:2] */
+       188, 187, 186, 185, 184, 183,
+       194, 193, 192, 191, 190, 189,
+       200, 199, 198, 197, 196, 195,
+};
+static const unsigned int du0_rgb666_mux[] = {
+       DU0_DR7_MARK, DU0_DR6_MARK, DU0_DR5_MARK, DU0_DR4_MARK,
+       DU0_DR3_MARK, DU0_DR2_MARK,
+       DU0_DG7_MARK, DU0_DG6_MARK, DU0_DG5_MARK, DU0_DG4_MARK,
+       DU0_DG3_MARK, DU0_DG2_MARK,
+       DU0_DB7_MARK, DU0_DB6_MARK, DU0_DB5_MARK, DU0_DB4_MARK,
+       DU0_DB3_MARK, DU0_DB2_MARK,
+};
+static const unsigned int du0_rgb888_pins[] = {
+       /* R[7:0], G[7:0], B[7:0] */
+       188, 187, 186, 185, 184, 183, 24, 23,
+       194, 193, 192, 191, 190, 189, 26, 25,
+       200, 199, 198, 197, 196, 195, 28, 27,
+};
+static const unsigned int du0_rgb888_mux[] = {
+       DU0_DR7_MARK, DU0_DR6_MARK, DU0_DR5_MARK, DU0_DR4_MARK,
+       DU0_DR3_MARK, DU0_DR2_MARK, DU0_DR1_MARK, DU0_DR0_MARK,
+       DU0_DG7_MARK, DU0_DG6_MARK, DU0_DG5_MARK, DU0_DG4_MARK,
+       DU0_DG3_MARK, DU0_DG2_MARK, DU0_DG1_MARK, DU0_DG0_MARK,
+       DU0_DB7_MARK, DU0_DB6_MARK, DU0_DB5_MARK, DU0_DB4_MARK,
+       DU0_DB3_MARK, DU0_DB2_MARK, DU0_DB1_MARK, DU0_DB0_MARK,
+};
+static const unsigned int du0_clk_in_pins[] = {
+       /* CLKIN */
+       29,
+};
+static const unsigned int du0_clk_in_mux[] = {
+       DU0_DOTCLKIN_MARK,
+};
+static const unsigned int du0_clk_out_0_pins[] = {
+       /* CLKOUT */
+       180,
+};
+static const unsigned int du0_clk_out_0_mux[] = {
+       DU0_DOTCLKOUT0_MARK,
+};
+static const unsigned int du0_clk_out_1_pins[] = {
+       /* CLKOUT */
+       30,
+};
+static const unsigned int du0_clk_out_1_mux[] = {
+       DU0_DOTCLKOUT1_MARK,
+};
+static const unsigned int du0_sync_0_pins[] = {
+       /* VSYNC, HSYNC, DISP */
+       182, 181, 31,
+};
+static const unsigned int du0_sync_0_mux[] = {
+       DU0_EXHSYNC_DU0_HSYNC_MARK, DU0_EXVSYNC_DU0_VSYNC_MARK,
+       DU0_EXODDF_DU0_ODDF_DISP_CDE_MARK
+};
+static const unsigned int du0_sync_1_pins[] = {
+       /* VSYNC, HSYNC, DISP */
+       182, 181, 32,
+};
+static const unsigned int du0_sync_1_mux[] = {
+       DU0_EXHSYNC_DU0_HSYNC_MARK, DU0_EXVSYNC_DU0_VSYNC_MARK,
+       DU0_DISP_MARK
+};
+static const unsigned int du0_oddf_pins[] = {
+       /* ODDF */
+       31,
+};
+static const unsigned int du0_oddf_mux[] = {
+       DU0_EXODDF_DU0_ODDF_DISP_CDE_MARK
+};
+static const unsigned int du0_cde_pins[] = {
+       /* CDE */
+       33,
+};
+static const unsigned int du0_cde_mux[] = {
+       DU0_CDE_MARK
+};
+/* - DU1 -------------------------------------------------------------------- */
+static const unsigned int du1_rgb666_pins[] = {
+       /* R[7:2], G[7:2], B[7:2] */
+       41, 40, 39, 38, 37, 36,
+       49, 48, 47, 46, 45, 44,
+       57, 56, 55, 54, 53, 52,
+};
+static const unsigned int du1_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 du1_rgb888_pins[] = {
+       /* R[7:0], G[7:0], B[7:0] */
+       41, 40, 39, 38, 37, 36, 35, 34,
+       49, 48, 47, 46, 45, 44, 43, 32,
+       57, 56, 55, 54, 53, 52, 51, 50,
+};
+static const unsigned int du1_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 du1_clk_in_pins[] = {
+       /* CLKIN */
+       58,
+};
+static const unsigned int du1_clk_in_mux[] = {
+       DU1_DOTCLKIN_MARK,
+};
+static const unsigned int du1_clk_out_pins[] = {
+       /* CLKOUT */
+       59,
+};
+static const unsigned int du1_clk_out_mux[] = {
+       DU1_DOTCLKOUT_MARK,
+};
+static const unsigned int du1_sync_0_pins[] = {
+       /* VSYNC, HSYNC, DISP */
+       61, 60, 62,
+};
+static const unsigned int du1_sync_0_mux[] = {
+       DU1_EXVSYNC_DU1_VSYNC_MARK, DU1_EXHSYNC_DU1_HSYNC_MARK,
+       DU1_EXODDF_DU1_ODDF_DISP_CDE_MARK
+};
+static const unsigned int du1_sync_1_pins[] = {
+       /* VSYNC, HSYNC, DISP */
+       61, 60, 63,
+};
+static const unsigned int du1_sync_1_mux[] = {
+       DU1_EXVSYNC_DU1_VSYNC_MARK, DU1_EXHSYNC_DU1_HSYNC_MARK,
+       DU1_DISP_MARK
+};
+static const unsigned int du1_oddf_pins[] = {
+       /* ODDF */
+       62,
+};
+static const unsigned int du1_oddf_mux[] = {
+       DU1_EXODDF_DU1_ODDF_DISP_CDE_MARK
+};
+static const unsigned int du1_cde_pins[] = {
+       /* CDE */
+       64,
+};
+static const unsigned int du1_cde_mux[] = {
+       DU1_CDE_MARK
+};
+/* - HSPI0 ------------------------------------------------------------------ */
+static const unsigned int hspi0_pins[] = {
+       /* CLK, CS, RX, TX */
+       150, 151, 153, 152,
+};
+static const unsigned int hspi0_mux[] = {
+       HSPI_CLK0_MARK, HSPI_CS0_MARK, HSPI_RX0_MARK, HSPI_TX0_MARK,
+};
+/* - HSPI1 ------------------------------------------------------------------ */
+static const unsigned int hspi1_pins[] = {
+       /* CLK, CS, RX, TX */
+       63, 58, 64, 62,
+};
+static const unsigned int hspi1_mux[] = {
+       HSPI_CLK1_MARK, HSPI_CS1_MARK, HSPI_RX1_MARK, HSPI_TX1_MARK,
+};
+static const unsigned int hspi1_b_pins[] = {
+       /* CLK, CS, RX, TX */
+       90, 91, 93, 92,
+};
+static const unsigned int hspi1_b_mux[] = {
+       HSPI_CLK1_B_MARK, HSPI_CS1_B_MARK, HSPI_RX1_B_MARK, HSPI_TX1_B_MARK,
+};
+static const unsigned int hspi1_c_pins[] = {
+       /* CLK, CS, RX, TX */
+       141, 142, 144, 143,
+};
+static const unsigned int hspi1_c_mux[] = {
+       HSPI_CLK1_C_MARK, HSPI_CS1_C_MARK, HSPI_RX1_C_MARK, HSPI_TX1_C_MARK,
+};
+static const unsigned int hspi1_d_pins[] = {
+       /* CLK, CS, RX, TX */
+       101, 102, 104, 103,
+};
+static const unsigned int hspi1_d_mux[] = {
+       HSPI_CLK1_D_MARK, HSPI_CS1_D_MARK, HSPI_RX1_D_MARK, HSPI_TX1_D_MARK,
+};
+/* - HSPI2 ------------------------------------------------------------------ */
+static const unsigned int hspi2_pins[] = {
+       /* CLK, CS, RX, TX */
+       9, 10, 11, 14,
+};
+static const unsigned int hspi2_mux[] = {
+       HSPI_CLK2_MARK, HSPI_CS2_MARK, HSPI_RX2_MARK, HSPI_TX2_MARK,
+};
+static const unsigned int hspi2_b_pins[] = {
+       /* CLK, CS, RX, TX */
+       7, 13, 8, 6,
+};
+static const unsigned int hspi2_b_mux[] = {
+       HSPI_CLK2_B_MARK, HSPI_CS2_B_MARK, HSPI_RX2_B_MARK, HSPI_TX2_B_MARK,
+};
+/* - INTC ------------------------------------------------------------------- */
+static const unsigned int intc_irq0_pins[] = {
+       /* IRQ */
+       78,
+};
+static const unsigned int intc_irq0_mux[] = {
+       IRQ0_MARK,
+};
+static const unsigned int intc_irq0_b_pins[] = {
+       /* IRQ */
+       141,
+};
+static const unsigned int intc_irq0_b_mux[] = {
+       IRQ0_B_MARK,
+};
+static const unsigned int intc_irq1_pins[] = {
+       /* IRQ */
+       79,
+};
+static const unsigned int intc_irq1_mux[] = {
+       IRQ1_MARK,
+};
+static const unsigned int intc_irq1_b_pins[] = {
+       /* IRQ */
+       142,
+};
+static const unsigned int intc_irq1_b_mux[] = {
+       IRQ1_B_MARK,
+};
+static const unsigned int intc_irq2_pins[] = {
+       /* IRQ */
+       88,
+};
+static const unsigned int intc_irq2_mux[] = {
+       IRQ2_MARK,
+};
+static const unsigned int intc_irq2_b_pins[] = {
+       /* IRQ */
+       143,
+};
+static const unsigned int intc_irq2_b_mux[] = {
+       IRQ2_B_MARK,
+};
+static const unsigned int intc_irq3_pins[] = {
+       /* IRQ */
+       89,
+};
+static const unsigned int intc_irq3_mux[] = {
+       IRQ3_MARK,
+};
+static const unsigned int intc_irq3_b_pins[] = {
+       /* IRQ */
+       144,
+};
+static const unsigned int intc_irq3_b_mux[] = {
+       IRQ3_B_MARK,
+};
+/* - LSBC ------------------------------------------------------------------- */
+static const unsigned int lbsc_cs0_pins[] = {
+       /* CS */
+       13,
+};
+static const unsigned int lbsc_cs0_mux[] = {
+       CS0_MARK,
+};
+static const unsigned int lbsc_cs1_pins[] = {
+       /* CS */
+       14,
+};
+static const unsigned int lbsc_cs1_mux[] = {
+       CS1_A26_MARK,
+};
+static const unsigned int lbsc_ex_cs0_pins[] = {
+       /* CS */
+       15,
+};
+static const unsigned int lbsc_ex_cs0_mux[] = {
+       EX_CS0_MARK,
+};
+static const unsigned int lbsc_ex_cs1_pins[] = {
+       /* CS */
+       16,
+};
+static const unsigned int lbsc_ex_cs1_mux[] = {
+       EX_CS1_MARK,
+};
+static const unsigned int lbsc_ex_cs2_pins[] = {
+       /* CS */
+       17,
+};
+static const unsigned int lbsc_ex_cs2_mux[] = {
+       EX_CS2_MARK,
+};
+static const unsigned int lbsc_ex_cs3_pins[] = {
+       /* CS */
+       18,
+};
+static const unsigned int lbsc_ex_cs3_mux[] = {
+       EX_CS3_MARK,
+};
+static const unsigned int lbsc_ex_cs4_pins[] = {
+       /* CS */
+       19,
+};
+static const unsigned int lbsc_ex_cs4_mux[] = {
+       EX_CS4_MARK,
+};
+static const unsigned int lbsc_ex_cs5_pins[] = {
+       /* CS */
+       20,
+};
+static const unsigned int lbsc_ex_cs5_mux[] = {
+       EX_CS5_MARK,
+};
+/* - MMCIF ------------------------------------------------------------------ */
+static const unsigned int mmc0_data1_pins[] = {
+       /* D[0] */
+       19,
+};
+static const unsigned int mmc0_data1_mux[] = {
+       MMC0_D0_MARK,
+};
+static const unsigned int mmc0_data4_pins[] = {
+       /* D[0:3] */
+       19, 20, 21, 2,
+};
+static const unsigned int mmc0_data4_mux[] = {
+       MMC0_D0_MARK, MMC0_D1_MARK, MMC0_D2_MARK, MMC0_D3_MARK,
+};
+static const unsigned int mmc0_data8_pins[] = {
+       /* D[0:7] */
+       19, 20, 21, 2, 10, 11, 15, 16,
+};
+static const unsigned int mmc0_data8_mux[] = {
+       MMC0_D0_MARK, MMC0_D1_MARK, MMC0_D2_MARK, MMC0_D3_MARK,
+       MMC0_D4_MARK, MMC0_D5_MARK, MMC0_D6_MARK, MMC0_D7_MARK,
+};
+static const unsigned int mmc0_ctrl_pins[] = {
+       /* CMD, CLK */
+       18, 17,
+};
+static const unsigned int mmc0_ctrl_mux[] = {
+       MMC0_CMD_MARK, MMC0_CLK_MARK,
+};
+static const unsigned int mmc1_data1_pins[] = {
+       /* D[0] */
+       72,
+};
+static const unsigned int mmc1_data1_mux[] = {
+       MMC1_D0_MARK,
+};
+static const unsigned int mmc1_data4_pins[] = {
+       /* D[0:3] */
+       72, 73, 74, 75,
+};
+static const unsigned int mmc1_data4_mux[] = {
+       MMC1_D0_MARK, MMC1_D1_MARK, MMC1_D2_MARK, MMC1_D3_MARK,
+};
+static const unsigned int mmc1_data8_pins[] = {
+       /* D[0:7] */
+       72, 73, 74, 75, 76, 77, 80, 81,
+};
+static const unsigned int mmc1_data8_mux[] = {
+       MMC1_D0_MARK, MMC1_D1_MARK, MMC1_D2_MARK, MMC1_D3_MARK,
+       MMC1_D4_MARK, MMC1_D5_MARK, MMC1_D6_MARK, MMC1_D7_MARK,
+};
+static const unsigned int mmc1_ctrl_pins[] = {
+       /* CMD, CLK */
+       68, 65,
+};
+static const unsigned int mmc1_ctrl_mux[] = {
+       MMC1_CMD_MARK, MMC1_CLK_MARK,
+};
+/* - SCIF0 ------------------------------------------------------------------ */
+static const unsigned int scif0_data_pins[] = {
+       /* RXD, TXD */
+       153, 152,
+};
+static const unsigned int scif0_data_mux[] = {
+       RX0_MARK, TX0_MARK,
+};
+static const unsigned int scif0_clk_pins[] = {
+       /* SCK */
+       156,
+};
+static const unsigned int scif0_clk_mux[] = {
+       SCK0_MARK,
+};
+static const unsigned int scif0_ctrl_pins[] = {
+       /* RTS, CTS */
+       151, 150,
+};
+static const unsigned int scif0_ctrl_mux[] = {
+       RTS0_TANS_MARK, CTS0_MARK,
+};
+static const unsigned int scif0_data_b_pins[] = {
+       /* RXD, TXD */
+       20, 19,
+};
+static const unsigned int scif0_data_b_mux[] = {
+       RX0_B_MARK, TX0_B_MARK,
+};
+static const unsigned int scif0_clk_b_pins[] = {
+       /* SCK */
+       33,
+};
+static const unsigned int scif0_clk_b_mux[] = {
+       SCK0_B_MARK,
+};
+static const unsigned int scif0_ctrl_b_pins[] = {
+       /* RTS, CTS */
+       18, 11,
+};
+static const unsigned int scif0_ctrl_b_mux[] = {
+       RTS0_B_TANS_B_MARK, CTS0_B_MARK,
+};
+static const unsigned int scif0_data_c_pins[] = {
+       /* RXD, TXD */
+       146, 147,
+};
+static const unsigned int scif0_data_c_mux[] = {
+       RX0_C_MARK, TX0_C_MARK,
+};
+static const unsigned int scif0_clk_c_pins[] = {
+       /* SCK */
+       145,
+};
+static const unsigned int scif0_clk_c_mux[] = {
+       SCK0_C_MARK,
+};
+static const unsigned int scif0_ctrl_c_pins[] = {
+       /* RTS, CTS */
+       149, 148,
+};
+static const unsigned int scif0_ctrl_c_mux[] = {
+       RTS0_C_TANS_C_MARK, CTS0_C_MARK,
+};
+static const unsigned int scif0_data_d_pins[] = {
+       /* RXD, TXD */
+       43, 42,
+};
+static const unsigned int scif0_data_d_mux[] = {
+       RX0_D_MARK, TX0_D_MARK,
+};
+static const unsigned int scif0_clk_d_pins[] = {
+       /* SCK */
+       50,
+};
+static const unsigned int scif0_clk_d_mux[] = {
+       SCK0_D_MARK,
+};
+static const unsigned int scif0_ctrl_d_pins[] = {
+       /* RTS, CTS */
+       51, 35,
+};
+static const unsigned int scif0_ctrl_d_mux[] = {
+       RTS0_D_TANS_D_MARK, CTS0_D_MARK,
+};
+/* - SCIF1 ------------------------------------------------------------------ */
+static const unsigned int scif1_data_pins[] = {
+       /* RXD, TXD */
+       149, 148,
+};
+static const unsigned int scif1_data_mux[] = {
+       RX1_MARK, TX1_MARK,
+};
+static const unsigned int scif1_clk_pins[] = {
+       /* SCK */
+       145,
+};
+static const unsigned int scif1_clk_mux[] = {
+       SCK1_MARK,
+};
+static const unsigned int scif1_ctrl_pins[] = {
+       /* RTS, CTS */
+       147, 146,
+};
+static const unsigned int scif1_ctrl_mux[] = {
+       RTS1_TANS_MARK, CTS1_MARK,
+};
+static const unsigned int scif1_data_b_pins[] = {
+       /* RXD, TXD */
+       117, 114,
+};
+static const unsigned int scif1_data_b_mux[] = {
+       RX1_B_MARK, TX1_B_MARK,
+};
+static const unsigned int scif1_clk_b_pins[] = {
+       /* SCK */
+       113,
+};
+static const unsigned int scif1_clk_b_mux[] = {
+       SCK1_B_MARK,
+};
+static const unsigned int scif1_ctrl_b_pins[] = {
+       /* RTS, CTS */
+       115, 116,
+};
+static const unsigned int scif1_ctrl_b_mux[] = {
+       RTS1_B_TANS_B_MARK, CTS1_B_MARK,
+};
+static const unsigned int scif1_data_c_pins[] = {
+       /* RXD, TXD */
+       67, 66,
+};
+static const unsigned int scif1_data_c_mux[] = {
+       RX1_C_MARK, TX1_C_MARK,
+};
+static const unsigned int scif1_clk_c_pins[] = {
+       /* SCK */
+       86,
+};
+static const unsigned int scif1_clk_c_mux[] = {
+       SCK1_C_MARK,
+};
+static const unsigned int scif1_ctrl_c_pins[] = {
+       /* RTS, CTS */
+       69, 68,
+};
+static const unsigned int scif1_ctrl_c_mux[] = {
+       RTS1_C_TANS_C_MARK, CTS1_C_MARK,
+};
+/* - SCIF2 ------------------------------------------------------------------ */
+static const unsigned int scif2_data_pins[] = {
+       /* RXD, TXD */
+       106, 105,
+};
+static const unsigned int scif2_data_mux[] = {
+       RX2_MARK, TX2_MARK,
+};
+static const unsigned int scif2_clk_pins[] = {
+       /* SCK */
+       107,
+};
+static const unsigned int scif2_clk_mux[] = {
+       SCK2_MARK,
+};
+static const unsigned int scif2_data_b_pins[] = {
+       /* RXD, TXD */
+       120, 119,
+};
+static const unsigned int scif2_data_b_mux[] = {
+       RX2_B_MARK, TX2_B_MARK,
+};
+static const unsigned int scif2_clk_b_pins[] = {
+       /* SCK */
+       118,
+};
+static const unsigned int scif2_clk_b_mux[] = {
+       SCK2_B_MARK,
+};
+static const unsigned int scif2_data_c_pins[] = {
+       /* RXD, TXD */
+       33, 31,
+};
+static const unsigned int scif2_data_c_mux[] = {
+       RX2_C_MARK, TX2_C_MARK,
+};
+static const unsigned int scif2_clk_c_pins[] = {
+       /* SCK */
+       32,
+};
+static const unsigned int scif2_clk_c_mux[] = {
+       SCK2_C_MARK,
+};
+static const unsigned int scif2_data_d_pins[] = {
+       /* RXD, TXD */
+       64, 62,
+};
+static const unsigned int scif2_data_d_mux[] = {
+       RX2_D_MARK, TX2_D_MARK,
+};
+static const unsigned int scif2_clk_d_pins[] = {
+       /* SCK */
+       63,
+};
+static const unsigned int scif2_clk_d_mux[] = {
+       SCK2_D_MARK,
+};
+static const unsigned int scif2_data_e_pins[] = {
+       /* RXD, TXD */
+       20, 19,
+};
+static const unsigned int scif2_data_e_mux[] = {
+       RX2_E_MARK, TX2_E_MARK,
+};
+/* - SCIF3 ------------------------------------------------------------------ */
+static const unsigned int scif3_data_pins[] = {
+       /* RXD, TXD */
+       137, 136,
+};
+static const unsigned int scif3_data_mux[] = {
+       RX3_IRDA_RX_MARK, TX3_IRDA_TX_MARK,
+};
+static const unsigned int scif3_clk_pins[] = {
+       /* SCK */
+       135,
+};
+static const unsigned int scif3_clk_mux[] = {
+       SCK3_MARK,
+};
 
-       /* IPSR1 */
-       GPIO_FN(EX_CS0), GPIO_FN(RX3_C_IRDA_RX_C), GPIO_FN(MMC0_D6),
-       GPIO_FN(FD6), GPIO_FN(EX_CS1), GPIO_FN(MMC0_D7), GPIO_FN(FD7),
-       GPIO_FN(EX_CS2), GPIO_FN(SD1_CLK), GPIO_FN(MMC0_CLK), GPIO_FN(FALE),
-       GPIO_FN(ATACS00), GPIO_FN(EX_CS3), GPIO_FN(SD1_CMD), GPIO_FN(MMC0_CMD),
-       GPIO_FN(FRE), GPIO_FN(ATACS10), GPIO_FN(VI1_R4), GPIO_FN(RX5_B),
-       GPIO_FN(HSCK1), GPIO_FN(SSI_SDATA8_B), GPIO_FN(RTS0_B_TANS_B),
-       GPIO_FN(SSI_SDATA9), GPIO_FN(EX_CS4), GPIO_FN(SD1_DAT0),
-       GPIO_FN(MMC0_D0), GPIO_FN(FD0), GPIO_FN(ATARD0), GPIO_FN(VI1_R5),
-       GPIO_FN(SCK5_B), GPIO_FN(HTX1), GPIO_FN(TX2_E), GPIO_FN(TX0_B),
-       GPIO_FN(SSI_SCK9), GPIO_FN(EX_CS5), GPIO_FN(SD1_DAT1),
-       GPIO_FN(MMC0_D1), GPIO_FN(FD1), GPIO_FN(ATAWR0), GPIO_FN(VI1_R6),
-       GPIO_FN(HRX1), GPIO_FN(RX2_E), GPIO_FN(RX0_B), GPIO_FN(SSI_WS9),
-       GPIO_FN(MLB_CLK), GPIO_FN(PWM2), GPIO_FN(SCK4), GPIO_FN(MLB_SIG),
-       GPIO_FN(PWM3), GPIO_FN(TX4), GPIO_FN(MLB_DAT), GPIO_FN(PWM4),
-       GPIO_FN(RX4), GPIO_FN(HTX0), GPIO_FN(TX1), GPIO_FN(SDATA),
-       GPIO_FN(CTS0_C), GPIO_FN(SUB_TCK), GPIO_FN(CC5_STATE2),
-       GPIO_FN(CC5_STATE10), GPIO_FN(CC5_STATE18), GPIO_FN(CC5_STATE26),
-       GPIO_FN(CC5_STATE34),
+static const unsigned int scif3_data_b_pins[] = {
+       /* RXD, TXD */
+       64, 62,
+};
+static const unsigned int scif3_data_b_mux[] = {
+       RX3_B_IRDA_RX_B_MARK, TX3_B_IRDA_TX_B_MARK,
+};
+static const unsigned int scif3_data_c_pins[] = {
+       /* RXD, TXD */
+       15, 12,
+};
+static const unsigned int scif3_data_c_mux[] = {
+       RX3_C_IRDA_RX_C_MARK, TX3C_IRDA_TX_C_MARK,
+};
+static const unsigned int scif3_data_d_pins[] = {
+       /* RXD, TXD */
+       30, 29,
+};
+static const unsigned int scif3_data_d_mux[] = {
+       RX3_D_IRDA_RX_D_MARK, TX3_D_IRDA_TX_D_MARK,
+};
+static const unsigned int scif3_data_e_pins[] = {
+       /* RXD, TXD */
+       35, 34,
+};
+static const unsigned int scif3_data_e_mux[] = {
+       RX3_E_IRDA_RX_E_MARK, TX3_E_IRDA_TX_E_MARK,
+};
+static const unsigned int scif3_clk_e_pins[] = {
+       /* SCK */
+       42,
+};
+static const unsigned int scif3_clk_e_mux[] = {
+       SCK3_E_MARK,
+};
+/* - SCIF4 ------------------------------------------------------------------ */
+static const unsigned int scif4_data_pins[] = {
+       /* RXD, TXD */
+       123, 122,
+};
+static const unsigned int scif4_data_mux[] = {
+       RX4_MARK, TX4_MARK,
+};
+static const unsigned int scif4_clk_pins[] = {
+       /* SCK */
+       121,
+};
+static const unsigned int scif4_clk_mux[] = {
+       SCK4_MARK,
+};
+static const unsigned int scif4_data_b_pins[] = {
+       /* RXD, TXD */
+       111, 110,
+};
+static const unsigned int scif4_data_b_mux[] = {
+       RX4_B_MARK, TX4_B_MARK,
+};
+static const unsigned int scif4_clk_b_pins[] = {
+       /* SCK */
+       112,
+};
+static const unsigned int scif4_clk_b_mux[] = {
+       SCK4_B_MARK,
+};
+static const unsigned int scif4_data_c_pins[] = {
+       /* RXD, TXD */
+       22, 21,
+};
+static const unsigned int scif4_data_c_mux[] = {
+       RX4_C_MARK, TX4_C_MARK,
+};
+static const unsigned int scif4_data_d_pins[] = {
+       /* RXD, TXD */
+       69, 68,
+};
+static const unsigned int scif4_data_d_mux[] = {
+       RX4_D_MARK, TX4_D_MARK,
+};
+/* - SCIF5 ------------------------------------------------------------------ */
+static const unsigned int scif5_data_pins[] = {
+       /* RXD, TXD */
+       51, 50,
+};
+static const unsigned int scif5_data_mux[] = {
+       RX5_MARK, TX5_MARK,
+};
+static const unsigned int scif5_clk_pins[] = {
+       /* SCK */
+       43,
+};
+static const unsigned int scif5_clk_mux[] = {
+       SCK5_MARK,
+};
+static const unsigned int scif5_data_b_pins[] = {
+       /* RXD, TXD */
+       18, 11,
+};
+static const unsigned int scif5_data_b_mux[] = {
+       RX5_B_MARK, TX5_B_MARK,
+};
+static const unsigned int scif5_clk_b_pins[] = {
+       /* SCK */
+       19,
+};
+static const unsigned int scif5_clk_b_mux[] = {
+       SCK5_B_MARK,
+};
+static const unsigned int scif5_data_c_pins[] = {
+       /* RXD, TXD */
+       24, 23,
+};
+static const unsigned int scif5_data_c_mux[] = {
+       RX5_C_MARK, TX5_C_MARK,
+};
+static const unsigned int scif5_clk_c_pins[] = {
+       /* SCK */
+       28,
+};
+static const unsigned int scif5_clk_c_mux[] = {
+       SCK5_C_MARK,
+};
+static const unsigned int scif5_data_d_pins[] = {
+       /* RXD, TXD */
+       8, 6,
+};
+static const unsigned int scif5_data_d_mux[] = {
+       RX5_D_MARK, TX5_D_MARK,
+};
+static const unsigned int scif5_clk_d_pins[] = {
+       /* SCK */
+       7,
+};
+static const unsigned int scif5_clk_d_mux[] = {
+       SCK5_D_MARK,
+};
+/* - SDHI0 ------------------------------------------------------------------ */
+static const unsigned int sdhi0_data1_pins[] = {
+       /* D0 */
+       117,
+};
+static const unsigned int sdhi0_data1_mux[] = {
+       SD0_DAT0_MARK,
+};
+static const unsigned int sdhi0_data4_pins[] = {
+       /* D[0:3] */
+       117, 118, 119, 120,
+};
+static const unsigned int sdhi0_data4_mux[] = {
+       SD0_DAT0_MARK, SD0_DAT1_MARK, SD0_DAT2_MARK, SD0_DAT3_MARK,
+};
+static const unsigned int sdhi0_ctrl_pins[] = {
+       /* CMD, CLK */
+       114, 113,
+};
+static const unsigned int sdhi0_ctrl_mux[] = {
+       SD0_CMD_MARK, SD0_CLK_MARK,
+};
+static const unsigned int sdhi0_cd_pins[] = {
+       /* CD */
+       115,
+};
+static const unsigned int sdhi0_cd_mux[] = {
+       SD0_CD_MARK,
+};
+static const unsigned int sdhi0_wp_pins[] = {
+       /* WP */
+       116,
+};
+static const unsigned int sdhi0_wp_mux[] = {
+       SD0_WP_MARK,
+};
+/* - SDHI1 ------------------------------------------------------------------ */
+static const unsigned int sdhi1_data1_pins[] = {
+       /* D0 */
+       19,
+};
+static const unsigned int sdhi1_data1_mux[] = {
+       SD1_DAT0_MARK,
+};
+static const unsigned int sdhi1_data4_pins[] = {
+       /* D[0:3] */
+       19, 20, 21, 2,
+};
+static const unsigned int sdhi1_data4_mux[] = {
+       SD1_DAT0_MARK, SD1_DAT1_MARK, SD1_DAT2_MARK, SD1_DAT3_MARK,
+};
+static const unsigned int sdhi1_ctrl_pins[] = {
+       /* CMD, CLK */
+       18, 17,
+};
+static const unsigned int sdhi1_ctrl_mux[] = {
+       SD1_CMD_MARK, SD1_CLK_MARK,
+};
+static const unsigned int sdhi1_cd_pins[] = {
+       /* CD */
+       10,
+};
+static const unsigned int sdhi1_cd_mux[] = {
+       SD1_CD_MARK,
+};
+static const unsigned int sdhi1_wp_pins[] = {
+       /* WP */
+       11,
+};
+static const unsigned int sdhi1_wp_mux[] = {
+       SD1_WP_MARK,
+};
+/* - SDHI2 ------------------------------------------------------------------ */
+static const unsigned int sdhi2_data1_pins[] = {
+       /* D0 */
+       97,
+};
+static const unsigned int sdhi2_data1_mux[] = {
+       SD2_DAT0_MARK,
+};
+static const unsigned int sdhi2_data4_pins[] = {
+       /* D[0:3] */
+       97, 98, 99, 100,
+};
+static const unsigned int sdhi2_data4_mux[] = {
+       SD2_DAT0_MARK, SD2_DAT1_MARK, SD2_DAT2_MARK, SD2_DAT3_MARK,
+};
+static const unsigned int sdhi2_ctrl_pins[] = {
+       /* CMD, CLK */
+       102, 101,
+};
+static const unsigned int sdhi2_ctrl_mux[] = {
+       SD2_CMD_MARK, SD2_CLK_MARK,
+};
+static const unsigned int sdhi2_cd_pins[] = {
+       /* CD */
+       103,
+};
+static const unsigned int sdhi2_cd_mux[] = {
+       SD2_CD_MARK,
+};
+static const unsigned int sdhi2_wp_pins[] = {
+       /* WP */
+       104,
+};
+static const unsigned int sdhi2_wp_mux[] = {
+       SD2_WP_MARK,
+};
+/* - SDHI3 ------------------------------------------------------------------ */
+static const unsigned int sdhi3_data1_pins[] = {
+       /* D0 */
+       50,
+};
+static const unsigned int sdhi3_data1_mux[] = {
+       SD3_DAT0_MARK,
+};
+static const unsigned int sdhi3_data4_pins[] = {
+       /* D[0:3] */
+       50, 51, 52, 53,
+};
+static const unsigned int sdhi3_data4_mux[] = {
+       SD3_DAT0_MARK, SD3_DAT1_MARK, SD3_DAT2_MARK, SD3_DAT3_MARK,
+};
+static const unsigned int sdhi3_ctrl_pins[] = {
+       /* CMD, CLK */
+       35, 34,
+};
+static const unsigned int sdhi3_ctrl_mux[] = {
+       SD3_CMD_MARK, SD3_CLK_MARK,
+};
+static const unsigned int sdhi3_cd_pins[] = {
+       /* CD */
+       62,
+};
+static const unsigned int sdhi3_cd_mux[] = {
+       SD3_CD_MARK,
+};
+static const unsigned int sdhi3_wp_pins[] = {
+       /* WP */
+       64,
+};
+static const unsigned int sdhi3_wp_mux[] = {
+       SD3_WP_MARK,
+};
+/* - USB0 ------------------------------------------------------------------- */
+static const unsigned int usb0_pins[] = {
+       /* OVC */
+       150, 154,
+};
+static const unsigned int usb0_mux[] = {
+       USB_OVC0_MARK, USB_PENC0_MARK,
+};
+/* - USB1 ------------------------------------------------------------------- */
+static const unsigned int usb1_pins[] = {
+       /* OVC */
+       152, 155,
+};
+static const unsigned int usb1_mux[] = {
+       USB_OVC1_MARK, USB_PENC1_MARK,
+};
+/* - USB2 ------------------------------------------------------------------- */
+static const unsigned int usb2_pins[] = {
+       /* OVC, PENC */
+       125, 156,
+};
+static const unsigned int usb2_mux[] = {
+       USB_OVC2_MARK, USB_PENC2_MARK,
+};
 
-       /* IPSR2 */
-       GPIO_FN(HRX0), GPIO_FN(RX1), GPIO_FN(SCKZ), GPIO_FN(RTS0_C_TANS_C),
-       GPIO_FN(SUB_TDI), GPIO_FN(CC5_STATE3), GPIO_FN(CC5_STATE11),
-       GPIO_FN(CC5_STATE19), GPIO_FN(CC5_STATE27), GPIO_FN(CC5_STATE35),
-       GPIO_FN(HSCK0), GPIO_FN(SCK1), GPIO_FN(MTS), GPIO_FN(PWM5),
-       GPIO_FN(SCK0_C), GPIO_FN(SSI_SDATA9_B), GPIO_FN(SUB_TDO),
-       GPIO_FN(CC5_STATE0), GPIO_FN(CC5_STATE8), GPIO_FN(CC5_STATE16),
-       GPIO_FN(CC5_STATE24), GPIO_FN(CC5_STATE32), GPIO_FN(HCTS0),
-       GPIO_FN(CTS1), GPIO_FN(STM), GPIO_FN(PWM0_D), GPIO_FN(RX0_C),
-       GPIO_FN(SCIF_CLK_C), GPIO_FN(SUB_TRST), GPIO_FN(TCLK1_B),
-       GPIO_FN(CC5_OSCOUT), GPIO_FN(HRTS0), GPIO_FN(RTS1_TANS),
-       GPIO_FN(MDATA), GPIO_FN(TX0_C), GPIO_FN(SUB_TMS), GPIO_FN(CC5_STATE1),
-       GPIO_FN(CC5_STATE9), GPIO_FN(CC5_STATE17), GPIO_FN(CC5_STATE25),
-       GPIO_FN(CC5_STATE33), GPIO_FN(DU0_DR0), GPIO_FN(LCDOUT0),
-       GPIO_FN(DREQ0), GPIO_FN(GPS_CLK_B), GPIO_FN(AUDATA0),
-       GPIO_FN(TX5_C), GPIO_FN(DU0_DR1), GPIO_FN(LCDOUT1), GPIO_FN(DACK0),
-       GPIO_FN(DRACK0), GPIO_FN(GPS_SIGN_B), GPIO_FN(AUDATA1), GPIO_FN(RX5_C),
-       GPIO_FN(DU0_DR2), GPIO_FN(LCDOUT2), GPIO_FN(DU0_DR3), GPIO_FN(LCDOUT3),
-       GPIO_FN(DU0_DR4), GPIO_FN(LCDOUT4), GPIO_FN(DU0_DR5), GPIO_FN(LCDOUT5),
-       GPIO_FN(DU0_DR6), GPIO_FN(LCDOUT6), GPIO_FN(DU0_DR7), GPIO_FN(LCDOUT7),
-       GPIO_FN(DU0_DG0), GPIO_FN(LCDOUT8), GPIO_FN(DREQ1), GPIO_FN(SCL2),
-       GPIO_FN(AUDATA2),
+static const struct sh_pfc_pin_group pinmux_groups[] = {
+       SH_PFC_PIN_GROUP(du0_rgb666),
+       SH_PFC_PIN_GROUP(du0_rgb888),
+       SH_PFC_PIN_GROUP(du0_clk_in),
+       SH_PFC_PIN_GROUP(du0_clk_out_0),
+       SH_PFC_PIN_GROUP(du0_clk_out_1),
+       SH_PFC_PIN_GROUP(du0_sync_0),
+       SH_PFC_PIN_GROUP(du0_sync_1),
+       SH_PFC_PIN_GROUP(du0_oddf),
+       SH_PFC_PIN_GROUP(du0_cde),
+       SH_PFC_PIN_GROUP(du1_rgb666),
+       SH_PFC_PIN_GROUP(du1_rgb888),
+       SH_PFC_PIN_GROUP(du1_clk_in),
+       SH_PFC_PIN_GROUP(du1_clk_out),
+       SH_PFC_PIN_GROUP(du1_sync_0),
+       SH_PFC_PIN_GROUP(du1_sync_1),
+       SH_PFC_PIN_GROUP(du1_oddf),
+       SH_PFC_PIN_GROUP(du1_cde),
+       SH_PFC_PIN_GROUP(hspi0),
+       SH_PFC_PIN_GROUP(hspi1),
+       SH_PFC_PIN_GROUP(hspi1_b),
+       SH_PFC_PIN_GROUP(hspi1_c),
+       SH_PFC_PIN_GROUP(hspi1_d),
+       SH_PFC_PIN_GROUP(hspi2),
+       SH_PFC_PIN_GROUP(hspi2_b),
+       SH_PFC_PIN_GROUP(intc_irq0),
+       SH_PFC_PIN_GROUP(intc_irq0_b),
+       SH_PFC_PIN_GROUP(intc_irq1),
+       SH_PFC_PIN_GROUP(intc_irq1_b),
+       SH_PFC_PIN_GROUP(intc_irq2),
+       SH_PFC_PIN_GROUP(intc_irq2_b),
+       SH_PFC_PIN_GROUP(intc_irq3),
+       SH_PFC_PIN_GROUP(intc_irq3_b),
+       SH_PFC_PIN_GROUP(lbsc_cs0),
+       SH_PFC_PIN_GROUP(lbsc_cs1),
+       SH_PFC_PIN_GROUP(lbsc_ex_cs0),
+       SH_PFC_PIN_GROUP(lbsc_ex_cs1),
+       SH_PFC_PIN_GROUP(lbsc_ex_cs2),
+       SH_PFC_PIN_GROUP(lbsc_ex_cs3),
+       SH_PFC_PIN_GROUP(lbsc_ex_cs4),
+       SH_PFC_PIN_GROUP(lbsc_ex_cs5),
+       SH_PFC_PIN_GROUP(mmc0_data1),
+       SH_PFC_PIN_GROUP(mmc0_data4),
+       SH_PFC_PIN_GROUP(mmc0_data8),
+       SH_PFC_PIN_GROUP(mmc0_ctrl),
+       SH_PFC_PIN_GROUP(mmc1_data1),
+       SH_PFC_PIN_GROUP(mmc1_data4),
+       SH_PFC_PIN_GROUP(mmc1_data8),
+       SH_PFC_PIN_GROUP(mmc1_ctrl),
+       SH_PFC_PIN_GROUP(scif0_data),
+       SH_PFC_PIN_GROUP(scif0_clk),
+       SH_PFC_PIN_GROUP(scif0_ctrl),
+       SH_PFC_PIN_GROUP(scif0_data_b),
+       SH_PFC_PIN_GROUP(scif0_clk_b),
+       SH_PFC_PIN_GROUP(scif0_ctrl_b),
+       SH_PFC_PIN_GROUP(scif0_data_c),
+       SH_PFC_PIN_GROUP(scif0_clk_c),
+       SH_PFC_PIN_GROUP(scif0_ctrl_c),
+       SH_PFC_PIN_GROUP(scif0_data_d),
+       SH_PFC_PIN_GROUP(scif0_clk_d),
+       SH_PFC_PIN_GROUP(scif0_ctrl_d),
+       SH_PFC_PIN_GROUP(scif1_data),
+       SH_PFC_PIN_GROUP(scif1_clk),
+       SH_PFC_PIN_GROUP(scif1_ctrl),
+       SH_PFC_PIN_GROUP(scif1_data_b),
+       SH_PFC_PIN_GROUP(scif1_clk_b),
+       SH_PFC_PIN_GROUP(scif1_ctrl_b),
+       SH_PFC_PIN_GROUP(scif1_data_c),
+       SH_PFC_PIN_GROUP(scif1_clk_c),
+       SH_PFC_PIN_GROUP(scif1_ctrl_c),
+       SH_PFC_PIN_GROUP(scif2_data),
+       SH_PFC_PIN_GROUP(scif2_clk),
+       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_clk_c),
+       SH_PFC_PIN_GROUP(scif2_data_d),
+       SH_PFC_PIN_GROUP(scif2_clk_d),
+       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_data_c),
+       SH_PFC_PIN_GROUP(scif3_data_d),
+       SH_PFC_PIN_GROUP(scif3_data_e),
+       SH_PFC_PIN_GROUP(scif3_clk_e),
+       SH_PFC_PIN_GROUP(scif4_data),
+       SH_PFC_PIN_GROUP(scif4_clk),
+       SH_PFC_PIN_GROUP(scif4_data_b),
+       SH_PFC_PIN_GROUP(scif4_clk_b),
+       SH_PFC_PIN_GROUP(scif4_data_c),
+       SH_PFC_PIN_GROUP(scif4_data_d),
+       SH_PFC_PIN_GROUP(scif5_data),
+       SH_PFC_PIN_GROUP(scif5_clk),
+       SH_PFC_PIN_GROUP(scif5_data_b),
+       SH_PFC_PIN_GROUP(scif5_clk_b),
+       SH_PFC_PIN_GROUP(scif5_data_c),
+       SH_PFC_PIN_GROUP(scif5_clk_c),
+       SH_PFC_PIN_GROUP(scif5_data_d),
+       SH_PFC_PIN_GROUP(scif5_clk_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(sdhi3_data1),
+       SH_PFC_PIN_GROUP(sdhi3_data4),
+       SH_PFC_PIN_GROUP(sdhi3_ctrl),
+       SH_PFC_PIN_GROUP(sdhi3_cd),
+       SH_PFC_PIN_GROUP(sdhi3_wp),
+       SH_PFC_PIN_GROUP(usb0),
+       SH_PFC_PIN_GROUP(usb1),
+       SH_PFC_PIN_GROUP(usb2),
+};
 
-       /* IPSR3 */
-       GPIO_FN(DU0_DG1), GPIO_FN(LCDOUT9), GPIO_FN(DACK1), GPIO_FN(SDA2),
-       GPIO_FN(AUDATA3), GPIO_FN(DU0_DG2), GPIO_FN(LCDOUT10),
-       GPIO_FN(DU0_DG3), GPIO_FN(LCDOUT11), GPIO_FN(DU0_DG4),
-       GPIO_FN(LCDOUT12), GPIO_FN(DU0_DG5), GPIO_FN(LCDOUT13),
-       GPIO_FN(DU0_DG6), GPIO_FN(LCDOUT14), GPIO_FN(DU0_DG7),
-       GPIO_FN(LCDOUT15), GPIO_FN(DU0_DB0), GPIO_FN(LCDOUT16),
-       GPIO_FN(EX_WAIT1), GPIO_FN(SCL1), GPIO_FN(TCLK1), GPIO_FN(AUDATA4),
-       GPIO_FN(DU0_DB1), GPIO_FN(LCDOUT17), GPIO_FN(EX_WAIT2), GPIO_FN(SDA1),
-       GPIO_FN(GPS_MAG_B), GPIO_FN(AUDATA5), GPIO_FN(SCK5_C),
-       GPIO_FN(DU0_DB2), GPIO_FN(LCDOUT18), GPIO_FN(DU0_DB3),
-       GPIO_FN(LCDOUT19), GPIO_FN(DU0_DB4), GPIO_FN(LCDOUT20),
-       GPIO_FN(DU0_DB5), GPIO_FN(LCDOUT21), GPIO_FN(DU0_DB6),
-       GPIO_FN(LCDOUT22), GPIO_FN(DU0_DB7), GPIO_FN(LCDOUT23),
-       GPIO_FN(DU0_DOTCLKIN), GPIO_FN(QSTVA_QVS), GPIO_FN(TX3_D_IRDA_TX_D),
-       GPIO_FN(SCL3_B), GPIO_FN(DU0_DOTCLKOUT0), GPIO_FN(QCLK),
-       GPIO_FN(DU0_DOTCLKOUT1), GPIO_FN(QSTVB_QVE), GPIO_FN(RX3_D_IRDA_RX_D),
-       GPIO_FN(SDA3_B), GPIO_FN(SDA2_C), GPIO_FN(DACK0_B), GPIO_FN(DRACK0_B),
-       GPIO_FN(DU0_EXHSYNC_DU0_HSYNC), GPIO_FN(QSTH_QHS),
-       GPIO_FN(DU0_EXVSYNC_DU0_VSYNC), GPIO_FN(QSTB_QHE),
-       GPIO_FN(DU0_EXODDF_DU0_ODDF_DISP_CDE), GPIO_FN(QCPV_QDE),
-       GPIO_FN(CAN1_TX), GPIO_FN(TX2_C), GPIO_FN(SCL2_C), GPIO_FN(REMOCON),
+static const char * const du0_groups[] = {
+       "du0_rgb666",
+       "du0_rgb888",
+       "du0_clk_in",
+       "du0_clk_out_0",
+       "du0_clk_out_1",
+       "du0_sync_0",
+       "du0_sync_1",
+       "du0_oddf",
+       "du0_cde",
+};
 
-       /* IPSR4 */
-       GPIO_FN(DU0_DISP), GPIO_FN(QPOLA), GPIO_FN(CAN_CLK_C), GPIO_FN(SCK2_C),
-       GPIO_FN(DU0_CDE), GPIO_FN(QPOLB), GPIO_FN(CAN1_RX), GPIO_FN(RX2_C),
-       GPIO_FN(DREQ0_B), GPIO_FN(SSI_SCK78_B), GPIO_FN(SCK0_B),
-       GPIO_FN(DU1_DR0), GPIO_FN(VI2_DATA0_VI2_B0), GPIO_FN(PWM6),
-       GPIO_FN(SD3_CLK), GPIO_FN(TX3_E_IRDA_TX_E), GPIO_FN(AUDCK),
-       GPIO_FN(PWMFSW0_B), GPIO_FN(DU1_DR1), GPIO_FN(VI2_DATA1_VI2_B1),
-       GPIO_FN(PWM0), GPIO_FN(SD3_CMD), GPIO_FN(RX3_E_IRDA_RX_E),
-       GPIO_FN(AUDSYNC), GPIO_FN(CTS0_D), GPIO_FN(DU1_DR2), GPIO_FN(VI2_G0),
-       GPIO_FN(DU1_DR3), GPIO_FN(VI2_G1), GPIO_FN(DU1_DR4), GPIO_FN(VI2_G2),
-       GPIO_FN(DU1_DR5), GPIO_FN(VI2_G3), GPIO_FN(DU1_DR6), GPIO_FN(VI2_G4),
-       GPIO_FN(DU1_DR7), GPIO_FN(VI2_G5), GPIO_FN(DU1_DG0),
-       GPIO_FN(VI2_DATA2_VI2_B2), GPIO_FN(SCL1_B), GPIO_FN(SD3_DAT2),
-       GPIO_FN(SCK3_E), GPIO_FN(AUDATA6), GPIO_FN(TX0_D), GPIO_FN(DU1_DG1),
-       GPIO_FN(VI2_DATA3_VI2_B3), GPIO_FN(SDA1_B), GPIO_FN(SD3_DAT3),
-       GPIO_FN(SCK5), GPIO_FN(AUDATA7), GPIO_FN(RX0_D), GPIO_FN(DU1_DG2),
-       GPIO_FN(VI2_G6), GPIO_FN(DU1_DG3), GPIO_FN(VI2_G7), GPIO_FN(DU1_DG4),
-       GPIO_FN(VI2_R0), GPIO_FN(DU1_DG5), GPIO_FN(VI2_R1), GPIO_FN(DU1_DG6),
-       GPIO_FN(VI2_R2), GPIO_FN(DU1_DG7), GPIO_FN(VI2_R3), GPIO_FN(DU1_DB0),
-       GPIO_FN(VI2_DATA4_VI2_B4), GPIO_FN(SCL2_B), GPIO_FN(SD3_DAT0),
-       GPIO_FN(TX5), GPIO_FN(SCK0_D),
+static const char * const du1_groups[] = {
+       "du1_rgb666",
+       "du1_rgb888",
+       "du1_clk_in",
+       "du1_clk_out",
+       "du1_sync_0",
+       "du1_sync_1",
+       "du1_oddf",
+       "du1_cde",
+};
 
-       /* IPSR5 */
-       GPIO_FN(DU1_DB1), GPIO_FN(VI2_DATA5_VI2_B5), GPIO_FN(SDA2_B),
-       GPIO_FN(SD3_DAT1), GPIO_FN(RX5), GPIO_FN(RTS0_D_TANS_D),
-       GPIO_FN(DU1_DB2), GPIO_FN(VI2_R4), GPIO_FN(DU1_DB3), GPIO_FN(VI2_R5),
-       GPIO_FN(DU1_DB4), GPIO_FN(VI2_R6), GPIO_FN(DU1_DB5), GPIO_FN(VI2_R7),
-       GPIO_FN(DU1_DB6), GPIO_FN(SCL2_D), GPIO_FN(DU1_DB7), GPIO_FN(SDA2_D),
-       GPIO_FN(DU1_DOTCLKIN), GPIO_FN(VI2_CLKENB), GPIO_FN(HSPI_CS1),
-       GPIO_FN(SCL1_D), GPIO_FN(DU1_DOTCLKOUT), GPIO_FN(VI2_FIELD),
-       GPIO_FN(SDA1_D), GPIO_FN(DU1_EXHSYNC_DU1_HSYNC), GPIO_FN(VI2_HSYNC),
-       GPIO_FN(VI3_HSYNC), GPIO_FN(DU1_EXVSYNC_DU1_VSYNC), GPIO_FN(VI2_VSYNC),
-       GPIO_FN(VI3_VSYNC), GPIO_FN(DU1_EXODDF_DU1_ODDF_DISP_CDE),
-       GPIO_FN(VI2_CLK), GPIO_FN(TX3_B_IRDA_TX_B), GPIO_FN(SD3_CD),
-       GPIO_FN(HSPI_TX1), GPIO_FN(VI1_CLKENB), GPIO_FN(VI3_CLKENB),
-       GPIO_FN(AUDIO_CLKC), GPIO_FN(TX2_D), GPIO_FN(SPEEDIN),
-       GPIO_FN(GPS_SIGN_D), GPIO_FN(DU1_DISP), GPIO_FN(VI2_DATA6_VI2_B6),
-       GPIO_FN(TCLK0), GPIO_FN(QSTVA_B_QVS_B), GPIO_FN(HSPI_CLK1),
-       GPIO_FN(SCK2_D), GPIO_FN(AUDIO_CLKOUT_B), GPIO_FN(GPS_MAG_D),
-       GPIO_FN(DU1_CDE), GPIO_FN(VI2_DATA7_VI2_B7), GPIO_FN(RX3_B_IRDA_RX_B),
-       GPIO_FN(SD3_WP), GPIO_FN(HSPI_RX1), GPIO_FN(VI1_FIELD),
-       GPIO_FN(VI3_FIELD), GPIO_FN(AUDIO_CLKOUT), GPIO_FN(RX2_D),
-       GPIO_FN(GPS_CLK_C), GPIO_FN(GPS_CLK_D), GPIO_FN(AUDIO_CLKA),
-       GPIO_FN(CAN_TXCLK), GPIO_FN(AUDIO_CLKB), GPIO_FN(USB_OVC2),
-       GPIO_FN(CAN_DEBUGOUT0), GPIO_FN(MOUT0),
+static const char * const hspi0_groups[] = {
+       "hspi0",
+};
 
-       /* IPSR6 */
-       GPIO_FN(SSI_SCK0129), GPIO_FN(CAN_DEBUGOUT1), GPIO_FN(MOUT1),
-       GPIO_FN(SSI_WS0129), GPIO_FN(CAN_DEBUGOUT2), GPIO_FN(MOUT2),
-       GPIO_FN(SSI_SDATA0), GPIO_FN(CAN_DEBUGOUT3), GPIO_FN(MOUT5),
-       GPIO_FN(SSI_SDATA1), GPIO_FN(CAN_DEBUGOUT4), GPIO_FN(MOUT6),
-       GPIO_FN(SSI_SDATA2), GPIO_FN(CAN_DEBUGOUT5), GPIO_FN(SSI_SCK34),
-       GPIO_FN(CAN_DEBUGOUT6), GPIO_FN(CAN0_TX_B), GPIO_FN(IERX),
-       GPIO_FN(SSI_SCK9_C), GPIO_FN(SSI_WS34), GPIO_FN(CAN_DEBUGOUT7),
-       GPIO_FN(CAN0_RX_B), GPIO_FN(IETX), GPIO_FN(SSI_WS9_C),
-       GPIO_FN(SSI_SDATA3), GPIO_FN(PWM0_C), GPIO_FN(CAN_DEBUGOUT8),
-       GPIO_FN(CAN_CLK_B), GPIO_FN(IECLK), GPIO_FN(SCIF_CLK_B),
-       GPIO_FN(TCLK0_B), GPIO_FN(SSI_SDATA4), GPIO_FN(CAN_DEBUGOUT9),
-       GPIO_FN(SSI_SDATA9_C), GPIO_FN(SSI_SCK5), GPIO_FN(ADICLK),
-       GPIO_FN(CAN_DEBUGOUT10), GPIO_FN(SCK3), GPIO_FN(TCLK0_D),
-       GPIO_FN(SSI_WS5), GPIO_FN(ADICS_SAMP), GPIO_FN(CAN_DEBUGOUT11),
-       GPIO_FN(TX3_IRDA_TX), GPIO_FN(SSI_SDATA5), GPIO_FN(ADIDATA),
-       GPIO_FN(CAN_DEBUGOUT12), GPIO_FN(RX3_IRDA_RX), GPIO_FN(SSI_SCK6),
-       GPIO_FN(ADICHS0), GPIO_FN(CAN0_TX), GPIO_FN(IERX_B),
+static const char * const hspi1_groups[] = {
+       "hspi1",
+       "hspi1_b",
+       "hspi1_c",
+       "hspi1_d",
+};
 
-       /* IPSR7 */
-       GPIO_FN(SSI_WS6), GPIO_FN(ADICHS1), GPIO_FN(CAN0_RX), GPIO_FN(IETX_B),
-       GPIO_FN(SSI_SDATA6), GPIO_FN(ADICHS2), GPIO_FN(CAN_CLK),
-       GPIO_FN(IECLK_B), GPIO_FN(SSI_SCK78), GPIO_FN(CAN_DEBUGOUT13),
-       GPIO_FN(IRQ0_B), GPIO_FN(SSI_SCK9_B), GPIO_FN(HSPI_CLK1_C),
-       GPIO_FN(SSI_WS78), GPIO_FN(CAN_DEBUGOUT14), GPIO_FN(IRQ1_B),
-       GPIO_FN(SSI_WS9_B), GPIO_FN(HSPI_CS1_C), GPIO_FN(SSI_SDATA7),
-       GPIO_FN(CAN_DEBUGOUT15), GPIO_FN(IRQ2_B), GPIO_FN(TCLK1_C),
-       GPIO_FN(HSPI_TX1_C), GPIO_FN(SSI_SDATA8), GPIO_FN(VSP),
-       GPIO_FN(IRQ3_B), GPIO_FN(HSPI_RX1_C), GPIO_FN(SD0_CLK),
-       GPIO_FN(ATACS01), GPIO_FN(SCK1_B), GPIO_FN(SD0_CMD), GPIO_FN(ATACS11),
-       GPIO_FN(TX1_B), GPIO_FN(CC5_TDO), GPIO_FN(SD0_DAT0), GPIO_FN(ATADIR1),
-       GPIO_FN(RX1_B), GPIO_FN(CC5_TRST), GPIO_FN(SD0_DAT1), GPIO_FN(ATAG1),
-       GPIO_FN(SCK2_B), GPIO_FN(CC5_TMS), GPIO_FN(SD0_DAT2), GPIO_FN(ATARD1),
-       GPIO_FN(TX2_B), GPIO_FN(CC5_TCK), GPIO_FN(SD0_DAT3), GPIO_FN(ATAWR1),
-       GPIO_FN(RX2_B), GPIO_FN(CC5_TDI), GPIO_FN(SD0_CD), GPIO_FN(DREQ2),
-       GPIO_FN(RTS1_B_TANS_B), GPIO_FN(SD0_WP), GPIO_FN(DACK2),
-       GPIO_FN(CTS1_B),
+static const char * const hspi2_groups[] = {
+       "hspi2",
+       "hspi2_b",
+};
 
-       /* IPSR8 */
-       GPIO_FN(HSPI_CLK0), GPIO_FN(CTS0), GPIO_FN(USB_OVC0), GPIO_FN(AD_CLK),
-       GPIO_FN(CC5_STATE4), GPIO_FN(CC5_STATE12), GPIO_FN(CC5_STATE20),
-       GPIO_FN(CC5_STATE28), GPIO_FN(CC5_STATE36), GPIO_FN(HSPI_CS0),
-       GPIO_FN(RTS0_TANS), GPIO_FN(USB_OVC1), GPIO_FN(AD_DI),
-       GPIO_FN(CC5_STATE5), GPIO_FN(CC5_STATE13), GPIO_FN(CC5_STATE21),
-       GPIO_FN(CC5_STATE29), GPIO_FN(CC5_STATE37), GPIO_FN(HSPI_TX0),
-       GPIO_FN(TX0), GPIO_FN(CAN_DEBUG_HW_TRIGGER), GPIO_FN(AD_DO),
-       GPIO_FN(CC5_STATE6), GPIO_FN(CC5_STATE14), GPIO_FN(CC5_STATE22),
-       GPIO_FN(CC5_STATE30), GPIO_FN(CC5_STATE38), GPIO_FN(HSPI_RX0),
-       GPIO_FN(RX0), GPIO_FN(CAN_STEP0), GPIO_FN(AD_NCS), GPIO_FN(CC5_STATE7),
-       GPIO_FN(CC5_STATE15), GPIO_FN(CC5_STATE23), GPIO_FN(CC5_STATE31),
-       GPIO_FN(CC5_STATE39), GPIO_FN(FMCLK), GPIO_FN(RDS_CLK), GPIO_FN(PCMOE),
-       GPIO_FN(BPFCLK), GPIO_FN(PCMWE), GPIO_FN(FMIN), GPIO_FN(RDS_DATA),
-       GPIO_FN(VI0_CLK), GPIO_FN(MMC1_CLK), GPIO_FN(VI0_CLKENB),
-       GPIO_FN(TX1_C), GPIO_FN(HTX1_B), GPIO_FN(MT1_SYNC),
-       GPIO_FN(VI0_FIELD), GPIO_FN(RX1_C), GPIO_FN(HRX1_B),
-       GPIO_FN(VI0_HSYNC), GPIO_FN(VI0_DATA0_B_VI0_B0_B), GPIO_FN(CTS1_C),
-       GPIO_FN(TX4_D), GPIO_FN(MMC1_CMD), GPIO_FN(HSCK1_B),
-       GPIO_FN(VI0_VSYNC), GPIO_FN(VI0_DATA1_B_VI0_B1_B),
-       GPIO_FN(RTS1_C_TANS_C), GPIO_FN(RX4_D), GPIO_FN(PWMFSW0_C),
+static const char * const intc_groups[] = {
+       "intc_irq0",
+       "intc_irq0_b",
+       "intc_irq1",
+       "intc_irq1_b",
+       "intc_irq2",
+       "intc_irq2_b",
+       "intc_irq3",
+       "intc_irq3_b",
+};
 
-       /* IPSR9 */
-       GPIO_FN(VI0_DATA0_VI0_B0), GPIO_FN(HRTS1_B), GPIO_FN(MT1_VCXO),
-       GPIO_FN(VI0_DATA1_VI0_B1), GPIO_FN(HCTS1_B), GPIO_FN(MT1_PWM),
-       GPIO_FN(VI0_DATA2_VI0_B2), GPIO_FN(MMC1_D0), GPIO_FN(VI0_DATA3_VI0_B3),
-       GPIO_FN(MMC1_D1), GPIO_FN(VI0_DATA4_VI0_B4), GPIO_FN(MMC1_D2),
-       GPIO_FN(VI0_DATA5_VI0_B5), GPIO_FN(MMC1_D3), GPIO_FN(VI0_DATA6_VI0_B6),
-       GPIO_FN(MMC1_D4), GPIO_FN(ARM_TRACEDATA_0), GPIO_FN(VI0_DATA7_VI0_B7),
-       GPIO_FN(MMC1_D5), GPIO_FN(ARM_TRACEDATA_1), GPIO_FN(VI0_G0),
-       GPIO_FN(SSI_SCK78_C), GPIO_FN(IRQ0), GPIO_FN(ARM_TRACEDATA_2),
-       GPIO_FN(VI0_G1), GPIO_FN(SSI_WS78_C), GPIO_FN(IRQ1),
-       GPIO_FN(ARM_TRACEDATA_3), GPIO_FN(VI0_G2), GPIO_FN(ETH_TXD1),
-       GPIO_FN(MMC1_D6), GPIO_FN(ARM_TRACEDATA_4), GPIO_FN(TS_SPSYNC0),
-       GPIO_FN(VI0_G3), GPIO_FN(ETH_CRS_DV), GPIO_FN(MMC1_D7),
-       GPIO_FN(ARM_TRACEDATA_5), GPIO_FN(TS_SDAT0), GPIO_FN(VI0_G4),
-       GPIO_FN(ETH_TX_EN), GPIO_FN(SD2_DAT0_B), GPIO_FN(ARM_TRACEDATA_6),
-       GPIO_FN(VI0_G5), GPIO_FN(ETH_RX_ER), GPIO_FN(SD2_DAT1_B),
-       GPIO_FN(ARM_TRACEDATA_7), GPIO_FN(VI0_G6), GPIO_FN(ETH_RXD0),
-       GPIO_FN(SD2_DAT2_B), GPIO_FN(ARM_TRACEDATA_8), GPIO_FN(VI0_G7),
-       GPIO_FN(ETH_RXD1), GPIO_FN(SD2_DAT3_B), GPIO_FN(ARM_TRACEDATA_9),
+static const char * const lbsc_groups[] = {
+       "lbsc_cs0",
+       "lbsc_cs1",
+       "lbsc_ex_cs0",
+       "lbsc_ex_cs1",
+       "lbsc_ex_cs2",
+       "lbsc_ex_cs3",
+       "lbsc_ex_cs4",
+       "lbsc_ex_cs5",
+};
 
-       /* IPSR10 */
-       GPIO_FN(VI0_R0), GPIO_FN(SSI_SDATA7_C), GPIO_FN(SCK1_C),
-       GPIO_FN(DREQ1_B), GPIO_FN(ARM_TRACEDATA_10), GPIO_FN(DREQ0_C),
-       GPIO_FN(VI0_R1), GPIO_FN(SSI_SDATA8_C), GPIO_FN(DACK1_B),
-       GPIO_FN(ARM_TRACEDATA_11), GPIO_FN(DACK0_C), GPIO_FN(DRACK0_C),
-       GPIO_FN(VI0_R2), GPIO_FN(ETH_LINK), GPIO_FN(SD2_CLK_B), GPIO_FN(IRQ2),
-       GPIO_FN(ARM_TRACEDATA_12), GPIO_FN(VI0_R3), GPIO_FN(ETH_MAGIC),
-       GPIO_FN(SD2_CMD_B), GPIO_FN(IRQ3), GPIO_FN(ARM_TRACEDATA_13),
-       GPIO_FN(VI0_R4), GPIO_FN(ETH_REFCLK), GPIO_FN(SD2_CD_B),
-       GPIO_FN(HSPI_CLK1_B), GPIO_FN(ARM_TRACEDATA_14), GPIO_FN(MT1_CLK),
-       GPIO_FN(TS_SCK0), GPIO_FN(VI0_R5), GPIO_FN(ETH_TXD0),
-       GPIO_FN(SD2_WP_B), GPIO_FN(HSPI_CS1_B), GPIO_FN(ARM_TRACEDATA_15),
-       GPIO_FN(MT1_D), GPIO_FN(TS_SDEN0), GPIO_FN(VI0_R6), GPIO_FN(ETH_MDC),
-       GPIO_FN(DREQ2_C), GPIO_FN(HSPI_TX1_B), GPIO_FN(TRACECLK),
-       GPIO_FN(MT1_BEN), GPIO_FN(PWMFSW0_D), GPIO_FN(VI0_R7),
-       GPIO_FN(ETH_MDIO), GPIO_FN(DACK2_C), GPIO_FN(HSPI_RX1_B),
-       GPIO_FN(SCIF_CLK_D), GPIO_FN(TRACECTL), GPIO_FN(MT1_PEN),
-       GPIO_FN(VI1_CLK), GPIO_FN(SIM_D), GPIO_FN(SDA3), GPIO_FN(VI1_HSYNC),
-       GPIO_FN(VI3_CLK), GPIO_FN(SSI_SCK4), GPIO_FN(GPS_SIGN_C),
-       GPIO_FN(PWMFSW0_E), GPIO_FN(VI1_VSYNC), GPIO_FN(AUDIO_CLKOUT_C),
-       GPIO_FN(SSI_WS4), GPIO_FN(SIM_CLK), GPIO_FN(GPS_MAG_C),
-       GPIO_FN(SPV_TRST), GPIO_FN(SCL3),
+static const char * const mmc0_groups[] = {
+       "mmc0_data1",
+       "mmc0_data4",
+       "mmc0_data8",
+       "mmc0_ctrl",
+};
 
-       /* IPSR11 */
-       GPIO_FN(VI1_DATA0_VI1_B0), GPIO_FN(SD2_DAT0), GPIO_FN(SIM_RST),
-       GPIO_FN(SPV_TCK), GPIO_FN(ADICLK_B), GPIO_FN(VI1_DATA1_VI1_B1),
-       GPIO_FN(SD2_DAT1), GPIO_FN(MT0_CLK), GPIO_FN(SPV_TMS),
-       GPIO_FN(ADICS_B_SAMP_B), GPIO_FN(VI1_DATA2_VI1_B2), GPIO_FN(SD2_DAT2),
-       GPIO_FN(MT0_D), GPIO_FN(SPVTDI), GPIO_FN(ADIDATA_B),
-       GPIO_FN(VI1_DATA3_VI1_B3), GPIO_FN(SD2_DAT3), GPIO_FN(MT0_BEN),
-       GPIO_FN(SPV_TDO), GPIO_FN(ADICHS0_B), GPIO_FN(VI1_DATA4_VI1_B4),
-       GPIO_FN(SD2_CLK), GPIO_FN(MT0_PEN), GPIO_FN(SPA_TRST),
-       GPIO_FN(HSPI_CLK1_D), GPIO_FN(ADICHS1_B), GPIO_FN(VI1_DATA5_VI1_B5),
-       GPIO_FN(SD2_CMD), GPIO_FN(MT0_SYNC), GPIO_FN(SPA_TCK),
-       GPIO_FN(HSPI_CS1_D), GPIO_FN(ADICHS2_B), GPIO_FN(VI1_DATA6_VI1_B6),
-       GPIO_FN(SD2_CD), GPIO_FN(MT0_VCXO), GPIO_FN(SPA_TMS),
-       GPIO_FN(HSPI_TX1_D), GPIO_FN(VI1_DATA7_VI1_B7), GPIO_FN(SD2_WP),
-       GPIO_FN(MT0_PWM), GPIO_FN(SPA_TDI), GPIO_FN(HSPI_RX1_D),
-       GPIO_FN(VI1_G0), GPIO_FN(VI3_DATA0), GPIO_FN(DU1_DOTCLKOUT1),
-       GPIO_FN(TS_SCK1), GPIO_FN(DREQ2_B), GPIO_FN(TX2), GPIO_FN(SPA_TDO),
-       GPIO_FN(HCTS0_B), GPIO_FN(VI1_G1), GPIO_FN(VI3_DATA1),
-       GPIO_FN(SSI_SCK1), GPIO_FN(TS_SDEN1), GPIO_FN(DACK2_B), GPIO_FN(RX2),
-       GPIO_FN(HRTS0_B),
+static const char * const mmc1_groups[] = {
+       "mmc1_data1",
+       "mmc1_data4",
+       "mmc1_data8",
+       "mmc1_ctrl",
+};
 
-       /* IPSR12 */
-       GPIO_FN(VI1_G2), GPIO_FN(VI3_DATA2), GPIO_FN(SSI_WS1),
-       GPIO_FN(TS_SPSYNC1), GPIO_FN(SCK2), GPIO_FN(HSCK0_B), GPIO_FN(VI1_G3),
-       GPIO_FN(VI3_DATA3), GPIO_FN(SSI_SCK2), GPIO_FN(TS_SDAT1),
-       GPIO_FN(SCL1_C), GPIO_FN(HTX0_B), GPIO_FN(VI1_G4), GPIO_FN(VI3_DATA4),
-       GPIO_FN(SSI_WS2), GPIO_FN(SDA1_C), GPIO_FN(SIM_RST_B),
-       GPIO_FN(HRX0_B), GPIO_FN(VI1_G5), GPIO_FN(VI3_DATA5),
-       GPIO_FN(GPS_CLK), GPIO_FN(FSE), GPIO_FN(TX4_B), GPIO_FN(SIM_D_B),
-       GPIO_FN(VI1_G6), GPIO_FN(VI3_DATA6), GPIO_FN(GPS_SIGN), GPIO_FN(FRB),
-       GPIO_FN(RX4_B), GPIO_FN(SIM_CLK_B), GPIO_FN(VI1_G7),
-       GPIO_FN(VI3_DATA7), GPIO_FN(GPS_MAG), GPIO_FN(FCE), GPIO_FN(SCK4_B),
-};
-
-static struct pinmux_cfg_reg pinmux_config_regs[] = {
+static const char * const scif0_groups[] = {
+       "scif0_data",
+       "scif0_clk",
+       "scif0_ctrl",
+       "scif0_data_b",
+       "scif0_clk_b",
+       "scif0_ctrl_b",
+       "scif0_data_c",
+       "scif0_clk_c",
+       "scif0_ctrl_c",
+       "scif0_data_d",
+       "scif0_clk_d",
+       "scif0_ctrl_d",
+};
+
+static const char * const scif1_groups[] = {
+       "scif1_data",
+       "scif1_clk",
+       "scif1_ctrl",
+       "scif1_data_b",
+       "scif1_clk_b",
+       "scif1_ctrl_b",
+       "scif1_data_c",
+       "scif1_clk_c",
+       "scif1_ctrl_c",
+};
+
+static const char * const scif2_groups[] = {
+       "scif2_data",
+       "scif2_clk",
+       "scif2_data_b",
+       "scif2_clk_b",
+       "scif2_data_c",
+       "scif2_clk_c",
+       "scif2_data_d",
+       "scif2_clk_d",
+       "scif2_data_e",
+};
+
+static const char * const scif3_groups[] = {
+       "scif3_data",
+       "scif3_clk",
+       "scif3_data_b",
+       "scif3_data_c",
+       "scif3_data_d",
+       "scif3_data_e",
+       "scif3_clk_e",
+};
+
+static const char * const scif4_groups[] = {
+       "scif4_data",
+       "scif4_clk",
+       "scif4_data_b",
+       "scif4_clk_b",
+       "scif4_data_c",
+       "scif4_data_d",
+};
+
+static const char * const scif5_groups[] = {
+       "scif5_data",
+       "scif5_clk",
+       "scif5_data_b",
+       "scif5_clk_b",
+       "scif5_data_c",
+       "scif5_clk_c",
+       "scif5_data_d",
+       "scif5_clk_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 sdhi3_groups[] = {
+       "sdhi3_data1",
+       "sdhi3_data4",
+       "sdhi3_ctrl",
+       "sdhi3_cd",
+       "sdhi3_wp",
+};
+
+static const char * const usb0_groups[] = {
+       "usb0",
+};
+
+static const char * const usb1_groups[] = {
+       "usb1",
+};
+
+static const char * const usb2_groups[] = {
+       "usb2",
+};
+
+static const struct sh_pfc_function pinmux_functions[] = {
+       SH_PFC_FUNCTION(du0),
+       SH_PFC_FUNCTION(du1),
+       SH_PFC_FUNCTION(hspi0),
+       SH_PFC_FUNCTION(hspi1),
+       SH_PFC_FUNCTION(hspi2),
+       SH_PFC_FUNCTION(intc),
+       SH_PFC_FUNCTION(lbsc),
+       SH_PFC_FUNCTION(mmc0),
+       SH_PFC_FUNCTION(mmc1),
+       SH_PFC_FUNCTION(sdhi0),
+       SH_PFC_FUNCTION(sdhi1),
+       SH_PFC_FUNCTION(sdhi2),
+       SH_PFC_FUNCTION(sdhi3),
+       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(usb0),
+       SH_PFC_FUNCTION(usb1),
+       SH_PFC_FUNCTION(usb2),
+};
+
+static const struct pinmux_cfg_reg pinmux_config_regs[] = {
        { PINMUX_CFG_REG("GPSR0", 0xfffc0004, 32, 1) {
                GP_0_31_FN, FN_IP3_31_29,
                GP_0_30_FN, FN_IP3_26_24,
@@ -2412,7 +3407,7 @@ static struct pinmux_cfg_reg pinmux_config_regs[] = {
            FN_VI1_G1, FN_VI3_DATA1, FN_SSI_SCK1, FN_TS_SDEN1,
            FN_DACK2_B, FN_RX2, FN_HRTS0_B, 0,
            /* IP11_26_24 [3] */
-           FN_VI1_G0, FN_VI3_DATA0, FN_DU1_DOTCLKOUT1, FN_TS_SCK1,
+           FN_VI1_G0, FN_VI3_DATA0, 0, FN_TS_SCK1,
            FN_DREQ2_B, FN_TX2, FN_SPA_TDO, FN_HCTS0_B,
            /* IP11_23_21 [3] */
            FN_VI1_DATA7_VI1_B7, FN_SD2_WP, FN_MT0_PWM, FN_SPA_TDI,
@@ -2558,66 +3553,24 @@ static struct pinmux_cfg_reg pinmux_config_regs[] = {
            /* SEL_I2C1 [2] */
            FN_SEL_I2C1_0, FN_SEL_I2C1_1, FN_SEL_I2C1_2, FN_SEL_I2C1_3 }
        },
-       { PINMUX_CFG_REG("INOUTSEL0", 0xffc40004, 32, 1) { GP_INOUTSEL(0) } },
-       { PINMUX_CFG_REG("INOUTSEL1", 0xffc41004, 32, 1) { GP_INOUTSEL(1) } },
-       { PINMUX_CFG_REG("INOUTSEL2", 0xffc42004, 32, 1) { GP_INOUTSEL(2) } },
-       { PINMUX_CFG_REG("INOUTSEL3", 0xffc43004, 32, 1) { GP_INOUTSEL(3) } },
-       { PINMUX_CFG_REG("INOUTSEL4", 0xffc44004, 32, 1) { GP_INOUTSEL(4) } },
-       { PINMUX_CFG_REG("INOUTSEL5", 0xffc45004, 32, 1) { GP_INOUTSEL(5) } },
-       { PINMUX_CFG_REG("INOUTSEL6", 0xffc46004, 32, 1) {
-               0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-               0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-               0, 0, 0, 0, 0, 0, 0, 0,
-               0, 0,
-               0, 0,
-               0, 0,
-               GP_6_8_IN, GP_6_8_OUT,
-               GP_6_7_IN, GP_6_7_OUT,
-               GP_6_6_IN, GP_6_6_OUT,
-               GP_6_5_IN, GP_6_5_OUT,
-               GP_6_4_IN, GP_6_4_OUT,
-               GP_6_3_IN, GP_6_3_OUT,
-               GP_6_2_IN, GP_6_2_OUT,
-               GP_6_1_IN, GP_6_1_OUT,
-               GP_6_0_IN, GP_6_0_OUT, }
-       },
-       { },
-};
-
-static struct pinmux_data_reg pinmux_data_regs[] = {
-       { PINMUX_DATA_REG("INDT0", 0xffc40008, 32) { GP_INDT(0) } },
-       { PINMUX_DATA_REG("INDT1", 0xffc41008, 32) { GP_INDT(1) } },
-       { PINMUX_DATA_REG("INDT2", 0xffc42008, 32) { GP_INDT(2) } },
-       { PINMUX_DATA_REG("INDT3", 0xffc43008, 32) { GP_INDT(3) } },
-       { PINMUX_DATA_REG("INDT4", 0xffc44008, 32) { GP_INDT(4) } },
-       { PINMUX_DATA_REG("INDT5", 0xffc45008, 32) { GP_INDT(5) } },
-       { PINMUX_DATA_REG("INDT6", 0xffc46008, 32) {
-               0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-               0, 0, 0, 0, 0, 0, 0, GP_6_8_DATA,
-               GP_6_7_DATA, GP_6_6_DATA, GP_6_5_DATA, GP_6_4_DATA,
-               GP_6_3_DATA, GP_6_2_DATA, GP_6_1_DATA, GP_6_0_DATA }
-       },
        { },
 };
 
-struct sh_pfc_soc_info r8a7779_pinmux_info = {
+const struct sh_pfc_soc_info r8a7779_pinmux_info = {
        .name = "r8a7779_pfc",
 
        .unlock_reg = 0xfffc0000, /* PMMR */
 
-       .reserved_id = PINMUX_RESERVED,
-       .data = { PINMUX_DATA_BEGIN, PINMUX_DATA_END },
-       .input = { PINMUX_INPUT_BEGIN, PINMUX_INPUT_END },
-       .output = { PINMUX_OUTPUT_BEGIN, PINMUX_OUTPUT_END },
-       .mark = { PINMUX_MARK_BEGIN, PINMUX_MARK_END },
        .function = { PINMUX_FUNCTION_BEGIN, PINMUX_FUNCTION_END },
 
-       .first_gpio = GPIO_GP_0_0,
-       .last_gpio = GPIO_FN_SCK4_B,
+       .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),
 
-       .gpios = pinmux_gpios,
        .cfg_regs = pinmux_config_regs,
-       .data_regs = pinmux_data_regs,
 
        .gpio_data = pinmux_data,
        .gpio_data_size = ARRAY_SIZE(pinmux_data),
index 01b425dfd162c7c8167487ac4b4e0a9ae926b635..f63d51dc3f4c84afb0f315fdb6e6cd6dceea8ff3 100644 (file)
@@ -272,7 +272,7 @@ enum {
        PINMUX_MARK_END,
 };
 
-static pinmux_enum_t pinmux_data[] = {
+static const pinmux_enum_t pinmux_data[] = {
 
        /* PA */
        PINMUX_DATA(PA7_DATA, PA7_IN),
@@ -703,7 +703,7 @@ static pinmux_enum_t pinmux_data[] = {
        PINMUX_DATA(SSCK0_PF_MARK, PF0MD_11),
 };
 
-static struct pinmux_gpio pinmux_gpios[] = {
+static struct sh_pfc_pin pinmux_pins[] = {
 
        /* PA */
        PINMUX_GPIO(GPIO_PA7, PA7_DATA),
@@ -815,265 +815,269 @@ static struct pinmux_gpio pinmux_gpios[] = {
        PINMUX_GPIO(GPIO_PF2, PF2_DATA),
        PINMUX_GPIO(GPIO_PF1, PF1_DATA),
        PINMUX_GPIO(GPIO_PF0, PF0_DATA),
+};
+
+#define PINMUX_FN_BASE ARRAY_SIZE(pinmux_pins)
 
+static const struct pinmux_func pinmux_func_gpios[] = {
        /* INTC */
-       PINMUX_GPIO(GPIO_FN_PINT7_PB, PINT7_PB_MARK),
-       PINMUX_GPIO(GPIO_FN_PINT6_PB, PINT6_PB_MARK),
-       PINMUX_GPIO(GPIO_FN_PINT5_PB, PINT5_PB_MARK),
-       PINMUX_GPIO(GPIO_FN_PINT4_PB, PINT4_PB_MARK),
-       PINMUX_GPIO(GPIO_FN_PINT3_PB, PINT3_PB_MARK),
-       PINMUX_GPIO(GPIO_FN_PINT2_PB, PINT2_PB_MARK),
-       PINMUX_GPIO(GPIO_FN_PINT1_PB, PINT1_PB_MARK),
-       PINMUX_GPIO(GPIO_FN_PINT0_PB, PINT0_PB_MARK),
-       PINMUX_GPIO(GPIO_FN_PINT7_PD, PINT7_PD_MARK),
-       PINMUX_GPIO(GPIO_FN_PINT6_PD, PINT6_PD_MARK),
-       PINMUX_GPIO(GPIO_FN_PINT5_PD, PINT5_PD_MARK),
-       PINMUX_GPIO(GPIO_FN_PINT4_PD, PINT4_PD_MARK),
-       PINMUX_GPIO(GPIO_FN_PINT3_PD, PINT3_PD_MARK),
-       PINMUX_GPIO(GPIO_FN_PINT2_PD, PINT2_PD_MARK),
-       PINMUX_GPIO(GPIO_FN_PINT1_PD, PINT1_PD_MARK),
-       PINMUX_GPIO(GPIO_FN_PINT0_PD, PINT0_PD_MARK),
-       PINMUX_GPIO(GPIO_FN_IRQ7_PB, IRQ7_PB_MARK),
-       PINMUX_GPIO(GPIO_FN_IRQ6_PB, IRQ6_PB_MARK),
-       PINMUX_GPIO(GPIO_FN_IRQ5_PB, IRQ5_PB_MARK),
-       PINMUX_GPIO(GPIO_FN_IRQ4_PB, IRQ4_PB_MARK),
-       PINMUX_GPIO(GPIO_FN_IRQ3_PB, IRQ3_PB_MARK),
-       PINMUX_GPIO(GPIO_FN_IRQ2_PB, IRQ2_PB_MARK),
-       PINMUX_GPIO(GPIO_FN_IRQ1_PB, IRQ1_PB_MARK),
-       PINMUX_GPIO(GPIO_FN_IRQ0_PB, IRQ0_PB_MARK),
-       PINMUX_GPIO(GPIO_FN_IRQ7_PD, IRQ7_PD_MARK),
-       PINMUX_GPIO(GPIO_FN_IRQ6_PD, IRQ6_PD_MARK),
-       PINMUX_GPIO(GPIO_FN_IRQ5_PD, IRQ5_PD_MARK),
-       PINMUX_GPIO(GPIO_FN_IRQ4_PD, IRQ4_PD_MARK),
-       PINMUX_GPIO(GPIO_FN_IRQ3_PD, IRQ3_PD_MARK),
-       PINMUX_GPIO(GPIO_FN_IRQ2_PD, IRQ2_PD_MARK),
-       PINMUX_GPIO(GPIO_FN_IRQ1_PD, IRQ1_PD_MARK),
-       PINMUX_GPIO(GPIO_FN_IRQ0_PD, IRQ0_PD_MARK),
-       PINMUX_GPIO(GPIO_FN_IRQ7_PE, IRQ7_PE_MARK),
-       PINMUX_GPIO(GPIO_FN_IRQ6_PE, IRQ6_PE_MARK),
-       PINMUX_GPIO(GPIO_FN_IRQ5_PE, IRQ5_PE_MARK),
-       PINMUX_GPIO(GPIO_FN_IRQ4_PE, IRQ4_PE_MARK),
-       PINMUX_GPIO(GPIO_FN_IRQ3_PE, IRQ3_PE_MARK),
-       PINMUX_GPIO(GPIO_FN_IRQ2_PE, IRQ2_PE_MARK),
-       PINMUX_GPIO(GPIO_FN_IRQ1_PE, IRQ1_PE_MARK),
-       PINMUX_GPIO(GPIO_FN_IRQ0_PE, IRQ0_PE_MARK),
-
-       PINMUX_GPIO(GPIO_FN_WDTOVF, WDTOVF_MARK),
-       PINMUX_GPIO(GPIO_FN_IRQOUT, IRQOUT_MARK),
-       PINMUX_GPIO(GPIO_FN_REFOUT, REFOUT_MARK),
-       PINMUX_GPIO(GPIO_FN_IRQOUT_REFOUT, IRQOUT_REFOUT_MARK),
-       PINMUX_GPIO(GPIO_FN_UBCTRG, UBCTRG_MARK),
+       GPIO_FN(PINT7_PB),
+       GPIO_FN(PINT6_PB),
+       GPIO_FN(PINT5_PB),
+       GPIO_FN(PINT4_PB),
+       GPIO_FN(PINT3_PB),
+       GPIO_FN(PINT2_PB),
+       GPIO_FN(PINT1_PB),
+       GPIO_FN(PINT0_PB),
+       GPIO_FN(PINT7_PD),
+       GPIO_FN(PINT6_PD),
+       GPIO_FN(PINT5_PD),
+       GPIO_FN(PINT4_PD),
+       GPIO_FN(PINT3_PD),
+       GPIO_FN(PINT2_PD),
+       GPIO_FN(PINT1_PD),
+       GPIO_FN(PINT0_PD),
+       GPIO_FN(IRQ7_PB),
+       GPIO_FN(IRQ6_PB),
+       GPIO_FN(IRQ5_PB),
+       GPIO_FN(IRQ4_PB),
+       GPIO_FN(IRQ3_PB),
+       GPIO_FN(IRQ2_PB),
+       GPIO_FN(IRQ1_PB),
+       GPIO_FN(IRQ0_PB),
+       GPIO_FN(IRQ7_PD),
+       GPIO_FN(IRQ6_PD),
+       GPIO_FN(IRQ5_PD),
+       GPIO_FN(IRQ4_PD),
+       GPIO_FN(IRQ3_PD),
+       GPIO_FN(IRQ2_PD),
+       GPIO_FN(IRQ1_PD),
+       GPIO_FN(IRQ0_PD),
+       GPIO_FN(IRQ7_PE),
+       GPIO_FN(IRQ6_PE),
+       GPIO_FN(IRQ5_PE),
+       GPIO_FN(IRQ4_PE),
+       GPIO_FN(IRQ3_PE),
+       GPIO_FN(IRQ2_PE),
+       GPIO_FN(IRQ1_PE),
+       GPIO_FN(IRQ0_PE),
+
+       GPIO_FN(WDTOVF),
+       GPIO_FN(IRQOUT),
+       GPIO_FN(REFOUT),
+       GPIO_FN(IRQOUT_REFOUT),
+       GPIO_FN(UBCTRG),
 
        /* CAN */
-       PINMUX_GPIO(GPIO_FN_CTX1, CTX1_MARK),
-       PINMUX_GPIO(GPIO_FN_CRX1, CRX1_MARK),
-       PINMUX_GPIO(GPIO_FN_CTX0, CTX0_MARK),
-       PINMUX_GPIO(GPIO_FN_CTX0_CTX1, CTX0_CTX1_MARK),
-       PINMUX_GPIO(GPIO_FN_CRX0, CRX0_MARK),
-       PINMUX_GPIO(GPIO_FN_CRX0_CRX1, CRX0_CRX1_MARK),
+       GPIO_FN(CTX1),
+       GPIO_FN(CRX1),
+       GPIO_FN(CTX0),
+       GPIO_FN(CTX0_CTX1),
+       GPIO_FN(CRX0),
+       GPIO_FN(CRX0_CRX1),
 
        /* IIC3 */
-       PINMUX_GPIO(GPIO_FN_SDA3, SDA3_MARK),
-       PINMUX_GPIO(GPIO_FN_SCL3, SCL3_MARK),
-       PINMUX_GPIO(GPIO_FN_SDA2, SDA2_MARK),
-       PINMUX_GPIO(GPIO_FN_SCL2, SCL2_MARK),
-       PINMUX_GPIO(GPIO_FN_SDA1, SDA1_MARK),
-       PINMUX_GPIO(GPIO_FN_SCL1, SCL1_MARK),
-       PINMUX_GPIO(GPIO_FN_SDA0, SDA0_MARK),
-       PINMUX_GPIO(GPIO_FN_SCL0, SCL0_MARK),
+       GPIO_FN(SDA3),
+       GPIO_FN(SCL3),
+       GPIO_FN(SDA2),
+       GPIO_FN(SCL2),
+       GPIO_FN(SDA1),
+       GPIO_FN(SCL1),
+       GPIO_FN(SDA0),
+       GPIO_FN(SCL0),
 
        /* DMAC */
-       PINMUX_GPIO(GPIO_FN_TEND0_PD, TEND0_PD_MARK),
-       PINMUX_GPIO(GPIO_FN_TEND0_PE, TEND0_PE_MARK),
-       PINMUX_GPIO(GPIO_FN_DACK0_PD, DACK0_PD_MARK),
-       PINMUX_GPIO(GPIO_FN_DACK0_PE, DACK0_PE_MARK),
-       PINMUX_GPIO(GPIO_FN_DREQ0_PD, DREQ0_PD_MARK),
-       PINMUX_GPIO(GPIO_FN_DREQ0_PE, DREQ0_PE_MARK),
-       PINMUX_GPIO(GPIO_FN_TEND1_PD, TEND1_PD_MARK),
-       PINMUX_GPIO(GPIO_FN_TEND1_PE, TEND1_PE_MARK),
-       PINMUX_GPIO(GPIO_FN_DACK1_PD, DACK1_PD_MARK),
-       PINMUX_GPIO(GPIO_FN_DACK1_PE, DACK1_PE_MARK),
-       PINMUX_GPIO(GPIO_FN_DREQ1_PD, DREQ1_PD_MARK),
-       PINMUX_GPIO(GPIO_FN_DREQ1_PE, DREQ1_PE_MARK),
-       PINMUX_GPIO(GPIO_FN_DACK2, DACK2_MARK),
-       PINMUX_GPIO(GPIO_FN_DREQ2, DREQ2_MARK),
-       PINMUX_GPIO(GPIO_FN_DACK3, DACK3_MARK),
-       PINMUX_GPIO(GPIO_FN_DREQ3, DREQ3_MARK),
+       GPIO_FN(TEND0_PD),
+       GPIO_FN(TEND0_PE),
+       GPIO_FN(DACK0_PD),
+       GPIO_FN(DACK0_PE),
+       GPIO_FN(DREQ0_PD),
+       GPIO_FN(DREQ0_PE),
+       GPIO_FN(TEND1_PD),
+       GPIO_FN(TEND1_PE),
+       GPIO_FN(DACK1_PD),
+       GPIO_FN(DACK1_PE),
+       GPIO_FN(DREQ1_PD),
+       GPIO_FN(DREQ1_PE),
+       GPIO_FN(DACK2),
+       GPIO_FN(DREQ2),
+       GPIO_FN(DACK3),
+       GPIO_FN(DREQ3),
 
        /* ADC */
-       PINMUX_GPIO(GPIO_FN_ADTRG_PD, ADTRG_PD_MARK),
-       PINMUX_GPIO(GPIO_FN_ADTRG_PE, ADTRG_PE_MARK),
+       GPIO_FN(ADTRG_PD),
+       GPIO_FN(ADTRG_PE),
 
        /* BSC */
-       PINMUX_GPIO(GPIO_FN_D31, D31_MARK),
-       PINMUX_GPIO(GPIO_FN_D30, D30_MARK),
-       PINMUX_GPIO(GPIO_FN_D29, D29_MARK),
-       PINMUX_GPIO(GPIO_FN_D28, D28_MARK),
-       PINMUX_GPIO(GPIO_FN_D27, D27_MARK),
-       PINMUX_GPIO(GPIO_FN_D26, D26_MARK),
-       PINMUX_GPIO(GPIO_FN_D25, D25_MARK),
-       PINMUX_GPIO(GPIO_FN_D24, D24_MARK),
-       PINMUX_GPIO(GPIO_FN_D23, D23_MARK),
-       PINMUX_GPIO(GPIO_FN_D22, D22_MARK),
-       PINMUX_GPIO(GPIO_FN_D21, D21_MARK),
-       PINMUX_GPIO(GPIO_FN_D20, D20_MARK),
-       PINMUX_GPIO(GPIO_FN_D19, D19_MARK),
-       PINMUX_GPIO(GPIO_FN_D18, D18_MARK),
-       PINMUX_GPIO(GPIO_FN_D17, D17_MARK),
-       PINMUX_GPIO(GPIO_FN_D16, D16_MARK),
-       PINMUX_GPIO(GPIO_FN_A25, A25_MARK),
-       PINMUX_GPIO(GPIO_FN_A24, A24_MARK),
-       PINMUX_GPIO(GPIO_FN_A23, A23_MARK),
-       PINMUX_GPIO(GPIO_FN_A22, A22_MARK),
-       PINMUX_GPIO(GPIO_FN_A21, A21_MARK),
-       PINMUX_GPIO(GPIO_FN_CS4, CS4_MARK),
-       PINMUX_GPIO(GPIO_FN_MRES, MRES_MARK),
-       PINMUX_GPIO(GPIO_FN_BS, BS_MARK),
-       PINMUX_GPIO(GPIO_FN_IOIS16, IOIS16_MARK),
-       PINMUX_GPIO(GPIO_FN_CS1, CS1_MARK),
-       PINMUX_GPIO(GPIO_FN_CS6_CE1B, CS6_CE1B_MARK),
-       PINMUX_GPIO(GPIO_FN_CE2B, CE2B_MARK),
-       PINMUX_GPIO(GPIO_FN_CS5_CE1A, CS5_CE1A_MARK),
-       PINMUX_GPIO(GPIO_FN_CE2A, CE2A_MARK),
-       PINMUX_GPIO(GPIO_FN_FRAME, FRAME_MARK),
-       PINMUX_GPIO(GPIO_FN_WAIT, WAIT_MARK),
-       PINMUX_GPIO(GPIO_FN_RDWR, RDWR_MARK),
-       PINMUX_GPIO(GPIO_FN_CKE, CKE_MARK),
-       PINMUX_GPIO(GPIO_FN_CASU, CASU_MARK),
-       PINMUX_GPIO(GPIO_FN_BREQ, BREQ_MARK),
-       PINMUX_GPIO(GPIO_FN_RASU, RASU_MARK),
-       PINMUX_GPIO(GPIO_FN_BACK, BACK_MARK),
-       PINMUX_GPIO(GPIO_FN_CASL, CASL_MARK),
-       PINMUX_GPIO(GPIO_FN_RASL, RASL_MARK),
-       PINMUX_GPIO(GPIO_FN_WE3_DQMUU_AH_ICIO_WR, WE3_DQMUU_AH_ICIO_WR_MARK),
-       PINMUX_GPIO(GPIO_FN_WE2_DQMUL_ICIORD, WE2_DQMUL_ICIORD_MARK),
-       PINMUX_GPIO(GPIO_FN_WE1_DQMLU_WE, WE1_DQMLU_WE_MARK),
-       PINMUX_GPIO(GPIO_FN_WE0_DQMLL, WE0_DQMLL_MARK),
-       PINMUX_GPIO(GPIO_FN_CS3, CS3_MARK),
-       PINMUX_GPIO(GPIO_FN_CS2, CS2_MARK),
-       PINMUX_GPIO(GPIO_FN_A1, A1_MARK),
-       PINMUX_GPIO(GPIO_FN_A0, A0_MARK),
-       PINMUX_GPIO(GPIO_FN_CS7, CS7_MARK),
+       GPIO_FN(D31),
+       GPIO_FN(D30),
+       GPIO_FN(D29),
+       GPIO_FN(D28),
+       GPIO_FN(D27),
+       GPIO_FN(D26),
+       GPIO_FN(D25),
+       GPIO_FN(D24),
+       GPIO_FN(D23),
+       GPIO_FN(D22),
+       GPIO_FN(D21),
+       GPIO_FN(D20),
+       GPIO_FN(D19),
+       GPIO_FN(D18),
+       GPIO_FN(D17),
+       GPIO_FN(D16),
+       GPIO_FN(A25),
+       GPIO_FN(A24),
+       GPIO_FN(A23),
+       GPIO_FN(A22),
+       GPIO_FN(A21),
+       GPIO_FN(CS4),
+       GPIO_FN(MRES),
+       GPIO_FN(BS),
+       GPIO_FN(IOIS16),
+       GPIO_FN(CS1),
+       GPIO_FN(CS6_CE1B),
+       GPIO_FN(CE2B),
+       GPIO_FN(CS5_CE1A),
+       GPIO_FN(CE2A),
+       GPIO_FN(FRAME),
+       GPIO_FN(WAIT),
+       GPIO_FN(RDWR),
+       GPIO_FN(CKE),
+       GPIO_FN(CASU),
+       GPIO_FN(BREQ),
+       GPIO_FN(RASU),
+       GPIO_FN(BACK),
+       GPIO_FN(CASL),
+       GPIO_FN(RASL),
+       GPIO_FN(WE3_DQMUU_AH_ICIO_WR),
+       GPIO_FN(WE2_DQMUL_ICIORD),
+       GPIO_FN(WE1_DQMLU_WE),
+       GPIO_FN(WE0_DQMLL),
+       GPIO_FN(CS3),
+       GPIO_FN(CS2),
+       GPIO_FN(A1),
+       GPIO_FN(A0),
+       GPIO_FN(CS7),
 
        /* TMU */
-       PINMUX_GPIO(GPIO_FN_TIOC4D, TIOC4D_MARK),
-       PINMUX_GPIO(GPIO_FN_TIOC4C, TIOC4C_MARK),
-       PINMUX_GPIO(GPIO_FN_TIOC4B, TIOC4B_MARK),
-       PINMUX_GPIO(GPIO_FN_TIOC4A, TIOC4A_MARK),
-       PINMUX_GPIO(GPIO_FN_TIOC3D, TIOC3D_MARK),
-       PINMUX_GPIO(GPIO_FN_TIOC3C, TIOC3C_MARK),
-       PINMUX_GPIO(GPIO_FN_TIOC3B, TIOC3B_MARK),
-       PINMUX_GPIO(GPIO_FN_TIOC3A, TIOC3A_MARK),
-       PINMUX_GPIO(GPIO_FN_TIOC2B, TIOC2B_MARK),
-       PINMUX_GPIO(GPIO_FN_TIOC1B, TIOC1B_MARK),
-       PINMUX_GPIO(GPIO_FN_TIOC2A, TIOC2A_MARK),
-       PINMUX_GPIO(GPIO_FN_TIOC1A, TIOC1A_MARK),
-       PINMUX_GPIO(GPIO_FN_TIOC0D, TIOC0D_MARK),
-       PINMUX_GPIO(GPIO_FN_TIOC0C, TIOC0C_MARK),
-       PINMUX_GPIO(GPIO_FN_TIOC0B, TIOC0B_MARK),
-       PINMUX_GPIO(GPIO_FN_TIOC0A, TIOC0A_MARK),
-       PINMUX_GPIO(GPIO_FN_TCLKD_PD, TCLKD_PD_MARK),
-       PINMUX_GPIO(GPIO_FN_TCLKC_PD, TCLKC_PD_MARK),
-       PINMUX_GPIO(GPIO_FN_TCLKB_PD, TCLKB_PD_MARK),
-       PINMUX_GPIO(GPIO_FN_TCLKA_PD, TCLKA_PD_MARK),
-       PINMUX_GPIO(GPIO_FN_TCLKD_PF, TCLKD_PF_MARK),
-       PINMUX_GPIO(GPIO_FN_TCLKC_PF, TCLKC_PF_MARK),
-       PINMUX_GPIO(GPIO_FN_TCLKB_PF, TCLKB_PF_MARK),
-       PINMUX_GPIO(GPIO_FN_TCLKA_PF, TCLKA_PF_MARK),
+       GPIO_FN(TIOC4D),
+       GPIO_FN(TIOC4C),
+       GPIO_FN(TIOC4B),
+       GPIO_FN(TIOC4A),
+       GPIO_FN(TIOC3D),
+       GPIO_FN(TIOC3C),
+       GPIO_FN(TIOC3B),
+       GPIO_FN(TIOC3A),
+       GPIO_FN(TIOC2B),
+       GPIO_FN(TIOC1B),
+       GPIO_FN(TIOC2A),
+       GPIO_FN(TIOC1A),
+       GPIO_FN(TIOC0D),
+       GPIO_FN(TIOC0C),
+       GPIO_FN(TIOC0B),
+       GPIO_FN(TIOC0A),
+       GPIO_FN(TCLKD_PD),
+       GPIO_FN(TCLKC_PD),
+       GPIO_FN(TCLKB_PD),
+       GPIO_FN(TCLKA_PD),
+       GPIO_FN(TCLKD_PF),
+       GPIO_FN(TCLKC_PF),
+       GPIO_FN(TCLKB_PF),
+       GPIO_FN(TCLKA_PF),
 
        /* SSU */
-       PINMUX_GPIO(GPIO_FN_SCS0_PD, SCS0_PD_MARK),
-       PINMUX_GPIO(GPIO_FN_SSO0_PD, SSO0_PD_MARK),
-       PINMUX_GPIO(GPIO_FN_SSI0_PD, SSI0_PD_MARK),
-       PINMUX_GPIO(GPIO_FN_SSCK0_PD, SSCK0_PD_MARK),
-       PINMUX_GPIO(GPIO_FN_SCS0_PF, SCS0_PF_MARK),
-       PINMUX_GPIO(GPIO_FN_SSO0_PF, SSO0_PF_MARK),
-       PINMUX_GPIO(GPIO_FN_SSI0_PF, SSI0_PF_MARK),
-       PINMUX_GPIO(GPIO_FN_SSCK0_PF, SSCK0_PF_MARK),
-       PINMUX_GPIO(GPIO_FN_SCS1_PD, SCS1_PD_MARK),
-       PINMUX_GPIO(GPIO_FN_SSO1_PD, SSO1_PD_MARK),
-       PINMUX_GPIO(GPIO_FN_SSI1_PD, SSI1_PD_MARK),
-       PINMUX_GPIO(GPIO_FN_SSCK1_PD, SSCK1_PD_MARK),
-       PINMUX_GPIO(GPIO_FN_SCS1_PF, SCS1_PF_MARK),
-       PINMUX_GPIO(GPIO_FN_SSO1_PF, SSO1_PF_MARK),
-       PINMUX_GPIO(GPIO_FN_SSI1_PF, SSI1_PF_MARK),
-       PINMUX_GPIO(GPIO_FN_SSCK1_PF, SSCK1_PF_MARK),
+       GPIO_FN(SCS0_PD),
+       GPIO_FN(SSO0_PD),
+       GPIO_FN(SSI0_PD),
+       GPIO_FN(SSCK0_PD),
+       GPIO_FN(SCS0_PF),
+       GPIO_FN(SSO0_PF),
+       GPIO_FN(SSI0_PF),
+       GPIO_FN(SSCK0_PF),
+       GPIO_FN(SCS1_PD),
+       GPIO_FN(SSO1_PD),
+       GPIO_FN(SSI1_PD),
+       GPIO_FN(SSCK1_PD),
+       GPIO_FN(SCS1_PF),
+       GPIO_FN(SSO1_PF),
+       GPIO_FN(SSI1_PF),
+       GPIO_FN(SSCK1_PF),
 
        /* SCIF */
-       PINMUX_GPIO(GPIO_FN_TXD0, TXD0_MARK),
-       PINMUX_GPIO(GPIO_FN_RXD0, RXD0_MARK),
-       PINMUX_GPIO(GPIO_FN_SCK0, SCK0_MARK),
-       PINMUX_GPIO(GPIO_FN_TXD1, TXD1_MARK),
-       PINMUX_GPIO(GPIO_FN_RXD1, RXD1_MARK),
-       PINMUX_GPIO(GPIO_FN_SCK1, SCK1_MARK),
-       PINMUX_GPIO(GPIO_FN_TXD2, TXD2_MARK),
-       PINMUX_GPIO(GPIO_FN_RXD2, RXD2_MARK),
-       PINMUX_GPIO(GPIO_FN_SCK2, SCK2_MARK),
-       PINMUX_GPIO(GPIO_FN_RTS3, RTS3_MARK),
-       PINMUX_GPIO(GPIO_FN_CTS3, CTS3_MARK),
-       PINMUX_GPIO(GPIO_FN_TXD3, TXD3_MARK),
-       PINMUX_GPIO(GPIO_FN_RXD3, RXD3_MARK),
-       PINMUX_GPIO(GPIO_FN_SCK3, SCK3_MARK),
+       GPIO_FN(TXD0),
+       GPIO_FN(RXD0),
+       GPIO_FN(SCK0),
+       GPIO_FN(TXD1),
+       GPIO_FN(RXD1),
+       GPIO_FN(SCK1),
+       GPIO_FN(TXD2),
+       GPIO_FN(RXD2),
+       GPIO_FN(SCK2),
+       GPIO_FN(RTS3),
+       GPIO_FN(CTS3),
+       GPIO_FN(TXD3),
+       GPIO_FN(RXD3),
+       GPIO_FN(SCK3),
 
        /* SSI */
-       PINMUX_GPIO(GPIO_FN_AUDIO_CLK, AUDIO_CLK_MARK),
-       PINMUX_GPIO(GPIO_FN_SSIDATA3, SSIDATA3_MARK),
-       PINMUX_GPIO(GPIO_FN_SSIWS3, SSIWS3_MARK),
-       PINMUX_GPIO(GPIO_FN_SSISCK3, SSISCK3_MARK),
-       PINMUX_GPIO(GPIO_FN_SSIDATA2, SSIDATA2_MARK),
-       PINMUX_GPIO(GPIO_FN_SSIWS2, SSIWS2_MARK),
-       PINMUX_GPIO(GPIO_FN_SSISCK2, SSISCK2_MARK),
-       PINMUX_GPIO(GPIO_FN_SSIDATA1, SSIDATA1_MARK),
-       PINMUX_GPIO(GPIO_FN_SSIWS1, SSIWS1_MARK),
-       PINMUX_GPIO(GPIO_FN_SSISCK1, SSISCK1_MARK),
-       PINMUX_GPIO(GPIO_FN_SSIDATA0, SSIDATA0_MARK),
-       PINMUX_GPIO(GPIO_FN_SSIWS0, SSIWS0_MARK),
-       PINMUX_GPIO(GPIO_FN_SSISCK0, SSISCK0_MARK),
+       GPIO_FN(AUDIO_CLK),
+       GPIO_FN(SSIDATA3),
+       GPIO_FN(SSIWS3),
+       GPIO_FN(SSISCK3),
+       GPIO_FN(SSIDATA2),
+       GPIO_FN(SSIWS2),
+       GPIO_FN(SSISCK2),
+       GPIO_FN(SSIDATA1),
+       GPIO_FN(SSIWS1),
+       GPIO_FN(SSISCK1),
+       GPIO_FN(SSIDATA0),
+       GPIO_FN(SSIWS0),
+       GPIO_FN(SSISCK0),
 
        /* FLCTL */
-       PINMUX_GPIO(GPIO_FN_FCE, FCE_MARK),
-       PINMUX_GPIO(GPIO_FN_FRB, FRB_MARK),
-       PINMUX_GPIO(GPIO_FN_NAF7, NAF7_MARK),
-       PINMUX_GPIO(GPIO_FN_NAF6, NAF6_MARK),
-       PINMUX_GPIO(GPIO_FN_NAF5, NAF5_MARK),
-       PINMUX_GPIO(GPIO_FN_NAF4, NAF4_MARK),
-       PINMUX_GPIO(GPIO_FN_NAF3, NAF3_MARK),
-       PINMUX_GPIO(GPIO_FN_NAF2, NAF2_MARK),
-       PINMUX_GPIO(GPIO_FN_NAF1, NAF1_MARK),
-       PINMUX_GPIO(GPIO_FN_NAF0, NAF0_MARK),
-       PINMUX_GPIO(GPIO_FN_FSC, FSC_MARK),
-       PINMUX_GPIO(GPIO_FN_FOE, FOE_MARK),
-       PINMUX_GPIO(GPIO_FN_FCDE, FCDE_MARK),
-       PINMUX_GPIO(GPIO_FN_FWE, FWE_MARK),
+       GPIO_FN(FCE),
+       GPIO_FN(FRB),
+       GPIO_FN(NAF7),
+       GPIO_FN(NAF6),
+       GPIO_FN(NAF5),
+       GPIO_FN(NAF4),
+       GPIO_FN(NAF3),
+       GPIO_FN(NAF2),
+       GPIO_FN(NAF1),
+       GPIO_FN(NAF0),
+       GPIO_FN(FSC),
+       GPIO_FN(FOE),
+       GPIO_FN(FCDE),
+       GPIO_FN(FWE),
 
        /* LCDC */
-       PINMUX_GPIO(GPIO_FN_LCD_VEPWC, LCD_VEPWC_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_VCPWC, LCD_VCPWC_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_CLK, LCD_CLK_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_FLM, LCD_FLM_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_M_DISP, LCD_M_DISP_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_CL2, LCD_CL2_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_CL1, LCD_CL1_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_DON, LCD_DON_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_DATA15, LCD_DATA15_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_DATA14, LCD_DATA14_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_DATA13, LCD_DATA13_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_DATA12, LCD_DATA12_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_DATA11, LCD_DATA11_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_DATA10, LCD_DATA10_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_DATA9, LCD_DATA9_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_DATA8, LCD_DATA8_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_DATA7, LCD_DATA7_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_DATA6, LCD_DATA6_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_DATA5, LCD_DATA5_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_DATA4, LCD_DATA4_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_DATA3, LCD_DATA3_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_DATA2, LCD_DATA2_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_DATA1, LCD_DATA1_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_DATA0, LCD_DATA0_MARK),
+       GPIO_FN(LCD_VEPWC),
+       GPIO_FN(LCD_VCPWC),
+       GPIO_FN(LCD_CLK),
+       GPIO_FN(LCD_FLM),
+       GPIO_FN(LCD_M_DISP),
+       GPIO_FN(LCD_CL2),
+       GPIO_FN(LCD_CL1),
+       GPIO_FN(LCD_DON),
+       GPIO_FN(LCD_DATA15),
+       GPIO_FN(LCD_DATA14),
+       GPIO_FN(LCD_DATA13),
+       GPIO_FN(LCD_DATA12),
+       GPIO_FN(LCD_DATA11),
+       GPIO_FN(LCD_DATA10),
+       GPIO_FN(LCD_DATA9),
+       GPIO_FN(LCD_DATA8),
+       GPIO_FN(LCD_DATA7),
+       GPIO_FN(LCD_DATA6),
+       GPIO_FN(LCD_DATA5),
+       GPIO_FN(LCD_DATA4),
+       GPIO_FN(LCD_DATA3),
+       GPIO_FN(LCD_DATA2),
+       GPIO_FN(LCD_DATA1),
+       GPIO_FN(LCD_DATA0),
 };
 
-static struct pinmux_cfg_reg pinmux_config_regs[] = {
+static const struct pinmux_cfg_reg pinmux_config_regs[] = {
        { PINMUX_CFG_REG("PBIORL", 0xfffe3886, 16, 1) {
                0, 0,
                0, 0,
@@ -1525,7 +1529,7 @@ static struct pinmux_cfg_reg pinmux_config_regs[] = {
        {}
 };
 
-static struct pinmux_data_reg pinmux_data_regs[] = {
+static const struct pinmux_data_reg pinmux_data_regs[] = {
        { PINMUX_DATA_REG("PADRL", 0xfffe3802, 16) {
                0, 0, 0, 0,
                0, 0, 0, 0,
@@ -1571,19 +1575,17 @@ static struct pinmux_data_reg pinmux_data_regs[] = {
        { },
 };
 
-struct sh_pfc_soc_info sh7203_pinmux_info = {
+const struct sh_pfc_soc_info sh7203_pinmux_info = {
        .name = "sh7203_pfc",
-       .reserved_id = PINMUX_RESERVED,
-       .data = { PINMUX_DATA_BEGIN, PINMUX_DATA_END },
        .input = { PINMUX_INPUT_BEGIN, PINMUX_INPUT_END, FORCE_IN },
        .output = { PINMUX_OUTPUT_BEGIN, PINMUX_OUTPUT_END, FORCE_OUT },
-       .mark = { PINMUX_MARK_BEGIN, PINMUX_MARK_END },
        .function = { PINMUX_FUNCTION_BEGIN, PINMUX_FUNCTION_END },
 
-       .first_gpio = GPIO_PA7,
-       .last_gpio = GPIO_FN_LCD_DATA0,
+       .pins = pinmux_pins,
+       .nr_pins = ARRAY_SIZE(pinmux_pins),
+       .func_gpios = pinmux_func_gpios,
+       .nr_func_gpios = ARRAY_SIZE(pinmux_func_gpios),
 
-       .gpios = pinmux_gpios,
        .cfg_regs = pinmux_config_regs,
        .data_regs = pinmux_data_regs,
 
index 2ba5639dcf349c59d1a7f8b42d2a266a65fb8f49..284675249ed9dd5e4a8b46f0652856e23a331e84 100644 (file)
@@ -604,7 +604,7 @@ enum {
        PINMUX_MARK_END,
 };
 
-static pinmux_enum_t pinmux_data[] = {
+static const pinmux_enum_t pinmux_data[] = {
 
        /* Port A */
        PINMUX_DATA(PA3_DATA, PA3_IN),
@@ -1072,7 +1072,7 @@ static pinmux_enum_t pinmux_data[] = {
        PINMUX_DATA(SD_D2_MARK, PK0MD_10),
 };
 
-static struct pinmux_gpio pinmux_gpios[] = {
+static struct sh_pfc_pin pinmux_pins[] = {
 
        /* Port A */
        PINMUX_GPIO(GPIO_PA3, PA3_DATA),
@@ -1216,257 +1216,261 @@ static struct pinmux_gpio pinmux_gpios[] = {
        PINMUX_GPIO(GPIO_PK2, PK2_DATA),
        PINMUX_GPIO(GPIO_PK1, PK1_DATA),
        PINMUX_GPIO(GPIO_PK0, PK0_DATA),
+};
+
+#define PINMUX_FN_BASE ARRAY_SIZE(pinmux_pins)
 
+static const struct pinmux_func pinmux_func_gpios[] = {
        /* INTC */
-       PINMUX_GPIO(GPIO_FN_PINT7_PG, PINT7_PG_MARK),
-       PINMUX_GPIO(GPIO_FN_PINT6_PG, PINT6_PG_MARK),
-       PINMUX_GPIO(GPIO_FN_PINT5_PG, PINT5_PG_MARK),
-       PINMUX_GPIO(GPIO_FN_PINT4_PG, PINT4_PG_MARK),
-       PINMUX_GPIO(GPIO_FN_PINT3_PG, PINT3_PG_MARK),
-       PINMUX_GPIO(GPIO_FN_PINT2_PG, PINT2_PG_MARK),
-       PINMUX_GPIO(GPIO_FN_PINT1_PG, PINT1_PG_MARK),
-
-       PINMUX_GPIO(GPIO_FN_IRQ7_PC, IRQ7_PC_MARK),
-       PINMUX_GPIO(GPIO_FN_IRQ6_PC, IRQ6_PC_MARK),
-       PINMUX_GPIO(GPIO_FN_IRQ5_PC, IRQ5_PC_MARK),
-       PINMUX_GPIO(GPIO_FN_IRQ4_PC, IRQ4_PC_MARK),
-       PINMUX_GPIO(GPIO_FN_IRQ3_PG, IRQ3_PG_MARK),
-       PINMUX_GPIO(GPIO_FN_IRQ2_PG, IRQ2_PG_MARK),
-       PINMUX_GPIO(GPIO_FN_IRQ1_PJ, IRQ1_PJ_MARK),
-       PINMUX_GPIO(GPIO_FN_IRQ0_PJ, IRQ0_PJ_MARK),
-       PINMUX_GPIO(GPIO_FN_IRQ3_PE, IRQ3_PE_MARK),
-       PINMUX_GPIO(GPIO_FN_IRQ2_PE, IRQ2_PE_MARK),
-       PINMUX_GPIO(GPIO_FN_IRQ1_PE, IRQ1_PE_MARK),
-       PINMUX_GPIO(GPIO_FN_IRQ0_PE, IRQ0_PE_MARK),
+       GPIO_FN(PINT7_PG),
+       GPIO_FN(PINT6_PG),
+       GPIO_FN(PINT5_PG),
+       GPIO_FN(PINT4_PG),
+       GPIO_FN(PINT3_PG),
+       GPIO_FN(PINT2_PG),
+       GPIO_FN(PINT1_PG),
+
+       GPIO_FN(IRQ7_PC),
+       GPIO_FN(IRQ6_PC),
+       GPIO_FN(IRQ5_PC),
+       GPIO_FN(IRQ4_PC),
+       GPIO_FN(IRQ3_PG),
+       GPIO_FN(IRQ2_PG),
+       GPIO_FN(IRQ1_PJ),
+       GPIO_FN(IRQ0_PJ),
+       GPIO_FN(IRQ3_PE),
+       GPIO_FN(IRQ2_PE),
+       GPIO_FN(IRQ1_PE),
+       GPIO_FN(IRQ0_PE),
 
        /* WDT */
-       PINMUX_GPIO(GPIO_FN_WDTOVF, WDTOVF_MARK),
+       GPIO_FN(WDTOVF),
 
        /* CAN */
-       PINMUX_GPIO(GPIO_FN_CTX1, CTX1_MARK),
-       PINMUX_GPIO(GPIO_FN_CRX1, CRX1_MARK),
-       PINMUX_GPIO(GPIO_FN_CTX0, CTX0_MARK),
-       PINMUX_GPIO(GPIO_FN_CRX0, CRX0_MARK),
-       PINMUX_GPIO(GPIO_FN_CRX0_CRX1, CRX0_CRX1_MARK),
+       GPIO_FN(CTX1),
+       GPIO_FN(CRX1),
+       GPIO_FN(CTX0),
+       GPIO_FN(CRX0),
+       GPIO_FN(CRX0_CRX1),
 
        /* DMAC */
-       PINMUX_GPIO(GPIO_FN_TEND0, TEND0_MARK),
-       PINMUX_GPIO(GPIO_FN_DACK0, DACK0_MARK),
-       PINMUX_GPIO(GPIO_FN_DREQ0, DREQ0_MARK),
-       PINMUX_GPIO(GPIO_FN_TEND1, TEND1_MARK),
-       PINMUX_GPIO(GPIO_FN_DACK1, DACK1_MARK),
-       PINMUX_GPIO(GPIO_FN_DREQ1, DREQ1_MARK),
+       GPIO_FN(TEND0),
+       GPIO_FN(DACK0),
+       GPIO_FN(DREQ0),
+       GPIO_FN(TEND1),
+       GPIO_FN(DACK1),
+       GPIO_FN(DREQ1),
 
        /* ADC */
-       PINMUX_GPIO(GPIO_FN_ADTRG, ADTRG_MARK),
+       GPIO_FN(ADTRG),
 
        /* BSCh */
-       PINMUX_GPIO(GPIO_FN_A25, A25_MARK),
-       PINMUX_GPIO(GPIO_FN_A24, A24_MARK),
-       PINMUX_GPIO(GPIO_FN_A23, A23_MARK),
-       PINMUX_GPIO(GPIO_FN_A22, A22_MARK),
-       PINMUX_GPIO(GPIO_FN_A21, A21_MARK),
-       PINMUX_GPIO(GPIO_FN_A20, A20_MARK),
-       PINMUX_GPIO(GPIO_FN_A19, A19_MARK),
-       PINMUX_GPIO(GPIO_FN_A18, A18_MARK),
-       PINMUX_GPIO(GPIO_FN_A17, A17_MARK),
-       PINMUX_GPIO(GPIO_FN_A16, A16_MARK),
-       PINMUX_GPIO(GPIO_FN_A15, A15_MARK),
-       PINMUX_GPIO(GPIO_FN_A14, A14_MARK),
-       PINMUX_GPIO(GPIO_FN_A13, A13_MARK),
-       PINMUX_GPIO(GPIO_FN_A12, A12_MARK),
-       PINMUX_GPIO(GPIO_FN_A11, A11_MARK),
-       PINMUX_GPIO(GPIO_FN_A10, A10_MARK),
-       PINMUX_GPIO(GPIO_FN_A9, A9_MARK),
-       PINMUX_GPIO(GPIO_FN_A8, A8_MARK),
-       PINMUX_GPIO(GPIO_FN_A7, A7_MARK),
-       PINMUX_GPIO(GPIO_FN_A6, A6_MARK),
-       PINMUX_GPIO(GPIO_FN_A5, A5_MARK),
-       PINMUX_GPIO(GPIO_FN_A4, A4_MARK),
-       PINMUX_GPIO(GPIO_FN_A3, A3_MARK),
-       PINMUX_GPIO(GPIO_FN_A2, A2_MARK),
-       PINMUX_GPIO(GPIO_FN_A1, A1_MARK),
-       PINMUX_GPIO(GPIO_FN_A0, A0_MARK),
-
-       PINMUX_GPIO(GPIO_FN_D15, D15_MARK),
-       PINMUX_GPIO(GPIO_FN_D14, D14_MARK),
-       PINMUX_GPIO(GPIO_FN_D13, D13_MARK),
-       PINMUX_GPIO(GPIO_FN_D12, D12_MARK),
-       PINMUX_GPIO(GPIO_FN_D11, D11_MARK),
-       PINMUX_GPIO(GPIO_FN_D10, D10_MARK),
-       PINMUX_GPIO(GPIO_FN_D9, D9_MARK),
-       PINMUX_GPIO(GPIO_FN_D8, D8_MARK),
-       PINMUX_GPIO(GPIO_FN_D7, D7_MARK),
-       PINMUX_GPIO(GPIO_FN_D6, D6_MARK),
-       PINMUX_GPIO(GPIO_FN_D5, D5_MARK),
-       PINMUX_GPIO(GPIO_FN_D4, D4_MARK),
-       PINMUX_GPIO(GPIO_FN_D3, D3_MARK),
-       PINMUX_GPIO(GPIO_FN_D2, D2_MARK),
-       PINMUX_GPIO(GPIO_FN_D1, D1_MARK),
-       PINMUX_GPIO(GPIO_FN_D0, D0_MARK),
-
-       PINMUX_GPIO(GPIO_FN_BS, BS_MARK),
-       PINMUX_GPIO(GPIO_FN_CS4, CS4_MARK),
-       PINMUX_GPIO(GPIO_FN_CS3, CS3_MARK),
-       PINMUX_GPIO(GPIO_FN_CS2, CS2_MARK),
-       PINMUX_GPIO(GPIO_FN_CS1, CS1_MARK),
-       PINMUX_GPIO(GPIO_FN_CS0, CS0_MARK),
-       PINMUX_GPIO(GPIO_FN_CS6CE1B, CS6CE1B_MARK),
-       PINMUX_GPIO(GPIO_FN_CS5CE1A, CS5CE1A_MARK),
-       PINMUX_GPIO(GPIO_FN_CE2A, CE2A_MARK),
-       PINMUX_GPIO(GPIO_FN_CE2B, CE2B_MARK),
-       PINMUX_GPIO(GPIO_FN_RD, RD_MARK),
-       PINMUX_GPIO(GPIO_FN_RDWR, RDWR_MARK),
-       PINMUX_GPIO(GPIO_FN_ICIOWRAH, ICIOWRAH_MARK),
-       PINMUX_GPIO(GPIO_FN_ICIORD, ICIORD_MARK),
-       PINMUX_GPIO(GPIO_FN_WE1DQMUWE, WE1DQMUWE_MARK),
-       PINMUX_GPIO(GPIO_FN_WE0DQML, WE0DQML_MARK),
-       PINMUX_GPIO(GPIO_FN_RAS, RAS_MARK),
-       PINMUX_GPIO(GPIO_FN_CAS, CAS_MARK),
-       PINMUX_GPIO(GPIO_FN_CKE, CKE_MARK),
-       PINMUX_GPIO(GPIO_FN_WAIT, WAIT_MARK),
-       PINMUX_GPIO(GPIO_FN_BREQ, BREQ_MARK),
-       PINMUX_GPIO(GPIO_FN_BACK, BACK_MARK),
-       PINMUX_GPIO(GPIO_FN_IOIS16, IOIS16_MARK),
+       GPIO_FN(A25),
+       GPIO_FN(A24),
+       GPIO_FN(A23),
+       GPIO_FN(A22),
+       GPIO_FN(A21),
+       GPIO_FN(A20),
+       GPIO_FN(A19),
+       GPIO_FN(A18),
+       GPIO_FN(A17),
+       GPIO_FN(A16),
+       GPIO_FN(A15),
+       GPIO_FN(A14),
+       GPIO_FN(A13),
+       GPIO_FN(A12),
+       GPIO_FN(A11),
+       GPIO_FN(A10),
+       GPIO_FN(A9),
+       GPIO_FN(A8),
+       GPIO_FN(A7),
+       GPIO_FN(A6),
+       GPIO_FN(A5),
+       GPIO_FN(A4),
+       GPIO_FN(A3),
+       GPIO_FN(A2),
+       GPIO_FN(A1),
+       GPIO_FN(A0),
+
+       GPIO_FN(D15),
+       GPIO_FN(D14),
+       GPIO_FN(D13),
+       GPIO_FN(D12),
+       GPIO_FN(D11),
+       GPIO_FN(D10),
+       GPIO_FN(D9),
+       GPIO_FN(D8),
+       GPIO_FN(D7),
+       GPIO_FN(D6),
+       GPIO_FN(D5),
+       GPIO_FN(D4),
+       GPIO_FN(D3),
+       GPIO_FN(D2),
+       GPIO_FN(D1),
+       GPIO_FN(D0),
+
+       GPIO_FN(BS),
+       GPIO_FN(CS4),
+       GPIO_FN(CS3),
+       GPIO_FN(CS2),
+       GPIO_FN(CS1),
+       GPIO_FN(CS0),
+       GPIO_FN(CS6CE1B),
+       GPIO_FN(CS5CE1A),
+       GPIO_FN(CE2A),
+       GPIO_FN(CE2B),
+       GPIO_FN(RD),
+       GPIO_FN(RDWR),
+       GPIO_FN(ICIOWRAH),
+       GPIO_FN(ICIORD),
+       GPIO_FN(WE1DQMUWE),
+       GPIO_FN(WE0DQML),
+       GPIO_FN(RAS),
+       GPIO_FN(CAS),
+       GPIO_FN(CKE),
+       GPIO_FN(WAIT),
+       GPIO_FN(BREQ),
+       GPIO_FN(BACK),
+       GPIO_FN(IOIS16),
 
        /* TMU */
-       PINMUX_GPIO(GPIO_FN_TIOC4D, TIOC4D_MARK),
-       PINMUX_GPIO(GPIO_FN_TIOC4C, TIOC4C_MARK),
-       PINMUX_GPIO(GPIO_FN_TIOC4B, TIOC4B_MARK),
-       PINMUX_GPIO(GPIO_FN_TIOC4A, TIOC4A_MARK),
-       PINMUX_GPIO(GPIO_FN_TIOC3D, TIOC3D_MARK),
-       PINMUX_GPIO(GPIO_FN_TIOC3C, TIOC3C_MARK),
-       PINMUX_GPIO(GPIO_FN_TIOC3B, TIOC3B_MARK),
-       PINMUX_GPIO(GPIO_FN_TIOC3A, TIOC3A_MARK),
-       PINMUX_GPIO(GPIO_FN_TIOC2B, TIOC2B_MARK),
-       PINMUX_GPIO(GPIO_FN_TIOC1B, TIOC1B_MARK),
-       PINMUX_GPIO(GPIO_FN_TIOC2A, TIOC2A_MARK),
-       PINMUX_GPIO(GPIO_FN_TIOC1A, TIOC1A_MARK),
-       PINMUX_GPIO(GPIO_FN_TIOC0D, TIOC0D_MARK),
-       PINMUX_GPIO(GPIO_FN_TIOC0C, TIOC0C_MARK),
-       PINMUX_GPIO(GPIO_FN_TIOC0B, TIOC0B_MARK),
-       PINMUX_GPIO(GPIO_FN_TIOC0A, TIOC0A_MARK),
-       PINMUX_GPIO(GPIO_FN_TCLKD, TCLKD_MARK),
-       PINMUX_GPIO(GPIO_FN_TCLKC, TCLKC_MARK),
-       PINMUX_GPIO(GPIO_FN_TCLKB, TCLKB_MARK),
-       PINMUX_GPIO(GPIO_FN_TCLKA, TCLKA_MARK),
+       GPIO_FN(TIOC4D),
+       GPIO_FN(TIOC4C),
+       GPIO_FN(TIOC4B),
+       GPIO_FN(TIOC4A),
+       GPIO_FN(TIOC3D),
+       GPIO_FN(TIOC3C),
+       GPIO_FN(TIOC3B),
+       GPIO_FN(TIOC3A),
+       GPIO_FN(TIOC2B),
+       GPIO_FN(TIOC1B),
+       GPIO_FN(TIOC2A),
+       GPIO_FN(TIOC1A),
+       GPIO_FN(TIOC0D),
+       GPIO_FN(TIOC0C),
+       GPIO_FN(TIOC0B),
+       GPIO_FN(TIOC0A),
+       GPIO_FN(TCLKD),
+       GPIO_FN(TCLKC),
+       GPIO_FN(TCLKB),
+       GPIO_FN(TCLKA),
 
        /* SCIF */
-       PINMUX_GPIO(GPIO_FN_TXD0, TXD0_MARK),
-       PINMUX_GPIO(GPIO_FN_RXD0, RXD0_MARK),
-       PINMUX_GPIO(GPIO_FN_SCK0, SCK0_MARK),
-       PINMUX_GPIO(GPIO_FN_TXD1, TXD1_MARK),
-       PINMUX_GPIO(GPIO_FN_RXD1, RXD1_MARK),
-       PINMUX_GPIO(GPIO_FN_SCK1, SCK1_MARK),
-       PINMUX_GPIO(GPIO_FN_TXD2, TXD2_MARK),
-       PINMUX_GPIO(GPIO_FN_RXD2, RXD2_MARK),
-       PINMUX_GPIO(GPIO_FN_SCK2, SCK2_MARK),
-       PINMUX_GPIO(GPIO_FN_RTS3, RTS3_MARK),
-       PINMUX_GPIO(GPIO_FN_CTS3, CTS3_MARK),
-       PINMUX_GPIO(GPIO_FN_TXD3, TXD3_MARK),
-       PINMUX_GPIO(GPIO_FN_RXD3, RXD3_MARK),
-       PINMUX_GPIO(GPIO_FN_SCK3, SCK3_MARK),
-       PINMUX_GPIO(GPIO_FN_TXD4, TXD4_MARK),
-       PINMUX_GPIO(GPIO_FN_RXD4, RXD4_MARK),
-       PINMUX_GPIO(GPIO_FN_TXD5, TXD5_MARK),
-       PINMUX_GPIO(GPIO_FN_RXD5, RXD5_MARK),
-       PINMUX_GPIO(GPIO_FN_TXD6, TXD6_MARK),
-       PINMUX_GPIO(GPIO_FN_RXD6, RXD6_MARK),
-       PINMUX_GPIO(GPIO_FN_TXD7, TXD7_MARK),
-       PINMUX_GPIO(GPIO_FN_RXD7, RXD7_MARK),
-       PINMUX_GPIO(GPIO_FN_RTS1, RTS1_MARK),
-       PINMUX_GPIO(GPIO_FN_CTS1, CTS1_MARK),
+       GPIO_FN(TXD0),
+       GPIO_FN(RXD0),
+       GPIO_FN(SCK0),
+       GPIO_FN(TXD1),
+       GPIO_FN(RXD1),
+       GPIO_FN(SCK1),
+       GPIO_FN(TXD2),
+       GPIO_FN(RXD2),
+       GPIO_FN(SCK2),
+       GPIO_FN(RTS3),
+       GPIO_FN(CTS3),
+       GPIO_FN(TXD3),
+       GPIO_FN(RXD3),
+       GPIO_FN(SCK3),
+       GPIO_FN(TXD4),
+       GPIO_FN(RXD4),
+       GPIO_FN(TXD5),
+       GPIO_FN(RXD5),
+       GPIO_FN(TXD6),
+       GPIO_FN(RXD6),
+       GPIO_FN(TXD7),
+       GPIO_FN(RXD7),
+       GPIO_FN(RTS1),
+       GPIO_FN(CTS1),
 
        /* RSPI */
-       PINMUX_GPIO(GPIO_FN_RSPCK0, RSPCK0_MARK),
-       PINMUX_GPIO(GPIO_FN_MOSI0, MOSI0_MARK),
-       PINMUX_GPIO(GPIO_FN_MISO0_PF12, MISO0_PF12_MARK),
-       PINMUX_GPIO(GPIO_FN_MISO1, MISO1_MARK),
-       PINMUX_GPIO(GPIO_FN_SSL00, SSL00_MARK),
-       PINMUX_GPIO(GPIO_FN_RSPCK1, RSPCK1_MARK),
-       PINMUX_GPIO(GPIO_FN_MOSI1, MOSI1_MARK),
-       PINMUX_GPIO(GPIO_FN_MISO1_PG19, MISO1_PG19_MARK),
-       PINMUX_GPIO(GPIO_FN_SSL10, SSL10_MARK),
+       GPIO_FN(RSPCK0),
+       GPIO_FN(MOSI0),
+       GPIO_FN(MISO0_PF12),
+       GPIO_FN(MISO1),
+       GPIO_FN(SSL00),
+       GPIO_FN(RSPCK1),
+       GPIO_FN(MOSI1),
+       GPIO_FN(MISO1_PG19),
+       GPIO_FN(SSL10),
 
        /* IIC3 */
-       PINMUX_GPIO(GPIO_FN_SCL0, SCL0_MARK),
-       PINMUX_GPIO(GPIO_FN_SCL1, SCL1_MARK),
-       PINMUX_GPIO(GPIO_FN_SCL2, SCL2_MARK),
-       PINMUX_GPIO(GPIO_FN_SDA0, SDA0_MARK),
-       PINMUX_GPIO(GPIO_FN_SDA1, SDA1_MARK),
-       PINMUX_GPIO(GPIO_FN_SDA2, SDA2_MARK),
+       GPIO_FN(SCL0),
+       GPIO_FN(SCL1),
+       GPIO_FN(SCL2),
+       GPIO_FN(SDA0),
+       GPIO_FN(SDA1),
+       GPIO_FN(SDA2),
 
        /* SSI */
-       PINMUX_GPIO(GPIO_FN_SSISCK0, SSISCK0_MARK),
-       PINMUX_GPIO(GPIO_FN_SSIWS0, SSIWS0_MARK),
-       PINMUX_GPIO(GPIO_FN_SSITXD0, SSITXD0_MARK),
-       PINMUX_GPIO(GPIO_FN_SSIRXD0, SSIRXD0_MARK),
-       PINMUX_GPIO(GPIO_FN_SSIWS1, SSIWS1_MARK),
-       PINMUX_GPIO(GPIO_FN_SSIWS2, SSIWS2_MARK),
-       PINMUX_GPIO(GPIO_FN_SSIWS3, SSIWS3_MARK),
-       PINMUX_GPIO(GPIO_FN_SSISCK1, SSISCK1_MARK),
-       PINMUX_GPIO(GPIO_FN_SSISCK2, SSISCK2_MARK),
-       PINMUX_GPIO(GPIO_FN_SSISCK3, SSISCK3_MARK),
-       PINMUX_GPIO(GPIO_FN_SSIDATA1, SSIDATA1_MARK),
-       PINMUX_GPIO(GPIO_FN_SSIDATA2, SSIDATA2_MARK),
-       PINMUX_GPIO(GPIO_FN_SSIDATA3, SSIDATA3_MARK),
-       PINMUX_GPIO(GPIO_FN_AUDIO_CLK, AUDIO_CLK_MARK),
+       GPIO_FN(SSISCK0),
+       GPIO_FN(SSIWS0),
+       GPIO_FN(SSITXD0),
+       GPIO_FN(SSIRXD0),
+       GPIO_FN(SSIWS1),
+       GPIO_FN(SSIWS2),
+       GPIO_FN(SSIWS3),
+       GPIO_FN(SSISCK1),
+       GPIO_FN(SSISCK2),
+       GPIO_FN(SSISCK3),
+       GPIO_FN(SSIDATA1),
+       GPIO_FN(SSIDATA2),
+       GPIO_FN(SSIDATA3),
+       GPIO_FN(AUDIO_CLK),
 
        /* SIOF */ /* NOTE Shares AUDIO_CLK with SSI */
-       PINMUX_GPIO(GPIO_FN_SIOFTXD, SIOFTXD_MARK),
-       PINMUX_GPIO(GPIO_FN_SIOFRXD, SIOFRXD_MARK),
-       PINMUX_GPIO(GPIO_FN_SIOFSYNC, SIOFSYNC_MARK),
-       PINMUX_GPIO(GPIO_FN_SIOFSCK, SIOFSCK_MARK),
+       GPIO_FN(SIOFTXD),
+       GPIO_FN(SIOFRXD),
+       GPIO_FN(SIOFSYNC),
+       GPIO_FN(SIOFSCK),
 
        /* SPDIF */ /* NOTE Shares AUDIO_CLK with SSI */
-       PINMUX_GPIO(GPIO_FN_SPDIF_IN, SPDIF_IN_MARK),
-       PINMUX_GPIO(GPIO_FN_SPDIF_OUT, SPDIF_OUT_MARK),
+       GPIO_FN(SPDIF_IN),
+       GPIO_FN(SPDIF_OUT),
 
        /* NANDFMC */ /* NOTE Controller is not available in boot mode 0 */
-       PINMUX_GPIO(GPIO_FN_FCE, FCE_MARK),
-       PINMUX_GPIO(GPIO_FN_FRB, FRB_MARK),
+       GPIO_FN(FCE),
+       GPIO_FN(FRB),
 
        /* VDC3 */
-       PINMUX_GPIO(GPIO_FN_DV_CLK, DV_CLK_MARK),
-       PINMUX_GPIO(GPIO_FN_DV_VSYNC, DV_VSYNC_MARK),
-       PINMUX_GPIO(GPIO_FN_DV_HSYNC, DV_HSYNC_MARK),
-
-       PINMUX_GPIO(GPIO_FN_DV_DATA7, DV_DATA7_MARK),
-       PINMUX_GPIO(GPIO_FN_DV_DATA6, DV_DATA6_MARK),
-       PINMUX_GPIO(GPIO_FN_DV_DATA5, DV_DATA5_MARK),
-       PINMUX_GPIO(GPIO_FN_DV_DATA4, DV_DATA4_MARK),
-       PINMUX_GPIO(GPIO_FN_DV_DATA3, DV_DATA3_MARK),
-       PINMUX_GPIO(GPIO_FN_DV_DATA2, DV_DATA2_MARK),
-       PINMUX_GPIO(GPIO_FN_DV_DATA1, DV_DATA1_MARK),
-       PINMUX_GPIO(GPIO_FN_DV_DATA0, DV_DATA0_MARK),
-
-       PINMUX_GPIO(GPIO_FN_LCD_CLK, LCD_CLK_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_EXTCLK, LCD_EXTCLK_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_VSYNC, LCD_VSYNC_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_HSYNC, LCD_HSYNC_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_DE, LCD_DE_MARK),
-
-       PINMUX_GPIO(GPIO_FN_LCD_DATA15, LCD_DATA15_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_DATA14, LCD_DATA14_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_DATA13, LCD_DATA13_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_DATA12, LCD_DATA12_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_DATA11, LCD_DATA11_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_DATA10, LCD_DATA10_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_DATA9, LCD_DATA9_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_DATA8, LCD_DATA8_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_DATA7, LCD_DATA7_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_DATA6, LCD_DATA6_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_DATA5, LCD_DATA5_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_DATA4, LCD_DATA4_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_DATA3, LCD_DATA3_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_DATA2, LCD_DATA2_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_DATA1, LCD_DATA1_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_DATA0, LCD_DATA0_MARK),
-
-       PINMUX_GPIO(GPIO_FN_LCD_M_DISP, LCD_M_DISP_MARK),
+       GPIO_FN(DV_CLK),
+       GPIO_FN(DV_VSYNC),
+       GPIO_FN(DV_HSYNC),
+
+       GPIO_FN(DV_DATA7),
+       GPIO_FN(DV_DATA6),
+       GPIO_FN(DV_DATA5),
+       GPIO_FN(DV_DATA4),
+       GPIO_FN(DV_DATA3),
+       GPIO_FN(DV_DATA2),
+       GPIO_FN(DV_DATA1),
+       GPIO_FN(DV_DATA0),
+
+       GPIO_FN(LCD_CLK),
+       GPIO_FN(LCD_EXTCLK),
+       GPIO_FN(LCD_VSYNC),
+       GPIO_FN(LCD_HSYNC),
+       GPIO_FN(LCD_DE),
+
+       GPIO_FN(LCD_DATA15),
+       GPIO_FN(LCD_DATA14),
+       GPIO_FN(LCD_DATA13),
+       GPIO_FN(LCD_DATA12),
+       GPIO_FN(LCD_DATA11),
+       GPIO_FN(LCD_DATA10),
+       GPIO_FN(LCD_DATA9),
+       GPIO_FN(LCD_DATA8),
+       GPIO_FN(LCD_DATA7),
+       GPIO_FN(LCD_DATA6),
+       GPIO_FN(LCD_DATA5),
+       GPIO_FN(LCD_DATA4),
+       GPIO_FN(LCD_DATA3),
+       GPIO_FN(LCD_DATA2),
+       GPIO_FN(LCD_DATA1),
+       GPIO_FN(LCD_DATA0),
+
+       GPIO_FN(LCD_M_DISP),
 };
 
-static struct pinmux_cfg_reg pinmux_config_regs[] = {
+static const struct pinmux_cfg_reg pinmux_config_regs[] = {
        { PINMUX_CFG_REG("PAIOR0", 0xfffe3812, 16, 1) {
                0, 0, 0, 0, 0, 0, 0, 0,
                0, 0, 0, 0, 0, 0, 0, 0,
@@ -2032,7 +2036,7 @@ static struct pinmux_cfg_reg pinmux_config_regs[] = {
        {}
 };
 
-static struct pinmux_data_reg pinmux_data_regs[] = {
+static const struct pinmux_data_reg pinmux_data_regs[] = {
        { PINMUX_DATA_REG("PADR1", 0xfffe3814, 16) {
                0, 0, 0, 0, 0, 0, 0, PA3_DATA,
                0, 0, 0, 0, 0, 0, 0, PA2_DATA }
@@ -2110,19 +2114,17 @@ static struct pinmux_data_reg pinmux_data_regs[] = {
        { }
 };
 
-struct sh_pfc_soc_info sh7264_pinmux_info = {
+const struct sh_pfc_soc_info sh7264_pinmux_info = {
        .name = "sh7264_pfc",
-       .reserved_id = PINMUX_RESERVED,
-       .data = { PINMUX_DATA_BEGIN, PINMUX_DATA_END },
        .input = { PINMUX_INPUT_BEGIN, PINMUX_INPUT_END, FORCE_IN },
        .output = { PINMUX_OUTPUT_BEGIN, PINMUX_OUTPUT_END, FORCE_OUT },
-       .mark = { PINMUX_MARK_BEGIN, PINMUX_MARK_END },
        .function = { PINMUX_FUNCTION_BEGIN, PINMUX_FUNCTION_END },
 
-       .first_gpio = GPIO_PA3,
-       .last_gpio = GPIO_FN_LCD_M_DISP,
+       .pins = pinmux_pins,
+       .nr_pins = ARRAY_SIZE(pinmux_pins),
+       .func_gpios = pinmux_func_gpios,
+       .nr_func_gpios = ARRAY_SIZE(pinmux_func_gpios),
 
-       .gpios = pinmux_gpios,
        .cfg_regs = pinmux_config_regs,
        .data_regs = pinmux_data_regs,
 
index b1b5d6d4ad76b29fc9836aa83cefc40b3e01f654..4c401a74acd50ecc9077b3221d1b3a537513849c 100644 (file)
@@ -781,7 +781,7 @@ enum {
        PINMUX_MARK_END,
 };
 
-static pinmux_enum_t pinmux_data[] = {
+static const pinmux_enum_t pinmux_data[] = {
 
        /* Port A */
        PINMUX_DATA(PA1_DATA, PA1_IN),
@@ -1452,7 +1452,7 @@ static pinmux_enum_t pinmux_data[] = {
        PINMUX_DATA(PWM1A_MARK, PJ0MD_100),
 };
 
-static struct pinmux_gpio pinmux_gpios[] = {
+static struct sh_pfc_pin pinmux_pins[] = {
        /* Port A */
        PINMUX_GPIO(GPIO_PA1, PA1_DATA),
        PINMUX_GPIO(GPIO_PA0, PA0_DATA),
@@ -1613,339 +1613,343 @@ static struct pinmux_gpio pinmux_gpios[] = {
        PINMUX_GPIO(GPIO_PJ2, PJ2_DATA),
        PINMUX_GPIO(GPIO_PJ1, PJ1_DATA),
        PINMUX_GPIO(GPIO_PJ0, PJ0_DATA),
+};
+
+#define PINMUX_FN_BASE ARRAY_SIZE(pinmux_pins)
 
+static const struct pinmux_func pinmux_func_gpios[] = {
        /* INTC */
-       PINMUX_GPIO(GPIO_FN_IRQ7_PG, IRQ7_PG_MARK),
-       PINMUX_GPIO(GPIO_FN_IRQ6_PG, IRQ6_PG_MARK),
-       PINMUX_GPIO(GPIO_FN_IRQ5_PG, IRQ5_PG_MARK),
-       PINMUX_GPIO(GPIO_FN_IRQ4_PG, IRQ4_PG_MARK),
-       PINMUX_GPIO(GPIO_FN_IRQ3_PG, IRQ3_PG_MARK),
-       PINMUX_GPIO(GPIO_FN_IRQ2_PG, IRQ2_PG_MARK),
-       PINMUX_GPIO(GPIO_FN_IRQ1_PG, IRQ1_PG_MARK),
-       PINMUX_GPIO(GPIO_FN_IRQ0_PG, IRQ0_PG_MARK),
-       PINMUX_GPIO(GPIO_FN_IRQ7_PF, IRQ7_PF_MARK),
-       PINMUX_GPIO(GPIO_FN_IRQ6_PF, IRQ6_PF_MARK),
-       PINMUX_GPIO(GPIO_FN_IRQ5_PF, IRQ5_PF_MARK),
-       PINMUX_GPIO(GPIO_FN_IRQ4_PF, IRQ4_PF_MARK),
-       PINMUX_GPIO(GPIO_FN_IRQ3_PJ, IRQ3_PJ_MARK),
-       PINMUX_GPIO(GPIO_FN_IRQ2_PJ, IRQ2_PJ_MARK),
-       PINMUX_GPIO(GPIO_FN_IRQ1_PJ, IRQ1_PJ_MARK),
-       PINMUX_GPIO(GPIO_FN_IRQ0_PJ, IRQ0_PJ_MARK),
-       PINMUX_GPIO(GPIO_FN_IRQ1_PC, IRQ1_PC_MARK),
-       PINMUX_GPIO(GPIO_FN_IRQ0_PC, IRQ0_PC_MARK),
-
-       PINMUX_GPIO(GPIO_FN_PINT7_PG, PINT7_PG_MARK),
-       PINMUX_GPIO(GPIO_FN_PINT6_PG, PINT6_PG_MARK),
-       PINMUX_GPIO(GPIO_FN_PINT5_PG, PINT5_PG_MARK),
-       PINMUX_GPIO(GPIO_FN_PINT4_PG, PINT4_PG_MARK),
-       PINMUX_GPIO(GPIO_FN_PINT3_PG, PINT3_PG_MARK),
-       PINMUX_GPIO(GPIO_FN_PINT2_PG, PINT2_PG_MARK),
-       PINMUX_GPIO(GPIO_FN_PINT1_PG, PINT1_PG_MARK),
-       PINMUX_GPIO(GPIO_FN_PINT0_PG, PINT0_PG_MARK),
-       PINMUX_GPIO(GPIO_FN_PINT7_PH, PINT7_PH_MARK),
-       PINMUX_GPIO(GPIO_FN_PINT6_PH, PINT6_PH_MARK),
-       PINMUX_GPIO(GPIO_FN_PINT5_PH, PINT5_PH_MARK),
-       PINMUX_GPIO(GPIO_FN_PINT4_PH, PINT4_PH_MARK),
-       PINMUX_GPIO(GPIO_FN_PINT3_PH, PINT3_PH_MARK),
-       PINMUX_GPIO(GPIO_FN_PINT2_PH, PINT2_PH_MARK),
-       PINMUX_GPIO(GPIO_FN_PINT1_PH, PINT1_PH_MARK),
-       PINMUX_GPIO(GPIO_FN_PINT0_PH, PINT0_PH_MARK),
-       PINMUX_GPIO(GPIO_FN_PINT7_PJ, PINT7_PJ_MARK),
-       PINMUX_GPIO(GPIO_FN_PINT6_PJ, PINT6_PJ_MARK),
-       PINMUX_GPIO(GPIO_FN_PINT5_PJ, PINT5_PJ_MARK),
-       PINMUX_GPIO(GPIO_FN_PINT4_PJ, PINT4_PJ_MARK),
-       PINMUX_GPIO(GPIO_FN_PINT3_PJ, PINT3_PJ_MARK),
-       PINMUX_GPIO(GPIO_FN_PINT2_PJ, PINT2_PJ_MARK),
-       PINMUX_GPIO(GPIO_FN_PINT1_PJ, PINT1_PJ_MARK),
-       PINMUX_GPIO(GPIO_FN_PINT0_PJ, PINT0_PJ_MARK),
+       GPIO_FN(IRQ7_PG),
+       GPIO_FN(IRQ6_PG),
+       GPIO_FN(IRQ5_PG),
+       GPIO_FN(IRQ4_PG),
+       GPIO_FN(IRQ3_PG),
+       GPIO_FN(IRQ2_PG),
+       GPIO_FN(IRQ1_PG),
+       GPIO_FN(IRQ0_PG),
+       GPIO_FN(IRQ7_PF),
+       GPIO_FN(IRQ6_PF),
+       GPIO_FN(IRQ5_PF),
+       GPIO_FN(IRQ4_PF),
+       GPIO_FN(IRQ3_PJ),
+       GPIO_FN(IRQ2_PJ),
+       GPIO_FN(IRQ1_PJ),
+       GPIO_FN(IRQ0_PJ),
+       GPIO_FN(IRQ1_PC),
+       GPIO_FN(IRQ0_PC),
+
+       GPIO_FN(PINT7_PG),
+       GPIO_FN(PINT6_PG),
+       GPIO_FN(PINT5_PG),
+       GPIO_FN(PINT4_PG),
+       GPIO_FN(PINT3_PG),
+       GPIO_FN(PINT2_PG),
+       GPIO_FN(PINT1_PG),
+       GPIO_FN(PINT0_PG),
+       GPIO_FN(PINT7_PH),
+       GPIO_FN(PINT6_PH),
+       GPIO_FN(PINT5_PH),
+       GPIO_FN(PINT4_PH),
+       GPIO_FN(PINT3_PH),
+       GPIO_FN(PINT2_PH),
+       GPIO_FN(PINT1_PH),
+       GPIO_FN(PINT0_PH),
+       GPIO_FN(PINT7_PJ),
+       GPIO_FN(PINT6_PJ),
+       GPIO_FN(PINT5_PJ),
+       GPIO_FN(PINT4_PJ),
+       GPIO_FN(PINT3_PJ),
+       GPIO_FN(PINT2_PJ),
+       GPIO_FN(PINT1_PJ),
+       GPIO_FN(PINT0_PJ),
 
        /* WDT */
-       PINMUX_GPIO(GPIO_FN_WDTOVF, WDTOVF_MARK),
+       GPIO_FN(WDTOVF),
 
        /* CAN */
-       PINMUX_GPIO(GPIO_FN_CTX1, CTX1_MARK),
-       PINMUX_GPIO(GPIO_FN_CRX1, CRX1_MARK),
-       PINMUX_GPIO(GPIO_FN_CTX0, CTX0_MARK),
-       PINMUX_GPIO(GPIO_FN_CRX0, CRX0_MARK),
-       PINMUX_GPIO(GPIO_FN_CRX0_CRX1, CRX0_CRX1_MARK),
-       PINMUX_GPIO(GPIO_FN_CRX0_CRX1_CRX2, CRX0_CRX1_CRX2_MARK),
+       GPIO_FN(CTX1),
+       GPIO_FN(CRX1),
+       GPIO_FN(CTX0),
+       GPIO_FN(CRX0),
+       GPIO_FN(CRX0_CRX1),
+       GPIO_FN(CRX0_CRX1_CRX2),
 
        /* DMAC */
-       PINMUX_GPIO(GPIO_FN_TEND0, TEND0_MARK),
-       PINMUX_GPIO(GPIO_FN_DACK0, DACK0_MARK),
-       PINMUX_GPIO(GPIO_FN_DREQ0, DREQ0_MARK),
-       PINMUX_GPIO(GPIO_FN_TEND1, TEND1_MARK),
-       PINMUX_GPIO(GPIO_FN_DACK1, DACK1_MARK),
-       PINMUX_GPIO(GPIO_FN_DREQ1, DREQ1_MARK),
+       GPIO_FN(TEND0),
+       GPIO_FN(DACK0),
+       GPIO_FN(DREQ0),
+       GPIO_FN(TEND1),
+       GPIO_FN(DACK1),
+       GPIO_FN(DREQ1),
 
        /* ADC */
-       PINMUX_GPIO(GPIO_FN_ADTRG, ADTRG_MARK),
+       GPIO_FN(ADTRG),
 
        /* BSCh */
-       PINMUX_GPIO(GPIO_FN_A25, A25_MARK),
-       PINMUX_GPIO(GPIO_FN_A24, A24_MARK),
-       PINMUX_GPIO(GPIO_FN_A23, A23_MARK),
-       PINMUX_GPIO(GPIO_FN_A22, A22_MARK),
-       PINMUX_GPIO(GPIO_FN_A21, A21_MARK),
-       PINMUX_GPIO(GPIO_FN_A20, A20_MARK),
-       PINMUX_GPIO(GPIO_FN_A19, A19_MARK),
-       PINMUX_GPIO(GPIO_FN_A18, A18_MARK),
-       PINMUX_GPIO(GPIO_FN_A17, A17_MARK),
-       PINMUX_GPIO(GPIO_FN_A16, A16_MARK),
-       PINMUX_GPIO(GPIO_FN_A15, A15_MARK),
-       PINMUX_GPIO(GPIO_FN_A14, A14_MARK),
-       PINMUX_GPIO(GPIO_FN_A13, A13_MARK),
-       PINMUX_GPIO(GPIO_FN_A12, A12_MARK),
-       PINMUX_GPIO(GPIO_FN_A11, A11_MARK),
-       PINMUX_GPIO(GPIO_FN_A10, A10_MARK),
-       PINMUX_GPIO(GPIO_FN_A9, A9_MARK),
-       PINMUX_GPIO(GPIO_FN_A8, A8_MARK),
-       PINMUX_GPIO(GPIO_FN_A7, A7_MARK),
-       PINMUX_GPIO(GPIO_FN_A6, A6_MARK),
-       PINMUX_GPIO(GPIO_FN_A5, A5_MARK),
-       PINMUX_GPIO(GPIO_FN_A4, A4_MARK),
-       PINMUX_GPIO(GPIO_FN_A3, A3_MARK),
-       PINMUX_GPIO(GPIO_FN_A2, A2_MARK),
-       PINMUX_GPIO(GPIO_FN_A1, A1_MARK),
-       PINMUX_GPIO(GPIO_FN_A0, A0_MARK),
-
-       PINMUX_GPIO(GPIO_FN_D15, D15_MARK),
-       PINMUX_GPIO(GPIO_FN_D14, D14_MARK),
-       PINMUX_GPIO(GPIO_FN_D13, D13_MARK),
-       PINMUX_GPIO(GPIO_FN_D12, D12_MARK),
-       PINMUX_GPIO(GPIO_FN_D11, D11_MARK),
-       PINMUX_GPIO(GPIO_FN_D10, D10_MARK),
-       PINMUX_GPIO(GPIO_FN_D9, D9_MARK),
-       PINMUX_GPIO(GPIO_FN_D8, D8_MARK),
-       PINMUX_GPIO(GPIO_FN_D7, D7_MARK),
-       PINMUX_GPIO(GPIO_FN_D6, D6_MARK),
-       PINMUX_GPIO(GPIO_FN_D5, D5_MARK),
-       PINMUX_GPIO(GPIO_FN_D4, D4_MARK),
-       PINMUX_GPIO(GPIO_FN_D3, D3_MARK),
-       PINMUX_GPIO(GPIO_FN_D2, D2_MARK),
-       PINMUX_GPIO(GPIO_FN_D1, D1_MARK),
-       PINMUX_GPIO(GPIO_FN_D0, D0_MARK),
-
-       PINMUX_GPIO(GPIO_FN_BS, BS_MARK),
-       PINMUX_GPIO(GPIO_FN_CS4, CS4_MARK),
-       PINMUX_GPIO(GPIO_FN_CS3, CS3_MARK),
-       PINMUX_GPIO(GPIO_FN_CS2, CS2_MARK),
-       PINMUX_GPIO(GPIO_FN_CS1, CS1_MARK),
-       PINMUX_GPIO(GPIO_FN_CS0, CS0_MARK),
-       PINMUX_GPIO(GPIO_FN_CS5CE1A, CS5CE1A_MARK),
-       PINMUX_GPIO(GPIO_FN_CE2A, CE2A_MARK),
-       PINMUX_GPIO(GPIO_FN_CE2B, CE2B_MARK),
-       PINMUX_GPIO(GPIO_FN_RD, RD_MARK),
-       PINMUX_GPIO(GPIO_FN_RDWR, RDWR_MARK),
-       PINMUX_GPIO(GPIO_FN_WE3ICIOWRAHDQMUU, WE3ICIOWRAHDQMUU_MARK),
-       PINMUX_GPIO(GPIO_FN_WE2ICIORDDQMUL, WE2ICIORDDQMUL_MARK),
-       PINMUX_GPIO(GPIO_FN_WE1DQMUWE, WE1DQMUWE_MARK),
-       PINMUX_GPIO(GPIO_FN_WE0DQML, WE0DQML_MARK),
-       PINMUX_GPIO(GPIO_FN_RAS, RAS_MARK),
-       PINMUX_GPIO(GPIO_FN_CAS, CAS_MARK),
-       PINMUX_GPIO(GPIO_FN_CKE, CKE_MARK),
-       PINMUX_GPIO(GPIO_FN_WAIT, WAIT_MARK),
-       PINMUX_GPIO(GPIO_FN_BREQ, BREQ_MARK),
-       PINMUX_GPIO(GPIO_FN_BACK, BACK_MARK),
-       PINMUX_GPIO(GPIO_FN_IOIS16, IOIS16_MARK),
+       GPIO_FN(A25),
+       GPIO_FN(A24),
+       GPIO_FN(A23),
+       GPIO_FN(A22),
+       GPIO_FN(A21),
+       GPIO_FN(A20),
+       GPIO_FN(A19),
+       GPIO_FN(A18),
+       GPIO_FN(A17),
+       GPIO_FN(A16),
+       GPIO_FN(A15),
+       GPIO_FN(A14),
+       GPIO_FN(A13),
+       GPIO_FN(A12),
+       GPIO_FN(A11),
+       GPIO_FN(A10),
+       GPIO_FN(A9),
+       GPIO_FN(A8),
+       GPIO_FN(A7),
+       GPIO_FN(A6),
+       GPIO_FN(A5),
+       GPIO_FN(A4),
+       GPIO_FN(A3),
+       GPIO_FN(A2),
+       GPIO_FN(A1),
+       GPIO_FN(A0),
+
+       GPIO_FN(D15),
+       GPIO_FN(D14),
+       GPIO_FN(D13),
+       GPIO_FN(D12),
+       GPIO_FN(D11),
+       GPIO_FN(D10),
+       GPIO_FN(D9),
+       GPIO_FN(D8),
+       GPIO_FN(D7),
+       GPIO_FN(D6),
+       GPIO_FN(D5),
+       GPIO_FN(D4),
+       GPIO_FN(D3),
+       GPIO_FN(D2),
+       GPIO_FN(D1),
+       GPIO_FN(D0),
+
+       GPIO_FN(BS),
+       GPIO_FN(CS4),
+       GPIO_FN(CS3),
+       GPIO_FN(CS2),
+       GPIO_FN(CS1),
+       GPIO_FN(CS0),
+       GPIO_FN(CS5CE1A),
+       GPIO_FN(CE2A),
+       GPIO_FN(CE2B),
+       GPIO_FN(RD),
+       GPIO_FN(RDWR),
+       GPIO_FN(WE3ICIOWRAHDQMUU),
+       GPIO_FN(WE2ICIORDDQMUL),
+       GPIO_FN(WE1DQMUWE),
+       GPIO_FN(WE0DQML),
+       GPIO_FN(RAS),
+       GPIO_FN(CAS),
+       GPIO_FN(CKE),
+       GPIO_FN(WAIT),
+       GPIO_FN(BREQ),
+       GPIO_FN(BACK),
+       GPIO_FN(IOIS16),
 
        /* TMU */
-       PINMUX_GPIO(GPIO_FN_TIOC4D, TIOC4D_MARK),
-       PINMUX_GPIO(GPIO_FN_TIOC4C, TIOC4C_MARK),
-       PINMUX_GPIO(GPIO_FN_TIOC4B, TIOC4B_MARK),
-       PINMUX_GPIO(GPIO_FN_TIOC4A, TIOC4A_MARK),
-       PINMUX_GPIO(GPIO_FN_TIOC3D, TIOC3D_MARK),
-       PINMUX_GPIO(GPIO_FN_TIOC3C, TIOC3C_MARK),
-       PINMUX_GPIO(GPIO_FN_TIOC3B, TIOC3B_MARK),
-       PINMUX_GPIO(GPIO_FN_TIOC3A, TIOC3A_MARK),
-       PINMUX_GPIO(GPIO_FN_TIOC2B, TIOC2B_MARK),
-       PINMUX_GPIO(GPIO_FN_TIOC1B, TIOC1B_MARK),
-       PINMUX_GPIO(GPIO_FN_TIOC2A, TIOC2A_MARK),
-       PINMUX_GPIO(GPIO_FN_TIOC1A, TIOC1A_MARK),
-       PINMUX_GPIO(GPIO_FN_TIOC0D, TIOC0D_MARK),
-       PINMUX_GPIO(GPIO_FN_TIOC0C, TIOC0C_MARK),
-       PINMUX_GPIO(GPIO_FN_TIOC0B, TIOC0B_MARK),
-       PINMUX_GPIO(GPIO_FN_TIOC0A, TIOC0A_MARK),
-       PINMUX_GPIO(GPIO_FN_TCLKD, TCLKD_MARK),
-       PINMUX_GPIO(GPIO_FN_TCLKC, TCLKC_MARK),
-       PINMUX_GPIO(GPIO_FN_TCLKB, TCLKB_MARK),
-       PINMUX_GPIO(GPIO_FN_TCLKA, TCLKA_MARK),
+       GPIO_FN(TIOC4D),
+       GPIO_FN(TIOC4C),
+       GPIO_FN(TIOC4B),
+       GPIO_FN(TIOC4A),
+       GPIO_FN(TIOC3D),
+       GPIO_FN(TIOC3C),
+       GPIO_FN(TIOC3B),
+       GPIO_FN(TIOC3A),
+       GPIO_FN(TIOC2B),
+       GPIO_FN(TIOC1B),
+       GPIO_FN(TIOC2A),
+       GPIO_FN(TIOC1A),
+       GPIO_FN(TIOC0D),
+       GPIO_FN(TIOC0C),
+       GPIO_FN(TIOC0B),
+       GPIO_FN(TIOC0A),
+       GPIO_FN(TCLKD),
+       GPIO_FN(TCLKC),
+       GPIO_FN(TCLKB),
+       GPIO_FN(TCLKA),
 
        /* SCIF */
-       PINMUX_GPIO(GPIO_FN_SCK0, SCK0_MARK),
-       PINMUX_GPIO(GPIO_FN_TXD0, TXD0_MARK),
-       PINMUX_GPIO(GPIO_FN_RXD0, RXD0_MARK),
-       PINMUX_GPIO(GPIO_FN_SCK1, SCK1_MARK),
-       PINMUX_GPIO(GPIO_FN_TXD1, TXD1_MARK),
-       PINMUX_GPIO(GPIO_FN_RXD1, RXD1_MARK),
-       PINMUX_GPIO(GPIO_FN_RTS1, RTS1_MARK),
-       PINMUX_GPIO(GPIO_FN_CTS1, CTS1_MARK),
-       PINMUX_GPIO(GPIO_FN_SCK2, SCK2_MARK),
-       PINMUX_GPIO(GPIO_FN_TXD2, TXD2_MARK),
-       PINMUX_GPIO(GPIO_FN_RXD2, RXD2_MARK),
-       PINMUX_GPIO(GPIO_FN_SCK3, SCK3_MARK),
-       PINMUX_GPIO(GPIO_FN_TXD3, TXD3_MARK),
-       PINMUX_GPIO(GPIO_FN_RXD3, RXD3_MARK),
-       PINMUX_GPIO(GPIO_FN_SCK4, SCK4_MARK),
-       PINMUX_GPIO(GPIO_FN_TXD4, TXD4_MARK),
-       PINMUX_GPIO(GPIO_FN_RXD4, RXD4_MARK),
-       PINMUX_GPIO(GPIO_FN_SCK5, SCK5_MARK),
-       PINMUX_GPIO(GPIO_FN_TXD5, TXD5_MARK),
-       PINMUX_GPIO(GPIO_FN_RXD5, RXD5_MARK),
-       PINMUX_GPIO(GPIO_FN_RTS5, RTS5_MARK),
-       PINMUX_GPIO(GPIO_FN_CTS5, CTS5_MARK),
-       PINMUX_GPIO(GPIO_FN_SCK6, SCK6_MARK),
-       PINMUX_GPIO(GPIO_FN_TXD6, TXD6_MARK),
-       PINMUX_GPIO(GPIO_FN_RXD6, RXD6_MARK),
-       PINMUX_GPIO(GPIO_FN_SCK7, SCK7_MARK),
-       PINMUX_GPIO(GPIO_FN_TXD7, TXD7_MARK),
-       PINMUX_GPIO(GPIO_FN_RXD7, RXD7_MARK),
-       PINMUX_GPIO(GPIO_FN_RTS7, RTS7_MARK),
-       PINMUX_GPIO(GPIO_FN_CTS7, CTS7_MARK),
+       GPIO_FN(SCK0),
+       GPIO_FN(TXD0),
+       GPIO_FN(RXD0),
+       GPIO_FN(SCK1),
+       GPIO_FN(TXD1),
+       GPIO_FN(RXD1),
+       GPIO_FN(RTS1),
+       GPIO_FN(CTS1),
+       GPIO_FN(SCK2),
+       GPIO_FN(TXD2),
+       GPIO_FN(RXD2),
+       GPIO_FN(SCK3),
+       GPIO_FN(TXD3),
+       GPIO_FN(RXD3),
+       GPIO_FN(SCK4),
+       GPIO_FN(TXD4),
+       GPIO_FN(RXD4),
+       GPIO_FN(SCK5),
+       GPIO_FN(TXD5),
+       GPIO_FN(RXD5),
+       GPIO_FN(RTS5),
+       GPIO_FN(CTS5),
+       GPIO_FN(SCK6),
+       GPIO_FN(TXD6),
+       GPIO_FN(RXD6),
+       GPIO_FN(SCK7),
+       GPIO_FN(TXD7),
+       GPIO_FN(RXD7),
+       GPIO_FN(RTS7),
+       GPIO_FN(CTS7),
 
        /* RSPI */
-       PINMUX_GPIO(GPIO_FN_RSPCK0_PJ16, RSPCK0_PJ16_MARK),
-       PINMUX_GPIO(GPIO_FN_SSL00_PJ17, SSL00_PJ17_MARK),
-       PINMUX_GPIO(GPIO_FN_MOSI0_PJ18, MOSI0_PJ18_MARK),
-       PINMUX_GPIO(GPIO_FN_MISO0_PJ19, MISO0_PJ19_MARK),
-       PINMUX_GPIO(GPIO_FN_RSPCK0_PB17, RSPCK0_PB17_MARK),
-       PINMUX_GPIO(GPIO_FN_SSL00_PB18, SSL00_PB18_MARK),
-       PINMUX_GPIO(GPIO_FN_MOSI0_PB19, MOSI0_PB19_MARK),
-       PINMUX_GPIO(GPIO_FN_MISO0_PB20, MISO0_PB20_MARK),
-       PINMUX_GPIO(GPIO_FN_RSPCK1, RSPCK1_MARK),
-       PINMUX_GPIO(GPIO_FN_MOSI1, MOSI1_MARK),
-       PINMUX_GPIO(GPIO_FN_MISO1, MISO1_MARK),
-       PINMUX_GPIO(GPIO_FN_SSL10, SSL10_MARK),
+       GPIO_FN(RSPCK0_PJ16),
+       GPIO_FN(SSL00_PJ17),
+       GPIO_FN(MOSI0_PJ18),
+       GPIO_FN(MISO0_PJ19),
+       GPIO_FN(RSPCK0_PB17),
+       GPIO_FN(SSL00_PB18),
+       GPIO_FN(MOSI0_PB19),
+       GPIO_FN(MISO0_PB20),
+       GPIO_FN(RSPCK1),
+       GPIO_FN(MOSI1),
+       GPIO_FN(MISO1),
+       GPIO_FN(SSL10),
 
        /* IIC3 */
-       PINMUX_GPIO(GPIO_FN_SCL0, SCL0_MARK),
-       PINMUX_GPIO(GPIO_FN_SCL1, SCL1_MARK),
-       PINMUX_GPIO(GPIO_FN_SCL2, SCL2_MARK),
-       PINMUX_GPIO(GPIO_FN_SDA0, SDA0_MARK),
-       PINMUX_GPIO(GPIO_FN_SDA1, SDA1_MARK),
-       PINMUX_GPIO(GPIO_FN_SDA2, SDA2_MARK),
+       GPIO_FN(SCL0),
+       GPIO_FN(SCL1),
+       GPIO_FN(SCL2),
+       GPIO_FN(SDA0),
+       GPIO_FN(SDA1),
+       GPIO_FN(SDA2),
 
        /* SSI */
-       PINMUX_GPIO(GPIO_FN_SSISCK0, SSISCK0_MARK),
-       PINMUX_GPIO(GPIO_FN_SSIWS0, SSIWS0_MARK),
-       PINMUX_GPIO(GPIO_FN_SSITXD0, SSITXD0_MARK),
-       PINMUX_GPIO(GPIO_FN_SSIRXD0, SSIRXD0_MARK),
-       PINMUX_GPIO(GPIO_FN_SSIWS1, SSIWS1_MARK),
-       PINMUX_GPIO(GPIO_FN_SSIWS2, SSIWS2_MARK),
-       PINMUX_GPIO(GPIO_FN_SSIWS3, SSIWS3_MARK),
-       PINMUX_GPIO(GPIO_FN_SSISCK1, SSISCK1_MARK),
-       PINMUX_GPIO(GPIO_FN_SSISCK2, SSISCK2_MARK),
-       PINMUX_GPIO(GPIO_FN_SSISCK3, SSISCK3_MARK),
-       PINMUX_GPIO(GPIO_FN_SSIDATA1, SSIDATA1_MARK),
-       PINMUX_GPIO(GPIO_FN_SSIDATA2, SSIDATA2_MARK),
-       PINMUX_GPIO(GPIO_FN_SSIDATA3, SSIDATA3_MARK),
-       PINMUX_GPIO(GPIO_FN_AUDIO_CLK, AUDIO_CLK_MARK),
-       PINMUX_GPIO(GPIO_FN_AUDIO_XOUT, AUDIO_XOUT_MARK),
+       GPIO_FN(SSISCK0),
+       GPIO_FN(SSIWS0),
+       GPIO_FN(SSITXD0),
+       GPIO_FN(SSIRXD0),
+       GPIO_FN(SSIWS1),
+       GPIO_FN(SSIWS2),
+       GPIO_FN(SSIWS3),
+       GPIO_FN(SSISCK1),
+       GPIO_FN(SSISCK2),
+       GPIO_FN(SSISCK3),
+       GPIO_FN(SSIDATA1),
+       GPIO_FN(SSIDATA2),
+       GPIO_FN(SSIDATA3),
+       GPIO_FN(AUDIO_CLK),
+       GPIO_FN(AUDIO_XOUT),
 
        /* SIOF */ /* NOTE Shares AUDIO_CLK with SSI */
-       PINMUX_GPIO(GPIO_FN_SIOFTXD, SIOFTXD_MARK),
-       PINMUX_GPIO(GPIO_FN_SIOFRXD, SIOFRXD_MARK),
-       PINMUX_GPIO(GPIO_FN_SIOFSYNC, SIOFSYNC_MARK),
-       PINMUX_GPIO(GPIO_FN_SIOFSCK, SIOFSCK_MARK),
+       GPIO_FN(SIOFTXD),
+       GPIO_FN(SIOFRXD),
+       GPIO_FN(SIOFSYNC),
+       GPIO_FN(SIOFSCK),
 
        /* SPDIF */ /* NOTE Shares AUDIO_CLK with SSI */
-       PINMUX_GPIO(GPIO_FN_SPDIF_IN, SPDIF_IN_MARK),
-       PINMUX_GPIO(GPIO_FN_SPDIF_OUT, SPDIF_OUT_MARK),
+       GPIO_FN(SPDIF_IN),
+       GPIO_FN(SPDIF_OUT),
 
        /* NANDFMC */ /* NOTE Controller is not available in boot mode 0 */
-       PINMUX_GPIO(GPIO_FN_FCE, FCE_MARK),
-       PINMUX_GPIO(GPIO_FN_FRB, FRB_MARK),
+       GPIO_FN(FCE),
+       GPIO_FN(FRB),
 
        /* VDC3 */
-       PINMUX_GPIO(GPIO_FN_DV_CLK, DV_CLK_MARK),
-       PINMUX_GPIO(GPIO_FN_DV_VSYNC, DV_VSYNC_MARK),
-       PINMUX_GPIO(GPIO_FN_DV_HSYNC, DV_HSYNC_MARK),
-
-       PINMUX_GPIO(GPIO_FN_DV_DATA23, DV_DATA23_MARK),
-       PINMUX_GPIO(GPIO_FN_DV_DATA22, DV_DATA22_MARK),
-       PINMUX_GPIO(GPIO_FN_DV_DATA21, DV_DATA21_MARK),
-       PINMUX_GPIO(GPIO_FN_DV_DATA20, DV_DATA20_MARK),
-       PINMUX_GPIO(GPIO_FN_DV_DATA19, DV_DATA19_MARK),
-       PINMUX_GPIO(GPIO_FN_DV_DATA18, DV_DATA18_MARK),
-       PINMUX_GPIO(GPIO_FN_DV_DATA17, DV_DATA17_MARK),
-       PINMUX_GPIO(GPIO_FN_DV_DATA16, DV_DATA16_MARK),
-       PINMUX_GPIO(GPIO_FN_DV_DATA15, DV_DATA15_MARK),
-       PINMUX_GPIO(GPIO_FN_DV_DATA14, DV_DATA14_MARK),
-       PINMUX_GPIO(GPIO_FN_DV_DATA13, DV_DATA13_MARK),
-       PINMUX_GPIO(GPIO_FN_DV_DATA12, DV_DATA12_MARK),
-       PINMUX_GPIO(GPIO_FN_DV_DATA11, DV_DATA11_MARK),
-       PINMUX_GPIO(GPIO_FN_DV_DATA10, DV_DATA10_MARK),
-       PINMUX_GPIO(GPIO_FN_DV_DATA9, DV_DATA9_MARK),
-       PINMUX_GPIO(GPIO_FN_DV_DATA8, DV_DATA8_MARK),
-       PINMUX_GPIO(GPIO_FN_DV_DATA7, DV_DATA7_MARK),
-       PINMUX_GPIO(GPIO_FN_DV_DATA6, DV_DATA6_MARK),
-       PINMUX_GPIO(GPIO_FN_DV_DATA5, DV_DATA5_MARK),
-       PINMUX_GPIO(GPIO_FN_DV_DATA4, DV_DATA4_MARK),
-       PINMUX_GPIO(GPIO_FN_DV_DATA3, DV_DATA3_MARK),
-       PINMUX_GPIO(GPIO_FN_DV_DATA2, DV_DATA2_MARK),
-       PINMUX_GPIO(GPIO_FN_DV_DATA1, DV_DATA1_MARK),
-       PINMUX_GPIO(GPIO_FN_DV_DATA0, DV_DATA0_MARK),
-
-       PINMUX_GPIO(GPIO_FN_LCD_CLK, LCD_CLK_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_EXTCLK, LCD_EXTCLK_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_VSYNC, LCD_VSYNC_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_HSYNC, LCD_HSYNC_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_DE, LCD_DE_MARK),
-
-       PINMUX_GPIO(GPIO_FN_LCD_DATA23_PG23, LCD_DATA23_PG23_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_DATA22_PG22, LCD_DATA22_PG22_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_DATA21_PG21, LCD_DATA21_PG21_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_DATA20_PG20, LCD_DATA20_PG20_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_DATA19_PG19, LCD_DATA19_PG19_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_DATA18_PG18, LCD_DATA18_PG18_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_DATA17_PG17, LCD_DATA17_PG17_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_DATA16_PG16, LCD_DATA16_PG16_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_DATA15_PG15, LCD_DATA15_PG15_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_DATA14_PG14, LCD_DATA14_PG14_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_DATA13_PG13, LCD_DATA13_PG13_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_DATA12_PG12, LCD_DATA12_PG12_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_DATA11_PG11, LCD_DATA11_PG11_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_DATA10_PG10, LCD_DATA10_PG10_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_DATA9_PG9, LCD_DATA9_PG9_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_DATA8_PG8, LCD_DATA8_PG8_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_DATA7_PG7, LCD_DATA7_PG7_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_DATA6_PG6, LCD_DATA6_PG6_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_DATA5_PG5, LCD_DATA5_PG5_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_DATA4_PG4, LCD_DATA4_PG4_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_DATA3_PG3, LCD_DATA3_PG3_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_DATA2_PG2, LCD_DATA2_PG2_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_DATA1_PG1, LCD_DATA1_PG1_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_DATA0_PG0, LCD_DATA0_PG0_MARK),
-
-       PINMUX_GPIO(GPIO_FN_LCD_DATA23_PJ23, LCD_DATA23_PJ23_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_DATA22_PJ22, LCD_DATA22_PJ22_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_DATA21_PJ21, LCD_DATA21_PJ21_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_DATA20_PJ20, LCD_DATA20_PJ20_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_DATA19_PJ19, LCD_DATA19_PJ19_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_DATA18_PJ18, LCD_DATA18_PJ18_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_DATA17_PJ17, LCD_DATA17_PJ17_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_DATA16_PJ16, LCD_DATA16_PJ16_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_DATA15_PJ15, LCD_DATA15_PJ15_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_DATA14_PJ14, LCD_DATA14_PJ14_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_DATA13_PJ13, LCD_DATA13_PJ13_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_DATA12_PJ12, LCD_DATA12_PJ12_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_DATA11_PJ11, LCD_DATA11_PJ11_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_DATA10_PJ10, LCD_DATA10_PJ10_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_DATA9_PJ9, LCD_DATA9_PJ9_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_DATA8_PJ8, LCD_DATA8_PJ8_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_DATA7_PJ7, LCD_DATA7_PJ7_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_DATA6_PJ6, LCD_DATA6_PJ6_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_DATA5_PJ5, LCD_DATA5_PJ5_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_DATA4_PJ4, LCD_DATA4_PJ4_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_DATA3_PJ3, LCD_DATA3_PJ3_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_DATA2_PJ2, LCD_DATA2_PJ2_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_DATA1_PJ1, LCD_DATA1_PJ1_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_DATA0_PJ0, LCD_DATA0_PJ0_MARK),
-
-       PINMUX_GPIO(GPIO_FN_LCD_M_DISP, LCD_M_DISP_MARK),
+       GPIO_FN(DV_CLK),
+       GPIO_FN(DV_VSYNC),
+       GPIO_FN(DV_HSYNC),
+
+       GPIO_FN(DV_DATA23),
+       GPIO_FN(DV_DATA22),
+       GPIO_FN(DV_DATA21),
+       GPIO_FN(DV_DATA20),
+       GPIO_FN(DV_DATA19),
+       GPIO_FN(DV_DATA18),
+       GPIO_FN(DV_DATA17),
+       GPIO_FN(DV_DATA16),
+       GPIO_FN(DV_DATA15),
+       GPIO_FN(DV_DATA14),
+       GPIO_FN(DV_DATA13),
+       GPIO_FN(DV_DATA12),
+       GPIO_FN(DV_DATA11),
+       GPIO_FN(DV_DATA10),
+       GPIO_FN(DV_DATA9),
+       GPIO_FN(DV_DATA8),
+       GPIO_FN(DV_DATA7),
+       GPIO_FN(DV_DATA6),
+       GPIO_FN(DV_DATA5),
+       GPIO_FN(DV_DATA4),
+       GPIO_FN(DV_DATA3),
+       GPIO_FN(DV_DATA2),
+       GPIO_FN(DV_DATA1),
+       GPIO_FN(DV_DATA0),
+
+       GPIO_FN(LCD_CLK),
+       GPIO_FN(LCD_EXTCLK),
+       GPIO_FN(LCD_VSYNC),
+       GPIO_FN(LCD_HSYNC),
+       GPIO_FN(LCD_DE),
+
+       GPIO_FN(LCD_DATA23_PG23),
+       GPIO_FN(LCD_DATA22_PG22),
+       GPIO_FN(LCD_DATA21_PG21),
+       GPIO_FN(LCD_DATA20_PG20),
+       GPIO_FN(LCD_DATA19_PG19),
+       GPIO_FN(LCD_DATA18_PG18),
+       GPIO_FN(LCD_DATA17_PG17),
+       GPIO_FN(LCD_DATA16_PG16),
+       GPIO_FN(LCD_DATA15_PG15),
+       GPIO_FN(LCD_DATA14_PG14),
+       GPIO_FN(LCD_DATA13_PG13),
+       GPIO_FN(LCD_DATA12_PG12),
+       GPIO_FN(LCD_DATA11_PG11),
+       GPIO_FN(LCD_DATA10_PG10),
+       GPIO_FN(LCD_DATA9_PG9),
+       GPIO_FN(LCD_DATA8_PG8),
+       GPIO_FN(LCD_DATA7_PG7),
+       GPIO_FN(LCD_DATA6_PG6),
+       GPIO_FN(LCD_DATA5_PG5),
+       GPIO_FN(LCD_DATA4_PG4),
+       GPIO_FN(LCD_DATA3_PG3),
+       GPIO_FN(LCD_DATA2_PG2),
+       GPIO_FN(LCD_DATA1_PG1),
+       GPIO_FN(LCD_DATA0_PG0),
+
+       GPIO_FN(LCD_DATA23_PJ23),
+       GPIO_FN(LCD_DATA22_PJ22),
+       GPIO_FN(LCD_DATA21_PJ21),
+       GPIO_FN(LCD_DATA20_PJ20),
+       GPIO_FN(LCD_DATA19_PJ19),
+       GPIO_FN(LCD_DATA18_PJ18),
+       GPIO_FN(LCD_DATA17_PJ17),
+       GPIO_FN(LCD_DATA16_PJ16),
+       GPIO_FN(LCD_DATA15_PJ15),
+       GPIO_FN(LCD_DATA14_PJ14),
+       GPIO_FN(LCD_DATA13_PJ13),
+       GPIO_FN(LCD_DATA12_PJ12),
+       GPIO_FN(LCD_DATA11_PJ11),
+       GPIO_FN(LCD_DATA10_PJ10),
+       GPIO_FN(LCD_DATA9_PJ9),
+       GPIO_FN(LCD_DATA8_PJ8),
+       GPIO_FN(LCD_DATA7_PJ7),
+       GPIO_FN(LCD_DATA6_PJ6),
+       GPIO_FN(LCD_DATA5_PJ5),
+       GPIO_FN(LCD_DATA4_PJ4),
+       GPIO_FN(LCD_DATA3_PJ3),
+       GPIO_FN(LCD_DATA2_PJ2),
+       GPIO_FN(LCD_DATA1_PJ1),
+       GPIO_FN(LCD_DATA0_PJ0),
+
+       GPIO_FN(LCD_M_DISP),
 };
 
-static struct pinmux_cfg_reg pinmux_config_regs[] = {
+static const struct pinmux_cfg_reg pinmux_config_regs[] = {
        /* "name" addr register_size Field_Width */
 
        /* where Field_Width is 1 for single mode registers or 4 for upto 16
@@ -2734,7 +2738,7 @@ static struct pinmux_cfg_reg pinmux_config_regs[] = {
        {}
 };
 
-static struct pinmux_data_reg pinmux_data_regs[] = {
+static const struct pinmux_data_reg pinmux_data_regs[] = {
        { PINMUX_DATA_REG("PADR0", 0xfffe3816, 16) {
                0, 0, 0, 0, 0, 0, 0, PA1_DATA,
                0, 0, 0, 0, 0, 0, 0, PA0_DATA }
@@ -2813,19 +2817,17 @@ static struct pinmux_data_reg pinmux_data_regs[] = {
        { }
 };
 
-struct sh_pfc_soc_info sh7269_pinmux_info = {
+const struct sh_pfc_soc_info sh7269_pinmux_info = {
        .name = "sh7269_pfc",
-       .reserved_id = PINMUX_RESERVED,
-       .data = { PINMUX_DATA_BEGIN, PINMUX_DATA_END },
        .input = { PINMUX_INPUT_BEGIN, PINMUX_INPUT_END, FORCE_IN },
        .output = { PINMUX_OUTPUT_BEGIN, PINMUX_OUTPUT_END, FORCE_OUT },
-       .mark = { PINMUX_MARK_BEGIN, PINMUX_MARK_END },
        .function = { PINMUX_FUNCTION_BEGIN, PINMUX_FUNCTION_END },
 
-       .first_gpio = GPIO_PA1,
-       .last_gpio = GPIO_FN_LCD_M_DISP,
+       .pins = pinmux_pins,
+       .nr_pins = ARRAY_SIZE(pinmux_pins),
+       .func_gpios = pinmux_func_gpios,
+       .nr_func_gpios = ARRAY_SIZE(pinmux_func_gpios),
 
-       .gpios = pinmux_gpios,
        .cfg_regs = pinmux_config_regs,
        .data_regs = pinmux_data_regs,
 
index d44e7f02069b2779e082c52d55a7db6661e1cad6..df0ae21a5ac8f98d428797bff49acabfd4aed3ff 100644 (file)
@@ -368,7 +368,7 @@ enum {
        PINMUX_MARK_END,
 };
 
-static pinmux_enum_t pinmux_data[] = {
+static const pinmux_enum_t pinmux_data[] = {
 
        /* specify valid pin states for each pin in GPIO mode */
        PORT_DATA_IO_PD(0),             PORT_DATA_IO_PD(1),
@@ -929,11 +929,214 @@ static pinmux_enum_t pinmux_data[] = {
        PINMUX_DATA(MFIv4_MARK,         MSEL4CR_6_1),
 };
 
-static struct pinmux_gpio pinmux_gpios[] = {
-
-       /* PORT */
+static struct sh_pfc_pin pinmux_pins[] = {
        GPIO_PORT_ALL(),
+};
 
+/* - MMCIF ------------------------------------------------------------------ */
+static const unsigned int mmc0_data1_0_pins[] = {
+       /* D[0] */
+       84,
+};
+static const unsigned int mmc0_data1_0_mux[] = {
+       MMCD0_0_MARK,
+};
+static const unsigned int mmc0_data4_0_pins[] = {
+       /* D[0:3] */
+       84, 85, 86, 87,
+};
+static const unsigned int mmc0_data4_0_mux[] = {
+       MMCD0_0_MARK, MMCD0_1_MARK, MMCD0_2_MARK, MMCD0_3_MARK,
+};
+static const unsigned int mmc0_data8_0_pins[] = {
+       /* D[0:7] */
+       84, 85, 86, 87, 88, 89, 90, 91,
+};
+static const unsigned int mmc0_data8_0_mux[] = {
+       MMCD0_0_MARK, MMCD0_1_MARK, MMCD0_2_MARK, MMCD0_3_MARK,
+       MMCD0_4_MARK, MMCD0_5_MARK, MMCD0_6_MARK, MMCD0_7_MARK,
+};
+static const unsigned int mmc0_ctrl_0_pins[] = {
+       /* CMD, CLK */
+       92, 99,
+};
+static const unsigned int mmc0_ctrl_0_mux[] = {
+       MMCCMD0_MARK, MMCCLK0_MARK,
+};
+
+static const unsigned int mmc0_data1_1_pins[] = {
+       /* D[0] */
+       54,
+};
+static const unsigned int mmc0_data1_1_mux[] = {
+       MMCD1_0_MARK,
+};
+static const unsigned int mmc0_data4_1_pins[] = {
+       /* D[0:3] */
+       54, 55, 56, 57,
+};
+static const unsigned int mmc0_data4_1_mux[] = {
+       MMCD1_0_MARK, MMCD1_1_MARK, MMCD1_2_MARK, MMCD1_3_MARK,
+};
+static const unsigned int mmc0_data8_1_pins[] = {
+       /* D[0:7] */
+       54, 55, 56, 57, 58, 59, 60, 61,
+};
+static const unsigned int mmc0_data8_1_mux[] = {
+       MMCD1_0_MARK, MMCD1_1_MARK, MMCD1_2_MARK, MMCD1_3_MARK,
+       MMCD1_4_MARK, MMCD1_5_MARK, MMCD1_6_MARK, MMCD1_7_MARK,
+};
+static const unsigned int mmc0_ctrl_1_pins[] = {
+       /* CMD, CLK */
+       67, 66,
+};
+static const unsigned int mmc0_ctrl_1_mux[] = {
+       MMCCMD1_MARK, MMCCLK1_MARK,
+};
+/* - SDHI0 ------------------------------------------------------------------ */
+static const unsigned int sdhi0_data1_pins[] = {
+       /* D0 */
+       173,
+};
+static const unsigned int sdhi0_data1_mux[] = {
+       SDHID0_0_MARK,
+};
+static const unsigned int sdhi0_data4_pins[] = {
+       /* D[0:3] */
+       173, 174, 175, 176,
+};
+static const unsigned int sdhi0_data4_mux[] = {
+       SDHID0_0_MARK, SDHID0_1_MARK, SDHID0_2_MARK, SDHID0_3_MARK,
+};
+static const unsigned int sdhi0_ctrl_pins[] = {
+       /* CMD, CLK */
+       177, 171,
+};
+static const unsigned int sdhi0_ctrl_mux[] = {
+       SDHICMD0_MARK, SDHICLK0_MARK,
+};
+static const unsigned int sdhi0_cd_pins[] = {
+       /* CD */
+       172,
+};
+static const unsigned int sdhi0_cd_mux[] = {
+       SDHICD0_MARK,
+};
+static const unsigned int sdhi0_wp_pins[] = {
+       /* WP */
+       178,
+};
+static const unsigned int sdhi0_wp_mux[] = {
+       SDHIWP0_MARK,
+};
+/* - SDHI1 ------------------------------------------------------------------ */
+static const unsigned int sdhi1_data1_pins[] = {
+       /* D0 */
+       180,
+};
+static const unsigned int sdhi1_data1_mux[] = {
+       SDHID1_0_MARK,
+};
+static const unsigned int sdhi1_data4_pins[] = {
+       /* D[0:3] */
+       180, 181, 182, 183,
+};
+static const unsigned int sdhi1_data4_mux[] = {
+       SDHID1_0_MARK, SDHID1_1_MARK, SDHID1_2_MARK, SDHID1_3_MARK,
+};
+static const unsigned int sdhi1_ctrl_pins[] = {
+       /* CMD, CLK */
+       184, 179,
+};
+static const unsigned int sdhi1_ctrl_mux[] = {
+       SDHICMD1_MARK, SDHICLK1_MARK,
+};
+
+static const unsigned int sdhi2_data1_pins[] = {
+       /* D0 */
+       186,
+};
+static const unsigned int sdhi2_data1_mux[] = {
+       SDHID2_0_MARK,
+};
+static const unsigned int sdhi2_data4_pins[] = {
+       /* D[0:3] */
+       186, 187, 188, 189,
+};
+static const unsigned int sdhi2_data4_mux[] = {
+       SDHID2_0_MARK, SDHID2_1_MARK, SDHID2_2_MARK, SDHID2_3_MARK,
+};
+static const unsigned int sdhi2_ctrl_pins[] = {
+       /* CMD, CLK */
+       190, 185,
+};
+static const unsigned int sdhi2_ctrl_mux[] = {
+       SDHICMD2_MARK, SDHICLK2_MARK,
+};
+
+static const struct sh_pfc_pin_group pinmux_groups[] = {
+       SH_PFC_PIN_GROUP(mmc0_data1_0),
+       SH_PFC_PIN_GROUP(mmc0_data4_0),
+       SH_PFC_PIN_GROUP(mmc0_data8_0),
+       SH_PFC_PIN_GROUP(mmc0_ctrl_0),
+       SH_PFC_PIN_GROUP(mmc0_data1_1),
+       SH_PFC_PIN_GROUP(mmc0_data4_1),
+       SH_PFC_PIN_GROUP(mmc0_data8_1),
+       SH_PFC_PIN_GROUP(mmc0_ctrl_1),
+       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(sdhi2_data1),
+       SH_PFC_PIN_GROUP(sdhi2_data4),
+       SH_PFC_PIN_GROUP(sdhi2_ctrl),
+};
+
+static const char * const mmc0_groups[] = {
+       "mmc0_data1_0",
+       "mmc0_data4_0",
+       "mmc0_data8_0",
+       "mmc0_ctrl_0",
+       "mmc0_data1_1",
+       "mmc0_data4_1",
+       "mmc0_data8_1",
+       "mmc0_ctrl_1",
+};
+
+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",
+};
+
+static const char * const sdhi2_groups[] = {
+       "sdhi2_data1",
+       "sdhi2_data4",
+       "sdhi2_ctrl",
+};
+
+static const struct sh_pfc_function pinmux_functions[] = {
+       SH_PFC_FUNCTION(mmc0),
+       SH_PFC_FUNCTION(sdhi0),
+       SH_PFC_FUNCTION(sdhi1),
+       SH_PFC_FUNCTION(sdhi2),
+};
+
+#define PINMUX_FN_BASE ARRAY_SIZE(pinmux_pins)
+
+static const struct pinmux_func pinmux_func_gpios[] = {
        /* IRQ */
        GPIO_FN(IRQ0_6),        GPIO_FN(IRQ0_162),      GPIO_FN(IRQ1),
        GPIO_FN(IRQ2_4),        GPIO_FN(IRQ2_5),        GPIO_FN(IRQ3_8),
@@ -1074,18 +1277,6 @@ static struct pinmux_gpio pinmux_gpios[] = {
        GPIO_FN(D11_NAF11),     GPIO_FN(D12_NAF12),     GPIO_FN(D13_NAF13),
        GPIO_FN(D14_NAF14),     GPIO_FN(D15_NAF15),
 
-       /* MMCIF(1) */
-       GPIO_FN(MMCD0_0),       GPIO_FN(MMCD0_1),       GPIO_FN(MMCD0_2),
-       GPIO_FN(MMCD0_3),       GPIO_FN(MMCD0_4),       GPIO_FN(MMCD0_5),
-       GPIO_FN(MMCD0_6),       GPIO_FN(MMCD0_7),       GPIO_FN(MMCCMD0),
-       GPIO_FN(MMCCLK0),
-
-       /* MMCIF(2) */
-       GPIO_FN(MMCD1_0),       GPIO_FN(MMCD1_1),       GPIO_FN(MMCD1_2),
-       GPIO_FN(MMCD1_3),       GPIO_FN(MMCD1_4),       GPIO_FN(MMCD1_5),
-       GPIO_FN(MMCD1_6),       GPIO_FN(MMCD1_7),       GPIO_FN(MMCCLK1),
-       GPIO_FN(MMCCMD1),
-
        /* SPU2 */
        GPIO_FN(VINT_I),
 
@@ -1182,25 +1373,12 @@ static struct pinmux_gpio pinmux_gpios[] = {
        /* HDMI */
        GPIO_FN(HDMI_HPD),      GPIO_FN(HDMI_CEC),
 
-       /* SDHI0 */
-       GPIO_FN(SDHICLK0),      GPIO_FN(SDHICD0),       GPIO_FN(SDHICMD0),
-       GPIO_FN(SDHIWP0),       GPIO_FN(SDHID0_0),      GPIO_FN(SDHID0_1),
-       GPIO_FN(SDHID0_2),      GPIO_FN(SDHID0_3),
-
-       /* SDHI1 */
-       GPIO_FN(SDHICLK1),      GPIO_FN(SDHICMD1),      GPIO_FN(SDHID1_0),
-       GPIO_FN(SDHID1_1),      GPIO_FN(SDHID1_2),      GPIO_FN(SDHID1_3),
-
-       /* SDHI2 */
-       GPIO_FN(SDHICLK2),      GPIO_FN(SDHICMD2),      GPIO_FN(SDHID2_0),
-       GPIO_FN(SDHID2_1),      GPIO_FN(SDHID2_2),      GPIO_FN(SDHID2_3),
-
        /* SDENC */
        GPIO_FN(SDENC_CPG),
        GPIO_FN(SDENC_DV_CLKI),
 };
 
-static struct pinmux_cfg_reg pinmux_config_regs[] = {
+static const struct pinmux_cfg_reg pinmux_config_regs[] = {
        PORTCR(0,       0xE6051000), /* PORT0CR */
        PORTCR(1,       0xE6051001), /* PORT1CR */
        PORTCR(2,       0xE6051002), /* PORT2CR */
@@ -1472,7 +1650,7 @@ static struct pinmux_cfg_reg pinmux_config_regs[] = {
        { },
 };
 
-static struct pinmux_data_reg pinmux_data_regs[] = {
+static const struct pinmux_data_reg pinmux_data_regs[] = {
        { PINMUX_DATA_REG("PORTL095_064DR", 0xE6054008, 32) {
                        PORT95_DATA, PORT94_DATA, PORT93_DATA, PORT92_DATA,
                        PORT91_DATA, PORT90_DATA, PORT89_DATA, PORT88_DATA,
@@ -1597,56 +1775,59 @@ static struct pinmux_data_reg pinmux_data_regs[] = {
 
 #define EXT_IRQ16L(n) evt2irq(0x200 + ((n) << 5))
 #define EXT_IRQ16H(n) evt2irq(0x3200 + (((n) - 16) << 5))
-static struct pinmux_irq pinmux_irqs[] = {
-       PINMUX_IRQ(EXT_IRQ16L(0), PORT6_FN0, PORT162_FN0),
-       PINMUX_IRQ(EXT_IRQ16L(1), PORT12_FN0),
-       PINMUX_IRQ(EXT_IRQ16L(2), PORT4_FN0, PORT5_FN0),
-       PINMUX_IRQ(EXT_IRQ16L(3), PORT8_FN0, PORT16_FN0),
-       PINMUX_IRQ(EXT_IRQ16L(4), PORT17_FN0, PORT163_FN0),
-       PINMUX_IRQ(EXT_IRQ16L(5), PORT18_FN0),
-       PINMUX_IRQ(EXT_IRQ16L(6), PORT39_FN0, PORT164_FN0),
-       PINMUX_IRQ(EXT_IRQ16L(7), PORT40_FN0, PORT167_FN0),
-       PINMUX_IRQ(EXT_IRQ16L(8), PORT41_FN0, PORT168_FN0),
-       PINMUX_IRQ(EXT_IRQ16L(9), PORT42_FN0, PORT169_FN0),
-       PINMUX_IRQ(EXT_IRQ16L(10), PORT65_FN0),
-       PINMUX_IRQ(EXT_IRQ16L(11), PORT67_FN0),
-       PINMUX_IRQ(EXT_IRQ16L(12), PORT80_FN0, PORT137_FN0),
-       PINMUX_IRQ(EXT_IRQ16L(13), PORT81_FN0, PORT145_FN0),
-       PINMUX_IRQ(EXT_IRQ16L(14), PORT82_FN0, PORT146_FN0),
-       PINMUX_IRQ(EXT_IRQ16L(15), PORT83_FN0, PORT147_FN0),
-       PINMUX_IRQ(EXT_IRQ16H(16), PORT84_FN0, PORT170_FN0),
-       PINMUX_IRQ(EXT_IRQ16H(17), PORT85_FN0),
-       PINMUX_IRQ(EXT_IRQ16H(18), PORT86_FN0),
-       PINMUX_IRQ(EXT_IRQ16H(19), PORT87_FN0),
-       PINMUX_IRQ(EXT_IRQ16H(20), PORT92_FN0),
-       PINMUX_IRQ(EXT_IRQ16H(21), PORT93_FN0),
-       PINMUX_IRQ(EXT_IRQ16H(22), PORT94_FN0),
-       PINMUX_IRQ(EXT_IRQ16H(23), PORT95_FN0),
-       PINMUX_IRQ(EXT_IRQ16H(24), PORT112_FN0),
-       PINMUX_IRQ(EXT_IRQ16H(25), PORT119_FN0),
-       PINMUX_IRQ(EXT_IRQ16H(26), PORT121_FN0, PORT172_FN0),
-       PINMUX_IRQ(EXT_IRQ16H(27), PORT122_FN0, PORT180_FN0),
-       PINMUX_IRQ(EXT_IRQ16H(28), PORT123_FN0, PORT181_FN0),
-       PINMUX_IRQ(EXT_IRQ16H(29), PORT129_FN0, PORT182_FN0),
-       PINMUX_IRQ(EXT_IRQ16H(30), PORT130_FN0, PORT183_FN0),
-       PINMUX_IRQ(EXT_IRQ16H(31), PORT138_FN0, PORT184_FN0),
+static const struct pinmux_irq pinmux_irqs[] = {
+       PINMUX_IRQ(EXT_IRQ16L(0), GPIO_PORT6, GPIO_PORT162),
+       PINMUX_IRQ(EXT_IRQ16L(1), GPIO_PORT12),
+       PINMUX_IRQ(EXT_IRQ16L(2), GPIO_PORT4, GPIO_PORT5),
+       PINMUX_IRQ(EXT_IRQ16L(3), GPIO_PORT8, GPIO_PORT16),
+       PINMUX_IRQ(EXT_IRQ16L(4), GPIO_PORT17, GPIO_PORT163),
+       PINMUX_IRQ(EXT_IRQ16L(5), GPIO_PORT18),
+       PINMUX_IRQ(EXT_IRQ16L(6), GPIO_PORT39, GPIO_PORT164),
+       PINMUX_IRQ(EXT_IRQ16L(7), GPIO_PORT40, GPIO_PORT167),
+       PINMUX_IRQ(EXT_IRQ16L(8), GPIO_PORT41, GPIO_PORT168),
+       PINMUX_IRQ(EXT_IRQ16L(9), GPIO_PORT42, GPIO_PORT169),
+       PINMUX_IRQ(EXT_IRQ16L(10), GPIO_PORT65),
+       PINMUX_IRQ(EXT_IRQ16L(11), GPIO_PORT67),
+       PINMUX_IRQ(EXT_IRQ16L(12), GPIO_PORT80, GPIO_PORT137),
+       PINMUX_IRQ(EXT_IRQ16L(13), GPIO_PORT81, GPIO_PORT145),
+       PINMUX_IRQ(EXT_IRQ16L(14), GPIO_PORT82, GPIO_PORT146),
+       PINMUX_IRQ(EXT_IRQ16L(15), GPIO_PORT83, GPIO_PORT147),
+       PINMUX_IRQ(EXT_IRQ16H(16), GPIO_PORT84, GPIO_PORT170),
+       PINMUX_IRQ(EXT_IRQ16H(17), GPIO_PORT85),
+       PINMUX_IRQ(EXT_IRQ16H(18), GPIO_PORT86),
+       PINMUX_IRQ(EXT_IRQ16H(19), GPIO_PORT87),
+       PINMUX_IRQ(EXT_IRQ16H(20), GPIO_PORT92),
+       PINMUX_IRQ(EXT_IRQ16H(21), GPIO_PORT93),
+       PINMUX_IRQ(EXT_IRQ16H(22), GPIO_PORT94),
+       PINMUX_IRQ(EXT_IRQ16H(23), GPIO_PORT95),
+       PINMUX_IRQ(EXT_IRQ16H(24), GPIO_PORT112),
+       PINMUX_IRQ(EXT_IRQ16H(25), GPIO_PORT119),
+       PINMUX_IRQ(EXT_IRQ16H(26), GPIO_PORT121, GPIO_PORT172),
+       PINMUX_IRQ(EXT_IRQ16H(27), GPIO_PORT122, GPIO_PORT180),
+       PINMUX_IRQ(EXT_IRQ16H(28), GPIO_PORT123, GPIO_PORT181),
+       PINMUX_IRQ(EXT_IRQ16H(29), GPIO_PORT129, GPIO_PORT182),
+       PINMUX_IRQ(EXT_IRQ16H(30), GPIO_PORT130, GPIO_PORT183),
+       PINMUX_IRQ(EXT_IRQ16H(31), GPIO_PORT138, GPIO_PORT184),
 };
 
-struct sh_pfc_soc_info sh7372_pinmux_info = {
+const struct sh_pfc_soc_info sh7372_pinmux_info = {
        .name = "sh7372_pfc",
-       .reserved_id = PINMUX_RESERVED,
-       .data = { PINMUX_DATA_BEGIN, PINMUX_DATA_END },
        .input = { PINMUX_INPUT_BEGIN, PINMUX_INPUT_END },
        .input_pu = { PINMUX_INPUT_PULLUP_BEGIN, PINMUX_INPUT_PULLUP_END },
        .input_pd = { PINMUX_INPUT_PULLDOWN_BEGIN, PINMUX_INPUT_PULLDOWN_END },
        .output = { PINMUX_OUTPUT_BEGIN, PINMUX_OUTPUT_END },
-       .mark = { PINMUX_MARK_BEGIN, PINMUX_MARK_END },
        .function = { PINMUX_FUNCTION_BEGIN, PINMUX_FUNCTION_END },
 
-       .first_gpio = GPIO_PORT0,
-       .last_gpio = GPIO_FN_SDENC_DV_CLKI,
+       .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),
+
+       .func_gpios = pinmux_func_gpios,
+       .nr_func_gpios = ARRAY_SIZE(pinmux_func_gpios),
 
-       .gpios = pinmux_gpios,
        .cfg_regs = pinmux_config_regs,
        .data_regs = pinmux_data_regs,
 
index 709008e941244dc022cb5804157cede7ac9ef0b7..587f7772abf2aa46b8608115829aad85d9cb500a 100644 (file)
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  */
+#include <linux/io.h>
 #include <linux/kernel.h>
+#include <linux/pinctrl/pinconf-generic.h>
+
 #include <mach/sh73a0.h>
 #include <mach/irqs.h>
 
+#include "core.h"
 #include "sh_pfc.h"
 
 #define CPU_ALL_PORT(fn, pfx, sfx)                             \
-       PORT_10(fn, pfx,    sfx), PORT_10(fn, pfx##1, sfx),     \
-       PORT_10(fn, pfx##2, sfx), PORT_10(fn, pfx##3, sfx),     \
-       PORT_10(fn, pfx##4, sfx), PORT_10(fn, pfx##5, sfx),     \
-       PORT_10(fn, pfx##6, sfx), PORT_10(fn, pfx##7, sfx),     \
-       PORT_10(fn, pfx##8, sfx), PORT_10(fn, pfx##9, sfx),     \
+       PORT_10(fn, pfx,    sfx), PORT_90(fn, pfx, sfx),        \
        PORT_10(fn, pfx##10, sfx),                              \
        PORT_1(fn, pfx##110, sfx), PORT_1(fn, pfx##111, sfx),   \
        PORT_1(fn, pfx##112, sfx), PORT_1(fn, pfx##113, sfx),   \
@@ -66,14 +66,6 @@ enum {
        PORT_ALL(IN),                   /* PORT0_IN -> PORT309_IN */
        PINMUX_INPUT_END,
 
-       PINMUX_INPUT_PULLUP_BEGIN,
-       PORT_ALL(IN_PU),                /* PORT0_IN_PU -> PORT309_IN_PU */
-       PINMUX_INPUT_PULLUP_END,
-
-       PINMUX_INPUT_PULLDOWN_BEGIN,
-       PORT_ALL(IN_PD),                /* PORT0_IN_PD -> PORT309_IN_PD */
-       PINMUX_INPUT_PULLDOWN_END,
-
        PINMUX_OUTPUT_BEGIN,
        PORT_ALL(OUT),                  /* PORT0_OUT -> PORT309_OUT */
        PINMUX_OUTPUT_END,
@@ -468,328 +460,15 @@ enum {
        EDBGREQ_PD_MARK,
        EDBGREQ_PU_MARK,
 
-       /* Functions with pull-ups */
-       KEYIN0_PU_MARK,
-       KEYIN1_PU_MARK,
-       KEYIN2_PU_MARK,
-       KEYIN3_PU_MARK,
-       KEYIN4_PU_MARK,
-       KEYIN5_PU_MARK,
-       KEYIN6_PU_MARK,
-       KEYIN7_PU_MARK,
-       SDHICD0_PU_MARK,
-       SDHID0_0_PU_MARK,
-       SDHID0_1_PU_MARK,
-       SDHID0_2_PU_MARK,
-       SDHID0_3_PU_MARK,
-       SDHICMD0_PU_MARK,
-       SDHIWP0_PU_MARK,
-       SDHID1_0_PU_MARK,
-       SDHID1_1_PU_MARK,
-       SDHID1_2_PU_MARK,
-       SDHID1_3_PU_MARK,
-       SDHICMD1_PU_MARK,
-       SDHID2_0_PU_MARK,
-       SDHID2_1_PU_MARK,
-       SDHID2_2_PU_MARK,
-       SDHID2_3_PU_MARK,
-       SDHICMD2_PU_MARK,
-       MMCCMD0_PU_MARK,
-       MMCCMD1_PU_MARK,
-       MMCD0_0_PU_MARK,
-       MMCD0_1_PU_MARK,
-       MMCD0_2_PU_MARK,
-       MMCD0_3_PU_MARK,
-       MMCD0_4_PU_MARK,
-       MMCD0_5_PU_MARK,
-       MMCD0_6_PU_MARK,
-       MMCD0_7_PU_MARK,
-       FSIBISLD_PU_MARK,
-       FSIACK_PU_MARK,
-       FSIAILR_PU_MARK,
-       FSIAIBT_PU_MARK,
-       FSIAISLD_PU_MARK,
-
        PINMUX_MARK_END,
 };
 
-static pinmux_enum_t pinmux_data[] = {
-       /* specify valid pin states for each pin in GPIO mode */
+#define _PORT_DATA(pfx, sfx)   PORT_DATA_IO(pfx)
+#define PINMUX_DATA_GP_ALL()    CPU_ALL_PORT(_PORT_DATA, , unused)
 
-       /* Table 25-1 (I/O and Pull U/D) */
-       PORT_DATA_I_PD(0),
-       PORT_DATA_I_PU(1),
-       PORT_DATA_I_PU(2),
-       PORT_DATA_I_PU(3),
-       PORT_DATA_I_PU(4),
-       PORT_DATA_I_PU(5),
-       PORT_DATA_I_PU(6),
-       PORT_DATA_I_PU(7),
-       PORT_DATA_I_PU(8),
-       PORT_DATA_I_PD(9),
-       PORT_DATA_I_PD(10),
-       PORT_DATA_I_PU_PD(11),
-       PORT_DATA_IO_PU_PD(12),
-       PORT_DATA_IO_PU_PD(13),
-       PORT_DATA_IO_PU_PD(14),
-       PORT_DATA_IO_PU_PD(15),
-       PORT_DATA_IO_PD(16),
-       PORT_DATA_IO_PD(17),
-       PORT_DATA_IO_PU(18),
-       PORT_DATA_IO_PU(19),
-       PORT_DATA_O(20),
-       PORT_DATA_O(21),
-       PORT_DATA_O(22),
-       PORT_DATA_O(23),
-       PORT_DATA_O(24),
-       PORT_DATA_I_PD(25),
-       PORT_DATA_I_PD(26),
-       PORT_DATA_IO_PU(27),
-       PORT_DATA_IO_PU(28),
-       PORT_DATA_IO_PD(29),
-       PORT_DATA_IO_PD(30),
-       PORT_DATA_IO_PU(31),
-       PORT_DATA_IO_PD(32),
-       PORT_DATA_I_PU_PD(33),
-       PORT_DATA_IO_PD(34),
-       PORT_DATA_I_PU_PD(35),
-       PORT_DATA_IO_PD(36),
-       PORT_DATA_IO(37),
-       PORT_DATA_O(38),
-       PORT_DATA_I_PU(39),
-       PORT_DATA_I_PU_PD(40),
-       PORT_DATA_O(41),
-       PORT_DATA_IO_PD(42),
-       PORT_DATA_IO_PU_PD(43),
-       PORT_DATA_IO_PU_PD(44),
-       PORT_DATA_IO_PD(45),
-       PORT_DATA_IO_PD(46),
-       PORT_DATA_IO_PD(47),
-       PORT_DATA_I_PD(48),
-       PORT_DATA_IO_PU_PD(49),
-       PORT_DATA_IO_PD(50),
-
-       PORT_DATA_IO_PD(51),
-       PORT_DATA_O(52),
-       PORT_DATA_IO_PU_PD(53),
-       PORT_DATA_IO_PU_PD(54),
-       PORT_DATA_IO_PD(55),
-       PORT_DATA_I_PU_PD(56),
-       PORT_DATA_IO(57),
-       PORT_DATA_IO(58),
-       PORT_DATA_IO(59),
-       PORT_DATA_IO(60),
-       PORT_DATA_IO(61),
-       PORT_DATA_IO_PD(62),
-       PORT_DATA_IO_PD(63),
-       PORT_DATA_IO_PU_PD(64),
-       PORT_DATA_IO_PD(65),
-       PORT_DATA_IO_PU_PD(66),
-       PORT_DATA_IO_PU_PD(67),
-       PORT_DATA_IO_PU_PD(68),
-       PORT_DATA_IO_PU_PD(69),
-       PORT_DATA_IO_PU_PD(70),
-       PORT_DATA_IO_PU_PD(71),
-       PORT_DATA_IO_PU_PD(72),
-       PORT_DATA_I_PU_PD(73),
-       PORT_DATA_IO_PU(74),
-       PORT_DATA_IO_PU(75),
-       PORT_DATA_IO_PU(76),
-       PORT_DATA_IO_PU(77),
-       PORT_DATA_IO_PU(78),
-       PORT_DATA_IO_PU(79),
-       PORT_DATA_IO_PU(80),
-       PORT_DATA_IO_PU(81),
-       PORT_DATA_IO_PU(82),
-       PORT_DATA_IO_PU(83),
-       PORT_DATA_IO_PU(84),
-       PORT_DATA_IO_PU(85),
-       PORT_DATA_IO_PU(86),
-       PORT_DATA_IO_PU(87),
-       PORT_DATA_IO_PU(88),
-       PORT_DATA_IO_PU(89),
-       PORT_DATA_O(90),
-       PORT_DATA_IO_PU(91),
-       PORT_DATA_O(92),
-       PORT_DATA_IO_PU(93),
-       PORT_DATA_O(94),
-       PORT_DATA_I_PU_PD(95),
-       PORT_DATA_IO(96),
-       PORT_DATA_IO(97),
-       PORT_DATA_IO(98),
-       PORT_DATA_I_PU(99),
-       PORT_DATA_O(100),
-       PORT_DATA_O(101),
-       PORT_DATA_I_PU(102),
-       PORT_DATA_IO_PD(103),
-       PORT_DATA_I_PU_PD(104),
-       PORT_DATA_I_PD(105),
-       PORT_DATA_I_PD(106),
-       PORT_DATA_I_PU_PD(107),
-       PORT_DATA_I_PU_PD(108),
-       PORT_DATA_IO_PD(109),
-       PORT_DATA_IO_PD(110),
-       PORT_DATA_IO_PU_PD(111),
-       PORT_DATA_IO_PU_PD(112),
-       PORT_DATA_IO_PU_PD(113),
-       PORT_DATA_IO_PD(114),
-       PORT_DATA_IO_PU(115),
-       PORT_DATA_IO_PU(116),
-       PORT_DATA_IO_PU_PD(117),
-       PORT_DATA_IO_PU_PD(118),
-       PORT_DATA_IO_PD(128),
-
-       PORT_DATA_IO_PD(129),
-       PORT_DATA_IO_PU_PD(130),
-       PORT_DATA_IO_PD(131),
-       PORT_DATA_IO_PD(132),
-       PORT_DATA_IO_PD(133),
-       PORT_DATA_IO_PU_PD(134),
-       PORT_DATA_IO_PU_PD(135),
-       PORT_DATA_IO_PU_PD(136),
-       PORT_DATA_IO_PU_PD(137),
-       PORT_DATA_IO_PD(138),
-       PORT_DATA_IO_PD(139),
-       PORT_DATA_IO_PD(140),
-       PORT_DATA_IO_PD(141),
-       PORT_DATA_IO_PD(142),
-       PORT_DATA_IO_PD(143),
-       PORT_DATA_IO_PU_PD(144),
-       PORT_DATA_IO_PD(145),
-       PORT_DATA_IO_PU_PD(146),
-       PORT_DATA_IO_PU_PD(147),
-       PORT_DATA_IO_PU_PD(148),
-       PORT_DATA_IO_PU_PD(149),
-       PORT_DATA_I_PU_PD(150),
-       PORT_DATA_IO_PU_PD(151),
-       PORT_DATA_IO_PU_PD(152),
-       PORT_DATA_IO_PD(153),
-       PORT_DATA_IO_PD(154),
-       PORT_DATA_I_PU_PD(155),
-       PORT_DATA_IO_PU_PD(156),
-       PORT_DATA_I_PD(157),
-       PORT_DATA_IO_PD(158),
-       PORT_DATA_IO_PU_PD(159),
-       PORT_DATA_IO_PU_PD(160),
-       PORT_DATA_I_PU_PD(161),
-       PORT_DATA_I_PU_PD(162),
-       PORT_DATA_IO_PU_PD(163),
-       PORT_DATA_I_PU_PD(164),
-       PORT_DATA_IO_PD(192),
-       PORT_DATA_IO_PU_PD(193),
-       PORT_DATA_IO_PD(194),
-       PORT_DATA_IO_PU_PD(195),
-       PORT_DATA_IO_PD(196),
-       PORT_DATA_IO_PD(197),
-       PORT_DATA_IO_PD(198),
-       PORT_DATA_IO_PD(199),
-       PORT_DATA_IO_PU_PD(200),
-       PORT_DATA_IO_PU_PD(201),
-       PORT_DATA_IO_PU_PD(202),
-       PORT_DATA_IO_PU_PD(203),
-       PORT_DATA_IO_PU_PD(204),
-       PORT_DATA_IO_PU_PD(205),
-       PORT_DATA_IO_PU_PD(206),
-       PORT_DATA_IO_PD(207),
-       PORT_DATA_IO_PD(208),
-       PORT_DATA_IO_PD(209),
-       PORT_DATA_IO_PD(210),
-       PORT_DATA_IO_PD(211),
-       PORT_DATA_IO_PD(212),
-       PORT_DATA_IO_PD(213),
-       PORT_DATA_IO_PU_PD(214),
-       PORT_DATA_IO_PU_PD(215),
-       PORT_DATA_IO_PD(216),
-       PORT_DATA_IO_PD(217),
-       PORT_DATA_O(218),
-       PORT_DATA_IO_PD(219),
-       PORT_DATA_IO_PD(220),
-       PORT_DATA_IO_PU_PD(221),
-       PORT_DATA_IO_PU_PD(222),
-       PORT_DATA_I_PU_PD(223),
-       PORT_DATA_I_PU_PD(224),
-
-       PORT_DATA_IO_PU_PD(225),
-       PORT_DATA_O(226),
-       PORT_DATA_IO_PU_PD(227),
-       PORT_DATA_I_PU_PD(228),
-       PORT_DATA_I_PD(229),
-       PORT_DATA_IO(230),
-       PORT_DATA_IO_PU_PD(231),
-       PORT_DATA_IO_PU_PD(232),
-       PORT_DATA_I_PU_PD(233),
-       PORT_DATA_IO_PU_PD(234),
-       PORT_DATA_IO_PU_PD(235),
-       PORT_DATA_IO_PU_PD(236),
-       PORT_DATA_IO_PD(237),
-       PORT_DATA_IO_PU_PD(238),
-       PORT_DATA_IO_PU_PD(239),
-       PORT_DATA_IO_PU_PD(240),
-       PORT_DATA_O(241),
-       PORT_DATA_I_PD(242),
-       PORT_DATA_IO_PU_PD(243),
-       PORT_DATA_IO_PU_PD(244),
-       PORT_DATA_IO_PU_PD(245),
-       PORT_DATA_IO_PU_PD(246),
-       PORT_DATA_IO_PU_PD(247),
-       PORT_DATA_IO_PU_PD(248),
-       PORT_DATA_IO_PU_PD(249),
-       PORT_DATA_IO_PU_PD(250),
-       PORT_DATA_IO_PU_PD(251),
-       PORT_DATA_IO_PU_PD(252),
-       PORT_DATA_IO_PU_PD(253),
-       PORT_DATA_IO_PU_PD(254),
-       PORT_DATA_IO_PU_PD(255),
-       PORT_DATA_IO_PU_PD(256),
-       PORT_DATA_IO_PU_PD(257),
-       PORT_DATA_IO_PU_PD(258),
-       PORT_DATA_IO_PU_PD(259),
-       PORT_DATA_IO_PU_PD(260),
-       PORT_DATA_IO_PU_PD(261),
-       PORT_DATA_IO_PU_PD(262),
-       PORT_DATA_IO_PU_PD(263),
-       PORT_DATA_IO_PU_PD(264),
-       PORT_DATA_IO_PU_PD(265),
-       PORT_DATA_IO_PU_PD(266),
-       PORT_DATA_IO_PU_PD(267),
-       PORT_DATA_IO_PU_PD(268),
-       PORT_DATA_IO_PU_PD(269),
-       PORT_DATA_IO_PU_PD(270),
-       PORT_DATA_IO_PU_PD(271),
-       PORT_DATA_IO_PU_PD(272),
-       PORT_DATA_IO_PU_PD(273),
-       PORT_DATA_IO_PU_PD(274),
-       PORT_DATA_IO_PU_PD(275),
-       PORT_DATA_IO_PU_PD(276),
-       PORT_DATA_IO_PU_PD(277),
-       PORT_DATA_IO_PU_PD(278),
-       PORT_DATA_IO_PU_PD(279),
-       PORT_DATA_IO_PU_PD(280),
-       PORT_DATA_O(281),
-       PORT_DATA_O(282),
-       PORT_DATA_I_PU(288),
-       PORT_DATA_IO_PU_PD(289),
-       PORT_DATA_IO_PU_PD(290),
-       PORT_DATA_IO_PU_PD(291),
-       PORT_DATA_IO_PU_PD(292),
-       PORT_DATA_IO_PU_PD(293),
-       PORT_DATA_IO_PU_PD(294),
-       PORT_DATA_IO_PU_PD(295),
-       PORT_DATA_IO_PU_PD(296),
-       PORT_DATA_IO_PU_PD(297),
-       PORT_DATA_IO_PU_PD(298),
-
-       PORT_DATA_IO_PU_PD(299),
-       PORT_DATA_IO_PU_PD(300),
-       PORT_DATA_IO_PU_PD(301),
-       PORT_DATA_IO_PU_PD(302),
-       PORT_DATA_IO_PU_PD(303),
-       PORT_DATA_IO_PU_PD(304),
-       PORT_DATA_IO_PU_PD(305),
-       PORT_DATA_O(306),
-       PORT_DATA_O(307),
-       PORT_DATA_I_PU(308),
-       PORT_DATA_O(309),
+static const pinmux_enum_t pinmux_data[] = {
+       /* specify valid pin states for each pin in GPIO mode */
+       PINMUX_DATA_GP_ALL(),
 
        /* Table 25-1 (Function 0-7) */
        PINMUX_DATA(VBUS_0_MARK, PORT0_FN1),
@@ -1358,28 +1037,19 @@ static pinmux_enum_t pinmux_data[] = {
        PINMUX_DATA(TS_SCK4_MARK, PORT268_FN3),
        PINMUX_DATA(SDHICMD2_MARK, PORT269_FN1),
        PINMUX_DATA(MMCCLK0_MARK, PORT270_FN1, MSEL4CR_MSEL15_0),
-       PINMUX_DATA(MMCD0_0_MARK, PORT271_FN1, PORT271_IN_PU,
-               MSEL4CR_MSEL15_0),
-       PINMUX_DATA(MMCD0_1_MARK, PORT272_FN1, PORT272_IN_PU,
-               MSEL4CR_MSEL15_0),
-       PINMUX_DATA(MMCD0_2_MARK, PORT273_FN1, PORT273_IN_PU,
-               MSEL4CR_MSEL15_0),
-       PINMUX_DATA(MMCD0_3_MARK, PORT274_FN1, PORT274_IN_PU,
-               MSEL4CR_MSEL15_0),
-       PINMUX_DATA(MMCD0_4_MARK, PORT275_FN1, PORT275_IN_PU,
-               MSEL4CR_MSEL15_0), \
+       PINMUX_DATA(MMCD0_0_MARK, PORT271_FN1, MSEL4CR_MSEL15_0),
+       PINMUX_DATA(MMCD0_1_MARK, PORT272_FN1, MSEL4CR_MSEL15_0),
+       PINMUX_DATA(MMCD0_2_MARK, PORT273_FN1, MSEL4CR_MSEL15_0),
+       PINMUX_DATA(MMCD0_3_MARK, PORT274_FN1, MSEL4CR_MSEL15_0),
+       PINMUX_DATA(MMCD0_4_MARK, PORT275_FN1, MSEL4CR_MSEL15_0),
        PINMUX_DATA(TS_SPSYNC5_MARK, PORT275_FN3),
-       PINMUX_DATA(MMCD0_5_MARK, PORT276_FN1, PORT276_IN_PU,
-               MSEL4CR_MSEL15_0), \
+       PINMUX_DATA(MMCD0_5_MARK, PORT276_FN1, MSEL4CR_MSEL15_0),
        PINMUX_DATA(TS_SDAT5_MARK, PORT276_FN3),
-       PINMUX_DATA(MMCD0_6_MARK, PORT277_FN1, PORT277_IN_PU,
-               MSEL4CR_MSEL15_0), \
+       PINMUX_DATA(MMCD0_6_MARK, PORT277_FN1, MSEL4CR_MSEL15_0),
        PINMUX_DATA(TS_SDEN5_MARK, PORT277_FN3),
-       PINMUX_DATA(MMCD0_7_MARK, PORT278_FN1, PORT278_IN_PU,
-               MSEL4CR_MSEL15_0), \
+       PINMUX_DATA(MMCD0_7_MARK, PORT278_FN1, MSEL4CR_MSEL15_0),
        PINMUX_DATA(TS_SCK5_MARK, PORT278_FN3),
-       PINMUX_DATA(MMCCMD0_MARK, PORT279_FN1, PORT279_IN_PU,
-               MSEL4CR_MSEL15_0),
+       PINMUX_DATA(MMCCMD0_MARK, PORT279_FN1, MSEL4CR_MSEL15_0),
        PINMUX_DATA(RESETOUTS__MARK, PORT281_FN1), \
        PINMUX_DATA(EXTAL2OUT_MARK, PORT281_FN2),
        PINMUX_DATA(MCP_WAIT__MCP_FRB_MARK, PORT288_FN1),
@@ -1485,69 +1155,1791 @@ static pinmux_enum_t pinmux_data[] = {
        PINMUX_DATA(RESETA_N_PU_OFF_MARK, MSEL4CR_MSEL4_1),
        PINMUX_DATA(EDBGREQ_PD_MARK, MSEL4CR_MSEL1_0),
        PINMUX_DATA(EDBGREQ_PU_MARK, MSEL4CR_MSEL1_1),
+};
+
+#define SH73A0_PIN(pin, cfgs)                                          \
+       {                                                               \
+               .name = __stringify(PORT##pin),                         \
+               .enum_id = PORT##pin##_DATA,                            \
+               .configs = cfgs,                                        \
+       }
+
+#define __I            (SH_PFC_PIN_CFG_INPUT)
+#define __O            (SH_PFC_PIN_CFG_OUTPUT)
+#define __IO           (SH_PFC_PIN_CFG_INPUT | SH_PFC_PIN_CFG_OUTPUT)
+#define __PD           (SH_PFC_PIN_CFG_PULL_DOWN)
+#define __PU           (SH_PFC_PIN_CFG_PULL_UP)
+#define __PUD          (SH_PFC_PIN_CFG_PULL_DOWN | SH_PFC_PIN_CFG_PULL_UP)
+
+#define SH73A0_PIN_I_PD(pin)           SH73A0_PIN(pin, __I | __PD)
+#define SH73A0_PIN_I_PU(pin)           SH73A0_PIN(pin, __I | __PU)
+#define SH73A0_PIN_I_PU_PD(pin)                SH73A0_PIN(pin, __I | __PUD)
+#define SH73A0_PIN_IO(pin)             SH73A0_PIN(pin, __IO)
+#define SH73A0_PIN_IO_PD(pin)          SH73A0_PIN(pin, __IO | __PD)
+#define SH73A0_PIN_IO_PU(pin)          SH73A0_PIN(pin, __IO | __PU)
+#define SH73A0_PIN_IO_PU_PD(pin)       SH73A0_PIN(pin, __IO | __PUD)
+#define SH73A0_PIN_O(pin)              SH73A0_PIN(pin, __O)
+
+static 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),
+       SH73A0_PIN_I_PU(2),
+       SH73A0_PIN_I_PU(3),
+       SH73A0_PIN_I_PU(4),
+       SH73A0_PIN_I_PU(5),
+       SH73A0_PIN_I_PU(6),
+       SH73A0_PIN_I_PU(7),
+       SH73A0_PIN_I_PU(8),
+       SH73A0_PIN_I_PD(9),
+       SH73A0_PIN_I_PD(10),
+       SH73A0_PIN_I_PU_PD(11),
+       SH73A0_PIN_IO_PU_PD(12),
+       SH73A0_PIN_IO_PU_PD(13),
+       SH73A0_PIN_IO_PU_PD(14),
+       SH73A0_PIN_IO_PU_PD(15),
+       SH73A0_PIN_IO_PD(16),
+       SH73A0_PIN_IO_PD(17),
+       SH73A0_PIN_IO_PU(18),
+       SH73A0_PIN_IO_PU(19),
+       SH73A0_PIN_O(20),
+       SH73A0_PIN_O(21),
+       SH73A0_PIN_O(22),
+       SH73A0_PIN_O(23),
+       SH73A0_PIN_O(24),
+       SH73A0_PIN_I_PD(25),
+       SH73A0_PIN_I_PD(26),
+       SH73A0_PIN_IO_PU(27),
+       SH73A0_PIN_IO_PU(28),
+       SH73A0_PIN_IO_PD(29),
+       SH73A0_PIN_IO_PD(30),
+       SH73A0_PIN_IO_PU(31),
+       SH73A0_PIN_IO_PD(32),
+       SH73A0_PIN_I_PU_PD(33),
+       SH73A0_PIN_IO_PD(34),
+       SH73A0_PIN_I_PU_PD(35),
+       SH73A0_PIN_IO_PD(36),
+       SH73A0_PIN_IO(37),
+       SH73A0_PIN_O(38),
+       SH73A0_PIN_I_PU(39),
+       SH73A0_PIN_I_PU_PD(40),
+       SH73A0_PIN_O(41),
+       SH73A0_PIN_IO_PD(42),
+       SH73A0_PIN_IO_PU_PD(43),
+       SH73A0_PIN_IO_PU_PD(44),
+       SH73A0_PIN_IO_PD(45),
+       SH73A0_PIN_IO_PD(46),
+       SH73A0_PIN_IO_PD(47),
+       SH73A0_PIN_I_PD(48),
+       SH73A0_PIN_IO_PU_PD(49),
+       SH73A0_PIN_IO_PD(50),
+       SH73A0_PIN_IO_PD(51),
+       SH73A0_PIN_O(52),
+       SH73A0_PIN_IO_PU_PD(53),
+       SH73A0_PIN_IO_PU_PD(54),
+       SH73A0_PIN_IO_PD(55),
+       SH73A0_PIN_I_PU_PD(56),
+       SH73A0_PIN_IO(57),
+       SH73A0_PIN_IO(58),
+       SH73A0_PIN_IO(59),
+       SH73A0_PIN_IO(60),
+       SH73A0_PIN_IO(61),
+       SH73A0_PIN_IO_PD(62),
+       SH73A0_PIN_IO_PD(63),
+       SH73A0_PIN_IO_PU_PD(64),
+       SH73A0_PIN_IO_PD(65),
+       SH73A0_PIN_IO_PU_PD(66),
+       SH73A0_PIN_IO_PU_PD(67),
+       SH73A0_PIN_IO_PU_PD(68),
+       SH73A0_PIN_IO_PU_PD(69),
+       SH73A0_PIN_IO_PU_PD(70),
+       SH73A0_PIN_IO_PU_PD(71),
+       SH73A0_PIN_IO_PU_PD(72),
+       SH73A0_PIN_I_PU_PD(73),
+       SH73A0_PIN_IO_PU(74),
+       SH73A0_PIN_IO_PU(75),
+       SH73A0_PIN_IO_PU(76),
+       SH73A0_PIN_IO_PU(77),
+       SH73A0_PIN_IO_PU(78),
+       SH73A0_PIN_IO_PU(79),
+       SH73A0_PIN_IO_PU(80),
+       SH73A0_PIN_IO_PU(81),
+       SH73A0_PIN_IO_PU(82),
+       SH73A0_PIN_IO_PU(83),
+       SH73A0_PIN_IO_PU(84),
+       SH73A0_PIN_IO_PU(85),
+       SH73A0_PIN_IO_PU(86),
+       SH73A0_PIN_IO_PU(87),
+       SH73A0_PIN_IO_PU(88),
+       SH73A0_PIN_IO_PU(89),
+       SH73A0_PIN_O(90),
+       SH73A0_PIN_IO_PU(91),
+       SH73A0_PIN_O(92),
+       SH73A0_PIN_IO_PU(93),
+       SH73A0_PIN_O(94),
+       SH73A0_PIN_I_PU_PD(95),
+       SH73A0_PIN_IO(96),
+       SH73A0_PIN_IO(97),
+       SH73A0_PIN_IO(98),
+       SH73A0_PIN_I_PU(99),
+       SH73A0_PIN_O(100),
+       SH73A0_PIN_O(101),
+       SH73A0_PIN_I_PU(102),
+       SH73A0_PIN_IO_PD(103),
+       SH73A0_PIN_I_PU_PD(104),
+       SH73A0_PIN_I_PD(105),
+       SH73A0_PIN_I_PD(106),
+       SH73A0_PIN_I_PU_PD(107),
+       SH73A0_PIN_I_PU_PD(108),
+       SH73A0_PIN_IO_PD(109),
+       SH73A0_PIN_IO_PD(110),
+       SH73A0_PIN_IO_PU_PD(111),
+       SH73A0_PIN_IO_PU_PD(112),
+       SH73A0_PIN_IO_PU_PD(113),
+       SH73A0_PIN_IO_PD(114),
+       SH73A0_PIN_IO_PU(115),
+       SH73A0_PIN_IO_PU(116),
+       SH73A0_PIN_IO_PU_PD(117),
+       SH73A0_PIN_IO_PU_PD(118),
+       SH73A0_PIN_IO_PD(128),
+       SH73A0_PIN_IO_PD(129),
+       SH73A0_PIN_IO_PU_PD(130),
+       SH73A0_PIN_IO_PD(131),
+       SH73A0_PIN_IO_PD(132),
+       SH73A0_PIN_IO_PD(133),
+       SH73A0_PIN_IO_PU_PD(134),
+       SH73A0_PIN_IO_PU_PD(135),
+       SH73A0_PIN_IO_PU_PD(136),
+       SH73A0_PIN_IO_PU_PD(137),
+       SH73A0_PIN_IO_PD(138),
+       SH73A0_PIN_IO_PD(139),
+       SH73A0_PIN_IO_PD(140),
+       SH73A0_PIN_IO_PD(141),
+       SH73A0_PIN_IO_PD(142),
+       SH73A0_PIN_IO_PD(143),
+       SH73A0_PIN_IO_PU_PD(144),
+       SH73A0_PIN_IO_PD(145),
+       SH73A0_PIN_IO_PU_PD(146),
+       SH73A0_PIN_IO_PU_PD(147),
+       SH73A0_PIN_IO_PU_PD(148),
+       SH73A0_PIN_IO_PU_PD(149),
+       SH73A0_PIN_I_PU_PD(150),
+       SH73A0_PIN_IO_PU_PD(151),
+       SH73A0_PIN_IO_PU_PD(152),
+       SH73A0_PIN_IO_PD(153),
+       SH73A0_PIN_IO_PD(154),
+       SH73A0_PIN_I_PU_PD(155),
+       SH73A0_PIN_IO_PU_PD(156),
+       SH73A0_PIN_I_PD(157),
+       SH73A0_PIN_IO_PD(158),
+       SH73A0_PIN_IO_PU_PD(159),
+       SH73A0_PIN_IO_PU_PD(160),
+       SH73A0_PIN_I_PU_PD(161),
+       SH73A0_PIN_I_PU_PD(162),
+       SH73A0_PIN_IO_PU_PD(163),
+       SH73A0_PIN_I_PU_PD(164),
+       SH73A0_PIN_IO_PD(192),
+       SH73A0_PIN_IO_PU_PD(193),
+       SH73A0_PIN_IO_PD(194),
+       SH73A0_PIN_IO_PU_PD(195),
+       SH73A0_PIN_IO_PD(196),
+       SH73A0_PIN_IO_PD(197),
+       SH73A0_PIN_IO_PD(198),
+       SH73A0_PIN_IO_PD(199),
+       SH73A0_PIN_IO_PU_PD(200),
+       SH73A0_PIN_IO_PU_PD(201),
+       SH73A0_PIN_IO_PU_PD(202),
+       SH73A0_PIN_IO_PU_PD(203),
+       SH73A0_PIN_IO_PU_PD(204),
+       SH73A0_PIN_IO_PU_PD(205),
+       SH73A0_PIN_IO_PU_PD(206),
+       SH73A0_PIN_IO_PD(207),
+       SH73A0_PIN_IO_PD(208),
+       SH73A0_PIN_IO_PD(209),
+       SH73A0_PIN_IO_PD(210),
+       SH73A0_PIN_IO_PD(211),
+       SH73A0_PIN_IO_PD(212),
+       SH73A0_PIN_IO_PD(213),
+       SH73A0_PIN_IO_PU_PD(214),
+       SH73A0_PIN_IO_PU_PD(215),
+       SH73A0_PIN_IO_PD(216),
+       SH73A0_PIN_IO_PD(217),
+       SH73A0_PIN_O(218),
+       SH73A0_PIN_IO_PD(219),
+       SH73A0_PIN_IO_PD(220),
+       SH73A0_PIN_IO_PU_PD(221),
+       SH73A0_PIN_IO_PU_PD(222),
+       SH73A0_PIN_I_PU_PD(223),
+       SH73A0_PIN_I_PU_PD(224),
+       SH73A0_PIN_IO_PU_PD(225),
+       SH73A0_PIN_O(226),
+       SH73A0_PIN_IO_PU_PD(227),
+       SH73A0_PIN_I_PU_PD(228),
+       SH73A0_PIN_I_PD(229),
+       SH73A0_PIN_IO(230),
+       SH73A0_PIN_IO_PU_PD(231),
+       SH73A0_PIN_IO_PU_PD(232),
+       SH73A0_PIN_I_PU_PD(233),
+       SH73A0_PIN_IO_PU_PD(234),
+       SH73A0_PIN_IO_PU_PD(235),
+       SH73A0_PIN_IO_PU_PD(236),
+       SH73A0_PIN_IO_PD(237),
+       SH73A0_PIN_IO_PU_PD(238),
+       SH73A0_PIN_IO_PU_PD(239),
+       SH73A0_PIN_IO_PU_PD(240),
+       SH73A0_PIN_O(241),
+       SH73A0_PIN_I_PD(242),
+       SH73A0_PIN_IO_PU_PD(243),
+       SH73A0_PIN_IO_PU_PD(244),
+       SH73A0_PIN_IO_PU_PD(245),
+       SH73A0_PIN_IO_PU_PD(246),
+       SH73A0_PIN_IO_PU_PD(247),
+       SH73A0_PIN_IO_PU_PD(248),
+       SH73A0_PIN_IO_PU_PD(249),
+       SH73A0_PIN_IO_PU_PD(250),
+       SH73A0_PIN_IO_PU_PD(251),
+       SH73A0_PIN_IO_PU_PD(252),
+       SH73A0_PIN_IO_PU_PD(253),
+       SH73A0_PIN_IO_PU_PD(254),
+       SH73A0_PIN_IO_PU_PD(255),
+       SH73A0_PIN_IO_PU_PD(256),
+       SH73A0_PIN_IO_PU_PD(257),
+       SH73A0_PIN_IO_PU_PD(258),
+       SH73A0_PIN_IO_PU_PD(259),
+       SH73A0_PIN_IO_PU_PD(260),
+       SH73A0_PIN_IO_PU_PD(261),
+       SH73A0_PIN_IO_PU_PD(262),
+       SH73A0_PIN_IO_PU_PD(263),
+       SH73A0_PIN_IO_PU_PD(264),
+       SH73A0_PIN_IO_PU_PD(265),
+       SH73A0_PIN_IO_PU_PD(266),
+       SH73A0_PIN_IO_PU_PD(267),
+       SH73A0_PIN_IO_PU_PD(268),
+       SH73A0_PIN_IO_PU_PD(269),
+       SH73A0_PIN_IO_PU_PD(270),
+       SH73A0_PIN_IO_PU_PD(271),
+       SH73A0_PIN_IO_PU_PD(272),
+       SH73A0_PIN_IO_PU_PD(273),
+       SH73A0_PIN_IO_PU_PD(274),
+       SH73A0_PIN_IO_PU_PD(275),
+       SH73A0_PIN_IO_PU_PD(276),
+       SH73A0_PIN_IO_PU_PD(277),
+       SH73A0_PIN_IO_PU_PD(278),
+       SH73A0_PIN_IO_PU_PD(279),
+       SH73A0_PIN_IO_PU_PD(280),
+       SH73A0_PIN_O(281),
+       SH73A0_PIN_O(282),
+       SH73A0_PIN_I_PU(288),
+       SH73A0_PIN_IO_PU_PD(289),
+       SH73A0_PIN_IO_PU_PD(290),
+       SH73A0_PIN_IO_PU_PD(291),
+       SH73A0_PIN_IO_PU_PD(292),
+       SH73A0_PIN_IO_PU_PD(293),
+       SH73A0_PIN_IO_PU_PD(294),
+       SH73A0_PIN_IO_PU_PD(295),
+       SH73A0_PIN_IO_PU_PD(296),
+       SH73A0_PIN_IO_PU_PD(297),
+       SH73A0_PIN_IO_PU_PD(298),
+       SH73A0_PIN_IO_PU_PD(299),
+       SH73A0_PIN_IO_PU_PD(300),
+       SH73A0_PIN_IO_PU_PD(301),
+       SH73A0_PIN_IO_PU_PD(302),
+       SH73A0_PIN_IO_PU_PD(303),
+       SH73A0_PIN_IO_PU_PD(304),
+       SH73A0_PIN_IO_PU_PD(305),
+       SH73A0_PIN_O(306),
+       SH73A0_PIN_O(307),
+       SH73A0_PIN_I_PU(308),
+       SH73A0_PIN_O(309),
+};
+
+static const struct pinmux_range pinmux_ranges[] = {
+       {.begin = 0, .end = 118,},
+       {.begin = 128, .end = 164,},
+       {.begin = 192, .end = 282,},
+       {.begin = 288, .end = 309,},
+};
+
+/* Pin numbers for pins without a corresponding GPIO port number are computed
+ * from the row and column numbers with a 1000 offset to avoid collisions with
+ * GPIO port numbers.
+ */
+#define PIN_NUMBER(row, col)           (1000+((row)-1)*34+(col)-1)
+
+/* - BSC -------------------------------------------------------------------- */
+static const unsigned int bsc_data_0_7_pins[] = {
+       /* D[0:7] */
+       74, 75, 76, 77, 78, 79, 80, 81,
+};
+static const unsigned int bsc_data_0_7_mux[] = {
+       D0_NAF0_MARK, D1_NAF1_MARK, D2_NAF2_MARK, D3_NAF3_MARK,
+       D4_NAF4_MARK, D5_NAF5_MARK, D6_NAF6_MARK, D7_NAF7_MARK,
+};
+static const unsigned int bsc_data_8_15_pins[] = {
+       /* D[8:15] */
+       82, 83, 84, 85, 86, 87, 88, 89,
+};
+static const unsigned int bsc_data_8_15_mux[] = {
+       D8_NAF8_MARK, D9_NAF9_MARK, D10_NAF10_MARK, D11_NAF11_MARK,
+       D12_NAF12_MARK, D13_NAF13_MARK, D14_NAF14_MARK, D15_NAF15_MARK,
+};
+static const unsigned int bsc_cs4_pins[] = {
+       /* CS */
+       90,
+};
+static const unsigned int bsc_cs4_mux[] = {
+       CS4__MARK,
+};
+static const unsigned int bsc_cs5_a_pins[] = {
+       /* CS */
+       91,
+};
+static const unsigned int bsc_cs5_a_mux[] = {
+       CS5A__MARK,
+};
+static const unsigned int bsc_cs5_b_pins[] = {
+       /* CS */
+       92,
+};
+static const unsigned int bsc_cs5_b_mux[] = {
+       CS5B__MARK,
+};
+static const unsigned int bsc_cs6_a_pins[] = {
+       /* CS */
+       94,
+};
+static const unsigned int bsc_cs6_a_mux[] = {
+       CS6A__MARK,
+};
+static const unsigned int bsc_cs6_b_pins[] = {
+       /* CS */
+       93,
+};
+static const unsigned int bsc_cs6_b_mux[] = {
+       CS6B__MARK,
+};
+static const unsigned int bsc_rd_pins[] = {
+       /* RD */
+       96,
+};
+static const unsigned int bsc_rd_mux[] = {
+       RD__FSC_MARK,
+};
+static const unsigned int bsc_rdwr_0_pins[] = {
+       /* RDWR */
+       91,
+};
+static const unsigned int bsc_rdwr_0_mux[] = {
+       PORT91_RDWR_MARK,
+};
+static const unsigned int bsc_rdwr_1_pins[] = {
+       /* RDWR */
+       97,
+};
+static const unsigned int bsc_rdwr_1_mux[] = {
+       RDWR_FWE_MARK,
+};
+static const unsigned int bsc_rdwr_2_pins[] = {
+       /* RDWR */
+       149,
+};
+static const unsigned int bsc_rdwr_2_mux[] = {
+       PORT149_RDWR_MARK,
+};
+static const unsigned int bsc_we0_pins[] = {
+       /* WE0 */
+       97,
+};
+static const unsigned int bsc_we0_mux[] = {
+       WE0__FWE_MARK,
+};
+static const unsigned int bsc_we1_pins[] = {
+       /* WE1 */
+       98,
+};
+static const unsigned int bsc_we1_mux[] = {
+       WE1__MARK,
+};
+/* - FSIA ------------------------------------------------------------------- */
+static const unsigned int fsia_mclk_in_pins[] = {
+       /* CK */
+       49,
+};
+static const unsigned int fsia_mclk_in_mux[] = {
+       FSIACK_MARK,
+};
+static const unsigned int fsia_mclk_out_pins[] = {
+       /* OMC */
+       49,
+};
+static const unsigned int fsia_mclk_out_mux[] = {
+       FSIAOMC_MARK,
+};
+static const unsigned int fsia_sclk_in_pins[] = {
+       /* ILR, IBT */
+       50, 51,
+};
+static const unsigned int fsia_sclk_in_mux[] = {
+       FSIAILR_MARK, FSIAIBT_MARK,
+};
+static const unsigned int fsia_sclk_out_pins[] = {
+       /* OLR, OBT */
+       50, 51,
+};
+static const unsigned int fsia_sclk_out_mux[] = {
+       FSIAOLR_MARK, FSIAOBT_MARK,
+};
+static const unsigned int fsia_data_in_pins[] = {
+       /* ISLD */
+       55,
+};
+static const unsigned int fsia_data_in_mux[] = {
+       FSIAISLD_MARK,
+};
+static const unsigned int fsia_data_out_pins[] = {
+       /* OSLD */
+       52,
+};
+static const unsigned int fsia_data_out_mux[] = {
+       FSIAOSLD_MARK,
+};
+static const unsigned int fsia_spdif_pins[] = {
+       /* SPDIF */
+       53,
+};
+static const unsigned int fsia_spdif_mux[] = {
+       FSIASPDIF_MARK,
+};
+/* - FSIB ------------------------------------------------------------------- */
+static const unsigned int fsib_mclk_in_pins[] = {
+       /* CK */
+       54,
+};
+static const unsigned int fsib_mclk_in_mux[] = {
+       FSIBCK_MARK,
+};
+static const unsigned int fsib_mclk_out_pins[] = {
+       /* OMC */
+       54,
+};
+static const unsigned int fsib_mclk_out_mux[] = {
+       FSIBOMC_MARK,
+};
+static const unsigned int fsib_sclk_in_pins[] = {
+       /* ILR, IBT */
+       37, 36,
+};
+static const unsigned int fsib_sclk_in_mux[] = {
+       FSIBILR_MARK, FSIBIBT_MARK,
+};
+static const unsigned int fsib_sclk_out_pins[] = {
+       /* OLR, OBT */
+       37, 36,
+};
+static const unsigned int fsib_sclk_out_mux[] = {
+       FSIBOLR_MARK, FSIBOBT_MARK,
+};
+static const unsigned int fsib_data_in_pins[] = {
+       /* ISLD */
+       39,
+};
+static const unsigned int fsib_data_in_mux[] = {
+       FSIBISLD_MARK,
+};
+static const unsigned int fsib_data_out_pins[] = {
+       /* OSLD */
+       38,
+};
+static const unsigned int fsib_data_out_mux[] = {
+       FSIBOSLD_MARK,
+};
+static const unsigned int fsib_spdif_pins[] = {
+       /* SPDIF */
+       53,
+};
+static const unsigned int fsib_spdif_mux[] = {
+       FSIBSPDIF_MARK,
+};
+/* - FSIC ------------------------------------------------------------------- */
+static const unsigned int fsic_mclk_in_pins[] = {
+       /* CK */
+       54,
+};
+static const unsigned int fsic_mclk_in_mux[] = {
+       FSICCK_MARK,
+};
+static const unsigned int fsic_mclk_out_pins[] = {
+       /* OMC */
+       54,
+};
+static const unsigned int fsic_mclk_out_mux[] = {
+       FSICOMC_MARK,
+};
+static const unsigned int fsic_sclk_in_pins[] = {
+       /* ILR, IBT */
+       46, 45,
+};
+static const unsigned int fsic_sclk_in_mux[] = {
+       FSICILR_MARK, FSICIBT_MARK,
+};
+static const unsigned int fsic_sclk_out_pins[] = {
+       /* OLR, OBT */
+       46, 45,
+};
+static const unsigned int fsic_sclk_out_mux[] = {
+       FSICOLR_MARK, FSICOBT_MARK,
+};
+static const unsigned int fsic_data_in_pins[] = {
+       /* ISLD */
+       48,
+};
+static const unsigned int fsic_data_in_mux[] = {
+       FSICISLD_MARK,
+};
+static const unsigned int fsic_data_out_pins[] = {
+       /* OSLD, OSLDT1, OSLDT2, OSLDT3 */
+       47, 44, 42, 16,
+};
+static const unsigned int fsic_data_out_mux[] = {
+       FSICOSLD_MARK, FSICOSLDT1_MARK, FSICOSLDT2_MARK, FSICOSLDT3_MARK,
+};
+static const unsigned int fsic_spdif_0_pins[] = {
+       /* SPDIF */
+       53,
+};
+static const unsigned int fsic_spdif_0_mux[] = {
+       PORT53_FSICSPDIF_MARK,
+};
+static const unsigned int fsic_spdif_1_pins[] = {
+       /* SPDIF */
+       47,
+};
+static const unsigned int fsic_spdif_1_mux[] = {
+       PORT47_FSICSPDIF_MARK,
+};
+/* - FSID ------------------------------------------------------------------- */
+static const unsigned int fsid_sclk_in_pins[] = {
+       /* ILR, IBT */
+       46, 45,
+};
+static const unsigned int fsid_sclk_in_mux[] = {
+       FSIDILR_MARK, FSIDIBT_MARK,
+};
+static const unsigned int fsid_sclk_out_pins[] = {
+       /* OLR, OBT */
+       46, 45,
+};
+static const unsigned int fsid_sclk_out_mux[] = {
+       FSIDOLR_MARK, FSIDOBT_MARK,
+};
+static const unsigned int fsid_data_in_pins[] = {
+       /* ISLD */
+       48,
+};
+static const unsigned int fsid_data_in_mux[] = {
+       FSIDISLD_MARK,
+};
+/* - I2C2 ------------------------------------------------------------------- */
+static const unsigned int i2c2_0_pins[] = {
+       /* SCL, SDA */
+       237, 236,
+};
+static const unsigned int i2c2_0_mux[] = {
+       PORT237_I2C_SCL2_MARK, PORT236_I2C_SDA2_MARK,
+};
+static const unsigned int i2c2_1_pins[] = {
+       /* SCL, SDA */
+       27, 28,
+};
+static const unsigned int i2c2_1_mux[] = {
+       PORT27_I2C_SCL2_MARK, PORT28_I2C_SDA2_MARK,
+};
+static const unsigned int i2c2_2_pins[] = {
+       /* SCL, SDA */
+       115, 116,
+};
+static const unsigned int i2c2_2_mux[] = {
+       PORT115_I2C_SCL2_MARK, PORT116_I2C_SDA2_MARK,
+};
+/* - I2C3 ------------------------------------------------------------------- */
+static const unsigned int i2c3_0_pins[] = {
+       /* SCL, SDA */
+       248, 249,
+};
+static const unsigned int i2c3_0_mux[] = {
+       PORT248_I2C_SCL3_MARK, PORT249_I2C_SDA3_MARK,
+};
+static const unsigned int i2c3_1_pins[] = {
+       /* SCL, SDA */
+       27, 28,
+};
+static const unsigned int i2c3_1_mux[] = {
+       PORT27_I2C_SCL3_MARK, PORT28_I2C_SDA3_MARK,
+};
+static const unsigned int i2c3_2_pins[] = {
+       /* SCL, SDA */
+       115, 116,
+};
+static const unsigned int i2c3_2_mux[] = {
+       PORT115_I2C_SCL3_MARK, PORT116_I2C_SDA3_MARK,
+};
+/* - IrDA ------------------------------------------------------------------- */
+static const unsigned int irda_0_pins[] = {
+       /* OUT, IN, FIRSEL */
+       241, 242, 243,
+};
+static const unsigned int irda_0_mux[] = {
+       PORT241_IRDA_OUT_MARK, PORT242_IRDA_IN_MARK, PORT243_IRDA_FIRSEL_MARK,
+};
+static const unsigned int irda_1_pins[] = {
+       /* OUT, IN, FIRSEL */
+       49, 53, 54,
+};
+static const unsigned int irda_1_mux[] = {
+       PORT49_IRDA_OUT_MARK, PORT53_IRDA_IN_MARK, PORT54_IRDA_FIRSEL_MARK,
+};
+/* - KEYSC ------------------------------------------------------------------ */
+static const unsigned int keysc_in5_pins[] = {
+       /* KEYIN[0:4] */
+       66, 67, 68, 69, 70,
+};
+static const unsigned int keysc_in5_mux[] = {
+       KEYIN0_MARK, KEYIN1_MARK, KEYIN2_MARK, KEYIN3_MARK,
+       KEYIN4_MARK,
+};
+static const unsigned int keysc_in6_pins[] = {
+       /* KEYIN[0:5] */
+       66, 67, 68, 69, 70, 71,
+};
+static const unsigned int keysc_in6_mux[] = {
+       KEYIN0_MARK, KEYIN1_MARK, KEYIN2_MARK, KEYIN3_MARK,
+       KEYIN4_MARK, KEYIN5_MARK,
+};
+static const unsigned int keysc_in7_pins[] = {
+       /* KEYIN[0:6] */
+       66, 67, 68, 69, 70, 71, 72,
+};
+static const unsigned int keysc_in7_mux[] = {
+       KEYIN0_MARK, KEYIN1_MARK, KEYIN2_MARK, KEYIN3_MARK,
+       KEYIN4_MARK, KEYIN5_MARK, KEYIN6_MARK,
+};
+static const unsigned int keysc_in8_pins[] = {
+       /* KEYIN[0:7] */
+       66, 67, 68, 69, 70, 71, 72, 73,
+};
+static const unsigned int keysc_in8_mux[] = {
+       KEYIN0_MARK, KEYIN1_MARK, KEYIN2_MARK, KEYIN3_MARK,
+       KEYIN4_MARK, KEYIN5_MARK, KEYIN6_MARK, KEYIN7_MARK,
+};
+static const unsigned int keysc_out04_pins[] = {
+       /* KEYOUT[0:4] */
+       65, 64, 63, 62, 61,
+};
+static const unsigned int keysc_out04_mux[] = {
+       KEYOUT0_MARK, KEYOUT1_MARK, KEYOUT2_MARK, KEYOUT3_MARK, KEYOUT4_MARK,
+};
+static const unsigned int keysc_out5_pins[] = {
+       /* KEYOUT5 */
+       60,
+};
+static const unsigned int keysc_out5_mux[] = {
+       KEYOUT5_MARK,
+};
+static const unsigned int keysc_out6_0_pins[] = {
+       /* KEYOUT6 */
+       59,
+};
+static const unsigned int keysc_out6_0_mux[] = {
+       PORT59_KEYOUT6_MARK,
+};
+static const unsigned int keysc_out6_1_pins[] = {
+       /* KEYOUT6 */
+       131,
+};
+static const unsigned int keysc_out6_1_mux[] = {
+       PORT131_KEYOUT6_MARK,
+};
+static const unsigned int keysc_out6_2_pins[] = {
+       /* KEYOUT6 */
+       143,
+};
+static const unsigned int keysc_out6_2_mux[] = {
+       PORT143_KEYOUT6_MARK,
+};
+static const unsigned int keysc_out7_0_pins[] = {
+       /* KEYOUT7 */
+       58,
+};
+static const unsigned int keysc_out7_0_mux[] = {
+       PORT58_KEYOUT7_MARK,
+};
+static const unsigned int keysc_out7_1_pins[] = {
+       /* KEYOUT7 */
+       132,
+};
+static const unsigned int keysc_out7_1_mux[] = {
+       PORT132_KEYOUT7_MARK,
+};
+static const unsigned int keysc_out7_2_pins[] = {
+       /* KEYOUT7 */
+       144,
+};
+static const unsigned int keysc_out7_2_mux[] = {
+       PORT144_KEYOUT7_MARK,
+};
+static const unsigned int keysc_out8_0_pins[] = {
+       /* KEYOUT8 */
+       PIN_NUMBER(6, 26),
+};
+static const unsigned int keysc_out8_0_mux[] = {
+       KEYOUT8_MARK,
+};
+static const unsigned int keysc_out8_1_pins[] = {
+       /* KEYOUT8 */
+       136,
+};
+static const unsigned int keysc_out8_1_mux[] = {
+       PORT136_KEYOUT8_MARK,
+};
+static const unsigned int keysc_out8_2_pins[] = {
+       /* KEYOUT8 */
+       138,
+};
+static const unsigned int keysc_out8_2_mux[] = {
+       PORT138_KEYOUT8_MARK,
+};
+static const unsigned int keysc_out9_0_pins[] = {
+       /* KEYOUT9 */
+       137,
+};
+static const unsigned int keysc_out9_0_mux[] = {
+       PORT137_KEYOUT9_MARK,
+};
+static const unsigned int keysc_out9_1_pins[] = {
+       /* KEYOUT9 */
+       139,
+};
+static const unsigned int keysc_out9_1_mux[] = {
+       PORT139_KEYOUT9_MARK,
+};
+static const unsigned int keysc_out9_2_pins[] = {
+       /* KEYOUT9 */
+       149,
+};
+static const unsigned int keysc_out9_2_mux[] = {
+       PORT149_KEYOUT9_MARK,
+};
+static const unsigned int keysc_out10_0_pins[] = {
+       /* KEYOUT10 */
+       132,
+};
+static const unsigned int keysc_out10_0_mux[] = {
+       PORT132_KEYOUT10_MARK,
+};
+static const unsigned int keysc_out10_1_pins[] = {
+       /* KEYOUT10 */
+       142,
+};
+static const unsigned int keysc_out10_1_mux[] = {
+       PORT142_KEYOUT10_MARK,
+};
+static const unsigned int keysc_out11_0_pins[] = {
+       /* KEYOUT11 */
+       131,
+};
+static const unsigned int keysc_out11_0_mux[] = {
+       PORT131_KEYOUT11_MARK,
+};
+static const unsigned int keysc_out11_1_pins[] = {
+       /* KEYOUT11 */
+       143,
+};
+static const unsigned int keysc_out11_1_mux[] = {
+       PORT143_KEYOUT11_MARK,
+};
+/* - LCD -------------------------------------------------------------------- */
+static const unsigned int lcd_data8_pins[] = {
+       /* D[0:7] */
+       192, 193, 194, 195, 196, 197, 198, 199,
+};
+static const unsigned int lcd_data8_mux[] = {
+       LCDD0_MARK, LCDD1_MARK, LCDD2_MARK, LCDD3_MARK,
+       LCDD4_MARK, LCDD5_MARK, LCDD6_MARK, LCDD7_MARK,
+};
+static const unsigned int lcd_data9_pins[] = {
+       /* D[0:8] */
+       192, 193, 194, 195, 196, 197, 198, 199,
+       200,
+};
+static const unsigned int lcd_data9_mux[] = {
+       LCDD0_MARK, LCDD1_MARK, LCDD2_MARK, LCDD3_MARK,
+       LCDD4_MARK, LCDD5_MARK, LCDD6_MARK, LCDD7_MARK,
+       LCDD8_MARK,
+};
+static const unsigned int lcd_data12_pins[] = {
+       /* D[0:11] */
+       192, 193, 194, 195, 196, 197, 198, 199,
+       200, 201, 202, 203,
+};
+static const unsigned int lcd_data12_mux[] = {
+       LCDD0_MARK, LCDD1_MARK, LCDD2_MARK, LCDD3_MARK,
+       LCDD4_MARK, LCDD5_MARK, LCDD6_MARK, LCDD7_MARK,
+       LCDD8_MARK, LCDD9_MARK, LCDD10_MARK, LCDD11_MARK,
+};
+static const unsigned int lcd_data16_pins[] = {
+       /* D[0:15] */
+       192, 193, 194, 195, 196, 197, 198, 199,
+       200, 201, 202, 203, 204, 205, 206, 207,
+};
+static const unsigned int lcd_data16_mux[] = {
+       LCDD0_MARK, LCDD1_MARK, LCDD2_MARK, LCDD3_MARK,
+       LCDD4_MARK, LCDD5_MARK, LCDD6_MARK, LCDD7_MARK,
+       LCDD8_MARK, LCDD9_MARK, LCDD10_MARK, LCDD11_MARK,
+       LCDD12_MARK, LCDD13_MARK, LCDD14_MARK, LCDD15_MARK,
+};
+static const unsigned int lcd_data18_pins[] = {
+       /* D[0:17] */
+       192, 193, 194, 195, 196, 197, 198, 199,
+       200, 201, 202, 203, 204, 205, 206, 207,
+       208, 209,
+};
+static const unsigned int lcd_data18_mux[] = {
+       LCDD0_MARK, LCDD1_MARK, LCDD2_MARK, LCDD3_MARK,
+       LCDD4_MARK, LCDD5_MARK, LCDD6_MARK, LCDD7_MARK,
+       LCDD8_MARK, LCDD9_MARK, LCDD10_MARK, LCDD11_MARK,
+       LCDD12_MARK, LCDD13_MARK, LCDD14_MARK, LCDD15_MARK,
+       LCDD16_MARK, LCDD17_MARK,
+};
+static const unsigned int lcd_data24_pins[] = {
+       /* D[0:23] */
+       192, 193, 194, 195, 196, 197, 198, 199,
+       200, 201, 202, 203, 204, 205, 206, 207,
+       208, 209, 210, 211, 212, 213, 214, 215
+};
+static const unsigned int lcd_data24_mux[] = {
+       LCDD0_MARK, LCDD1_MARK, LCDD2_MARK, LCDD3_MARK,
+       LCDD4_MARK, LCDD5_MARK, LCDD6_MARK, LCDD7_MARK,
+       LCDD8_MARK, LCDD9_MARK, LCDD10_MARK, LCDD11_MARK,
+       LCDD12_MARK, LCDD13_MARK, LCDD14_MARK, LCDD15_MARK,
+       LCDD16_MARK, LCDD17_MARK, LCDD18_MARK, LCDD19_MARK,
+       LCDD20_MARK, LCDD21_MARK, LCDD22_MARK, LCDD23_MARK,
+};
+static const unsigned int lcd_display_pins[] = {
+       /* DON */
+       222,
+};
+static const unsigned int lcd_display_mux[] = {
+       LCDDON_MARK,
+};
+static const unsigned int lcd_lclk_pins[] = {
+       /* LCLK */
+       221,
+};
+static const unsigned int lcd_lclk_mux[] = {
+       LCDLCLK_MARK,
+};
+static const unsigned int lcd_sync_pins[] = {
+       /* VSYN, HSYN, DCK, DISP */
+       220, 218, 216, 219,
+};
+static const unsigned int lcd_sync_mux[] = {
+       LCDVSYN_MARK, LCDHSYN_MARK, LCDDCK_MARK, LCDDISP_MARK,
+};
+static const unsigned int lcd_sys_pins[] = {
+       /* CS, WR, RD, RS */
+       218, 216, 217, 219,
+};
+static const unsigned int lcd_sys_mux[] = {
+       LCDCS__MARK, LCDWR__MARK, LCDRD__MARK, LCDRS_MARK,
+};
+/* - LCD2 ------------------------------------------------------------------- */
+static const unsigned int lcd2_data8_pins[] = {
+       /* D[0:7] */
+       128, 129, 142, 143, 144, 145, 138, 139,
+};
+static const unsigned int lcd2_data8_mux[] = {
+       LCD2D0_MARK, LCD2D1_MARK, LCD2D2_MARK, LCD2D3_MARK,
+       LCD2D4_MARK, LCD2D5_MARK, LCD2D6_MARK, LCD2D7_MARK,
+};
+static const unsigned int lcd2_data9_pins[] = {
+       /* D[0:8] */
+       128, 129, 142, 143, 144, 145, 138, 139,
+       140,
+};
+static const unsigned int lcd2_data9_mux[] = {
+       LCD2D0_MARK, LCD2D1_MARK, LCD2D2_MARK, LCD2D3_MARK,
+       LCD2D4_MARK, LCD2D5_MARK, LCD2D6_MARK, LCD2D7_MARK,
+       LCD2D8_MARK,
+};
+static const unsigned int lcd2_data12_pins[] = {
+       /* D[0:12] */
+       128, 129, 142, 143, 144, 145, 138, 139,
+       140, 141, 130, 131,
+};
+static const unsigned int lcd2_data12_mux[] = {
+       LCD2D0_MARK, LCD2D1_MARK, LCD2D2_MARK, LCD2D3_MARK,
+       LCD2D4_MARK, LCD2D5_MARK, LCD2D6_MARK, LCD2D7_MARK,
+       LCD2D8_MARK, LCD2D9_MARK, LCD2D10_MARK, LCD2D11_MARK,
+};
+static const unsigned int lcd2_data16_pins[] = {
+       /* D[0:15] */
+       128, 129, 142, 143, 144, 145, 138, 139,
+       140, 141, 130, 131, 132, 133, 134, 135,
+};
+static const unsigned int lcd2_data16_mux[] = {
+       LCD2D0_MARK, LCD2D1_MARK, LCD2D2_MARK, LCD2D3_MARK,
+       LCD2D4_MARK, LCD2D5_MARK, LCD2D6_MARK, LCD2D7_MARK,
+       LCD2D8_MARK, LCD2D9_MARK, LCD2D10_MARK, LCD2D11_MARK,
+       LCD2D12_MARK, LCD2D13_MARK, LCD2D14_MARK, LCD2D15_MARK,
+};
+static const unsigned int lcd2_data18_pins[] = {
+       /* D[0:17] */
+       128, 129, 142, 143, 144, 145, 138, 139,
+       140, 141, 130, 131, 132, 133, 134, 135,
+       136, 137,
+};
+static const unsigned int lcd2_data18_mux[] = {
+       LCD2D0_MARK, LCD2D1_MARK, LCD2D2_MARK, LCD2D3_MARK,
+       LCD2D4_MARK, LCD2D5_MARK, LCD2D6_MARK, LCD2D7_MARK,
+       LCD2D8_MARK, LCD2D9_MARK, LCD2D10_MARK, LCD2D11_MARK,
+       LCD2D12_MARK, LCD2D13_MARK, LCD2D14_MARK, LCD2D15_MARK,
+       LCD2D16_MARK, LCD2D17_MARK,
+};
+static const unsigned int lcd2_data24_pins[] = {
+       /* D[0:23] */
+       128, 129, 142, 143, 144, 145, 138, 139,
+       140, 141, 130, 131, 132, 133, 134, 135,
+       136, 137, 146, 147, 234, 235, 238, 239
+};
+static const unsigned int lcd2_data24_mux[] = {
+       LCD2D0_MARK, LCD2D1_MARK, LCD2D2_MARK, LCD2D3_MARK,
+       LCD2D4_MARK, LCD2D5_MARK, LCD2D6_MARK, LCD2D7_MARK,
+       LCD2D8_MARK, LCD2D9_MARK, LCD2D10_MARK, LCD2D11_MARK,
+       LCD2D12_MARK, LCD2D13_MARK, LCD2D14_MARK, LCD2D15_MARK,
+       LCD2D16_MARK, LCD2D17_MARK, LCD2D18_MARK, LCD2D19_MARK,
+       LCD2D20_MARK, LCD2D21_MARK, LCD2D22_MARK, LCD2D23_MARK,
+};
+static const unsigned int lcd2_sync_0_pins[] = {
+       /* VSYN, HSYN, DCK, DISP */
+       128, 129, 146, 145,
+};
+static const unsigned int lcd2_sync_0_mux[] = {
+       PORT128_LCD2VSYN_MARK, PORT129_LCD2HSYN_MARK,
+       LCD2DCK_MARK, PORT145_LCD2DISP_MARK,
+};
+static const unsigned int lcd2_sync_1_pins[] = {
+       /* VSYN, HSYN, DCK, DISP */
+       222, 221, 219, 217,
+};
+static const unsigned int lcd2_sync_1_mux[] = {
+       PORT222_LCD2VSYN_MARK, PORT221_LCD2HSYN_MARK,
+       LCD2DCK_2_MARK, PORT217_LCD2DISP_MARK,
+};
+static const unsigned int lcd2_sys_0_pins[] = {
+       /* CS, WR, RD, RS */
+       129, 146, 147, 145,
+};
+static const unsigned int lcd2_sys_0_mux[] = {
+       PORT129_LCD2CS__MARK, PORT146_LCD2WR__MARK,
+       LCD2RD__MARK, PORT145_LCD2RS_MARK,
+};
+static const unsigned int lcd2_sys_1_pins[] = {
+       /* CS, WR, RD, RS */
+       221, 219, 147, 217,
+};
+static const unsigned int lcd2_sys_1_mux[] = {
+       PORT221_LCD2CS__MARK, PORT219_LCD2WR__MARK,
+       LCD2RD__MARK, PORT217_LCD2RS_MARK,
+};
+/* - MMCIF ------------------------------------------------------------------ */
+static const unsigned int mmc0_data1_0_pins[] = {
+       /* D[0] */
+       271,
+};
+static const unsigned int mmc0_data1_0_mux[] = {
+       MMCD0_0_MARK,
+};
+static const unsigned int mmc0_data4_0_pins[] = {
+       /* D[0:3] */
+       271, 272, 273, 274,
+};
+static const unsigned int mmc0_data4_0_mux[] = {
+       MMCD0_0_MARK, MMCD0_1_MARK, MMCD0_2_MARK, MMCD0_3_MARK,
+};
+static const unsigned int mmc0_data8_0_pins[] = {
+       /* D[0:7] */
+       271, 272, 273, 274, 275, 276, 277, 278,
+};
+static const unsigned int mmc0_data8_0_mux[] = {
+       MMCD0_0_MARK, MMCD0_1_MARK, MMCD0_2_MARK, MMCD0_3_MARK,
+       MMCD0_4_MARK, MMCD0_5_MARK, MMCD0_6_MARK, MMCD0_7_MARK,
+};
+static const unsigned int mmc0_ctrl_0_pins[] = {
+       /* CMD, CLK */
+       279, 270,
+};
+static const unsigned int mmc0_ctrl_0_mux[] = {
+       MMCCMD0_MARK, MMCCLK0_MARK,
+};
 
-       /* Functions with pull-ups */
-       PINMUX_DATA(KEYIN0_PU_MARK, PORT66_FN2, PORT66_IN_PU),
-       PINMUX_DATA(KEYIN1_PU_MARK, PORT67_FN2, PORT67_IN_PU),
-       PINMUX_DATA(KEYIN2_PU_MARK, PORT68_FN2, PORT68_IN_PU),
-       PINMUX_DATA(KEYIN3_PU_MARK, PORT69_FN2, PORT69_IN_PU),
-       PINMUX_DATA(KEYIN4_PU_MARK, PORT70_FN2, PORT70_IN_PU),
-       PINMUX_DATA(KEYIN5_PU_MARK, PORT71_FN2, PORT71_IN_PU),
-       PINMUX_DATA(KEYIN6_PU_MARK, PORT72_FN2, PORT72_IN_PU),
-       PINMUX_DATA(KEYIN7_PU_MARK, PORT73_FN2, PORT73_IN_PU),
-
-       PINMUX_DATA(SDHICD0_PU_MARK,  PORT251_FN1, PORT251_IN_PU),
-       PINMUX_DATA(SDHID0_0_PU_MARK, PORT252_FN1, PORT252_IN_PU),
-       PINMUX_DATA(SDHID0_1_PU_MARK, PORT253_FN1, PORT253_IN_PU),
-       PINMUX_DATA(SDHID0_2_PU_MARK, PORT254_FN1, PORT254_IN_PU),
-       PINMUX_DATA(SDHID0_3_PU_MARK, PORT255_FN1, PORT255_IN_PU),
-       PINMUX_DATA(SDHICMD0_PU_MARK, PORT256_FN1, PORT256_IN_PU),
-       PINMUX_DATA(SDHIWP0_PU_MARK,  PORT257_FN1, PORT256_IN_PU),
-       PINMUX_DATA(SDHID1_0_PU_MARK, PORT259_FN1, PORT259_IN_PU),
-       PINMUX_DATA(SDHID1_1_PU_MARK, PORT260_FN1, PORT260_IN_PU),
-       PINMUX_DATA(SDHID1_2_PU_MARK, PORT261_FN1, PORT261_IN_PU),
-       PINMUX_DATA(SDHID1_3_PU_MARK, PORT262_FN1, PORT262_IN_PU),
-       PINMUX_DATA(SDHICMD1_PU_MARK, PORT263_FN1, PORT263_IN_PU),
-       PINMUX_DATA(SDHID2_0_PU_MARK, PORT265_FN1, PORT265_IN_PU),
-       PINMUX_DATA(SDHID2_1_PU_MARK, PORT266_FN1, PORT266_IN_PU),
-       PINMUX_DATA(SDHID2_2_PU_MARK, PORT267_FN1, PORT267_IN_PU),
-       PINMUX_DATA(SDHID2_3_PU_MARK, PORT268_FN1, PORT268_IN_PU),
-       PINMUX_DATA(SDHICMD2_PU_MARK, PORT269_FN1, PORT269_IN_PU),
-
-       PINMUX_DATA(MMCCMD0_PU_MARK, PORT279_FN1, PORT279_IN_PU,
-               MSEL4CR_MSEL15_0),
-       PINMUX_DATA(MMCCMD1_PU_MARK, PORT297_FN2, PORT297_IN_PU,
-               MSEL4CR_MSEL15_1),
-
-       PINMUX_DATA(MMCD0_0_PU_MARK,
-                   PORT271_FN1, PORT271_IN_PU, MSEL4CR_MSEL15_0),
-       PINMUX_DATA(MMCD0_1_PU_MARK,
-                   PORT272_FN1, PORT272_IN_PU, MSEL4CR_MSEL15_0),
-       PINMUX_DATA(MMCD0_2_PU_MARK,
-                   PORT273_FN1, PORT273_IN_PU, MSEL4CR_MSEL15_0),
-       PINMUX_DATA(MMCD0_3_PU_MARK,
-                   PORT274_FN1, PORT274_IN_PU, MSEL4CR_MSEL15_0),
-       PINMUX_DATA(MMCD0_4_PU_MARK,
-                   PORT275_FN1, PORT275_IN_PU, MSEL4CR_MSEL15_0),
-       PINMUX_DATA(MMCD0_5_PU_MARK,
-                   PORT276_FN1, PORT276_IN_PU, MSEL4CR_MSEL15_0),
-       PINMUX_DATA(MMCD0_6_PU_MARK,
-                   PORT277_FN1, PORT277_IN_PU, MSEL4CR_MSEL15_0),
-       PINMUX_DATA(MMCD0_7_PU_MARK,
-                   PORT278_FN1, PORT278_IN_PU, MSEL4CR_MSEL15_0),
-
-       PINMUX_DATA(FSIBISLD_PU_MARK, PORT39_FN1, PORT39_IN_PU),
-       PINMUX_DATA(FSIACK_PU_MARK, PORT49_FN1, PORT49_IN_PU),
-       PINMUX_DATA(FSIAILR_PU_MARK, PORT50_FN5, PORT50_IN_PU),
-       PINMUX_DATA(FSIAIBT_PU_MARK, PORT51_FN5, PORT51_IN_PU),
-       PINMUX_DATA(FSIAISLD_PU_MARK, PORT55_FN1, PORT55_IN_PU),
-};
-
-static struct pinmux_gpio pinmux_gpios[] = {
-       GPIO_PORT_ALL(),
+static const unsigned int mmc0_data1_1_pins[] = {
+       /* D[0] */
+       305,
+};
+static const unsigned int mmc0_data1_1_mux[] = {
+       MMCD1_0_MARK,
+};
+static const unsigned int mmc0_data4_1_pins[] = {
+       /* D[0:3] */
+       305, 304, 303, 302,
+};
+static const unsigned int mmc0_data4_1_mux[] = {
+       MMCD1_0_MARK, MMCD1_1_MARK, MMCD1_2_MARK, MMCD1_3_MARK,
+};
+static const unsigned int mmc0_data8_1_pins[] = {
+       /* D[0:7] */
+       305, 304, 303, 302, 301, 300, 299, 298,
+};
+static const unsigned int mmc0_data8_1_mux[] = {
+       MMCD1_0_MARK, MMCD1_1_MARK, MMCD1_2_MARK, MMCD1_3_MARK,
+       MMCD1_4_MARK, MMCD1_5_MARK, MMCD1_6_MARK, MMCD1_7_MARK,
+};
+static const unsigned int mmc0_ctrl_1_pins[] = {
+       /* CMD, CLK */
+       297, 289,
+};
+static const unsigned int mmc0_ctrl_1_mux[] = {
+       MMCCMD1_MARK, MMCCLK1_MARK,
+};
+/* - SCIFA0 ----------------------------------------------------------------- */
+static const unsigned int scifa0_data_pins[] = {
+       /* RXD, TXD */
+       43, 17,
+};
+static const unsigned int scifa0_data_mux[] = {
+       SCIFA0_RXD_MARK, SCIFA0_TXD_MARK,
+};
+static const unsigned int scifa0_clk_pins[] = {
+       /* SCK */
+       16,
+};
+static const unsigned int scifa0_clk_mux[] = {
+       SCIFA0_SCK_MARK,
+};
+static const unsigned int scifa0_ctrl_pins[] = {
+       /* RTS, CTS */
+       42, 44,
+};
+static const unsigned int scifa0_ctrl_mux[] = {
+       SCIFA0_RTS__MARK, SCIFA0_CTS__MARK,
+};
+/* - SCIFA1 ----------------------------------------------------------------- */
+static const unsigned int scifa1_data_pins[] = {
+       /* RXD, TXD */
+       228, 225,
+};
+static const unsigned int scifa1_data_mux[] = {
+       SCIFA1_RXD_MARK, SCIFA1_TXD_MARK,
+};
+static const unsigned int scifa1_clk_pins[] = {
+       /* SCK */
+       226,
+};
+static const unsigned int scifa1_clk_mux[] = {
+       SCIFA1_SCK_MARK,
+};
+static const unsigned int scifa1_ctrl_pins[] = {
+       /* RTS, CTS */
+       227, 229,
+};
+static const unsigned int scifa1_ctrl_mux[] = {
+       SCIFA1_RTS__MARK, SCIFA1_CTS__MARK,
+};
+/* - SCIFA2 ----------------------------------------------------------------- */
+static const unsigned int scifa2_data_0_pins[] = {
+       /* RXD, TXD */
+       155, 154,
+};
+static const unsigned int scifa2_data_0_mux[] = {
+       SCIFA2_RXD1_MARK, SCIFA2_TXD1_MARK,
+};
+static const unsigned int scifa2_clk_0_pins[] = {
+       /* SCK */
+       158,
+};
+static const unsigned int scifa2_clk_0_mux[] = {
+       SCIFA2_SCK1_MARK,
+};
+static const unsigned int scifa2_ctrl_0_pins[] = {
+       /* RTS, CTS */
+       156, 157,
+};
+static const unsigned int scifa2_ctrl_0_mux[] = {
+       SCIFA2_RTS1__MARK, SCIFA2_CTS1__MARK,
+};
+static const unsigned int scifa2_data_1_pins[] = {
+       /* RXD, TXD */
+       233, 230,
+};
+static const unsigned int scifa2_data_1_mux[] = {
+       SCIFA2_RXD2_MARK, SCIFA2_TXD2_MARK,
+};
+static const unsigned int scifa2_clk_1_pins[] = {
+       /* SCK */
+       232,
+};
+static const unsigned int scifa2_clk_1_mux[] = {
+       SCIFA2_SCK2_MARK,
+};
+static const unsigned int scifa2_ctrl_1_pins[] = {
+       /* RTS, CTS */
+       234, 231,
+};
+static const unsigned int scifa2_ctrl_1_mux[] = {
+       SCIFA2_RTS2__MARK, SCIFA2_CTS2__MARK,
+};
+/* - SCIFA3 ----------------------------------------------------------------- */
+static const unsigned int scifa3_data_pins[] = {
+       /* RXD, TXD */
+       108, 110,
+};
+static const unsigned int scifa3_data_mux[] = {
+       SCIFA3_RXD_MARK, SCIFA3_TXD_MARK,
+};
+static const unsigned int scifa3_ctrl_pins[] = {
+       /* RTS, CTS */
+       109, 107,
+};
+static const unsigned int scifa3_ctrl_mux[] = {
+       SCIFA3_RTS__MARK, SCIFA3_CTS__MARK,
+};
+/* - SCIFA4 ----------------------------------------------------------------- */
+static const unsigned int scifa4_data_pins[] = {
+       /* RXD, TXD */
+       33, 32,
+};
+static const unsigned int scifa4_data_mux[] = {
+       SCIFA4_RXD_MARK, SCIFA4_TXD_MARK,
+};
+static const unsigned int scifa4_ctrl_pins[] = {
+       /* RTS, CTS */
+       34, 35,
+};
+static const unsigned int scifa4_ctrl_mux[] = {
+       SCIFA4_RTS__MARK, SCIFA4_CTS__MARK,
+};
+/* - SCIFA5 ----------------------------------------------------------------- */
+static const unsigned int scifa5_data_0_pins[] = {
+       /* RXD, TXD */
+       246, 247,
+};
+static const unsigned int scifa5_data_0_mux[] = {
+       PORT246_SCIFA5_RXD_MARK, PORT247_SCIFA5_TXD_MARK,
+};
+static const unsigned int scifa5_clk_0_pins[] = {
+       /* SCK */
+       248,
+};
+static const unsigned int scifa5_clk_0_mux[] = {
+       PORT248_SCIFA5_SCK_MARK,
+};
+static const unsigned int scifa5_ctrl_0_pins[] = {
+       /* RTS, CTS */
+       245, 244,
+};
+static const unsigned int scifa5_ctrl_0_mux[] = {
+       PORT245_SCIFA5_RTS__MARK, PORT244_SCIFA5_CTS__MARK,
+};
+static const unsigned int scifa5_data_1_pins[] = {
+       /* RXD, TXD */
+       195, 196,
+};
+static const unsigned int scifa5_data_1_mux[] = {
+       PORT195_SCIFA5_RXD_MARK, PORT196_SCIFA5_TXD_MARK,
+};
+static const unsigned int scifa5_clk_1_pins[] = {
+       /* SCK */
+       197,
+};
+static const unsigned int scifa5_clk_1_mux[] = {
+       PORT197_SCIFA5_SCK_MARK,
+};
+static const unsigned int scifa5_ctrl_1_pins[] = {
+       /* RTS, CTS */
+       194, 193,
+};
+static const unsigned int scifa5_ctrl_1_mux[] = {
+       PORT194_SCIFA5_RTS__MARK, PORT193_SCIFA5_CTS__MARK,
+};
+static const unsigned int scifa5_data_2_pins[] = {
+       /* RXD, TXD */
+       162, 160,
+};
+static const unsigned int scifa5_data_2_mux[] = {
+       PORT162_SCIFA5_RXD_MARK, PORT160_SCIFA5_TXD_MARK,
+};
+static const unsigned int scifa5_clk_2_pins[] = {
+       /* SCK */
+       159,
+};
+static const unsigned int scifa5_clk_2_mux[] = {
+       PORT159_SCIFA5_SCK_MARK,
+};
+static const unsigned int scifa5_ctrl_2_pins[] = {
+       /* RTS, CTS */
+       163, 161,
+};
+static const unsigned int scifa5_ctrl_2_mux[] = {
+       PORT163_SCIFA5_RTS__MARK, PORT161_SCIFA5_CTS__MARK,
+};
+/* - SCIFA6 ----------------------------------------------------------------- */
+static const unsigned int scifa6_pins[] = {
+       /* TXD */
+       240,
+};
+static const unsigned int scifa6_mux[] = {
+       SCIFA6_TXD_MARK,
+};
+/* - SCIFA7 ----------------------------------------------------------------- */
+static const unsigned int scifa7_data_pins[] = {
+       /* RXD, TXD */
+       12, 18,
+};
+static const unsigned int scifa7_data_mux[] = {
+       SCIFA7_RXD_MARK, SCIFA7_TXD_MARK,
+};
+static const unsigned int scifa7_ctrl_pins[] = {
+       /* RTS, CTS */
+       19, 13,
+};
+static const unsigned int scifa7_ctrl_mux[] = {
+       SCIFA7_RTS__MARK, SCIFA7_CTS__MARK,
+};
+/* - SCIFB ------------------------------------------------------------------ */
+static const unsigned int scifb_data_0_pins[] = {
+       /* RXD, TXD */
+       162, 160,
+};
+static const unsigned int scifb_data_0_mux[] = {
+       PORT162_SCIFB_RXD_MARK, PORT160_SCIFB_TXD_MARK,
+};
+static const unsigned int scifb_clk_0_pins[] = {
+       /* SCK */
+       159,
+};
+static const unsigned int scifb_clk_0_mux[] = {
+       PORT159_SCIFB_SCK_MARK,
+};
+static const unsigned int scifb_ctrl_0_pins[] = {
+       /* RTS, CTS */
+       163, 161,
+};
+static const unsigned int scifb_ctrl_0_mux[] = {
+       PORT163_SCIFB_RTS__MARK, PORT161_SCIFB_CTS__MARK,
+};
+static const unsigned int scifb_data_1_pins[] = {
+       /* RXD, TXD */
+       246, 247,
+};
+static const unsigned int scifb_data_1_mux[] = {
+       PORT246_SCIFB_RXD_MARK, PORT247_SCIFB_TXD_MARK,
+};
+static const unsigned int scifb_clk_1_pins[] = {
+       /* SCK */
+       248,
+};
+static const unsigned int scifb_clk_1_mux[] = {
+       PORT248_SCIFB_SCK_MARK,
+};
+static const unsigned int scifb_ctrl_1_pins[] = {
+       /* RTS, CTS */
+       245, 244,
+};
+static const unsigned int scifb_ctrl_1_mux[] = {
+       PORT245_SCIFB_RTS__MARK, PORT244_SCIFB_CTS__MARK,
+};
+/* - SDHI0 ------------------------------------------------------------------ */
+static const unsigned int sdhi0_data1_pins[] = {
+       /* D0 */
+       252,
+};
+static const unsigned int sdhi0_data1_mux[] = {
+       SDHID0_0_MARK,
+};
+static const unsigned int sdhi0_data4_pins[] = {
+       /* D[0:3] */
+       252, 253, 254, 255,
+};
+static const unsigned int sdhi0_data4_mux[] = {
+       SDHID0_0_MARK, SDHID0_1_MARK, SDHID0_2_MARK, SDHID0_3_MARK,
+};
+static const unsigned int sdhi0_ctrl_pins[] = {
+       /* CMD, CLK */
+       256, 250,
+};
+static const unsigned int sdhi0_ctrl_mux[] = {
+       SDHICMD0_MARK, SDHICLK0_MARK,
+};
+static const unsigned int sdhi0_cd_pins[] = {
+       /* CD */
+       251,
+};
+static const unsigned int sdhi0_cd_mux[] = {
+       SDHICD0_MARK,
+};
+static const unsigned int sdhi0_wp_pins[] = {
+       /* WP */
+       257,
+};
+static const unsigned int sdhi0_wp_mux[] = {
+       SDHIWP0_MARK,
+};
+/* - SDHI1 ------------------------------------------------------------------ */
+static const unsigned int sdhi1_data1_pins[] = {
+       /* D0 */
+       259,
+};
+static const unsigned int sdhi1_data1_mux[] = {
+       SDHID1_0_MARK,
+};
+static const unsigned int sdhi1_data4_pins[] = {
+       /* D[0:3] */
+       259, 260, 261, 262,
+};
+static const unsigned int sdhi1_data4_mux[] = {
+       SDHID1_0_MARK, SDHID1_1_MARK, SDHID1_2_MARK, SDHID1_3_MARK,
+};
+static const unsigned int sdhi1_ctrl_pins[] = {
+       /* CMD, CLK */
+       263, 258,
+};
+static const unsigned int sdhi1_ctrl_mux[] = {
+       SDHICMD1_MARK, SDHICLK1_MARK,
+};
+/* - SDHI2 ------------------------------------------------------------------ */
+static const unsigned int sdhi2_data1_pins[] = {
+       /* D0 */
+       265,
+};
+static const unsigned int sdhi2_data1_mux[] = {
+       SDHID2_0_MARK,
+};
+static const unsigned int sdhi2_data4_pins[] = {
+       /* D[0:3] */
+       265, 266, 267, 268,
+};
+static const unsigned int sdhi2_data4_mux[] = {
+       SDHID2_0_MARK, SDHID2_1_MARK, SDHID2_2_MARK, SDHID2_3_MARK,
+};
+static const unsigned int sdhi2_ctrl_pins[] = {
+       /* CMD, CLK */
+       269, 264,
+};
+static const unsigned int sdhi2_ctrl_mux[] = {
+       SDHICMD2_MARK, SDHICLK2_MARK,
+};
+/* - USB -------------------------------------------------------------------- */
+static const unsigned int usb_vbus_pins[] = {
+       /* VBUS */
+       0,
+};
+static const unsigned int usb_vbus_mux[] = {
+       VBUS_0_MARK,
+};
+
+static const struct sh_pfc_pin_group pinmux_groups[] = {
+       SH_PFC_PIN_GROUP(bsc_data_0_7),
+       SH_PFC_PIN_GROUP(bsc_data_8_15),
+       SH_PFC_PIN_GROUP(bsc_cs4),
+       SH_PFC_PIN_GROUP(bsc_cs5_a),
+       SH_PFC_PIN_GROUP(bsc_cs5_b),
+       SH_PFC_PIN_GROUP(bsc_cs6_a),
+       SH_PFC_PIN_GROUP(bsc_cs6_b),
+       SH_PFC_PIN_GROUP(bsc_rd),
+       SH_PFC_PIN_GROUP(bsc_rdwr_0),
+       SH_PFC_PIN_GROUP(bsc_rdwr_1),
+       SH_PFC_PIN_GROUP(bsc_rdwr_2),
+       SH_PFC_PIN_GROUP(bsc_we0),
+       SH_PFC_PIN_GROUP(bsc_we1),
+       SH_PFC_PIN_GROUP(fsia_mclk_in),
+       SH_PFC_PIN_GROUP(fsia_mclk_out),
+       SH_PFC_PIN_GROUP(fsia_sclk_in),
+       SH_PFC_PIN_GROUP(fsia_sclk_out),
+       SH_PFC_PIN_GROUP(fsia_data_in),
+       SH_PFC_PIN_GROUP(fsia_data_out),
+       SH_PFC_PIN_GROUP(fsia_spdif),
+       SH_PFC_PIN_GROUP(fsib_mclk_in),
+       SH_PFC_PIN_GROUP(fsib_mclk_out),
+       SH_PFC_PIN_GROUP(fsib_sclk_in),
+       SH_PFC_PIN_GROUP(fsib_sclk_out),
+       SH_PFC_PIN_GROUP(fsib_data_in),
+       SH_PFC_PIN_GROUP(fsib_data_out),
+       SH_PFC_PIN_GROUP(fsib_spdif),
+       SH_PFC_PIN_GROUP(fsic_mclk_in),
+       SH_PFC_PIN_GROUP(fsic_mclk_out),
+       SH_PFC_PIN_GROUP(fsic_sclk_in),
+       SH_PFC_PIN_GROUP(fsic_sclk_out),
+       SH_PFC_PIN_GROUP(fsic_data_in),
+       SH_PFC_PIN_GROUP(fsic_data_out),
+       SH_PFC_PIN_GROUP(fsic_spdif_0),
+       SH_PFC_PIN_GROUP(fsic_spdif_1),
+       SH_PFC_PIN_GROUP(fsid_sclk_in),
+       SH_PFC_PIN_GROUP(fsid_sclk_out),
+       SH_PFC_PIN_GROUP(fsid_data_in),
+       SH_PFC_PIN_GROUP(i2c2_0),
+       SH_PFC_PIN_GROUP(i2c2_1),
+       SH_PFC_PIN_GROUP(i2c2_2),
+       SH_PFC_PIN_GROUP(i2c3_0),
+       SH_PFC_PIN_GROUP(i2c3_1),
+       SH_PFC_PIN_GROUP(i2c3_2),
+       SH_PFC_PIN_GROUP(irda_0),
+       SH_PFC_PIN_GROUP(irda_1),
+       SH_PFC_PIN_GROUP(keysc_in5),
+       SH_PFC_PIN_GROUP(keysc_in6),
+       SH_PFC_PIN_GROUP(keysc_in7),
+       SH_PFC_PIN_GROUP(keysc_in8),
+       SH_PFC_PIN_GROUP(keysc_out04),
+       SH_PFC_PIN_GROUP(keysc_out5),
+       SH_PFC_PIN_GROUP(keysc_out6_0),
+       SH_PFC_PIN_GROUP(keysc_out6_1),
+       SH_PFC_PIN_GROUP(keysc_out6_2),
+       SH_PFC_PIN_GROUP(keysc_out7_0),
+       SH_PFC_PIN_GROUP(keysc_out7_1),
+       SH_PFC_PIN_GROUP(keysc_out7_2),
+       SH_PFC_PIN_GROUP(keysc_out8_0),
+       SH_PFC_PIN_GROUP(keysc_out8_1),
+       SH_PFC_PIN_GROUP(keysc_out8_2),
+       SH_PFC_PIN_GROUP(keysc_out9_0),
+       SH_PFC_PIN_GROUP(keysc_out9_1),
+       SH_PFC_PIN_GROUP(keysc_out9_2),
+       SH_PFC_PIN_GROUP(keysc_out10_0),
+       SH_PFC_PIN_GROUP(keysc_out10_1),
+       SH_PFC_PIN_GROUP(keysc_out11_0),
+       SH_PFC_PIN_GROUP(keysc_out11_1),
+       SH_PFC_PIN_GROUP(lcd_data8),
+       SH_PFC_PIN_GROUP(lcd_data9),
+       SH_PFC_PIN_GROUP(lcd_data12),
+       SH_PFC_PIN_GROUP(lcd_data16),
+       SH_PFC_PIN_GROUP(lcd_data18),
+       SH_PFC_PIN_GROUP(lcd_data24),
+       SH_PFC_PIN_GROUP(lcd_display),
+       SH_PFC_PIN_GROUP(lcd_lclk),
+       SH_PFC_PIN_GROUP(lcd_sync),
+       SH_PFC_PIN_GROUP(lcd_sys),
+       SH_PFC_PIN_GROUP(lcd2_data8),
+       SH_PFC_PIN_GROUP(lcd2_data9),
+       SH_PFC_PIN_GROUP(lcd2_data12),
+       SH_PFC_PIN_GROUP(lcd2_data16),
+       SH_PFC_PIN_GROUP(lcd2_data18),
+       SH_PFC_PIN_GROUP(lcd2_data24),
+       SH_PFC_PIN_GROUP(lcd2_sync_0),
+       SH_PFC_PIN_GROUP(lcd2_sync_1),
+       SH_PFC_PIN_GROUP(lcd2_sys_0),
+       SH_PFC_PIN_GROUP(lcd2_sys_1),
+       SH_PFC_PIN_GROUP(mmc0_data1_0),
+       SH_PFC_PIN_GROUP(mmc0_data4_0),
+       SH_PFC_PIN_GROUP(mmc0_data8_0),
+       SH_PFC_PIN_GROUP(mmc0_ctrl_0),
+       SH_PFC_PIN_GROUP(mmc0_data1_1),
+       SH_PFC_PIN_GROUP(mmc0_data4_1),
+       SH_PFC_PIN_GROUP(mmc0_data8_1),
+       SH_PFC_PIN_GROUP(mmc0_ctrl_1),
+       SH_PFC_PIN_GROUP(scifa0_data),
+       SH_PFC_PIN_GROUP(scifa0_clk),
+       SH_PFC_PIN_GROUP(scifa0_ctrl),
+       SH_PFC_PIN_GROUP(scifa1_data),
+       SH_PFC_PIN_GROUP(scifa1_clk),
+       SH_PFC_PIN_GROUP(scifa1_ctrl),
+       SH_PFC_PIN_GROUP(scifa2_data_0),
+       SH_PFC_PIN_GROUP(scifa2_clk_0),
+       SH_PFC_PIN_GROUP(scifa2_ctrl_0),
+       SH_PFC_PIN_GROUP(scifa2_data_1),
+       SH_PFC_PIN_GROUP(scifa2_clk_1),
+       SH_PFC_PIN_GROUP(scifa2_ctrl_1),
+       SH_PFC_PIN_GROUP(scifa3_data),
+       SH_PFC_PIN_GROUP(scifa3_ctrl),
+       SH_PFC_PIN_GROUP(scifa4_data),
+       SH_PFC_PIN_GROUP(scifa4_ctrl),
+       SH_PFC_PIN_GROUP(scifa5_data_0),
+       SH_PFC_PIN_GROUP(scifa5_clk_0),
+       SH_PFC_PIN_GROUP(scifa5_ctrl_0),
+       SH_PFC_PIN_GROUP(scifa5_data_1),
+       SH_PFC_PIN_GROUP(scifa5_clk_1),
+       SH_PFC_PIN_GROUP(scifa5_ctrl_1),
+       SH_PFC_PIN_GROUP(scifa5_data_2),
+       SH_PFC_PIN_GROUP(scifa5_clk_2),
+       SH_PFC_PIN_GROUP(scifa5_ctrl_2),
+       SH_PFC_PIN_GROUP(scifa6),
+       SH_PFC_PIN_GROUP(scifa7_data),
+       SH_PFC_PIN_GROUP(scifa7_ctrl),
+       SH_PFC_PIN_GROUP(scifb_data_0),
+       SH_PFC_PIN_GROUP(scifb_clk_0),
+       SH_PFC_PIN_GROUP(scifb_ctrl_0),
+       SH_PFC_PIN_GROUP(scifb_data_1),
+       SH_PFC_PIN_GROUP(scifb_clk_1),
+       SH_PFC_PIN_GROUP(scifb_ctrl_1),
+       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(sdhi2_data1),
+       SH_PFC_PIN_GROUP(sdhi2_data4),
+       SH_PFC_PIN_GROUP(sdhi2_ctrl),
+       SH_PFC_PIN_GROUP(usb_vbus),
+};
+
+static const char * const bsc_groups[] = {
+       "bsc_data_0_7",
+       "bsc_data_8_15",
+       "bsc_cs4",
+       "bsc_cs5_a",
+       "bsc_cs5_b",
+       "bsc_cs6_a",
+       "bsc_cs6_b",
+       "bsc_rd",
+       "bsc_rdwr_0",
+       "bsc_rdwr_1",
+       "bsc_rdwr_2",
+       "bsc_we0",
+       "bsc_we1",
+};
+
+static const char * const fsia_groups[] = {
+       "fsia_mclk_in",
+       "fsia_mclk_out",
+       "fsia_sclk_in",
+       "fsia_sclk_out",
+       "fsia_data_in",
+       "fsia_data_out",
+       "fsia_spdif",
+};
+
+static const char * const fsib_groups[] = {
+       "fsib_mclk_in",
+       "fsib_mclk_out",
+       "fsib_sclk_in",
+       "fsib_sclk_out",
+       "fsib_data_in",
+       "fsib_data_out",
+       "fsib_spdif",
+};
+
+static const char * const fsic_groups[] = {
+       "fsic_mclk_in",
+       "fsic_mclk_out",
+       "fsic_sclk_in",
+       "fsic_sclk_out",
+       "fsic_data_in",
+       "fsic_data_out",
+       "fsic_spdif",
+};
+
+static const char * const fsid_groups[] = {
+       "fsid_sclk_in",
+       "fsid_sclk_out",
+       "fsid_data_in",
+};
+
+static const char * const i2c2_groups[] = {
+       "i2c2_0",
+       "i2c2_1",
+       "i2c2_2",
+};
+
+static const char * const i2c3_groups[] = {
+       "i2c3_0",
+       "i2c3_1",
+       "i2c3_2",
+};
+
+static const char * const irda_groups[] = {
+       "irda_0",
+       "irda_1",
+};
 
+static const char * const keysc_groups[] = {
+       "keysc_in5",
+       "keysc_in6",
+       "keysc_in7",
+       "keysc_in8",
+       "keysc_out04",
+       "keysc_out5",
+       "keysc_out6_0",
+       "keysc_out6_1",
+       "keysc_out6_2",
+       "keysc_out7_0",
+       "keysc_out7_1",
+       "keysc_out7_2",
+       "keysc_out8_0",
+       "keysc_out8_1",
+       "keysc_out8_2",
+       "keysc_out9_0",
+       "keysc_out9_1",
+       "keysc_out9_2",
+       "keysc_out10_0",
+       "keysc_out10_1",
+       "keysc_out11_0",
+       "keysc_out11_1",
+};
+
+static const char * const lcd_groups[] = {
+       "lcd_data8",
+       "lcd_data9",
+       "lcd_data12",
+       "lcd_data16",
+       "lcd_data18",
+       "lcd_data24",
+       "lcd_display",
+       "lcd_lclk",
+       "lcd_sync",
+       "lcd_sys",
+};
+
+static const char * const lcd2_groups[] = {
+       "lcd2_data8",
+       "lcd2_data9",
+       "lcd2_data12",
+       "lcd2_data16",
+       "lcd2_data18",
+       "lcd2_data24",
+       "lcd2_sync_0",
+       "lcd2_sync_1",
+       "lcd2_sys_0",
+       "lcd2_sys_1",
+};
+
+static const char * const mmc0_groups[] = {
+       "mmc0_data1_0",
+       "mmc0_data4_0",
+       "mmc0_data8_0",
+       "mmc0_ctrl_0",
+       "mmc0_data1_1",
+       "mmc0_data4_1",
+       "mmc0_data8_1",
+       "mmc0_ctrl_1",
+};
+
+static const char * const scifa0_groups[] = {
+       "scifa0_data",
+       "scifa0_clk",
+       "scifa0_ctrl",
+};
+
+static const char * const scifa1_groups[] = {
+       "scifa1_data",
+       "scifa1_clk",
+       "scifa1_ctrl",
+};
+
+static const char * const scifa2_groups[] = {
+       "scifa2_data_0",
+       "scifa2_clk_0",
+       "scifa2_ctrl_0",
+       "scifa2_data_1",
+       "scifa2_clk_1",
+       "scifa2_ctrl_1",
+};
+
+static const char * const scifa3_groups[] = {
+       "scifa3_data",
+       "scifa3_ctrl",
+};
+
+static const char * const scifa4_groups[] = {
+       "scifa4_data",
+       "scifa4_ctrl",
+};
+
+static const char * const scifa5_groups[] = {
+       "scifa5_data_0",
+       "scifa5_clk_0",
+       "scifa5_ctrl_0",
+       "scifa5_data_1",
+       "scifa5_clk_1",
+       "scifa5_ctrl_1",
+       "scifa5_data_2",
+       "scifa5_clk_2",
+       "scifa5_ctrl_2",
+};
+
+static const char * const scifa6_groups[] = {
+       "scifa6",
+};
+
+static const char * const scifa7_groups[] = {
+       "scifa7_data",
+       "scifa7_ctrl",
+};
+
+static const char * const scifb_groups[] = {
+       "scifb_data_0",
+       "scifb_clk_0",
+       "scifb_ctrl_0",
+       "scifb_data_1",
+       "scifb_clk_1",
+       "scifb_ctrl_1",
+};
+
+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",
+};
+
+static const char * const sdhi2_groups[] = {
+       "sdhi2_data1",
+       "sdhi2_data4",
+       "sdhi2_ctrl",
+};
+
+static const char * const usb_groups[] = {
+       "usb_vbus",
+};
+
+static const struct sh_pfc_function pinmux_functions[] = {
+       SH_PFC_FUNCTION(bsc),
+       SH_PFC_FUNCTION(fsia),
+       SH_PFC_FUNCTION(fsib),
+       SH_PFC_FUNCTION(fsic),
+       SH_PFC_FUNCTION(fsid),
+       SH_PFC_FUNCTION(i2c2),
+       SH_PFC_FUNCTION(i2c3),
+       SH_PFC_FUNCTION(irda),
+       SH_PFC_FUNCTION(keysc),
+       SH_PFC_FUNCTION(lcd),
+       SH_PFC_FUNCTION(lcd2),
+       SH_PFC_FUNCTION(mmc0),
+       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(scifa6),
+       SH_PFC_FUNCTION(scifa7),
+       SH_PFC_FUNCTION(scifb),
+       SH_PFC_FUNCTION(sdhi0),
+       SH_PFC_FUNCTION(sdhi1),
+       SH_PFC_FUNCTION(sdhi2),
+       SH_PFC_FUNCTION(usb),
+};
+
+#define PINMUX_FN_BASE GPIO_FN_GPI0
+
+static const struct pinmux_func pinmux_func_gpios[] = {
        /* Table 25-1 (Functions 0-7) */
-       GPIO_FN(VBUS_0),
        GPIO_FN(GPI0),
        GPIO_FN(GPI1),
        GPIO_FN(GPI2),
@@ -1556,19 +2948,12 @@ static struct pinmux_gpio pinmux_gpios[] = {
        GPIO_FN(GPI5),
        GPIO_FN(GPI6),
        GPIO_FN(GPI7),
-       GPIO_FN(SCIFA7_RXD),
-       GPIO_FN(SCIFA7_CTS_),
        GPIO_FN(GPO7), \
        GPIO_FN(MFG0_OUT2),
        GPIO_FN(GPO6), \
        GPIO_FN(MFG1_OUT2),
        GPIO_FN(GPO5), \
-       GPIO_FN(SCIFA0_SCK), \
-       GPIO_FN(FSICOSLDT3), \
        GPIO_FN(PORT16_VIO_CKOR),
-       GPIO_FN(SCIFA0_TXD),
-       GPIO_FN(SCIFA7_TXD),
-       GPIO_FN(SCIFA7_RTS_), \
        GPIO_FN(PORT19_VIO_CKO2),
        GPIO_FN(GPO0),
        GPIO_FN(GPO1),
@@ -1581,13 +2966,9 @@ static struct pinmux_gpio pinmux_gpios[] = {
        GPIO_FN(VINT),
        GPIO_FN(TCKON),
        GPIO_FN(XDVFS1), \
-       GPIO_FN(PORT27_I2C_SCL2), \
-       GPIO_FN(PORT27_I2C_SCL3), \
        GPIO_FN(MFG0_OUT1), \
        GPIO_FN(PORT27_IROUT),
        GPIO_FN(XDVFS2), \
-       GPIO_FN(PORT28_I2C_SDA2), \
-       GPIO_FN(PORT28_I2C_SDA3), \
        GPIO_FN(PORT28_TPU1TO1),
        GPIO_FN(SIM_RST), \
        GPIO_FN(PORT29_TPU1TO1),
@@ -1595,140 +2976,53 @@ static struct pinmux_gpio pinmux_gpios[] = {
        GPIO_FN(PORT30_VIO_CKOR),
        GPIO_FN(SIM_D), \
        GPIO_FN(PORT31_IROUT),
-       GPIO_FN(SCIFA4_TXD),
-       GPIO_FN(SCIFA4_RXD), \
        GPIO_FN(XWUP),
-       GPIO_FN(SCIFA4_RTS_),
-       GPIO_FN(SCIFA4_CTS_),
-       GPIO_FN(FSIBOBT), \
-       GPIO_FN(FSIBIBT),
-       GPIO_FN(FSIBOLR), \
-       GPIO_FN(FSIBILR),
-       GPIO_FN(FSIBOSLD),
-       GPIO_FN(FSIBISLD),
        GPIO_FN(VACK),
        GPIO_FN(XTAL1L),
-       GPIO_FN(SCIFA0_RTS_), \
-       GPIO_FN(FSICOSLDT2),
-       GPIO_FN(SCIFA0_RXD),
-       GPIO_FN(SCIFA0_CTS_), \
-       GPIO_FN(FSICOSLDT1),
-       GPIO_FN(FSICOBT), \
-       GPIO_FN(FSICIBT), \
-       GPIO_FN(FSIDOBT), \
-       GPIO_FN(FSIDIBT),
-       GPIO_FN(FSICOLR), \
-       GPIO_FN(FSICILR), \
-       GPIO_FN(FSIDOLR), \
-       GPIO_FN(FSIDILR),
-       GPIO_FN(FSICOSLD), \
-       GPIO_FN(PORT47_FSICSPDIF),
-       GPIO_FN(FSICISLD), \
-       GPIO_FN(FSIDISLD),
-       GPIO_FN(FSIACK), \
-       GPIO_FN(PORT49_IRDA_OUT), \
        GPIO_FN(PORT49_IROUT), \
-       GPIO_FN(FSIAOMC),
-       GPIO_FN(FSIAOLR), \
        GPIO_FN(BBIF2_TSYNC2), \
        GPIO_FN(TPU2TO2), \
-       GPIO_FN(FSIAILR),
 
-       GPIO_FN(FSIAOBT), \
        GPIO_FN(BBIF2_TSCK2), \
        GPIO_FN(TPU2TO3), \
-       GPIO_FN(FSIAIBT),
-       GPIO_FN(FSIAOSLD), \
        GPIO_FN(BBIF2_TXD2),
-       GPIO_FN(FSIASPDIF), \
-       GPIO_FN(PORT53_IRDA_IN), \
        GPIO_FN(TPU3TO3), \
-       GPIO_FN(FSIBSPDIF), \
-       GPIO_FN(PORT53_FSICSPDIF),
-       GPIO_FN(FSIBCK), \
-       GPIO_FN(PORT54_IRDA_FIRSEL), \
        GPIO_FN(TPU3TO2), \
-       GPIO_FN(FSIBOMC), \
-       GPIO_FN(FSICCK), \
-       GPIO_FN(FSICOMC),
-       GPIO_FN(FSIAISLD), \
        GPIO_FN(TPU0TO0),
        GPIO_FN(A0), \
        GPIO_FN(BS_),
        GPIO_FN(A12), \
-       GPIO_FN(PORT58_KEYOUT7), \
        GPIO_FN(TPU4TO2),
        GPIO_FN(A13), \
-       GPIO_FN(PORT59_KEYOUT6), \
        GPIO_FN(TPU0TO1),
        GPIO_FN(A14), \
-       GPIO_FN(KEYOUT5),
        GPIO_FN(A15), \
-       GPIO_FN(KEYOUT4),
        GPIO_FN(A16), \
-       GPIO_FN(KEYOUT3), \
        GPIO_FN(MSIOF0_SS1),
        GPIO_FN(A17), \
-       GPIO_FN(KEYOUT2), \
        GPIO_FN(MSIOF0_TSYNC),
        GPIO_FN(A18), \
-       GPIO_FN(KEYOUT1), \
        GPIO_FN(MSIOF0_TSCK),
        GPIO_FN(A19), \
-       GPIO_FN(KEYOUT0), \
        GPIO_FN(MSIOF0_TXD),
        GPIO_FN(A20), \
-       GPIO_FN(KEYIN0), \
        GPIO_FN(MSIOF0_RSCK),
        GPIO_FN(A21), \
-       GPIO_FN(KEYIN1), \
        GPIO_FN(MSIOF0_RSYNC),
        GPIO_FN(A22), \
-       GPIO_FN(KEYIN2), \
        GPIO_FN(MSIOF0_MCK0),
        GPIO_FN(A23), \
-       GPIO_FN(KEYIN3), \
        GPIO_FN(MSIOF0_MCK1),
        GPIO_FN(A24), \
-       GPIO_FN(KEYIN4), \
        GPIO_FN(MSIOF0_RXD),
        GPIO_FN(A25), \
-       GPIO_FN(KEYIN5), \
        GPIO_FN(MSIOF0_SS2),
        GPIO_FN(A26), \
-       GPIO_FN(KEYIN6),
-       GPIO_FN(KEYIN7),
-       GPIO_FN(D0_NAF0),
-       GPIO_FN(D1_NAF1),
-       GPIO_FN(D2_NAF2),
-       GPIO_FN(D3_NAF3),
-       GPIO_FN(D4_NAF4),
-       GPIO_FN(D5_NAF5),
-       GPIO_FN(D6_NAF6),
-       GPIO_FN(D7_NAF7),
-       GPIO_FN(D8_NAF8),
-       GPIO_FN(D9_NAF9),
-       GPIO_FN(D10_NAF10),
-       GPIO_FN(D11_NAF11),
-       GPIO_FN(D12_NAF12),
-       GPIO_FN(D13_NAF13),
-       GPIO_FN(D14_NAF14),
-       GPIO_FN(D15_NAF15),
-       GPIO_FN(CS4_),
-       GPIO_FN(CS5A_), \
-       GPIO_FN(PORT91_RDWR),
-       GPIO_FN(CS5B_), \
        GPIO_FN(FCE1_),
-       GPIO_FN(CS6B_), \
        GPIO_FN(DACK0),
        GPIO_FN(FCE0_), \
-       GPIO_FN(CS6A_),
        GPIO_FN(WAIT_), \
        GPIO_FN(DREQ0),
-       GPIO_FN(RD__FSC),
-       GPIO_FN(WE0__FWE), \
-       GPIO_FN(RDWR_FWE),
-       GPIO_FN(WE1_),
        GPIO_FN(FRB),
        GPIO_FN(CKO),
        GPIO_FN(NBRSTOUT_),
@@ -1737,14 +3031,10 @@ static struct pinmux_gpio pinmux_gpios[] = {
        GPIO_FN(BBIF2_RXD),
        GPIO_FN(BBIF2_SYNC),
        GPIO_FN(BBIF2_SCK),
-       GPIO_FN(SCIFA3_CTS_), \
        GPIO_FN(MFG3_IN2),
-       GPIO_FN(SCIFA3_RXD), \
        GPIO_FN(MFG3_IN1),
        GPIO_FN(BBIF1_SS2), \
-       GPIO_FN(SCIFA3_RTS_), \
        GPIO_FN(MFG3_OUT1),
-       GPIO_FN(SCIFA3_TXD),
        GPIO_FN(HSI_RX_DATA), \
        GPIO_FN(BBIF1_RXD),
        GPIO_FN(HSI_TX_WAKE), \
@@ -1755,103 +3045,57 @@ static struct pinmux_gpio pinmux_gpios[] = {
        GPIO_FN(BBIF1_TXD),
        GPIO_FN(HSI_RX_READY), \
        GPIO_FN(BBIF1_RSCK), \
-       GPIO_FN(PORT115_I2C_SCL2), \
-       GPIO_FN(PORT115_I2C_SCL3),
        GPIO_FN(HSI_RX_WAKE), \
        GPIO_FN(BBIF1_RSYNC), \
-       GPIO_FN(PORT116_I2C_SDA2), \
-       GPIO_FN(PORT116_I2C_SDA3),
        GPIO_FN(HSI_RX_FLAG), \
        GPIO_FN(BBIF1_SS1), \
        GPIO_FN(BBIF1_FLOW),
        GPIO_FN(HSI_TX_FLAG),
        GPIO_FN(VIO_VD), \
-       GPIO_FN(PORT128_LCD2VSYN), \
        GPIO_FN(VIO2_VD), \
-       GPIO_FN(LCD2D0),
 
        GPIO_FN(VIO_HD), \
-       GPIO_FN(PORT129_LCD2HSYN), \
-       GPIO_FN(PORT129_LCD2CS_), \
        GPIO_FN(VIO2_HD), \
-       GPIO_FN(LCD2D1),
        GPIO_FN(VIO_D0), \
        GPIO_FN(PORT130_MSIOF2_RXD), \
-       GPIO_FN(LCD2D10),
        GPIO_FN(VIO_D1), \
-       GPIO_FN(PORT131_KEYOUT6), \
        GPIO_FN(PORT131_MSIOF2_SS1), \
-       GPIO_FN(PORT131_KEYOUT11), \
-       GPIO_FN(LCD2D11),
        GPIO_FN(VIO_D2), \
-       GPIO_FN(PORT132_KEYOUT7), \
        GPIO_FN(PORT132_MSIOF2_SS2), \
-       GPIO_FN(PORT132_KEYOUT10), \
-       GPIO_FN(LCD2D12),
        GPIO_FN(VIO_D3), \
        GPIO_FN(MSIOF2_TSYNC), \
-       GPIO_FN(LCD2D13),
        GPIO_FN(VIO_D4), \
        GPIO_FN(MSIOF2_TXD), \
-       GPIO_FN(LCD2D14),
        GPIO_FN(VIO_D5), \
        GPIO_FN(MSIOF2_TSCK), \
-       GPIO_FN(LCD2D15),
        GPIO_FN(VIO_D6), \
-       GPIO_FN(PORT136_KEYOUT8), \
-       GPIO_FN(LCD2D16),
        GPIO_FN(VIO_D7), \
-       GPIO_FN(PORT137_KEYOUT9), \
-       GPIO_FN(LCD2D17),
        GPIO_FN(VIO_D8), \
-       GPIO_FN(PORT138_KEYOUT8), \
        GPIO_FN(VIO2_D0), \
-       GPIO_FN(LCD2D6),
        GPIO_FN(VIO_D9), \
-       GPIO_FN(PORT139_KEYOUT9), \
        GPIO_FN(VIO2_D1), \
-       GPIO_FN(LCD2D7),
        GPIO_FN(VIO_D10), \
        GPIO_FN(TPU0TO2), \
        GPIO_FN(VIO2_D2), \
-       GPIO_FN(LCD2D8),
        GPIO_FN(VIO_D11), \
        GPIO_FN(TPU0TO3), \
        GPIO_FN(VIO2_D3), \
-       GPIO_FN(LCD2D9),
        GPIO_FN(VIO_D12), \
-       GPIO_FN(PORT142_KEYOUT10), \
        GPIO_FN(VIO2_D4), \
-       GPIO_FN(LCD2D2),
        GPIO_FN(VIO_D13), \
-       GPIO_FN(PORT143_KEYOUT11), \
-       GPIO_FN(PORT143_KEYOUT6), \
        GPIO_FN(VIO2_D5), \
-       GPIO_FN(LCD2D3),
        GPIO_FN(VIO_D14), \
-       GPIO_FN(PORT144_KEYOUT7), \
        GPIO_FN(VIO2_D6), \
-       GPIO_FN(LCD2D4),
        GPIO_FN(VIO_D15), \
        GPIO_FN(TPU1TO3), \
-       GPIO_FN(PORT145_LCD2DISP), \
-       GPIO_FN(PORT145_LCD2RS), \
        GPIO_FN(VIO2_D7), \
-       GPIO_FN(LCD2D5),
        GPIO_FN(VIO_CLK), \
-       GPIO_FN(LCD2DCK), \
-       GPIO_FN(PORT146_LCD2WR_), \
        GPIO_FN(VIO2_CLK), \
-       GPIO_FN(LCD2D18),
        GPIO_FN(VIO_FIELD), \
-       GPIO_FN(LCD2RD_), \
        GPIO_FN(VIO2_FIELD), \
-       GPIO_FN(LCD2D19),
        GPIO_FN(VIO_CKO),
        GPIO_FN(A27), \
-       GPIO_FN(PORT149_RDWR), \
        GPIO_FN(MFG0_IN1), \
-       GPIO_FN(PORT149_KEYOUT9),
        GPIO_FN(MFG0_IN2),
        GPIO_FN(TS_SPSYNC3), \
        GPIO_FN(MSIOF2_RSCK),
@@ -1860,201 +3104,105 @@ static struct pinmux_gpio pinmux_gpios[] = {
        GPIO_FN(TPU1TO2), \
        GPIO_FN(TS_SDEN3), \
        GPIO_FN(PORT153_MSIOF2_SS1),
-       GPIO_FN(SCIFA2_TXD1), \
        GPIO_FN(MSIOF2_MCK0),
-       GPIO_FN(SCIFA2_RXD1), \
        GPIO_FN(MSIOF2_MCK1),
-       GPIO_FN(SCIFA2_RTS1_), \
        GPIO_FN(PORT156_MSIOF2_SS2),
-       GPIO_FN(SCIFA2_CTS1_), \
        GPIO_FN(PORT157_MSIOF2_RXD),
        GPIO_FN(DINT_), \
-       GPIO_FN(SCIFA2_SCK1), \
        GPIO_FN(TS_SCK3),
-       GPIO_FN(PORT159_SCIFB_SCK), \
-       GPIO_FN(PORT159_SCIFA5_SCK), \
        GPIO_FN(NMI),
-       GPIO_FN(PORT160_SCIFB_TXD), \
-       GPIO_FN(PORT160_SCIFA5_TXD),
-       GPIO_FN(PORT161_SCIFB_CTS_), \
-       GPIO_FN(PORT161_SCIFA5_CTS_),
-       GPIO_FN(PORT162_SCIFB_RXD), \
-       GPIO_FN(PORT162_SCIFA5_RXD),
-       GPIO_FN(PORT163_SCIFB_RTS_), \
-       GPIO_FN(PORT163_SCIFA5_RTS_), \
        GPIO_FN(TPU3TO0),
-       GPIO_FN(LCDD0),
-       GPIO_FN(LCDD1), \
-       GPIO_FN(PORT193_SCIFA5_CTS_), \
        GPIO_FN(BBIF2_TSYNC1),
-       GPIO_FN(LCDD2), \
-       GPIO_FN(PORT194_SCIFA5_RTS_), \
        GPIO_FN(BBIF2_TSCK1),
-       GPIO_FN(LCDD3), \
-       GPIO_FN(PORT195_SCIFA5_RXD), \
        GPIO_FN(BBIF2_TXD1),
-       GPIO_FN(LCDD4), \
-       GPIO_FN(PORT196_SCIFA5_TXD),
-       GPIO_FN(LCDD5), \
-       GPIO_FN(PORT197_SCIFA5_SCK), \
        GPIO_FN(MFG2_OUT2), \
        GPIO_FN(TPU2TO1),
-       GPIO_FN(LCDD6),
-       GPIO_FN(LCDD7), \
        GPIO_FN(TPU4TO1), \
        GPIO_FN(MFG4_OUT2),
-       GPIO_FN(LCDD8), \
        GPIO_FN(D16),
-       GPIO_FN(LCDD9), \
        GPIO_FN(D17),
-       GPIO_FN(LCDD10), \
        GPIO_FN(D18),
-       GPIO_FN(LCDD11), \
        GPIO_FN(D19),
-       GPIO_FN(LCDD12), \
        GPIO_FN(D20),
-       GPIO_FN(LCDD13), \
        GPIO_FN(D21),
-       GPIO_FN(LCDD14), \
        GPIO_FN(D22),
-       GPIO_FN(LCDD15), \
        GPIO_FN(PORT207_MSIOF0L_SS1), \
        GPIO_FN(D23),
-       GPIO_FN(LCDD16), \
        GPIO_FN(PORT208_MSIOF0L_SS2), \
        GPIO_FN(D24),
-       GPIO_FN(LCDD17), \
        GPIO_FN(D25),
-       GPIO_FN(LCDD18), \
        GPIO_FN(DREQ2), \
        GPIO_FN(PORT210_MSIOF0L_SS1), \
        GPIO_FN(D26),
-       GPIO_FN(LCDD19), \
        GPIO_FN(PORT211_MSIOF0L_SS2), \
        GPIO_FN(D27),
-       GPIO_FN(LCDD20), \
        GPIO_FN(TS_SPSYNC1), \
        GPIO_FN(MSIOF0L_MCK0), \
        GPIO_FN(D28),
-       GPIO_FN(LCDD21), \
        GPIO_FN(TS_SDAT1), \
        GPIO_FN(MSIOF0L_MCK1), \
        GPIO_FN(D29),
-       GPIO_FN(LCDD22), \
        GPIO_FN(TS_SDEN1), \
        GPIO_FN(MSIOF0L_RSCK), \
        GPIO_FN(D30),
-       GPIO_FN(LCDD23), \
        GPIO_FN(TS_SCK1), \
        GPIO_FN(MSIOF0L_RSYNC), \
        GPIO_FN(D31),
-       GPIO_FN(LCDDCK), \
-       GPIO_FN(LCDWR_),
-       GPIO_FN(LCDRD_), \
        GPIO_FN(DACK2), \
-       GPIO_FN(PORT217_LCD2RS), \
        GPIO_FN(MSIOF0L_TSYNC), \
        GPIO_FN(VIO2_FIELD3), \
-       GPIO_FN(PORT217_LCD2DISP),
-       GPIO_FN(LCDHSYN), \
-       GPIO_FN(LCDCS_), \
-       GPIO_FN(LCDCS2_), \
        GPIO_FN(DACK3), \
        GPIO_FN(PORT218_VIO_CKOR),
-       GPIO_FN(LCDDISP), \
-       GPIO_FN(LCDRS), \
-       GPIO_FN(PORT219_LCD2WR_), \
        GPIO_FN(DREQ3), \
        GPIO_FN(MSIOF0L_TSCK), \
        GPIO_FN(VIO2_CLK3), \
-       GPIO_FN(LCD2DCK_2),
-       GPIO_FN(LCDVSYN), \
-       GPIO_FN(LCDVSYN2),
-       GPIO_FN(LCDLCLK), \
        GPIO_FN(DREQ1), \
-       GPIO_FN(PORT221_LCD2CS_), \
        GPIO_FN(PWEN), \
        GPIO_FN(MSIOF0L_RXD), \
        GPIO_FN(VIO2_HD3), \
-       GPIO_FN(PORT221_LCD2HSYN),
-       GPIO_FN(LCDDON), \
-       GPIO_FN(LCDDON2), \
        GPIO_FN(DACK1), \
        GPIO_FN(OVCN), \
        GPIO_FN(MSIOF0L_TXD), \
        GPIO_FN(VIO2_VD3), \
-       GPIO_FN(PORT222_LCD2VSYN),
 
-       GPIO_FN(SCIFA1_TXD), \
        GPIO_FN(OVCN2),
        GPIO_FN(EXTLP), \
-       GPIO_FN(SCIFA1_SCK), \
        GPIO_FN(PORT226_VIO_CKO2),
-       GPIO_FN(SCIFA1_RTS_), \
        GPIO_FN(IDIN),
-       GPIO_FN(SCIFA1_RXD),
-       GPIO_FN(SCIFA1_CTS_), \
        GPIO_FN(MFG1_IN1),
        GPIO_FN(MSIOF1_TXD), \
-       GPIO_FN(SCIFA2_TXD2),
        GPIO_FN(MSIOF1_TSYNC), \
-       GPIO_FN(SCIFA2_CTS2_),
        GPIO_FN(MSIOF1_TSCK), \
-       GPIO_FN(SCIFA2_SCK2),
        GPIO_FN(MSIOF1_RXD), \
-       GPIO_FN(SCIFA2_RXD2),
        GPIO_FN(MSIOF1_RSCK), \
-       GPIO_FN(SCIFA2_RTS2_), \
        GPIO_FN(VIO2_CLK2), \
-       GPIO_FN(LCD2D20),
        GPIO_FN(MSIOF1_RSYNC), \
        GPIO_FN(MFG1_IN2), \
        GPIO_FN(VIO2_VD2), \
-       GPIO_FN(LCD2D21),
        GPIO_FN(MSIOF1_MCK0), \
-       GPIO_FN(PORT236_I2C_SDA2),
        GPIO_FN(MSIOF1_MCK1), \
-       GPIO_FN(PORT237_I2C_SCL2),
        GPIO_FN(MSIOF1_SS1), \
        GPIO_FN(VIO2_FIELD2), \
-       GPIO_FN(LCD2D22),
        GPIO_FN(MSIOF1_SS2), \
        GPIO_FN(VIO2_HD2), \
-       GPIO_FN(LCD2D23),
-       GPIO_FN(SCIFA6_TXD),
-       GPIO_FN(PORT241_IRDA_OUT), \
        GPIO_FN(PORT241_IROUT), \
        GPIO_FN(MFG4_OUT1), \
        GPIO_FN(TPU4TO0),
-       GPIO_FN(PORT242_IRDA_IN), \
        GPIO_FN(MFG4_IN2),
-       GPIO_FN(PORT243_IRDA_FIRSEL), \
        GPIO_FN(PORT243_VIO_CKO2),
-       GPIO_FN(PORT244_SCIFA5_CTS_), \
        GPIO_FN(MFG2_IN1), \
-       GPIO_FN(PORT244_SCIFB_CTS_), \
        GPIO_FN(MSIOF2R_RXD),
-       GPIO_FN(PORT245_SCIFA5_RTS_), \
        GPIO_FN(MFG2_IN2), \
-       GPIO_FN(PORT245_SCIFB_RTS_), \
        GPIO_FN(MSIOF2R_TXD),
-       GPIO_FN(PORT246_SCIFA5_RXD), \
        GPIO_FN(MFG1_OUT1), \
-       GPIO_FN(PORT246_SCIFB_RXD), \
        GPIO_FN(TPU1TO0),
-       GPIO_FN(PORT247_SCIFA5_TXD), \
        GPIO_FN(MFG3_OUT2), \
-       GPIO_FN(PORT247_SCIFB_TXD), \
        GPIO_FN(TPU3TO1),
-       GPIO_FN(PORT248_SCIFA5_SCK), \
        GPIO_FN(MFG2_OUT1), \
-       GPIO_FN(PORT248_SCIFB_SCK), \
        GPIO_FN(TPU2TO0), \
-       GPIO_FN(PORT248_I2C_SCL3), \
        GPIO_FN(MSIOF2R_TSCK),
        GPIO_FN(PORT249_IROUT), \
        GPIO_FN(MFG4_IN1), \
-       GPIO_FN(PORT249_I2C_SDA3), \
        GPIO_FN(MSIOF2R_TSYNC),
        GPIO_FN(SDHICLK0),
        GPIO_FN(SDHICD0),
@@ -2172,56 +3320,24 @@ static struct pinmux_gpio pinmux_gpios[] = {
        GPIO_FN(IRQ9_MEM_INT),
        GPIO_FN(IRQ9_MCP_INT),
        GPIO_FN(A11),
-       GPIO_FN(KEYOUT8),
        GPIO_FN(TPU4TO3),
        GPIO_FN(RESETA_N_PU_ON),
        GPIO_FN(RESETA_N_PU_OFF),
        GPIO_FN(EDBGREQ_PD),
        GPIO_FN(EDBGREQ_PU),
+};
 
-       /* Functions with pull-ups */
-       GPIO_FN(KEYIN0_PU),
-       GPIO_FN(KEYIN1_PU),
-       GPIO_FN(KEYIN2_PU),
-       GPIO_FN(KEYIN3_PU),
-       GPIO_FN(KEYIN4_PU),
-       GPIO_FN(KEYIN5_PU),
-       GPIO_FN(KEYIN6_PU),
-       GPIO_FN(KEYIN7_PU),
-       GPIO_FN(SDHICD0_PU),
-       GPIO_FN(SDHID0_0_PU),
-       GPIO_FN(SDHID0_1_PU),
-       GPIO_FN(SDHID0_2_PU),
-       GPIO_FN(SDHID0_3_PU),
-       GPIO_FN(SDHICMD0_PU),
-       GPIO_FN(SDHIWP0_PU),
-       GPIO_FN(SDHID1_0_PU),
-       GPIO_FN(SDHID1_1_PU),
-       GPIO_FN(SDHID1_2_PU),
-       GPIO_FN(SDHID1_3_PU),
-       GPIO_FN(SDHICMD1_PU),
-       GPIO_FN(SDHID2_0_PU),
-       GPIO_FN(SDHID2_1_PU),
-       GPIO_FN(SDHID2_2_PU),
-       GPIO_FN(SDHID2_3_PU),
-       GPIO_FN(SDHICMD2_PU),
-       GPIO_FN(MMCCMD0_PU),
-       GPIO_FN(MMCCMD1_PU),
-       GPIO_FN(MMCD0_0_PU),
-       GPIO_FN(MMCD0_1_PU),
-       GPIO_FN(MMCD0_2_PU),
-       GPIO_FN(MMCD0_3_PU),
-       GPIO_FN(MMCD0_4_PU),
-       GPIO_FN(MMCD0_5_PU),
-       GPIO_FN(MMCD0_6_PU),
-       GPIO_FN(MMCD0_7_PU),
-       GPIO_FN(FSIACK_PU),
-       GPIO_FN(FSIAILR_PU),
-       GPIO_FN(FSIAIBT_PU),
-       GPIO_FN(FSIAISLD_PU),
-};
-
-static struct pinmux_cfg_reg pinmux_config_regs[] = {
+#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 */
        PORTCR(2, 0xe6050002), /* PORT2CR */
@@ -2629,7 +3745,7 @@ static struct pinmux_cfg_reg pinmux_config_regs[] = {
        { },
 };
 
-static struct pinmux_data_reg pinmux_data_regs[] = {
+static const struct pinmux_data_reg pinmux_data_regs[] = {
        { PINMUX_DATA_REG("PORTL031_000DR", 0xe6054000, 32) {
                        PORT31_DATA, PORT30_DATA, PORT29_DATA, PORT28_DATA,
                        PORT27_DATA, PORT26_DATA, PORT25_DATA, PORT24_DATA,
@@ -2733,60 +3849,116 @@ static struct pinmux_data_reg pinmux_data_regs[] = {
        { },
 };
 
-/* IRQ pins through INTCS with IRQ0->15 from 0x200 and IRQ16-31 from 0x3200 */
-#define EXT_IRQ16L(n) intcs_evt2irq(0x200 + ((n) << 5))
-#define EXT_IRQ16H(n) intcs_evt2irq(0x3200 + ((n - 16) << 5))
-
-static struct pinmux_irq pinmux_irqs[] = {
-       PINMUX_IRQ(EXT_IRQ16H(19), PORT9_FN0),
-       PINMUX_IRQ(EXT_IRQ16L(1), PORT10_FN0),
-       PINMUX_IRQ(EXT_IRQ16L(0), PORT11_FN0),
-       PINMUX_IRQ(EXT_IRQ16H(18), PORT13_FN0),
-       PINMUX_IRQ(EXT_IRQ16H(20), PORT14_FN0),
-       PINMUX_IRQ(EXT_IRQ16H(21), PORT15_FN0),
-       PINMUX_IRQ(EXT_IRQ16H(31), PORT26_FN0),
-       PINMUX_IRQ(EXT_IRQ16H(30), PORT27_FN0),
-       PINMUX_IRQ(EXT_IRQ16H(29), PORT28_FN0),
-       PINMUX_IRQ(EXT_IRQ16H(22), PORT40_FN0),
-       PINMUX_IRQ(EXT_IRQ16H(23), PORT53_FN0),
-       PINMUX_IRQ(EXT_IRQ16L(10), PORT54_FN0),
-       PINMUX_IRQ(EXT_IRQ16L(9), PORT56_FN0),
-       PINMUX_IRQ(EXT_IRQ16H(26), PORT115_FN0),
-       PINMUX_IRQ(EXT_IRQ16H(27), PORT116_FN0),
-       PINMUX_IRQ(EXT_IRQ16H(28), PORT117_FN0),
-       PINMUX_IRQ(EXT_IRQ16H(24), PORT118_FN0),
-       PINMUX_IRQ(EXT_IRQ16L(6), PORT147_FN0),
-       PINMUX_IRQ(EXT_IRQ16L(2), PORT149_FN0),
-       PINMUX_IRQ(EXT_IRQ16L(7), PORT150_FN0),
-       PINMUX_IRQ(EXT_IRQ16L(12), PORT156_FN0),
-       PINMUX_IRQ(EXT_IRQ16L(4), PORT159_FN0),
-       PINMUX_IRQ(EXT_IRQ16H(25), PORT164_FN0),
-       PINMUX_IRQ(EXT_IRQ16L(8), PORT223_FN0),
-       PINMUX_IRQ(EXT_IRQ16L(3), PORT224_FN0),
-       PINMUX_IRQ(EXT_IRQ16L(5), PORT227_FN0),
-       PINMUX_IRQ(EXT_IRQ16H(17), PORT234_FN0),
-       PINMUX_IRQ(EXT_IRQ16L(11), PORT238_FN0),
-       PINMUX_IRQ(EXT_IRQ16L(13), PORT239_FN0),
-       PINMUX_IRQ(EXT_IRQ16H(16), PORT249_FN0),
-       PINMUX_IRQ(EXT_IRQ16L(14), PORT251_FN0),
-       PINMUX_IRQ(EXT_IRQ16L(9), PORT308_FN0),
-};
-
-struct sh_pfc_soc_info sh73a0_pinmux_info = {
+/* External IRQ pins mapped at IRQPIN_BASE */
+#define EXT_IRQ16L(n) irq_pin(n)
+#define EXT_IRQ16H(n) irq_pin(n)
+
+static const struct pinmux_irq pinmux_irqs[] = {
+       PINMUX_IRQ(EXT_IRQ16H(19), 9),
+       PINMUX_IRQ(EXT_IRQ16L(1), 10),
+       PINMUX_IRQ(EXT_IRQ16L(0), 11),
+       PINMUX_IRQ(EXT_IRQ16H(18), 13),
+       PINMUX_IRQ(EXT_IRQ16H(20), 14),
+       PINMUX_IRQ(EXT_IRQ16H(21), 15),
+       PINMUX_IRQ(EXT_IRQ16H(31), 26),
+       PINMUX_IRQ(EXT_IRQ16H(30), 27),
+       PINMUX_IRQ(EXT_IRQ16H(29), 28),
+       PINMUX_IRQ(EXT_IRQ16H(22), 40),
+       PINMUX_IRQ(EXT_IRQ16H(23), 53),
+       PINMUX_IRQ(EXT_IRQ16L(10), 54),
+       PINMUX_IRQ(EXT_IRQ16L(9), 56),
+       PINMUX_IRQ(EXT_IRQ16H(26), 115),
+       PINMUX_IRQ(EXT_IRQ16H(27), 116),
+       PINMUX_IRQ(EXT_IRQ16H(28), 117),
+       PINMUX_IRQ(EXT_IRQ16H(24), 118),
+       PINMUX_IRQ(EXT_IRQ16L(6), 147),
+       PINMUX_IRQ(EXT_IRQ16L(2), 149),
+       PINMUX_IRQ(EXT_IRQ16L(7), 150),
+       PINMUX_IRQ(EXT_IRQ16L(12), 156),
+       PINMUX_IRQ(EXT_IRQ16L(4), 159),
+       PINMUX_IRQ(EXT_IRQ16H(25), 164),
+       PINMUX_IRQ(EXT_IRQ16L(8), 223),
+       PINMUX_IRQ(EXT_IRQ16L(3), 224),
+       PINMUX_IRQ(EXT_IRQ16L(5), 227),
+       PINMUX_IRQ(EXT_IRQ16H(17), 234),
+       PINMUX_IRQ(EXT_IRQ16L(11), 238),
+       PINMUX_IRQ(EXT_IRQ16L(13), 239),
+       PINMUX_IRQ(EXT_IRQ16H(16), 249),
+       PINMUX_IRQ(EXT_IRQ16L(14), 251),
+       PINMUX_IRQ(EXT_IRQ16L(9), 308),
+};
+
+#define PORTnCR_PULMD_OFF      (0 << 6)
+#define PORTnCR_PULMD_DOWN     (2 << 6)
+#define PORTnCR_PULMD_UP       (3 << 6)
+#define PORTnCR_PULMD_MASK     (3 << 6)
+
+static const unsigned int sh73a0_portcr_offsets[] = {
+       0x00000000, 0x00001000, 0x00001000, 0x00002000, 0x00002000,
+       0x00002000, 0x00002000, 0x00003000, 0x00003000, 0x00002000,
+};
+
+static unsigned int sh73a0_pinmux_get_bias(struct sh_pfc *pfc, unsigned int pin)
+{
+       void __iomem *addr = pfc->window->virt
+                          + sh73a0_portcr_offsets[pin >> 5] + pin;
+       u32 value = ioread8(addr) & PORTnCR_PULMD_MASK;
+
+       switch (value) {
+       case PORTnCR_PULMD_UP:
+               return PIN_CONFIG_BIAS_PULL_UP;
+       case PORTnCR_PULMD_DOWN:
+               return PIN_CONFIG_BIAS_PULL_DOWN;
+       case PORTnCR_PULMD_OFF:
+       default:
+               return PIN_CONFIG_BIAS_DISABLE;
+       }
+}
+
+static void sh73a0_pinmux_set_bias(struct sh_pfc *pfc, unsigned int pin,
+                                  unsigned int bias)
+{
+       void __iomem *addr = pfc->window->virt
+                          + sh73a0_portcr_offsets[pin >> 5] + pin;
+       u32 value = ioread8(addr) & ~PORTnCR_PULMD_MASK;
+
+       switch (bias) {
+       case PIN_CONFIG_BIAS_PULL_UP:
+               value |= PORTnCR_PULMD_UP;
+               break;
+       case PIN_CONFIG_BIAS_PULL_DOWN:
+               value |= PORTnCR_PULMD_DOWN;
+               break;
+       }
+
+       iowrite8(value, addr);
+}
+
+static const struct sh_pfc_soc_operations sh73a0_pinmux_ops = {
+       .get_bias = sh73a0_pinmux_get_bias,
+       .set_bias = sh73a0_pinmux_set_bias,
+};
+
+const struct sh_pfc_soc_info sh73a0_pinmux_info = {
        .name = "sh73a0_pfc",
-       .reserved_id = PINMUX_RESERVED,
-       .data = { PINMUX_DATA_BEGIN, PINMUX_DATA_END },
+       .ops = &sh73a0_pinmux_ops,
+
        .input = { PINMUX_INPUT_BEGIN, PINMUX_INPUT_END },
-       .input_pu = { PINMUX_INPUT_PULLUP_BEGIN, PINMUX_INPUT_PULLUP_END },
-       .input_pd = { PINMUX_INPUT_PULLDOWN_BEGIN, PINMUX_INPUT_PULLDOWN_END },
        .output = { PINMUX_OUTPUT_BEGIN, PINMUX_OUTPUT_END },
-       .mark = { PINMUX_MARK_BEGIN, PINMUX_MARK_END },
        .function = { PINMUX_FUNCTION_BEGIN, PINMUX_FUNCTION_END },
 
-       .first_gpio = GPIO_PORT0,
-       .last_gpio = GPIO_FN_FSIAISLD_PU,
+       .pins = pinmux_pins,
+       .nr_pins = ARRAY_SIZE(pinmux_pins),
+       .ranges = pinmux_ranges,
+       .nr_ranges = ARRAY_SIZE(pinmux_ranges),
+       .groups = pinmux_groups,
+       .nr_groups = ARRAY_SIZE(pinmux_groups),
+       .functions = pinmux_functions,
+       .nr_functions = ARRAY_SIZE(pinmux_functions),
+
+       .func_gpios = pinmux_func_gpios,
+       .nr_func_gpios = ARRAY_SIZE(pinmux_func_gpios),
 
-       .gpios = pinmux_gpios,
        .cfg_regs = pinmux_config_regs,
        .data_regs = pinmux_data_regs,
 
index 10872ed688a6662a729760bb994377b6e3c936ea..52e9f6be665f11859d7dd114df6eedde32dec374 100644 (file)
@@ -262,7 +262,7 @@ enum {
        PINMUX_MARK_END,
 };
 
-static pinmux_enum_t pinmux_data[] = {
+static const pinmux_enum_t pinmux_data[] = {
        /* PTA GPIO */
        PINMUX_DATA(PTA7_DATA, PTA7_IN, PTA7_OUT, PTA7_IN_PU),
        PINMUX_DATA(PTA6_DATA, PTA6_IN, PTA6_OUT, PTA6_IN_PU),
@@ -606,7 +606,7 @@ static pinmux_enum_t pinmux_data[] = {
        PINMUX_DATA(SIM_CLK_MARK, PSELD_1_0_10, PTV0_FN),
 };
 
-static struct pinmux_gpio pinmux_gpios[] = {
+static struct sh_pfc_pin pinmux_pins[] = {
        /* PTA */
        PINMUX_GPIO(GPIO_PTA7, PTA7_DATA),
        PINMUX_GPIO(GPIO_PTA6, PTA6_DATA),
@@ -759,202 +759,205 @@ static struct pinmux_gpio pinmux_gpios[] = {
        PINMUX_GPIO(GPIO_PTV2, PTV2_DATA),
        PINMUX_GPIO(GPIO_PTV1, PTV1_DATA),
        PINMUX_GPIO(GPIO_PTV0, PTV0_DATA),
+};
+
+#define PINMUX_FN_BASE ARRAY_SIZE(pinmux_pins)
 
+static const struct pinmux_func pinmux_func_gpios[] = {
        /* BSC */
-       PINMUX_GPIO(GPIO_FN_D31, D31_MARK),
-       PINMUX_GPIO(GPIO_FN_D30, D30_MARK),
-       PINMUX_GPIO(GPIO_FN_D29, D29_MARK),
-       PINMUX_GPIO(GPIO_FN_D28, D28_MARK),
-       PINMUX_GPIO(GPIO_FN_D27, D27_MARK),
-       PINMUX_GPIO(GPIO_FN_D26, D26_MARK),
-       PINMUX_GPIO(GPIO_FN_D25, D25_MARK),
-       PINMUX_GPIO(GPIO_FN_D24, D24_MARK),
-       PINMUX_GPIO(GPIO_FN_D23, D23_MARK),
-       PINMUX_GPIO(GPIO_FN_D22, D22_MARK),
-       PINMUX_GPIO(GPIO_FN_D21, D21_MARK),
-       PINMUX_GPIO(GPIO_FN_D20, D20_MARK),
-       PINMUX_GPIO(GPIO_FN_D19, D19_MARK),
-       PINMUX_GPIO(GPIO_FN_D18, D18_MARK),
-       PINMUX_GPIO(GPIO_FN_D17, D17_MARK),
-       PINMUX_GPIO(GPIO_FN_D16, D16_MARK),
-       PINMUX_GPIO(GPIO_FN_IOIS16, IOIS16_MARK),
-       PINMUX_GPIO(GPIO_FN_RAS, RAS_MARK),
-       PINMUX_GPIO(GPIO_FN_CAS, CAS_MARK),
-       PINMUX_GPIO(GPIO_FN_CKE, CKE_MARK),
-       PINMUX_GPIO(GPIO_FN_CS5B_CE1A, CS5B_CE1A_MARK),
-       PINMUX_GPIO(GPIO_FN_CS6B_CE1B, CS6B_CE1B_MARK),
-       PINMUX_GPIO(GPIO_FN_A25, A25_MARK),
-       PINMUX_GPIO(GPIO_FN_A24, A24_MARK),
-       PINMUX_GPIO(GPIO_FN_A23, A23_MARK),
-       PINMUX_GPIO(GPIO_FN_A22, A22_MARK),
-       PINMUX_GPIO(GPIO_FN_A21, A21_MARK),
-       PINMUX_GPIO(GPIO_FN_A20, A20_MARK),
-       PINMUX_GPIO(GPIO_FN_A19, A19_MARK),
-       PINMUX_GPIO(GPIO_FN_A0, A0_MARK),
-       PINMUX_GPIO(GPIO_FN_REFOUT, REFOUT_MARK),
-       PINMUX_GPIO(GPIO_FN_IRQOUT, IRQOUT_MARK),
+       GPIO_FN(D31),
+       GPIO_FN(D30),
+       GPIO_FN(D29),
+       GPIO_FN(D28),
+       GPIO_FN(D27),
+       GPIO_FN(D26),
+       GPIO_FN(D25),
+       GPIO_FN(D24),
+       GPIO_FN(D23),
+       GPIO_FN(D22),
+       GPIO_FN(D21),
+       GPIO_FN(D20),
+       GPIO_FN(D19),
+       GPIO_FN(D18),
+       GPIO_FN(D17),
+       GPIO_FN(D16),
+       GPIO_FN(IOIS16),
+       GPIO_FN(RAS),
+       GPIO_FN(CAS),
+       GPIO_FN(CKE),
+       GPIO_FN(CS5B_CE1A),
+       GPIO_FN(CS6B_CE1B),
+       GPIO_FN(A25),
+       GPIO_FN(A24),
+       GPIO_FN(A23),
+       GPIO_FN(A22),
+       GPIO_FN(A21),
+       GPIO_FN(A20),
+       GPIO_FN(A19),
+       GPIO_FN(A0),
+       GPIO_FN(REFOUT),
+       GPIO_FN(IRQOUT),
 
        /* LCDC */
-       PINMUX_GPIO(GPIO_FN_LCD_DATA15, LCD_DATA15_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_DATA14, LCD_DATA14_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_DATA13, LCD_DATA13_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_DATA12, LCD_DATA12_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_DATA11, LCD_DATA11_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_DATA10, LCD_DATA10_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_DATA9, LCD_DATA9_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_DATA8, LCD_DATA8_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_DATA7, LCD_DATA7_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_DATA6, LCD_DATA6_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_DATA5, LCD_DATA5_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_DATA4, LCD_DATA4_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_DATA3, LCD_DATA3_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_DATA2, LCD_DATA2_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_DATA1, LCD_DATA1_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_DATA0, LCD_DATA0_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_M_DISP, LCD_M_DISP_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_CL1, LCD_CL1_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_CL2, LCD_CL2_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_DON, LCD_DON_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_FLM, LCD_FLM_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_VEPWC, LCD_VEPWC_MARK),
-       PINMUX_GPIO(GPIO_FN_LCD_VCPWC, LCD_VCPWC_MARK),
+       GPIO_FN(LCD_DATA15),
+       GPIO_FN(LCD_DATA14),
+       GPIO_FN(LCD_DATA13),
+       GPIO_FN(LCD_DATA12),
+       GPIO_FN(LCD_DATA11),
+       GPIO_FN(LCD_DATA10),
+       GPIO_FN(LCD_DATA9),
+       GPIO_FN(LCD_DATA8),
+       GPIO_FN(LCD_DATA7),
+       GPIO_FN(LCD_DATA6),
+       GPIO_FN(LCD_DATA5),
+       GPIO_FN(LCD_DATA4),
+       GPIO_FN(LCD_DATA3),
+       GPIO_FN(LCD_DATA2),
+       GPIO_FN(LCD_DATA1),
+       GPIO_FN(LCD_DATA0),
+       GPIO_FN(LCD_M_DISP),
+       GPIO_FN(LCD_CL1),
+       GPIO_FN(LCD_CL2),
+       GPIO_FN(LCD_DON),
+       GPIO_FN(LCD_FLM),
+       GPIO_FN(LCD_VEPWC),
+       GPIO_FN(LCD_VCPWC),
 
        /* AFEIF */
-       PINMUX_GPIO(GPIO_FN_AFE_RXIN, AFE_RXIN_MARK),
-       PINMUX_GPIO(GPIO_FN_AFE_RDET, AFE_RDET_MARK),
-       PINMUX_GPIO(GPIO_FN_AFE_FS, AFE_FS_MARK),
-       PINMUX_GPIO(GPIO_FN_AFE_TXOUT, AFE_TXOUT_MARK),
-       PINMUX_GPIO(GPIO_FN_AFE_SCLK, AFE_SCLK_MARK),
-       PINMUX_GPIO(GPIO_FN_AFE_RLYCNT, AFE_RLYCNT_MARK),
-       PINMUX_GPIO(GPIO_FN_AFE_HC1, AFE_HC1_MARK),
+       GPIO_FN(AFE_RXIN),
+       GPIO_FN(AFE_RDET),
+       GPIO_FN(AFE_FS),
+       GPIO_FN(AFE_TXOUT),
+       GPIO_FN(AFE_SCLK),
+       GPIO_FN(AFE_RLYCNT),
+       GPIO_FN(AFE_HC1),
 
        /* IIC */
-       PINMUX_GPIO(GPIO_FN_IIC_SCL, IIC_SCL_MARK),
-       PINMUX_GPIO(GPIO_FN_IIC_SDA, IIC_SDA_MARK),
+       GPIO_FN(IIC_SCL),
+       GPIO_FN(IIC_SDA),
 
        /* DAC */
-       PINMUX_GPIO(GPIO_FN_DA1, DA1_MARK),
-       PINMUX_GPIO(GPIO_FN_DA0, DA0_MARK),
+       GPIO_FN(DA1),
+       GPIO_FN(DA0),
 
        /* ADC */
-       PINMUX_GPIO(GPIO_FN_AN3, AN3_MARK),
-       PINMUX_GPIO(GPIO_FN_AN2, AN2_MARK),
-       PINMUX_GPIO(GPIO_FN_AN1, AN1_MARK),
-       PINMUX_GPIO(GPIO_FN_AN0, AN0_MARK),
-       PINMUX_GPIO(GPIO_FN_ADTRG, ADTRG_MARK),
+       GPIO_FN(AN3),
+       GPIO_FN(AN2),
+       GPIO_FN(AN1),
+       GPIO_FN(AN0),
+       GPIO_FN(ADTRG),
 
        /* USB */
-       PINMUX_GPIO(GPIO_FN_USB1D_RCV, USB1D_RCV_MARK),
-       PINMUX_GPIO(GPIO_FN_USB1D_TXSE0, USB1D_TXSE0_MARK),
-       PINMUX_GPIO(GPIO_FN_USB1D_TXDPLS, USB1D_TXDPLS_MARK),
-       PINMUX_GPIO(GPIO_FN_USB1D_DMNS, USB1D_DMNS_MARK),
-       PINMUX_GPIO(GPIO_FN_USB1D_DPLS, USB1D_DPLS_MARK),
-       PINMUX_GPIO(GPIO_FN_USB1D_SPEED, USB1D_SPEED_MARK),
-       PINMUX_GPIO(GPIO_FN_USB1D_TXENL, USB1D_TXENL_MARK),
-
-       PINMUX_GPIO(GPIO_FN_USB2_PWR_EN, USB2_PWR_EN_MARK),
-       PINMUX_GPIO(GPIO_FN_USB1_PWR_EN_USBF_UPLUP,
-                   USB1_PWR_EN_USBF_UPLUP_MARK),
-       PINMUX_GPIO(GPIO_FN_USB1D_SUSPEND, USB1D_SUSPEND_MARK),
+       GPIO_FN(USB1D_RCV),
+       GPIO_FN(USB1D_TXSE0),
+       GPIO_FN(USB1D_TXDPLS),
+       GPIO_FN(USB1D_DMNS),
+       GPIO_FN(USB1D_DPLS),
+       GPIO_FN(USB1D_SPEED),
+       GPIO_FN(USB1D_TXENL),
+
+       GPIO_FN(USB2_PWR_EN),
+       GPIO_FN(USB1_PWR_EN_USBF_UPLUP),
+       GPIO_FN(USB1D_SUSPEND),
 
        /* INTC */
-       PINMUX_GPIO(GPIO_FN_IRQ5, IRQ5_MARK),
-       PINMUX_GPIO(GPIO_FN_IRQ4, IRQ4_MARK),
-       PINMUX_GPIO(GPIO_FN_IRQ3_IRL3, IRQ3_IRL3_MARK),
-       PINMUX_GPIO(GPIO_FN_IRQ2_IRL2, IRQ2_IRL2_MARK),
-       PINMUX_GPIO(GPIO_FN_IRQ1_IRL1, IRQ1_IRL1_MARK),
-       PINMUX_GPIO(GPIO_FN_IRQ0_IRL0, IRQ0_IRL0_MARK),
+       GPIO_FN(IRQ5),
+       GPIO_FN(IRQ4),
+       GPIO_FN(IRQ3_IRL3),
+       GPIO_FN(IRQ2_IRL2),
+       GPIO_FN(IRQ1_IRL1),
+       GPIO_FN(IRQ0_IRL0),
 
        /* PCC */
-       PINMUX_GPIO(GPIO_FN_PCC_REG, PCC_REG_MARK),
-       PINMUX_GPIO(GPIO_FN_PCC_DRV, PCC_DRV_MARK),
-       PINMUX_GPIO(GPIO_FN_PCC_BVD2, PCC_BVD2_MARK),
-       PINMUX_GPIO(GPIO_FN_PCC_BVD1, PCC_BVD1_MARK),
-       PINMUX_GPIO(GPIO_FN_PCC_CD2, PCC_CD2_MARK),
-       PINMUX_GPIO(GPIO_FN_PCC_CD1, PCC_CD1_MARK),
-       PINMUX_GPIO(GPIO_FN_PCC_RESET, PCC_RESET_MARK),
-       PINMUX_GPIO(GPIO_FN_PCC_RDY, PCC_RDY_MARK),
-       PINMUX_GPIO(GPIO_FN_PCC_VS2, PCC_VS2_MARK),
-       PINMUX_GPIO(GPIO_FN_PCC_VS1, PCC_VS1_MARK),
+       GPIO_FN(PCC_REG),
+       GPIO_FN(PCC_DRV),
+       GPIO_FN(PCC_BVD2),
+       GPIO_FN(PCC_BVD1),
+       GPIO_FN(PCC_CD2),
+       GPIO_FN(PCC_CD1),
+       GPIO_FN(PCC_RESET),
+       GPIO_FN(PCC_RDY),
+       GPIO_FN(PCC_VS2),
+       GPIO_FN(PCC_VS1),
 
        /* HUDI */
-       PINMUX_GPIO(GPIO_FN_AUDATA3, AUDATA3_MARK),
-       PINMUX_GPIO(GPIO_FN_AUDATA2, AUDATA2_MARK),
-       PINMUX_GPIO(GPIO_FN_AUDATA1, AUDATA1_MARK),
-       PINMUX_GPIO(GPIO_FN_AUDATA0, AUDATA0_MARK),
-       PINMUX_GPIO(GPIO_FN_AUDCK, AUDCK_MARK),
-       PINMUX_GPIO(GPIO_FN_AUDSYNC, AUDSYNC_MARK),
-       PINMUX_GPIO(GPIO_FN_ASEBRKAK, ASEBRKAK_MARK),
-       PINMUX_GPIO(GPIO_FN_TRST, TRST_MARK),
-       PINMUX_GPIO(GPIO_FN_TMS, TMS_MARK),
-       PINMUX_GPIO(GPIO_FN_TDO, TDO_MARK),
-       PINMUX_GPIO(GPIO_FN_TDI, TDI_MARK),
-       PINMUX_GPIO(GPIO_FN_TCK, TCK_MARK),
+       GPIO_FN(AUDATA3),
+       GPIO_FN(AUDATA2),
+       GPIO_FN(AUDATA1),
+       GPIO_FN(AUDATA0),
+       GPIO_FN(AUDCK),
+       GPIO_FN(AUDSYNC),
+       GPIO_FN(ASEBRKAK),
+       GPIO_FN(TRST),
+       GPIO_FN(TMS),
+       GPIO_FN(TDO),
+       GPIO_FN(TDI),
+       GPIO_FN(TCK),
 
        /* DMAC */
-       PINMUX_GPIO(GPIO_FN_DACK1, DACK1_MARK),
-       PINMUX_GPIO(GPIO_FN_DREQ1, DREQ1_MARK),
-       PINMUX_GPIO(GPIO_FN_DACK0, DACK0_MARK),
-       PINMUX_GPIO(GPIO_FN_DREQ0, DREQ0_MARK),
-       PINMUX_GPIO(GPIO_FN_TEND1, TEND1_MARK),
-       PINMUX_GPIO(GPIO_FN_TEND0, TEND0_MARK),
+       GPIO_FN(DACK1),
+       GPIO_FN(DREQ1),
+       GPIO_FN(DACK0),
+       GPIO_FN(DREQ0),
+       GPIO_FN(TEND1),
+       GPIO_FN(TEND0),
 
        /* SIOF0 */
-       PINMUX_GPIO(GPIO_FN_SIOF0_SYNC, SIOF0_SYNC_MARK),
-       PINMUX_GPIO(GPIO_FN_SIOF0_MCLK, SIOF0_MCLK_MARK),
-       PINMUX_GPIO(GPIO_FN_SIOF0_TXD, SIOF0_TXD_MARK),
-       PINMUX_GPIO(GPIO_FN_SIOF0_RXD, SIOF0_RXD_MARK),
-       PINMUX_GPIO(GPIO_FN_SIOF0_SCK, SIOF0_SCK_MARK),
+       GPIO_FN(SIOF0_SYNC),
+       GPIO_FN(SIOF0_MCLK),
+       GPIO_FN(SIOF0_TXD),
+       GPIO_FN(SIOF0_RXD),
+       GPIO_FN(SIOF0_SCK),
 
        /* SIOF1 */
-       PINMUX_GPIO(GPIO_FN_SIOF1_SYNC, SIOF1_SYNC_MARK),
-       PINMUX_GPIO(GPIO_FN_SIOF1_MCLK, SIOF1_MCLK_MARK),
-       PINMUX_GPIO(GPIO_FN_SIOF1_TXD, SIOF1_TXD_MARK),
-       PINMUX_GPIO(GPIO_FN_SIOF1_RXD, SIOF1_RXD_MARK),
-       PINMUX_GPIO(GPIO_FN_SIOF1_SCK, SIOF1_SCK_MARK),
+       GPIO_FN(SIOF1_SYNC),
+       GPIO_FN(SIOF1_MCLK),
+       GPIO_FN(SIOF1_TXD),
+       GPIO_FN(SIOF1_RXD),
+       GPIO_FN(SIOF1_SCK),
 
        /* SCIF0 */
-       PINMUX_GPIO(GPIO_FN_SCIF0_TXD, SCIF0_TXD_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF0_RXD, SCIF0_RXD_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF0_RTS, SCIF0_RTS_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF0_CTS, SCIF0_CTS_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF0_SCK, SCIF0_SCK_MARK),
+       GPIO_FN(SCIF0_TXD),
+       GPIO_FN(SCIF0_RXD),
+       GPIO_FN(SCIF0_RTS),
+       GPIO_FN(SCIF0_CTS),
+       GPIO_FN(SCIF0_SCK),
 
        /* SCIF1 */
-       PINMUX_GPIO(GPIO_FN_SCIF1_TXD, SCIF1_TXD_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF1_RXD, SCIF1_RXD_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF1_RTS, SCIF1_RTS_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF1_CTS, SCIF1_CTS_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF1_SCK, SCIF1_SCK_MARK),
+       GPIO_FN(SCIF1_TXD),
+       GPIO_FN(SCIF1_RXD),
+       GPIO_FN(SCIF1_RTS),
+       GPIO_FN(SCIF1_CTS),
+       GPIO_FN(SCIF1_SCK),
 
        /* TPU */
-       PINMUX_GPIO(GPIO_FN_TPU_TO1, TPU_TO1_MARK),
-       PINMUX_GPIO(GPIO_FN_TPU_TO0, TPU_TO0_MARK),
-       PINMUX_GPIO(GPIO_FN_TPU_TI3B, TPU_TI3B_MARK),
-       PINMUX_GPIO(GPIO_FN_TPU_TI3A, TPU_TI3A_MARK),
-       PINMUX_GPIO(GPIO_FN_TPU_TI2B, TPU_TI2B_MARK),
-       PINMUX_GPIO(GPIO_FN_TPU_TI2A, TPU_TI2A_MARK),
-       PINMUX_GPIO(GPIO_FN_TPU_TO3, TPU_TO3_MARK),
-       PINMUX_GPIO(GPIO_FN_TPU_TO2, TPU_TO2_MARK),
+       GPIO_FN(TPU_TO1),
+       GPIO_FN(TPU_TO0),
+       GPIO_FN(TPU_TI3B),
+       GPIO_FN(TPU_TI3A),
+       GPIO_FN(TPU_TI2B),
+       GPIO_FN(TPU_TI2A),
+       GPIO_FN(TPU_TO3),
+       GPIO_FN(TPU_TO2),
 
        /* SIM */
-       PINMUX_GPIO(GPIO_FN_SIM_D, SIM_D_MARK),
-       PINMUX_GPIO(GPIO_FN_SIM_CLK, SIM_CLK_MARK),
-       PINMUX_GPIO(GPIO_FN_SIM_RST, SIM_RST_MARK),
+       GPIO_FN(SIM_D),
+       GPIO_FN(SIM_CLK),
+       GPIO_FN(SIM_RST),
 
        /* MMC */
-       PINMUX_GPIO(GPIO_FN_MMC_DAT, MMC_DAT_MARK),
-       PINMUX_GPIO(GPIO_FN_MMC_CMD, MMC_CMD_MARK),
-       PINMUX_GPIO(GPIO_FN_MMC_CLK, MMC_CLK_MARK),
-       PINMUX_GPIO(GPIO_FN_MMC_VDDON, MMC_VDDON_MARK),
-       PINMUX_GPIO(GPIO_FN_MMC_ODMOD, MMC_ODMOD_MARK),
+       GPIO_FN(MMC_DAT),
+       GPIO_FN(MMC_CMD),
+       GPIO_FN(MMC_CLK),
+       GPIO_FN(MMC_VDDON),
+       GPIO_FN(MMC_ODMOD),
 
        /* SYSC */
-       PINMUX_GPIO(GPIO_FN_STATUS0, STATUS0_MARK),
-       PINMUX_GPIO(GPIO_FN_STATUS1, STATUS1_MARK),
+       GPIO_FN(STATUS0),
+       GPIO_FN(STATUS1),
 };
 
-static struct pinmux_cfg_reg pinmux_config_regs[] = {
+static const struct pinmux_cfg_reg pinmux_config_regs[] = {
        { PINMUX_CFG_REG("PACR", 0xa4050100, 16, 2) {
                PTA7_FN, PTA7_OUT, PTA7_IN_PU, PTA7_IN,
                PTA6_FN, PTA6_OUT, PTA6_IN_PU, PTA6_IN,
@@ -1138,7 +1141,7 @@ static struct pinmux_cfg_reg pinmux_config_regs[] = {
        {}
 };
 
-static struct pinmux_data_reg pinmux_data_regs[] = {
+static const struct pinmux_data_reg pinmux_data_regs[] = {
        { PINMUX_DATA_REG("PADR", 0xa4050140, 8) {
                PTA7_DATA, PTA6_DATA, PTA5_DATA, PTA4_DATA,
                PTA3_DATA, PTA2_DATA, PTA1_DATA, PTA0_DATA }
@@ -1214,20 +1217,18 @@ static struct pinmux_data_reg pinmux_data_regs[] = {
        { },
 };
 
-struct sh_pfc_soc_info sh7720_pinmux_info = {
+const struct sh_pfc_soc_info sh7720_pinmux_info = {
        .name = "sh7720_pfc",
-       .reserved_id = PINMUX_RESERVED,
-       .data = { PINMUX_DATA_BEGIN, PINMUX_DATA_END },
        .input = { PINMUX_INPUT_BEGIN, PINMUX_INPUT_END },
        .input_pu = { PINMUX_INPUT_PULLUP_BEGIN, PINMUX_INPUT_PULLUP_END },
        .output = { PINMUX_OUTPUT_BEGIN, PINMUX_OUTPUT_END },
-       .mark = { PINMUX_MARK_BEGIN, PINMUX_MARK_END },
        .function = { PINMUX_FUNCTION_BEGIN, PINMUX_FUNCTION_END },
 
-       .first_gpio = GPIO_PTA7,
-       .last_gpio = GPIO_FN_STATUS1,
+       .pins = pinmux_pins,
+       .nr_pins = ARRAY_SIZE(pinmux_pins),
+       .func_gpios = pinmux_func_gpios,
+       .nr_func_gpios = ARRAY_SIZE(pinmux_func_gpios),
 
-       .gpios = pinmux_gpios,
        .cfg_regs = pinmux_config_regs,
        .data_regs = pinmux_data_regs,
 
index 2de0929315e6c257538183e5d640d11f9a0830b3..32034387477b617e951e98878d8ffc6fb405841d 100644 (file)
@@ -296,7 +296,7 @@ enum {
        PINMUX_FUNCTION_END,
 };
 
-static pinmux_enum_t pinmux_data[] = {
+static const pinmux_enum_t pinmux_data[] = {
        /* PTA */
        PINMUX_DATA(PTA7_DATA, PTA7_IN, PTA7_IN_PD, PTA7_OUT),
        PINMUX_DATA(PTA6_DATA, PTA6_IN, PTA6_IN_PD),
@@ -787,7 +787,7 @@ static pinmux_enum_t pinmux_data[] = {
        PINMUX_DATA(KEYOUT5_IN5_MARK, HIZA14_KEYSC, KEYOUT5_IN5),
 };
 
-static struct pinmux_gpio pinmux_gpios[] = {
+static struct sh_pfc_pin pinmux_pins[] = {
        /* PTA */
        PINMUX_GPIO(GPIO_PTA7, PTA7_DATA),
        PINMUX_GPIO(GPIO_PTA6, PTA6_DATA),
@@ -982,289 +982,293 @@ static struct pinmux_gpio pinmux_gpios[] = {
        PINMUX_GPIO(GPIO_PTZ3, PTZ3_DATA),
        PINMUX_GPIO(GPIO_PTZ2, PTZ2_DATA),
        PINMUX_GPIO(GPIO_PTZ1, PTZ1_DATA),
+};
+
+#define PINMUX_FN_BASE ARRAY_SIZE(pinmux_pins)
 
+static const struct pinmux_func pinmux_func_gpios[] = {
        /* SCIF0 */
-       PINMUX_GPIO(GPIO_FN_SCIF0_TXD, SCIF0_TXD_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF0_RXD, SCIF0_RXD_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF0_RTS, SCIF0_RTS_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF0_CTS, SCIF0_CTS_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF0_SCK, SCIF0_SCK_MARK),
+       GPIO_FN(SCIF0_TXD),
+       GPIO_FN(SCIF0_RXD),
+       GPIO_FN(SCIF0_RTS),
+       GPIO_FN(SCIF0_CTS),
+       GPIO_FN(SCIF0_SCK),
 
        /* SCIF1 */
-       PINMUX_GPIO(GPIO_FN_SCIF1_TXD, SCIF1_TXD_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF1_RXD, SCIF1_RXD_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF1_RTS, SCIF1_RTS_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF1_CTS, SCIF1_CTS_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF1_SCK, SCIF1_SCK_MARK),
+       GPIO_FN(SCIF1_TXD),
+       GPIO_FN(SCIF1_RXD),
+       GPIO_FN(SCIF1_RTS),
+       GPIO_FN(SCIF1_CTS),
+       GPIO_FN(SCIF1_SCK),
 
        /* SCIF2 */
-       PINMUX_GPIO(GPIO_FN_SCIF2_TXD, SCIF2_TXD_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF2_RXD, SCIF2_RXD_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF2_RTS, SCIF2_RTS_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF2_CTS, SCIF2_CTS_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF2_SCK, SCIF2_SCK_MARK),
+       GPIO_FN(SCIF2_TXD),
+       GPIO_FN(SCIF2_RXD),
+       GPIO_FN(SCIF2_RTS),
+       GPIO_FN(SCIF2_CTS),
+       GPIO_FN(SCIF2_SCK),
 
        /* SIO */
-       PINMUX_GPIO(GPIO_FN_SIOTXD, SIOTXD_MARK),
-       PINMUX_GPIO(GPIO_FN_SIORXD, SIORXD_MARK),
-       PINMUX_GPIO(GPIO_FN_SIOD, SIOD_MARK),
-       PINMUX_GPIO(GPIO_FN_SIOSTRB0, SIOSTRB0_MARK),
-       PINMUX_GPIO(GPIO_FN_SIOSTRB1, SIOSTRB1_MARK),
-       PINMUX_GPIO(GPIO_FN_SIOSCK, SIOSCK_MARK),
-       PINMUX_GPIO(GPIO_FN_SIOMCK, SIOMCK_MARK),
+       GPIO_FN(SIOTXD),
+       GPIO_FN(SIORXD),
+       GPIO_FN(SIOD),
+       GPIO_FN(SIOSTRB0),
+       GPIO_FN(SIOSTRB1),
+       GPIO_FN(SIOSCK),
+       GPIO_FN(SIOMCK),
 
        /* CEU */
-       PINMUX_GPIO(GPIO_FN_VIO_D15, VIO_D15_MARK),
-       PINMUX_GPIO(GPIO_FN_VIO_D14, VIO_D14_MARK),
-       PINMUX_GPIO(GPIO_FN_VIO_D13, VIO_D13_MARK),
-       PINMUX_GPIO(GPIO_FN_VIO_D12, VIO_D12_MARK),
-       PINMUX_GPIO(GPIO_FN_VIO_D11, VIO_D11_MARK),
-       PINMUX_GPIO(GPIO_FN_VIO_D10, VIO_D10_MARK),
-       PINMUX_GPIO(GPIO_FN_VIO_D9, VIO_D9_MARK),
-       PINMUX_GPIO(GPIO_FN_VIO_D8, VIO_D8_MARK),
-       PINMUX_GPIO(GPIO_FN_VIO_D7, VIO_D7_MARK),
-       PINMUX_GPIO(GPIO_FN_VIO_D6, VIO_D6_MARK),
-       PINMUX_GPIO(GPIO_FN_VIO_D5, VIO_D5_MARK),
-       PINMUX_GPIO(GPIO_FN_VIO_D4, VIO_D4_MARK),
-       PINMUX_GPIO(GPIO_FN_VIO_D3, VIO_D3_MARK),
-       PINMUX_GPIO(GPIO_FN_VIO_D2, VIO_D2_MARK),
-       PINMUX_GPIO(GPIO_FN_VIO_D1, VIO_D1_MARK),
-       PINMUX_GPIO(GPIO_FN_VIO_D0, VIO_D0_MARK),
-       PINMUX_GPIO(GPIO_FN_VIO_CLK, VIO_CLK_MARK),
-       PINMUX_GPIO(GPIO_FN_VIO_VD, VIO_VD_MARK),
-       PINMUX_GPIO(GPIO_FN_VIO_HD, VIO_HD_MARK),
-       PINMUX_GPIO(GPIO_FN_VIO_FLD, VIO_FLD_MARK),
-       PINMUX_GPIO(GPIO_FN_VIO_CKO, VIO_CKO_MARK),
-       PINMUX_GPIO(GPIO_FN_VIO_STEX, VIO_STEX_MARK),
-       PINMUX_GPIO(GPIO_FN_VIO_STEM, VIO_STEM_MARK),
-       PINMUX_GPIO(GPIO_FN_VIO_VD2, VIO_VD2_MARK),
-       PINMUX_GPIO(GPIO_FN_VIO_HD2, VIO_HD2_MARK),
-       PINMUX_GPIO(GPIO_FN_VIO_CLK2, VIO_CLK2_MARK),
+       GPIO_FN(VIO_D15),
+       GPIO_FN(VIO_D14),
+       GPIO_FN(VIO_D13),
+       GPIO_FN(VIO_D12),
+       GPIO_FN(VIO_D11),
+       GPIO_FN(VIO_D10),
+       GPIO_FN(VIO_D9),
+       GPIO_FN(VIO_D8),
+       GPIO_FN(VIO_D7),
+       GPIO_FN(VIO_D6),
+       GPIO_FN(VIO_D5),
+       GPIO_FN(VIO_D4),
+       GPIO_FN(VIO_D3),
+       GPIO_FN(VIO_D2),
+       GPIO_FN(VIO_D1),
+       GPIO_FN(VIO_D0),
+       GPIO_FN(VIO_CLK),
+       GPIO_FN(VIO_VD),
+       GPIO_FN(VIO_HD),
+       GPIO_FN(VIO_FLD),
+       GPIO_FN(VIO_CKO),
+       GPIO_FN(VIO_STEX),
+       GPIO_FN(VIO_STEM),
+       GPIO_FN(VIO_VD2),
+       GPIO_FN(VIO_HD2),
+       GPIO_FN(VIO_CLK2),
 
        /* LCDC */
-       PINMUX_GPIO(GPIO_FN_LCDD23, LCDD23_MARK),
-       PINMUX_GPIO(GPIO_FN_LCDD22, LCDD22_MARK),
-       PINMUX_GPIO(GPIO_FN_LCDD21, LCDD21_MARK),
-       PINMUX_GPIO(GPIO_FN_LCDD20, LCDD20_MARK),
-       PINMUX_GPIO(GPIO_FN_LCDD19, LCDD19_MARK),
-       PINMUX_GPIO(GPIO_FN_LCDD18, LCDD18_MARK),
-       PINMUX_GPIO(GPIO_FN_LCDD17, LCDD17_MARK),
-       PINMUX_GPIO(GPIO_FN_LCDD16, LCDD16_MARK),
-       PINMUX_GPIO(GPIO_FN_LCDD15, LCDD15_MARK),
-       PINMUX_GPIO(GPIO_FN_LCDD14, LCDD14_MARK),
-       PINMUX_GPIO(GPIO_FN_LCDD13, LCDD13_MARK),
-       PINMUX_GPIO(GPIO_FN_LCDD12, LCDD12_MARK),
-       PINMUX_GPIO(GPIO_FN_LCDD11, LCDD11_MARK),
-       PINMUX_GPIO(GPIO_FN_LCDD10, LCDD10_MARK),
-       PINMUX_GPIO(GPIO_FN_LCDD9, LCDD9_MARK),
-       PINMUX_GPIO(GPIO_FN_LCDD8, LCDD8_MARK),
-       PINMUX_GPIO(GPIO_FN_LCDD7, LCDD7_MARK),
-       PINMUX_GPIO(GPIO_FN_LCDD6, LCDD6_MARK),
-       PINMUX_GPIO(GPIO_FN_LCDD5, LCDD5_MARK),
-       PINMUX_GPIO(GPIO_FN_LCDD4, LCDD4_MARK),
-       PINMUX_GPIO(GPIO_FN_LCDD3, LCDD3_MARK),
-       PINMUX_GPIO(GPIO_FN_LCDD2, LCDD2_MARK),
-       PINMUX_GPIO(GPIO_FN_LCDD1, LCDD1_MARK),
-       PINMUX_GPIO(GPIO_FN_LCDD0, LCDD0_MARK),
-       PINMUX_GPIO(GPIO_FN_LCDLCLK, LCDLCLK_MARK),
+       GPIO_FN(LCDD23),
+       GPIO_FN(LCDD22),
+       GPIO_FN(LCDD21),
+       GPIO_FN(LCDD20),
+       GPIO_FN(LCDD19),
+       GPIO_FN(LCDD18),
+       GPIO_FN(LCDD17),
+       GPIO_FN(LCDD16),
+       GPIO_FN(LCDD15),
+       GPIO_FN(LCDD14),
+       GPIO_FN(LCDD13),
+       GPIO_FN(LCDD12),
+       GPIO_FN(LCDD11),
+       GPIO_FN(LCDD10),
+       GPIO_FN(LCDD9),
+       GPIO_FN(LCDD8),
+       GPIO_FN(LCDD7),
+       GPIO_FN(LCDD6),
+       GPIO_FN(LCDD5),
+       GPIO_FN(LCDD4),
+       GPIO_FN(LCDD3),
+       GPIO_FN(LCDD2),
+       GPIO_FN(LCDD1),
+       GPIO_FN(LCDD0),
+       GPIO_FN(LCDLCLK),
        /* Main LCD */
-       PINMUX_GPIO(GPIO_FN_LCDDON, LCDDON_MARK),
-       PINMUX_GPIO(GPIO_FN_LCDVCPWC, LCDVCPWC_MARK),
-       PINMUX_GPIO(GPIO_FN_LCDVEPWC, LCDVEPWC_MARK),
-       PINMUX_GPIO(GPIO_FN_LCDVSYN, LCDVSYN_MARK),
+       GPIO_FN(LCDDON),
+       GPIO_FN(LCDVCPWC),
+       GPIO_FN(LCDVEPWC),
+       GPIO_FN(LCDVSYN),
        /* Main LCD - RGB Mode */
-       PINMUX_GPIO(GPIO_FN_LCDDCK, LCDDCK_MARK),
-       PINMUX_GPIO(GPIO_FN_LCDHSYN, LCDHSYN_MARK),
-       PINMUX_GPIO(GPIO_FN_LCDDISP, LCDDISP_MARK),
+       GPIO_FN(LCDDCK),
+       GPIO_FN(LCDHSYN),
+       GPIO_FN(LCDDISP),
        /* Main LCD - SYS Mode */
-       PINMUX_GPIO(GPIO_FN_LCDRS, LCDRS_MARK),
-       PINMUX_GPIO(GPIO_FN_LCDCS, LCDCS_MARK),
-       PINMUX_GPIO(GPIO_FN_LCDWR, LCDWR_MARK),
-       PINMUX_GPIO(GPIO_FN_LCDRD, LCDRD_MARK),
+       GPIO_FN(LCDRS),
+       GPIO_FN(LCDCS),
+       GPIO_FN(LCDWR),
+       GPIO_FN(LCDRD),
        /* Sub LCD - SYS Mode */
-       PINMUX_GPIO(GPIO_FN_LCDDON2, LCDDON2_MARK),
-       PINMUX_GPIO(GPIO_FN_LCDVCPWC2, LCDVCPWC2_MARK),
-       PINMUX_GPIO(GPIO_FN_LCDVEPWC2, LCDVEPWC2_MARK),
-       PINMUX_GPIO(GPIO_FN_LCDVSYN2, LCDVSYN2_MARK),
-       PINMUX_GPIO(GPIO_FN_LCDCS2, LCDCS2_MARK),
+       GPIO_FN(LCDDON2),
+       GPIO_FN(LCDVCPWC2),
+       GPIO_FN(LCDVEPWC2),
+       GPIO_FN(LCDVSYN2),
+       GPIO_FN(LCDCS2),
 
        /* BSC */
-       PINMUX_GPIO(GPIO_FN_IOIS16, IOIS16_MARK),
-       PINMUX_GPIO(GPIO_FN_A25, A25_MARK),
-       PINMUX_GPIO(GPIO_FN_A24, A24_MARK),
-       PINMUX_GPIO(GPIO_FN_A23, A23_MARK),
-       PINMUX_GPIO(GPIO_FN_A22, A22_MARK),
-       PINMUX_GPIO(GPIO_FN_BS, BS_MARK),
-       PINMUX_GPIO(GPIO_FN_CS6B_CE1B, CS6B_CE1B_MARK),
-       PINMUX_GPIO(GPIO_FN_WAIT, WAIT_MARK),
-       PINMUX_GPIO(GPIO_FN_CS6A_CE2B, CS6A_CE2B_MARK),
+       GPIO_FN(IOIS16),
+       GPIO_FN(A25),
+       GPIO_FN(A24),
+       GPIO_FN(A23),
+       GPIO_FN(A22),
+       GPIO_FN(BS),
+       GPIO_FN(CS6B_CE1B),
+       GPIO_FN(WAIT),
+       GPIO_FN(CS6A_CE2B),
 
        /* SBSC */
-       PINMUX_GPIO(GPIO_FN_HPD63, HPD63_MARK),
-       PINMUX_GPIO(GPIO_FN_HPD62, HPD62_MARK),
-       PINMUX_GPIO(GPIO_FN_HPD61, HPD61_MARK),
-       PINMUX_GPIO(GPIO_FN_HPD60, HPD60_MARK),
-       PINMUX_GPIO(GPIO_FN_HPD59, HPD59_MARK),
-       PINMUX_GPIO(GPIO_FN_HPD58, HPD58_MARK),
-       PINMUX_GPIO(GPIO_FN_HPD57, HPD57_MARK),
-       PINMUX_GPIO(GPIO_FN_HPD56, HPD56_MARK),
-       PINMUX_GPIO(GPIO_FN_HPD55, HPD55_MARK),
-       PINMUX_GPIO(GPIO_FN_HPD54, HPD54_MARK),
-       PINMUX_GPIO(GPIO_FN_HPD53, HPD53_MARK),
-       PINMUX_GPIO(GPIO_FN_HPD52, HPD52_MARK),
-       PINMUX_GPIO(GPIO_FN_HPD51, HPD51_MARK),
-       PINMUX_GPIO(GPIO_FN_HPD50, HPD50_MARK),
-       PINMUX_GPIO(GPIO_FN_HPD49, HPD49_MARK),
-       PINMUX_GPIO(GPIO_FN_HPD48, HPD48_MARK),
-       PINMUX_GPIO(GPIO_FN_HPDQM7, HPDQM7_MARK),
-       PINMUX_GPIO(GPIO_FN_HPDQM6, HPDQM6_MARK),
-       PINMUX_GPIO(GPIO_FN_HPDQM5, HPDQM5_MARK),
-       PINMUX_GPIO(GPIO_FN_HPDQM4, HPDQM4_MARK),
+       GPIO_FN(HPD63),
+       GPIO_FN(HPD62),
+       GPIO_FN(HPD61),
+       GPIO_FN(HPD60),
+       GPIO_FN(HPD59),
+       GPIO_FN(HPD58),
+       GPIO_FN(HPD57),
+       GPIO_FN(HPD56),
+       GPIO_FN(HPD55),
+       GPIO_FN(HPD54),
+       GPIO_FN(HPD53),
+       GPIO_FN(HPD52),
+       GPIO_FN(HPD51),
+       GPIO_FN(HPD50),
+       GPIO_FN(HPD49),
+       GPIO_FN(HPD48),
+       GPIO_FN(HPDQM7),
+       GPIO_FN(HPDQM6),
+       GPIO_FN(HPDQM5),
+       GPIO_FN(HPDQM4),
 
        /* IRQ */
-       PINMUX_GPIO(GPIO_FN_IRQ0, IRQ0_MARK),
-       PINMUX_GPIO(GPIO_FN_IRQ1, IRQ1_MARK),
-       PINMUX_GPIO(GPIO_FN_IRQ2, IRQ2_MARK),
-       PINMUX_GPIO(GPIO_FN_IRQ3, IRQ3_MARK),
-       PINMUX_GPIO(GPIO_FN_IRQ4, IRQ4_MARK),
-       PINMUX_GPIO(GPIO_FN_IRQ5, IRQ5_MARK),
-       PINMUX_GPIO(GPIO_FN_IRQ6, IRQ6_MARK),
-       PINMUX_GPIO(GPIO_FN_IRQ7, IRQ7_MARK),
+       GPIO_FN(IRQ0),
+       GPIO_FN(IRQ1),
+       GPIO_FN(IRQ2),
+       GPIO_FN(IRQ3),
+       GPIO_FN(IRQ4),
+       GPIO_FN(IRQ5),
+       GPIO_FN(IRQ6),
+       GPIO_FN(IRQ7),
 
        /* SDHI */
-       PINMUX_GPIO(GPIO_FN_SDHICD, SDHICD_MARK),
-       PINMUX_GPIO(GPIO_FN_SDHIWP, SDHIWP_MARK),
-       PINMUX_GPIO(GPIO_FN_SDHID3, SDHID3_MARK),
-       PINMUX_GPIO(GPIO_FN_SDHID2, SDHID2_MARK),
-       PINMUX_GPIO(GPIO_FN_SDHID1, SDHID1_MARK),
-       PINMUX_GPIO(GPIO_FN_SDHID0, SDHID0_MARK),
-       PINMUX_GPIO(GPIO_FN_SDHICMD, SDHICMD_MARK),
-       PINMUX_GPIO(GPIO_FN_SDHICLK, SDHICLK_MARK),
+       GPIO_FN(SDHICD),
+       GPIO_FN(SDHIWP),
+       GPIO_FN(SDHID3),
+       GPIO_FN(SDHID2),
+       GPIO_FN(SDHID1),
+       GPIO_FN(SDHID0),
+       GPIO_FN(SDHICMD),
+       GPIO_FN(SDHICLK),
 
        /* SIU - Port A */
-       PINMUX_GPIO(GPIO_FN_SIUAOLR, SIUAOLR_MARK),
-       PINMUX_GPIO(GPIO_FN_SIUAOBT, SIUAOBT_MARK),
-       PINMUX_GPIO(GPIO_FN_SIUAISLD, SIUAISLD_MARK),
-       PINMUX_GPIO(GPIO_FN_SIUAILR, SIUAILR_MARK),
-       PINMUX_GPIO(GPIO_FN_SIUAIBT, SIUAIBT_MARK),
-       PINMUX_GPIO(GPIO_FN_SIUAOSLD, SIUAOSLD_MARK),
-       PINMUX_GPIO(GPIO_FN_SIUMCKA, SIUMCKA_MARK),
-       PINMUX_GPIO(GPIO_FN_SIUFCKA, SIUFCKA_MARK),
+       GPIO_FN(SIUAOLR),
+       GPIO_FN(SIUAOBT),
+       GPIO_FN(SIUAISLD),
+       GPIO_FN(SIUAILR),
+       GPIO_FN(SIUAIBT),
+       GPIO_FN(SIUAOSLD),
+       GPIO_FN(SIUMCKA),
+       GPIO_FN(SIUFCKA),
 
        /* SIU - Port B */
-       PINMUX_GPIO(GPIO_FN_SIUBOLR, SIUBOLR_MARK),
-       PINMUX_GPIO(GPIO_FN_SIUBOBT, SIUBOBT_MARK),
-       PINMUX_GPIO(GPIO_FN_SIUBISLD, SIUBISLD_MARK),
-       PINMUX_GPIO(GPIO_FN_SIUBILR, SIUBILR_MARK),
-       PINMUX_GPIO(GPIO_FN_SIUBIBT, SIUBIBT_MARK),
-       PINMUX_GPIO(GPIO_FN_SIUBOSLD, SIUBOSLD_MARK),
-       PINMUX_GPIO(GPIO_FN_SIUMCKB, SIUMCKB_MARK),
-       PINMUX_GPIO(GPIO_FN_SIUFCKB, SIUFCKB_MARK),
+       GPIO_FN(SIUBOLR),
+       GPIO_FN(SIUBOBT),
+       GPIO_FN(SIUBISLD),
+       GPIO_FN(SIUBILR),
+       GPIO_FN(SIUBIBT),
+       GPIO_FN(SIUBOSLD),
+       GPIO_FN(SIUMCKB),
+       GPIO_FN(SIUFCKB),
 
        /* AUD */
-       PINMUX_GPIO(GPIO_FN_AUDSYNC, AUDSYNC_MARK),
-       PINMUX_GPIO(GPIO_FN_AUDATA3, AUDATA3_MARK),
-       PINMUX_GPIO(GPIO_FN_AUDATA2, AUDATA2_MARK),
-       PINMUX_GPIO(GPIO_FN_AUDATA1, AUDATA1_MARK),
-       PINMUX_GPIO(GPIO_FN_AUDATA0, AUDATA0_MARK),
+       GPIO_FN(AUDSYNC),
+       GPIO_FN(AUDATA3),
+       GPIO_FN(AUDATA2),
+       GPIO_FN(AUDATA1),
+       GPIO_FN(AUDATA0),
 
        /* DMAC */
-       PINMUX_GPIO(GPIO_FN_DACK, DACK_MARK),
-       PINMUX_GPIO(GPIO_FN_DREQ0, DREQ0_MARK),
+       GPIO_FN(DACK),
+       GPIO_FN(DREQ0),
 
        /* VOU */
-       PINMUX_GPIO(GPIO_FN_DV_CLKI, DV_CLKI_MARK),
-       PINMUX_GPIO(GPIO_FN_DV_CLK, DV_CLK_MARK),
-       PINMUX_GPIO(GPIO_FN_DV_HSYNC, DV_HSYNC_MARK),
-       PINMUX_GPIO(GPIO_FN_DV_VSYNC, DV_VSYNC_MARK),
-       PINMUX_GPIO(GPIO_FN_DV_D15, DV_D15_MARK),
-       PINMUX_GPIO(GPIO_FN_DV_D14, DV_D14_MARK),
-       PINMUX_GPIO(GPIO_FN_DV_D13, DV_D13_MARK),
-       PINMUX_GPIO(GPIO_FN_DV_D12, DV_D12_MARK),
-       PINMUX_GPIO(GPIO_FN_DV_D11, DV_D11_MARK),
-       PINMUX_GPIO(GPIO_FN_DV_D10, DV_D10_MARK),
-       PINMUX_GPIO(GPIO_FN_DV_D9, DV_D9_MARK),
-       PINMUX_GPIO(GPIO_FN_DV_D8, DV_D8_MARK),
-       PINMUX_GPIO(GPIO_FN_DV_D7, DV_D7_MARK),
-       PINMUX_GPIO(GPIO_FN_DV_D6, DV_D6_MARK),
-       PINMUX_GPIO(GPIO_FN_DV_D5, DV_D5_MARK),
-       PINMUX_GPIO(GPIO_FN_DV_D4, DV_D4_MARK),
-       PINMUX_GPIO(GPIO_FN_DV_D3, DV_D3_MARK),
-       PINMUX_GPIO(GPIO_FN_DV_D2, DV_D2_MARK),
-       PINMUX_GPIO(GPIO_FN_DV_D1, DV_D1_MARK),
-       PINMUX_GPIO(GPIO_FN_DV_D0, DV_D0_MARK),
+       GPIO_FN(DV_CLKI),
+       GPIO_FN(DV_CLK),
+       GPIO_FN(DV_HSYNC),
+       GPIO_FN(DV_VSYNC),
+       GPIO_FN(DV_D15),
+       GPIO_FN(DV_D14),
+       GPIO_FN(DV_D13),
+       GPIO_FN(DV_D12),
+       GPIO_FN(DV_D11),
+       GPIO_FN(DV_D10),
+       GPIO_FN(DV_D9),
+       GPIO_FN(DV_D8),
+       GPIO_FN(DV_D7),
+       GPIO_FN(DV_D6),
+       GPIO_FN(DV_D5),
+       GPIO_FN(DV_D4),
+       GPIO_FN(DV_D3),
+       GPIO_FN(DV_D2),
+       GPIO_FN(DV_D1),
+       GPIO_FN(DV_D0),
 
        /* CPG */
-       PINMUX_GPIO(GPIO_FN_STATUS0, STATUS0_MARK),
-       PINMUX_GPIO(GPIO_FN_PDSTATUS, PDSTATUS_MARK),
+       GPIO_FN(STATUS0),
+       GPIO_FN(PDSTATUS),
 
        /* SIOF0 */
-       PINMUX_GPIO(GPIO_FN_SIOF0_MCK, SIOF0_MCK_MARK),
-       PINMUX_GPIO(GPIO_FN_SIOF0_SCK, SIOF0_SCK_MARK),
-       PINMUX_GPIO(GPIO_FN_SIOF0_SYNC, SIOF0_SYNC_MARK),
-       PINMUX_GPIO(GPIO_FN_SIOF0_SS1, SIOF0_SS1_MARK),
-       PINMUX_GPIO(GPIO_FN_SIOF0_SS2, SIOF0_SS2_MARK),
-       PINMUX_GPIO(GPIO_FN_SIOF0_TXD, SIOF0_TXD_MARK),
-       PINMUX_GPIO(GPIO_FN_SIOF0_RXD, SIOF0_RXD_MARK),
+       GPIO_FN(SIOF0_MCK),
+       GPIO_FN(SIOF0_SCK),
+       GPIO_FN(SIOF0_SYNC),
+       GPIO_FN(SIOF0_SS1),
+       GPIO_FN(SIOF0_SS2),
+       GPIO_FN(SIOF0_TXD),
+       GPIO_FN(SIOF0_RXD),
 
        /* SIOF1 */
-       PINMUX_GPIO(GPIO_FN_SIOF1_MCK, SIOF1_MCK_MARK),
-       PINMUX_GPIO(GPIO_FN_SIOF1_SCK, SIOF1_SCK_MARK),
-       PINMUX_GPIO(GPIO_FN_SIOF1_SYNC, SIOF1_SYNC_MARK),
-       PINMUX_GPIO(GPIO_FN_SIOF1_SS1, SIOF1_SS1_MARK),
-       PINMUX_GPIO(GPIO_FN_SIOF1_SS2, SIOF1_SS2_MARK),
-       PINMUX_GPIO(GPIO_FN_SIOF1_TXD, SIOF1_TXD_MARK),
-       PINMUX_GPIO(GPIO_FN_SIOF1_RXD, SIOF1_RXD_MARK),
+       GPIO_FN(SIOF1_MCK),
+       GPIO_FN(SIOF1_SCK),
+       GPIO_FN(SIOF1_SYNC),
+       GPIO_FN(SIOF1_SS1),
+       GPIO_FN(SIOF1_SS2),
+       GPIO_FN(SIOF1_TXD),
+       GPIO_FN(SIOF1_RXD),
 
        /* SIM */
-       PINMUX_GPIO(GPIO_FN_SIM_D, SIM_D_MARK),
-       PINMUX_GPIO(GPIO_FN_SIM_CLK, SIM_CLK_MARK),
-       PINMUX_GPIO(GPIO_FN_SIM_RST, SIM_RST_MARK),
+       GPIO_FN(SIM_D),
+       GPIO_FN(SIM_CLK),
+       GPIO_FN(SIM_RST),
 
        /* TSIF */
-       PINMUX_GPIO(GPIO_FN_TS_SDAT, TS_SDAT_MARK),
-       PINMUX_GPIO(GPIO_FN_TS_SCK, TS_SCK_MARK),
-       PINMUX_GPIO(GPIO_FN_TS_SDEN, TS_SDEN_MARK),
-       PINMUX_GPIO(GPIO_FN_TS_SPSYNC, TS_SPSYNC_MARK),
+       GPIO_FN(TS_SDAT),
+       GPIO_FN(TS_SCK),
+       GPIO_FN(TS_SDEN),
+       GPIO_FN(TS_SPSYNC),
 
        /* IRDA */
-       PINMUX_GPIO(GPIO_FN_IRDA_IN, IRDA_IN_MARK),
-       PINMUX_GPIO(GPIO_FN_IRDA_OUT, IRDA_OUT_MARK),
+       GPIO_FN(IRDA_IN),
+       GPIO_FN(IRDA_OUT),
 
        /* TPU */
-       PINMUX_GPIO(GPIO_FN_TPUTO, TPUTO_MARK),
+       GPIO_FN(TPUTO),
 
        /* FLCTL */
-       PINMUX_GPIO(GPIO_FN_FCE, FCE_MARK),
-       PINMUX_GPIO(GPIO_FN_NAF7, NAF7_MARK),
-       PINMUX_GPIO(GPIO_FN_NAF6, NAF6_MARK),
-       PINMUX_GPIO(GPIO_FN_NAF5, NAF5_MARK),
-       PINMUX_GPIO(GPIO_FN_NAF4, NAF4_MARK),
-       PINMUX_GPIO(GPIO_FN_NAF3, NAF3_MARK),
-       PINMUX_GPIO(GPIO_FN_NAF2, NAF2_MARK),
-       PINMUX_GPIO(GPIO_FN_NAF1, NAF1_MARK),
-       PINMUX_GPIO(GPIO_FN_NAF0, NAF0_MARK),
-       PINMUX_GPIO(GPIO_FN_FCDE, FCDE_MARK),
-       PINMUX_GPIO(GPIO_FN_FOE, FOE_MARK),
-       PINMUX_GPIO(GPIO_FN_FSC, FSC_MARK),
-       PINMUX_GPIO(GPIO_FN_FWE, FWE_MARK),
-       PINMUX_GPIO(GPIO_FN_FRB, FRB_MARK),
+       GPIO_FN(FCE),
+       GPIO_FN(NAF7),
+       GPIO_FN(NAF6),
+       GPIO_FN(NAF5),
+       GPIO_FN(NAF4),
+       GPIO_FN(NAF3),
+       GPIO_FN(NAF2),
+       GPIO_FN(NAF1),
+       GPIO_FN(NAF0),
+       GPIO_FN(FCDE),
+       GPIO_FN(FOE),
+       GPIO_FN(FSC),
+       GPIO_FN(FWE),
+       GPIO_FN(FRB),
 
        /* KEYSC */
-       PINMUX_GPIO(GPIO_FN_KEYIN0, KEYIN0_MARK),
-       PINMUX_GPIO(GPIO_FN_KEYIN1, KEYIN1_MARK),
-       PINMUX_GPIO(GPIO_FN_KEYIN2, KEYIN2_MARK),
-       PINMUX_GPIO(GPIO_FN_KEYIN3, KEYIN3_MARK),
-       PINMUX_GPIO(GPIO_FN_KEYIN4, KEYIN4_MARK),
-       PINMUX_GPIO(GPIO_FN_KEYOUT0, KEYOUT0_MARK),
-       PINMUX_GPIO(GPIO_FN_KEYOUT1, KEYOUT1_MARK),
-       PINMUX_GPIO(GPIO_FN_KEYOUT2, KEYOUT2_MARK),
-       PINMUX_GPIO(GPIO_FN_KEYOUT3, KEYOUT3_MARK),
-       PINMUX_GPIO(GPIO_FN_KEYOUT4_IN6, KEYOUT4_IN6_MARK),
-       PINMUX_GPIO(GPIO_FN_KEYOUT5_IN5, KEYOUT5_IN5_MARK),
+       GPIO_FN(KEYIN0),
+       GPIO_FN(KEYIN1),
+       GPIO_FN(KEYIN2),
+       GPIO_FN(KEYIN3),
+       GPIO_FN(KEYIN4),
+       GPIO_FN(KEYOUT0),
+       GPIO_FN(KEYOUT1),
+       GPIO_FN(KEYOUT2),
+       GPIO_FN(KEYOUT3),
+       GPIO_FN(KEYOUT4_IN6),
+       GPIO_FN(KEYOUT5_IN5),
 };
 
-static struct pinmux_cfg_reg pinmux_config_regs[] = {
+static const struct pinmux_cfg_reg pinmux_config_regs[] = {
        { PINMUX_CFG_REG("PACR", 0xa4050100, 16, 2) {
                VIO_D7_SCIF1_SCK, PTA7_OUT, PTA7_IN_PD, PTA7_IN,
                VIO_D6_SCIF1_RXD, 0, PTA6_IN_PD, PTA6_IN,
@@ -1660,7 +1664,7 @@ static struct pinmux_cfg_reg pinmux_config_regs[] = {
        {}
 };
 
-static struct pinmux_data_reg pinmux_data_regs[] = {
+static const struct pinmux_data_reg pinmux_data_regs[] = {
        { PINMUX_DATA_REG("PADR", 0xa4050120, 8) {
                PTA7_DATA, PTA6_DATA, PTA5_DATA, PTA4_DATA,
                PTA3_DATA, PTA2_DATA, PTA1_DATA, PTA0_DATA }
@@ -1756,21 +1760,19 @@ static struct pinmux_data_reg pinmux_data_regs[] = {
        { },
 };
 
-struct sh_pfc_soc_info sh7722_pinmux_info = {
+const struct sh_pfc_soc_info sh7722_pinmux_info = {
        .name = "sh7722_pfc",
-       .reserved_id = PINMUX_RESERVED,
-       .data = { PINMUX_DATA_BEGIN, PINMUX_DATA_END },
        .input = { PINMUX_INPUT_BEGIN, PINMUX_INPUT_END },
        .input_pd = { PINMUX_INPUT_PULLDOWN_BEGIN, PINMUX_INPUT_PULLDOWN_END },
        .input_pu = { PINMUX_INPUT_PULLUP_BEGIN, PINMUX_INPUT_PULLUP_END },
        .output = { PINMUX_OUTPUT_BEGIN, PINMUX_OUTPUT_END },
-       .mark = { PINMUX_MARK_BEGIN, PINMUX_MARK_END },
        .function = { PINMUX_FUNCTION_BEGIN, PINMUX_FUNCTION_END },
 
-       .first_gpio = GPIO_PTA7,
-       .last_gpio = GPIO_FN_KEYOUT5_IN5,
+       .pins = pinmux_pins,
+       .nr_pins = ARRAY_SIZE(pinmux_pins),
+       .func_gpios = pinmux_func_gpios,
+       .nr_func_gpios = ARRAY_SIZE(pinmux_func_gpios),
 
-       .gpios = pinmux_gpios,
        .cfg_regs = pinmux_config_regs,
        .data_regs = pinmux_data_regs,
 
index 609673d3d70ef976a6f1f5ffc2d57d1464831b06..07ad1d8d6c8b7333b43ccd35b2c3b2e8da886c73 100644 (file)
@@ -350,7 +350,7 @@ enum {
        PINMUX_MARK_END,
 };
 
-static pinmux_enum_t pinmux_data[] = {
+static const pinmux_enum_t pinmux_data[] = {
        /* PTA GPIO */
        PINMUX_DATA(PTA7_DATA, PTA7_IN, PTA7_OUT),
        PINMUX_DATA(PTA6_DATA, PTA6_IN, PTA6_OUT),
@@ -923,7 +923,7 @@ static pinmux_enum_t pinmux_data[] = {
        PINMUX_DATA(SIUBISLD_MARK, PSD1_PSD0_FN2, PTZ0_FN),
 };
 
-static struct pinmux_gpio pinmux_gpios[] = {
+static struct sh_pfc_pin pinmux_pins[] = {
        /* PTA */
        PINMUX_GPIO(GPIO_PTA7, PTA7_DATA),
        PINMUX_GPIO(GPIO_PTA6, PTA6_DATA),
@@ -1139,379 +1139,383 @@ static struct pinmux_gpio pinmux_gpios[] = {
        PINMUX_GPIO(GPIO_PTZ2, PTZ2_DATA),
        PINMUX_GPIO(GPIO_PTZ1, PTZ1_DATA),
        PINMUX_GPIO(GPIO_PTZ0, PTZ0_DATA),
+};
+
+#define PINMUX_FN_BASE ARRAY_SIZE(pinmux_pins)
 
+static const struct pinmux_func pinmux_func_gpios[] = {
        /* SCIF0 */
-       PINMUX_GPIO(GPIO_FN_SCIF0_PTT_TXD, SCIF0_PTT_TXD_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF0_PTT_RXD, SCIF0_PTT_RXD_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF0_PTT_SCK, SCIF0_PTT_SCK_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF0_PTU_TXD, SCIF0_PTU_TXD_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF0_PTU_RXD, SCIF0_PTU_RXD_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF0_PTU_SCK, SCIF0_PTU_SCK_MARK),
+       GPIO_FN(SCIF0_PTT_TXD),
+       GPIO_FN(SCIF0_PTT_RXD),
+       GPIO_FN(SCIF0_PTT_SCK),
+       GPIO_FN(SCIF0_PTU_TXD),
+       GPIO_FN(SCIF0_PTU_RXD),
+       GPIO_FN(SCIF0_PTU_SCK),
 
        /* SCIF1 */
-       PINMUX_GPIO(GPIO_FN_SCIF1_PTS_TXD, SCIF1_PTS_TXD_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF1_PTS_RXD, SCIF1_PTS_RXD_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF1_PTS_SCK, SCIF1_PTS_SCK_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF1_PTV_TXD, SCIF1_PTV_TXD_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF1_PTV_RXD, SCIF1_PTV_RXD_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF1_PTV_SCK, SCIF1_PTV_SCK_MARK),
+       GPIO_FN(SCIF1_PTS_TXD),
+       GPIO_FN(SCIF1_PTS_RXD),
+       GPIO_FN(SCIF1_PTS_SCK),
+       GPIO_FN(SCIF1_PTV_TXD),
+       GPIO_FN(SCIF1_PTV_RXD),
+       GPIO_FN(SCIF1_PTV_SCK),
 
        /* SCIF2 */
-       PINMUX_GPIO(GPIO_FN_SCIF2_PTT_TXD, SCIF2_PTT_TXD_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF2_PTT_RXD, SCIF2_PTT_RXD_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF2_PTT_SCK, SCIF2_PTT_SCK_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF2_PTU_TXD, SCIF2_PTU_TXD_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF2_PTU_RXD, SCIF2_PTU_RXD_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF2_PTU_SCK, SCIF2_PTU_SCK_MARK),
+       GPIO_FN(SCIF2_PTT_TXD),
+       GPIO_FN(SCIF2_PTT_RXD),
+       GPIO_FN(SCIF2_PTT_SCK),
+       GPIO_FN(SCIF2_PTU_TXD),
+       GPIO_FN(SCIF2_PTU_RXD),
+       GPIO_FN(SCIF2_PTU_SCK),
 
        /* SCIF3 */
-       PINMUX_GPIO(GPIO_FN_SCIF3_PTS_TXD, SCIF3_PTS_TXD_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF3_PTS_RXD, SCIF3_PTS_RXD_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF3_PTS_SCK, SCIF3_PTS_SCK_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF3_PTS_RTS, SCIF3_PTS_RTS_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF3_PTS_CTS, SCIF3_PTS_CTS_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF3_PTV_TXD, SCIF3_PTV_TXD_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF3_PTV_RXD, SCIF3_PTV_RXD_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF3_PTV_SCK, SCIF3_PTV_SCK_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF3_PTV_RTS, SCIF3_PTV_RTS_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF3_PTV_CTS, SCIF3_PTV_CTS_MARK),
+       GPIO_FN(SCIF3_PTS_TXD),
+       GPIO_FN(SCIF3_PTS_RXD),
+       GPIO_FN(SCIF3_PTS_SCK),
+       GPIO_FN(SCIF3_PTS_RTS),
+       GPIO_FN(SCIF3_PTS_CTS),
+       GPIO_FN(SCIF3_PTV_TXD),
+       GPIO_FN(SCIF3_PTV_RXD),
+       GPIO_FN(SCIF3_PTV_SCK),
+       GPIO_FN(SCIF3_PTV_RTS),
+       GPIO_FN(SCIF3_PTV_CTS),
 
        /* SCIF4 */
-       PINMUX_GPIO(GPIO_FN_SCIF4_PTE_TXD, SCIF4_PTE_TXD_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF4_PTE_RXD, SCIF4_PTE_RXD_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF4_PTE_SCK, SCIF4_PTE_SCK_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF4_PTN_TXD, SCIF4_PTN_TXD_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF4_PTN_RXD, SCIF4_PTN_RXD_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF4_PTN_SCK, SCIF4_PTN_SCK_MARK),
+       GPIO_FN(SCIF4_PTE_TXD),
+       GPIO_FN(SCIF4_PTE_RXD),
+       GPIO_FN(SCIF4_PTE_SCK),
+       GPIO_FN(SCIF4_PTN_TXD),
+       GPIO_FN(SCIF4_PTN_RXD),
+       GPIO_FN(SCIF4_PTN_SCK),
 
        /* SCIF5 */
-       PINMUX_GPIO(GPIO_FN_SCIF5_PTE_TXD, SCIF5_PTE_TXD_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF5_PTE_RXD, SCIF5_PTE_RXD_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF5_PTE_SCK, SCIF5_PTE_SCK_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF5_PTN_TXD, SCIF5_PTN_TXD_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF5_PTN_RXD, SCIF5_PTN_RXD_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF5_PTN_SCK, SCIF5_PTN_SCK_MARK),
+       GPIO_FN(SCIF5_PTE_TXD),
+       GPIO_FN(SCIF5_PTE_RXD),
+       GPIO_FN(SCIF5_PTE_SCK),
+       GPIO_FN(SCIF5_PTN_TXD),
+       GPIO_FN(SCIF5_PTN_RXD),
+       GPIO_FN(SCIF5_PTN_SCK),
 
        /* CEU */
-       PINMUX_GPIO(GPIO_FN_VIO_D15, VIO_D15_MARK),
-       PINMUX_GPIO(GPIO_FN_VIO_D14, VIO_D14_MARK),
-       PINMUX_GPIO(GPIO_FN_VIO_D13, VIO_D13_MARK),
-       PINMUX_GPIO(GPIO_FN_VIO_D12, VIO_D12_MARK),
-       PINMUX_GPIO(GPIO_FN_VIO_D11, VIO_D11_MARK),
-       PINMUX_GPIO(GPIO_FN_VIO_D10, VIO_D10_MARK),
-       PINMUX_GPIO(GPIO_FN_VIO_D9, VIO_D9_MARK),
-       PINMUX_GPIO(GPIO_FN_VIO_D8, VIO_D8_MARK),
-       PINMUX_GPIO(GPIO_FN_VIO_D7, VIO_D7_MARK),
-       PINMUX_GPIO(GPIO_FN_VIO_D6, VIO_D6_MARK),
-       PINMUX_GPIO(GPIO_FN_VIO_D5, VIO_D5_MARK),
-       PINMUX_GPIO(GPIO_FN_VIO_D4, VIO_D4_MARK),
-       PINMUX_GPIO(GPIO_FN_VIO_D3, VIO_D3_MARK),
-       PINMUX_GPIO(GPIO_FN_VIO_D2, VIO_D2_MARK),
-       PINMUX_GPIO(GPIO_FN_VIO_D1, VIO_D1_MARK),
-       PINMUX_GPIO(GPIO_FN_VIO_D0, VIO_D0_MARK),
-       PINMUX_GPIO(GPIO_FN_VIO_CLK1, VIO_CLK1_MARK),
-       PINMUX_GPIO(GPIO_FN_VIO_VD1, VIO_VD1_MARK),
-       PINMUX_GPIO(GPIO_FN_VIO_HD1, VIO_HD1_MARK),
-       PINMUX_GPIO(GPIO_FN_VIO_FLD, VIO_FLD_MARK),
-       PINMUX_GPIO(GPIO_FN_VIO_CKO, VIO_CKO_MARK),
-       PINMUX_GPIO(GPIO_FN_VIO_VD2, VIO_VD2_MARK),
-       PINMUX_GPIO(GPIO_FN_VIO_HD2, VIO_HD2_MARK),
-       PINMUX_GPIO(GPIO_FN_VIO_CLK2, VIO_CLK2_MARK),
+       GPIO_FN(VIO_D15),
+       GPIO_FN(VIO_D14),
+       GPIO_FN(VIO_D13),
+       GPIO_FN(VIO_D12),
+       GPIO_FN(VIO_D11),
+       GPIO_FN(VIO_D10),
+       GPIO_FN(VIO_D9),
+       GPIO_FN(VIO_D8),
+       GPIO_FN(VIO_D7),
+       GPIO_FN(VIO_D6),
+       GPIO_FN(VIO_D5),
+       GPIO_FN(VIO_D4),
+       GPIO_FN(VIO_D3),
+       GPIO_FN(VIO_D2),
+       GPIO_FN(VIO_D1),
+       GPIO_FN(VIO_D0),
+       GPIO_FN(VIO_CLK1),
+       GPIO_FN(VIO_VD1),
+       GPIO_FN(VIO_HD1),
+       GPIO_FN(VIO_FLD),
+       GPIO_FN(VIO_CKO),
+       GPIO_FN(VIO_VD2),
+       GPIO_FN(VIO_HD2),
+       GPIO_FN(VIO_CLK2),
 
        /* LCDC */
-       PINMUX_GPIO(GPIO_FN_LCDD23, LCDD23_MARK),
-       PINMUX_GPIO(GPIO_FN_LCDD22, LCDD22_MARK),
-       PINMUX_GPIO(GPIO_FN_LCDD21, LCDD21_MARK),
-       PINMUX_GPIO(GPIO_FN_LCDD20, LCDD20_MARK),
-       PINMUX_GPIO(GPIO_FN_LCDD19, LCDD19_MARK),
-       PINMUX_GPIO(GPIO_FN_LCDD18, LCDD18_MARK),
-       PINMUX_GPIO(GPIO_FN_LCDD17, LCDD17_MARK),
-       PINMUX_GPIO(GPIO_FN_LCDD16, LCDD16_MARK),
-       PINMUX_GPIO(GPIO_FN_LCDD15, LCDD15_MARK),
-       PINMUX_GPIO(GPIO_FN_LCDD14, LCDD14_MARK),
-       PINMUX_GPIO(GPIO_FN_LCDD13, LCDD13_MARK),
-       PINMUX_GPIO(GPIO_FN_LCDD12, LCDD12_MARK),
-       PINMUX_GPIO(GPIO_FN_LCDD11, LCDD11_MARK),
-       PINMUX_GPIO(GPIO_FN_LCDD10, LCDD10_MARK),
-       PINMUX_GPIO(GPIO_FN_LCDD9, LCDD9_MARK),
-       PINMUX_GPIO(GPIO_FN_LCDD8, LCDD8_MARK),
-       PINMUX_GPIO(GPIO_FN_LCDD7, LCDD7_MARK),
-       PINMUX_GPIO(GPIO_FN_LCDD6, LCDD6_MARK),
-       PINMUX_GPIO(GPIO_FN_LCDD5, LCDD5_MARK),
-       PINMUX_GPIO(GPIO_FN_LCDD4, LCDD4_MARK),
-       PINMUX_GPIO(GPIO_FN_LCDD3, LCDD3_MARK),
-       PINMUX_GPIO(GPIO_FN_LCDD2, LCDD2_MARK),
-       PINMUX_GPIO(GPIO_FN_LCDD1, LCDD1_MARK),
-       PINMUX_GPIO(GPIO_FN_LCDD0, LCDD0_MARK),
-       PINMUX_GPIO(GPIO_FN_LCDLCLK_PTR, LCDLCLK_PTR_MARK),
-       PINMUX_GPIO(GPIO_FN_LCDLCLK_PTW, LCDLCLK_PTW_MARK),
+       GPIO_FN(LCDD23),
+       GPIO_FN(LCDD22),
+       GPIO_FN(LCDD21),
+       GPIO_FN(LCDD20),
+       GPIO_FN(LCDD19),
+       GPIO_FN(LCDD18),
+       GPIO_FN(LCDD17),
+       GPIO_FN(LCDD16),
+       GPIO_FN(LCDD15),
+       GPIO_FN(LCDD14),
+       GPIO_FN(LCDD13),
+       GPIO_FN(LCDD12),
+       GPIO_FN(LCDD11),
+       GPIO_FN(LCDD10),
+       GPIO_FN(LCDD9),
+       GPIO_FN(LCDD8),
+       GPIO_FN(LCDD7),
+       GPIO_FN(LCDD6),
+       GPIO_FN(LCDD5),
+       GPIO_FN(LCDD4),
+       GPIO_FN(LCDD3),
+       GPIO_FN(LCDD2),
+       GPIO_FN(LCDD1),
+       GPIO_FN(LCDD0),
+       GPIO_FN(LCDLCLK_PTR),
+       GPIO_FN(LCDLCLK_PTW),
        /* Main LCD */
-       PINMUX_GPIO(GPIO_FN_LCDDON, LCDDON_MARK),
-       PINMUX_GPIO(GPIO_FN_LCDVCPWC, LCDVCPWC_MARK),
-       PINMUX_GPIO(GPIO_FN_LCDVEPWC, LCDVEPWC_MARK),
-       PINMUX_GPIO(GPIO_FN_LCDVSYN, LCDVSYN_MARK),
+       GPIO_FN(LCDDON),
+       GPIO_FN(LCDVCPWC),
+       GPIO_FN(LCDVEPWC),
+       GPIO_FN(LCDVSYN),
        /* Main LCD - RGB Mode */
-       PINMUX_GPIO(GPIO_FN_LCDDCK, LCDDCK_MARK),
-       PINMUX_GPIO(GPIO_FN_LCDHSYN, LCDHSYN_MARK),
-       PINMUX_GPIO(GPIO_FN_LCDDISP, LCDDISP_MARK),
+       GPIO_FN(LCDDCK),
+       GPIO_FN(LCDHSYN),
+       GPIO_FN(LCDDISP),
        /* Main LCD - SYS Mode */
-       PINMUX_GPIO(GPIO_FN_LCDRS, LCDRS_MARK),
-       PINMUX_GPIO(GPIO_FN_LCDCS, LCDCS_MARK),
-       PINMUX_GPIO(GPIO_FN_LCDWR, LCDWR_MARK),
-       PINMUX_GPIO(GPIO_FN_LCDRD, LCDRD_MARK),
+       GPIO_FN(LCDRS),
+       GPIO_FN(LCDCS),
+       GPIO_FN(LCDWR),
+       GPIO_FN(LCDRD),
 
        /* IRQ */
-       PINMUX_GPIO(GPIO_FN_IRQ0, IRQ0_MARK),
-       PINMUX_GPIO(GPIO_FN_IRQ1, IRQ1_MARK),
-       PINMUX_GPIO(GPIO_FN_IRQ2, IRQ2_MARK),
-       PINMUX_GPIO(GPIO_FN_IRQ3, IRQ3_MARK),
-       PINMUX_GPIO(GPIO_FN_IRQ4, IRQ4_MARK),
-       PINMUX_GPIO(GPIO_FN_IRQ5, IRQ5_MARK),
-       PINMUX_GPIO(GPIO_FN_IRQ6, IRQ6_MARK),
-       PINMUX_GPIO(GPIO_FN_IRQ7, IRQ7_MARK),
+       GPIO_FN(IRQ0),
+       GPIO_FN(IRQ1),
+       GPIO_FN(IRQ2),
+       GPIO_FN(IRQ3),
+       GPIO_FN(IRQ4),
+       GPIO_FN(IRQ5),
+       GPIO_FN(IRQ6),
+       GPIO_FN(IRQ7),
 
        /* AUD */
-       PINMUX_GPIO(GPIO_FN_AUDCK, AUDCK_MARK),
-       PINMUX_GPIO(GPIO_FN_AUDSYNC, AUDSYNC_MARK),
-       PINMUX_GPIO(GPIO_FN_AUDATA3, AUDATA3_MARK),
-       PINMUX_GPIO(GPIO_FN_AUDATA2, AUDATA2_MARK),
-       PINMUX_GPIO(GPIO_FN_AUDATA1, AUDATA1_MARK),
-       PINMUX_GPIO(GPIO_FN_AUDATA0, AUDATA0_MARK),
+       GPIO_FN(AUDCK),
+       GPIO_FN(AUDSYNC),
+       GPIO_FN(AUDATA3),
+       GPIO_FN(AUDATA2),
+       GPIO_FN(AUDATA1),
+       GPIO_FN(AUDATA0),
 
        /* SDHI0 (PTD) */
-       PINMUX_GPIO(GPIO_FN_SDHI0CD_PTD, SDHI0CD_PTD_MARK),
-       PINMUX_GPIO(GPIO_FN_SDHI0WP_PTD, SDHI0WP_PTD_MARK),
-       PINMUX_GPIO(GPIO_FN_SDHI0D3_PTD, SDHI0D3_PTD_MARK),
-       PINMUX_GPIO(GPIO_FN_SDHI0D2_PTD, SDHI0D2_PTD_MARK),
-       PINMUX_GPIO(GPIO_FN_SDHI0D1_PTD, SDHI0D1_PTD_MARK),
-       PINMUX_GPIO(GPIO_FN_SDHI0D0_PTD, SDHI0D0_PTD_MARK),
-       PINMUX_GPIO(GPIO_FN_SDHI0CMD_PTD, SDHI0CMD_PTD_MARK),
-       PINMUX_GPIO(GPIO_FN_SDHI0CLK_PTD, SDHI0CLK_PTD_MARK),
+       GPIO_FN(SDHI0CD_PTD),
+       GPIO_FN(SDHI0WP_PTD),
+       GPIO_FN(SDHI0D3_PTD),
+       GPIO_FN(SDHI0D2_PTD),
+       GPIO_FN(SDHI0D1_PTD),
+       GPIO_FN(SDHI0D0_PTD),
+       GPIO_FN(SDHI0CMD_PTD),
+       GPIO_FN(SDHI0CLK_PTD),
 
        /* SDHI0 (PTS) */
-       PINMUX_GPIO(GPIO_FN_SDHI0CD_PTS, SDHI0CD_PTS_MARK),
-       PINMUX_GPIO(GPIO_FN_SDHI0WP_PTS, SDHI0WP_PTS_MARK),
-       PINMUX_GPIO(GPIO_FN_SDHI0D3_PTS, SDHI0D3_PTS_MARK),
-       PINMUX_GPIO(GPIO_FN_SDHI0D2_PTS, SDHI0D2_PTS_MARK),
-       PINMUX_GPIO(GPIO_FN_SDHI0D1_PTS, SDHI0D1_PTS_MARK),
-       PINMUX_GPIO(GPIO_FN_SDHI0D0_PTS, SDHI0D0_PTS_MARK),
-       PINMUX_GPIO(GPIO_FN_SDHI0CMD_PTS, SDHI0CMD_PTS_MARK),
-       PINMUX_GPIO(GPIO_FN_SDHI0CLK_PTS, SDHI0CLK_PTS_MARK),
+       GPIO_FN(SDHI0CD_PTS),
+       GPIO_FN(SDHI0WP_PTS),
+       GPIO_FN(SDHI0D3_PTS),
+       GPIO_FN(SDHI0D2_PTS),
+       GPIO_FN(SDHI0D1_PTS),
+       GPIO_FN(SDHI0D0_PTS),
+       GPIO_FN(SDHI0CMD_PTS),
+       GPIO_FN(SDHI0CLK_PTS),
 
        /* SDHI1 */
-       PINMUX_GPIO(GPIO_FN_SDHI1CD, SDHI1CD_MARK),
-       PINMUX_GPIO(GPIO_FN_SDHI1WP, SDHI1WP_MARK),
-       PINMUX_GPIO(GPIO_FN_SDHI1D3, SDHI1D3_MARK),
-       PINMUX_GPIO(GPIO_FN_SDHI1D2, SDHI1D2_MARK),
-       PINMUX_GPIO(GPIO_FN_SDHI1D1, SDHI1D1_MARK),
-       PINMUX_GPIO(GPIO_FN_SDHI1D0, SDHI1D0_MARK),
-       PINMUX_GPIO(GPIO_FN_SDHI1CMD, SDHI1CMD_MARK),
-       PINMUX_GPIO(GPIO_FN_SDHI1CLK, SDHI1CLK_MARK),
+       GPIO_FN(SDHI1CD),
+       GPIO_FN(SDHI1WP),
+       GPIO_FN(SDHI1D3),
+       GPIO_FN(SDHI1D2),
+       GPIO_FN(SDHI1D1),
+       GPIO_FN(SDHI1D0),
+       GPIO_FN(SDHI1CMD),
+       GPIO_FN(SDHI1CLK),
 
        /* SIUA */
-       PINMUX_GPIO(GPIO_FN_SIUAFCK, SIUAFCK_MARK),
-       PINMUX_GPIO(GPIO_FN_SIUAILR, SIUAILR_MARK),
-       PINMUX_GPIO(GPIO_FN_SIUAIBT, SIUAIBT_MARK),
-       PINMUX_GPIO(GPIO_FN_SIUAISLD, SIUAISLD_MARK),
-       PINMUX_GPIO(GPIO_FN_SIUAOLR, SIUAOLR_MARK),
-       PINMUX_GPIO(GPIO_FN_SIUAOBT, SIUAOBT_MARK),
-       PINMUX_GPIO(GPIO_FN_SIUAOSLD, SIUAOSLD_MARK),
-       PINMUX_GPIO(GPIO_FN_SIUAMCK, SIUAMCK_MARK),
-       PINMUX_GPIO(GPIO_FN_SIUAISPD, SIUAISPD_MARK),
-       PINMUX_GPIO(GPIO_FN_SIUAOSPD, SIUAOSPD_MARK),
+       GPIO_FN(SIUAFCK),
+       GPIO_FN(SIUAILR),
+       GPIO_FN(SIUAIBT),
+       GPIO_FN(SIUAISLD),
+       GPIO_FN(SIUAOLR),
+       GPIO_FN(SIUAOBT),
+       GPIO_FN(SIUAOSLD),
+       GPIO_FN(SIUAMCK),
+       GPIO_FN(SIUAISPD),
+       GPIO_FN(SIUAOSPD),
 
        /* SIUB */
-       PINMUX_GPIO(GPIO_FN_SIUBFCK, SIUBFCK_MARK),
-       PINMUX_GPIO(GPIO_FN_SIUBILR, SIUBILR_MARK),
-       PINMUX_GPIO(GPIO_FN_SIUBIBT, SIUBIBT_MARK),
-       PINMUX_GPIO(GPIO_FN_SIUBISLD, SIUBISLD_MARK),
-       PINMUX_GPIO(GPIO_FN_SIUBOLR, SIUBOLR_MARK),
-       PINMUX_GPIO(GPIO_FN_SIUBOBT, SIUBOBT_MARK),
-       PINMUX_GPIO(GPIO_FN_SIUBOSLD, SIUBOSLD_MARK),
-       PINMUX_GPIO(GPIO_FN_SIUBMCK, SIUBMCK_MARK),
+       GPIO_FN(SIUBFCK),
+       GPIO_FN(SIUBILR),
+       GPIO_FN(SIUBIBT),
+       GPIO_FN(SIUBISLD),
+       GPIO_FN(SIUBOLR),
+       GPIO_FN(SIUBOBT),
+       GPIO_FN(SIUBOSLD),
+       GPIO_FN(SIUBMCK),
 
        /* IRDA */
-       PINMUX_GPIO(GPIO_FN_IRDA_IN, IRDA_IN_MARK),
-       PINMUX_GPIO(GPIO_FN_IRDA_OUT, IRDA_OUT_MARK),
+       GPIO_FN(IRDA_IN),
+       GPIO_FN(IRDA_OUT),
 
        /* VOU */
-       PINMUX_GPIO(GPIO_FN_DV_CLKI, DV_CLKI_MARK),
-       PINMUX_GPIO(GPIO_FN_DV_CLK, DV_CLK_MARK),
-       PINMUX_GPIO(GPIO_FN_DV_HSYNC, DV_HSYNC_MARK),
-       PINMUX_GPIO(GPIO_FN_DV_VSYNC, DV_VSYNC_MARK),
-       PINMUX_GPIO(GPIO_FN_DV_D15, DV_D15_MARK),
-       PINMUX_GPIO(GPIO_FN_DV_D14, DV_D14_MARK),
-       PINMUX_GPIO(GPIO_FN_DV_D13, DV_D13_MARK),
-       PINMUX_GPIO(GPIO_FN_DV_D12, DV_D12_MARK),
-       PINMUX_GPIO(GPIO_FN_DV_D11, DV_D11_MARK),
-       PINMUX_GPIO(GPIO_FN_DV_D10, DV_D10_MARK),
-       PINMUX_GPIO(GPIO_FN_DV_D9, DV_D9_MARK),
-       PINMUX_GPIO(GPIO_FN_DV_D8, DV_D8_MARK),
-       PINMUX_GPIO(GPIO_FN_DV_D7, DV_D7_MARK),
-       PINMUX_GPIO(GPIO_FN_DV_D6, DV_D6_MARK),
-       PINMUX_GPIO(GPIO_FN_DV_D5, DV_D5_MARK),
-       PINMUX_GPIO(GPIO_FN_DV_D4, DV_D4_MARK),
-       PINMUX_GPIO(GPIO_FN_DV_D3, DV_D3_MARK),
-       PINMUX_GPIO(GPIO_FN_DV_D2, DV_D2_MARK),
-       PINMUX_GPIO(GPIO_FN_DV_D1, DV_D1_MARK),
-       PINMUX_GPIO(GPIO_FN_DV_D0, DV_D0_MARK),
+       GPIO_FN(DV_CLKI),
+       GPIO_FN(DV_CLK),
+       GPIO_FN(DV_HSYNC),
+       GPIO_FN(DV_VSYNC),
+       GPIO_FN(DV_D15),
+       GPIO_FN(DV_D14),
+       GPIO_FN(DV_D13),
+       GPIO_FN(DV_D12),
+       GPIO_FN(DV_D11),
+       GPIO_FN(DV_D10),
+       GPIO_FN(DV_D9),
+       GPIO_FN(DV_D8),
+       GPIO_FN(DV_D7),
+       GPIO_FN(DV_D6),
+       GPIO_FN(DV_D5),
+       GPIO_FN(DV_D4),
+       GPIO_FN(DV_D3),
+       GPIO_FN(DV_D2),
+       GPIO_FN(DV_D1),
+       GPIO_FN(DV_D0),
 
        /* KEYSC */
-       PINMUX_GPIO(GPIO_FN_KEYIN0, KEYIN0_MARK),
-       PINMUX_GPIO(GPIO_FN_KEYIN1, KEYIN1_MARK),
-       PINMUX_GPIO(GPIO_FN_KEYIN2, KEYIN2_MARK),
-       PINMUX_GPIO(GPIO_FN_KEYIN3, KEYIN3_MARK),
-       PINMUX_GPIO(GPIO_FN_KEYIN4, KEYIN4_MARK),
-       PINMUX_GPIO(GPIO_FN_KEYOUT0, KEYOUT0_MARK),
-       PINMUX_GPIO(GPIO_FN_KEYOUT1, KEYOUT1_MARK),
-       PINMUX_GPIO(GPIO_FN_KEYOUT2, KEYOUT2_MARK),
-       PINMUX_GPIO(GPIO_FN_KEYOUT3, KEYOUT3_MARK),
-       PINMUX_GPIO(GPIO_FN_KEYOUT4_IN6, KEYOUT4_IN6_MARK),
-       PINMUX_GPIO(GPIO_FN_KEYOUT5_IN5, KEYOUT5_IN5_MARK),
+       GPIO_FN(KEYIN0),
+       GPIO_FN(KEYIN1),
+       GPIO_FN(KEYIN2),
+       GPIO_FN(KEYIN3),
+       GPIO_FN(KEYIN4),
+       GPIO_FN(KEYOUT0),
+       GPIO_FN(KEYOUT1),
+       GPIO_FN(KEYOUT2),
+       GPIO_FN(KEYOUT3),
+       GPIO_FN(KEYOUT4_IN6),
+       GPIO_FN(KEYOUT5_IN5),
 
        /* MSIOF0 (PTF) */
-       PINMUX_GPIO(GPIO_FN_MSIOF0_PTF_TXD, MSIOF0_PTF_TXD_MARK),
-       PINMUX_GPIO(GPIO_FN_MSIOF0_PTF_RXD, MSIOF0_PTF_RXD_MARK),
-       PINMUX_GPIO(GPIO_FN_MSIOF0_PTF_MCK, MSIOF0_PTF_MCK_MARK),
-       PINMUX_GPIO(GPIO_FN_MSIOF0_PTF_TSYNC, MSIOF0_PTF_TSYNC_MARK),
-       PINMUX_GPIO(GPIO_FN_MSIOF0_PTF_TSCK, MSIOF0_PTF_TSCK_MARK),
-       PINMUX_GPIO(GPIO_FN_MSIOF0_PTF_RSYNC, MSIOF0_PTF_RSYNC_MARK),
-       PINMUX_GPIO(GPIO_FN_MSIOF0_PTF_RSCK, MSIOF0_PTF_RSCK_MARK),
-       PINMUX_GPIO(GPIO_FN_MSIOF0_PTF_SS1, MSIOF0_PTF_SS1_MARK),
-       PINMUX_GPIO(GPIO_FN_MSIOF0_PTF_SS2, MSIOF0_PTF_SS2_MARK),
+       GPIO_FN(MSIOF0_PTF_TXD),
+       GPIO_FN(MSIOF0_PTF_RXD),
+       GPIO_FN(MSIOF0_PTF_MCK),
+       GPIO_FN(MSIOF0_PTF_TSYNC),
+       GPIO_FN(MSIOF0_PTF_TSCK),
+       GPIO_FN(MSIOF0_PTF_RSYNC),
+       GPIO_FN(MSIOF0_PTF_RSCK),
+       GPIO_FN(MSIOF0_PTF_SS1),
+       GPIO_FN(MSIOF0_PTF_SS2),
 
        /* MSIOF0 (PTT+PTX) */
-       PINMUX_GPIO(GPIO_FN_MSIOF0_PTT_TXD, MSIOF0_PTT_TXD_MARK),
-       PINMUX_GPIO(GPIO_FN_MSIOF0_PTT_RXD, MSIOF0_PTT_RXD_MARK),
-       PINMUX_GPIO(GPIO_FN_MSIOF0_PTX_MCK, MSIOF0_PTX_MCK_MARK),
-       PINMUX_GPIO(GPIO_FN_MSIOF0_PTT_TSYNC, MSIOF0_PTT_TSYNC_MARK),
-       PINMUX_GPIO(GPIO_FN_MSIOF0_PTT_TSCK, MSIOF0_PTT_TSCK_MARK),
-       PINMUX_GPIO(GPIO_FN_MSIOF0_PTT_RSYNC, MSIOF0_PTT_RSYNC_MARK),
-       PINMUX_GPIO(GPIO_FN_MSIOF0_PTT_RSCK, MSIOF0_PTT_RSCK_MARK),
-       PINMUX_GPIO(GPIO_FN_MSIOF0_PTT_SS1, MSIOF0_PTT_SS1_MARK),
-       PINMUX_GPIO(GPIO_FN_MSIOF0_PTT_SS2, MSIOF0_PTT_SS2_MARK),
+       GPIO_FN(MSIOF0_PTT_TXD),
+       GPIO_FN(MSIOF0_PTT_RXD),
+       GPIO_FN(MSIOF0_PTX_MCK),
+       GPIO_FN(MSIOF0_PTT_TSYNC),
+       GPIO_FN(MSIOF0_PTT_TSCK),
+       GPIO_FN(MSIOF0_PTT_RSYNC),
+       GPIO_FN(MSIOF0_PTT_RSCK),
+       GPIO_FN(MSIOF0_PTT_SS1),
+       GPIO_FN(MSIOF0_PTT_SS2),
 
        /* MSIOF1 */
-       PINMUX_GPIO(GPIO_FN_MSIOF1_TXD, MSIOF1_TXD_MARK),
-       PINMUX_GPIO(GPIO_FN_MSIOF1_RXD, MSIOF1_RXD_MARK),
-       PINMUX_GPIO(GPIO_FN_MSIOF1_MCK, MSIOF1_MCK_MARK),
-       PINMUX_GPIO(GPIO_FN_MSIOF1_TSYNC, MSIOF1_TSYNC_MARK),
-       PINMUX_GPIO(GPIO_FN_MSIOF1_TSCK, MSIOF1_TSCK_MARK),
-       PINMUX_GPIO(GPIO_FN_MSIOF1_RSYNC, MSIOF1_RSYNC_MARK),
-       PINMUX_GPIO(GPIO_FN_MSIOF1_RSCK, MSIOF1_RSCK_MARK),
-       PINMUX_GPIO(GPIO_FN_MSIOF1_SS1, MSIOF1_SS1_MARK),
-       PINMUX_GPIO(GPIO_FN_MSIOF1_SS2, MSIOF1_SS2_MARK),
+       GPIO_FN(MSIOF1_TXD),
+       GPIO_FN(MSIOF1_RXD),
+       GPIO_FN(MSIOF1_MCK),
+       GPIO_FN(MSIOF1_TSYNC),
+       GPIO_FN(MSIOF1_TSCK),
+       GPIO_FN(MSIOF1_RSYNC),
+       GPIO_FN(MSIOF1_RSCK),
+       GPIO_FN(MSIOF1_SS1),
+       GPIO_FN(MSIOF1_SS2),
 
        /* TSIF */
-       PINMUX_GPIO(GPIO_FN_TS0_SDAT, TS0_SDAT_MARK),
-       PINMUX_GPIO(GPIO_FN_TS0_SCK, TS0_SCK_MARK),
-       PINMUX_GPIO(GPIO_FN_TS0_SDEN, TS0_SDEN_MARK),
-       PINMUX_GPIO(GPIO_FN_TS0_SPSYNC, TS0_SPSYNC_MARK),
+       GPIO_FN(TS0_SDAT),
+       GPIO_FN(TS0_SCK),
+       GPIO_FN(TS0_SDEN),
+       GPIO_FN(TS0_SPSYNC),
 
        /* FLCTL */
-       PINMUX_GPIO(GPIO_FN_FCE, FCE_MARK),
-       PINMUX_GPIO(GPIO_FN_NAF7, NAF7_MARK),
-       PINMUX_GPIO(GPIO_FN_NAF6, NAF6_MARK),
-       PINMUX_GPIO(GPIO_FN_NAF5, NAF5_MARK),
-       PINMUX_GPIO(GPIO_FN_NAF4, NAF4_MARK),
-       PINMUX_GPIO(GPIO_FN_NAF3, NAF3_MARK),
-       PINMUX_GPIO(GPIO_FN_NAF2, NAF2_MARK),
-       PINMUX_GPIO(GPIO_FN_NAF1, NAF1_MARK),
-       PINMUX_GPIO(GPIO_FN_NAF0, NAF0_MARK),
-       PINMUX_GPIO(GPIO_FN_FCDE, FCDE_MARK),
-       PINMUX_GPIO(GPIO_FN_FOE, FOE_MARK),
-       PINMUX_GPIO(GPIO_FN_FSC, FSC_MARK),
-       PINMUX_GPIO(GPIO_FN_FWE, FWE_MARK),
-       PINMUX_GPIO(GPIO_FN_FRB, FRB_MARK),
+       GPIO_FN(FCE),
+       GPIO_FN(NAF7),
+       GPIO_FN(NAF6),
+       GPIO_FN(NAF5),
+       GPIO_FN(NAF4),
+       GPIO_FN(NAF3),
+       GPIO_FN(NAF2),
+       GPIO_FN(NAF1),
+       GPIO_FN(NAF0),
+       GPIO_FN(FCDE),
+       GPIO_FN(FOE),
+       GPIO_FN(FSC),
+       GPIO_FN(FWE),
+       GPIO_FN(FRB),
 
        /* DMAC */
-       PINMUX_GPIO(GPIO_FN_DACK1, DACK1_MARK),
-       PINMUX_GPIO(GPIO_FN_DREQ1, DREQ1_MARK),
-       PINMUX_GPIO(GPIO_FN_DACK0, DACK0_MARK),
-       PINMUX_GPIO(GPIO_FN_DREQ0, DREQ0_MARK),
+       GPIO_FN(DACK1),
+       GPIO_FN(DREQ1),
+       GPIO_FN(DACK0),
+       GPIO_FN(DREQ0),
 
        /* ADC */
-       PINMUX_GPIO(GPIO_FN_AN3, AN3_MARK),
-       PINMUX_GPIO(GPIO_FN_AN2, AN2_MARK),
-       PINMUX_GPIO(GPIO_FN_AN1, AN1_MARK),
-       PINMUX_GPIO(GPIO_FN_AN0, AN0_MARK),
-       PINMUX_GPIO(GPIO_FN_ADTRG, ADTRG_MARK),
+       GPIO_FN(AN3),
+       GPIO_FN(AN2),
+       GPIO_FN(AN1),
+       GPIO_FN(AN0),
+       GPIO_FN(ADTRG),
 
        /* CPG */
-       PINMUX_GPIO(GPIO_FN_STATUS0, STATUS0_MARK),
-       PINMUX_GPIO(GPIO_FN_PDSTATUS, PDSTATUS_MARK),
+       GPIO_FN(STATUS0),
+       GPIO_FN(PDSTATUS),
 
        /* TPU */
-       PINMUX_GPIO(GPIO_FN_TPUTO0, TPUTO0_MARK),
-       PINMUX_GPIO(GPIO_FN_TPUTO1, TPUTO1_MARK),
-       PINMUX_GPIO(GPIO_FN_TPUTO2, TPUTO2_MARK),
-       PINMUX_GPIO(GPIO_FN_TPUTO3, TPUTO3_MARK),
+       GPIO_FN(TPUTO0),
+       GPIO_FN(TPUTO1),
+       GPIO_FN(TPUTO2),
+       GPIO_FN(TPUTO3),
 
        /* BSC */
-       PINMUX_GPIO(GPIO_FN_D31, D31_MARK),
-       PINMUX_GPIO(GPIO_FN_D30, D30_MARK),
-       PINMUX_GPIO(GPIO_FN_D29, D29_MARK),
-       PINMUX_GPIO(GPIO_FN_D28, D28_MARK),
-       PINMUX_GPIO(GPIO_FN_D27, D27_MARK),
-       PINMUX_GPIO(GPIO_FN_D26, D26_MARK),
-       PINMUX_GPIO(GPIO_FN_D25, D25_MARK),
-       PINMUX_GPIO(GPIO_FN_D24, D24_MARK),
-       PINMUX_GPIO(GPIO_FN_D23, D23_MARK),
-       PINMUX_GPIO(GPIO_FN_D22, D22_MARK),
-       PINMUX_GPIO(GPIO_FN_D21, D21_MARK),
-       PINMUX_GPIO(GPIO_FN_D20, D20_MARK),
-       PINMUX_GPIO(GPIO_FN_D19, D19_MARK),
-       PINMUX_GPIO(GPIO_FN_D18, D18_MARK),
-       PINMUX_GPIO(GPIO_FN_D17, D17_MARK),
-       PINMUX_GPIO(GPIO_FN_D16, D16_MARK),
-       PINMUX_GPIO(GPIO_FN_IOIS16, IOIS16_MARK),
-       PINMUX_GPIO(GPIO_FN_WAIT, WAIT_MARK),
-       PINMUX_GPIO(GPIO_FN_BS, BS_MARK),
-       PINMUX_GPIO(GPIO_FN_A25, A25_MARK),
-       PINMUX_GPIO(GPIO_FN_A24, A24_MARK),
-       PINMUX_GPIO(GPIO_FN_A23, A23_MARK),
-       PINMUX_GPIO(GPIO_FN_A22, A22_MARK),
-       PINMUX_GPIO(GPIO_FN_CS6B_CE1B, CS6B_CE1B_MARK),
-       PINMUX_GPIO(GPIO_FN_CS6A_CE2B, CS6A_CE2B_MARK),
-       PINMUX_GPIO(GPIO_FN_CS5B_CE1A, CS5B_CE1A_MARK),
-       PINMUX_GPIO(GPIO_FN_CS5A_CE2A, CS5A_CE2A_MARK),
-       PINMUX_GPIO(GPIO_FN_WE3_ICIOWR, WE3_ICIOWR_MARK),
-       PINMUX_GPIO(GPIO_FN_WE2_ICIORD, WE2_ICIORD_MARK),
+       GPIO_FN(D31),
+       GPIO_FN(D30),
+       GPIO_FN(D29),
+       GPIO_FN(D28),
+       GPIO_FN(D27),
+       GPIO_FN(D26),
+       GPIO_FN(D25),
+       GPIO_FN(D24),
+       GPIO_FN(D23),
+       GPIO_FN(D22),
+       GPIO_FN(D21),
+       GPIO_FN(D20),
+       GPIO_FN(D19),
+       GPIO_FN(D18),
+       GPIO_FN(D17),
+       GPIO_FN(D16),
+       GPIO_FN(IOIS16),
+       GPIO_FN(WAIT),
+       GPIO_FN(BS),
+       GPIO_FN(A25),
+       GPIO_FN(A24),
+       GPIO_FN(A23),
+       GPIO_FN(A22),
+       GPIO_FN(CS6B_CE1B),
+       GPIO_FN(CS6A_CE2B),
+       GPIO_FN(CS5B_CE1A),
+       GPIO_FN(CS5A_CE2A),
+       GPIO_FN(WE3_ICIOWR),
+       GPIO_FN(WE2_ICIORD),
 
        /* ATAPI */
-       PINMUX_GPIO(GPIO_FN_IDED15, IDED15_MARK),
-       PINMUX_GPIO(GPIO_FN_IDED14, IDED14_MARK),
-       PINMUX_GPIO(GPIO_FN_IDED13, IDED13_MARK),
-       PINMUX_GPIO(GPIO_FN_IDED12, IDED12_MARK),
-       PINMUX_GPIO(GPIO_FN_IDED11, IDED11_MARK),
-       PINMUX_GPIO(GPIO_FN_IDED10, IDED10_MARK),
-       PINMUX_GPIO(GPIO_FN_IDED9, IDED9_MARK),
-       PINMUX_GPIO(GPIO_FN_IDED8, IDED8_MARK),
-       PINMUX_GPIO(GPIO_FN_IDED7, IDED7_MARK),
-       PINMUX_GPIO(GPIO_FN_IDED6, IDED6_MARK),
-       PINMUX_GPIO(GPIO_FN_IDED5, IDED5_MARK),
-       PINMUX_GPIO(GPIO_FN_IDED4, IDED4_MARK),
-       PINMUX_GPIO(GPIO_FN_IDED3, IDED3_MARK),
-       PINMUX_GPIO(GPIO_FN_IDED2, IDED2_MARK),
-       PINMUX_GPIO(GPIO_FN_IDED1, IDED1_MARK),
-       PINMUX_GPIO(GPIO_FN_IDED0, IDED0_MARK),
-       PINMUX_GPIO(GPIO_FN_DIRECTION, DIRECTION_MARK),
-       PINMUX_GPIO(GPIO_FN_EXBUF_ENB, EXBUF_ENB_MARK),
-       PINMUX_GPIO(GPIO_FN_IDERST, IDERST_MARK),
-       PINMUX_GPIO(GPIO_FN_IODACK, IODACK_MARK),
-       PINMUX_GPIO(GPIO_FN_IODREQ, IODREQ_MARK),
-       PINMUX_GPIO(GPIO_FN_IDEIORDY, IDEIORDY_MARK),
-       PINMUX_GPIO(GPIO_FN_IDEINT, IDEINT_MARK),
-       PINMUX_GPIO(GPIO_FN_IDEIOWR, IDEIOWR_MARK),
-       PINMUX_GPIO(GPIO_FN_IDEIORD, IDEIORD_MARK),
-       PINMUX_GPIO(GPIO_FN_IDECS1, IDECS1_MARK),
-       PINMUX_GPIO(GPIO_FN_IDECS0, IDECS0_MARK),
-       PINMUX_GPIO(GPIO_FN_IDEA2, IDEA2_MARK),
-       PINMUX_GPIO(GPIO_FN_IDEA1, IDEA1_MARK),
-       PINMUX_GPIO(GPIO_FN_IDEA0, IDEA0_MARK),
+       GPIO_FN(IDED15),
+       GPIO_FN(IDED14),
+       GPIO_FN(IDED13),
+       GPIO_FN(IDED12),
+       GPIO_FN(IDED11),
+       GPIO_FN(IDED10),
+       GPIO_FN(IDED9),
+       GPIO_FN(IDED8),
+       GPIO_FN(IDED7),
+       GPIO_FN(IDED6),
+       GPIO_FN(IDED5),
+       GPIO_FN(IDED4),
+       GPIO_FN(IDED3),
+       GPIO_FN(IDED2),
+       GPIO_FN(IDED1),
+       GPIO_FN(IDED0),
+       GPIO_FN(DIRECTION),
+       GPIO_FN(EXBUF_ENB),
+       GPIO_FN(IDERST),
+       GPIO_FN(IODACK),
+       GPIO_FN(IODREQ),
+       GPIO_FN(IDEIORDY),
+       GPIO_FN(IDEINT),
+       GPIO_FN(IDEIOWR),
+       GPIO_FN(IDEIORD),
+       GPIO_FN(IDECS1),
+       GPIO_FN(IDECS0),
+       GPIO_FN(IDEA2),
+       GPIO_FN(IDEA1),
+       GPIO_FN(IDEA0),
 };
 
-static struct pinmux_cfg_reg pinmux_config_regs[] = {
+static const struct pinmux_cfg_reg pinmux_config_regs[] = {
        { PINMUX_CFG_REG("PACR", 0xa4050100, 16, 2) {
                PTA7_FN, PTA7_OUT, 0, PTA7_IN,
                PTA6_FN, PTA6_OUT, 0, PTA6_IN,
@@ -1785,7 +1789,7 @@ static struct pinmux_cfg_reg pinmux_config_regs[] = {
        {}
 };
 
-static struct pinmux_data_reg pinmux_data_regs[] = {
+static const struct pinmux_data_reg pinmux_data_regs[] = {
        { PINMUX_DATA_REG("PADR", 0xa4050120, 8) {
                PTA7_DATA, PTA6_DATA, PTA5_DATA, PTA4_DATA,
                PTA3_DATA, PTA2_DATA, PTA1_DATA, PTA0_DATA }
@@ -1881,20 +1885,18 @@ static struct pinmux_data_reg pinmux_data_regs[] = {
        { },
 };
 
-struct sh_pfc_soc_info sh7723_pinmux_info = {
+const struct sh_pfc_soc_info sh7723_pinmux_info = {
        .name = "sh7723_pfc",
-       .reserved_id = PINMUX_RESERVED,
-       .data = { PINMUX_DATA_BEGIN, PINMUX_DATA_END },
        .input = { PINMUX_INPUT_BEGIN, PINMUX_INPUT_END },
        .input_pu = { PINMUX_INPUT_PULLUP_BEGIN, PINMUX_INPUT_PULLUP_END },
        .output = { PINMUX_OUTPUT_BEGIN, PINMUX_OUTPUT_END },
-       .mark = { PINMUX_MARK_BEGIN, PINMUX_MARK_END },
        .function = { PINMUX_FUNCTION_BEGIN, PINMUX_FUNCTION_END },
 
-       .first_gpio = GPIO_PTA7,
-       .last_gpio = GPIO_FN_IDEA0,
+       .pins = pinmux_pins,
+       .nr_pins = ARRAY_SIZE(pinmux_pins),
+       .func_gpios = pinmux_func_gpios,
+       .nr_func_gpios = ARRAY_SIZE(pinmux_func_gpios),
 
-       .gpios = pinmux_gpios,
        .cfg_regs = pinmux_config_regs,
        .data_regs = pinmux_data_regs,
 
index 233fbf750b394b1bffd1aaffc86fc90d3396464b..35e5516098054e0b603bde424f08d086bd057271 100644 (file)
@@ -572,7 +572,7 @@ enum {
        PINMUX_MARK_END,
 };
 
-static pinmux_enum_t pinmux_data[] = {
+static const pinmux_enum_t pinmux_data[] = {
        /* PTA GPIO */
        PINMUX_DATA(PTA7_DATA, PTA7_IN, PTA7_OUT, PTA7_IN_PU),
        PINMUX_DATA(PTA6_DATA, PTA6_IN, PTA6_OUT, PTA6_IN_PU),
@@ -1192,7 +1192,7 @@ static pinmux_enum_t pinmux_data[] = {
        PINMUX_DATA(SCIF3_I_TXD_MARK,   PSB14_1, PTZ3_FN),
 };
 
-static struct pinmux_gpio pinmux_gpios[] = {
+static struct sh_pfc_pin pinmux_pins[] = {
        /* PTA */
        PINMUX_GPIO(GPIO_PTA7, PTA7_DATA),
        PINMUX_GPIO(GPIO_PTA6, PTA6_DATA),
@@ -1418,372 +1418,376 @@ static struct pinmux_gpio pinmux_gpios[] = {
        PINMUX_GPIO(GPIO_PTZ2, PTZ2_DATA),
        PINMUX_GPIO(GPIO_PTZ1, PTZ1_DATA),
        PINMUX_GPIO(GPIO_PTZ0, PTZ0_DATA),
+};
+
+#define PINMUX_FN_BASE ARRAY_SIZE(pinmux_pins)
 
+static const struct pinmux_func pinmux_func_gpios[] = {
        /* BSC */
-       PINMUX_GPIO(GPIO_FN_D31,        D31_MARK),
-       PINMUX_GPIO(GPIO_FN_D30,        D30_MARK),
-       PINMUX_GPIO(GPIO_FN_D29,        D29_MARK),
-       PINMUX_GPIO(GPIO_FN_D28,        D28_MARK),
-       PINMUX_GPIO(GPIO_FN_D27,        D27_MARK),
-       PINMUX_GPIO(GPIO_FN_D26,        D26_MARK),
-       PINMUX_GPIO(GPIO_FN_D25,        D25_MARK),
-       PINMUX_GPIO(GPIO_FN_D24,        D24_MARK),
-       PINMUX_GPIO(GPIO_FN_D23,        D23_MARK),
-       PINMUX_GPIO(GPIO_FN_D22,        D22_MARK),
-       PINMUX_GPIO(GPIO_FN_D21,        D21_MARK),
-       PINMUX_GPIO(GPIO_FN_D20,        D20_MARK),
-       PINMUX_GPIO(GPIO_FN_D19,        D19_MARK),
-       PINMUX_GPIO(GPIO_FN_D18,        D18_MARK),
-       PINMUX_GPIO(GPIO_FN_D17,        D17_MARK),
-       PINMUX_GPIO(GPIO_FN_D16,        D16_MARK),
-       PINMUX_GPIO(GPIO_FN_D15,        D15_MARK),
-       PINMUX_GPIO(GPIO_FN_D14,        D14_MARK),
-       PINMUX_GPIO(GPIO_FN_D13,        D13_MARK),
-       PINMUX_GPIO(GPIO_FN_D12,        D12_MARK),
-       PINMUX_GPIO(GPIO_FN_D11,        D11_MARK),
-       PINMUX_GPIO(GPIO_FN_D10,        D10_MARK),
-       PINMUX_GPIO(GPIO_FN_D9,         D9_MARK),
-       PINMUX_GPIO(GPIO_FN_D8,         D8_MARK),
-       PINMUX_GPIO(GPIO_FN_D7,         D7_MARK),
-       PINMUX_GPIO(GPIO_FN_D6,         D6_MARK),
-       PINMUX_GPIO(GPIO_FN_D5,         D5_MARK),
-       PINMUX_GPIO(GPIO_FN_D4,         D4_MARK),
-       PINMUX_GPIO(GPIO_FN_D3,         D3_MARK),
-       PINMUX_GPIO(GPIO_FN_D2,         D2_MARK),
-       PINMUX_GPIO(GPIO_FN_D1,         D1_MARK),
-       PINMUX_GPIO(GPIO_FN_D0,         D0_MARK),
-       PINMUX_GPIO(GPIO_FN_A25,        A25_MARK),
-       PINMUX_GPIO(GPIO_FN_A24,        A24_MARK),
-       PINMUX_GPIO(GPIO_FN_A23,        A23_MARK),
-       PINMUX_GPIO(GPIO_FN_A22,        A22_MARK),
-       PINMUX_GPIO(GPIO_FN_CS6B_CE1B,  CS6B_CE1B_MARK),
-       PINMUX_GPIO(GPIO_FN_CS6A_CE2B,  CS6A_CE2B_MARK),
-       PINMUX_GPIO(GPIO_FN_CS5B_CE1A,  CS5B_CE1A_MARK),
-       PINMUX_GPIO(GPIO_FN_CS5A_CE2A,  CS5A_CE2A_MARK),
-       PINMUX_GPIO(GPIO_FN_WE3_ICIOWR, WE3_ICIOWR_MARK),
-       PINMUX_GPIO(GPIO_FN_WE2_ICIORD, WE2_ICIORD_MARK),
-       PINMUX_GPIO(GPIO_FN_IOIS16,     IOIS16_MARK),
-       PINMUX_GPIO(GPIO_FN_WAIT,       WAIT_MARK),
-       PINMUX_GPIO(GPIO_FN_BS,         BS_MARK),
+       GPIO_FN(D31),
+       GPIO_FN(D30),
+       GPIO_FN(D29),
+       GPIO_FN(D28),
+       GPIO_FN(D27),
+       GPIO_FN(D26),
+       GPIO_FN(D25),
+       GPIO_FN(D24),
+       GPIO_FN(D23),
+       GPIO_FN(D22),
+       GPIO_FN(D21),
+       GPIO_FN(D20),
+       GPIO_FN(D19),
+       GPIO_FN(D18),
+       GPIO_FN(D17),
+       GPIO_FN(D16),
+       GPIO_FN(D15),
+       GPIO_FN(D14),
+       GPIO_FN(D13),
+       GPIO_FN(D12),
+       GPIO_FN(D11),
+       GPIO_FN(D10),
+       GPIO_FN(D9),
+       GPIO_FN(D8),
+       GPIO_FN(D7),
+       GPIO_FN(D6),
+       GPIO_FN(D5),
+       GPIO_FN(D4),
+       GPIO_FN(D3),
+       GPIO_FN(D2),
+       GPIO_FN(D1),
+       GPIO_FN(D0),
+       GPIO_FN(A25),
+       GPIO_FN(A24),
+       GPIO_FN(A23),
+       GPIO_FN(A22),
+       GPIO_FN(CS6B_CE1B),
+       GPIO_FN(CS6A_CE2B),
+       GPIO_FN(CS5B_CE1A),
+       GPIO_FN(CS5A_CE2A),
+       GPIO_FN(WE3_ICIOWR),
+       GPIO_FN(WE2_ICIORD),
+       GPIO_FN(IOIS16),
+       GPIO_FN(WAIT),
+       GPIO_FN(BS),
 
        /* KEYSC */
-       PINMUX_GPIO(GPIO_FN_KEYOUT5_IN5,        KEYOUT5_IN5_MARK),
-       PINMUX_GPIO(GPIO_FN_KEYOUT4_IN6,        KEYOUT4_IN6_MARK),
-       PINMUX_GPIO(GPIO_FN_KEYIN4,             KEYIN4_MARK),
-       PINMUX_GPIO(GPIO_FN_KEYIN3,             KEYIN3_MARK),
-       PINMUX_GPIO(GPIO_FN_KEYIN2,             KEYIN2_MARK),
-       PINMUX_GPIO(GPIO_FN_KEYIN1,             KEYIN1_MARK),
-       PINMUX_GPIO(GPIO_FN_KEYIN0,             KEYIN0_MARK),
-       PINMUX_GPIO(GPIO_FN_KEYOUT3,            KEYOUT3_MARK),
-       PINMUX_GPIO(GPIO_FN_KEYOUT2,            KEYOUT2_MARK),
-       PINMUX_GPIO(GPIO_FN_KEYOUT1,            KEYOUT1_MARK),
-       PINMUX_GPIO(GPIO_FN_KEYOUT0,            KEYOUT0_MARK),
+       GPIO_FN(KEYOUT5_IN5),
+       GPIO_FN(KEYOUT4_IN6),
+       GPIO_FN(KEYIN4),
+       GPIO_FN(KEYIN3),
+       GPIO_FN(KEYIN2),
+       GPIO_FN(KEYIN1),
+       GPIO_FN(KEYIN0),
+       GPIO_FN(KEYOUT3),
+       GPIO_FN(KEYOUT2),
+       GPIO_FN(KEYOUT1),
+       GPIO_FN(KEYOUT0),
 
        /* ATAPI */
-       PINMUX_GPIO(GPIO_FN_IDED15,     IDED15_MARK),
-       PINMUX_GPIO(GPIO_FN_IDED14,     IDED14_MARK),
-       PINMUX_GPIO(GPIO_FN_IDED13,     IDED13_MARK),
-       PINMUX_GPIO(GPIO_FN_IDED12,     IDED12_MARK),
-       PINMUX_GPIO(GPIO_FN_IDED11,     IDED11_MARK),
-       PINMUX_GPIO(GPIO_FN_IDED10,     IDED10_MARK),
-       PINMUX_GPIO(GPIO_FN_IDED9,      IDED9_MARK),
-       PINMUX_GPIO(GPIO_FN_IDED8,      IDED8_MARK),
-       PINMUX_GPIO(GPIO_FN_IDED7,      IDED7_MARK),
-       PINMUX_GPIO(GPIO_FN_IDED6,      IDED6_MARK),
-       PINMUX_GPIO(GPIO_FN_IDED5,      IDED5_MARK),
-       PINMUX_GPIO(GPIO_FN_IDED4,      IDED4_MARK),
-       PINMUX_GPIO(GPIO_FN_IDED3,      IDED3_MARK),
-       PINMUX_GPIO(GPIO_FN_IDED2,      IDED2_MARK),
-       PINMUX_GPIO(GPIO_FN_IDED1,      IDED1_MARK),
-       PINMUX_GPIO(GPIO_FN_IDED0,      IDED0_MARK),
-       PINMUX_GPIO(GPIO_FN_IDEA2,      IDEA2_MARK),
-       PINMUX_GPIO(GPIO_FN_IDEA1,      IDEA1_MARK),
-       PINMUX_GPIO(GPIO_FN_IDEA0,      IDEA0_MARK),
-       PINMUX_GPIO(GPIO_FN_IDEIOWR,    IDEIOWR_MARK),
-       PINMUX_GPIO(GPIO_FN_IODREQ,     IODREQ_MARK),
-       PINMUX_GPIO(GPIO_FN_IDECS0,     IDECS0_MARK),
-       PINMUX_GPIO(GPIO_FN_IDECS1,     IDECS1_MARK),
-       PINMUX_GPIO(GPIO_FN_IDEIORD,    IDEIORD_MARK),
-       PINMUX_GPIO(GPIO_FN_DIRECTION,  DIRECTION_MARK),
-       PINMUX_GPIO(GPIO_FN_EXBUF_ENB,  EXBUF_ENB_MARK),
-       PINMUX_GPIO(GPIO_FN_IDERST,     IDERST_MARK),
-       PINMUX_GPIO(GPIO_FN_IODACK,     IODACK_MARK),
-       PINMUX_GPIO(GPIO_FN_IDEINT,     IDEINT_MARK),
-       PINMUX_GPIO(GPIO_FN_IDEIORDY,   IDEIORDY_MARK),
+       GPIO_FN(IDED15),
+       GPIO_FN(IDED14),
+       GPIO_FN(IDED13),
+       GPIO_FN(IDED12),
+       GPIO_FN(IDED11),
+       GPIO_FN(IDED10),
+       GPIO_FN(IDED9),
+       GPIO_FN(IDED8),
+       GPIO_FN(IDED7),
+       GPIO_FN(IDED6),
+       GPIO_FN(IDED5),
+       GPIO_FN(IDED4),
+       GPIO_FN(IDED3),
+       GPIO_FN(IDED2),
+       GPIO_FN(IDED1),
+       GPIO_FN(IDED0),
+       GPIO_FN(IDEA2),
+       GPIO_FN(IDEA1),
+       GPIO_FN(IDEA0),
+       GPIO_FN(IDEIOWR),
+       GPIO_FN(IODREQ),
+       GPIO_FN(IDECS0),
+       GPIO_FN(IDECS1),
+       GPIO_FN(IDEIORD),
+       GPIO_FN(DIRECTION),
+       GPIO_FN(EXBUF_ENB),
+       GPIO_FN(IDERST),
+       GPIO_FN(IODACK),
+       GPIO_FN(IDEINT),
+       GPIO_FN(IDEIORDY),
 
        /* TPU */
-       PINMUX_GPIO(GPIO_FN_TPUTO3,     TPUTO3_MARK),
-       PINMUX_GPIO(GPIO_FN_TPUTO2,     TPUTO2_MARK),
-       PINMUX_GPIO(GPIO_FN_TPUTO1,     TPUTO1_MARK),
-       PINMUX_GPIO(GPIO_FN_TPUTO0,     TPUTO0_MARK),
-       PINMUX_GPIO(GPIO_FN_TPUTI3,     TPUTI3_MARK),
-       PINMUX_GPIO(GPIO_FN_TPUTI2,     TPUTI2_MARK),
+       GPIO_FN(TPUTO3),
+       GPIO_FN(TPUTO2),
+       GPIO_FN(TPUTO1),
+       GPIO_FN(TPUTO0),
+       GPIO_FN(TPUTI3),
+       GPIO_FN(TPUTI2),
 
        /* LCDC */
-       PINMUX_GPIO(GPIO_FN_LCDD23,     LCDD23_MARK),
-       PINMUX_GPIO(GPIO_FN_LCDD22,     LCDD22_MARK),
-       PINMUX_GPIO(GPIO_FN_LCDD21,     LCDD21_MARK),
-       PINMUX_GPIO(GPIO_FN_LCDD20,     LCDD20_MARK),
-       PINMUX_GPIO(GPIO_FN_LCDD19,     LCDD19_MARK),
-       PINMUX_GPIO(GPIO_FN_LCDD18,     LCDD18_MARK),
-       PINMUX_GPIO(GPIO_FN_LCDD17,     LCDD17_MARK),
-       PINMUX_GPIO(GPIO_FN_LCDD16,     LCDD16_MARK),
-       PINMUX_GPIO(GPIO_FN_LCDD15,     LCDD15_MARK),
-       PINMUX_GPIO(GPIO_FN_LCDD14,     LCDD14_MARK),
-       PINMUX_GPIO(GPIO_FN_LCDD13,     LCDD13_MARK),
-       PINMUX_GPIO(GPIO_FN_LCDD12,     LCDD12_MARK),
-       PINMUX_GPIO(GPIO_FN_LCDD11,     LCDD11_MARK),
-       PINMUX_GPIO(GPIO_FN_LCDD10,     LCDD10_MARK),
-       PINMUX_GPIO(GPIO_FN_LCDD9,      LCDD9_MARK),
-       PINMUX_GPIO(GPIO_FN_LCDD8,      LCDD8_MARK),
-       PINMUX_GPIO(GPIO_FN_LCDD7,      LCDD7_MARK),
-       PINMUX_GPIO(GPIO_FN_LCDD6,      LCDD6_MARK),
-       PINMUX_GPIO(GPIO_FN_LCDD5,      LCDD5_MARK),
-       PINMUX_GPIO(GPIO_FN_LCDD4,      LCDD4_MARK),
-       PINMUX_GPIO(GPIO_FN_LCDD3,      LCDD3_MARK),
-       PINMUX_GPIO(GPIO_FN_LCDD2,      LCDD2_MARK),
-       PINMUX_GPIO(GPIO_FN_LCDD1,      LCDD1_MARK),
-       PINMUX_GPIO(GPIO_FN_LCDD0,      LCDD0_MARK),
-       PINMUX_GPIO(GPIO_FN_LCDVSYN,    LCDVSYN_MARK),
-       PINMUX_GPIO(GPIO_FN_LCDDISP,    LCDDISP_MARK),
-       PINMUX_GPIO(GPIO_FN_LCDRS,      LCDRS_MARK),
-       PINMUX_GPIO(GPIO_FN_LCDHSYN,    LCDHSYN_MARK),
-       PINMUX_GPIO(GPIO_FN_LCDCS,      LCDCS_MARK),
-       PINMUX_GPIO(GPIO_FN_LCDDON,     LCDDON_MARK),
-       PINMUX_GPIO(GPIO_FN_LCDDCK,     LCDDCK_MARK),
-       PINMUX_GPIO(GPIO_FN_LCDWR,      LCDWR_MARK),
-       PINMUX_GPIO(GPIO_FN_LCDVEPWC,   LCDVEPWC_MARK),
-       PINMUX_GPIO(GPIO_FN_LCDVCPWC,   LCDVCPWC_MARK),
-       PINMUX_GPIO(GPIO_FN_LCDRD,      LCDRD_MARK),
-       PINMUX_GPIO(GPIO_FN_LCDLCLK,    LCDLCLK_MARK),
+       GPIO_FN(LCDD23),
+       GPIO_FN(LCDD22),
+       GPIO_FN(LCDD21),
+       GPIO_FN(LCDD20),
+       GPIO_FN(LCDD19),
+       GPIO_FN(LCDD18),
+       GPIO_FN(LCDD17),
+       GPIO_FN(LCDD16),
+       GPIO_FN(LCDD15),
+       GPIO_FN(LCDD14),
+       GPIO_FN(LCDD13),
+       GPIO_FN(LCDD12),
+       GPIO_FN(LCDD11),
+       GPIO_FN(LCDD10),
+       GPIO_FN(LCDD9),
+       GPIO_FN(LCDD8),
+       GPIO_FN(LCDD7),
+       GPIO_FN(LCDD6),
+       GPIO_FN(LCDD5),
+       GPIO_FN(LCDD4),
+       GPIO_FN(LCDD3),
+       GPIO_FN(LCDD2),
+       GPIO_FN(LCDD1),
+       GPIO_FN(LCDD0),
+       GPIO_FN(LCDVSYN),
+       GPIO_FN(LCDDISP),
+       GPIO_FN(LCDRS),
+       GPIO_FN(LCDHSYN),
+       GPIO_FN(LCDCS),
+       GPIO_FN(LCDDON),
+       GPIO_FN(LCDDCK),
+       GPIO_FN(LCDWR),
+       GPIO_FN(LCDVEPWC),
+       GPIO_FN(LCDVCPWC),
+       GPIO_FN(LCDRD),
+       GPIO_FN(LCDLCLK),
 
        /* SCIF0 */
-       PINMUX_GPIO(GPIO_FN_SCIF0_TXD,  SCIF0_TXD_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF0_RXD,  SCIF0_RXD_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF0_SCK,  SCIF0_SCK_MARK),
+       GPIO_FN(SCIF0_TXD),
+       GPIO_FN(SCIF0_RXD),
+       GPIO_FN(SCIF0_SCK),
 
        /* SCIF1 */
-       PINMUX_GPIO(GPIO_FN_SCIF1_SCK,  SCIF1_SCK_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF1_RXD,  SCIF1_RXD_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF1_TXD,  SCIF1_TXD_MARK),
+       GPIO_FN(SCIF1_SCK),
+       GPIO_FN(SCIF1_RXD),
+       GPIO_FN(SCIF1_TXD),
 
        /* SCIF2 */
-       PINMUX_GPIO(GPIO_FN_SCIF2_L_TXD,        SCIF2_L_TXD_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF2_L_SCK,        SCIF2_L_SCK_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF2_L_RXD,        SCIF2_L_RXD_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF2_V_TXD,        SCIF2_V_TXD_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF2_V_SCK,        SCIF2_V_SCK_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF2_V_RXD,        SCIF2_V_RXD_MARK),
+       GPIO_FN(SCIF2_L_TXD),
+       GPIO_FN(SCIF2_L_SCK),
+       GPIO_FN(SCIF2_L_RXD),
+       GPIO_FN(SCIF2_V_TXD),
+       GPIO_FN(SCIF2_V_SCK),
+       GPIO_FN(SCIF2_V_RXD),
 
        /* SCIF3 */
-       PINMUX_GPIO(GPIO_FN_SCIF3_V_SCK,        SCIF3_V_SCK_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF3_V_RXD,        SCIF3_V_RXD_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF3_V_TXD,        SCIF3_V_TXD_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF3_V_CTS,        SCIF3_V_CTS_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF3_V_RTS,        SCIF3_V_RTS_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF3_I_SCK,        SCIF3_I_SCK_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF3_I_RXD,        SCIF3_I_RXD_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF3_I_TXD,        SCIF3_I_TXD_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF3_I_CTS,        SCIF3_I_CTS_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF3_I_RTS,        SCIF3_I_RTS_MARK),
+       GPIO_FN(SCIF3_V_SCK),
+       GPIO_FN(SCIF3_V_RXD),
+       GPIO_FN(SCIF3_V_TXD),
+       GPIO_FN(SCIF3_V_CTS),
+       GPIO_FN(SCIF3_V_RTS),
+       GPIO_FN(SCIF3_I_SCK),
+       GPIO_FN(SCIF3_I_RXD),
+       GPIO_FN(SCIF3_I_TXD),
+       GPIO_FN(SCIF3_I_CTS),
+       GPIO_FN(SCIF3_I_RTS),
 
        /* SCIF4 */
-       PINMUX_GPIO(GPIO_FN_SCIF4_SCK,  SCIF4_SCK_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF4_RXD,  SCIF4_RXD_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF4_TXD,  SCIF4_TXD_MARK),
+       GPIO_FN(SCIF4_SCK),
+       GPIO_FN(SCIF4_RXD),
+       GPIO_FN(SCIF4_TXD),
 
        /* SCIF5 */
-       PINMUX_GPIO(GPIO_FN_SCIF5_SCK,  SCIF5_SCK_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF5_RXD,  SCIF5_RXD_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF5_TXD,  SCIF5_TXD_MARK),
+       GPIO_FN(SCIF5_SCK),
+       GPIO_FN(SCIF5_RXD),
+       GPIO_FN(SCIF5_TXD),
 
        /* FSI */
-       PINMUX_GPIO(GPIO_FN_FSIMCKB,    FSIMCKB_MARK),
-       PINMUX_GPIO(GPIO_FN_FSIMCKA,    FSIMCKA_MARK),
-       PINMUX_GPIO(GPIO_FN_FSIOASD,    FSIOASD_MARK),
-       PINMUX_GPIO(GPIO_FN_FSIIABCK,   FSIIABCK_MARK),
-       PINMUX_GPIO(GPIO_FN_FSIIALRCK,  FSIIALRCK_MARK),
-       PINMUX_GPIO(GPIO_FN_FSIOABCK,   FSIOABCK_MARK),
-       PINMUX_GPIO(GPIO_FN_FSIOALRCK,  FSIOALRCK_MARK),
-       PINMUX_GPIO(GPIO_FN_CLKAUDIOAO, CLKAUDIOAO_MARK),
-       PINMUX_GPIO(GPIO_FN_FSIIBSD,    FSIIBSD_MARK),
-       PINMUX_GPIO(GPIO_FN_FSIOBSD,    FSIOBSD_MARK),
-       PINMUX_GPIO(GPIO_FN_FSIIBBCK,   FSIIBBCK_MARK),
-       PINMUX_GPIO(GPIO_FN_FSIIBLRCK,  FSIIBLRCK_MARK),
-       PINMUX_GPIO(GPIO_FN_FSIOBBCK,   FSIOBBCK_MARK),
-       PINMUX_GPIO(GPIO_FN_FSIOBLRCK,  FSIOBLRCK_MARK),
-       PINMUX_GPIO(GPIO_FN_CLKAUDIOBO, CLKAUDIOBO_MARK),
-       PINMUX_GPIO(GPIO_FN_FSIIASD,    FSIIASD_MARK),
+       GPIO_FN(FSIMCKB),
+       GPIO_FN(FSIMCKA),
+       GPIO_FN(FSIOASD),
+       GPIO_FN(FSIIABCK),
+       GPIO_FN(FSIIALRCK),
+       GPIO_FN(FSIOABCK),
+       GPIO_FN(FSIOALRCK),
+       GPIO_FN(CLKAUDIOAO),
+       GPIO_FN(FSIIBSD),
+       GPIO_FN(FSIOBSD),
+       GPIO_FN(FSIIBBCK),
+       GPIO_FN(FSIIBLRCK),
+       GPIO_FN(FSIOBBCK),
+       GPIO_FN(FSIOBLRCK),
+       GPIO_FN(CLKAUDIOBO),
+       GPIO_FN(FSIIASD),
 
        /* AUD */
-       PINMUX_GPIO(GPIO_FN_AUDCK,      AUDCK_MARK),
-       PINMUX_GPIO(GPIO_FN_AUDSYNC,    AUDSYNC_MARK),
-       PINMUX_GPIO(GPIO_FN_AUDATA3,    AUDATA3_MARK),
-       PINMUX_GPIO(GPIO_FN_AUDATA2,    AUDATA2_MARK),
-       PINMUX_GPIO(GPIO_FN_AUDATA1,    AUDATA1_MARK),
-       PINMUX_GPIO(GPIO_FN_AUDATA0,    AUDATA0_MARK),
+       GPIO_FN(AUDCK),
+       GPIO_FN(AUDSYNC),
+       GPIO_FN(AUDATA3),
+       GPIO_FN(AUDATA2),
+       GPIO_FN(AUDATA1),
+       GPIO_FN(AUDATA0),
 
        /* VIO */
-       PINMUX_GPIO(GPIO_FN_VIO_CKO,    VIO_CKO_MARK),
+       GPIO_FN(VIO_CKO),
 
        /* VIO0 */
-       PINMUX_GPIO(GPIO_FN_VIO0_D15,   VIO0_D15_MARK),
-       PINMUX_GPIO(GPIO_FN_VIO0_D14,   VIO0_D14_MARK),
-       PINMUX_GPIO(GPIO_FN_VIO0_D13,   VIO0_D13_MARK),
-       PINMUX_GPIO(GPIO_FN_VIO0_D12,   VIO0_D12_MARK),
-       PINMUX_GPIO(GPIO_FN_VIO0_D11,   VIO0_D11_MARK),
-       PINMUX_GPIO(GPIO_FN_VIO0_D10,   VIO0_D10_MARK),
-       PINMUX_GPIO(GPIO_FN_VIO0_D9,    VIO0_D9_MARK),
-       PINMUX_GPIO(GPIO_FN_VIO0_D8,    VIO0_D8_MARK),
-       PINMUX_GPIO(GPIO_FN_VIO0_D7,    VIO0_D7_MARK),
-       PINMUX_GPIO(GPIO_FN_VIO0_D6,    VIO0_D6_MARK),
-       PINMUX_GPIO(GPIO_FN_VIO0_D5,    VIO0_D5_MARK),
-       PINMUX_GPIO(GPIO_FN_VIO0_D4,    VIO0_D4_MARK),
-       PINMUX_GPIO(GPIO_FN_VIO0_D3,    VIO0_D3_MARK),
-       PINMUX_GPIO(GPIO_FN_VIO0_D2,    VIO0_D2_MARK),
-       PINMUX_GPIO(GPIO_FN_VIO0_D1,    VIO0_D1_MARK),
-       PINMUX_GPIO(GPIO_FN_VIO0_D0,    VIO0_D0_MARK),
-       PINMUX_GPIO(GPIO_FN_VIO0_VD,    VIO0_VD_MARK),
-       PINMUX_GPIO(GPIO_FN_VIO0_CLK,   VIO0_CLK_MARK),
-       PINMUX_GPIO(GPIO_FN_VIO0_FLD,   VIO0_FLD_MARK),
-       PINMUX_GPIO(GPIO_FN_VIO0_HD,    VIO0_HD_MARK),
+       GPIO_FN(VIO0_D15),
+       GPIO_FN(VIO0_D14),
+       GPIO_FN(VIO0_D13),
+       GPIO_FN(VIO0_D12),
+       GPIO_FN(VIO0_D11),
+       GPIO_FN(VIO0_D10),
+       GPIO_FN(VIO0_D9),
+       GPIO_FN(VIO0_D8),
+       GPIO_FN(VIO0_D7),
+       GPIO_FN(VIO0_D6),
+       GPIO_FN(VIO0_D5),
+       GPIO_FN(VIO0_D4),
+       GPIO_FN(VIO0_D3),
+       GPIO_FN(VIO0_D2),
+       GPIO_FN(VIO0_D1),
+       GPIO_FN(VIO0_D0),
+       GPIO_FN(VIO0_VD),
+       GPIO_FN(VIO0_CLK),
+       GPIO_FN(VIO0_FLD),
+       GPIO_FN(VIO0_HD),
 
        /* VIO1 */
-       PINMUX_GPIO(GPIO_FN_VIO1_D7,    VIO1_D7_MARK),
-       PINMUX_GPIO(GPIO_FN_VIO1_D6,    VIO1_D6_MARK),
-       PINMUX_GPIO(GPIO_FN_VIO1_D5,    VIO1_D5_MARK),
-       PINMUX_GPIO(GPIO_FN_VIO1_D4,    VIO1_D4_MARK),
-       PINMUX_GPIO(GPIO_FN_VIO1_D3,    VIO1_D3_MARK),
-       PINMUX_GPIO(GPIO_FN_VIO1_D2,    VIO1_D2_MARK),
-       PINMUX_GPIO(GPIO_FN_VIO1_D1,    VIO1_D1_MARK),
-       PINMUX_GPIO(GPIO_FN_VIO1_D0,    VIO1_D0_MARK),
-       PINMUX_GPIO(GPIO_FN_VIO1_FLD,   VIO1_FLD_MARK),
-       PINMUX_GPIO(GPIO_FN_VIO1_HD,    VIO1_HD_MARK),
-       PINMUX_GPIO(GPIO_FN_VIO1_VD,    VIO1_VD_MARK),
-       PINMUX_GPIO(GPIO_FN_VIO1_CLK,   VIO1_CLK_MARK),
+       GPIO_FN(VIO1_D7),
+       GPIO_FN(VIO1_D6),
+       GPIO_FN(VIO1_D5),
+       GPIO_FN(VIO1_D4),
+       GPIO_FN(VIO1_D3),
+       GPIO_FN(VIO1_D2),
+       GPIO_FN(VIO1_D1),
+       GPIO_FN(VIO1_D0),
+       GPIO_FN(VIO1_FLD),
+       GPIO_FN(VIO1_HD),
+       GPIO_FN(VIO1_VD),
+       GPIO_FN(VIO1_CLK),
 
        /* Eth */
-       PINMUX_GPIO(GPIO_FN_RMII_RXD0,          RMII_RXD0_MARK),
-       PINMUX_GPIO(GPIO_FN_RMII_RXD1,          RMII_RXD1_MARK),
-       PINMUX_GPIO(GPIO_FN_RMII_TXD0,          RMII_TXD0_MARK),
-       PINMUX_GPIO(GPIO_FN_RMII_TXD1,          RMII_TXD1_MARK),
-       PINMUX_GPIO(GPIO_FN_RMII_REF_CLK,       RMII_REF_CLK_MARK),
-       PINMUX_GPIO(GPIO_FN_RMII_TX_EN,         RMII_TX_EN_MARK),
-       PINMUX_GPIO(GPIO_FN_RMII_RX_ER,         RMII_RX_ER_MARK),
-       PINMUX_GPIO(GPIO_FN_RMII_CRS_DV,        RMII_CRS_DV_MARK),
-       PINMUX_GPIO(GPIO_FN_LNKSTA,             LNKSTA_MARK),
-       PINMUX_GPIO(GPIO_FN_MDIO,               MDIO_MARK),
-       PINMUX_GPIO(GPIO_FN_MDC,                MDC_MARK),
+       GPIO_FN(RMII_RXD0),
+       GPIO_FN(RMII_RXD1),
+       GPIO_FN(RMII_TXD0),
+       GPIO_FN(RMII_TXD1),
+       GPIO_FN(RMII_REF_CLK),
+       GPIO_FN(RMII_TX_EN),
+       GPIO_FN(RMII_RX_ER),
+       GPIO_FN(RMII_CRS_DV),
+       GPIO_FN(LNKSTA),
+       GPIO_FN(MDIO),
+       GPIO_FN(MDC),
 
        /* System */
-       PINMUX_GPIO(GPIO_FN_PDSTATUS,   PDSTATUS_MARK),
-       PINMUX_GPIO(GPIO_FN_STATUS2,    STATUS2_MARK),
-       PINMUX_GPIO(GPIO_FN_STATUS0,    STATUS0_MARK),
+       GPIO_FN(PDSTATUS),
+       GPIO_FN(STATUS2),
+       GPIO_FN(STATUS0),
 
        /* VOU */
-       PINMUX_GPIO(GPIO_FN_DV_D15,     DV_D15_MARK),
-       PINMUX_GPIO(GPIO_FN_DV_D14,     DV_D14_MARK),
-       PINMUX_GPIO(GPIO_FN_DV_D13,     DV_D13_MARK),
-       PINMUX_GPIO(GPIO_FN_DV_D12,     DV_D12_MARK),
-       PINMUX_GPIO(GPIO_FN_DV_D11,     DV_D11_MARK),
-       PINMUX_GPIO(GPIO_FN_DV_D10,     DV_D10_MARK),
-       PINMUX_GPIO(GPIO_FN_DV_D9,      DV_D9_MARK),
-       PINMUX_GPIO(GPIO_FN_DV_D8,      DV_D8_MARK),
-       PINMUX_GPIO(GPIO_FN_DV_D7,      DV_D7_MARK),
-       PINMUX_GPIO(GPIO_FN_DV_D6,      DV_D6_MARK),
-       PINMUX_GPIO(GPIO_FN_DV_D5,      DV_D5_MARK),
-       PINMUX_GPIO(GPIO_FN_DV_D4,      DV_D4_MARK),
-       PINMUX_GPIO(GPIO_FN_DV_D3,      DV_D3_MARK),
-       PINMUX_GPIO(GPIO_FN_DV_D2,      DV_D2_MARK),
-       PINMUX_GPIO(GPIO_FN_DV_D1,      DV_D1_MARK),
-       PINMUX_GPIO(GPIO_FN_DV_D0,      DV_D0_MARK),
-       PINMUX_GPIO(GPIO_FN_DV_CLKI,    DV_CLKI_MARK),
-       PINMUX_GPIO(GPIO_FN_DV_CLK,     DV_CLK_MARK),
-       PINMUX_GPIO(GPIO_FN_DV_VSYNC,   DV_VSYNC_MARK),
-       PINMUX_GPIO(GPIO_FN_DV_HSYNC,   DV_HSYNC_MARK),
+       GPIO_FN(DV_D15),
+       GPIO_FN(DV_D14),
+       GPIO_FN(DV_D13),
+       GPIO_FN(DV_D12),
+       GPIO_FN(DV_D11),
+       GPIO_FN(DV_D10),
+       GPIO_FN(DV_D9),
+       GPIO_FN(DV_D8),
+       GPIO_FN(DV_D7),
+       GPIO_FN(DV_D6),
+       GPIO_FN(DV_D5),
+       GPIO_FN(DV_D4),
+       GPIO_FN(DV_D3),
+       GPIO_FN(DV_D2),
+       GPIO_FN(DV_D1),
+       GPIO_FN(DV_D0),
+       GPIO_FN(DV_CLKI),
+       GPIO_FN(DV_CLK),
+       GPIO_FN(DV_VSYNC),
+       GPIO_FN(DV_HSYNC),
 
        /* MSIOF0 */
-       PINMUX_GPIO(GPIO_FN_MSIOF0_RXD,         MSIOF0_RXD_MARK),
-       PINMUX_GPIO(GPIO_FN_MSIOF0_TXD,         MSIOF0_TXD_MARK),
-       PINMUX_GPIO(GPIO_FN_MSIOF0_MCK,         MSIOF0_MCK_MARK),
-       PINMUX_GPIO(GPIO_FN_MSIOF0_TSCK,        MSIOF0_TSCK_MARK),
-       PINMUX_GPIO(GPIO_FN_MSIOF0_SS1,         MSIOF0_SS1_MARK),
-       PINMUX_GPIO(GPIO_FN_MSIOF0_SS2,         MSIOF0_SS2_MARK),
-       PINMUX_GPIO(GPIO_FN_MSIOF0_TSYNC,       MSIOF0_TSYNC_MARK),
-       PINMUX_GPIO(GPIO_FN_MSIOF0_RSCK,        MSIOF0_RSCK_MARK),
-       PINMUX_GPIO(GPIO_FN_MSIOF0_RSYNC,       MSIOF0_RSYNC_MARK),
+       GPIO_FN(MSIOF0_RXD),
+       GPIO_FN(MSIOF0_TXD),
+       GPIO_FN(MSIOF0_MCK),
+       GPIO_FN(MSIOF0_TSCK),
+       GPIO_FN(MSIOF0_SS1),
+       GPIO_FN(MSIOF0_SS2),
+       GPIO_FN(MSIOF0_TSYNC),
+       GPIO_FN(MSIOF0_RSCK),
+       GPIO_FN(MSIOF0_RSYNC),
 
        /* MSIOF1 */
-       PINMUX_GPIO(GPIO_FN_MSIOF1_RXD,         MSIOF1_RXD_MARK),
-       PINMUX_GPIO(GPIO_FN_MSIOF1_TXD,         MSIOF1_TXD_MARK),
-       PINMUX_GPIO(GPIO_FN_MSIOF1_MCK,         MSIOF1_MCK_MARK),
-       PINMUX_GPIO(GPIO_FN_MSIOF1_TSCK,        MSIOF1_TSCK_MARK),
-       PINMUX_GPIO(GPIO_FN_MSIOF1_SS1,         MSIOF1_SS1_MARK),
-       PINMUX_GPIO(GPIO_FN_MSIOF1_SS2,         MSIOF1_SS2_MARK),
-       PINMUX_GPIO(GPIO_FN_MSIOF1_TSYNC,       MSIOF1_TSYNC_MARK),
-       PINMUX_GPIO(GPIO_FN_MSIOF1_RSCK,        MSIOF1_RSCK_MARK),
-       PINMUX_GPIO(GPIO_FN_MSIOF1_RSYNC,       MSIOF1_RSYNC_MARK),
+       GPIO_FN(MSIOF1_RXD),
+       GPIO_FN(MSIOF1_TXD),
+       GPIO_FN(MSIOF1_MCK),
+       GPIO_FN(MSIOF1_TSCK),
+       GPIO_FN(MSIOF1_SS1),
+       GPIO_FN(MSIOF1_SS2),
+       GPIO_FN(MSIOF1_TSYNC),
+       GPIO_FN(MSIOF1_RSCK),
+       GPIO_FN(MSIOF1_RSYNC),
 
        /* DMAC */
-       PINMUX_GPIO(GPIO_FN_DMAC_DACK0, DMAC_DACK0_MARK),
-       PINMUX_GPIO(GPIO_FN_DMAC_DREQ0, DMAC_DREQ0_MARK),
-       PINMUX_GPIO(GPIO_FN_DMAC_DACK1, DMAC_DACK1_MARK),
-       PINMUX_GPIO(GPIO_FN_DMAC_DREQ1, DMAC_DREQ1_MARK),
+       GPIO_FN(DMAC_DACK0),
+       GPIO_FN(DMAC_DREQ0),
+       GPIO_FN(DMAC_DACK1),
+       GPIO_FN(DMAC_DREQ1),
 
        /* SDHI0 */
-       PINMUX_GPIO(GPIO_FN_SDHI0CD,    SDHI0CD_MARK),
-       PINMUX_GPIO(GPIO_FN_SDHI0WP,    SDHI0WP_MARK),
-       PINMUX_GPIO(GPIO_FN_SDHI0CMD,   SDHI0CMD_MARK),
-       PINMUX_GPIO(GPIO_FN_SDHI0CLK,   SDHI0CLK_MARK),
-       PINMUX_GPIO(GPIO_FN_SDHI0D3,    SDHI0D3_MARK),
-       PINMUX_GPIO(GPIO_FN_SDHI0D2,    SDHI0D2_MARK),
-       PINMUX_GPIO(GPIO_FN_SDHI0D1,    SDHI0D1_MARK),
-       PINMUX_GPIO(GPIO_FN_SDHI0D0,    SDHI0D0_MARK),
+       GPIO_FN(SDHI0CD),
+       GPIO_FN(SDHI0WP),
+       GPIO_FN(SDHI0CMD),
+       GPIO_FN(SDHI0CLK),
+       GPIO_FN(SDHI0D3),
+       GPIO_FN(SDHI0D2),
+       GPIO_FN(SDHI0D1),
+       GPIO_FN(SDHI0D0),
 
        /* SDHI1 */
-       PINMUX_GPIO(GPIO_FN_SDHI1CD,    SDHI1CD_MARK),
-       PINMUX_GPIO(GPIO_FN_SDHI1WP,    SDHI1WP_MARK),
-       PINMUX_GPIO(GPIO_FN_SDHI1CMD,   SDHI1CMD_MARK),
-       PINMUX_GPIO(GPIO_FN_SDHI1CLK,   SDHI1CLK_MARK),
-       PINMUX_GPIO(GPIO_FN_SDHI1D3,    SDHI1D3_MARK),
-       PINMUX_GPIO(GPIO_FN_SDHI1D2,    SDHI1D2_MARK),
-       PINMUX_GPIO(GPIO_FN_SDHI1D1,    SDHI1D1_MARK),
-       PINMUX_GPIO(GPIO_FN_SDHI1D0,    SDHI1D0_MARK),
+       GPIO_FN(SDHI1CD),
+       GPIO_FN(SDHI1WP),
+       GPIO_FN(SDHI1CMD),
+       GPIO_FN(SDHI1CLK),
+       GPIO_FN(SDHI1D3),
+       GPIO_FN(SDHI1D2),
+       GPIO_FN(SDHI1D1),
+       GPIO_FN(SDHI1D0),
 
        /* MMC */
-       PINMUX_GPIO(GPIO_FN_MMC_D7,     MMC_D7_MARK),
-       PINMUX_GPIO(GPIO_FN_MMC_D6,     MMC_D6_MARK),
-       PINMUX_GPIO(GPIO_FN_MMC_D5,     MMC_D5_MARK),
-       PINMUX_GPIO(GPIO_FN_MMC_D4,     MMC_D4_MARK),
-       PINMUX_GPIO(GPIO_FN_MMC_D3,     MMC_D3_MARK),
-       PINMUX_GPIO(GPIO_FN_MMC_D2,     MMC_D2_MARK),
-       PINMUX_GPIO(GPIO_FN_MMC_D1,     MMC_D1_MARK),
-       PINMUX_GPIO(GPIO_FN_MMC_D0,     MMC_D0_MARK),
-       PINMUX_GPIO(GPIO_FN_MMC_CLK,    MMC_CLK_MARK),
-       PINMUX_GPIO(GPIO_FN_MMC_CMD,    MMC_CMD_MARK),
+       GPIO_FN(MMC_D7),
+       GPIO_FN(MMC_D6),
+       GPIO_FN(MMC_D5),
+       GPIO_FN(MMC_D4),
+       GPIO_FN(MMC_D3),
+       GPIO_FN(MMC_D2),
+       GPIO_FN(MMC_D1),
+       GPIO_FN(MMC_D0),
+       GPIO_FN(MMC_CLK),
+       GPIO_FN(MMC_CMD),
 
        /* IrDA */
-       PINMUX_GPIO(GPIO_FN_IRDA_OUT,   IRDA_OUT_MARK),
-       PINMUX_GPIO(GPIO_FN_IRDA_IN,    IRDA_IN_MARK),
+       GPIO_FN(IRDA_OUT),
+       GPIO_FN(IRDA_IN),
 
        /* TSIF */
-       PINMUX_GPIO(GPIO_FN_TSIF_TS0_SDAT,      TSIF_TS0_SDAT_MARK),
-       PINMUX_GPIO(GPIO_FN_TSIF_TS0_SCK,       TSIF_TS0_SCK_MARK),
-       PINMUX_GPIO(GPIO_FN_TSIF_TS0_SDEN,      TSIF_TS0_SDEN_MARK),
-       PINMUX_GPIO(GPIO_FN_TSIF_TS0_SPSYNC,    TSIF_TS0_SPSYNC_MARK),
+       GPIO_FN(TSIF_TS0_SDAT),
+       GPIO_FN(TSIF_TS0_SCK),
+       GPIO_FN(TSIF_TS0_SDEN),
+       GPIO_FN(TSIF_TS0_SPSYNC),
 
        /* IRQ */
-       PINMUX_GPIO(GPIO_FN_INTC_IRQ7,  INTC_IRQ7_MARK),
-       PINMUX_GPIO(GPIO_FN_INTC_IRQ6,  INTC_IRQ6_MARK),
-       PINMUX_GPIO(GPIO_FN_INTC_IRQ5,  INTC_IRQ5_MARK),
-       PINMUX_GPIO(GPIO_FN_INTC_IRQ4,  INTC_IRQ4_MARK),
-       PINMUX_GPIO(GPIO_FN_INTC_IRQ3,  INTC_IRQ3_MARK),
-       PINMUX_GPIO(GPIO_FN_INTC_IRQ2,  INTC_IRQ2_MARK),
-       PINMUX_GPIO(GPIO_FN_INTC_IRQ1,  INTC_IRQ1_MARK),
-       PINMUX_GPIO(GPIO_FN_INTC_IRQ0,  INTC_IRQ0_MARK),
+       GPIO_FN(INTC_IRQ7),
+       GPIO_FN(INTC_IRQ6),
+       GPIO_FN(INTC_IRQ5),
+       GPIO_FN(INTC_IRQ4),
+       GPIO_FN(INTC_IRQ3),
+       GPIO_FN(INTC_IRQ2),
+       GPIO_FN(INTC_IRQ1),
+       GPIO_FN(INTC_IRQ0),
 };
 
-static struct pinmux_cfg_reg pinmux_config_regs[] = {
+static const struct pinmux_cfg_reg pinmux_config_regs[] = {
        { PINMUX_CFG_REG("PACR", 0xa4050100, 16, 2) {
                PTA7_FN, PTA7_OUT, PTA7_IN_PU, PTA7_IN,
                PTA6_FN, PTA6_OUT, PTA6_IN_PU, PTA6_IN,
@@ -2107,7 +2111,7 @@ static struct pinmux_cfg_reg pinmux_config_regs[] = {
        {}
 };
 
-static struct pinmux_data_reg pinmux_data_regs[] = {
+static const struct pinmux_data_reg pinmux_data_regs[] = {
        { PINMUX_DATA_REG("PADR", 0xa4050120, 8) {
                PTA7_DATA, PTA6_DATA, PTA5_DATA, PTA4_DATA,
                PTA3_DATA, PTA2_DATA, PTA1_DATA, PTA0_DATA }
@@ -2203,20 +2207,18 @@ static struct pinmux_data_reg pinmux_data_regs[] = {
        { },
 };
 
-struct sh_pfc_soc_info sh7724_pinmux_info = {
+const struct sh_pfc_soc_info sh7724_pinmux_info = {
        .name = "sh7724_pfc",
-       .reserved_id = PINMUX_RESERVED,
-       .data = { PINMUX_DATA_BEGIN, PINMUX_DATA_END },
        .input = { PINMUX_INPUT_BEGIN, PINMUX_INPUT_END },
        .input_pu = { PINMUX_INPUT_PULLUP_BEGIN, PINMUX_INPUT_PULLUP_END },
        .output = { PINMUX_OUTPUT_BEGIN, PINMUX_OUTPUT_END },
-       .mark = { PINMUX_MARK_BEGIN, PINMUX_MARK_END },
        .function = { PINMUX_FUNCTION_BEGIN, PINMUX_FUNCTION_END },
 
-       .first_gpio = GPIO_PTA7,
-       .last_gpio = GPIO_FN_INTC_IRQ0,
+       .pins = pinmux_pins,
+       .nr_pins = ARRAY_SIZE(pinmux_pins),
+       .func_gpios = pinmux_func_gpios,
+       .nr_func_gpios = ARRAY_SIZE(pinmux_func_gpios),
 
-       .gpios = pinmux_gpios,
        .cfg_regs = pinmux_config_regs,
        .data_regs = pinmux_data_regs,
 
index 23d76d262c3204a431892bc8f575f930036b8cd9..2fd5b7d4cb940a31a59d6ea175330db1438be4e3 100644 (file)
 
 #include "sh_pfc.h"
 
-#define CPU_32_PORT(fn, pfx, sfx)                              \
-       PORT_10(fn, pfx, sfx), PORT_10(fn, pfx##1, sfx),        \
-       PORT_10(fn, pfx##2, sfx), PORT_1(fn, pfx##30, sfx),     \
-       PORT_1(fn, pfx##31, sfx)
-
 #define CPU_32_PORT5(fn, pfx, sfx)                             \
        PORT_1(fn, pfx##0, sfx), PORT_1(fn, pfx##1, sfx),       \
        PORT_1(fn, pfx##2, sfx), PORT_1(fn, pfx##3, sfx),       \
 
 /* GPSR0 - GPSR5 */
 #define CPU_ALL_PORT(fn, pfx, sfx)                             \
-       CPU_32_PORT(fn, pfx##_0_, sfx),                 \
-       CPU_32_PORT(fn, pfx##_1_, sfx),                         \
-       CPU_32_PORT(fn, pfx##_2_, sfx),                         \
-       CPU_32_PORT(fn, pfx##_3_, sfx),                         \
-       CPU_32_PORT(fn, pfx##_4_, sfx),                         \
+       PORT_32(fn, pfx##_0_, sfx),                     \
+       PORT_32(fn, pfx##_1_, sfx),                             \
+       PORT_32(fn, pfx##_2_, sfx),                             \
+       PORT_32(fn, pfx##_3_, sfx),                             \
+       PORT_32(fn, pfx##_4_, sfx),                             \
        CPU_32_PORT5(fn, pfx##_5_, sfx)
 
 #define _GP_GPIO(pfx, sfx) PINMUX_GPIO(GPIO_GP##pfx, GP##pfx##_DATA)
 #define PINMUX_GPIO_GP_ALL()   CPU_ALL_PORT(_GP_GPIO, , unused)
 #define PINMUX_DATA_GP_ALL()   CPU_ALL_PORT(_GP_DATA, , unused)
 
-#define PORT_10_REV(fn, pfx, sfx)      \
-       PORT_1(fn, pfx##9, sfx), PORT_1(fn, pfx##8, sfx),       \
-       PORT_1(fn, pfx##7, sfx), PORT_1(fn, pfx##6, sfx),       \
-       PORT_1(fn, pfx##5, sfx), PORT_1(fn, pfx##4, sfx),       \
-       PORT_1(fn, pfx##3, sfx), PORT_1(fn, pfx##2, sfx),       \
-       PORT_1(fn, pfx##1, sfx), PORT_1(fn, pfx##0, sfx)
-
-#define CPU_32_PORT_REV(fn, pfx, sfx)  \
-       PORT_1(fn, pfx##31, sfx), PORT_1(fn, pfx##30, sfx),     \
-       PORT_10_REV(fn, pfx##2, sfx), PORT_10_REV(fn, pfx##1, sfx),     \
-       PORT_10_REV(fn, pfx, sfx)
-
-#define GP_INOUTSEL(bank) CPU_32_PORT_REV(_GP_INOUTSEL, _##bank##_, unused)
-#define GP_INDT(bank) CPU_32_PORT_REV(_GP_INDT, _##bank##_, unused)
+#define GP_INOUTSEL(bank) PORT_32_REV(_GP_INOUTSEL, _##bank##_, unused)
+#define GP_INDT(bank) PORT_32_REV(_GP_INDT, _##bank##_, unused)
 
 #define PINMUX_IPSR_DATA(ipsr, fn) PINMUX_DATA(fn##_MARK, FN_##ipsr, FN_##fn)
 #define PINMUX_IPSR_MODSEL_DATA(ipsr, fn, ms) PINMUX_DATA(fn##_MARK, FN_##ms, \
@@ -609,7 +592,7 @@ enum {
        PINMUX_MARK_END,
 };
 
-static pinmux_enum_t pinmux_data[] = {
+static const pinmux_enum_t pinmux_data[] = {
        PINMUX_DATA_GP_ALL(), /* PINMUX_DATA(GP_M_N_DATA, GP_M_N_FN...), */
 
        PINMUX_DATA(CLKOUT_MARK, FN_CLKOUT),
@@ -1384,9 +1367,13 @@ static pinmux_enum_t pinmux_data[] = {
        PINMUX_IPSR_DATA(IP11_28, ST_CLKOUT),
 };
 
-static struct pinmux_gpio pinmux_gpios[] = {
+static struct sh_pfc_pin pinmux_pins[] = {
        PINMUX_GPIO_GP_ALL(),
+};
+
+#define PINMUX_FN_BASE ARRAY_SIZE(pinmux_pins)
 
+static const struct pinmux_func pinmux_func_gpios[] = {
        GPIO_FN(CLKOUT), GPIO_FN(BS), GPIO_FN(CS0), GPIO_FN(EX_CS0),
        GPIO_FN(RD), GPIO_FN(WE0), GPIO_FN(WE1),
        GPIO_FN(SCL0), GPIO_FN(PENC0), GPIO_FN(USB_OVC0),
@@ -1665,7 +1652,7 @@ static struct pinmux_gpio pinmux_gpios[] = {
        GPIO_FN(SCL1), GPIO_FN(SCIF_CLK_C),
 };
 
-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_IP2_2_0,
                GP_0_30_FN, FN_IP1_31_29,
@@ -2434,7 +2421,7 @@ static struct pinmux_cfg_reg pinmux_config_regs[] = {
        { },
 };
 
-static struct pinmux_data_reg pinmux_data_regs[] = {
+static const struct pinmux_data_reg pinmux_data_regs[] = {
        /* GPIO 0 - 5*/
        { PINMUX_DATA_REG("INDT0", 0xFFC4000C, 32) { GP_INDT(0) } },
        { PINMUX_DATA_REG("INDT1", 0xFFC4100C, 32) { GP_INDT(1) } },
@@ -2451,22 +2438,20 @@ static struct pinmux_data_reg pinmux_data_regs[] = {
        { },
 };
 
-struct sh_pfc_soc_info sh7734_pinmux_info = {
+const struct sh_pfc_soc_info sh7734_pinmux_info = {
        .name = "sh7734_pfc",
 
        .unlock_reg = 0xFFFC0000,
 
-       .reserved_id = PINMUX_RESERVED,
-       .data = { PINMUX_DATA_BEGIN, PINMUX_DATA_END },
        .input = { PINMUX_INPUT_BEGIN, PINMUX_INPUT_END },
        .output = { PINMUX_OUTPUT_BEGIN, PINMUX_OUTPUT_END },
-       .mark = { PINMUX_MARK_BEGIN, PINMUX_MARK_END },
        .function = { PINMUX_FUNCTION_BEGIN, PINMUX_FUNCTION_END },
 
-       .first_gpio = GPIO_GP_0_0,
-       .last_gpio = GPIO_FN_ST_CLKOUT,
+       .pins = pinmux_pins,
+       .nr_pins = ARRAY_SIZE(pinmux_pins),
+       .func_gpios = pinmux_func_gpios,
+       .nr_func_gpios = ARRAY_SIZE(pinmux_func_gpios),
 
-       .gpios = pinmux_gpios,
        .cfg_regs = pinmux_config_regs,
        .data_regs = pinmux_data_regs,
 
index 5ed74cd0ba99395ddbf7f5185aa9791b4faa45c1..e074230e6243dfe23cbf9eac874d843de4193256 100644 (file)
@@ -526,7 +526,7 @@ enum {
        PINMUX_MARK_END,
 };
 
-static pinmux_enum_t pinmux_data[] = {
+static const pinmux_enum_t pinmux_data[] = {
        /* PTA GPIO */
        PINMUX_DATA(PTA7_DATA, PTA7_IN, PTA7_OUT),
        PINMUX_DATA(PTA6_DATA, PTA6_IN, PTA6_OUT),
@@ -1114,7 +1114,7 @@ static pinmux_enum_t pinmux_data[] = {
        PINMUX_DATA(ON_DQ0_MARK, PS8_8_FN2, PTZ0_FN),
 };
 
-static struct pinmux_gpio pinmux_gpios[] = {
+static struct sh_pfc_pin pinmux_pins[] = {
        /* PTA */
        PINMUX_GPIO(GPIO_PTA7, PTA7_DATA),
        PINMUX_GPIO(GPIO_PTA6, PTA6_DATA),
@@ -1370,359 +1370,363 @@ static struct pinmux_gpio pinmux_gpios[] = {
        PINMUX_GPIO(GPIO_PTZ2, PTZ2_DATA),
        PINMUX_GPIO(GPIO_PTZ1, PTZ1_DATA),
        PINMUX_GPIO(GPIO_PTZ0, PTZ0_DATA),
+};
+
+#define PINMUX_FN_BASE ARRAY_SIZE(pinmux_pins)
 
+static const struct pinmux_func pinmux_func_gpios[] = {
        /* PTA (mobule: LBSC, RGMII) */
-       PINMUX_GPIO(GPIO_FN_BS, BS_MARK),
-       PINMUX_GPIO(GPIO_FN_RDWR, RDWR_MARK),
-       PINMUX_GPIO(GPIO_FN_WE1, WE1_MARK),
-       PINMUX_GPIO(GPIO_FN_RDY, RDY_MARK),
-       PINMUX_GPIO(GPIO_FN_ET0_MDC, ET0_MDC_MARK),
-       PINMUX_GPIO(GPIO_FN_ET0_MDIO, ET0_MDIO_MARK),
-       PINMUX_GPIO(GPIO_FN_ET1_MDC, ET1_MDC_MARK),
-       PINMUX_GPIO(GPIO_FN_ET1_MDIO, ET1_MDIO_MARK),
+       GPIO_FN(BS),
+       GPIO_FN(RDWR),
+       GPIO_FN(WE1),
+       GPIO_FN(RDY),
+       GPIO_FN(ET0_MDC),
+       GPIO_FN(ET0_MDIO),
+       GPIO_FN(ET1_MDC),
+       GPIO_FN(ET1_MDIO),
 
        /* PTB (mobule: INTC, ONFI, TMU) */
-       PINMUX_GPIO(GPIO_FN_IRQ15, IRQ15_MARK),
-       PINMUX_GPIO(GPIO_FN_IRQ14, IRQ14_MARK),
-       PINMUX_GPIO(GPIO_FN_IRQ13, IRQ13_MARK),
-       PINMUX_GPIO(GPIO_FN_IRQ12, IRQ12_MARK),
-       PINMUX_GPIO(GPIO_FN_IRQ11, IRQ11_MARK),
-       PINMUX_GPIO(GPIO_FN_IRQ10, IRQ10_MARK),
-       PINMUX_GPIO(GPIO_FN_IRQ9, IRQ9_MARK),
-       PINMUX_GPIO(GPIO_FN_IRQ8, IRQ8_MARK),
-       PINMUX_GPIO(GPIO_FN_ON_NRE, ON_NRE_MARK),
-       PINMUX_GPIO(GPIO_FN_ON_NWE, ON_NWE_MARK),
-       PINMUX_GPIO(GPIO_FN_ON_NWP, ON_NWP_MARK),
-       PINMUX_GPIO(GPIO_FN_ON_NCE0, ON_NCE0_MARK),
-       PINMUX_GPIO(GPIO_FN_ON_R_B0, ON_R_B0_MARK),
-       PINMUX_GPIO(GPIO_FN_ON_ALE, ON_ALE_MARK),
-       PINMUX_GPIO(GPIO_FN_ON_CLE, ON_CLE_MARK),
-       PINMUX_GPIO(GPIO_FN_TCLK, TCLK_MARK),
+       GPIO_FN(IRQ15),
+       GPIO_FN(IRQ14),
+       GPIO_FN(IRQ13),
+       GPIO_FN(IRQ12),
+       GPIO_FN(IRQ11),
+       GPIO_FN(IRQ10),
+       GPIO_FN(IRQ9),
+       GPIO_FN(IRQ8),
+       GPIO_FN(ON_NRE),
+       GPIO_FN(ON_NWE),
+       GPIO_FN(ON_NWP),
+       GPIO_FN(ON_NCE0),
+       GPIO_FN(ON_R_B0),
+       GPIO_FN(ON_ALE),
+       GPIO_FN(ON_CLE),
+       GPIO_FN(TCLK),
 
        /* PTC (mobule: IRQ, PWMU) */
-       PINMUX_GPIO(GPIO_FN_IRQ7, IRQ7_MARK),
-       PINMUX_GPIO(GPIO_FN_IRQ6, IRQ6_MARK),
-       PINMUX_GPIO(GPIO_FN_IRQ5, IRQ5_MARK),
-       PINMUX_GPIO(GPIO_FN_IRQ4, IRQ4_MARK),
-       PINMUX_GPIO(GPIO_FN_IRQ3, IRQ3_MARK),
-       PINMUX_GPIO(GPIO_FN_IRQ2, IRQ2_MARK),
-       PINMUX_GPIO(GPIO_FN_IRQ1, IRQ1_MARK),
-       PINMUX_GPIO(GPIO_FN_IRQ0, IRQ0_MARK),
-       PINMUX_GPIO(GPIO_FN_PWMU0, PWMU0_MARK),
-       PINMUX_GPIO(GPIO_FN_PWMU1, PWMU1_MARK),
-       PINMUX_GPIO(GPIO_FN_PWMU2, PWMU2_MARK),
-       PINMUX_GPIO(GPIO_FN_PWMU3, PWMU3_MARK),
-       PINMUX_GPIO(GPIO_FN_PWMU4, PWMU4_MARK),
-       PINMUX_GPIO(GPIO_FN_PWMU5, PWMU5_MARK),
+       GPIO_FN(IRQ7),
+       GPIO_FN(IRQ6),
+       GPIO_FN(IRQ5),
+       GPIO_FN(IRQ4),
+       GPIO_FN(IRQ3),
+       GPIO_FN(IRQ2),
+       GPIO_FN(IRQ1),
+       GPIO_FN(IRQ0),
+       GPIO_FN(PWMU0),
+       GPIO_FN(PWMU1),
+       GPIO_FN(PWMU2),
+       GPIO_FN(PWMU3),
+       GPIO_FN(PWMU4),
+       GPIO_FN(PWMU5),
 
        /* PTD (mobule: SPI0, DMAC) */
-       PINMUX_GPIO(GPIO_FN_SP0_MOSI, SP0_MOSI_MARK),
-       PINMUX_GPIO(GPIO_FN_SP0_MISO, SP0_MISO_MARK),
-       PINMUX_GPIO(GPIO_FN_SP0_SCK, SP0_SCK_MARK),
-       PINMUX_GPIO(GPIO_FN_SP0_SCK_FB, SP0_SCK_FB_MARK),
-       PINMUX_GPIO(GPIO_FN_SP0_SS0, SP0_SS0_MARK),
-       PINMUX_GPIO(GPIO_FN_SP0_SS1, SP0_SS1_MARK),
-       PINMUX_GPIO(GPIO_FN_SP0_SS2, SP0_SS2_MARK),
-       PINMUX_GPIO(GPIO_FN_SP0_SS3, SP0_SS3_MARK),
-       PINMUX_GPIO(GPIO_FN_DREQ0, DREQ0_MARK),
-       PINMUX_GPIO(GPIO_FN_DACK0, DACK0_MARK),
-       PINMUX_GPIO(GPIO_FN_TEND0, TEND0_MARK),
+       GPIO_FN(SP0_MOSI),
+       GPIO_FN(SP0_MISO),
+       GPIO_FN(SP0_SCK),
+       GPIO_FN(SP0_SCK_FB),
+       GPIO_FN(SP0_SS0),
+       GPIO_FN(SP0_SS1),
+       GPIO_FN(SP0_SS2),
+       GPIO_FN(SP0_SS3),
+       GPIO_FN(DREQ0),
+       GPIO_FN(DACK0),
+       GPIO_FN(TEND0),
 
        /* PTE (mobule: RMII) */
-       PINMUX_GPIO(GPIO_FN_RMII0_CRS_DV, RMII0_CRS_DV_MARK),
-       PINMUX_GPIO(GPIO_FN_RMII0_TXD1, RMII0_TXD1_MARK),
-       PINMUX_GPIO(GPIO_FN_RMII0_TXD0, RMII0_TXD0_MARK),
-       PINMUX_GPIO(GPIO_FN_RMII0_TXEN, RMII0_TXEN_MARK),
-       PINMUX_GPIO(GPIO_FN_RMII0_REFCLK, RMII0_REFCLK_MARK),
-       PINMUX_GPIO(GPIO_FN_RMII0_RXD1, RMII0_RXD1_MARK),
-       PINMUX_GPIO(GPIO_FN_RMII0_RXD0, RMII0_RXD0_MARK),
-       PINMUX_GPIO(GPIO_FN_RMII0_RX_ER, RMII0_RX_ER_MARK),
+       GPIO_FN(RMII0_CRS_DV),
+       GPIO_FN(RMII0_TXD1),
+       GPIO_FN(RMII0_TXD0),
+       GPIO_FN(RMII0_TXEN),
+       GPIO_FN(RMII0_REFCLK),
+       GPIO_FN(RMII0_RXD1),
+       GPIO_FN(RMII0_RXD0),
+       GPIO_FN(RMII0_RX_ER),
 
        /* PTF (mobule: RMII, SerMux) */
-       PINMUX_GPIO(GPIO_FN_RMII1_CRS_DV, RMII1_CRS_DV_MARK),
-       PINMUX_GPIO(GPIO_FN_RMII1_TXD1, RMII1_TXD1_MARK),
-       PINMUX_GPIO(GPIO_FN_RMII1_TXD0, RMII1_TXD0_MARK),
-       PINMUX_GPIO(GPIO_FN_RMII1_TXEN, RMII1_TXEN_MARK),
-       PINMUX_GPIO(GPIO_FN_RMII1_REFCLK, RMII1_REFCLK_MARK),
-       PINMUX_GPIO(GPIO_FN_RMII1_RXD1, RMII1_RXD1_MARK),
-       PINMUX_GPIO(GPIO_FN_RMII1_RXD0, RMII1_RXD0_MARK),
-       PINMUX_GPIO(GPIO_FN_RMII1_RX_ER, RMII1_RX_ER_MARK),
-       PINMUX_GPIO(GPIO_FN_RAC_RI, RAC_RI_MARK),
+       GPIO_FN(RMII1_CRS_DV),
+       GPIO_FN(RMII1_TXD1),
+       GPIO_FN(RMII1_TXD0),
+       GPIO_FN(RMII1_TXEN),
+       GPIO_FN(RMII1_REFCLK),
+       GPIO_FN(RMII1_RXD1),
+       GPIO_FN(RMII1_RXD0),
+       GPIO_FN(RMII1_RX_ER),
+       GPIO_FN(RAC_RI),
 
        /* PTG (mobule: system, LBSC, LPC, WDT, LPC, eMMC) */
-       PINMUX_GPIO(GPIO_FN_BOOTFMS, BOOTFMS_MARK),
-       PINMUX_GPIO(GPIO_FN_BOOTWP, BOOTWP_MARK),
-       PINMUX_GPIO(GPIO_FN_A25, A25_MARK),
-       PINMUX_GPIO(GPIO_FN_A24, A24_MARK),
-       PINMUX_GPIO(GPIO_FN_SERIRQ, SERIRQ_MARK),
-       PINMUX_GPIO(GPIO_FN_WDTOVF, WDTOVF_MARK),
-       PINMUX_GPIO(GPIO_FN_LPCPD, LPCPD_MARK),
-       PINMUX_GPIO(GPIO_FN_LDRQ, LDRQ_MARK),
-       PINMUX_GPIO(GPIO_FN_MMCCLK, MMCCLK_MARK),
-       PINMUX_GPIO(GPIO_FN_MMCCMD, MMCCMD_MARK),
+       GPIO_FN(BOOTFMS),
+       GPIO_FN(BOOTWP),
+       GPIO_FN(A25),
+       GPIO_FN(A24),
+       GPIO_FN(SERIRQ),
+       GPIO_FN(WDTOVF),
+       GPIO_FN(LPCPD),
+       GPIO_FN(LDRQ),
+       GPIO_FN(MMCCLK),
+       GPIO_FN(MMCCMD),
 
        /* PTH (mobule: SPI1, LPC, DMAC, ADC) */
-       PINMUX_GPIO(GPIO_FN_SP1_MOSI, SP1_MOSI_MARK),
-       PINMUX_GPIO(GPIO_FN_SP1_MISO, SP1_MISO_MARK),
-       PINMUX_GPIO(GPIO_FN_SP1_SCK, SP1_SCK_MARK),
-       PINMUX_GPIO(GPIO_FN_SP1_SCK_FB, SP1_SCK_FB_MARK),
-       PINMUX_GPIO(GPIO_FN_SP1_SS0, SP1_SS0_MARK),
-       PINMUX_GPIO(GPIO_FN_SP1_SS1, SP1_SS1_MARK),
-       PINMUX_GPIO(GPIO_FN_WP, WP_MARK),
-       PINMUX_GPIO(GPIO_FN_FMS0, FMS0_MARK),
-       PINMUX_GPIO(GPIO_FN_TEND1, TEND1_MARK),
-       PINMUX_GPIO(GPIO_FN_DREQ1, DREQ1_MARK),
-       PINMUX_GPIO(GPIO_FN_DACK1, DACK1_MARK),
-       PINMUX_GPIO(GPIO_FN_ADTRG1, ADTRG1_MARK),
-       PINMUX_GPIO(GPIO_FN_ADTRG0, ADTRG0_MARK),
+       GPIO_FN(SP1_MOSI),
+       GPIO_FN(SP1_MISO),
+       GPIO_FN(SP1_SCK),
+       GPIO_FN(SP1_SCK_FB),
+       GPIO_FN(SP1_SS0),
+       GPIO_FN(SP1_SS1),
+       GPIO_FN(WP),
+       GPIO_FN(FMS0),
+       GPIO_FN(TEND1),
+       GPIO_FN(DREQ1),
+       GPIO_FN(DACK1),
+       GPIO_FN(ADTRG1),
+       GPIO_FN(ADTRG0),
 
        /* PTI (mobule: LBSC, SDHI) */
-       PINMUX_GPIO(GPIO_FN_D15, D15_MARK),
-       PINMUX_GPIO(GPIO_FN_D14, D14_MARK),
-       PINMUX_GPIO(GPIO_FN_D13, D13_MARK),
-       PINMUX_GPIO(GPIO_FN_D12, D12_MARK),
-       PINMUX_GPIO(GPIO_FN_D11, D11_MARK),
-       PINMUX_GPIO(GPIO_FN_D10, D10_MARK),
-       PINMUX_GPIO(GPIO_FN_D9, D9_MARK),
-       PINMUX_GPIO(GPIO_FN_D8, D8_MARK),
-       PINMUX_GPIO(GPIO_FN_SD_WP, SD_WP_MARK),
-       PINMUX_GPIO(GPIO_FN_SD_CD, SD_CD_MARK),
-       PINMUX_GPIO(GPIO_FN_SD_CLK, SD_CLK_MARK),
-       PINMUX_GPIO(GPIO_FN_SD_CMD, SD_CMD_MARK),
-       PINMUX_GPIO(GPIO_FN_SD_D3, SD_D3_MARK),
-       PINMUX_GPIO(GPIO_FN_SD_D2, SD_D2_MARK),
-       PINMUX_GPIO(GPIO_FN_SD_D1, SD_D1_MARK),
-       PINMUX_GPIO(GPIO_FN_SD_D0, SD_D0_MARK),
+       GPIO_FN(D15),
+       GPIO_FN(D14),
+       GPIO_FN(D13),
+       GPIO_FN(D12),
+       GPIO_FN(D11),
+       GPIO_FN(D10),
+       GPIO_FN(D9),
+       GPIO_FN(D8),
+       GPIO_FN(SD_WP),
+       GPIO_FN(SD_CD),
+       GPIO_FN(SD_CLK),
+       GPIO_FN(SD_CMD),
+       GPIO_FN(SD_D3),
+       GPIO_FN(SD_D2),
+       GPIO_FN(SD_D1),
+       GPIO_FN(SD_D0),
 
        /* PTJ (mobule: SCIF234, SERMUX) */
-       PINMUX_GPIO(GPIO_FN_RTS3, RTS3_MARK),
-       PINMUX_GPIO(GPIO_FN_CTS3, CTS3_MARK),
-       PINMUX_GPIO(GPIO_FN_TXD3, TXD3_MARK),
-       PINMUX_GPIO(GPIO_FN_RXD3, RXD3_MARK),
-       PINMUX_GPIO(GPIO_FN_RTS4, RTS4_MARK),
-       PINMUX_GPIO(GPIO_FN_RXD4, RXD4_MARK),
-       PINMUX_GPIO(GPIO_FN_TXD4, TXD4_MARK),
+       GPIO_FN(RTS3),
+       GPIO_FN(CTS3),
+       GPIO_FN(TXD3),
+       GPIO_FN(RXD3),
+       GPIO_FN(RTS4),
+       GPIO_FN(RXD4),
+       GPIO_FN(TXD4),
 
        /* PTK (mobule: SERMUX, LBSC, SCIF) */
-       PINMUX_GPIO(GPIO_FN_COM2_TXD, COM2_TXD_MARK),
-       PINMUX_GPIO(GPIO_FN_COM2_RXD, COM2_RXD_MARK),
-       PINMUX_GPIO(GPIO_FN_COM2_RTS, COM2_RTS_MARK),
-       PINMUX_GPIO(GPIO_FN_COM2_CTS, COM2_CTS_MARK),
-       PINMUX_GPIO(GPIO_FN_COM2_DTR, COM2_DTR_MARK),
-       PINMUX_GPIO(GPIO_FN_COM2_DSR, COM2_DSR_MARK),
-       PINMUX_GPIO(GPIO_FN_COM2_DCD, COM2_DCD_MARK),
-       PINMUX_GPIO(GPIO_FN_CLKOUT, CLKOUT_MARK),
-       PINMUX_GPIO(GPIO_FN_SCK2, SCK2_MARK),
-       PINMUX_GPIO(GPIO_FN_SCK4, SCK4_MARK),
-       PINMUX_GPIO(GPIO_FN_SCK3, SCK3_MARK),
+       GPIO_FN(COM2_TXD),
+       GPIO_FN(COM2_RXD),
+       GPIO_FN(COM2_RTS),
+       GPIO_FN(COM2_CTS),
+       GPIO_FN(COM2_DTR),
+       GPIO_FN(COM2_DSR),
+       GPIO_FN(COM2_DCD),
+       GPIO_FN(CLKOUT),
+       GPIO_FN(SCK2),
+       GPIO_FN(SCK4),
+       GPIO_FN(SCK3),
 
        /* PTL (mobule: SERMUX, SCIF, LBSC, AUD) */
-       PINMUX_GPIO(GPIO_FN_RAC_RXD, RAC_RXD_MARK),
-       PINMUX_GPIO(GPIO_FN_RAC_RTS, RAC_RTS_MARK),
-       PINMUX_GPIO(GPIO_FN_RAC_CTS, RAC_CTS_MARK),
-       PINMUX_GPIO(GPIO_FN_RAC_DTR, RAC_DTR_MARK),
-       PINMUX_GPIO(GPIO_FN_RAC_DSR, RAC_DSR_MARK),
-       PINMUX_GPIO(GPIO_FN_RAC_DCD, RAC_DCD_MARK),
-       PINMUX_GPIO(GPIO_FN_RAC_TXD, RAC_TXD_MARK),
-       PINMUX_GPIO(GPIO_FN_RXD2, RXD2_MARK),
-       PINMUX_GPIO(GPIO_FN_CS5, CS5_MARK),
-       PINMUX_GPIO(GPIO_FN_CS6, CS6_MARK),
-       PINMUX_GPIO(GPIO_FN_AUDSYNC, AUDSYNC_MARK),
-       PINMUX_GPIO(GPIO_FN_AUDCK, AUDCK_MARK),
-       PINMUX_GPIO(GPIO_FN_TXD2, TXD2_MARK),
+       GPIO_FN(RAC_RXD),
+       GPIO_FN(RAC_RTS),
+       GPIO_FN(RAC_CTS),
+       GPIO_FN(RAC_DTR),
+       GPIO_FN(RAC_DSR),
+       GPIO_FN(RAC_DCD),
+       GPIO_FN(RAC_TXD),
+       GPIO_FN(RXD2),
+       GPIO_FN(CS5),
+       GPIO_FN(CS6),
+       GPIO_FN(AUDSYNC),
+       GPIO_FN(AUDCK),
+       GPIO_FN(TXD2),
 
        /* PTM (mobule: LBSC, IIC) */
-       PINMUX_GPIO(GPIO_FN_CS4, CS4_MARK),
-       PINMUX_GPIO(GPIO_FN_RD, RD_MARK),
-       PINMUX_GPIO(GPIO_FN_WE0, WE0_MARK),
-       PINMUX_GPIO(GPIO_FN_CS0, CS0_MARK),
-       PINMUX_GPIO(GPIO_FN_SDA6, SDA6_MARK),
-       PINMUX_GPIO(GPIO_FN_SCL6, SCL6_MARK),
-       PINMUX_GPIO(GPIO_FN_SDA7, SDA7_MARK),
-       PINMUX_GPIO(GPIO_FN_SCL7, SCL7_MARK),
+       GPIO_FN(CS4),
+       GPIO_FN(RD),
+       GPIO_FN(WE0),
+       GPIO_FN(CS0),
+       GPIO_FN(SDA6),
+       GPIO_FN(SCL6),
+       GPIO_FN(SDA7),
+       GPIO_FN(SCL7),
 
        /* PTN (mobule: USB, JMC, SGPIO, WDT) */
-       PINMUX_GPIO(GPIO_FN_VBUS_EN, VBUS_EN_MARK),
-       PINMUX_GPIO(GPIO_FN_VBUS_OC, VBUS_OC_MARK),
-       PINMUX_GPIO(GPIO_FN_JMCTCK, JMCTCK_MARK),
-       PINMUX_GPIO(GPIO_FN_JMCTMS, JMCTMS_MARK),
-       PINMUX_GPIO(GPIO_FN_JMCTDO, JMCTDO_MARK),
-       PINMUX_GPIO(GPIO_FN_JMCTDI, JMCTDI_MARK),
-       PINMUX_GPIO(GPIO_FN_JMCTRST, JMCTRST_MARK),
-       PINMUX_GPIO(GPIO_FN_SGPIO1_CLK, SGPIO1_CLK_MARK),
-       PINMUX_GPIO(GPIO_FN_SGPIO1_LOAD, SGPIO1_LOAD_MARK),
-       PINMUX_GPIO(GPIO_FN_SGPIO1_DI, SGPIO1_DI_MARK),
-       PINMUX_GPIO(GPIO_FN_SGPIO1_DO, SGPIO1_DO_MARK),
-       PINMUX_GPIO(GPIO_FN_SUB_CLKIN, SUB_CLKIN_MARK),
+       GPIO_FN(VBUS_EN),
+       GPIO_FN(VBUS_OC),
+       GPIO_FN(JMCTCK),
+       GPIO_FN(JMCTMS),
+       GPIO_FN(JMCTDO),
+       GPIO_FN(JMCTDI),
+       GPIO_FN(JMCTRST),
+       GPIO_FN(SGPIO1_CLK),
+       GPIO_FN(SGPIO1_LOAD),
+       GPIO_FN(SGPIO1_DI),
+       GPIO_FN(SGPIO1_DO),
+       GPIO_FN(SUB_CLKIN),
 
        /* PTO (mobule: SGPIO, SerMux) */
-       PINMUX_GPIO(GPIO_FN_SGPIO0_CLK, SGPIO0_CLK_MARK),
-       PINMUX_GPIO(GPIO_FN_SGPIO0_LOAD, SGPIO0_LOAD_MARK),
-       PINMUX_GPIO(GPIO_FN_SGPIO0_DI, SGPIO0_DI_MARK),
-       PINMUX_GPIO(GPIO_FN_SGPIO0_DO, SGPIO0_DO_MARK),
-       PINMUX_GPIO(GPIO_FN_SGPIO2_CLK, SGPIO2_CLK_MARK),
-       PINMUX_GPIO(GPIO_FN_SGPIO2_LOAD, SGPIO2_LOAD_MARK),
-       PINMUX_GPIO(GPIO_FN_SGPIO2_DI, SGPIO2_DI_MARK),
-       PINMUX_GPIO(GPIO_FN_SGPIO2_DO, SGPIO2_DO_MARK),
-       PINMUX_GPIO(GPIO_FN_COM1_TXD, COM1_TXD_MARK),
-       PINMUX_GPIO(GPIO_FN_COM1_RXD, COM1_RXD_MARK),
-       PINMUX_GPIO(GPIO_FN_COM1_RTS, COM1_RTS_MARK),
-       PINMUX_GPIO(GPIO_FN_COM1_CTS, COM1_CTS_MARK),
+       GPIO_FN(SGPIO0_CLK),
+       GPIO_FN(SGPIO0_LOAD),
+       GPIO_FN(SGPIO0_DI),
+       GPIO_FN(SGPIO0_DO),
+       GPIO_FN(SGPIO2_CLK),
+       GPIO_FN(SGPIO2_LOAD),
+       GPIO_FN(SGPIO2_DI),
+       GPIO_FN(SGPIO2_DO),
+       GPIO_FN(COM1_TXD),
+       GPIO_FN(COM1_RXD),
+       GPIO_FN(COM1_RTS),
+       GPIO_FN(COM1_CTS),
 
        /* PTP (mobule: EVC, ADC) */
 
        /* PTQ (mobule: LPC) */
-       PINMUX_GPIO(GPIO_FN_LAD3, LAD3_MARK),
-       PINMUX_GPIO(GPIO_FN_LAD2, LAD2_MARK),
-       PINMUX_GPIO(GPIO_FN_LAD1, LAD1_MARK),
-       PINMUX_GPIO(GPIO_FN_LAD0, LAD0_MARK),
-       PINMUX_GPIO(GPIO_FN_LFRAME, LFRAME_MARK),
-       PINMUX_GPIO(GPIO_FN_LRESET, LRESET_MARK),
-       PINMUX_GPIO(GPIO_FN_LCLK, LCLK_MARK),
+       GPIO_FN(LAD3),
+       GPIO_FN(LAD2),
+       GPIO_FN(LAD1),
+       GPIO_FN(LAD0),
+       GPIO_FN(LFRAME),
+       GPIO_FN(LRESET),
+       GPIO_FN(LCLK),
 
        /* PTR (mobule: GRA, IIC) */
-       PINMUX_GPIO(GPIO_FN_DDC3, DDC3_MARK),
-       PINMUX_GPIO(GPIO_FN_DDC2, DDC2_MARK),
-       PINMUX_GPIO(GPIO_FN_SDA8, SDA8_MARK),
-       PINMUX_GPIO(GPIO_FN_SCL8, SCL8_MARK),
-       PINMUX_GPIO(GPIO_FN_SDA2, SDA2_MARK),
-       PINMUX_GPIO(GPIO_FN_SCL2, SCL2_MARK),
-       PINMUX_GPIO(GPIO_FN_SDA1, SDA1_MARK),
-       PINMUX_GPIO(GPIO_FN_SCL1, SCL1_MARK),
-       PINMUX_GPIO(GPIO_FN_SDA0, SDA0_MARK),
-       PINMUX_GPIO(GPIO_FN_SCL0, SCL0_MARK),
+       GPIO_FN(DDC3),
+       GPIO_FN(DDC2),
+       GPIO_FN(SDA8),
+       GPIO_FN(SCL8),
+       GPIO_FN(SDA2),
+       GPIO_FN(SCL2),
+       GPIO_FN(SDA1),
+       GPIO_FN(SCL1),
+       GPIO_FN(SDA0),
+       GPIO_FN(SCL0),
 
        /* PTS (mobule: GRA, IIC) */
-       PINMUX_GPIO(GPIO_FN_DDC1, DDC1_MARK),
-       PINMUX_GPIO(GPIO_FN_DDC0, DDC0_MARK),
-       PINMUX_GPIO(GPIO_FN_SDA9, SDA9_MARK),
-       PINMUX_GPIO(GPIO_FN_SCL9, SCL9_MARK),
-       PINMUX_GPIO(GPIO_FN_SDA5, SDA5_MARK),
-       PINMUX_GPIO(GPIO_FN_SCL5, SCL5_MARK),
-       PINMUX_GPIO(GPIO_FN_SDA4, SDA4_MARK),
-       PINMUX_GPIO(GPIO_FN_SCL4, SCL4_MARK),
-       PINMUX_GPIO(GPIO_FN_SDA3, SDA3_MARK),
-       PINMUX_GPIO(GPIO_FN_SCL3, SCL3_MARK),
+       GPIO_FN(DDC1),
+       GPIO_FN(DDC0),
+       GPIO_FN(SDA9),
+       GPIO_FN(SCL9),
+       GPIO_FN(SDA5),
+       GPIO_FN(SCL5),
+       GPIO_FN(SDA4),
+       GPIO_FN(SCL4),
+       GPIO_FN(SDA3),
+       GPIO_FN(SCL3),
 
        /* PTT (mobule: PWMX, AUD) */
-       PINMUX_GPIO(GPIO_FN_PWMX7, PWMX7_MARK),
-       PINMUX_GPIO(GPIO_FN_PWMX6, PWMX6_MARK),
-       PINMUX_GPIO(GPIO_FN_PWMX5, PWMX5_MARK),
-       PINMUX_GPIO(GPIO_FN_PWMX4, PWMX4_MARK),
-       PINMUX_GPIO(GPIO_FN_PWMX3, PWMX3_MARK),
-       PINMUX_GPIO(GPIO_FN_PWMX2, PWMX2_MARK),
-       PINMUX_GPIO(GPIO_FN_PWMX1, PWMX1_MARK),
-       PINMUX_GPIO(GPIO_FN_PWMX0, PWMX0_MARK),
-       PINMUX_GPIO(GPIO_FN_AUDATA3, AUDATA3_MARK),
-       PINMUX_GPIO(GPIO_FN_AUDATA2, AUDATA2_MARK),
-       PINMUX_GPIO(GPIO_FN_AUDATA1, AUDATA1_MARK),
-       PINMUX_GPIO(GPIO_FN_AUDATA0, AUDATA0_MARK),
-       PINMUX_GPIO(GPIO_FN_STATUS1, STATUS1_MARK),
-       PINMUX_GPIO(GPIO_FN_STATUS0, STATUS0_MARK),
+       GPIO_FN(PWMX7),
+       GPIO_FN(PWMX6),
+       GPIO_FN(PWMX5),
+       GPIO_FN(PWMX4),
+       GPIO_FN(PWMX3),
+       GPIO_FN(PWMX2),
+       GPIO_FN(PWMX1),
+       GPIO_FN(PWMX0),
+       GPIO_FN(AUDATA3),
+       GPIO_FN(AUDATA2),
+       GPIO_FN(AUDATA1),
+       GPIO_FN(AUDATA0),
+       GPIO_FN(STATUS1),
+       GPIO_FN(STATUS0),
 
        /* PTU (mobule: LPC, APM) */
-       PINMUX_GPIO(GPIO_FN_LGPIO7, LGPIO7_MARK),
-       PINMUX_GPIO(GPIO_FN_LGPIO6, LGPIO6_MARK),
-       PINMUX_GPIO(GPIO_FN_LGPIO5, LGPIO5_MARK),
-       PINMUX_GPIO(GPIO_FN_LGPIO4, LGPIO4_MARK),
-       PINMUX_GPIO(GPIO_FN_LGPIO3, LGPIO3_MARK),
-       PINMUX_GPIO(GPIO_FN_LGPIO2, LGPIO2_MARK),
-       PINMUX_GPIO(GPIO_FN_LGPIO1, LGPIO1_MARK),
-       PINMUX_GPIO(GPIO_FN_LGPIO0, LGPIO0_MARK),
-       PINMUX_GPIO(GPIO_FN_APMONCTL_O, APMONCTL_O_MARK),
-       PINMUX_GPIO(GPIO_FN_APMPWBTOUT_O, APMPWBTOUT_O_MARK),
-       PINMUX_GPIO(GPIO_FN_APMSCI_O, APMSCI_O_MARK),
-       PINMUX_GPIO(GPIO_FN_APMVDDON, APMVDDON_MARK),
-       PINMUX_GPIO(GPIO_FN_APMSLPBTN, APMSLPBTN_MARK),
-       PINMUX_GPIO(GPIO_FN_APMPWRBTN, APMPWRBTN_MARK),
-       PINMUX_GPIO(GPIO_FN_APMS5N, APMS5N_MARK),
-       PINMUX_GPIO(GPIO_FN_APMS3N, APMS3N_MARK),
+       GPIO_FN(LGPIO7),
+       GPIO_FN(LGPIO6),
+       GPIO_FN(LGPIO5),
+       GPIO_FN(LGPIO4),
+       GPIO_FN(LGPIO3),
+       GPIO_FN(LGPIO2),
+       GPIO_FN(LGPIO1),
+       GPIO_FN(LGPIO0),
+       GPIO_FN(APMONCTL_O),
+       GPIO_FN(APMPWBTOUT_O),
+       GPIO_FN(APMSCI_O),
+       GPIO_FN(APMVDDON),
+       GPIO_FN(APMSLPBTN),
+       GPIO_FN(APMPWRBTN),
+       GPIO_FN(APMS5N),
+       GPIO_FN(APMS3N),
 
        /* PTV (mobule: LBSC, SerMux, R-SPI, EVC, GRA) */
-       PINMUX_GPIO(GPIO_FN_A23, A23_MARK),
-       PINMUX_GPIO(GPIO_FN_A22, A22_MARK),
-       PINMUX_GPIO(GPIO_FN_A21, A21_MARK),
-       PINMUX_GPIO(GPIO_FN_A20, A20_MARK),
-       PINMUX_GPIO(GPIO_FN_A19, A19_MARK),
-       PINMUX_GPIO(GPIO_FN_A18, A18_MARK),
-       PINMUX_GPIO(GPIO_FN_A17, A17_MARK),
-       PINMUX_GPIO(GPIO_FN_A16, A16_MARK),
-       PINMUX_GPIO(GPIO_FN_COM2_RI, COM2_RI_MARK),
-       PINMUX_GPIO(GPIO_FN_R_SPI_MOSI, R_SPI_MOSI_MARK),
-       PINMUX_GPIO(GPIO_FN_R_SPI_MISO, R_SPI_MISO_MARK),
-       PINMUX_GPIO(GPIO_FN_R_SPI_RSPCK, R_SPI_RSPCK_MARK),
-       PINMUX_GPIO(GPIO_FN_R_SPI_SSL0, R_SPI_SSL0_MARK),
-       PINMUX_GPIO(GPIO_FN_R_SPI_SSL1, R_SPI_SSL1_MARK),
-       PINMUX_GPIO(GPIO_FN_EVENT7, EVENT7_MARK),
-       PINMUX_GPIO(GPIO_FN_EVENT6, EVENT6_MARK),
-       PINMUX_GPIO(GPIO_FN_VBIOS_DI, VBIOS_DI_MARK),
-       PINMUX_GPIO(GPIO_FN_VBIOS_DO, VBIOS_DO_MARK),
-       PINMUX_GPIO(GPIO_FN_VBIOS_CLK, VBIOS_CLK_MARK),
-       PINMUX_GPIO(GPIO_FN_VBIOS_CS, VBIOS_CS_MARK),
+       GPIO_FN(A23),
+       GPIO_FN(A22),
+       GPIO_FN(A21),
+       GPIO_FN(A20),
+       GPIO_FN(A19),
+       GPIO_FN(A18),
+       GPIO_FN(A17),
+       GPIO_FN(A16),
+       GPIO_FN(COM2_RI),
+       GPIO_FN(R_SPI_MOSI),
+       GPIO_FN(R_SPI_MISO),
+       GPIO_FN(R_SPI_RSPCK),
+       GPIO_FN(R_SPI_SSL0),
+       GPIO_FN(R_SPI_SSL1),
+       GPIO_FN(EVENT7),
+       GPIO_FN(EVENT6),
+       GPIO_FN(VBIOS_DI),
+       GPIO_FN(VBIOS_DO),
+       GPIO_FN(VBIOS_CLK),
+       GPIO_FN(VBIOS_CS),
 
        /* PTW (mobule: LBSC, EVC, SCIF) */
-       PINMUX_GPIO(GPIO_FN_A16, A16_MARK),
-       PINMUX_GPIO(GPIO_FN_A15, A15_MARK),
-       PINMUX_GPIO(GPIO_FN_A14, A14_MARK),
-       PINMUX_GPIO(GPIO_FN_A13, A13_MARK),
-       PINMUX_GPIO(GPIO_FN_A12, A12_MARK),
-       PINMUX_GPIO(GPIO_FN_A11, A11_MARK),
-       PINMUX_GPIO(GPIO_FN_A10, A10_MARK),
-       PINMUX_GPIO(GPIO_FN_A9, A9_MARK),
-       PINMUX_GPIO(GPIO_FN_A8, A8_MARK),
-       PINMUX_GPIO(GPIO_FN_EVENT5, EVENT5_MARK),
-       PINMUX_GPIO(GPIO_FN_EVENT4, EVENT4_MARK),
-       PINMUX_GPIO(GPIO_FN_EVENT3, EVENT3_MARK),
-       PINMUX_GPIO(GPIO_FN_EVENT2, EVENT2_MARK),
-       PINMUX_GPIO(GPIO_FN_EVENT1, EVENT1_MARK),
-       PINMUX_GPIO(GPIO_FN_EVENT0, EVENT0_MARK),
-       PINMUX_GPIO(GPIO_FN_CTS4, CTS4_MARK),
-       PINMUX_GPIO(GPIO_FN_CTS2, CTS2_MARK),
+       GPIO_FN(A16),
+       GPIO_FN(A15),
+       GPIO_FN(A14),
+       GPIO_FN(A13),
+       GPIO_FN(A12),
+       GPIO_FN(A11),
+       GPIO_FN(A10),
+       GPIO_FN(A9),
+       GPIO_FN(A8),
+       GPIO_FN(EVENT5),
+       GPIO_FN(EVENT4),
+       GPIO_FN(EVENT3),
+       GPIO_FN(EVENT2),
+       GPIO_FN(EVENT1),
+       GPIO_FN(EVENT0),
+       GPIO_FN(CTS4),
+       GPIO_FN(CTS2),
 
        /* PTX (mobule: LBSC) */
-       PINMUX_GPIO(GPIO_FN_A7, A7_MARK),
-       PINMUX_GPIO(GPIO_FN_A6, A6_MARK),
-       PINMUX_GPIO(GPIO_FN_A5, A5_MARK),
-       PINMUX_GPIO(GPIO_FN_A4, A4_MARK),
-       PINMUX_GPIO(GPIO_FN_A3, A3_MARK),
-       PINMUX_GPIO(GPIO_FN_A2, A2_MARK),
-       PINMUX_GPIO(GPIO_FN_A1, A1_MARK),
-       PINMUX_GPIO(GPIO_FN_A0, A0_MARK),
-       PINMUX_GPIO(GPIO_FN_RTS2, RTS2_MARK),
-       PINMUX_GPIO(GPIO_FN_SIM_D, SIM_D_MARK),
-       PINMUX_GPIO(GPIO_FN_SIM_CLK, SIM_CLK_MARK),
-       PINMUX_GPIO(GPIO_FN_SIM_RST, SIM_RST_MARK),
+       GPIO_FN(A7),
+       GPIO_FN(A6),
+       GPIO_FN(A5),
+       GPIO_FN(A4),
+       GPIO_FN(A3),
+       GPIO_FN(A2),
+       GPIO_FN(A1),
+       GPIO_FN(A0),
+       GPIO_FN(RTS2),
+       GPIO_FN(SIM_D),
+       GPIO_FN(SIM_CLK),
+       GPIO_FN(SIM_RST),
 
        /* PTY (mobule: LBSC) */
-       PINMUX_GPIO(GPIO_FN_D7, D7_MARK),
-       PINMUX_GPIO(GPIO_FN_D6, D6_MARK),
-       PINMUX_GPIO(GPIO_FN_D5, D5_MARK),
-       PINMUX_GPIO(GPIO_FN_D4, D4_MARK),
-       PINMUX_GPIO(GPIO_FN_D3, D3_MARK),
-       PINMUX_GPIO(GPIO_FN_D2, D2_MARK),
-       PINMUX_GPIO(GPIO_FN_D1, D1_MARK),
-       PINMUX_GPIO(GPIO_FN_D0, D0_MARK),
+       GPIO_FN(D7),
+       GPIO_FN(D6),
+       GPIO_FN(D5),
+       GPIO_FN(D4),
+       GPIO_FN(D3),
+       GPIO_FN(D2),
+       GPIO_FN(D1),
+       GPIO_FN(D0),
 
        /* PTZ (mobule: eMMC, ONFI) */
-       PINMUX_GPIO(GPIO_FN_MMCDAT7, MMCDAT7_MARK),
-       PINMUX_GPIO(GPIO_FN_MMCDAT6, MMCDAT6_MARK),
-       PINMUX_GPIO(GPIO_FN_MMCDAT5, MMCDAT5_MARK),
-       PINMUX_GPIO(GPIO_FN_MMCDAT4, MMCDAT4_MARK),
-       PINMUX_GPIO(GPIO_FN_MMCDAT3, MMCDAT3_MARK),
-       PINMUX_GPIO(GPIO_FN_MMCDAT2, MMCDAT2_MARK),
-       PINMUX_GPIO(GPIO_FN_MMCDAT1, MMCDAT1_MARK),
-       PINMUX_GPIO(GPIO_FN_MMCDAT0, MMCDAT0_MARK),
-       PINMUX_GPIO(GPIO_FN_ON_DQ7, ON_DQ7_MARK),
-       PINMUX_GPIO(GPIO_FN_ON_DQ6, ON_DQ6_MARK),
-       PINMUX_GPIO(GPIO_FN_ON_DQ5, ON_DQ5_MARK),
-       PINMUX_GPIO(GPIO_FN_ON_DQ4, ON_DQ4_MARK),
-       PINMUX_GPIO(GPIO_FN_ON_DQ3, ON_DQ3_MARK),
-       PINMUX_GPIO(GPIO_FN_ON_DQ2, ON_DQ2_MARK),
-       PINMUX_GPIO(GPIO_FN_ON_DQ1, ON_DQ1_MARK),
-       PINMUX_GPIO(GPIO_FN_ON_DQ0, ON_DQ0_MARK),
+       GPIO_FN(MMCDAT7),
+       GPIO_FN(MMCDAT6),
+       GPIO_FN(MMCDAT5),
+       GPIO_FN(MMCDAT4),
+       GPIO_FN(MMCDAT3),
+       GPIO_FN(MMCDAT2),
+       GPIO_FN(MMCDAT1),
+       GPIO_FN(MMCDAT0),
+       GPIO_FN(ON_DQ7),
+       GPIO_FN(ON_DQ6),
+       GPIO_FN(ON_DQ5),
+       GPIO_FN(ON_DQ4),
+       GPIO_FN(ON_DQ3),
+       GPIO_FN(ON_DQ2),
+       GPIO_FN(ON_DQ1),
+       GPIO_FN(ON_DQ0),
 };
 
-static struct pinmux_cfg_reg pinmux_config_regs[] = {
+static const struct pinmux_cfg_reg pinmux_config_regs[] = {
        { PINMUX_CFG_REG("PACR", 0xffec0000, 16, 2) {
                PTA7_FN, PTA7_OUT, PTA7_IN, PTA7_IN_PU,
                PTA6_FN, PTA6_OUT, PTA6_IN, PTA6_IN_PU,
@@ -2152,7 +2156,7 @@ static struct pinmux_cfg_reg pinmux_config_regs[] = {
        {}
 };
 
-static struct pinmux_data_reg pinmux_data_regs[] = {
+static const struct pinmux_data_reg pinmux_data_regs[] = {
        { PINMUX_DATA_REG("PADR", 0xffec0034, 8) {
                PTA7_DATA, PTA6_DATA, PTA5_DATA, PTA4_DATA,
                PTA3_DATA, PTA2_DATA, PTA1_DATA, PTA0_DATA }
@@ -2260,20 +2264,18 @@ static struct pinmux_data_reg pinmux_data_regs[] = {
        { },
 };
 
-struct sh_pfc_soc_info sh7757_pinmux_info = {
+const struct sh_pfc_soc_info sh7757_pinmux_info = {
        .name = "sh7757_pfc",
-       .reserved_id = PINMUX_RESERVED,
-       .data = { PINMUX_DATA_BEGIN, PINMUX_DATA_END },
        .input = { PINMUX_INPUT_BEGIN, PINMUX_INPUT_END },
        .input_pu = { PINMUX_INPUT_PULLUP_BEGIN, PINMUX_INPUT_PULLUP_END },
        .output = { PINMUX_OUTPUT_BEGIN, PINMUX_OUTPUT_END },
-       .mark = { PINMUX_MARK_BEGIN, PINMUX_MARK_END },
        .function = { PINMUX_FUNCTION_BEGIN, PINMUX_FUNCTION_END },
 
-       .first_gpio = GPIO_PTA0,
-       .last_gpio = GPIO_FN_ON_DQ0,
+       .pins = pinmux_pins,
+       .nr_pins = ARRAY_SIZE(pinmux_pins),
+       .func_gpios = pinmux_func_gpios,
+       .nr_func_gpios = ARRAY_SIZE(pinmux_func_gpios),
 
-       .gpios = pinmux_gpios,
        .cfg_regs = pinmux_config_regs,
        .data_regs = pinmux_data_regs,
 
index 3b1825d925bb7a7b961f78a2886fdee08502ee44..c176b794f24063cd0a6af87c522fa29c2ee3656c 100644 (file)
@@ -355,7 +355,7 @@ enum {
        PINMUX_MARK_END,
 };
 
-static pinmux_enum_t pinmux_data[] = {
+static const pinmux_enum_t pinmux_data[] = {
 
        /* PA GPIO */
        PINMUX_DATA(PA7_DATA, PA7_IN, PA7_OUT, PA7_IN_PU),
@@ -702,7 +702,7 @@ static pinmux_enum_t pinmux_data[] = {
        PINMUX_DATA(IRQOUT_MARK, P2MSEL2_1),
 };
 
-static struct pinmux_gpio pinmux_gpios[] = {
+static struct sh_pfc_pin pinmux_pins[] = {
        /* PA */
        PINMUX_GPIO(GPIO_PA7, PA7_DATA),
        PINMUX_GPIO(GPIO_PA6, PA6_DATA),
@@ -845,176 +845,180 @@ static struct pinmux_gpio pinmux_gpios[] = {
        PINMUX_GPIO(GPIO_PR2, PR2_DATA),
        PINMUX_GPIO(GPIO_PR1, PR1_DATA),
        PINMUX_GPIO(GPIO_PR0, PR0_DATA),
+};
+
+#define PINMUX_FN_BASE ARRAY_SIZE(pinmux_pins)
 
+static const struct pinmux_func pinmux_func_gpios[] = {
        /* FN */
-       PINMUX_GPIO(GPIO_FN_D63_AD31, D63_AD31_MARK),
-       PINMUX_GPIO(GPIO_FN_D62_AD30, D62_AD30_MARK),
-       PINMUX_GPIO(GPIO_FN_D61_AD29, D61_AD29_MARK),
-       PINMUX_GPIO(GPIO_FN_D60_AD28, D60_AD28_MARK),
-       PINMUX_GPIO(GPIO_FN_D59_AD27, D59_AD27_MARK),
-       PINMUX_GPIO(GPIO_FN_D58_AD26, D58_AD26_MARK),
-       PINMUX_GPIO(GPIO_FN_D57_AD25, D57_AD25_MARK),
-       PINMUX_GPIO(GPIO_FN_D56_AD24, D56_AD24_MARK),
-       PINMUX_GPIO(GPIO_FN_D55_AD23, D55_AD23_MARK),
-       PINMUX_GPIO(GPIO_FN_D54_AD22, D54_AD22_MARK),
-       PINMUX_GPIO(GPIO_FN_D53_AD21, D53_AD21_MARK),
-       PINMUX_GPIO(GPIO_FN_D52_AD20, D52_AD20_MARK),
-       PINMUX_GPIO(GPIO_FN_D51_AD19, D51_AD19_MARK),
-       PINMUX_GPIO(GPIO_FN_D50_AD18, D50_AD18_MARK),
-       PINMUX_GPIO(GPIO_FN_D49_AD17_DB5, D49_AD17_DB5_MARK),
-       PINMUX_GPIO(GPIO_FN_D48_AD16_DB4, D48_AD16_DB4_MARK),
-       PINMUX_GPIO(GPIO_FN_D47_AD15_DB3, D47_AD15_DB3_MARK),
-       PINMUX_GPIO(GPIO_FN_D46_AD14_DB2, D46_AD14_DB2_MARK),
-       PINMUX_GPIO(GPIO_FN_D45_AD13_DB1, D45_AD13_DB1_MARK),
-       PINMUX_GPIO(GPIO_FN_D44_AD12_DB0, D44_AD12_DB0_MARK),
-       PINMUX_GPIO(GPIO_FN_D43_AD11_DG5, D43_AD11_DG5_MARK),
-       PINMUX_GPIO(GPIO_FN_D42_AD10_DG4, D42_AD10_DG4_MARK),
-       PINMUX_GPIO(GPIO_FN_D41_AD9_DG3, D41_AD9_DG3_MARK),
-       PINMUX_GPIO(GPIO_FN_D40_AD8_DG2, D40_AD8_DG2_MARK),
-       PINMUX_GPIO(GPIO_FN_D39_AD7_DG1, D39_AD7_DG1_MARK),
-       PINMUX_GPIO(GPIO_FN_D38_AD6_DG0, D38_AD6_DG0_MARK),
-       PINMUX_GPIO(GPIO_FN_D37_AD5_DR5, D37_AD5_DR5_MARK),
-       PINMUX_GPIO(GPIO_FN_D36_AD4_DR4, D36_AD4_DR4_MARK),
-       PINMUX_GPIO(GPIO_FN_D35_AD3_DR3, D35_AD3_DR3_MARK),
-       PINMUX_GPIO(GPIO_FN_D34_AD2_DR2, D34_AD2_DR2_MARK),
-       PINMUX_GPIO(GPIO_FN_D33_AD1_DR1, D33_AD1_DR1_MARK),
-       PINMUX_GPIO(GPIO_FN_D32_AD0_DR0, D32_AD0_DR0_MARK),
-       PINMUX_GPIO(GPIO_FN_REQ1, REQ1_MARK),
-       PINMUX_GPIO(GPIO_FN_REQ2, REQ2_MARK),
-       PINMUX_GPIO(GPIO_FN_REQ3, REQ3_MARK),
-       PINMUX_GPIO(GPIO_FN_GNT1, GNT1_MARK),
-       PINMUX_GPIO(GPIO_FN_GNT2, GNT2_MARK),
-       PINMUX_GPIO(GPIO_FN_GNT3, GNT3_MARK),
-       PINMUX_GPIO(GPIO_FN_MMCCLK, MMCCLK_MARK),
-       PINMUX_GPIO(GPIO_FN_D31, D31_MARK),
-       PINMUX_GPIO(GPIO_FN_D30, D30_MARK),
-       PINMUX_GPIO(GPIO_FN_D29, D29_MARK),
-       PINMUX_GPIO(GPIO_FN_D28, D28_MARK),
-       PINMUX_GPIO(GPIO_FN_D27, D27_MARK),
-       PINMUX_GPIO(GPIO_FN_D26, D26_MARK),
-       PINMUX_GPIO(GPIO_FN_D25, D25_MARK),
-       PINMUX_GPIO(GPIO_FN_D24, D24_MARK),
-       PINMUX_GPIO(GPIO_FN_D23, D23_MARK),
-       PINMUX_GPIO(GPIO_FN_D22, D22_MARK),
-       PINMUX_GPIO(GPIO_FN_D21, D21_MARK),
-       PINMUX_GPIO(GPIO_FN_D20, D20_MARK),
-       PINMUX_GPIO(GPIO_FN_D19, D19_MARK),
-       PINMUX_GPIO(GPIO_FN_D18, D18_MARK),
-       PINMUX_GPIO(GPIO_FN_D17, D17_MARK),
-       PINMUX_GPIO(GPIO_FN_D16, D16_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF1_SCK, SCIF1_SCK_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF1_RXD, SCIF1_RXD_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF1_TXD, SCIF1_TXD_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF0_CTS, SCIF0_CTS_MARK),
-       PINMUX_GPIO(GPIO_FN_INTD, INTD_MARK),
-       PINMUX_GPIO(GPIO_FN_FCE, FCE_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF0_RTS, SCIF0_RTS_MARK),
-       PINMUX_GPIO(GPIO_FN_HSPI_CS, HSPI_CS_MARK),
-       PINMUX_GPIO(GPIO_FN_FSE, FSE_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF0_SCK, SCIF0_SCK_MARK),
-       PINMUX_GPIO(GPIO_FN_HSPI_CLK, HSPI_CLK_MARK),
-       PINMUX_GPIO(GPIO_FN_FRE, FRE_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF0_RXD, SCIF0_RXD_MARK),
-       PINMUX_GPIO(GPIO_FN_HSPI_RX, HSPI_RX_MARK),
-       PINMUX_GPIO(GPIO_FN_FRB, FRB_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF0_TXD, SCIF0_TXD_MARK),
-       PINMUX_GPIO(GPIO_FN_HSPI_TX, HSPI_TX_MARK),
-       PINMUX_GPIO(GPIO_FN_FWE, FWE_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF5_TXD, SCIF5_TXD_MARK),
-       PINMUX_GPIO(GPIO_FN_HAC1_SYNC, HAC1_SYNC_MARK),
-       PINMUX_GPIO(GPIO_FN_SSI1_WS, SSI1_WS_MARK),
-       PINMUX_GPIO(GPIO_FN_SIOF_TXD_PJ, SIOF_TXD_PJ_MARK),
-       PINMUX_GPIO(GPIO_FN_HAC0_SDOUT, HAC0_SDOUT_MARK),
-       PINMUX_GPIO(GPIO_FN_SSI0_SDATA, SSI0_SDATA_MARK),
-       PINMUX_GPIO(GPIO_FN_SIOF_RXD_PJ, SIOF_RXD_PJ_MARK),
-       PINMUX_GPIO(GPIO_FN_HAC0_SDIN, HAC0_SDIN_MARK),
-       PINMUX_GPIO(GPIO_FN_SSI0_SCK, SSI0_SCK_MARK),
-       PINMUX_GPIO(GPIO_FN_SIOF_SYNC_PJ, SIOF_SYNC_PJ_MARK),
-       PINMUX_GPIO(GPIO_FN_HAC0_SYNC, HAC0_SYNC_MARK),
-       PINMUX_GPIO(GPIO_FN_SSI0_WS, SSI0_WS_MARK),
-       PINMUX_GPIO(GPIO_FN_SIOF_MCLK_PJ, SIOF_MCLK_PJ_MARK),
-       PINMUX_GPIO(GPIO_FN_HAC_RES, HAC_RES_MARK),
-       PINMUX_GPIO(GPIO_FN_SIOF_SCK_PJ, SIOF_SCK_PJ_MARK),
-       PINMUX_GPIO(GPIO_FN_HAC0_BITCLK, HAC0_BITCLK_MARK),
-       PINMUX_GPIO(GPIO_FN_SSI0_CLK, SSI0_CLK_MARK),
-       PINMUX_GPIO(GPIO_FN_HAC1_BITCLK, HAC1_BITCLK_MARK),
-       PINMUX_GPIO(GPIO_FN_SSI1_CLK, SSI1_CLK_MARK),
-       PINMUX_GPIO(GPIO_FN_TCLK, TCLK_MARK),
-       PINMUX_GPIO(GPIO_FN_IOIS16, IOIS16_MARK),
-       PINMUX_GPIO(GPIO_FN_STATUS0, STATUS0_MARK),
-       PINMUX_GPIO(GPIO_FN_DRAK0_PK3, DRAK0_PK3_MARK),
-       PINMUX_GPIO(GPIO_FN_STATUS1, STATUS1_MARK),
-       PINMUX_GPIO(GPIO_FN_DRAK1_PK2, DRAK1_PK2_MARK),
-       PINMUX_GPIO(GPIO_FN_DACK2, DACK2_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF2_TXD, SCIF2_TXD_MARK),
-       PINMUX_GPIO(GPIO_FN_MMCCMD, MMCCMD_MARK),
-       PINMUX_GPIO(GPIO_FN_SIOF_TXD_PK, SIOF_TXD_PK_MARK),
-       PINMUX_GPIO(GPIO_FN_DACK3, DACK3_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF2_SCK, SCIF2_SCK_MARK),
-       PINMUX_GPIO(GPIO_FN_MMCDAT, MMCDAT_MARK),
-       PINMUX_GPIO(GPIO_FN_SIOF_SCK_PK, SIOF_SCK_PK_MARK),
-       PINMUX_GPIO(GPIO_FN_DREQ0, DREQ0_MARK),
-       PINMUX_GPIO(GPIO_FN_DREQ1, DREQ1_MARK),
-       PINMUX_GPIO(GPIO_FN_DRAK0_PK1, DRAK0_PK1_MARK),
-       PINMUX_GPIO(GPIO_FN_DRAK1_PK0, DRAK1_PK0_MARK),
-       PINMUX_GPIO(GPIO_FN_DREQ2, DREQ2_MARK),
-       PINMUX_GPIO(GPIO_FN_INTB, INTB_MARK),
-       PINMUX_GPIO(GPIO_FN_DREQ3, DREQ3_MARK),
-       PINMUX_GPIO(GPIO_FN_INTC, INTC_MARK),
-       PINMUX_GPIO(GPIO_FN_DRAK2, DRAK2_MARK),
-       PINMUX_GPIO(GPIO_FN_CE2A, CE2A_MARK),
-       PINMUX_GPIO(GPIO_FN_IRL4, IRL4_MARK),
-       PINMUX_GPIO(GPIO_FN_FD4, FD4_MARK),
-       PINMUX_GPIO(GPIO_FN_IRL5, IRL5_MARK),
-       PINMUX_GPIO(GPIO_FN_FD5, FD5_MARK),
-       PINMUX_GPIO(GPIO_FN_IRL6, IRL6_MARK),
-       PINMUX_GPIO(GPIO_FN_FD6, FD6_MARK),
-       PINMUX_GPIO(GPIO_FN_IRL7, IRL7_MARK),
-       PINMUX_GPIO(GPIO_FN_FD7, FD7_MARK),
-       PINMUX_GPIO(GPIO_FN_DRAK3, DRAK3_MARK),
-       PINMUX_GPIO(GPIO_FN_CE2B, CE2B_MARK),
-       PINMUX_GPIO(GPIO_FN_BREQ_BSACK, BREQ_BSACK_MARK),
-       PINMUX_GPIO(GPIO_FN_BACK_BSREQ, BACK_BSREQ_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF5_RXD, SCIF5_RXD_MARK),
-       PINMUX_GPIO(GPIO_FN_HAC1_SDIN, HAC1_SDIN_MARK),
-       PINMUX_GPIO(GPIO_FN_SSI1_SCK, SSI1_SCK_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF5_SCK, SCIF5_SCK_MARK),
-       PINMUX_GPIO(GPIO_FN_HAC1_SDOUT, HAC1_SDOUT_MARK),
-       PINMUX_GPIO(GPIO_FN_SSI1_SDATA, SSI1_SDATA_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF3_TXD, SCIF3_TXD_MARK),
-       PINMUX_GPIO(GPIO_FN_FCLE, FCLE_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF3_RXD, SCIF3_RXD_MARK),
-       PINMUX_GPIO(GPIO_FN_FALE, FALE_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF3_SCK, SCIF3_SCK_MARK),
-       PINMUX_GPIO(GPIO_FN_FD0, FD0_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF4_TXD, SCIF4_TXD_MARK),
-       PINMUX_GPIO(GPIO_FN_FD1, FD1_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF4_RXD, SCIF4_RXD_MARK),
-       PINMUX_GPIO(GPIO_FN_FD2, FD2_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF4_SCK, SCIF4_SCK_MARK),
-       PINMUX_GPIO(GPIO_FN_FD3, FD3_MARK),
-       PINMUX_GPIO(GPIO_FN_DEVSEL_DCLKOUT, DEVSEL_DCLKOUT_MARK),
-       PINMUX_GPIO(GPIO_FN_STOP_CDE, STOP_CDE_MARK),
-       PINMUX_GPIO(GPIO_FN_LOCK_ODDF, LOCK_ODDF_MARK),
-       PINMUX_GPIO(GPIO_FN_TRDY_DISPL, TRDY_DISPL_MARK),
-       PINMUX_GPIO(GPIO_FN_IRDY_HSYNC, IRDY_HSYNC_MARK),
-       PINMUX_GPIO(GPIO_FN_PCIFRAME_VSYNC, PCIFRAME_VSYNC_MARK),
-       PINMUX_GPIO(GPIO_FN_INTA, INTA_MARK),
-       PINMUX_GPIO(GPIO_FN_GNT0_GNTIN, GNT0_GNTIN_MARK),
-       PINMUX_GPIO(GPIO_FN_REQ0_REQOUT, REQ0_REQOUT_MARK),
-       PINMUX_GPIO(GPIO_FN_PERR, PERR_MARK),
-       PINMUX_GPIO(GPIO_FN_SERR, SERR_MARK),
-       PINMUX_GPIO(GPIO_FN_WE7_CBE3, WE7_CBE3_MARK),
-       PINMUX_GPIO(GPIO_FN_WE6_CBE2, WE6_CBE2_MARK),
-       PINMUX_GPIO(GPIO_FN_WE5_CBE1, WE5_CBE1_MARK),
-       PINMUX_GPIO(GPIO_FN_WE4_CBE0, WE4_CBE0_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF2_RXD, SCIF2_RXD_MARK),
-       PINMUX_GPIO(GPIO_FN_SIOF_RXD, SIOF_RXD_MARK),
-       PINMUX_GPIO(GPIO_FN_MRESETOUT, MRESETOUT_MARK),
-       PINMUX_GPIO(GPIO_FN_IRQOUT, IRQOUT_MARK),
+       GPIO_FN(D63_AD31),
+       GPIO_FN(D62_AD30),
+       GPIO_FN(D61_AD29),
+       GPIO_FN(D60_AD28),
+       GPIO_FN(D59_AD27),
+       GPIO_FN(D58_AD26),
+       GPIO_FN(D57_AD25),
+       GPIO_FN(D56_AD24),
+       GPIO_FN(D55_AD23),
+       GPIO_FN(D54_AD22),
+       GPIO_FN(D53_AD21),
+       GPIO_FN(D52_AD20),
+       GPIO_FN(D51_AD19),
+       GPIO_FN(D50_AD18),
+       GPIO_FN(D49_AD17_DB5),
+       GPIO_FN(D48_AD16_DB4),
+       GPIO_FN(D47_AD15_DB3),
+       GPIO_FN(D46_AD14_DB2),
+       GPIO_FN(D45_AD13_DB1),
+       GPIO_FN(D44_AD12_DB0),
+       GPIO_FN(D43_AD11_DG5),
+       GPIO_FN(D42_AD10_DG4),
+       GPIO_FN(D41_AD9_DG3),
+       GPIO_FN(D40_AD8_DG2),
+       GPIO_FN(D39_AD7_DG1),
+       GPIO_FN(D38_AD6_DG0),
+       GPIO_FN(D37_AD5_DR5),
+       GPIO_FN(D36_AD4_DR4),
+       GPIO_FN(D35_AD3_DR3),
+       GPIO_FN(D34_AD2_DR2),
+       GPIO_FN(D33_AD1_DR1),
+       GPIO_FN(D32_AD0_DR0),
+       GPIO_FN(REQ1),
+       GPIO_FN(REQ2),
+       GPIO_FN(REQ3),
+       GPIO_FN(GNT1),
+       GPIO_FN(GNT2),
+       GPIO_FN(GNT3),
+       GPIO_FN(MMCCLK),
+       GPIO_FN(D31),
+       GPIO_FN(D30),
+       GPIO_FN(D29),
+       GPIO_FN(D28),
+       GPIO_FN(D27),
+       GPIO_FN(D26),
+       GPIO_FN(D25),
+       GPIO_FN(D24),
+       GPIO_FN(D23),
+       GPIO_FN(D22),
+       GPIO_FN(D21),
+       GPIO_FN(D20),
+       GPIO_FN(D19),
+       GPIO_FN(D18),
+       GPIO_FN(D17),
+       GPIO_FN(D16),
+       GPIO_FN(SCIF1_SCK),
+       GPIO_FN(SCIF1_RXD),
+       GPIO_FN(SCIF1_TXD),
+       GPIO_FN(SCIF0_CTS),
+       GPIO_FN(INTD),
+       GPIO_FN(FCE),
+       GPIO_FN(SCIF0_RTS),
+       GPIO_FN(HSPI_CS),
+       GPIO_FN(FSE),
+       GPIO_FN(SCIF0_SCK),
+       GPIO_FN(HSPI_CLK),
+       GPIO_FN(FRE),
+       GPIO_FN(SCIF0_RXD),
+       GPIO_FN(HSPI_RX),
+       GPIO_FN(FRB),
+       GPIO_FN(SCIF0_TXD),
+       GPIO_FN(HSPI_TX),
+       GPIO_FN(FWE),
+       GPIO_FN(SCIF5_TXD),
+       GPIO_FN(HAC1_SYNC),
+       GPIO_FN(SSI1_WS),
+       GPIO_FN(SIOF_TXD_PJ),
+       GPIO_FN(HAC0_SDOUT),
+       GPIO_FN(SSI0_SDATA),
+       GPIO_FN(SIOF_RXD_PJ),
+       GPIO_FN(HAC0_SDIN),
+       GPIO_FN(SSI0_SCK),
+       GPIO_FN(SIOF_SYNC_PJ),
+       GPIO_FN(HAC0_SYNC),
+       GPIO_FN(SSI0_WS),
+       GPIO_FN(SIOF_MCLK_PJ),
+       GPIO_FN(HAC_RES),
+       GPIO_FN(SIOF_SCK_PJ),
+       GPIO_FN(HAC0_BITCLK),
+       GPIO_FN(SSI0_CLK),
+       GPIO_FN(HAC1_BITCLK),
+       GPIO_FN(SSI1_CLK),
+       GPIO_FN(TCLK),
+       GPIO_FN(IOIS16),
+       GPIO_FN(STATUS0),
+       GPIO_FN(DRAK0_PK3),
+       GPIO_FN(STATUS1),
+       GPIO_FN(DRAK1_PK2),
+       GPIO_FN(DACK2),
+       GPIO_FN(SCIF2_TXD),
+       GPIO_FN(MMCCMD),
+       GPIO_FN(SIOF_TXD_PK),
+       GPIO_FN(DACK3),
+       GPIO_FN(SCIF2_SCK),
+       GPIO_FN(MMCDAT),
+       GPIO_FN(SIOF_SCK_PK),
+       GPIO_FN(DREQ0),
+       GPIO_FN(DREQ1),
+       GPIO_FN(DRAK0_PK1),
+       GPIO_FN(DRAK1_PK0),
+       GPIO_FN(DREQ2),
+       GPIO_FN(INTB),
+       GPIO_FN(DREQ3),
+       GPIO_FN(INTC),
+       GPIO_FN(DRAK2),
+       GPIO_FN(CE2A),
+       GPIO_FN(IRL4),
+       GPIO_FN(FD4),
+       GPIO_FN(IRL5),
+       GPIO_FN(FD5),
+       GPIO_FN(IRL6),
+       GPIO_FN(FD6),
+       GPIO_FN(IRL7),
+       GPIO_FN(FD7),
+       GPIO_FN(DRAK3),
+       GPIO_FN(CE2B),
+       GPIO_FN(BREQ_BSACK),
+       GPIO_FN(BACK_BSREQ),
+       GPIO_FN(SCIF5_RXD),
+       GPIO_FN(HAC1_SDIN),
+       GPIO_FN(SSI1_SCK),
+       GPIO_FN(SCIF5_SCK),
+       GPIO_FN(HAC1_SDOUT),
+       GPIO_FN(SSI1_SDATA),
+       GPIO_FN(SCIF3_TXD),
+       GPIO_FN(FCLE),
+       GPIO_FN(SCIF3_RXD),
+       GPIO_FN(FALE),
+       GPIO_FN(SCIF3_SCK),
+       GPIO_FN(FD0),
+       GPIO_FN(SCIF4_TXD),
+       GPIO_FN(FD1),
+       GPIO_FN(SCIF4_RXD),
+       GPIO_FN(FD2),
+       GPIO_FN(SCIF4_SCK),
+       GPIO_FN(FD3),
+       GPIO_FN(DEVSEL_DCLKOUT),
+       GPIO_FN(STOP_CDE),
+       GPIO_FN(LOCK_ODDF),
+       GPIO_FN(TRDY_DISPL),
+       GPIO_FN(IRDY_HSYNC),
+       GPIO_FN(PCIFRAME_VSYNC),
+       GPIO_FN(INTA),
+       GPIO_FN(GNT0_GNTIN),
+       GPIO_FN(REQ0_REQOUT),
+       GPIO_FN(PERR),
+       GPIO_FN(SERR),
+       GPIO_FN(WE7_CBE3),
+       GPIO_FN(WE6_CBE2),
+       GPIO_FN(WE5_CBE1),
+       GPIO_FN(WE4_CBE0),
+       GPIO_FN(SCIF2_RXD),
+       GPIO_FN(SIOF_RXD),
+       GPIO_FN(MRESETOUT),
+       GPIO_FN(IRQOUT),
 };
 
-static struct pinmux_cfg_reg pinmux_config_regs[] = {
+static const struct pinmux_cfg_reg pinmux_config_regs[] = {
        { PINMUX_CFG_REG("PACR", 0xffe70000, 16, 2) {
                PA7_FN, PA7_OUT, PA7_IN, PA7_IN_PU,
                PA6_FN, PA6_OUT, PA6_IN, PA6_IN_PU,
@@ -1214,7 +1218,7 @@ static struct pinmux_cfg_reg pinmux_config_regs[] = {
        {}
 };
 
-static struct pinmux_data_reg pinmux_data_regs[] = {
+static const struct pinmux_data_reg pinmux_data_regs[] = {
        { PINMUX_DATA_REG("PADR", 0xffe70020, 8) {
                PA7_DATA, PA6_DATA, PA5_DATA, PA4_DATA,
                PA3_DATA, PA2_DATA, PA1_DATA, PA0_DATA }
@@ -1282,20 +1286,18 @@ static struct pinmux_data_reg pinmux_data_regs[] = {
        { },
 };
 
-struct sh_pfc_soc_info sh7785_pinmux_info = {
+const struct sh_pfc_soc_info sh7785_pinmux_info = {
        .name = "sh7785_pfc",
-       .reserved_id = PINMUX_RESERVED,
-       .data = { PINMUX_DATA_BEGIN, PINMUX_DATA_END },
        .input = { PINMUX_INPUT_BEGIN, PINMUX_INPUT_END },
        .input_pu = { PINMUX_INPUT_PULLUP_BEGIN, PINMUX_INPUT_PULLUP_END },
        .output = { PINMUX_OUTPUT_BEGIN, PINMUX_OUTPUT_END },
-       .mark = { PINMUX_MARK_BEGIN, PINMUX_MARK_END },
        .function = { PINMUX_FUNCTION_BEGIN, PINMUX_FUNCTION_END },
 
-       .first_gpio = GPIO_PA7,
-       .last_gpio = GPIO_FN_IRQOUT,
+       .pins = pinmux_pins,
+       .nr_pins = ARRAY_SIZE(pinmux_pins),
+       .func_gpios = pinmux_func_gpios,
+       .nr_func_gpios = ARRAY_SIZE(pinmux_func_gpios),
 
-       .gpios = pinmux_gpios,
        .cfg_regs = pinmux_config_regs,
        .data_regs = pinmux_data_regs,
 
index 1e18b58f9e5fba7659e129e8cdfe95eaf4e08bf8..8ae0e32844e953eccac3c473ccdeb4fda2200b52 100644 (file)
@@ -191,7 +191,7 @@ enum {
        PINMUX_MARK_END,
 };
 
-static pinmux_enum_t pinmux_data[] = {
+static const pinmux_enum_t pinmux_data[] = {
 
        /* PA GPIO */
        PINMUX_DATA(PA7_DATA, PA7_IN, PA7_OUT, PA7_IN_PU),
@@ -427,7 +427,7 @@ static pinmux_enum_t pinmux_data[] = {
        PINMUX_DATA(SSI3_SCK_MARK,      P2MSEL6_1, P2MSEL5_1, PJ1_FN),
 };
 
-static struct pinmux_gpio pinmux_gpios[] = {
+static struct sh_pfc_pin pinmux_pins[] = {
        /* PA */
        PINMUX_GPIO(GPIO_PA7, PA7_DATA),
        PINMUX_GPIO(GPIO_PA6, PA6_DATA),
@@ -505,147 +505,151 @@ static struct pinmux_gpio pinmux_gpios[] = {
        PINMUX_GPIO(GPIO_PJ3, PJ3_DATA),
        PINMUX_GPIO(GPIO_PJ2, PJ2_DATA),
        PINMUX_GPIO(GPIO_PJ1, PJ1_DATA),
+};
+
+#define PINMUX_FN_BASE ARRAY_SIZE(pinmux_pins)
 
+static const struct pinmux_func pinmux_func_gpios[] = {
        /* FN */
-       PINMUX_GPIO(GPIO_FN_CDE,                CDE_MARK),
-       PINMUX_GPIO(GPIO_FN_ETH_MAGIC,          ETH_MAGIC_MARK),
-       PINMUX_GPIO(GPIO_FN_DISP,               DISP_MARK),
-       PINMUX_GPIO(GPIO_FN_ETH_LINK,           ETH_LINK_MARK),
-       PINMUX_GPIO(GPIO_FN_DR5,                DR5_MARK),
-       PINMUX_GPIO(GPIO_FN_ETH_TX_ER,          ETH_TX_ER_MARK),
-       PINMUX_GPIO(GPIO_FN_DR4,                DR4_MARK),
-       PINMUX_GPIO(GPIO_FN_ETH_TX_EN,          ETH_TX_EN_MARK),
-       PINMUX_GPIO(GPIO_FN_DR3,                DR3_MARK),
-       PINMUX_GPIO(GPIO_FN_ETH_TXD3,           ETH_TXD3_MARK),
-       PINMUX_GPIO(GPIO_FN_DR2,                DR2_MARK),
-       PINMUX_GPIO(GPIO_FN_ETH_TXD2,           ETH_TXD2_MARK),
-       PINMUX_GPIO(GPIO_FN_DR1,                DR1_MARK),
-       PINMUX_GPIO(GPIO_FN_ETH_TXD1,           ETH_TXD1_MARK),
-       PINMUX_GPIO(GPIO_FN_DR0,                DR0_MARK),
-       PINMUX_GPIO(GPIO_FN_ETH_TXD0,           ETH_TXD0_MARK),
-       PINMUX_GPIO(GPIO_FN_VSYNC,              VSYNC_MARK),
-       PINMUX_GPIO(GPIO_FN_HSPI_CLK,           HSPI_CLK_MARK),
-       PINMUX_GPIO(GPIO_FN_ODDF,               ODDF_MARK),
-       PINMUX_GPIO(GPIO_FN_HSPI_CS,            HSPI_CS_MARK),
-       PINMUX_GPIO(GPIO_FN_DG5,                DG5_MARK),
-       PINMUX_GPIO(GPIO_FN_ETH_MDIO,           ETH_MDIO_MARK),
-       PINMUX_GPIO(GPIO_FN_DG4,                DG4_MARK),
-       PINMUX_GPIO(GPIO_FN_ETH_RX_CLK,         ETH_RX_CLK_MARK),
-       PINMUX_GPIO(GPIO_FN_DG3,                DG3_MARK),
-       PINMUX_GPIO(GPIO_FN_ETH_MDC,            ETH_MDC_MARK),
-       PINMUX_GPIO(GPIO_FN_DG2,                DG2_MARK),
-       PINMUX_GPIO(GPIO_FN_ETH_COL,            ETH_COL_MARK),
-       PINMUX_GPIO(GPIO_FN_DG1,                DG1_MARK),
-       PINMUX_GPIO(GPIO_FN_ETH_TX_CLK,         ETH_TX_CLK_MARK),
-       PINMUX_GPIO(GPIO_FN_DG0,                DG0_MARK),
-       PINMUX_GPIO(GPIO_FN_ETH_CRS,            ETH_CRS_MARK),
-       PINMUX_GPIO(GPIO_FN_DCLKIN,             DCLKIN_MARK),
-       PINMUX_GPIO(GPIO_FN_HSPI_RX,            HSPI_RX_MARK),
-       PINMUX_GPIO(GPIO_FN_HSYNC,              HSYNC_MARK),
-       PINMUX_GPIO(GPIO_FN_HSPI_TX,            HSPI_TX_MARK),
-       PINMUX_GPIO(GPIO_FN_DB5,                DB5_MARK),
-       PINMUX_GPIO(GPIO_FN_ETH_RXD3,           ETH_RXD3_MARK),
-       PINMUX_GPIO(GPIO_FN_DB4,                DB4_MARK),
-       PINMUX_GPIO(GPIO_FN_ETH_RXD2,           ETH_RXD2_MARK),
-       PINMUX_GPIO(GPIO_FN_DB3,                DB3_MARK),
-       PINMUX_GPIO(GPIO_FN_ETH_RXD1,           ETH_RXD1_MARK),
-       PINMUX_GPIO(GPIO_FN_DB2,                DB2_MARK),
-       PINMUX_GPIO(GPIO_FN_ETH_RXD0,           ETH_RXD0_MARK),
-       PINMUX_GPIO(GPIO_FN_DB1,                DB1_MARK),
-       PINMUX_GPIO(GPIO_FN_ETH_RX_DV,          ETH_RX_DV_MARK),
-       PINMUX_GPIO(GPIO_FN_DB0,                DB0_MARK),
-       PINMUX_GPIO(GPIO_FN_ETH_RX_ER,          ETH_RX_ER_MARK),
-       PINMUX_GPIO(GPIO_FN_DCLKOUT,            DCLKOUT_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF1_SCK,          SCIF1_SCK_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF1_RXD,          SCIF1_RXD_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF1_TXD,          SCIF1_TXD_MARK),
-       PINMUX_GPIO(GPIO_FN_DACK1,              DACK1_MARK),
-       PINMUX_GPIO(GPIO_FN_BACK,               BACK_MARK),
-       PINMUX_GPIO(GPIO_FN_FALE,               FALE_MARK),
-       PINMUX_GPIO(GPIO_FN_DACK0,              DACK0_MARK),
-       PINMUX_GPIO(GPIO_FN_FCLE,               FCLE_MARK),
-       PINMUX_GPIO(GPIO_FN_DREQ1,              DREQ1_MARK),
-       PINMUX_GPIO(GPIO_FN_BREQ,               BREQ_MARK),
-       PINMUX_GPIO(GPIO_FN_USB_OVC1,           USB_OVC1_MARK),
-       PINMUX_GPIO(GPIO_FN_DREQ0,              DREQ0_MARK),
-       PINMUX_GPIO(GPIO_FN_USB_OVC0,           USB_OVC0_MARK),
-       PINMUX_GPIO(GPIO_FN_USB_PENC1,          USB_PENC1_MARK),
-       PINMUX_GPIO(GPIO_FN_USB_PENC0,          USB_PENC0_MARK),
-       PINMUX_GPIO(GPIO_FN_HAC1_SDOUT,         HAC1_SDOUT_MARK),
-       PINMUX_GPIO(GPIO_FN_SSI1_SDATA,         SSI1_SDATA_MARK),
-       PINMUX_GPIO(GPIO_FN_SDIF1CMD,           SDIF1CMD_MARK),
-       PINMUX_GPIO(GPIO_FN_HAC1_SDIN,          HAC1_SDIN_MARK),
-       PINMUX_GPIO(GPIO_FN_SSI1_SCK,           SSI1_SCK_MARK),
-       PINMUX_GPIO(GPIO_FN_SDIF1CD,            SDIF1CD_MARK),
-       PINMUX_GPIO(GPIO_FN_HAC1_SYNC,          HAC1_SYNC_MARK),
-       PINMUX_GPIO(GPIO_FN_SSI1_WS,            SSI1_WS_MARK),
-       PINMUX_GPIO(GPIO_FN_SDIF1WP,            SDIF1WP_MARK),
-       PINMUX_GPIO(GPIO_FN_HAC1_BITCLK,        HAC1_BITCLK_MARK),
-       PINMUX_GPIO(GPIO_FN_SSI1_CLK,           SSI1_CLK_MARK),
-       PINMUX_GPIO(GPIO_FN_SDIF1CLK,           SDIF1CLK_MARK),
-       PINMUX_GPIO(GPIO_FN_HAC0_SDOUT,         HAC0_SDOUT_MARK),
-       PINMUX_GPIO(GPIO_FN_SSI0_SDATA,         SSI0_SDATA_MARK),
-       PINMUX_GPIO(GPIO_FN_SDIF1D3,            SDIF1D3_MARK),
-       PINMUX_GPIO(GPIO_FN_HAC0_SDIN,          HAC0_SDIN_MARK),
-       PINMUX_GPIO(GPIO_FN_SSI0_SCK,           SSI0_SCK_MARK),
-       PINMUX_GPIO(GPIO_FN_SDIF1D2,            SDIF1D2_MARK),
-       PINMUX_GPIO(GPIO_FN_HAC0_SYNC,          HAC0_SYNC_MARK),
-       PINMUX_GPIO(GPIO_FN_SSI0_WS,            SSI0_WS_MARK),
-       PINMUX_GPIO(GPIO_FN_SDIF1D1,            SDIF1D1_MARK),
-       PINMUX_GPIO(GPIO_FN_HAC0_BITCLK,        HAC0_BITCLK_MARK),
-       PINMUX_GPIO(GPIO_FN_SSI0_CLK,           SSI0_CLK_MARK),
-       PINMUX_GPIO(GPIO_FN_SDIF1D0,            SDIF1D0_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF3_SCK,          SCIF3_SCK_MARK),
-       PINMUX_GPIO(GPIO_FN_SSI2_SDATA,         SSI2_SDATA_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF3_RXD,          SCIF3_RXD_MARK),
-       PINMUX_GPIO(GPIO_FN_TCLK,               TCLK_MARK),
-       PINMUX_GPIO(GPIO_FN_SSI2_SCK,           SSI2_SCK_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF3_TXD,          SCIF3_TXD_MARK),
-       PINMUX_GPIO(GPIO_FN_HAC_RES,            HAC_RES_MARK),
-       PINMUX_GPIO(GPIO_FN_SSI2_WS,            SSI2_WS_MARK),
-       PINMUX_GPIO(GPIO_FN_DACK3,              DACK3_MARK),
-       PINMUX_GPIO(GPIO_FN_SDIF0CMD,           SDIF0CMD_MARK),
-       PINMUX_GPIO(GPIO_FN_DACK2,              DACK2_MARK),
-       PINMUX_GPIO(GPIO_FN_SDIF0CD,            SDIF0CD_MARK),
-       PINMUX_GPIO(GPIO_FN_DREQ3,              DREQ3_MARK),
-       PINMUX_GPIO(GPIO_FN_SDIF0WP,            SDIF0WP_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF0_CTS,          SCIF0_CTS_MARK),
-       PINMUX_GPIO(GPIO_FN_DREQ2,              DREQ2_MARK),
-       PINMUX_GPIO(GPIO_FN_SDIF0CLK,           SDIF0CLK_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF0_RTS,          SCIF0_RTS_MARK),
-       PINMUX_GPIO(GPIO_FN_IRL7,               IRL7_MARK),
-       PINMUX_GPIO(GPIO_FN_SDIF0D3,            SDIF0D3_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF0_SCK,          SCIF0_SCK_MARK),
-       PINMUX_GPIO(GPIO_FN_IRL6,               IRL6_MARK),
-       PINMUX_GPIO(GPIO_FN_SDIF0D2,            SDIF0D2_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF0_RXD,          SCIF0_RXD_MARK),
-       PINMUX_GPIO(GPIO_FN_IRL5,               IRL5_MARK),
-       PINMUX_GPIO(GPIO_FN_SDIF0D1,            SDIF0D1_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF0_TXD,          SCIF0_TXD_MARK),
-       PINMUX_GPIO(GPIO_FN_IRL4,               IRL4_MARK),
-       PINMUX_GPIO(GPIO_FN_SDIF0D0,            SDIF0D0_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF5_SCK,          SCIF5_SCK_MARK),
-       PINMUX_GPIO(GPIO_FN_FRB,                FRB_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF5_RXD,          SCIF5_RXD_MARK),
-       PINMUX_GPIO(GPIO_FN_IOIS16,             IOIS16_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF5_TXD,          SCIF5_TXD_MARK),
-       PINMUX_GPIO(GPIO_FN_CE2B,               CE2B_MARK),
-       PINMUX_GPIO(GPIO_FN_DRAK3,              DRAK3_MARK),
-       PINMUX_GPIO(GPIO_FN_CE2A,               CE2A_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF4_SCK,          SCIF4_SCK_MARK),
-       PINMUX_GPIO(GPIO_FN_DRAK2,              DRAK2_MARK),
-       PINMUX_GPIO(GPIO_FN_SSI3_WS,            SSI3_WS_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF4_RXD,          SCIF4_RXD_MARK),
-       PINMUX_GPIO(GPIO_FN_DRAK1,              DRAK1_MARK),
-       PINMUX_GPIO(GPIO_FN_SSI3_SDATA,         SSI3_SDATA_MARK),
-       PINMUX_GPIO(GPIO_FN_FSTATUS,            FSTATUS_MARK),
-       PINMUX_GPIO(GPIO_FN_SCIF4_TXD,          SCIF4_TXD_MARK),
-       PINMUX_GPIO(GPIO_FN_DRAK0,              DRAK0_MARK),
-       PINMUX_GPIO(GPIO_FN_SSI3_SCK,           SSI3_SCK_MARK),
-       PINMUX_GPIO(GPIO_FN_FSE,                FSE_MARK),
+       GPIO_FN(CDE),
+       GPIO_FN(ETH_MAGIC),
+       GPIO_FN(DISP),
+       GPIO_FN(ETH_LINK),
+       GPIO_FN(DR5),
+       GPIO_FN(ETH_TX_ER),
+       GPIO_FN(DR4),
+       GPIO_FN(ETH_TX_EN),
+       GPIO_FN(DR3),
+       GPIO_FN(ETH_TXD3),
+       GPIO_FN(DR2),
+       GPIO_FN(ETH_TXD2),
+       GPIO_FN(DR1),
+       GPIO_FN(ETH_TXD1),
+       GPIO_FN(DR0),
+       GPIO_FN(ETH_TXD0),
+       GPIO_FN(VSYNC),
+       GPIO_FN(HSPI_CLK),
+       GPIO_FN(ODDF),
+       GPIO_FN(HSPI_CS),
+       GPIO_FN(DG5),
+       GPIO_FN(ETH_MDIO),
+       GPIO_FN(DG4),
+       GPIO_FN(ETH_RX_CLK),
+       GPIO_FN(DG3),
+       GPIO_FN(ETH_MDC),
+       GPIO_FN(DG2),
+       GPIO_FN(ETH_COL),
+       GPIO_FN(DG1),
+       GPIO_FN(ETH_TX_CLK),
+       GPIO_FN(DG0),
+       GPIO_FN(ETH_CRS),
+       GPIO_FN(DCLKIN),
+       GPIO_FN(HSPI_RX),
+       GPIO_FN(HSYNC),
+       GPIO_FN(HSPI_TX),
+       GPIO_FN(DB5),
+       GPIO_FN(ETH_RXD3),
+       GPIO_FN(DB4),
+       GPIO_FN(ETH_RXD2),
+       GPIO_FN(DB3),
+       GPIO_FN(ETH_RXD1),
+       GPIO_FN(DB2),
+       GPIO_FN(ETH_RXD0),
+       GPIO_FN(DB1),
+       GPIO_FN(ETH_RX_DV),
+       GPIO_FN(DB0),
+       GPIO_FN(ETH_RX_ER),
+       GPIO_FN(DCLKOUT),
+       GPIO_FN(SCIF1_SCK),
+       GPIO_FN(SCIF1_RXD),
+       GPIO_FN(SCIF1_TXD),
+       GPIO_FN(DACK1),
+       GPIO_FN(BACK),
+       GPIO_FN(FALE),
+       GPIO_FN(DACK0),
+       GPIO_FN(FCLE),
+       GPIO_FN(DREQ1),
+       GPIO_FN(BREQ),
+       GPIO_FN(USB_OVC1),
+       GPIO_FN(DREQ0),
+       GPIO_FN(USB_OVC0),
+       GPIO_FN(USB_PENC1),
+       GPIO_FN(USB_PENC0),
+       GPIO_FN(HAC1_SDOUT),
+       GPIO_FN(SSI1_SDATA),
+       GPIO_FN(SDIF1CMD),
+       GPIO_FN(HAC1_SDIN),
+       GPIO_FN(SSI1_SCK),
+       GPIO_FN(SDIF1CD),
+       GPIO_FN(HAC1_SYNC),
+       GPIO_FN(SSI1_WS),
+       GPIO_FN(SDIF1WP),
+       GPIO_FN(HAC1_BITCLK),
+       GPIO_FN(SSI1_CLK),
+       GPIO_FN(SDIF1CLK),
+       GPIO_FN(HAC0_SDOUT),
+       GPIO_FN(SSI0_SDATA),
+       GPIO_FN(SDIF1D3),
+       GPIO_FN(HAC0_SDIN),
+       GPIO_FN(SSI0_SCK),
+       GPIO_FN(SDIF1D2),
+       GPIO_FN(HAC0_SYNC),
+       GPIO_FN(SSI0_WS),
+       GPIO_FN(SDIF1D1),
+       GPIO_FN(HAC0_BITCLK),
+       GPIO_FN(SSI0_CLK),
+       GPIO_FN(SDIF1D0),
+       GPIO_FN(SCIF3_SCK),
+       GPIO_FN(SSI2_SDATA),
+       GPIO_FN(SCIF3_RXD),
+       GPIO_FN(TCLK),
+       GPIO_FN(SSI2_SCK),
+       GPIO_FN(SCIF3_TXD),
+       GPIO_FN(HAC_RES),
+       GPIO_FN(SSI2_WS),
+       GPIO_FN(DACK3),
+       GPIO_FN(SDIF0CMD),
+       GPIO_FN(DACK2),
+       GPIO_FN(SDIF0CD),
+       GPIO_FN(DREQ3),
+       GPIO_FN(SDIF0WP),
+       GPIO_FN(SCIF0_CTS),
+       GPIO_FN(DREQ2),
+       GPIO_FN(SDIF0CLK),
+       GPIO_FN(SCIF0_RTS),
+       GPIO_FN(IRL7),
+       GPIO_FN(SDIF0D3),
+       GPIO_FN(SCIF0_SCK),
+       GPIO_FN(IRL6),
+       GPIO_FN(SDIF0D2),
+       GPIO_FN(SCIF0_RXD),
+       GPIO_FN(IRL5),
+       GPIO_FN(SDIF0D1),
+       GPIO_FN(SCIF0_TXD),
+       GPIO_FN(IRL4),
+       GPIO_FN(SDIF0D0),
+       GPIO_FN(SCIF5_SCK),
+       GPIO_FN(FRB),
+       GPIO_FN(SCIF5_RXD),
+       GPIO_FN(IOIS16),
+       GPIO_FN(SCIF5_TXD),
+       GPIO_FN(CE2B),
+       GPIO_FN(DRAK3),
+       GPIO_FN(CE2A),
+       GPIO_FN(SCIF4_SCK),
+       GPIO_FN(DRAK2),
+       GPIO_FN(SSI3_WS),
+       GPIO_FN(SCIF4_RXD),
+       GPIO_FN(DRAK1),
+       GPIO_FN(SSI3_SDATA),
+       GPIO_FN(FSTATUS),
+       GPIO_FN(SCIF4_TXD),
+       GPIO_FN(DRAK0),
+       GPIO_FN(SSI3_SCK),
+       GPIO_FN(FSE),
 };
 
-static struct pinmux_cfg_reg pinmux_config_regs[] = {
+static const struct pinmux_cfg_reg pinmux_config_regs[] = {
        { PINMUX_CFG_REG("PACR", 0xffcc0000, 16, 2) {
                PA7_FN, PA7_OUT, PA7_IN, PA7_IN_PU,
                PA6_FN, PA6_OUT, PA6_IN, PA6_IN_PU,
@@ -775,7 +779,7 @@ static struct pinmux_cfg_reg pinmux_config_regs[] = {
        {}
 };
 
-static struct pinmux_data_reg pinmux_data_regs[] = {
+static const struct pinmux_data_reg pinmux_data_regs[] = {
        { PINMUX_DATA_REG("PADR", 0xffcc0020, 8) {
                PA7_DATA, PA6_DATA, PA5_DATA, PA4_DATA,
                PA3_DATA, PA2_DATA, PA1_DATA, PA0_DATA }
@@ -815,20 +819,18 @@ static struct pinmux_data_reg pinmux_data_regs[] = {
        { },
 };
 
-struct sh_pfc_soc_info sh7786_pinmux_info = {
+const struct sh_pfc_soc_info sh7786_pinmux_info = {
        .name = "sh7786_pfc",
-       .reserved_id = PINMUX_RESERVED,
-       .data = { PINMUX_DATA_BEGIN, PINMUX_DATA_END },
        .input = { PINMUX_INPUT_BEGIN, PINMUX_INPUT_END },
        .input_pu = { PINMUX_INPUT_PULLUP_BEGIN, PINMUX_INPUT_PULLUP_END },
        .output = { PINMUX_OUTPUT_BEGIN, PINMUX_OUTPUT_END },
-       .mark = { PINMUX_MARK_BEGIN, PINMUX_MARK_END },
        .function = { PINMUX_FUNCTION_BEGIN, PINMUX_FUNCTION_END },
 
-       .first_gpio = GPIO_PA7,
-       .last_gpio = GPIO_FN_IRL4,
+       .pins = pinmux_pins,
+       .nr_pins = ARRAY_SIZE(pinmux_pins),
+       .func_gpios = pinmux_func_gpios,
+       .nr_func_gpios = ARRAY_SIZE(pinmux_func_gpios),
 
-       .gpios = pinmux_gpios,
        .cfg_regs = pinmux_config_regs,
        .data_regs = pinmux_data_regs,
 
index ccf6918b03c607c28726938a1a41499fff2d318a..6594c8c48747169b867f3626f2d20d4ce80f9d54 100644 (file)
@@ -147,7 +147,7 @@ enum {
        PINMUX_MARK_END,
 };
 
-static pinmux_enum_t shx3_pinmux_data[] = {
+static const pinmux_enum_t shx3_pinmux_data[] = {
 
        /* PA GPIO */
        PINMUX_DATA(PA7_DATA, PA7_IN, PA7_OUT, PA7_IN_PU),
@@ -306,7 +306,7 @@ static pinmux_enum_t shx3_pinmux_data[] = {
        PINMUX_DATA(IRQOUT_MARK,        PH0_FN),
 };
 
-static struct pinmux_gpio shx3_pinmux_gpios[] = {
+static struct sh_pfc_pin shx3_pinmux_pins[] = {
        /* PA */
        PINMUX_GPIO(GPIO_PA7, PA7_DATA),
        PINMUX_GPIO(GPIO_PA6, PA6_DATA),
@@ -384,73 +384,77 @@ static struct pinmux_gpio shx3_pinmux_gpios[] = {
        PINMUX_GPIO(GPIO_PH2, PH2_DATA),
        PINMUX_GPIO(GPIO_PH1, PH1_DATA),
        PINMUX_GPIO(GPIO_PH0, PH0_DATA),
+};
+
+#define PINMUX_FN_BASE ARRAY_SIZE(shx3_pinmux_pins)
 
+static const struct pinmux_func shx3_pinmux_func_gpios[] = {
        /* FN */
-       PINMUX_GPIO(GPIO_FN_D31,        D31_MARK),
-       PINMUX_GPIO(GPIO_FN_D30,        D30_MARK),
-       PINMUX_GPIO(GPIO_FN_D29,        D29_MARK),
-       PINMUX_GPIO(GPIO_FN_D28,        D28_MARK),
-       PINMUX_GPIO(GPIO_FN_D27,        D27_MARK),
-       PINMUX_GPIO(GPIO_FN_D26,        D26_MARK),
-       PINMUX_GPIO(GPIO_FN_D25,        D25_MARK),
-       PINMUX_GPIO(GPIO_FN_D24,        D24_MARK),
-       PINMUX_GPIO(GPIO_FN_D23,        D23_MARK),
-       PINMUX_GPIO(GPIO_FN_D22,        D22_MARK),
-       PINMUX_GPIO(GPIO_FN_D21,        D21_MARK),
-       PINMUX_GPIO(GPIO_FN_D20,        D20_MARK),
-       PINMUX_GPIO(GPIO_FN_D19,        D19_MARK),
-       PINMUX_GPIO(GPIO_FN_D18,        D18_MARK),
-       PINMUX_GPIO(GPIO_FN_D17,        D17_MARK),
-       PINMUX_GPIO(GPIO_FN_D16,        D16_MARK),
-       PINMUX_GPIO(GPIO_FN_BACK,       BACK_MARK),
-       PINMUX_GPIO(GPIO_FN_BREQ,       BREQ_MARK),
-       PINMUX_GPIO(GPIO_FN_WE3,        WE3_MARK),
-       PINMUX_GPIO(GPIO_FN_WE2,        WE2_MARK),
-       PINMUX_GPIO(GPIO_FN_CS6,        CS6_MARK),
-       PINMUX_GPIO(GPIO_FN_CS5,        CS5_MARK),
-       PINMUX_GPIO(GPIO_FN_CS4,        CS4_MARK),
-       PINMUX_GPIO(GPIO_FN_CLKOUTENB,  CLKOUTENB_MARK),
-       PINMUX_GPIO(GPIO_FN_DACK3,      DACK3_MARK),
-       PINMUX_GPIO(GPIO_FN_DACK2,      DACK2_MARK),
-       PINMUX_GPIO(GPIO_FN_DACK1,      DACK1_MARK),
-       PINMUX_GPIO(GPIO_FN_DACK0,      DACK0_MARK),
-       PINMUX_GPIO(GPIO_FN_DREQ3,      DREQ3_MARK),
-       PINMUX_GPIO(GPIO_FN_DREQ2,      DREQ2_MARK),
-       PINMUX_GPIO(GPIO_FN_DREQ1,      DREQ1_MARK),
-       PINMUX_GPIO(GPIO_FN_DREQ0,      DREQ0_MARK),
-       PINMUX_GPIO(GPIO_FN_IRQ3,       IRQ3_MARK),
-       PINMUX_GPIO(GPIO_FN_IRQ2,       IRQ2_MARK),
-       PINMUX_GPIO(GPIO_FN_IRQ1,       IRQ1_MARK),
-       PINMUX_GPIO(GPIO_FN_IRQ0,       IRQ0_MARK),
-       PINMUX_GPIO(GPIO_FN_DRAK3,      DRAK3_MARK),
-       PINMUX_GPIO(GPIO_FN_DRAK2,      DRAK2_MARK),
-       PINMUX_GPIO(GPIO_FN_DRAK1,      DRAK1_MARK),
-       PINMUX_GPIO(GPIO_FN_DRAK0,      DRAK0_MARK),
-       PINMUX_GPIO(GPIO_FN_SCK3,       SCK3_MARK),
-       PINMUX_GPIO(GPIO_FN_SCK2,       SCK2_MARK),
-       PINMUX_GPIO(GPIO_FN_SCK1,       SCK1_MARK),
-       PINMUX_GPIO(GPIO_FN_SCK0,       SCK0_MARK),
-       PINMUX_GPIO(GPIO_FN_IRL3,       IRL3_MARK),
-       PINMUX_GPIO(GPIO_FN_IRL2,       IRL2_MARK),
-       PINMUX_GPIO(GPIO_FN_IRL1,       IRL1_MARK),
-       PINMUX_GPIO(GPIO_FN_IRL0,       IRL0_MARK),
-       PINMUX_GPIO(GPIO_FN_TXD3,       TXD3_MARK),
-       PINMUX_GPIO(GPIO_FN_TXD2,       TXD2_MARK),
-       PINMUX_GPIO(GPIO_FN_TXD1,       TXD1_MARK),
-       PINMUX_GPIO(GPIO_FN_TXD0,       TXD0_MARK),
-       PINMUX_GPIO(GPIO_FN_RXD3,       RXD3_MARK),
-       PINMUX_GPIO(GPIO_FN_RXD2,       RXD2_MARK),
-       PINMUX_GPIO(GPIO_FN_RXD1,       RXD1_MARK),
-       PINMUX_GPIO(GPIO_FN_RXD0,       RXD0_MARK),
-       PINMUX_GPIO(GPIO_FN_CE2B,       CE2B_MARK),
-       PINMUX_GPIO(GPIO_FN_CE2A,       CE2A_MARK),
-       PINMUX_GPIO(GPIO_FN_IOIS16,     IOIS16_MARK),
-       PINMUX_GPIO(GPIO_FN_STATUS1,    STATUS1_MARK),
-       PINMUX_GPIO(GPIO_FN_STATUS0,    STATUS0_MARK),
-       PINMUX_GPIO(GPIO_FN_IRQOUT,     IRQOUT_MARK),
+       GPIO_FN(D31),
+       GPIO_FN(D30),
+       GPIO_FN(D29),
+       GPIO_FN(D28),
+       GPIO_FN(D27),
+       GPIO_FN(D26),
+       GPIO_FN(D25),
+       GPIO_FN(D24),
+       GPIO_FN(D23),
+       GPIO_FN(D22),
+       GPIO_FN(D21),
+       GPIO_FN(D20),
+       GPIO_FN(D19),
+       GPIO_FN(D18),
+       GPIO_FN(D17),
+       GPIO_FN(D16),
+       GPIO_FN(BACK),
+       GPIO_FN(BREQ),
+       GPIO_FN(WE3),
+       GPIO_FN(WE2),
+       GPIO_FN(CS6),
+       GPIO_FN(CS5),
+       GPIO_FN(CS4),
+       GPIO_FN(CLKOUTENB),
+       GPIO_FN(DACK3),
+       GPIO_FN(DACK2),
+       GPIO_FN(DACK1),
+       GPIO_FN(DACK0),
+       GPIO_FN(DREQ3),
+       GPIO_FN(DREQ2),
+       GPIO_FN(DREQ1),
+       GPIO_FN(DREQ0),
+       GPIO_FN(IRQ3),
+       GPIO_FN(IRQ2),
+       GPIO_FN(IRQ1),
+       GPIO_FN(IRQ0),
+       GPIO_FN(DRAK3),
+       GPIO_FN(DRAK2),
+       GPIO_FN(DRAK1),
+       GPIO_FN(DRAK0),
+       GPIO_FN(SCK3),
+       GPIO_FN(SCK2),
+       GPIO_FN(SCK1),
+       GPIO_FN(SCK0),
+       GPIO_FN(IRL3),
+       GPIO_FN(IRL2),
+       GPIO_FN(IRL1),
+       GPIO_FN(IRL0),
+       GPIO_FN(TXD3),
+       GPIO_FN(TXD2),
+       GPIO_FN(TXD1),
+       GPIO_FN(TXD0),
+       GPIO_FN(RXD3),
+       GPIO_FN(RXD2),
+       GPIO_FN(RXD1),
+       GPIO_FN(RXD0),
+       GPIO_FN(CE2B),
+       GPIO_FN(CE2A),
+       GPIO_FN(IOIS16),
+       GPIO_FN(STATUS1),
+       GPIO_FN(STATUS0),
+       GPIO_FN(IRQOUT),
 };
 
-static struct pinmux_cfg_reg shx3_pinmux_config_regs[] = {
+static const struct pinmux_cfg_reg shx3_pinmux_config_regs[] = {
        { PINMUX_CFG_REG("PABCR", 0xffc70000, 32, 2) {
                PA7_FN, PA7_OUT, PA7_IN, PA7_IN_PU,
                PA6_FN, PA6_OUT, PA6_IN, PA6_IN_PU,
@@ -526,7 +530,7 @@ static struct pinmux_cfg_reg shx3_pinmux_config_regs[] = {
        { },
 };
 
-static struct pinmux_data_reg shx3_pinmux_data_regs[] = {
+static const struct pinmux_data_reg shx3_pinmux_data_regs[] = {
        { PINMUX_DATA_REG("PABDR", 0xffc70010, 32) {
                0, 0, 0, 0, 0, 0, 0, 0,
                PA7_DATA, PA6_DATA, PA5_DATA, PA4_DATA,
@@ -562,19 +566,17 @@ static struct pinmux_data_reg shx3_pinmux_data_regs[] = {
        { },
 };
 
-struct sh_pfc_soc_info shx3_pinmux_info = {
+const struct sh_pfc_soc_info shx3_pinmux_info = {
        .name           = "shx3_pfc",
-       .reserved_id    = PINMUX_RESERVED,
-       .data           = { PINMUX_DATA_BEGIN,     PINMUX_DATA_END },
        .input          = { PINMUX_INPUT_BEGIN,    PINMUX_INPUT_END },
        .input_pu       = { PINMUX_INPUT_PULLUP_BEGIN,
                            PINMUX_INPUT_PULLUP_END },
        .output         = { PINMUX_OUTPUT_BEGIN,   PINMUX_OUTPUT_END },
-       .mark           = { PINMUX_MARK_BEGIN,     PINMUX_MARK_END },
        .function       = { PINMUX_FUNCTION_BEGIN, PINMUX_FUNCTION_END },
-       .first_gpio     = GPIO_PA7,
-       .last_gpio      = GPIO_FN_STATUS0,
-       .gpios          = shx3_pinmux_gpios,
+       .pins           = shx3_pinmux_pins,
+       .nr_pins        = ARRAY_SIZE(shx3_pinmux_pins),
+       .func_gpios     = shx3_pinmux_func_gpios,
+       .nr_func_gpios  = ARRAY_SIZE(shx3_pinmux_func_gpios),
        .gpio_data      = shx3_pinmux_data,
        .gpio_data_size = ARRAY_SIZE(shx3_pinmux_data),
        .cfg_regs       = shx3_pinmux_config_regs,
index 11e0e1374d656464afd7360b5b6bdfb2e3fa3b1a..3492ec9a33b78ec760561e3dc63f642e3ea84c4a 100644 (file)
@@ -9,7 +9,6 @@
  */
 
 #define DRV_NAME "sh-pfc"
-#define pr_fmt(fmt) KBUILD_MODNAME " pinctrl: " fmt
 
 #include <linux/device.h>
 #include <linux/err.h>
 #include <linux/spinlock.h>
 
 #include "core.h"
+#include "../core.h"
+#include "../pinconf.h"
+
+struct sh_pfc_pin_config {
+       u32 type;
+};
 
 struct sh_pfc_pinctrl {
        struct pinctrl_dev *pctl;
-       struct sh_pfc *pfc;
-
-       struct pinmux_gpio **functions;
-       unsigned int nr_functions;
+       struct pinctrl_desc pctl_desc;
 
-       struct pinctrl_pin_desc *pads;
-       unsigned int nr_pads;
+       struct sh_pfc *pfc;
 
-       spinlock_t lock;
+       struct pinctrl_pin_desc *pins;
+       struct sh_pfc_pin_config *configs;
 };
 
 static int sh_pfc_get_groups_count(struct pinctrl_dev *pctldev)
 {
        struct sh_pfc_pinctrl *pmx = pinctrl_dev_get_drvdata(pctldev);
 
-       return pmx->nr_pads;
+       return pmx->pfc->info->nr_groups;
 }
 
 static const char *sh_pfc_get_group_name(struct pinctrl_dev *pctldev,
@@ -50,16 +52,16 @@ static const char *sh_pfc_get_group_name(struct pinctrl_dev *pctldev,
 {
        struct sh_pfc_pinctrl *pmx = pinctrl_dev_get_drvdata(pctldev);
 
-       return pmx->pads[selector].name;
+       return pmx->pfc->info->groups[selector].name;
 }
 
-static int sh_pfc_get_group_pins(struct pinctrl_dev *pctldev, unsigned group,
+static int sh_pfc_get_group_pins(struct pinctrl_dev *pctldev, unsigned selector,
                                 const unsigned **pins, unsigned *num_pins)
 {
        struct sh_pfc_pinctrl *pmx = pinctrl_dev_get_drvdata(pctldev);
 
-       *pins = &pmx->pads[group].number;
-       *num_pins = 1;
+       *pins = pmx->pfc->info->groups[selector].pins;
+       *num_pins = pmx->pfc->info->groups[selector].nr_pins;
 
        return 0;
 }
@@ -70,7 +72,7 @@ static void sh_pfc_pin_dbg_show(struct pinctrl_dev *pctldev, struct seq_file *s,
        seq_printf(s, "%s", DRV_NAME);
 }
 
-static struct pinctrl_ops sh_pfc_pinctrl_ops = {
+static const struct pinctrl_ops sh_pfc_pinctrl_ops = {
        .get_groups_count       = sh_pfc_get_groups_count,
        .get_group_name         = sh_pfc_get_group_name,
        .get_group_pins         = sh_pfc_get_group_pins,
@@ -81,7 +83,7 @@ static int sh_pfc_get_functions_count(struct pinctrl_dev *pctldev)
 {
        struct sh_pfc_pinctrl *pmx = pinctrl_dev_get_drvdata(pctldev);
 
-       return pmx->nr_functions;
+       return pmx->pfc->info->nr_functions;
 }
 
 static const char *sh_pfc_get_function_name(struct pinctrl_dev *pctldev,
@@ -89,136 +91,113 @@ static const char *sh_pfc_get_function_name(struct pinctrl_dev *pctldev,
 {
        struct sh_pfc_pinctrl *pmx = pinctrl_dev_get_drvdata(pctldev);
 
-       return pmx->functions[selector]->name;
+       return pmx->pfc->info->functions[selector].name;
 }
 
-static int sh_pfc_get_function_groups(struct pinctrl_dev *pctldev, unsigned func,
+static int sh_pfc_get_function_groups(struct pinctrl_dev *pctldev,
+                                     unsigned selector,
                                      const char * const **groups,
                                      unsigned * const num_groups)
 {
        struct sh_pfc_pinctrl *pmx = pinctrl_dev_get_drvdata(pctldev);
 
-       *groups = &pmx->functions[func]->name;
-       *num_groups = 1;
+       *groups = pmx->pfc->info->functions[selector].groups;
+       *num_groups = pmx->pfc->info->functions[selector].nr_groups;
 
        return 0;
 }
 
-static int sh_pfc_noop_enable(struct pinctrl_dev *pctldev, unsigned func,
+static int sh_pfc_func_enable(struct pinctrl_dev *pctldev, unsigned selector,
                              unsigned group)
 {
-       return 0;
-}
+       struct sh_pfc_pinctrl *pmx = pinctrl_dev_get_drvdata(pctldev);
+       struct sh_pfc *pfc = pmx->pfc;
+       const struct sh_pfc_pin_group *grp = &pfc->info->groups[group];
+       unsigned long flags;
+       unsigned int i;
+       int ret = 0;
 
-static void sh_pfc_noop_disable(struct pinctrl_dev *pctldev, unsigned func,
-                               unsigned group)
-{
-}
+       spin_lock_irqsave(&pfc->lock, flags);
 
-static int sh_pfc_config_function(struct sh_pfc *pfc, unsigned offset)
-{
-       if (sh_pfc_config_gpio(pfc, offset,
-                              PINMUX_TYPE_FUNCTION,
-                              GPIO_CFG_DRYRUN) != 0)
-               return -EINVAL;
+       for (i = 0; i < grp->nr_pins; ++i) {
+               int idx = sh_pfc_get_pin_index(pfc, grp->pins[i]);
+               struct sh_pfc_pin_config *cfg = &pmx->configs[idx];
 
-       if (sh_pfc_config_gpio(pfc, offset,
-                              PINMUX_TYPE_FUNCTION,
-                              GPIO_CFG_REQ) != 0)
-               return -EINVAL;
+               if (cfg->type != PINMUX_TYPE_NONE) {
+                       ret = -EBUSY;
+                       goto done;
+               }
+       }
 
-       return 0;
+       for (i = 0; i < grp->nr_pins; ++i) {
+               ret = sh_pfc_config_mux(pfc, grp->mux[i], PINMUX_TYPE_FUNCTION);
+               if (ret < 0)
+                       break;
+       }
+
+done:
+       spin_unlock_irqrestore(&pfc->lock, flags);
+       return ret;
 }
 
-static int sh_pfc_reconfig_pin(struct sh_pfc *pfc, unsigned offset,
-                              int new_type)
+static void sh_pfc_func_disable(struct pinctrl_dev *pctldev, unsigned selector,
+                               unsigned group)
 {
+       struct sh_pfc_pinctrl *pmx = pinctrl_dev_get_drvdata(pctldev);
+       struct sh_pfc *pfc = pmx->pfc;
+       const struct sh_pfc_pin_group *grp = &pfc->info->groups[group];
        unsigned long flags;
-       int pinmux_type;
-       int ret = -EINVAL;
+       unsigned int i;
 
        spin_lock_irqsave(&pfc->lock, flags);
 
-       pinmux_type = pfc->info->gpios[offset].flags & PINMUX_FLAG_TYPE;
+       for (i = 0; i < grp->nr_pins; ++i) {
+               int idx = sh_pfc_get_pin_index(pfc, grp->pins[i]);
+               struct sh_pfc_pin_config *cfg = &pmx->configs[idx];
 
-       /*
-        * See if the present config needs to first be de-configured.
-        */
-       switch (pinmux_type) {
-       case PINMUX_TYPE_GPIO:
-               break;
-       case PINMUX_TYPE_OUTPUT:
-       case PINMUX_TYPE_INPUT:
-       case PINMUX_TYPE_INPUT_PULLUP:
-       case PINMUX_TYPE_INPUT_PULLDOWN:
-               sh_pfc_config_gpio(pfc, offset, pinmux_type, GPIO_CFG_FREE);
-               break;
-       default:
-               goto err;
+               cfg->type = PINMUX_TYPE_NONE;
        }
 
-       /*
-        * Dry run
-        */
-       if (sh_pfc_config_gpio(pfc, offset, new_type,
-                              GPIO_CFG_DRYRUN) != 0)
-               goto err;
-
-       /*
-        * Request
-        */
-       if (sh_pfc_config_gpio(pfc, offset, new_type,
-                              GPIO_CFG_REQ) != 0)
-               goto err;
-
-       pfc->info->gpios[offset].flags &= ~PINMUX_FLAG_TYPE;
-       pfc->info->gpios[offset].flags |= new_type;
-
-       ret = 0;
-
-err:
        spin_unlock_irqrestore(&pfc->lock, flags);
-
-       return ret;
 }
 
-
 static int sh_pfc_gpio_request_enable(struct pinctrl_dev *pctldev,
                                      struct pinctrl_gpio_range *range,
                                      unsigned offset)
 {
        struct sh_pfc_pinctrl *pmx = pinctrl_dev_get_drvdata(pctldev);
        struct sh_pfc *pfc = pmx->pfc;
+       int idx = sh_pfc_get_pin_index(pfc, offset);
+       struct sh_pfc_pin_config *cfg = &pmx->configs[idx];
        unsigned long flags;
-       int ret, pinmux_type;
+       int ret;
 
        spin_lock_irqsave(&pfc->lock, flags);
 
-       pinmux_type = pfc->info->gpios[offset].flags & PINMUX_FLAG_TYPE;
+       if (cfg->type != PINMUX_TYPE_NONE) {
+               dev_err(pfc->dev,
+                       "Pin %u is busy, can't configure it as GPIO.\n",
+                       offset);
+               ret = -EBUSY;
+               goto done;
+       }
 
-       switch (pinmux_type) {
-       case PINMUX_TYPE_FUNCTION:
-               pr_notice_once("Use of GPIO API for function requests is "
-                              "deprecated, convert to pinctrl\n");
-               /* handle for now */
-               ret = sh_pfc_config_function(pfc, offset);
-               if (unlikely(ret < 0))
-                       goto err;
+       if (!pfc->gpio) {
+               /* If GPIOs are handled externally the pin mux type need to be
+                * set to GPIO here.
+                */
+               const struct sh_pfc_pin *pin = &pfc->info->pins[idx];
 
-               break;
-       case PINMUX_TYPE_GPIO:
-       case PINMUX_TYPE_INPUT:
-       case PINMUX_TYPE_OUTPUT:
-               break;
-       default:
-               pr_err("Unsupported mux type (%d), bailing...\n", pinmux_type);
-               ret = -ENOTSUPP;
-               goto err;
+               ret = sh_pfc_config_mux(pfc, pin->enum_id, PINMUX_TYPE_GPIO);
+               if (ret < 0)
+                       goto done;
        }
 
+       cfg->type = PINMUX_TYPE_GPIO;
+
        ret = 0;
 
-err:
+done:
        spin_unlock_irqrestore(&pfc->lock, flags);
 
        return ret;
@@ -230,15 +209,12 @@ static void sh_pfc_gpio_disable_free(struct pinctrl_dev *pctldev,
 {
        struct sh_pfc_pinctrl *pmx = pinctrl_dev_get_drvdata(pctldev);
        struct sh_pfc *pfc = pmx->pfc;
+       int idx = sh_pfc_get_pin_index(pfc, offset);
+       struct sh_pfc_pin_config *cfg = &pmx->configs[idx];
        unsigned long flags;
-       int pinmux_type;
 
        spin_lock_irqsave(&pfc->lock, flags);
-
-       pinmux_type = pfc->info->gpios[offset].flags & PINMUX_FLAG_TYPE;
-
-       sh_pfc_config_gpio(pfc, offset, pinmux_type, GPIO_CFG_FREE);
-
+       cfg->type = PINMUX_TYPE_NONE;
        spin_unlock_irqrestore(&pfc->lock, flags);
 }
 
@@ -247,207 +223,242 @@ static int sh_pfc_gpio_set_direction(struct pinctrl_dev *pctldev,
                                     unsigned offset, bool input)
 {
        struct sh_pfc_pinctrl *pmx = pinctrl_dev_get_drvdata(pctldev);
-       int type = input ? PINMUX_TYPE_INPUT : PINMUX_TYPE_OUTPUT;
+       struct sh_pfc *pfc = pmx->pfc;
+       int new_type = input ? PINMUX_TYPE_INPUT : PINMUX_TYPE_OUTPUT;
+       int idx = sh_pfc_get_pin_index(pfc, offset);
+       const struct sh_pfc_pin *pin = &pfc->info->pins[idx];
+       struct sh_pfc_pin_config *cfg = &pmx->configs[idx];
+       unsigned long flags;
+       unsigned int dir;
+       int ret;
+
+       /* Check if the requested direction is supported by the pin. Not all SoC
+        * provide pin config data, so perform the check conditionally.
+        */
+       if (pin->configs) {
+               dir = input ? SH_PFC_PIN_CFG_INPUT : SH_PFC_PIN_CFG_OUTPUT;
+               if (!(pin->configs & dir))
+                       return -EINVAL;
+       }
+
+       spin_lock_irqsave(&pfc->lock, flags);
+
+       ret = sh_pfc_config_mux(pfc, pin->enum_id, new_type);
+       if (ret < 0)
+               goto done;
+
+       cfg->type = new_type;
 
-       return sh_pfc_reconfig_pin(pmx->pfc, offset, type);
+done:
+       spin_unlock_irqrestore(&pfc->lock, flags);
+       return ret;
 }
 
-static struct pinmux_ops sh_pfc_pinmux_ops = {
+static const struct pinmux_ops sh_pfc_pinmux_ops = {
        .get_functions_count    = sh_pfc_get_functions_count,
        .get_function_name      = sh_pfc_get_function_name,
        .get_function_groups    = sh_pfc_get_function_groups,
-       .enable                 = sh_pfc_noop_enable,
-       .disable                = sh_pfc_noop_disable,
+       .enable                 = sh_pfc_func_enable,
+       .disable                = sh_pfc_func_disable,
        .gpio_request_enable    = sh_pfc_gpio_request_enable,
        .gpio_disable_free      = sh_pfc_gpio_disable_free,
        .gpio_set_direction     = sh_pfc_gpio_set_direction,
 };
 
-static int sh_pfc_pinconf_get(struct pinctrl_dev *pctldev, unsigned pin,
-                             unsigned long *config)
+/* Check whether the requested parameter is supported for a pin. */
+static bool sh_pfc_pinconf_validate(struct sh_pfc *pfc, unsigned int _pin,
+                                   enum pin_config_param param)
 {
-       struct sh_pfc_pinctrl *pmx = pinctrl_dev_get_drvdata(pctldev);
-       struct sh_pfc *pfc = pmx->pfc;
+       int idx = sh_pfc_get_pin_index(pfc, _pin);
+       const struct sh_pfc_pin *pin = &pfc->info->pins[idx];
 
-       *config = pfc->info->gpios[pin].flags & PINMUX_FLAG_TYPE;
+       switch (param) {
+       case PIN_CONFIG_BIAS_DISABLE:
+               return true;
 
-       return 0;
-}
+       case PIN_CONFIG_BIAS_PULL_UP:
+               return pin->configs & SH_PFC_PIN_CFG_PULL_UP;
 
-static int sh_pfc_pinconf_set(struct pinctrl_dev *pctldev, unsigned pin,
-                             unsigned long config)
-{
-       struct sh_pfc_pinctrl *pmx = pinctrl_dev_get_drvdata(pctldev);
-
-       /* Validate the new type */
-       if (config >= PINMUX_FLAG_TYPE)
-               return -EINVAL;
+       case PIN_CONFIG_BIAS_PULL_DOWN:
+               return pin->configs & SH_PFC_PIN_CFG_PULL_DOWN;
 
-       return sh_pfc_reconfig_pin(pmx->pfc, pin, config);
+       default:
+               return false;
+       }
 }
 
-static void sh_pfc_pinconf_dbg_show(struct pinctrl_dev *pctldev,
-                                   struct seq_file *s, unsigned pin)
+static int sh_pfc_pinconf_get(struct pinctrl_dev *pctldev, unsigned _pin,
+                             unsigned long *config)
 {
-       const char *pinmux_type_str[] = {
-               [PINMUX_TYPE_NONE]              = "none",
-               [PINMUX_TYPE_FUNCTION]          = "function",
-               [PINMUX_TYPE_GPIO]              = "gpio",
-               [PINMUX_TYPE_OUTPUT]            = "output",
-               [PINMUX_TYPE_INPUT]             = "input",
-               [PINMUX_TYPE_INPUT_PULLUP]      = "input bias pull up",
-               [PINMUX_TYPE_INPUT_PULLDOWN]    = "input bias pull down",
-       };
-       unsigned long config;
-       int rc;
-
-       rc = sh_pfc_pinconf_get(pctldev, pin, &config);
-       if (unlikely(rc != 0))
-               return;
-
-       seq_printf(s, " %s", pinmux_type_str[config]);
-}
+       struct sh_pfc_pinctrl *pmx = pinctrl_dev_get_drvdata(pctldev);
+       struct sh_pfc *pfc = pmx->pfc;
+       enum pin_config_param param = pinconf_to_config_param(*config);
+       unsigned long flags;
+       unsigned int bias;
 
-static struct pinconf_ops sh_pfc_pinconf_ops = {
-       .pin_config_get         = sh_pfc_pinconf_get,
-       .pin_config_set         = sh_pfc_pinconf_set,
-       .pin_config_dbg_show    = sh_pfc_pinconf_dbg_show,
-};
+       if (!sh_pfc_pinconf_validate(pfc, _pin, param))
+               return -ENOTSUPP;
 
-static struct pinctrl_gpio_range sh_pfc_gpio_range = {
-       .name           = DRV_NAME,
-       .id             = 0,
-};
+       switch (param) {
+       case PIN_CONFIG_BIAS_DISABLE:
+       case PIN_CONFIG_BIAS_PULL_UP:
+       case PIN_CONFIG_BIAS_PULL_DOWN:
+               if (!pfc->info->ops || !pfc->info->ops->get_bias)
+                       return -ENOTSUPP;
 
-static struct pinctrl_desc sh_pfc_pinctrl_desc = {
-       .name           = DRV_NAME,
-       .owner          = THIS_MODULE,
-       .pctlops        = &sh_pfc_pinctrl_ops,
-       .pmxops         = &sh_pfc_pinmux_ops,
-       .confops        = &sh_pfc_pinconf_ops,
-};
+               spin_lock_irqsave(&pfc->lock, flags);
+               bias = pfc->info->ops->get_bias(pfc, _pin);
+               spin_unlock_irqrestore(&pfc->lock, flags);
 
-static void sh_pfc_map_one_gpio(struct sh_pfc *pfc, struct sh_pfc_pinctrl *pmx,
-                               struct pinmux_gpio *gpio, unsigned offset)
-{
-       struct pinmux_data_reg *dummy;
-       unsigned long flags;
-       int bit;
-
-       gpio->flags &= ~PINMUX_FLAG_TYPE;
+               if (bias != param)
+                       return -EINVAL;
 
-       if (sh_pfc_get_data_reg(pfc, offset, &dummy, &bit) == 0)
-               gpio->flags |= PINMUX_TYPE_GPIO;
-       else {
-               gpio->flags |= PINMUX_TYPE_FUNCTION;
+               *config = 0;
+               break;
 
-               spin_lock_irqsave(&pmx->lock, flags);
-               pmx->nr_functions++;
-               spin_unlock_irqrestore(&pmx->lock, flags);
+       default:
+               return -ENOTSUPP;
        }
+
+       return 0;
 }
 
-/* pinmux ranges -> pinctrl pin descs */
-static int sh_pfc_map_gpios(struct sh_pfc *pfc, struct sh_pfc_pinctrl *pmx)
+static int sh_pfc_pinconf_set(struct pinctrl_dev *pctldev, unsigned _pin,
+                             unsigned long config)
 {
+       struct sh_pfc_pinctrl *pmx = pinctrl_dev_get_drvdata(pctldev);
+       struct sh_pfc *pfc = pmx->pfc;
+       enum pin_config_param param = pinconf_to_config_param(config);
        unsigned long flags;
-       int i;
 
-       pmx->nr_pads = pfc->info->last_gpio - pfc->info->first_gpio + 1;
+       if (!sh_pfc_pinconf_validate(pfc, _pin, param))
+               return -ENOTSUPP;
 
-       pmx->pads = devm_kzalloc(pfc->dev, sizeof(*pmx->pads) * pmx->nr_pads,
-                                GFP_KERNEL);
-       if (unlikely(!pmx->pads)) {
-               pmx->nr_pads = 0;
-               return -ENOMEM;
-       }
+       switch (param) {
+       case PIN_CONFIG_BIAS_PULL_UP:
+       case PIN_CONFIG_BIAS_PULL_DOWN:
+       case PIN_CONFIG_BIAS_DISABLE:
+               if (!pfc->info->ops || !pfc->info->ops->set_bias)
+                       return -ENOTSUPP;
 
-       spin_lock_irqsave(&pfc->lock, flags);
+               spin_lock_irqsave(&pfc->lock, flags);
+               pfc->info->ops->set_bias(pfc, _pin, param);
+               spin_unlock_irqrestore(&pfc->lock, flags);
 
-       /*
-        * We don't necessarily have a 1:1 mapping between pin and linux
-        * GPIO number, as the latter maps to the associated enum_id.
-        * Care needs to be taken to translate back to pin space when
-        * dealing with any pin configurations.
-        */
-       for (i = 0; i < pmx->nr_pads; i++) {
-               struct pinctrl_pin_desc *pin = pmx->pads + i;
-               struct pinmux_gpio *gpio = pfc->info->gpios + i;
+               break;
 
-               pin->number = pfc->info->first_gpio + i;
-               pin->name = gpio->name;
+       default:
+               return -ENOTSUPP;
+       }
 
-               /* XXX */
-               if (unlikely(!gpio->enum_id))
-                       continue;
+       return 0;
+}
 
-               sh_pfc_map_one_gpio(pfc, pmx, gpio, i);
-       }
+static int sh_pfc_pinconf_group_set(struct pinctrl_dev *pctldev, unsigned group,
+                                   unsigned long config)
+{
+       struct sh_pfc_pinctrl *pmx = pinctrl_dev_get_drvdata(pctldev);
+       const unsigned int *pins;
+       unsigned int num_pins;
+       unsigned int i;
 
-       spin_unlock_irqrestore(&pfc->lock, flags);
+       pins = pmx->pfc->info->groups[group].pins;
+       num_pins = pmx->pfc->info->groups[group].nr_pins;
 
-       sh_pfc_pinctrl_desc.pins = pmx->pads;
-       sh_pfc_pinctrl_desc.npins = pmx->nr_pads;
+       for (i = 0; i < num_pins; ++i)
+               sh_pfc_pinconf_set(pctldev, pins[i], config);
 
        return 0;
 }
 
-static int sh_pfc_map_functions(struct sh_pfc *pfc, struct sh_pfc_pinctrl *pmx)
+static const struct pinconf_ops sh_pfc_pinconf_ops = {
+       .is_generic                     = true,
+       .pin_config_get                 = sh_pfc_pinconf_get,
+       .pin_config_set                 = sh_pfc_pinconf_set,
+       .pin_config_group_set           = sh_pfc_pinconf_group_set,
+       .pin_config_config_dbg_show     = pinconf_generic_dump_config,
+};
+
+/* PFC ranges -> pinctrl pin descs */
+static int sh_pfc_map_pins(struct sh_pfc *pfc, struct sh_pfc_pinctrl *pmx)
 {
-       unsigned long flags;
-       int i, fn;
+       const struct pinmux_range *ranges;
+       struct pinmux_range def_range;
+       unsigned int nr_ranges;
+       unsigned int nr_pins;
+       unsigned int i;
+
+       if (pfc->info->ranges == NULL) {
+               def_range.begin = 0;
+               def_range.end = pfc->info->nr_pins - 1;
+               ranges = &def_range;
+               nr_ranges = 1;
+       } else {
+               ranges = pfc->info->ranges;
+               nr_ranges = pfc->info->nr_ranges;
+       }
 
-       pmx->functions = devm_kzalloc(pfc->dev, pmx->nr_functions *
-                                     sizeof(*pmx->functions), GFP_KERNEL);
-       if (unlikely(!pmx->functions))
+       pmx->pins = devm_kzalloc(pfc->dev,
+                                sizeof(*pmx->pins) * pfc->info->nr_pins,
+                                GFP_KERNEL);
+       if (unlikely(!pmx->pins))
                return -ENOMEM;
 
-       spin_lock_irqsave(&pmx->lock, flags);
-
-       for (i = fn = 0; i < pmx->nr_pads; i++) {
-               struct pinmux_gpio *gpio = pfc->info->gpios + i;
+       pmx->configs = devm_kzalloc(pfc->dev,
+                                   sizeof(*pmx->configs) * pfc->info->nr_pins,
+                                   GFP_KERNEL);
+       if (unlikely(!pmx->configs))
+               return -ENOMEM;
 
-               if ((gpio->flags & PINMUX_FLAG_TYPE) == PINMUX_TYPE_FUNCTION)
-                       pmx->functions[fn++] = gpio;
+       for (i = 0, nr_pins = 0; i < nr_ranges; ++i) {
+               const struct pinmux_range *range = &ranges[i];
+               unsigned int number;
+
+               for (number = range->begin; number <= range->end;
+                    number++, nr_pins++) {
+                       struct sh_pfc_pin_config *cfg = &pmx->configs[nr_pins];
+                       struct pinctrl_pin_desc *pin = &pmx->pins[nr_pins];
+                       const struct sh_pfc_pin *info =
+                               &pfc->info->pins[nr_pins];
+
+                       pin->number = number;
+                       pin->name = info->name;
+                       cfg->type = PINMUX_TYPE_NONE;
+               }
        }
 
-       spin_unlock_irqrestore(&pmx->lock, flags);
+       pfc->nr_pins = ranges[nr_ranges-1].end + 1;
 
-       return 0;
+       return nr_ranges;
 }
 
 int sh_pfc_register_pinctrl(struct sh_pfc *pfc)
 {
        struct sh_pfc_pinctrl *pmx;
-       int ret;
+       int nr_ranges;
 
        pmx = devm_kzalloc(pfc->dev, sizeof(*pmx), GFP_KERNEL);
        if (unlikely(!pmx))
                return -ENOMEM;
 
-       spin_lock_init(&pmx->lock);
-
        pmx->pfc = pfc;
        pfc->pinctrl = pmx;
 
-       ret = sh_pfc_map_gpios(pfc, pmx);
-       if (unlikely(ret != 0))
-               return ret;
+       nr_ranges = sh_pfc_map_pins(pfc, pmx);
+       if (unlikely(nr_ranges < 0))
+               return nr_ranges;
 
-       ret = sh_pfc_map_functions(pfc, pmx);
-       if (unlikely(ret != 0))
-               return ret;
+       pmx->pctl_desc.name = DRV_NAME;
+       pmx->pctl_desc.owner = THIS_MODULE;
+       pmx->pctl_desc.pctlops = &sh_pfc_pinctrl_ops;
+       pmx->pctl_desc.pmxops = &sh_pfc_pinmux_ops;
+       pmx->pctl_desc.confops = &sh_pfc_pinconf_ops;
+       pmx->pctl_desc.pins = pmx->pins;
+       pmx->pctl_desc.npins = pfc->info->nr_pins;
 
-       pmx->pctl = pinctrl_register(&sh_pfc_pinctrl_desc, pfc->dev, pmx);
-       if (IS_ERR(pmx->pctl))
-               return PTR_ERR(pmx->pctl);
-
-       sh_pfc_gpio_range.npins = pfc->info->last_gpio
-                               - pfc->info->first_gpio + 1;
-       sh_pfc_gpio_range.base = pfc->info->first_gpio;
-       sh_pfc_gpio_range.pin_base = pfc->info->first_gpio;
-
-       pinctrl_add_gpio_range(pmx->pctl, &sh_pfc_gpio_range);
+       pmx->pctl = pinctrl_register(&pmx->pctl_desc, pfc->dev, pmx);
+       if (pmx->pctl == NULL)
+               return -EINVAL;
 
        return 0;
 }
index 13049c4c8d309b3430c45ed15150676191e6acf0..3b785fc428d5b1c9211c19fbceb0f763a721e385 100644 (file)
@@ -15,7 +15,8 @@
 #include <asm-generic/gpio.h>
 
 typedef unsigned short pinmux_enum_t;
-typedef unsigned short pinmux_flag_t;
+
+#define SH_PFC_MARK_INVALID    ((pinmux_enum_t)-1)
 
 enum {
        PINMUX_TYPE_NONE,
@@ -30,44 +31,81 @@ enum {
        PINMUX_FLAG_TYPE,       /* must be last */
 };
 
-#define PINMUX_FLAG_DBIT_SHIFT      5
-#define PINMUX_FLAG_DBIT            (0x1f << PINMUX_FLAG_DBIT_SHIFT)
-#define PINMUX_FLAG_DREG_SHIFT      10
-#define PINMUX_FLAG_DREG            (0x3f << PINMUX_FLAG_DREG_SHIFT)
+#define SH_PFC_PIN_CFG_INPUT           (1 << 0)
+#define SH_PFC_PIN_CFG_OUTPUT          (1 << 1)
+#define SH_PFC_PIN_CFG_PULL_UP         (1 << 2)
+#define SH_PFC_PIN_CFG_PULL_DOWN       (1 << 3)
 
-struct pinmux_gpio {
-       pinmux_enum_t enum_id;
-       pinmux_flag_t flags;
+struct sh_pfc_pin {
+       const pinmux_enum_t enum_id;
        const char *name;
+       unsigned int configs;
 };
 
-#define PINMUX_GPIO(gpio, data_or_mark) \
-       [gpio] = { .name = __stringify(gpio), .enum_id = data_or_mark, .flags = PINMUX_TYPE_NONE }
+#define SH_PFC_PIN_GROUP(n)                            \
+       {                                               \
+               .name = #n,                             \
+               .pins = n##_pins,                       \
+               .mux = n##_mux,                         \
+               .nr_pins = ARRAY_SIZE(n##_pins),        \
+       }
+
+struct sh_pfc_pin_group {
+       const char *name;
+       const unsigned int *pins;
+       const unsigned int *mux;
+       unsigned int nr_pins;
+};
+
+#define SH_PFC_FUNCTION(n)                             \
+       {                                               \
+               .name = #n,                             \
+               .groups = n##_groups,                   \
+               .nr_groups = ARRAY_SIZE(n##_groups),    \
+       }
+
+struct sh_pfc_function {
+       const char *name;
+       const char * const *groups;
+       unsigned int nr_groups;
+};
+
+struct pinmux_func {
+       const pinmux_enum_t enum_id;
+       const char *name;
+};
+
+#define PINMUX_GPIO(gpio, data_or_mark)                        \
+       [gpio] = {                                      \
+               .name = __stringify(gpio),              \
+               .enum_id = data_or_mark,                \
+       }
+#define PINMUX_GPIO_FN(gpio, base, data_or_mark)       \
+       [gpio - (base)] = {                             \
+               .name = __stringify(gpio),              \
+               .enum_id = data_or_mark,                \
+       }
 
 #define PINMUX_DATA(data_or_mark, ids...) data_or_mark, ids, 0
 
 struct pinmux_cfg_reg {
        unsigned long reg, reg_width, field_width;
-       unsigned long *cnt;
-       pinmux_enum_t *enum_ids;
-       unsigned long *var_field_width;
+       const pinmux_enum_t *enum_ids;
+       const unsigned long *var_field_width;
 };
 
 #define PINMUX_CFG_REG(name, r, r_width, f_width) \
        .reg = r, .reg_width = r_width, .field_width = f_width,         \
-       .cnt = (unsigned long [r_width / f_width]) {}, \
        .enum_ids = (pinmux_enum_t [(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, \
-       .cnt = (unsigned long [r_width]) {}, \
        .var_field_width = (unsigned long [r_width]) { var_fw0, var_fwn, 0 }, \
        .enum_ids = (pinmux_enum_t [])
 
 struct pinmux_data_reg {
-       unsigned long reg, reg_width, reg_shadow;
-       pinmux_enum_t *enum_ids;
-       void __iomem *mapped_reg;
+       unsigned long reg, reg_width;
+       const pinmux_enum_t *enum_ids;
 };
 
 #define PINMUX_DATA_REG(name, r, r_width) \
@@ -76,11 +114,11 @@ struct pinmux_data_reg {
 
 struct pinmux_irq {
        int irq;
-       pinmux_enum_t *enum_ids;
+       unsigned short *gpios;
 };
 
 #define PINMUX_IRQ(irq_nr, ids...)                        \
-       { .irq = irq_nr, .enum_ids = (pinmux_enum_t []) { ids, 0 } }    \
+       { .irq = irq_nr, .gpios = (unsigned short []) { ids, 0 } }      \
 
 struct pinmux_range {
        pinmux_enum_t begin;
@@ -88,33 +126,49 @@ struct pinmux_range {
        pinmux_enum_t force;
 };
 
+struct sh_pfc;
+
+struct sh_pfc_soc_operations {
+       unsigned int (*get_bias)(struct sh_pfc *pfc, unsigned int pin);
+       void (*set_bias)(struct sh_pfc *pfc, unsigned int pin,
+                        unsigned int bias);
+};
+
 struct sh_pfc_soc_info {
-       char *name;
-       pinmux_enum_t reserved_id;
-       struct pinmux_range data;
+       const char *name;
+       const struct sh_pfc_soc_operations *ops;
+
        struct pinmux_range input;
        struct pinmux_range input_pd;
        struct pinmux_range input_pu;
        struct pinmux_range output;
-       struct pinmux_range mark;
        struct pinmux_range function;
 
-       unsigned first_gpio, last_gpio;
+       const struct sh_pfc_pin *pins;
+       unsigned int nr_pins;
+       const struct pinmux_range *ranges;
+       unsigned int nr_ranges;
+       const struct sh_pfc_pin_group *groups;
+       unsigned int nr_groups;
+       const struct sh_pfc_function *functions;
+       unsigned int nr_functions;
+
+       const struct pinmux_func *func_gpios;
+       unsigned int nr_func_gpios;
 
-       struct pinmux_gpio *gpios;
-       struct pinmux_cfg_reg *cfg_regs;
-       struct pinmux_data_reg *data_regs;
+       const struct pinmux_cfg_reg *cfg_regs;
+       const struct pinmux_data_reg *data_regs;
 
-       pinmux_enum_t *gpio_data;
+       const pinmux_enum_t *gpio_data;
        unsigned int gpio_data_size;
 
-       struct pinmux_irq *gpio_irq;
+       const struct pinmux_irq *gpio_irq;
        unsigned int gpio_irq_size;
 
        unsigned long unlock_reg;
 };
 
-enum { GPIO_CFG_DRYRUN, GPIO_CFG_REQ, GPIO_CFG_FREE };
+enum { GPIO_CFG_REQ, GPIO_CFG_FREE };
 
 /* helper macro for port */
 #define PORT_1(fn, pfx, sfx) fn(pfx, sfx)
@@ -126,6 +180,23 @@ enum { GPIO_CFG_DRYRUN, GPIO_CFG_REQ, GPIO_CFG_FREE };
        PORT_1(fn, pfx##6, sfx), PORT_1(fn, pfx##7, sfx),       \
        PORT_1(fn, pfx##8, sfx), PORT_1(fn, pfx##9, sfx)
 
+#define PORT_10_REV(fn, pfx, sfx)      \
+       PORT_1(fn, pfx##9, sfx), PORT_1(fn, pfx##8, sfx),       \
+       PORT_1(fn, pfx##7, sfx), PORT_1(fn, pfx##6, sfx),       \
+       PORT_1(fn, pfx##5, sfx), PORT_1(fn, pfx##4, sfx),       \
+       PORT_1(fn, pfx##3, sfx), PORT_1(fn, pfx##2, sfx),       \
+       PORT_1(fn, pfx##1, sfx), PORT_1(fn, pfx##0, sfx)
+
+#define PORT_32(fn, pfx, sfx)                                  \
+       PORT_10(fn, pfx, sfx), PORT_10(fn, pfx##1, sfx),        \
+       PORT_10(fn, pfx##2, sfx), PORT_1(fn, pfx##30, sfx),     \
+       PORT_1(fn, pfx##31, sfx)
+
+#define PORT_32_REV(fn, pfx, sfx)                                      \
+       PORT_1(fn, pfx##31, sfx), PORT_1(fn, pfx##30, sfx),             \
+       PORT_10_REV(fn, pfx##2, sfx), PORT_10_REV(fn, pfx##1, sfx),     \
+       PORT_10_REV(fn, pfx, sfx)
+
 #define PORT_90(fn, pfx, sfx) \
        PORT_10(fn, pfx##1, sfx), PORT_10(fn, pfx##2, sfx),     \
        PORT_10(fn, pfx##3, sfx), PORT_10(fn, pfx##4, sfx),     \
@@ -137,7 +208,7 @@ enum { GPIO_CFG_DRYRUN, GPIO_CFG_REQ, GPIO_CFG_FREE };
 #define _GPIO_PORT(pfx, sfx) PINMUX_GPIO(GPIO_PORT##pfx, PORT##pfx##_DATA)
 #define PORT_ALL(str)  CPU_ALL_PORT(_PORT_ALL, PORT, str)
 #define GPIO_PORT_ALL()        CPU_ALL_PORT(_GPIO_PORT, , unused)
-#define GPIO_FN(str) PINMUX_GPIO(GPIO_FN_##str, str##_MARK)
+#define GPIO_FN(str) PINMUX_GPIO_FN(GPIO_FN_##str, PINMUX_FN_BASE, str##_MARK)
 
 /* helper macro for pinmux_enum_t */
 #define PORT_DATA_I(nr)        \
index 295b349a05cf6deef7f05853c553f42018fcf0dc..a4908ecd74fb7645d62763e3bd8578678e56c48a 100644 (file)
 #include <linux/io.h>
 #include <linux/irq.h>
 #include <linux/irqdomain.h>
+#include <linux/irqchip/chained_irq.h>
 #include <linux/module.h>
 #include <linux/pinctrl/consumer.h>
 #include <linux/platform_device.h>
 #include <linux/pm.h>
 #include <linux/spinlock.h>
-#include <asm/mach/irq.h>
 
 #define MAX_GPIO_PER_REG               32
 #define PIN_OFFSET(pin)                        (pin % MAX_GPIO_PER_REG)
index 6a7dae70db081b04255c588dd45fd07e0fa2458c..116da0412c4b7af55b36d25663f9f762995c0334 100644 (file)
@@ -198,7 +198,7 @@ static void spear_pinctrl_dt_free_map(struct pinctrl_dev *pctldev,
        kfree(map);
 }
 
-static struct pinctrl_ops spear_pinctrl_ops = {
+static const struct pinctrl_ops spear_pinctrl_ops = {
        .get_groups_count = spear_pinctrl_get_groups_cnt,
        .get_group_name = spear_pinctrl_get_group_name,
        .get_group_pins = spear_pinctrl_get_group_pins,
@@ -340,7 +340,7 @@ static void gpio_disable_free(struct pinctrl_dev *pctldev,
        gpio_request_endisable(pctldev, range, offset, false);
 }
 
-static struct pinmux_ops spear_pinmux_ops = {
+static const struct pinmux_ops spear_pinmux_ops = {
        .get_functions_count = spear_pinctrl_get_funcs_count,
        .get_function_name = spear_pinctrl_get_func_name,
        .get_function_groups = spear_pinctrl_get_func_groups,
index 04b8320d6579ceaf60caef73cf36edb2e96b3cfb..148f98e9aaf7aa31fbefd7d73a78e444b3793bd3 100644 (file)
@@ -26,8 +26,8 @@
 #include <linux/clk.h>
 #include <linux/list.h>
 #include <linux/irq.h>
+#include <linux/irqchip/chained_irq.h>
 #include <linux/of_device.h>
-#include <asm/mach/irq.h>
 
 #include "imx-ipu-v3.h"
 #include "ipu-prv.h"
index 27cfda427dd9106b15af57c3ad4825445a4b8feb..192d6d1771ee8588bd10eff21ea1da168cba758f 100644 (file)
@@ -332,15 +332,23 @@ extern int clocksource_mmio_init(void __iomem *, const char *,
 
 extern int clocksource_i8253_init(void);
 
+struct device_node;
+typedef void(*clocksource_of_init_fn)(struct device_node *);
 #ifdef CONFIG_CLKSRC_OF
 extern void clocksource_of_init(void);
 
 #define CLOCKSOURCE_OF_DECLARE(name, compat, fn)                       \
        static const struct of_device_id __clksrc_of_table_##name       \
                __used __section(__clksrc_of_table)                     \
-                = { .compatible = compat, .data = fn };
+                = { .compatible = compat,                              \
+                    .data = (fn == (clocksource_of_init_fn)NULL) ? fn : fn }
 #else
-#define CLOCKSOURCE_OF_DECLARE(name, compat, fn)
+static inline void clocksource_of_init(void) {}
+#define CLOCKSOURCE_OF_DECLARE(name, compat, fn)                       \
+       static const struct of_device_id __clksrc_of_table_##name       \
+               __attribute__((unused))                                 \
+                = { .compatible = compat,                              \
+                    .data = (fn == (clocksource_of_init_fn)NULL) ? fn : fn }
 #endif
 
 #endif /* _LINUX_CLOCKSOURCE_H */
index 3fd8e4290a1cc7f9f421e710966bcd5aaf62d727..3e203eb23cc79231f96ae50e1fb56da9cf4125ad 100644 (file)
@@ -65,7 +65,6 @@ extern struct irq_chip gic_arch_extn;
 
 void gic_init_bases(unsigned int, int, void __iomem *, void __iomem *,
                    u32 offset, struct device_node *);
-void gic_secondary_init(unsigned int);
 void gic_cascade_irq(unsigned int gic_nr, unsigned int irq);
 
 static inline void gic_init(unsigned int nr, int start,
diff --git a/include/linux/irqchip/chained_irq.h b/include/linux/irqchip/chained_irq.h
new file mode 100644 (file)
index 0000000..adf4c30
--- /dev/null
@@ -0,0 +1,52 @@
+/*
+ * Chained IRQ handlers support.
+ *
+ * Copyright (C) 2011 ARM Ltd.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * 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, see <http://www.gnu.org/licenses/>.
+ */
+#ifndef __IRQCHIP_CHAINED_IRQ_H
+#define __IRQCHIP_CHAINED_IRQ_H
+
+#include <linux/irq.h>
+
+/*
+ * Entry/exit functions for chained handlers where the primary IRQ chip
+ * may implement either fasteoi or level-trigger flow control.
+ */
+static inline void chained_irq_enter(struct irq_chip *chip,
+                                    struct irq_desc *desc)
+{
+       /* FastEOI controllers require no action on entry. */
+       if (chip->irq_eoi)
+               return;
+
+       if (chip->irq_mask_ack) {
+               chip->irq_mask_ack(&desc->irq_data);
+       } else {
+               chip->irq_mask(&desc->irq_data);
+               if (chip->irq_ack)
+                       chip->irq_ack(&desc->irq_data);
+       }
+}
+
+static inline void chained_irq_exit(struct irq_chip *chip,
+                                   struct irq_desc *desc)
+{
+       if (chip->irq_eoi)
+               chip->irq_eoi(&desc->irq_data);
+       else
+               chip->irq_unmask(&desc->irq_data);
+}
+
+#endif /* __IRQCHIP_CHAINED_IRQ_H */
index 778804df293f675e505011d0b64b824c2962eae2..2c2a9e8d8578310e453776e6668e9b6a915ac2c2 100644 (file)
@@ -118,9 +118,9 @@ struct pinctrl_desc {
        const char *name;
        struct pinctrl_pin_desc const *pins;
        unsigned int npins;
-       struct pinctrl_ops *pctlops;
-       struct pinmux_ops *pmxops;
-       struct pinconf_ops *confops;
+       const struct pinctrl_ops *pctlops;
+       const struct pinmux_ops *pmxops;
+       const struct pinconf_ops *confops;
        struct module *owner;
 };
 
diff --git a/include/linux/platform_data/gpio-rcar.h b/include/linux/platform_data/gpio-rcar.h
new file mode 100644 (file)
index 0000000..b253f77
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Renesas R-Car GPIO Support
+ *
+ *  Copyright (C) 2013 Magnus Damm
+ *
+ * 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
+ *
+ * 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 __GPIO_RCAR_H__
+#define __GPIO_RCAR_H__
+
+struct gpio_rcar_config {
+       unsigned int gpio_base;
+       unsigned int irq_base;
+       unsigned int number_of_pins;
+       const char *pctl_name;
+};
+
+#endif /* __GPIO_RCAR_H__ */
diff --git a/include/linux/platform_data/irq-renesas-intc-irqpin.h b/include/linux/platform_data/irq-renesas-intc-irqpin.h
new file mode 100644 (file)
index 0000000..e4cb911
--- /dev/null
@@ -0,0 +1,29 @@
+/*
+ * Renesas INTC External IRQ Pin Driver
+ *
+ *  Copyright (C) 2013 Magnus Damm
+ *
+ * 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
+ *
+ * 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
+ */
+
+#ifndef __IRQ_RENESAS_INTC_IRQPIN_H__
+#define __IRQ_RENESAS_INTC_IRQPIN_H__
+
+struct renesas_intc_irqpin_config {
+       unsigned int sense_bitfield_width;
+       unsigned int irq_base;
+       bool control_parent;
+};
+
+#endif /* __IRQ_RENESAS_INTC_IRQPIN_H__ */
diff --git a/include/linux/platform_data/irq-renesas-irqc.h b/include/linux/platform_data/irq-renesas-irqc.h
new file mode 100644 (file)
index 0000000..3ae17b3
--- /dev/null
@@ -0,0 +1,27 @@
+/*
+ * Renesas IRQC Driver
+ *
+ *  Copyright (C) 2013 Magnus Damm
+ *
+ * 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
+ *
+ * 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
+ */
+
+#ifndef __IRQ_RENESAS_IRQC_H__
+#define __IRQ_RENESAS_IRQC_H__
+
+struct renesas_irqc_config {
+       unsigned int irq_base;
+};
+
+#endif /* __IRQ_RENESAS_IRQC_H__ */