Merge branch 'omap/pm-voltdomain-cleanup' into next/soc
authorArnd Bergmann <arnd@arndb.de>
Thu, 20 Jun 2013 15:35:16 +0000 (17:35 +0200)
committerArnd Bergmann <arnd@arndb.de>
Thu, 20 Jun 2013 15:35:16 +0000 (17:35 +0200)
Conflicts:
arch/arm/mach-omap2/Makefile
arch/arm/mach-omap2/io.c

Signed-off-by: Arnd Bergmann <arnd@arndb.de>
397 files changed:
Documentation/arm/sunxi/README
Documentation/devicetree/bindings/arm/cci.txt [new file with mode: 0644]
Documentation/devicetree/bindings/arm/keystone/keystone.txt [new file with mode: 0644]
Documentation/devicetree/bindings/arm/rtsm-dcscb.txt [new file with mode: 0644]
Documentation/devicetree/bindings/arm/ste-u300.txt [new file with mode: 0644]
Documentation/devicetree/bindings/clock/imx5-clock.txt
Documentation/devicetree/bindings/clock/imx6q-clock.txt
Documentation/devicetree/bindings/clock/imx6sl-clock.txt [new file with mode: 0644]
Documentation/devicetree/bindings/clock/ste-u300-syscon-clock.txt [new file with mode: 0644]
Documentation/devicetree/bindings/clock/vf610-clock.txt [new file with mode: 0644]
Documentation/devicetree/bindings/clock/zynq-7000.txt
Documentation/devicetree/bindings/dma/ste-coh901318.txt [new file with mode: 0644]
Documentation/devicetree/bindings/gpio/gpio-clps711x.txt [new file with mode: 0644]
Documentation/devicetree/bindings/gpio/gpio-stericsson-coh901.txt [new file with mode: 0644]
Documentation/devicetree/bindings/i2c/i2c-st-ddci2c.txt [new file with mode: 0644]
Documentation/devicetree/bindings/interrupt-controller/allwinner,sun4i-ic.txt
Documentation/devicetree/bindings/interrupt-controller/sunxi/sun4i-a10.txt [new file with mode: 0644]
Documentation/devicetree/bindings/interrupt-controller/sunxi/sun5i-a13.txt [new file with mode: 0644]
Documentation/devicetree/bindings/pci/mvebu-pci.txt [new file with mode: 0644]
Documentation/devicetree/bindings/pci/pci.txt [new file with mode: 0644]
Documentation/devicetree/bindings/pci/v3-v360epc-pci.txt [new file with mode: 0644]
Documentation/devicetree/bindings/timer/stericsson-u300-apptimer.txt [new file with mode: 0644]
Documentation/devicetree/bindings/vendor-prefixes.txt
Documentation/devicetree/bindings/watchdog/stericsson-coh901327.txt [new file with mode: 0644]
arch/arm/Kconfig
arch/arm/Kconfig-nommu
arch/arm/Kconfig.debug
arch/arm/Makefile
arch/arm/boot/dts/Makefile
arch/arm/boot/dts/armada-370-xp.dtsi
arch/arm/boot/dts/armada-xp-mv78460.dtsi
arch/arm/boot/dts/armada-xp.dtsi
arch/arm/boot/dts/integratorap.dts
arch/arm/boot/dts/keystone.dts [new file with mode: 0644]
arch/arm/boot/dts/kirkwood-6281.dtsi
arch/arm/boot/dts/kirkwood-6282.dtsi
arch/arm/boot/dts/kirkwood-db-88f6281.dts [new file with mode: 0644]
arch/arm/boot/dts/kirkwood-db-88f6282.dts [new file with mode: 0644]
arch/arm/boot/dts/kirkwood-db.dtsi [new file with mode: 0644]
arch/arm/boot/dts/kirkwood-iconnect.dts
arch/arm/boot/dts/kirkwood-mplcec4.dts
arch/arm/boot/dts/kirkwood-netgear_readynas_duo_v2.dts
arch/arm/boot/dts/kirkwood-nsa310.dts
arch/arm/boot/dts/kirkwood-ts219-6281.dts
arch/arm/boot/dts/kirkwood-ts219-6282.dts
arch/arm/boot/dts/kirkwood-ts219.dtsi
arch/arm/boot/dts/kirkwood.dtsi
arch/arm/boot/dts/ste-u300.dts [new file with mode: 0644]
arch/arm/boot/dts/zynq-7000.dtsi
arch/arm/boot/dts/zynq-zc702.dts
arch/arm/common/Kconfig
arch/arm/common/Makefile
arch/arm/common/edma.c [moved from arch/arm/mach-davinci/dma.c with 97% similarity]
arch/arm/configs/clps711x_defconfig
arch/arm/configs/imx_v6_v7_defconfig
arch/arm/configs/keystone_defconfig [new file with mode: 0644]
arch/arm/configs/kirkwood_defconfig
arch/arm/configs/multi_v7_defconfig
arch/arm/configs/mvebu_defconfig
arch/arm/configs/u300_defconfig
arch/arm/include/asm/assembler.h
arch/arm/include/asm/cp15.h
arch/arm/include/asm/cputype.h
arch/arm/include/asm/glue-cache.h
arch/arm/include/asm/glue-df.h
arch/arm/include/asm/glue-proc.h
arch/arm/include/asm/hardware/pci_v3.h [deleted file]
arch/arm/include/asm/irqflags.h
arch/arm/include/asm/mach/arch.h
arch/arm/include/asm/mach/pci.h
arch/arm/include/asm/psci.h
arch/arm/include/asm/ptrace.h
arch/arm/include/asm/system_info.h
arch/arm/include/asm/v7m.h [new file with mode: 0644]
arch/arm/include/debug/imx-uart.h
arch/arm/include/debug/keystone.S [new file with mode: 0644]
arch/arm/include/debug/mvebu.S
arch/arm/include/debug/u300.S [moved from arch/arm/mach-u300/include/mach/debug-macro.S with 78% similarity]
arch/arm/include/uapi/asm/ptrace.h
arch/arm/kernel/Makefile
arch/arm/kernel/bios32.c
arch/arm/kernel/entry-common.S
arch/arm/kernel/entry-header.S
arch/arm/kernel/entry-v7m.S [new file with mode: 0644]
arch/arm/kernel/head-nommu.S
arch/arm/kernel/psci.c
arch/arm/kernel/psci_smp.c [new file with mode: 0644]
arch/arm/kernel/setup.c
arch/arm/kernel/traps.c
arch/arm/mach-clps711x/Kconfig
arch/arm/mach-clps711x/Makefile
arch/arm/mach-clps711x/board-autcpu12.c
arch/arm/mach-clps711x/board-cdb89712.c
arch/arm/mach-clps711x/board-clep7312.c
arch/arm/mach-clps711x/board-edb7211.c
arch/arm/mach-clps711x/board-fortunet.c
arch/arm/mach-clps711x/board-p720t.c
arch/arm/mach-clps711x/common.c
arch/arm/mach-clps711x/common.h
arch/arm/mach-clps711x/devices.c [new file with mode: 0644]
arch/arm/mach-clps711x/devices.h [new file with mode: 0644]
arch/arm/mach-clps711x/include/mach/autcpu12.h [deleted file]
arch/arm/mach-clps711x/include/mach/clps711x.h
arch/arm/mach-clps711x/include/mach/hardware.h
arch/arm/mach-clps711x/include/mach/memory.h [deleted file]
arch/arm/mach-clps711x/include/mach/syspld.h [deleted file]
arch/arm/mach-davinci/Makefile
arch/arm/mach-davinci/board-tnetv107x-evm.c
arch/arm/mach-davinci/davinci.h
arch/arm/mach-davinci/devices-tnetv107x.c
arch/arm/mach-davinci/devices.c
arch/arm/mach-davinci/dm355.c
arch/arm/mach-davinci/dm365.c
arch/arm/mach-davinci/dm644x.c
arch/arm/mach-davinci/dm646x.c
arch/arm/mach-davinci/include/mach/cp_intc.h
arch/arm/mach-davinci/include/mach/da8xx.h
arch/arm/mach-davinci/include/mach/tnetv107x.h
arch/arm/mach-dove/Kconfig
arch/arm/mach-dove/board-dt.c
arch/arm/mach-dove/common.c
arch/arm/mach-imx/Kconfig
arch/arm/mach-imx/Makefile
arch/arm/mach-imx/clk-imx51-imx53.c
arch/arm/mach-imx/clk-imx6q.c
arch/arm/mach-imx/clk-imx6sl.c [new file with mode: 0644]
arch/arm/mach-imx/clk-pllv3.c
arch/arm/mach-imx/clk-vf610.c [new file with mode: 0644]
arch/arm/mach-imx/clk.c
arch/arm/mach-imx/clk.h
arch/arm/mach-imx/common.h
arch/arm/mach-imx/hardware.h
arch/arm/mach-imx/imx25-dt.c
arch/arm/mach-imx/imx27-dt.c
arch/arm/mach-imx/imx31-dt.c
arch/arm/mach-imx/imx51-dt.c
arch/arm/mach-imx/irq-common.c
arch/arm/mach-imx/mach-imx53.c
arch/arm/mach-imx/mach-imx6q.c
arch/arm/mach-imx/mach-imx6sl.c [new file with mode: 0644]
arch/arm/mach-imx/mach-pca100.c
arch/arm/mach-imx/mach-vf610.c [new file with mode: 0644]
arch/arm/mach-imx/mm-imx1.c
arch/arm/mach-imx/mm-imx21.c
arch/arm/mach-imx/mm-imx25.c
arch/arm/mach-imx/mm-imx27.c
arch/arm/mach-imx/mm-imx3.c
arch/arm/mach-imx/mm-imx5.c
arch/arm/mach-imx/system.c
arch/arm/mach-imx/ulpi.c [deleted file]
arch/arm/mach-imx/ulpi.h
arch/arm/mach-integrator/Makefile
arch/arm/mach-integrator/include/mach/platform.h
arch/arm/mach-integrator/integrator_ap.c
arch/arm/mach-integrator/pci.c [deleted file]
arch/arm/mach-integrator/pci_v3.c
arch/arm/mach-integrator/pci_v3.h [new file with mode: 0644]
arch/arm/mach-keystone/Kconfig [new file with mode: 0644]
arch/arm/mach-keystone/Makefile [new file with mode: 0644]
arch/arm/mach-keystone/Makefile.boot [new file with mode: 0644]
arch/arm/mach-keystone/keystone.c [new file with mode: 0644]
arch/arm/mach-keystone/keystone.h [new file with mode: 0644]
arch/arm/mach-keystone/platsmp.c [new file with mode: 0644]
arch/arm/mach-kirkwood/Kconfig
arch/arm/mach-kirkwood/Makefile
arch/arm/mach-kirkwood/board-db88f628x-bp.c [new file with mode: 0644]
arch/arm/mach-kirkwood/board-dt.c
arch/arm/mach-kirkwood/board-iconnect.c
arch/arm/mach-kirkwood/board-mplcec4.c
arch/arm/mach-kirkwood/board-nsa310.c [deleted file]
arch/arm/mach-kirkwood/board-readynas.c
arch/arm/mach-kirkwood/common.c
arch/arm/mach-kirkwood/common.h
arch/arm/mach-kirkwood/db88f6281-bp-setup.c [deleted file]
arch/arm/mach-kirkwood/include/mach/bridge-regs.h
arch/arm/mach-kirkwood/pcie.c
arch/arm/mach-mvebu/Kconfig
arch/arm/mach-mvebu/armada-370-xp.c
arch/arm/mach-mvebu/armada-370-xp.h
arch/arm/mach-mvebu/coherency.c
arch/arm/mach-mvebu/coherency.h
arch/arm/mach-mvebu/common.h
arch/arm/mach-mvebu/headsmp.S
arch/arm/mach-mvebu/platsmp.c
arch/arm/mach-omap2/Kconfig
arch/arm/mach-omap2/Makefile
arch/arm/mach-omap2/am33xx.h
arch/arm/mach-omap2/board-generic.c
arch/arm/mach-omap2/cclock33xx_data.c
arch/arm/mach-omap2/cclock3xxx_data.c
arch/arm/mach-omap2/clockdomain.h
arch/arm/mach-omap2/clockdomains54xx_data.c [new file with mode: 0644]
arch/arm/mach-omap2/cm-regbits-54xx.h [new file with mode: 0644]
arch/arm/mach-omap2/cm1_44xx.h
arch/arm/mach-omap2/cm1_54xx.h [new file with mode: 0644]
arch/arm/mach-omap2/cm2_44xx.h
arch/arm/mach-omap2/cm2_54xx.h [new file with mode: 0644]
arch/arm/mach-omap2/cm33xx.h
arch/arm/mach-omap2/cm_44xx_54xx.h [new file with mode: 0644]
arch/arm/mach-omap2/common.h
arch/arm/mach-omap2/control.h
arch/arm/mach-omap2/id.c
arch/arm/mach-omap2/io.c
arch/arm/mach-omap2/omap-headsmp.S
arch/arm/mach-omap2/omap-mpuss-lowpower.c
arch/arm/mach-omap2/omap-smp.c
arch/arm/mach-omap2/omap4-common.c
arch/arm/mach-omap2/omap4-restart.c [new file with mode: 0644]
arch/arm/mach-omap2/omap_hwmod.h
arch/arm/mach-omap2/omap_hwmod_33xx_data.c
arch/arm/mach-omap2/omap_hwmod_54xx_data.c [new file with mode: 0644]
arch/arm/mach-omap2/pm44xx.c
arch/arm/mach-omap2/powerdomain.h
arch/arm/mach-omap2/powerdomains3xxx_data.c
arch/arm/mach-omap2/powerdomains54xx_data.c [new file with mode: 0644]
arch/arm/mach-omap2/prcm-common.h
arch/arm/mach-omap2/prcm44xx.h
arch/arm/mach-omap2/prcm_mpu44xx.h
arch/arm/mach-omap2/prcm_mpu54xx.h [new file with mode: 0644]
arch/arm/mach-omap2/prcm_mpu_44xx_54xx.h [new file with mode: 0644]
arch/arm/mach-omap2/prm-regbits-54xx.h [new file with mode: 0644]
arch/arm/mach-omap2/prm44xx.h
arch/arm/mach-omap2/prm44xx_54xx.h [new file with mode: 0644]
arch/arm/mach-omap2/prm54xx.h [new file with mode: 0644]
arch/arm/mach-omap2/scrm54xx.h [new file with mode: 0644]
arch/arm/mach-omap2/soc.h
arch/arm/mach-omap2/sram.c
arch/arm/mach-omap2/timer.c
arch/arm/mach-omap2/voltage.h
arch/arm/mach-omap2/voltagedomains54xx_data.c [new file with mode: 0644]
arch/arm/mach-s3c24xx/dma-s3c2412.c
arch/arm/mach-s3c24xx/dma-s3c2443.c
arch/arm/mach-s3c24xx/dma.c
arch/arm/mach-shmobile/Kconfig
arch/arm/mach-shmobile/board-ap4evb.c
arch/arm/mach-shmobile/board-armadillo800eva.c
arch/arm/mach-shmobile/board-bockw.c
arch/arm/mach-shmobile/board-bonito.c
arch/arm/mach-shmobile/board-kzm9g-reference.c
arch/arm/mach-shmobile/board-kzm9g.c
arch/arm/mach-shmobile/board-lager.c
arch/arm/mach-shmobile/board-mackerel.c
arch/arm/mach-shmobile/board-marzen.c
arch/arm/mach-shmobile/clock-r8a73a4.c
arch/arm/mach-shmobile/clock-r8a7740.c
arch/arm/mach-shmobile/clock-r8a7778.c
arch/arm/mach-shmobile/clock-r8a7779.c
arch/arm/mach-shmobile/clock-r8a7790.c
arch/arm/mach-shmobile/clock-sh73a0.c
arch/arm/mach-shmobile/include/mach/clock.h
arch/arm/mach-shmobile/include/mach/irqs.h
arch/arm/mach-shmobile/include/mach/r8a7740.h
arch/arm/mach-shmobile/include/mach/r8a7778.h
arch/arm/mach-shmobile/include/mach/r8a7779.h
arch/arm/mach-shmobile/include/mach/sh7372.h
arch/arm/mach-shmobile/setup-r8a7740.c
arch/arm/mach-shmobile/setup-r8a7778.c
arch/arm/mach-shmobile/setup-r8a7779.c
arch/arm/mach-shmobile/setup-r8a7790.c
arch/arm/mach-shmobile/setup-sh73a0.c
arch/arm/mach-socfpga/Kconfig
arch/arm/mach-sunxi/sunxi.c
arch/arm/mach-tegra/Makefile
arch/arm/mach-tegra/common.c
arch/arm/mach-tegra/common.h
arch/arm/mach-tegra/cpuidle-tegra20.c
arch/arm/mach-tegra/cpuidle-tegra30.c
arch/arm/mach-tegra/cpuidle.c
arch/arm/mach-tegra/cpuidle.h
arch/arm/mach-tegra/flowctrl.h
arch/arm/mach-tegra/fuse.h
arch/arm/mach-tegra/hotplug.c
arch/arm/mach-tegra/platsmp.c
arch/arm/mach-tegra/pm.c
arch/arm/mach-tegra/pm.h
arch/arm/mach-tegra/reset-handler.S
arch/arm/mach-tegra/sleep-tegra30.S
arch/arm/mach-tegra/sleep.S
arch/arm/mach-tegra/sleep.h
arch/arm/mach-tegra/tegra2_emc.c
arch/arm/mach-u300/Kconfig
arch/arm/mach-u300/Makefile
arch/arm/mach-u300/core.c
arch/arm/mach-u300/dummyspichip.c
arch/arm/mach-u300/i2c.c [deleted file]
arch/arm/mach-u300/i2c.h [deleted file]
arch/arm/mach-u300/include/mach/hardware.h [deleted file]
arch/arm/mach-u300/include/mach/irqs.h [deleted file]
arch/arm/mach-u300/include/mach/syscon.h [deleted file]
arch/arm/mach-u300/include/mach/timex.h [deleted file]
arch/arm/mach-u300/include/mach/u300-regs.h [deleted file]
arch/arm/mach-u300/include/mach/uncompress.h [deleted file]
arch/arm/mach-u300/regulator.c
arch/arm/mach-u300/spi.c [deleted file]
arch/arm/mach-u300/spi.h [deleted file]
arch/arm/mach-u300/timer.c
arch/arm/mach-u300/timer.h [deleted file]
arch/arm/mach-u300/u300-gpio.h [deleted file]
arch/arm/mach-vexpress/Kconfig
arch/arm/mach-vexpress/Makefile
arch/arm/mach-vexpress/core.h
arch/arm/mach-vexpress/dcscb.c [new file with mode: 0644]
arch/arm/mach-vexpress/dcscb_setup.S [new file with mode: 0644]
arch/arm/mach-vexpress/platsmp.c
arch/arm/mach-vexpress/v2m.c
arch/arm/mach-virt/Makefile
arch/arm/mach-virt/platsmp.c [deleted file]
arch/arm/mach-virt/virt.c
arch/arm/mach-zynq/slcr.c
arch/arm/mm/Kconfig
arch/arm/mm/Makefile
arch/arm/mm/cache-nop.S [new file with mode: 0644]
arch/arm/mm/nommu.c
arch/arm/mm/proc-v7m.S [new file with mode: 0644]
arch/arm/plat-samsung/include/plat/dma-s3c24xx.h
drivers/bus/Kconfig
drivers/bus/Makefile
drivers/bus/arm-cci.c [new file with mode: 0644]
drivers/clk/Makefile
drivers/clk/clk-u300.c
drivers/clk/clk-zynq.c [deleted file]
drivers/clk/mvebu/Kconfig
drivers/clk/mvebu/Makefile
drivers/clk/mvebu/armada-370.c [new file with mode: 0644]
drivers/clk/mvebu/armada-xp.c [new file with mode: 0644]
drivers/clk/mvebu/clk-core.c [deleted file]
drivers/clk/mvebu/clk-core.h [deleted file]
drivers/clk/mvebu/clk-gating-ctrl.c [deleted file]
drivers/clk/mvebu/clk-gating-ctrl.h [deleted file]
drivers/clk/mvebu/clk.c [deleted file]
drivers/clk/mvebu/common.c [new file with mode: 0644]
drivers/clk/mvebu/common.h [new file with mode: 0644]
drivers/clk/mvebu/dove.c [new file with mode: 0644]
drivers/clk/mvebu/kirkwood.c [new file with mode: 0644]
drivers/clk/socfpga/clk.c
drivers/clk/tegra/clk-tegra114.c
drivers/clk/zynq/Makefile [new file with mode: 0644]
drivers/clk/zynq/clkc.c [new file with mode: 0644]
drivers/clk/zynq/pll.c [new file with mode: 0644]
drivers/clocksource/cadence_ttc_timer.c
drivers/cpuidle/cpuidle-calxeda.c
drivers/dma/coh901318.c
drivers/dma/edma.c
drivers/gpio/Kconfig
drivers/gpio/gpio-clps711x.c
drivers/gpio/gpio-rcar.c
drivers/i2c/busses/i2c-stu300.c
drivers/mfd/syscon.c
drivers/mmc/host/davinci_mmc.c
drivers/mtd/maps/Kconfig
drivers/mtd/maps/Makefile
drivers/mtd/maps/autcpu12-nvram.c [deleted file]
drivers/of/address.c
drivers/of/of_pci.c
drivers/pci/Kconfig
drivers/pci/Makefile
drivers/pci/host/Kconfig [new file with mode: 0644]
drivers/pci/host/Makefile [new file with mode: 0644]
drivers/pci/host/pci-mvebu.c [new file with mode: 0644]
drivers/pinctrl/pinctrl-coh901.c
drivers/pinctrl/pinctrl-u300.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/pfc-r8a7740.c
drivers/pinctrl/sh-pfc/pfc-r8a7778.c [new file with mode: 0644]
drivers/pinctrl/sh-pfc/pfc-r8a7779.c
drivers/pinctrl/sh-pfc/pfc-r8a7790.c [new file with mode: 0644]
drivers/pinctrl/sh-pfc/pfc-sh7372.c
drivers/pinctrl/sh-pfc/pfc-sh73a0.c
drivers/pinctrl/sh-pfc/sh_pfc.h
drivers/rtc/rtc-coh901331.c
drivers/spi/spi-pl022.c
drivers/tty/serial/xilinx_uartps.c
drivers/usb/host/ehci-platform.c
drivers/usb/phy/Kconfig
drivers/usb/phy/phy-rcar-usb.c
drivers/watchdog/coh901327_wdt.c
include/dt-bindings/clock/imx6sl-clock.h [new file with mode: 0644]
include/dt-bindings/clock/vf610-clock.h [new file with mode: 0644]
include/linux/arm-cci.h [new file with mode: 0644]
include/linux/clk/mvebu.h [deleted file]
include/linux/clk/zynq.h
include/linux/mfd/davinci_voicecodec.h
include/linux/mfd/syscon/clps711x.h [new file with mode: 0644]
include/linux/of_address.h
include/linux/of_pci.h
include/linux/platform_data/edma.h [moved from arch/arm/mach-davinci/include/mach/edma.h with 59% similarity]
include/linux/platform_data/gpio-rcar.h
include/linux/platform_data/pinctrl-coh901.h [deleted file]
include/linux/platform_data/spi-davinci.h
include/linux/platform_data/usb-rcar-phy.h [new file with mode: 0644]
include/linux/usb/ehci_pdriver.h
sound/soc/davinci/davinci-evm.c
sound/soc/davinci/davinci-pcm.c
sound/soc/davinci/davinci-pcm.h

index 87a1e8fb624216da5acd024c750f42a5552815a8..e3f93fb9224e9495b3683264d334619b259869ce 100644 (file)
@@ -3,17 +3,26 @@ ARM Allwinner SoCs
 
 This document lists all the ARM Allwinner SoCs that are currently
 supported in mainline by the Linux kernel. This document will also
-provide links to documentation and or datasheet for these SoCs.
+provide links to documentation and/or datasheet for these SoCs.
 
 SunXi family
 ------------
+  Linux kernel mach directory: arch/arm/mach-sunxi
 
   Flavors:
-        Allwinner A10 (sun4i)
-                Datasheet       : http://dl.linux-sunxi.org/A10/A10%20Datasheet%20-%20v1.21%20%282012-04-06%29.pdf
+    * ARM Cortex-A8 based SoCs
+      - Allwinner A10 (sun4i)
+        + Datasheet
+         http://dl.linux-sunxi.org/A10/A10%20Datasheet%20-%20v1.21%20%282012-04-06%29.pdf
+       + User Manual
+         http://dl.linux-sunxi.org/A10/A10%20User%20Manual%20-%20v1.20%20%282012-04-09%2c%20DECRYPTED%29.pdf
 
-        Allwinner A13 (sun5i)
-                Datasheet       : http://dl.linux-sunxi.org/A13/A13%20Datasheet%20-%20v1.12%20%282012-03-29%29.pdf
+      - Allwinner A10s (sun5i)
+        + Datasheet
+          http://dl.linux-sunxi.org/A10s/A10s%20Datasheet%20-%20v1.20%20%282012-03-27%29.pdf
 
-  Core: Cortex A8
-  Linux kernel mach directory: arch/arm/mach-sunxi
\ No newline at end of file
+      - Allwinner A13 (sun5i)
+        + Datasheet
+         http://dl.linux-sunxi.org/A13/A13%20Datasheet%20-%20v1.12%20%282012-03-29%29.pdf
+        + User Manual
+         http://dl.linux-sunxi.org/A13/A13%20User%20Manual%20-%20v1.2%20%282013-08-08%29.pdf
diff --git a/Documentation/devicetree/bindings/arm/cci.txt b/Documentation/devicetree/bindings/arm/cci.txt
new file mode 100644 (file)
index 0000000..92d36e2
--- /dev/null
@@ -0,0 +1,172 @@
+=======================================================
+ARM CCI cache coherent interconnect binding description
+=======================================================
+
+ARM multi-cluster systems maintain intra-cluster coherency through a
+cache coherent interconnect (CCI) that is capable of monitoring bus
+transactions and manage coherency, TLB invalidations and memory barriers.
+
+It allows snooping and distributed virtual memory message broadcast across
+clusters, through memory mapped interface, with a global control register
+space and multiple sets of interface control registers, one per slave
+interface.
+
+Bindings for the CCI node follow the ePAPR standard, available from:
+
+www.power.org/documentation/epapr-version-1-1/
+
+with the addition of the bindings described in this document which are
+specific to ARM.
+
+* CCI interconnect node
+
+       Description: Describes a CCI cache coherent Interconnect component
+
+       Node name must be "cci".
+       Node's parent must be the root node /, and the address space visible
+       through the CCI interconnect is the same as the one seen from the
+       root node (ie from CPUs perspective as per DT standard).
+       Every CCI node has to define the following properties:
+
+       - compatible
+               Usage: required
+               Value type: <string>
+               Definition: must be set to
+                           "arm,cci-400"
+
+       - reg
+               Usage: required
+               Value type: <prop-encoded-array>
+               Definition: A standard property. Specifies base physical
+                           address of CCI control registers common to all
+                           interfaces.
+
+       - ranges:
+               Usage: required
+               Value type: <prop-encoded-array>
+               Definition: A standard property. Follow rules in the ePAPR for
+                           hierarchical bus addressing. CCI interfaces
+                           addresses refer to the parent node addressing
+                           scheme to declare their register bases.
+
+       CCI interconnect node can define the following child nodes:
+
+       - CCI control interface nodes
+
+               Node name must be "slave-if".
+               Parent node must be CCI interconnect node.
+
+               A CCI control interface node must contain the following
+               properties:
+
+               - compatible
+                       Usage: required
+                       Value type: <string>
+                       Definition: must be set to
+                                   "arm,cci-400-ctrl-if"
+
+               - interface-type:
+                       Usage: required
+                       Value type: <string>
+                       Definition: must be set to one of {"ace", "ace-lite"}
+                                   depending on the interface type the node
+                                   represents.
+
+               - reg:
+                       Usage: required
+                       Value type: <prop-encoded-array>
+                       Definition: the base address and size of the
+                                   corresponding interface programming
+                                   registers.
+
+* CCI interconnect bus masters
+
+       Description: masters in the device tree connected to a CCI port
+                    (inclusive of CPUs and their cpu nodes).
+
+       A CCI interconnect bus master node must contain the following
+       properties:
+
+       - cci-control-port:
+               Usage: required
+               Value type: <phandle>
+               Definition: a phandle containing the CCI control interface node
+                           the master is connected to.
+
+Example:
+
+       cpus {
+               #size-cells = <0>;
+               #address-cells = <1>;
+
+               CPU0: cpu@0 {
+                       device_type = "cpu";
+                       compatible = "arm,cortex-a15";
+                       cci-control-port = <&cci_control1>;
+                       reg = <0x0>;
+               };
+
+               CPU1: cpu@1 {
+                       device_type = "cpu";
+                       compatible = "arm,cortex-a15";
+                       cci-control-port = <&cci_control1>;
+                       reg = <0x1>;
+               };
+
+               CPU2: cpu@100 {
+                       device_type = "cpu";
+                       compatible = "arm,cortex-a7";
+                       cci-control-port = <&cci_control2>;
+                       reg = <0x100>;
+               };
+
+               CPU3: cpu@101 {
+                       device_type = "cpu";
+                       compatible = "arm,cortex-a7";
+                       cci-control-port = <&cci_control2>;
+                       reg = <0x101>;
+               };
+
+       };
+
+       dma0: dma@3000000 {
+               compatible = "arm,pl330", "arm,primecell";
+               cci-control-port = <&cci_control0>;
+               reg = <0x0 0x3000000 0x0 0x1000>;
+               interrupts = <10>;
+               #dma-cells = <1>;
+               #dma-channels = <8>;
+               #dma-requests = <32>;
+       };
+
+       cci@2c090000 {
+               compatible = "arm,cci-400";
+               #address-cells = <1>;
+               #size-cells = <1>;
+               reg = <0x0 0x2c090000 0 0x1000>;
+               ranges = <0x0 0x0 0x2c090000 0x6000>;
+
+               cci_control0: slave-if@1000 {
+                       compatible = "arm,cci-400-ctrl-if";
+                       interface-type = "ace-lite";
+                       reg = <0x1000 0x1000>;
+               };
+
+               cci_control1: slave-if@4000 {
+                       compatible = "arm,cci-400-ctrl-if";
+                       interface-type = "ace";
+                       reg = <0x4000 0x1000>;
+               };
+
+               cci_control2: slave-if@5000 {
+                       compatible = "arm,cci-400-ctrl-if";
+                       interface-type = "ace";
+                       reg = <0x5000 0x1000>;
+               };
+       };
+
+This CCI node corresponds to a CCI component whose control registers sits
+at address 0x000000002c090000.
+CCI slave interface @0x000000002c091000 is connected to dma controller dma0.
+CCI slave interface @0x000000002c094000 is connected to CPUs {CPU0, CPU1};
+CCI slave interface @0x000000002c095000 is connected to CPUs {CPU2, CPU3};
diff --git a/Documentation/devicetree/bindings/arm/keystone/keystone.txt b/Documentation/devicetree/bindings/arm/keystone/keystone.txt
new file mode 100644 (file)
index 0000000..63c0e6a
--- /dev/null
@@ -0,0 +1,10 @@
+TI Keystone Platforms Device Tree Bindings
+-----------------------------------------------
+
+Boards with Keystone2 based devices (TCI66xxK2H) SOC shall have the
+following properties.
+
+Required properties:
+ - compatible: All TI specific devices present in Keystone SOC should be in
+   the form "ti,keystone-*". Generic devices like gic, arch_timers, ns16550
+   type UART should use the specified compatible for those devices.
diff --git a/Documentation/devicetree/bindings/arm/rtsm-dcscb.txt b/Documentation/devicetree/bindings/arm/rtsm-dcscb.txt
new file mode 100644 (file)
index 0000000..3b8fbf3
--- /dev/null
@@ -0,0 +1,19 @@
+ARM Dual Cluster System Configuration Block
+-------------------------------------------
+
+The Dual Cluster System Configuration Block (DCSCB) provides basic
+functionality for controlling clocks, resets and configuration pins in
+the Dual Cluster System implemented by the Real-Time System Model (RTSM).
+
+Required properties:
+
+- compatible : should be "arm,rtsm,dcscb"
+
+- reg : physical base address and the size of the registers window
+
+Example:
+
+       dcscb@60000000 {
+               compatible = "arm,rtsm,dcscb";
+               reg = <0x60000000 0x1000>;
+       };
diff --git a/Documentation/devicetree/bindings/arm/ste-u300.txt b/Documentation/devicetree/bindings/arm/ste-u300.txt
new file mode 100644 (file)
index 0000000..69b5ab0
--- /dev/null
@@ -0,0 +1,46 @@
+ST-Ericsson U300 Device Tree Bindings
+
+For various board the "board" node may contain specific properties
+that pertain to this particular board, such as board-specific GPIOs
+or board power regulator supplies.
+
+Required root node property:
+
+compatible="stericsson,u300";
+
+Required node: syscon
+This contains the system controller.
+- compatible: must be "stericsson,u300-syscon".
+- reg: the base address and size of the system controller.
+
+Boards with the U300 SoC include:
+
+S365 "Small Board U365":
+
+Required node: s365
+This contains the board-specific information.
+- compatible: must be "stericsson,s365".
+- vana15-supply: the regulator supplying the 1.5V to drive the
+  board.
+- syscon: a pointer to the syscon node so we can acccess the
+  syscon registers to set the board as self-powered.
+
+Example:
+
+/ {
+       model = "ST-Ericsson U300";
+       compatible = "stericsson,u300";
+       #address-cells = <1>;
+       #size-cells = <1>;
+
+       s365 {
+               compatible = "stericsson,s365";
+               vana15-supply = <&ab3100_ldo_d_reg>;
+               syscon = <&syscon>;
+       };
+
+       syscon: syscon@c0011000 {
+               compatible = "stericsson,u300-syscon";
+               reg = <0xc0011000 0x1000>;
+       };
+};
index d71b4b2c077daa410a53951893229ecbac59a892..f46f5625d8ada4e907474d304a0ebd541f269acc 100644 (file)
@@ -184,6 +184,19 @@ clocks and IDs.
        cko2                    170
        srtc_gate               171
        pata_gate               172
+       sata_gate               173
+       spdif_xtal_sel          174
+       spdif0_sel              175
+       spdif1_sel              176
+       spdif0_pred             177
+       spdif0_podf             178
+       spdif1_pred             179
+       spdif1_podf             180
+       spdif0_com_sel          181
+       spdif1_com_sel          182
+       spdif0_gate             183
+       spdif1_gate             184
+       spdif_ipg_gate          185
 
 Examples (for mx53):
 
index 6deb6fd1c7cd07d718c94c81c13a6ec01f641151..a0e104f0527e058843c1f01a33997ff64d8f37cb 100644 (file)
@@ -208,6 +208,7 @@ clocks and IDs.
        pll4_post_div           193
        pll5_post_div           194
        pll5_video_div          195
+       eim_slow                196
 
 Examples:
 
diff --git a/Documentation/devicetree/bindings/clock/imx6sl-clock.txt b/Documentation/devicetree/bindings/clock/imx6sl-clock.txt
new file mode 100644 (file)
index 0000000..15e40bd
--- /dev/null
@@ -0,0 +1,10 @@
+* Clock bindings for Freescale i.MX6 SoloLite
+
+Required properties:
+- compatible: Should be "fsl,imx6sl-ccm"
+- reg: Address and length of the register set
+- #clock-cells: Should be <1>
+
+The clock consumer should specify the desired clock by having the clock
+ID in its "clocks" phandle cell.  See include/dt-bindings/clock/imx6sl-clock.h
+for the full list of i.MX6 SoloLite clock IDs.
diff --git a/Documentation/devicetree/bindings/clock/ste-u300-syscon-clock.txt b/Documentation/devicetree/bindings/clock/ste-u300-syscon-clock.txt
new file mode 100644 (file)
index 0000000..7cafcb9
--- /dev/null
@@ -0,0 +1,80 @@
+Clock bindings for ST-Ericsson U300 System Controller Clocks
+
+Bindings for the gated system controller clocks:
+
+Required properties:
+- compatible: must be "stericsson,u300-syscon-clk"
+- #clock-cells: must be <0>
+- clock-type: specifies the type of clock:
+  0 = slow clock
+  1 = fast clock
+  2 = rest/remaining clock
+- clock-id: specifies the clock in the type range
+
+Optional properties:
+- clocks: parent clock(s)
+
+The available clocks per type are as follows:
+
+Type:  ID:   Clock:
+-------------------
+0      0     Slow peripheral bridge clock
+0      1     UART0 clock
+0      4     GPIO clock
+0      6     RTC clock
+0      7     Application timer clock
+0      8     Access timer clock
+
+1      0     Fast peripheral bridge clock
+1      1     I2C bus 0 clock
+1      2     I2C bus 1 clock
+1      5     MMC interface peripheral (silicon) clock
+1      6     SPI clock
+
+2      3     CPU clock
+2      4     DMA controller clock
+2      5     External Memory Interface (EMIF) clock
+2      6     NAND flask interface clock
+2      8     XGAM graphics engine clock
+2      9     Shared External Memory Interface (SEMI) clock
+2      10    AHB Subsystem Bridge clock
+2      12    Interrupt controller clock
+
+Example:
+
+gpio_clk: gpio_clk@13M {
+       #clock-cells = <0>;
+       compatible = "stericsson,u300-syscon-clk";
+       clock-type = <0>; /* Slow */
+       clock-id = <4>;
+       clocks = <&slow_clk>;
+};
+
+gpio: gpio@c0016000 {
+       compatible = "stericsson,gpio-coh901";
+       (...)
+       clocks = <&gpio_clk>;
+};
+
+
+Bindings for the MMC/SD card clock:
+
+Required properties:
+- compatible: must be "stericsson,u300-syscon-mclk"
+- #clock-cells: must be <0>
+
+Optional properties:
+- clocks: parent clock(s)
+
+mmc_mclk: mmc_mclk {
+       #clock-cells = <0>;
+       compatible = "stericsson,u300-syscon-mclk";
+       clocks = <&mmc_pclk>;
+};
+
+mmcsd: mmcsd@c0001000 {
+       compatible = "arm,pl18x", "arm,primecell";
+       clocks = <&mmc_pclk>, <&mmc_mclk>;
+       clock-names = "apb_pclk", "mclk";
+       (...)
+};
diff --git a/Documentation/devicetree/bindings/clock/vf610-clock.txt b/Documentation/devicetree/bindings/clock/vf610-clock.txt
new file mode 100644 (file)
index 0000000..c80863d
--- /dev/null
@@ -0,0 +1,26 @@
+* Clock bindings for Freescale Vybrid VF610 SOC
+
+Required properties:
+- compatible: Should be "fsl,vf610-ccm"
+- reg: Address and length of the register set
+- #clock-cells: Should be <1>
+
+The clock consumer should specify the desired clock by having the clock
+ID in its "clocks" phandle cell. See include/dt-bindings/clock/vf610-clock.h
+for the full list of VF610 clock IDs.
+
+Examples:
+
+clks: ccm@4006b000 {
+       compatible = "fsl,vf610-ccm";
+       reg = <0x4006b000 0x1000>;
+       #clock-cells = <1>;
+};
+
+uart1: serial@40028000 {
+       compatible = "fsl,vf610-uart";
+       reg = <0x40028000 0x1000>;
+       interrupts = <0 62 0x04>;
+       clocks = <&clks VF610_CLK_UART1>;
+       clock-names = "ipg";
+};
index 23ae1db1bc13c5a359f9d8a8556d06f49a4a616e..d99af878f5d7db6f59d6160f251edec22d902ed8 100644 (file)
@@ -6,50 +6,99 @@ The purpose of this document is to document their usage.
 See clock_bindings.txt for more information on the generic clock bindings.
 See Chapter 25 of Zynq TRM for more information about Zynq clocks.
 
-== PLLs ==
-
-Used to describe the ARM_PLL, DDR_PLL, and IO_PLL.
+== Clock Controller ==
+The clock controller is a logical abstraction of Zynq's clock tree. It reads
+required input clock frequencies from the devicetree and acts as clock provider
+for all clock consumers of PS clocks.
 
 Required properties:
-- #clock-cells : shall be 0 (only one clock is output from this node)
-- compatible : "xlnx,zynq-pll"
-- reg : pair of u32 values, which are the address offsets within the SLCR
-        of the relevant PLL_CTRL register and PLL_CFG register respectively
-- clocks : phandle for parent clock.  should be the phandle for ps_clk
+ - #clock-cells : Must be 1
+ - compatible : "xlnx,ps7-clkc"
+ - ps-clk-frequency : Frequency of the oscillator providing ps_clk in HZ
+                     (usually 33 MHz oscillators are used for Zynq platforms)
+ - clock-output-names : List of strings used to name the clock outputs. Shall be
+                       a list of the outputs given below.
 
 Optional properties:
-- clock-output-names : name of the output clock
-
-Example:
-       armpll: armpll {
-               #clock-cells = <0>;
-               compatible = "xlnx,zynq-pll";
-               clocks = <&ps_clk>;
-               reg = <0x100 0x110>;
-               clock-output-names = "armpll";
-       };
-
-== Peripheral clocks ==
+ - clocks : as described in the clock bindings
+ - clock-names : as described in the clock bindings
 
-Describes clock node for the SDIO, SMC, SPI, QSPI, and UART clocks.
+Clock inputs:
+The following strings are optional parameters to the 'clock-names' property in
+order to provide an optional (E)MIO clock source.
+ - swdt_ext_clk
+ - gem0_emio_clk
+ - gem1_emio_clk
+ - mio_clk_XX          # with XX = 00..53
+...
 
-Required properties:
-- #clock-cells : shall be 1
-- compatible : "xlnx,zynq-periph-clock"
-- reg : a single u32 value, describing the offset within the SLCR where
-        the CLK_CTRL register is found for this peripheral
-- clocks : phandle for parent clocks.  should hold phandles for
-           the IO_PLL, ARM_PLL, and DDR_PLL in order
-- clock-output-names : names of the output clock(s).  For peripherals that have
-                       two output clocks (for example, the UART), two clocks
-                       should be listed.
+Clock outputs:
+ 0:  armpll
+ 1:  ddrpll
+ 2:  iopll
+ 3:  cpu_6or4x
+ 4:  cpu_3or2x
+ 5:  cpu_2x
+ 6:  cpu_1x
+ 7:  ddr2x
+ 8:  ddr3x
+ 9:  dci
+ 10: lqspi
+ 11: smc
+ 12: pcap
+ 13: gem0
+ 14: gem1
+ 15: fclk0
+ 16: fclk1
+ 17: fclk2
+ 18: fclk3
+ 19: can0
+ 20: can1
+ 21: sdio0
+ 22: sdio1
+ 23: uart0
+ 24: uart1
+ 25: spi0
+ 26: spi1
+ 27: dma
+ 28: usb0_aper
+ 29: usb1_aper
+ 30: gem0_aper
+ 31: gem1_aper
+ 32: sdio0_aper
+ 33: sdio1_aper
+ 34: spi0_aper
+ 35: spi1_aper
+ 36: can0_aper
+ 37: can1_aper
+ 38: i2c0_aper
+ 39: i2c1_aper
+ 40: uart0_aper
+ 41: uart1_aper
+ 42: gpio_aper
+ 43: lqspi_aper
+ 44: smc_aper
+ 45: swdt
+ 46: dbg_trc
+ 47: dbg_apb
 
 Example:
-       uart_clk: uart_clk {
+       clkc: clkc {
                #clock-cells = <1>;
-               compatible = "xlnx,zynq-periph-clock";
-               clocks = <&iopll &armpll &ddrpll>;
-               reg = <0x154>;
-               clock-output-names = "uart0_ref_clk",
-                                    "uart1_ref_clk";
+               compatible = "xlnx,ps7-clkc";
+               ps-clk-frequency = <33333333>;
+               clock-output-names = "armpll", "ddrpll", "iopll", "cpu_6or4x",
+                               "cpu_3or2x", "cpu_2x", "cpu_1x", "ddr2x", "ddr3x",
+                               "dci", "lqspi", "smc", "pcap", "gem0", "gem1",
+                               "fclk0", "fclk1", "fclk2", "fclk3", "can0", "can1",
+                               "sdio0", "sdio1", "uart0", "uart1", "spi0", "spi1",
+                               "dma", "usb0_aper", "usb1_aper", "gem0_aper",
+                               "gem1_aper", "sdio0_aper", "sdio1_aper",
+                               "spi0_aper", "spi1_aper", "can0_aper", "can1_aper",
+                               "i2c0_aper", "i2c1_aper", "uart0_aper", "uart1_aper",
+                               "gpio_aper", "lqspi_aper", "smc_aper", "swdt",
+                               "dbg_trc", "dbg_apb";
+               # optional props
+               clocks = <&clkc 16>, <&clk_foo>;
+               clock-names = "gem1_emio_clk", "can_mio_clk_23";
        };
diff --git a/Documentation/devicetree/bindings/dma/ste-coh901318.txt b/Documentation/devicetree/bindings/dma/ste-coh901318.txt
new file mode 100644 (file)
index 0000000..091ad05
--- /dev/null
@@ -0,0 +1,32 @@
+ST-Ericsson COH 901 318 DMA Controller
+
+This is a DMA controller which has begun as a fork of the
+ARM PL08x PrimeCell VHDL code.
+
+Required properties:
+- compatible: should be "stericsson,coh901318"
+- reg: register locations and length
+- interrupts: the single DMA IRQ
+- #dma-cells: must be set to <1>, as the channels on the
+  COH 901 318 are simple and identified by a single number
+- dma-channels: the number of DMA channels handled
+
+Example:
+
+dmac: dma-controller@c00020000 {
+       compatible = "stericsson,coh901318";
+       reg = <0xc0020000 0x1000>;
+       interrupt-parent = <&vica>;
+       interrupts = <2>;
+       #dma-cells = <1>;
+       dma-channels = <40>;
+};
+
+Consumers example:
+
+uart0: serial@c0013000 {
+       compatible = "...";
+       (...)
+       dmas = <&dmac 17 &dmac 18>;
+       dma-names = "tx", "rx";
+};
diff --git a/Documentation/devicetree/bindings/gpio/gpio-clps711x.txt b/Documentation/devicetree/bindings/gpio/gpio-clps711x.txt
new file mode 100644 (file)
index 0000000..e0d0446
--- /dev/null
@@ -0,0 +1,28 @@
+Cirrus Logic CLPS711X GPIO controller
+
+Required properties:
+- compatible: Should be "cirrus,clps711x-gpio"
+- reg: Physical base GPIO controller registers location and length.
+  There should be two registers, first is DATA register, the second
+  is DIRECTION.
+- gpio-controller: Marks the device node as a gpio controller.
+- #gpio-cells: Should be two. The first cell is the pin number and
+  the second cell is used to specify the gpio polarity:
+    0 = active high
+    1 = active low
+
+Note: Each GPIO port should have an alias correctly numbered in "aliases"
+node.
+
+Example:
+
+aliases {
+       gpio0 = &porta;
+};
+
+porta: gpio@80000000 {
+       compatible = "cirrus,clps711x-gpio";
+       reg = <0x80000000 0x1>, <0x80000040 0x1>;
+       gpio-controller;
+       #gpio-cells = <2>;
+};
diff --git a/Documentation/devicetree/bindings/gpio/gpio-stericsson-coh901.txt b/Documentation/devicetree/bindings/gpio/gpio-stericsson-coh901.txt
new file mode 100644 (file)
index 0000000..fd665b4
--- /dev/null
@@ -0,0 +1,7 @@
+ST-Ericsson COH 901 571/3 GPIO controller
+
+Required properties:
+- compatible: Compatible property value should be "stericsson,gpio-coh901"
+- reg: Physical base address of the controller and length of memory mapped
+  region.
+- interrupts: the 0...n interrupts assigned to the different GPIO ports/banks.
diff --git a/Documentation/devicetree/bindings/i2c/i2c-st-ddci2c.txt b/Documentation/devicetree/bindings/i2c/i2c-st-ddci2c.txt
new file mode 100644 (file)
index 0000000..bd81a48
--- /dev/null
@@ -0,0 +1,15 @@
+ST Microelectronics DDC I2C
+
+Required properties :
+- compatible : Must be "st,ddci2c"
+- reg: physical base address of the controller and length of memory mapped
+     region.
+- interrupts: interrupt number to the cpu.
+- #address-cells = <1>;
+- #size-cells = <0>;
+
+Optional properties:
+- Child nodes conforming to i2c bus binding
+
+Examples :
+
index e7f4dc14eff28d7644a1eb5026b5b0e98adb2732..57edb30dbbca72f47b06b777267995389e136eb5 100644 (file)
@@ -8,91 +8,8 @@ Required properties:
 - #interrupt-cells : Specifies the number of cells needed to encode an
   interrupt source. The value shall be 1.
 
-The interrupt sources are as follows:
-
-0: ENMI
-1: UART0
-2: UART1
-3: UART2
-4: UART3
-5: IR0
-6: IR1
-7: I2C0
-8: I2C1
-9: I2C2
-10: SPI0
-11: SPI1
-12: SPI2
-13: SPDIF
-14: AC97
-15: TS
-16: I2S
-17: UART4
-18: UART5
-19: UART6
-20: UART7
-21: KEYPAD
-22: TIMER0
-23: TIMER1
-24: TIMER2
-25: TIMER3
-26: CAN
-27: DMA
-28: PIO
-29: TOUCH_PANEL
-30: AUDIO_CODEC
-31: LRADC
-32: SDMC0
-33: SDMC1
-34: SDMC2
-35: SDMC3
-36: MEMSTICK
-37: NAND
-38: USB0
-39: USB1
-40: USB2
-41: SCR
-42: CSI0
-43: CSI1
-44: LCDCTRL0
-45: LCDCTRL1
-46: MP
-47: DEFEBE0
-48: DEFEBE1
-49: PMU
-50: SPI3
-51: TZASC
-52: PATA
-53: VE
-54: SS
-55: EMAC
-56: SATA
-57: GPS
-58: HDMI
-59: TVE
-60: ACE
-61: TVD
-62: PS2_0
-63: PS2_1
-64: USB3
-65: USB4
-66: PLE_PFM
-67: TIMER4
-68: TIMER5
-69: GPU_GP
-70: GPU_GPMMU
-71: GPU_PP0
-72: GPU_PPMMU0
-73: GPU_PMU
-74: GPU_RSV0
-75: GPU_RSV1
-76: GPU_RSV2
-77: GPU_RSV3
-78: GPU_RSV4
-79: GPU_RSV5
-80: GPU_RSV6
-82: SYNC_TIMER0
-83: SYNC_TIMER1
+For the valid interrupt sources for your SoC, see the documentation in
+sunxi/<soc>.txt
 
 Example:
 
diff --git a/Documentation/devicetree/bindings/interrupt-controller/sunxi/sun4i-a10.txt b/Documentation/devicetree/bindings/interrupt-controller/sunxi/sun4i-a10.txt
new file mode 100644 (file)
index 0000000..76b98c8
--- /dev/null
@@ -0,0 +1,89 @@
+Allwinner A10 (sun4i) interrupt sources
+---------------------------------------
+
+The interrupt sources available for the Allwinner A10 SoC are the
+following one:
+
+0: ENMI
+1: UART0
+2: UART1
+3: UART2
+4: UART3
+5: IR0
+6: IR1
+7: I2C0
+8: I2C1
+9: I2C2
+10: SPI0
+11: SPI1
+12: SPI2
+13: SPDIF
+14: AC97
+15: TS
+16: I2S
+17: UART4
+18: UART5
+19: UART6
+20: UART7
+21: KEYPAD
+22: TIMER0
+23: TIMER1
+24: TIMER2
+25: TIMER3
+26: CAN
+27: DMA
+28: PIO
+29: TOUCH_PANEL
+30: AUDIO_CODEC
+31: LRADC
+32: MMC0
+33: MMC1
+34: MMC2
+35: MMC3
+36: MEMSTICK
+37: NAND
+38: USB0
+39: USB1
+40: USB2
+41: SCR
+42: CSI0
+43: CSI1
+44: LCDCTRL0
+45: LCDCTRL1
+46: MP
+47: DEFEBE0
+48: DEFEBE1
+49: PMU
+50: SPI3
+51: TZASC
+52: PATA
+53: VE
+54: SS
+55: EMAC
+56: SATA
+57: GPS
+58: HDMI
+59: TVE
+60: ACE
+61: TVD
+62: PS2_0
+63: PS2_1
+64: USB3
+65: USB4
+66: PLE_PFM
+67: TIMER4
+68: TIMER5
+69: GPU_GP
+70: GPU_GPMMU
+71: GPU_PP0
+72: GPU_PPMMU0
+73: GPU_PMU
+74: GPU_RSV0
+75: GPU_RSV1
+76: GPU_RSV2
+77: GPU_RSV3
+78: GPU_RSV4
+79: GPU_RSV5
+80: GPU_RSV6
+82: SYNC_TIMER0
+83: SYNC_TIMER1
diff --git a/Documentation/devicetree/bindings/interrupt-controller/sunxi/sun5i-a13.txt b/Documentation/devicetree/bindings/interrupt-controller/sunxi/sun5i-a13.txt
new file mode 100644 (file)
index 0000000..2ec3b5c
--- /dev/null
@@ -0,0 +1,55 @@
+Allwinner A13 (sun5i) interrupt sources
+---------------------------------------
+
+The interrupt sources available for the Allwinner A13 SoC are the
+following one:
+
+0: ENMI
+2: UART1
+4: UART3
+5: IR
+7: I2C0
+8: I2C1
+9: I2C2
+10: SPI0
+11: SPI1
+12: SPI2
+22: TIMER0
+23: TIMER1
+24: TIMER2
+25: TIMER3
+27: DMA
+28: PIO
+29: TOUCH_PANEL
+30: AUDIO_CODEC
+31: LRADC
+32: MMC0
+33: MMC1
+34: MMC2
+37: NAND
+38: USB OTG
+39: USB EHCI
+40: USB OHCI
+42: CSI
+44: LCDCTRL
+47: DEFEBE
+49: PMU
+53: VE
+54: SS
+66: PLE_PFM
+67: TIMER4
+68: TIMER5
+69: GPU_GP
+70: GPU_GPMMU
+71: GPU_PP0
+72: GPU_PPMMU0
+73: GPU_PMU
+74: GPU_RSV0
+75: GPU_RSV1
+76: GPU_RSV2
+77: GPU_RSV3
+78: GPU_RSV4
+79: GPU_RSV5
+80: GPU_RSV6
+82: SYNC_TIMER0
+83: SYNC_TIMER1
diff --git a/Documentation/devicetree/bindings/pci/mvebu-pci.txt b/Documentation/devicetree/bindings/pci/mvebu-pci.txt
new file mode 100644 (file)
index 0000000..f8d4058
--- /dev/null
@@ -0,0 +1,221 @@
+* Marvell EBU PCIe interfaces
+
+Mandatory properties:
+- compatible: one of the following values:
+    marvell,armada-370-pcie
+    marvell,armada-xp-pcie
+    marvell,kirkwood-pcie
+- #address-cells, set to <3>
+- #size-cells, set to <2>
+- #interrupt-cells, set to <1>
+- bus-range: PCI bus numbers covered
+- device_type, set to "pci"
+- ranges: ranges for the PCI memory and I/O regions, as well as the
+  MMIO registers to control the PCIe interfaces.
+
+In addition, the Device Tree node must have sub-nodes describing each
+PCIe interface, having the following mandatory properties:
+- reg: used only for interrupt mapping, so only the first four bytes
+  are used to refer to the correct bus number and device number.
+- assigned-addresses: reference to the MMIO registers used to control
+  this PCIe interface.
+- clocks: the clock associated to this PCIe interface
+- marvell,pcie-port: the physical PCIe port number
+- status: either "disabled" or "okay"
+- device_type, set to "pci"
+- #address-cells, set to <3>
+- #size-cells, set to <2>
+- #interrupt-cells, set to <1>
+- ranges, empty property.
+- interrupt-map-mask and interrupt-map, standard PCI properties to
+  define the mapping of the PCIe interface to interrupt numbers.
+
+and the following optional properties:
+- marvell,pcie-lane: the physical PCIe lane number, for ports having
+  multiple lanes. If this property is not found, we assume that the
+  value is 0.
+
+Example:
+
+pcie-controller {
+       compatible = "marvell,armada-xp-pcie";
+       status = "disabled";
+       device_type = "pci";
+
+       #address-cells = <3>;
+       #size-cells = <2>;
+
+       bus-range = <0x00 0xff>;
+
+       ranges = <0x82000000 0 0xd0040000 0xd0040000 0 0x00002000   /* Port 0.0 registers */
+                 0x82000000 0 0xd0042000 0xd0042000 0 0x00002000   /* Port 2.0 registers */
+                 0x82000000 0 0xd0044000 0xd0044000 0 0x00002000   /* Port 0.1 registers */
+                 0x82000000 0 0xd0048000 0xd0048000 0 0x00002000   /* Port 0.2 registers */
+                 0x82000000 0 0xd004c000 0xd004c000 0 0x00002000   /* Port 0.3 registers */
+                 0x82000000 0 0xd0080000 0xd0080000 0 0x00002000   /* Port 1.0 registers */
+                 0x82000000 0 0xd0082000 0xd0082000 0 0x00002000   /* Port 3.0 registers */
+                 0x82000000 0 0xd0084000 0xd0084000 0 0x00002000   /* Port 1.1 registers */
+                 0x82000000 0 0xd0088000 0xd0088000 0 0x00002000   /* Port 1.2 registers */
+                 0x82000000 0 0xd008c000 0xd008c000 0 0x00002000   /* Port 1.3 registers */
+                 0x82000000 0 0xe0000000 0xe0000000 0 0x08000000   /* non-prefetchable memory */
+                 0x81000000 0 0          0xe8000000 0 0x00100000>; /* downstream I/O */
+
+       pcie@1,0 {
+               device_type = "pci";
+               assigned-addresses = <0x82000800 0 0xd0040000 0 0x2000>;
+               reg = <0x0800 0 0 0 0>;
+               #address-cells = <3>;
+               #size-cells = <2>;
+               #interrupt-cells = <1>;
+               ranges;
+               interrupt-map-mask = <0 0 0 0>;
+               interrupt-map = <0 0 0 0 &mpic 58>;
+               marvell,pcie-port = <0>;
+               marvell,pcie-lane = <0>;
+               clocks = <&gateclk 5>;
+               status = "disabled";
+       };
+
+       pcie@2,0 {
+               device_type = "pci";
+               assigned-addresses = <0x82001000 0 0xd0044000 0 0x2000>;
+               reg = <0x1000 0 0 0 0>;
+               #address-cells = <3>;
+               #size-cells = <2>;
+               #interrupt-cells = <1>;
+               ranges;
+               interrupt-map-mask = <0 0 0 0>;
+               interrupt-map = <0 0 0 0 &mpic 59>;
+               marvell,pcie-port = <0>;
+               marvell,pcie-lane = <1>;
+               clocks = <&gateclk 6>;
+               status = "disabled";
+       };
+
+       pcie@3,0 {
+               device_type = "pci";
+               assigned-addresses = <0x82001800 0 0xd0048000 0 0x2000>;
+               reg = <0x1800 0 0 0 0>;
+               #address-cells = <3>;
+               #size-cells = <2>;
+               #interrupt-cells = <1>;
+               ranges;
+               interrupt-map-mask = <0 0 0 0>;
+               interrupt-map = <0 0 0 0 &mpic 60>;
+               marvell,pcie-port = <0>;
+               marvell,pcie-lane = <2>;
+               clocks = <&gateclk 7>;
+               status = "disabled";
+       };
+
+       pcie@4,0 {
+               device_type = "pci";
+               assigned-addresses = <0x82002000 0 0xd004c000 0 0x2000>;
+               reg = <0x2000 0 0 0 0>;
+               #address-cells = <3>;
+               #size-cells = <2>;
+               #interrupt-cells = <1>;
+               ranges;
+               interrupt-map-mask = <0 0 0 0>;
+               interrupt-map = <0 0 0 0 &mpic 61>;
+               marvell,pcie-port = <0>;
+               marvell,pcie-lane = <3>;
+               clocks = <&gateclk 8>;
+               status = "disabled";
+       };
+
+       pcie@5,0 {
+               device_type = "pci";
+               assigned-addresses = <0x82002800 0 0xd0080000 0 0x2000>;
+               reg = <0x2800 0 0 0 0>;
+               #address-cells = <3>;
+               #size-cells = <2>;
+               #interrupt-cells = <1>;
+               ranges;
+               interrupt-map-mask = <0 0 0 0>;
+               interrupt-map = <0 0 0 0 &mpic 62>;
+               marvell,pcie-port = <1>;
+               marvell,pcie-lane = <0>;
+               clocks = <&gateclk 9>;
+               status = "disabled";
+       };
+
+       pcie@6,0 {
+               device_type = "pci";
+               assigned-addresses = <0x82003000 0 0xd0084000 0 0x2000>;
+               reg = <0x3000 0 0 0 0>;
+               #address-cells = <3>;
+               #size-cells = <2>;
+               #interrupt-cells = <1>;
+               ranges;
+               interrupt-map-mask = <0 0 0 0>;
+               interrupt-map = <0 0 0 0 &mpic 63>;
+               marvell,pcie-port = <1>;
+               marvell,pcie-lane = <1>;
+               clocks = <&gateclk 10>;
+               status = "disabled";
+       };
+
+       pcie@7,0 {
+               device_type = "pci";
+               assigned-addresses = <0x82003800 0 0xd0088000 0 0x2000>;
+               reg = <0x3800 0 0 0 0>;
+               #address-cells = <3>;
+               #size-cells = <2>;
+               #interrupt-cells = <1>;
+               ranges;
+               interrupt-map-mask = <0 0 0 0>;
+               interrupt-map = <0 0 0 0 &mpic 64>;
+               marvell,pcie-port = <1>;
+               marvell,pcie-lane = <2>;
+               clocks = <&gateclk 11>;
+               status = "disabled";
+       };
+
+       pcie@8,0 {
+               device_type = "pci";
+               assigned-addresses = <0x82004000 0 0xd008c000 0 0x2000>;
+               reg = <0x4000 0 0 0 0>;
+               #address-cells = <3>;
+               #size-cells = <2>;
+               #interrupt-cells = <1>;
+               ranges;
+               interrupt-map-mask = <0 0 0 0>;
+               interrupt-map = <0 0 0 0 &mpic 65>;
+               marvell,pcie-port = <1>;
+               marvell,pcie-lane = <3>;
+               clocks = <&gateclk 12>;
+               status = "disabled";
+       };
+       pcie@9,0 {
+               device_type = "pci";
+               assigned-addresses = <0x82004800 0 0xd0042000 0 0x2000>;
+               reg = <0x4800 0 0 0 0>;
+               #address-cells = <3>;
+               #size-cells = <2>;
+               #interrupt-cells = <1>;
+               ranges;
+               interrupt-map-mask = <0 0 0 0>;
+               interrupt-map = <0 0 0 0 &mpic 99>;
+               marvell,pcie-port = <2>;
+               marvell,pcie-lane = <0>;
+               clocks = <&gateclk 26>;
+               status = "disabled";
+       };
+
+       pcie@10,0 {
+               device_type = "pci";
+               assigned-addresses = <0x82005000 0 0xd0082000 0 0x2000>;
+               reg = <0x5000 0 0 0 0>;
+               #address-cells = <3>;
+               #size-cells = <2>;
+               #interrupt-cells = <1>;
+               ranges;
+               interrupt-map-mask = <0 0 0 0>;
+               interrupt-map = <0 0 0 0 &mpic 103>;
+               marvell,pcie-port = <3>;
+               marvell,pcie-lane = <0>;
+               clocks = <&gateclk 27>;
+               status = "disabled";
+       };
+};
diff --git a/Documentation/devicetree/bindings/pci/pci.txt b/Documentation/devicetree/bindings/pci/pci.txt
new file mode 100644 (file)
index 0000000..41aeed3
--- /dev/null
@@ -0,0 +1,9 @@
+PCI bus bridges have standardized Device Tree bindings:
+
+PCI Bus Binding to: IEEE Std 1275-1994
+http://www.openfirmware.org/ofwg/bindings/pci/pci2_1.pdf
+
+And for the interrupt mapping part:
+
+Open Firmware Recommended Practice: Interrupt Mapping
+http://www.openfirmware.org/1275/practice/imap/imap0_9d.pdf
diff --git a/Documentation/devicetree/bindings/pci/v3-v360epc-pci.txt b/Documentation/devicetree/bindings/pci/v3-v360epc-pci.txt
new file mode 100644 (file)
index 0000000..30b364e
--- /dev/null
@@ -0,0 +1,15 @@
+V3 Semiconductor V360 EPC PCI bridge
+
+This bridge is found in the ARM Integrator/AP (Application Platform)
+
+Integrator-specific notes:
+
+- syscon: should contain a link to the syscon device node (since
+  on the Integrator, some registers in the syscon are required to
+  operate the V3).
+
+V360 EPC specific notes:
+
+- reg: should contain the base address of the V3 adapter.
+- interrupts: should contain a reference to the V3 error interrupt
+  as routed on the system.
diff --git a/Documentation/devicetree/bindings/timer/stericsson-u300-apptimer.txt b/Documentation/devicetree/bindings/timer/stericsson-u300-apptimer.txt
new file mode 100644 (file)
index 0000000..9499bc8
--- /dev/null
@@ -0,0 +1,18 @@
+ST-Ericsson U300 apptimer
+
+Required properties:
+
+- compatible : should be "stericsson,u300-apptimer"
+- reg : Specifies base physical address and size of the registers.
+- interrupts : A list of 4 interrupts; one for each subtimer. These
+  are, in order: OS (operating system), DD (device driver) both
+  adopted for EPOC/Symbian with two specific IRQs for these tasks,
+  then GP1 and GP2, which are general-purpose timers.
+
+Example:
+
+timer {
+       compatible = "stericsson,u300-apptimer";
+       reg = <0xc0014000 0x1000>;
+       interrupts = <24 25 26 27>;
+};
index 6931c4348d240ed9f8bf6b21a0d75f9c520edf1d..d247d1003987b2ee1901103446035643587faa47 100644 (file)
@@ -59,6 +59,7 @@ ste   ST-Ericsson
 stericsson     ST-Ericsson
 ti     Texas Instruments
 toshiba        Toshiba Corporation
+v3     V3 Semiconductor
 via    VIA Technologies, Inc.
 wlf    Wolfson Microelectronics
 wm     Wondermedia Technologies, Inc.
diff --git a/Documentation/devicetree/bindings/watchdog/stericsson-coh901327.txt b/Documentation/devicetree/bindings/watchdog/stericsson-coh901327.txt
new file mode 100644 (file)
index 0000000..8ffb88e
--- /dev/null
@@ -0,0 +1,19 @@
+ST-Ericsson COH 901 327 Watchdog timer
+
+Required properties:
+- compatible: must be "stericsson,coh901327".
+- reg: physical base address of the controller and length of memory mapped
+  region.
+- interrupts: the interrupt used for the watchdog timeout warning.
+
+Optional properties:
+- timeout-sec: contains the watchdog timeout in seconds.
+
+Example:
+
+watchdog: watchdog@c0012000 {
+       compatible = "stericsson,coh901327";
+       reg = <0xc0012000 0x1000>;
+       interrupts = <3>;
+       timeout-sec = <60>;
+};
index 49d993cee51232874a81814fe39ca99e09b88bad..102bf5798501635247fac5efbf89647a466be325 100644 (file)
@@ -9,7 +9,7 @@ config ARM
        select BUILDTIME_EXTABLE_SORT if MMU
        select CPU_PM if (SUSPEND || CPU_IDLE)
        select DCACHE_WORD_ACCESS if (CPU_V6 || CPU_V6K || CPU_V7) && !CPU_BIG_ENDIAN && MMU
-       select GENERIC_ATOMIC64 if (CPU_V6 || !CPU_32v6K || !AEABI)
+       select GENERIC_ATOMIC64 if (CPU_V7M || CPU_V6 || !CPU_32v6K || !AEABI)
        select GENERIC_CLOCKEVENTS_BROADCAST if SMP
        select GENERIC_IRQ_PROBE
        select GENERIC_IRQ_SHOW
@@ -366,11 +366,12 @@ config ARCH_CLPS711X
        select ARCH_REQUIRE_GPIOLIB
        select AUTO_ZRELADDR
        select CLKDEV_LOOKUP
+       select CLKSRC_MMIO
        select COMMON_CLK
        select CPU_ARM720T
        select GENERIC_CLOCKEVENTS
+       select MFD_SYSCON
        select MULTI_IRQ_HANDLER
-       select NEED_MACH_MEMORY_H
        select SPARSE_IRQ
        help
          Support for Cirrus Logic 711x/721x/731x based boards.
@@ -502,6 +503,7 @@ config ARCH_DOVE
 
 config ARCH_KIRKWOOD
        bool "Marvell Kirkwood"
+       select ARCH_HAS_CPUFREQ
        select ARCH_REQUIRE_GPIOLIB
        select CPU_FEROCEON
        select GENERIC_CLOCKEVENTS
@@ -645,7 +647,7 @@ config ARCH_SHMOBILE
        select MULTI_IRQ_HANDLER
        select NEED_MACH_MEMORY_H
        select NO_IOPORT
-       select PINCTRL if ARCH_WANT_OPTIONAL_GPIOLIB
+       select PINCTRL
        select PM_GENERIC_DOMAINS if PM
        select SPARSE_IRQ
        help
@@ -813,23 +815,6 @@ config ARCH_SHARK
          Support for the StrongARM based Digital DNARD machine, also known
          as "Shark" (<http://www.shark-linux.de/shark.html>).
 
-config ARCH_U300
-       bool "ST-Ericsson U300 Series"
-       depends on MMU
-       select ARCH_REQUIRE_GPIOLIB
-       select ARM_AMBA
-       select ARM_PATCH_PHYS_VIRT
-       select ARM_VIC
-       select CLKDEV_LOOKUP
-       select CLKSRC_MMIO
-       select COMMON_CLK
-       select CPU_ARM926T
-       select GENERIC_CLOCKEVENTS
-       select HAVE_TCM
-       select SPARSE_IRQ
-       help
-         Support for ST-Ericsson U300 series mobile platforms.
-
 config ARCH_DAVINCI
        bool "TI DaVinci"
        select ARCH_HAS_HOLES_MEMORYMODEL
@@ -840,6 +825,7 @@ config ARCH_DAVINCI
        select GENERIC_IRQ_CHIP
        select HAVE_IDE
        select NEED_MACH_GPIO_H
+       select TI_PRIV_EDMA
        select USE_OF
        select ZONE_DMA
        help
@@ -948,6 +934,8 @@ source "arch/arm/mach-iop13xx/Kconfig"
 
 source "arch/arm/mach-ixp4xx/Kconfig"
 
+source "arch/arm/mach-keystone/Kconfig"
+
 source "arch/arm/mach-kirkwood/Kconfig"
 
 source "arch/arm/mach-ks8695/Kconfig"
@@ -1560,6 +1548,7 @@ config ARCH_NR_GPIO
        int
        default 1024 if ARCH_SHMOBILE || ARCH_TEGRA
        default 512 if SOC_OMAP5
+       default 512 if ARCH_KEYSTONE
        default 392 if ARCH_U8500
        default 352 if ARCH_VT8500
        default 288 if ARCH_SUNXI
@@ -1585,7 +1574,7 @@ config SCHED_HRTICK
 
 config THUMB2_KERNEL
        bool "Compile the kernel in Thumb-2 mode" if !CPU_THUMBONLY
-       depends on CPU_V7 && !CPU_V6 && !CPU_V6K
+       depends on (CPU_V7 || CPU_V7M) && !CPU_V6 && !CPU_V6K
        default y if CPU_THUMBONLY
        select AEABI
        select ARM_ASM_UNIFIED
@@ -2040,7 +2029,7 @@ config CRASH_DUMP
 
 config AUTO_ZRELADDR
        bool "Auto calculation of the decompressed kernel image address"
-       depends on !ZBOOT_ROM && !ARCH_U300
+       depends on !ZBOOT_ROM
        help
          ZRELADDR is the physical address where the decompressed kernel
          image will be placed. If AUTO_ZRELADDR is selected, the address
index 2cef8e13f9f83012c224c23802c383e4715a135f..c859495da48046e7b0427845ed265535f3f2aa3d 100644 (file)
@@ -28,7 +28,7 @@ config FLASH_SIZE
 config PROCESSOR_ID
        hex 'Hard wire the processor ID'
        default 0x00007700
-       depends on !CPU_CP15
+       depends on !(CPU_CP15 || CPU_V7M)
        help
          If processor has no CP15 register, this processor ID is
          used instead of the auto-probing which utilizes the register.
index 1d41908d5cda0644a31a9048c882369f21db235b..394d2a4064e19bce746c88b8b5be6a980670868f 100644 (file)
@@ -251,6 +251,27 @@ choice
                  Say Y here if you want kernel low-level debugging support
                  on i.MX6Q/DL.
 
+       config DEBUG_IMX6SL_UART
+               bool "i.MX6SL Debug UART"
+               depends on SOC_IMX6SL
+               help
+                 Say Y here if you want kernel low-level debugging support
+                 on i.MX6SL.
+
+       config DEBUG_KEYSTONE_UART0
+               bool "Kernel low-level debugging on KEYSTONE2 using UART0"
+               depends on ARCH_KEYSTONE
+               help
+                 Say Y here if you want the debug print routines to direct
+                 their output to UART0 serial port on KEYSTONE2 devices.
+
+       config DEBUG_KEYSTONE_UART1
+               bool "Kernel low-level debugging on KEYSTONE2 using UART1"
+               depends on ARCH_KEYSTONE
+               help
+                 Say Y here if you want the debug print routines to direct
+                 their output to UART1 serial port on KEYSTONE2 devices.
+
        config DEBUG_MMP_UART2
                bool "Kernel low-level debugging message via MMP UART2"
                depends on ARCH_MMP
@@ -303,12 +324,37 @@ choice
                  their output to the serial port on MSM 8960 devices.
 
        config DEBUG_MVEBU_UART
-               bool "Kernel low-level debugging messages via MVEBU UART"
+               bool "Kernel low-level debugging messages via MVEBU UART (old bootloaders)"
                depends on ARCH_MVEBU
                help
                  Say Y here if you want kernel low-level debugging support
                  on MVEBU based platforms.
 
+                 This option should be used with the old bootloaders
+                 that left the internal registers mapped at
+                 0xd0000000. As of today, this is the case on
+                 platforms such as the Globalscale Mirabox or the
+                 Plathome OpenBlocks AX3, when using the original
+                 bootloader.
+
+                 If the wrong DEBUG_MVEBU_UART* option is selected,
+                 when u-boot hands over to the kernel, the system
+                 silently crashes, with no serial output at all.
+
+       config DEBUG_MVEBU_UART_ALTERNATE
+               bool "Kernel low-level debugging messages via MVEBU UART (new bootloaders)"
+               depends on ARCH_MVEBU
+               help
+                 Say Y here if you want kernel low-level debugging support
+                 on MVEBU based platforms.
+
+                 This option should be used with the new bootloaders
+                 that remap the internal registers at 0xf1000000.
+
+                 If the wrong DEBUG_MVEBU_UART* option is selected,
+                 when u-boot hands over to the kernel, the system
+                 silently crashes, with no serial output at all.
+
        config DEBUG_NOMADIK_UART
                bool "Kernel low-level debugging messages via NOMADIK UART"
                depends on ARCH_NOMADIK
@@ -443,6 +489,13 @@ choice
                  Say Y here if you want the debug print routines to direct
                  their output to the uart1 port on SiRFmarco devices.
 
+       config DEBUG_U300_UART
+               bool "Kernel low-level debugging messages via U300 UART0"
+               depends on ARCH_U300
+               help
+                 Say Y here if you want the debug print routines to direct
+                 their output to the uart port on U300 devices.
+
        config DEBUG_UX500_UART
                depends on ARCH_U8500
                bool "Use Ux500 UART for low-level debug"
@@ -532,7 +585,8 @@ config DEBUG_IMX_UART_PORT
                                                DEBUG_IMX35_UART || \
                                                DEBUG_IMX51_UART || \
                                                DEBUG_IMX53_UART || \
-                                               DEBUG_IMX6Q_UART
+                                               DEBUG_IMX6Q_UART || \
+                                               DEBUG_IMX6SL_UART
        default 1
        depends on ARCH_MXC
        help
@@ -631,8 +685,12 @@ config DEBUG_LL_INCLUDE
                                 DEBUG_IMX35_UART || \
                                 DEBUG_IMX51_UART || \
                                 DEBUG_IMX53_UART ||\
-                                DEBUG_IMX6Q_UART
-       default "debug/mvebu.S" if DEBUG_MVEBU_UART
+                                DEBUG_IMX6Q_UART || \
+                                DEBUG_IMX6SL_UART
+       default "debug/keystone.S" if DEBUG_KEYSTONE_UART0 || \
+                                     DEBUG_KEYSTONE_UART1
+       default "debug/mvebu.S" if DEBUG_MVEBU_UART || \
+                                  DEBUG_MVEBU_UART_ALTERNATE
        default "debug/mxs.S" if DEBUG_IMX23_UART || DEBUG_IMX28_UART
        default "debug/nomadik.S" if DEBUG_NOMADIK_UART
        default "debug/omap2plus.S" if DEBUG_OMAP2PLUS_UART
@@ -643,6 +701,7 @@ config DEBUG_LL_INCLUDE
        default "debug/socfpga.S" if DEBUG_SOCFPGA_UART
        default "debug/sunxi.S" if DEBUG_SUNXI_UART0 || DEBUG_SUNXI_UART1
        default "debug/tegra.S" if DEBUG_TEGRA_UART
+       default "debug/u300.S" if DEBUG_U300_UART
        default "debug/ux500.S" if DEBUG_UX500_UART
        default "debug/vexpress.S" if DEBUG_VEXPRESS_UART0_DETECT || \
                DEBUG_VEXPRESS_UART0_CA9 || DEBUG_VEXPRESS_UART0_RS1
index 1ba358ba16b871aec3b366cab9b4e4066048e69c..650be0f104165f9ffb66e509e20c2051d9a446c9 100644 (file)
@@ -59,6 +59,7 @@ comma = ,
 # Note that GCC does not numerically define an architecture version
 # macro, but instead defines a whole series of macros which makes
 # testing for a specific architecture or later rather impossible.
+arch-$(CONFIG_CPU_32v7M)       :=-D__LINUX_ARM_ARCH__=7 -march=armv7-m -Wa,-march=armv7-m
 arch-$(CONFIG_CPU_32v7)                :=-D__LINUX_ARM_ARCH__=7 $(call cc-option,-march=armv7-a,-march=armv5t -Wa$(comma)-march=armv7-a)
 arch-$(CONFIG_CPU_32v6)                :=-D__LINUX_ARM_ARCH__=6 $(call cc-option,-march=armv6,-march=armv5t -Wa$(comma)-march=armv6)
 # Only override the compiler option if ARMv6. The ARMv6K extensions are
@@ -194,6 +195,7 @@ machine-$(CONFIG_PLAT_SPEAR)                += spear
 machine-$(CONFIG_ARCH_VIRT)            += virt
 machine-$(CONFIG_ARCH_ZYNQ)            += zynq
 machine-$(CONFIG_ARCH_SUNXI)           += sunxi
+machine-$(CONFIG_ARCH_KEYSTONE)                += keystone
 
 # Platform directory name.  This list is sorted alphanumerically
 # by CONFIG_* macro name.
index f0895c581a89be8668a99db10e6873ae94be0cef..f9eae2f0ae5d6fa32d62f3d71f22cee7967471b3 100644 (file)
@@ -64,6 +64,8 @@ dtb-$(CONFIG_ARCH_INTEGRATOR) += integratorap.dtb \
        integratorcp.dtb
 dtb-$(CONFIG_ARCH_LPC32XX) += ea3250.dtb phy3250.dtb
 dtb-$(CONFIG_ARCH_KIRKWOOD) += kirkwood-cloudbox.dtb \
+       kirkwood-db-88f6281.dtb \
+       kirkwood-db-88f6282.dtb \
        kirkwood-dns320.dtb \
        kirkwood-dns325.dtb \
        kirkwood-dockstar.dtb \
@@ -199,6 +201,7 @@ dtb-$(CONFIG_ARCH_TEGRA) += tegra20-harmony.dtb \
        tegra114-pluto.dtb
 dtb-$(CONFIG_ARCH_VERSATILE) += versatile-ab.dtb \
        versatile-pb.dtb
+dtb-$(CONFIG_ARCH_U300) += ste-u300.dtb
 dtb-$(CONFIG_ARCH_VEXPRESS) += vexpress-v2p-ca5s.dtb \
        vexpress-v2p-ca9.dtb \
        vexpress-v2p-ca15-tc1.dtb \
index 550eb772c30e4c47c2f7f0896469a033dee3e23b..52a1f5efc086b4d7bc5a99360f302f328af54ab3 100644 (file)
@@ -80,7 +80,7 @@
 
                        sata@a0000 {
                                compatible = "marvell,orion-sata";
-                               reg = <0xa0000 0x2400>;
+                               reg = <0xa0000 0x5000>;
                                interrupts = <55>;
                                clocks = <&gateclk 15>, <&gateclk 30>;
                                clock-names = "0", "1";
@@ -96,7 +96,7 @@
 
                        ethernet@70000 {
                                compatible = "marvell,armada-370-neta";
-                               reg = <0x70000 0x2500>;
+                               reg = <0x70000 0x4000>;
                                interrupts = <8>;
                                clocks = <&gateclk 4>;
                                status = "disabled";
 
                        ethernet@74000 {
                                compatible = "marvell,armada-370-neta";
-                               reg = <0x74000 0x2500>;
+                               reg = <0x74000 0x4000>;
                                interrupts = <10>;
                                clocks = <&gateclk 3>;
                                status = "disabled";
index 6ab56bd35de926aaab239966f87bb78b193dac2d..488ca5eb9a55fa646df8771c56dec7f5b224202f 100644 (file)
 
                        ethernet@34000 {
                                compatible = "marvell,armada-370-neta";
-                               reg = <0x34000 0x2500>;
+                               reg = <0x34000 0x4000>;
                                interrupts = <14>;
                                clocks = <&gateclk 1>;
                                status = "disabled";
index 5b902f9a3af29a84fd0ee83000c8d0f2ffa280ea..1ee8540b0ebaf516d940ca020473e21b2fa964ba 100644 (file)
@@ -88,7 +88,7 @@
 
                        ethernet@30000 {
                                compatible = "marvell,armada-370-neta";
-                               reg = <0x30000 0x2500>;
+                               reg = <0x30000 0x4000>;
                                interrupts = <12>;
                                clocks = <&gateclk 2>;
                                status = "disabled";
index c9c3fa344647de9f012d1a14f44c36910bdf8dd0..03f23b7a0ab511a797d71074e833dc7437cd23f0 100644 (file)
                valid-mask = <0x003fffff>;
        };
 
+       pci: pciv3@62000000 {
+               compatible = "v3,v360epc-pci";
+               #interrupt-cells = <1>;
+               #size-cells = <2>;
+               #address-cells = <3>;
+               reg = <0x62000000 0x10000>;
+               interrupt-parent = <&pic>;
+               interrupts = <17>; /* Bus error IRQ */
+               ranges = <0x00000000 0 0x61000000 /* config space */
+                       0x61000000 0 0x00100000 /* 16 MiB @ 61000000 */
+                       0x01000000 0 0x60000000 /* I/O space */
+                       0x60000000 0 0x00100000 /* 16 MiB @ 60000000 */
+                       0x02000000 0 0x40000000 /* non-prefectable memory */
+                       0x40000000 0 0x10000000 /* 256 MiB @ 40000000 */
+                       0x42000000 0 0x50000000 /* prefetchable memory */
+                       0x50000000 0 0x10000000>; /* 256 MiB @ 50000000 */
+               interrupt-map-mask = <0xf800 0 0 0x7>;
+               interrupt-map = <
+               /* IDSEL 9 */
+               0x4800 0 0 1 &pic 13 /* INT A on slot 9 is irq 13 */
+               0x4800 0 0 2 &pic 14 /* INT B on slot 9 is irq 14 */
+               0x4800 0 0 3 &pic 15 /* INT C on slot 9 is irq 15 */
+               0x4800 0 0 4 &pic 16 /* INT D on slot 9 is irq 16 */
+               /* IDSEL 10 */
+               0x5000 0 0 1 &pic 14 /* INT A on slot 10 is irq 14 */
+               0x5000 0 0 2 &pic 15 /* INT B on slot 10 is irq 15 */
+               0x5000 0 0 3 &pic 16 /* INT C on slot 10 is irq 16 */
+               0x5000 0 0 4 &pic 13 /* INT D on slot 10 is irq 13 */
+               /* IDSEL 11 */
+               0x5800 0 0 1 &pic 15 /* INT A on slot 11 is irq 15 */
+               0x5800 0 0 2 &pic 16 /* INT B on slot 11 is irq 16 */
+               0x5800 0 0 3 &pic 13 /* INT C on slot 11 is irq 13 */
+               0x5800 0 0 4 &pic 14 /* INT D on slot 11 is irq 14 */
+               /* IDSEL 12 */
+               0x6000 0 0 1 &pic 16 /* INT A on slot 12 is irq 16 */
+               0x6000 0 0 2 &pic 13 /* INT B on slot 12 is irq 13 */
+               0x6000 0 0 3 &pic 14 /* INT C on slot 12 is irq 14 */
+               0x6000 0 0 4 &pic 15 /* INT D on slot 12 is irq 15 */
+               >;
+       };
+
        fpga {
                /*
                 * The Integator/AP predates the idea to have magic numbers
diff --git a/arch/arm/boot/dts/keystone.dts b/arch/arm/boot/dts/keystone.dts
new file mode 100644 (file)
index 0000000..1334b42
--- /dev/null
@@ -0,0 +1,117 @@
+/*
+ * Copyright 2013 Texas Instruments, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+/dts-v1/;
+/include/ "skeleton.dtsi"
+
+/ {
+       model = "Texas Instruments Keystone 2 SoC";
+       compatible =  "ti,keystone-evm";
+       #address-cells = <2>;
+       #size-cells = <2>;
+       interrupt-parent = <&gic>;
+
+       aliases {
+               serial0 = &uart0;
+       };
+
+       memory {
+               reg = <0x00000000 0x80000000 0x00000000 0x40000000>;
+       };
+
+       cpus {
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               interrupt-parent = <&gic>;
+
+               cpu@0 {
+                       compatible = "arm,cortex-a15";
+                       device_type = "cpu";
+                       reg = <0>;
+               };
+
+               cpu@1 {
+                       compatible = "arm,cortex-a15";
+                       device_type = "cpu";
+                       reg = <1>;
+               };
+
+               cpu@2 {
+                       compatible = "arm,cortex-a15";
+                       device_type = "cpu";
+                       reg = <2>;
+               };
+
+               cpu@3 {
+                       compatible = "arm,cortex-a15";
+                       device_type = "cpu";
+                       reg = <3>;
+               };
+       };
+
+       gic: interrupt-controller {
+               compatible = "arm,cortex-a15-gic";
+               #interrupt-cells = <3>;
+               #size-cells = <0>;
+               #address-cells = <1>;
+               interrupt-controller;
+               reg = <0x0 0x02561000 0x0 0x1000>,
+                     <0x0 0x02562000 0x0 0x2000>;
+       };
+
+       timer {
+               compatible = "arm,armv7-timer";
+               interrupts = <1 13 0xf08>,
+                            <1 14 0xf08>,
+                            <1 11 0xf08>,
+                            <1 10 0x308>;
+       };
+
+       pmu {
+               compatible = "arm,cortex-a15-pmu";
+               interrupts = <0 20 0xf01>,
+                            <0 21 0xf01>,
+                            <0 22 0xf01>,
+                            <0 23 0xf01>;
+       };
+
+       soc {
+               #address-cells = <1>;
+               #size-cells = <1>;
+               compatible = "ti,keystone","simple-bus";
+               interrupt-parent = <&gic>;
+               ranges = <0x0 0x0 0x0 0xc0000000>;
+
+               rstctrl: reset-controller {
+                       compatible = "ti,keystone-reset";
+                       reg = <0x023100e8 4>;   /* pll reset control reg */
+               };
+
+               uart0: serial@02530c00 {
+                       compatible = "ns16550a";
+                       current-speed = <115200>;
+                       reg-shift = <2>;
+                       reg-io-width = <4>;
+                       reg = <0x02530c00 0x100>;
+                       clock-frequency = <133120000>;
+                       interrupts = <0 277 0xf01>;
+               };
+
+               uart1:  serial@02531000 {
+                       compatible = "ns16550a";
+                       current-speed = <115200>;
+                       reg-shift = <2>;
+                       reg-io-width = <4>;
+                       reg = <0x02531000 0x100>;
+                       clock-frequency = <133120000>;
+                       interrupts = <0 280 0xf01>;
+               };
+
+       };
+};
index d6c9d65cbaeb5bba44c0f91504bc53c38f82bad8..51376683dbcdd2875b2c77aa7bfa85fd5374980d 100644 (file)
                                marvell,function = "sdio";
                        };
                };
+
+               pcie-controller {
+                       compatible = "marvell,kirkwood-pcie";
+                       status = "disabled";
+                       device_type = "pci";
+
+                       #address-cells = <3>;
+                       #size-cells = <2>;
+
+                       bus-range = <0x00 0xff>;
+
+                       ranges = <0x82000000 0 0x00040000 0x00040000 0 0x00002000   /* Port 0.0 registers */
+                                 0x82000000 0 0xe0000000 0xe0000000 0 0x08000000   /* non-prefetchable memory */
+                                 0x81000000 0 0          0xe8000000 0 0x00100000>; /* downstream I/O */
+
+                       pcie@1,0 {
+                               device_type = "pci";
+                               assigned-addresses = <0x82000800 0 0x00040000 0 0x2000>;
+                               reg = <0x0800 0 0 0 0>;
+                               #address-cells = <3>;
+                               #size-cells = <2>;
+                               #interrupt-cells = <1>;
+                               ranges;
+                               interrupt-map-mask = <0 0 0 0>;
+                               interrupt-map = <0 0 0 0 &intc 9>;
+                               marvell,pcie-port = <0>;
+                               marvell,pcie-lane = <0>;
+                               clocks = <&gate_clk 2>;
+                               status = "disabled";
+                       };
+               };
        };
 };
index 23991e45bc55f946609e84cc319c81aeed6d0122..66a751ab5516bd8a72de4738f874e68e275eb788 100644 (file)
                        clocks = <&gate_clk 7>;
                        status = "disabled";
                };
+
+               pcie-controller {
+                       compatible = "marvell,kirkwood-pcie";
+                       status = "disabled";
+                       device_type = "pci";
+
+                       #address-cells = <3>;
+                       #size-cells = <2>;
+
+                       bus-range = <0x00 0xff>;
+
+                       ranges = <0x82000000 0 0x00040000 0x00040000 0 0x00002000   /* Port 0.0 registers */
+                                 0x82000000 0 0x00044000 0x00044000 0 0x00002000   /* Port 1.0 registers */
+                                 0x82000000 0 0xe0000000 0xe0000000 0 0x08000000   /* non-prefetchable memory */
+                                 0x81000000 0 0          0xe8000000 0 0x00100000>; /* downstream I/O */
+
+                       pcie@1,0 {
+                               device_type = "pci";
+                               assigned-addresses = <0x82000800 0 0x00040000 0 0x2000>;
+                               reg = <0x0800 0 0 0 0>;
+                               #address-cells = <3>;
+                               #size-cells = <2>;
+                               #interrupt-cells = <1>;
+                               ranges;
+                               interrupt-map-mask = <0 0 0 0>;
+                               interrupt-map = <0 0 0 0 &intc 9>;
+                               marvell,pcie-port = <0>;
+                               marvell,pcie-lane = <0>;
+                               clocks = <&gate_clk 2>;
+                               status = "disabled";
+                       };
+
+                       pcie@2,0 {
+                               device_type = "pci";
+                               assigned-addresses = <0x82001000 0 0x00044000 0 0x2000>;
+                               reg = <0x1000 0 0 0 0>;
+                               #address-cells = <3>;
+                               #size-cells = <2>;
+                               #interrupt-cells = <1>;
+                               ranges;
+                               interrupt-map-mask = <0 0 0 0>;
+                               interrupt-map = <0 0 0 0 &intc 10>;
+                               marvell,pcie-port = <1>;
+                               marvell,pcie-lane = <0>;
+                               clocks = <&gate_clk 18>;
+                               status = "disabled";
+                       };
+               };
        };
 };
diff --git a/arch/arm/boot/dts/kirkwood-db-88f6281.dts b/arch/arm/boot/dts/kirkwood-db-88f6281.dts
new file mode 100644 (file)
index 0000000..9d777ed
--- /dev/null
@@ -0,0 +1,30 @@
+/*
+ * Marvell DB-88F6281-BP Development Board Setup
+ *
+ * Saeed Bishara <saeed@marvell.com>
+ * Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
+ *
+ * This file is licensed under the terms of the GNU General Public
+ * License version 2.  This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+ */
+
+/dts-v1/;
+
+/include/ "kirkwood-db.dtsi"
+/include/ "kirkwood-6281.dtsi"
+
+/ {
+       model = "Marvell DB-88F6281-BP Development Board";
+       compatible = "marvell,db-88f6281-bp", "marvell,kirkwood-88f6281", "marvell,kirkwood";
+
+       ocp@f1000000 {
+               pcie-controller {
+                       status = "okay";
+
+                       pcie@1,0 {
+                               status = "okay";
+                       };
+               };
+       };
+};
diff --git a/arch/arm/boot/dts/kirkwood-db-88f6282.dts b/arch/arm/boot/dts/kirkwood-db-88f6282.dts
new file mode 100644 (file)
index 0000000..f4c8528
--- /dev/null
@@ -0,0 +1,34 @@
+/*
+ * Marvell DB-88F6282-BP Development Board Setup
+ *
+ * Saeed Bishara <saeed@marvell.com>
+ * Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
+ *
+ * This file is licensed under the terms of the GNU General Public
+ * License version 2.  This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+ */
+
+/dts-v1/;
+
+/include/ "kirkwood-db.dtsi"
+/include/ "kirkwood-6282.dtsi"
+
+/ {
+       model = "Marvell DB-88F6282-BP Development Board";
+       compatible = "marvell,db-88f6282-bp", "marvell,kirkwood-88f6282", "marvell,kirkwood";
+
+       ocp@f1000000 {
+               pcie-controller {
+                       status = "okay";
+
+                       pcie@1,0 {
+                               status = "okay";
+                       };
+
+                       pcie@2,0 {
+                               status = "okay";
+                       };
+               };
+       };
+};
diff --git a/arch/arm/boot/dts/kirkwood-db.dtsi b/arch/arm/boot/dts/kirkwood-db.dtsi
new file mode 100644 (file)
index 0000000..c87cfb8
--- /dev/null
@@ -0,0 +1,89 @@
+/*
+ * Marvell DB-{88F6281,88F6282}-BP Development Board Setup
+ *
+ * Saeed Bishara <saeed@marvell.com>
+ * Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
+ *
+ * This file is licensed under the terms of the GNU General Public
+ * License version 2.  This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+ *
+ * This file contains the definitions that are common between the 6281
+ * and 6282 variants of the Marvell Kirkwood Development Board.
+ */
+
+/include/ "kirkwood.dtsi"
+
+/ {
+       memory {
+               device_type = "memory";
+               reg = <0x00000000 0x20000000>; /* 512 MB */
+       };
+
+       chosen {
+               bootargs = "console=ttyS0,115200n8 earlyprintk";
+       };
+
+       ocp@f1000000 {
+               pinctrl@10000 {
+                       pmx_sdio_gpios: pmx-sdio-gpios {
+                               marvell,pins = "mpp37", "mpp38";
+                               marvell,function = "gpio";
+                       };
+               };
+
+               serial@12000 {
+                       pinctrl-0 = <&pmx_uart0>;
+                       pinctrl-names = "default";
+                       clock-frequency = <200000000>;
+                       status = "ok";
+               };
+
+               nand@3000000 {
+                       pinctrl-0 = <&pmx_nand>;
+                       pinctrl-names = "default";
+                       chip-delay = <25>;
+                       status = "okay";
+
+                       partition@0 {
+                               label = "uboot";
+                               reg = <0x0 0x100000>;
+                       };
+
+                       partition@100000 {
+                               label = "uImage";
+                               reg = <0x100000 0x400000>;
+                       };
+
+                       partition@500000 {
+                               label = "root";
+                               reg = <0x500000 0x1fb00000>;
+                       };
+               };
+
+               sata@80000 {
+                       nr-ports = <2>;
+                       status = "okay";
+               };
+
+               ehci@50000 {
+                       status = "okay";
+               };
+
+               mvsdio@90000 {
+                       pinctrl-0 = <&pmx_sdio_gpios>;
+                       pinctrl-names = "default";
+                       wp-gpios = <&gpio1 5 0>;
+                       cd-gpios = <&gpio1 6 0>;
+                       status = "okay";
+               };
+
+               pcie-controller {
+                       status = "okay";
+
+                       pcie@1,0 {
+                               status = "okay";
+                       };
+               };
+       };
+};
index 12ccf74ac3c417e6de31fa5c33a2ab731f136220..e591d5df769f11af23c0358035ebbd9786628c64 100644 (file)
                                reg = <0x980000 0x1f400000>;
                        };
                };
+
+               pcie-controller {
+                       status = "okay";
+
+                       pcie@1,0 {
+                               status = "okay";
+                       };
+               };
        };
 
        gpio-leds {
index 758824118a9a8e22041817183449839f1c9c072e..90501cf129bbee8b648fa9d808c45cfb5a58a93e 100644 (file)
                        cd-gpios = <&gpio1 15 0>;
                        /* No WP GPIO */
                };
+
+               pcie-controller {
+                       status = "okay";
+
+                       pcie@1,0 {
+                               status = "okay";
+                       };
+               };
        };
 
        gpio-leds {
index 1ca66ab83ad671933da073be7f1f7f58694a9396..0f852b40f5c1111fbad856e8388dfebf4e590e96 100644 (file)
                        status = "okay";
                        nr-ports = <2>;
                };
+
+               pcie-controller {
+                       status = "okay";
+
+                       pcie@1,0 {
+                               status = "okay";
+                       };
+               };
        };
 
        gpio-leds {
index a7412b937a8add0c3f0ccfbc165c0a5c3325f50d..9ddf218f2cbd5fbca848b390d68e756c12140954 100644 (file)
                                reg = <0x5040000 0x2fc0000>;
                        };
                };
+
+               pcie-controller {
+                       status = "okay";
+
+                       pcie@1,0 {
+                               status = "okay";
+                       };
+               };
        };
 
        gpio_keys {
index 8295c833887ff6851322f52abac570b25ab9aa08..42648ab77c617f306c34f92befd45eea1b3e23c0 100644 (file)
@@ -1,7 +1,8 @@
 /dts-v1/;
 
-/include/ "kirkwood-ts219.dtsi"
+/include/ "kirkwood.dtsi"
 /include/ "kirkwood-6281.dtsi"
+/include/ "kirkwood-ts219.dtsi"
 
 / {
        ocp@f1000000 {
index df3f95dfba3341d07628a3ce212d63cc27f0f3ba..95ceeb93ba5ada0ce4a6823a06b786287fb42cdb 100644 (file)
@@ -1,7 +1,8 @@
 /dts-v1/;
 
-/include/ "kirkwood-ts219.dtsi"
+/include/ "kirkwood.dtsi"
 /include/ "kirkwood-6282.dtsi"
+/include/ "kirkwood-ts219.dtsi"
 
 / {
        ocp@f1000000 {
index 64ea27cb329851eb1fd242a8b016f619bb860ce4..7c022fd4aef79c8da3f57a0114bb62f23234a418 100644 (file)
@@ -1,5 +1,3 @@
-/include/ "kirkwood.dtsi"
-
 / {
        model = "QNAP TS219 family";
        compatible = "qnap,ts219", "marvell,kirkwood";
                        status = "okay";
                        nr-ports = <2>;
                };
+               pcie-controller {
+                       status = "okay";
+
+                       pcie@1,0 {
+                               status = "okay";
+                       };
+               };
        };
 };
index fada7e6d24d8543fd956ef18d7981aa12b9b9ee6..7eef88f00fea9532d91f81648554f97a9cb5f11d 100644 (file)
@@ -19,6 +19,7 @@
        ocp@f1000000 {
                compatible = "simple-bus";
                ranges = <0x00000000 0xf1000000 0x4000000
+                         0xe0000000 0xe0000000 0x8100000 /* PCIE */
                          0xf5000000 0xf5000000 0x0000400>;
                #address-cells = <1>;
                #size-cells = <1>;
diff --git a/arch/arm/boot/dts/ste-u300.dts b/arch/arm/boot/dts/ste-u300.dts
new file mode 100644 (file)
index 0000000..8a1032c
--- /dev/null
@@ -0,0 +1,473 @@
+/*
+ * Device Tree for the ST-Ericsson U300 Machine and SoC
+ */
+
+/dts-v1/;
+/include/ "skeleton.dtsi"
+
+/ {
+       model = "ST-Ericsson U300";
+       compatible = "stericsson,u300";
+       #address-cells = <1>;
+       #size-cells = <1>;
+
+       chosen {
+               bootargs = "root=/dev/ram0 console=ttyAMA0,115200n8 earlyprintk";
+       };
+
+       aliases {
+               serial0 = &uart0;
+               serial1 = &uart1;
+        };
+
+       memory {
+               reg = <0x48000000 0x03c00000>;
+       };
+
+       s365 {
+               compatible = "stericsson,s365";
+               vana15-supply = <&ab3100_ldo_d_reg>;
+               syscon = <&syscon>;
+       };
+
+       syscon: syscon@c0011000 {
+               compatible = "stericsson,u300-syscon", "syscon";
+               reg = <0xc0011000 0x1000>;
+               clk32: app_32_clk@32k {
+                       #clock-cells = <0>;
+                       compatible = "fixed-clock";
+                       clock-frequency = <32768>;
+               };
+               pll13: pll13@13M {
+                       #clock-cells = <0>;
+                       compatible = "fixed-clock";
+                       clock-frequency = <13000000>;
+               };
+               /* Slow bridge clocks under PLL13 */
+               slow_clk: slow_clk@13M {
+                       #clock-cells = <0>;
+                       compatible = "stericsson,u300-syscon-clk";
+                       clock-type = <0>; /* Slow */
+                       clock-id = <0>;
+                       clocks = <&pll13>;
+               };
+               uart0_clk: uart0_clk@13M {
+                       #clock-cells = <0>;
+                       compatible = "stericsson,u300-syscon-clk";
+                       clock-type = <0>; /* Slow */
+                       clock-id = <1>;
+                       clocks = <&slow_clk>;
+               };
+               gpio_clk: gpio_clk@13M {
+                       #clock-cells = <0>;
+                       compatible = "stericsson,u300-syscon-clk";
+                       clock-type = <0>; /* Slow */
+                       clock-id = <4>;
+                       clocks = <&slow_clk>;
+               };
+               rtc_clk: rtc_clk@13M {
+                       #clock-cells = <0>;
+                       compatible = "stericsson,u300-syscon-clk";
+                       clock-type = <0>; /* Slow */
+                       clock-id = <6>;
+                       clocks = <&slow_clk>;
+               };
+               apptimer_clk: app_tmr_clk@13M {
+                       #clock-cells = <0>;
+                       compatible = "stericsson,u300-syscon-clk";
+                       clock-type = <0>; /* Slow */
+                       clock-id = <7>;
+                       clocks = <&slow_clk>;
+               };
+               acc_tmr_clk@13M {
+                       #clock-cells = <0>;
+                       compatible = "stericsson,u300-syscon-clk";
+                       clock-type = <0>; /* Slow */
+                       clock-id = <8>;
+                       clocks = <&slow_clk>;
+               };
+               pll208: pll208@208M {
+                       #clock-cells = <0>;
+                       compatible = "fixed-clock";
+                       clock-frequency = <208000000>;
+               };
+               app208: app_208_clk@208M {
+                       #clock-cells = <0>;
+                       compatible = "fixed-factor-clock";
+                       clock-div = <1>;
+                       clock-mult = <1>;
+                       clocks = <&pll208>;
+               };
+               cpu_clk@208M {
+                       #clock-cells = <0>;
+                       compatible = "stericsson,u300-syscon-clk";
+                       clock-type = <2>; /* Rest */
+                       clock-id = <3>;
+                       clocks = <&app208>;
+               };
+               app104: app_104_clk@104M {
+                       #clock-cells = <0>;
+                       compatible = "fixed-factor-clock";
+                       clock-div = <2>;
+                       clock-mult = <1>;
+                       clocks = <&pll208>;
+               };
+               semi_clk@104M {
+                       #clock-cells = <0>;
+                       compatible = "stericsson,u300-syscon-clk";
+                       clock-type = <2>; /* Rest */
+                       clock-id = <9>;
+                       clocks = <&app104>;
+               };
+               app52: app_52_clk@52M {
+                       #clock-cells = <0>;
+                       compatible = "fixed-factor-clock";
+                       clock-div = <4>;
+                       clock-mult = <1>;
+                       clocks = <&pll208>;
+               };
+               /* AHB subsystem clocks */
+               ahb_clk: ahb_subsys_clk@52M {
+                       #clock-cells = <0>;
+                       compatible = "stericsson,u300-syscon-clk";
+                       clock-type = <2>; /* Rest */
+                       clock-id = <10>;
+                       clocks = <&app52>;
+               };
+               intcon_clk@52M {
+                       #clock-cells = <0>;
+                       compatible = "stericsson,u300-syscon-clk";
+                       clock-type = <2>; /* Rest */
+                       clock-id = <12>;
+                       clocks = <&ahb_clk>;
+               };
+               emif_clk@52M {
+                       #clock-cells = <0>;
+                       compatible = "stericsson,u300-syscon-clk";
+                       clock-type = <2>; /* Rest */
+                       clock-id = <5>;
+                       clocks = <&ahb_clk>;
+               };
+               dmac_clk: dmac_clk@52M {
+                       #clock-cells = <0>;
+                       compatible = "stericsson,u300-syscon-clk";
+                       clock-type = <2>; /* Rest */
+                       clock-id = <4>;
+                       clocks = <&app52>;
+               };
+               fsmc_clk: fsmc_clk@52M {
+                       #clock-cells = <0>;
+                       compatible = "stericsson,u300-syscon-clk";
+                       clock-type = <2>; /* Rest */
+                       clock-id = <6>;
+                       clocks = <&app52>;
+               };
+               xgam_clk: xgam_clk@52M {
+                       #clock-cells = <0>;
+                       compatible = "stericsson,u300-syscon-clk";
+                       clock-type = <2>; /* Rest */
+                       clock-id = <8>;
+                       clocks = <&app52>;
+               };
+               app26: app_26_clk@26M {
+                       #clock-cells = <0>;
+                       compatible = "fixed-factor-clock";
+                       clock-div = <2>;
+                       clock-mult = <1>;
+                       clocks = <&app52>;
+               };
+               /* Fast bridge  clocks */
+               fast_clk: fast_clk@26M {
+                       #clock-cells = <0>;
+                       compatible = "stericsson,u300-syscon-clk";
+                       clock-type = <1>; /* Fast */
+                       clock-id = <0>;
+                       clocks = <&app26>;
+               };
+               i2c0_clk: i2c0_clk@26M {
+                       #clock-cells = <0>;
+                       compatible = "stericsson,u300-syscon-clk";
+                       clock-type = <1>; /* Fast */
+                       clock-id = <1>;
+                       clocks = <&fast_clk>;
+               };
+               i2c1_clk: i2c1_clk@26M {
+                       #clock-cells = <0>;
+                       compatible = "stericsson,u300-syscon-clk";
+                       clock-type = <1>; /* Fast */
+                       clock-id = <2>;
+                       clocks = <&fast_clk>;
+               };
+               mmc_pclk: mmc_p_clk@26M {
+                       #clock-cells = <0>;
+                       compatible = "stericsson,u300-syscon-clk";
+                       clock-type = <1>; /* Fast */
+                       clock-id = <5>;
+                       clocks = <&fast_clk>;
+               };
+               mmc_mclk: mmc_mclk {
+                       #clock-cells = <0>;
+                       compatible = "stericsson,u300-syscon-mclk";
+                       clocks = <&mmc_pclk>;
+               };
+               spi_clk: spi_p_clk@26M {
+                       #clock-cells = <0>;
+                       compatible = "stericsson,u300-syscon-clk";
+                       clock-type = <1>; /* Fast */
+                       clock-id = <6>;
+                       clocks = <&fast_clk>;
+               };
+       };
+
+       timer: timer@c0014000 {
+               compatible = "stericsson,u300-apptimer";
+               reg = <0xc0014000 0x1000>;
+               interrupt-parent = <&vica>;
+               interrupts = <24 25 26 27>;
+               clocks = <&apptimer_clk>;
+       };
+
+       gpio: gpio@c0016000 {
+               compatible = "stericsson,gpio-coh901";
+               reg = <0xc0016000 0x1000>;
+               interrupt-parent = <&vicb>;
+               interrupts = <0 1 2 18 21 22 23>;
+               clocks = <&gpio_clk>;
+               interrupt-names = "gpio0", "gpio1", "gpio2", "gpio3",
+                               "gpio4", "gpio5", "gpio6";
+               interrupt-controller;
+               #interrupt-cells = <2>;
+               gpio-controller;
+               #gpio-cells = <2>;
+       };
+
+       pinctrl: pinctrl@c0011000 {
+               compatible = "stericsson,pinctrl-u300";
+               reg = <0xc0011000 0x1000>;
+       };
+
+       watchdog: watchdog@c0012000 {
+               compatible = "stericsson,coh901327";
+               reg = <0xc0012000 0x1000>;
+               interrupt-parent = <&vicb>;
+               interrupts = <3>;
+               clocks = <&clk32>;
+       };
+
+       rtc: rtc@c0017000 {
+               compatible = "stericsson,coh901331";
+               reg = <0xc0017000 0x1000>;
+               interrupt-parent = <&vicb>;
+               interrupts = <10>;
+               clocks = <&rtc_clk>;
+       };
+
+       dmac: dma-controller@c00020000 {
+               compatible = "stericsson,coh901318";
+               reg = <0xc0020000 0x1000>;
+               interrupt-parent = <&vica>;
+               interrupts = <2>;
+               #dma-cells = <1>;
+               dma-channels = <40>;
+               clocks = <&dmac_clk>;
+       };
+
+       /* A NAND flash of 128 MiB */
+       fsmc: flash@40000000 {
+               compatible = "stericsson,fsmc-nand";
+               #address-cells = <1>;
+               #size-cells = <1>;
+               reg = <0x9f800000 0x1000>,      /* FSMC Register*/
+                       <0x80000000 0x4000>,    /* NAND Base DATA */
+                       <0x80020000 0x4000>,    /* NAND Base ADDR */
+                       <0x80010000 0x4000>;    /* NAND Base CMD */
+               reg-names = "fsmc_regs", "nand_data", "nand_addr", "nand_cmd";
+               nand-skip-bbtscan;
+               clocks = <&fsmc_clk>;
+
+               partition@0 {
+               label = "boot records";
+                       reg = <0x0 0x20000>;
+               };
+               partition@20000 {
+                       label = "free";
+                       reg = <0x20000 0x7e0000>;
+               };
+               partition@800000 {
+                       label = "platform";
+                       reg = <0x800000 0xf800000>;
+               };
+       };
+
+       i2c0: i2c@c0004000 {
+               compatible = "st,ddci2c";
+               reg = <0xc0004000 0x1000>;
+               interrupt-parent = <&vicb>;
+               interrupts = <8>;
+               clocks = <&i2c0_clk>;
+               #address-cells = <1>;
+               #size-cells = <0>;
+               ab3100: ab3100@0x48 {
+                       compatible = "stericsson,ab3100";
+                       reg = <0x48>;
+                       interrupt-parent = <&vica>;
+                       interrupts = <0>; /* EXT0 IRQ */
+                       ab3100-regulators {
+                               compatible = "stericsson,ab3100-regulators";
+                               ab3100_ldo_a_reg: ab3100_ldo_a {
+                                       regulator-compatible = "ab3100_ldo_a";
+                                       startup-delay-us = <200>;
+                                       regulator-always-on;
+                                       regulator-boot-on;
+                               };
+                               ab3100_ldo_c_reg: ab3100_ldo_c {
+                                       regulator-compatible = "ab3100_ldo_c";
+                                       startup-delay-us = <200>;
+                               };
+                               ab3100_ldo_d_reg: ab3100_ldo_d {
+                                       regulator-compatible = "ab3100_ldo_d";
+                                       startup-delay-us = <200>;
+                               };
+                               ab3100_ldo_e_reg: ab3100_ldo_e {
+                                       regulator-compatible = "ab3100_ldo_e";
+                                       regulator-min-microvolt = <1800000>;
+                                       regulator-max-microvolt = <1800000>;
+                                       startup-delay-us = <200>;
+                                       regulator-always-on;
+                                       regulator-boot-on;
+                               };
+                               ab3100_ldo_f_reg: ab3100_ldo_f {
+                                       regulator-compatible = "ab3100_ldo_f";
+                                       regulator-min-microvolt = <2500000>;
+                                       regulator-max-microvolt = <2500000>;
+                                       startup-delay-us = <600>;
+                                       regulator-always-on;
+                                       regulator-boot-on;
+                               };
+                               ab3100_ldo_g_reg: ab3100_ldo_g {
+                                       regulator-compatible = "ab3100_ldo_g";
+                                       regulator-min-microvolt = <1500000>;
+                                       regulator-max-microvolt = <2850000>;
+                                       startup-delay-us = <400>;
+                               };
+                               ab3100_ldo_h_reg: ab3100_ldo_h {
+                                       regulator-compatible = "ab3100_ldo_h";
+                                       regulator-min-microvolt = <1200000>;
+                                       regulator-max-microvolt = <2750000>;
+                                       startup-delay-us = <200>;
+                               };
+                               ab3100_ldo_k_reg: ab3100_ldo_k {
+                                       regulator-compatible = "ab3100_ldo_k";
+                                       regulator-min-microvolt = <1800000>;
+                                       regulator-max-microvolt = <2750000>;
+                                       startup-delay-us = <200>;
+                               };
+                               ab3100_ext_reg: ab3100_ext {
+                                       regulator-compatible = "ab3100_ext";
+                               };
+                               ab3100_buck_reg: ab3100_buck {
+                                       regulator-compatible = "ab3100_buck";
+                                       regulator-min-microvolt = <1200000>;
+                                       regulator-max-microvolt = <1800000>;
+                                       startup-delay-us = <1000>;
+                                       regulator-always-on;
+                                       regulator-boot-on;
+                               };
+                       };
+               };
+       };
+
+       i2c1: i2c@c0005000 {
+               compatible = "st,ddci2c";
+               reg = <0xc0005000 0x1000>;
+               interrupt-parent = <&vicb>;
+               interrupts = <9>;
+               clocks = <&i2c1_clk>;
+               #address-cells = <1>;
+               #size-cells = <0>;
+               fwcam0: fwcam@0x10 {
+                       reg = <0x10>;
+               };
+               fwcam1: fwcam@0x5d {
+                       reg = <0x5d>;
+               };
+       };
+
+       amba {
+               compatible = "arm,amba-bus";
+               #address-cells = <1>;
+               #size-cells = <1>;
+               ranges;
+
+               vica: interrupt-controller@a0001000 {
+                       compatible = "arm,versatile-vic";
+                       interrupt-controller;
+                       #interrupt-cells = <1>;
+                       reg = <0xa0001000 0x20>;
+               };
+
+               vicb: interrupt-controller@a0002000 {
+                       compatible = "arm,versatile-vic";
+                       interrupt-controller;
+                       #interrupt-cells = <1>;
+                       reg = <0xa0002000 0x20>;
+               };
+
+               uart0: serial@c0013000 {
+                       compatible = "arm,pl011", "arm,primecell";
+                       reg = <0xc0013000 0x1000>;
+                       interrupt-parent = <&vica>;
+                       interrupts = <22>;
+                       clocks = <&uart0_clk>, <&uart0_clk>;
+                       clock-names = "apb_pclk", "uart0_clk";
+                       dmas = <&dmac 17 &dmac 18>;
+                       dma-names = "tx", "rx";
+               };
+
+               uart1: serial@c0007000 {
+                       compatible = "arm,pl011", "arm,primecell";
+                       reg = <0xc0007000 0x1000>;
+                       interrupt-parent = <&vicb>;
+                       interrupts = <20>;
+                       dmas = <&dmac 38 &dmac 39>;
+                       dma-names = "tx", "rx";
+               };
+
+               mmcsd: mmcsd@c0001000 {
+                       compatible = "arm,pl18x", "arm,primecell";
+                       reg = <0xc0001000 0x1000>;
+                       interrupt-parent = <&vicb>;
+                       interrupts = <6 7>;
+                       clocks = <&mmc_pclk>, <&mmc_mclk>;
+                       clock-names = "apb_pclk", "mclk";
+                       max-frequency = <24000000>;
+                       bus-width = <4>; // SD-card slot
+                       mmc-cap-mmc-highspeed;
+                       mmc-cap-sd-highspeed;
+                       cd-gpios = <&gpio 12 0x4>;
+                       cd-inverted;
+                       vmmc-supply = <&ab3100_ldo_g_reg>;
+                       dmas = <&dmac 14>;
+                       dma-names = "rx";
+               };
+
+               spi: ssp@c0006000 {
+                       compatible = "arm,pl022", "arm,primecell";
+                       reg = <0xc0006000 0x1000>;
+                       interrupt-parent = <&vica>;
+                       interrupts = <23>;
+                       clocks = <&spi_clk>, <&spi_clk>;
+                       clock-names = "apb_pclk", "spi_clk";
+                       dmas = <&dmac 27 &dmac 28>;
+                       dma-names = "tx", "rx";
+                       num-cs = <3>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       spi-dummy@1 {
+                               compatible = "arm,pl022-dummy";
+                               reg = <1>;
+                               spi-max-frequency = <20000000>;
+                       };
+               };
+       };
+};
index 14fb2e609babcc881deeff1c59ea8d39090ff90f..0dbee2c239057dd627b5e79eea6c18dacaa84086 100644 (file)
 
                uart0: uart@e0000000 {
                        compatible = "xlnx,xuartps";
+                       clocks = <&clkc 23>, <&clkc 40>;
+                       clock-names = "ref_clk", "aper_clk";
                        reg = <0xE0000000 0x1000>;
                        interrupts = <0 27 4>;
-                       clocks = <&uart_clk 0>;
                };
 
                uart1: uart@e0001000 {
                        compatible = "xlnx,xuartps";
+                       clocks = <&clkc 24>, <&clkc 41>;
+                       clock-names = "ref_clk", "aper_clk";
                        reg = <0xE0001000 0x1000>;
                        interrupts = <0 50 4>;
-                       clocks = <&uart_clk 1>;
                };
 
                slcr: slcr@f8000000 {
                                #address-cells = <1>;
                                #size-cells = <0>;
 
-                               ps_clk: ps_clk {
-                                       #clock-cells = <0>;
-                                       compatible = "fixed-clock";
-                                       /* clock-frequency set in board-specific file */
-                                       clock-output-names = "ps_clk";
-                               };
-                               armpll: armpll {
-                                       #clock-cells = <0>;
-                                       compatible = "xlnx,zynq-pll";
-                                       clocks = <&ps_clk>;
-                                       reg = <0x100 0x110>;
-                                       clock-output-names = "armpll";
-                               };
-                               ddrpll: ddrpll {
-                                       #clock-cells = <0>;
-                                       compatible = "xlnx,zynq-pll";
-                                       clocks = <&ps_clk>;
-                                       reg = <0x104 0x114>;
-                                       clock-output-names = "ddrpll";
-                               };
-                               iopll: iopll {
-                                       #clock-cells = <0>;
-                                       compatible = "xlnx,zynq-pll";
-                                       clocks = <&ps_clk>;
-                                       reg = <0x108 0x118>;
-                                       clock-output-names = "iopll";
-                               };
-                               uart_clk: uart_clk {
-                                       #clock-cells = <1>;
-                                       compatible = "xlnx,zynq-periph-clock";
-                                       clocks = <&iopll &armpll &ddrpll>;
-                                       reg = <0x154>;
-                                       clock-output-names = "uart0_ref_clk",
-                                                            "uart1_ref_clk";
-                               };
-                               cpu_clk: cpu_clk {
+                               clkc: clkc {
                                        #clock-cells = <1>;
-                                       compatible = "xlnx,zynq-cpu-clock";
-                                       clocks = <&iopll &armpll &ddrpll>;
-                                       reg = <0x120 0x1C4>;
-                                       clock-output-names = "cpu_6x4x",
-                                                            "cpu_3x2x",
-                                                            "cpu_2x",
-                                                            "cpu_1x";
+                                       compatible = "xlnx,ps7-clkc";
+                                       ps-clk-frequency = <33333333>;
+                                       clock-output-names = "armpll", "ddrpll", "iopll", "cpu_6or4x",
+                                                       "cpu_3or2x", "cpu_2x", "cpu_1x", "ddr2x", "ddr3x",
+                                                       "dci", "lqspi", "smc", "pcap", "gem0", "gem1",
+                                                       "fclk0", "fclk1", "fclk2", "fclk3", "can0", "can1",
+                                                       "sdio0", "sdio1", "uart0", "uart1", "spi0", "spi1",
+                                                       "dma", "usb0_aper", "usb1_aper", "gem0_aper",
+                                                       "gem1_aper", "sdio0_aper", "sdio1_aper",
+                                                       "spi0_aper", "spi1_aper", "can0_aper", "can1_aper",
+                                                       "i2c0_aper", "i2c1_aper", "uart0_aper", "uart1_aper",
+                                                       "gpio_aper", "lqspi_aper", "smc_aper", "swdt",
+                                                       "dbg_trc", "dbg_apb";
                                };
                        };
                };
                        interrupt-parent = <&intc>;
                        interrupts = < 0 10 4 0 11 4 0 12 4 >;
                        compatible = "cdns,ttc";
+                       clocks = <&clkc 6>;
                        reg = <0xF8001000 0x1000>;
-                       clocks = <&cpu_clk 3>;
-                       clock-names = "cpu_1x";
                        clock-ranges;
                };
 
                        interrupt-parent = <&intc>;
                        interrupts = < 0 37 4 0 38 4 0 39 4 >;
                        compatible = "cdns,ttc";
+                       clocks = <&clkc 6>;
                        reg = <0xF8002000 0x1000>;
-                       clocks = <&cpu_clk 3>;
-                       clock-names = "cpu_1x";
                        clock-ranges;
                };
                scutimer: scutimer@f8f00600 {
                        interrupts = < 1 13 0x301 >;
                        compatible = "arm,cortex-a9-twd-timer";
                        reg = < 0xf8f00600 0x20 >;
-                       clocks = <&cpu_clk 1>;
+                       clocks = <&clkc 4>;
                } ;
        };
 };
index 86f44d5b0265bf8fe3b7c6da4370d409e7f9b7d0..e25a307438ad27776f5994ba81ea99e46266dc9e 100644 (file)
@@ -28,7 +28,3 @@
        };
 
 };
-
-&ps_clk {
-       clock-frequency = <33333330>;
-};
index 9353184d730dfda864c85ec180b906b9ed575681..c3a4e9ceba34e3a71b1248874f27f888268255fa 100644 (file)
@@ -17,3 +17,6 @@ config SHARP_PARAM
 
 config SHARP_SCOOP
        bool
+
+config TI_PRIV_EDMA
+       bool
index 48434cbe3e89090d18d7bc3e4a799713631c8ac3..8c60f473e97625cb8c0bb068375da7368d1ff6fe 100644 (file)
@@ -16,3 +16,4 @@ obj-$(CONFIG_ARM_TIMER_SP804) += timer-sp.o
 obj-$(CONFIG_MCPM)             += mcpm_head.o mcpm_entry.o mcpm_platsmp.o vlock.o
 AFLAGS_mcpm_head.o             := -march=armv7-a
 AFLAGS_vlock.o                 := -march=armv7-a
+obj-$(CONFIG_TI_PRIV_EDMA)     += edma.o
similarity index 97%
rename from arch/arm/mach-davinci/dma.c
rename to arch/arm/common/edma.c
index 45b7c71d9cc1966bb514862364b5180cdd307060..a1db6cd8cf7937f0ff55dd2af47921d78da90f18 100644 (file)
@@ -25,7 +25,7 @@
 #include <linux/io.h>
 #include <linux/slab.h>
 
-#include <mach/edma.h>
+#include <linux/platform_data/edma.h>
 
 /* Offsets matching "struct edmacc_param" */
 #define PARM_OPT               0x00
@@ -494,26 +494,6 @@ static irqreturn_t dma_ccerr_handler(int irq, void *data)
        return IRQ_HANDLED;
 }
 
-/******************************************************************************
- *
- * Transfer controller error interrupt handlers
- *
- *****************************************************************************/
-
-#define tc_errs_handled        false   /* disabled as long as they're NOPs */
-
-static irqreturn_t dma_tc0err_handler(int irq, void *data)
-{
-       dev_dbg(data, "dma_tc0err_handler\n");
-       return IRQ_HANDLED;
-}
-
-static irqreturn_t dma_tc1err_handler(int irq, void *data)
-{
-       dev_dbg(data, "dma_tc1err_handler\n");
-       return IRQ_HANDLED;
-}
-
 static int reserve_contiguous_slots(int ctlr, unsigned int id,
                                     unsigned int num_slots,
                                     unsigned int start_slot)
@@ -1541,23 +1521,6 @@ static int __init edma_probe(struct platform_device *pdev)
                arch_num_cc++;
        }
 
-       if (tc_errs_handled) {
-               status = request_irq(IRQ_TCERRINT0, dma_tc0err_handler, 0,
-                                       "edma_tc0", &pdev->dev);
-               if (status < 0) {
-                       dev_dbg(&pdev->dev, "request_irq %d failed --> %d\n",
-                               IRQ_TCERRINT0, status);
-                       return status;
-               }
-               status = request_irq(IRQ_TCERRINT, dma_tc1err_handler, 0,
-                                       "edma_tc1", &pdev->dev);
-               if (status < 0) {
-                       dev_dbg(&pdev->dev, "request_irq %d --> %d\n",
-                               IRQ_TCERRINT, status);
-                       return status;
-               }
-       }
-
        return 0;
 
 fail:
index 1cd94c36321f90f13fee4eb8c197838fb8073ad1..9e8c8316d6b074004686ab7f86cb133c59729767 100644 (file)
@@ -31,21 +31,18 @@ CONFIG_EP7211_DONGLE=y
 # CONFIG_WIRELESS is not set
 CONFIG_MTD=y
 CONFIG_MTD_CMDLINE_PARTS=y
-CONFIG_MTD_CHAR=y
 CONFIG_MTD_BLOCK=y
 CONFIG_MTD_CFI=y
 CONFIG_MTD_JEDECPROBE=y
 CONFIG_MTD_CFI_INTELEXT=y
 CONFIG_MTD_CFI_AMDSTD=y
 CONFIG_MTD_CFI_STAA=y
-CONFIG_MTD_AUTCPU12=y
 CONFIG_MTD_PLATRAM=y
 CONFIG_MTD_NAND=y
 CONFIG_MTD_NAND_GPIO=y
 CONFIG_NETDEVICES=y
 # CONFIG_NET_CADENCE is not set
 # CONFIG_NET_VENDOR_BROADCOM is not set
-# CONFIG_NET_VENDOR_CHELSIO is not set
 CONFIG_CS89x0=y
 CONFIG_CS89x0_PLATFORM=y
 # CONFIG_NET_VENDOR_FARADAY is not set
@@ -63,7 +60,11 @@ CONFIG_CS89x0_PLATFORM=y
 # CONFIG_VT is not set
 CONFIG_SERIAL_CLPS711X_CONSOLE=y
 # CONFIG_HW_RANDOM is not set
+CONFIG_I2C=y
+CONFIG_I2C_GPIO=y
 CONFIG_SPI=y
+CONFIG_SPI_CLPS711X=y
+CONFIG_GPIO_CLPS711X=y
 CONFIG_GPIO_GENERIC_PLATFORM=y
 # CONFIG_HWMON is not set
 CONFIG_FB=y
@@ -87,4 +88,3 @@ CONFIG_DEBUG_LL=y
 CONFIG_EARLY_PRINTK=y
 # CONFIG_CRYPTO_ANSI_CPRNG is not set
 # CONFIG_CRYPTO_HW is not set
-# CONFIG_CRC32 is not set
index 6ec010f248b5b54a73cea23d06691c207e3ea468..06686e7303a95d8e739fea7f635438e0bf91bc6a 100644 (file)
@@ -37,6 +37,8 @@ CONFIG_MACH_IMX51_DT=y
 CONFIG_MACH_EUKREA_CPUIMX51SD=y
 CONFIG_SOC_IMX53=y
 CONFIG_SOC_IMX6Q=y
+CONFIG_SOC_IMX6SL=y
+CONFIG_SOC_VF610=y
 CONFIG_MXC_PWM=y
 CONFIG_SMP=y
 CONFIG_VMSPLIT_2G=y
@@ -47,6 +49,7 @@ CONFIG_CMDLINE="noinitrd console=ttymxc0,115200"
 CONFIG_VFP=y
 CONFIG_NEON=y
 CONFIG_BINFMT_MISC=m
+CONFIG_PM_RUNTIME=y
 CONFIG_PM_DEBUG=y
 CONFIG_PM_TEST_SUSPEND=y
 CONFIG_NET=y
@@ -170,6 +173,7 @@ CONFIG_BACKLIGHT_LCD_SUPPORT=y
 CONFIG_LCD_CLASS_DEVICE=y
 CONFIG_LCD_L4F00242T03=y
 CONFIG_BACKLIGHT_CLASS_DEVICE=y
+CONFIG_BACKLIGHT_PWM=y
 CONFIG_FRAMEBUFFER_CONSOLE=y
 CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y
 CONFIG_FONTS=y
@@ -182,6 +186,7 @@ CONFIG_SND_SOC=y
 CONFIG_SND_IMX_SOC=y
 CONFIG_SND_SOC_PHYCORE_AC97=y
 CONFIG_SND_SOC_EUKREA_TLV320=y
+CONFIG_SND_SOC_IMX_WM8962=y
 CONFIG_SND_SOC_IMX_SGTL5000=y
 CONFIG_SND_SOC_IMX_MC13783=y
 CONFIG_USB=y
@@ -208,10 +213,15 @@ CONFIG_IMX_SDMA=y
 CONFIG_MXS_DMA=y
 CONFIG_STAGING=y
 CONFIG_DRM_IMX=y
+CONFIG_DRM_IMX_TVE=y
+CONFIG_DRM_IMX_FB_HELPER=y
+CONFIG_DRM_IMX_PARALLEL_DISPLAY=y
 CONFIG_DRM_IMX_IPUV3_CORE=y
 CONFIG_DRM_IMX_IPUV3=y
 CONFIG_COMMON_CLK_DEBUG=y
 # CONFIG_IOMMU_SUPPORT is not set
+CONFIG_PWM=y
+CONFIG_PWM_IMX=y
 CONFIG_EXT2_FS=y
 CONFIG_EXT2_FS_XATTR=y
 CONFIG_EXT2_FS_POSIX_ACL=y
diff --git a/arch/arm/configs/keystone_defconfig b/arch/arm/configs/keystone_defconfig
new file mode 100644 (file)
index 0000000..62e968c
--- /dev/null
@@ -0,0 +1,157 @@
+# CONFIG_SWAP is not set
+CONFIG_POSIX_MQUEUE=y
+CONFIG_HIGH_RES_TIMERS=y
+CONFIG_IKCONFIG=y
+CONFIG_IKCONFIG_PROC=y
+CONFIG_LOG_BUF_SHIFT=14
+CONFIG_BLK_DEV_INITRD=y
+CONFIG_SYSCTL_SYSCALL=y
+CONFIG_KALLSYMS_ALL=y
+# CONFIG_ELF_CORE is not set
+# CONFIG_BASE_FULL is not set
+CONFIG_EMBEDDED=y
+CONFIG_PROFILING=y
+CONFIG_OPROFILE=y
+CONFIG_KPROBES=y
+CONFIG_MODULES=y
+CONFIG_MODULE_FORCE_LOAD=y
+CONFIG_MODULE_UNLOAD=y
+CONFIG_MODULE_FORCE_UNLOAD=y
+CONFIG_MODVERSIONS=y
+CONFIG_ARCH_KEYSTONE=y
+CONFIG_ARM_LPAE=y
+CONFIG_SMP=y
+CONFIG_PREEMPT=y
+CONFIG_AEABI=y
+CONFIG_HIGHMEM=y
+CONFIG_VFP=y
+CONFIG_NEON=y
+# CONFIG_SUSPEND is not set
+CONFIG_PM_RUNTIME=y
+CONFIG_NET=y
+CONFIG_PACKET=y
+CONFIG_UNIX=y
+CONFIG_UNIX_DIAG=y
+CONFIG_XFRM_USER=y
+CONFIG_XFRM_SUB_POLICY=y
+CONFIG_XFRM_STATISTICS=y
+CONFIG_NET_KEY=y
+CONFIG_NET_KEY_MIGRATE=y
+CONFIG_INET=y
+CONFIG_IP_MULTICAST=y
+CONFIG_IP_ADVANCED_ROUTER=y
+CONFIG_IP_MULTIPLE_TABLES=y
+CONFIG_IP_ROUTE_MULTIPATH=y
+CONFIG_IP_ROUTE_VERBOSE=y
+CONFIG_IP_PNP=y
+CONFIG_IP_PNP_DHCP=y
+CONFIG_IP_PNP_BOOTP=y
+CONFIG_NET_IPIP=y
+CONFIG_NET_IPGRE_DEMUX=y
+CONFIG_NET_IPGRE=y
+CONFIG_IP_MROUTE=y
+CONFIG_IP_MROUTE_MULTIPLE_TABLES=y
+CONFIG_IP_PIMSM_V2=y
+CONFIG_INET_AH=y
+CONFIG_INET_IPCOMP=y
+CONFIG_IPV6=y
+CONFIG_INET6_XFRM_MODE_TRANSPORT=m
+CONFIG_INET6_XFRM_MODE_TUNNEL=m
+CONFIG_INET6_XFRM_MODE_BEET=m
+CONFIG_IPV6_SIT=m
+CONFIG_IPV6_MULTIPLE_TABLES=y
+CONFIG_IPV6_SUBTREES=y
+CONFIG_IPV6_MROUTE=y
+CONFIG_IPV6_PIMSM_V2=y
+CONFIG_NETFILTER=y
+CONFIG_NF_CONNTRACK=y
+CONFIG_NF_CT_NETLINK=y
+CONFIG_NETFILTER_XT_TARGET_CLASSIFY=y
+CONFIG_NETFILTER_XT_TARGET_CONNMARK=y
+CONFIG_NETFILTER_XT_TARGET_IDLETIMER=y
+CONFIG_NETFILTER_XT_TARGET_MARK=y
+CONFIG_NETFILTER_XT_MATCH_COMMENT=y
+CONFIG_NETFILTER_XT_MATCH_CONNBYTES=y
+CONFIG_NETFILTER_XT_MATCH_CONNLIMIT=y
+CONFIG_NETFILTER_XT_MATCH_CONNMARK=y
+CONFIG_NETFILTER_XT_MATCH_CONNTRACK=y
+CONFIG_NETFILTER_XT_MATCH_CPU=y
+CONFIG_NETFILTER_XT_MATCH_IPRANGE=y
+CONFIG_NETFILTER_XT_MATCH_LENGTH=y
+CONFIG_NETFILTER_XT_MATCH_MAC=y
+CONFIG_NETFILTER_XT_MATCH_MARK=y
+CONFIG_NETFILTER_XT_MATCH_MULTIPORT=y
+CONFIG_NETFILTER_XT_MATCH_PKTTYPE=y
+CONFIG_NETFILTER_XT_MATCH_STATE=y
+CONFIG_NF_CONNTRACK_IPV4=y
+CONFIG_IP_NF_IPTABLES=y
+CONFIG_IP_NF_MATCH_AH=y
+CONFIG_IP_NF_MATCH_ECN=y
+CONFIG_IP_NF_MATCH_TTL=y
+CONFIG_IP_NF_FILTER=y
+CONFIG_IP_NF_TARGET_REJECT=y
+CONFIG_IP_NF_TARGET_ULOG=y
+CONFIG_IP_NF_MANGLE=y
+CONFIG_IP_NF_TARGET_CLUSTERIP=y
+CONFIG_IP_NF_TARGET_ECN=y
+CONFIG_IP_NF_TARGET_TTL=y
+CONFIG_IP_NF_RAW=y
+CONFIG_IP_NF_ARPTABLES=y
+CONFIG_IP_NF_ARPFILTER=y
+CONFIG_IP_NF_ARP_MANGLE=y
+CONFIG_IP6_NF_IPTABLES=m
+CONFIG_IP_SCTP=y
+CONFIG_VLAN_8021Q=y
+CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
+CONFIG_CMA=y
+CONFIG_MTD=y
+CONFIG_MTD_CMDLINE_PARTS=y
+CONFIG_MTD_BLOCK=y
+CONFIG_MTD_PLATRAM=y
+CONFIG_MTD_M25P80=y
+CONFIG_MTD_NAND=y
+CONFIG_MTD_UBI=y
+CONFIG_PROC_DEVICETREE=y
+CONFIG_BLK_DEV_LOOP=y
+CONFIG_EEPROM_AT24=y
+CONFIG_NETDEVICES=y
+CONFIG_SERIAL_8250=y
+CONFIG_SERIAL_8250_CONSOLE=y
+CONFIG_SERIAL_OF_PLATFORM=y
+# CONFIG_HW_RANDOM is not set
+CONFIG_I2C=y
+# CONFIG_I2C_COMPAT is not set
+CONFIG_I2C_CHARDEV=y
+CONFIG_SPI=y
+CONFIG_SPI_SPIDEV=y
+# CONFIG_HWMON is not set
+CONFIG_WATCHDOG=y
+# CONFIG_USB_SUPPORT is not set
+CONFIG_DMADEVICES=y
+CONFIG_COMMON_CLK_DEBUG=y
+CONFIG_MEMORY=y
+CONFIG_TMPFS=y
+CONFIG_JFFS2_FS=y
+CONFIG_JFFS2_FS_WBUF_VERIFY=y
+CONFIG_UBIFS_FS=y
+CONFIG_CRAMFS=y
+CONFIG_NFS_FS=y
+CONFIG_NFS_V3_ACL=y
+CONFIG_ROOT_NFS=y
+CONFIG_NFSD=y
+CONFIG_NFSD_V3=y
+CONFIG_NFSD_V3_ACL=y
+CONFIG_PRINTK_TIME=y
+CONFIG_DEBUG_SHIRQ=y
+CONFIG_DEBUG_INFO=y
+CONFIG_DEBUG_USER=y
+CONFIG_CRYPTO_USER=y
+CONFIG_CRYPTO_NULL=y
+CONFIG_CRYPTO_AUTHENC=y
+CONFIG_CRYPTO_CBC=y
+CONFIG_CRYPTO_CTR=y
+CONFIG_CRYPTO_XCBC=y
+CONFIG_CRYPTO_DES=y
+CONFIG_CRYPTO_ANSI_CPRNG=y
+CONFIG_CRYPTO_USER_API_HASH=y
+CONFIG_CRYPTO_USER_API_SKCIPHER=y
index a1d8252e9ec75339454611c5b1d8f0073b674544..0f2aa61911a33361c5cad2210135a791f80d4259 100644 (file)
@@ -1,4 +1,3 @@
-CONFIG_EXPERIMENTAL=y
 CONFIG_SYSVIPC=y
 CONFIG_NO_HZ=y
 CONFIG_HIGH_RES_TIMERS=y
@@ -31,6 +30,7 @@ CONFIG_MACH_T5325=y
 CONFIG_MACH_TS219=y
 CONFIG_MACH_TS41X=y
 CONFIG_MACH_CLOUDBOX_DT=y
+CONFIG_MACH_DB88F628X_BP_DT=y
 CONFIG_MACH_DLINK_KIRKWOOD_DT=y
 CONFIG_MACH_DOCKSTAR_DT=y
 CONFIG_MACH_DREAMPLUG_DT=y
@@ -50,14 +50,19 @@ CONFIG_MACH_NETSPACE_V2_DT=y
 CONFIG_MACH_NSA310_DT=y
 CONFIG_MACH_OPENBLOCKS_A6_DT=y
 CONFIG_MACH_READYNAS_DT=y
+CONFIG_MACH_SHEEVAPLUG_DT=y
 CONFIG_MACH_TOPKICK_DT=y
 CONFIG_MACH_TS219_DT=y
 # CONFIG_CPU_FEROCEON_OLD_ID is not set
+CONFIG_PCI_MVEBU=y
 CONFIG_PREEMPT=y
 CONFIG_AEABI=y
 # CONFIG_OABI_COMPAT is not set
 CONFIG_ZBOOT_ROM_TEXT=0x0
 CONFIG_ZBOOT_ROM_BSS=0x0
+CONFIG_CPU_FREQ=y
+CONFIG_CPU_FREQ_STAT_DETAILS=y
+CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y
 CONFIG_CPU_IDLE=y
 CONFIG_NET=y
 CONFIG_PACKET=y
@@ -68,14 +73,12 @@ CONFIG_IP_PNP=y
 CONFIG_IP_PNP_DHCP=y
 CONFIG_IP_PNP_BOOTP=y
 # CONFIG_IPV6 is not set
-CONFIG_NET_DSA=y
 CONFIG_NET_PKTGEN=m
 CONFIG_CFG80211=y
 CONFIG_MAC80211=y
 CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
 CONFIG_MTD=y
 CONFIG_MTD_CMDLINE_PARTS=y
-CONFIG_MTD_CHAR=y
 CONFIG_MTD_BLOCK=y
 CONFIG_MTD_CFI=y
 CONFIG_MTD_JEDECPROBE=y
@@ -140,6 +143,7 @@ CONFIG_HID_TOPSEED=y
 CONFIG_HID_THRUSTMASTER=y
 CONFIG_HID_ZEROPLUS=y
 CONFIG_USB=y
+CONFIG_USB_XHCI_HCD=y
 CONFIG_USB_EHCI_HCD=y
 CONFIG_USB_EHCI_ROOT_HUB_TT=y
 CONFIG_USB_PRINTER=m
index 2e67a272df70b2a98cc13ebcad3176e63e7adb50..4aa640106611606a81a18b0909e2aa51547df273 100644 (file)
@@ -31,10 +31,12 @@ CONFIG_SATA_HIGHBANK=y
 CONFIG_SATA_MV=y
 CONFIG_SATA_AHCI_PLATFORM=y
 CONFIG_NETDEVICES=y
+CONFIG_SUN4I_EMAC=y
 CONFIG_NET_CALXEDA_XGMAC=y
 CONFIG_SMSC911X=y
 CONFIG_STMMAC_ETH=y
 CONFIG_SERIO_AMBAKMI=y
+CONFIG_MDIO_SUN4I=y
 CONFIG_SERIAL_8250=y
 CONFIG_SERIAL_8250_CONSOLE=y
 CONFIG_SERIAL_8250_DW=y
index f3e8ae001ff15d6ee00a14260937b6008af2ee71..731814e2c189eeae25c80e27464e000aa18d8cd2 100644 (file)
@@ -13,6 +13,8 @@ CONFIG_MACH_ARMADA_370=y
 CONFIG_MACH_ARMADA_XP=y
 # CONFIG_CACHE_L2X0 is not set
 # CONFIG_SWP_EMULATE is not set
+CONFIG_PCI=y
+CONFIG_PCI_MVEBU=y
 CONFIG_SMP=y
 CONFIG_AEABI=y
 CONFIG_HIGHMEM=y
@@ -60,6 +62,8 @@ CONFIG_USB_SUPPORT=y
 CONFIG_USB=y
 CONFIG_USB_EHCI_HCD=y
 CONFIG_USB_EHCI_ROOT_HUB_TT=y
+CONFIG_USB_STORAGE=y
+CONFIG_USB_XHCI_HCD=y
 CONFIG_MMC=y
 CONFIG_MMC_MVSDIO=y
 CONFIG_NEW_LEDS=y
@@ -96,5 +100,3 @@ CONFIG_TIMER_STATS=y
 # CONFIG_DEBUG_BUGVERBOSE is not set
 CONFIG_DEBUG_INFO=y
 CONFIG_DEBUG_USER=y
-CONFIG_DEBUG_LL=y
-CONFIG_EARLY_PRINTK=y
index 374000ec4e4e9a66bbf07304abd75dced85a0b66..fd81a1b99cce5a0971315fb17bfb7f1c87f67773 100644 (file)
@@ -1,7 +1,8 @@
-CONFIG_EXPERIMENTAL=y
 # CONFIG_LOCALVERSION_AUTO is not set
 # CONFIG_SWAP is not set
 CONFIG_SYSVIPC=y
+CONFIG_NO_HZ=y
+CONFIG_HIGH_RES_TIMERS=y
 CONFIG_LOG_BUF_SHIFT=14
 CONFIG_EXPERT=y
 # CONFIG_AIO is not set
@@ -11,12 +12,9 @@ CONFIG_MODULE_UNLOAD=y
 # CONFIG_LBDAF is not set
 # CONFIG_BLK_DEV_BSG is not set
 # CONFIG_IOSCHED_CFQ is not set
+# CONFIG_ARCH_MULTI_V7 is not set
 CONFIG_ARCH_U300=y
-CONFIG_MACH_U300=y
-CONFIG_MACH_U300_BS335=y
 CONFIG_MACH_U300_SPIDUMMY=y
-CONFIG_NO_HZ=y
-CONFIG_HIGH_RES_TIMERS=y
 CONFIG_PREEMPT=y
 CONFIG_AEABI=y
 CONFIG_ZBOOT_ROM_TEXT=0x0
@@ -44,14 +42,15 @@ CONFIG_I2C=y
 # CONFIG_HWMON is not set
 CONFIG_WATCHDOG=y
 CONFIG_REGULATOR=y
+CONFIG_REGULATOR_FIXED_VOLTAGE=y
 CONFIG_FB=y
 CONFIG_BACKLIGHT_LCD_SUPPORT=y
 # CONFIG_LCD_CLASS_DEVICE is not set
 CONFIG_BACKLIGHT_CLASS_DEVICE=y
-# CONFIG_HID_SUPPORT is not set
 # CONFIG_USB_SUPPORT is not set
 CONFIG_MMC=y
-CONFIG_MMC_CLKGATE=y
+CONFIG_MMC_UNSAFE_RESUME=y
+# CONFIG_MMC_BLOCK_BOUNCE is not set
 CONFIG_MMC_ARMMMCI=y
 CONFIG_RTC_CLASS=y
 # CONFIG_RTC_HCTOSYS is not set
@@ -70,4 +69,3 @@ CONFIG_DEBUG_FS=y
 CONFIG_TIMER_STATS=y
 # CONFIG_DEBUG_PREEMPT is not set
 CONFIG_DEBUG_INFO=y
-# CONFIG_CRC32 is not set
index 05ee9eebad6b3feb7da31a225f64d10b297d897b..a5fef710af3225b70a35c733335418dcbd3dc830 100644 (file)
  * assumes FIQs are enabled, and that the processor is in SVC mode.
  */
        .macro  save_and_disable_irqs, oldcpsr
+#ifdef CONFIG_CPU_V7M
+       mrs     \oldcpsr, primask
+#else
        mrs     \oldcpsr, cpsr
+#endif
        disable_irq
        .endm
 
  * guarantee that this will preserve the flags.
  */
        .macro  restore_irqs_notrace, oldcpsr
+#ifdef CONFIG_CPU_V7M
+       msr     primask, \oldcpsr
+#else
        msr     cpsr_c, \oldcpsr
+#endif
        .endm
 
        .macro restore_irqs, oldcpsr
 #endif
        .endm
 
-#ifdef CONFIG_THUMB2_KERNEL
+#if defined(CONFIG_CPU_V7M)
+       /*
+        * setmode is used to assert to be in svc mode during boot. For v7-M
+        * this is done in __v7m_setup, so setmode can be empty here.
+        */
+       .macro  setmode, mode, reg
+       .endm
+#elif defined(CONFIG_THUMB2_KERNEL)
        .macro  setmode, mode, reg
        mov     \reg, #\mode
        msr     cpsr_c, \reg
index 1f3262e99d81e6e7be2bf3864b6649d32a39b0da..cedd3721318b2f1a4251717ab383ee865e2aef7c 100644 (file)
@@ -61,6 +61,20 @@ static inline void set_cr(unsigned int val)
        isb();
 }
 
+static inline unsigned int get_auxcr(void)
+{
+       unsigned int val;
+       asm("mrc p15, 0, %0, c1, c0, 1  @ get AUXCR" : "=r" (val));
+       return val;
+}
+
+static inline void set_auxcr(unsigned int val)
+{
+       asm volatile("mcr p15, 0, %0, c1, c0, 1 @ set AUXCR"
+         : : "r" (val));
+       isb();
+}
+
 #ifndef CONFIG_SMP
 extern void adjust_cr(unsigned long mask, unsigned long set);
 #endif
index 7652712d1d149ea07a8e5052746391014124ffdf..ec635ff32f493d872a4aed9a488ba6a574c9eb29 100644 (file)
 #define CPUID_TLBTYPE  3
 #define CPUID_MPIDR    5
 
+#ifdef CONFIG_CPU_V7M
+#define CPUID_EXT_PFR0 0x40
+#define CPUID_EXT_PFR1 0x44
+#define CPUID_EXT_DFR0 0x48
+#define CPUID_EXT_AFR0 0x4c
+#define CPUID_EXT_MMFR0        0x50
+#define CPUID_EXT_MMFR1        0x54
+#define CPUID_EXT_MMFR2        0x58
+#define CPUID_EXT_MMFR3        0x5c
+#define CPUID_EXT_ISAR0        0x60
+#define CPUID_EXT_ISAR1        0x64
+#define CPUID_EXT_ISAR2        0x68
+#define CPUID_EXT_ISAR3        0x6c
+#define CPUID_EXT_ISAR4        0x70
+#define CPUID_EXT_ISAR5        0x74
+#else
 #define CPUID_EXT_PFR0 "c1, 0"
 #define CPUID_EXT_PFR1 "c1, 1"
 #define CPUID_EXT_DFR0 "c1, 2"
@@ -24,6 +40,7 @@
 #define CPUID_EXT_ISAR3        "c2, 3"
 #define CPUID_EXT_ISAR4        "c2, 4"
 #define CPUID_EXT_ISAR5        "c2, 5"
+#endif
 
 #define MPIDR_SMP_BITMASK (0x3 << 30)
 #define MPIDR_SMP_VALUE (0x2 << 30)
@@ -79,7 +96,23 @@ extern unsigned int processor_id;
                __val;                                                  \
        })
 
-#else /* ifdef CONFIG_CPU_CP15 */
+#elif defined(CONFIG_CPU_V7M)
+
+#include <asm/io.h>
+#include <asm/v7m.h>
+
+#define read_cpuid(reg)                                                        \
+       ({                                                              \
+               WARN_ON_ONCE(1);                                        \
+               0;                                                      \
+       })
+
+static inline unsigned int __attribute_const__ read_cpuid_ext(unsigned offset)
+{
+       return readl(BASEADDR_V7M_SCB + offset);
+}
+
+#else /* ifdef CONFIG_CPU_CP15 / elif defined (CONFIG_CPU_V7M) */
 
 /*
  * read_cpuid and read_cpuid_ext should only ever be called on machines that
@@ -106,7 +139,14 @@ static inline unsigned int __attribute_const__ read_cpuid_id(void)
        return read_cpuid(CPUID_ID);
 }
 
-#else /* ifdef CONFIG_CPU_CP15 */
+#elif defined(CONFIG_CPU_V7M)
+
+static inline unsigned int __attribute_const__ read_cpuid_id(void)
+{
+       return readl(BASEADDR_V7M_SCB + V7M_SCB_CPUID);
+}
+
+#else /* ifdef CONFIG_CPU_CP15 / elif defined(CONFIG_CPU_V7M) */
 
 static inline unsigned int __attribute_const__ read_cpuid_id(void)
 {
index ea289e1435e742807f48550200582de5630bf817..c81adc08b3fba5268b0acc81588203b9ef06aeae 100644 (file)
 # endif
 #endif
 
+#if defined(CONFIG_CPU_V7M)
+# ifdef _CACHE
+#  define MULTI_CACHE 1
+# else
+#  define _CACHE nop
+# endif
+#endif
+
 #if !defined(_CACHE) && !defined(MULTI_CACHE)
 #error Unknown cache maintenance model
 #endif
 
+#ifndef __ASSEMBLER__
+extern inline void nop_flush_icache_all(void) { }
+extern inline void nop_flush_kern_cache_all(void) { }
+extern inline void nop_flush_kern_cache_louis(void) { }
+extern inline void nop_flush_user_cache_all(void) { }
+extern inline void nop_flush_user_cache_range(unsigned long a,
+               unsigned long b, unsigned int c) { }
+
+extern inline void nop_coherent_kern_range(unsigned long a, unsigned long b) { }
+extern inline int nop_coherent_user_range(unsigned long a,
+               unsigned long b) { return 0; }
+extern inline void nop_flush_kern_dcache_area(void *a, size_t s) { }
+
+extern inline void nop_dma_flush_range(const void *a, const void *b) { }
+
+extern inline void nop_dma_map_area(const void *s, size_t l, int f) { }
+extern inline void nop_dma_unmap_area(const void *s, size_t l, int f) { }
+#endif
+
 #ifndef MULTI_CACHE
 #define __cpuc_flush_icache_all                __glue(_CACHE,_flush_icache_all)
 #define __cpuc_flush_kern_all          __glue(_CACHE,_flush_kern_cache_all)
index b6e9f2c108b5d726659938961684dc3374dfe5f0..6b70f1b46a6e3198296d452b36f11dda4b6d6617 100644 (file)
 # endif
 #endif
 
+#ifdef CONFIG_CPU_ABRT_NOMMU
+# ifdef CPU_DABORT_HANDLER
+#  define MULTI_DABORT 1
+# else
+#  define CPU_DABORT_HANDLER nommu_early_abort
+# endif
+#endif
+
 #ifndef CPU_DABORT_HANDLER
 #error Unknown data abort handler type
 #endif
index ac1dd54724b6a073415cc6a6704284c81556d6da..f2f39bcf7945a29de90f59d6afdd79e67bd06f43 100644 (file)
 # endif
 #endif
 
+#ifdef CONFIG_CPU_V7M
+# ifdef CPU_NAME
+#  undef  MULTI_CPU
+#  define MULTI_CPU
+# else
+#  define CPU_NAME cpu_v7m
+# endif
+#endif
+
 #ifndef MULTI_CPU
 #define cpu_proc_init                  __glue(CPU_NAME,_proc_init)
 #define cpu_proc_fin                   __glue(CPU_NAME,_proc_fin)
diff --git a/arch/arm/include/asm/hardware/pci_v3.h b/arch/arm/include/asm/hardware/pci_v3.h
deleted file mode 100644 (file)
index 2811c7e..0000000
+++ /dev/null
@@ -1,186 +0,0 @@
-/*
- *  arch/arm/include/asm/hardware/pci_v3.h
- *
- *  Internal header file PCI V3 chip
- *
- *  Copyright (C) ARM Limited
- *  Copyright (C) 2000-2001 Deep Blue Solutions Ltd.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * 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 ASM_ARM_HARDWARE_PCI_V3_H
-#define ASM_ARM_HARDWARE_PCI_V3_H
-
-/* -------------------------------------------------------------------------------
- *  V3 Local Bus to PCI Bridge definitions
- * -------------------------------------------------------------------------------
- *  Registers (these are taken from page 129 of the EPC User's Manual Rev 1.04
- *  All V3 register names are prefaced by V3_ to avoid clashing with any other
- *  PCI definitions.  Their names match the user's manual.
- * 
- *  I'm assuming that I20 is disabled.
- * 
- */
-#define V3_PCI_VENDOR                   0x00000000
-#define V3_PCI_DEVICE                   0x00000002
-#define V3_PCI_CMD                      0x00000004
-#define V3_PCI_STAT                     0x00000006
-#define V3_PCI_CC_REV                   0x00000008
-#define V3_PCI_HDR_CFG                  0x0000000C
-#define V3_PCI_IO_BASE                  0x00000010
-#define V3_PCI_BASE0                    0x00000014
-#define V3_PCI_BASE1                    0x00000018
-#define V3_PCI_SUB_VENDOR               0x0000002C
-#define V3_PCI_SUB_ID                   0x0000002E
-#define V3_PCI_ROM                      0x00000030
-#define V3_PCI_BPARAM                   0x0000003C
-#define V3_PCI_MAP0                     0x00000040
-#define V3_PCI_MAP1                     0x00000044
-#define V3_PCI_INT_STAT                 0x00000048
-#define V3_PCI_INT_CFG                  0x0000004C 
-#define V3_LB_BASE0                     0x00000054
-#define V3_LB_BASE1                     0x00000058
-#define V3_LB_MAP0                      0x0000005E
-#define V3_LB_MAP1                      0x00000062
-#define V3_LB_BASE2                     0x00000064
-#define V3_LB_MAP2                      0x00000066
-#define V3_LB_SIZE                      0x00000068
-#define V3_LB_IO_BASE                   0x0000006E
-#define V3_FIFO_CFG                     0x00000070
-#define V3_FIFO_PRIORITY                0x00000072
-#define V3_FIFO_STAT                    0x00000074
-#define V3_LB_ISTAT                     0x00000076
-#define V3_LB_IMASK                     0x00000077
-#define V3_SYSTEM                       0x00000078
-#define V3_LB_CFG                       0x0000007A
-#define V3_PCI_CFG                      0x0000007C
-#define V3_DMA_PCI_ADR0                 0x00000080
-#define V3_DMA_PCI_ADR1                 0x00000090
-#define V3_DMA_LOCAL_ADR0               0x00000084
-#define V3_DMA_LOCAL_ADR1               0x00000094
-#define V3_DMA_LENGTH0                  0x00000088
-#define V3_DMA_LENGTH1                  0x00000098
-#define V3_DMA_CSR0                     0x0000008B
-#define V3_DMA_CSR1                     0x0000009B
-#define V3_DMA_CTLB_ADR0                0x0000008C
-#define V3_DMA_CTLB_ADR1                0x0000009C
-#define V3_DMA_DELAY                    0x000000E0
-#define V3_MAIL_DATA                    0x000000C0
-#define V3_PCI_MAIL_IEWR                0x000000D0
-#define V3_PCI_MAIL_IERD                0x000000D2
-#define V3_LB_MAIL_IEWR                 0x000000D4
-#define V3_LB_MAIL_IERD                 0x000000D6
-#define V3_MAIL_WR_STAT                 0x000000D8
-#define V3_MAIL_RD_STAT                 0x000000DA
-#define V3_QBA_MAP                      0x000000DC
-
-/*  PCI COMMAND REGISTER bits
- */
-#define V3_COMMAND_M_FBB_EN             (1 << 9)
-#define V3_COMMAND_M_SERR_EN            (1 << 8)
-#define V3_COMMAND_M_PAR_EN             (1 << 6)
-#define V3_COMMAND_M_MASTER_EN          (1 << 2)
-#define V3_COMMAND_M_MEM_EN             (1 << 1)
-#define V3_COMMAND_M_IO_EN              (1 << 0)
-
-/*  SYSTEM REGISTER bits
- */
-#define V3_SYSTEM_M_RST_OUT             (1 << 15)
-#define V3_SYSTEM_M_LOCK                (1 << 14)
-
-/*  PCI_CFG bits
- */
-#define V3_PCI_CFG_M_I2O_EN            (1 << 15)
-#define V3_PCI_CFG_M_IO_REG_DIS                (1 << 14)
-#define V3_PCI_CFG_M_IO_DIS            (1 << 13)
-#define V3_PCI_CFG_M_EN3V              (1 << 12)
-#define V3_PCI_CFG_M_RETRY_EN           (1 << 10)
-#define V3_PCI_CFG_M_AD_LOW1            (1 << 9)
-#define V3_PCI_CFG_M_AD_LOW0            (1 << 8)
-
-/*  PCI_BASE register bits (PCI -> Local Bus)
- */
-#define V3_PCI_BASE_M_ADR_BASE          0xFFF00000
-#define V3_PCI_BASE_M_ADR_BASEL         0x000FFF00
-#define V3_PCI_BASE_M_PREFETCH          (1 << 3)
-#define V3_PCI_BASE_M_TYPE              (3 << 1)
-#define V3_PCI_BASE_M_IO                (1 << 0)
-
-/*  PCI MAP register bits (PCI -> Local bus)
- */
-#define V3_PCI_MAP_M_MAP_ADR            0xFFF00000
-#define V3_PCI_MAP_M_RD_POST_INH        (1 << 15)
-#define V3_PCI_MAP_M_ROM_SIZE           (3 << 10)
-#define V3_PCI_MAP_M_SWAP               (3 << 8)
-#define V3_PCI_MAP_M_ADR_SIZE           0x000000F0
-#define V3_PCI_MAP_M_REG_EN             (1 << 1)
-#define V3_PCI_MAP_M_ENABLE             (1 << 0)
-
-/*
- *  LB_BASE0,1 register bits (Local bus -> PCI)
- */
-#define V3_LB_BASE_ADR_BASE            0xfff00000
-#define V3_LB_BASE_SWAP                        (3 << 8)
-#define V3_LB_BASE_ADR_SIZE            (15 << 4)
-#define V3_LB_BASE_PREFETCH            (1 << 3)
-#define V3_LB_BASE_ENABLE              (1 << 0)
-
-#define V3_LB_BASE_ADR_SIZE_1MB                (0 << 4)
-#define V3_LB_BASE_ADR_SIZE_2MB                (1 << 4)
-#define V3_LB_BASE_ADR_SIZE_4MB                (2 << 4)
-#define V3_LB_BASE_ADR_SIZE_8MB                (3 << 4)
-#define V3_LB_BASE_ADR_SIZE_16MB       (4 << 4)
-#define V3_LB_BASE_ADR_SIZE_32MB       (5 << 4)
-#define V3_LB_BASE_ADR_SIZE_64MB       (6 << 4)
-#define V3_LB_BASE_ADR_SIZE_128MB      (7 << 4)
-#define V3_LB_BASE_ADR_SIZE_256MB      (8 << 4)
-#define V3_LB_BASE_ADR_SIZE_512MB      (9 << 4)
-#define V3_LB_BASE_ADR_SIZE_1GB                (10 << 4)
-#define V3_LB_BASE_ADR_SIZE_2GB                (11 << 4)
-
-#define v3_addr_to_lb_base(a)  ((a) & V3_LB_BASE_ADR_BASE)
-
-/*
- *  LB_MAP0,1 register bits (Local bus -> PCI)
- */
-#define V3_LB_MAP_MAP_ADR              0xfff0
-#define V3_LB_MAP_TYPE                 (7 << 1)
-#define V3_LB_MAP_AD_LOW_EN            (1 << 0)
-
-#define V3_LB_MAP_TYPE_IACK            (0 << 1)
-#define V3_LB_MAP_TYPE_IO              (1 << 1)
-#define V3_LB_MAP_TYPE_MEM             (3 << 1)
-#define V3_LB_MAP_TYPE_CONFIG          (5 << 1)
-#define V3_LB_MAP_TYPE_MEM_MULTIPLE    (6 << 1)
-
-#define v3_addr_to_lb_map(a)   (((a) >> 16) & V3_LB_MAP_MAP_ADR)
-
-/*
- *  LB_BASE2 register bits (Local bus -> PCI IO)
- */
-#define V3_LB_BASE2_ADR_BASE           0xff00
-#define V3_LB_BASE2_SWAP               (3 << 6)
-#define V3_LB_BASE2_ENABLE             (1 << 0)
-
-#define v3_addr_to_lb_base2(a) (((a) >> 16) & V3_LB_BASE2_ADR_BASE)
-
-/*
- *  LB_MAP2 register bits (Local bus -> PCI IO)
- */
-#define V3_LB_MAP2_MAP_ADR             0xff00
-
-#define v3_addr_to_lb_map2(a)  (((a) >> 16) & V3_LB_MAP2_MAP_ADR)
-
-#endif
index 1e6cca55c750486b98ef85ca5a04c9af471d64ea..3b763d6652a0aee4ba7a81bc591715c2084d1b10 100644 (file)
@@ -8,6 +8,16 @@
 /*
  * CPU interrupt mask handling.
  */
+#ifdef CONFIG_CPU_V7M
+#define IRQMASK_REG_NAME_R "primask"
+#define IRQMASK_REG_NAME_W "primask"
+#define IRQMASK_I_BIT  1
+#else
+#define IRQMASK_REG_NAME_R "cpsr"
+#define IRQMASK_REG_NAME_W "cpsr_c"
+#define IRQMASK_I_BIT  PSR_I_BIT
+#endif
+
 #if __LINUX_ARM_ARCH__ >= 6
 
 static inline unsigned long arch_local_irq_save(void)
@@ -15,7 +25,7 @@ static inline unsigned long arch_local_irq_save(void)
        unsigned long flags;
 
        asm volatile(
-               "       mrs     %0, cpsr        @ arch_local_irq_save\n"
+               "       mrs     %0, " IRQMASK_REG_NAME_R "      @ arch_local_irq_save\n"
                "       cpsid   i"
                : "=r" (flags) : : "memory", "cc");
        return flags;
@@ -129,7 +139,7 @@ static inline unsigned long arch_local_save_flags(void)
 {
        unsigned long flags;
        asm volatile(
-               "       mrs     %0, cpsr        @ local_save_flags"
+               "       mrs     %0, " IRQMASK_REG_NAME_R "      @ local_save_flags"
                : "=r" (flags) : : "memory", "cc");
        return flags;
 }
@@ -140,7 +150,7 @@ static inline unsigned long arch_local_save_flags(void)
 static inline void arch_local_irq_restore(unsigned long flags)
 {
        asm volatile(
-               "       msr     cpsr_c, %0      @ local_irq_restore"
+               "       msr     " IRQMASK_REG_NAME_W ", %0      @ local_irq_restore"
                :
                : "r" (flags)
                : "memory", "cc");
@@ -148,8 +158,8 @@ static inline void arch_local_irq_restore(unsigned long flags)
 
 static inline int arch_irqs_disabled_flags(unsigned long flags)
 {
-       return flags & PSR_I_BIT;
+       return flags & IRQMASK_I_BIT;
 }
 
-#endif
-#endif
+#endif /* ifdef __KERNEL__ */
+#endif /* ifndef __ASM_ARM_IRQFLAGS_H */
index 308ad7d6f98b77098dd3c831b8831f9731f49211..75bf07910b8189314d276d5e7ee7ad5c1fe5c782 100644 (file)
@@ -8,6 +8,8 @@
  * published by the Free Software Foundation.
  */
 
+#include <linux/types.h>
+
 #ifndef __ASSEMBLY__
 
 struct tag;
@@ -16,8 +18,10 @@ struct pt_regs;
 struct smp_operations;
 #ifdef CONFIG_SMP
 #define smp_ops(ops) (&(ops))
+#define smp_init_ops(ops) (&(ops))
 #else
 #define smp_ops(ops) (struct smp_operations *)NULL
+#define smp_init_ops(ops) (bool (*)(void))NULL
 #endif
 
 struct machine_desc {
@@ -41,6 +45,7 @@ struct machine_desc {
        unsigned char           reserve_lp2 :1; /* never has lp2        */
        char                    restart_mode;   /* default restart mode */
        struct smp_operations   *smp;           /* SMP operations       */
+       bool                    (*smp_init)(void);
        void                    (*fixup)(struct tag *, char **,
                                         struct meminfo *);
        void                    (*reserve)(void);/* reserve mem blocks  */
index 7d2c3c8438014a40158e62347915a097d7174cce..a1c90d7feb0e904cde2c17c527da7158ac0a3585 100644 (file)
@@ -16,6 +16,7 @@
 struct pci_sys_data;
 struct pci_ops;
 struct pci_bus;
+struct device;
 
 struct hw_pci {
 #ifdef CONFIG_PCI_DOMAINS
@@ -68,7 +69,16 @@ struct pci_sys_data {
 /*
  * Call this with your hw_pci struct to initialise the PCI system.
  */
-void pci_common_init(struct hw_pci *);
+void pci_common_init_dev(struct device *, struct hw_pci *);
+
+/*
+ * Compatibility wrapper for older platforms that do not care about
+ * passing the parent device.
+ */
+static inline void pci_common_init(struct hw_pci *hw)
+{
+       pci_common_init_dev(NULL, hw);
+}
 
 /*
  * Setup early fixed I/O mapping.
@@ -96,9 +106,4 @@ extern struct pci_ops via82c505_ops;
 extern int via82c505_setup(int nr, struct pci_sys_data *);
 extern void via82c505_init(void *sysdata);
 
-extern struct pci_ops pci_v3_ops;
-extern int pci_v3_setup(int nr, struct pci_sys_data *);
-extern void pci_v3_preinit(void);
-extern void pci_v3_postinit(void);
-
 #endif /* __ASM_MACH_PCI_H */
index ce0dbe7c1625d296b165794ab75165a7452ecbfe..c4ae171850f8326bef2c3b991693771ae2f13d69 100644 (file)
@@ -32,5 +32,14 @@ struct psci_operations {
 };
 
 extern struct psci_operations psci_ops;
+extern struct smp_operations psci_smp_ops;
+
+#ifdef CONFIG_ARM_PSCI
+void psci_init(void);
+bool psci_smp_available(void);
+#else
+static inline void psci_init(void) { }
+static inline bool psci_smp_available(void) { return false; }
+#endif
 
 #endif /* __ASM_ARM_PSCI_H */
index 3d52ee1bfb3113e113f231807dba71bc739ceac0..04c99f36ff7f902208c475066e28cbf67077f606 100644 (file)
@@ -45,6 +45,7 @@ struct pt_regs {
  */
 static inline int valid_user_regs(struct pt_regs *regs)
 {
+#ifndef CONFIG_CPU_V7M
        unsigned long mode = regs->ARM_cpsr & MODE_MASK;
 
        /*
@@ -67,6 +68,9 @@ static inline int valid_user_regs(struct pt_regs *regs)
                regs->ARM_cpsr |= USR_MODE;
 
        return 0;
+#else /* ifndef CONFIG_CPU_V7M */
+       return 1;
+#endif
 }
 
 static inline long regs_return_value(struct pt_regs *regs)
index dfd386d0c022189ad0b9574c21db22039122d405..720ea0320a6d58a28189911ed714a4e3262569e2 100644 (file)
@@ -11,6 +11,7 @@
 #define CPU_ARCH_ARMv5TEJ      7
 #define CPU_ARCH_ARMv6         8
 #define CPU_ARCH_ARMv7         9
+#define CPU_ARCH_ARMv7M                10
 
 #ifndef __ASSEMBLY__
 
diff --git a/arch/arm/include/asm/v7m.h b/arch/arm/include/asm/v7m.h
new file mode 100644 (file)
index 0000000..fa88d09
--- /dev/null
@@ -0,0 +1,44 @@
+/*
+ * Common defines for v7m cpus
+ */
+#define V7M_SCS_ICTR                   IOMEM(0xe000e004)
+#define V7M_SCS_ICTR_INTLINESNUM_MASK          0x0000000f
+
+#define BASEADDR_V7M_SCB               IOMEM(0xe000ed00)
+
+#define V7M_SCB_CPUID                  0x00
+
+#define V7M_SCB_ICSR                   0x04
+#define V7M_SCB_ICSR_PENDSVSET                 (1 << 28)
+#define V7M_SCB_ICSR_PENDSVCLR                 (1 << 27)
+#define V7M_SCB_ICSR_RETTOBASE                 (1 << 11)
+
+#define V7M_SCB_VTOR                   0x08
+
+#define V7M_SCB_SCR                    0x10
+#define V7M_SCB_SCR_SLEEPDEEP                  (1 << 2)
+
+#define V7M_SCB_CCR                    0x14
+#define V7M_SCB_CCR_STKALIGN                   (1 << 9)
+
+#define V7M_SCB_SHPR2                  0x1c
+#define V7M_SCB_SHPR3                  0x20
+
+#define V7M_SCB_SHCSR                  0x24
+#define V7M_SCB_SHCSR_USGFAULTENA              (1 << 18)
+#define V7M_SCB_SHCSR_BUSFAULTENA              (1 << 17)
+#define V7M_SCB_SHCSR_MEMFAULTENA              (1 << 16)
+
+#define V7M_xPSR_FRAMEPTRALIGN                 0x00000200
+#define V7M_xPSR_EXCEPTIONNO                   0x000001ff
+
+/*
+ * When branching to an address that has bits [31:28] == 0xf an exception return
+ * occurs. Bits [27:5] are reserved (SBOP). If the processor implements the FP
+ * extension Bit [4] defines if the exception frame has space allocated for FP
+ * state information, SBOP otherwise. Bit [3] defines the mode that is returned
+ * to (0 -> handler mode; 1 -> thread mode). Bit [2] defines which sp is used
+ * (0 -> msp; 1 -> psp). Bits [1:0] are fixed to 0b01.
+ */
+#define EXC_RET_STACK_MASK                     0x00000004
+#define EXC_RET_THREADMODE_PROCESSSTACK                0xfffffffd
index 91d38e38a0b4a0d1fcbb2eae7c4cb064abf68293..29da84e183f4a7939ff9e9bb69c96f1b93f68538 100644 (file)
 #define IMX6Q_UART_BASE_ADDR(n)        IMX6Q_UART##n##_BASE_ADDR
 #define IMX6Q_UART_BASE(n)     IMX6Q_UART_BASE_ADDR(n)
 
+#define IMX6SL_UART1_BASE_ADDR 0x02020000
+#define IMX6SL_UART2_BASE_ADDR 0x02024000
+#define IMX6SL_UART3_BASE_ADDR 0x02034000
+#define IMX6SL_UART4_BASE_ADDR 0x02038000
+#define IMX6SL_UART5_BASE_ADDR 0x02018000
+#define IMX6SL_UART_BASE_ADDR(n) IMX6SL_UART##n##_BASE_ADDR
+#define IMX6SL_UART_BASE(n)    IMX6SL_UART_BASE_ADDR(n)
+
 #define IMX_DEBUG_UART_BASE(soc) soc##_UART_BASE(CONFIG_DEBUG_IMX_UART_PORT)
 
 #ifdef CONFIG_DEBUG_IMX1_UART
@@ -83,6 +91,8 @@
 #define UART_PADDR     IMX_DEBUG_UART_BASE(IMX53)
 #elif defined(CONFIG_DEBUG_IMX6Q_UART)
 #define UART_PADDR     IMX_DEBUG_UART_BASE(IMX6Q)
+#elif defined(CONFIG_DEBUG_IMX6SL_UART)
+#define UART_PADDR     IMX_DEBUG_UART_BASE(IMX6SL)
 #endif
 
 #endif /* __DEBUG_IMX_UART_H */
diff --git a/arch/arm/include/debug/keystone.S b/arch/arm/include/debug/keystone.S
new file mode 100644 (file)
index 0000000..9aef9ba
--- /dev/null
@@ -0,0 +1,43 @@
+/*
+ * Early serial debug output macro for Keystone SOCs
+ *
+ * Copyright 2013 Texas Instruments, Inc.
+ *     Santosh Shilimkar <santosh.shilimkar@ti.com>
+ *
+ * Based on RMKs low level debug code.
+ *  Copyright (C) 1994-1999 Russell King
+ *
+ * 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/serial_reg.h>
+
+#define UART_SHIFT 2
+#if defined(CONFIG_DEBUG_KEYSTONE_UART0)
+#define UART_PHYS              0x02530c00
+#define UART_VIRT              0xfeb30c00
+#elif defined(CONFIG_DEBUG_KEYSTONE_UART1)
+#define UART_PHYS              0x02531000
+#define UART_VIRT              0xfeb31000
+#endif
+
+       .macro  addruart, rp, rv, tmp
+       ldr     \rv, =UART_VIRT                 @ physical base address
+       ldr     \rp, =UART_PHYS                 @ virtual base address
+       .endm
+
+       .macro  senduart,rd,rx
+       str     \rd, [\rx, #UART_TX << UART_SHIFT]
+       .endm
+
+       .macro  busyuart,rd,rx
+1002:  ldr     \rd, [\rx, #UART_LSR << UART_SHIFT]
+       and     \rd, \rd, #UART_LSR_TEMT | UART_LSR_THRE
+       teq     \rd, #UART_LSR_TEMT | UART_LSR_THRE
+       bne     1002b
+       .endm
+
+       .macro  waituart,rd,rx
+       .endm
index df191afa3be14b1338481e05ae00cf35ddbb0cd5..6517311a1c915bfbb92c7e0b293e2adffa15b973 100644 (file)
  * published by the Free Software Foundation.
 */
 
+#ifdef CONFIG_DEBUG_MVEBU_UART_ALTERNATE
+#define ARMADA_370_XP_REGS_PHYS_BASE   0xf1000000
+#else
 #define ARMADA_370_XP_REGS_PHYS_BASE   0xd0000000
+#endif
+
 #define ARMADA_370_XP_REGS_VIRT_BASE   0xfec00000
 
        .macro  addruart, rp, rv, tmp
similarity index 78%
rename from arch/arm/mach-u300/include/mach/debug-macro.S
rename to arch/arm/include/debug/u300.S
index 8ae8e4ab34b05a67a3b995d0359fd5fc9ee3e7d7..6f04f08a203c252e8394b337d16d3f413484e76a 100644 (file)
@@ -1,14 +1,11 @@
 /*
- *
- * arch-arm/mach-u300/include/mach/debug-macro.S
- *
- *
- * Copyright (C) 2006-2009 ST-Ericsson AB
+ * Copyright (C) 2006-2013 ST-Ericsson AB
  * License terms: GNU General Public License (GPL) version 2
  * Debugging macro include header.
  * Author: Linus Walleij <linus.walleij@stericsson.com>
  */
-#include <mach/hardware.h>
+#define U300_SLOW_PER_PHYS_BASE                0xc0010000
+#define U300_SLOW_PER_VIRT_BASE                0xff000000
 
        .macro  addruart, rp, rv, tmp
        /* If we move the address using MMU, use this. */
index 96ee0929790f5d5ad2156f2262c9efb809f7cc3e..5af0ed1b825a2aa95dc0626c9e1a685924979e24 100644 (file)
 
 /*
  * PSR bits
+ * Note on V7M there is no mode contained in the PSR
  */
 #define USR26_MODE     0x00000000
 #define FIQ26_MODE     0x00000001
 #define IRQ26_MODE     0x00000002
 #define SVC26_MODE     0x00000003
+#if defined(__KERNEL__) && defined(CONFIG_CPU_V7M)
+/*
+ * Use 0 here to get code right that creates a userspace
+ * or kernel space thread.
+ */
+#define USR_MODE       0x00000000
+#define SVC_MODE       0x00000000
+#else
 #define USR_MODE       0x00000010
+#define SVC_MODE       0x00000013
+#endif
 #define FIQ_MODE       0x00000011
 #define IRQ_MODE       0x00000012
-#define SVC_MODE       0x00000013
 #define ABT_MODE       0x00000017
 #define HYP_MODE       0x0000001a
 #define UND_MODE       0x0000001b
 #define SYSTEM_MODE    0x0000001f
 #define MODE32_BIT     0x00000010
 #define MODE_MASK      0x0000001f
-#define PSR_T_BIT      0x00000020
-#define PSR_F_BIT      0x00000040
-#define PSR_I_BIT      0x00000080
-#define PSR_A_BIT      0x00000100
-#define PSR_E_BIT      0x00000200
-#define PSR_J_BIT      0x01000000
-#define PSR_Q_BIT      0x08000000
+
+#define V4_PSR_T_BIT   0x00000020      /* >= V4T, but not V7M */
+#define V7M_PSR_T_BIT  0x01000000
+#if defined(__KERNEL__) && defined(CONFIG_CPU_V7M)
+#define PSR_T_BIT      V7M_PSR_T_BIT
+#else
+/* for compatibility */
+#define PSR_T_BIT      V4_PSR_T_BIT
+#endif
+
+#define PSR_F_BIT      0x00000040      /* >= V4, but not V7M */
+#define PSR_I_BIT      0x00000080      /* >= V4, but not V7M */
+#define PSR_A_BIT      0x00000100      /* >= V6, but not V7M */
+#define PSR_E_BIT      0x00000200      /* >= V6, but not V7M */
+#define PSR_J_BIT      0x01000000      /* >= V5J, but not V7M */
+#define PSR_Q_BIT      0x08000000      /* >= V5E, including V7M */
 #define PSR_V_BIT      0x10000000
 #define PSR_C_BIT      0x20000000
 #define PSR_Z_BIT      0x40000000
index 5f3338eacad21024a75d7b1e7480f3fc58e804b8..f4285b5ffb05aba08a3e3b87cdae8c0c5e476b26 100644 (file)
@@ -15,7 +15,7 @@ CFLAGS_REMOVE_return_address.o = -pg
 
 # Object file lists.
 
-obj-y          := elf.o entry-armv.o entry-common.o irq.o opcodes.o \
+obj-y          := elf.o entry-common.o irq.o opcodes.o \
                   process.o ptrace.o return_address.o sched_clock.o \
                   setup.o signal.o stacktrace.o sys_arm.o time.o traps.o
 
@@ -23,6 +23,12 @@ obj-$(CONFIG_ATAGS)          += atags_parse.o
 obj-$(CONFIG_ATAGS_PROC)       += atags_proc.o
 obj-$(CONFIG_DEPRECATED_PARAM_STRUCT) += atags_compat.o
 
+ifeq ($(CONFIG_CPU_V7M),y)
+obj-y          += entry-v7m.o
+else
+obj-y          += entry-armv.o
+endif
+
 obj-$(CONFIG_OC_ETM)           += etm.o
 obj-$(CONFIG_CPU_IDLE)         += cpuidle.o
 obj-$(CONFIG_ISA_DMA_API)      += dma.o
@@ -82,6 +88,9 @@ obj-$(CONFIG_DEBUG_LL)        += debug.o
 obj-$(CONFIG_EARLY_PRINTK)     += early_printk.o
 
 obj-$(CONFIG_ARM_VIRT_EXT)     += hyp-stub.o
-obj-$(CONFIG_ARM_PSCI)         += psci.o
+ifeq ($(CONFIG_ARM_PSCI),y)
+obj-y                          += psci.o
+obj-$(CONFIG_SMP)              += psci_smp.o
+endif
 
 extra-y := $(head-y) vmlinux.lds
index b2ed73c454892ba8c7a7c06d66ef93881b6c2126..261fcc8261698391937343d0f24ae4b72a93c0e7 100644 (file)
@@ -445,7 +445,8 @@ static int pcibios_init_resources(int busnr, struct pci_sys_data *sys)
        return 0;
 }
 
-static void pcibios_init_hw(struct hw_pci *hw, struct list_head *head)
+static void pcibios_init_hw(struct device *parent, struct hw_pci *hw,
+                           struct list_head *head)
 {
        struct pci_sys_data *sys = NULL;
        int ret;
@@ -480,7 +481,7 @@ static void pcibios_init_hw(struct hw_pci *hw, struct list_head *head)
                        if (hw->scan)
                                sys->bus = hw->scan(nr, sys);
                        else
-                               sys->bus = pci_scan_root_bus(NULL, sys->busnr,
+                               sys->bus = pci_scan_root_bus(parent, sys->busnr,
                                                hw->ops, sys, &sys->resources);
 
                        if (!sys->bus)
@@ -497,7 +498,7 @@ static void pcibios_init_hw(struct hw_pci *hw, struct list_head *head)
        }
 }
 
-void pci_common_init(struct hw_pci *hw)
+void pci_common_init_dev(struct device *parent, struct hw_pci *hw)
 {
        struct pci_sys_data *sys;
        LIST_HEAD(head);
@@ -505,7 +506,7 @@ void pci_common_init(struct hw_pci *hw)
        pci_add_flags(PCI_REASSIGN_ALL_RSRC);
        if (hw->preinit)
                hw->preinit();
-       pcibios_init_hw(hw, &head);
+       pcibios_init_hw(parent, hw, &head);
        if (hw->postinit)
                hw->postinit();
 
index bc5bc0a971319674c552b578367a19a5a464d798..85a72b0809ca11c445352c4f49b54a5b0638ba48 100644 (file)
@@ -350,6 +350,9 @@ ENDPROC(ftrace_stub)
 
        .align  5
 ENTRY(vector_swi)
+#ifdef CONFIG_CPU_V7M
+       v7m_exception_entry
+#else
        sub     sp, sp, #S_FRAME_SIZE
        stmia   sp, {r0 - r12}                  @ Calling r0 - r12
  ARM(  add     r8, sp, #S_PC           )
@@ -360,6 +363,7 @@ ENTRY(vector_swi)
        str     lr, [sp, #S_PC]                 @ Save calling PC
        str     r8, [sp, #S_PSR]                @ Save CPSR
        str     r0, [sp, #S_OLD_R0]             @ Save OLD_R0
+#endif
        zero_fp
 
        /*
index 160f3376ba6da8f1a697ef62cb9180795a0576e6..de23a9beed1333d86d1143a7b31613ff7376440d 100644 (file)
@@ -5,6 +5,7 @@
 #include <asm/asm-offsets.h>
 #include <asm/errno.h>
 #include <asm/thread_info.h>
+#include <asm/v7m.h>
 
 @ Bad Abort numbers
 @ -----------------
 #endif
        .endm
 
+#ifdef CONFIG_CPU_V7M
+/*
+ * ARMv7-M exception entry/exit macros.
+ *
+ * xPSR, ReturnAddress(), LR (R14), R12, R3, R2, R1, and R0 are
+ * automatically saved on the current stack (32 words) before
+ * switching to the exception stack (SP_main).
+ *
+ * If exception is taken while in user mode, SP_main is
+ * empty. Otherwise, SP_main is aligned to 64 bit automatically
+ * (CCR.STKALIGN set).
+ *
+ * Linux assumes that the interrupts are disabled when entering an
+ * exception handler and it may BUG if this is not the case. Interrupts
+ * are disabled during entry and reenabled in the exit macro.
+ *
+ * v7m_exception_slow_exit is used when returning from SVC or PendSV.
+ * When returning to kernel mode, we don't return from exception.
+ */
+       .macro  v7m_exception_entry
+       @ determine the location of the registers saved by the core during
+       @ exception entry. Depending on the mode the cpu was in when the
+       @ exception happend that is either on the main or the process stack.
+       @ Bit 2 of EXC_RETURN stored in the lr register specifies which stack
+       @ was used.
+       tst     lr, #EXC_RET_STACK_MASK
+       mrsne   r12, psp
+       moveq   r12, sp
+
+       @ we cannot rely on r0-r3 and r12 matching the value saved in the
+       @ exception frame because of tail-chaining. So these have to be
+       @ reloaded.
+       ldmia   r12!, {r0-r3}
+
+       @ Linux expects to have irqs off. Do it here before taking stack space
+       cpsid   i
+
+       sub     sp, #S_FRAME_SIZE-S_IP
+       stmdb   sp!, {r0-r11}
+
+       @ load saved r12, lr, return address and xPSR.
+       @ r0-r7 are used for signals and never touched from now on. Clobbering
+       @ r8-r12 is OK.
+       mov     r9, r12
+       ldmia   r9!, {r8, r10-r12}
+
+       @ calculate the original stack pointer value.
+       @ r9 currently points to the memory location just above the auto saved
+       @ xPSR.
+       @ The cpu might automatically 8-byte align the stack. Bit 9
+       @ of the saved xPSR specifies if stack aligning took place. In this case
+       @ another 32-bit value is included in the stack.
+
+       tst     r12, V7M_xPSR_FRAMEPTRALIGN
+       addne   r9, r9, #4
+
+       @ store saved r12 using str to have a register to hold the base for stm
+       str     r8, [sp, #S_IP]
+       add     r8, sp, #S_SP
+       @ store r13-r15, xPSR
+       stmia   r8!, {r9-r12}
+       @ store old_r0
+       str     r0, [r8]
+       .endm
+
+        /*
+        * PENDSV and SVCALL are configured to have the same exception
+        * priorities. As a kernel thread runs at SVCALL execution priority it
+        * can never be preempted and so we will never have to return to a
+        * kernel thread here.
+         */
+       .macro  v7m_exception_slow_exit ret_r0
+       cpsid   i
+       ldr     lr, =EXC_RET_THREADMODE_PROCESSSTACK
+
+       @ read original r12, sp, lr, pc and xPSR
+       add     r12, sp, #S_IP
+       ldmia   r12, {r1-r5}
+
+       @ an exception frame is always 8-byte aligned. To tell the hardware if
+       @ the sp to be restored is aligned or not set bit 9 of the saved xPSR
+       @ accordingly.
+       tst     r2, #4
+       subne   r2, r2, #4
+       orrne   r5, V7M_xPSR_FRAMEPTRALIGN
+       biceq   r5, V7M_xPSR_FRAMEPTRALIGN
+
+       @ write basic exception frame
+       stmdb   r2!, {r1, r3-r5}
+       ldmia   sp, {r1, r3-r5}
+       .if     \ret_r0
+       stmdb   r2!, {r0, r3-r5}
+       .else
+       stmdb   r2!, {r1, r3-r5}
+       .endif
+
+       @ restore process sp
+       msr     psp, r2
+
+       @ restore original r4-r11
+       ldmia   sp!, {r0-r11}
+
+       @ restore main sp
+       add     sp, sp, #S_FRAME_SIZE-S_IP
+
+       cpsie   i
+       bx      lr
+       .endm
+#endif /* CONFIG_CPU_V7M */
+
        @
        @ Store/load the USER SP and LR registers by switching to the SYS
        @ mode. Useful in Thumb-2 mode where "stm/ldm rd, {sp, lr}^" is not
        rfeia   sp!
        .endm
 
+#ifdef CONFIG_CPU_V7M
+       /*
+        * Note we don't need to do clrex here as clearing the local monitor is
+        * part of each exception entry and exit sequence.
+        */
+       .macro  restore_user_regs, fast = 0, offset = 0
+       .if     \offset
+       add     sp, #\offset
+       .endif
+       v7m_exception_slow_exit ret_r0 = \fast
+       .endm
+#else  /* ifdef CONFIG_CPU_V7M */
        .macro  restore_user_regs, fast = 0, offset = 0
        clrex                                   @ clear the exclusive monitor
        mov     r2, sp
        add     sp, sp, #S_FRAME_SIZE - S_SP
        movs    pc, lr                          @ return & move spsr_svc into cpsr
        .endm
+#endif /* ifdef CONFIG_CPU_V7M / else */
 
        .macro  get_thread_info, rd
        mov     \rd, sp
diff --git a/arch/arm/kernel/entry-v7m.S b/arch/arm/kernel/entry-v7m.S
new file mode 100644 (file)
index 0000000..e00621f
--- /dev/null
@@ -0,0 +1,143 @@
+/*
+ * linux/arch/arm/kernel/entry-v7m.S
+ *
+ * Copyright (C) 2008 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.
+ *
+ * Low-level vector interface routines for the ARMv7-M architecture
+ */
+#include <asm/memory.h>
+#include <asm/glue.h>
+#include <asm/thread_notify.h>
+#include <asm/v7m.h>
+
+#include <mach/entry-macro.S>
+
+#include "entry-header.S"
+
+#ifdef CONFIG_TRACE_IRQFLAGS
+#error "CONFIG_TRACE_IRQFLAGS not supported on the current ARMv7M implementation"
+#endif
+
+__invalid_entry:
+       v7m_exception_entry
+       adr     r0, strerr
+       mrs     r1, ipsr
+       mov     r2, lr
+       bl      printk
+       mov     r0, sp
+       bl      show_regs
+1:     b       1b
+ENDPROC(__invalid_entry)
+
+strerr:        .asciz  "\nUnhandled exception: IPSR = %08lx LR = %08lx\n"
+
+       .align  2
+__irq_entry:
+       v7m_exception_entry
+
+       @
+       @ Invoke the IRQ handler
+       @
+       mrs     r0, ipsr
+       ldr     r1, =V7M_xPSR_EXCEPTIONNO
+       and     r0, r1
+       sub     r0, #16
+       mov     r1, sp
+       stmdb   sp!, {lr}
+       @ routine called with r0 = irq number, r1 = struct pt_regs *
+       bl      nvic_do_IRQ
+
+       pop     {lr}
+       @
+       @ Check for any pending work if returning to user
+       @
+       ldr     r1, =BASEADDR_V7M_SCB
+       ldr     r0, [r1, V7M_SCB_ICSR]
+       tst     r0, V7M_SCB_ICSR_RETTOBASE
+       beq     2f
+
+       get_thread_info tsk
+       ldr     r2, [tsk, #TI_FLAGS]
+       tst     r2, #_TIF_WORK_MASK
+       beq     2f                      @ no work pending
+       mov     r0, #V7M_SCB_ICSR_PENDSVSET
+       str     r0, [r1, V7M_SCB_ICSR]  @ raise PendSV
+
+2:
+       @ registers r0-r3 and r12 are automatically restored on exception
+       @ return. r4-r7 were not clobbered in v7m_exception_entry so for
+       @ correctness they don't need to be restored. So only r8-r11 must be
+       @ restored here. The easiest way to do so is to restore r0-r7, too.
+       ldmia   sp!, {r0-r11}
+       add     sp, #S_FRAME_SIZE-S_IP
+       cpsie   i
+       bx      lr
+ENDPROC(__irq_entry)
+
+__pendsv_entry:
+       v7m_exception_entry
+
+       ldr     r1, =BASEADDR_V7M_SCB
+       mov     r0, #V7M_SCB_ICSR_PENDSVCLR
+       str     r0, [r1, V7M_SCB_ICSR]  @ clear PendSV
+
+       @ execute the pending work, including reschedule
+       get_thread_info tsk
+       mov     why, #0
+       b       ret_to_user
+ENDPROC(__pendsv_entry)
+
+/*
+ * Register switch for ARMv7-M processors.
+ * r0 = previous task_struct, r1 = previous thread_info, r2 = next thread_info
+ * previous and next are guaranteed not to be the same.
+ */
+ENTRY(__switch_to)
+       .fnstart
+       .cantunwind
+       add     ip, r1, #TI_CPU_SAVE
+       stmia   ip!, {r4 - r11}         @ Store most regs on stack
+       str     sp, [ip], #4
+       str     lr, [ip], #4
+       mov     r5, r0
+       add     r4, r2, #TI_CPU_SAVE
+       ldr     r0, =thread_notify_head
+       mov     r1, #THREAD_NOTIFY_SWITCH
+       bl      atomic_notifier_call_chain
+       mov     ip, r4
+       mov     r0, r5
+       ldmia   ip!, {r4 - r11}         @ Load all regs saved previously
+       ldr     sp, [ip]
+       ldr     pc, [ip, #4]!
+       .fnend
+ENDPROC(__switch_to)
+
+       .data
+       .align  8
+/*
+ * Vector table (64 words => 256 bytes natural alignment)
+ */
+ENTRY(vector_table)
+       .long   0                       @ 0 - Reset stack pointer
+       .long   __invalid_entry         @ 1 - Reset
+       .long   __invalid_entry         @ 2 - NMI
+       .long   __invalid_entry         @ 3 - HardFault
+       .long   __invalid_entry         @ 4 - MemManage
+       .long   __invalid_entry         @ 5 - BusFault
+       .long   __invalid_entry         @ 6 - UsageFault
+       .long   __invalid_entry         @ 7 - Reserved
+       .long   __invalid_entry         @ 8 - Reserved
+       .long   __invalid_entry         @ 9 - Reserved
+       .long   __invalid_entry         @ 10 - Reserved
+       .long   vector_swi              @ 11 - SVCall
+       .long   __invalid_entry         @ 12 - Debug Monitor
+       .long   __invalid_entry         @ 13 - Reserved
+       .long   __pendsv_entry          @ 14 - PendSV
+       .long   __invalid_entry         @ 15 - SysTick
+       .rept   64 - 16
+       .long   __irq_entry             @ 16..64 - External Interrupts
+       .endr
index 6a2e09c952c715862cb32907af2438e39d5b9788..8812ce88f7a1f289e64e8c787efc5a4db3df0ec9 100644 (file)
@@ -19,6 +19,7 @@
 #include <asm/asm-offsets.h>
 #include <asm/cp15.h>
 #include <asm/thread_info.h>
+#include <asm/v7m.h>
 
 /*
  * Kernel startup entry point.
@@ -50,10 +51,13 @@ ENTRY(stext)
 
        setmode PSR_F_BIT | PSR_I_BIT | SVC_MODE, r9 @ ensure svc mode
                                                @ and irqs disabled
-#ifndef CONFIG_CPU_CP15
-       ldr     r9, =CONFIG_PROCESSOR_ID
-#else
+#if defined(CONFIG_CPU_CP15)
        mrc     p15, 0, r9, c0, c0              @ get processor id
+#elif defined(CONFIG_CPU_V7M)
+       ldr     r9, =BASEADDR_V7M_SCB
+       ldr     r9, [r9, V7M_SCB_CPUID]
+#else
+       ldr     r9, =CONFIG_PROCESSOR_ID
 #endif
        bl      __lookup_processor_type         @ r5=procinfo r9=cpuid
        movs    r10, r5                         @ invalid processor (r5=0)?
index 36531643cc2c01e3d8e997e32e2ffaa9a8b9ce12..46931880093dc1bb2382b893743a5da4168f87a0 100644 (file)
@@ -158,7 +158,7 @@ static const struct of_device_id psci_of_match[] __initconst = {
        {},
 };
 
-static int __init psci_init(void)
+void __init psci_init(void)
 {
        struct device_node *np;
        const char *method;
@@ -166,7 +166,7 @@ static int __init psci_init(void)
 
        np = of_find_matching_node(NULL, psci_of_match);
        if (!np)
-               return 0;
+               return;
 
        pr_info("probing function IDs from device-tree\n");
 
@@ -206,6 +206,5 @@ static int __init psci_init(void)
 
 out_put_node:
        of_node_put(np);
-       return 0;
+       return;
 }
-early_initcall(psci_init);
diff --git a/arch/arm/kernel/psci_smp.c b/arch/arm/kernel/psci_smp.c
new file mode 100644 (file)
index 0000000..23a1142
--- /dev/null
@@ -0,0 +1,84 @@
+/*
+ * 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.
+ *
+ * Copyright (C) 2012 ARM Limited
+ *
+ * Author: Will Deacon <will.deacon@arm.com>
+ */
+
+#include <linux/init.h>
+#include <linux/irqchip/arm-gic.h>
+#include <linux/smp.h>
+#include <linux/of.h>
+
+#include <asm/psci.h>
+#include <asm/smp_plat.h>
+
+/*
+ * psci_smp assumes that the following is true about PSCI:
+ *
+ * cpu_suspend   Suspend the execution on a CPU
+ * @state        we don't currently describe affinity levels, so just pass 0.
+ * @entry_point  the first instruction to be executed on return
+ * returns 0  success, < 0 on failure
+ *
+ * cpu_off       Power down a CPU
+ * @state        we don't currently describe affinity levels, so just pass 0.
+ * no return on successful call
+ *
+ * cpu_on        Power up a CPU
+ * @cpuid        cpuid of target CPU, as from MPIDR
+ * @entry_point  the first instruction to be executed on return
+ * returns 0  success, < 0 on failure
+ *
+ * migrate       Migrate the context to a different CPU
+ * @cpuid        cpuid of target CPU, as from MPIDR
+ * returns 0  success, < 0 on failure
+ *
+ */
+
+extern void secondary_startup(void);
+
+static int __cpuinit psci_boot_secondary(unsigned int cpu,
+                                        struct task_struct *idle)
+{
+       if (psci_ops.cpu_on)
+               return psci_ops.cpu_on(cpu_logical_map(cpu),
+                                      __pa(secondary_startup));
+       return -ENODEV;
+}
+
+#ifdef CONFIG_HOTPLUG_CPU
+void __ref psci_cpu_die(unsigned int cpu)
+{
+       const struct psci_power_state ps = {
+               .type = PSCI_POWER_STATE_TYPE_POWER_DOWN,
+       };
+
+       if (psci_ops.cpu_off)
+               psci_ops.cpu_off(ps);
+
+       /* We should never return */
+       panic("psci: cpu %d failed to shutdown\n", cpu);
+}
+#else
+#define psci_cpu_die NULL
+#endif
+
+bool __init psci_smp_available(void)
+{
+       /* is cpu_on available at least? */
+       return (psci_ops.cpu_on != NULL);
+}
+
+struct smp_operations __initdata psci_smp_ops = {
+       .smp_boot_secondary     = psci_boot_secondary,
+       .cpu_die                = psci_cpu_die,
+};
index 1522c7ae31b0c239901237569bad5cbb4ec7b02e..a1a2fbaaa31c50cb39f751a9a0a167e2552e8981 100644 (file)
@@ -37,6 +37,7 @@
 #include <asm/cputype.h>
 #include <asm/elf.h>
 #include <asm/procinfo.h>
+#include <asm/psci.h>
 #include <asm/sections.h>
 #include <asm/setup.h>
 #include <asm/smp_plat.h>
@@ -128,7 +129,9 @@ struct stack {
        u32 und[3];
 } ____cacheline_aligned;
 
+#ifndef CONFIG_CPU_V7M
 static struct stack stacks[NR_CPUS];
+#endif
 
 char elf_platform[ELF_PLATFORM_SIZE];
 EXPORT_SYMBOL(elf_platform);
@@ -207,7 +210,7 @@ static const char *proc_arch[] = {
        "5TEJ",
        "6TEJ",
        "7",
-       "?(11)",
+       "7M",
        "?(12)",
        "?(13)",
        "?(14)",
@@ -216,6 +219,12 @@ static const char *proc_arch[] = {
        "?(17)",
 };
 
+#ifdef CONFIG_CPU_V7M
+static int __get_cpu_architecture(void)
+{
+       return CPU_ARCH_ARMv7M;
+}
+#else
 static int __get_cpu_architecture(void)
 {
        int cpu_arch;
@@ -248,6 +257,7 @@ static int __get_cpu_architecture(void)
 
        return cpu_arch;
 }
+#endif
 
 int __pure cpu_architecture(void)
 {
@@ -293,7 +303,9 @@ static void __init cacheid_init(void)
 {
        unsigned int arch = cpu_architecture();
 
-       if (arch >= CPU_ARCH_ARMv6) {
+       if (arch == CPU_ARCH_ARMv7M) {
+               cacheid = 0;
+       } else if (arch >= CPU_ARCH_ARMv6) {
                unsigned int cachetype = read_cpuid_cachetype();
                if ((cachetype & (7 << 29)) == 4 << 29) {
                        /* ARMv7 register format */
@@ -392,6 +404,7 @@ static void __init feat_v6_fixup(void)
  */
 void notrace cpu_init(void)
 {
+#ifndef CONFIG_CPU_V7M
        unsigned int cpu = smp_processor_id();
        struct stack *stk = &stacks[cpu];
 
@@ -442,6 +455,7 @@ void notrace cpu_init(void)
              "I" (offsetof(struct stack, und[0])),
              PLC (PSR_F_BIT | PSR_I_BIT | SVC_MODE)
            : "r14");
+#endif
 }
 
 int __cpu_logical_map[NR_CPUS];
@@ -796,9 +810,15 @@ void __init setup_arch(char **cmdline_p)
        unflatten_device_tree();
 
        arm_dt_init_cpu_maps();
+       psci_init();
 #ifdef CONFIG_SMP
        if (is_smp()) {
-               smp_set_ops(mdesc->smp);
+               if (!mdesc->smp_init || !mdesc->smp_init()) {
+                       if (psci_smp_available())
+                               smp_set_ops(&psci_smp_ops);
+                       else if (mdesc->smp)
+                               smp_set_ops(mdesc->smp);
+               }
                smp_init_cpus();
        }
 #endif
index 18b32e8e4497f4c1966f43ac6fbb4963315fb968..486e12a0f26a1bc2a7a7339e3a507a9708f64dc1 100644 (file)
@@ -812,6 +812,7 @@ static void __init kuser_get_tls_init(unsigned long vectors)
 
 void __init early_trap_init(void *vectors_base)
 {
+#ifndef CONFIG_CPU_V7M
        unsigned long vectors = (unsigned long)vectors_base;
        extern char __stubs_start[], __stubs_end[];
        extern char __vectors_start[], __vectors_end[];
@@ -843,4 +844,11 @@ void __init early_trap_init(void *vectors_base)
 
        flush_icache_range(vectors, vectors + PAGE_SIZE);
        modify_domain(DOMAIN_USER, DOMAIN_CLIENT);
+#else /* ifndef CONFIG_CPU_V7M */
+       /*
+        * on V7-M there is no need to copy the vector table to a dedicated
+        * memory area. The address is configurable and so a table in the kernel
+        * image can be used.
+        */
+#endif
 }
index 2d00165e85ec9e7ef9dc3a7d9b9909bddd04326f..01ad4d41e728f3a6dac994a99706bc42aa195de2 100644 (file)
@@ -22,8 +22,7 @@ config ARCH_CLEP7312
 
 config ARCH_EDB7211
        bool "EDB7211"
-       select ARCH_SELECT_MEMORY_MODEL
-       select ARCH_SPARSEMEM_ENABLE
+       select ARCH_HAS_HOLES_MEMORYMODEL
        help
          Say Y here if you intend to run this kernel on a Cirrus Logic EDB-7211
          evaluation board.
index 992995af666a58e9b0f4af3c4127dff55476eba4..f30ed2b496fba6caf98a6c633d70af4ca43ff1ab 100644 (file)
@@ -4,10 +4,7 @@
 
 # Object file lists.
 
-obj-y                  := common.o
-obj-m                  :=
-obj-n                  :=
-obj-                   :=
+obj-y                          := common.o devices.o
 
 obj-$(CONFIG_ARCH_AUTCPU12)    += board-autcpu12.o
 obj-$(CONFIG_ARCH_CDB89712)    += board-cdb89712.o
index f38584709df7738ce629de8b3e063317909f6363..5867aebd8d0cde6bb497c9c797a7360b81781643 100644 (file)
@@ -26,6 +26,8 @@
 #include <linux/gpio.h>
 #include <linux/ioport.h>
 #include <linux/interrupt.h>
+#include <linux/mtd/physmap.h>
+#include <linux/mtd/plat-ram.h>
 #include <linux/mtd/partitions.h>
 #include <linux/mtd/nand-gpio.h>
 #include <linux/platform_device.h>
 #include <asm/page.h>
 
 #include <asm/mach/map.h>
-#include <mach/autcpu12.h>
 
 #include "common.h"
+#include "devices.h"
 
-#define AUTCPU12_CS8900_BASE   (CS2_PHYS_BASE + 0x300)
-#define AUTCPU12_CS8900_IRQ    (IRQ_EINT3)
+/* NOR flash */
+#define AUTCPU12_FLASH_BASE    (CS0_PHYS_BASE)
+
+/* Board specific hardware definitions */
+#define AUTCPU12_CHAR_LCD_BASE (CS1_PHYS_BASE + 0x00000000)
+#define AUTCPU12_CSAUX1_BASE   (CS1_PHYS_BASE + 0x04000000)
+#define AUTCPU12_CAN_BASE      (CS1_PHYS_BASE + 0x08000000)
+#define AUTCPU12_TOUCH_BASE    (CS1_PHYS_BASE + 0x0a000000)
+#define AUTCPU12_IO_BASE       (CS1_PHYS_BASE + 0x0c000000)
+#define AUTCPU12_LPT_BASE      (CS1_PHYS_BASE + 0x0e000000)
+
+/* NVRAM */
+#define AUTCPU12_NVRAM_BASE    (CS1_PHYS_BASE + 0x02000000)
 
+/* SmartMedia flash */
 #define AUTCPU12_SMC_BASE      (CS1_PHYS_BASE + 0x06000000)
 #define AUTCPU12_SMC_SEL_BASE  (AUTCPU12_SMC_BASE + 0x10)
 
+/* Ethernet */
+#define AUTCPU12_CS8900_BASE   (CS2_PHYS_BASE + 0x300)
+#define AUTCPU12_CS8900_IRQ    (IRQ_EINT3)
+
+/* NAND flash */
 #define AUTCPU12_MMGPIO_BASE   (CLPS711X_NR_GPIO)
 #define AUTCPU12_SMC_NCE       (AUTCPU12_MMGPIO_BASE + 0) /* Bit 0 */
 #define AUTCPU12_SMC_RDY       CLPS711X_GPIO(1, 2)
 #define AUTCPU12_SMC_ALE       CLPS711X_GPIO(1, 3)
 #define AUTCPU12_SMC_CLE       CLPS711X_GPIO(1, 3)
 
+/* LCD contrast digital potentiometer */
+#define AUTCPU12_DPOT_CS       CLPS711X_GPIO(4, 0)
+#define AUTCPU12_DPOT_CLK      CLPS711X_GPIO(4, 1)
+#define AUTCPU12_DPOT_UD       CLPS711X_GPIO(4, 2)
+
 static struct resource autcpu12_cs8900_resource[] __initdata = {
        DEFINE_RES_MEM(AUTCPU12_CS8900_BASE, SZ_1K),
        DEFINE_RES_IRQ(AUTCPU12_CS8900_IRQ),
 };
 
-static struct resource autcpu12_nvram_resource[] __initdata = {
-       DEFINE_RES_MEM_NAMED(AUTCPU12_PHYS_NVRAM, SZ_128K, "SRAM"),
-};
-
-static struct platform_device autcpu12_nvram_pdev __initdata = {
-       .name           = "autcpu12_nvram",
-       .id             = -1,
-       .resource       = autcpu12_nvram_resource,
-       .num_resources  = ARRAY_SIZE(autcpu12_nvram_resource),
-};
-
 static struct resource autcpu12_nand_resource[] __initdata = {
        DEFINE_RES_MEM(AUTCPU12_SMC_BASE, SZ_16),
 };
@@ -147,17 +160,106 @@ static struct platform_device autcpu12_mmgpio_pdev __initdata = {
        },
 };
 
+static const struct gpio autcpu12_gpios[] __initconst = {
+       { AUTCPU12_DPOT_CS,     GPIOF_OUT_INIT_HIGH,    "DPOT CS" },
+       { AUTCPU12_DPOT_CLK,    GPIOF_OUT_INIT_LOW,     "DPOT CLK" },
+       { AUTCPU12_DPOT_UD,     GPIOF_OUT_INIT_LOW,     "DPOT UD" },
+};
+
+static struct mtd_partition autcpu12_flash_partitions[] = {
+       {
+               .name   = "NOR.0",
+               .offset = 0,
+               .size   = MTDPART_SIZ_FULL,
+       },
+};
+
+static struct physmap_flash_data autcpu12_flash_pdata = {
+       .width          = 4,
+       .parts          = autcpu12_flash_partitions,
+       .nr_parts       = ARRAY_SIZE(autcpu12_flash_partitions),
+};
+
+static struct resource autcpu12_flash_resources[] __initdata = {
+       DEFINE_RES_MEM(AUTCPU12_FLASH_BASE, SZ_8M),
+};
+
+static struct platform_device autcpu12_flash_pdev __initdata = {
+       .name           = "physmap-flash",
+       .id             = 0,
+       .resource       = autcpu12_flash_resources,
+       .num_resources  = ARRAY_SIZE(autcpu12_flash_resources),
+       .dev            = {
+               .platform_data  = &autcpu12_flash_pdata,
+       },
+};
+
+static struct resource autcpu12_nvram_resource[] __initdata = {
+       DEFINE_RES_MEM(AUTCPU12_NVRAM_BASE, 0),
+};
+
+static struct platdata_mtd_ram autcpu12_nvram_pdata = {
+       .bankwidth      = 4,
+};
+
+static struct platform_device autcpu12_nvram_pdev __initdata = {
+       .name           = "mtd-ram",
+       .id             = 0,
+       .resource       = autcpu12_nvram_resource,
+       .num_resources  = ARRAY_SIZE(autcpu12_nvram_resource),
+       .dev            = {
+               .platform_data  = &autcpu12_nvram_pdata,
+       },
+};
+
+static void __init autcpu12_nvram_init(void)
+{
+       void __iomem *nvram;
+       unsigned int save[2];
+       resource_size_t nvram_size = SZ_128K;
+
+       /*
+        * Check for 32K/128K
+        * Read ofs 0K
+        * Read ofs 64K
+        * Write complement to ofs 64K
+        * Read and check result on ofs 0K
+        * Restore contents
+        */
+       nvram = ioremap(autcpu12_nvram_resource[0].start, SZ_128K);
+       if (nvram) {
+               save[0] = readl(nvram + 0);
+               save[1] = readl(nvram + SZ_64K);
+               writel(~save[0], nvram + SZ_64K);
+               if (readl(nvram + 0) != save[0]) {
+                       writel(save[0], nvram + 0);
+                       nvram_size = SZ_32K;
+               } else
+                       writel(save[1], nvram + SZ_64K);
+               iounmap(nvram);
+
+               autcpu12_nvram_resource[0].end =
+                       autcpu12_nvram_resource[0].start + nvram_size - 1;
+               platform_device_register(&autcpu12_nvram_pdev);
+       } else
+               pr_err("Failed to remap NVRAM resource\n");
+}
+
 static void __init autcpu12_init(void)
 {
+       clps711x_devices_init();
+       platform_device_register(&autcpu12_flash_pdev);
        platform_device_register_simple("video-clps711x", 0, NULL, 0);
        platform_device_register_simple("cs89x0", 0, autcpu12_cs8900_resource,
                                        ARRAY_SIZE(autcpu12_cs8900_resource));
        platform_device_register(&autcpu12_mmgpio_pdev);
-       platform_device_register(&autcpu12_nvram_pdev);
+       autcpu12_nvram_init();
 }
 
 static void __init autcpu12_init_late(void)
 {
+       gpio_request_array(autcpu12_gpios, ARRAY_SIZE(autcpu12_gpios));
+
        if (IS_ENABLED(MTD_NAND_GPIO) && IS_ENABLED(GPIO_GENERIC_PLATFORM)) {
                /* We are need both drivers to handle NAND */
                platform_device_register(&autcpu12_nand_pdev);
@@ -169,6 +271,7 @@ MACHINE_START(AUTCPU12, "autronix autcpu12")
        .atag_offset    = 0x20000,
        .nr_irqs        = CLPS711X_NR_IRQS,
        .map_io         = clps711x_map_io,
+       .init_early     = clps711x_init_early,
        .init_irq       = clps711x_init_irq,
        .init_time      = clps711x_timer_init,
        .init_machine   = autcpu12_init,
index baab7da33c9b62b1351d43ae9be6e953c8fb7446..a9e38c6bcfb4169339b103a9a4df00e55e70f8af 100644 (file)
@@ -39,6 +39,7 @@
 #include <asm/mach/map.h>
 
 #include "common.h"
+#include "devices.h"
 
 #define CDB89712_CS8900_BASE   (CS2_PHYS_BASE + 0x300)
 #define CDB89712_CS8900_IRQ    (IRQ_EINT3)
@@ -127,6 +128,7 @@ static struct platform_device cdb89712_sram_pdev __initdata = {
 
 static void __init cdb89712_init(void)
 {
+       clps711x_devices_init();
        platform_device_register(&cdb89712_flash_pdev);
        platform_device_register(&cdb89712_bootrom_pdev);
        platform_device_register(&cdb89712_sram_pdev);
@@ -139,6 +141,7 @@ MACHINE_START(CDB89712, "Cirrus-CDB89712")
        .atag_offset    = 0x100,
        .nr_irqs        = CLPS711X_NR_IRQS,
        .map_io         = clps711x_map_io,
+       .init_early     = clps711x_init_early,
        .init_irq       = clps711x_init_irq,
        .init_time      = clps711x_timer_init,
        .init_machine   = cdb89712_init,
index 014aa3c19a033856aeb4ffa867cc0ed35512169b..b4764246d0f85deb15c4c127ed48a7faaff7aa63 100644 (file)
@@ -39,6 +39,7 @@ MACHINE_START(CLEP7212, "Cirrus Logic 7212/7312")
        .nr_irqs        = CLPS711X_NR_IRQS,
        .fixup          = fixup_clep7312,
        .map_io         = clps711x_map_io,
+       .init_early     = clps711x_init_early,
        .init_irq       = clps711x_init_irq,
        .init_time      = clps711x_timer_init,
        .handle_irq     = clps711x_handle_irq,
index 5f928e9ed2efdfd5e665eac6f8e0224dc1c3e3a1..9dfb990f08013060f72df49f81a29831a4be4cc5 100644 (file)
@@ -12,6 +12,7 @@
 #include <linux/delay.h>
 #include <linux/memblock.h>
 #include <linux/types.h>
+#include <linux/i2c-gpio.h>
 #include <linux/interrupt.h>
 #include <linux/backlight.h>
 #include <linux/platform_device.h>
@@ -29,6 +30,7 @@
 #include <mach/hardware.h>
 
 #include "common.h"
+#include "devices.h"
 
 #define VIDEORAM_SIZE          SZ_128K
 
 #define EDB7211_LCDEN          CLPS711X_GPIO(3, 2)
 #define EDB7211_LCDBL          CLPS711X_GPIO(3, 3)
 
+#define EDB7211_I2C_SDA                CLPS711X_GPIO(3, 4)
+#define EDB7211_I2C_SCL                CLPS711X_GPIO(3, 5)
+
 #define EDB7211_FLASH0_BASE    (CS0_PHYS_BASE)
 #define EDB7211_FLASH1_BASE    (CS1_PHYS_BASE)
+
 #define EDB7211_CS8900_BASE    (CS2_PHYS_BASE + 0x300)
 #define EDB7211_CS8900_IRQ     (IRQ_EINT3)
 
+/* The extra 8 lines of the keyboard matrix */
+#define EDB7211_EXTKBD_BASE    (CS3_PHYS_BASE)
+
+static struct i2c_gpio_platform_data edb7211_i2c_pdata __initdata = {
+       .sda_pin        = EDB7211_I2C_SDA,
+       .scl_pin        = EDB7211_I2C_SCL,
+       .scl_is_output_only = 1,
+};
+
 static struct resource edb7211_cs8900_resource[] __initdata = {
        DEFINE_RES_MEM(EDB7211_CS8900_BASE, SZ_1K),
        DEFINE_RES_IRQ(EDB7211_CS8900_IRQ),
@@ -94,13 +109,14 @@ static struct plat_lcd_data edb7211_lcd_power_pdata = {
 
 static void edb7211_lcd_backlight_set_intensity(int intensity)
 {
-       gpio_set_value(EDB7211_LCDBL, intensity);
+       gpio_set_value(EDB7211_LCDBL, !!intensity);
+       clps_writel((clps_readl(PMPCON) & 0xf0ff) | (intensity << 8), PMPCON);
 }
 
 static struct generic_bl_info edb7211_lcd_backlight_pdata = {
        .name                   = "lcd-backlight.0",
        .default_intensity      = 0x01,
-       .max_intensity          = 0x01,
+       .max_intensity          = 0x0f,
        .set_bl_intensity       = edb7211_lcd_backlight_set_intensity,
 };
 
@@ -112,8 +128,8 @@ static struct gpio edb7211_gpios[] __initconst = {
 
 static struct map_desc edb7211_io_desc[] __initdata = {
        {       /* Memory-mapped extra keyboard row */
-               .virtual        = IO_ADDRESS(EP7211_PHYS_EXTKBD),
-               .pfn            = __phys_to_pfn(EP7211_PHYS_EXTKBD),
+               .virtual        = IO_ADDRESS(EDB7211_EXTKBD_BASE),
+               .pfn            = __phys_to_pfn(EDB7211_EXTKBD_BASE),
                .length         = SZ_1M,
                .type           = MT_DEVICE,
        },
@@ -150,6 +166,11 @@ fixup_edb7211(struct tag *tags, char **cmdline, struct meminfo *mi)
 }
 
 static void __init edb7211_init(void)
+{
+       clps711x_devices_init();
+}
+
+static void __init edb7211_init_late(void)
 {
        gpio_request_array(edb7211_gpios, ARRAY_SIZE(edb7211_gpios));
 
@@ -163,6 +184,9 @@ static void __init edb7211_init(void)
        platform_device_register_simple("video-clps711x", 0, NULL, 0);
        platform_device_register_simple("cs89x0", 0, edb7211_cs8900_resource,
                                        ARRAY_SIZE(edb7211_cs8900_resource));
+       platform_device_register_data(&platform_bus, "i2c-gpio", 0,
+                                     &edb7211_i2c_pdata,
+                                     sizeof(edb7211_i2c_pdata));
 }
 
 MACHINE_START(EDB7211, "CL-EDB7211 (EP7211 eval board)")
@@ -172,9 +196,11 @@ MACHINE_START(EDB7211, "CL-EDB7211 (EP7211 eval board)")
        .fixup          = fixup_edb7211,
        .reserve        = edb7211_reserve,
        .map_io         = edb7211_map_io,
+       .init_early     = clps711x_init_early,
        .init_irq       = clps711x_init_irq,
        .init_time      = clps711x_timer_init,
        .init_machine   = edb7211_init,
+       .init_late      = edb7211_init_late,
        .handle_irq     = clps711x_handle_irq,
        .restart        = clps711x_restart,
 MACHINE_END
index c5675efc8c6a0d98cc9834cc20059ec57709c326..b1561e3d7c5c325e7250156396306a9c629af9a6 100644 (file)
@@ -77,6 +77,7 @@ MACHINE_START(FORTUNET, "ARM-FortuNet")
        .nr_irqs        = CLPS711X_NR_IRQS,
        .fixup          = fortunet_fixup,
        .map_io         = clps711x_map_io,
+       .init_early     = clps711x_init_early,
        .init_irq       = clps711x_init_irq,
        .init_time      = clps711x_timer_init,
        .handle_irq     = clps711x_handle_irq,
index 8d3ee67711356c6da73c701c0e52c47540f370a2..dd81b06f68fed749e38c16f743ec65fb0ef78164 100644 (file)
 #include <linux/string.h>
 #include <linux/mm.h>
 #include <linux/io.h>
+#include <linux/gpio.h>
 #include <linux/slab.h>
 #include <linux/leds.h>
 #include <linux/sizes.h>
 #include <linux/backlight.h>
+#include <linux/basic_mmio_gpio.h>
 #include <linux/platform_device.h>
 #include <linux/mtd/partitions.h>
 #include <linux/mtd/nand-gpio.h>
 #include <asm/mach-types.h>
 #include <asm/mach/arch.h>
 #include <asm/mach/map.h>
-#include <mach/syspld.h>
 
 #include <video/platform_lcd.h>
 
 #include "common.h"
+#include "devices.h"
 
 #define P720T_USERLED          CLPS711X_GPIO(3, 0)
 #define P720T_NAND_CLE         CLPS711X_GPIO(4, 0)
 
 #define P720T_NAND_BASE                (CLPS711X_SDRAM1_BASE)
 
+#define P720T_MMGPIO_BASE      (CLPS711X_NR_GPIO)
+
+#define SYSPLD_PHYS_BASE       IOMEM(CS1_PHYS_BASE)
+
+#define PLD_INT                        (SYSPLD_PHYS_BASE + 0x000000)
+#define PLD_INT_MMGPIO_BASE    (P720T_MMGPIO_BASE + 0)
+#define PLD_INT_PENIRQ         (PLD_INT_MMGPIO_BASE + 5)
+#define PLD_INT_UCB_IRQ                (PLD_INT_MMGPIO_BASE + 1)
+#define PLD_INT_KBD_ATN                (PLD_INT_MMGPIO_BASE + 0) /* EINT1 */
+
+#define PLD_PWR                        (SYSPLD_PHYS_BASE + 0x000004)
+#define PLD_PWR_MMGPIO_BASE    (P720T_MMGPIO_BASE + 8)
+#define PLD_PWR_EXT            (PLD_PWR_MMGPIO_BASE + 5)
+#define PLD_PWR_MODE           (PLD_PWR_MMGPIO_BASE + 4) /* 1 = PWM, 0 = PFM */
+#define PLD_S4_ON              (PLD_PWR_MMGPIO_BASE + 3) /* LCD bias voltage enable */
+#define PLD_S3_ON              (PLD_PWR_MMGPIO_BASE + 2) /* LCD backlight enable */
+#define PLD_S2_ON              (PLD_PWR_MMGPIO_BASE + 1) /* LCD 3V3 supply enable */
+#define PLD_S1_ON              (PLD_PWR_MMGPIO_BASE + 0) /* LCD 3V supply enable */
+
+#define PLD_KBD                        (SYSPLD_PHYS_BASE + 0x000008)
+#define PLD_KBD_MMGPIO_BASE    (P720T_MMGPIO_BASE + 16)
+#define PLD_KBD_WAKE           (PLD_KBD_MMGPIO_BASE + 1)
+#define PLD_KBD_EN             (PLD_KBD_MMGPIO_BASE + 0)
+
+#define PLD_SPI                        (SYSPLD_PHYS_BASE + 0x00000c)
+#define PLD_SPI_MMGPIO_BASE    (P720T_MMGPIO_BASE + 24)
+#define PLD_SPI_EN             (PLD_SPI_MMGPIO_BASE + 0)
+
+#define PLD_IO                 (SYSPLD_PHYS_BASE + 0x000010)
+#define PLD_IO_MMGPIO_BASE     (P720T_MMGPIO_BASE + 32)
+#define PLD_IO_BOOTSEL         (PLD_IO_MMGPIO_BASE + 6) /* Boot sel switch */
+#define PLD_IO_USER            (PLD_IO_MMGPIO_BASE + 5) /* User defined switch */
+#define PLD_IO_LED3            (PLD_IO_MMGPIO_BASE + 4)
+#define PLD_IO_LED2            (PLD_IO_MMGPIO_BASE + 3)
+#define PLD_IO_LED1            (PLD_IO_MMGPIO_BASE + 2)
+#define PLD_IO_LED0            (PLD_IO_MMGPIO_BASE + 1)
+#define PLD_IO_LEDEN           (PLD_IO_MMGPIO_BASE + 0)
+
+#define PLD_IRDA               (SYSPLD_PHYS_BASE + 0x000014)
+#define PLD_IRDA_MMGPIO_BASE   (P720T_MMGPIO_BASE + 40)
+#define PLD_IRDA_EN            (PLD_IRDA_MMGPIO_BASE + 0)
+
+#define PLD_COM2               (SYSPLD_PHYS_BASE + 0x000018)
+#define PLD_COM2_MMGPIO_BASE   (P720T_MMGPIO_BASE + 48)
+#define PLD_COM2_EN            (PLD_COM2_MMGPIO_BASE + 0)
+
+#define PLD_COM1               (SYSPLD_PHYS_BASE + 0x00001c)
+#define PLD_COM1_MMGPIO_BASE   (P720T_MMGPIO_BASE + 56)
+#define PLD_COM1_EN            (PLD_COM1_MMGPIO_BASE + 0)
+
+#define PLD_AUD                        (SYSPLD_PHYS_BASE + 0x000020)
+#define PLD_AUD_MMGPIO_BASE    (P720T_MMGPIO_BASE + 64)
+#define PLD_AUD_DIV1           (PLD_AUD_MMGPIO_BASE + 6)
+#define PLD_AUD_DIV0           (PLD_AUD_MMGPIO_BASE + 5)
+#define PLD_AUD_CLK_SEL1       (PLD_AUD_MMGPIO_BASE + 4)
+#define PLD_AUD_CLK_SEL0       (PLD_AUD_MMGPIO_BASE + 3)
+#define PLD_AUD_MIC_PWR                (PLD_AUD_MMGPIO_BASE + 2)
+#define PLD_AUD_MIC_GAIN       (PLD_AUD_MMGPIO_BASE + 1)
+#define PLD_AUD_CODEC_EN       (PLD_AUD_MMGPIO_BASE + 0)
+
+#define PLD_CF                 (SYSPLD_PHYS_BASE + 0x000024)
+#define PLD_CF_MMGPIO_BASE     (P720T_MMGPIO_BASE + 72)
+#define PLD_CF2_SLEEP          (PLD_CF_MMGPIO_BASE + 5)
+#define PLD_CF1_SLEEP          (PLD_CF_MMGPIO_BASE + 4)
+#define PLD_CF2_nPDREQ         (PLD_CF_MMGPIO_BASE + 3)
+#define PLD_CF1_nPDREQ         (PLD_CF_MMGPIO_BASE + 2)
+#define PLD_CF2_nIRQ           (PLD_CF_MMGPIO_BASE + 1)
+#define PLD_CF1_nIRQ           (PLD_CF_MMGPIO_BASE + 0)
+
+#define PLD_SDC                        (SYSPLD_PHYS_BASE + 0x000028)
+#define PLD_SDC_MMGPIO_BASE    (P720T_MMGPIO_BASE + 80)
+#define PLD_SDC_INT_EN         (PLD_SDC_MMGPIO_BASE + 2)
+#define PLD_SDC_WP             (PLD_SDC_MMGPIO_BASE + 1)
+#define PLD_SDC_CD             (PLD_SDC_MMGPIO_BASE + 0)
+
+#define PLD_CODEC              (SYSPLD_PHYS_BASE + 0x400000)
+#define PLD_CODEC_MMGPIO_BASE  (P720T_MMGPIO_BASE + 88)
+#define PLD_CODEC_IRQ3         (PLD_CODEC_MMGPIO_BASE + 4)
+#define PLD_CODEC_IRQ2         (PLD_CODEC_MMGPIO_BASE + 3)
+#define PLD_CODEC_IRQ1         (PLD_CODEC_MMGPIO_BASE + 2)
+#define PLD_CODEC_EN           (PLD_CODEC_MMGPIO_BASE + 0)
+
+#define PLD_BRITE              (SYSPLD_PHYS_BASE + 0x400004)
+#define PLD_BRITE_MMGPIO_BASE  (P720T_MMGPIO_BASE + 96)
+#define PLD_BRITE_UP           (PLD_BRITE_MMGPIO_BASE + 1)
+#define PLD_BRITE_DN           (PLD_BRITE_MMGPIO_BASE + 0)
+
+#define PLD_LCDEN              (SYSPLD_PHYS_BASE + 0x400008)
+#define PLD_LCDEN_MMGPIO_BASE  (P720T_MMGPIO_BASE + 104)
+#define PLD_LCDEN_EN           (PLD_LCDEN_MMGPIO_BASE + 0)
+
+#define PLD_TCH                        (SYSPLD_PHYS_BASE + 0x400010)
+#define PLD_TCH_MMGPIO_BASE    (P720T_MMGPIO_BASE + 112)
+#define PLD_TCH_PENIRQ         (PLD_TCH_MMGPIO_BASE + 1)
+#define PLD_TCH_EN             (PLD_TCH_MMGPIO_BASE + 0)
+
+#define PLD_GPIO               (SYSPLD_PHYS_BASE + 0x400014)
+#define PLD_GPIO_MMGPIO_BASE   (P720T_MMGPIO_BASE + 120)
+#define PLD_GPIO2              (PLD_GPIO_MMGPIO_BASE + 2)
+#define PLD_GPIO1              (PLD_GPIO_MMGPIO_BASE + 1)
+#define PLD_GPIO0              (PLD_GPIO_MMGPIO_BASE + 0)
+
+static struct gpio p720t_gpios[] __initconst = {
+       { PLD_S1_ON,    GPIOF_OUT_INIT_LOW,     "PLD_S1_ON" },
+       { PLD_S2_ON,    GPIOF_OUT_INIT_LOW,     "PLD_S2_ON" },
+       { PLD_S3_ON,    GPIOF_OUT_INIT_LOW,     "PLD_S3_ON" },
+       { PLD_S4_ON,    GPIOF_OUT_INIT_LOW,     "PLD_S4_ON" },
+       { PLD_KBD_EN,   GPIOF_OUT_INIT_LOW,     "PLD_KBD_EN" },
+       { PLD_SPI_EN,   GPIOF_OUT_INIT_LOW,     "PLD_SPI_EN" },
+       { PLD_IO_USER,  GPIOF_OUT_INIT_LOW,     "PLD_IO_USER" },
+       { PLD_IO_LED0,  GPIOF_OUT_INIT_LOW,     "PLD_IO_LED0" },
+       { PLD_IO_LED1,  GPIOF_OUT_INIT_LOW,     "PLD_IO_LED1" },
+       { PLD_IO_LED2,  GPIOF_OUT_INIT_LOW,     "PLD_IO_LED2" },
+       { PLD_IO_LED3,  GPIOF_OUT_INIT_LOW,     "PLD_IO_LED3" },
+       { PLD_IO_LEDEN, GPIOF_OUT_INIT_LOW,     "PLD_IO_LEDEN" },
+       { PLD_IRDA_EN,  GPIOF_OUT_INIT_LOW,     "PLD_IRDA_EN" },
+       { PLD_COM1_EN,  GPIOF_OUT_INIT_HIGH,    "PLD_COM1_EN" },
+       { PLD_COM2_EN,  GPIOF_OUT_INIT_HIGH,    "PLD_COM2_EN" },
+       { PLD_CODEC_EN, GPIOF_OUT_INIT_LOW,     "PLD_CODEC_EN" },
+       { PLD_LCDEN_EN, GPIOF_OUT_INIT_LOW,     "PLD_LCDEN_EN" },
+       { PLD_TCH_EN,   GPIOF_OUT_INIT_LOW,     "PLD_TCH_EN" },
+       { P720T_USERLED,GPIOF_OUT_INIT_LOW,     "USER_LED" },
+};
+
+static struct resource p720t_mmgpio_resource[] __initdata = {
+       DEFINE_RES_MEM_NAMED(0, 4, "dat"),
+};
+
+static struct bgpio_pdata p720t_mmgpio_pdata = {
+       .ngpio  = 8,
+};
+
+static struct platform_device p720t_mmgpio __initdata = {
+       .name           = "basic-mmio-gpio",
+       .id             = -1,
+       .resource       = p720t_mmgpio_resource,
+       .num_resources  = ARRAY_SIZE(p720t_mmgpio_resource),
+       .dev            = {
+               .platform_data  = &p720t_mmgpio_pdata,
+       },
+};
+
+static void __init p720t_mmgpio_init(void __iomem *addrbase, int gpiobase)
+{
+       p720t_mmgpio_resource[0].start = (unsigned long)addrbase;
+       p720t_mmgpio_pdata.base = gpiobase;
+
+       platform_device_register(&p720t_mmgpio);
+}
+
+static struct {
+       void __iomem    *addrbase;
+       int             gpiobase;
+} mmgpios[] __initconst = {
+       { PLD_INT,      PLD_INT_MMGPIO_BASE },
+       { PLD_PWR,      PLD_PWR_MMGPIO_BASE },
+       { PLD_KBD,      PLD_KBD_MMGPIO_BASE },
+       { PLD_SPI,      PLD_SPI_MMGPIO_BASE },
+       { PLD_IO,       PLD_IO_MMGPIO_BASE },
+       { PLD_IRDA,     PLD_IRDA_MMGPIO_BASE },
+       { PLD_COM2,     PLD_COM2_MMGPIO_BASE },
+       { PLD_COM1,     PLD_COM1_MMGPIO_BASE },
+       { PLD_AUD,      PLD_AUD_MMGPIO_BASE },
+       { PLD_CF,       PLD_CF_MMGPIO_BASE },
+       { PLD_SDC,      PLD_SDC_MMGPIO_BASE },
+       { PLD_CODEC,    PLD_CODEC_MMGPIO_BASE },
+       { PLD_BRITE,    PLD_BRITE_MMGPIO_BASE },
+       { PLD_LCDEN,    PLD_LCDEN_MMGPIO_BASE },
+       { PLD_TCH,      PLD_TCH_MMGPIO_BASE },
+       { PLD_GPIO,     PLD_GPIO_MMGPIO_BASE },
+};
+
 static struct resource p720t_nand_resource[] __initdata = {
        DEFINE_RES_MEM(P720T_NAND_BASE, SZ_4),
 };
@@ -92,11 +266,15 @@ static struct platform_device p720t_nand_pdev __initdata = {
 static void p720t_lcd_power_set(struct plat_lcd_data *pd, unsigned int power)
 {
        if (power) {
-               PLD_LCDEN = PLD_LCDEN_EN;
-               PLD_PWR |= PLD_S4_ON | PLD_S2_ON | PLD_S1_ON;
+               gpio_set_value(PLD_LCDEN_EN, 1);
+               gpio_set_value(PLD_S1_ON, 1);
+               gpio_set_value(PLD_S2_ON, 1);
+               gpio_set_value(PLD_S4_ON, 1);
        } else {
-               PLD_PWR &= ~(PLD_S4_ON | PLD_S2_ON | PLD_S1_ON);
-               PLD_LCDEN = 0;
+               gpio_set_value(PLD_S1_ON, 0);
+               gpio_set_value(PLD_S2_ON, 0);
+               gpio_set_value(PLD_S4_ON, 0);
+               gpio_set_value(PLD_LCDEN_EN, 0);
        }
 }
 
@@ -106,10 +284,7 @@ static struct plat_lcd_data p720t_lcd_power_pdata = {
 
 static void p720t_lcd_backlight_set_intensity(int intensity)
 {
-       if (intensity)
-               PLD_PWR |= PLD_S3_ON;
-       else
-               PLD_PWR = 0;
+       gpio_set_value(PLD_S3_ON, intensity);
 }
 
 static struct generic_bl_info p720t_lcd_backlight_pdata = {
@@ -119,19 +294,6 @@ static struct generic_bl_info p720t_lcd_backlight_pdata = {
        .set_bl_intensity       = p720t_lcd_backlight_set_intensity,
 };
 
-/*
- * Map the P720T system PLD. It occupies two address spaces:
- * 0x10000000 and 0x10400000. We map both regions as one.
- */
-static struct map_desc p720t_io_desc[] __initdata = {
-       {
-               .virtual        = SYSPLD_VIRT_BASE,
-               .pfn            = __phys_to_pfn(SYSPLD_PHYS_BASE),
-               .length         = SZ_8M,
-               .type           = MT_DEVICE,
-       },
-};
-
 static void __init
 fixup_p720t(struct tag *tag, char **cmdline, struct meminfo *mi)
 {
@@ -157,33 +319,6 @@ fixup_p720t(struct tag *tag, char **cmdline, struct meminfo *mi)
        }
 }
 
-static void __init p720t_map_io(void)
-{
-       clps711x_map_io();
-       iotable_init(p720t_io_desc, ARRAY_SIZE(p720t_io_desc));
-}
-
-static void __init p720t_init_early(void)
-{
-       /*
-        * Power down as much as possible in case we don't
-        * have the drivers loaded.
-        */
-       PLD_LCDEN = 0;
-       PLD_PWR  &= ~(PLD_S4_ON|PLD_S3_ON|PLD_S2_ON|PLD_S1_ON);
-
-       PLD_KBD   = 0;
-       PLD_IO    = 0;
-       PLD_IRDA  = 0;
-       PLD_CODEC = 0;
-       PLD_TCH   = 0;
-       PLD_SPI   = 0;
-       if (!IS_ENABLED(CONFIG_DEBUG_LL)) {
-               PLD_COM2 = 0;
-               PLD_COM1 = 0;
-       }
-}
-
 static struct gpio_led p720t_gpio_leds[] = {
        {
                .name                   = "User LED",
@@ -199,7 +334,20 @@ static struct gpio_led_platform_data p720t_gpio_led_pdata __initdata = {
 
 static void __init p720t_init(void)
 {
+       int i;
+
+       clps711x_devices_init();
+
+       for (i = 0; i < ARRAY_SIZE(mmgpios); i++)
+               p720t_mmgpio_init(mmgpios[i].addrbase, mmgpios[i].gpiobase);
+
        platform_device_register(&p720t_nand_pdev);
+}
+
+static void __init p720t_init_late(void)
+{
+       WARN_ON(gpio_request_array(p720t_gpios, ARRAY_SIZE(p720t_gpios)));
+
        platform_device_register_data(&platform_bus, "platform-lcd", 0,
                                      &p720t_lcd_power_pdata,
                                      sizeof(p720t_lcd_power_pdata));
@@ -207,10 +355,6 @@ static void __init p720t_init(void)
                                      &p720t_lcd_backlight_pdata,
                                      sizeof(p720t_lcd_backlight_pdata));
        platform_device_register_simple("video-clps711x", 0, NULL, 0);
-}
-
-static void __init p720t_init_late(void)
-{
        platform_device_register_data(&platform_bus, "leds-gpio", 0,
                                      &p720t_gpio_led_pdata,
                                      sizeof(p720t_gpio_led_pdata));
@@ -221,8 +365,8 @@ MACHINE_START(P720T, "ARM-Prospector720T")
        .atag_offset    = 0x100,
        .nr_irqs        = CLPS711X_NR_IRQS,
        .fixup          = fixup_p720t,
-       .map_io         = p720t_map_io,
-       .init_early     = p720t_init_early,
+       .map_io         = clps711x_map_io,
+       .init_early     = clps711x_init_early,
        .init_irq       = clps711x_init_irq,
        .init_time      = clps711x_timer_init,
        .init_machine   = p720t_init,
index 20ff50f3ccf04afb34361e4e84edbbbfed371601..f6d1746366d4cf3b6d55be25c505dea4f0279b7d 100644 (file)
 #include <linux/clk.h>
 #include <linux/clkdev.h>
 #include <linux/clockchips.h>
+#include <linux/clocksource.h>
 #include <linux/clk-provider.h>
 
 #include <asm/exception.h>
 #include <asm/mach/irq.h>
 #include <asm/mach/map.h>
 #include <asm/mach/time.h>
+#include <asm/sched_clock.h>
 #include <asm/system_misc.h>
 
 #include <mach/hardware.h>
@@ -213,7 +215,7 @@ void __init clps711x_init_irq(void)
        }
 }
 
-inline u32 fls16(u32 x)
+static inline u32 fls16(u32 x)
 {
        u32 r = 15;
 
@@ -237,27 +239,52 @@ inline u32 fls16(u32 x)
 
 asmlinkage void __exception_irq_entry clps711x_handle_irq(struct pt_regs *regs)
 {
-       u32 irqstat;
-       void __iomem *base = CLPS711X_VIRT_BASE;
-
-       irqstat = readl_relaxed(base + INTSR1) & readl_relaxed(base + INTMR1);
-       if (irqstat) {
-               handle_IRQ(fls16(irqstat), regs);
-               return;
-       }
+       do {
+               u32 irqstat;
+               void __iomem *base = CLPS711X_VIRT_BASE;
+
+               irqstat = readw_relaxed(base + INTSR1) &
+                         readw_relaxed(base + INTMR1);
+               if (irqstat)
+                       handle_IRQ(fls16(irqstat), regs);
+
+               irqstat = readw_relaxed(base + INTSR2) &
+                         readw_relaxed(base + INTMR2);
+               if (irqstat) {
+                       handle_IRQ(fls16(irqstat) + 16, regs);
+                       continue;
+               }
+
+               break;
+       } while (1);
+}
 
-       irqstat = readl_relaxed(base + INTSR2) & readl_relaxed(base + INTMR2);
-       if (likely(irqstat))
-               handle_IRQ(fls16(irqstat) + 16, regs);
+static u32 notrace clps711x_sched_clock_read(void)
+{
+       return ~readw_relaxed(CLPS711X_VIRT_BASE + TC1D);
 }
 
 static void clps711x_clockevent_set_mode(enum clock_event_mode mode,
                                         struct clock_event_device *evt)
 {
+       disable_irq(IRQ_TC2OI);
+
+       switch (mode) {
+       case CLOCK_EVT_MODE_PERIODIC:
+               enable_irq(IRQ_TC2OI);
+               break;
+       case CLOCK_EVT_MODE_ONESHOT:
+               /* Not supported */
+       case CLOCK_EVT_MODE_SHUTDOWN:
+       case CLOCK_EVT_MODE_UNUSED:
+       case CLOCK_EVT_MODE_RESUME:
+               /* Left event sources disabled, no more interrupts appear */
+               break;
+       }
 }
 
 static struct clock_event_device clockevent_clps711x = {
-       .name           = "CLPS711x Clockevents",
+       .name           = "clps711x-clockevent",
        .rating         = 300,
        .features       = CLOCK_EVT_FEAT_PERIODIC,
        .set_mode       = clps711x_clockevent_set_mode,
@@ -271,8 +298,8 @@ static irqreturn_t clps711x_timer_interrupt(int irq, void *dev_id)
 }
 
 static struct irqaction clps711x_timer_irq = {
-       .name           = "CLPS711x Timer Tick",
-       .flags          = IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL,
+       .name           = "clps711x-timer",
+       .flags          = IRQF_TIMER | IRQF_IRQPOLL,
        .handler        = clps711x_timer_interrupt,
 };
 
@@ -301,6 +328,7 @@ void __init clps711x_timer_init(void)
                cpu = ext;
                bus = cpu;
                spi = 135400;
+               pll = 0;
        } else {
                cpu = pll;
                if (cpu >= 36864000)
@@ -319,9 +347,9 @@ void __init clps711x_timer_init(void)
                else
                        timh = 541440;
        } else
-               timh = cpu / 144;
+               timh = DIV_ROUND_CLOSEST(cpu, 144);
 
-       timl = timh / 256;
+       timl = DIV_ROUND_CLOSEST(timh, 256);
 
        /* All clocks are fixed */
        add_fixed_clk(clk_pll, "pll", pll);
@@ -334,13 +362,24 @@ void __init clps711x_timer_init(void)
 
        pr_info("CPU frequency set at %i Hz.\n", cpu);
 
+       /* Start Timer1 in free running mode (Low frequency) */
+       tmp = clps_readl(SYSCON1) & ~(SYSCON1_TC1S | SYSCON1_TC1M);
+       clps_writel(tmp, SYSCON1);
+
+       setup_sched_clock(clps711x_sched_clock_read, 16, timl);
+
+       clocksource_mmio_init(CLPS711X_VIRT_BASE + TC1D,
+                             "clps711x_clocksource", timl, 300, 16,
+                             clocksource_mmio_readw_down);
+
+       /* Set Timer2 prescaler */
        clps_writew(DIV_ROUND_CLOSEST(timh, HZ), TC2D);
 
-       tmp = clps_readl(SYSCON1);
-       tmp |= SYSCON1_TC2S | SYSCON1_TC2M;
+       /* Start Timer2 in prescale mode (High frequency)*/
+       tmp = clps_readl(SYSCON1) | SYSCON1_TC2M | SYSCON1_TC2S;
        clps_writel(tmp, SYSCON1);
 
-       clockevents_config_and_register(&clockevent_clps711x, timh, 1, 0xffff);
+       clockevents_config_and_register(&clockevent_clps711x, timh, 0, 0);
 
        setup_irq(IRQ_TC2OI, &clps711x_timer_irq);
 }
@@ -353,15 +392,11 @@ void clps711x_restart(char mode, const char *cmd)
 static void clps711x_idle(void)
 {
        clps_writel(1, HALT);
-       __asm__ __volatile__(
-       "mov    r0, r0\n\
-       mov     r0, r0");
+       asm("mov r0, r0");
+       asm("mov r0, r0");
 }
 
-static int __init clps711x_idle_init(void)
+void __init clps711x_init_early(void)
 {
        arm_pm_idle = clps711x_idle;
-       return 0;
 }
-
-arch_initcall(clps711x_idle_init);
index f84a7292c70e4a77dc64eeda432266c1a6b7ac4b..2a22f4c6cc757cadddce7a17f080eb83f577b6e6 100644 (file)
@@ -13,3 +13,4 @@ extern void clps711x_init_irq(void);
 extern void clps711x_timer_init(void);
 extern void clps711x_handle_irq(struct pt_regs *regs);
 extern void clps711x_restart(char mode, const char *cmd);
+extern void clps711x_init_early(void);
diff --git a/arch/arm/mach-clps711x/devices.c b/arch/arm/mach-clps711x/devices.c
new file mode 100644 (file)
index 0000000..856b81c
--- /dev/null
@@ -0,0 +1,68 @@
+/*
+ *  CLPS711X common devices definitions
+ *
+ *  Author: Alexander Shiyan <shc_work@mail.ru>, 2013
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ */
+
+#include <linux/platform_device.h>
+#include <linux/sizes.h>
+
+#include <mach/hardware.h>
+
+static const phys_addr_t clps711x_gpios[][2] __initconst = {
+       { PADR, PADDR },
+       { PBDR, PBDDR },
+       { PCDR, PCDDR },
+       { PDDR, PDDDR },
+       { PEDR, PEDDR },
+};
+
+static void __init clps711x_add_gpio(void)
+{
+       unsigned i;
+       struct resource gpio_res[2];
+
+       memset(gpio_res, 0, sizeof(gpio_res));
+
+       gpio_res[0].flags = IORESOURCE_MEM;
+       gpio_res[1].flags = IORESOURCE_MEM;
+
+       for (i = 0; i < ARRAY_SIZE(clps711x_gpios); i++) {
+               gpio_res[0].start = CLPS711X_PHYS_BASE + clps711x_gpios[i][0];
+               gpio_res[0].end = gpio_res[0].start;
+               gpio_res[1].start = CLPS711X_PHYS_BASE + clps711x_gpios[i][1];
+               gpio_res[1].end = gpio_res[1].start;
+
+               platform_device_register_simple("clps711x-gpio", i,
+                                               gpio_res, ARRAY_SIZE(gpio_res));
+       }
+}
+
+const struct resource clps711x_syscon_res[] __initconst = {
+       /* SYSCON1, SYSFLG1 */
+       DEFINE_RES_MEM(CLPS711X_PHYS_BASE + SYSCON1, SZ_128),
+       /* SYSCON2, SYSFLG2 */
+       DEFINE_RES_MEM(CLPS711X_PHYS_BASE + SYSCON2, SZ_128),
+       /* SYSCON3 */
+       DEFINE_RES_MEM(CLPS711X_PHYS_BASE + SYSCON3, SZ_64),
+};
+
+static void __init clps711x_add_syscon(void)
+{
+       unsigned i;
+
+       for (i = 0; i < ARRAY_SIZE(clps711x_syscon_res); i++)
+               platform_device_register_simple("clps711x-syscon", i + 1,
+                                               &clps711x_syscon_res[i], 1);
+}
+
+void __init clps711x_devices_init(void)
+{
+       clps711x_add_gpio();
+       clps711x_add_syscon();
+}
diff --git a/arch/arm/mach-clps711x/devices.h b/arch/arm/mach-clps711x/devices.h
new file mode 100644 (file)
index 0000000..a5efc17
--- /dev/null
@@ -0,0 +1,12 @@
+/*
+ *  CLPS711X common devices definitions
+ *
+ *  Copyright (C) 2013 Alexander Shiyan <shc_work@mail.ru>
+ *
+ * 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.
+ */
+
+void clps711x_devices_init(void);
diff --git a/arch/arm/mach-clps711x/include/mach/autcpu12.h b/arch/arm/mach-clps711x/include/mach/autcpu12.h
deleted file mode 100644 (file)
index 0452f5f..0000000
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * AUTCPU12 specific defines
- *
- * (c) 2001 Thomas Gleixner, autronix automation <gleixner@autronix.de>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * 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 __ASM_ARCH_AUTCPU12_H
-#define __ASM_ARCH_AUTCPU12_H
-
-/*
- * The flash bank is wired to chip select 0
- */
-#define AUTCPU12_PHYS_FLASH            CS0_PHYS_BASE           /* physical */
-
-/* offset for device specific information structure */
-#define AUTCPU12_LCDINFO_OFFS          (0x00010000)    
-
-/* Videomemory in the internal SRAM (CS 6) */
-#define AUTCPU12_PHYS_VIDEO            CS6_PHYS_BASE
-
-/*
-* All special IO's are tied to CS1
-*/
-#define AUTCPU12_PHYS_CHAR_LCD                 CS1_PHYS_BASE +0x00000000  /* physical */
-
-#define AUTCPU12_PHYS_NVRAM                    CS1_PHYS_BASE +0x02000000  /* physical */
-
-#define AUTCPU12_PHYS_CSAUX1                   CS1_PHYS_BASE +0x04000000  /* physical */
-
-#define AUTCPU12_PHYS_CAN                      CS1_PHYS_BASE +0x08000000  /* physical */
-
-#define AUTCPU12_PHYS_TOUCH                    CS1_PHYS_BASE +0x0A000000  /* physical */
-
-#define AUTCPU12_PHYS_IO                       CS1_PHYS_BASE +0x0C000000  /* physical */
-
-#define AUTCPU12_PHYS_LPT                      CS1_PHYS_BASE +0x0E000000  /* physical */
-
-/*
-* defines for lcd contrast 
-*/
-#define AUTCPU12_DPOT_PORT_OFFSET      PEDR
-#define        AUTCPU12_DPOT_CS                (1<<0)
-#define AUTCPU12_DPOT_CLK              (1<<1)
-#define        AUTCPU12_DPOT_UD                (1<<2)
-
-#endif
index 01d1b95597109b8ef4b8f9e105717a7c347e3df0..0286f4bf994544da39253d05aae17594f091fb49 100644 (file)
@@ -21,6 +21,8 @@
 #ifndef __MACH_CLPS711X_H
 #define __MACH_CLPS711X_H
 
+#include <linux/mfd/syscon/clps711x.h>
+
 #define CLPS711X_PHYS_BASE     (0x80000000)
 
 #define PADR           (0x0000)
 #define RANDID2                (0x2708)
 #define RANDID3                (0x270c)
 
-/* common bits: SYSCON1 / SYSCON2 */
-#define SYSCON_UARTEN          (1 << 8)
-
-#define SYSCON1_KBDSCAN(x)     ((x) & 15)
-#define SYSCON1_KBDSCANMASK    (15)
-#define SYSCON1_TC1M           (1 << 4)
-#define SYSCON1_TC1S           (1 << 5)
-#define SYSCON1_TC2M           (1 << 6)
-#define SYSCON1_TC2S           (1 << 7)
-#define SYSCON1_UART1EN                SYSCON_UARTEN
-#define SYSCON1_BZTOG          (1 << 9)
-#define SYSCON1_BZMOD          (1 << 10)
-#define SYSCON1_DBGEN          (1 << 11)
-#define SYSCON1_LCDEN          (1 << 12)
-#define SYSCON1_CDENTX         (1 << 13)
-#define SYSCON1_CDENRX         (1 << 14)
-#define SYSCON1_SIREN          (1 << 15)
-#define SYSCON1_ADCKSEL(x)     (((x) & 3) << 16)
-#define SYSCON1_ADCKSEL_MASK   (3 << 16)
-#define SYSCON1_EXCKEN         (1 << 18)
-#define SYSCON1_WAKEDIS                (1 << 19)
-#define SYSCON1_IRTXM          (1 << 20)
-
-/* common bits: SYSFLG1 / SYSFLG2 */
-#define SYSFLG_UBUSY           (1 << 11)
-#define SYSFLG_URXFE           (1 << 22)
-#define SYSFLG_UTXFF           (1 << 23)
-
-#define SYSFLG1_MCDR           (1 << 0)
-#define SYSFLG1_DCDET          (1 << 1)
-#define SYSFLG1_WUDR           (1 << 2)
-#define SYSFLG1_WUON           (1 << 3)
-#define SYSFLG1_CTS            (1 << 8)
-#define SYSFLG1_DSR            (1 << 9)
-#define SYSFLG1_DCD            (1 << 10)
-#define SYSFLG1_UBUSY          SYSFLG_UBUSY
-#define SYSFLG1_NBFLG          (1 << 12)
-#define SYSFLG1_RSTFLG         (1 << 13)
-#define SYSFLG1_PFFLG          (1 << 14)
-#define SYSFLG1_CLDFLG         (1 << 15)
-#define SYSFLG1_URXFE          SYSFLG_URXFE
-#define SYSFLG1_UTXFF          SYSFLG_UTXFF
-#define SYSFLG1_CRXFE          (1 << 24)
-#define SYSFLG1_CTXFF          (1 << 25)
-#define SYSFLG1_SSIBUSY                (1 << 26)
-#define SYSFLG1_ID             (1 << 29)
-#define SYSFLG1_VERID(x)       (((x) >> 30) & 3)
-#define SYSFLG1_VERID_MASK     (3 << 30)
-
-#define SYSFLG2_SSRXOF         (1 << 0)
-#define SYSFLG2_RESVAL         (1 << 1)
-#define SYSFLG2_RESFRM         (1 << 2)
-#define SYSFLG2_SS2RXFE                (1 << 3)
-#define SYSFLG2_SS2TXFF                (1 << 4)
-#define SYSFLG2_SS2TXUF                (1 << 5)
-#define SYSFLG2_CKMODE         (1 << 6)
-#define SYSFLG2_UBUSY          SYSFLG_UBUSY
-#define SYSFLG2_URXFE          SYSFLG_URXFE
-#define SYSFLG2_UTXFF          SYSFLG_UTXFF
-
 #define LCDCON_GSEN            (1 << 30)
 #define LCDCON_GSMD            (1 << 31)
 
-#define SYSCON2_SERSEL         (1 << 0)
-#define SYSCON2_KBD6           (1 << 1)
-#define SYSCON2_DRAMZ          (1 << 2)
-#define SYSCON2_KBWEN          (1 << 3)
-#define SYSCON2_SS2TXEN                (1 << 4)
-#define SYSCON2_PCCARD1                (1 << 5)
-#define SYSCON2_PCCARD2                (1 << 6)
-#define SYSCON2_SS2RXEN                (1 << 7)
-#define SYSCON2_UART2EN                SYSCON_UARTEN
-#define SYSCON2_SS2MAEN                (1 << 9)
-#define SYSCON2_OSTB           (1 << 12)
-#define SYSCON2_CLKENSL                (1 << 13)
-#define SYSCON2_BUZFREQ                (1 << 14)
-
 /* common bits: UARTDR1 / UARTDR2 */
 #define UARTDR_FRMERR          (1 << 8)
 #define UARTDR_PARERR          (1 << 9)
 #define DAI64FS_MCLK256EN      (1 << 3)
 #define DAI64FS_LOOPBACK       (1 << 5)
 
-#define SYSCON3_ADCCON         (1 << 0)
-#define SYSCON3_CLKCTL0                (1 << 1)
-#define SYSCON3_CLKCTL1                (1 << 2)
-#define SYSCON3_DAISEL         (1 << 3)
-#define SYSCON3_ADCCKNSEN      (1 << 4)
-#define SYSCON3_VERSN(x)       (((x) >> 5) & 7)
-#define SYSCON3_VERSN_MASK     (7 << 5)
-#define SYSCON3_FASTWAKE       (1 << 8)
-#define SYSCON3_DAIEN          (1 << 9)
-#define SYSCON3_128FS          SYSCON3_DAIEN
-#define SYSCON3_ENPD67         (1 << 10)
-
 #define SDCONF_ACTIVE          (1 << 10)
 #define SDCONF_CLKCTL          (1 << 9)
 #define SDCONF_WIDTH_4         (0 << 7)
index 2f23dd5d73e4f0c9b2911e3239cbf0e4d22f5d70..c5a8ea6839ef4b870cacd1766f00207f8e8fba51 100644 (file)
 #define CLPS711X_SDRAM0_BASE   (0xc0000000)
 #define CLPS711X_SDRAM1_BASE   (0xd0000000)
 
-#if defined (CONFIG_ARCH_EDB7211)
-
-/* The extra 8 lines of the keyboard matrix are wired to chip select 3 */
-#define EP7211_PHYS_EXTKBD     CS3_PHYS_BASE
-
-#endif /* CONFIG_ARCH_EDB7211 */
-
 #endif
diff --git a/arch/arm/mach-clps711x/include/mach/memory.h b/arch/arm/mach-clps711x/include/mach/memory.h
deleted file mode 100644 (file)
index fc0e028..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- *  arch/arm/mach-clps711x/include/mach/memory.h
- *
- *  Copyright (C) 1999 ARM Limited
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This 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 __ASM_ARCH_MEMORY_H
-#define __ASM_ARCH_MEMORY_H
-
-/*
- * Physical DRAM offset.
- */
-#define PLAT_PHYS_OFFSET       UL(0xc0000000)
-
-/*
- * The PS7211 allows up to 256MB max per DRAM bank, but the EDB7211
- * uses only one of the two banks (bank #1).  However, even within
- * bank #1, memory is discontiguous.
- *
- * The EDB7211 has two 8MB DRAM areas with 8MB of empty space between
- * them, so we use 24 for the node max shift to get 16MB node sizes.
- */
-
-#define SECTION_SIZE_BITS      24
-#define MAX_PHYSMEM_BITS       32
-
-#endif
-
diff --git a/arch/arm/mach-clps711x/include/mach/syspld.h b/arch/arm/mach-clps711x/include/mach/syspld.h
deleted file mode 100644 (file)
index 9a43315..0000000
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- *  arch/arm/mach-clps711x/include/mach/syspld.h
- *
- *  System Control PLD register definitions.
- *
- *  Copyright (C) 2000 Deep Blue Solutions Ltd.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * 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 __ASM_ARCH_SYSPLD_H
-#define __ASM_ARCH_SYSPLD_H
-
-#define SYSPLD_PHYS_BASE       (0x10000000)
-#define SYSPLD_VIRT_BASE       IO_ADDRESS(SYSPLD_PHYS_BASE)
-
-#define SYSPLD_REG(type, off)  (*(volatile type *)(SYSPLD_VIRT_BASE + (off)))
-
-#define PLD_INT                SYSPLD_REG(u32, 0x000000)
-#define PLD_INT_PENIRQ         (1 << 5)
-#define PLD_INT_UCB_IRQ                (1 << 1)
-#define PLD_INT_KBD_ATN                (1 << 0)        /* EINT1 */
-
-#define PLD_PWR                SYSPLD_REG(u32, 0x000004)
-#define PLD_PWR_EXT            (1 << 5)
-#define PLD_PWR_MODE           (1 << 4)        /* 1 = PWM, 0 = PFM */
-#define PLD_S4_ON              (1 << 3)        /* LCD bias voltage enable */
-#define PLD_S3_ON              (1 << 2)        /* LCD backlight enable */
-#define PLD_S2_ON              (1 << 1)        /* LCD 3V3 supply enable */
-#define PLD_S1_ON              (1 << 0)        /* LCD 3V supply enable */
-
-#define PLD_KBD                SYSPLD_REG(u32, 0x000008)
-#define PLD_KBD_WAKE           (1 << 1)
-#define PLD_KBD_EN             (1 << 0)
-
-#define PLD_SPI                SYSPLD_REG(u32, 0x00000c)
-#define PLD_SPI_EN             (1 << 0)
-
-#define PLD_IO         SYSPLD_REG(u32, 0x000010)
-#define PLD_IO_BOOTSEL         (1 << 6)        /* boot sel switch */
-#define PLD_IO_USER            (1 << 5)        /* user defined switch */
-#define PLD_IO_LED3            (1 << 4)
-#define PLD_IO_LED2            (1 << 3)
-#define PLD_IO_LED1            (1 << 2)
-#define PLD_IO_LED0            (1 << 1)
-#define PLD_IO_LEDEN           (1 << 0)
-
-#define PLD_IRDA       SYSPLD_REG(u32, 0x000014)
-#define PLD_IRDA_EN            (1 << 0)
-
-#define PLD_COM2       SYSPLD_REG(u32, 0x000018)
-#define PLD_COM2_EN            (1 << 0)
-
-#define PLD_COM1       SYSPLD_REG(u32, 0x00001c)
-#define PLD_COM1_EN            (1 << 0)
-
-#define PLD_AUD                SYSPLD_REG(u32, 0x000020)
-#define PLD_AUD_DIV1           (1 << 6)
-#define PLD_AUD_DIV0           (1 << 5)
-#define PLD_AUD_CLK_SEL1       (1 << 4)
-#define PLD_AUD_CLK_SEL0       (1 << 3)
-#define PLD_AUD_MIC_PWR                (1 << 2)
-#define PLD_AUD_MIC_GAIN       (1 << 1)
-#define PLD_AUD_CODEC_EN       (1 << 0)
-
-#define PLD_CF         SYSPLD_REG(u32, 0x000024)
-#define PLD_CF2_SLEEP          (1 << 5)
-#define PLD_CF1_SLEEP          (1 << 4)
-#define PLD_CF2_nPDREQ         (1 << 3)
-#define PLD_CF1_nPDREQ         (1 << 2)
-#define PLD_CF2_nIRQ           (1 << 1)
-#define PLD_CF1_nIRQ           (1 << 0)
-
-#define PLD_SDC                SYSPLD_REG(u32, 0x000028)
-#define PLD_SDC_INT_EN         (1 << 2)
-#define PLD_SDC_WP             (1 << 1)
-#define PLD_SDC_CD             (1 << 0)
-
-#define PLD_FPGA       SYSPLD_REG(u32, 0x00002c)
-
-#define PLD_CODEC      SYSPLD_REG(u32, 0x400000)
-#define PLD_CODEC_IRQ3         (1 << 4)
-#define PLD_CODEC_IRQ2         (1 << 3)
-#define PLD_CODEC_IRQ1         (1 << 2)
-#define PLD_CODEC_EN           (1 << 0)
-
-#define PLD_BRITE      SYSPLD_REG(u32, 0x400004)
-#define PLD_BRITE_UP           (1 << 1)
-#define PLD_BRITE_DN           (1 << 0)
-
-#define PLD_LCDEN      SYSPLD_REG(u32, 0x400008)
-#define PLD_LCDEN_EN           (1 << 0)
-
-#define PLD_ID         SYSPLD_REG(u32, 0x40000c)
-
-#define PLD_TCH                SYSPLD_REG(u32, 0x400010)
-#define PLD_TCH_PENIRQ         (1 << 1)
-#define PLD_TCH_EN             (1 << 0)
-
-#define PLD_GPIO       SYSPLD_REG(u32, 0x400014)
-#define PLD_GPIO2              (1 << 2)
-#define PLD_GPIO1              (1 << 1)
-#define PLD_GPIO0              (1 << 0)
-
-#endif
index dd1ffccc75e988bef291fec7e6fe9f2fd019420f..63997a1128e68ce008e977c42b9d4e849101203a 100644 (file)
@@ -5,7 +5,7 @@
 
 # Common objects
 obj-y                  := time.o clock.o serial.o psc.o \
-                          dma.o usb.o common.o sram.o aemif.o
+                          usb.o common.o sram.o aemif.o
 
 obj-$(CONFIG_DAVINCI_MUX)              += mux.o
 
index ba798370fc96d1b8f338a20903bd5e0891280b80..78ea395d2aca81167a8df7584231fbcd1448e0a2 100644 (file)
 #include <linux/input.h>
 #include <linux/input/matrix_keypad.h>
 #include <linux/spi/spi.h>
+#include <linux/platform_data/edma.h>
 
 #include <asm/mach/arch.h>
 #include <asm/mach-types.h>
 
 #include <mach/irqs.h>
-#include <mach/edma.h>
 #include <mach/mux.h>
 #include <mach/cp_intc.h>
 #include <mach/tnetv107x.h>
index 1ab3df423dacc2998711e31b5aad6c8e78d94249..a883043d0820c7afe14db5f2b7f00f101606d662 100644 (file)
@@ -23,9 +23,9 @@
 #include <linux/platform_device.h>
 #include <linux/spi/spi.h>
 #include <linux/platform_data/davinci_asp.h>
+#include <linux/platform_data/edma.h>
 #include <linux/platform_data/keyscan-davinci.h>
 #include <mach/hardware.h>
-#include <mach/edma.h>
 
 #include <media/davinci/vpfe_capture.h>
 #include <media/davinci/vpif_types.h>
@@ -77,32 +77,32 @@ void davinci_map_sysmod(void);
 #define DM646X_ASYNC_EMIF_CS2_SPACE_BASE 0x42000000
 
 /* DM355 function declarations */
-void __init dm355_init(void);
+void dm355_init(void);
 void dm355_init_spi0(unsigned chipselect_mask,
                const struct spi_board_info *info, unsigned len);
-void __init dm355_init_asp1(u32 evt_enable, struct snd_platform_data *pdata);
+void dm355_init_asp1(u32 evt_enable, struct snd_platform_data *pdata);
 int dm355_init_video(struct vpfe_config *, struct vpbe_config *);
 
 /* DM365 function declarations */
-void __init dm365_init(void);
-void __init dm365_init_asp(struct snd_platform_data *pdata);
-void __init dm365_init_vc(struct snd_platform_data *pdata);
-void __init dm365_init_ks(struct davinci_ks_platform_data *pdata);
-void __init dm365_init_rtc(void);
+void dm365_init(void);
+void dm365_init_asp(struct snd_platform_data *pdata);
+void dm365_init_vc(struct snd_platform_data *pdata);
+void dm365_init_ks(struct davinci_ks_platform_data *pdata);
+void dm365_init_rtc(void);
 void dm365_init_spi0(unsigned chipselect_mask,
                        const struct spi_board_info *info, unsigned len);
 int dm365_init_video(struct vpfe_config *, struct vpbe_config *);
 
 /* DM644x function declarations */
-void __init dm644x_init(void);
-void __init dm644x_init_asp(struct snd_platform_data *pdata);
-int __init dm644x_init_video(struct vpfe_config *, struct vpbe_config *);
+void dm644x_init(void);
+void dm644x_init_asp(struct snd_platform_data *pdata);
+int dm644x_init_video(struct vpfe_config *, struct vpbe_config *);
 
 /* DM646x function declarations */
-void __init dm646x_init(void);
-void __init dm646x_init_mcasp0(struct snd_platform_data *pdata);
-void __init dm646x_init_mcasp1(struct snd_platform_data *pdata);
-int __init dm646x_init_edma(struct edma_rsv_info *rsv);
+void dm646x_init(void);
+void dm646x_init_mcasp0(struct snd_platform_data *pdata);
+void dm646x_init_mcasp1(struct snd_platform_data *pdata);
+int dm646x_init_edma(struct edma_rsv_info *rsv);
 void dm646x_video_init(void);
 void dm646x_setup_vpif(struct vpif_display_config *,
                       struct vpif_capture_config *);
index cfb194df18edb7f72deaf907858905781bac210f..612a0856e9c5b78437c854b6213420617cd00e7b 100644 (file)
 #include <linux/dma-mapping.h>
 #include <linux/clk.h>
 #include <linux/slab.h>
+#include <linux/platform_data/edma.h>
 
 #include <mach/common.h>
 #include <mach/irqs.h>
-#include <mach/edma.h>
 #include <mach/tnetv107x.h>
 
 #include "clock.h"
index a7068a3aa9d39e2e5bd519f93a6c06ee06e0b1a9..90b83d00fe2b399758a8fe7fece8f60fd8fd5092 100644 (file)
 #include <mach/irqs.h>
 #include <mach/cputype.h>
 #include <mach/mux.h>
-#include <mach/edma.h>
 #include <linux/platform_data/mmc-davinci.h>
 #include <mach/time.h>
+#include <linux/platform_data/edma.h>
+
 
 #include "davinci.h"
 #include "clock.h"
@@ -34,6 +35,9 @@
 #define DM365_MMCSD0_BASE           0x01D11000
 #define DM365_MMCSD1_BASE           0x01D00000
 
+#define DAVINCI_DMA_MMCRXEVT   26
+#define DAVINCI_DMA_MMCTXEVT   27
+
 void __iomem  *davinci_sysmod_base;
 
 void davinci_map_sysmod(void)
index a11034a358f19977131f96645fbaa558e51d4712..526cf7d06d0e4b8e7c3a203e39a1b73cb7f87943 100644 (file)
@@ -19,7 +19,6 @@
 #include <asm/mach/map.h>
 
 #include <mach/cputype.h>
-#include <mach/edma.h>
 #include <mach/psc.h>
 #include <mach/mux.h>
 #include <mach/irqs.h>
@@ -28,6 +27,7 @@
 #include <mach/common.h>
 #include <linux/platform_data/spi-davinci.h>
 #include <mach/gpio-davinci.h>
+#include <linux/platform_data/edma.h>
 
 #include "davinci.h"
 #include "clock.h"
index 40fa4fee93313b578f06d0c16b8a32c726ccee45..c4b741173c062c78807668a55f4d6442a466ce44 100644 (file)
 #include <linux/platform_device.h>
 #include <linux/dma-mapping.h>
 #include <linux/spi/spi.h>
+#include <linux/platform_data/edma.h>
 
 #include <asm/mach/map.h>
 
 #include <mach/cputype.h>
-#include <mach/edma.h>
 #include <mach/psc.h>
 #include <mach/mux.h>
 #include <mach/irqs.h>
index 4d37d3e2a193df25555c7408483d9c98e08d5da7..dd156d58fe64d44534862b460f394cf8717f7bbe 100644 (file)
 #include <linux/clk.h>
 #include <linux/serial_8250.h>
 #include <linux/platform_device.h>
+#include <linux/platform_data/edma.h>
 
 #include <asm/mach/map.h>
 
 #include <mach/cputype.h>
-#include <mach/edma.h>
 #include <mach/irqs.h>
 #include <mach/psc.h>
 #include <mach/mux.h>
index ac7b431c4c8eb93bd21feee28cc9fe8dd251d1ea..6d52a321a8cf133b1a0eccbd82cf84bf55cc6de8 100644 (file)
 #include <linux/clk.h>
 #include <linux/serial_8250.h>
 #include <linux/platform_device.h>
+#include <linux/platform_data/edma.h>
 
 #include <asm/mach/map.h>
 
 #include <mach/cputype.h>
-#include <mach/edma.h>
 #include <mach/irqs.h>
 #include <mach/psc.h>
 #include <mach/mux.h>
index d13d8dfa2b0d6c6d871c80a5ebdbb19f237476b7..827bbe9baed4416e419e703766755e68130e17b3 100644 (file)
@@ -51,7 +51,7 @@
 #define CP_INTC_HOST_PRIO_VECTOR(n)    (0x1600 + (n << 2))
 #define CP_INTC_VECTOR_ADDR(n)         (0x2000 + (n << 2))
 
-void __init cp_intc_init(void);
-int __init cp_intc_of_init(struct device_node *, struct device_node *);
+void cp_intc_init(void);
+int cp_intc_of_init(struct device_node *, struct device_node *);
 
 #endif /* __ASM_HARDWARE_CP_INTC_H */
index 2e1c9eae0a5846932bf237d9b35a9155397e3744..3c797e2272f8432b4191bd7fdc74d763c6002b72 100644 (file)
@@ -20,8 +20,8 @@
 #include <linux/videodev2.h>
 
 #include <mach/serial.h>
-#include <mach/edma.h>
 #include <mach/pm.h>
+#include <linux/platform_data/edma.h>
 #include <linux/platform_data/i2c-davinci.h>
 #include <linux/platform_data/mmc-davinci.h>
 #include <linux/platform_data/usb-davinci.h>
@@ -79,8 +79,8 @@ extern unsigned int da850_max_speed;
 #define DA8XX_SHARED_RAM_BASE  0x80000000
 #define DA8XX_ARM_RAM_BASE     0xffff0000
 
-void __init da830_init(void);
-void __init da850_init(void);
+void da830_init(void);
+void da850_init(void);
 
 int da830_register_edma(struct edma_rsv_info *rsv);
 int da850_register_edma(struct edma_rsv_info *rsv[2]);
@@ -94,17 +94,17 @@ int da8xx_register_uio_pruss(void);
 int da8xx_register_lcdc(struct da8xx_lcdc_platform_data *pdata);
 int da8xx_register_mmcsd0(struct davinci_mmc_config *config);
 int da850_register_mmcsd1(struct davinci_mmc_config *config);
-void __init da8xx_register_mcasp(int id, struct snd_platform_data *pdata);
+void da8xx_register_mcasp(int id, struct snd_platform_data *pdata);
 int da8xx_register_rtc(void);
 int da850_register_cpufreq(char *async_clk);
 int da8xx_register_cpuidle(void);
-void __iomem * __init da8xx_get_mem_ctlr(void);
+void __iomem *da8xx_get_mem_ctlr(void);
 int da850_register_pm(struct platform_device *pdev);
-int __init da850_register_sata(unsigned long refclkpn);
-int __init da850_register_vpif(void);
-int __init da850_register_vpif_display
+int da850_register_sata(unsigned long refclkpn);
+int da850_register_vpif(void);
+int da850_register_vpif_display
                        (struct vpif_display_config *display_config);
-int __init da850_register_vpif_capture
+int da850_register_vpif_capture
                        (struct vpif_capture_config *capture_config);
 void da8xx_restart(char mode, const char *cmd);
 void da8xx_rproc_reserve_cma(void);
index 1656a02e3edaf036026ce7c7d6e624982dd2d840..366e975effa80b1e9e1a2b0428814db718522863 100644 (file)
@@ -51,9 +51,9 @@ struct tnetv107x_device_info {
 extern struct platform_device tnetv107x_wdt_device;
 extern struct platform_device tnetv107x_serial_device;
 
-extern void __init tnetv107x_init(void);
-extern void __init tnetv107x_devices_init(struct tnetv107x_device_info *);
-extern void __init tnetv107x_irq_init(void);
+extern void tnetv107x_init(void);
+extern void tnetv107x_devices_init(struct tnetv107x_device_info *);
+extern void tnetv107x_irq_init(void);
 void tnetv107x_restart(char mode, const char *cmd);
 
 #endif
index 36469d813951dc65e76f2e94acb1960706d6d600..dff7b2fd4e203cb14a74bb93f4da12eb7133a033 100644 (file)
@@ -22,8 +22,7 @@ config MACH_CM_A510
 
 config MACH_DOVE_DT
        bool "Marvell Dove Flattened Device Tree"
-       select MVEBU_CLK_CORE
-       select MVEBU_CLK_GATING
+       select DOVE_CLK
        select REGULATOR
        select REGULATOR_FIXED_VOLTAGE
        select USE_OF
index 0b142803b2e17301d837659ca1f4eae085f36015..f3755ac81148761866df71104a0e356c2be72ed6 100644 (file)
@@ -10,7 +10,6 @@
 
 #include <linux/init.h>
 #include <linux/clk-provider.h>
-#include <linux/clk/mvebu.h>
 #include <linux/of.h>
 #include <linux/of_platform.h>
 #include <linux/platform_data/usb-ehci-orion.h>
@@ -49,7 +48,7 @@ static void __init dove_legacy_clk_init(void)
 
 static void __init dove_of_clk_init(void)
 {
-       mvebu_clocks_init();
+       of_clk_init(NULL);
        dove_legacy_clk_init();
 }
 
index e2b5da031f964c013478eb735a988bcb9ff12d0d..2a9443d04d924be4c5a30cd8f964eeacf51b0759 100644 (file)
@@ -9,7 +9,6 @@
  */
 
 #include <linux/clk-provider.h>
-#include <linux/clk/mvebu.h>
 #include <linux/dma-mapping.h>
 #include <linux/init.h>
 #include <linux/of.h>
index ba44328464f37c0cdce9eb9039fcfce8ad8dc743..f25cf888f3d4954bdc944e4df77bd70f715a5374 100644 (file)
@@ -56,9 +56,6 @@ config MXC_USE_EPIT
          uses the same clocks as the GPT. Anyway, on some systems the GPT
          may be in use for other purposes.
 
-config MXC_ULPI
-       bool
-
 config ARCH_HAS_RNGA
        bool
 
@@ -233,7 +230,7 @@ config MACH_EUKREA_CPUIMX25SD
        select IMX_HAVE_PLATFORM_MXC_EHCI
        select IMX_HAVE_PLATFORM_MXC_NAND
        select IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX
-       select MXC_ULPI if USB_ULPI
+       select USB_ULPI_VIEWPORT if USB_ULPI
        select SOC_IMX25
 
 choice
@@ -284,7 +281,7 @@ config MACH_PCM038
        select IMX_HAVE_PLATFORM_MXC_NAND
        select IMX_HAVE_PLATFORM_MXC_W1
        select IMX_HAVE_PLATFORM_SPI_IMX
-       select MXC_ULPI if USB_ULPI
+       select USB_ULPI_VIEWPORT if USB_ULPI
        select SOC_IMX27
        help
          Include support for phyCORE-i.MX27 (aka pcm038) platform. This
@@ -314,7 +311,7 @@ config MACH_CPUIMX27
        select IMX_HAVE_PLATFORM_MXC_EHCI
        select IMX_HAVE_PLATFORM_MXC_NAND
        select IMX_HAVE_PLATFORM_MXC_W1
-       select MXC_ULPI if USB_ULPI
+       select USB_ULPI_VIEWPORT if USB_ULPI
        select SOC_IMX27
        help
          Include support for Eukrea CPUIMX27 platform. This includes
@@ -369,7 +366,7 @@ config MACH_MX27_3DS
        select IMX_HAVE_PLATFORM_MXC_MMC
        select IMX_HAVE_PLATFORM_SPI_IMX
        select MXC_DEBUG_BOARD
-       select MXC_ULPI if USB_ULPI
+       select USB_ULPI_VIEWPORT if USB_ULPI
        select SOC_IMX27
        help
          Include support for MX27PDK platform. This includes specific
@@ -414,7 +411,7 @@ config MACH_PCA100
        select IMX_HAVE_PLATFORM_MXC_NAND
        select IMX_HAVE_PLATFORM_MXC_W1
        select IMX_HAVE_PLATFORM_SPI_IMX
-       select MXC_ULPI if USB_ULPI
+       select USB_ULPI_VIEWPORT if USB_ULPI
        select SOC_IMX27
        help
          Include support for phyCARD-s (aka pca100) platform. This
@@ -481,7 +478,7 @@ config MACH_MX31LILLY
        select IMX_HAVE_PLATFORM_MXC_EHCI
        select IMX_HAVE_PLATFORM_MXC_MMC
        select IMX_HAVE_PLATFORM_SPI_IMX
-       select MXC_ULPI if USB_ULPI
+       select USB_ULPI_VIEWPORT if USB_ULPI
        select SOC_IMX31
        help
          Include support for mx31 based LILLY1131 modules. This includes
@@ -497,7 +494,7 @@ config MACH_MX31LITE
        select IMX_HAVE_PLATFORM_MXC_RTC
        select IMX_HAVE_PLATFORM_SPI_IMX
        select LEDS_GPIO_REGISTER
-       select MXC_ULPI if USB_ULPI
+       select USB_ULPI_VIEWPORT if USB_ULPI
        select SOC_IMX31
        help
          Include support for MX31 LITEKIT platform. This includes specific
@@ -514,7 +511,7 @@ config MACH_PCM037
        select IMX_HAVE_PLATFORM_MXC_MMC
        select IMX_HAVE_PLATFORM_MXC_NAND
        select IMX_HAVE_PLATFORM_MXC_W1
-       select MXC_ULPI if USB_ULPI
+       select USB_ULPI_VIEWPORT if USB_ULPI
        select SOC_IMX31
        help
          Include support for Phytec pcm037 platform. This includes
@@ -544,7 +541,7 @@ config MACH_MX31_3DS
        select IMX_HAVE_PLATFORM_MXC_NAND
        select IMX_HAVE_PLATFORM_SPI_IMX
        select MXC_DEBUG_BOARD
-       select MXC_ULPI if USB_ULPI
+       select USB_ULPI_VIEWPORT if USB_ULPI
        select SOC_IMX31
        help
          Include support for MX31PDK (3DS) platform. This includes specific
@@ -571,7 +568,7 @@ config MACH_MX31MOBOARD
        select IMX_HAVE_PLATFORM_MXC_MMC
        select IMX_HAVE_PLATFORM_SPI_IMX
        select LEDS_GPIO_REGISTER
-       select MXC_ULPI if USB_ULPI
+       select USB_ULPI_VIEWPORT if USB_ULPI
        select SOC_IMX31
        help
          Include support for mx31moboard platform. This includes specific
@@ -595,7 +592,7 @@ config MACH_ARMADILLO5X0
        select IMX_HAVE_PLATFORM_MXC_EHCI
        select IMX_HAVE_PLATFORM_MXC_MMC
        select IMX_HAVE_PLATFORM_MXC_NAND
-       select MXC_ULPI if USB_ULPI
+       select USB_ULPI_VIEWPORT if USB_ULPI
        select SOC_IMX31
        help
          Include support for Atmark Armadillo-500 platform. This includes
@@ -639,7 +636,7 @@ config MACH_PCM043
        select IMX_HAVE_PLATFORM_MXC_EHCI
        select IMX_HAVE_PLATFORM_MXC_NAND
        select IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX
-       select MXC_ULPI if USB_ULPI
+       select USB_ULPI_VIEWPORT if USB_ULPI
        select SOC_IMX35
        help
          Include support for Phytec pcm043 platform. This includes
@@ -673,7 +670,7 @@ config MACH_EUKREA_CPUIMX35SD
        select IMX_HAVE_PLATFORM_MXC_EHCI
        select IMX_HAVE_PLATFORM_MXC_NAND
        select IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX
-       select MXC_ULPI if USB_ULPI
+       select USB_ULPI_VIEWPORT if USB_ULPI
        select SOC_IMX35
        help
          Include support for Eukrea CPUIMX35 platform. This includes
@@ -816,6 +813,40 @@ config SOC_IMX6Q
        help
          This enables support for Freescale i.MX6 Quad processor.
 
+config SOC_IMX6SL
+       bool "i.MX6 SoloLite support"
+       select ARM_ERRATA_754322
+       select ARM_ERRATA_775420
+       select ARM_GIC
+       select CPU_V7
+       select HAVE_IMX_ANATOP
+       select HAVE_IMX_GPC
+       select HAVE_IMX_MMDC
+       select HAVE_IMX_SRC
+       select PINCTRL
+       select PINCTRL_IMX6SL
+       select PL310_ERRATA_588369 if CACHE_PL310
+       select PL310_ERRATA_727915 if CACHE_PL310
+       select PL310_ERRATA_769419 if CACHE_PL310
+
+       help
+         This enables support for Freescale i.MX6 SoloLite processor.
+
+config SOC_VF610
+       bool "Vybrid Family VF610 support"
+       select CPU_V7
+       select ARM_GIC
+       select CLKSRC_OF
+       select PINCTRL
+       select PINCTRL_VF610
+       select VF_PIT_TIMER
+       select PL310_ERRATA_588369 if CACHE_PL310
+       select PL310_ERRATA_727915 if CACHE_PL310
+       select PL310_ERRATA_769419 if CACHE_PL310
+
+       help
+         This enable support for Freescale Vybrid VF610 processor.
+
 endif
 
 source "arch/arm/mach-imx/devices/Kconfig"
index 70ae7c490ac0428ce637e7921a26203ede04e1ac..e20f22d58fd8f00618dd57732e5e9a17a25d88c3 100644 (file)
@@ -23,7 +23,6 @@ obj-$(CONFIG_ARCH_MXC_IOMUX_V3) += iomux-v3.o
 obj-$(CONFIG_MXC_TZIC) += tzic.o
 obj-$(CONFIG_MXC_AVIC) += avic.o
 
-obj-$(CONFIG_MXC_ULPI) += ulpi.o
 obj-$(CONFIG_MXC_USE_EPIT) += epit.o
 obj-$(CONFIG_MXC_DEBUG_BOARD) += 3ds_debugboard.o
 
@@ -98,6 +97,7 @@ AFLAGS_headsmp.o :=-Wa,-march=armv7-a
 obj-$(CONFIG_SMP) += headsmp.o platsmp.o
 obj-$(CONFIG_HOTPLUG_CPU) += hotplug.o
 obj-$(CONFIG_SOC_IMX6Q) += clk-imx6q.o mach-imx6q.o
+obj-$(CONFIG_SOC_IMX6SL) += clk-imx6sl.o mach-imx6sl.o
 
 ifeq ($(CONFIG_PM),y)
 obj-$(CONFIG_SOC_IMX6Q) += pm-imx6q.o headsmp.o
@@ -111,4 +111,6 @@ obj-$(CONFIG_MACH_EUKREA_MBIMXSD51_BASEBOARD) += eukrea_mbimxsd51-baseboard.o
 obj-$(CONFIG_MACH_IMX51_DT) += imx51-dt.o
 obj-$(CONFIG_SOC_IMX53) += mach-imx53.o
 
+obj-$(CONFIG_SOC_VF610) += clk-vf610.o mach-vf610.o
+
 obj-y += devices/
index 6fc486b6a3c68f7a5bd6a5457680cd895f41dc76..04b1bad68350f3df315a758bca09c7dbd0c4c823 100644 (file)
@@ -73,6 +73,12 @@ static const char *mx53_cko2_sel[] = {
        "tve_sel", "lp_apm",
        "uart_root", "dummy"/* spdif0_clk_root */,
        "dummy", "dummy", };
+static const char *mx51_spdif_xtal_sel[] = { "osc", "ckih", "ckih2", };
+static const char *mx53_spdif_xtal_sel[] = { "osc", "ckih", "ckih2", "pll4_sw", };
+static const char *spdif_sel[] = { "pll1_sw", "pll2_sw", "pll3_sw", "spdif_xtal_sel", };
+static const char *spdif0_com_sel[] = { "spdif0_podf", "ssi1_root_gate", };
+static const char *mx51_spdif1_com_sel[] = { "spdif1_podf", "ssi2_root_gate", };
+
 
 enum imx5_clks {
        dummy, ckil, osc, ckih1, ckih2, ahb, ipg, axi_a, axi_b, uart_pred,
@@ -110,7 +116,9 @@ enum imx5_clks {
        owire_gate, gpu3d_s, gpu2d_s, gpu3d_gate, gpu2d_gate, garb_gate,
        cko1_sel, cko1_podf, cko1,
        cko2_sel, cko2_podf, cko2,
-       srtc_gate, pata_gate,
+       srtc_gate, pata_gate, sata_gate, spdif_xtal_sel, spdif0_sel,
+       spdif1_sel, spdif0_pred, spdif0_podf, spdif1_pred, spdif1_podf,
+       spdif0_com_s, spdif1_com_sel, spdif0_gate, spdif1_gate, spdif_ipg_gate,
        clk_max
 };
 
@@ -123,11 +131,13 @@ static void __init mx5_clocks_common_init(unsigned long rate_ckil,
 {
        int i;
 
+       of_clk_init(NULL);
+
        clk[dummy] = imx_clk_fixed("dummy", 0);
-       clk[ckil] = imx_clk_fixed("ckil", rate_ckil);
-       clk[osc] = imx_clk_fixed("osc", rate_osc);
-       clk[ckih1] = imx_clk_fixed("ckih1", rate_ckih1);
-       clk[ckih2] = imx_clk_fixed("ckih2", rate_ckih2);
+       clk[ckil] = imx_obtain_fixed_clock("ckil", rate_ckil);
+       clk[osc] = imx_obtain_fixed_clock("osc", rate_osc);
+       clk[ckih1] = imx_obtain_fixed_clock("ckih1", rate_ckih1);
+       clk[ckih2] = imx_obtain_fixed_clock("ckih2", rate_ckih2);
 
        clk[lp_apm] = imx_clk_mux("lp_apm", MXC_CCM_CCSR, 9, 1,
                                lp_apm_sel, ARRAY_SIZE(lp_apm_sel));
@@ -267,6 +277,13 @@ static void __init mx5_clocks_common_init(unsigned long rate_ckil,
        clk[owire_gate] = imx_clk_gate2("owire_gate", "per_root", MXC_CCM_CCGR2, 22);
        clk[srtc_gate] = imx_clk_gate2("srtc_gate", "per_root", MXC_CCM_CCGR4, 28);
        clk[pata_gate] = imx_clk_gate2("pata_gate", "ipg", MXC_CCM_CCGR4, 0);
+       clk[spdif0_sel] = imx_clk_mux("spdif0_sel", MXC_CCM_CSCMR2, 0, 2, spdif_sel, ARRAY_SIZE(spdif_sel));
+       clk[spdif0_pred] = imx_clk_divider("spdif0_pred", "spdif0_sel", MXC_CCM_CDCDR, 25, 3);
+       clk[spdif0_podf] = imx_clk_divider("spdif0_podf", "spdif0_pred", MXC_CCM_CDCDR, 19, 6);
+       clk[spdif0_com_s] = imx_clk_mux_flags("spdif0_com_sel", MXC_CCM_CSCMR2, 4, 1,
+                               spdif0_com_sel, ARRAY_SIZE(spdif0_com_sel), CLK_SET_RATE_PARENT);
+       clk[spdif0_gate] = imx_clk_gate2("spdif0_gate", "spdif0_com_sel", MXC_CCM_CCGR5, 26);
+       clk[spdif_ipg_gate] = imx_clk_gate2("spdif_ipg_gate", "ipg", MXC_CCM_CCGR5, 30);
 
        for (i = 0; i < ARRAY_SIZE(clk); i++)
                if (IS_ERR(clk[i]))
@@ -378,6 +395,15 @@ int __init mx51_clocks_init(unsigned long rate_ckil, unsigned long rate_osc,
        clk[mipi_hsc2_gate] = imx_clk_gate2("mipi_hsc2_gate", "ipg", MXC_CCM_CCGR4, 8);
        clk[mipi_esc_gate] = imx_clk_gate2("mipi_esc_gate", "ipg", MXC_CCM_CCGR4, 10);
        clk[mipi_hsp_gate] = imx_clk_gate2("mipi_hsp_gate", "ipg", MXC_CCM_CCGR4, 12);
+       clk[spdif_xtal_sel] = imx_clk_mux("spdif_xtal_sel", MXC_CCM_CSCMR1, 2, 2,
+                               mx51_spdif_xtal_sel, ARRAY_SIZE(mx51_spdif_xtal_sel));
+       clk[spdif1_sel] = imx_clk_mux("spdif1_sel", MXC_CCM_CSCMR2, 2, 2,
+                               spdif_sel, ARRAY_SIZE(spdif_sel));
+       clk[spdif1_pred] = imx_clk_divider("spdif1_podf", "spdif1_sel", MXC_CCM_CDCDR, 16, 3);
+       clk[spdif1_podf] = imx_clk_divider("spdif1_podf", "spdif1_pred", MXC_CCM_CDCDR, 9, 6);
+       clk[spdif1_com_sel] = imx_clk_mux("spdif1_com_sel", MXC_CCM_CSCMR2, 5, 1,
+                               mx51_spdif1_com_sel, ARRAY_SIZE(mx51_spdif1_com_sel));
+       clk[spdif1_gate] = imx_clk_gate2("spdif1_gate", "spdif1_com_sel", MXC_CCM_CCGR5, 28);
 
        for (i = 0; i < ARRAY_SIZE(clk); i++)
                if (IS_ERR(clk[i]))
@@ -485,6 +511,7 @@ int __init mx53_clocks_init(unsigned long rate_ckil, unsigned long rate_osc,
        clk[can2_serial_gate] = imx_clk_gate2("can2_serial_gate", "can_sel", MXC_CCM_CCGR4, 8);
        clk[can2_ipg_gate] = imx_clk_gate2("can2_ipg_gate", "ipg", MXC_CCM_CCGR4, 6);
        clk[i2c3_gate] = imx_clk_gate2("i2c3_gate", "per_root", MXC_CCM_CCGR1, 22);
+       clk[sata_gate] = imx_clk_gate2("sata_gate", "ipg", MXC_CCM_CCGR4, 2);
 
        clk[cko1_sel] = imx_clk_mux("cko1_sel", MXC_CCM_CCOSR, 0, 4,
                                mx53_cko1_sel, ARRAY_SIZE(mx53_cko1_sel));
@@ -495,6 +522,8 @@ int __init mx53_clocks_init(unsigned long rate_ckil, unsigned long rate_osc,
                                mx53_cko2_sel, ARRAY_SIZE(mx53_cko2_sel));
        clk[cko2_podf] = imx_clk_divider("cko2_podf", "cko2_sel", MXC_CCM_CCOSR, 21, 3);
        clk[cko2] = imx_clk_gate2("cko2", "cko2_podf", MXC_CCM_CCOSR, 24);
+       clk[spdif_xtal_sel] = imx_clk_mux("spdif_xtal_sel", MXC_CCM_CSCMR1, 2, 2,
+                               mx53_spdif_xtal_sel, ARRAY_SIZE(mx53_spdif_xtal_sel));
 
        for (i = 0; i < ARRAY_SIZE(clk); i++)
                if (IS_ERR(clk[i]))
@@ -542,42 +571,12 @@ int __init mx53_clocks_init(unsigned long rate_ckil, unsigned long rate_osc,
        return 0;
 }
 
-#ifdef CONFIG_OF
-static void __init clk_get_freq_dt(unsigned long *ckil, unsigned long *osc,
-                                  unsigned long *ckih1, unsigned long *ckih2)
-{
-       struct device_node *np;
-
-       /* retrieve the freqency of fixed clocks from device tree */
-       for_each_compatible_node(np, NULL, "fixed-clock") {
-               u32 rate;
-               if (of_property_read_u32(np, "clock-frequency", &rate))
-                       continue;
-
-               if (of_device_is_compatible(np, "fsl,imx-ckil"))
-                       *ckil = rate;
-               else if (of_device_is_compatible(np, "fsl,imx-osc"))
-                       *osc = rate;
-               else if (of_device_is_compatible(np, "fsl,imx-ckih1"))
-                       *ckih1 = rate;
-               else if (of_device_is_compatible(np, "fsl,imx-ckih2"))
-                       *ckih2 = rate;
-       }
-}
-
 int __init mx51_clocks_init_dt(void)
 {
-       unsigned long ckil, osc, ckih1, ckih2;
-
-       clk_get_freq_dt(&ckil, &osc, &ckih1, &ckih2);
-       return mx51_clocks_init(ckil, osc, ckih1, ckih2);
+       return mx51_clocks_init(0, 0, 0, 0);
 }
 
 int __init mx53_clocks_init_dt(void)
 {
-       unsigned long ckil, osc, ckih1, ckih2;
-
-       clk_get_freq_dt(&ckil, &osc, &ckih1, &ckih2);
-       return mx53_clocks_init(ckil, osc, ckih1, ckih2);
+       return mx53_clocks_init(0, 0, 0, 0);
 }
-#endif
index 4e3148ce852dfe20faa2a820c19b083746ff8257..4282e99f5ca1803254a44449aee835c653429c6b 100644 (file)
@@ -238,7 +238,7 @@ enum mx6q_clks {
        pll4_audio, pll5_video, pll8_mlb, pll7_usb_host, pll6_enet, ssi1_ipg,
        ssi2_ipg, ssi3_ipg, rom, usbphy1, usbphy2, ldb_di0_div_3_5, ldb_di1_div_3_5,
        sata_ref, sata_ref_100m, pcie_ref, pcie_ref_125m, enet_ref, usbphy1_gate,
-       usbphy2_gate, pll4_post_div, pll5_post_div, pll5_video_div, clk_max
+       usbphy2_gate, pll4_post_div, pll5_post_div, pll5_video_div, eim_slow, clk_max
 };
 
 static struct clk *clk[clk_max];
@@ -270,27 +270,16 @@ static struct clk_div_table video_div_table[] = {
        { }
 };
 
-int __init mx6q_clocks_init(void)
+static void __init imx6q_clocks_init(struct device_node *ccm_node)
 {
        struct device_node *np;
        void __iomem *base;
        int i, irq;
 
        clk[dummy] = imx_clk_fixed("dummy", 0);
-
-       /* retrieve the freqency of fixed clocks from device tree */
-       for_each_compatible_node(np, NULL, "fixed-clock") {
-               u32 rate;
-               if (of_property_read_u32(np, "clock-frequency", &rate))
-                       continue;
-
-               if (of_device_is_compatible(np, "fsl,imx-ckil"))
-                       clk[ckil] = imx_clk_fixed("ckil", rate);
-               else if (of_device_is_compatible(np, "fsl,imx-ckih1"))
-                       clk[ckih] = imx_clk_fixed("ckih", rate);
-               else if (of_device_is_compatible(np, "fsl,imx-osc"))
-                       clk[osc] = imx_clk_fixed("osc", rate);
-       }
+       clk[ckil] = imx_obtain_fixed_clock("ckil", 0);
+       clk[ckih] = imx_obtain_fixed_clock("ckih1", 0);
+       clk[osc] = imx_obtain_fixed_clock("osc", 0);
 
        np = of_find_compatible_node(NULL, NULL, "fsl,imx6q-anatop");
        base = of_iomap(np, 0);
@@ -312,7 +301,6 @@ int __init mx6q_clocks_init(void)
        clk[pll5_video]    = imx_clk_pllv3(IMX_PLLV3_AV,        "pll5_video",   "osc", base + 0xa0, 0x7f);
        clk[pll6_enet]     = imx_clk_pllv3(IMX_PLLV3_ENET,      "pll6_enet",    "osc", base + 0xe0, 0x3);
        clk[pll7_usb_host] = imx_clk_pllv3(IMX_PLLV3_USB,       "pll7_usb_host","osc", base + 0x20, 0x3);
-       clk[pll8_mlb]      = imx_clk_pllv3(IMX_PLLV3_MLB,       "pll8_mlb",     "osc", base + 0xd0, 0x0);
 
        /*
         * Bit 20 is the reserved and read-only bit, we do this only for:
@@ -360,7 +348,7 @@ int __init mx6q_clocks_init(void)
        clk[pll5_post_div] = clk_register_divider_table(NULL, "pll5_post_div", "pll5_video", CLK_SET_RATE_PARENT, base + 0xa0, 19, 2, 0, post_div_table, &imx_ccm_lock);
        clk[pll5_video_div] = clk_register_divider_table(NULL, "pll5_video_div", "pll5_post_div", CLK_SET_RATE_PARENT, base + 0x170, 30, 2, 0, video_div_table, &imx_ccm_lock);
 
-       np = of_find_compatible_node(NULL, NULL, "fsl,imx6q-ccm");
+       np = ccm_node;
        base = of_iomap(np, 0);
        WARN_ON(!base);
        ccm_base = base;
@@ -481,7 +469,14 @@ int __init mx6q_clocks_init(void)
        clk[esai]         = imx_clk_gate2("esai",          "esai_podf",         base + 0x6c, 16);
        clk[gpt_ipg]      = imx_clk_gate2("gpt_ipg",       "ipg",               base + 0x6c, 20);
        clk[gpt_ipg_per]  = imx_clk_gate2("gpt_ipg_per",   "ipg_per",           base + 0x6c, 22);
-       clk[gpu2d_core]   = imx_clk_gate2("gpu2d_core",    "gpu2d_core_podf",   base + 0x6c, 24);
+       if (cpu_is_imx6dl())
+               /*
+                * The multiplexer and divider of imx6q clock gpu3d_shader get
+                * redefined/reused as gpu2d_core_sel and gpu2d_core_podf on imx6dl.
+                */
+               clk[gpu2d_core] = imx_clk_gate2("gpu2d_core", "gpu3d_shader", base + 0x6c, 24);
+       else
+               clk[gpu2d_core] = imx_clk_gate2("gpu2d_core", "gpu2d_core_podf", base + 0x6c, 24);
        clk[gpu3d_core]   = imx_clk_gate2("gpu3d_core",    "gpu3d_core_podf",   base + 0x6c, 26);
        clk[hdmi_iahb]    = imx_clk_gate2("hdmi_iahb",     "ahb",               base + 0x70, 0);
        clk[hdmi_isfr]    = imx_clk_gate2("hdmi_isfr",     "pll3_pfd1_540m",    base + 0x70, 4);
@@ -499,7 +494,14 @@ int __init mx6q_clocks_init(void)
        clk[ldb_di1]      = imx_clk_gate2("ldb_di1",       "ldb_di1_podf",      base + 0x74, 14);
        clk[ipu2_di1]     = imx_clk_gate2("ipu2_di1",      "ipu2_di1_sel",      base + 0x74, 10);
        clk[hsi_tx]       = imx_clk_gate2("hsi_tx",        "hsi_tx_podf",       base + 0x74, 16);
-       clk[mlb]          = imx_clk_gate2("mlb",           "axi",               base + 0x74, 18);
+       if (cpu_is_imx6dl())
+               /*
+                * The multiplexer and divider of the imx6q clock gpu2d get
+                * redefined/reused as mlb_sys_sel and mlb_sys_clk_podf on imx6dl.
+                */
+               clk[mlb] = imx_clk_gate2("mlb",            "gpu2d_core_podf",   base + 0x74, 18);
+       else
+               clk[mlb] = imx_clk_gate2("mlb",            "axi",               base + 0x74, 18);
        clk[mmdc_ch0_axi] = imx_clk_gate2("mmdc_ch0_axi",  "mmdc_ch0_axi_podf", base + 0x74, 20);
        clk[mmdc_ch1_axi] = imx_clk_gate2("mmdc_ch1_axi",  "mmdc_ch1_axi_podf", base + 0x74, 22);
        clk[ocram]        = imx_clk_gate2("ocram",         "ahb",               base + 0x74, 28);
@@ -528,6 +530,7 @@ int __init mx6q_clocks_init(void)
        clk[usdhc2]       = imx_clk_gate2("usdhc2",        "usdhc2_podf",       base + 0x80, 4);
        clk[usdhc3]       = imx_clk_gate2("usdhc3",        "usdhc3_podf",       base + 0x80, 6);
        clk[usdhc4]       = imx_clk_gate2("usdhc4",        "usdhc4_podf",       base + 0x80, 8);
+       clk[eim_slow]     = imx_clk_gate2("eim_slow",      "emi_slow_podf",     base + 0x80, 10);
        clk[vdo_axi]      = imx_clk_gate2("vdo_axi",       "vdo_axi_sel",       base + 0x80, 12);
        clk[vpu_axi]      = imx_clk_gate2("vpu_axi",       "vpu_axi_podf",      base + 0x80, 14);
        clk[cko1]         = imx_clk_gate("cko1",           "cko1_podf",         base + 0x60, 7);
@@ -547,6 +550,8 @@ int __init mx6q_clocks_init(void)
        clk_register_clkdev(clk[ahb], "ahb", NULL);
        clk_register_clkdev(clk[cko1], "cko1", NULL);
        clk_register_clkdev(clk[arm], NULL, "cpu0");
+       clk_register_clkdev(clk[pll4_post_div], "pll4_post_div", NULL);
+       clk_register_clkdev(clk[pll4_audio], "pll4_audio", NULL);
 
        if (imx6q_revision() != IMX_CHIP_REVISION_1_0) {
                clk_set_parent(clk[ldb_di0_sel], clk[pll5_video_div]);
@@ -576,6 +581,5 @@ int __init mx6q_clocks_init(void)
        WARN_ON(!base);
        irq = irq_of_parse_and_map(np, 0);
        mxc_timer_init(base, irq);
-
-       return 0;
 }
+CLK_OF_DECLARE(imx6q, "fsl,imx6q-ccm", imx6q_clocks_init);
diff --git a/arch/arm/mach-imx/clk-imx6sl.c b/arch/arm/mach-imx/clk-imx6sl.c
new file mode 100644 (file)
index 0000000..a307ac2
--- /dev/null
@@ -0,0 +1,267 @@
+/*
+ * Copyright 2013 Freescale Semiconductor, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ */
+
+#include <linux/clk.h>
+#include <linux/clkdev.h>
+#include <linux/err.h>
+#include <linux/of.h>
+#include <linux/of_address.h>
+#include <linux/of_irq.h>
+#include <dt-bindings/clock/imx6sl-clock.h>
+
+#include "clk.h"
+#include "common.h"
+
+static const char const *step_sels[]           = { "osc", "pll2_pfd2", };
+static const char const *pll1_sw_sels[]                = { "pll1_sys", "step", };
+static const char const *ocram_alt_sels[]      = { "pll2_pfd2", "pll3_pfd1", };
+static const char const *ocram_sels[]          = { "periph", "ocram_alt_sels", };
+static const char const *pre_periph_sels[]     = { "pll2_bus", "pll2_pfd2", "pll2_pfd0", "pll2_198m", };
+static const char const *periph_clk2_sels[]    = { "pll3_usb_otg", "osc", "osc", "dummy", };
+static const char const *periph2_clk2_sels[]   = { "pll3_usb_otg", "pll2_bus", };
+static const char const *periph_sels[]         = { "pre_periph_sel", "periph_clk2_podf", };
+static const char const *periph2_sels[]                = { "pre_periph2_sel", "periph2_clk2_podf", };
+static const char const *csi_lcdif_sels[]      = { "mmdc", "pll2_pfd2", "pll3_120m", "pll3_pfd1", };
+static const char const *usdhc_sels[]          = { "pll2_pfd2", "pll2_pfd0", };
+static const char const *ssi_sels[]            = { "pll3_pfd2", "pll3_pfd3", "pll4_post_div", "dummy", };
+static const char const *perclk_sels[]         = { "ipg", "osc", };
+static const char const *epdc_pxp_sels[]       = { "mmdc", "pll3_usb_otg", "pll5_video_div", "pll2_pfd0", "pll2_pfd2", "pll3_pfd1", };
+static const char const *gpu2d_ovg_sels[]      = { "pll3_pfd1", "pll3_usb_otg", "pll2_bus", "pll2_pfd2", };
+static const char const *gpu2d_sels[]          = { "pll2_pfd2", "pll3_usb_otg", "pll3_pfd1", "pll2_bus", };
+static const char const *lcdif_pix_sels[]      = { "pll2_bus", "pll3_usb_otg", "pll5_video_div", "pll2_pfd0", "pll3_pfd0", "pll3_pfd1", };
+static const char const *epdc_pix_sels[]       = { "pll2_bus", "pll3_usb_otg", "pll5_video_div", "pll2_pfd0", "pll2_pfd1", "pll3_pfd1", };
+static const char const *audio_sels[]          = { "pll4_post_div", "pll3_pfd2", "pll3_pfd3", "pll3_usb_otg", };
+static const char const *ecspi_sels[]          = { "pll3_60m", "osc", };
+static const char const *uart_sels[]           = { "pll3_80m", "osc", };
+
+static struct clk_div_table clk_enet_ref_table[] = {
+       { .val = 0, .div = 20, },
+       { .val = 1, .div = 10, },
+       { .val = 2, .div = 5, },
+       { .val = 3, .div = 4, },
+       { }
+};
+
+static struct clk_div_table post_div_table[] = {
+       { .val = 2, .div = 1, },
+       { .val = 1, .div = 2, },
+       { .val = 0, .div = 4, },
+       { }
+};
+
+static struct clk_div_table video_div_table[] = {
+       { .val = 0, .div = 1, },
+       { .val = 1, .div = 2, },
+       { .val = 2, .div = 1, },
+       { .val = 3, .div = 4, },
+       { }
+};
+
+static struct clk *clks[IMX6SL_CLK_CLK_END];
+static struct clk_onecell_data clk_data;
+
+static void __init imx6sl_clocks_init(struct device_node *ccm_node)
+{
+       struct device_node *np;
+       void __iomem *base;
+       int irq;
+       int i;
+
+       clks[IMX6SL_CLK_DUMMY] = imx_clk_fixed("dummy", 0);
+       clks[IMX6SL_CLK_CKIL] = imx_obtain_fixed_clock("ckil", 0);
+       clks[IMX6SL_CLK_OSC] = imx_obtain_fixed_clock("osc", 0);
+
+       np = of_find_compatible_node(NULL, NULL, "fsl,imx6sl-anatop");
+       base = of_iomap(np, 0);
+       WARN_ON(!base);
+
+       /*                                             type               name            parent  base         div_mask */
+       clks[IMX6SL_CLK_PLL1_SYS]      = imx_clk_pllv3(IMX_PLLV3_SYS,     "pll1_sys",      "osc", base,        0x7f);
+       clks[IMX6SL_CLK_PLL2_BUS]      = imx_clk_pllv3(IMX_PLLV3_GENERIC, "pll2_bus",      "osc", base + 0x30, 0x1);
+       clks[IMX6SL_CLK_PLL3_USB_OTG]  = imx_clk_pllv3(IMX_PLLV3_USB,     "pll3_usb_otg",  "osc", base + 0x10, 0x3);
+       clks[IMX6SL_CLK_PLL4_AUDIO]    = imx_clk_pllv3(IMX_PLLV3_AV,      "pll4_audio",    "osc", base + 0x70, 0x7f);
+       clks[IMX6SL_CLK_PLL5_VIDEO]    = imx_clk_pllv3(IMX_PLLV3_AV,      "pll5_video",    "osc", base + 0xa0, 0x7f);
+       clks[IMX6SL_CLK_PLL6_ENET]     = imx_clk_pllv3(IMX_PLLV3_ENET,    "pll6_enet",     "osc", base + 0xe0, 0x3);
+       clks[IMX6SL_CLK_PLL7_USB_HOST] = imx_clk_pllv3(IMX_PLLV3_USB,     "pll7_usb_host", "osc", base + 0x20, 0x3);
+
+       /*
+        * usbphy1 and usbphy2 are implemented as dummy gates using reserve
+        * bit 20.  They are used by phy driver to keep the refcount of
+        * parent PLL correct. usbphy1_gate and usbphy2_gate only needs to be
+        * turned on during boot, and software will not need to control it
+        * anymore after that.
+        */
+       clks[IMX6SL_CLK_USBPHY1]      = imx_clk_gate("usbphy1",      "pll3_usb_otg",  base + 0x10, 20);
+       clks[IMX6SL_CLK_USBPHY2]      = imx_clk_gate("usbphy2",      "pll7_usb_host", base + 0x20, 20);
+       clks[IMX6SL_CLK_USBPHY1_GATE] = imx_clk_gate("usbphy1_gate", "dummy",         base + 0x10, 6);
+       clks[IMX6SL_CLK_USBPHY2_GATE] = imx_clk_gate("usbphy2_gate", "dummy",         base + 0x20, 6);
+
+       /*                                                           dev   name              parent_name      flags                reg        shift width div: flags, div_table lock */
+       clks[IMX6SL_CLK_PLL4_POST_DIV]  = clk_register_divider_table(NULL, "pll4_post_div",  "pll4_audio",    CLK_SET_RATE_PARENT, base + 0x70,  19, 2,   0, post_div_table, &imx_ccm_lock);
+       clks[IMX6SL_CLK_PLL5_POST_DIV]  = clk_register_divider_table(NULL, "pll5_post_div",  "pll5_video",    CLK_SET_RATE_PARENT, base + 0xa0,  19, 2,   0, post_div_table, &imx_ccm_lock);
+       clks[IMX6SL_CLK_PLL5_VIDEO_DIV] = clk_register_divider_table(NULL, "pll5_video_div", "pll5_post_div", CLK_SET_RATE_PARENT, base + 0x170, 30, 2,   0, video_div_table, &imx_ccm_lock);
+       clks[IMX6SL_CLK_ENET_REF]       = clk_register_divider_table(NULL, "enet_ref",       "pll6_enet",     0,                   base + 0xe0,  0,  2,   0, clk_enet_ref_table, &imx_ccm_lock);
+
+       /*                                       name         parent_name     reg           idx */
+       clks[IMX6SL_CLK_PLL2_PFD0] = imx_clk_pfd("pll2_pfd0", "pll2_bus",     base + 0x100, 0);
+       clks[IMX6SL_CLK_PLL2_PFD1] = imx_clk_pfd("pll2_pfd1", "pll2_bus",     base + 0x100, 1);
+       clks[IMX6SL_CLK_PLL2_PFD2] = imx_clk_pfd("pll2_pfd2", "pll2_bus",     base + 0x100, 2);
+       clks[IMX6SL_CLK_PLL3_PFD0] = imx_clk_pfd("pll3_pfd0", "pll3_usb_otg", base + 0xf0,  0);
+       clks[IMX6SL_CLK_PLL3_PFD1] = imx_clk_pfd("pll3_pfd1", "pll3_usb_otg", base + 0xf0,  1);
+       clks[IMX6SL_CLK_PLL3_PFD2] = imx_clk_pfd("pll3_pfd2", "pll3_usb_otg", base + 0xf0,  2);
+       clks[IMX6SL_CLK_PLL3_PFD3] = imx_clk_pfd("pll3_pfd3", "pll3_usb_otg", base + 0xf0,  3);
+
+       /*                                                name         parent_name     mult div */
+       clks[IMX6SL_CLK_PLL2_198M] = imx_clk_fixed_factor("pll2_198m", "pll2_pfd2",      1, 2);
+       clks[IMX6SL_CLK_PLL3_120M] = imx_clk_fixed_factor("pll3_120m", "pll3_usb_otg",   1, 4);
+       clks[IMX6SL_CLK_PLL3_80M]  = imx_clk_fixed_factor("pll3_80m",  "pll3_usb_otg",   1, 6);
+       clks[IMX6SL_CLK_PLL3_60M]  = imx_clk_fixed_factor("pll3_60m",  "pll3_usb_otg",   1, 8);
+
+       np = ccm_node;
+       base = of_iomap(np, 0);
+       WARN_ON(!base);
+
+       /*                                              name                reg       shift width parent_names     num_parents */
+       clks[IMX6SL_CLK_STEP]             = imx_clk_mux("step",             base + 0xc,  8,  1, step_sels,         ARRAY_SIZE(step_sels));
+       clks[IMX6SL_CLK_PLL1_SW]          = imx_clk_mux("pll1_sw",          base + 0xc,  2,  1, pll1_sw_sels,      ARRAY_SIZE(pll1_sw_sels));
+       clks[IMX6SL_CLK_OCRAM_ALT_SEL]    = imx_clk_mux("ocram_alt_sel",    base + 0x14, 7,  1, ocram_alt_sels,    ARRAY_SIZE(ocram_alt_sels));
+       clks[IMX6SL_CLK_OCRAM_SEL]        = imx_clk_mux("ocram_sel",        base + 0x14, 6,  1, ocram_sels,        ARRAY_SIZE(ocram_sels));
+       clks[IMX6SL_CLK_PRE_PERIPH2_SEL]  = imx_clk_mux("pre_periph2_sel",  base + 0x18, 21, 2, pre_periph_sels,   ARRAY_SIZE(pre_periph_sels));
+       clks[IMX6SL_CLK_PRE_PERIPH_SEL]   = imx_clk_mux("pre_periph_sel",   base + 0x18, 18, 2, pre_periph_sels,   ARRAY_SIZE(pre_periph_sels));
+       clks[IMX6SL_CLK_PERIPH2_CLK2_SEL] = imx_clk_mux("periph2_clk2_sel", base + 0x18, 20, 1, periph2_clk2_sels, ARRAY_SIZE(periph2_clk2_sels));
+       clks[IMX6SL_CLK_PERIPH_CLK2_SEL]  = imx_clk_mux("periph_clk2_sel",  base + 0x18, 12, 2, periph_clk2_sels,  ARRAY_SIZE(periph_clk2_sels));
+       clks[IMX6SL_CLK_CSI_SEL]          = imx_clk_mux("csi_sel",          base + 0x3c, 9,  2, csi_lcdif_sels,    ARRAY_SIZE(csi_lcdif_sels));
+       clks[IMX6SL_CLK_LCDIF_AXI_SEL]    = imx_clk_mux("lcdif_axi_sel",    base + 0x3c, 14, 2, csi_lcdif_sels,    ARRAY_SIZE(csi_lcdif_sels));
+       clks[IMX6SL_CLK_USDHC1_SEL]       = imx_clk_mux("usdhc1_sel",       base + 0x1c, 16, 1, usdhc_sels,        ARRAY_SIZE(usdhc_sels));
+       clks[IMX6SL_CLK_USDHC2_SEL]       = imx_clk_mux("usdhc2_sel",       base + 0x1c, 17, 1, usdhc_sels,        ARRAY_SIZE(usdhc_sels));
+       clks[IMX6SL_CLK_USDHC3_SEL]       = imx_clk_mux("usdhc3_sel",       base + 0x1c, 18, 1, usdhc_sels,        ARRAY_SIZE(usdhc_sels));
+       clks[IMX6SL_CLK_USDHC4_SEL]       = imx_clk_mux("usdhc4_sel",       base + 0x1c, 19, 1, usdhc_sels,        ARRAY_SIZE(usdhc_sels));
+       clks[IMX6SL_CLK_SSI1_SEL]         = imx_clk_mux("ssi1_sel",         base + 0x1c, 10, 2, ssi_sels,          ARRAY_SIZE(ssi_sels));
+       clks[IMX6SL_CLK_SSI2_SEL]         = imx_clk_mux("ssi2_sel",         base + 0x1c, 12, 2, ssi_sels,          ARRAY_SIZE(ssi_sels));
+       clks[IMX6SL_CLK_SSI3_SEL]         = imx_clk_mux("ssi3_sel",         base + 0x1c, 14, 2, ssi_sels,          ARRAY_SIZE(ssi_sels));
+       clks[IMX6SL_CLK_PERCLK_SEL]       = imx_clk_mux("perclk_sel",       base + 0x1c, 6,  1, perclk_sels,       ARRAY_SIZE(perclk_sels));
+       clks[IMX6SL_CLK_PXP_AXI_SEL]      = imx_clk_mux("pxp_axi_sel",      base + 0x34, 6,  3, epdc_pxp_sels,     ARRAY_SIZE(epdc_pxp_sels));
+       clks[IMX6SL_CLK_EPDC_AXI_SEL]     = imx_clk_mux("epdc_axi_sel",     base + 0x34, 15, 3, epdc_pxp_sels,     ARRAY_SIZE(epdc_pxp_sels));
+       clks[IMX6SL_CLK_GPU2D_OVG_SEL]    = imx_clk_mux("gpu2d_ovg_sel",    base + 0x18, 4,  2, gpu2d_ovg_sels,    ARRAY_SIZE(gpu2d_ovg_sels));
+       clks[IMX6SL_CLK_GPU2D_SEL]        = imx_clk_mux("gpu2d_sel",        base + 0x18, 8,  2, gpu2d_sels,        ARRAY_SIZE(gpu2d_sels));
+       clks[IMX6SL_CLK_LCDIF_PIX_SEL]    = imx_clk_mux("lcdif_pix_sel",    base + 0x38, 6,  3, lcdif_pix_sels,    ARRAY_SIZE(lcdif_pix_sels));
+       clks[IMX6SL_CLK_EPDC_PIX_SEL]     = imx_clk_mux("epdc_pix_sel",     base + 0x38, 15, 3, epdc_pix_sels,     ARRAY_SIZE(epdc_pix_sels));
+       clks[IMX6SL_CLK_SPDIF0_SEL]       = imx_clk_mux("spdif0_sel",       base + 0x30, 20, 2, audio_sels,        ARRAY_SIZE(audio_sels));
+       clks[IMX6SL_CLK_SPDIF1_SEL]       = imx_clk_mux("spdif1_sel",       base + 0x30, 7,  2, audio_sels,        ARRAY_SIZE(audio_sels));
+       clks[IMX6SL_CLK_EXTERN_AUDIO_SEL] = imx_clk_mux("extern_audio_sel", base + 0x20, 19, 2, audio_sels,        ARRAY_SIZE(audio_sels));
+       clks[IMX6SL_CLK_ECSPI_SEL]        = imx_clk_mux("ecspi_sel",        base + 0x38, 18, 1, ecspi_sels,        ARRAY_SIZE(ecspi_sels));
+       clks[IMX6SL_CLK_UART_SEL]         = imx_clk_mux("uart_sel",         base + 0x24, 6,  1, uart_sels,         ARRAY_SIZE(uart_sels));
+
+       /*                                          name       reg        shift width busy: reg, shift parent_names  num_parents */
+       clks[IMX6SL_CLK_PERIPH]  = imx_clk_busy_mux("periph",  base + 0x14, 25,  1,   base + 0x48, 5,  periph_sels,  ARRAY_SIZE(periph_sels));
+       clks[IMX6SL_CLK_PERIPH2] = imx_clk_busy_mux("periph2", base + 0x14, 26,  1,   base + 0x48, 3,  periph2_sels, ARRAY_SIZE(periph2_sels));
+
+       /*                                                   name                 parent_name          reg       shift width */
+       clks[IMX6SL_CLK_OCRAM_PODF]        = imx_clk_divider("ocram_podf",        "ocram_sel",         base + 0x14, 16, 3);
+       clks[IMX6SL_CLK_PERIPH_CLK2_PODF]  = imx_clk_divider("periph_clk2_podf",  "periph_clk2_sel",   base + 0x14, 27, 3);
+       clks[IMX6SL_CLK_PERIPH2_CLK2_PODF] = imx_clk_divider("periph2_clk2_podf", "periph2_clk2_sel",  base + 0x14, 0,  3);
+       clks[IMX6SL_CLK_IPG]               = imx_clk_divider("ipg",               "ahb",               base + 0x14, 8,  2);
+       clks[IMX6SL_CLK_CSI_PODF]          = imx_clk_divider("csi_podf",          "csi_sel",           base + 0x3c, 11, 3);
+       clks[IMX6SL_CLK_LCDIF_AXI_PODF]    = imx_clk_divider("lcdif_axi_podf",    "lcdif_axi_sel",     base + 0x3c, 16, 3);
+       clks[IMX6SL_CLK_USDHC1_PODF]       = imx_clk_divider("usdhc1_podf",       "usdhc1_sel",        base + 0x24, 11, 3);
+       clks[IMX6SL_CLK_USDHC2_PODF]       = imx_clk_divider("usdhc2_podf",       "usdhc2_sel",        base + 0x24, 16, 3);
+       clks[IMX6SL_CLK_USDHC3_PODF]       = imx_clk_divider("usdhc3_podf",       "usdhc3_sel",        base + 0x24, 19, 3);
+       clks[IMX6SL_CLK_USDHC4_PODF]       = imx_clk_divider("usdhc4_podf",       "usdhc4_sel",        base + 0x24, 22, 3);
+       clks[IMX6SL_CLK_SSI1_PRED]         = imx_clk_divider("ssi1_pred",         "ssi1_sel",          base + 0x28, 6,  3);
+       clks[IMX6SL_CLK_SSI1_PODF]         = imx_clk_divider("ssi1_podf",         "ssi1_pred",         base + 0x28, 0,  6);
+       clks[IMX6SL_CLK_SSI2_PRED]         = imx_clk_divider("ssi2_pred",         "ssi2_sel",          base + 0x2c, 6,  3);
+       clks[IMX6SL_CLK_SSI2_PODF]         = imx_clk_divider("ssi2_podf",         "ssi2_pred",         base + 0x2c, 0,  6);
+       clks[IMX6SL_CLK_SSI3_PRED]         = imx_clk_divider("ssi3_pred",         "ssi3_sel",          base + 0x28, 22, 3);
+       clks[IMX6SL_CLK_SSI3_PODF]         = imx_clk_divider("ssi3_podf",         "ssi3_pred",         base + 0x28, 16, 6);
+       clks[IMX6SL_CLK_PERCLK]            = imx_clk_divider("perclk",            "perclk_sel",        base + 0x1c, 0,  6);
+       clks[IMX6SL_CLK_PXP_AXI_PODF]      = imx_clk_divider("pxp_axi_podf",      "pxp_axi_sel",       base + 0x34, 3,  3);
+       clks[IMX6SL_CLK_EPDC_AXI_PODF]     = imx_clk_divider("epdc_axi_podf",     "epdc_axi_sel",      base + 0x34, 12, 3);
+       clks[IMX6SL_CLK_GPU2D_OVG_PODF]    = imx_clk_divider("gpu2d_ovg_podf",    "gpu2d_ovg_sel",     base + 0x18, 26, 3);
+       clks[IMX6SL_CLK_GPU2D_PODF]        = imx_clk_divider("gpu2d_podf",        "gpu2d_sel",         base + 0x18, 29, 3);
+       clks[IMX6SL_CLK_LCDIF_PIX_PRED]    = imx_clk_divider("lcdif_pix_pred",    "lcdif_pix_sel",     base + 0x38, 3,  3);
+       clks[IMX6SL_CLK_EPDC_PIX_PRED]     = imx_clk_divider("epdc_pix_pred",     "epdc_pix_sel",      base + 0x38, 12, 3);
+       clks[IMX6SL_CLK_LCDIF_PIX_PODF]    = imx_clk_divider("lcdif_pix_podf",    "lcdif_pix_pred",    base + 0x1c, 20, 3);
+       clks[IMX6SL_CLK_EPDC_PIX_PODF]     = imx_clk_divider("epdc_pix_podf",     "epdc_pix_pred",     base + 0x18, 23, 3);
+       clks[IMX6SL_CLK_SPDIF0_PRED]       = imx_clk_divider("spdif0_pred",       "spdif0_sel",        base + 0x30, 25, 3);
+       clks[IMX6SL_CLK_SPDIF0_PODF]       = imx_clk_divider("spdif0_podf",       "spdif0_pred",       base + 0x30, 22, 3);
+       clks[IMX6SL_CLK_SPDIF1_PRED]       = imx_clk_divider("spdif1_pred",       "spdif1_sel",        base + 0x30, 12, 3);
+       clks[IMX6SL_CLK_SPDIF1_PODF]       = imx_clk_divider("spdif1_podf",       "spdif1_pred",       base + 0x30, 9,  3);
+       clks[IMX6SL_CLK_EXTERN_AUDIO_PRED] = imx_clk_divider("extern_audio_pred", "extern_audio_sel",  base + 0x28, 9,  3);
+       clks[IMX6SL_CLK_EXTERN_AUDIO_PODF] = imx_clk_divider("extern_audio_podf", "extern_audio_pred", base + 0x28, 25, 3);
+       clks[IMX6SL_CLK_ECSPI_ROOT]        = imx_clk_divider("ecspi_root",        "ecspi_sel",         base + 0x38, 19, 6);
+       clks[IMX6SL_CLK_UART_ROOT]         = imx_clk_divider("uart_root",         "uart_sel",          base + 0x24, 0,  6);
+
+       /*                                                name         parent_name reg       shift width busy: reg, shift */
+       clks[IMX6SL_CLK_AHB]       = imx_clk_busy_divider("ahb",       "periph",  base + 0x14, 10, 3,    base + 0x48, 1);
+       clks[IMX6SL_CLK_MMDC_ROOT] = imx_clk_busy_divider("mmdc",      "periph2", base + 0x14, 3,  3,    base + 0x48, 2);
+       clks[IMX6SL_CLK_ARM]       = imx_clk_busy_divider("arm",       "pll1_sw", base + 0x10, 0,  3,    base + 0x48, 16);
+
+       /*                                            name            parent_name          reg         shift */
+       clks[IMX6SL_CLK_ECSPI1]       = imx_clk_gate2("ecspi1",       "ecspi_root",        base + 0x6c, 0);
+       clks[IMX6SL_CLK_ECSPI2]       = imx_clk_gate2("ecspi2",       "ecspi_root",        base + 0x6c, 2);
+       clks[IMX6SL_CLK_ECSPI3]       = imx_clk_gate2("ecspi3",       "ecspi_root",        base + 0x6c, 4);
+       clks[IMX6SL_CLK_ECSPI4]       = imx_clk_gate2("ecspi4",       "ecspi_root",        base + 0x6c, 6);
+       clks[IMX6SL_CLK_EPIT1]        = imx_clk_gate2("epit1",        "perclk",            base + 0x6c, 12);
+       clks[IMX6SL_CLK_EPIT2]        = imx_clk_gate2("epit2",        "perclk",            base + 0x6c, 14);
+       clks[IMX6SL_CLK_EXTERN_AUDIO] = imx_clk_gate2("extern_audio", "extern_audio_podf", base + 0x6c, 16);
+       clks[IMX6SL_CLK_GPT]          = imx_clk_gate2("gpt",          "perclk",            base + 0x6c, 20);
+       clks[IMX6SL_CLK_GPT_SERIAL]   = imx_clk_gate2("gpt_serial",   "perclk",            base + 0x6c, 22);
+       clks[IMX6SL_CLK_GPU2D_OVG]    = imx_clk_gate2("gpu2d_ovg",    "gpu2d_ovg_podf",    base + 0x6c, 26);
+       clks[IMX6SL_CLK_I2C1]         = imx_clk_gate2("i2c1",         "perclk",            base + 0x70, 6);
+       clks[IMX6SL_CLK_I2C2]         = imx_clk_gate2("i2c2",         "perclk",            base + 0x70, 8);
+       clks[IMX6SL_CLK_I2C3]         = imx_clk_gate2("i2c3",         "perclk",            base + 0x70, 10);
+       clks[IMX6SL_CLK_OCOTP]        = imx_clk_gate2("ocotp",        "ipg",               base + 0x70, 12);
+       clks[IMX6SL_CLK_CSI]          = imx_clk_gate2("csi",          "csi_podf",          base + 0x74, 0);
+       clks[IMX6SL_CLK_PXP_AXI]      = imx_clk_gate2("pxp_axi",      "pxp_axi_podf",      base + 0x74, 2);
+       clks[IMX6SL_CLK_EPDC_AXI]     = imx_clk_gate2("epdc_axi",     "epdc_axi_podf",     base + 0x74, 4);
+       clks[IMX6SL_CLK_LCDIF_AXI]    = imx_clk_gate2("lcdif_axi",    "lcdif_axi_podf",    base + 0x74, 6);
+       clks[IMX6SL_CLK_LCDIF_PIX]    = imx_clk_gate2("lcdif_pix",    "lcdif_pix_podf",    base + 0x74, 8);
+       clks[IMX6SL_CLK_EPDC_PIX]     = imx_clk_gate2("epdc_pix",     "epdc_pix_podf",     base + 0x74, 10);
+       clks[IMX6SL_CLK_OCRAM]        = imx_clk_gate2("ocram",        "ocram_podf",        base + 0x74, 28);
+       clks[IMX6SL_CLK_PWM1]         = imx_clk_gate2("pwm1",         "perclk",            base + 0x78, 16);
+       clks[IMX6SL_CLK_PWM2]         = imx_clk_gate2("pwm2",         "perclk",            base + 0x78, 18);
+       clks[IMX6SL_CLK_PWM3]         = imx_clk_gate2("pwm3",         "perclk",            base + 0x78, 20);
+       clks[IMX6SL_CLK_PWM4]         = imx_clk_gate2("pwm4",         "perclk",            base + 0x78, 22);
+       clks[IMX6SL_CLK_SDMA]         = imx_clk_gate2("sdma",         "ipg",               base + 0x7c, 6);
+       clks[IMX6SL_CLK_SPDIF]        = imx_clk_gate2("spdif",        "spdif0_podf",       base + 0x7c, 14);
+       clks[IMX6SL_CLK_SSI1]         = imx_clk_gate2("ssi1",         "ssi1_podf",         base + 0x7c, 18);
+       clks[IMX6SL_CLK_SSI2]         = imx_clk_gate2("ssi2",         "ssi2_podf",         base + 0x7c, 20);
+       clks[IMX6SL_CLK_SSI3]         = imx_clk_gate2("ssi3",         "ssi3_podf",         base + 0x7c, 22);
+       clks[IMX6SL_CLK_UART]         = imx_clk_gate2("uart",         "ipg",               base + 0x7c, 24);
+       clks[IMX6SL_CLK_UART_SERIAL]  = imx_clk_gate2("uart_serial",  "uart_root",         base + 0x7c, 26);
+       clks[IMX6SL_CLK_USBOH3]       = imx_clk_gate2("usboh3",       "ipg",               base + 0x80, 0);
+       clks[IMX6SL_CLK_USDHC1]       = imx_clk_gate2("usdhc1",       "usdhc1_podf",       base + 0x80, 2);
+       clks[IMX6SL_CLK_USDHC2]       = imx_clk_gate2("usdhc2",       "usdhc2_podf",       base + 0x80, 4);
+       clks[IMX6SL_CLK_USDHC3]       = imx_clk_gate2("usdhc3",       "usdhc3_podf",       base + 0x80, 6);
+       clks[IMX6SL_CLK_USDHC4]       = imx_clk_gate2("usdhc4",       "usdhc4_podf",       base + 0x80, 8);
+
+       for (i = 0; i < ARRAY_SIZE(clks); i++)
+               if (IS_ERR(clks[i]))
+                       pr_err("i.MX6SL clk %d: register failed with %ld\n",
+                               i, PTR_ERR(clks[i]));
+
+       clk_data.clks = clks;
+       clk_data.clk_num = ARRAY_SIZE(clks);
+       of_clk_add_provider(np, of_clk_src_onecell_get, &clk_data);
+
+       clk_register_clkdev(clks[IMX6SL_CLK_GPT], "ipg", "imx-gpt.0");
+       clk_register_clkdev(clks[IMX6SL_CLK_GPT_SERIAL], "per", "imx-gpt.0");
+
+       if (IS_ENABLED(CONFIG_USB_MXS_PHY)) {
+               clk_prepare_enable(clks[IMX6SL_CLK_USBPHY1_GATE]);
+               clk_prepare_enable(clks[IMX6SL_CLK_USBPHY2_GATE]);
+       }
+
+       np = of_find_compatible_node(NULL, NULL, "fsl,imx6sl-gpt");
+       base = of_iomap(np, 0);
+       WARN_ON(!base);
+       irq = irq_of_parse_and_map(np, 0);
+       mxc_timer_init(base, irq);
+}
+CLK_OF_DECLARE(imx6sl, "fsl,imx6sl-ccm", imx6sl_clocks_init);
index d09bc3df9a7a69bc7a4d63c7abeb7b078077a1f0..a9fad5f8d340b50fb50e2348a6e761623be50911 100644 (file)
@@ -296,13 +296,6 @@ static const struct clk_ops clk_pllv3_enet_ops = {
        .recalc_rate    = clk_pllv3_enet_recalc_rate,
 };
 
-static const struct clk_ops clk_pllv3_mlb_ops = {
-       .prepare        = clk_pllv3_prepare,
-       .unprepare      = clk_pllv3_unprepare,
-       .enable         = clk_pllv3_enable,
-       .disable        = clk_pllv3_disable,
-};
-
 struct clk *imx_clk_pllv3(enum imx_pllv3_type type, const char *name,
                          const char *parent_name, void __iomem *base,
                          u32 div_mask)
@@ -330,9 +323,6 @@ struct clk *imx_clk_pllv3(enum imx_pllv3_type type, const char *name,
        case IMX_PLLV3_ENET:
                ops = &clk_pllv3_enet_ops;
                break;
-       case IMX_PLLV3_MLB:
-               ops = &clk_pllv3_mlb_ops;
-               break;
        default:
                ops = &clk_pllv3_ops;
        }
diff --git a/arch/arm/mach-imx/clk-vf610.c b/arch/arm/mach-imx/clk-vf610.c
new file mode 100644 (file)
index 0000000..d617c0b
--- /dev/null
@@ -0,0 +1,319 @@
+/*
+ * Copyright 2012-2013 Freescale Semiconductor, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ */
+
+#include <linux/of_address.h>
+#include <linux/clk.h>
+#include <dt-bindings/clock/vf610-clock.h>
+
+#include "clk.h"
+
+#define CCM_CCR                        (ccm_base + 0x00)
+#define CCM_CSR                        (ccm_base + 0x04)
+#define CCM_CCSR               (ccm_base + 0x08)
+#define CCM_CACRR              (ccm_base + 0x0c)
+#define CCM_CSCMR1             (ccm_base + 0x10)
+#define CCM_CSCDR1             (ccm_base + 0x14)
+#define CCM_CSCDR2             (ccm_base + 0x18)
+#define CCM_CSCDR3             (ccm_base + 0x1c)
+#define CCM_CSCMR2             (ccm_base + 0x20)
+#define CCM_CSCDR4             (ccm_base + 0x24)
+#define CCM_CLPCR              (ccm_base + 0x2c)
+#define CCM_CISR               (ccm_base + 0x30)
+#define CCM_CIMR               (ccm_base + 0x34)
+#define CCM_CGPR               (ccm_base + 0x3c)
+#define CCM_CCGR0              (ccm_base + 0x40)
+#define CCM_CCGR1              (ccm_base + 0x44)
+#define CCM_CCGR2              (ccm_base + 0x48)
+#define CCM_CCGR3              (ccm_base + 0x4c)
+#define CCM_CCGR4              (ccm_base + 0x50)
+#define CCM_CCGR5              (ccm_base + 0x54)
+#define CCM_CCGR6              (ccm_base + 0x58)
+#define CCM_CCGR7              (ccm_base + 0x5c)
+#define CCM_CCGR8              (ccm_base + 0x60)
+#define CCM_CCGR9              (ccm_base + 0x64)
+#define CCM_CCGR10             (ccm_base + 0x68)
+#define CCM_CCGR11             (ccm_base + 0x6c)
+#define CCM_CMEOR0             (ccm_base + 0x70)
+#define CCM_CMEOR1             (ccm_base + 0x74)
+#define CCM_CMEOR2             (ccm_base + 0x78)
+#define CCM_CMEOR3             (ccm_base + 0x7c)
+#define CCM_CMEOR4             (ccm_base + 0x80)
+#define CCM_CMEOR5             (ccm_base + 0x84)
+#define CCM_CPPDSR             (ccm_base + 0x88)
+#define CCM_CCOWR              (ccm_base + 0x8c)
+#define CCM_CCPGR0             (ccm_base + 0x90)
+#define CCM_CCPGR1             (ccm_base + 0x94)
+#define CCM_CCPGR2             (ccm_base + 0x98)
+#define CCM_CCPGR3             (ccm_base + 0x9c)
+
+#define CCM_CCGRx_CGn(n)       ((n) * 2)
+
+#define PFD_PLL1_BASE          (anatop_base + 0x2b0)
+#define PFD_PLL2_BASE          (anatop_base + 0x100)
+#define PFD_PLL3_BASE          (anatop_base + 0xf0)
+
+static void __iomem *anatop_base;
+static void __iomem *ccm_base;
+
+/* sources for multiplexer clocks, this is used multiple times */
+static const char const *fast_sels[]   = { "firc", "fxosc", };
+static const char const *slow_sels[]   = { "sirc_32k", "sxosc", };
+static const char const *pll1_sels[]   = { "pll1_main", "pll1_pfd1", "pll1_pfd2", "pll1_pfd3", "pll1_pfd4", };
+static const char const *pll2_sels[]   = { "pll2_main", "pll2_pfd1", "pll2_pfd2", "pll2_pfd3", "pll2_pfd4", };
+static const char const *sys_sels[]    = { "fast_clk_sel", "slow_clk_sel", "pll2_pfd_sel", "pll2_main", "pll1_pfd_sel", "pll3_main", };
+static const char const *ddr_sels[]    = { "pll2_pfd2", "sys_sel", };
+static const char const *rmii_sels[]   = { "enet_ext", "audio_ext", "enet_50m", "enet_25m", };
+static const char const *enet_ts_sels[]        = { "enet_ext", "fxosc", "audio_ext", "usb", "enet_ts", "enet_25m", "enet_50m", };
+static const char const *esai_sels[]   = { "audio_ext", "mlb", "spdif_rx", "pll4_main_div", };
+static const char const *sai_sels[]    = { "audio_ext", "mlb", "spdif_rx", "pll4_main_div", };
+static const char const *nfc_sels[]    = { "platform_bus", "pll1_pfd1", "pll3_pfd1", "pll3_pfd3", };
+static const char const *qspi_sels[]   = { "pll3_main", "pll3_pfd4", "pll2_pfd4", "pll1_pfd4", };
+static const char const *esdhc_sels[]  = { "pll3_main", "pll3_pfd3", "pll1_pfd3", "platform_bus", };
+static const char const *dcu_sels[]    = { "pll1_pfd2", "pll3_main", };
+static const char const *gpu_sels[]    = { "pll2_pfd2", "pll3_pfd2", };
+static const char const *vadc_sels[]   = { "pll6_main_div", "pll3_main_div", "pll3_main", };
+/* FTM counter clock source, not module clock */
+static const char const *ftm_ext_sels[]        = {"sirc_128k", "sxosc", "fxosc_half", "audio_ext", };
+static const char const *ftm_fix_sels[]        = { "sxosc", "ipg_bus", };
+
+static struct clk_div_table pll4_main_div_table[] = {
+       { .val = 0, .div = 1 },
+       { .val = 1, .div = 2 },
+       { .val = 2, .div = 6 },
+       { .val = 3, .div = 8 },
+       { .val = 4, .div = 10 },
+       { .val = 5, .div = 12 },
+       { .val = 6, .div = 14 },
+       { .val = 7, .div = 16 },
+       { }
+};
+
+static struct clk *clk[VF610_CLK_END];
+static struct clk_onecell_data clk_data;
+
+static void __init vf610_clocks_init(struct device_node *ccm_node)
+{
+       struct device_node *np;
+
+       clk[VF610_CLK_DUMMY] = imx_clk_fixed("dummy", 0);
+       clk[VF610_CLK_SIRC_128K] = imx_clk_fixed("sirc_128k", 128000);
+       clk[VF610_CLK_SIRC_32K] = imx_clk_fixed("sirc_32k", 32000);
+       clk[VF610_CLK_FIRC] = imx_clk_fixed("firc", 24000000);
+
+       clk[VF610_CLK_SXOSC] = imx_obtain_fixed_clock("sxosc", 0);
+       clk[VF610_CLK_FXOSC] = imx_obtain_fixed_clock("fxosc", 0);
+       clk[VF610_CLK_AUDIO_EXT] = imx_obtain_fixed_clock("audio_ext", 0);
+       clk[VF610_CLK_ENET_EXT] = imx_obtain_fixed_clock("enet_ext", 0);
+
+       clk[VF610_CLK_FXOSC_HALF] = imx_clk_fixed_factor("fxosc_half", "fxosc", 1, 2);
+
+       np = of_find_compatible_node(NULL, NULL, "fsl,vf610-anatop");
+       anatop_base = of_iomap(np, 0);
+       BUG_ON(!anatop_base);
+
+       np = ccm_node;
+       ccm_base = of_iomap(np, 0);
+       BUG_ON(!ccm_base);
+
+       clk[VF610_CLK_SLOW_CLK_SEL] = imx_clk_mux("slow_clk_sel", CCM_CCSR, 4, 1, slow_sels, ARRAY_SIZE(slow_sels));
+       clk[VF610_CLK_FASK_CLK_SEL] = imx_clk_mux("fast_clk_sel", CCM_CCSR, 5, 1, fast_sels, ARRAY_SIZE(fast_sels));
+
+       clk[VF610_CLK_PLL1_MAIN] = imx_clk_fixed_factor("pll1_main", "fast_clk_sel", 22, 1);
+       clk[VF610_CLK_PLL1_PFD1] = imx_clk_pfd("pll1_pfd1", "pll1_main", PFD_PLL1_BASE, 0);
+       clk[VF610_CLK_PLL1_PFD2] = imx_clk_pfd("pll1_pfd2", "pll1_main", PFD_PLL1_BASE, 1);
+       clk[VF610_CLK_PLL1_PFD3] = imx_clk_pfd("pll1_pfd3", "pll1_main", PFD_PLL1_BASE, 2);
+       clk[VF610_CLK_PLL1_PFD4] = imx_clk_pfd("pll1_pfd4", "pll1_main", PFD_PLL1_BASE, 3);
+
+       clk[VF610_CLK_PLL2_MAIN] = imx_clk_fixed_factor("pll2_main", "fast_clk_sel", 22, 1);
+       clk[VF610_CLK_PLL2_PFD1] = imx_clk_pfd("pll2_pfd1", "pll2_main", PFD_PLL2_BASE, 0);
+       clk[VF610_CLK_PLL2_PFD2] = imx_clk_pfd("pll2_pfd2", "pll2_main", PFD_PLL2_BASE, 1);
+       clk[VF610_CLK_PLL2_PFD3] = imx_clk_pfd("pll2_pfd3", "pll2_main", PFD_PLL2_BASE, 2);
+       clk[VF610_CLK_PLL2_PFD4] = imx_clk_pfd("pll2_pfd4", "pll2_main", PFD_PLL2_BASE, 3);
+
+       clk[VF610_CLK_PLL3_MAIN] = imx_clk_fixed_factor("pll3_main", "fast_clk_sel", 20, 1);
+       clk[VF610_CLK_PLL3_PFD1] = imx_clk_pfd("pll3_pfd1", "pll3_main", PFD_PLL3_BASE, 0);
+       clk[VF610_CLK_PLL3_PFD2] = imx_clk_pfd("pll3_pfd2", "pll3_main", PFD_PLL3_BASE, 1);
+       clk[VF610_CLK_PLL3_PFD3] = imx_clk_pfd("pll3_pfd3", "pll3_main", PFD_PLL3_BASE, 2);
+       clk[VF610_CLK_PLL3_PFD4] = imx_clk_pfd("pll3_pfd4", "pll3_main", PFD_PLL3_BASE, 3);
+
+       clk[VF610_CLK_PLL4_MAIN] = imx_clk_fixed_factor("pll4_main", "fast_clk_sel", 25, 1);
+       /* Enet pll: fixed 50Mhz */
+       clk[VF610_CLK_PLL5_MAIN] = imx_clk_fixed_factor("pll5_main", "fast_clk_sel", 125, 6);
+       /* pll6: default 960Mhz */
+       clk[VF610_CLK_PLL6_MAIN] = imx_clk_fixed_factor("pll6_main", "fast_clk_sel", 40, 1);
+       clk[VF610_CLK_PLL1_PFD_SEL] = imx_clk_mux("pll1_pfd_sel", CCM_CCSR, 16, 3, pll1_sels, 5);
+       clk[VF610_CLK_PLL2_PFD_SEL] = imx_clk_mux("pll2_pfd_sel", CCM_CCSR, 19, 3, pll2_sels, 5);
+       clk[VF610_CLK_SYS_SEL] = imx_clk_mux("sys_sel", CCM_CCSR, 0, 3, sys_sels, ARRAY_SIZE(sys_sels));
+       clk[VF610_CLK_DDR_SEL] = imx_clk_mux("ddr_sel", CCM_CCSR, 6, 1, ddr_sels, ARRAY_SIZE(ddr_sels));
+       clk[VF610_CLK_SYS_BUS] = imx_clk_divider("sys_bus", "sys_sel", CCM_CACRR, 0, 3);
+       clk[VF610_CLK_PLATFORM_BUS] = imx_clk_divider("platform_bus", "sys_bus", CCM_CACRR, 3, 3);
+       clk[VF610_CLK_IPG_BUS] = imx_clk_divider("ipg_bus", "platform_bus", CCM_CACRR, 11, 2);
+
+       clk[VF610_CLK_PLL3_MAIN_DIV] = imx_clk_divider("pll3_main_div", "pll3_main", CCM_CACRR, 20, 1);
+       clk[VF610_CLK_PLL4_MAIN_DIV] = clk_register_divider_table(NULL, "pll4_main_div", "pll4_main", 0, CCM_CACRR, 6, 3, 0, pll4_main_div_table, &imx_ccm_lock);
+       clk[VF610_CLK_PLL6_MAIN_DIV] = imx_clk_divider("pll6_main_div", "pll6_main", CCM_CACRR, 21, 1);
+
+       clk[VF610_CLK_USBC0] = imx_clk_gate2("usbc0", "pll3_main", CCM_CCGR1, CCM_CCGRx_CGn(4));
+       clk[VF610_CLK_USBC1] = imx_clk_gate2("usbc1", "pll3_main", CCM_CCGR7, CCM_CCGRx_CGn(4));
+
+       clk[VF610_CLK_QSPI0_SEL] = imx_clk_mux("qspi0_sel", CCM_CSCMR1, 22, 2, qspi_sels, 4);
+       clk[VF610_CLK_QSPI0_EN] = imx_clk_gate("qspi0_en", "qspi0_sel", CCM_CSCDR3, 4);
+       clk[VF610_CLK_QSPI0_X4_DIV] = imx_clk_divider("qspi0_x4", "qspi0_en", CCM_CSCDR3, 0, 2);
+       clk[VF610_CLK_QSPI0_X2_DIV] = imx_clk_divider("qspi0_x2", "qspi0_x4", CCM_CSCDR3, 2, 1);
+       clk[VF610_CLK_QSPI0_X1_DIV] = imx_clk_divider("qspi0_x1", "qspi0_x2", CCM_CSCDR3, 3, 1);
+       clk[VF610_CLK_QSPI0] = imx_clk_gate2("qspi0", "qspi0_x1", CCM_CCGR2, CCM_CCGRx_CGn(4));
+
+       clk[VF610_CLK_QSPI1_SEL] = imx_clk_mux("qspi1_sel", CCM_CSCMR1, 24, 2, qspi_sels, 4);
+       clk[VF610_CLK_QSPI1_EN] = imx_clk_gate("qspi1_en", "qspi1_sel", CCM_CSCDR3, 12);
+       clk[VF610_CLK_QSPI1_X4_DIV] = imx_clk_divider("qspi1_x4", "qspi1_en", CCM_CSCDR3, 8, 2);
+       clk[VF610_CLK_QSPI1_X2_DIV] = imx_clk_divider("qspi1_x2", "qspi1_x4", CCM_CSCDR3, 10, 1);
+       clk[VF610_CLK_QSPI1_X1_DIV] = imx_clk_divider("qspi1_x1", "qspi1_x2", CCM_CSCDR3, 11, 1);
+       clk[VF610_CLK_QSPI1] = imx_clk_gate2("qspi1", "qspi1_x1", CCM_CCGR8, CCM_CCGRx_CGn(4));
+
+       clk[VF610_CLK_ENET_50M] = imx_clk_fixed_factor("enet_50m", "pll5_main", 1, 10);
+       clk[VF610_CLK_ENET_25M] = imx_clk_fixed_factor("enet_25m", "pll5_main", 1, 20);
+       clk[VF610_CLK_ENET_SEL] = imx_clk_mux("enet_sel", CCM_CSCMR2, 4, 2, rmii_sels, 4);
+       clk[VF610_CLK_ENET_TS_SEL] = imx_clk_mux("enet_ts_sel", CCM_CSCMR2, 0, 3, enet_ts_sels, 7);
+       clk[VF610_CLK_ENET] = imx_clk_gate("enet", "enet_sel", CCM_CSCDR1, 24);
+       clk[VF610_CLK_ENET_TS] = imx_clk_gate("enet_ts", "enet_ts_sel", CCM_CSCDR1, 23);
+
+       clk[VF610_CLK_PIT] = imx_clk_gate2("pit", "ipg_bus", CCM_CCGR1, CCM_CCGRx_CGn(7));
+
+       clk[VF610_CLK_UART0] = imx_clk_gate2("uart0", "ipg_bus", CCM_CCGR0, CCM_CCGRx_CGn(7));
+       clk[VF610_CLK_UART1] = imx_clk_gate2("uart1", "ipg_bus", CCM_CCGR0, CCM_CCGRx_CGn(8));
+       clk[VF610_CLK_UART2] = imx_clk_gate2("uart2", "ipg_bus", CCM_CCGR0, CCM_CCGRx_CGn(9));
+       clk[VF610_CLK_UART3] = imx_clk_gate2("uart3", "ipg_bus", CCM_CCGR0, CCM_CCGRx_CGn(10));
+
+       clk[VF610_CLK_I2C0] = imx_clk_gate2("i2c0", "ipg_bus", CCM_CCGR4, CCM_CCGRx_CGn(6));
+       clk[VF610_CLK_I2C1] = imx_clk_gate2("i2c1", "ipg_bus", CCM_CCGR4, CCM_CCGRx_CGn(7));
+
+       clk[VF610_CLK_DSPI0] = imx_clk_gate2("dspi0", "ipg_bus", CCM_CCGR0, CCM_CCGRx_CGn(12));
+       clk[VF610_CLK_DSPI1] = imx_clk_gate2("dspi1", "ipg_bus", CCM_CCGR0, CCM_CCGRx_CGn(13));
+       clk[VF610_CLK_DSPI2] = imx_clk_gate2("dspi2", "ipg_bus", CCM_CCGR6, CCM_CCGRx_CGn(12));
+       clk[VF610_CLK_DSPI3] = imx_clk_gate2("dspi3", "ipg_bus", CCM_CCGR6, CCM_CCGRx_CGn(13));
+
+       clk[VF610_CLK_WDT] = imx_clk_gate2("wdt", "ipg_bus", CCM_CCGR1, CCM_CCGRx_CGn(14));
+
+       clk[VF610_CLK_ESDHC0_SEL] = imx_clk_mux("esdhc0_sel", CCM_CSCMR1, 16, 2, esdhc_sels, 4);
+       clk[VF610_CLK_ESDHC0_EN] = imx_clk_gate("esdhc0_en", "esdhc0_sel", CCM_CSCDR2, 28);
+       clk[VF610_CLK_ESDHC0_DIV] = imx_clk_divider("esdhc0_div", "esdhc0_en", CCM_CSCDR2, 16, 4);
+       clk[VF610_CLK_ESDHC0] = imx_clk_gate2("eshc0", "esdhc0_div", CCM_CCGR7, CCM_CCGRx_CGn(1));
+
+       clk[VF610_CLK_ESDHC1_SEL] = imx_clk_mux("esdhc1_sel", CCM_CSCMR1, 18, 2, esdhc_sels, 4);
+       clk[VF610_CLK_ESDHC1_EN] = imx_clk_gate("esdhc1_en", "esdhc1_sel", CCM_CSCDR2, 29);
+       clk[VF610_CLK_ESDHC1_DIV] = imx_clk_divider("esdhc1_div", "esdhc1_en", CCM_CSCDR2, 20, 4);
+       clk[VF610_CLK_ESDHC1] = imx_clk_gate2("eshc1", "esdhc1_div", CCM_CCGR7, CCM_CCGRx_CGn(2));
+
+       /*
+        * ftm_ext_clk and ftm_fix_clk are FTM timer counter's
+        * selectable clock sources, both use a common enable bit
+        * in CCM_CSCDR1, selecting "dummy" clock as parent of
+        * "ftm0_ext_fix" make it serve only for enable/disable.
+        */
+       clk[VF610_CLK_FTM0_EXT_SEL] = imx_clk_mux("ftm0_ext_sel", CCM_CSCMR2, 6, 2, ftm_ext_sels, 4);
+       clk[VF610_CLK_FTM0_FIX_SEL] = imx_clk_mux("ftm0_fix_sel", CCM_CSCMR2, 14, 1, ftm_fix_sels, 2);
+       clk[VF610_CLK_FTM0_EXT_FIX_EN] = imx_clk_gate("ftm0_ext_fix_en", "dummy", CCM_CSCDR1, 25);
+       clk[VF610_CLK_FTM1_EXT_SEL] = imx_clk_mux("ftm1_ext_sel", CCM_CSCMR2, 8, 2, ftm_ext_sels, 4);
+       clk[VF610_CLK_FTM1_FIX_SEL] = imx_clk_mux("ftm1_fix_sel", CCM_CSCMR2, 15, 1, ftm_fix_sels, 2);
+       clk[VF610_CLK_FTM1_EXT_FIX_EN] = imx_clk_gate("ftm1_ext_fix_en", "dummy", CCM_CSCDR1, 26);
+       clk[VF610_CLK_FTM2_EXT_SEL] = imx_clk_mux("ftm2_ext_sel", CCM_CSCMR2, 10, 2, ftm_ext_sels, 4);
+       clk[VF610_CLK_FTM2_FIX_SEL] = imx_clk_mux("ftm2_fix_sel", CCM_CSCMR2, 16, 1, ftm_fix_sels, 2);
+       clk[VF610_CLK_FTM2_EXT_FIX_EN] = imx_clk_gate("ftm2_ext_fix_en", "dummy", CCM_CSCDR1, 27);
+       clk[VF610_CLK_FTM3_EXT_SEL] = imx_clk_mux("ftm3_ext_sel", CCM_CSCMR2, 12, 2, ftm_ext_sels, 4);
+       clk[VF610_CLK_FTM3_FIX_SEL] = imx_clk_mux("ftm3_fix_sel", CCM_CSCMR2, 17, 1, ftm_fix_sels, 2);
+       clk[VF610_CLK_FTM3_EXT_FIX_EN] = imx_clk_gate("ftm3_ext_fix_en", "dummy", CCM_CSCDR1, 28);
+
+       /* ftm(n)_clk are FTM module operation clock */
+       clk[VF610_CLK_FTM0] = imx_clk_gate2("ftm0", "ipg_bus", CCM_CCGR1, CCM_CCGRx_CGn(8));
+       clk[VF610_CLK_FTM1] = imx_clk_gate2("ftm1", "ipg_bus", CCM_CCGR1, CCM_CCGRx_CGn(9));
+       clk[VF610_CLK_FTM2] = imx_clk_gate2("ftm2", "ipg_bus", CCM_CCGR7, CCM_CCGRx_CGn(8));
+       clk[VF610_CLK_FTM3] = imx_clk_gate2("ftm3", "ipg_bus", CCM_CCGR7, CCM_CCGRx_CGn(9));
+
+       clk[VF610_CLK_DCU0_SEL] = imx_clk_mux("dcu0_sel", CCM_CSCMR1, 28, 1, dcu_sels, 2);
+       clk[VF610_CLK_DCU0_EN] = imx_clk_gate("dcu0_en", "dcu0_sel", CCM_CSCDR3, 19);
+       clk[VF610_CLK_DCU0_DIV] = imx_clk_divider("dcu0_div", "dcu0_en", CCM_CSCDR3, 16, 3);
+       clk[VF610_CLK_DCU0] = imx_clk_gate2("dcu0", "dcu0_div", CCM_CCGR3, CCM_CCGRx_CGn(8));
+       clk[VF610_CLK_DCU1_SEL] = imx_clk_mux("dcu1_sel", CCM_CSCMR1, 29, 1, dcu_sels, 2);
+       clk[VF610_CLK_DCU1_EN] = imx_clk_gate("dcu1_en", "dcu1_sel", CCM_CSCDR3, 23);
+       clk[VF610_CLK_DCU1_DIV] = imx_clk_divider("dcu1_div", "dcu1_en", CCM_CSCDR3, 20, 3);
+       clk[VF610_CLK_DCU1] = imx_clk_gate2("dcu1", "dcu1_div", CCM_CCGR9, CCM_CCGRx_CGn(8));
+
+       clk[VF610_CLK_ESAI_SEL] = imx_clk_mux("esai_sel", CCM_CSCMR1, 20, 2, esai_sels, 4);
+       clk[VF610_CLK_ESAI_EN] = imx_clk_gate("esai_en", "esai_sel", CCM_CSCDR2, 30);
+       clk[VF610_CLK_ESAI_DIV] = imx_clk_divider("esai_div", "esai_en", CCM_CSCDR2, 24, 4);
+       clk[VF610_CLK_ESAI] = imx_clk_gate2("esai", "esai_div", CCM_CCGR4, CCM_CCGRx_CGn(2));
+
+       clk[VF610_CLK_SAI0_SEL] = imx_clk_mux("sai0_sel", CCM_CSCMR1, 0, 2, sai_sels, 4);
+       clk[VF610_CLK_SAI0_EN] = imx_clk_gate("sai0_en", "sai0_sel", CCM_CSCDR1, 16);
+       clk[VF610_CLK_SAI0_DIV] = imx_clk_divider("sai0_div", "sai0_en", CCM_CSCDR1, 0, 4);
+       clk[VF610_CLK_SAI0] = imx_clk_gate2("sai0", "sai0_div", CCM_CCGR0, CCM_CCGRx_CGn(15));
+
+       clk[VF610_CLK_SAI1_SEL] = imx_clk_mux("sai1_sel", CCM_CSCMR1, 2, 2, sai_sels, 4);
+       clk[VF610_CLK_SAI1_EN] = imx_clk_gate("sai1_en", "sai1_sel", CCM_CSCDR1, 17);
+       clk[VF610_CLK_SAI1_DIV] = imx_clk_divider("sai1_div", "sai1_en", CCM_CSCDR1, 4, 4);
+       clk[VF610_CLK_SAI1] = imx_clk_gate2("sai1", "sai1_div", CCM_CCGR1, CCM_CCGRx_CGn(0));
+
+       clk[VF610_CLK_SAI2_SEL] = imx_clk_mux("sai2_sel", CCM_CSCMR1, 4, 2, sai_sels, 4);
+       clk[VF610_CLK_SAI2_EN] = imx_clk_gate("sai2_en", "sai2_sel", CCM_CSCDR1, 18);
+       clk[VF610_CLK_SAI2_DIV] = imx_clk_divider("sai2_div", "sai2_en", CCM_CSCDR1, 8, 4);
+       clk[VF610_CLK_SAI2] = imx_clk_gate2("sai2", "sai2_div", CCM_CCGR1, CCM_CCGRx_CGn(1));
+
+       clk[VF610_CLK_SAI3_SEL] = imx_clk_mux("sai3_sel", CCM_CSCMR1, 6, 2, sai_sels, 4);
+       clk[VF610_CLK_SAI3_EN] = imx_clk_gate("sai3_en", "sai3_sel", CCM_CSCDR1, 19);
+       clk[VF610_CLK_SAI3_DIV] = imx_clk_divider("sai3_div", "sai3_en", CCM_CSCDR1, 12, 4);
+       clk[VF610_CLK_SAI3] = imx_clk_gate2("sai3", "sai3_div", CCM_CCGR1, CCM_CCGRx_CGn(2));
+
+       clk[VF610_CLK_NFC_SEL] = imx_clk_mux("nfc_sel", CCM_CSCMR1, 12, 2, nfc_sels, 4);
+       clk[VF610_CLK_NFC_EN] = imx_clk_gate("nfc_en", "nfc_sel", CCM_CSCDR2, 9);
+       clk[VF610_CLK_NFC_PRE_DIV] = imx_clk_divider("nfc_pre_div", "nfc_en", CCM_CSCDR3, 13, 3);
+       clk[VF610_CLK_NFC_FRAC_DIV] = imx_clk_divider("nfc_frac_div", "nfc_pre_div", CCM_CSCDR2, 4, 4);
+       clk[VF610_CLK_NFC] = imx_clk_gate2("nfc", "nfc_frac_div", CCM_CCGR10, CCM_CCGRx_CGn(0));
+
+       clk[VF610_CLK_GPU_SEL] = imx_clk_mux("gpu_sel", CCM_CSCMR1, 14, 1, gpu_sels, 2);
+       clk[VF610_CLK_GPU_EN] = imx_clk_gate("gpu_en", "gpu_sel", CCM_CSCDR2, 10);
+       clk[VF610_CLK_GPU2D] = imx_clk_gate2("gpu", "gpu_en", CCM_CCGR8, CCM_CCGRx_CGn(15));
+
+       clk[VF610_CLK_VADC_SEL] = imx_clk_mux("vadc_sel", CCM_CSCMR1, 8, 2, vadc_sels, 3);
+       clk[VF610_CLK_VADC_EN] = imx_clk_gate("vadc_en", "vadc_sel", CCM_CSCDR1, 22);
+       clk[VF610_CLK_VADC_DIV] = imx_clk_divider("vadc_div", "vadc_en", CCM_CSCDR1, 20, 2);
+       clk[VF610_CLK_VADC_DIV_HALF] = imx_clk_fixed_factor("vadc_div_half", "vadc_div", 1, 2);
+       clk[VF610_CLK_VADC] = imx_clk_gate2("vadc", "vadc_div", CCM_CCGR8, CCM_CCGRx_CGn(7));
+
+       clk[VF610_CLK_ADC0] = imx_clk_gate2("adc0", "ipg_bus", CCM_CCGR1, CCM_CCGRx_CGn(11));
+       clk[VF610_CLK_ADC1] = imx_clk_gate2("adc1", "ipg_bus", CCM_CCGR7, CCM_CCGRx_CGn(11));
+       clk[VF610_CLK_DAC0] = imx_clk_gate2("dac0", "ipg_bus", CCM_CCGR8, CCM_CCGRx_CGn(12));
+       clk[VF610_CLK_DAC1] = imx_clk_gate2("dac1", "ipg_bus", CCM_CCGR8, CCM_CCGRx_CGn(13));
+
+       clk[VF610_CLK_ASRC] = imx_clk_gate2("asrc", "ipg_bus", CCM_CCGR4, CCM_CCGRx_CGn(1));
+
+       clk[VF610_CLK_FLEXCAN0] = imx_clk_gate2("flexcan0", "ipg_bus", CCM_CCGR0, CCM_CCGRx_CGn(0));
+       clk[VF610_CLK_FLEXCAN1] = imx_clk_gate2("flexcan1", "ipg_bus", CCM_CCGR9, CCM_CCGRx_CGn(4));
+
+       clk_set_parent(clk[VF610_CLK_QSPI0_SEL], clk[VF610_CLK_PLL1_PFD4]);
+       clk_set_rate(clk[VF610_CLK_QSPI0_X4_DIV], clk_get_rate(clk[VF610_CLK_QSPI0_SEL]) / 2);
+       clk_set_rate(clk[VF610_CLK_QSPI0_X2_DIV], clk_get_rate(clk[VF610_CLK_QSPI0_X4_DIV]) / 2);
+       clk_set_rate(clk[VF610_CLK_QSPI0_X1_DIV], clk_get_rate(clk[VF610_CLK_QSPI0_X2_DIV]) / 2);
+
+       clk_set_parent(clk[VF610_CLK_QSPI1_SEL], clk[VF610_CLK_PLL1_PFD4]);
+       clk_set_rate(clk[VF610_CLK_QSPI1_X4_DIV], clk_get_rate(clk[VF610_CLK_QSPI1_SEL]) / 2);
+       clk_set_rate(clk[VF610_CLK_QSPI1_X2_DIV], clk_get_rate(clk[VF610_CLK_QSPI1_X4_DIV]) / 2);
+       clk_set_rate(clk[VF610_CLK_QSPI1_X1_DIV], clk_get_rate(clk[VF610_CLK_QSPI1_X2_DIV]) / 2);
+
+       clk_set_parent(clk[VF610_CLK_SAI0_SEL], clk[VF610_CLK_AUDIO_EXT]);
+       clk_set_parent(clk[VF610_CLK_SAI1_SEL], clk[VF610_CLK_AUDIO_EXT]);
+       clk_set_parent(clk[VF610_CLK_SAI2_SEL], clk[VF610_CLK_AUDIO_EXT]);
+       clk_set_parent(clk[VF610_CLK_SAI3_SEL], clk[VF610_CLK_AUDIO_EXT]);
+
+       /* Add the clocks to provider list */
+       clk_data.clks = clk;
+       clk_data.clk_num = ARRAY_SIZE(clk);
+       of_clk_add_provider(np, of_clk_src_onecell_get, &clk_data);
+}
+CLK_OF_DECLARE(vf610, "fsl,vf610-ccm", vf610_clocks_init);
index 37e884ed1cd4098d43788e34e7f21d7d1ff88404..55bc80a00666412b8d7c53daaba26dced5e2eb95 100644 (file)
@@ -1,4 +1,39 @@
+#include <linux/clk.h>
+#include <linux/err.h>
+#include <linux/of.h>
+#include <linux/slab.h>
 #include <linux/spinlock.h>
 #include "clk.h"
 
 DEFINE_SPINLOCK(imx_ccm_lock);
+
+static struct clk * __init imx_obtain_fixed_clock_from_dt(const char *name)
+{
+       struct of_phandle_args phandle;
+       struct clk *clk = ERR_PTR(-ENODEV);
+       char *path;
+
+       path = kasprintf(GFP_KERNEL, "/clocks/%s", name);
+       if (!path)
+               return ERR_PTR(-ENOMEM);
+
+       phandle.np = of_find_node_by_path(path);
+       kfree(path);
+
+       if (phandle.np) {
+               clk = of_clk_get_from_provider(&phandle);
+               of_node_put(phandle.np);
+       }
+       return clk;
+}
+
+struct clk * __init imx_obtain_fixed_clock(
+                       const char *name, unsigned long rate)
+{
+       struct clk *clk;
+
+       clk = imx_obtain_fixed_clock_from_dt(name);
+       if (IS_ERR(clk))
+               clk = imx_clk_fixed(name, rate);
+       return clk;
+}
index d9d9d9c66dffd2538d0b58cf34021212969836f1..0e4e8bb261b945c1fb22d32b9e693592f17dfa41 100644 (file)
@@ -18,7 +18,6 @@ enum imx_pllv3_type {
        IMX_PLLV3_USB,
        IMX_PLLV3_AV,
        IMX_PLLV3_ENET,
-       IMX_PLLV3_MLB,
 };
 
 struct clk *imx_clk_pllv3(enum imx_pllv3_type type, const char *name,
@@ -29,6 +28,9 @@ struct clk *clk_register_gate2(struct device *dev, const char *name,
                void __iomem *reg, u8 bit_idx,
                u8 clk_gate_flags, spinlock_t *lock);
 
+struct clk * imx_obtain_fixed_clock(
+                       const char *name, unsigned long rate);
+
 static inline struct clk *imx_clk_gate2(const char *name, const char *parent,
                void __iomem *reg, u8 shift)
 {
index c08ae3f99cee0e98f0025a0840a430407406e1b1..ee78847abf4708c98bff9d91bb2e123917ea39c8 100644 (file)
@@ -68,12 +68,12 @@ extern int mx27_clocks_init_dt(void);
 extern int mx31_clocks_init_dt(void);
 extern int mx51_clocks_init_dt(void);
 extern int mx53_clocks_init_dt(void);
-extern int mx6q_clocks_init(void);
 extern struct platform_device *mxc_register_gpio(char *name, int id,
        resource_size_t iobase, resource_size_t iosize, int irq, int irq_high);
 extern void mxc_set_cpu_type(unsigned int type);
 extern void mxc_restart(char, const char *);
 extern void mxc_arch_reset_init(void __iomem *);
+extern void mxc_arch_reset_init_dt(void);
 extern int mx53_revision(void);
 extern int imx6q_revision(void);
 extern int mx53_display_revision(void);
index 356131f7b591ddd212b7f1fadb97c626c64eb1e8..a3b0b04b45c90f9bc4808ece62482521f85fcf24 100644 (file)
@@ -20,6 +20,7 @@
 #ifndef __ASM_ARCH_MXC_HARDWARE_H__
 #define __ASM_ARCH_MXC_HARDWARE_H__
 
+#include <asm/io.h>
 #include <asm/sizes.h>
 
 #define addr_in_module(addr, mod) \
index 82348391582a0944108a8d3ab06a4abb81771e20..3e1ec5ffe630f72976601339a7f32ac8f6c38584 100644 (file)
@@ -19,6 +19,8 @@
 
 static void __init imx25_dt_init(void)
 {
+       mxc_arch_reset_init_dt();
+
        of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
 }
 
index 4aaead0a77fffa89a1f3ef974915fe3a44601538..4e235ecb402191fb5b248b49804d160dab6b2a06 100644 (file)
@@ -22,6 +22,8 @@ static void __init imx27_dt_init(void)
 {
        struct platform_device_info devinfo = { .name = "cpufreq-cpu0", };
 
+       mxc_arch_reset_init_dt();
+
        of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
 
        platform_device_register_full(&devinfo);
index 67de611e29ab32d1bd711418ffcd1780cf983e34..818a1cc2fe45e4ead8c2f4cd367ba24148d2aa30 100644 (file)
@@ -20,6 +20,8 @@
 
 static void __init imx31_dt_init(void)
 {
+       mxc_arch_reset_init_dt();
+
        of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
 }
 
index ab24cc32211126874ea8ef5695da20180993d2a6..53e43e579dd79afbb755360d7ff8f8936dcc4d86 100644 (file)
@@ -23,6 +23,8 @@ static void __init imx51_dt_init(void)
 {
        struct platform_device_info devinfo = { .name = "cpufreq-cpu0", };
 
+       mxc_arch_reset_init_dt();
+
        of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
        platform_device_register_full(&devinfo);
 }
index 4b34f52dc46bc604f9cf1e618323df3c18e5ca12..0a920d184867a9753897a9ebf1282661b077c73c 100644 (file)
@@ -18,6 +18,7 @@
 
 #include <linux/module.h>
 #include <linux/irq.h>
+#include <linux/platform_data/asoc-imx-ssi.h>
 
 #include "irq-common.h"
 
index f579c616feed3b2008965fa9ef8b63dc84e6ab01..74e7b94c22e7237755ce2995f4539c4de123d7ac 100644 (file)
@@ -21,6 +21,7 @@
 #include <asm/mach/time.h>
 
 #include "common.h"
+#include "hardware.h"
 #include "mx53.h"
 
 static void __init imx53_qsb_init(void)
@@ -38,6 +39,8 @@ static void __init imx53_qsb_init(void)
 
 static void __init imx53_dt_init(void)
 {
+       mxc_arch_reset_init_dt();
+
        if (of_machine_is_compatible("fsl,imx53-qsb"))
                imx53_qsb_init();
 
index 5536fd81379a87dc2d7856a9b46338578aa52cbd..f5965220a4d8a6207204309802161898c0bb939f 100644 (file)
@@ -11,6 +11,7 @@
  */
 
 #include <linux/clk.h>
+#include <linux/clk-provider.h>
 #include <linux/clkdev.h>
 #include <linux/clocksource.h>
 #include <linux/cpu.h>
@@ -145,6 +146,45 @@ static void __init imx6q_sabrelite_init(void)
        imx6q_sabrelite_cko1_setup();
 }
 
+static void __init imx6q_sabresd_cko1_setup(void)
+{
+       struct clk *cko1_sel, *pll4, *pll4_post, *cko1;
+       unsigned long rate;
+
+       cko1_sel = clk_get_sys(NULL, "cko1_sel");
+       pll4 = clk_get_sys(NULL, "pll4_audio");
+       pll4_post = clk_get_sys(NULL, "pll4_post_div");
+       cko1 = clk_get_sys(NULL, "cko1");
+       if (IS_ERR(cko1_sel) || IS_ERR(pll4)
+                       || IS_ERR(pll4_post) || IS_ERR(cko1)) {
+               pr_err("cko1 setup failed!\n");
+               goto put_clk;
+       }
+       /*
+        * Setting pll4 at 768MHz (24MHz * 32)
+        * So its child clock can get 24MHz easily
+        */
+       clk_set_rate(pll4, 768000000);
+
+       clk_set_parent(cko1_sel, pll4_post);
+       rate = clk_round_rate(cko1, 24000000);
+       clk_set_rate(cko1, rate);
+put_clk:
+       if (!IS_ERR(cko1_sel))
+               clk_put(cko1_sel);
+       if (!IS_ERR(pll4_post))
+               clk_put(pll4_post);
+       if (!IS_ERR(pll4))
+               clk_put(pll4);
+       if (!IS_ERR(cko1))
+               clk_put(cko1);
+}
+
+static void __init imx6q_sabresd_init(void)
+{
+       imx6q_sabresd_cko1_setup();
+}
+
 static void __init imx6q_1588_init(void)
 {
        struct regmap *gpr;
@@ -165,6 +205,9 @@ static void __init imx6q_init_machine(void)
 {
        if (of_machine_is_compatible("fsl,imx6q-sabrelite"))
                imx6q_sabrelite_init();
+       else if (of_machine_is_compatible("fsl,imx6q-sabresd") ||
+                       of_machine_is_compatible("fsl,imx6dl-sabresd"))
+               imx6q_sabresd_init();
 
        of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
 
@@ -253,10 +296,44 @@ static void __init imx6q_map_io(void)
        imx_scu_map_io();
 }
 
+#ifdef CONFIG_CACHE_L2X0
+static void __init imx6q_init_l2cache(void)
+{
+       void __iomem *l2x0_base;
+       struct device_node *np;
+       unsigned int val;
+
+       np = of_find_compatible_node(NULL, NULL, "arm,pl310-cache");
+       if (!np)
+               goto out;
+
+       l2x0_base = of_iomap(np, 0);
+       if (!l2x0_base) {
+               of_node_put(np);
+               goto out;
+       }
+
+       /* Configure the L2 PREFETCH and POWER registers */
+       val = readl_relaxed(l2x0_base + L2X0_PREFETCH_CTRL);
+       val |= 0x70800000;
+       writel_relaxed(val, l2x0_base + L2X0_PREFETCH_CTRL);
+       val = L2X0_DYNAMIC_CLK_GATING_EN | L2X0_STNDBY_MODE_EN;
+       writel_relaxed(val, l2x0_base + L2X0_POWER_CTRL);
+
+       iounmap(l2x0_base);
+       of_node_put(np);
+
+out:
+       l2x0_of_init(0, ~0UL);
+}
+#else
+static inline void imx6q_init_l2cache(void) {}
+#endif
+
 static void __init imx6q_init_irq(void)
 {
        imx6q_init_revision();
-       l2x0_of_init(0, ~0UL);
+       imx6q_init_l2cache();
        imx_src_init();
        imx_gpc_init();
        irqchip_init();
@@ -264,7 +341,7 @@ static void __init imx6q_init_irq(void)
 
 static void __init imx6q_timer_init(void)
 {
-       mx6q_clocks_init();
+       of_clk_init(NULL);
        clocksource_of_init();
        imx_print_silicon_rev(cpu_is_imx6dl() ? "i.MX6DL" : "i.MX6Q",
                              imx6q_revision());
diff --git a/arch/arm/mach-imx/mach-imx6sl.c b/arch/arm/mach-imx/mach-imx6sl.c
new file mode 100644 (file)
index 0000000..132db26
--- /dev/null
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2013 Freescale Semiconductor, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ */
+
+#include <linux/clk-provider.h>
+#include <linux/irqchip.h>
+#include <linux/of.h>
+#include <linux/of_platform.h>
+#include <asm/hardware/cache-l2x0.h>
+#include <asm/mach/arch.h>
+#include <asm/mach/map.h>
+
+#include "common.h"
+
+static void __init imx6sl_init_machine(void)
+{
+       mxc_arch_reset_init_dt();
+
+       of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
+}
+
+static void __init imx6sl_init_irq(void)
+{
+       l2x0_of_init(0, ~0UL);
+       imx_src_init();
+       imx_gpc_init();
+       irqchip_init();
+}
+
+static void __init imx6sl_timer_init(void)
+{
+       of_clk_init(NULL);
+}
+
+static const char *imx6sl_dt_compat[] __initdata = {
+       "fsl,imx6sl",
+       NULL,
+};
+
+DT_MACHINE_START(IMX6SL, "Freescale i.MX6 SoloLite (Device Tree)")
+       .map_io         = debug_ll_io_init,
+       .init_irq       = imx6sl_init_irq,
+       .init_time      = imx6sl_timer_init,
+       .init_machine   = imx6sl_init_machine,
+       .dt_compat      = imx6sl_dt_compat,
+       .restart        = mxc_restart,
+MACHINE_END
index b8b15bb1ffdfb2d8e0e0f2e52c71a21d4b4c81de..19bb6441a7d4aaddb106afa71634606acfae7466 100644 (file)
@@ -398,8 +398,8 @@ static void __init pca100_init(void)
                imx27_add_fsl_usb2_udc(&otg_device_pdata);
        }
 
-       usbh2_pdata.otg = otg_ulpi_create(&mxc_ulpi_access_ops,
-                               ULPI_OTG_DRVVBUS | ULPI_OTG_DRVVBUS_EXT);
+       usbh2_pdata.otg = imx_otg_ulpi_create(
+                       ULPI_OTG_DRVVBUS | ULPI_OTG_DRVVBUS_EXT);
 
        if (usbh2_pdata.otg)
                imx27_add_mxc_ehci_hs(2, &usbh2_pdata);
diff --git a/arch/arm/mach-imx/mach-vf610.c b/arch/arm/mach-imx/mach-vf610.c
new file mode 100644 (file)
index 0000000..816991d
--- /dev/null
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2012-2013 Freescale Semiconductor, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ */
+
+#include <linux/of_platform.h>
+#include <linux/clocksource.h>
+#include <linux/irqchip.h>
+#include <linux/clk-provider.h>
+#include <asm/mach/arch.h>
+#include <asm/hardware/cache-l2x0.h>
+
+#include "common.h"
+
+static void __init vf610_init_machine(void)
+{
+       mxc_arch_reset_init_dt();
+       of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
+}
+
+static void __init vf610_init_irq(void)
+{
+       l2x0_of_init(0, ~0UL);
+       irqchip_init();
+}
+
+static void __init vf610_init_time(void)
+{
+       of_clk_init(NULL);
+       clocksource_of_init();
+}
+
+static const char *vf610_dt_compat[] __initdata = {
+       "fsl,vf610",
+       NULL,
+};
+
+DT_MACHINE_START(VYBRID_VF610, "Freescale Vybrid VF610 (Device Tree)")
+       .init_irq       = vf610_init_irq,
+       .init_time      = vf610_init_time,
+       .init_machine   = vf610_init_machine,
+       .dt_compat      = vf610_dt_compat,
+       .restart        = mxc_restart,
+MACHINE_END
index 3c609c52d3eb984f2d71cf43fc933c8b5e777056..e065fedb3ad4ea28559b862261c9b711c02108c0 100644 (file)
@@ -39,7 +39,6 @@ void __init mx1_map_io(void)
 void __init imx1_init_early(void)
 {
        mxc_set_cpu_type(MXC_CPU_MX1);
-       mxc_arch_reset_init(MX1_IO_ADDRESS(MX1_WDT_BASE_ADDR));
        imx_iomuxv1_init(MX1_IO_ADDRESS(MX1_GPIO_BASE_ADDR),
                        MX1_NUM_GPIO_PORT);
 }
@@ -51,6 +50,7 @@ void __init mx1_init_irq(void)
 
 void __init imx1_soc_init(void)
 {
+       mxc_arch_reset_init(MX1_IO_ADDRESS(MX1_WDT_BASE_ADDR));
        mxc_device_init();
 
        mxc_register_gpio("imx1-gpio", 0, MX1_GPIO1_BASE_ADDR, SZ_256,
index d8ccd3a8ec531bec988e6a90353148983d8d7713..2e91ab2ca378609c2466e1340baa3a4239281dc7 100644 (file)
@@ -66,7 +66,6 @@ void __init mx21_map_io(void)
 void __init imx21_init_early(void)
 {
        mxc_set_cpu_type(MXC_CPU_MX21);
-       mxc_arch_reset_init(MX21_IO_ADDRESS(MX21_WDOG_BASE_ADDR));
        imx_iomuxv1_init(MX21_IO_ADDRESS(MX21_GPIO_BASE_ADDR),
                        MX21_NUM_GPIO_PORT);
 }
@@ -82,6 +81,7 @@ static const struct resource imx21_audmux_res[] __initconst = {
 
 void __init imx21_soc_init(void)
 {
+       mxc_arch_reset_init(MX21_IO_ADDRESS(MX21_WDOG_BASE_ADDR));
        mxc_device_init();
 
        mxc_register_gpio("imx21-gpio", 0, MX21_GPIO1_BASE_ADDR, SZ_256, MX21_INT_GPIO, 0);
index 9357707bb7afc4fa5bbb586fcf1ac6fcb8a9bfc0..e065c117f5a6452156eab28e41fe5315b35af43a 100644 (file)
@@ -54,7 +54,6 @@ void __init imx25_init_early(void)
 {
        mxc_set_cpu_type(MXC_CPU_MX25);
        mxc_iomux_v3_init(MX25_IO_ADDRESS(MX25_IOMUXC_BASE_ADDR));
-       mxc_arch_reset_init(MX25_IO_ADDRESS(MX25_WDOG_BASE_ADDR));
 }
 
 void __init mx25_init_irq(void)
@@ -89,6 +88,7 @@ static const struct resource imx25_audmux_res[] __initconst = {
 
 void __init imx25_soc_init(void)
 {
+       mxc_arch_reset_init(MX25_IO_ADDRESS(MX25_WDOG_BASE_ADDR));
        mxc_device_init();
 
        /* i.mx25 has the i.mx35 type gpio */
index 4f1be65a7b5fe62a6531a09d70aa623283086d6b..7d82a5a5b16b5c73d8938b1b3b325d3d0cb1d6f9 100644 (file)
@@ -66,7 +66,6 @@ void __init mx27_map_io(void)
 void __init imx27_init_early(void)
 {
        mxc_set_cpu_type(MXC_CPU_MX27);
-       mxc_arch_reset_init(MX27_IO_ADDRESS(MX27_WDOG_BASE_ADDR));
        imx_iomuxv1_init(MX27_IO_ADDRESS(MX27_GPIO_BASE_ADDR),
                        MX27_NUM_GPIO_PORT);
 }
@@ -82,6 +81,7 @@ static const struct resource imx27_audmux_res[] __initconst = {
 
 void __init imx27_soc_init(void)
 {
+       mxc_arch_reset_init(MX27_IO_ADDRESS(MX27_WDOG_BASE_ADDR));
        mxc_device_init();
 
        /* i.mx27 has the i.mx21 type gpio */
index e0e69a682174b59ce08e77d2eb11608b596fcf97..8f0f60697f557eb511a22ecf926dbd8487c738ba 100644 (file)
@@ -138,7 +138,6 @@ void __init mx31_map_io(void)
 void __init imx31_init_early(void)
 {
        mxc_set_cpu_type(MXC_CPU_MX31);
-       mxc_arch_reset_init(MX31_IO_ADDRESS(MX31_WDOG_BASE_ADDR));
        arch_ioremap_caller = imx3_ioremap_caller;
        arm_pm_idle = imx3_idle;
        mx3_ccm_base = MX31_IO_ADDRESS(MX31_CCM_BASE_ADDR);
@@ -174,6 +173,7 @@ void __init imx31_soc_init(void)
 
        imx3_init_l2x0();
 
+       mxc_arch_reset_init(MX31_IO_ADDRESS(MX31_WDOG_BASE_ADDR));
        mxc_device_init();
 
        mxc_register_gpio("imx31-gpio", 0, MX31_GPIO1_BASE_ADDR, SZ_16K, MX31_INT_GPIO1, 0);
@@ -216,7 +216,6 @@ void __init imx35_init_early(void)
 {
        mxc_set_cpu_type(MXC_CPU_MX35);
        mxc_iomux_v3_init(MX35_IO_ADDRESS(MX35_IOMUXC_BASE_ADDR));
-       mxc_arch_reset_init(MX35_IO_ADDRESS(MX35_WDOG_BASE_ADDR));
        arm_pm_idle = imx3_idle;
        arch_ioremap_caller = imx3_ioremap_caller;
        mx3_ccm_base = MX35_IO_ADDRESS(MX35_CCM_BASE_ADDR);
@@ -272,6 +271,7 @@ void __init imx35_soc_init(void)
 
        imx3_init_l2x0();
 
+       mxc_arch_reset_init(MX35_IO_ADDRESS(MX35_WDOG_BASE_ADDR));
        mxc_device_init();
 
        mxc_register_gpio("imx35-gpio", 0, MX35_GPIO1_BASE_ADDR, SZ_16K, MX35_INT_GPIO1, 0);
index b7c4e70e50813a90f96cc14c2a47d2bf1e18ebc4..cf193d87274ac316674dfb4d0e50ccc81adbf4f0 100644 (file)
@@ -83,7 +83,6 @@ void __init imx51_init_early(void)
        imx51_ipu_mipi_setup();
        mxc_set_cpu_type(MXC_CPU_MX51);
        mxc_iomux_v3_init(MX51_IO_ADDRESS(MX51_IOMUXC_BASE_ADDR));
-       mxc_arch_reset_init(MX51_IO_ADDRESS(MX51_WDOG1_BASE_ADDR));
        imx_src_init();
 }
 
@@ -91,7 +90,6 @@ void __init imx53_init_early(void)
 {
        mxc_set_cpu_type(MXC_CPU_MX53);
        mxc_iomux_v3_init(MX53_IO_ADDRESS(MX53_IOMUXC_BASE_ADDR));
-       mxc_arch_reset_init(MX53_IO_ADDRESS(MX53_WDOG1_BASE_ADDR));
        imx_src_init();
 }
 
@@ -129,6 +127,7 @@ static const struct resource imx51_audmux_res[] __initconst = {
 
 void __init imx51_soc_init(void)
 {
+       mxc_arch_reset_init(MX51_IO_ADDRESS(MX51_WDOG1_BASE_ADDR));
        mxc_device_init();
 
        /* i.mx51 has the i.mx35 type gpio */
index 695e0d73bf85e12308f878bcbfd322280b67ba76..7cdc79a9657c64bc7bbdab1236ab1f78736732dc 100644 (file)
@@ -21,6 +21,8 @@
 #include <linux/io.h>
 #include <linux/err.h>
 #include <linux/delay.h>
+#include <linux/of.h>
+#include <linux/of_address.h>
 
 #include <asm/system_misc.h>
 #include <asm/proc-fns.h>
@@ -30,6 +32,7 @@
 #include "hardware.h"
 
 static void __iomem *wdog_base;
+static struct clk *wdog_clk;
 
 /*
  * Reset the system. It is called by machine_restart().
@@ -38,16 +41,13 @@ void mxc_restart(char mode, const char *cmd)
 {
        unsigned int wcr_enable;
 
-       if (cpu_is_mx1()) {
-               wcr_enable = (1 << 0);
-       } else {
-               struct clk *clk;
+       if (wdog_clk)
+               clk_enable(wdog_clk);
 
-               clk = clk_get_sys("imx2-wdt.0", NULL);
-               if (!IS_ERR(clk))
-                       clk_prepare_enable(clk);
+       if (cpu_is_mx1())
+               wcr_enable = (1 << 0);
+       else
                wcr_enable = (1 << 2);
-       }
 
        /* Assert SRS signal */
        __raw_writew(wcr_enable, wdog_base);
@@ -55,7 +55,7 @@ void mxc_restart(char mode, const char *cmd)
        /* wait for reset to assert... */
        mdelay(500);
 
-       printk(KERN_ERR "Watchdog reset failed to assert reset\n");
+       pr_err("%s: Watchdog reset failed to assert reset\n", __func__);
 
        /* delay to allow the serial port to show the message */
        mdelay(50);
@@ -64,7 +64,34 @@ void mxc_restart(char mode, const char *cmd)
        soft_restart(0);
 }
 
-void mxc_arch_reset_init(void __iomem *base)
+void __init mxc_arch_reset_init(void __iomem *base)
 {
        wdog_base = base;
+
+       wdog_clk = clk_get_sys("imx2-wdt.0", NULL);
+       if (IS_ERR(wdog_clk)) {
+               pr_warn("%s: failed to get wdog clock\n", __func__);
+               wdog_clk = NULL;
+               return;
+       }
+
+       clk_prepare(wdog_clk);
+}
+
+void __init mxc_arch_reset_init_dt(void)
+{
+       struct device_node *np;
+
+       np = of_find_compatible_node(NULL, NULL, "fsl,imx21-wdt");
+       wdog_base = of_iomap(np, 0);
+       WARN_ON(!wdog_base);
+
+       wdog_clk = of_clk_get(np, 0);
+       if (IS_ERR(wdog_clk)) {
+               pr_warn("%s: failed to get wdog clock\n", __func__);
+               wdog_clk = NULL;
+               return;
+       }
+
+       clk_prepare(wdog_clk);
 }
diff --git a/arch/arm/mach-imx/ulpi.c b/arch/arm/mach-imx/ulpi.c
deleted file mode 100644 (file)
index 0f05195..0000000
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * Copyright 2008 Sascha Hauer, Pengutronix <s.hauer@pengutronix.de>
- * Copyright 2009 Daniel Mack <daniel@caiaq.de>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- * 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 Street, Fifth Floor, Boston,
- * MA  02110-1301, USA.
- */
-
-#include <linux/module.h>
-#include <linux/kernel.h>
-#include <linux/io.h>
-#include <linux/delay.h>
-#include <linux/usb/otg.h>
-#include <linux/usb/ulpi.h>
-
-#include "ulpi.h"
-
-/* ULPIVIEW register bits */
-#define ULPIVW_WU              (1 << 31)       /* Wakeup */
-#define ULPIVW_RUN             (1 << 30)       /* read/write run */
-#define ULPIVW_WRITE           (1 << 29)       /* 0 = read  1 = write */
-#define ULPIVW_SS              (1 << 27)       /* SyncState */
-#define ULPIVW_PORT_MASK       0x07    /* Port field */
-#define ULPIVW_PORT_SHIFT      24
-#define ULPIVW_ADDR_MASK       0xff    /* data address field */
-#define ULPIVW_ADDR_SHIFT      16
-#define ULPIVW_RDATA_MASK      0xff    /* read data field */
-#define ULPIVW_RDATA_SHIFT     8
-#define ULPIVW_WDATA_MASK      0xff    /* write data field */
-#define ULPIVW_WDATA_SHIFT     0
-
-static int ulpi_poll(void __iomem *view, u32 bit)
-{
-       int timeout = 10000;
-
-       while (timeout--) {
-               u32 data = __raw_readl(view);
-
-               if (!(data & bit))
-                       return 0;
-
-               cpu_relax();
-       };
-
-       printk(KERN_WARNING "timeout polling for ULPI device\n");
-
-       return -ETIMEDOUT;
-}
-
-static int ulpi_read(struct usb_phy *otg, u32 reg)
-{
-       int ret;
-       void __iomem *view = otg->io_priv;
-
-       /* make sure interface is running */
-       if (!(__raw_readl(view) & ULPIVW_SS)) {
-               __raw_writel(ULPIVW_WU, view);
-
-               /* wait for wakeup */
-               ret = ulpi_poll(view, ULPIVW_WU);
-               if (ret)
-                       return ret;
-       }
-
-       /* read the register */
-       __raw_writel((ULPIVW_RUN | (reg << ULPIVW_ADDR_SHIFT)), view);
-
-       /* wait for completion */
-       ret = ulpi_poll(view, ULPIVW_RUN);
-       if (ret)
-               return ret;
-
-       return (__raw_readl(view) >> ULPIVW_RDATA_SHIFT) & ULPIVW_RDATA_MASK;
-}
-
-static int ulpi_write(struct usb_phy *otg, u32 val, u32 reg)
-{
-       int ret;
-       void __iomem *view = otg->io_priv;
-
-       /* make sure the interface is running */
-       if (!(__raw_readl(view) & ULPIVW_SS)) {
-               __raw_writel(ULPIVW_WU, view);
-               /* wait for wakeup */
-               ret = ulpi_poll(view, ULPIVW_WU);
-               if (ret)
-                       return ret;
-       }
-
-       __raw_writel((ULPIVW_RUN | ULPIVW_WRITE |
-                     (reg << ULPIVW_ADDR_SHIFT) |
-                     ((val & ULPIVW_WDATA_MASK) << ULPIVW_WDATA_SHIFT)), view);
-
-       /* wait for completion */
-       return ulpi_poll(view, ULPIVW_RUN);
-}
-
-struct usb_phy_io_ops mxc_ulpi_access_ops = {
-       .read   = ulpi_read,
-       .write  = ulpi_write,
-};
-EXPORT_SYMBOL_GPL(mxc_ulpi_access_ops);
-
-struct usb_phy *imx_otg_ulpi_create(unsigned int flags)
-{
-       return otg_ulpi_create(&mxc_ulpi_access_ops, flags);
-}
index 42bdaca6d7d912eff447e2e262005d090d81317c..23f5c0349e807d737c3d9338b0f9efbd90dcf1ea 100644 (file)
@@ -1,8 +1,13 @@
 #ifndef __MACH_ULPI_H
 #define __MACH_ULPI_H
 
-#ifdef CONFIG_USB_ULPI
-struct usb_phy *imx_otg_ulpi_create(unsigned int flags);
+#include <linux/usb/ulpi.h>
+
+#ifdef CONFIG_USB_ULPI_VIEWPORT
+static inline struct usb_phy *imx_otg_ulpi_create(unsigned int flags)
+{
+       return otg_ulpi_create(&ulpi_viewport_access_ops, flags);
+}
 #else
 static inline struct usb_phy *imx_otg_ulpi_create(unsigned int flags)
 {
@@ -10,7 +15,5 @@ static inline struct usb_phy *imx_otg_ulpi_create(unsigned int flags)
 }
 #endif
 
-extern struct usb_phy_io_ops mxc_ulpi_access_ops;
-
 #endif /* __MACH_ULPI_H */
 
index d14d6b76f4c24289d0d2c42507a7f30c7d06cdde..ec759ded7b609c541204b9ec72dd5814b8c6dea0 100644 (file)
@@ -8,5 +8,5 @@ obj-y                                   := core.o lm.o leds.o
 obj-$(CONFIG_ARCH_INTEGRATOR_AP)       += integrator_ap.o
 obj-$(CONFIG_ARCH_INTEGRATOR_CP)       += integrator_cp.o
 
-obj-$(CONFIG_PCI)                      += pci_v3.o pci.o
+obj-$(CONFIG_PCI)                      += pci_v3.o
 obj-$(CONFIG_INTEGRATOR_IMPD1)         += impd1.o
index be5859efe10ee9c9c178a8f6363e0613300adbfa..306d025d9730dcf01fcf4259bd54cf0c29875854 100644 (file)
 
 /* KMI definitions are now in include/asm-arm/hardware/amba_kmi.h -- rmk */
 
-/* ------------------------------------------------------------------------
- *  Where in the memory map does PCI live?
- * ------------------------------------------------------------------------
- *  This represents a fairly liberal usage of address space.  Even though
- *  the V3 only has two windows (therefore we need to map stuff on the fly),
- *  we maintain the same addresses, even if they're not mapped.
- *
- */
-#define PHYS_PCI_MEM_BASE               0x40000000   /* 512M to xxx */
-/*  unused 256M from A0000000-AFFFFFFF might be used for I2O ???
- */
-#define PHYS_PCI_IO_BASE                0x60000000   /* 16M to xxx */
-/*  unused (128-16)M from B1000000-B7FFFFFF
- */
-#define PHYS_PCI_CONFIG_BASE            0x61000000   /* 16M to xxx */
-/*  unused ((128-16)M - 64K) from XXX
- */
-#define PHYS_PCI_V3_BASE                0x62000000
-
-#define PCI_MEMORY_VADDR               IOMEM(0xe8000000)
-#define PCI_CONFIG_VADDR               IOMEM(0xec000000)
-#define PCI_V3_VADDR                   IOMEM(0xed000000)
-
 /* ------------------------------------------------------------------------
  *  Integrator Interrupt Controllers
  * ------------------------------------------------------------------------
index b23c8e4f28e859180b90d04fb1a7c8b79e619b69..a5b15c4e8def4ec0d833f5224215b8f0ff688d0a 100644 (file)
@@ -41,7 +41,6 @@
 #include <linux/stat.h>
 #include <linux/sys_soc.h>
 #include <linux/termios.h>
-#include <video/vga.h>
 
 #include <mach/hardware.h>
 #include <mach/platform.h>
 #include <asm/mach/arch.h>
 #include <asm/mach/irq.h>
 #include <asm/mach/map.h>
-#include <asm/mach/pci.h>
 #include <asm/mach/time.h>
 
 #include "common.h"
+#include "pci_v3.h"
 
 /* Base address to the AP system controller */
 void __iomem *ap_syscon_base;
@@ -78,10 +77,6 @@ void __iomem *ap_syscon_base;
 
 /*
  * Logical      Physical
- * e8000000    40000000        PCI memory              PHYS_PCI_MEM_BASE       (max 512M)
- * ec000000    61000000        PCI config space        PHYS_PCI_CONFIG_BASE    (max 16M)
- * ed000000    62000000        PCI V3 regs             PHYS_PCI_V3_BASE        (max 64k)
- * fee00000    60000000        PCI IO                  PHYS_PCI_IO_BASE        (max 16M)
  * ef000000                    Cache flush
  * f1000000    10000000        Core module registers
  * f1100000    11000000        System controller registers
@@ -130,29 +125,13 @@ static struct map_desc ap_io_desc[] __initdata __maybe_unused = {
                .pfn            = __phys_to_pfn(INTEGRATOR_AP_GPIO_BASE),
                .length         = SZ_4K,
                .type           = MT_DEVICE
-       }, {
-               .virtual        = (unsigned long)PCI_MEMORY_VADDR,
-               .pfn            = __phys_to_pfn(PHYS_PCI_MEM_BASE),
-               .length         = SZ_16M,
-               .type           = MT_DEVICE
-       }, {
-               .virtual        = (unsigned long)PCI_CONFIG_VADDR,
-               .pfn            = __phys_to_pfn(PHYS_PCI_CONFIG_BASE),
-               .length         = SZ_16M,
-               .type           = MT_DEVICE
-       }, {
-               .virtual        = (unsigned long)PCI_V3_VADDR,
-               .pfn            = __phys_to_pfn(PHYS_PCI_V3_BASE),
-               .length         = SZ_64K,
-               .type           = MT_DEVICE
        }
 };
 
 static void __init ap_map_io(void)
 {
        iotable_init(ap_io_desc, ARRAY_SIZE(ap_io_desc));
-       vga_base = (unsigned long)PCI_MEMORY_VADDR;
-       pci_map_io_early(__phys_to_pfn(PHYS_PCI_IO_BASE));
+       pci_v3_early_init();
 }
 
 #ifdef CONFIG_PM
@@ -615,6 +594,11 @@ static void __init ap_map_io_atag(void)
  * for eventual deletion.
  */
 
+static struct platform_device pci_v3_device = {
+       .name           = "pci-v3",
+       .id             = 0,
+};
+
 static struct resource cfi_flash_resource = {
        .start          = INTEGRATOR_FLASH_BASE,
        .end            = INTEGRATOR_FLASH_BASE + INTEGRATOR_FLASH_SIZE - 1,
@@ -672,6 +656,7 @@ static void __init ap_init(void)
        unsigned long sc_dec;
        int i;
 
+       platform_device_register(&pci_v3_device);
        platform_device_register(&cfi_flash_device);
 
        ap_syscon_base = __io_address(INTEGRATOR_SC_BASE);
diff --git a/arch/arm/mach-integrator/pci.c b/arch/arm/mach-integrator/pci.c
deleted file mode 100644 (file)
index 6c1667e..0000000
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- *  linux/arch/arm/mach-integrator/pci-integrator.c
- *
- *  Copyright (C) 1999 ARM Limited
- *  Copyright (C) 2000 Deep Blue Solutions Ltd
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * 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
- *
- *
- *  PCI functions for Integrator
- */
-#include <linux/kernel.h>
-#include <linux/pci.h>
-#include <linux/interrupt.h>
-#include <linux/init.h>
-
-#include <asm/mach/pci.h>
-#include <asm/mach-types.h>
-
-#include <mach/irqs.h>
-
-/* 
- * A small note about bridges and interrupts.  The DECchip 21050 (and
- * later) adheres to the PCI-PCI bridge specification.  This says that
- * the interrupts on the other side of a bridge are swizzled in the
- * following manner:
- *
- * Dev    Interrupt   Interrupt 
- *        Pin on      Pin on 
- *        Device      Connector
- *
- *   4    A           A
- *        B           B
- *        C           C
- *        D           D
- * 
- *   5    A           B
- *        B           C
- *        C           D
- *        D           A
- *
- *   6    A           C
- *        B           D
- *        C           A
- *        D           B
- *
- *   7    A           D
- *        B           A
- *        C           B
- *        D           C
- *
- * Where A = pin 1, B = pin 2 and so on and pin=0 = default = A.
- * Thus, each swizzle is ((pin-1) + (device#-4)) % 4
- */
-
-/*
- * This routine handles multiple bridges.
- */
-static u8 __init integrator_swizzle(struct pci_dev *dev, u8 *pinp)
-{
-       if (*pinp == 0)
-               *pinp = 1;
-
-       return pci_common_swizzle(dev, pinp);
-}
-
-static int irq_tab[4] __initdata = {
-       IRQ_AP_PCIINT0, IRQ_AP_PCIINT1, IRQ_AP_PCIINT2, IRQ_AP_PCIINT3
-};
-
-/*
- * map the specified device/slot/pin to an IRQ.  This works out such
- * that slot 9 pin 1 is INT0, pin 2 is INT1, and slot 10 pin 1 is INT1.
- */
-static int __init integrator_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
-{
-       int intnr = ((slot - 9) + (pin - 1)) & 3;
-
-       return irq_tab[intnr];
-}
-
-extern void pci_v3_init(void *);
-
-static struct hw_pci integrator_pci __initdata = {
-       .swizzle                = integrator_swizzle,
-       .map_irq                = integrator_map_irq,
-       .setup                  = pci_v3_setup,
-       .nr_controllers         = 1,
-       .ops                    = &pci_v3_ops,
-       .preinit                = pci_v3_preinit,
-       .postinit               = pci_v3_postinit,
-};
-
-static int __init integrator_pci_init(void)
-{
-       if (machine_is_integrator())
-               pci_common_init(&integrator_pci);
-       return 0;
-}
-
-subsys_initcall(integrator_pci_init);
index e7fcea7f33008b3e8ee5c3288475a726fd88c13d..a0e069d37e148d5f79aeef3c56d1d3287da610c0 100644 (file)
 #include <linux/spinlock.h>
 #include <linux/init.h>
 #include <linux/io.h>
+#include <linux/platform_device.h>
+#include <linux/of.h>
+#include <linux/of_address.h>
+#include <linux/of_irq.h>
+#include <linux/of_pci.h>
+#include <video/vga.h>
 
 #include <mach/hardware.h>
 #include <mach/platform.h>
 #include <mach/irqs.h>
 
+#include <asm/mach/map.h>
 #include <asm/signal.h>
 #include <asm/mach/pci.h>
 #include <asm/irq_regs.h>
 
-#include <asm/hardware/pci_v3.h>
+#include "pci_v3.h"
+
+/*
+ * Where in the memory map does PCI live?
+ *
+ * This represents a fairly liberal usage of address space.  Even though
+ * the V3 only has two windows (therefore we need to map stuff on the fly),
+ * we maintain the same addresses, even if they're not mapped.
+ */
+#define PHYS_PCI_MEM_BASE               0x40000000 /* 512M */
+#define PHYS_PCI_IO_BASE                0x60000000 /* 16M */
+#define PHYS_PCI_CONFIG_BASE            0x61000000 /* 16M */
+#define PHYS_PCI_V3_BASE                0x62000000 /* 64K */
+
+#define PCI_MEMORY_VADDR               IOMEM(0xe8000000)
+#define PCI_CONFIG_VADDR               IOMEM(0xec000000)
+
+/*
+ * V3 Local Bus to PCI Bridge definitions
+ *
+ * Registers (these are taken from page 129 of the EPC User's Manual Rev 1.04
+ * All V3 register names are prefaced by V3_ to avoid clashing with any other
+ * PCI definitions.  Their names match the user's manual.
+ *
+ * I'm assuming that I20 is disabled.
+ *
+ */
+#define V3_PCI_VENDOR                   0x00000000
+#define V3_PCI_DEVICE                   0x00000002
+#define V3_PCI_CMD                      0x00000004
+#define V3_PCI_STAT                     0x00000006
+#define V3_PCI_CC_REV                   0x00000008
+#define V3_PCI_HDR_CFG                  0x0000000C
+#define V3_PCI_IO_BASE                  0x00000010
+#define V3_PCI_BASE0                    0x00000014
+#define V3_PCI_BASE1                    0x00000018
+#define V3_PCI_SUB_VENDOR               0x0000002C
+#define V3_PCI_SUB_ID                   0x0000002E
+#define V3_PCI_ROM                      0x00000030
+#define V3_PCI_BPARAM                   0x0000003C
+#define V3_PCI_MAP0                     0x00000040
+#define V3_PCI_MAP1                     0x00000044
+#define V3_PCI_INT_STAT                 0x00000048
+#define V3_PCI_INT_CFG                  0x0000004C
+#define V3_LB_BASE0                     0x00000054
+#define V3_LB_BASE1                     0x00000058
+#define V3_LB_MAP0                      0x0000005E
+#define V3_LB_MAP1                      0x00000062
+#define V3_LB_BASE2                     0x00000064
+#define V3_LB_MAP2                      0x00000066
+#define V3_LB_SIZE                      0x00000068
+#define V3_LB_IO_BASE                   0x0000006E
+#define V3_FIFO_CFG                     0x00000070
+#define V3_FIFO_PRIORITY                0x00000072
+#define V3_FIFO_STAT                    0x00000074
+#define V3_LB_ISTAT                     0x00000076
+#define V3_LB_IMASK                     0x00000077
+#define V3_SYSTEM                       0x00000078
+#define V3_LB_CFG                       0x0000007A
+#define V3_PCI_CFG                      0x0000007C
+#define V3_DMA_PCI_ADR0                 0x00000080
+#define V3_DMA_PCI_ADR1                 0x00000090
+#define V3_DMA_LOCAL_ADR0               0x00000084
+#define V3_DMA_LOCAL_ADR1               0x00000094
+#define V3_DMA_LENGTH0                  0x00000088
+#define V3_DMA_LENGTH1                  0x00000098
+#define V3_DMA_CSR0                     0x0000008B
+#define V3_DMA_CSR1                     0x0000009B
+#define V3_DMA_CTLB_ADR0                0x0000008C
+#define V3_DMA_CTLB_ADR1                0x0000009C
+#define V3_DMA_DELAY                    0x000000E0
+#define V3_MAIL_DATA                    0x000000C0
+#define V3_PCI_MAIL_IEWR                0x000000D0
+#define V3_PCI_MAIL_IERD                0x000000D2
+#define V3_LB_MAIL_IEWR                 0x000000D4
+#define V3_LB_MAIL_IERD                 0x000000D6
+#define V3_MAIL_WR_STAT                 0x000000D8
+#define V3_MAIL_RD_STAT                 0x000000DA
+#define V3_QBA_MAP                      0x000000DC
+
+/*  PCI COMMAND REGISTER bits
+ */
+#define V3_COMMAND_M_FBB_EN             (1 << 9)
+#define V3_COMMAND_M_SERR_EN            (1 << 8)
+#define V3_COMMAND_M_PAR_EN             (1 << 6)
+#define V3_COMMAND_M_MASTER_EN          (1 << 2)
+#define V3_COMMAND_M_MEM_EN             (1 << 1)
+#define V3_COMMAND_M_IO_EN              (1 << 0)
+
+/*  SYSTEM REGISTER bits
+ */
+#define V3_SYSTEM_M_RST_OUT             (1 << 15)
+#define V3_SYSTEM_M_LOCK                (1 << 14)
+
+/*  PCI_CFG bits
+ */
+#define V3_PCI_CFG_M_I2O_EN            (1 << 15)
+#define V3_PCI_CFG_M_IO_REG_DIS                (1 << 14)
+#define V3_PCI_CFG_M_IO_DIS            (1 << 13)
+#define V3_PCI_CFG_M_EN3V              (1 << 12)
+#define V3_PCI_CFG_M_RETRY_EN           (1 << 10)
+#define V3_PCI_CFG_M_AD_LOW1            (1 << 9)
+#define V3_PCI_CFG_M_AD_LOW0            (1 << 8)
+
+/*  PCI_BASE register bits (PCI -> Local Bus)
+ */
+#define V3_PCI_BASE_M_ADR_BASE          0xFFF00000
+#define V3_PCI_BASE_M_ADR_BASEL         0x000FFF00
+#define V3_PCI_BASE_M_PREFETCH          (1 << 3)
+#define V3_PCI_BASE_M_TYPE              (3 << 1)
+#define V3_PCI_BASE_M_IO                (1 << 0)
+
+/*  PCI MAP register bits (PCI -> Local bus)
+ */
+#define V3_PCI_MAP_M_MAP_ADR            0xFFF00000
+#define V3_PCI_MAP_M_RD_POST_INH        (1 << 15)
+#define V3_PCI_MAP_M_ROM_SIZE           (3 << 10)
+#define V3_PCI_MAP_M_SWAP               (3 << 8)
+#define V3_PCI_MAP_M_ADR_SIZE           0x000000F0
+#define V3_PCI_MAP_M_REG_EN             (1 << 1)
+#define V3_PCI_MAP_M_ENABLE             (1 << 0)
+
+/*
+ *  LB_BASE0,1 register bits (Local bus -> PCI)
+ */
+#define V3_LB_BASE_ADR_BASE            0xfff00000
+#define V3_LB_BASE_SWAP                        (3 << 8)
+#define V3_LB_BASE_ADR_SIZE            (15 << 4)
+#define V3_LB_BASE_PREFETCH            (1 << 3)
+#define V3_LB_BASE_ENABLE              (1 << 0)
+
+#define V3_LB_BASE_ADR_SIZE_1MB                (0 << 4)
+#define V3_LB_BASE_ADR_SIZE_2MB                (1 << 4)
+#define V3_LB_BASE_ADR_SIZE_4MB                (2 << 4)
+#define V3_LB_BASE_ADR_SIZE_8MB                (3 << 4)
+#define V3_LB_BASE_ADR_SIZE_16MB       (4 << 4)
+#define V3_LB_BASE_ADR_SIZE_32MB       (5 << 4)
+#define V3_LB_BASE_ADR_SIZE_64MB       (6 << 4)
+#define V3_LB_BASE_ADR_SIZE_128MB      (7 << 4)
+#define V3_LB_BASE_ADR_SIZE_256MB      (8 << 4)
+#define V3_LB_BASE_ADR_SIZE_512MB      (9 << 4)
+#define V3_LB_BASE_ADR_SIZE_1GB                (10 << 4)
+#define V3_LB_BASE_ADR_SIZE_2GB                (11 << 4)
+
+#define v3_addr_to_lb_base(a)  ((a) & V3_LB_BASE_ADR_BASE)
+
+/*
+ *  LB_MAP0,1 register bits (Local bus -> PCI)
+ */
+#define V3_LB_MAP_MAP_ADR              0xfff0
+#define V3_LB_MAP_TYPE                 (7 << 1)
+#define V3_LB_MAP_AD_LOW_EN            (1 << 0)
+
+#define V3_LB_MAP_TYPE_IACK            (0 << 1)
+#define V3_LB_MAP_TYPE_IO              (1 << 1)
+#define V3_LB_MAP_TYPE_MEM             (3 << 1)
+#define V3_LB_MAP_TYPE_CONFIG          (5 << 1)
+#define V3_LB_MAP_TYPE_MEM_MULTIPLE    (6 << 1)
+
+#define v3_addr_to_lb_map(a)   (((a) >> 16) & V3_LB_MAP_MAP_ADR)
+
+/*
+ *  LB_BASE2 register bits (Local bus -> PCI IO)
+ */
+#define V3_LB_BASE2_ADR_BASE           0xff00
+#define V3_LB_BASE2_SWAP               (3 << 6)
+#define V3_LB_BASE2_ENABLE             (1 << 0)
+
+#define v3_addr_to_lb_base2(a) (((a) >> 16) & V3_LB_BASE2_ADR_BASE)
+
+/*
+ *  LB_MAP2 register bits (Local bus -> PCI IO)
+ */
+#define V3_LB_MAP2_MAP_ADR             0xff00
+
+#define v3_addr_to_lb_map2(a)  (((a) >> 16) & V3_LB_MAP2_MAP_ADR)
 
 /*
  * The V3 PCI interface chip in Integrator provides several windows from
  * the mappings into PCI memory.
  */
 
+/* Filled in by probe */
+static void __iomem *pci_v3_base;
+static struct resource conf_mem; /* FIXME: remap this instead of static map */
+static struct resource io_mem;
+static struct resource non_mem;
+static struct resource pre_mem;
+
 // V3 access routines
-#define v3_writeb(o,v) __raw_writeb(v, PCI_V3_VADDR + (unsigned int)(o))
-#define v3_readb(o)    (__raw_readb(PCI_V3_VADDR + (unsigned int)(o)))
+#define v3_writeb(o,v) __raw_writeb(v, pci_v3_base + (unsigned int)(o))
+#define v3_readb(o)    (__raw_readb(pci_v3_base + (unsigned int)(o)))
 
-#define v3_writew(o,v) __raw_writew(v, PCI_V3_VADDR + (unsigned int)(o))
-#define v3_readw(o)    (__raw_readw(PCI_V3_VADDR + (unsigned int)(o)))
+#define v3_writew(o,v) __raw_writew(v, pci_v3_base + (unsigned int)(o))
+#define v3_readw(o)    (__raw_readw(pci_v3_base + (unsigned int)(o)))
 
-#define v3_writel(o,v) __raw_writel(v, PCI_V3_VADDR + (unsigned int)(o))
-#define v3_readl(o)    (__raw_readl(PCI_V3_VADDR + (unsigned int)(o)))
+#define v3_writel(o,v) __raw_writel(v, pci_v3_base + (unsigned int)(o))
+#define v3_readl(o)    (__raw_readl(pci_v3_base + (unsigned int)(o)))
 
 /*============================================================================
  *
@@ -243,13 +432,13 @@ static void __iomem *v3_open_config_window(struct pci_bus *bus,
         * prefetchable), this frees up base1 for re-use by
         * configuration memory
         */
-       v3_writel(V3_LB_BASE0, v3_addr_to_lb_base(PHYS_PCI_MEM_BASE) |
+       v3_writel(V3_LB_BASE0, v3_addr_to_lb_base(non_mem.start) |
                        V3_LB_BASE_ADR_SIZE_512MB | V3_LB_BASE_ENABLE);
 
        /*
         * Set up base1/map1 to point into configuration space.
         */
-       v3_writel(V3_LB_BASE1, v3_addr_to_lb_base(PHYS_PCI_CONFIG_BASE) |
+       v3_writel(V3_LB_BASE1, v3_addr_to_lb_base(conf_mem.start) |
                        V3_LB_BASE_ADR_SIZE_16MB | V3_LB_BASE_ENABLE);
        v3_writew(V3_LB_MAP1, mapaddress);
 
@@ -261,7 +450,7 @@ static void v3_close_config_window(void)
        /*
         * Reassign base1 for use by prefetchable PCI memory
         */
-       v3_writel(V3_LB_BASE1, v3_addr_to_lb_base(PHYS_PCI_MEM_BASE + SZ_256M) |
+       v3_writel(V3_LB_BASE1, v3_addr_to_lb_base(pre_mem.start) |
                        V3_LB_BASE_ADR_SIZE_256MB | V3_LB_BASE_PREFETCH |
                        V3_LB_BASE_ENABLE);
        v3_writew(V3_LB_MAP1, v3_addr_to_lb_map(PCI_BUS_PREMEM_START) |
@@ -270,7 +459,7 @@ static void v3_close_config_window(void)
        /*
         * And shrink base0 back to a 256M window (NOTE: MAP0 already correct)
         */
-       v3_writel(V3_LB_BASE0, v3_addr_to_lb_base(PHYS_PCI_MEM_BASE) |
+       v3_writel(V3_LB_BASE0, v3_addr_to_lb_base(non_mem.start) |
                        V3_LB_BASE_ADR_SIZE_256MB | V3_LB_BASE_ENABLE);
 }
 
@@ -337,25 +526,11 @@ static int v3_write_config(struct pci_bus *bus, unsigned int devfn, int where,
        return PCIBIOS_SUCCESSFUL;
 }
 
-struct pci_ops pci_v3_ops = {
+static struct pci_ops pci_v3_ops = {
        .read   = v3_read_config,
        .write  = v3_write_config,
 };
 
-static struct resource non_mem = {
-       .name   = "PCI non-prefetchable",
-       .start  = PHYS_PCI_MEM_BASE + PCI_BUS_NONMEM_START,
-       .end    = PHYS_PCI_MEM_BASE + PCI_BUS_NONMEM_START + PCI_BUS_NONMEM_SIZE - 1,
-       .flags  = IORESOURCE_MEM,
-};
-
-static struct resource pre_mem = {
-       .name   = "PCI prefetchable",
-       .start  = PHYS_PCI_MEM_BASE + PCI_BUS_PREMEM_START,
-       .end    = PHYS_PCI_MEM_BASE + PCI_BUS_PREMEM_START + PCI_BUS_PREMEM_SIZE - 1,
-       .flags  = IORESOURCE_MEM | IORESOURCE_PREFETCH,
-};
-
 static int __init pci_v3_setup_resources(struct pci_sys_data *sys)
 {
        if (request_resource(&iomem_resource, &non_mem)) {
@@ -471,7 +646,7 @@ static irqreturn_t v3_irq(int dummy, void *devid)
        return IRQ_HANDLED;
 }
 
-int __init pci_v3_setup(int nr, struct pci_sys_data *sys)
+static int __init pci_v3_setup(int nr, struct pci_sys_data *sys)
 {
        int ret = 0;
 
@@ -479,7 +654,7 @@ int __init pci_v3_setup(int nr, struct pci_sys_data *sys)
                return -EINVAL;
 
        if (nr == 0) {
-               sys->mem_offset = PHYS_PCI_MEM_BASE;
+               sys->mem_offset = non_mem.start;
                ret = pci_v3_setup_resources(sys);
        }
 
@@ -490,18 +665,10 @@ int __init pci_v3_setup(int nr, struct pci_sys_data *sys)
  * V3_LB_BASE? - local bus address
  * V3_LB_MAP?  - pci bus address
  */
-void __init pci_v3_preinit(void)
+static void __init pci_v3_preinit(void)
 {
        unsigned long flags;
        unsigned int temp;
-       int ret;
-
-       /* Remap the Integrator system controller */
-       ap_syscon_base = ioremap(INTEGRATOR_SC_BASE, 0x100);
-       if (!ap_syscon_base) {
-               pr_err("unable to remap the AP syscon for PCIv3\n");
-               return;
-       }
 
        pcibios_min_mem = 0x00100000;
 
@@ -525,7 +692,7 @@ void __init pci_v3_preinit(void)
         * Setup window 0 - PCI non-prefetchable memory
         *  Local: 0x40000000 Bus: 0x00000000 Size: 256MB
         */
-       v3_writel(V3_LB_BASE0, v3_addr_to_lb_base(PHYS_PCI_MEM_BASE) |
+       v3_writel(V3_LB_BASE0, v3_addr_to_lb_base(non_mem.start) |
                        V3_LB_BASE_ADR_SIZE_256MB | V3_LB_BASE_ENABLE);
        v3_writew(V3_LB_MAP0, v3_addr_to_lb_map(PCI_BUS_NONMEM_START) |
                        V3_LB_MAP_TYPE_MEM);
@@ -534,7 +701,7 @@ void __init pci_v3_preinit(void)
         * Setup window 1 - PCI prefetchable memory
         *  Local: 0x50000000 Bus: 0x10000000 Size: 256MB
         */
-       v3_writel(V3_LB_BASE1, v3_addr_to_lb_base(PHYS_PCI_MEM_BASE + SZ_256M) |
+       v3_writel(V3_LB_BASE1, v3_addr_to_lb_base(pre_mem.start) |
                        V3_LB_BASE_ADR_SIZE_256MB | V3_LB_BASE_PREFETCH |
                        V3_LB_BASE_ENABLE);
        v3_writew(V3_LB_MAP1, v3_addr_to_lb_map(PCI_BUS_PREMEM_START) |
@@ -543,7 +710,7 @@ void __init pci_v3_preinit(void)
        /*
         * Setup window 2 - PCI IO
         */
-       v3_writel(V3_LB_BASE2, v3_addr_to_lb_base2(PHYS_PCI_IO_BASE) |
+       v3_writel(V3_LB_BASE2, v3_addr_to_lb_base2(io_mem.start) |
                        V3_LB_BASE_ENABLE);
        v3_writew(V3_LB_MAP2, v3_addr_to_lb_map2(0));
 
@@ -578,18 +745,10 @@ void __init pci_v3_preinit(void)
        v3_writeb(V3_LB_IMASK, 0x28);
        __raw_writel(3, ap_syscon_base + INTEGRATOR_SC_PCIENABLE_OFFSET);
 
-       /*
-        * Grab the PCI error interrupt.
-        */
-       ret = request_irq(IRQ_AP_V3INT, v3_irq, 0, "V3", NULL);
-       if (ret)
-               printk(KERN_ERR "PCI: unable to grab PCI error "
-                      "interrupt: %d\n", ret);
-
        raw_spin_unlock_irqrestore(&v3_lock, flags);
 }
 
-void __init pci_v3_postinit(void)
+static void __init pci_v3_postinit(void)
 {
        unsigned int pci_cmd;
 
@@ -608,5 +767,278 @@ void __init pci_v3_postinit(void)
                       "interrupt: %d\n", ret);
 #endif
 
-       register_isa_ports(PHYS_PCI_MEM_BASE, PHYS_PCI_IO_BASE, 0);
+       register_isa_ports(non_mem.start, io_mem.start, 0);
+}
+
+/*
+ * A small note about bridges and interrupts.  The DECchip 21050 (and
+ * later) adheres to the PCI-PCI bridge specification.  This says that
+ * the interrupts on the other side of a bridge are swizzled in the
+ * following manner:
+ *
+ * Dev    Interrupt   Interrupt
+ *        Pin on      Pin on
+ *        Device      Connector
+ *
+ *   4    A           A
+ *        B           B
+ *        C           C
+ *        D           D
+ *
+ *   5    A           B
+ *        B           C
+ *        C           D
+ *        D           A
+ *
+ *   6    A           C
+ *        B           D
+ *        C           A
+ *        D           B
+ *
+ *   7    A           D
+ *        B           A
+ *        C           B
+ *        D           C
+ *
+ * Where A = pin 1, B = pin 2 and so on and pin=0 = default = A.
+ * Thus, each swizzle is ((pin-1) + (device#-4)) % 4
+ */
+
+/*
+ * This routine handles multiple bridges.
+ */
+static u8 __init pci_v3_swizzle(struct pci_dev *dev, u8 *pinp)
+{
+       if (*pinp == 0)
+               *pinp = 1;
+
+       return pci_common_swizzle(dev, pinp);
+}
+
+static int irq_tab[4] __initdata = {
+       IRQ_AP_PCIINT0, IRQ_AP_PCIINT1, IRQ_AP_PCIINT2, IRQ_AP_PCIINT3
+};
+
+/*
+ * map the specified device/slot/pin to an IRQ.  This works out such
+ * that slot 9 pin 1 is INT0, pin 2 is INT1, and slot 10 pin 1 is INT1.
+ */
+static int __init pci_v3_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
+{
+       int intnr = ((slot - 9) + (pin - 1)) & 3;
+
+       return irq_tab[intnr];
+}
+
+static struct hw_pci pci_v3 __initdata = {
+       .swizzle                = pci_v3_swizzle,
+       .setup                  = pci_v3_setup,
+       .nr_controllers         = 1,
+       .ops                    = &pci_v3_ops,
+       .preinit                = pci_v3_preinit,
+       .postinit               = pci_v3_postinit,
+};
+
+#ifdef CONFIG_OF
+
+static int __init pci_v3_map_irq_dt(const struct pci_dev *dev, u8 slot, u8 pin)
+{
+       struct of_irq oirq;
+       int ret;
+
+       ret = of_irq_map_pci(dev, &oirq);
+       if (ret) {
+               dev_err(&dev->dev, "of_irq_map_pci() %d\n", ret);
+               /* Proper return code 0 == NO_IRQ */
+               return 0;
+       }
+
+       return irq_create_of_mapping(oirq.controller, oirq.specifier,
+                                    oirq.size);
+}
+
+static int __init pci_v3_dtprobe(struct platform_device *pdev,
+                               struct device_node *np)
+{
+       struct of_pci_range_parser parser;
+       struct of_pci_range range;
+       struct resource *res;
+       int irq, ret;
+
+       if (of_pci_range_parser_init(&parser, np))
+               return -EINVAL;
+
+       /* Get base for bridge registers */
+       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       if (!res) {
+               dev_err(&pdev->dev, "unable to obtain PCIv3 base\n");
+               return -ENODEV;
+       }
+       pci_v3_base = devm_ioremap(&pdev->dev, res->start,
+                                  resource_size(res));
+       if (!pci_v3_base) {
+               dev_err(&pdev->dev, "unable to remap PCIv3 base\n");
+               return -ENODEV;
+       }
+
+       /* Get and request error IRQ resource */
+       irq = platform_get_irq(pdev, 0);
+       if (irq <= 0) {
+               dev_err(&pdev->dev, "unable to obtain PCIv3 error IRQ\n");
+               return -ENODEV;
+       }
+       ret = devm_request_irq(&pdev->dev, irq, v3_irq, 0,
+                       "PCIv3 error", NULL);
+       if (ret < 0) {
+               dev_err(&pdev->dev, "unable to request PCIv3 error IRQ %d (%d)\n", irq, ret);
+               return ret;
+       }
+
+       for_each_of_pci_range(&parser, &range) {
+               if (!range.flags) {
+                       of_pci_range_to_resource(&range, np, &conf_mem);
+                       conf_mem.name = "PCIv3 config";
+               }
+               if (range.flags & IORESOURCE_IO) {
+                       of_pci_range_to_resource(&range, np, &io_mem);
+                       io_mem.name = "PCIv3 I/O";
+               }
+               if ((range.flags & IORESOURCE_MEM) &&
+                       !(range.flags & IORESOURCE_PREFETCH)) {
+                       of_pci_range_to_resource(&range, np, &non_mem);
+                       non_mem.name = "PCIv3 non-prefetched mem";
+               }
+               if ((range.flags & IORESOURCE_MEM) &&
+                       (range.flags & IORESOURCE_PREFETCH)) {
+                       of_pci_range_to_resource(&range, np, &pre_mem);
+                       pre_mem.name = "PCIv3 prefetched mem";
+               }
+       }
+
+       if (!conf_mem.start || !io_mem.start ||
+           !non_mem.start || !pre_mem.start) {
+               dev_err(&pdev->dev, "missing ranges in device node\n");
+               return -EINVAL;
+       }
+
+       pci_v3.map_irq = pci_v3_map_irq_dt;
+       pci_common_init_dev(&pdev->dev, &pci_v3);
+
+       return 0;
+}
+
+#else
+
+static inline int pci_v3_dtprobe(struct platform_device *pdev,
+                                 struct device_node *np)
+{
+       return -EINVAL;
+}
+
+#endif
+
+static int __init pci_v3_probe(struct platform_device *pdev)
+{
+       struct device_node *np = pdev->dev.of_node;
+       int ret;
+
+       /* Remap the Integrator system controller */
+       ap_syscon_base = ioremap(INTEGRATOR_SC_BASE, 0x100);
+       if (!ap_syscon_base) {
+               dev_err(&pdev->dev, "unable to remap the AP syscon for PCIv3\n");
+               return -ENODEV;
+       }
+
+       /* Device tree probe path */
+       if (np)
+               return pci_v3_dtprobe(pdev, np);
+
+       pci_v3_base = devm_ioremap(&pdev->dev, PHYS_PCI_V3_BASE, SZ_64K);
+       if (!pci_v3_base) {
+               dev_err(&pdev->dev, "unable to remap PCIv3 base\n");
+               return -ENODEV;
+       }
+
+       ret = devm_request_irq(&pdev->dev, IRQ_AP_V3INT, v3_irq, 0, "V3", NULL);
+       if (ret) {
+               dev_err(&pdev->dev, "unable to grab PCI error interrupt: %d\n",
+                       ret);
+               return -ENODEV;
+       }
+
+       conf_mem.name = "PCIv3 config";
+       conf_mem.start = PHYS_PCI_CONFIG_BASE;
+       conf_mem.end = PHYS_PCI_CONFIG_BASE + SZ_16M - 1;
+       conf_mem.flags = IORESOURCE_MEM;
+
+       io_mem.name = "PCIv3 I/O";
+       io_mem.start = PHYS_PCI_IO_BASE;
+       io_mem.end = PHYS_PCI_IO_BASE + SZ_16M - 1;
+       io_mem.flags = IORESOURCE_MEM;
+
+       non_mem.name = "PCIv3 non-prefetched mem";
+       non_mem.start = PHYS_PCI_MEM_BASE + PCI_BUS_NONMEM_START;
+       non_mem.end = PHYS_PCI_MEM_BASE + PCI_BUS_NONMEM_START +
+               PCI_BUS_NONMEM_SIZE - 1;
+       non_mem.flags = IORESOURCE_MEM;
+
+       pre_mem.name = "PCIv3 prefetched mem";
+       pre_mem.start = PHYS_PCI_MEM_BASE + PCI_BUS_PREMEM_START;
+       pre_mem.end = PHYS_PCI_MEM_BASE + PCI_BUS_PREMEM_START +
+               PCI_BUS_PREMEM_SIZE - 1;
+       pre_mem.flags = IORESOURCE_MEM | IORESOURCE_PREFETCH;
+
+       pci_v3.map_irq = pci_v3_map_irq;
+
+       pci_common_init_dev(&pdev->dev, &pci_v3);
+
+       return 0;
+}
+
+static const struct of_device_id pci_ids[] = {
+       { .compatible = "v3,v360epc-pci", },
+       {},
+};
+
+static struct platform_driver pci_v3_driver = {
+       .driver = {
+               .name = "pci-v3",
+               .of_match_table = pci_ids,
+       },
+};
+
+static int __init pci_v3_init(void)
+{
+       return platform_driver_probe(&pci_v3_driver, pci_v3_probe);
+}
+
+subsys_initcall(pci_v3_init);
+
+/*
+ * Static mappings for the PCIv3 bridge
+ *
+ * e8000000    40000000        PCI memory              PHYS_PCI_MEM_BASE       (max 512M)
+ * ec000000    61000000        PCI config space        PHYS_PCI_CONFIG_BASE    (max 16M)
+ * fee00000    60000000        PCI IO                  PHYS_PCI_IO_BASE        (max 16M)
+ */
+static struct map_desc pci_v3_io_desc[] __initdata __maybe_unused = {
+       {
+               .virtual        = (unsigned long)PCI_MEMORY_VADDR,
+               .pfn            = __phys_to_pfn(PHYS_PCI_MEM_BASE),
+               .length         = SZ_16M,
+               .type           = MT_DEVICE
+       }, {
+               .virtual        = (unsigned long)PCI_CONFIG_VADDR,
+               .pfn            = __phys_to_pfn(PHYS_PCI_CONFIG_BASE),
+               .length         = SZ_16M,
+               .type           = MT_DEVICE
+       }
+};
+
+int __init pci_v3_early_init(void)
+{
+       iotable_init(pci_v3_io_desc, ARRAY_SIZE(pci_v3_io_desc));
+       vga_base = (unsigned long)PCI_MEMORY_VADDR;
+       pci_map_io_early(__phys_to_pfn(PHYS_PCI_IO_BASE));
+       return 0;
 }
diff --git a/arch/arm/mach-integrator/pci_v3.h b/arch/arm/mach-integrator/pci_v3.h
new file mode 100644 (file)
index 0000000..755fd29
--- /dev/null
@@ -0,0 +1,2 @@
+/* Simple oneliner include to the PCIv3 early init */
+extern int pci_v3_early_init(void);
diff --git a/arch/arm/mach-keystone/Kconfig b/arch/arm/mach-keystone/Kconfig
new file mode 100644 (file)
index 0000000..2dbd4ce
--- /dev/null
@@ -0,0 +1,15 @@
+config ARCH_KEYSTONE
+       bool "Texas Instruments Keystone Devices"
+       depends on ARCH_MULTI_V7
+       select CPU_V7
+       select ARM_GIC
+       select HAVE_ARM_ARCH_TIMER
+       select HAVE_SMP
+       select CLKSRC_MMIO
+       select GENERIC_CLOCKEVENTS
+       select HAVE_SCHED_CLOCK
+       select ARCH_WANT_OPTIONAL_GPIOLIB
+       select ARM_ERRATA_798181
+       help
+         Support for boards based on the Texas Instruments Keystone family of
+         SoCs.
diff --git a/arch/arm/mach-keystone/Makefile b/arch/arm/mach-keystone/Makefile
new file mode 100644 (file)
index 0000000..3f6b8ab
--- /dev/null
@@ -0,0 +1,2 @@
+obj-y                                  := keystone.o
+obj-$(CONFIG_SMP)                      += platsmp.o
diff --git a/arch/arm/mach-keystone/Makefile.boot b/arch/arm/mach-keystone/Makefile.boot
new file mode 100644 (file)
index 0000000..f3835c4
--- /dev/null
@@ -0,0 +1 @@
+zreladdr-y     := 0x80008000
diff --git a/arch/arm/mach-keystone/keystone.c b/arch/arm/mach-keystone/keystone.c
new file mode 100644 (file)
index 0000000..fe4d9ff
--- /dev/null
@@ -0,0 +1,75 @@
+/*
+ * Keystone2 based boards and SOC related code.
+ *
+ * Copyright 2013 Texas Instruments, Inc.
+ *     Cyril Chemparathy <cyril@ti.com>
+ *     Santosh Shilimkar <santosh.shillimkar@ti.com>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ */
+#include <linux/io.h>
+#include <linux/of.h>
+#include <linux/init.h>
+#include <linux/of_platform.h>
+#include <linux/of_address.h>
+
+#include <asm/setup.h>
+#include <asm/mach/map.h>
+#include <asm/mach/arch.h>
+#include <asm/mach/time.h>
+#include <asm/smp_plat.h>
+
+#include "keystone.h"
+
+#define PLL_RESET_WRITE_KEY_MASK               0xffff0000
+#define PLL_RESET_WRITE_KEY                    0x5a69
+#define PLL_RESET                              BIT(16)
+
+static void __iomem *keystone_rstctrl;
+
+static void __init keystone_init(void)
+{
+       struct device_node *node;
+
+       node = of_find_compatible_node(NULL, NULL, "ti,keystone-reset");
+       if (WARN_ON(!node))
+               pr_warn("ti,keystone-reset node undefined\n");
+
+       keystone_rstctrl = of_iomap(node, 0);
+       if (WARN_ON(!keystone_rstctrl))
+               pr_warn("ti,keystone-reset iomap error\n");
+
+       of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
+}
+
+static const char *keystone_match[] __initconst = {
+       "ti,keystone-evm",
+       NULL,
+};
+
+void keystone_restart(char mode, const char *cmd)
+{
+       u32 val;
+
+       BUG_ON(!keystone_rstctrl);
+
+       /* Enable write access to RSTCTRL */
+       val = readl(keystone_rstctrl);
+       val &= PLL_RESET_WRITE_KEY_MASK;
+       val |= PLL_RESET_WRITE_KEY;
+       writel(val, keystone_rstctrl);
+
+       /* Reset the SOC */
+       val = readl(keystone_rstctrl);
+       val &= ~PLL_RESET;
+       writel(val, keystone_rstctrl);
+}
+
+DT_MACHINE_START(KEYSTONE, "Keystone")
+       .smp            = smp_ops(keystone_smp_ops),
+       .init_machine   = keystone_init,
+       .dt_compat      = keystone_match,
+       .restart        = keystone_restart,
+MACHINE_END
diff --git a/arch/arm/mach-keystone/keystone.h b/arch/arm/mach-keystone/keystone.h
new file mode 100644 (file)
index 0000000..43a1b47
--- /dev/null
@@ -0,0 +1,17 @@
+/*
+ * Copyright 2013 Texas Instruments, Inc.
+ *     Cyril Chemparathy <cyril@ti.com>
+ *     Santosh Shilimkar <santosh.shillimkar@ti.com>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ */
+
+#ifndef __KEYSTONE_H__
+#define __KEYSTONE_H__
+
+extern struct smp_operations keystone_smp_ops;
+extern void secondary_startup(void);
+
+#endif /* __KEYSTONE_H__ */
diff --git a/arch/arm/mach-keystone/platsmp.c b/arch/arm/mach-keystone/platsmp.c
new file mode 100644 (file)
index 0000000..630ab3b
--- /dev/null
@@ -0,0 +1,52 @@
+/*
+ * Keystone SOC SMP platform code
+ *
+ * Copyright 2013 Texas Instruments, Inc.
+ *     Cyril Chemparathy <cyril@ti.com>
+ *     Santosh Shilimkar <santosh.shillimkar@ti.com>
+ *
+ * Based on platsmp.c, Copyright (C) 2002 ARM Ltd.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ */
+
+#include <linux/init.h>
+#include <linux/smp.h>
+#include <linux/io.h>
+
+#include <asm/smp_plat.h>
+#include <asm/prom.h>
+
+#include "keystone.h"
+
+static int __cpuinit keystone_smp_boot_secondary(unsigned int cpu,
+                                               struct task_struct *idle)
+{
+       unsigned long start = virt_to_phys(&secondary_startup);
+       int error;
+
+       pr_debug("keystone-smp: booting cpu %d, vector %08lx\n",
+                cpu, start);
+
+       asm volatile (
+               "mov    r0, #0\n"       /* power on cmd */
+               "mov    r1, %1\n"       /* cpu          */
+               "mov    r2, %2\n"       /* start        */
+               ".inst  0xe1600070\n"   /* smc #0       */
+               "mov    %0, r0\n"
+               : "=r" (error)
+               : "r"(cpu), "r"(start)
+               : "cc", "r0", "r1", "r2", "memory"
+       );
+
+       pr_debug("keystone-smp: monitor returned %d\n", error);
+
+       return error;
+}
+
+struct smp_operations keystone_smp_ops __initdata = {
+       .smp_init_cpus          = arm_dt_init_cpu_maps,
+       .smp_boot_secondary     = keystone_smp_boot_secondary,
+};
index 7509a89af96704e32b318c787cdb8e3c0fa04e99..e610e137aa3635d345c5683cbf3ca0c596a18c71 100644 (file)
@@ -8,12 +8,6 @@ config MACH_D2NET_V2
          Say 'Y' here if you want your kernel to support the
          LaCie d2 Network v2 NAS.
 
-config MACH_DB88F6281_BP
-       bool "Marvell DB-88F6281-BP Development Board"
-       help
-         Say 'Y' here if you want your kernel to support the
-         Marvell DB-88F6281-BP Development Board.
-
 config MACH_DOCKSTAR
        bool "Seagate FreeAgent DockStar"
        help
@@ -134,13 +128,12 @@ comment "Device tree entries"
 
 config ARCH_KIRKWOOD_DT
        bool "Marvell Kirkwood Flattened Device Tree"
+       select KIRKWOOD_CLK
        select POWER_SUPPLY
        select POWER_RESET
        select POWER_RESET_GPIO
        select REGULATOR
        select REGULATOR_FIXED_VOLTAGE
-       select MVEBU_CLK_CORE
-       select MVEBU_CLK_GATING
        select USE_OF
        help
          Say 'Y' here if you want your kernel to support the
@@ -153,6 +146,13 @@ config MACH_CLOUDBOX_DT
          Say 'Y' here if you want your kernel to support the LaCie
          CloudBox NAS, using Flattened Device Tree.
 
+config MACH_DB88F628X_BP_DT
+       bool "Marvell DB-88F628x-BP Development Board (Flattened Device Tree)"
+       help
+         Say 'Y' here if you want your kernel to support the Marvell
+         DB-88F6281-BP and DB-88F6282-BP Development Board (Flattened
+         Device Tree).
+
 config MACH_DLINK_KIRKWOOD_DT
        bool "D-Link Kirkwood-based NAS (Flattened Device Tree)"
        select ARCH_KIRKWOOD_DT
@@ -272,14 +272,6 @@ config MACH_NETSPACE_V2_DT
          Say 'Y' here if you want your kernel to support the LaCie
          Network Space v2 NAS, using Flattened Device Tree.
 
-config MACH_NSA310_DT
-       bool "ZyXEL NSA-310 (Flattened Device Tree)"
-       select ARCH_KIRKWOOD_DT
-       select ARM_ATAG_DTB_COMPAT
-       help
-         Say 'Y' here if you want your kernel to support the
-         ZyXEL NSA-310 board (Flattened Device Tree).
-
 config MACH_OPENBLOCKS_A6_DT
        bool "Plat'Home OpenBlocks A6 (Flattened Device Tree)"
        select ARCH_KIRKWOOD_DT
index e1f3735d34154aaa90da215fdab1359070f8ab64..2fdc3a7ad226fa91e270bc97d6ec321f06107a90 100644 (file)
@@ -1,7 +1,6 @@
 obj-y                          += common.o irq.o pcie.o mpp.o
 
 obj-$(CONFIG_MACH_D2NET_V2)            += d2net_v2-setup.o lacie_v2-common.o
-obj-$(CONFIG_MACH_DB88F6281_BP)                += db88f6281-bp-setup.o
 obj-$(CONFIG_MACH_DOCKSTAR)            += dockstar-setup.o
 obj-$(CONFIG_MACH_ESATA_SHEEVAPLUG)    += sheevaplug-setup.o
 obj-$(CONFIG_MACH_GURUPLUG)            += guruplug-setup.o
@@ -21,6 +20,7 @@ obj-$(CONFIG_MACH_TS41X)              += ts41x-setup.o tsx1x-common.o
 
 obj-$(CONFIG_ARCH_KIRKWOOD_DT)         += board-dt.o
 obj-$(CONFIG_MACH_CLOUDBOX_DT)         += board-ns2.o
+obj-$(CONFIG_MACH_DB88F628X_BP_DT)     += board-db88f628x-bp.o
 obj-$(CONFIG_MACH_DLINK_KIRKWOOD_DT)   += board-dnskw.o
 obj-$(CONFIG_MACH_DOCKSTAR_DT)         += board-dockstar.o
 obj-$(CONFIG_MACH_DREAMPLUG_DT)                += board-dreamplug.o
@@ -37,7 +37,6 @@ obj-$(CONFIG_MACH_NETSPACE_LITE_V2_DT)        += board-ns2.o
 obj-$(CONFIG_MACH_NETSPACE_MAX_V2_DT)  += board-ns2.o
 obj-$(CONFIG_MACH_NETSPACE_MINI_V2_DT) += board-ns2.o
 obj-$(CONFIG_MACH_NETSPACE_V2_DT)      += board-ns2.o
-obj-$(CONFIG_MACH_NSA310_DT)           += board-nsa310.o
 obj-$(CONFIG_MACH_OPENBLOCKS_A6_DT)    += board-openblocks_a6.o
 obj-$(CONFIG_MACH_READYNAS_DT)         += board-readynas.o
 obj-$(CONFIG_MACH_TOPKICK_DT)          += board-usi_topkick.o
diff --git a/arch/arm/mach-kirkwood/board-db88f628x-bp.c b/arch/arm/mach-kirkwood/board-db88f628x-bp.c
new file mode 100644 (file)
index 0000000..2f574bc
--- /dev/null
@@ -0,0 +1,24 @@
+/*
+ * Saeed Bishara <saeed@marvell.com>
+ *
+ * Marvell DB-88F628{1,2}-BP Development Board Setup
+ *
+ * This file is licensed under the terms of the GNU General Public
+ * License version 2.  This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+ */
+
+#include <linux/kernel.h>
+#include <linux/init.h>
+#include <linux/of.h>
+#include <linux/mv643xx_eth.h>
+#include "common.h"
+
+static struct mv643xx_eth_platform_data db88f628x_ge00_data = {
+       .phy_addr       = MV643XX_ETH_PHY_ADDR(8),
+};
+
+void __init db88f628x_init(void)
+{
+       kirkwood_ge00_init(&db88f628x_ge00_data);
+}
index e9647b80cb590d9d0131b9542a5e476da9cad459..cee5dc71cb60aa5d9bc443a93c27805a9b478f01 100644 (file)
@@ -15,7 +15,6 @@
 #include <linux/of.h>
 #include <linux/of_platform.h>
 #include <linux/clk-provider.h>
-#include <linux/clk/mvebu.h>
 #include <linux/kexec.h>
 #include <asm/mach/arch.h>
 #include <asm/mach/map.h>
 #include <plat/common.h>
 #include "common.h"
 
-static struct of_device_id kirkwood_dt_match_table[] __initdata = {
-       { .compatible = "simple-bus", },
-       { }
-};
-
 /*
  * There are still devices that doesn't know about DT yet.  Get clock
  * gates here and add a clock lookup alias, so that old platform
@@ -77,7 +71,7 @@ static void __init kirkwood_legacy_clk_init(void)
 
 static void __init kirkwood_of_clk_init(void)
 {
-       mvebu_clocks_init();
+       of_clk_init(NULL);
        kirkwood_legacy_clk_init();
 }
 
@@ -97,6 +91,8 @@ static void __init kirkwood_dt_init(void)
 
        kirkwood_l2_init();
 
+       kirkwood_cpufreq_init();
+
        /* Setup root of clk tree */
        kirkwood_of_clk_init();
 
@@ -147,6 +143,10 @@ static void __init kirkwood_dt_init(void)
            of_machine_is_compatible("lacie,netspace_v2"))
                ns2_init();
 
+       if (of_machine_is_compatible("marvell,db-88f6281-bp") ||
+           of_machine_is_compatible("marvell,db-88f6282-bp"))
+               db88f628x_init();
+
        if (of_machine_is_compatible("mpl,cec4"))
                mplcec4_init();
 
@@ -159,7 +159,7 @@ static void __init kirkwood_dt_init(void)
        if (of_machine_is_compatible("usi,topkick"))
                usi_topkick_init();
 
-       of_platform_populate(NULL, kirkwood_dt_match_table, NULL, NULL);
+       of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
 }
 
 static const char * const kirkwood_dt_board_compat[] = {
@@ -181,6 +181,8 @@ static const char * const kirkwood_dt_board_compat[] = {
        "lacie,netspace_max_v2",
        "lacie,netspace_mini_v2",
        "lacie,netspace_v2",
+       "marvell,db-88f6281-bp",
+       "marvell,db-88f6282-bp",
        "mpl,cec4",
        "netgear,readynas-duo-v2",
        "plathome,openblocks-a6",
index c8ebde4919e26fa4bf1db5eb5e8556e2d63ddda9..98b5ad1bba90cc0f4f985043cfd2bebd56c562b3 100644 (file)
@@ -22,11 +22,3 @@ void __init iconnect_init(void)
 {
        kirkwood_ge00_init(&iconnect_ge00_data);
 }
-
-static int __init iconnect_pci_init(void)
-{
-       if (of_machine_is_compatible("iom,iconnect"))
-               kirkwood_pcie_init(KW_PCIE0);
-       return 0;
-}
-subsys_initcall(iconnect_pci_init);
index 7d6dc669e17fb4dfc6338a5c7e1a129868ae5a0a..938712e248f1ffc04f9e2ff6eae5d7633da93e96 100644 (file)
@@ -29,7 +29,6 @@ void __init mplcec4_init(void)
         */
        kirkwood_ge00_init(&mplcec4_ge00_data);
        kirkwood_ge01_init(&mplcec4_ge01_data);
-       kirkwood_pcie_init(KW_PCIE0);
 }
 
 
diff --git a/arch/arm/mach-kirkwood/board-nsa310.c b/arch/arm/mach-kirkwood/board-nsa310.c
deleted file mode 100644 (file)
index 55ade93..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * arch/arm/mach-kirkwood/nsa-310-setup.c
- *
- * ZyXEL NSA-310 Setup
- *
- * This file is licensed under the terms of the GNU General Public
- * License version 2.  This program is licensed "as is" without any
- * warranty of any kind, whether express or implied.
- */
-
-#include <linux/kernel.h>
-#include <linux/init.h>
-#include <mach/kirkwood.h>
-#include <linux/of.h>
-#include "common.h"
-
-static int __init nsa310_pci_init(void)
-{
-       if (of_machine_is_compatible("zyxel,nsa310"))
-               kirkwood_pcie_init(KW_PCIE0);
-
-       return 0;
-}
-
-subsys_initcall(nsa310_pci_init);
index fb42c20e273f1b19f40b7b9c4d2876051f919fd2..341b82d9cadb452046d53ee3b88fd38c1416e1ff 100644 (file)
@@ -24,5 +24,4 @@ static struct mv643xx_eth_platform_data netgear_readynas_ge00_data = {
 void __init netgear_readynas_init(void)
 {
        kirkwood_ge00_init(&netgear_readynas_ge00_data);
-       kirkwood_pcie_init(KW_PCIE0);
 }
index f389228975637cd85d3f9f9444ae30e0f34537cc..7c72c725b711d40622a4552fbee18f8f14120e2c 100644 (file)
@@ -597,6 +597,29 @@ void __init kirkwood_audio_init(void)
        platform_device_register(&kirkwood_pcm_device);
 }
 
+/*****************************************************************************
+ * CPU Frequency
+ ****************************************************************************/
+static struct resource kirkwood_cpufreq_resources[] = {
+       [0] = {
+               .start  = CPU_CONTROL_PHYS,
+               .end    = CPU_CONTROL_PHYS + 3,
+               .flags  = IORESOURCE_MEM,
+       },
+};
+
+static struct platform_device kirkwood_cpufreq_device = {
+       .name           = "kirkwood-cpufreq",
+       .id             = -1,
+       .num_resources  = ARRAY_SIZE(kirkwood_cpufreq_resources),
+       .resource       = kirkwood_cpufreq_resources,
+};
+
+void __init kirkwood_cpufreq_init(void)
+{
+       platform_device_register(&kirkwood_cpufreq_device);
+}
+
 /*****************************************************************************
  * General
  ****************************************************************************/
@@ -648,30 +671,6 @@ char * __init kirkwood_id(void)
 
 void __init kirkwood_setup_wins(void)
 {
-       /*
-        * The PCIe windows will no longer be statically allocated
-        * here once Kirkwood is migrated to the pci-mvebu driver.
-        */
-       mvebu_mbus_add_window_remap_flags("pcie0.0",
-                                         KIRKWOOD_PCIE_IO_PHYS_BASE,
-                                         KIRKWOOD_PCIE_IO_SIZE,
-                                         KIRKWOOD_PCIE_IO_BUS_BASE,
-                                         MVEBU_MBUS_PCI_IO);
-       mvebu_mbus_add_window_remap_flags("pcie0.0",
-                                         KIRKWOOD_PCIE_MEM_PHYS_BASE,
-                                         KIRKWOOD_PCIE_MEM_SIZE,
-                                         MVEBU_MBUS_NO_REMAP,
-                                         MVEBU_MBUS_PCI_MEM);
-       mvebu_mbus_add_window_remap_flags("pcie1.0",
-                                         KIRKWOOD_PCIE1_IO_PHYS_BASE,
-                                         KIRKWOOD_PCIE1_IO_SIZE,
-                                         KIRKWOOD_PCIE1_IO_BUS_BASE,
-                                         MVEBU_MBUS_PCI_IO);
-       mvebu_mbus_add_window_remap_flags("pcie1.0",
-                                         KIRKWOOD_PCIE1_MEM_PHYS_BASE,
-                                         KIRKWOOD_PCIE1_MEM_SIZE,
-                                         MVEBU_MBUS_NO_REMAP,
-                                         MVEBU_MBUS_PCI_MEM);
        mvebu_mbus_add_window("nand", KIRKWOOD_NAND_MEM_PHYS_BASE,
                              KIRKWOOD_NAND_MEM_SIZE);
        mvebu_mbus_add_window("sram", KIRKWOOD_SRAM_PHYS_BASE,
index 21da3b1ebd7bf843c2b9b1e11a8fd025b5e30287..e2e19b302c287445e36521af1a086d5ad640ac03 100644 (file)
@@ -51,6 +51,8 @@ void kirkwood_nand_init_rnb(struct mtd_partition *parts, int nr_parts,
                            int (*dev_ready)(struct mtd_info *));
 void kirkwood_audio_init(void);
 void kirkwood_cpuidle_init(void);
+void kirkwood_cpufreq_init(void);
+
 void kirkwood_restart(char, const char *);
 void kirkwood_clk_init(void);
 
@@ -119,6 +121,12 @@ void km_kirkwood_init(void);
 static inline void km_kirkwood_init(void) {};
 #endif
 
+#ifdef CONFIG_MACH_DB88F628X_BP_DT
+void db88f628x_init(void);
+#else
+static inline void db88f628x_init(void) {};
+#endif
+
 #ifdef CONFIG_MACH_MPLCEC4_DT
 void mplcec4_init(void);
 #else
diff --git a/arch/arm/mach-kirkwood/db88f6281-bp-setup.c b/arch/arm/mach-kirkwood/db88f6281-bp-setup.c
deleted file mode 100644 (file)
index 5a369fe..0000000
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * arch/arm/mach-kirkwood/db88f6281-bp-setup.c
- *
- * Marvell DB-88F6281-BP Development Board Setup
- *
- * This file is licensed under the terms of the GNU General Public
- * License version 2.  This program is licensed "as is" without any
- * warranty of any kind, whether express or implied.
- */
-
-#include <linux/kernel.h>
-#include <linux/init.h>
-#include <linux/sizes.h>
-#include <linux/platform_device.h>
-#include <linux/mtd/partitions.h>
-#include <linux/ata_platform.h>
-#include <linux/mv643xx_eth.h>
-#include <asm/mach-types.h>
-#include <asm/mach/arch.h>
-#include <mach/kirkwood.h>
-#include <linux/platform_data/mmc-mvsdio.h>
-#include "common.h"
-#include "mpp.h"
-
-static struct mtd_partition db88f6281_nand_parts[] = {
-       {
-               .name = "u-boot",
-               .offset = 0,
-               .size = SZ_1M
-       }, {
-               .name = "uImage",
-               .offset = MTDPART_OFS_NXTBLK,
-               .size = SZ_4M
-       }, {
-               .name = "root",
-               .offset = MTDPART_OFS_NXTBLK,
-               .size = MTDPART_SIZ_FULL
-       },
-};
-
-static struct mv643xx_eth_platform_data db88f6281_ge00_data = {
-       .phy_addr       = MV643XX_ETH_PHY_ADDR(8),
-};
-
-static struct mv_sata_platform_data db88f6281_sata_data = {
-       .n_ports        = 2,
-};
-
-static struct mvsdio_platform_data db88f6281_mvsdio_data = {
-       .gpio_write_protect     = 37,
-       .gpio_card_detect       = 38,
-};
-
-static unsigned int db88f6281_mpp_config[] __initdata = {
-       MPP0_NF_IO2,
-       MPP1_NF_IO3,
-       MPP2_NF_IO4,
-       MPP3_NF_IO5,
-       MPP4_NF_IO6,
-       MPP5_NF_IO7,
-       MPP18_NF_IO0,
-       MPP19_NF_IO1,
-       MPP37_GPIO,
-       MPP38_GPIO,
-       0
-};
-
-static void __init db88f6281_init(void)
-{
-       /*
-        * Basic setup. Needs to be called early.
-        */
-       kirkwood_init();
-       kirkwood_mpp_conf(db88f6281_mpp_config);
-
-       kirkwood_nand_init(ARRAY_AND_SIZE(db88f6281_nand_parts), 25);
-       kirkwood_ehci_init();
-       kirkwood_ge00_init(&db88f6281_ge00_data);
-       kirkwood_sata_init(&db88f6281_sata_data);
-       kirkwood_uart0_init();
-       kirkwood_sdio_init(&db88f6281_mvsdio_data);
-}
-
-static int __init db88f6281_pci_init(void)
-{
-       if (machine_is_db88f6281_bp()) {
-               u32 dev, rev;
-
-               kirkwood_pcie_id(&dev, &rev);
-               if (dev == MV88F6282_DEV_ID)
-                       kirkwood_pcie_init(KW_PCIE1 | KW_PCIE0);
-               else
-                       kirkwood_pcie_init(KW_PCIE0);
-       }
-       return 0;
-}
-subsys_initcall(db88f6281_pci_init);
-
-MACHINE_START(DB88F6281_BP, "Marvell DB-88F6281-BP Development Board")
-       /* Maintainer: Saeed Bishara <saeed@marvell.com> */
-       .atag_offset    = 0x100,
-       .init_machine   = db88f6281_init,
-       .map_io         = kirkwood_map_io,
-       .init_early     = kirkwood_init_early,
-       .init_irq       = kirkwood_init_irq,
-       .init_time      = kirkwood_timer_init,
-       .restart        = kirkwood_restart,
-MACHINE_END
index 5c82b7dce4e2377b7dc84c55c03b5db8aa0c9784..d4cbe5e81bb4dcac1e5048fb79e10a3b1ad83d18 100644 (file)
@@ -17,6 +17,7 @@
 #define CPU_CONFIG_ERROR_PROP  0x00000004
 
 #define CPU_CONTROL            (BRIDGE_VIRT_BASE + 0x0104)
+#define CPU_CONTROL_PHYS       (BRIDGE_PHYS_BASE + 0x0104)
 #define CPU_RESET              0x00000002
 
 #define RSTOUTn_MASK           (BRIDGE_VIRT_BASE + 0x0108)
@@ -69,6 +70,7 @@
 #define CGC_RUNIT              (1 << 7)
 #define CGC_XOR0               (1 << 8)
 #define CGC_AUDIO              (1 << 9)
+#define CGC_POWERSAVE           (1 << 11)
 #define CGC_SATA0              (1 << 14)
 #define CGC_SATA1              (1 << 15)
 #define CGC_XOR1               (1 << 16)
index 7f43e6c2f8c0a15f820ce7fc0cbd6ddb0f6936de..ddcb09f5bdd38403423f2123c329149b74848fd5 100644 (file)
@@ -12,6 +12,7 @@
 #include <linux/pci.h>
 #include <linux/slab.h>
 #include <linux/clk.h>
+#include <linux/mbus.h>
 #include <video/vga.h>
 #include <asm/irq.h>
 #include <asm/mach/pci.h>
@@ -253,6 +254,27 @@ static void __init add_pcie_port(int index, void __iomem *base)
 
 void __init kirkwood_pcie_init(unsigned int portmask)
 {
+       mvebu_mbus_add_window_remap_flags("pcie0.0",
+                                         KIRKWOOD_PCIE_IO_PHYS_BASE,
+                                         KIRKWOOD_PCIE_IO_SIZE,
+                                         KIRKWOOD_PCIE_IO_BUS_BASE,
+                                         MVEBU_MBUS_PCI_IO);
+       mvebu_mbus_add_window_remap_flags("pcie0.0",
+                                         KIRKWOOD_PCIE_MEM_PHYS_BASE,
+                                         KIRKWOOD_PCIE_MEM_SIZE,
+                                         MVEBU_MBUS_NO_REMAP,
+                                         MVEBU_MBUS_PCI_MEM);
+       mvebu_mbus_add_window_remap_flags("pcie1.0",
+                                         KIRKWOOD_PCIE1_IO_PHYS_BASE,
+                                         KIRKWOOD_PCIE1_IO_SIZE,
+                                         KIRKWOOD_PCIE1_IO_BUS_BASE,
+                                         MVEBU_MBUS_PCI_IO);
+       mvebu_mbus_add_window_remap_flags("pcie1.0",
+                                         KIRKWOOD_PCIE1_MEM_PHYS_BASE,
+                                         KIRKWOOD_PCIE1_MEM_SIZE,
+                                         MVEBU_MBUS_NO_REMAP,
+                                         MVEBU_MBUS_PCI_MEM);
+
        vga_base = KIRKWOOD_PCIE_MEM_PHYS_BASE;
 
        if (portmask & KW_PCIE0)
index 80a8bcacd9d539c0a684e3beaa927b07dd720566..9eb63d7246023e061ff80a91b2a600f691906c58 100644 (file)
@@ -10,12 +10,11 @@ config ARCH_MVEBU
        select PLAT_ORION
        select SPARSE_IRQ
        select CLKDEV_LOOKUP
-       select MVEBU_CLK_CORE
-       select MVEBU_CLK_CPU
-       select MVEBU_CLK_GATING
        select MVEBU_MBUS
        select ZONE_DMA if ARM_LPAE
        select ARCH_REQUIRE_GPIOLIB
+       select MIGHT_HAVE_PCI
+       select PCI_QUIRKS if PCI
 
 if ARCH_MVEBU
 
@@ -30,6 +29,7 @@ config MACH_ARMADA_370_XP
 
 config MACH_ARMADA_370
        bool "Marvell Armada 370 boards"
+       select ARMADA_370_CLK
        select MACH_ARMADA_370_XP
        select PINCTRL_ARMADA_370
        help
@@ -38,6 +38,7 @@ config MACH_ARMADA_370
 
 config MACH_ARMADA_XP
        bool "Marvell Armada XP boards"
+       select ARMADA_XP_CLK
        select MACH_ARMADA_370_XP
        select PINCTRL_ARMADA_XP
        help
index 1c48890bb72b2c7ad1301cdc9f8bad007362bf57..97cbb802191930d21c64532d93e3a4ea2a2594af 100644 (file)
 
 #include <linux/kernel.h>
 #include <linux/init.h>
+#include <linux/clk-provider.h>
+#include <linux/of_address.h>
 #include <linux/of_platform.h>
 #include <linux/io.h>
 #include <linux/time-armada-370-xp.h>
-#include <linux/clk/mvebu.h>
 #include <linux/dma-mapping.h>
 #include <linux/mbus.h>
-#include <linux/irqchip.h>
 #include <asm/hardware/cache-l2x0.h>
 #include <asm/mach/arch.h>
 #include <asm/mach/map.h>
 #include "common.h"
 #include "coherency.h"
 
-static struct map_desc armada_370_xp_io_desc[] __initdata = {
-       {
-               .virtual        = (unsigned long) ARMADA_370_XP_REGS_VIRT_BASE,
-               .pfn            = __phys_to_pfn(ARMADA_370_XP_REGS_PHYS_BASE),
-               .length         = ARMADA_370_XP_REGS_SIZE,
-               .type           = MT_DEVICE,
-       },
-};
-
-void __init armada_370_xp_map_io(void)
+static void __init armada_370_xp_map_io(void)
 {
-       iotable_init(armada_370_xp_io_desc, ARRAY_SIZE(armada_370_xp_io_desc));
+       debug_ll_io_init();
 }
 
-void __init armada_370_xp_timer_and_clk_init(void)
-{
-       mvebu_clocks_init();
-       armada_370_xp_timer_init();
-}
+/*
+ * This initialization will be replaced by a DT-based
+ * initialization once the mvebu-mbus driver gains DT support.
+ */
 
-void __init armada_370_xp_init_early(void)
+#define ARMADA_370_XP_MBUS_WINS_OFFS   0x20000
+#define ARMADA_370_XP_MBUS_WINS_SIZE   0x100
+#define ARMADA_370_XP_SDRAM_WINS_OFFS  0x20180
+#define ARMADA_370_XP_SDRAM_WINS_SIZE  0x20
+
+static void __init armada_370_xp_mbus_init(void)
 {
        char *mbus_soc_name;
+       struct device_node *dn;
+       const __be32 mbus_wins_offs = cpu_to_be32(ARMADA_370_XP_MBUS_WINS_OFFS);
+       const __be32 sdram_wins_offs = cpu_to_be32(ARMADA_370_XP_SDRAM_WINS_OFFS);
 
-       /*
-        * This initialization will be replaced by a DT-based
-        * initialization once the mvebu-mbus driver gains DT support.
-        */
        if (of_machine_is_compatible("marvell,armada370"))
                mbus_soc_name = "marvell,armada370-mbus";
        else
                mbus_soc_name = "marvell,armadaxp-mbus";
 
+       dn = of_find_node_by_name(NULL, "internal-regs");
+       BUG_ON(!dn);
+
        mvebu_mbus_init(mbus_soc_name,
-                       ARMADA_370_XP_MBUS_WINS_BASE,
+                       of_translate_address(dn, &mbus_wins_offs),
                        ARMADA_370_XP_MBUS_WINS_SIZE,
-                       ARMADA_370_XP_SDRAM_WINS_BASE,
+                       of_translate_address(dn, &sdram_wins_offs),
                        ARMADA_370_XP_SDRAM_WINS_SIZE);
+}
 
+static void __init armada_370_xp_timer_and_clk_init(void)
+{
+       of_clk_init(NULL);
+       armada_370_xp_timer_init();
+       coherency_init();
+       armada_370_xp_mbus_init();
 #ifdef CONFIG_CACHE_L2X0
        l2x0_of_init(0, ~0UL);
 #endif
@@ -76,7 +80,6 @@ void __init armada_370_xp_init_early(void)
 static void __init armada_370_xp_dt_init(void)
 {
        of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
-       coherency_init();
 }
 
 static const char * const armada_370_xp_dt_compat[] = {
@@ -88,8 +91,6 @@ DT_MACHINE_START(ARMADA_XP_DT, "Marvell Armada 370/XP (Device Tree)")
        .smp            = smp_ops(armada_xp_smp_ops),
        .init_machine   = armada_370_xp_dt_init,
        .map_io         = armada_370_xp_map_io,
-       .init_early     = armada_370_xp_init_early,
-       .init_irq       = irqchip_init,
        .init_time      = armada_370_xp_timer_and_clk_init,
        .restart        = mvebu_restart,
        .dt_compat      = armada_370_xp_dt_compat,
index 2070e1b4f34241685f451b024b87a8ab43c63fcb..c612b2c4ed6cf9969153c1cee7c96221f054d1d8 100644 (file)
 #ifndef __MACH_ARMADA_370_XP_H
 #define __MACH_ARMADA_370_XP_H
 
-#define ARMADA_370_XP_REGS_PHYS_BASE   0xd0000000
-#define ARMADA_370_XP_REGS_VIRT_BASE   IOMEM(0xfec00000)
-#define ARMADA_370_XP_REGS_SIZE                SZ_1M
-
-/* These defines can go away once mvebu-mbus has a DT binding */
-#define ARMADA_370_XP_MBUS_WINS_BASE    (ARMADA_370_XP_REGS_PHYS_BASE + 0x20000)
-#define ARMADA_370_XP_MBUS_WINS_SIZE    0x100
-#define ARMADA_370_XP_SDRAM_WINS_BASE   (ARMADA_370_XP_REGS_PHYS_BASE + 0x20180)
-#define ARMADA_370_XP_SDRAM_WINS_SIZE   0x20
-
 #ifdef CONFIG_SMP
 #include <linux/cpumask.h>
 
index 8278960066c33a86c4218be10d54a68b0b5c59c3..32fcf69f42021515f8a6ea4019bd003fd00012e9 100644 (file)
 #include <linux/dma-mapping.h>
 #include <linux/platform_device.h>
 #include <asm/smp_plat.h>
+#include <asm/cacheflush.h>
 #include "armada-370-xp.h"
 
-/*
- * Some functions in this file are called very early during SMP
- * initialization. At that time the device tree framework is not yet
- * ready, and it is not possible to get the register address to
- * ioremap it. That's why the pointer below is given with an initial
- * value matching its virtual mapping
- */
-static void __iomem *coherency_base = ARMADA_370_XP_REGS_VIRT_BASE + 0x20200;
+unsigned long __cpuinitdata coherency_phys_base;
+static void __iomem *coherency_base;
 static void __iomem *coherency_cpu_base;
 
 /* Coherency fabric registers */
@@ -47,18 +42,6 @@ static struct of_device_id of_coherency_table[] = {
        { /* end of list */ },
 };
 
-#ifdef CONFIG_SMP
-int coherency_get_cpu_count(void)
-{
-       int reg, cnt;
-
-       reg = readl(coherency_base + COHERENCY_FABRIC_CFG_OFFSET);
-       cnt = (reg & 0xF) + 1;
-
-       return cnt;
-}
-#endif
-
 /* Function defined in coherency_ll.S */
 int ll_set_cpu_coherent(void __iomem *base_addr, unsigned int hw_cpu_id);
 
@@ -143,13 +126,30 @@ int __init coherency_init(void)
 
        np = of_find_matching_node(NULL, of_coherency_table);
        if (np) {
+               struct resource res;
                pr_info("Initializing Coherency fabric\n");
+               of_address_to_resource(np, 0, &res);
+               coherency_phys_base = res.start;
+               /*
+                * Ensure secondary CPUs will see the updated value,
+                * which they read before they join the coherency
+                * fabric, and therefore before they are coherent with
+                * the boot CPU cache.
+                */
+               sync_cache_w(&coherency_phys_base);
                coherency_base = of_iomap(np, 0);
                coherency_cpu_base = of_iomap(np, 1);
                set_cpu_coherent(cpu_logical_map(smp_processor_id()), 0);
-               bus_register_notifier(&platform_bus_type,
-                                       &mvebu_hwcc_platform_nb);
        }
 
        return 0;
 }
+
+static int __init coherency_late_init(void)
+{
+       bus_register_notifier(&platform_bus_type,
+                             &mvebu_hwcc_platform_nb);
+       return 0;
+}
+
+postcore_initcall(coherency_late_init);
index 2f428137f6fedf45672146847bb95819c32a0759..df33ad8a6c08935b9fea023c570c8881b22ecb8b 100644 (file)
 #ifndef __MACH_370_XP_COHERENCY_H
 #define __MACH_370_XP_COHERENCY_H
 
-#ifdef CONFIG_SMP
-int coherency_get_cpu_count(void);
-#endif
-
 int set_cpu_coherent(int cpu_id, int smp_group_id);
 int coherency_init(void);
 
index aa27bc2ffb6013575ff8d889b919a9b9b5369cb8..98defd5e92cdeed74c6d86b0b8c9ec755dd5f0d7 100644 (file)
@@ -15,6 +15,8 @@
 #ifndef __ARCH_MVEBU_COMMON_H
 #define __ARCH_MVEBU_COMMON_H
 
+#define ARMADA_XP_MAX_CPUS 4
+
 void mvebu_restart(char mode, const char *cmd);
 
 void armada_370_xp_init_irq(void);
index a06e0ede8c0897177566ffb22b76c7218b64d15a..7147300c8af25d20e90279632a1499f3e9dbb674 100644 (file)
 #include <linux/linkage.h>
 #include <linux/init.h>
 
-/*
- * At this stage the secondary CPUs don't have acces yet to the MMU, so
- * we have to provide physical addresses
- */
-#define ARMADA_XP_CFB_BASE          0xD0020200
-
        __CPUINIT
 
 /*
  * startup
  */
 ENTRY(armada_xp_secondary_startup)
+       /* Get coherency fabric base physical address */
+       adr     r0, 1f
+       ldr     r1, [r0]
+       ldr     r0, [r0, r1]
 
        /* Read CPU id */
        mrc     p15, 0, r1, c0, c0, 5
        and     r1, r1, #0xF
 
        /* Add CPU to coherency fabric */
-       ldr     r0, =ARMADA_XP_CFB_BASE
-
        bl      ll_set_cpu_coherent
        b       secondary_startup
 
 ENDPROC(armada_xp_secondary_startup)
+
+       .align 2
+1:
+       .long   coherency_phys_base - .
index 875ea748391ca87adfbc0756837da2bad6584be8..93f2f3ab45f1346925dc0a17db326a23e553ca1c 100644 (file)
@@ -88,8 +88,16 @@ static int __cpuinit armada_xp_boot_secondary(unsigned int cpu,
 
 static void __init armada_xp_smp_init_cpus(void)
 {
+       struct device_node *np;
        unsigned int i, ncores;
-       ncores = coherency_get_cpu_count();
+
+       np = of_find_node_by_name(NULL, "cpus");
+       if (!np)
+               panic("No 'cpus' node found\n");
+
+       ncores = of_get_child_count(np);
+       if (ncores == 0 || ncores > ARMADA_XP_MAX_CPUS)
+               panic("Invalid number of CPUs in DT\n");
 
        /* Limit possible CPUs to defconfig */
        if (ncores > nr_cpu_ids) {
index f49cd51e162afcc6055d9143ced540d8fa888ab5..1bfe9ee0331b49ea128df9029851ef19069cc240 100644 (file)
@@ -149,6 +149,14 @@ config SOC_AM33XX
        select MULTI_IRQ_HANDLER
        select COMMON_CLK
 
+config SOC_AM43XX
+       bool "TI AM43x"
+       select CPU_V7
+       select MULTI_IRQ_HANDLER
+       select ARM_GIC
+       select COMMON_CLK
+       select MACH_OMAP_GENERIC
+
 config OMAP_PACKAGE_ZAF
        bool
 
index a4f1d2a78d986196ac3fa97fc0dd7bf37c8b96ba..ec2e128074d8a9e9a5b8afb4156d30162cf09fcc 100644 (file)
@@ -22,6 +22,7 @@ obj-$(CONFIG_ARCH_OMAP3) += $(omap-2-3-common) $(hwmod-common) $(secure-common)
 obj-$(CONFIG_ARCH_OMAP4) += prm44xx.o $(hwmod-common) $(secure-common)
 obj-$(CONFIG_SOC_AM33XX) += irq.o $(hwmod-common)
 obj-$(CONFIG_SOC_OMAP5)         += prm44xx.o $(hwmod-common) $(secure-common)
+obj-$(CONFIG_SOC_AM43XX) += $(hwmod-common) $(secure-common)
 
 ifneq ($(CONFIG_SND_OMAP_SOC_MCBSP),)
 obj-y += mcbsp.o
@@ -38,6 +39,7 @@ omap-4-5-common                               =  omap4-common.o omap-wakeupgen.o \
                                           sleep44xx.o
 obj-$(CONFIG_ARCH_OMAP4)               += $(omap-4-5-common) $(smp-y)
 obj-$(CONFIG_SOC_OMAP5)                        += $(omap-4-5-common) $(smp-y)
+obj-$(CONFIG_SOC_AM43XX)               += $(omap-4-5-common)
 
 plus_sec := $(call as-instr,.arch_extension sec,+sec)
 AFLAGS_omap-headsmp.o                  :=-Wa,-march=armv7-a$(plus_sec)
@@ -58,6 +60,8 @@ obj-$(CONFIG_SOC_OMAP2420)            += omap2-restart.o
 obj-$(CONFIG_SOC_OMAP2430)             += omap2-restart.o
 obj-$(CONFIG_SOC_AM33XX)               += am33xx-restart.o
 obj-$(CONFIG_ARCH_OMAP3)               += omap3-restart.o
+obj-$(CONFIG_ARCH_OMAP4)               += omap4-restart.o
+obj-$(CONFIG_SOC_OMAP5)                        += omap4-restart.o
 
 # Pin multiplexing
 obj-$(CONFIG_SOC_OMAP2420)             += mux2420.o
@@ -110,6 +114,7 @@ obj-$(CONFIG_ARCH_OMAP2)            += prm2xxx_3xxx.o prm2xxx.o cm2xxx.o
 obj-$(CONFIG_ARCH_OMAP3)               += prm2xxx_3xxx.o prm3xxx.o cm3xxx.o
 obj-$(CONFIG_ARCH_OMAP3)               += vc3xxx_data.o vp3xxx_data.o
 obj-$(CONFIG_SOC_AM33XX)               += prm33xx.o cm33xx.o
+obj-$(CONFIG_SOC_AM43XX)               += prm33xx.o cm33xx.o
 omap-prcm-4-5-common                   =  cminst44xx.o cm44xx.o prm44xx.o \
                                           prcm_mpu44xx.o prminst44xx.o \
                                           vc44xx_data.o vp44xx_data.o
@@ -125,7 +130,9 @@ obj-$(CONFIG_ARCH_OMAP3)            += voltagedomains3xxx_data.o
 obj-$(CONFIG_ARCH_OMAP4)               += $(voltagedomain-common)
 obj-$(CONFIG_ARCH_OMAP4)               += voltagedomains44xx_data.o
 obj-$(CONFIG_SOC_AM33XX)               += $(voltagedomain-common)
+obj-$(CONFIG_SOC_AM43XX)               += $(voltagedomain-common)
 obj-$(CONFIG_SOC_OMAP5)                        += $(voltagedomain-common)
+obj-$(CONFIG_SOC_OMAP5)                += voltagedomains54xx_data.o
 
 # OMAP powerdomain framework
 powerdomain-common                     += powerdomain.o powerdomain-common.o
@@ -139,7 +146,9 @@ obj-$(CONFIG_ARCH_OMAP4)            += $(powerdomain-common)
 obj-$(CONFIG_ARCH_OMAP4)               += powerdomains44xx_data.o
 obj-$(CONFIG_SOC_AM33XX)               += $(powerdomain-common)
 obj-$(CONFIG_SOC_AM33XX)               += powerdomains33xx_data.o
+obj-$(CONFIG_SOC_AM43XX)               += $(powerdomain-common)
 obj-$(CONFIG_SOC_OMAP5)                        += $(powerdomain-common)
+obj-$(CONFIG_SOC_OMAP5)                        += powerdomains54xx_data.o
 
 # PRCM clockdomain control
 clockdomain-common                     += clockdomain.o
@@ -154,7 +163,9 @@ obj-$(CONFIG_ARCH_OMAP4)            += $(clockdomain-common)
 obj-$(CONFIG_ARCH_OMAP4)               += clockdomains44xx_data.o
 obj-$(CONFIG_SOC_AM33XX)               += $(clockdomain-common)
 obj-$(CONFIG_SOC_AM33XX)               += clockdomains33xx_data.o
+obj-$(CONFIG_SOC_AM43XX)               += $(clockdomain-common)
 obj-$(CONFIG_SOC_OMAP5)                        += $(clockdomain-common)
+obj-$(CONFIG_SOC_OMAP5)                        += clockdomains54xx_data.o
 
 # Clock framework
 obj-$(CONFIG_ARCH_OMAP2)               += $(clock-common) clock2xxx.o
@@ -197,6 +208,7 @@ obj-$(CONFIG_ARCH_OMAP3)            += omap_hwmod_2xxx_3xxx_interconnect_data.o
 obj-$(CONFIG_ARCH_OMAP3)               += omap_hwmod_3xxx_data.o
 obj-$(CONFIG_SOC_AM33XX)               += omap_hwmod_33xx_data.o
 obj-$(CONFIG_ARCH_OMAP4)               += omap_hwmod_44xx_data.o
+obj-$(CONFIG_SOC_OMAP5)                        += omap_hwmod_54xx_data.o
 
 # EMU peripherals
 obj-$(CONFIG_OMAP3_EMU)                        += emu.o
index 43296c1af9ee85f13ee00326113d187a896503a7..5eef093e6738e028a878a6a2931b9912ad4f26d7 100644 (file)
@@ -21,6 +21,7 @@
 #define AM33XX_SCM_BASE                0x44E10000
 #define AM33XX_CTRL_BASE       AM33XX_SCM_BASE
 #define AM33XX_PRCM_BASE       0x44E00000
+#define AM43XX_PRCM_BASE       0x44DF0000
 #define AM33XX_TAP_BASE                (AM33XX_CTRL_BASE + 0x3FC)
 
 #endif /* __ASM_ARCH_AM33XX_H */
index 88aa6b1835c3674f4483e2df155ed9e9b0fa613f..e5fbfed69aa2bc5094b508a3219c8988d0d3dbe7 100644 (file)
@@ -185,3 +185,19 @@ DT_MACHINE_START(OMAP5_DT, "Generic OMAP5 (Flattened Device Tree)")
        .restart        = omap44xx_restart,
 MACHINE_END
 #endif
+
+#ifdef CONFIG_SOC_AM43XX
+static const char *am43_boards_compat[] __initdata = {
+       "ti,am43",
+       NULL,
+};
+
+DT_MACHINE_START(AM43_DT, "Generic AM43 (Flattened Device Tree)")
+       .map_io         = am33xx_map_io,
+       .init_early     = am43xx_init_early,
+       .init_irq       = omap_gic_of_init,
+       .init_machine   = omap_generic_init,
+       .init_time      = omap3_sync32k_timer_init,
+       .dt_compat      = am43_boards_compat,
+MACHINE_END
+#endif
index af3544ce4f0273b8eb8b43c22295a5ae6ced76a3..0346de56436caf26ef2ad87b9a38bdd380fefe3d 100644 (file)
@@ -862,6 +862,33 @@ static struct clk_hw_omap wdt1_fck_hw = {
 
 DEFINE_STRUCT_CLK(wdt1_fck, wdt_ck_parents, gpio_fck_ops);
 
+static const char *pwmss_clk_parents[] = {
+       "dpll_per_m2_ck",
+};
+
+static const struct clk_ops ehrpwm_tbclk_ops = {
+       .enable         = &omap2_dflt_clk_enable,
+       .disable        = &omap2_dflt_clk_disable,
+};
+
+DEFINE_CLK_OMAP_MUX_GATE(ehrpwm0_tbclk, "l4ls_clkdm",
+                        NULL, NULL, 0,
+                        AM33XX_CTRL_REGADDR(AM33XX_PWMSS_TBCLK_CLKCTRL),
+                        AM33XX_PWMSS0_TBCLKEN_SHIFT,
+                        NULL, pwmss_clk_parents, ehrpwm_tbclk_ops);
+
+DEFINE_CLK_OMAP_MUX_GATE(ehrpwm1_tbclk, "l4ls_clkdm",
+                        NULL, NULL, 0,
+                        AM33XX_CTRL_REGADDR(AM33XX_PWMSS_TBCLK_CLKCTRL),
+                        AM33XX_PWMSS1_TBCLKEN_SHIFT,
+                        NULL, pwmss_clk_parents, ehrpwm_tbclk_ops);
+
+DEFINE_CLK_OMAP_MUX_GATE(ehrpwm2_tbclk, "l4ls_clkdm",
+                        NULL, NULL, 0,
+                        AM33XX_CTRL_REGADDR(AM33XX_PWMSS_TBCLK_CLKCTRL),
+                        AM33XX_PWMSS2_TBCLKEN_SHIFT,
+                        NULL, pwmss_clk_parents, ehrpwm_tbclk_ops);
+
 /*
  * clkdev
  */
@@ -942,6 +969,9 @@ static struct omap_clk am33xx_clks[] = {
        CLK(NULL,       "clkout2_div_ck",       &clkout2_div_ck),
        CLK(NULL,       "timer_32k_ck",         &clkdiv32k_ick),
        CLK(NULL,       "timer_sys_ck",         &sys_clkin_ck),
+       CLK("48300200.ehrpwm",  "tbclk",        &ehrpwm0_tbclk),
+       CLK("48302200.ehrpwm",  "tbclk",        &ehrpwm1_tbclk),
+       CLK("48304200.ehrpwm",  "tbclk",        &ehrpwm2_tbclk),
 };
 
 
index 45cd26430d1f2298bc39b0abff53311f30fad81a..334b76745900fb397e8d3fd5419dc1dd91e0bc63 100644 (file)
@@ -3329,11 +3329,7 @@ static struct omap_clk omap36xx_am35xx_omap3430es2plus_clks[] = {
        CLK(NULL,       "cpefuse_fck",  &cpefuse_fck),
        CLK(NULL,       "ts_fck",       &ts_fck),
        CLK(NULL,       "usbtll_fck",   &usbtll_fck),
-       CLK("usbhs_omap",       "usbtll_fck",   &usbtll_fck),
-       CLK("usbhs_tll",        "usbtll_fck",   &usbtll_fck),
        CLK(NULL,       "usbtll_ick",   &usbtll_ick),
-       CLK("usbhs_omap",       "usbtll_ick",   &usbtll_ick),
-       CLK("usbhs_tll",        "usbtll_ick",   &usbtll_ick),
        CLK("omap_hsmmc.2",     "ick",  &mmchs3_ick),
        CLK(NULL,       "mmchs3_ick",   &mmchs3_ick),
        CLK(NULL,       "mmchs3_fck",   &mmchs3_fck),
@@ -3343,7 +3339,6 @@ static struct omap_clk omap36xx_am35xx_omap3430es2plus_clks[] = {
        CLK(NULL,       "usbhost_120m_fck", &usbhost_120m_fck),
        CLK(NULL,       "usbhost_48m_fck", &usbhost_48m_fck),
        CLK(NULL,       "usbhost_ick",  &usbhost_ick),
-       CLK("usbhs_omap",       "usbhost_ick",  &usbhost_ick),
 };
 
 /*
@@ -3463,12 +3458,6 @@ static struct omap_clk omap3xxx_clks[] = {
        CLK(NULL,       "utmi_p2_gfclk",        &dummy_ck),
        CLK(NULL,       "xclk60mhsp1_ck",       &dummy_ck),
        CLK(NULL,       "xclk60mhsp2_ck",       &dummy_ck),
-       CLK(NULL,       "usb_host_hs_utmi_p1_clk",      &dummy_ck),
-       CLK(NULL,       "usb_host_hs_utmi_p2_clk",      &dummy_ck),
-       CLK("usbhs_omap",       "usb_tll_hs_usb_ch0_clk",       &dummy_ck),
-       CLK("usbhs_omap",       "usb_tll_hs_usb_ch1_clk",       &dummy_ck),
-       CLK("usbhs_tll",        "usb_tll_hs_usb_ch0_clk",       &dummy_ck),
-       CLK("usbhs_tll",        "usb_tll_hs_usb_ch1_clk",       &dummy_ck),
        CLK(NULL,       "init_60m_fclk",        &dummy_ck),
        CLK(NULL,       "gpt1_fck",     &gpt1_fck),
        CLK(NULL,       "aes2_ick",     &aes2_ick),
index 2da37656a693e576910169fb5d722b7e9ea0b312..daeecf1b89fa837c7672c3d0de192c9f4fb8d552 100644 (file)
@@ -216,6 +216,7 @@ extern void __init omap243x_clockdomains_init(void);
 extern void __init omap3xxx_clockdomains_init(void);
 extern void __init am33xx_clockdomains_init(void);
 extern void __init omap44xx_clockdomains_init(void);
+extern void __init omap54xx_clockdomains_init(void);
 
 extern void clkdm_add_autodeps(struct clockdomain *clkdm);
 extern void clkdm_del_autodeps(struct clockdomain *clkdm);
diff --git a/arch/arm/mach-omap2/clockdomains54xx_data.c b/arch/arm/mach-omap2/clockdomains54xx_data.c
new file mode 100644 (file)
index 0000000..1a3c69d
--- /dev/null
@@ -0,0 +1,464 @@
+/*
+ * OMAP54XX Clock domains framework
+ *
+ * Copyright (C) 2013 Texas Instruments, Inc.
+ *
+ * Abhijit Pagare (abhijitpagare@ti.com)
+ * Benoit Cousson (b-cousson@ti.com)
+ * Paul Walmsley (paul@pwsan.com)
+ *
+ * This file is automatically generated from the OMAP hardware databases.
+ * We respectfully ask that any modifications to this file be coordinated
+ * with the public linux-omap@vger.kernel.org mailing list and the
+ * authors above to ensure that the autogeneration scripts are kept
+ * up-to-date with the file contents.
+ *
+ * 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/io.h>
+
+#include "clockdomain.h"
+#include "cm1_54xx.h"
+#include "cm2_54xx.h"
+
+#include "cm-regbits-54xx.h"
+#include "prm54xx.h"
+#include "prcm44xx.h"
+#include "prcm_mpu54xx.h"
+
+/* Static Dependencies for OMAP4 Clock Domains */
+
+static struct clkdm_dep c2c_wkup_sleep_deps[] = {
+       { .clkdm_name = "abe_clkdm" },
+       { .clkdm_name = "emif_clkdm" },
+       { .clkdm_name = "iva_clkdm" },
+       { .clkdm_name = "l3init_clkdm" },
+       { .clkdm_name = "l3main1_clkdm" },
+       { .clkdm_name = "l3main2_clkdm" },
+       { .clkdm_name = "l4cfg_clkdm" },
+       { .clkdm_name = "l4per_clkdm" },
+       { NULL },
+};
+
+static struct clkdm_dep cam_wkup_sleep_deps[] = {
+       { .clkdm_name = "emif_clkdm" },
+       { .clkdm_name = "iva_clkdm" },
+       { .clkdm_name = "l3main1_clkdm" },
+       { NULL },
+};
+
+static struct clkdm_dep dma_wkup_sleep_deps[] = {
+       { .clkdm_name = "abe_clkdm" },
+       { .clkdm_name = "dss_clkdm" },
+       { .clkdm_name = "emif_clkdm" },
+       { .clkdm_name = "ipu_clkdm" },
+       { .clkdm_name = "iva_clkdm" },
+       { .clkdm_name = "l3init_clkdm" },
+       { .clkdm_name = "l3main1_clkdm" },
+       { .clkdm_name = "l4cfg_clkdm" },
+       { .clkdm_name = "l4per_clkdm" },
+       { .clkdm_name = "l4sec_clkdm" },
+       { .clkdm_name = "wkupaon_clkdm" },
+       { NULL },
+};
+
+static struct clkdm_dep dsp_wkup_sleep_deps[] = {
+       { .clkdm_name = "abe_clkdm" },
+       { .clkdm_name = "emif_clkdm" },
+       { .clkdm_name = "iva_clkdm" },
+       { .clkdm_name = "l3init_clkdm" },
+       { .clkdm_name = "l3main1_clkdm" },
+       { .clkdm_name = "l3main2_clkdm" },
+       { .clkdm_name = "l4cfg_clkdm" },
+       { .clkdm_name = "l4per_clkdm" },
+       { .clkdm_name = "wkupaon_clkdm" },
+       { NULL },
+};
+
+static struct clkdm_dep dss_wkup_sleep_deps[] = {
+       { .clkdm_name = "emif_clkdm" },
+       { .clkdm_name = "iva_clkdm" },
+       { .clkdm_name = "l3main2_clkdm" },
+       { NULL },
+};
+
+static struct clkdm_dep gpu_wkup_sleep_deps[] = {
+       { .clkdm_name = "emif_clkdm" },
+       { .clkdm_name = "iva_clkdm" },
+       { .clkdm_name = "l3main1_clkdm" },
+       { NULL },
+};
+
+static struct clkdm_dep ipu_wkup_sleep_deps[] = {
+       { .clkdm_name = "abe_clkdm" },
+       { .clkdm_name = "dsp_clkdm" },
+       { .clkdm_name = "dss_clkdm" },
+       { .clkdm_name = "emif_clkdm" },
+       { .clkdm_name = "gpu_clkdm" },
+       { .clkdm_name = "iva_clkdm" },
+       { .clkdm_name = "l3init_clkdm" },
+       { .clkdm_name = "l3main1_clkdm" },
+       { .clkdm_name = "l3main2_clkdm" },
+       { .clkdm_name = "l4cfg_clkdm" },
+       { .clkdm_name = "l4per_clkdm" },
+       { .clkdm_name = "l4sec_clkdm" },
+       { .clkdm_name = "wkupaon_clkdm" },
+       { NULL },
+};
+
+static struct clkdm_dep iva_wkup_sleep_deps[] = {
+       { .clkdm_name = "emif_clkdm" },
+       { .clkdm_name = "l3main1_clkdm" },
+       { NULL },
+};
+
+static struct clkdm_dep l3init_wkup_sleep_deps[] = {
+       { .clkdm_name = "abe_clkdm" },
+       { .clkdm_name = "emif_clkdm" },
+       { .clkdm_name = "iva_clkdm" },
+       { .clkdm_name = "l4cfg_clkdm" },
+       { .clkdm_name = "l4per_clkdm" },
+       { .clkdm_name = "l4sec_clkdm" },
+       { .clkdm_name = "wkupaon_clkdm" },
+       { NULL },
+};
+
+static struct clkdm_dep l4sec_wkup_sleep_deps[] = {
+       { .clkdm_name = "emif_clkdm" },
+       { .clkdm_name = "l3main1_clkdm" },
+       { .clkdm_name = "l4per_clkdm" },
+       { NULL },
+};
+
+static struct clkdm_dep mipiext_wkup_sleep_deps[] = {
+       { .clkdm_name = "abe_clkdm" },
+       { .clkdm_name = "emif_clkdm" },
+       { .clkdm_name = "iva_clkdm" },
+       { .clkdm_name = "l3init_clkdm" },
+       { .clkdm_name = "l3main1_clkdm" },
+       { .clkdm_name = "l3main2_clkdm" },
+       { .clkdm_name = "l4cfg_clkdm" },
+       { .clkdm_name = "l4per_clkdm" },
+       { NULL },
+};
+
+static struct clkdm_dep mpu_wkup_sleep_deps[] = {
+       { .clkdm_name = "abe_clkdm" },
+       { .clkdm_name = "dsp_clkdm" },
+       { .clkdm_name = "dss_clkdm" },
+       { .clkdm_name = "emif_clkdm" },
+       { .clkdm_name = "gpu_clkdm" },
+       { .clkdm_name = "ipu_clkdm" },
+       { .clkdm_name = "iva_clkdm" },
+       { .clkdm_name = "l3init_clkdm" },
+       { .clkdm_name = "l3main1_clkdm" },
+       { .clkdm_name = "l3main2_clkdm" },
+       { .clkdm_name = "l4cfg_clkdm" },
+       { .clkdm_name = "l4per_clkdm" },
+       { .clkdm_name = "l4sec_clkdm" },
+       { .clkdm_name = "wkupaon_clkdm" },
+       { NULL },
+};
+
+static struct clockdomain l4sec_54xx_clkdm = {
+       .name             = "l4sec_clkdm",
+       .pwrdm            = { .name = "core_pwrdm" },
+       .prcm_partition   = OMAP54XX_CM_CORE_PARTITION,
+       .cm_inst          = OMAP54XX_CM_CORE_CORE_INST,
+       .clkdm_offs       = OMAP54XX_CM_CORE_CORE_L4SEC_CDOFFS,
+       .dep_bit          = OMAP54XX_L4SEC_STATDEP_SHIFT,
+       .wkdep_srcs       = l4sec_wkup_sleep_deps,
+       .sleepdep_srcs    = l4sec_wkup_sleep_deps,
+       .flags            = CLKDM_CAN_HWSUP_SWSUP,
+};
+
+static struct clockdomain iva_54xx_clkdm = {
+       .name             = "iva_clkdm",
+       .pwrdm            = { .name = "iva_pwrdm" },
+       .prcm_partition   = OMAP54XX_CM_CORE_PARTITION,
+       .cm_inst          = OMAP54XX_CM_CORE_IVA_INST,
+       .clkdm_offs       = OMAP54XX_CM_CORE_IVA_IVA_CDOFFS,
+       .dep_bit          = OMAP54XX_IVA_STATDEP_SHIFT,
+       .wkdep_srcs       = iva_wkup_sleep_deps,
+       .sleepdep_srcs    = iva_wkup_sleep_deps,
+       .flags            = CLKDM_CAN_HWSUP_SWSUP,
+};
+
+static struct clockdomain mipiext_54xx_clkdm = {
+       .name             = "mipiext_clkdm",
+       .pwrdm            = { .name = "core_pwrdm" },
+       .prcm_partition   = OMAP54XX_CM_CORE_PARTITION,
+       .cm_inst          = OMAP54XX_CM_CORE_CORE_INST,
+       .clkdm_offs       = OMAP54XX_CM_CORE_CORE_MIPIEXT_CDOFFS,
+       .wkdep_srcs       = mipiext_wkup_sleep_deps,
+       .sleepdep_srcs    = mipiext_wkup_sleep_deps,
+       .flags            = CLKDM_CAN_FORCE_WAKEUP | CLKDM_CAN_HWSUP,
+};
+
+static struct clockdomain l3main2_54xx_clkdm = {
+       .name             = "l3main2_clkdm",
+       .pwrdm            = { .name = "core_pwrdm" },
+       .prcm_partition   = OMAP54XX_CM_CORE_PARTITION,
+       .cm_inst          = OMAP54XX_CM_CORE_CORE_INST,
+       .clkdm_offs       = OMAP54XX_CM_CORE_CORE_L3MAIN2_CDOFFS,
+       .dep_bit          = OMAP54XX_L3MAIN2_STATDEP_SHIFT,
+       .flags            = CLKDM_CAN_HWSUP,
+};
+
+static struct clockdomain l3main1_54xx_clkdm = {
+       .name             = "l3main1_clkdm",
+       .pwrdm            = { .name = "core_pwrdm" },
+       .prcm_partition   = OMAP54XX_CM_CORE_PARTITION,
+       .cm_inst          = OMAP54XX_CM_CORE_CORE_INST,
+       .clkdm_offs       = OMAP54XX_CM_CORE_CORE_L3MAIN1_CDOFFS,
+       .dep_bit          = OMAP54XX_L3MAIN1_STATDEP_SHIFT,
+       .flags            = CLKDM_CAN_HWSUP,
+};
+
+static struct clockdomain custefuse_54xx_clkdm = {
+       .name             = "custefuse_clkdm",
+       .pwrdm            = { .name = "custefuse_pwrdm" },
+       .prcm_partition   = OMAP54XX_CM_CORE_PARTITION,
+       .cm_inst          = OMAP54XX_CM_CORE_CUSTEFUSE_INST,
+       .clkdm_offs       = OMAP54XX_CM_CORE_CUSTEFUSE_CUSTEFUSE_CDOFFS,
+       .flags            = CLKDM_CAN_FORCE_WAKEUP | CLKDM_CAN_HWSUP,
+};
+
+static struct clockdomain ipu_54xx_clkdm = {
+       .name             = "ipu_clkdm",
+       .pwrdm            = { .name = "core_pwrdm" },
+       .prcm_partition   = OMAP54XX_CM_CORE_PARTITION,
+       .cm_inst          = OMAP54XX_CM_CORE_CORE_INST,
+       .clkdm_offs       = OMAP54XX_CM_CORE_CORE_IPU_CDOFFS,
+       .dep_bit          = OMAP54XX_IPU_STATDEP_SHIFT,
+       .wkdep_srcs       = ipu_wkup_sleep_deps,
+       .sleepdep_srcs    = ipu_wkup_sleep_deps,
+       .flags            = CLKDM_CAN_HWSUP_SWSUP,
+};
+
+static struct clockdomain l4cfg_54xx_clkdm = {
+       .name             = "l4cfg_clkdm",
+       .pwrdm            = { .name = "core_pwrdm" },
+       .prcm_partition   = OMAP54XX_CM_CORE_PARTITION,
+       .cm_inst          = OMAP54XX_CM_CORE_CORE_INST,
+       .clkdm_offs       = OMAP54XX_CM_CORE_CORE_L4CFG_CDOFFS,
+       .dep_bit          = OMAP54XX_L4CFG_STATDEP_SHIFT,
+       .flags            = CLKDM_CAN_HWSUP,
+};
+
+static struct clockdomain abe_54xx_clkdm = {
+       .name             = "abe_clkdm",
+       .pwrdm            = { .name = "abe_pwrdm" },
+       .prcm_partition   = OMAP54XX_CM_CORE_AON_PARTITION,
+       .cm_inst          = OMAP54XX_CM_CORE_AON_ABE_INST,
+       .clkdm_offs       = OMAP54XX_CM_CORE_AON_ABE_ABE_CDOFFS,
+       .dep_bit          = OMAP54XX_ABE_STATDEP_SHIFT,
+       .flags            = CLKDM_CAN_HWSUP_SWSUP,
+};
+
+static struct clockdomain dss_54xx_clkdm = {
+       .name             = "dss_clkdm",
+       .pwrdm            = { .name = "dss_pwrdm" },
+       .prcm_partition   = OMAP54XX_CM_CORE_PARTITION,
+       .cm_inst          = OMAP54XX_CM_CORE_DSS_INST,
+       .clkdm_offs       = OMAP54XX_CM_CORE_DSS_DSS_CDOFFS,
+       .dep_bit          = OMAP54XX_DSS_STATDEP_SHIFT,
+       .wkdep_srcs       = dss_wkup_sleep_deps,
+       .sleepdep_srcs    = dss_wkup_sleep_deps,
+       .flags            = CLKDM_CAN_HWSUP_SWSUP,
+};
+
+static struct clockdomain dsp_54xx_clkdm = {
+       .name             = "dsp_clkdm",
+       .pwrdm            = { .name = "dsp_pwrdm" },
+       .prcm_partition   = OMAP54XX_CM_CORE_AON_PARTITION,
+       .cm_inst          = OMAP54XX_CM_CORE_AON_DSP_INST,
+       .clkdm_offs       = OMAP54XX_CM_CORE_AON_DSP_DSP_CDOFFS,
+       .dep_bit          = OMAP54XX_DSP_STATDEP_SHIFT,
+       .wkdep_srcs       = dsp_wkup_sleep_deps,
+       .sleepdep_srcs    = dsp_wkup_sleep_deps,
+       .flags            = CLKDM_CAN_HWSUP_SWSUP,
+};
+
+static struct clockdomain c2c_54xx_clkdm = {
+       .name             = "c2c_clkdm",
+       .pwrdm            = { .name = "core_pwrdm" },
+       .prcm_partition   = OMAP54XX_CM_CORE_PARTITION,
+       .cm_inst          = OMAP54XX_CM_CORE_CORE_INST,
+       .clkdm_offs       = OMAP54XX_CM_CORE_CORE_C2C_CDOFFS,
+       .wkdep_srcs       = c2c_wkup_sleep_deps,
+       .sleepdep_srcs    = c2c_wkup_sleep_deps,
+       .flags            = CLKDM_CAN_FORCE_WAKEUP | CLKDM_CAN_HWSUP,
+};
+
+static struct clockdomain l4per_54xx_clkdm = {
+       .name             = "l4per_clkdm",
+       .pwrdm            = { .name = "core_pwrdm" },
+       .prcm_partition   = OMAP54XX_CM_CORE_PARTITION,
+       .cm_inst          = OMAP54XX_CM_CORE_CORE_INST,
+       .clkdm_offs       = OMAP54XX_CM_CORE_CORE_L4PER_CDOFFS,
+       .dep_bit          = OMAP54XX_L4PER_STATDEP_SHIFT,
+       .flags            = CLKDM_CAN_HWSUP_SWSUP,
+};
+
+static struct clockdomain gpu_54xx_clkdm = {
+       .name             = "gpu_clkdm",
+       .pwrdm            = { .name = "gpu_pwrdm" },
+       .prcm_partition   = OMAP54XX_CM_CORE_PARTITION,
+       .cm_inst          = OMAP54XX_CM_CORE_GPU_INST,
+       .clkdm_offs       = OMAP54XX_CM_CORE_GPU_GPU_CDOFFS,
+       .dep_bit          = OMAP54XX_GPU_STATDEP_SHIFT,
+       .wkdep_srcs       = gpu_wkup_sleep_deps,
+       .sleepdep_srcs    = gpu_wkup_sleep_deps,
+       .flags            = CLKDM_CAN_HWSUP_SWSUP,
+};
+
+static struct clockdomain wkupaon_54xx_clkdm = {
+       .name             = "wkupaon_clkdm",
+       .pwrdm            = { .name = "wkupaon_pwrdm" },
+       .prcm_partition   = OMAP54XX_PRM_PARTITION,
+       .cm_inst          = OMAP54XX_PRM_WKUPAON_CM_INST,
+       .clkdm_offs       = OMAP54XX_PRM_WKUPAON_CM_WKUPAON_CDOFFS,
+       .dep_bit          = OMAP54XX_WKUPAON_STATDEP_SHIFT,
+       .flags            = CLKDM_CAN_FORCE_WAKEUP | CLKDM_CAN_HWSUP,
+};
+
+static struct clockdomain mpu0_54xx_clkdm = {
+       .name             = "mpu0_clkdm",
+       .pwrdm            = { .name = "cpu0_pwrdm" },
+       .prcm_partition   = OMAP54XX_PRCM_MPU_PARTITION,
+       .cm_inst          = OMAP54XX_PRCM_MPU_CM_C0_INST,
+       .clkdm_offs       = OMAP54XX_PRCM_MPU_CM_C0_CPU0_CDOFFS,
+       .flags            = CLKDM_CAN_FORCE_WAKEUP | CLKDM_CAN_HWSUP,
+};
+
+static struct clockdomain mpu1_54xx_clkdm = {
+       .name             = "mpu1_clkdm",
+       .pwrdm            = { .name = "cpu1_pwrdm" },
+       .prcm_partition   = OMAP54XX_PRCM_MPU_PARTITION,
+       .cm_inst          = OMAP54XX_PRCM_MPU_CM_C1_INST,
+       .clkdm_offs       = OMAP54XX_PRCM_MPU_CM_C1_CPU1_CDOFFS,
+       .flags            = CLKDM_CAN_FORCE_WAKEUP | CLKDM_CAN_HWSUP,
+};
+
+static struct clockdomain coreaon_54xx_clkdm = {
+       .name             = "coreaon_clkdm",
+       .pwrdm            = { .name = "coreaon_pwrdm" },
+       .prcm_partition   = OMAP54XX_CM_CORE_PARTITION,
+       .cm_inst          = OMAP54XX_CM_CORE_COREAON_INST,
+       .clkdm_offs       = OMAP54XX_CM_CORE_COREAON_COREAON_CDOFFS,
+       .flags            = CLKDM_CAN_FORCE_WAKEUP | CLKDM_CAN_HWSUP,
+};
+
+static struct clockdomain mpu_54xx_clkdm = {
+       .name             = "mpu_clkdm",
+       .pwrdm            = { .name = "mpu_pwrdm" },
+       .prcm_partition   = OMAP54XX_CM_CORE_AON_PARTITION,
+       .cm_inst          = OMAP54XX_CM_CORE_AON_MPU_INST,
+       .clkdm_offs       = OMAP54XX_CM_CORE_AON_MPU_MPU_CDOFFS,
+       .wkdep_srcs       = mpu_wkup_sleep_deps,
+       .sleepdep_srcs    = mpu_wkup_sleep_deps,
+       .flags            = CLKDM_CAN_FORCE_WAKEUP | CLKDM_CAN_HWSUP,
+};
+
+static struct clockdomain l3init_54xx_clkdm = {
+       .name             = "l3init_clkdm",
+       .pwrdm            = { .name = "l3init_pwrdm" },
+       .prcm_partition   = OMAP54XX_CM_CORE_PARTITION,
+       .cm_inst          = OMAP54XX_CM_CORE_L3INIT_INST,
+       .clkdm_offs       = OMAP54XX_CM_CORE_L3INIT_L3INIT_CDOFFS,
+       .dep_bit          = OMAP54XX_L3INIT_STATDEP_SHIFT,
+       .wkdep_srcs       = l3init_wkup_sleep_deps,
+       .sleepdep_srcs    = l3init_wkup_sleep_deps,
+       .flags            = CLKDM_CAN_HWSUP_SWSUP,
+};
+
+static struct clockdomain dma_54xx_clkdm = {
+       .name             = "dma_clkdm",
+       .pwrdm            = { .name = "core_pwrdm" },
+       .prcm_partition   = OMAP54XX_CM_CORE_PARTITION,
+       .cm_inst          = OMAP54XX_CM_CORE_CORE_INST,
+       .clkdm_offs       = OMAP54XX_CM_CORE_CORE_DMA_CDOFFS,
+       .wkdep_srcs       = dma_wkup_sleep_deps,
+       .sleepdep_srcs    = dma_wkup_sleep_deps,
+       .flags            = CLKDM_CAN_FORCE_WAKEUP | CLKDM_CAN_HWSUP,
+};
+
+static struct clockdomain l3instr_54xx_clkdm = {
+       .name             = "l3instr_clkdm",
+       .pwrdm            = { .name = "core_pwrdm" },
+       .prcm_partition   = OMAP54XX_CM_CORE_PARTITION,
+       .cm_inst          = OMAP54XX_CM_CORE_CORE_INST,
+       .clkdm_offs       = OMAP54XX_CM_CORE_CORE_L3INSTR_CDOFFS,
+};
+
+static struct clockdomain emif_54xx_clkdm = {
+       .name             = "emif_clkdm",
+       .pwrdm            = { .name = "core_pwrdm" },
+       .prcm_partition   = OMAP54XX_CM_CORE_PARTITION,
+       .cm_inst          = OMAP54XX_CM_CORE_CORE_INST,
+       .clkdm_offs       = OMAP54XX_CM_CORE_CORE_EMIF_CDOFFS,
+       .dep_bit          = OMAP54XX_EMIF_STATDEP_SHIFT,
+       .flags            = CLKDM_CAN_FORCE_WAKEUP | CLKDM_CAN_HWSUP,
+};
+
+static struct clockdomain emu_54xx_clkdm = {
+       .name             = "emu_clkdm",
+       .pwrdm            = { .name = "emu_pwrdm" },
+       .prcm_partition   = OMAP54XX_PRM_PARTITION,
+       .cm_inst          = OMAP54XX_PRM_EMU_CM_INST,
+       .clkdm_offs       = OMAP54XX_PRM_EMU_CM_EMU_CDOFFS,
+       .flags            = CLKDM_CAN_FORCE_WAKEUP | CLKDM_CAN_HWSUP,
+};
+
+static struct clockdomain cam_54xx_clkdm = {
+       .name             = "cam_clkdm",
+       .pwrdm            = { .name = "cam_pwrdm" },
+       .prcm_partition   = OMAP54XX_CM_CORE_PARTITION,
+       .cm_inst          = OMAP54XX_CM_CORE_CAM_INST,
+       .clkdm_offs       = OMAP54XX_CM_CORE_CAM_CAM_CDOFFS,
+       .wkdep_srcs       = cam_wkup_sleep_deps,
+       .sleepdep_srcs    = cam_wkup_sleep_deps,
+       .flags            = CLKDM_CAN_HWSUP_SWSUP,
+};
+
+/* As clockdomains are added or removed above, this list must also be changed */
+static struct clockdomain *clockdomains_omap54xx[] __initdata = {
+       &l4sec_54xx_clkdm,
+       &iva_54xx_clkdm,
+       &mipiext_54xx_clkdm,
+       &l3main2_54xx_clkdm,
+       &l3main1_54xx_clkdm,
+       &custefuse_54xx_clkdm,
+       &ipu_54xx_clkdm,
+       &l4cfg_54xx_clkdm,
+       &abe_54xx_clkdm,
+       &dss_54xx_clkdm,
+       &dsp_54xx_clkdm,
+       &c2c_54xx_clkdm,
+       &l4per_54xx_clkdm,
+       &gpu_54xx_clkdm,
+       &wkupaon_54xx_clkdm,
+       &mpu0_54xx_clkdm,
+       &mpu1_54xx_clkdm,
+       &coreaon_54xx_clkdm,
+       &mpu_54xx_clkdm,
+       &l3init_54xx_clkdm,
+       &dma_54xx_clkdm,
+       &l3instr_54xx_clkdm,
+       &emif_54xx_clkdm,
+       &emu_54xx_clkdm,
+       &cam_54xx_clkdm,
+       NULL
+};
+
+void __init omap54xx_clockdomains_init(void)
+{
+       clkdm_register_platform_funcs(&omap4_clkdm_operations);
+       clkdm_register_clkdms(clockdomains_omap54xx);
+       clkdm_complete_init();
+}
diff --git a/arch/arm/mach-omap2/cm-regbits-54xx.h b/arch/arm/mach-omap2/cm-regbits-54xx.h
new file mode 100644 (file)
index 0000000..e83b8e3
--- /dev/null
@@ -0,0 +1,1737 @@
+/*
+ * OMAP54xx Clock Management register bits
+ *
+ * Copyright (C) 2013 Texas Instruments Incorporated - http://www.ti.com
+ *
+ * Paul Walmsley (paul@pwsan.com)
+ * Rajendra Nayak (rnayak@ti.com)
+ * Benoit Cousson (b-cousson@ti.com)
+ *
+ * This file is automatically generated from the OMAP hardware databases.
+ * We respectfully ask that any modifications to this file be coordinated
+ * with the public linux-omap@vger.kernel.org mailing list and the
+ * authors above to ensure that the autogeneration scripts are kept
+ * up-to-date with the file contents.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#ifndef __ARCH_ARM_MACH_OMAP2_CM_REGBITS_54XX_H
+#define __ARCH_ARM_MACH_OMAP2_CM_REGBITS_54XX_H
+
+/* Used by CM_DSP_DYNAMICDEP, CM_L3MAIN1_DYNAMICDEP, CM_MPU_DYNAMICDEP */
+#define OMAP54XX_ABE_DYNDEP_SHIFT                                      3
+#define OMAP54XX_ABE_DYNDEP_WIDTH                                      0x1
+#define OMAP54XX_ABE_DYNDEP_MASK                                       (1 << 3)
+
+/*
+ * Used by CM_C2C_STATICDEP, CM_DMA_STATICDEP, CM_DSP_STATICDEP,
+ * CM_IPU_STATICDEP, CM_L3INIT_STATICDEP, CM_MIPIEXT_STATICDEP, CM_MPU_STATICDEP
+ */
+#define OMAP54XX_ABE_STATDEP_SHIFT                                     3
+#define OMAP54XX_ABE_STATDEP_WIDTH                                     0x1
+#define OMAP54XX_ABE_STATDEP_MASK                                      (1 << 3)
+
+/*
+ * Used by CM_AUTOIDLE_DPLL_ABE, CM_AUTOIDLE_DPLL_CORE, CM_AUTOIDLE_DPLL_IVA,
+ * CM_AUTOIDLE_DPLL_MPU, CM_AUTOIDLE_DPLL_PER, CM_AUTOIDLE_DPLL_UNIPRO1,
+ * CM_AUTOIDLE_DPLL_UNIPRO2, CM_AUTOIDLE_DPLL_USB
+ */
+#define OMAP54XX_AUTO_DPLL_MODE_SHIFT                                  0
+#define OMAP54XX_AUTO_DPLL_MODE_WIDTH                                  0x3
+#define OMAP54XX_AUTO_DPLL_MODE_MASK                                   (0x7 << 0)
+
+/* Used by CM_L3MAIN2_DYNAMICDEP, CM_L4CFG_DYNAMICDEP */
+#define OMAP54XX_C2C_DYNDEP_SHIFT                                      18
+#define OMAP54XX_C2C_DYNDEP_WIDTH                                      0x1
+#define OMAP54XX_C2C_DYNDEP_MASK                                       (1 << 18)
+
+/* Used by CM_MPU_STATICDEP */
+#define OMAP54XX_C2C_STATDEP_SHIFT                                     18
+#define OMAP54XX_C2C_STATDEP_WIDTH                                     0x1
+#define OMAP54XX_C2C_STATDEP_MASK                                      (1 << 18)
+
+/* Used by CM_IPU_DYNAMICDEP, CM_L3MAIN2_DYNAMICDEP, CM_L4CFG_DYNAMICDEP */
+#define OMAP54XX_CAM_DYNDEP_SHIFT                                      9
+#define OMAP54XX_CAM_DYNDEP_WIDTH                                      0x1
+#define OMAP54XX_CAM_DYNDEP_MASK                                       (1 << 9)
+
+/*
+ * Used by CM_DMA_STATICDEP, CM_DSP_STATICDEP, CM_IPU_STATICDEP,
+ * CM_MPU_STATICDEP
+ */
+#define OMAP54XX_CAM_STATDEP_SHIFT                                     9
+#define OMAP54XX_CAM_STATDEP_WIDTH                                     0x1
+#define OMAP54XX_CAM_STATDEP_MASK                                      (1 << 9)
+
+/* Used by CM_ABE_CLKSTCTRL */
+#define OMAP54XX_CLKACTIVITY_ABE_24M_GFCLK_SHIFT                       13
+#define OMAP54XX_CLKACTIVITY_ABE_24M_GFCLK_WIDTH                       0x1
+#define OMAP54XX_CLKACTIVITY_ABE_24M_GFCLK_MASK                                (1 << 13)
+
+/* Used by CM_ABE_CLKSTCTRL */
+#define OMAP54XX_CLKACTIVITY_ABE_32K_CLK_SHIFT                         12
+#define OMAP54XX_CLKACTIVITY_ABE_32K_CLK_WIDTH                         0x1
+#define OMAP54XX_CLKACTIVITY_ABE_32K_CLK_MASK                          (1 << 12)
+
+/* Used by CM_ABE_CLKSTCTRL */
+#define OMAP54XX_CLKACTIVITY_ABE_GICLK_SHIFT                           9
+#define OMAP54XX_CLKACTIVITY_ABE_GICLK_WIDTH                           0x1
+#define OMAP54XX_CLKACTIVITY_ABE_GICLK_MASK                            (1 << 9)
+
+/* Used by CM_WKUPAON_CLKSTCTRL */
+#define OMAP54XX_CLKACTIVITY_ABE_LP_CLK_SHIFT                          9
+#define OMAP54XX_CLKACTIVITY_ABE_LP_CLK_WIDTH                          0x1
+#define OMAP54XX_CLKACTIVITY_ABE_LP_CLK_MASK                           (1 << 9)
+
+/* Used by CM_ABE_CLKSTCTRL */
+#define OMAP54XX_CLKACTIVITY_ABE_SYS_CLK_SHIFT                         11
+#define OMAP54XX_CLKACTIVITY_ABE_SYS_CLK_WIDTH                         0x1
+#define OMAP54XX_CLKACTIVITY_ABE_SYS_CLK_MASK                          (1 << 11)
+
+/* Used by CM_ABE_CLKSTCTRL */
+#define OMAP54XX_CLKACTIVITY_ABE_X2_CLK_SHIFT                          8
+#define OMAP54XX_CLKACTIVITY_ABE_X2_CLK_WIDTH                          0x1
+#define OMAP54XX_CLKACTIVITY_ABE_X2_CLK_MASK                           (1 << 8)
+
+/* Used by CM_DSS_CLKSTCTRL */
+#define OMAP54XX_CLKACTIVITY_BB2D_GFCLK_SHIFT                          13
+#define OMAP54XX_CLKACTIVITY_BB2D_GFCLK_WIDTH                          0x1
+#define OMAP54XX_CLKACTIVITY_BB2D_GFCLK_MASK                           (1 << 13)
+
+/* Used by CM_C2C_CLKSTCTRL */
+#define OMAP54XX_CLKACTIVITY_C2C_GFCLK_SHIFT                           9
+#define OMAP54XX_CLKACTIVITY_C2C_GFCLK_WIDTH                           0x1
+#define OMAP54XX_CLKACTIVITY_C2C_GFCLK_MASK                            (1 << 9)
+
+/* Used by CM_C2C_CLKSTCTRL */
+#define OMAP54XX_CLKACTIVITY_C2C_GICLK_SHIFT                           10
+#define OMAP54XX_CLKACTIVITY_C2C_GICLK_WIDTH                           0x1
+#define OMAP54XX_CLKACTIVITY_C2C_GICLK_MASK                            (1 << 10)
+
+/* Used by CM_C2C_CLKSTCTRL */
+#define OMAP54XX_CLKACTIVITY_C2C_L4_GICLK_SHIFT                                8
+#define OMAP54XX_CLKACTIVITY_C2C_L4_GICLK_WIDTH                                0x1
+#define OMAP54XX_CLKACTIVITY_C2C_L4_GICLK_MASK                         (1 << 8)
+
+/* Used by CM_CAM_CLKSTCTRL */
+#define OMAP54XX_CLKACTIVITY_CAM_BOOST_GCLK_SHIFT                      11
+#define OMAP54XX_CLKACTIVITY_CAM_BOOST_GCLK_WIDTH                      0x1
+#define OMAP54XX_CLKACTIVITY_CAM_BOOST_GCLK_MASK                       (1 << 11)
+
+/* Used by CM_CAM_CLKSTCTRL */
+#define OMAP54XX_CLKACTIVITY_CAM_GCLK_SHIFT                            8
+#define OMAP54XX_CLKACTIVITY_CAM_GCLK_WIDTH                            0x1
+#define OMAP54XX_CLKACTIVITY_CAM_GCLK_MASK                             (1 << 8)
+
+/* Used by CM_CAM_CLKSTCTRL */
+#define OMAP54XX_CLKACTIVITY_CAM_L3_GICLK_SHIFT                                12
+#define OMAP54XX_CLKACTIVITY_CAM_L3_GICLK_WIDTH                                0x1
+#define OMAP54XX_CLKACTIVITY_CAM_L3_GICLK_MASK                         (1 << 12)
+
+/* Used by CM_COREAON_CLKSTCTRL */
+#define OMAP54XX_CLKACTIVITY_COREAON_32K_GFCLK_SHIFT                   12
+#define OMAP54XX_CLKACTIVITY_COREAON_32K_GFCLK_WIDTH                   0x1
+#define OMAP54XX_CLKACTIVITY_COREAON_32K_GFCLK_MASK                    (1 << 12)
+
+/* Used by CM_COREAON_CLKSTCTRL */
+#define OMAP54XX_CLKACTIVITY_COREAON_IO_SRCOMP_GFCLK_SHIFT             14
+#define OMAP54XX_CLKACTIVITY_COREAON_IO_SRCOMP_GFCLK_WIDTH             0x1
+#define OMAP54XX_CLKACTIVITY_COREAON_IO_SRCOMP_GFCLK_MASK              (1 << 14)
+
+/* Used by CM_COREAON_CLKSTCTRL */
+#define OMAP54XX_CLKACTIVITY_COREAON_L4_GICLK_SHIFT                    8
+#define OMAP54XX_CLKACTIVITY_COREAON_L4_GICLK_WIDTH                    0x1
+#define OMAP54XX_CLKACTIVITY_COREAON_L4_GICLK_MASK                     (1 << 8)
+
+/* Used by CM_CAM_CLKSTCTRL */
+#define OMAP54XX_CLKACTIVITY_CSI_PHY_GFCLK_SHIFT                       9
+#define OMAP54XX_CLKACTIVITY_CSI_PHY_GFCLK_WIDTH                       0x1
+#define OMAP54XX_CLKACTIVITY_CSI_PHY_GFCLK_MASK                                (1 << 9)
+
+/* Used by CM_CUSTEFUSE_CLKSTCTRL */
+#define OMAP54XX_CLKACTIVITY_CUSTEFUSE_L4_GICLK_SHIFT                  8
+#define OMAP54XX_CLKACTIVITY_CUSTEFUSE_L4_GICLK_WIDTH                  0x1
+#define OMAP54XX_CLKACTIVITY_CUSTEFUSE_L4_GICLK_MASK                   (1 << 8)
+
+/* Used by CM_CUSTEFUSE_CLKSTCTRL */
+#define OMAP54XX_CLKACTIVITY_CUSTEFUSE_SYS_GFCLK_SHIFT                 9
+#define OMAP54XX_CLKACTIVITY_CUSTEFUSE_SYS_GFCLK_WIDTH                 0x1
+#define OMAP54XX_CLKACTIVITY_CUSTEFUSE_SYS_GFCLK_MASK                  (1 << 9)
+
+/* Used by CM_EMIF_CLKSTCTRL */
+#define OMAP54XX_CLKACTIVITY_DLL_GCLK_SHIFT                            9
+#define OMAP54XX_CLKACTIVITY_DLL_GCLK_WIDTH                            0x1
+#define OMAP54XX_CLKACTIVITY_DLL_GCLK_MASK                             (1 << 9)
+
+/* Used by CM_DMA_CLKSTCTRL */
+#define OMAP54XX_CLKACTIVITY_DMA_L3_GICLK_SHIFT                                8
+#define OMAP54XX_CLKACTIVITY_DMA_L3_GICLK_WIDTH                                0x1
+#define OMAP54XX_CLKACTIVITY_DMA_L3_GICLK_MASK                         (1 << 8)
+
+/* Used by CM_DSP_CLKSTCTRL */
+#define OMAP54XX_CLKACTIVITY_DSP_GCLK_SHIFT                            8
+#define OMAP54XX_CLKACTIVITY_DSP_GCLK_WIDTH                            0x1
+#define OMAP54XX_CLKACTIVITY_DSP_GCLK_MASK                             (1 << 8)
+
+/* Used by CM_DSS_CLKSTCTRL */
+#define OMAP54XX_CLKACTIVITY_DSS_GFCLK_SHIFT                           9
+#define OMAP54XX_CLKACTIVITY_DSS_GFCLK_WIDTH                           0x1
+#define OMAP54XX_CLKACTIVITY_DSS_GFCLK_MASK                            (1 << 9)
+
+/* Used by CM_DSS_CLKSTCTRL */
+#define OMAP54XX_CLKACTIVITY_DSS_L3_GICLK_SHIFT                                8
+#define OMAP54XX_CLKACTIVITY_DSS_L3_GICLK_WIDTH                                0x1
+#define OMAP54XX_CLKACTIVITY_DSS_L3_GICLK_MASK                         (1 << 8)
+
+/* Used by CM_DSS_CLKSTCTRL */
+#define OMAP54XX_CLKACTIVITY_DSS_SYS_GFCLK_SHIFT                       10
+#define OMAP54XX_CLKACTIVITY_DSS_SYS_GFCLK_WIDTH                       0x1
+#define OMAP54XX_CLKACTIVITY_DSS_SYS_GFCLK_MASK                                (1 << 10)
+
+/* Used by CM_EMIF_CLKSTCTRL */
+#define OMAP54XX_CLKACTIVITY_EMIF_L3_GICLK_SHIFT                       8
+#define OMAP54XX_CLKACTIVITY_EMIF_L3_GICLK_WIDTH                       0x1
+#define OMAP54XX_CLKACTIVITY_EMIF_L3_GICLK_MASK                                (1 << 8)
+
+/* Used by CM_EMIF_CLKSTCTRL */
+#define OMAP54XX_CLKACTIVITY_EMIF_LL_GCLK_SHIFT                                11
+#define OMAP54XX_CLKACTIVITY_EMIF_LL_GCLK_WIDTH                                0x1
+#define OMAP54XX_CLKACTIVITY_EMIF_LL_GCLK_MASK                         (1 << 11)
+
+/* Used by CM_EMIF_CLKSTCTRL */
+#define OMAP54XX_CLKACTIVITY_EMIF_PHY_GCLK_SHIFT                       10
+#define OMAP54XX_CLKACTIVITY_EMIF_PHY_GCLK_WIDTH                       0x1
+#define OMAP54XX_CLKACTIVITY_EMIF_PHY_GCLK_MASK                                (1 << 10)
+
+/* Used by CM_EMU_CLKSTCTRL */
+#define OMAP54XX_CLKACTIVITY_EMU_SYS_GCLK_SHIFT                                8
+#define OMAP54XX_CLKACTIVITY_EMU_SYS_GCLK_WIDTH                                0x1
+#define OMAP54XX_CLKACTIVITY_EMU_SYS_GCLK_MASK                         (1 << 8)
+
+/* Used by CM_CAM_CLKSTCTRL */
+#define OMAP54XX_CLKACTIVITY_FDIF_GCLK_SHIFT                           10
+#define OMAP54XX_CLKACTIVITY_FDIF_GCLK_WIDTH                           0x1
+#define OMAP54XX_CLKACTIVITY_FDIF_GCLK_MASK                            (1 << 10)
+
+/* Used by CM_ABE_CLKSTCTRL */
+#define OMAP54XX_CLKACTIVITY_FUNC_24M_GFCLK_SHIFT                      10
+#define OMAP54XX_CLKACTIVITY_FUNC_24M_GFCLK_WIDTH                      0x1
+#define OMAP54XX_CLKACTIVITY_FUNC_24M_GFCLK_MASK                       (1 << 10)
+
+/* Used by CM_GPU_CLKSTCTRL */
+#define OMAP54XX_CLKACTIVITY_GPU_CORE_GCLK_SHIFT                       9
+#define OMAP54XX_CLKACTIVITY_GPU_CORE_GCLK_WIDTH                       0x1
+#define OMAP54XX_CLKACTIVITY_GPU_CORE_GCLK_MASK                                (1 << 9)
+
+/* Used by CM_GPU_CLKSTCTRL */
+#define OMAP54XX_CLKACTIVITY_GPU_HYD_GCLK_SHIFT                                10
+#define OMAP54XX_CLKACTIVITY_GPU_HYD_GCLK_WIDTH                                0x1
+#define OMAP54XX_CLKACTIVITY_GPU_HYD_GCLK_MASK                         (1 << 10)
+
+/* Used by CM_GPU_CLKSTCTRL */
+#define OMAP54XX_CLKACTIVITY_GPU_SYS_GCLK_SHIFT                                8
+#define OMAP54XX_CLKACTIVITY_GPU_SYS_GCLK_WIDTH                                0x1
+#define OMAP54XX_CLKACTIVITY_GPU_SYS_GCLK_MASK                         (1 << 8)
+
+/* Used by CM_DSS_CLKSTCTRL */
+#define OMAP54XX_CLKACTIVITY_HDMI_CEC_GFCLK_SHIFT                      12
+#define OMAP54XX_CLKACTIVITY_HDMI_CEC_GFCLK_WIDTH                      0x1
+#define OMAP54XX_CLKACTIVITY_HDMI_CEC_GFCLK_MASK                       (1 << 12)
+
+/* Used by CM_DSS_CLKSTCTRL */
+#define OMAP54XX_CLKACTIVITY_HDMI_PHY_GFCLK_SHIFT                      11
+#define OMAP54XX_CLKACTIVITY_HDMI_PHY_GFCLK_WIDTH                      0x1
+#define OMAP54XX_CLKACTIVITY_HDMI_PHY_GFCLK_MASK                       (1 << 11)
+
+/* Used by CM_L3INIT_CLKSTCTRL */
+#define OMAP54XX_CLKACTIVITY_HSIC_P1_480M_GFCLK_SHIFT                  20
+#define OMAP54XX_CLKACTIVITY_HSIC_P1_480M_GFCLK_WIDTH                  0x1
+#define OMAP54XX_CLKACTIVITY_HSIC_P1_480M_GFCLK_MASK                   (1 << 20)
+
+/* Used by CM_L3INIT_CLKSTCTRL */
+#define OMAP54XX_CLKACTIVITY_HSIC_P1_GFCLK_SHIFT                       26
+#define OMAP54XX_CLKACTIVITY_HSIC_P1_GFCLK_WIDTH                       0x1
+#define OMAP54XX_CLKACTIVITY_HSIC_P1_GFCLK_MASK                                (1 << 26)
+
+/* Used by CM_L3INIT_CLKSTCTRL */
+#define OMAP54XX_CLKACTIVITY_HSIC_P2_480M_GFCLK_SHIFT                  21
+#define OMAP54XX_CLKACTIVITY_HSIC_P2_480M_GFCLK_WIDTH                  0x1
+#define OMAP54XX_CLKACTIVITY_HSIC_P2_480M_GFCLK_MASK                   (1 << 21)
+
+/* Used by CM_L3INIT_CLKSTCTRL */
+#define OMAP54XX_CLKACTIVITY_HSIC_P2_GFCLK_SHIFT                       27
+#define OMAP54XX_CLKACTIVITY_HSIC_P2_GFCLK_WIDTH                       0x1
+#define OMAP54XX_CLKACTIVITY_HSIC_P2_GFCLK_MASK                                (1 << 27)
+
+/* Used by CM_L3INIT_CLKSTCTRL */
+#define OMAP54XX_CLKACTIVITY_HSIC_P3_480M_GFCLK_SHIFT                  6
+#define OMAP54XX_CLKACTIVITY_HSIC_P3_480M_GFCLK_WIDTH                  0x1
+#define OMAP54XX_CLKACTIVITY_HSIC_P3_480M_GFCLK_MASK                   (1 << 6)
+
+/* Used by CM_L3INIT_CLKSTCTRL */
+#define OMAP54XX_CLKACTIVITY_HSIC_P3_GFCLK_SHIFT                       7
+#define OMAP54XX_CLKACTIVITY_HSIC_P3_GFCLK_WIDTH                       0x1
+#define OMAP54XX_CLKACTIVITY_HSIC_P3_GFCLK_MASK                                (1 << 7)
+
+/* Used by CM_L3INIT_CLKSTCTRL */
+#define OMAP54XX_CLKACTIVITY_HSI_GFCLK_SHIFT                           16
+#define OMAP54XX_CLKACTIVITY_HSI_GFCLK_WIDTH                           0x1
+#define OMAP54XX_CLKACTIVITY_HSI_GFCLK_MASK                            (1 << 16)
+
+/* Used by CM_IPU_CLKSTCTRL */
+#define OMAP54XX_CLKACTIVITY_IPU_GCLK_SHIFT                            8
+#define OMAP54XX_CLKACTIVITY_IPU_GCLK_WIDTH                            0x1
+#define OMAP54XX_CLKACTIVITY_IPU_GCLK_MASK                             (1 << 8)
+
+/* Used by CM_IVA_CLKSTCTRL */
+#define OMAP54XX_CLKACTIVITY_IVA_GCLK_SHIFT                            8
+#define OMAP54XX_CLKACTIVITY_IVA_GCLK_WIDTH                            0x1
+#define OMAP54XX_CLKACTIVITY_IVA_GCLK_MASK                             (1 << 8)
+
+/* Used by CM_L3INIT_CLKSTCTRL */
+#define OMAP54XX_CLKACTIVITY_L3INIT_48M_GFCLK_SHIFT                    12
+#define OMAP54XX_CLKACTIVITY_L3INIT_48M_GFCLK_WIDTH                    0x1
+#define OMAP54XX_CLKACTIVITY_L3INIT_48M_GFCLK_MASK                     (1 << 12)
+
+/* Used by CM_L3INIT_CLKSTCTRL */
+#define OMAP54XX_CLKACTIVITY_L3INIT_60M_P1_GFCLK_SHIFT                 28
+#define OMAP54XX_CLKACTIVITY_L3INIT_60M_P1_GFCLK_WIDTH                 0x1
+#define OMAP54XX_CLKACTIVITY_L3INIT_60M_P1_GFCLK_MASK                  (1 << 28)
+
+/* Used by CM_L3INIT_CLKSTCTRL */
+#define OMAP54XX_CLKACTIVITY_L3INIT_60M_P2_GFCLK_SHIFT                 29
+#define OMAP54XX_CLKACTIVITY_L3INIT_60M_P2_GFCLK_WIDTH                 0x1
+#define OMAP54XX_CLKACTIVITY_L3INIT_60M_P2_GFCLK_MASK                  (1 << 29)
+
+/* Used by CM_L3INIT_CLKSTCTRL */
+#define OMAP54XX_CLKACTIVITY_L3INIT_L3_GICLK_SHIFT                     8
+#define OMAP54XX_CLKACTIVITY_L3INIT_L3_GICLK_WIDTH                     0x1
+#define OMAP54XX_CLKACTIVITY_L3INIT_L3_GICLK_MASK                      (1 << 8)
+
+/* Used by CM_L3INIT_CLKSTCTRL */
+#define OMAP54XX_CLKACTIVITY_L3INIT_L4_GICLK_SHIFT                     9
+#define OMAP54XX_CLKACTIVITY_L3INIT_L4_GICLK_WIDTH                     0x1
+#define OMAP54XX_CLKACTIVITY_L3INIT_L4_GICLK_MASK                      (1 << 9)
+
+/* Used by CM_L3INIT_CLKSTCTRL */
+#define OMAP54XX_CLKACTIVITY_L3INIT_USB_OTG_SS_LFPS_TX_GFCLK_SHIFT     11
+#define OMAP54XX_CLKACTIVITY_L3INIT_USB_OTG_SS_LFPS_TX_GFCLK_WIDTH     0x1
+#define OMAP54XX_CLKACTIVITY_L3INIT_USB_OTG_SS_LFPS_TX_GFCLK_MASK      (1 << 11)
+
+/* Used by CM_L3INSTR_CLKSTCTRL */
+#define OMAP54XX_CLKACTIVITY_L3INSTR_DLL_AGING_GCLK_SHIFT              9
+#define OMAP54XX_CLKACTIVITY_L3INSTR_DLL_AGING_GCLK_WIDTH              0x1
+#define OMAP54XX_CLKACTIVITY_L3INSTR_DLL_AGING_GCLK_MASK               (1 << 9)
+
+/* Used by CM_L3INSTR_CLKSTCTRL */
+#define OMAP54XX_CLKACTIVITY_L3INSTR_L3_GICLK_SHIFT                    8
+#define OMAP54XX_CLKACTIVITY_L3INSTR_L3_GICLK_WIDTH                    0x1
+#define OMAP54XX_CLKACTIVITY_L3INSTR_L3_GICLK_MASK                     (1 << 8)
+
+/* Used by CM_L3INSTR_CLKSTCTRL */
+#define OMAP54XX_CLKACTIVITY_L3INSTR_TS_GCLK_SHIFT                     10
+#define OMAP54XX_CLKACTIVITY_L3INSTR_TS_GCLK_WIDTH                     0x1
+#define OMAP54XX_CLKACTIVITY_L3INSTR_TS_GCLK_MASK                      (1 << 10)
+
+/* Used by CM_L3MAIN1_CLKSTCTRL */
+#define OMAP54XX_CLKACTIVITY_L3MAIN1_L3_GICLK_SHIFT                    8
+#define OMAP54XX_CLKACTIVITY_L3MAIN1_L3_GICLK_WIDTH                    0x1
+#define OMAP54XX_CLKACTIVITY_L3MAIN1_L3_GICLK_MASK                     (1 << 8)
+
+/* Used by CM_L3MAIN2_CLKSTCTRL */
+#define OMAP54XX_CLKACTIVITY_L3MAIN2_L3_GICLK_SHIFT                    8
+#define OMAP54XX_CLKACTIVITY_L3MAIN2_L3_GICLK_WIDTH                    0x1
+#define OMAP54XX_CLKACTIVITY_L3MAIN2_L3_GICLK_MASK                     (1 << 8)
+
+/* Used by CM_L4CFG_CLKSTCTRL */
+#define OMAP54XX_CLKACTIVITY_L4CFG_L4_GICLK_SHIFT                      8
+#define OMAP54XX_CLKACTIVITY_L4CFG_L4_GICLK_WIDTH                      0x1
+#define OMAP54XX_CLKACTIVITY_L4CFG_L4_GICLK_MASK                       (1 << 8)
+
+/* Used by CM_L4PER_CLKSTCTRL */
+#define OMAP54XX_CLKACTIVITY_L4PER_L4_GICLK_SHIFT                      8
+#define OMAP54XX_CLKACTIVITY_L4PER_L4_GICLK_WIDTH                      0x1
+#define OMAP54XX_CLKACTIVITY_L4PER_L4_GICLK_MASK                       (1 << 8)
+
+/* Used by CM_L4SEC_CLKSTCTRL */
+#define OMAP54XX_CLKACTIVITY_L4SEC_L3_GICLK_SHIFT                      8
+#define OMAP54XX_CLKACTIVITY_L4SEC_L3_GICLK_WIDTH                      0x1
+#define OMAP54XX_CLKACTIVITY_L4SEC_L3_GICLK_MASK                       (1 << 8)
+
+/* Used by CM_L4SEC_CLKSTCTRL */
+#define OMAP54XX_CLKACTIVITY_L4SEC_L4_GICLK_SHIFT                      9
+#define OMAP54XX_CLKACTIVITY_L4SEC_L4_GICLK_WIDTH                      0x1
+#define OMAP54XX_CLKACTIVITY_L4SEC_L4_GICLK_MASK                       (1 << 9)
+
+/* Used by CM_MIPIEXT_CLKSTCTRL */
+#define OMAP54XX_CLKACTIVITY_MIPIEXT_L3_GICLK_SHIFT                    8
+#define OMAP54XX_CLKACTIVITY_MIPIEXT_L3_GICLK_WIDTH                    0x1
+#define OMAP54XX_CLKACTIVITY_MIPIEXT_L3_GICLK_MASK                     (1 << 8)
+
+/* Used by CM_MIPIEXT_CLKSTCTRL */
+#define OMAP54XX_CLKACTIVITY_MIPIEXT_PHY_REF_GFCLK_SHIFT               11
+#define OMAP54XX_CLKACTIVITY_MIPIEXT_PHY_REF_GFCLK_WIDTH               0x1
+#define OMAP54XX_CLKACTIVITY_MIPIEXT_PHY_REF_GFCLK_MASK                        (1 << 11)
+
+/* Used by CM_L3INIT_CLKSTCTRL */
+#define OMAP54XX_CLKACTIVITY_MMC1_32K_GFCLK_SHIFT                      2
+#define OMAP54XX_CLKACTIVITY_MMC1_32K_GFCLK_WIDTH                      0x1
+#define OMAP54XX_CLKACTIVITY_MMC1_32K_GFCLK_MASK                       (1 << 2)
+
+/* Used by CM_L3INIT_CLKSTCTRL */
+#define OMAP54XX_CLKACTIVITY_MMC1_GFCLK_SHIFT                          17
+#define OMAP54XX_CLKACTIVITY_MMC1_GFCLK_WIDTH                          0x1
+#define OMAP54XX_CLKACTIVITY_MMC1_GFCLK_MASK                           (1 << 17)
+
+/* Used by CM_L3INIT_CLKSTCTRL */
+#define OMAP54XX_CLKACTIVITY_MMC2_GFCLK_SHIFT                          18
+#define OMAP54XX_CLKACTIVITY_MMC2_GFCLK_WIDTH                          0x1
+#define OMAP54XX_CLKACTIVITY_MMC2_GFCLK_MASK                           (1 << 18)
+
+/* Used by CM_MPU_CLKSTCTRL */
+#define OMAP54XX_CLKACTIVITY_MPU_GCLK_SHIFT                            8
+#define OMAP54XX_CLKACTIVITY_MPU_GCLK_WIDTH                            0x1
+#define OMAP54XX_CLKACTIVITY_MPU_GCLK_MASK                             (1 << 8)
+
+/* Used by CM_ABE_CLKSTCTRL */
+#define OMAP54XX_CLKACTIVITY_PAD_CLKS_SHIFT                            14
+#define OMAP54XX_CLKACTIVITY_PAD_CLKS_WIDTH                            0x1
+#define OMAP54XX_CLKACTIVITY_PAD_CLKS_MASK                             (1 << 14)
+
+/* Used by CM_ABE_CLKSTCTRL */
+#define OMAP54XX_CLKACTIVITY_PAD_SLIMBUS1_CLK_SHIFT                    15
+#define OMAP54XX_CLKACTIVITY_PAD_SLIMBUS1_CLK_WIDTH                    0x1
+#define OMAP54XX_CLKACTIVITY_PAD_SLIMBUS1_CLK_MASK                     (1 << 15)
+
+/* Used by CM_L3INIT_CLKSTCTRL */
+#define OMAP54XX_CLKACTIVITY_PAD_XCLK60MHSP1_SHIFT                     3
+#define OMAP54XX_CLKACTIVITY_PAD_XCLK60MHSP1_WIDTH                     0x1
+#define OMAP54XX_CLKACTIVITY_PAD_XCLK60MHSP1_MASK                      (1 << 3)
+
+/* Used by CM_L3INIT_CLKSTCTRL */
+#define OMAP54XX_CLKACTIVITY_PAD_XCLK60MHSP2_SHIFT                     4
+#define OMAP54XX_CLKACTIVITY_PAD_XCLK60MHSP2_WIDTH                     0x1
+#define OMAP54XX_CLKACTIVITY_PAD_XCLK60MHSP2_MASK                      (1 << 4)
+
+/* Used by CM_L4PER_CLKSTCTRL */
+#define OMAP54XX_CLKACTIVITY_PER_12M_GFCLK_SHIFT                       15
+#define OMAP54XX_CLKACTIVITY_PER_12M_GFCLK_WIDTH                       0x1
+#define OMAP54XX_CLKACTIVITY_PER_12M_GFCLK_MASK                                (1 << 15)
+
+/* Used by CM_L4PER_CLKSTCTRL */
+#define OMAP54XX_CLKACTIVITY_PER_32K_GFCLK_SHIFT                       17
+#define OMAP54XX_CLKACTIVITY_PER_32K_GFCLK_WIDTH                       0x1
+#define OMAP54XX_CLKACTIVITY_PER_32K_GFCLK_MASK                                (1 << 17)
+
+/* Used by CM_L4PER_CLKSTCTRL */
+#define OMAP54XX_CLKACTIVITY_PER_48M_GFCLK_SHIFT                       18
+#define OMAP54XX_CLKACTIVITY_PER_48M_GFCLK_WIDTH                       0x1
+#define OMAP54XX_CLKACTIVITY_PER_48M_GFCLK_MASK                                (1 << 18)
+
+/* Used by CM_L4PER_CLKSTCTRL */
+#define OMAP54XX_CLKACTIVITY_PER_96M_GFCLK_SHIFT                       19
+#define OMAP54XX_CLKACTIVITY_PER_96M_GFCLK_WIDTH                       0x1
+#define OMAP54XX_CLKACTIVITY_PER_96M_GFCLK_MASK                                (1 << 19)
+
+/* Used by CM_L3INIT_CLKSTCTRL */
+#define OMAP54XX_CLKACTIVITY_SATA_REF_GFCLK_SHIFT                      19
+#define OMAP54XX_CLKACTIVITY_SATA_REF_GFCLK_WIDTH                      0x1
+#define OMAP54XX_CLKACTIVITY_SATA_REF_GFCLK_MASK                       (1 << 19)
+
+/* Used by CM_COREAON_CLKSTCTRL */
+#define OMAP54XX_CLKACTIVITY_SR_CORE_SYS_GFCLK_SHIFT                   11
+#define OMAP54XX_CLKACTIVITY_SR_CORE_SYS_GFCLK_WIDTH                   0x1
+#define OMAP54XX_CLKACTIVITY_SR_CORE_SYS_GFCLK_MASK                    (1 << 11)
+
+/* Used by CM_COREAON_CLKSTCTRL */
+#define OMAP54XX_CLKACTIVITY_SR_MM_SYS_GFCLK_SHIFT                     10
+#define OMAP54XX_CLKACTIVITY_SR_MM_SYS_GFCLK_WIDTH                     0x1
+#define OMAP54XX_CLKACTIVITY_SR_MM_SYS_GFCLK_MASK                      (1 << 10)
+
+/* Used by CM_COREAON_CLKSTCTRL */
+#define OMAP54XX_CLKACTIVITY_SR_MPU_SYS_GFCLK_SHIFT                    9
+#define OMAP54XX_CLKACTIVITY_SR_MPU_SYS_GFCLK_WIDTH                    0x1
+#define OMAP54XX_CLKACTIVITY_SR_MPU_SYS_GFCLK_MASK                     (1 << 9)
+
+/* Used by CM_WKUPAON_CLKSTCTRL */
+#define OMAP54XX_CLKACTIVITY_SYS_CLK_SHIFT                             8
+#define OMAP54XX_CLKACTIVITY_SYS_CLK_WIDTH                             0x1
+#define OMAP54XX_CLKACTIVITY_SYS_CLK_MASK                              (1 << 8)
+
+/* Used by CM_WKUPAON_CLKSTCTRL */
+#define OMAP54XX_CLKACTIVITY_SYS_CLK_ALL_SHIFT                         15
+#define OMAP54XX_CLKACTIVITY_SYS_CLK_ALL_WIDTH                         0x1
+#define OMAP54XX_CLKACTIVITY_SYS_CLK_ALL_MASK                          (1 << 15)
+
+/* Used by CM_WKUPAON_CLKSTCTRL */
+#define OMAP54XX_CLKACTIVITY_SYS_CLK_FUNC_SHIFT                                14
+#define OMAP54XX_CLKACTIVITY_SYS_CLK_FUNC_WIDTH                                0x1
+#define OMAP54XX_CLKACTIVITY_SYS_CLK_FUNC_MASK                         (1 << 14)
+
+/* Used by CM_L4PER_CLKSTCTRL */
+#define OMAP54XX_CLKACTIVITY_TIMER10_GFCLK_SHIFT                       9
+#define OMAP54XX_CLKACTIVITY_TIMER10_GFCLK_WIDTH                       0x1
+#define OMAP54XX_CLKACTIVITY_TIMER10_GFCLK_MASK                                (1 << 9)
+
+/* Used by CM_L4PER_CLKSTCTRL */
+#define OMAP54XX_CLKACTIVITY_TIMER11_GFCLK_SHIFT                       10
+#define OMAP54XX_CLKACTIVITY_TIMER11_GFCLK_WIDTH                       0x1
+#define OMAP54XX_CLKACTIVITY_TIMER11_GFCLK_MASK                                (1 << 10)
+
+/* Used by CM_L4PER_CLKSTCTRL */
+#define OMAP54XX_CLKACTIVITY_TIMER2_GFCLK_SHIFT                                11
+#define OMAP54XX_CLKACTIVITY_TIMER2_GFCLK_WIDTH                                0x1
+#define OMAP54XX_CLKACTIVITY_TIMER2_GFCLK_MASK                         (1 << 11)
+
+/* Used by CM_L4PER_CLKSTCTRL */
+#define OMAP54XX_CLKACTIVITY_TIMER3_GFCLK_SHIFT                                12
+#define OMAP54XX_CLKACTIVITY_TIMER3_GFCLK_WIDTH                                0x1
+#define OMAP54XX_CLKACTIVITY_TIMER3_GFCLK_MASK                         (1 << 12)
+
+/* Used by CM_L4PER_CLKSTCTRL */
+#define OMAP54XX_CLKACTIVITY_TIMER4_GFCLK_SHIFT                                13
+#define OMAP54XX_CLKACTIVITY_TIMER4_GFCLK_WIDTH                                0x1
+#define OMAP54XX_CLKACTIVITY_TIMER4_GFCLK_MASK                         (1 << 13)
+
+/* Used by CM_L4PER_CLKSTCTRL */
+#define OMAP54XX_CLKACTIVITY_TIMER9_GFCLK_SHIFT                                14
+#define OMAP54XX_CLKACTIVITY_TIMER9_GFCLK_WIDTH                                0x1
+#define OMAP54XX_CLKACTIVITY_TIMER9_GFCLK_MASK                         (1 << 14)
+
+/* Used by CM_L3INIT_CLKSTCTRL */
+#define OMAP54XX_CLKACTIVITY_TLL_CH0_GFCLK_SHIFT                       22
+#define OMAP54XX_CLKACTIVITY_TLL_CH0_GFCLK_WIDTH                       0x1
+#define OMAP54XX_CLKACTIVITY_TLL_CH0_GFCLK_MASK                                (1 << 22)
+
+/* Used by CM_L3INIT_CLKSTCTRL */
+#define OMAP54XX_CLKACTIVITY_TLL_CH1_GFCLK_SHIFT                       23
+#define OMAP54XX_CLKACTIVITY_TLL_CH1_GFCLK_WIDTH                       0x1
+#define OMAP54XX_CLKACTIVITY_TLL_CH1_GFCLK_MASK                                (1 << 23)
+
+/* Used by CM_L3INIT_CLKSTCTRL */
+#define OMAP54XX_CLKACTIVITY_TLL_CH2_GFCLK_SHIFT                       24
+#define OMAP54XX_CLKACTIVITY_TLL_CH2_GFCLK_WIDTH                       0x1
+#define OMAP54XX_CLKACTIVITY_TLL_CH2_GFCLK_MASK                                (1 << 24)
+
+/* Used by CM_MIPIEXT_CLKSTCTRL */
+#define OMAP54XX_CLKACTIVITY_UNIPRO1_DPLL_CLK_SHIFT                    10
+#define OMAP54XX_CLKACTIVITY_UNIPRO1_DPLL_CLK_WIDTH                    0x1
+#define OMAP54XX_CLKACTIVITY_UNIPRO1_DPLL_CLK_MASK                     (1 << 10)
+
+/* Used by CM_MIPIEXT_CLKSTCTRL */
+#define OMAP54XX_CLKACTIVITY_UNIPRO1_PHY_GFCLK_SHIFT                   13
+#define OMAP54XX_CLKACTIVITY_UNIPRO1_PHY_GFCLK_WIDTH                   0x1
+#define OMAP54XX_CLKACTIVITY_UNIPRO1_PHY_GFCLK_MASK                    (1 << 13)
+
+/* Used by CM_MIPIEXT_CLKSTCTRL */
+#define OMAP54XX_CLKACTIVITY_UNIPRO1_TXPHY_LS_GFCLK_SHIFT              12
+#define OMAP54XX_CLKACTIVITY_UNIPRO1_TXPHY_LS_GFCLK_WIDTH              0x1
+#define OMAP54XX_CLKACTIVITY_UNIPRO1_TXPHY_LS_GFCLK_MASK               (1 << 12)
+
+/* Used by CM_L3INIT_CLKSTCTRL */
+#define OMAP54XX_CLKACTIVITY_UNIPRO2_DPLL_CLK_SHIFT                    10
+#define OMAP54XX_CLKACTIVITY_UNIPRO2_DPLL_CLK_WIDTH                    0x1
+#define OMAP54XX_CLKACTIVITY_UNIPRO2_DPLL_CLK_MASK                     (1 << 10)
+
+/* Used by CM_L3INIT_CLKSTCTRL */
+#define OMAP54XX_CLKACTIVITY_UNIPRO2_PHY_GFCLK_SHIFT                   13
+#define OMAP54XX_CLKACTIVITY_UNIPRO2_PHY_GFCLK_WIDTH                   0x1
+#define OMAP54XX_CLKACTIVITY_UNIPRO2_PHY_GFCLK_MASK                    (1 << 13)
+
+/* Used by CM_L3INIT_CLKSTCTRL */
+#define OMAP54XX_CLKACTIVITY_UNIPRO2_PHY_REF_GFCLK_SHIFT               5
+#define OMAP54XX_CLKACTIVITY_UNIPRO2_PHY_REF_GFCLK_WIDTH               0x1
+#define OMAP54XX_CLKACTIVITY_UNIPRO2_PHY_REF_GFCLK_MASK                        (1 << 5)
+
+/* Used by CM_L3INIT_CLKSTCTRL */
+#define OMAP54XX_CLKACTIVITY_USB_DPLL_CLK_SHIFT                                14
+#define OMAP54XX_CLKACTIVITY_USB_DPLL_CLK_WIDTH                                0x1
+#define OMAP54XX_CLKACTIVITY_USB_DPLL_CLK_MASK                         (1 << 14)
+
+/* Used by CM_L3INIT_CLKSTCTRL */
+#define OMAP54XX_CLKACTIVITY_USB_DPLL_HS_CLK_SHIFT                     15
+#define OMAP54XX_CLKACTIVITY_USB_DPLL_HS_CLK_WIDTH                     0x1
+#define OMAP54XX_CLKACTIVITY_USB_DPLL_HS_CLK_MASK                      (1 << 15)
+
+/* Used by CM_L3INIT_CLKSTCTRL */
+#define OMAP54XX_CLKACTIVITY_USB_OTG_SS_REF_CLK_SHIFT                  31
+#define OMAP54XX_CLKACTIVITY_USB_OTG_SS_REF_CLK_WIDTH                  0x1
+#define OMAP54XX_CLKACTIVITY_USB_OTG_SS_REF_CLK_MASK                   (1 << 31)
+
+/* Used by CM_L3INIT_CLKSTCTRL */
+#define OMAP54XX_CLKACTIVITY_UTMI_P3_GFCLK_SHIFT                       30
+#define OMAP54XX_CLKACTIVITY_UTMI_P3_GFCLK_WIDTH                       0x1
+#define OMAP54XX_CLKACTIVITY_UTMI_P3_GFCLK_MASK                                (1 << 30)
+
+/* Used by CM_L3INIT_CLKSTCTRL */
+#define OMAP54XX_CLKACTIVITY_UTMI_ROOT_GFCLK_SHIFT                     25
+#define OMAP54XX_CLKACTIVITY_UTMI_ROOT_GFCLK_WIDTH                     0x1
+#define OMAP54XX_CLKACTIVITY_UTMI_ROOT_GFCLK_MASK                      (1 << 25)
+
+/* Used by CM_WKUPAON_CLKSTCTRL */
+#define OMAP54XX_CLKACTIVITY_WKUPAON_32K_GFCLK_SHIFT                   11
+#define OMAP54XX_CLKACTIVITY_WKUPAON_32K_GFCLK_WIDTH                   0x1
+#define OMAP54XX_CLKACTIVITY_WKUPAON_32K_GFCLK_MASK                    (1 << 11)
+
+/* Used by CM_WKUPAON_CLKSTCTRL */
+#define OMAP54XX_CLKACTIVITY_WKUPAON_GICLK_SHIFT                       12
+#define OMAP54XX_CLKACTIVITY_WKUPAON_GICLK_WIDTH                       0x1
+#define OMAP54XX_CLKACTIVITY_WKUPAON_GICLK_MASK                                (1 << 12)
+
+/* Used by CM_WKUPAON_CLKSTCTRL */
+#define OMAP54XX_CLKACTIVITY_WKUPAON_IO_SRCOMP_GFCLK_SHIFT             13
+#define OMAP54XX_CLKACTIVITY_WKUPAON_IO_SRCOMP_GFCLK_WIDTH             0x1
+#define OMAP54XX_CLKACTIVITY_WKUPAON_IO_SRCOMP_GFCLK_MASK              (1 << 13)
+
+/* Used by CM_COREAON_IO_SRCOMP_CLKCTRL, CM_WKUPAON_IO_SRCOMP_CLKCTRL */
+#define OMAP54XX_CLKEN_SRCOMP_FCLK_SHIFT                               8
+#define OMAP54XX_CLKEN_SRCOMP_FCLK_WIDTH                               0x1
+#define OMAP54XX_CLKEN_SRCOMP_FCLK_MASK                                        (1 << 8)
+
+/*
+ * Used by CM_ABE_TIMER5_CLKCTRL, CM_ABE_TIMER6_CLKCTRL, CM_ABE_TIMER7_CLKCTRL,
+ * CM_ABE_TIMER8_CLKCTRL, CM_L3INIT_HSI_CLKCTRL, CM_L4PER_TIMER10_CLKCTRL,
+ * CM_L4PER_TIMER11_CLKCTRL, CM_L4PER_TIMER2_CLKCTRL, CM_L4PER_TIMER3_CLKCTRL,
+ * CM_L4PER_TIMER4_CLKCTRL, CM_L4PER_TIMER9_CLKCTRL, CM_WKUPAON_TIMER1_CLKCTRL
+ */
+#define OMAP54XX_CLKSEL_SHIFT                                          24
+#define OMAP54XX_CLKSEL_WIDTH                                          0x1
+#define OMAP54XX_CLKSEL_MASK                                           (1 << 24)
+
+/*
+ * Renamed from CLKSEL Used by CM_CLKSEL_ABE_DSS_SYS, CM_CLKSEL_ABE_PLL_REF,
+ * CM_CLKSEL_USB_60MHZ, CM_CLKSEL_WKUPAON
+ */
+#define OMAP54XX_CLKSEL_0_0_SHIFT                                      0
+#define OMAP54XX_CLKSEL_0_0_WIDTH                                      0x1
+#define OMAP54XX_CLKSEL_0_0_MASK                                       (1 << 0)
+
+/* Renamed from CLKSEL Used by CM_BYPCLK_DPLL_IVA, CM_BYPCLK_DPLL_MPU */
+#define OMAP54XX_CLKSEL_0_1_SHIFT                                      0
+#define OMAP54XX_CLKSEL_0_1_WIDTH                                      0x2
+#define OMAP54XX_CLKSEL_0_1_MASK                                       (0x3 << 0)
+
+/* Renamed from CLKSEL Used by CM_L3INSTR_CTRL_MODULE_BANDGAP_CLKCTRL */
+#define OMAP54XX_CLKSEL_24_25_SHIFT                                    24
+#define OMAP54XX_CLKSEL_24_25_WIDTH                                    0x2
+#define OMAP54XX_CLKSEL_24_25_MASK                                     (0x3 << 24)
+
+/* Used by CM_MPU_MPU_CLKCTRL */
+#define OMAP54XX_CLKSEL_ABE_DIV_MODE_SHIFT                             26
+#define OMAP54XX_CLKSEL_ABE_DIV_MODE_WIDTH                             0x1
+#define OMAP54XX_CLKSEL_ABE_DIV_MODE_MASK                              (1 << 26)
+
+/* Used by CM_ABE_AESS_CLKCTRL */
+#define OMAP54XX_CLKSEL_AESS_FCLK_SHIFT                                        24
+#define OMAP54XX_CLKSEL_AESS_FCLK_WIDTH                                        0x1
+#define OMAP54XX_CLKSEL_AESS_FCLK_MASK                                 (1 << 24)
+
+/* Used by CM_L3INIT_MMC1_CLKCTRL, CM_L3INIT_MMC2_CLKCTRL */
+#define OMAP54XX_CLKSEL_DIV_SHIFT                                      25
+#define OMAP54XX_CLKSEL_DIV_WIDTH                                      0x1
+#define OMAP54XX_CLKSEL_DIV_MASK                                       (1 << 25)
+
+/* Used by CM_MPU_MPU_CLKCTRL */
+#define OMAP54XX_CLKSEL_EMIF_DIV_MODE_SHIFT                            24
+#define OMAP54XX_CLKSEL_EMIF_DIV_MODE_WIDTH                            0x2
+#define OMAP54XX_CLKSEL_EMIF_DIV_MODE_MASK                             (0x3 << 24)
+
+/* Used by CM_CAM_FDIF_CLKCTRL */
+#define OMAP54XX_CLKSEL_FCLK_SHIFT                                     24
+#define OMAP54XX_CLKSEL_FCLK_WIDTH                                     0x1
+#define OMAP54XX_CLKSEL_FCLK_MASK                                      (1 << 24)
+
+/* Used by CM_GPU_GPU_CLKCTRL */
+#define OMAP54XX_CLKSEL_GPU_CORE_GCLK_SHIFT                            24
+#define OMAP54XX_CLKSEL_GPU_CORE_GCLK_WIDTH                            0x1
+#define OMAP54XX_CLKSEL_GPU_CORE_GCLK_MASK                             (1 << 24)
+
+/* Used by CM_GPU_GPU_CLKCTRL */
+#define OMAP54XX_CLKSEL_GPU_HYD_GCLK_SHIFT                             25
+#define OMAP54XX_CLKSEL_GPU_HYD_GCLK_WIDTH                             0x1
+#define OMAP54XX_CLKSEL_GPU_HYD_GCLK_MASK                              (1 << 25)
+
+/* Used by CM_GPU_GPU_CLKCTRL */
+#define OMAP54XX_CLKSEL_GPU_SYS_CLK_SHIFT                              26
+#define OMAP54XX_CLKSEL_GPU_SYS_CLK_WIDTH                              0x1
+#define OMAP54XX_CLKSEL_GPU_SYS_CLK_MASK                               (1 << 26)
+
+/*
+ * Used by CM_ABE_DMIC_CLKCTRL, CM_ABE_MCASP_CLKCTRL, CM_ABE_MCBSP1_CLKCTRL,
+ * CM_ABE_MCBSP2_CLKCTRL, CM_ABE_MCBSP3_CLKCTRL
+ */
+#define OMAP54XX_CLKSEL_INTERNAL_SOURCE_SHIFT                          26
+#define OMAP54XX_CLKSEL_INTERNAL_SOURCE_WIDTH                          0x2
+#define OMAP54XX_CLKSEL_INTERNAL_SOURCE_MASK                           (0x3 << 26)
+
+/* Used by CM_CLKSEL_CORE */
+#define OMAP54XX_CLKSEL_L3_SHIFT                                       4
+#define OMAP54XX_CLKSEL_L3_WIDTH                                       0x1
+#define OMAP54XX_CLKSEL_L3_MASK                                                (1 << 4)
+
+/* Renamed from CLKSEL_L3 Used by CM_SHADOW_FREQ_CONFIG2 */
+#define OMAP54XX_CLKSEL_L3_1_1_SHIFT                                   1
+#define OMAP54XX_CLKSEL_L3_1_1_WIDTH                                   0x1
+#define OMAP54XX_CLKSEL_L3_1_1_MASK                                    (1 << 1)
+
+/* Used by CM_CLKSEL_CORE */
+#define OMAP54XX_CLKSEL_L4_SHIFT                                       8
+#define OMAP54XX_CLKSEL_L4_WIDTH                                       0x1
+#define OMAP54XX_CLKSEL_L4_MASK                                                (1 << 8)
+
+/* Used by CM_EMIF_EMIF1_CLKCTRL */
+#define OMAP54XX_CLKSEL_LL_SHIFT                                       24
+#define OMAP54XX_CLKSEL_LL_WIDTH                                       0x1
+#define OMAP54XX_CLKSEL_LL_MASK                                                (1 << 24)
+
+/* Used by CM_CLKSEL_ABE */
+#define OMAP54XX_CLKSEL_OPP_SHIFT                                      0
+#define OMAP54XX_CLKSEL_OPP_WIDTH                                      0x2
+#define OMAP54XX_CLKSEL_OPP_MASK                                       (0x3 << 0)
+
+/* Renamed from CLKSEL_OPP Used by CM_L3INIT_UNIPRO2_CLKCTRL */
+#define OMAP54XX_CLKSEL_OPP_24_24_SHIFT                                        24
+#define OMAP54XX_CLKSEL_OPP_24_24_WIDTH                                        0x1
+#define OMAP54XX_CLKSEL_OPP_24_24_MASK                                 (1 << 24)
+
+/*
+ * Used by CM_ABE_DMIC_CLKCTRL, CM_ABE_MCASP_CLKCTRL, CM_ABE_MCBSP1_CLKCTRL,
+ * CM_ABE_MCBSP2_CLKCTRL, CM_ABE_MCBSP3_CLKCTRL
+ */
+#define OMAP54XX_CLKSEL_SOURCE_SHIFT                                   24
+#define OMAP54XX_CLKSEL_SOURCE_WIDTH                                   0x2
+#define OMAP54XX_CLKSEL_SOURCE_MASK                                    (0x3 << 24)
+
+/*
+ * Renamed from CLKSEL_SOURCE Used by CM_L3INIT_MMC1_CLKCTRL,
+ * CM_L3INIT_MMC2_CLKCTRL
+ */
+#define OMAP54XX_CLKSEL_SOURCE_L3INIT_MMC1_SHIFT                       24
+#define OMAP54XX_CLKSEL_SOURCE_L3INIT_MMC1_WIDTH                       0x1
+#define OMAP54XX_CLKSEL_SOURCE_L3INIT_MMC1_MASK                                (1 << 24)
+
+/* Used by CM_L3INIT_USB_HOST_HS_CLKCTRL */
+#define OMAP54XX_CLKSEL_UTMI_P1_SHIFT                                  24
+#define OMAP54XX_CLKSEL_UTMI_P1_WIDTH                                  0x1
+#define OMAP54XX_CLKSEL_UTMI_P1_MASK                                   (1 << 24)
+
+/* Used by CM_L3INIT_USB_HOST_HS_CLKCTRL */
+#define OMAP54XX_CLKSEL_UTMI_P2_SHIFT                                  25
+#define OMAP54XX_CLKSEL_UTMI_P2_WIDTH                                  0x1
+#define OMAP54XX_CLKSEL_UTMI_P2_MASK                                   (1 << 25)
+
+/*
+ * Used by CM_DIV_H11_DPLL_CORE, CM_DIV_H11_DPLL_IVA, CM_DIV_H11_DPLL_PER,
+ * CM_DIV_H12_DPLL_CORE, CM_DIV_H12_DPLL_IVA, CM_DIV_H12_DPLL_PER,
+ * CM_DIV_H13_DPLL_CORE, CM_DIV_H13_DPLL_PER, CM_DIV_H14_DPLL_CORE,
+ * CM_DIV_H14_DPLL_PER, CM_DIV_H21_DPLL_CORE, CM_DIV_H22_DPLL_CORE,
+ * CM_DIV_H23_DPLL_CORE, CM_DIV_H24_DPLL_CORE, CM_DIV_M2_DPLL_ABE,
+ * CM_DIV_M2_DPLL_CORE, CM_DIV_M2_DPLL_MPU, CM_DIV_M2_DPLL_PER,
+ * CM_DIV_M2_DPLL_UNIPRO1, CM_DIV_M2_DPLL_UNIPRO2, CM_DIV_M2_DPLL_USB,
+ * CM_DIV_M3_DPLL_ABE, CM_DIV_M3_DPLL_CORE, CM_DIV_M3_DPLL_PER
+ */
+#define OMAP54XX_CLKST_SHIFT                                           9
+#define OMAP54XX_CLKST_WIDTH                                           0x1
+#define OMAP54XX_CLKST_MASK                                            (1 << 9)
+
+/*
+ * Used by CM_ABE_CLKSTCTRL, CM_C2C_CLKSTCTRL, CM_CAM_CLKSTCTRL,
+ * CM_COREAON_CLKSTCTRL, CM_CUSTEFUSE_CLKSTCTRL, CM_DMA_CLKSTCTRL,
+ * CM_DSP_CLKSTCTRL, CM_DSS_CLKSTCTRL, CM_EMIF_CLKSTCTRL, CM_EMU_CLKSTCTRL,
+ * CM_GPU_CLKSTCTRL, CM_IPU_CLKSTCTRL, CM_IVA_CLKSTCTRL, CM_L3INIT_CLKSTCTRL,
+ * CM_L3INSTR_CLKSTCTRL, CM_L3MAIN1_CLKSTCTRL, CM_L3MAIN2_CLKSTCTRL,
+ * CM_L4CFG_CLKSTCTRL, CM_L4PER_CLKSTCTRL, CM_L4SEC_CLKSTCTRL,
+ * CM_MIPIEXT_CLKSTCTRL, CM_MPU_CLKSTCTRL, CM_WKUPAON_CLKSTCTRL
+ */
+#define OMAP54XX_CLKTRCTRL_SHIFT                                       0
+#define OMAP54XX_CLKTRCTRL_WIDTH                                       0x2
+#define OMAP54XX_CLKTRCTRL_MASK                                                (0x3 << 0)
+
+/* Used by CM_DIV_M2_DPLL_ABE, CM_DIV_M2_DPLL_PER */
+#define OMAP54XX_CLKX2ST_SHIFT                                         11
+#define OMAP54XX_CLKX2ST_WIDTH                                         0x1
+#define OMAP54XX_CLKX2ST_MASK                                          (1 << 11)
+
+/* Used by CM_L4CFG_DYNAMICDEP */
+#define OMAP54XX_COREAON_DYNDEP_SHIFT                                  16
+#define OMAP54XX_COREAON_DYNDEP_WIDTH                                  0x1
+#define OMAP54XX_COREAON_DYNDEP_MASK                                   (1 << 16)
+
+/* Used by CM_DSP_STATICDEP, CM_IPU_STATICDEP, CM_MPU_STATICDEP */
+#define OMAP54XX_COREAON_STATDEP_SHIFT                                 16
+#define OMAP54XX_COREAON_STATDEP_WIDTH                                 0x1
+#define OMAP54XX_COREAON_STATDEP_MASK                                  (1 << 16)
+
+/* Used by CM_L4CFG_DYNAMICDEP */
+#define OMAP54XX_CUSTEFUSE_DYNDEP_SHIFT                                        17
+#define OMAP54XX_CUSTEFUSE_DYNDEP_WIDTH                                        0x1
+#define OMAP54XX_CUSTEFUSE_DYNDEP_MASK                                 (1 << 17)
+
+/* Used by CM_DSP_STATICDEP, CM_IPU_STATICDEP, CM_MPU_STATICDEP */
+#define OMAP54XX_CUSTEFUSE_STATDEP_SHIFT                               17
+#define OMAP54XX_CUSTEFUSE_STATDEP_WIDTH                               0x1
+#define OMAP54XX_CUSTEFUSE_STATDEP_MASK                                        (1 << 17)
+
+/* Used by REVISION_CM_CORE, REVISION_CM_CORE_AON */
+#define OMAP54XX_CUSTOM_SHIFT                                          6
+#define OMAP54XX_CUSTOM_WIDTH                                          0x2
+#define OMAP54XX_CUSTOM_MASK                                           (0x3 << 6)
+
+/*
+ * Used by CM_CLKSEL_DPLL_ABE, CM_CLKSEL_DPLL_CORE, CM_CLKSEL_DPLL_IVA,
+ * CM_CLKSEL_DPLL_MPU, CM_CLKSEL_DPLL_PER, CM_CLKSEL_DPLL_UNIPRO1,
+ * CM_CLKSEL_DPLL_UNIPRO2, CM_CLKSEL_DPLL_USB
+ */
+#define OMAP54XX_DCC_EN_SHIFT                                          22
+#define OMAP54XX_DCC_EN_WIDTH                                          0x1
+#define OMAP54XX_DCC_EN_MASK                                           (1 << 22)
+
+/*
+ * Used by CM_CORE_AON_DEBUG_CM_CORE_AON_FD_TRANS,
+ * CM_CORE_AON_DEBUG_DSS_FD_TRANS, CM_CORE_AON_DEBUG_EMIF_FD_TRANS,
+ * CM_CORE_AON_DEBUG_L4SEC_FD_TRANS
+ */
+#define OMAP54XX_CM_DEBUG_OUT_SHIFT                                    0
+#define OMAP54XX_CM_DEBUG_OUT_WIDTH                                    0xd
+#define OMAP54XX_CM_DEBUG_OUT_MASK                                     (0x1fff << 0)
+
+/*
+ * Renamed from DEBUG_OUT Used by CM_CORE_AON_DEBUG_ABE_FD_TRANS,
+ * CM_CORE_AON_DEBUG_L3INIT_FD_TRANS, CM_CORE_AON_DEBUG_L4PER_FD_TRANS
+ */
+#define OMAP54XX_DEBUG_OUT_0_31_SHIFT                                  0
+#define OMAP54XX_DEBUG_OUT_0_31_WIDTH                                  0x20
+#define OMAP54XX_DEBUG_OUT_0_31_MASK                                   (0xffffffff << 0)
+
+/*
+ * Renamed from DEBUG_OUT Used by CM_CORE_AON_DEBUG_C2C_FD_TRANS,
+ * CM_CORE_AON_DEBUG_COREAON_FD_TRANS, CM_CORE_AON_DEBUG_L4CFG_FD_TRANS
+ */
+#define OMAP54XX_DEBUG_OUT_0_8_SHIFT                                   0
+#define OMAP54XX_DEBUG_OUT_0_8_WIDTH                                   0x9
+#define OMAP54XX_DEBUG_OUT_0_8_MASK                                    (0x1ff << 0)
+
+/*
+ * Renamed from DEBUG_OUT Used by CM_CORE_AON_DEBUG_CUSTEFUSE_FD_TRANS,
+ * CM_CORE_AON_DEBUG_DMA_FD_TRANS, CM_CORE_AON_DEBUG_L3MAIN1_FD_TRANS
+ */
+#define OMAP54XX_DEBUG_OUT_0_4_SHIFT                                   0
+#define OMAP54XX_DEBUG_OUT_0_4_WIDTH                                   0x5
+#define OMAP54XX_DEBUG_OUT_0_4_MASK                                    (0x1f << 0)
+
+/*
+ * Renamed from DEBUG_OUT Used by CM_CORE_AON_DEBUG_DSP_FD_TRANS,
+ * CM_CORE_AON_DEBUG_IPU_FD_TRANS, CM_CORE_AON_DEBUG_MPU_FD_TRANS
+ */
+#define OMAP54XX_DEBUG_OUT_0_5_SHIFT                                   0
+#define OMAP54XX_DEBUG_OUT_0_5_WIDTH                                   0x6
+#define OMAP54XX_DEBUG_OUT_0_5_MASK                                    (0x3f << 0)
+
+/*
+ * Renamed from DEBUG_OUT Used by CM_CORE_AON_DEBUG_CAM_FD_TRANS,
+ * CM_CORE_AON_DEBUG_MIPIEXT_FD_TRANS
+ */
+#define OMAP54XX_DEBUG_OUT_0_10_SHIFT                                  0
+#define OMAP54XX_DEBUG_OUT_0_10_WIDTH                                  0xb
+#define OMAP54XX_DEBUG_OUT_0_10_MASK                                   (0x7ff << 0)
+
+/*
+ * Renamed from DEBUG_OUT Used by CM_CORE_AON_DEBUG_IVA_FD_TRANS,
+ * CM_CORE_AON_DEBUG_L3MAIN2_FD_TRANS
+ */
+#define OMAP54XX_DEBUG_OUT_0_6_SHIFT                                   0
+#define OMAP54XX_DEBUG_OUT_0_6_WIDTH                                   0x7
+#define OMAP54XX_DEBUG_OUT_0_6_MASK                                    (0x7f << 0)
+
+/* Renamed from DEBUG_OUT Used by CM_CORE_AON_DEBUG_ABE_FD_TRANS2 */
+#define OMAP54XX_DEBUG_OUT_0_19_SHIFT                                  0
+#define OMAP54XX_DEBUG_OUT_0_19_WIDTH                                  0x14
+#define OMAP54XX_DEBUG_OUT_0_19_MASK                                   (0xfffff << 0)
+
+/* Renamed from DEBUG_OUT Used by CM_CORE_AON_DEBUG_GPU_FD_TRANS */
+#define OMAP54XX_DEBUG_OUT_0_9_SHIFT                                   0
+#define OMAP54XX_DEBUG_OUT_0_9_WIDTH                                   0xa
+#define OMAP54XX_DEBUG_OUT_0_9_MASK                                    (0x3ff << 0)
+
+/* Renamed from DEBUG_OUT Used by CM_CORE_AON_DEBUG_L3INIT_FD_TRANS2 */
+#define OMAP54XX_DEBUG_OUT_0_26_SHIFT                                  0
+#define OMAP54XX_DEBUG_OUT_0_26_WIDTH                                  0x1b
+#define OMAP54XX_DEBUG_OUT_0_26_MASK                                   (0x7ffffff << 0)
+
+/* Renamed from DEBUG_OUT Used by CM_CORE_AON_DEBUG_L3INSTR_FD_TRANS */
+#define OMAP54XX_DEBUG_OUT_0_13_SHIFT                                  0
+#define OMAP54XX_DEBUG_OUT_0_13_WIDTH                                  0xe
+#define OMAP54XX_DEBUG_OUT_0_13_MASK                                   (0x3fff << 0)
+
+/* Renamed from DEBUG_OUT Used by CM_CORE_AON_DEBUG_L4PER_FD_TRANS2 */
+#define OMAP54XX_DEBUG_OUT_0_21_SHIFT                                  0
+#define OMAP54XX_DEBUG_OUT_0_21_WIDTH                                  0x16
+#define OMAP54XX_DEBUG_OUT_0_21_MASK                                   (0x3fffff << 0)
+
+/*
+ * Used by CM_SSC_DELTAMSTEP_DPLL_ABE, CM_SSC_DELTAMSTEP_DPLL_CORE,
+ * CM_SSC_DELTAMSTEP_DPLL_IVA, CM_SSC_DELTAMSTEP_DPLL_MPU,
+ * CM_SSC_DELTAMSTEP_DPLL_PER
+ */
+#define OMAP54XX_DELTAMSTEP_SHIFT                                      0
+#define OMAP54XX_DELTAMSTEP_WIDTH                                      0x14
+#define OMAP54XX_DELTAMSTEP_MASK                                       (0xfffff << 0)
+
+/*
+ * Renamed from DELTAMSTEP Used by CM_SSC_DELTAMSTEP_DPLL_UNIPRO1,
+ * CM_SSC_DELTAMSTEP_DPLL_UNIPRO2, CM_SSC_DELTAMSTEP_DPLL_USB
+ */
+#define OMAP54XX_DELTAMSTEP_0_20_SHIFT                                 0
+#define OMAP54XX_DELTAMSTEP_0_20_WIDTH                                 0x15
+#define OMAP54XX_DELTAMSTEP_0_20_MASK                                  (0x1fffff << 0)
+
+/*
+ * Used by CM_DIV_H11_DPLL_CORE, CM_DIV_H11_DPLL_IVA, CM_DIV_H11_DPLL_PER,
+ * CM_DIV_H12_DPLL_CORE, CM_DIV_H12_DPLL_IVA, CM_DIV_H12_DPLL_PER,
+ * CM_DIV_H13_DPLL_CORE, CM_DIV_H13_DPLL_PER, CM_DIV_H14_DPLL_CORE,
+ * CM_DIV_H14_DPLL_PER, CM_DIV_H21_DPLL_CORE, CM_DIV_H22_DPLL_CORE,
+ * CM_DIV_H23_DPLL_CORE, CM_DIV_H24_DPLL_CORE
+ */
+#define OMAP54XX_DIVHS_SHIFT                                           0
+#define OMAP54XX_DIVHS_WIDTH                                           0x6
+#define OMAP54XX_DIVHS_MASK                                            (0x3f << 0)
+
+/*
+ * Renamed from DIVHS Used by CM_DIV_M2_DPLL_ABE, CM_DIV_M2_DPLL_CORE,
+ * CM_DIV_M2_DPLL_MPU, CM_DIV_M2_DPLL_PER, CM_DIV_M3_DPLL_ABE,
+ * CM_DIV_M3_DPLL_CORE, CM_DIV_M3_DPLL_PER
+ */
+#define OMAP54XX_DIVHS_0_4_SHIFT                                       0
+#define OMAP54XX_DIVHS_0_4_WIDTH                                       0x5
+#define OMAP54XX_DIVHS_0_4_MASK                                                (0x1f << 0)
+
+/*
+ * Renamed from DIVHS Used by CM_DIV_M2_DPLL_UNIPRO1, CM_DIV_M2_DPLL_UNIPRO2,
+ * CM_DIV_M2_DPLL_USB
+ */
+#define OMAP54XX_DIVHS_0_6_SHIFT                                       0
+#define OMAP54XX_DIVHS_0_6_WIDTH                                       0x7
+#define OMAP54XX_DIVHS_0_6_MASK                                                (0x7f << 0)
+
+/* Used by CM_DLL_CTRL */
+#define OMAP54XX_DLL_OVERRIDE_SHIFT                                    0
+#define OMAP54XX_DLL_OVERRIDE_WIDTH                                    0x1
+#define OMAP54XX_DLL_OVERRIDE_MASK                                     (1 << 0)
+
+/* Renamed from DLL_OVERRIDE Used by CM_SHADOW_FREQ_CONFIG1 */
+#define OMAP54XX_DLL_OVERRIDE_2_2_SHIFT                                        2
+#define OMAP54XX_DLL_OVERRIDE_2_2_WIDTH                                        0x1
+#define OMAP54XX_DLL_OVERRIDE_2_2_MASK                                 (1 << 2)
+
+/* Used by CM_SHADOW_FREQ_CONFIG1 */
+#define OMAP54XX_DLL_RESET_SHIFT                                       3
+#define OMAP54XX_DLL_RESET_WIDTH                                       0x1
+#define OMAP54XX_DLL_RESET_MASK                                                (1 << 3)
+
+/*
+ * Used by CM_CLKSEL_DPLL_ABE, CM_CLKSEL_DPLL_CORE, CM_CLKSEL_DPLL_IVA,
+ * CM_CLKSEL_DPLL_MPU, CM_CLKSEL_DPLL_PER, CM_CLKSEL_DPLL_UNIPRO1,
+ * CM_CLKSEL_DPLL_UNIPRO2, CM_CLKSEL_DPLL_USB
+ */
+#define OMAP54XX_DPLL_BYP_CLKSEL_SHIFT                                 23
+#define OMAP54XX_DPLL_BYP_CLKSEL_WIDTH                                 0x1
+#define OMAP54XX_DPLL_BYP_CLKSEL_MASK                                  (1 << 23)
+
+/* Used by CM_CLKSEL_DPLL_CORE */
+#define OMAP54XX_DPLL_CLKOUTHIF_CLKSEL_SHIFT                           20
+#define OMAP54XX_DPLL_CLKOUTHIF_CLKSEL_WIDTH                           0x1
+#define OMAP54XX_DPLL_CLKOUTHIF_CLKSEL_MASK                            (1 << 20)
+
+/* Used by CM_SHADOW_FREQ_CONFIG1 */
+#define OMAP54XX_DPLL_CORE_DPLL_EN_SHIFT                               8
+#define OMAP54XX_DPLL_CORE_DPLL_EN_WIDTH                               0x3
+#define OMAP54XX_DPLL_CORE_DPLL_EN_MASK                                        (0x7 << 8)
+
+/* Used by CM_SHADOW_FREQ_CONFIG2 */
+#define OMAP54XX_DPLL_CORE_H12_DIV_SHIFT                               2
+#define OMAP54XX_DPLL_CORE_H12_DIV_WIDTH                               0x6
+#define OMAP54XX_DPLL_CORE_H12_DIV_MASK                                        (0x3f << 2)
+
+/* Used by CM_SHADOW_FREQ_CONFIG1 */
+#define OMAP54XX_DPLL_CORE_M2_DIV_SHIFT                                        11
+#define OMAP54XX_DPLL_CORE_M2_DIV_WIDTH                                        0x5
+#define OMAP54XX_DPLL_CORE_M2_DIV_MASK                                 (0x1f << 11)
+
+/*
+ * Used by CM_CLKSEL_DPLL_ABE, CM_CLKSEL_DPLL_CORE, CM_CLKSEL_DPLL_IVA,
+ * CM_CLKSEL_DPLL_MPU, CM_CLKSEL_DPLL_PER
+ */
+#define OMAP54XX_DPLL_DIV_SHIFT                                                0
+#define OMAP54XX_DPLL_DIV_WIDTH                                                0x7
+#define OMAP54XX_DPLL_DIV_MASK                                         (0x7f << 0)
+
+/*
+ * Renamed from DPLL_DIV Used by CM_CLKSEL_DPLL_UNIPRO1,
+ * CM_CLKSEL_DPLL_UNIPRO2, CM_CLKSEL_DPLL_USB
+ */
+#define OMAP54XX_DPLL_DIV_0_7_SHIFT                                    0
+#define OMAP54XX_DPLL_DIV_0_7_WIDTH                                    0x8
+#define OMAP54XX_DPLL_DIV_0_7_MASK                                     (0xff << 0)
+
+/*
+ * Used by CM_CLKMODE_DPLL_ABE, CM_CLKMODE_DPLL_CORE, CM_CLKMODE_DPLL_IVA,
+ * CM_CLKMODE_DPLL_MPU, CM_CLKMODE_DPLL_PER
+ */
+#define OMAP54XX_DPLL_DRIFTGUARD_EN_SHIFT                              8
+#define OMAP54XX_DPLL_DRIFTGUARD_EN_WIDTH                              0x1
+#define OMAP54XX_DPLL_DRIFTGUARD_EN_MASK                               (1 << 8)
+
+/*
+ * Used by CM_CLKMODE_DPLL_ABE, CM_CLKMODE_DPLL_CORE, CM_CLKMODE_DPLL_IVA,
+ * CM_CLKMODE_DPLL_MPU, CM_CLKMODE_DPLL_PER, CM_CLKMODE_DPLL_UNIPRO1,
+ * CM_CLKMODE_DPLL_UNIPRO2, CM_CLKMODE_DPLL_USB
+ */
+#define OMAP54XX_DPLL_EN_SHIFT                                         0
+#define OMAP54XX_DPLL_EN_WIDTH                                         0x3
+#define OMAP54XX_DPLL_EN_MASK                                          (0x7 << 0)
+
+/*
+ * Used by CM_CLKMODE_DPLL_ABE, CM_CLKMODE_DPLL_CORE, CM_CLKMODE_DPLL_IVA,
+ * CM_CLKMODE_DPLL_MPU, CM_CLKMODE_DPLL_PER
+ */
+#define OMAP54XX_DPLL_LPMODE_EN_SHIFT                                  10
+#define OMAP54XX_DPLL_LPMODE_EN_WIDTH                                  0x1
+#define OMAP54XX_DPLL_LPMODE_EN_MASK                                   (1 << 10)
+
+/*
+ * Used by CM_CLKSEL_DPLL_ABE, CM_CLKSEL_DPLL_CORE, CM_CLKSEL_DPLL_IVA,
+ * CM_CLKSEL_DPLL_MPU, CM_CLKSEL_DPLL_PER
+ */
+#define OMAP54XX_DPLL_MULT_SHIFT                                       8
+#define OMAP54XX_DPLL_MULT_WIDTH                                       0xb
+#define OMAP54XX_DPLL_MULT_MASK                                                (0x7ff << 8)
+
+/*
+ * Renamed from DPLL_MULT Used by CM_CLKSEL_DPLL_UNIPRO1,
+ * CM_CLKSEL_DPLL_UNIPRO2, CM_CLKSEL_DPLL_USB
+ */
+#define OMAP54XX_DPLL_MULT_UNIPRO1_SHIFT                               8
+#define OMAP54XX_DPLL_MULT_UNIPRO1_WIDTH                               0xc
+#define OMAP54XX_DPLL_MULT_UNIPRO1_MASK                                        (0xfff << 8)
+
+/*
+ * Used by CM_CLKMODE_DPLL_ABE, CM_CLKMODE_DPLL_CORE, CM_CLKMODE_DPLL_IVA,
+ * CM_CLKMODE_DPLL_MPU, CM_CLKMODE_DPLL_PER
+ */
+#define OMAP54XX_DPLL_REGM4XEN_SHIFT                                   11
+#define OMAP54XX_DPLL_REGM4XEN_WIDTH                                   0x1
+#define OMAP54XX_DPLL_REGM4XEN_MASK                                    (1 << 11)
+
+/* Used by CM_CLKSEL_DPLL_UNIPRO1, CM_CLKSEL_DPLL_UNIPRO2, CM_CLKSEL_DPLL_USB */
+#define OMAP54XX_DPLL_SD_DIV_SHIFT                                     24
+#define OMAP54XX_DPLL_SD_DIV_WIDTH                                     0x8
+#define OMAP54XX_DPLL_SD_DIV_MASK                                      (0xff << 24)
+
+/* Used by CM_CLKSEL_DPLL_UNIPRO1, CM_CLKSEL_DPLL_UNIPRO2, CM_CLKSEL_DPLL_USB */
+#define OMAP54XX_DPLL_SELFREQDCO_SHIFT                                 21
+#define OMAP54XX_DPLL_SELFREQDCO_WIDTH                                 0x1
+#define OMAP54XX_DPLL_SELFREQDCO_MASK                                  (1 << 21)
+
+/*
+ * Used by CM_CLKMODE_DPLL_ABE, CM_CLKMODE_DPLL_CORE, CM_CLKMODE_DPLL_IVA,
+ * CM_CLKMODE_DPLL_MPU, CM_CLKMODE_DPLL_PER, CM_CLKMODE_DPLL_UNIPRO1,
+ * CM_CLKMODE_DPLL_UNIPRO2, CM_CLKMODE_DPLL_USB
+ */
+#define OMAP54XX_DPLL_SSC_ACK_SHIFT                                    13
+#define OMAP54XX_DPLL_SSC_ACK_WIDTH                                    0x1
+#define OMAP54XX_DPLL_SSC_ACK_MASK                                     (1 << 13)
+
+/*
+ * Used by CM_CLKMODE_DPLL_ABE, CM_CLKMODE_DPLL_CORE, CM_CLKMODE_DPLL_IVA,
+ * CM_CLKMODE_DPLL_MPU, CM_CLKMODE_DPLL_PER, CM_CLKMODE_DPLL_UNIPRO1,
+ * CM_CLKMODE_DPLL_UNIPRO2, CM_CLKMODE_DPLL_USB
+ */
+#define OMAP54XX_DPLL_SSC_DOWNSPREAD_SHIFT                             14
+#define OMAP54XX_DPLL_SSC_DOWNSPREAD_WIDTH                             0x1
+#define OMAP54XX_DPLL_SSC_DOWNSPREAD_MASK                              (1 << 14)
+
+/*
+ * Used by CM_CLKMODE_DPLL_ABE, CM_CLKMODE_DPLL_CORE, CM_CLKMODE_DPLL_IVA,
+ * CM_CLKMODE_DPLL_MPU, CM_CLKMODE_DPLL_PER, CM_CLKMODE_DPLL_UNIPRO1,
+ * CM_CLKMODE_DPLL_UNIPRO2, CM_CLKMODE_DPLL_USB
+ */
+#define OMAP54XX_DPLL_SSC_EN_SHIFT                                     12
+#define OMAP54XX_DPLL_SSC_EN_WIDTH                                     0x1
+#define OMAP54XX_DPLL_SSC_EN_MASK                                      (1 << 12)
+
+/* Used by CM_L4CFG_DYNAMICDEP */
+#define OMAP54XX_DSP_DYNDEP_SHIFT                                      1
+#define OMAP54XX_DSP_DYNDEP_WIDTH                                      0x1
+#define OMAP54XX_DSP_DYNDEP_MASK                                       (1 << 1)
+
+/* Used by CM_IPU_STATICDEP, CM_MPU_STATICDEP */
+#define OMAP54XX_DSP_STATDEP_SHIFT                                     1
+#define OMAP54XX_DSP_STATDEP_WIDTH                                     0x1
+#define OMAP54XX_DSP_STATDEP_MASK                                      (1 << 1)
+
+/* Used by CM_L3MAIN2_DYNAMICDEP, CM_L4PER_DYNAMICDEP */
+#define OMAP54XX_DSS_DYNDEP_SHIFT                                      8
+#define OMAP54XX_DSS_DYNDEP_WIDTH                                      0x1
+#define OMAP54XX_DSS_DYNDEP_MASK                                       (1 << 8)
+
+/* Used by CM_DMA_STATICDEP, CM_IPU_STATICDEP, CM_MPU_STATICDEP */
+#define OMAP54XX_DSS_STATDEP_SHIFT                                     8
+#define OMAP54XX_DSS_STATDEP_WIDTH                                     0x1
+#define OMAP54XX_DSS_STATDEP_MASK                                      (1 << 8)
+
+/*
+ * Used by CM_C2C_DYNAMICDEP, CM_L3MAIN1_DYNAMICDEP, CM_L4CFG_DYNAMICDEP,
+ * CM_MIPIEXT_DYNAMICDEP, CM_MPU_DYNAMICDEP
+ */
+#define OMAP54XX_EMIF_DYNDEP_SHIFT                                     4
+#define OMAP54XX_EMIF_DYNDEP_WIDTH                                     0x1
+#define OMAP54XX_EMIF_DYNDEP_MASK                                      (1 << 4)
+
+/*
+ * Used by CM_C2C_STATICDEP, CM_CAM_STATICDEP, CM_DMA_STATICDEP,
+ * CM_DSP_STATICDEP, CM_DSS_STATICDEP, CM_GPU_STATICDEP, CM_IPU_STATICDEP,
+ * CM_IVA_STATICDEP, CM_L3INIT_STATICDEP, CM_L4SEC_STATICDEP,
+ * CM_MIPIEXT_STATICDEP, CM_MPU_STATICDEP
+ */
+#define OMAP54XX_EMIF_STATDEP_SHIFT                                    4
+#define OMAP54XX_EMIF_STATDEP_WIDTH                                    0x1
+#define OMAP54XX_EMIF_STATDEP_MASK                                     (1 << 4)
+
+/* Used by CM_SHADOW_FREQ_CONFIG1 */
+#define OMAP54XX_FREQ_UPDATE_SHIFT                                     0
+#define OMAP54XX_FREQ_UPDATE_WIDTH                                     0x1
+#define OMAP54XX_FREQ_UPDATE_MASK                                      (1 << 0)
+
+/* Used by REVISION_CM_CORE, REVISION_CM_CORE_AON */
+#define OMAP54XX_FUNC_SHIFT                                            16
+#define OMAP54XX_FUNC_WIDTH                                            0xc
+#define OMAP54XX_FUNC_MASK                                             (0xfff << 16)
+
+/* Used by CM_SHADOW_FREQ_CONFIG2 */
+#define OMAP54XX_GPMC_FREQ_UPDATE_SHIFT                                        0
+#define OMAP54XX_GPMC_FREQ_UPDATE_WIDTH                                        0x1
+#define OMAP54XX_GPMC_FREQ_UPDATE_MASK                                 (1 << 0)
+
+/* Used by CM_L3MAIN2_DYNAMICDEP */
+#define OMAP54XX_GPU_DYNDEP_SHIFT                                      10
+#define OMAP54XX_GPU_DYNDEP_WIDTH                                      0x1
+#define OMAP54XX_GPU_DYNDEP_MASK                                       (1 << 10)
+
+/* Used by CM_IPU_STATICDEP, CM_MPU_STATICDEP */
+#define OMAP54XX_GPU_STATDEP_SHIFT                                     10
+#define OMAP54XX_GPU_STATDEP_WIDTH                                     0x1
+#define OMAP54XX_GPU_STATDEP_MASK                                      (1 << 10)
+
+/*
+ * Used by CM_ABE_AESS_CLKCTRL, CM_ABE_DMIC_CLKCTRL, CM_ABE_L4_ABE_CLKCTRL,
+ * CM_ABE_MCASP_CLKCTRL, CM_ABE_MCBSP1_CLKCTRL, CM_ABE_MCBSP2_CLKCTRL,
+ * CM_ABE_MCBSP3_CLKCTRL, CM_ABE_MCPDM_CLKCTRL, CM_ABE_SLIMBUS1_CLKCTRL,
+ * CM_ABE_TIMER5_CLKCTRL, CM_ABE_TIMER6_CLKCTRL, CM_ABE_TIMER7_CLKCTRL,
+ * CM_ABE_TIMER8_CLKCTRL, CM_ABE_WD_TIMER3_CLKCTRL, CM_C2C_C2C_CLKCTRL,
+ * CM_C2C_C2C_OCP_FW_CLKCTRL, CM_C2C_MODEM_ICR_CLKCTRL, CM_CAM_CAL_CLKCTRL,
+ * CM_CAM_FDIF_CLKCTRL, CM_CAM_ISS_CLKCTRL, CM_CM_CORE_AON_PROFILING_CLKCTRL,
+ * CM_CM_CORE_PROFILING_CLKCTRL, CM_COREAON_SMARTREFLEX_CORE_CLKCTRL,
+ * CM_COREAON_SMARTREFLEX_MM_CLKCTRL, CM_COREAON_SMARTREFLEX_MPU_CLKCTRL,
+ * CM_CUSTEFUSE_EFUSE_CTRL_CUST_CLKCTRL, CM_DMA_DMA_SYSTEM_CLKCTRL,
+ * CM_DSP_DSP_CLKCTRL, CM_DSS_BB2D_CLKCTRL, CM_DSS_DSS_CLKCTRL,
+ * CM_EMIF_DMM_CLKCTRL, CM_EMIF_EMIF1_CLKCTRL, CM_EMIF_EMIF2_CLKCTRL,
+ * CM_EMIF_EMIF_OCP_FW_CLKCTRL, CM_EMU_DEBUGSS_CLKCTRL,
+ * CM_EMU_MPU_EMU_DBG_CLKCTRL, CM_GPU_GPU_CLKCTRL, CM_IPU_IPU_CLKCTRL,
+ * CM_IVA_IVA_CLKCTRL, CM_IVA_SL2_CLKCTRL, CM_L3INIT_HSI_CLKCTRL,
+ * CM_L3INIT_IEEE1500_2_OCP_CLKCTRL, CM_L3INIT_MMC1_CLKCTRL,
+ * CM_L3INIT_MMC2_CLKCTRL, CM_L3INIT_MPHY_UNIPRO2_CLKCTRL,
+ * CM_L3INIT_OCP2SCP1_CLKCTRL, CM_L3INIT_OCP2SCP3_CLKCTRL,
+ * CM_L3INIT_SATA_CLKCTRL, CM_L3INIT_UNIPRO2_CLKCTRL,
+ * CM_L3INIT_USB_HOST_HS_CLKCTRL, CM_L3INIT_USB_OTG_SS_CLKCTRL,
+ * CM_L3INIT_USB_TLL_HS_CLKCTRL, CM_L3INSTR_CTRL_MODULE_BANDGAP_CLKCTRL,
+ * CM_L3INSTR_DLL_AGING_CLKCTRL, CM_L3INSTR_L3_INSTR_CLKCTRL,
+ * CM_L3INSTR_L3_MAIN_3_CLKCTRL, CM_L3INSTR_OCP_WP_NOC_CLKCTRL,
+ * CM_L3MAIN1_L3_MAIN_1_CLKCTRL, CM_L3MAIN2_GPMC_CLKCTRL,
+ * CM_L3MAIN2_L3_MAIN_2_CLKCTRL, CM_L3MAIN2_OCMC_RAM_CLKCTRL,
+ * CM_L4CFG_L4_CFG_CLKCTRL, CM_L4CFG_MAILBOX_CLKCTRL,
+ * CM_L4CFG_OCP2SCP2_CLKCTRL, CM_L4CFG_SAR_ROM_CLKCTRL,
+ * CM_L4CFG_SPINLOCK_CLKCTRL, CM_L4PER_ELM_CLKCTRL, CM_L4PER_GPIO2_CLKCTRL,
+ * CM_L4PER_GPIO3_CLKCTRL, CM_L4PER_GPIO4_CLKCTRL, CM_L4PER_GPIO5_CLKCTRL,
+ * CM_L4PER_GPIO6_CLKCTRL, CM_L4PER_GPIO7_CLKCTRL, CM_L4PER_GPIO8_CLKCTRL,
+ * CM_L4PER_HDQ1W_CLKCTRL, CM_L4PER_I2C1_CLKCTRL, CM_L4PER_I2C2_CLKCTRL,
+ * CM_L4PER_I2C3_CLKCTRL, CM_L4PER_I2C4_CLKCTRL, CM_L4PER_I2C5_CLKCTRL,
+ * CM_L4PER_L4_PER_CLKCTRL, CM_L4PER_MCSPI1_CLKCTRL, CM_L4PER_MCSPI2_CLKCTRL,
+ * CM_L4PER_MCSPI3_CLKCTRL, CM_L4PER_MCSPI4_CLKCTRL, CM_L4PER_MMC3_CLKCTRL,
+ * CM_L4PER_MMC4_CLKCTRL, CM_L4PER_MMC5_CLKCTRL, CM_L4PER_TIMER10_CLKCTRL,
+ * CM_L4PER_TIMER11_CLKCTRL, CM_L4PER_TIMER2_CLKCTRL, CM_L4PER_TIMER3_CLKCTRL,
+ * CM_L4PER_TIMER4_CLKCTRL, CM_L4PER_TIMER9_CLKCTRL, CM_L4PER_UART1_CLKCTRL,
+ * CM_L4PER_UART2_CLKCTRL, CM_L4PER_UART3_CLKCTRL, CM_L4PER_UART4_CLKCTRL,
+ * CM_L4PER_UART5_CLKCTRL, CM_L4PER_UART6_CLKCTRL, CM_L4SEC_AES1_CLKCTRL,
+ * CM_L4SEC_AES2_CLKCTRL, CM_L4SEC_DES3DES_CLKCTRL,
+ * CM_L4SEC_DMA_CRYPTO_CLKCTRL, CM_L4SEC_FPKA_CLKCTRL, CM_L4SEC_RNG_CLKCTRL,
+ * CM_L4SEC_SHA2MD5_CLKCTRL, CM_MIPIEXT_LLI_CLKCTRL,
+ * CM_MIPIEXT_LLI_OCP_FW_CLKCTRL, CM_MIPIEXT_MPHY_CLKCTRL, CM_MPU_MPU_CLKCTRL,
+ * CM_MPU_MPU_MPU_DBG_CLKCTRL, CM_WKUPAON_COUNTER_32K_CLKCTRL,
+ * CM_WKUPAON_GPIO1_CLKCTRL, CM_WKUPAON_KBD_CLKCTRL,
+ * CM_WKUPAON_L4_WKUP_CLKCTRL, CM_WKUPAON_SAR_RAM_CLKCTRL,
+ * CM_WKUPAON_TIMER12_CLKCTRL, CM_WKUPAON_TIMER1_CLKCTRL,
+ * CM_WKUPAON_WD_TIMER1_CLKCTRL, CM_WKUPAON_WD_TIMER2_CLKCTRL
+ */
+#define OMAP54XX_IDLEST_SHIFT                                          16
+#define OMAP54XX_IDLEST_WIDTH                                          0x2
+#define OMAP54XX_IDLEST_MASK                                           (0x3 << 16)
+
+/* Used by CM_L3MAIN2_DYNAMICDEP */
+#define OMAP54XX_IPU_DYNDEP_SHIFT                                      0
+#define OMAP54XX_IPU_DYNDEP_WIDTH                                      0x1
+#define OMAP54XX_IPU_DYNDEP_MASK                                       (1 << 0)
+
+/* Used by CM_DMA_STATICDEP, CM_MPU_STATICDEP */
+#define OMAP54XX_IPU_STATDEP_SHIFT                                     0
+#define OMAP54XX_IPU_STATDEP_WIDTH                                     0x1
+#define OMAP54XX_IPU_STATDEP_MASK                                      (1 << 0)
+
+/* Used by CM_DSP_DYNAMICDEP, CM_L3MAIN2_DYNAMICDEP */
+#define OMAP54XX_IVA_DYNDEP_SHIFT                                      2
+#define OMAP54XX_IVA_DYNDEP_WIDTH                                      0x1
+#define OMAP54XX_IVA_DYNDEP_MASK                                       (1 << 2)
+
+/*
+ * Used by CM_C2C_STATICDEP, CM_CAM_STATICDEP, CM_DMA_STATICDEP,
+ * CM_DSP_STATICDEP, CM_DSS_STATICDEP, CM_GPU_STATICDEP, CM_IPU_STATICDEP,
+ * CM_L3INIT_STATICDEP, CM_MIPIEXT_STATICDEP, CM_MPU_STATICDEP
+ */
+#define OMAP54XX_IVA_STATDEP_SHIFT                                     2
+#define OMAP54XX_IVA_STATDEP_WIDTH                                     0x1
+#define OMAP54XX_IVA_STATDEP_MASK                                      (1 << 2)
+
+/* Used by CM_L4CFG_DYNAMICDEP, CM_L4PER_DYNAMICDEP */
+#define OMAP54XX_L3INIT_DYNDEP_SHIFT                                   7
+#define OMAP54XX_L3INIT_DYNDEP_WIDTH                                   0x1
+#define OMAP54XX_L3INIT_DYNDEP_MASK                                    (1 << 7)
+
+/*
+ * Used by CM_C2C_STATICDEP, CM_DMA_STATICDEP, CM_DSP_STATICDEP,
+ * CM_IPU_STATICDEP, CM_MIPIEXT_STATICDEP, CM_MPU_STATICDEP
+ */
+#define OMAP54XX_L3INIT_STATDEP_SHIFT                                  7
+#define OMAP54XX_L3INIT_STATDEP_WIDTH                                  0x1
+#define OMAP54XX_L3INIT_STATDEP_MASK                                   (1 << 7)
+
+/*
+ * Used by CM_DSP_DYNAMICDEP, CM_DSS_DYNAMICDEP, CM_L3INIT_DYNAMICDEP,
+ * CM_L3MAIN2_DYNAMICDEP, CM_L4CFG_DYNAMICDEP, CM_MPU_DYNAMICDEP
+ */
+#define OMAP54XX_L3MAIN1_DYNDEP_SHIFT                                  5
+#define OMAP54XX_L3MAIN1_DYNDEP_WIDTH                                  0x1
+#define OMAP54XX_L3MAIN1_DYNDEP_MASK                                   (1 << 5)
+
+/*
+ * Used by CM_C2C_STATICDEP, CM_CAM_STATICDEP, CM_DMA_STATICDEP,
+ * CM_DSP_STATICDEP, CM_DSS_STATICDEP, CM_GPU_STATICDEP, CM_IPU_STATICDEP,
+ * CM_IVA_STATICDEP, CM_L3INIT_STATICDEP, CM_L4SEC_STATICDEP,
+ * CM_MIPIEXT_STATICDEP, CM_MPU_STATICDEP
+ */
+#define OMAP54XX_L3MAIN1_STATDEP_SHIFT                                 5
+#define OMAP54XX_L3MAIN1_STATDEP_WIDTH                                 0x1
+#define OMAP54XX_L3MAIN1_STATDEP_MASK                                  (1 << 5)
+
+/*
+ * Used by CM_C2C_DYNAMICDEP, CM_CAM_DYNAMICDEP, CM_DMA_DYNAMICDEP,
+ * CM_DSS_DYNAMICDEP, CM_EMU_DYNAMICDEP, CM_GPU_DYNAMICDEP, CM_IPU_DYNAMICDEP,
+ * CM_IVA_DYNAMICDEP, CM_L3INIT_DYNAMICDEP, CM_L3MAIN1_DYNAMICDEP,
+ * CM_L4CFG_DYNAMICDEP, CM_L4SEC_DYNAMICDEP, CM_MIPIEXT_DYNAMICDEP
+ */
+#define OMAP54XX_L3MAIN2_DYNDEP_SHIFT                                  6
+#define OMAP54XX_L3MAIN2_DYNDEP_WIDTH                                  0x1
+#define OMAP54XX_L3MAIN2_DYNDEP_MASK                                   (1 << 6)
+
+/*
+ * Used by CM_C2C_STATICDEP, CM_CAM_STATICDEP, CM_DMA_STATICDEP,
+ * CM_DSP_STATICDEP, CM_DSS_STATICDEP, CM_GPU_STATICDEP, CM_IPU_STATICDEP,
+ * CM_IVA_STATICDEP, CM_L3INIT_STATICDEP, CM_L4SEC_STATICDEP,
+ * CM_MIPIEXT_STATICDEP, CM_MPU_STATICDEP
+ */
+#define OMAP54XX_L3MAIN2_STATDEP_SHIFT                                 6
+#define OMAP54XX_L3MAIN2_STATDEP_WIDTH                                 0x1
+#define OMAP54XX_L3MAIN2_STATDEP_MASK                                  (1 << 6)
+
+/* Used by CM_L3MAIN1_DYNAMICDEP */
+#define OMAP54XX_L4CFG_DYNDEP_SHIFT                                    12
+#define OMAP54XX_L4CFG_DYNDEP_WIDTH                                    0x1
+#define OMAP54XX_L4CFG_DYNDEP_MASK                                     (1 << 12)
+
+/*
+ * Used by CM_C2C_STATICDEP, CM_DMA_STATICDEP, CM_DSP_STATICDEP,
+ * CM_IPU_STATICDEP, CM_L3INIT_STATICDEP, CM_MIPIEXT_STATICDEP, CM_MPU_STATICDEP
+ */
+#define OMAP54XX_L4CFG_STATDEP_SHIFT                                   12
+#define OMAP54XX_L4CFG_STATDEP_WIDTH                                   0x1
+#define OMAP54XX_L4CFG_STATDEP_MASK                                    (1 << 12)
+
+/* Used by CM_L3MAIN2_DYNAMICDEP */
+#define OMAP54XX_L4PER_DYNDEP_SHIFT                                    13
+#define OMAP54XX_L4PER_DYNDEP_WIDTH                                    0x1
+#define OMAP54XX_L4PER_DYNDEP_MASK                                     (1 << 13)
+
+/*
+ * Used by CM_C2C_STATICDEP, CM_DMA_STATICDEP, CM_DSP_STATICDEP,
+ * CM_IPU_STATICDEP, CM_L3INIT_STATICDEP, CM_L4SEC_STATICDEP,
+ * CM_MIPIEXT_STATICDEP, CM_MPU_STATICDEP
+ */
+#define OMAP54XX_L4PER_STATDEP_SHIFT                                   13
+#define OMAP54XX_L4PER_STATDEP_WIDTH                                   0x1
+#define OMAP54XX_L4PER_STATDEP_MASK                                    (1 << 13)
+
+/* Used by CM_L3MAIN2_DYNAMICDEP, CM_L4PER_DYNAMICDEP */
+#define OMAP54XX_L4SEC_DYNDEP_SHIFT                                    14
+#define OMAP54XX_L4SEC_DYNDEP_WIDTH                                    0x1
+#define OMAP54XX_L4SEC_DYNDEP_MASK                                     (1 << 14)
+
+/*
+ * Used by CM_DMA_STATICDEP, CM_IPU_STATICDEP, CM_L3INIT_STATICDEP,
+ * CM_MPU_STATICDEP
+ */
+#define OMAP54XX_L4SEC_STATDEP_SHIFT                                   14
+#define OMAP54XX_L4SEC_STATDEP_WIDTH                                   0x1
+#define OMAP54XX_L4SEC_STATDEP_MASK                                    (1 << 14)
+
+/* Used by CM_L3MAIN2_DYNAMICDEP, CM_L4CFG_DYNAMICDEP */
+#define OMAP54XX_MIPIEXT_DYNDEP_SHIFT                                  21
+#define OMAP54XX_MIPIEXT_DYNDEP_WIDTH                                  0x1
+#define OMAP54XX_MIPIEXT_DYNDEP_MASK                                   (1 << 21)
+
+/* Used by CM_MPU_STATICDEP */
+#define OMAP54XX_MIPIEXT_STATDEP_SHIFT                                 21
+#define OMAP54XX_MIPIEXT_STATDEP_WIDTH                                 0x1
+#define OMAP54XX_MIPIEXT_STATDEP_MASK                                  (1 << 21)
+
+/*
+ * Used by CM_SSC_MODFREQDIV_DPLL_ABE, CM_SSC_MODFREQDIV_DPLL_CORE,
+ * CM_SSC_MODFREQDIV_DPLL_IVA, CM_SSC_MODFREQDIV_DPLL_MPU,
+ * CM_SSC_MODFREQDIV_DPLL_PER, CM_SSC_MODFREQDIV_DPLL_UNIPRO1,
+ * CM_SSC_MODFREQDIV_DPLL_UNIPRO2, CM_SSC_MODFREQDIV_DPLL_USB
+ */
+#define OMAP54XX_MODFREQDIV_EXPONENT_SHIFT                             8
+#define OMAP54XX_MODFREQDIV_EXPONENT_WIDTH                             0x3
+#define OMAP54XX_MODFREQDIV_EXPONENT_MASK                              (0x7 << 8)
+
+/*
+ * Used by CM_SSC_MODFREQDIV_DPLL_ABE, CM_SSC_MODFREQDIV_DPLL_CORE,
+ * CM_SSC_MODFREQDIV_DPLL_IVA, CM_SSC_MODFREQDIV_DPLL_MPU,
+ * CM_SSC_MODFREQDIV_DPLL_PER, CM_SSC_MODFREQDIV_DPLL_UNIPRO1,
+ * CM_SSC_MODFREQDIV_DPLL_UNIPRO2, CM_SSC_MODFREQDIV_DPLL_USB
+ */
+#define OMAP54XX_MODFREQDIV_MANTISSA_SHIFT                             0
+#define OMAP54XX_MODFREQDIV_MANTISSA_WIDTH                             0x7
+#define OMAP54XX_MODFREQDIV_MANTISSA_MASK                              (0x7f << 0)
+
+/*
+ * Used by CM_ABE_AESS_CLKCTRL, CM_ABE_DMIC_CLKCTRL, CM_ABE_L4_ABE_CLKCTRL,
+ * CM_ABE_MCASP_CLKCTRL, CM_ABE_MCBSP1_CLKCTRL, CM_ABE_MCBSP2_CLKCTRL,
+ * CM_ABE_MCBSP3_CLKCTRL, CM_ABE_MCPDM_CLKCTRL, CM_ABE_SLIMBUS1_CLKCTRL,
+ * CM_ABE_TIMER5_CLKCTRL, CM_ABE_TIMER6_CLKCTRL, CM_ABE_TIMER7_CLKCTRL,
+ * CM_ABE_TIMER8_CLKCTRL, CM_ABE_WD_TIMER3_CLKCTRL, CM_C2C_C2C_CLKCTRL,
+ * CM_C2C_C2C_OCP_FW_CLKCTRL, CM_C2C_MODEM_ICR_CLKCTRL, CM_CAM_CAL_CLKCTRL,
+ * CM_CAM_FDIF_CLKCTRL, CM_CAM_ISS_CLKCTRL, CM_CM_CORE_AON_PROFILING_CLKCTRL,
+ * CM_CM_CORE_PROFILING_CLKCTRL, CM_COREAON_SMARTREFLEX_CORE_CLKCTRL,
+ * CM_COREAON_SMARTREFLEX_MM_CLKCTRL, CM_COREAON_SMARTREFLEX_MPU_CLKCTRL,
+ * CM_CUSTEFUSE_EFUSE_CTRL_CUST_CLKCTRL, CM_DMA_DMA_SYSTEM_CLKCTRL,
+ * CM_DSP_DSP_CLKCTRL, CM_DSS_BB2D_CLKCTRL, CM_DSS_DSS_CLKCTRL,
+ * CM_EMIF_DMM_CLKCTRL, CM_EMIF_EMIF1_CLKCTRL, CM_EMIF_EMIF2_CLKCTRL,
+ * CM_EMIF_EMIF_OCP_FW_CLKCTRL, CM_EMU_DEBUGSS_CLKCTRL,
+ * CM_EMU_MPU_EMU_DBG_CLKCTRL, CM_GPU_GPU_CLKCTRL, CM_IPU_IPU_CLKCTRL,
+ * CM_IVA_IVA_CLKCTRL, CM_IVA_SL2_CLKCTRL, CM_L3INIT_HSI_CLKCTRL,
+ * CM_L3INIT_IEEE1500_2_OCP_CLKCTRL, CM_L3INIT_MMC1_CLKCTRL,
+ * CM_L3INIT_MMC2_CLKCTRL, CM_L3INIT_MPHY_UNIPRO2_CLKCTRL,
+ * CM_L3INIT_OCP2SCP1_CLKCTRL, CM_L3INIT_OCP2SCP3_CLKCTRL,
+ * CM_L3INIT_SATA_CLKCTRL, CM_L3INIT_UNIPRO2_CLKCTRL,
+ * CM_L3INIT_USB_HOST_HS_CLKCTRL, CM_L3INIT_USB_OTG_SS_CLKCTRL,
+ * CM_L3INIT_USB_TLL_HS_CLKCTRL, CM_L3INSTR_CTRL_MODULE_BANDGAP_CLKCTRL,
+ * CM_L3INSTR_DLL_AGING_CLKCTRL, CM_L3INSTR_L3_INSTR_CLKCTRL,
+ * CM_L3INSTR_L3_MAIN_3_CLKCTRL, CM_L3INSTR_OCP_WP_NOC_CLKCTRL,
+ * CM_L3MAIN1_L3_MAIN_1_CLKCTRL, CM_L3MAIN2_GPMC_CLKCTRL,
+ * CM_L3MAIN2_L3_MAIN_2_CLKCTRL, CM_L3MAIN2_OCMC_RAM_CLKCTRL,
+ * CM_L4CFG_L4_CFG_CLKCTRL, CM_L4CFG_MAILBOX_CLKCTRL,
+ * CM_L4CFG_OCP2SCP2_CLKCTRL, CM_L4CFG_SAR_ROM_CLKCTRL,
+ * CM_L4CFG_SPINLOCK_CLKCTRL, CM_L4PER_ELM_CLKCTRL, CM_L4PER_GPIO2_CLKCTRL,
+ * CM_L4PER_GPIO3_CLKCTRL, CM_L4PER_GPIO4_CLKCTRL, CM_L4PER_GPIO5_CLKCTRL,
+ * CM_L4PER_GPIO6_CLKCTRL, CM_L4PER_GPIO7_CLKCTRL, CM_L4PER_GPIO8_CLKCTRL,
+ * CM_L4PER_HDQ1W_CLKCTRL, CM_L4PER_I2C1_CLKCTRL, CM_L4PER_I2C2_CLKCTRL,
+ * CM_L4PER_I2C3_CLKCTRL, CM_L4PER_I2C4_CLKCTRL, CM_L4PER_I2C5_CLKCTRL,
+ * CM_L4PER_L4_PER_CLKCTRL, CM_L4PER_MCSPI1_CLKCTRL, CM_L4PER_MCSPI2_CLKCTRL,
+ * CM_L4PER_MCSPI3_CLKCTRL, CM_L4PER_MCSPI4_CLKCTRL, CM_L4PER_MMC3_CLKCTRL,
+ * CM_L4PER_MMC4_CLKCTRL, CM_L4PER_MMC5_CLKCTRL, CM_L4PER_TIMER10_CLKCTRL,
+ * CM_L4PER_TIMER11_CLKCTRL, CM_L4PER_TIMER2_CLKCTRL, CM_L4PER_TIMER3_CLKCTRL,
+ * CM_L4PER_TIMER4_CLKCTRL, CM_L4PER_TIMER9_CLKCTRL, CM_L4PER_UART1_CLKCTRL,
+ * CM_L4PER_UART2_CLKCTRL, CM_L4PER_UART3_CLKCTRL, CM_L4PER_UART4_CLKCTRL,
+ * CM_L4PER_UART5_CLKCTRL, CM_L4PER_UART6_CLKCTRL, CM_L4SEC_AES1_CLKCTRL,
+ * CM_L4SEC_AES2_CLKCTRL, CM_L4SEC_DES3DES_CLKCTRL,
+ * CM_L4SEC_DMA_CRYPTO_CLKCTRL, CM_L4SEC_FPKA_CLKCTRL, CM_L4SEC_RNG_CLKCTRL,
+ * CM_L4SEC_SHA2MD5_CLKCTRL, CM_MIPIEXT_LLI_CLKCTRL,
+ * CM_MIPIEXT_LLI_OCP_FW_CLKCTRL, CM_MIPIEXT_MPHY_CLKCTRL, CM_MPU_MPU_CLKCTRL,
+ * CM_MPU_MPU_MPU_DBG_CLKCTRL, CM_WKUPAON_COUNTER_32K_CLKCTRL,
+ * CM_WKUPAON_GPIO1_CLKCTRL, CM_WKUPAON_KBD_CLKCTRL,
+ * CM_WKUPAON_L4_WKUP_CLKCTRL, CM_WKUPAON_SAR_RAM_CLKCTRL,
+ * CM_WKUPAON_TIMER12_CLKCTRL, CM_WKUPAON_TIMER1_CLKCTRL,
+ * CM_WKUPAON_WD_TIMER1_CLKCTRL, CM_WKUPAON_WD_TIMER2_CLKCTRL
+ */
+#define OMAP54XX_MODULEMODE_SHIFT                                      0
+#define OMAP54XX_MODULEMODE_WIDTH                                      0x2
+#define OMAP54XX_MODULEMODE_MASK                                       (0x3 << 0)
+
+/* Used by CM_L4CFG_DYNAMICDEP */
+#define OMAP54XX_MPU_DYNDEP_SHIFT                                      19
+#define OMAP54XX_MPU_DYNDEP_WIDTH                                      0x1
+#define OMAP54XX_MPU_DYNDEP_MASK                                       (1 << 19)
+
+/* Used by CM_DSS_DSS_CLKCTRL */
+#define OMAP54XX_OPTFCLKEN_32KHZ_CLK_SHIFT                             11
+#define OMAP54XX_OPTFCLKEN_32KHZ_CLK_WIDTH                             0x1
+#define OMAP54XX_OPTFCLKEN_32KHZ_CLK_MASK                              (1 << 11)
+
+/* Renamed from OPTFCLKEN_32KHZ_CLK Used by CM_L3INIT_MMC1_CLKCTRL */
+#define OMAP54XX_OPTFCLKEN_32KHZ_CLK_8_8_SHIFT                         8
+#define OMAP54XX_OPTFCLKEN_32KHZ_CLK_8_8_WIDTH                         0x1
+#define OMAP54XX_OPTFCLKEN_32KHZ_CLK_8_8_MASK                          (1 << 8)
+
+/* Used by CM_DSS_DSS_CLKCTRL */
+#define OMAP54XX_OPTFCLKEN_48MHZ_CLK_SHIFT                             9
+#define OMAP54XX_OPTFCLKEN_48MHZ_CLK_WIDTH                             0x1
+#define OMAP54XX_OPTFCLKEN_48MHZ_CLK_MASK                              (1 << 9)
+
+/* Used by CM_COREAON_USB_PHY_CORE_CLKCTRL */
+#define OMAP54XX_OPTFCLKEN_CLK32K_SHIFT                                        8
+#define OMAP54XX_OPTFCLKEN_CLK32K_WIDTH                                        0x1
+#define OMAP54XX_OPTFCLKEN_CLK32K_MASK                                 (1 << 8)
+
+/* Used by CM_CAM_ISS_CLKCTRL */
+#define OMAP54XX_OPTFCLKEN_CTRLCLK_SHIFT                               8
+#define OMAP54XX_OPTFCLKEN_CTRLCLK_WIDTH                               0x1
+#define OMAP54XX_OPTFCLKEN_CTRLCLK_MASK                                        (1 << 8)
+
+/*
+ * Used by CM_L4PER_GPIO2_CLKCTRL, CM_L4PER_GPIO3_CLKCTRL,
+ * CM_L4PER_GPIO4_CLKCTRL, CM_L4PER_GPIO5_CLKCTRL, CM_L4PER_GPIO6_CLKCTRL,
+ * CM_L4PER_GPIO7_CLKCTRL, CM_L4PER_GPIO8_CLKCTRL, CM_WKUPAON_GPIO1_CLKCTRL
+ */
+#define OMAP54XX_OPTFCLKEN_DBCLK_SHIFT                                 8
+#define OMAP54XX_OPTFCLKEN_DBCLK_WIDTH                                 0x1
+#define OMAP54XX_OPTFCLKEN_DBCLK_MASK                                  (1 << 8)
+
+/* Used by CM_EMIF_EMIF_DLL_CLKCTRL */
+#define OMAP54XX_OPTFCLKEN_DLL_CLK_SHIFT                               8
+#define OMAP54XX_OPTFCLKEN_DLL_CLK_WIDTH                               0x1
+#define OMAP54XX_OPTFCLKEN_DLL_CLK_MASK                                        (1 << 8)
+
+/* Used by CM_DSS_DSS_CLKCTRL */
+#define OMAP54XX_OPTFCLKEN_DSSCLK_SHIFT                                        8
+#define OMAP54XX_OPTFCLKEN_DSSCLK_WIDTH                                        0x1
+#define OMAP54XX_OPTFCLKEN_DSSCLK_MASK                                 (1 << 8)
+
+/* Used by CM_ABE_SLIMBUS1_CLKCTRL */
+#define OMAP54XX_OPTFCLKEN_FCLK0_SHIFT                                 8
+#define OMAP54XX_OPTFCLKEN_FCLK0_WIDTH                                 0x1
+#define OMAP54XX_OPTFCLKEN_FCLK0_MASK                                  (1 << 8)
+
+/* Used by CM_ABE_SLIMBUS1_CLKCTRL */
+#define OMAP54XX_OPTFCLKEN_FCLK1_SHIFT                                 9
+#define OMAP54XX_OPTFCLKEN_FCLK1_WIDTH                                 0x1
+#define OMAP54XX_OPTFCLKEN_FCLK1_MASK                                  (1 << 9)
+
+/* Used by CM_ABE_SLIMBUS1_CLKCTRL */
+#define OMAP54XX_OPTFCLKEN_FCLK2_SHIFT                                 10
+#define OMAP54XX_OPTFCLKEN_FCLK2_WIDTH                                 0x1
+#define OMAP54XX_OPTFCLKEN_FCLK2_MASK                                  (1 << 10)
+
+/* Used by CM_L3INIT_USB_HOST_HS_CLKCTRL */
+#define OMAP54XX_OPTFCLKEN_FUNC48M_CLK_SHIFT                           15
+#define OMAP54XX_OPTFCLKEN_FUNC48M_CLK_WIDTH                           0x1
+#define OMAP54XX_OPTFCLKEN_FUNC48M_CLK_MASK                            (1 << 15)
+
+/* Used by CM_L3INIT_USB_HOST_HS_CLKCTRL */
+#define OMAP54XX_OPTFCLKEN_HSIC480M_P1_CLK_SHIFT                       13
+#define OMAP54XX_OPTFCLKEN_HSIC480M_P1_CLK_WIDTH                       0x1
+#define OMAP54XX_OPTFCLKEN_HSIC480M_P1_CLK_MASK                                (1 << 13)
+
+/* Used by CM_L3INIT_USB_HOST_HS_CLKCTRL */
+#define OMAP54XX_OPTFCLKEN_HSIC480M_P2_CLK_SHIFT                       14
+#define OMAP54XX_OPTFCLKEN_HSIC480M_P2_CLK_WIDTH                       0x1
+#define OMAP54XX_OPTFCLKEN_HSIC480M_P2_CLK_MASK                                (1 << 14)
+
+/* Used by CM_L3INIT_USB_HOST_HS_CLKCTRL */
+#define OMAP54XX_OPTFCLKEN_HSIC480M_P3_CLK_SHIFT                       7
+#define OMAP54XX_OPTFCLKEN_HSIC480M_P3_CLK_WIDTH                       0x1
+#define OMAP54XX_OPTFCLKEN_HSIC480M_P3_CLK_MASK                                (1 << 7)
+
+/* Used by CM_L3INIT_USB_HOST_HS_CLKCTRL */
+#define OMAP54XX_OPTFCLKEN_HSIC60M_P1_CLK_SHIFT                                11
+#define OMAP54XX_OPTFCLKEN_HSIC60M_P1_CLK_WIDTH                                0x1
+#define OMAP54XX_OPTFCLKEN_HSIC60M_P1_CLK_MASK                         (1 << 11)
+
+/* Used by CM_L3INIT_USB_HOST_HS_CLKCTRL */
+#define OMAP54XX_OPTFCLKEN_HSIC60M_P2_CLK_SHIFT                                12
+#define OMAP54XX_OPTFCLKEN_HSIC60M_P2_CLK_WIDTH                                0x1
+#define OMAP54XX_OPTFCLKEN_HSIC60M_P2_CLK_MASK                         (1 << 12)
+
+/* Used by CM_L3INIT_USB_HOST_HS_CLKCTRL */
+#define OMAP54XX_OPTFCLKEN_HSIC60M_P3_CLK_SHIFT                                6
+#define OMAP54XX_OPTFCLKEN_HSIC60M_P3_CLK_WIDTH                                0x1
+#define OMAP54XX_OPTFCLKEN_HSIC60M_P3_CLK_MASK                         (1 << 6)
+
+/* Used by CM_L3INIT_USB_OTG_SS_CLKCTRL */
+#define OMAP54XX_OPTFCLKEN_REFCLK960M_SHIFT                            8
+#define OMAP54XX_OPTFCLKEN_REFCLK960M_WIDTH                            0x1
+#define OMAP54XX_OPTFCLKEN_REFCLK960M_MASK                             (1 << 8)
+
+/* Used by CM_L3INIT_SATA_CLKCTRL */
+#define OMAP54XX_OPTFCLKEN_REF_CLK_SHIFT                               8
+#define OMAP54XX_OPTFCLKEN_REF_CLK_WIDTH                               0x1
+#define OMAP54XX_OPTFCLKEN_REF_CLK_MASK                                        (1 << 8)
+
+/* Used by CM_WKUPAON_SCRM_CLKCTRL */
+#define OMAP54XX_OPTFCLKEN_SCRM_CORE_SHIFT                             8
+#define OMAP54XX_OPTFCLKEN_SCRM_CORE_WIDTH                             0x1
+#define OMAP54XX_OPTFCLKEN_SCRM_CORE_MASK                              (1 << 8)
+
+/* Used by CM_WKUPAON_SCRM_CLKCTRL */
+#define OMAP54XX_OPTFCLKEN_SCRM_PER_SHIFT                              9
+#define OMAP54XX_OPTFCLKEN_SCRM_PER_WIDTH                              0x1
+#define OMAP54XX_OPTFCLKEN_SCRM_PER_MASK                               (1 << 9)
+
+/* Used by CM_ABE_SLIMBUS1_CLKCTRL */
+#define OMAP54XX_OPTFCLKEN_SLIMBUS_CLK_SHIFT                           11
+#define OMAP54XX_OPTFCLKEN_SLIMBUS_CLK_WIDTH                           0x1
+#define OMAP54XX_OPTFCLKEN_SLIMBUS_CLK_MASK                            (1 << 11)
+
+/* Used by CM_DSS_DSS_CLKCTRL */
+#define OMAP54XX_OPTFCLKEN_SYS_CLK_SHIFT                               10
+#define OMAP54XX_OPTFCLKEN_SYS_CLK_WIDTH                               0x1
+#define OMAP54XX_OPTFCLKEN_SYS_CLK_MASK                                        (1 << 10)
+
+/* Used by CM_MIPIEXT_LLI_CLKCTRL */
+#define OMAP54XX_OPTFCLKEN_TXPHY_CLK_SHIFT                             8
+#define OMAP54XX_OPTFCLKEN_TXPHY_CLK_WIDTH                             0x1
+#define OMAP54XX_OPTFCLKEN_TXPHY_CLK_MASK                              (1 << 8)
+
+/* Used by CM_MIPIEXT_LLI_CLKCTRL */
+#define OMAP54XX_OPTFCLKEN_TXPHY_LS_CLK_SHIFT                          9
+#define OMAP54XX_OPTFCLKEN_TXPHY_LS_CLK_WIDTH                          0x1
+#define OMAP54XX_OPTFCLKEN_TXPHY_LS_CLK_MASK                           (1 << 9)
+
+/* Used by CM_L3INIT_USB_TLL_HS_CLKCTRL */
+#define OMAP54XX_OPTFCLKEN_USB_CH0_CLK_SHIFT                           8
+#define OMAP54XX_OPTFCLKEN_USB_CH0_CLK_WIDTH                           0x1
+#define OMAP54XX_OPTFCLKEN_USB_CH0_CLK_MASK                            (1 << 8)
+
+/* Used by CM_L3INIT_USB_TLL_HS_CLKCTRL */
+#define OMAP54XX_OPTFCLKEN_USB_CH1_CLK_SHIFT                           9
+#define OMAP54XX_OPTFCLKEN_USB_CH1_CLK_WIDTH                           0x1
+#define OMAP54XX_OPTFCLKEN_USB_CH1_CLK_MASK                            (1 << 9)
+
+/* Used by CM_L3INIT_USB_TLL_HS_CLKCTRL */
+#define OMAP54XX_OPTFCLKEN_USB_CH2_CLK_SHIFT                           10
+#define OMAP54XX_OPTFCLKEN_USB_CH2_CLK_WIDTH                           0x1
+#define OMAP54XX_OPTFCLKEN_USB_CH2_CLK_MASK                            (1 << 10)
+
+/* Used by CM_L3INIT_USB_HOST_HS_CLKCTRL */
+#define OMAP54XX_OPTFCLKEN_UTMI_P1_CLK_SHIFT                           8
+#define OMAP54XX_OPTFCLKEN_UTMI_P1_CLK_WIDTH                           0x1
+#define OMAP54XX_OPTFCLKEN_UTMI_P1_CLK_MASK                            (1 << 8)
+
+/* Used by CM_L3INIT_USB_HOST_HS_CLKCTRL */
+#define OMAP54XX_OPTFCLKEN_UTMI_P2_CLK_SHIFT                           9
+#define OMAP54XX_OPTFCLKEN_UTMI_P2_CLK_WIDTH                           0x1
+#define OMAP54XX_OPTFCLKEN_UTMI_P2_CLK_MASK                            (1 << 9)
+
+/* Used by CM_L3INIT_USB_HOST_HS_CLKCTRL */
+#define OMAP54XX_OPTFCLKEN_UTMI_P3_CLK_SHIFT                           10
+#define OMAP54XX_OPTFCLKEN_UTMI_P3_CLK_WIDTH                           0x1
+#define OMAP54XX_OPTFCLKEN_UTMI_P3_CLK_MASK                            (1 << 10)
+
+/* Used by CM_CORE_AON_DEBUG_OUT, CM_CORE_DEBUG_OUT */
+#define OMAP54XX_OUTPUT_SHIFT                                          0
+#define OMAP54XX_OUTPUT_WIDTH                                          0x20
+#define OMAP54XX_OUTPUT_MASK                                           (0xffffffff << 0)
+
+/* Used by CM_CLKSEL_ABE */
+#define OMAP54XX_PAD_CLKS_GATE_SHIFT                                   8
+#define OMAP54XX_PAD_CLKS_GATE_WIDTH                                   0x1
+#define OMAP54XX_PAD_CLKS_GATE_MASK                                    (1 << 8)
+
+/* Used by CM_RESTORE_ST */
+#define OMAP54XX_PHASE1_COMPLETED_SHIFT                                        0
+#define OMAP54XX_PHASE1_COMPLETED_WIDTH                                        0x1
+#define OMAP54XX_PHASE1_COMPLETED_MASK                                 (1 << 0)
+
+/* Used by CM_RESTORE_ST */
+#define OMAP54XX_PHASE2A_COMPLETED_SHIFT                               1
+#define OMAP54XX_PHASE2A_COMPLETED_WIDTH                               0x1
+#define OMAP54XX_PHASE2A_COMPLETED_MASK                                        (1 << 1)
+
+/* Used by CM_RESTORE_ST */
+#define OMAP54XX_PHASE2B_COMPLETED_SHIFT                               2
+#define OMAP54XX_PHASE2B_COMPLETED_WIDTH                               0x1
+#define OMAP54XX_PHASE2B_COMPLETED_MASK                                        (1 << 2)
+
+/* Used by CM_DYN_DEP_PRESCAL */
+#define OMAP54XX_PRESCAL_SHIFT                                         0
+#define OMAP54XX_PRESCAL_WIDTH                                         0x6
+#define OMAP54XX_PRESCAL_MASK                                          (0x3f << 0)
+
+/* Used by REVISION_CM_CORE, REVISION_CM_CORE_AON */
+#define OMAP54XX_R_RTL_SHIFT                                           11
+#define OMAP54XX_R_RTL_WIDTH                                           0x5
+#define OMAP54XX_R_RTL_MASK                                            (0x1f << 11)
+
+/* Used by CM_L3INIT_USB_HOST_HS_CLKCTRL, CM_L3INIT_USB_TLL_HS_CLKCTRL */
+#define OMAP54XX_SAR_MODE_SHIFT                                                4
+#define OMAP54XX_SAR_MODE_WIDTH                                                0x1
+#define OMAP54XX_SAR_MODE_MASK                                         (1 << 4)
+
+/* Used by REVISION_CM_CORE, REVISION_CM_CORE_AON */
+#define OMAP54XX_SCHEME_SHIFT                                          30
+#define OMAP54XX_SCHEME_WIDTH                                          0x2
+#define OMAP54XX_SCHEME_MASK                                           (0x3 << 30)
+
+/* Used by CM_L4CFG_DYNAMICDEP */
+#define OMAP54XX_SDMA_DYNDEP_SHIFT                                     11
+#define OMAP54XX_SDMA_DYNDEP_WIDTH                                     0x1
+#define OMAP54XX_SDMA_DYNDEP_MASK                                      (1 << 11)
+
+/* Used by CM_IPU_STATICDEP, CM_MPU_STATICDEP */
+#define OMAP54XX_SDMA_STATDEP_SHIFT                                    11
+#define OMAP54XX_SDMA_STATDEP_WIDTH                                    0x1
+#define OMAP54XX_SDMA_STATDEP_MASK                                     (1 << 11)
+
+/* Used by CM_CORE_AON_DEBUG_CFG */
+#define OMAP54XX_SEL0_SHIFT                                            0
+#define OMAP54XX_SEL0_WIDTH                                            0x7
+#define OMAP54XX_SEL0_MASK                                             (0x7f << 0)
+
+/* Renamed from SEL0 Used by CM_CORE_DEBUG_CFG */
+#define OMAP54XX_SEL0_0_7_SHIFT                                                0
+#define OMAP54XX_SEL0_0_7_WIDTH                                                0x8
+#define OMAP54XX_SEL0_0_7_MASK                                         (0xff << 0)
+
+/* Used by CM_CORE_AON_DEBUG_CFG */
+#define OMAP54XX_SEL1_SHIFT                                            8
+#define OMAP54XX_SEL1_WIDTH                                            0x7
+#define OMAP54XX_SEL1_MASK                                             (0x7f << 8)
+
+/* Renamed from SEL1 Used by CM_CORE_DEBUG_CFG */
+#define OMAP54XX_SEL1_CORE_DEBUG_CFG_SHIFT                             8
+#define OMAP54XX_SEL1_CORE_DEBUG_CFG_WIDTH                             0x8
+#define OMAP54XX_SEL1_CORE_DEBUG_CFG_MASK                              (0xff << 8)
+
+/* Used by CM_CORE_AON_DEBUG_CFG */
+#define OMAP54XX_SEL2_SHIFT                                            16
+#define OMAP54XX_SEL2_WIDTH                                            0x7
+#define OMAP54XX_SEL2_MASK                                             (0x7f << 16)
+
+/* Renamed from SEL2 Used by CM_CORE_DEBUG_CFG */
+#define OMAP54XX_SEL2_CORE_DEBUG_CFG_SHIFT                             16
+#define OMAP54XX_SEL2_CORE_DEBUG_CFG_WIDTH                             0x8
+#define OMAP54XX_SEL2_CORE_DEBUG_CFG_MASK                              (0xff << 16)
+
+/* Used by CM_CORE_AON_DEBUG_CFG */
+#define OMAP54XX_SEL3_SHIFT                                            24
+#define OMAP54XX_SEL3_WIDTH                                            0x7
+#define OMAP54XX_SEL3_MASK                                             (0x7f << 24)
+
+/* Renamed from SEL3 Used by CM_CORE_DEBUG_CFG */
+#define OMAP54XX_SEL3_CORE_DEBUG_CFG_SHIFT                             24
+#define OMAP54XX_SEL3_CORE_DEBUG_CFG_WIDTH                             0x8
+#define OMAP54XX_SEL3_CORE_DEBUG_CFG_MASK                              (0xff << 24)
+
+/* Used by CM_CLKSEL_ABE */
+#define OMAP54XX_SLIMBUS1_CLK_GATE_SHIFT                               10
+#define OMAP54XX_SLIMBUS1_CLK_GATE_WIDTH                               0x1
+#define OMAP54XX_SLIMBUS1_CLK_GATE_MASK                                        (1 << 10)
+
+/*
+ * Used by CM_ABE_AESS_CLKCTRL, CM_C2C_C2C_CLKCTRL, CM_CAM_FDIF_CLKCTRL,
+ * CM_CAM_ISS_CLKCTRL, CM_DMA_DMA_SYSTEM_CLKCTRL, CM_DSP_DSP_CLKCTRL,
+ * CM_DSS_BB2D_CLKCTRL, CM_DSS_DSS_CLKCTRL, CM_EMU_DEBUGSS_CLKCTRL,
+ * CM_GPU_GPU_CLKCTRL, CM_IPU_IPU_CLKCTRL, CM_IVA_IVA_CLKCTRL,
+ * CM_L3INIT_HSI_CLKCTRL, CM_L3INIT_IEEE1500_2_OCP_CLKCTRL,
+ * CM_L3INIT_MMC1_CLKCTRL, CM_L3INIT_MMC2_CLKCTRL, CM_L3INIT_SATA_CLKCTRL,
+ * CM_L3INIT_UNIPRO2_CLKCTRL, CM_L3INIT_USB_HOST_HS_CLKCTRL,
+ * CM_L3INIT_USB_OTG_SS_CLKCTRL, CM_L4SEC_DMA_CRYPTO_CLKCTRL,
+ * CM_MIPIEXT_LLI_CLKCTRL, CM_MPU_MPU_CLKCTRL
+ */
+#define OMAP54XX_STBYST_SHIFT                                          18
+#define OMAP54XX_STBYST_WIDTH                                          0x1
+#define OMAP54XX_STBYST_MASK                                           (1 << 18)
+
+/*
+ * Used by CM_IDLEST_DPLL_ABE, CM_IDLEST_DPLL_CORE, CM_IDLEST_DPLL_IVA,
+ * CM_IDLEST_DPLL_MPU, CM_IDLEST_DPLL_PER, CM_IDLEST_DPLL_UNIPRO1,
+ * CM_IDLEST_DPLL_UNIPRO2, CM_IDLEST_DPLL_USB
+ */
+#define OMAP54XX_ST_DPLL_CLK_SHIFT                                     0
+#define OMAP54XX_ST_DPLL_CLK_WIDTH                                     0x1
+#define OMAP54XX_ST_DPLL_CLK_MASK                                      (1 << 0)
+
+/*
+ * Used by CM_CLKDCOLDO_DPLL_UNIPRO1, CM_CLKDCOLDO_DPLL_UNIPRO2,
+ * CM_CLKDCOLDO_DPLL_USB
+ */
+#define OMAP54XX_ST_DPLL_CLKDCOLDO_SHIFT                               9
+#define OMAP54XX_ST_DPLL_CLKDCOLDO_WIDTH                               0x1
+#define OMAP54XX_ST_DPLL_CLKDCOLDO_MASK                                        (1 << 9)
+
+/*
+ * Used by CM_IDLEST_DPLL_ABE, CM_IDLEST_DPLL_CORE, CM_IDLEST_DPLL_IVA,
+ * CM_IDLEST_DPLL_MPU, CM_IDLEST_DPLL_PER, CM_IDLEST_DPLL_UNIPRO1,
+ * CM_IDLEST_DPLL_UNIPRO2, CM_IDLEST_DPLL_USB
+ */
+#define OMAP54XX_ST_DPLL_INIT_SHIFT                                    4
+#define OMAP54XX_ST_DPLL_INIT_WIDTH                                    0x1
+#define OMAP54XX_ST_DPLL_INIT_MASK                                     (1 << 4)
+
+/*
+ * Used by CM_IDLEST_DPLL_ABE, CM_IDLEST_DPLL_CORE, CM_IDLEST_DPLL_IVA,
+ * CM_IDLEST_DPLL_MPU, CM_IDLEST_DPLL_PER, CM_IDLEST_DPLL_UNIPRO1,
+ * CM_IDLEST_DPLL_UNIPRO2, CM_IDLEST_DPLL_USB
+ */
+#define OMAP54XX_ST_DPLL_MODE_SHIFT                                    1
+#define OMAP54XX_ST_DPLL_MODE_WIDTH                                    0x3
+#define OMAP54XX_ST_DPLL_MODE_MASK                                     (0x7 << 1)
+
+/* Used by CM_CLKSEL_SYS */
+#define OMAP54XX_SYS_CLKSEL_SHIFT                                      0
+#define OMAP54XX_SYS_CLKSEL_WIDTH                                      0x3
+#define OMAP54XX_SYS_CLKSEL_MASK                                       (0x7 << 0)
+
+/*
+ * Used by CM_C2C_DYNAMICDEP, CM_DSP_DYNAMICDEP, CM_EMU_DYNAMICDEP,
+ * CM_IPU_DYNAMICDEP, CM_L3MAIN1_DYNAMICDEP, CM_L3MAIN2_DYNAMICDEP,
+ * CM_L4CFG_DYNAMICDEP, CM_L4PER_DYNAMICDEP, CM_MIPIEXT_DYNAMICDEP,
+ * CM_MPU_DYNAMICDEP
+ */
+#define OMAP54XX_WINDOWSIZE_SHIFT                                      24
+#define OMAP54XX_WINDOWSIZE_WIDTH                                      0x4
+#define OMAP54XX_WINDOWSIZE_MASK                                       (0xf << 24)
+
+/* Used by CM_L3MAIN1_DYNAMICDEP */
+#define OMAP54XX_WKUPAON_DYNDEP_SHIFT                                  15
+#define OMAP54XX_WKUPAON_DYNDEP_WIDTH                                  0x1
+#define OMAP54XX_WKUPAON_DYNDEP_MASK                                   (1 << 15)
+
+/*
+ * Used by CM_DMA_STATICDEP, CM_DSP_STATICDEP, CM_IPU_STATICDEP,
+ * CM_L3INIT_STATICDEP, CM_MPU_STATICDEP
+ */
+#define OMAP54XX_WKUPAON_STATDEP_SHIFT                                 15
+#define OMAP54XX_WKUPAON_STATDEP_WIDTH                                 0x1
+#define OMAP54XX_WKUPAON_STATDEP_MASK                                  (1 << 15)
+
+/* Used by REVISION_CM_CORE, REVISION_CM_CORE_AON */
+#define OMAP54XX_X_MAJOR_SHIFT                                         8
+#define OMAP54XX_X_MAJOR_WIDTH                                         0x3
+#define OMAP54XX_X_MAJOR_MASK                                          (0x7 << 8)
+
+/* Used by REVISION_CM_CORE, REVISION_CM_CORE_AON */
+#define OMAP54XX_Y_MINOR_SHIFT                                         0
+#define OMAP54XX_Y_MINOR_WIDTH                                         0x6
+#define OMAP54XX_Y_MINOR_MASK                                          (0x3f << 0)
+#endif
index 1bc00dc4876c0678e1bbd78e43f0806d822ddeeb..5ae8fe39d6ee5cfa838bea5e693194484be4ef56 100644 (file)
@@ -25,6 +25,8 @@
 #ifndef __ARCH_ARM_MACH_OMAP2_CM1_44XX_H
 #define __ARCH_ARM_MACH_OMAP2_CM1_44XX_H
 
+#include "cm_44xx_54xx.h"
+
 /* CM1 base address */
 #define OMAP4430_CM1_BASE              0x4a004000
 
 #define OMAP4_CM1_ABE_WDT3_CLKCTRL_OFFSET              0x0088
 #define OMAP4430_CM1_ABE_WDT3_CLKCTRL                  OMAP44XX_CM1_REGADDR(OMAP4430_CM1_ABE_INST, 0x0088)
 
-/* Function prototypes */
-extern u32 omap4_cm1_read_inst_reg(s16 inst, u16 idx);
-extern void omap4_cm1_write_inst_reg(u32 val, s16 inst, u16 idx);
-extern u32 omap4_cm1_rmw_inst_reg_bits(u32 mask, u32 bits, s16 inst, s16 idx);
-
 #endif
diff --git a/arch/arm/mach-omap2/cm1_54xx.h b/arch/arm/mach-omap2/cm1_54xx.h
new file mode 100644 (file)
index 0000000..90b3348
--- /dev/null
@@ -0,0 +1,213 @@
+/*
+ * OMAP54xx CM1 instance offset macros
+ *
+ * Copyright (C) 2013 Texas Instruments Incorporated - http://www.ti.com
+ *
+ * Paul Walmsley (paul@pwsan.com)
+ * Rajendra Nayak (rnayak@ti.com)
+ * Benoit Cousson (b-cousson@ti.com)
+ *
+ * This file is automatically generated from the OMAP hardware databases.
+ * We respectfully ask that any modifications to this file be coordinated
+ * with the public linux-omap@vger.kernel.org mailing list and the
+ * authors above to ensure that the autogeneration scripts are kept
+ * up-to-date with the file contents.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ */
+
+#ifndef __ARCH_ARM_MACH_OMAP2_CM1_54XX_H
+#define __ARCH_ARM_MACH_OMAP2_CM1_54XX_H
+
+#include "cm_44xx_54xx.h"
+
+/* CM1 base address */
+#define OMAP54XX_CM_CORE_AON_BASE              0x4a004000
+
+#define OMAP54XX_CM_CORE_AON_REGADDR(inst, reg)                                \
+       OMAP2_L4_IO_ADDRESS(OMAP54XX_CM_CORE_AON_BASE + (inst) + (reg))
+
+/* CM_CORE_AON instances */
+#define OMAP54XX_CM_CORE_AON_OCP_SOCKET_INST   0x0000
+#define OMAP54XX_CM_CORE_AON_CKGEN_INST                0x0100
+#define OMAP54XX_CM_CORE_AON_MPU_INST          0x0300
+#define OMAP54XX_CM_CORE_AON_DSP_INST          0x0400
+#define OMAP54XX_CM_CORE_AON_ABE_INST          0x0500
+#define OMAP54XX_CM_CORE_AON_RESTORE_INST      0x0e00
+#define OMAP54XX_CM_CORE_AON_INSTR_INST                0x0f00
+
+/* CM_CORE_AON clockdomain register offsets (from instance start) */
+#define OMAP54XX_CM_CORE_AON_MPU_MPU_CDOFFS    0x0000
+#define OMAP54XX_CM_CORE_AON_DSP_DSP_CDOFFS    0x0000
+#define OMAP54XX_CM_CORE_AON_ABE_ABE_CDOFFS    0x0000
+
+/* CM_CORE_AON */
+
+/* CM_CORE_AON.OCP_SOCKET_CM_CORE_AON register offsets */
+#define OMAP54XX_REVISION_CM_CORE_AON_OFFSET                   0x0000
+#define OMAP54XX_CM_CM_CORE_AON_PROFILING_CLKCTRL_OFFSET       0x0040
+#define OMAP54XX_CM_CM_CORE_AON_PROFILING_CLKCTRL              OMAP54XX_CM_CORE_AON_REGADDR(OMAP54XX_CM_CORE_AON_OCP_SOCKET_INST, 0x0040)
+#define OMAP54XX_CM_CORE_AON_DEBUG_CFG_OFFSET                  0x0080
+#define OMAP54XX_CM_CORE_AON_DEBUG_OUT_OFFSET                  0x0084
+#define OMAP54XX_CM_CORE_AON_DEBUG_MPU_FD_TRANS_OFFSET         0x0090
+#define OMAP54XX_CM_CORE_AON_DEBUG_DSP_FD_TRANS_OFFSET         0x0094
+#define OMAP54XX_CM_CORE_AON_DEBUG_ABE_FD_TRANS_OFFSET         0x0098
+#define OMAP54XX_CM_CORE_AON_DEBUG_ABE_FD_TRANS2_OFFSET                0x009c
+#define OMAP54XX_CM_CORE_AON_DEBUG_CM_CORE_AON_FD_TRANS_OFFSET 0x00a0
+#define OMAP54XX_CM_CORE_AON_DEBUG_C2C_FD_TRANS_OFFSET         0x00a4
+#define OMAP54XX_CM_CORE_AON_DEBUG_CAM_FD_TRANS_OFFSET         0x00a8
+#define OMAP54XX_CM_CORE_AON_DEBUG_COREAON_FD_TRANS_OFFSET     0x00ac
+#define OMAP54XX_CM_CORE_AON_DEBUG_CUSTEFUSE_FD_TRANS_OFFSET   0x00b0
+#define OMAP54XX_CM_CORE_AON_DEBUG_DMA_FD_TRANS_OFFSET         0x00b4
+#define OMAP54XX_CM_CORE_AON_DEBUG_DSS_FD_TRANS_OFFSET         0x00b8
+#define OMAP54XX_CM_CORE_AON_DEBUG_EMIF_FD_TRANS_OFFSET                0x00bc
+#define OMAP54XX_CM_CORE_AON_DEBUG_GPU_FD_TRANS_OFFSET         0x00c0
+#define OMAP54XX_CM_CORE_AON_DEBUG_IPU_FD_TRANS_OFFSET         0x00c4
+#define OMAP54XX_CM_CORE_AON_DEBUG_IVA_FD_TRANS_OFFSET         0x00c8
+#define OMAP54XX_CM_CORE_AON_DEBUG_L3INIT_FD_TRANS_OFFSET      0x00cc
+#define OMAP54XX_CM_CORE_AON_DEBUG_L3INIT_FD_TRANS2_OFFSET     0x00d0
+#define OMAP54XX_CM_CORE_AON_DEBUG_L3INSTR_FD_TRANS_OFFSET     0x00d4
+#define OMAP54XX_CM_CORE_AON_DEBUG_L3MAIN1_FD_TRANS_OFFSET     0x00d8
+#define OMAP54XX_CM_CORE_AON_DEBUG_L3MAIN2_FD_TRANS_OFFSET     0x00dc
+#define OMAP54XX_CM_CORE_AON_DEBUG_L4CFG_FD_TRANS_OFFSET       0x00e0
+#define OMAP54XX_CM_CORE_AON_DEBUG_L4PER_FD_TRANS_OFFSET       0x00e4
+#define OMAP54XX_CM_CORE_AON_DEBUG_L4PER_FD_TRANS2_OFFSET      0x00e8
+#define OMAP54XX_CM_CORE_AON_DEBUG_L4SEC_FD_TRANS_OFFSET       0x00ec
+#define OMAP54XX_CM_CORE_AON_DEBUG_MIPIEXT_FD_TRANS_OFFSET     0x00f0
+
+/* CM_CORE_AON.CKGEN_CM_CORE_AON register offsets */
+#define OMAP54XX_CM_CLKSEL_CORE_OFFSET                         0x0000
+#define OMAP54XX_CM_CLKSEL_CORE                                        OMAP54XX_CM_CORE_AON_REGADDR(OMAP54XX_CM_CORE_AON_CKGEN_INST, 0x0000)
+#define OMAP54XX_CM_CLKSEL_ABE_OFFSET                          0x0008
+#define OMAP54XX_CM_CLKSEL_ABE                                 OMAP54XX_CM_CORE_AON_REGADDR(OMAP54XX_CM_CORE_AON_CKGEN_INST, 0x0008)
+#define OMAP54XX_CM_DLL_CTRL_OFFSET                            0x0010
+#define OMAP54XX_CM_CLKMODE_DPLL_CORE_OFFSET                   0x0020
+#define OMAP54XX_CM_CLKMODE_DPLL_CORE                          OMAP54XX_CM_CORE_AON_REGADDR(OMAP54XX_CM_CORE_AON_CKGEN_INST, 0x0020)
+#define OMAP54XX_CM_IDLEST_DPLL_CORE_OFFSET                    0x0024
+#define OMAP54XX_CM_IDLEST_DPLL_CORE                           OMAP54XX_CM_CORE_AON_REGADDR(OMAP54XX_CM_CORE_AON_CKGEN_INST, 0x0024)
+#define OMAP54XX_CM_AUTOIDLE_DPLL_CORE_OFFSET                  0x0028
+#define OMAP54XX_CM_AUTOIDLE_DPLL_CORE                         OMAP54XX_CM_CORE_AON_REGADDR(OMAP54XX_CM_CORE_AON_CKGEN_INST, 0x0028)
+#define OMAP54XX_CM_CLKSEL_DPLL_CORE_OFFSET                    0x002c
+#define OMAP54XX_CM_CLKSEL_DPLL_CORE                           OMAP54XX_CM_CORE_AON_REGADDR(OMAP54XX_CM_CORE_AON_CKGEN_INST, 0x002c)
+#define OMAP54XX_CM_DIV_M2_DPLL_CORE_OFFSET                    0x0030
+#define OMAP54XX_CM_DIV_M2_DPLL_CORE                           OMAP54XX_CM_CORE_AON_REGADDR(OMAP54XX_CM_CORE_AON_CKGEN_INST, 0x0030)
+#define OMAP54XX_CM_DIV_M3_DPLL_CORE_OFFSET                    0x0034
+#define OMAP54XX_CM_DIV_M3_DPLL_CORE                           OMAP54XX_CM_CORE_AON_REGADDR(OMAP54XX_CM_CORE_AON_CKGEN_INST, 0x0034)
+#define OMAP54XX_CM_DIV_H11_DPLL_CORE_OFFSET                   0x0038
+#define OMAP54XX_CM_DIV_H11_DPLL_CORE                          OMAP54XX_CM_CORE_AON_REGADDR(OMAP54XX_CM_CORE_AON_CKGEN_INST, 0x0038)
+#define OMAP54XX_CM_DIV_H12_DPLL_CORE_OFFSET                   0x003c
+#define OMAP54XX_CM_DIV_H12_DPLL_CORE                          OMAP54XX_CM_CORE_AON_REGADDR(OMAP54XX_CM_CORE_AON_CKGEN_INST, 0x003c)
+#define OMAP54XX_CM_DIV_H13_DPLL_CORE_OFFSET                   0x0040
+#define OMAP54XX_CM_DIV_H13_DPLL_CORE                          OMAP54XX_CM_CORE_AON_REGADDR(OMAP54XX_CM_CORE_AON_CKGEN_INST, 0x0040)
+#define OMAP54XX_CM_DIV_H14_DPLL_CORE_OFFSET                   0x0044
+#define OMAP54XX_CM_DIV_H14_DPLL_CORE                          OMAP54XX_CM_CORE_AON_REGADDR(OMAP54XX_CM_CORE_AON_CKGEN_INST, 0x0044)
+#define OMAP54XX_CM_SSC_DELTAMSTEP_DPLL_CORE_OFFSET            0x0048
+#define OMAP54XX_CM_SSC_MODFREQDIV_DPLL_CORE_OFFSET            0x004c
+#define OMAP54XX_CM_DIV_H21_DPLL_CORE_OFFSET                   0x0050
+#define OMAP54XX_CM_DIV_H21_DPLL_CORE                          OMAP54XX_CM_CORE_AON_REGADDR(OMAP54XX_CM_CORE_AON_CKGEN_INST, 0x0050)
+#define OMAP54XX_CM_DIV_H22_DPLL_CORE_OFFSET                   0x0054
+#define OMAP54XX_CM_DIV_H22_DPLL_CORE                          OMAP54XX_CM_CORE_AON_REGADDR(OMAP54XX_CM_CORE_AON_CKGEN_INST, 0x0054)
+#define OMAP54XX_CM_DIV_H23_DPLL_CORE_OFFSET                   0x0058
+#define OMAP54XX_CM_DIV_H23_DPLL_CORE                          OMAP54XX_CM_CORE_AON_REGADDR(OMAP54XX_CM_CORE_AON_CKGEN_INST, 0x0058)
+#define OMAP54XX_CM_DIV_H24_DPLL_CORE_OFFSET                   0x005c
+#define OMAP54XX_CM_DIV_H24_DPLL_CORE                          OMAP54XX_CM_CORE_AON_REGADDR(OMAP54XX_CM_CORE_AON_CKGEN_INST, 0x005c)
+#define OMAP54XX_CM_CLKMODE_DPLL_MPU_OFFSET                    0x0060
+#define OMAP54XX_CM_CLKMODE_DPLL_MPU                           OMAP54XX_CM_CORE_AON_REGADDR(OMAP54XX_CM_CORE_AON_CKGEN_INST, 0x0060)
+#define OMAP54XX_CM_IDLEST_DPLL_MPU_OFFSET                     0x0064
+#define OMAP54XX_CM_IDLEST_DPLL_MPU                            OMAP54XX_CM_CORE_AON_REGADDR(OMAP54XX_CM_CORE_AON_CKGEN_INST, 0x0064)
+#define OMAP54XX_CM_AUTOIDLE_DPLL_MPU_OFFSET                   0x0068
+#define OMAP54XX_CM_AUTOIDLE_DPLL_MPU                          OMAP54XX_CM_CORE_AON_REGADDR(OMAP54XX_CM_CORE_AON_CKGEN_INST, 0x0068)
+#define OMAP54XX_CM_CLKSEL_DPLL_MPU_OFFSET                     0x006c
+#define OMAP54XX_CM_CLKSEL_DPLL_MPU                            OMAP54XX_CM_CORE_AON_REGADDR(OMAP54XX_CM_CORE_AON_CKGEN_INST, 0x006c)
+#define OMAP54XX_CM_DIV_M2_DPLL_MPU_OFFSET                     0x0070
+#define OMAP54XX_CM_DIV_M2_DPLL_MPU                            OMAP54XX_CM_CORE_AON_REGADDR(OMAP54XX_CM_CORE_AON_CKGEN_INST, 0x0070)
+#define OMAP54XX_CM_SSC_DELTAMSTEP_DPLL_MPU_OFFSET             0x0088
+#define OMAP54XX_CM_SSC_MODFREQDIV_DPLL_MPU_OFFSET             0x008c
+#define OMAP54XX_CM_BYPCLK_DPLL_MPU_OFFSET                     0x009c
+#define OMAP54XX_CM_BYPCLK_DPLL_MPU                            OMAP54XX_CM_CORE_AON_REGADDR(OMAP54XX_CM_CORE_AON_CKGEN_INST, 0x009c)
+#define OMAP54XX_CM_CLKMODE_DPLL_IVA_OFFSET                    0x00a0
+#define OMAP54XX_CM_CLKMODE_DPLL_IVA                           OMAP54XX_CM_CORE_AON_REGADDR(OMAP54XX_CM_CORE_AON_CKGEN_INST, 0x00a0)
+#define OMAP54XX_CM_IDLEST_DPLL_IVA_OFFSET                     0x00a4
+#define OMAP54XX_CM_IDLEST_DPLL_IVA                            OMAP54XX_CM_CORE_AON_REGADDR(OMAP54XX_CM_CORE_AON_CKGEN_INST, 0x00a4)
+#define OMAP54XX_CM_AUTOIDLE_DPLL_IVA_OFFSET                   0x00a8
+#define OMAP54XX_CM_AUTOIDLE_DPLL_IVA                          OMAP54XX_CM_CORE_AON_REGADDR(OMAP54XX_CM_CORE_AON_CKGEN_INST, 0x00a8)
+#define OMAP54XX_CM_CLKSEL_DPLL_IVA_OFFSET                     0x00ac
+#define OMAP54XX_CM_CLKSEL_DPLL_IVA                            OMAP54XX_CM_CORE_AON_REGADDR(OMAP54XX_CM_CORE_AON_CKGEN_INST, 0x00ac)
+#define OMAP54XX_CM_DIV_H11_DPLL_IVA_OFFSET                    0x00b8
+#define OMAP54XX_CM_DIV_H11_DPLL_IVA                           OMAP54XX_CM_CORE_AON_REGADDR(OMAP54XX_CM_CORE_AON_CKGEN_INST, 0x00b8)
+#define OMAP54XX_CM_DIV_H12_DPLL_IVA_OFFSET                    0x00bc
+#define OMAP54XX_CM_DIV_H12_DPLL_IVA                           OMAP54XX_CM_CORE_AON_REGADDR(OMAP54XX_CM_CORE_AON_CKGEN_INST, 0x00bc)
+#define OMAP54XX_CM_SSC_DELTAMSTEP_DPLL_IVA_OFFSET             0x00c8
+#define OMAP54XX_CM_SSC_MODFREQDIV_DPLL_IVA_OFFSET             0x00cc
+#define OMAP54XX_CM_BYPCLK_DPLL_IVA_OFFSET                     0x00dc
+#define OMAP54XX_CM_BYPCLK_DPLL_IVA                            OMAP54XX_CM_CORE_AON_REGADDR(OMAP54XX_CM_CORE_AON_CKGEN_INST, 0x00dc)
+#define OMAP54XX_CM_CLKMODE_DPLL_ABE_OFFSET                    0x00e0
+#define OMAP54XX_CM_CLKMODE_DPLL_ABE                           OMAP54XX_CM_CORE_AON_REGADDR(OMAP54XX_CM_CORE_AON_CKGEN_INST, 0x00e0)
+#define OMAP54XX_CM_IDLEST_DPLL_ABE_OFFSET                     0x00e4
+#define OMAP54XX_CM_IDLEST_DPLL_ABE                            OMAP54XX_CM_CORE_AON_REGADDR(OMAP54XX_CM_CORE_AON_CKGEN_INST, 0x00e4)
+#define OMAP54XX_CM_AUTOIDLE_DPLL_ABE_OFFSET                   0x00e8
+#define OMAP54XX_CM_AUTOIDLE_DPLL_ABE                          OMAP54XX_CM_CORE_AON_REGADDR(OMAP54XX_CM_CORE_AON_CKGEN_INST, 0x00e8)
+#define OMAP54XX_CM_CLKSEL_DPLL_ABE_OFFSET                     0x00ec
+#define OMAP54XX_CM_CLKSEL_DPLL_ABE                            OMAP54XX_CM_CORE_AON_REGADDR(OMAP54XX_CM_CORE_AON_CKGEN_INST, 0x00ec)
+#define OMAP54XX_CM_DIV_M2_DPLL_ABE_OFFSET                     0x00f0
+#define OMAP54XX_CM_DIV_M2_DPLL_ABE                            OMAP54XX_CM_CORE_AON_REGADDR(OMAP54XX_CM_CORE_AON_CKGEN_INST, 0x00f0)
+#define OMAP54XX_CM_DIV_M3_DPLL_ABE_OFFSET                     0x00f4
+#define OMAP54XX_CM_DIV_M3_DPLL_ABE                            OMAP54XX_CM_CORE_AON_REGADDR(OMAP54XX_CM_CORE_AON_CKGEN_INST, 0x00f4)
+#define OMAP54XX_CM_SSC_DELTAMSTEP_DPLL_ABE_OFFSET             0x0108
+#define OMAP54XX_CM_SSC_MODFREQDIV_DPLL_ABE_OFFSET             0x010c
+#define OMAP54XX_CM_SHADOW_FREQ_CONFIG1_OFFSET                 0x0160
+#define OMAP54XX_CM_SHADOW_FREQ_CONFIG2_OFFSET                 0x0164
+#define OMAP54XX_CM_DYN_DEP_PRESCAL_OFFSET                     0x0170
+#define OMAP54XX_CM_RESTORE_ST_OFFSET                          0x0180
+
+/* CM_CORE_AON.MPU_CM_CORE_AON register offsets */
+#define OMAP54XX_CM_MPU_CLKSTCTRL_OFFSET                       0x0000
+#define OMAP54XX_CM_MPU_STATICDEP_OFFSET                       0x0004
+#define OMAP54XX_CM_MPU_DYNAMICDEP_OFFSET                      0x0008
+#define OMAP54XX_CM_MPU_MPU_CLKCTRL_OFFSET                     0x0020
+#define OMAP54XX_CM_MPU_MPU_CLKCTRL                            OMAP54XX_CM_CORE_AON_REGADDR(OMAP54XX_CM_CORE_AON_MPU_INST, 0x0020)
+#define OMAP54XX_CM_MPU_MPU_MPU_DBG_CLKCTRL_OFFSET             0x0028
+#define OMAP54XX_CM_MPU_MPU_MPU_DBG_CLKCTRL                    OMAP54XX_CM_CORE_AON_REGADDR(OMAP54XX_CM_CORE_AON_MPU_INST, 0x0028)
+
+/* CM_CORE_AON.DSP_CM_CORE_AON register offsets */
+#define OMAP54XX_CM_DSP_CLKSTCTRL_OFFSET                       0x0000
+#define OMAP54XX_CM_DSP_STATICDEP_OFFSET                       0x0004
+#define OMAP54XX_CM_DSP_DYNAMICDEP_OFFSET                      0x0008
+#define OMAP54XX_CM_DSP_DSP_CLKCTRL_OFFSET                     0x0020
+#define OMAP54XX_CM_DSP_DSP_CLKCTRL                            OMAP54XX_CM_CORE_AON_REGADDR(OMAP54XX_CM_CORE_AON_DSP_INST, 0x0020)
+
+/* CM_CORE_AON.ABE_CM_CORE_AON register offsets */
+#define OMAP54XX_CM_ABE_CLKSTCTRL_OFFSET                       0x0000
+#define OMAP54XX_CM_ABE_L4_ABE_CLKCTRL_OFFSET                  0x0020
+#define OMAP54XX_CM_ABE_L4_ABE_CLKCTRL                         OMAP54XX_CM_CORE_AON_REGADDR(OMAP54XX_CM_CORE_AON_ABE_INST, 0x0020)
+#define OMAP54XX_CM_ABE_AESS_CLKCTRL_OFFSET                    0x0028
+#define OMAP54XX_CM_ABE_AESS_CLKCTRL                           OMAP54XX_CM_CORE_AON_REGADDR(OMAP54XX_CM_CORE_AON_ABE_INST, 0x0028)
+#define OMAP54XX_CM_ABE_MCPDM_CLKCTRL_OFFSET                   0x0030
+#define OMAP54XX_CM_ABE_MCPDM_CLKCTRL                          OMAP54XX_CM_CORE_AON_REGADDR(OMAP54XX_CM_CORE_AON_ABE_INST, 0x0030)
+#define OMAP54XX_CM_ABE_DMIC_CLKCTRL_OFFSET                    0x0038
+#define OMAP54XX_CM_ABE_DMIC_CLKCTRL                           OMAP54XX_CM_CORE_AON_REGADDR(OMAP54XX_CM_CORE_AON_ABE_INST, 0x0038)
+#define OMAP54XX_CM_ABE_MCASP_CLKCTRL_OFFSET                   0x0040
+#define OMAP54XX_CM_ABE_MCASP_CLKCTRL                          OMAP54XX_CM_CORE_AON_REGADDR(OMAP54XX_CM_CORE_AON_ABE_INST, 0x0040)
+#define OMAP54XX_CM_ABE_MCBSP1_CLKCTRL_OFFSET                  0x0048
+#define OMAP54XX_CM_ABE_MCBSP1_CLKCTRL                         OMAP54XX_CM_CORE_AON_REGADDR(OMAP54XX_CM_CORE_AON_ABE_INST, 0x0048)
+#define OMAP54XX_CM_ABE_MCBSP2_CLKCTRL_OFFSET                  0x0050
+#define OMAP54XX_CM_ABE_MCBSP2_CLKCTRL                         OMAP54XX_CM_CORE_AON_REGADDR(OMAP54XX_CM_CORE_AON_ABE_INST, 0x0050)
+#define OMAP54XX_CM_ABE_MCBSP3_CLKCTRL_OFFSET                  0x0058
+#define OMAP54XX_CM_ABE_MCBSP3_CLKCTRL                         OMAP54XX_CM_CORE_AON_REGADDR(OMAP54XX_CM_CORE_AON_ABE_INST, 0x0058)
+#define OMAP54XX_CM_ABE_SLIMBUS1_CLKCTRL_OFFSET                        0x0060
+#define OMAP54XX_CM_ABE_SLIMBUS1_CLKCTRL                       OMAP54XX_CM_CORE_AON_REGADDR(OMAP54XX_CM_CORE_AON_ABE_INST, 0x0060)
+#define OMAP54XX_CM_ABE_TIMER5_CLKCTRL_OFFSET                  0x0068
+#define OMAP54XX_CM_ABE_TIMER5_CLKCTRL                         OMAP54XX_CM_CORE_AON_REGADDR(OMAP54XX_CM_CORE_AON_ABE_INST, 0x0068)
+#define OMAP54XX_CM_ABE_TIMER6_CLKCTRL_OFFSET                  0x0070
+#define OMAP54XX_CM_ABE_TIMER6_CLKCTRL                         OMAP54XX_CM_CORE_AON_REGADDR(OMAP54XX_CM_CORE_AON_ABE_INST, 0x0070)
+#define OMAP54XX_CM_ABE_TIMER7_CLKCTRL_OFFSET                  0x0078
+#define OMAP54XX_CM_ABE_TIMER7_CLKCTRL                         OMAP54XX_CM_CORE_AON_REGADDR(OMAP54XX_CM_CORE_AON_ABE_INST, 0x0078)
+#define OMAP54XX_CM_ABE_TIMER8_CLKCTRL_OFFSET                  0x0080
+#define OMAP54XX_CM_ABE_TIMER8_CLKCTRL                         OMAP54XX_CM_CORE_AON_REGADDR(OMAP54XX_CM_CORE_AON_ABE_INST, 0x0080)
+#define OMAP54XX_CM_ABE_WD_TIMER3_CLKCTRL_OFFSET               0x0088
+#define OMAP54XX_CM_ABE_WD_TIMER3_CLKCTRL                      OMAP54XX_CM_CORE_AON_REGADDR(OMAP54XX_CM_CORE_AON_ABE_INST, 0x0088)
+
+#endif
index b9de72da1a8e26d751ce9555998e6c956efc0723..ee5136d7cddac06029d7eb12313602c59943c6ea 100644 (file)
@@ -25,6 +25,8 @@
 #ifndef __ARCH_ARM_MACH_OMAP2_CM2_44XX_H
 #define __ARCH_ARM_MACH_OMAP2_CM2_44XX_H
 
+#include "cm_44xx_54xx.h"
+
 /* CM2 base address */
 #define OMAP4430_CM2_BASE              0x4a008000
 
 #define OMAP4_CM_CEFUSE_CEFUSE_CLKCTRL_OFFSET          0x0020
 #define OMAP4430_CM_CEFUSE_CEFUSE_CLKCTRL              OMAP44XX_CM2_REGADDR(OMAP4430_CM2_CEFUSE_INST, 0x0020)
 
-/* Function prototypes */
-extern u32 omap4_cm2_read_inst_reg(s16 inst, u16 idx);
-extern void omap4_cm2_write_inst_reg(u32 val, s16 inst, u16 idx);
-extern u32 omap4_cm2_rmw_inst_reg_bits(u32 mask, u32 bits, s16 inst, s16 idx);
-
 #endif
diff --git a/arch/arm/mach-omap2/cm2_54xx.h b/arch/arm/mach-omap2/cm2_54xx.h
new file mode 100644 (file)
index 0000000..2683231
--- /dev/null
@@ -0,0 +1,389 @@
+/*
+ * OMAP54xx CM2 instance offset macros
+ *
+ * Copyright (C) 2013 Texas Instruments Incorporated - http://www.ti.com
+ *
+ * Paul Walmsley (paul@pwsan.com)
+ * Rajendra Nayak (rnayak@ti.com)
+ * Benoit Cousson (b-cousson@ti.com)
+ *
+ * This file is automatically generated from the OMAP hardware databases.
+ * We respectfully ask that any modifications to this file be coordinated
+ * with the public linux-omap@vger.kernel.org mailing list and the
+ * authors above to ensure that the autogeneration scripts are kept
+ * up-to-date with the file contents.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#ifndef __ARCH_ARM_MACH_OMAP2_CM2_54XX_H
+#define __ARCH_ARM_MACH_OMAP2_CM2_54XX_H
+
+#include "cm_44xx_54xx.h"
+
+/* CM2 base address */
+#define OMAP54XX_CM_CORE_BASE          0x4a008000
+
+#define OMAP54XX_CM_CORE_REGADDR(inst, reg)                            \
+       OMAP2_L4_IO_ADDRESS(OMAP54XX_CM_CORE_BASE + (inst) + (reg))
+
+/* CM_CORE instances */
+#define OMAP54XX_CM_CORE_OCP_SOCKET_INST       0x0000
+#define OMAP54XX_CM_CORE_CKGEN_INST            0x0100
+#define OMAP54XX_CM_CORE_COREAON_INST          0x0600
+#define OMAP54XX_CM_CORE_CORE_INST             0x0700
+#define OMAP54XX_CM_CORE_IVA_INST              0x1200
+#define OMAP54XX_CM_CORE_CAM_INST              0x1300
+#define OMAP54XX_CM_CORE_DSS_INST              0x1400
+#define OMAP54XX_CM_CORE_GPU_INST              0x1500
+#define OMAP54XX_CM_CORE_L3INIT_INST           0x1600
+#define OMAP54XX_CM_CORE_CUSTEFUSE_INST                0x1700
+#define OMAP54XX_CM_CORE_RESTORE_INST          0x1e00
+#define OMAP54XX_CM_CORE_INSTR_INST            0x1f00
+
+/* CM_CORE clockdomain register offsets (from instance start) */
+#define OMAP54XX_CM_CORE_COREAON_COREAON_CDOFFS                0x0000
+#define OMAP54XX_CM_CORE_CORE_L3MAIN1_CDOFFS           0x0000
+#define OMAP54XX_CM_CORE_CORE_L3MAIN2_CDOFFS           0x0100
+#define OMAP54XX_CM_CORE_CORE_IPU_CDOFFS               0x0200
+#define OMAP54XX_CM_CORE_CORE_DMA_CDOFFS               0x0300
+#define OMAP54XX_CM_CORE_CORE_EMIF_CDOFFS              0x0400
+#define OMAP54XX_CM_CORE_CORE_C2C_CDOFFS               0x0500
+#define OMAP54XX_CM_CORE_CORE_L4CFG_CDOFFS             0x0600
+#define OMAP54XX_CM_CORE_CORE_L3INSTR_CDOFFS           0x0700
+#define OMAP54XX_CM_CORE_CORE_MIPIEXT_CDOFFS           0x0800
+#define OMAP54XX_CM_CORE_CORE_L4PER_CDOFFS             0x0900
+#define OMAP54XX_CM_CORE_CORE_L4SEC_CDOFFS             0x0a80
+#define OMAP54XX_CM_CORE_IVA_IVA_CDOFFS                        0x0000
+#define OMAP54XX_CM_CORE_CAM_CAM_CDOFFS                        0x0000
+#define OMAP54XX_CM_CORE_DSS_DSS_CDOFFS                        0x0000
+#define OMAP54XX_CM_CORE_GPU_GPU_CDOFFS                        0x0000
+#define OMAP54XX_CM_CORE_L3INIT_L3INIT_CDOFFS          0x0000
+#define OMAP54XX_CM_CORE_CUSTEFUSE_CUSTEFUSE_CDOFFS    0x0000
+
+/* CM_CORE */
+
+/* CM_CORE.OCP_SOCKET_CM_CORE register offsets */
+#define OMAP54XX_REVISION_CM_CORE_OFFSET                       0x0000
+#define OMAP54XX_CM_CM_CORE_PROFILING_CLKCTRL_OFFSET           0x0040
+#define OMAP54XX_CM_CM_CORE_PROFILING_CLKCTRL                  OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_OCP_SOCKET_INST, 0x0040)
+#define OMAP54XX_CM_CORE_DEBUG_CFG_OFFSET                      0x0080
+#define OMAP54XX_CM_CORE_DEBUG_OUT_OFFSET                      0x0084
+
+/* CM_CORE.CKGEN_CM_CORE register offsets */
+#define OMAP54XX_CM_CLKSEL_USB_60MHZ_OFFSET                    0x0004
+#define OMAP54XX_CM_CLKSEL_USB_60MHZ                           OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_CKGEN_INST, 0x0004)
+#define OMAP54XX_CM_CLKMODE_DPLL_PER_OFFSET                    0x0040
+#define OMAP54XX_CM_CLKMODE_DPLL_PER                           OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_CKGEN_INST, 0x0040)
+#define OMAP54XX_CM_IDLEST_DPLL_PER_OFFSET                     0x0044
+#define OMAP54XX_CM_IDLEST_DPLL_PER                            OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_CKGEN_INST, 0x0044)
+#define OMAP54XX_CM_AUTOIDLE_DPLL_PER_OFFSET                   0x0048
+#define OMAP54XX_CM_AUTOIDLE_DPLL_PER                          OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_CKGEN_INST, 0x0048)
+#define OMAP54XX_CM_CLKSEL_DPLL_PER_OFFSET                     0x004c
+#define OMAP54XX_CM_CLKSEL_DPLL_PER                            OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_CKGEN_INST, 0x004c)
+#define OMAP54XX_CM_DIV_M2_DPLL_PER_OFFSET                     0x0050
+#define OMAP54XX_CM_DIV_M2_DPLL_PER                            OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_CKGEN_INST, 0x0050)
+#define OMAP54XX_CM_DIV_M3_DPLL_PER_OFFSET                     0x0054
+#define OMAP54XX_CM_DIV_M3_DPLL_PER                            OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_CKGEN_INST, 0x0054)
+#define OMAP54XX_CM_DIV_H11_DPLL_PER_OFFSET                    0x0058
+#define OMAP54XX_CM_DIV_H11_DPLL_PER                           OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_CKGEN_INST, 0x0058)
+#define OMAP54XX_CM_DIV_H12_DPLL_PER_OFFSET                    0x005c
+#define OMAP54XX_CM_DIV_H12_DPLL_PER                           OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_CKGEN_INST, 0x005c)
+#define OMAP54XX_CM_DIV_H13_DPLL_PER_OFFSET                    0x0060
+#define OMAP54XX_CM_DIV_H13_DPLL_PER                           OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_CKGEN_INST, 0x0060)
+#define OMAP54XX_CM_DIV_H14_DPLL_PER_OFFSET                    0x0064
+#define OMAP54XX_CM_DIV_H14_DPLL_PER                           OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_CKGEN_INST, 0x0064)
+#define OMAP54XX_CM_SSC_DELTAMSTEP_DPLL_PER_OFFSET             0x0068
+#define OMAP54XX_CM_SSC_MODFREQDIV_DPLL_PER_OFFSET             0x006c
+#define OMAP54XX_CM_CLKMODE_DPLL_USB_OFFSET                    0x0080
+#define OMAP54XX_CM_CLKMODE_DPLL_USB                           OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_CKGEN_INST, 0x0080)
+#define OMAP54XX_CM_IDLEST_DPLL_USB_OFFSET                     0x0084
+#define OMAP54XX_CM_IDLEST_DPLL_USB                            OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_CKGEN_INST, 0x0084)
+#define OMAP54XX_CM_AUTOIDLE_DPLL_USB_OFFSET                   0x0088
+#define OMAP54XX_CM_AUTOIDLE_DPLL_USB                          OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_CKGEN_INST, 0x0088)
+#define OMAP54XX_CM_CLKSEL_DPLL_USB_OFFSET                     0x008c
+#define OMAP54XX_CM_CLKSEL_DPLL_USB                            OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_CKGEN_INST, 0x008c)
+#define OMAP54XX_CM_DIV_M2_DPLL_USB_OFFSET                     0x0090
+#define OMAP54XX_CM_DIV_M2_DPLL_USB                            OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_CKGEN_INST, 0x0090)
+#define OMAP54XX_CM_SSC_DELTAMSTEP_DPLL_USB_OFFSET             0x00a8
+#define OMAP54XX_CM_SSC_MODFREQDIV_DPLL_USB_OFFSET             0x00ac
+#define OMAP54XX_CM_CLKDCOLDO_DPLL_USB_OFFSET                  0x00b4
+#define OMAP54XX_CM_CLKDCOLDO_DPLL_USB                         OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_CKGEN_INST, 0x00b4)
+#define OMAP54XX_CM_CLKMODE_DPLL_UNIPRO2_OFFSET                        0x00c0
+#define OMAP54XX_CM_CLKMODE_DPLL_UNIPRO2                       OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_CKGEN_INST, 0x00c0)
+#define OMAP54XX_CM_IDLEST_DPLL_UNIPRO2_OFFSET                 0x00c4
+#define OMAP54XX_CM_IDLEST_DPLL_UNIPRO2                                OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_CKGEN_INST, 0x00c4)
+#define OMAP54XX_CM_AUTOIDLE_DPLL_UNIPRO2_OFFSET               0x00c8
+#define OMAP54XX_CM_AUTOIDLE_DPLL_UNIPRO2                      OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_CKGEN_INST, 0x00c8)
+#define OMAP54XX_CM_CLKSEL_DPLL_UNIPRO2_OFFSET                 0x00cc
+#define OMAP54XX_CM_CLKSEL_DPLL_UNIPRO2                                OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_CKGEN_INST, 0x00cc)
+#define OMAP54XX_CM_DIV_M2_DPLL_UNIPRO2_OFFSET                 0x00d0
+#define OMAP54XX_CM_DIV_M2_DPLL_UNIPRO2                                OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_CKGEN_INST, 0x00d0)
+#define OMAP54XX_CM_SSC_DELTAMSTEP_DPLL_UNIPRO2_OFFSET         0x00e8
+#define OMAP54XX_CM_SSC_MODFREQDIV_DPLL_UNIPRO2_OFFSET         0x00ec
+#define OMAP54XX_CM_CLKDCOLDO_DPLL_UNIPRO2_OFFSET              0x00f4
+#define OMAP54XX_CM_CLKDCOLDO_DPLL_UNIPRO2                     OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_CKGEN_INST, 0x00f4)
+#define OMAP54XX_CM_CLKMODE_DPLL_UNIPRO1_OFFSET                        0x0100
+#define OMAP54XX_CM_CLKMODE_DPLL_UNIPRO1                       OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_CKGEN_INST, 0x0100)
+#define OMAP54XX_CM_IDLEST_DPLL_UNIPRO1_OFFSET                 0x0104
+#define OMAP54XX_CM_IDLEST_DPLL_UNIPRO1                                OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_CKGEN_INST, 0x0104)
+#define OMAP54XX_CM_AUTOIDLE_DPLL_UNIPRO1_OFFSET               0x0108
+#define OMAP54XX_CM_AUTOIDLE_DPLL_UNIPRO1                      OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_CKGEN_INST, 0x0108)
+#define OMAP54XX_CM_CLKSEL_DPLL_UNIPRO1_OFFSET                 0x010c
+#define OMAP54XX_CM_CLKSEL_DPLL_UNIPRO1                                OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_CKGEN_INST, 0x010c)
+#define OMAP54XX_CM_DIV_M2_DPLL_UNIPRO1_OFFSET                 0x0110
+#define OMAP54XX_CM_DIV_M2_DPLL_UNIPRO1                                OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_CKGEN_INST, 0x0110)
+#define OMAP54XX_CM_SSC_DELTAMSTEP_DPLL_UNIPRO1_OFFSET         0x0128
+#define OMAP54XX_CM_SSC_MODFREQDIV_DPLL_UNIPRO1_OFFSET         0x012c
+#define OMAP54XX_CM_CLKDCOLDO_DPLL_UNIPRO1_OFFSET              0x0134
+#define OMAP54XX_CM_CLKDCOLDO_DPLL_UNIPRO1                     OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_CKGEN_INST, 0x0134)
+
+/* CM_CORE.COREAON_CM_CORE register offsets */
+#define OMAP54XX_CM_COREAON_CLKSTCTRL_OFFSET                   0x0000
+#define OMAP54XX_CM_COREAON_SMARTREFLEX_MPU_CLKCTRL_OFFSET     0x0028
+#define OMAP54XX_CM_COREAON_SMARTREFLEX_MPU_CLKCTRL            OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_COREAON_INST, 0x0028)
+#define OMAP54XX_CM_COREAON_SMARTREFLEX_MM_CLKCTRL_OFFSET      0x0030
+#define OMAP54XX_CM_COREAON_SMARTREFLEX_MM_CLKCTRL             OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_COREAON_INST, 0x0030)
+#define OMAP54XX_CM_COREAON_SMARTREFLEX_CORE_CLKCTRL_OFFSET    0x0038
+#define OMAP54XX_CM_COREAON_SMARTREFLEX_CORE_CLKCTRL           OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_COREAON_INST, 0x0038)
+#define OMAP54XX_CM_COREAON_USB_PHY_CORE_CLKCTRL_OFFSET                0x0040
+#define OMAP54XX_CM_COREAON_USB_PHY_CORE_CLKCTRL               OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_COREAON_INST, 0x0040)
+#define OMAP54XX_CM_COREAON_IO_SRCOMP_CLKCTRL_OFFSET           0x0050
+#define OMAP54XX_CM_COREAON_IO_SRCOMP_CLKCTRL                  OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_COREAON_INST, 0x0050)
+
+/* CM_CORE.CORE_CM_CORE register offsets */
+#define OMAP54XX_CM_L3MAIN1_CLKSTCTRL_OFFSET                   0x0000
+#define OMAP54XX_CM_L3MAIN1_DYNAMICDEP_OFFSET                  0x0008
+#define OMAP54XX_CM_L3MAIN1_L3_MAIN_1_CLKCTRL_OFFSET           0x0020
+#define OMAP54XX_CM_L3MAIN1_L3_MAIN_1_CLKCTRL                  OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_CORE_INST, 0x0020)
+#define OMAP54XX_CM_L3MAIN2_CLKSTCTRL_OFFSET                   0x0100
+#define OMAP54XX_CM_L3MAIN2_DYNAMICDEP_OFFSET                  0x0108
+#define OMAP54XX_CM_L3MAIN2_L3_MAIN_2_CLKCTRL_OFFSET           0x0120
+#define OMAP54XX_CM_L3MAIN2_L3_MAIN_2_CLKCTRL                  OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_CORE_INST, 0x0120)
+#define OMAP54XX_CM_L3MAIN2_GPMC_CLKCTRL_OFFSET                        0x0128
+#define OMAP54XX_CM_L3MAIN2_GPMC_CLKCTRL                       OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_CORE_INST, 0x0128)
+#define OMAP54XX_CM_L3MAIN2_OCMC_RAM_CLKCTRL_OFFSET            0x0130
+#define OMAP54XX_CM_L3MAIN2_OCMC_RAM_CLKCTRL                   OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_CORE_INST, 0x0130)
+#define OMAP54XX_CM_IPU_CLKSTCTRL_OFFSET                       0x0200
+#define OMAP54XX_CM_IPU_STATICDEP_OFFSET                       0x0204
+#define OMAP54XX_CM_IPU_DYNAMICDEP_OFFSET                      0x0208
+#define OMAP54XX_CM_IPU_IPU_CLKCTRL_OFFSET                     0x0220
+#define OMAP54XX_CM_IPU_IPU_CLKCTRL                            OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_CORE_INST, 0x0220)
+#define OMAP54XX_CM_DMA_CLKSTCTRL_OFFSET                       0x0300
+#define OMAP54XX_CM_DMA_STATICDEP_OFFSET                       0x0304
+#define OMAP54XX_CM_DMA_DYNAMICDEP_OFFSET                      0x0308
+#define OMAP54XX_CM_DMA_DMA_SYSTEM_CLKCTRL_OFFSET              0x0320
+#define OMAP54XX_CM_DMA_DMA_SYSTEM_CLKCTRL                     OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_CORE_INST, 0x0320)
+#define OMAP54XX_CM_EMIF_CLKSTCTRL_OFFSET                      0x0400
+#define OMAP54XX_CM_EMIF_DMM_CLKCTRL_OFFSET                    0x0420
+#define OMAP54XX_CM_EMIF_DMM_CLKCTRL                           OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_CORE_INST, 0x0420)
+#define OMAP54XX_CM_EMIF_EMIF_OCP_FW_CLKCTRL_OFFSET            0x0428
+#define OMAP54XX_CM_EMIF_EMIF_OCP_FW_CLKCTRL                   OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_CORE_INST, 0x0428)
+#define OMAP54XX_CM_EMIF_EMIF1_CLKCTRL_OFFSET                  0x0430
+#define OMAP54XX_CM_EMIF_EMIF1_CLKCTRL                         OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_CORE_INST, 0x0430)
+#define OMAP54XX_CM_EMIF_EMIF2_CLKCTRL_OFFSET                  0x0438
+#define OMAP54XX_CM_EMIF_EMIF2_CLKCTRL                         OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_CORE_INST, 0x0438)
+#define OMAP54XX_CM_EMIF_EMIF_DLL_CLKCTRL_OFFSET               0x0440
+#define OMAP54XX_CM_EMIF_EMIF_DLL_CLKCTRL                      OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_CORE_INST, 0x0440)
+#define OMAP54XX_CM_C2C_CLKSTCTRL_OFFSET                       0x0500
+#define OMAP54XX_CM_C2C_STATICDEP_OFFSET                       0x0504
+#define OMAP54XX_CM_C2C_DYNAMICDEP_OFFSET                      0x0508
+#define OMAP54XX_CM_C2C_C2C_CLKCTRL_OFFSET                     0x0520
+#define OMAP54XX_CM_C2C_C2C_CLKCTRL                            OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_CORE_INST, 0x0520)
+#define OMAP54XX_CM_C2C_MODEM_ICR_CLKCTRL_OFFSET               0x0528
+#define OMAP54XX_CM_C2C_MODEM_ICR_CLKCTRL                      OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_CORE_INST, 0x0528)
+#define OMAP54XX_CM_C2C_C2C_OCP_FW_CLKCTRL_OFFSET              0x0530
+#define OMAP54XX_CM_C2C_C2C_OCP_FW_CLKCTRL                     OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_CORE_INST, 0x0530)
+#define OMAP54XX_CM_L4CFG_CLKSTCTRL_OFFSET                     0x0600
+#define OMAP54XX_CM_L4CFG_DYNAMICDEP_OFFSET                    0x0608
+#define OMAP54XX_CM_L4CFG_L4_CFG_CLKCTRL_OFFSET                        0x0620
+#define OMAP54XX_CM_L4CFG_L4_CFG_CLKCTRL                       OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_CORE_INST, 0x0620)
+#define OMAP54XX_CM_L4CFG_SPINLOCK_CLKCTRL_OFFSET              0x0628
+#define OMAP54XX_CM_L4CFG_SPINLOCK_CLKCTRL                     OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_CORE_INST, 0x0628)
+#define OMAP54XX_CM_L4CFG_MAILBOX_CLKCTRL_OFFSET               0x0630
+#define OMAP54XX_CM_L4CFG_MAILBOX_CLKCTRL                      OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_CORE_INST, 0x0630)
+#define OMAP54XX_CM_L4CFG_SAR_ROM_CLKCTRL_OFFSET               0x0638
+#define OMAP54XX_CM_L4CFG_SAR_ROM_CLKCTRL                      OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_CORE_INST, 0x0638)
+#define OMAP54XX_CM_L4CFG_OCP2SCP2_CLKCTRL_OFFSET              0x0640
+#define OMAP54XX_CM_L4CFG_OCP2SCP2_CLKCTRL                     OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_CORE_INST, 0x0640)
+#define OMAP54XX_CM_L3INSTR_CLKSTCTRL_OFFSET                   0x0700
+#define OMAP54XX_CM_L3INSTR_L3_MAIN_3_CLKCTRL_OFFSET           0x0720
+#define OMAP54XX_CM_L3INSTR_L3_MAIN_3_CLKCTRL                  OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_CORE_INST, 0x0720)
+#define OMAP54XX_CM_L3INSTR_L3_INSTR_CLKCTRL_OFFSET            0x0728
+#define OMAP54XX_CM_L3INSTR_L3_INSTR_CLKCTRL                   OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_CORE_INST, 0x0728)
+#define OMAP54XX_CM_L3INSTR_OCP_WP_NOC_CLKCTRL_OFFSET          0x0740
+#define OMAP54XX_CM_L3INSTR_OCP_WP_NOC_CLKCTRL                 OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_CORE_INST, 0x0740)
+#define OMAP54XX_CM_L3INSTR_DLL_AGING_CLKCTRL_OFFSET           0x0748
+#define OMAP54XX_CM_L3INSTR_DLL_AGING_CLKCTRL                  OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_CORE_INST, 0x0748)
+#define OMAP54XX_CM_L3INSTR_CTRL_MODULE_BANDGAP_CLKCTRL_OFFSET 0x0750
+#define OMAP54XX_CM_L3INSTR_CTRL_MODULE_BANDGAP_CLKCTRL                OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_CORE_INST, 0x0750)
+#define OMAP54XX_CM_MIPIEXT_CLKSTCTRL_OFFSET                   0x0800
+#define OMAP54XX_CM_MIPIEXT_STATICDEP_OFFSET                   0x0804
+#define OMAP54XX_CM_MIPIEXT_DYNAMICDEP_OFFSET                  0x0808
+#define OMAP54XX_CM_MIPIEXT_LLI_CLKCTRL_OFFSET                 0x0820
+#define OMAP54XX_CM_MIPIEXT_LLI_CLKCTRL                                OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_CORE_INST, 0x0820)
+#define OMAP54XX_CM_MIPIEXT_LLI_OCP_FW_CLKCTRL_OFFSET          0x0828
+#define OMAP54XX_CM_MIPIEXT_LLI_OCP_FW_CLKCTRL                 OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_CORE_INST, 0x0828)
+#define OMAP54XX_CM_MIPIEXT_MPHY_CLKCTRL_OFFSET                        0x0830
+#define OMAP54XX_CM_MIPIEXT_MPHY_CLKCTRL                       OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_CORE_INST, 0x0830)
+#define OMAP54XX_CM_L4PER_CLKSTCTRL_OFFSET                     0x0900
+#define OMAP54XX_CM_L4PER_DYNAMICDEP_OFFSET                    0x0908
+#define OMAP54XX_CM_L4PER_TIMER10_CLKCTRL_OFFSET               0x0928
+#define OMAP54XX_CM_L4PER_TIMER10_CLKCTRL                      OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_CORE_INST, 0x0928)
+#define OMAP54XX_CM_L4PER_TIMER11_CLKCTRL_OFFSET               0x0930
+#define OMAP54XX_CM_L4PER_TIMER11_CLKCTRL                      OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_CORE_INST, 0x0930)
+#define OMAP54XX_CM_L4PER_TIMER2_CLKCTRL_OFFSET                        0x0938
+#define OMAP54XX_CM_L4PER_TIMER2_CLKCTRL                       OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_CORE_INST, 0x0938)
+#define OMAP54XX_CM_L4PER_TIMER3_CLKCTRL_OFFSET                        0x0940
+#define OMAP54XX_CM_L4PER_TIMER3_CLKCTRL                       OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_CORE_INST, 0x0940)
+#define OMAP54XX_CM_L4PER_TIMER4_CLKCTRL_OFFSET                        0x0948
+#define OMAP54XX_CM_L4PER_TIMER4_CLKCTRL                       OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_CORE_INST, 0x0948)
+#define OMAP54XX_CM_L4PER_TIMER9_CLKCTRL_OFFSET                        0x0950
+#define OMAP54XX_CM_L4PER_TIMER9_CLKCTRL                       OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_CORE_INST, 0x0950)
+#define OMAP54XX_CM_L4PER_ELM_CLKCTRL_OFFSET                   0x0958
+#define OMAP54XX_CM_L4PER_ELM_CLKCTRL                          OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_CORE_INST, 0x0958)
+#define OMAP54XX_CM_L4PER_GPIO2_CLKCTRL_OFFSET                 0x0960
+#define OMAP54XX_CM_L4PER_GPIO2_CLKCTRL                                OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_CORE_INST, 0x0960)
+#define OMAP54XX_CM_L4PER_GPIO3_CLKCTRL_OFFSET                 0x0968
+#define OMAP54XX_CM_L4PER_GPIO3_CLKCTRL                                OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_CORE_INST, 0x0968)
+#define OMAP54XX_CM_L4PER_GPIO4_CLKCTRL_OFFSET                 0x0970
+#define OMAP54XX_CM_L4PER_GPIO4_CLKCTRL                                OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_CORE_INST, 0x0970)
+#define OMAP54XX_CM_L4PER_GPIO5_CLKCTRL_OFFSET                 0x0978
+#define OMAP54XX_CM_L4PER_GPIO5_CLKCTRL                                OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_CORE_INST, 0x0978)
+#define OMAP54XX_CM_L4PER_GPIO6_CLKCTRL_OFFSET                 0x0980
+#define OMAP54XX_CM_L4PER_GPIO6_CLKCTRL                                OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_CORE_INST, 0x0980)
+#define OMAP54XX_CM_L4PER_HDQ1W_CLKCTRL_OFFSET                 0x0988
+#define OMAP54XX_CM_L4PER_HDQ1W_CLKCTRL                                OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_CORE_INST, 0x0988)
+#define OMAP54XX_CM_L4PER_I2C1_CLKCTRL_OFFSET                  0x09a0
+#define OMAP54XX_CM_L4PER_I2C1_CLKCTRL                         OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_CORE_INST, 0x09a0)
+#define OMAP54XX_CM_L4PER_I2C2_CLKCTRL_OFFSET                  0x09a8
+#define OMAP54XX_CM_L4PER_I2C2_CLKCTRL                         OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_CORE_INST, 0x09a8)
+#define OMAP54XX_CM_L4PER_I2C3_CLKCTRL_OFFSET                  0x09b0
+#define OMAP54XX_CM_L4PER_I2C3_CLKCTRL                         OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_CORE_INST, 0x09b0)
+#define OMAP54XX_CM_L4PER_I2C4_CLKCTRL_OFFSET                  0x09b8
+#define OMAP54XX_CM_L4PER_I2C4_CLKCTRL                         OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_CORE_INST, 0x09b8)
+#define OMAP54XX_CM_L4PER_L4_PER_CLKCTRL_OFFSET                        0x09c0
+#define OMAP54XX_CM_L4PER_L4_PER_CLKCTRL                       OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_CORE_INST, 0x09c0)
+#define OMAP54XX_CM_L4PER_MCSPI1_CLKCTRL_OFFSET                        0x09f0
+#define OMAP54XX_CM_L4PER_MCSPI1_CLKCTRL                       OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_CORE_INST, 0x09f0)
+#define OMAP54XX_CM_L4PER_MCSPI2_CLKCTRL_OFFSET                        0x09f8
+#define OMAP54XX_CM_L4PER_MCSPI2_CLKCTRL                       OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_CORE_INST, 0x09f8)
+#define OMAP54XX_CM_L4PER_MCSPI3_CLKCTRL_OFFSET                        0x0a00
+#define OMAP54XX_CM_L4PER_MCSPI3_CLKCTRL                       OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_CORE_INST, 0x0a00)
+#define OMAP54XX_CM_L4PER_MCSPI4_CLKCTRL_OFFSET                        0x0a08
+#define OMAP54XX_CM_L4PER_MCSPI4_CLKCTRL                       OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_CORE_INST, 0x0a08)
+#define OMAP54XX_CM_L4PER_GPIO7_CLKCTRL_OFFSET                 0x0a10
+#define OMAP54XX_CM_L4PER_GPIO7_CLKCTRL                                OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_CORE_INST, 0x0a10)
+#define OMAP54XX_CM_L4PER_GPIO8_CLKCTRL_OFFSET                 0x0a18
+#define OMAP54XX_CM_L4PER_GPIO8_CLKCTRL                                OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_CORE_INST, 0x0a18)
+#define OMAP54XX_CM_L4PER_MMC3_CLKCTRL_OFFSET                  0x0a20
+#define OMAP54XX_CM_L4PER_MMC3_CLKCTRL                         OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_CORE_INST, 0x0a20)
+#define OMAP54XX_CM_L4PER_MMC4_CLKCTRL_OFFSET                  0x0a28
+#define OMAP54XX_CM_L4PER_MMC4_CLKCTRL                         OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_CORE_INST, 0x0a28)
+#define OMAP54XX_CM_L4PER_UART1_CLKCTRL_OFFSET                 0x0a40
+#define OMAP54XX_CM_L4PER_UART1_CLKCTRL                                OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_CORE_INST, 0x0a40)
+#define OMAP54XX_CM_L4PER_UART2_CLKCTRL_OFFSET                 0x0a48
+#define OMAP54XX_CM_L4PER_UART2_CLKCTRL                                OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_CORE_INST, 0x0a48)
+#define OMAP54XX_CM_L4PER_UART3_CLKCTRL_OFFSET                 0x0a50
+#define OMAP54XX_CM_L4PER_UART3_CLKCTRL                                OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_CORE_INST, 0x0a50)
+#define OMAP54XX_CM_L4PER_UART4_CLKCTRL_OFFSET                 0x0a58
+#define OMAP54XX_CM_L4PER_UART4_CLKCTRL                                OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_CORE_INST, 0x0a58)
+#define OMAP54XX_CM_L4PER_MMC5_CLKCTRL_OFFSET                  0x0a60
+#define OMAP54XX_CM_L4PER_MMC5_CLKCTRL                         OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_CORE_INST, 0x0a60)
+#define OMAP54XX_CM_L4PER_I2C5_CLKCTRL_OFFSET                  0x0a68
+#define OMAP54XX_CM_L4PER_I2C5_CLKCTRL                         OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_CORE_INST, 0x0a68)
+#define OMAP54XX_CM_L4PER_UART5_CLKCTRL_OFFSET                 0x0a70
+#define OMAP54XX_CM_L4PER_UART5_CLKCTRL                                OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_CORE_INST, 0x0a70)
+#define OMAP54XX_CM_L4PER_UART6_CLKCTRL_OFFSET                 0x0a78
+#define OMAP54XX_CM_L4PER_UART6_CLKCTRL                                OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_CORE_INST, 0x0a78)
+#define OMAP54XX_CM_L4SEC_CLKSTCTRL_OFFSET                     0x0a80
+#define OMAP54XX_CM_L4SEC_STATICDEP_OFFSET                     0x0a84
+#define OMAP54XX_CM_L4SEC_DYNAMICDEP_OFFSET                    0x0a88
+#define OMAP54XX_CM_L4SEC_AES1_CLKCTRL_OFFSET                  0x0aa0
+#define OMAP54XX_CM_L4SEC_AES1_CLKCTRL                         OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_CORE_INST, 0x0aa0)
+#define OMAP54XX_CM_L4SEC_AES2_CLKCTRL_OFFSET                  0x0aa8
+#define OMAP54XX_CM_L4SEC_AES2_CLKCTRL                         OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_CORE_INST, 0x0aa8)
+#define OMAP54XX_CM_L4SEC_DES3DES_CLKCTRL_OFFSET               0x0ab0
+#define OMAP54XX_CM_L4SEC_DES3DES_CLKCTRL                      OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_CORE_INST, 0x0ab0)
+#define OMAP54XX_CM_L4SEC_FPKA_CLKCTRL_OFFSET                  0x0ab8
+#define OMAP54XX_CM_L4SEC_FPKA_CLKCTRL                         OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_CORE_INST, 0x0ab8)
+#define OMAP54XX_CM_L4SEC_RNG_CLKCTRL_OFFSET                   0x0ac0
+#define OMAP54XX_CM_L4SEC_RNG_CLKCTRL                          OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_CORE_INST, 0x0ac0)
+#define OMAP54XX_CM_L4SEC_SHA2MD5_CLKCTRL_OFFSET               0x0ac8
+#define OMAP54XX_CM_L4SEC_SHA2MD5_CLKCTRL                      OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_CORE_INST, 0x0ac8)
+#define OMAP54XX_CM_L4SEC_DMA_CRYPTO_CLKCTRL_OFFSET            0x0ad8
+#define OMAP54XX_CM_L4SEC_DMA_CRYPTO_CLKCTRL                   OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_CORE_INST, 0x0ad8)
+
+/* CM_CORE.IVA_CM_CORE register offsets */
+#define OMAP54XX_CM_IVA_CLKSTCTRL_OFFSET                       0x0000
+#define OMAP54XX_CM_IVA_STATICDEP_OFFSET                       0x0004
+#define OMAP54XX_CM_IVA_DYNAMICDEP_OFFSET                      0x0008
+#define OMAP54XX_CM_IVA_IVA_CLKCTRL_OFFSET                     0x0020
+#define OMAP54XX_CM_IVA_IVA_CLKCTRL                            OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_IVA_INST, 0x0020)
+#define OMAP54XX_CM_IVA_SL2_CLKCTRL_OFFSET                     0x0028
+#define OMAP54XX_CM_IVA_SL2_CLKCTRL                            OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_IVA_INST, 0x0028)
+
+/* CM_CORE.CAM_CM_CORE register offsets */
+#define OMAP54XX_CM_CAM_CLKSTCTRL_OFFSET                       0x0000
+#define OMAP54XX_CM_CAM_STATICDEP_OFFSET                       0x0004
+#define OMAP54XX_CM_CAM_DYNAMICDEP_OFFSET                      0x0008
+#define OMAP54XX_CM_CAM_ISS_CLKCTRL_OFFSET                     0x0020
+#define OMAP54XX_CM_CAM_ISS_CLKCTRL                            OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_CAM_INST, 0x0020)
+#define OMAP54XX_CM_CAM_FDIF_CLKCTRL_OFFSET                    0x0028
+#define OMAP54XX_CM_CAM_FDIF_CLKCTRL                           OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_CAM_INST, 0x0028)
+#define OMAP54XX_CM_CAM_CAL_CLKCTRL_OFFSET                     0x0030
+#define OMAP54XX_CM_CAM_CAL_CLKCTRL                            OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_CAM_INST, 0x0030)
+
+/* CM_CORE.DSS_CM_CORE register offsets */
+#define OMAP54XX_CM_DSS_CLKSTCTRL_OFFSET                       0x0000
+#define OMAP54XX_CM_DSS_STATICDEP_OFFSET                       0x0004
+#define OMAP54XX_CM_DSS_DYNAMICDEP_OFFSET                      0x0008
+#define OMAP54XX_CM_DSS_DSS_CLKCTRL_OFFSET                     0x0020
+#define OMAP54XX_CM_DSS_DSS_CLKCTRL                            OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_DSS_INST, 0x0020)
+#define OMAP54XX_CM_DSS_BB2D_CLKCTRL_OFFSET                    0x0030
+#define OMAP54XX_CM_DSS_BB2D_CLKCTRL                           OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_DSS_INST, 0x0030)
+
+/* CM_CORE.GPU_CM_CORE register offsets */
+#define OMAP54XX_CM_GPU_CLKSTCTRL_OFFSET                       0x0000
+#define OMAP54XX_CM_GPU_STATICDEP_OFFSET                       0x0004
+#define OMAP54XX_CM_GPU_DYNAMICDEP_OFFSET                      0x0008
+#define OMAP54XX_CM_GPU_GPU_CLKCTRL_OFFSET                     0x0020
+#define OMAP54XX_CM_GPU_GPU_CLKCTRL                            OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_GPU_INST, 0x0020)
+
+/* CM_CORE.L3INIT_CM_CORE register offsets */
+#define OMAP54XX_CM_L3INIT_CLKSTCTRL_OFFSET                    0x0000
+#define OMAP54XX_CM_L3INIT_STATICDEP_OFFSET                    0x0004
+#define OMAP54XX_CM_L3INIT_DYNAMICDEP_OFFSET                   0x0008
+#define OMAP54XX_CM_L3INIT_MMC1_CLKCTRL_OFFSET                 0x0028
+#define OMAP54XX_CM_L3INIT_MMC1_CLKCTRL                                OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_L3INIT_INST, 0x0028)
+#define OMAP54XX_CM_L3INIT_MMC2_CLKCTRL_OFFSET                 0x0030
+#define OMAP54XX_CM_L3INIT_MMC2_CLKCTRL                                OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_L3INIT_INST, 0x0030)
+#define OMAP54XX_CM_L3INIT_HSI_CLKCTRL_OFFSET                  0x0038
+#define OMAP54XX_CM_L3INIT_HSI_CLKCTRL                         OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_L3INIT_INST, 0x0038)
+#define OMAP54XX_CM_L3INIT_UNIPRO2_CLKCTRL_OFFSET              0x0040
+#define OMAP54XX_CM_L3INIT_UNIPRO2_CLKCTRL                     OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_L3INIT_INST, 0x0040)
+#define OMAP54XX_CM_L3INIT_MPHY_UNIPRO2_CLKCTRL_OFFSET         0x0048
+#define OMAP54XX_CM_L3INIT_MPHY_UNIPRO2_CLKCTRL                        OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_L3INIT_INST, 0x0048)
+#define OMAP54XX_CM_L3INIT_USB_HOST_HS_CLKCTRL_OFFSET          0x0058
+#define OMAP54XX_CM_L3INIT_USB_HOST_HS_CLKCTRL                 OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_L3INIT_INST, 0x0058)
+#define OMAP54XX_CM_L3INIT_USB_TLL_HS_CLKCTRL_OFFSET           0x0068
+#define OMAP54XX_CM_L3INIT_USB_TLL_HS_CLKCTRL                  OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_L3INIT_INST, 0x0068)
+#define OMAP54XX_CM_L3INIT_IEEE1500_2_OCP_CLKCTRL_OFFSET       0x0078
+#define OMAP54XX_CM_L3INIT_IEEE1500_2_OCP_CLKCTRL              OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_L3INIT_INST, 0x0078)
+#define OMAP54XX_CM_L3INIT_SATA_CLKCTRL_OFFSET                 0x0088
+#define OMAP54XX_CM_L3INIT_SATA_CLKCTRL                                OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_L3INIT_INST, 0x0088)
+#define OMAP54XX_CM_L3INIT_OCP2SCP1_CLKCTRL_OFFSET             0x00e0
+#define OMAP54XX_CM_L3INIT_OCP2SCP1_CLKCTRL                    OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_L3INIT_INST, 0x00e0)
+#define OMAP54XX_CM_L3INIT_OCP2SCP3_CLKCTRL_OFFSET             0x00e8
+#define OMAP54XX_CM_L3INIT_OCP2SCP3_CLKCTRL                    OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_L3INIT_INST, 0x00e8)
+#define OMAP54XX_CM_L3INIT_USB_OTG_SS_CLKCTRL_OFFSET           0x00f0
+#define OMAP54XX_CM_L3INIT_USB_OTG_SS_CLKCTRL                  OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_L3INIT_INST, 0x00f0)
+
+/* CM_CORE.CUSTEFUSE_CM_CORE register offsets */
+#define OMAP54XX_CM_CUSTEFUSE_CLKSTCTRL_OFFSET                 0x0000
+#define OMAP54XX_CM_CUSTEFUSE_EFUSE_CTRL_CUST_CLKCTRL_OFFSET   0x0020
+#define OMAP54XX_CM_CUSTEFUSE_EFUSE_CTRL_CUST_CLKCTRL          OMAP54XX_CM_CORE_REGADDR(OMAP54XX_CM_CORE_CUSTEFUSE_INST, 0x0020)
+
+#endif
index 64f4bafe7bd9bb25a0054bf27139196ed2ce6256..9d1f4fcdebbb436010fdf834b1003dfb5e347f51 100644 (file)
@@ -383,7 +383,7 @@ extern void am33xx_cm_clkdm_disable_hwsup(s16 inst, u16 cdoffs);
 extern void am33xx_cm_clkdm_force_sleep(s16 inst, u16 cdoffs);
 extern void am33xx_cm_clkdm_force_wakeup(s16 inst, u16 cdoffs);
 
-#ifdef CONFIG_SOC_AM33XX
+#if defined(CONFIG_SOC_AM33XX) || defined(CONFIG_SOC_AM43XX)
 extern int am33xx_cm_wait_module_idle(u16 inst, s16 cdoffs,
                                        u16 clkctrl_offs);
 extern void am33xx_cm_module_enable(u8 mode, u16 inst, s16 cdoffs,
diff --git a/arch/arm/mach-omap2/cm_44xx_54xx.h b/arch/arm/mach-omap2/cm_44xx_54xx.h
new file mode 100644 (file)
index 0000000..cbb2116
--- /dev/null
@@ -0,0 +1,36 @@
+/*
+ * OMAP44xx and OMAP54xx CM1/CM2 function prototypes
+ *
+ * Copyright (C) 2009-2013 Texas Instruments, Inc.
+ * Copyright (C) 2009-2010 Nokia Corporation
+ *
+ * Paul Walmsley (paul@pwsan.com)
+ * Rajendra Nayak (rnayak@ti.com)
+ * Benoit Cousson (b-cousson@ti.com)
+ *
+ * This file is automatically generated from the OMAP hardware databases.
+ * We respectfully ask that any modifications to this file be coordinated
+ * with the public linux-omap@vger.kernel.org mailing list and the
+ * authors above to ensure that the autogeneration scripts are kept
+ * up-to-date with the file contents.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ */
+
+#ifndef __ARCH_ARM_MACH_OMAP2_CM_44XX_54XX_H
+#define __ARCH_ARM_MACH_OMAP2_CM_44XX_55XX_H
+
+/* CM1 Function prototypes */
+extern u32 omap4_cm1_read_inst_reg(s16 inst, u16 idx);
+extern void omap4_cm1_write_inst_reg(u32 val, s16 inst, u16 idx);
+extern u32 omap4_cm1_rmw_inst_reg_bits(u32 mask, u32 bits, s16 inst, s16 idx);
+
+/* CM2 Function prototypes */
+extern u32 omap4_cm2_read_inst_reg(s16 inst, u16 idx);
+extern void omap4_cm2_write_inst_reg(u32 val, s16 inst, u16 idx);
+extern u32 omap4_cm2_rmw_inst_reg_bits(u32 mask, u32 bits, s16 inst, s16 idx);
+
+#endif
index d555cf2459e14184f98d2e07590e476970e4df16..72cab3f4f16d78c70ce13ac41f5e2d868f0ac2c6 100644 (file)
@@ -96,6 +96,7 @@ void am33xx_init_early(void);
 void am35xx_init_early(void);
 void ti81xx_init_early(void);
 void am33xx_init_early(void);
+void am43xx_init_early(void);
 void omap4430_init_early(void);
 void omap5_init_early(void);
 void omap3_init_late(void);    /* Do not use this one */
@@ -237,8 +238,8 @@ extern void omap_do_wfi(void);
 
 #ifdef CONFIG_SMP
 /* Needed for secondary core boot */
-extern void omap_secondary_startup(void);
-extern void omap_secondary_startup_4460(void);
+extern void omap4_secondary_startup(void);
+extern void omap4460_secondary_startup(void);
 extern u32 omap_modify_auxcoreboot0(u32 set_mask, u32 clear_mask);
 extern void omap_auxcoreboot_addr(u32 cpu_addr);
 extern u32 omap_read_auxcoreboot0(void);
index e6c328128a0a3fbf0fc7745c5d3895b9c61c9759..f7d7c2ef1b40f252c72f8ecdd87511168190d273 100644 (file)
 #define AM33XX_CONTROL_STATUS_SYSBOOT1_WIDTH           0x2
 #define AM33XX_CONTROL_STATUS_SYSBOOT1_MASK            (0x3 << 22)
 
+/* AM33XX PWMSS Control register */
+#define AM33XX_PWMSS_TBCLK_CLKCTRL                     0x664
+
+/* AM33XX  PWMSS Control bitfields */
+#define AM33XX_PWMSS0_TBCLKEN_SHIFT                    0
+#define AM33XX_PWMSS1_TBCLKEN_SHIFT                    1
+#define AM33XX_PWMSS2_TBCLKEN_SHIFT                    2
+
+/* DEV Feature register to identify AM33XX features */
+#define AM33XX_DEV_FEATURE             0x604
+#define AM33XX_SGX_MASK                        BIT(29)
+
 /* CONTROL OMAP STATUS register to identify OMAP3 features */
 #define OMAP3_CONTROL_OMAP_STATUS      0x044c
 
index 1272c41d474903c638e60902e66144e6a3692e79..7335eb2bf3fa2b6c2897c41ed87c6b6195c0112d 100644 (file)
@@ -55,7 +55,7 @@ int omap_type(void)
 
        if (cpu_is_omap24xx()) {
                val = omap_ctrl_readl(OMAP24XX_CONTROL_STATUS);
-       } else if (soc_is_am33xx()) {
+       } else if (soc_is_am33xx() || soc_is_am43xx()) {
                val = omap_ctrl_readl(AM33XX_CONTROL_STATUS);
        } else if (cpu_is_omap34xx()) {
                val = omap_ctrl_readl(OMAP343X_CONTROL_STATUS);
@@ -209,6 +209,8 @@ static void __init omap3_cpuinfo(void)
                cpu_name = "TI816X";
        } else if (soc_is_am335x()) {
                cpu_name =  "AM335X";
+       } else if (soc_is_am437x()) {
+               cpu_name =  "AM437x";
        } else if (cpu_is_ti814x()) {
                cpu_name = "TI814X";
        } else if (omap3_has_iva() && omap3_has_sgx()) {
@@ -302,6 +304,19 @@ void __init ti81xx_check_features(void)
        omap3_cpuinfo();
 }
 
+void __init am33xx_check_features(void)
+{
+       u32 status;
+
+       omap_features = OMAP3_HAS_NEON;
+
+       status = omap_ctrl_readl(AM33XX_DEV_FEATURE);
+       if (status & AM33XX_SGX_MASK)
+               omap_features |= OMAP3_HAS_SGX;
+
+       omap3_cpuinfo();
+}
+
 void __init omap3xxx_check_revision(void)
 {
        const char *cpu_rev;
@@ -405,11 +420,18 @@ void __init omap3xxx_check_revision(void)
                        cpu_rev = "1.0";
                        break;
                case 1:
-               /* FALLTHROUGH */
-               default:
                        omap_revision = TI8168_REV_ES1_1;
                        cpu_rev = "1.1";
                        break;
+               case 2:
+                       omap_revision = TI8168_REV_ES2_0;
+                       cpu_rev = "2.0";
+                       break;
+               case 3:
+                       /* FALLTHROUGH */
+               default:
+                       omap_revision = TI8168_REV_ES2_1;
+                       cpu_rev = "2.1";
                }
                break;
        case 0xb944:
@@ -430,6 +452,10 @@ void __init omap3xxx_check_revision(void)
                        break;
                }
                break;
+       case 0xb98c:
+               omap_revision = AM437X_REV_ES1_0;
+               cpu_rev = "1.0";
+               break;
        case 0xb8f2:
                switch (rev) {
                case 0:
index 50b93df458469847ae0b195e4f1388b8ba0af4f0..fe3253a100e740c92688f374557d2470ed6494cb 100644 (file)
@@ -202,7 +202,7 @@ static struct map_desc omapti81xx_io_desc[] __initdata = {
 };
 #endif
 
-#ifdef CONFIG_SOC_AM33XX
+#if defined(CONFIG_SOC_AM33XX) || defined(CONFIG_SOC_AM43XX)
 static struct map_desc omapam33xx_io_desc[] __initdata = {
        {
                .virtual        = L4_34XX_VIRT,
@@ -318,7 +318,7 @@ void __init ti81xx_map_io(void)
 }
 #endif
 
-#ifdef CONFIG_SOC_AM33XX
+#if defined(CONFIG_SOC_AM33XX) || defined(CONFIG_SOC_AM43XX)
 void __init am33xx_map_io(void)
 {
        iotable_init(omapam33xx_io_desc, ARRAY_SIZE(omapam33xx_io_desc));
@@ -576,7 +576,7 @@ void __init am33xx_init_early(void)
        omap2_set_globals_prm(AM33XX_L4_WK_IO_ADDRESS(AM33XX_PRCM_BASE));
        omap2_set_globals_cm(AM33XX_L4_WK_IO_ADDRESS(AM33XX_PRCM_BASE), NULL);
        omap3xxx_check_revision();
-       ti81xx_check_features();
+       am33xx_check_features();
        am33xx_powerdomains_init();
        am33xx_clockdomains_init();
        am33xx_hwmod_init();
@@ -585,6 +585,19 @@ void __init am33xx_init_early(void)
 }
 #endif
 
+#ifdef CONFIG_SOC_AM43XX
+void __init am43xx_init_early(void)
+{
+       omap2_set_globals_tap(AM335X_CLASS,
+                             AM33XX_L4_WK_IO_ADDRESS(AM33XX_TAP_BASE));
+       omap2_set_globals_control(AM33XX_L4_WK_IO_ADDRESS(AM33XX_CTRL_BASE),
+                                 NULL);
+       omap2_set_globals_prm(AM33XX_L4_WK_IO_ADDRESS(AM43XX_PRCM_BASE));
+       omap2_set_globals_cm(AM33XX_L4_WK_IO_ADDRESS(AM43XX_PRCM_BASE), NULL);
+       omap3xxx_check_revision();
+}
+#endif
+
 #ifdef CONFIG_ARCH_OMAP4
 void __init omap4430_init_early(void)
 {
@@ -630,7 +643,13 @@ void __init omap5_init_early(void)
        omap2_set_globals_prcm_mpu(OMAP2_L4_IO_ADDRESS(OMAP54XX_PRCM_MPU_BASE));
        omap_prm_base_init();
        omap_cm_base_init();
+       omap44xx_prm_init();
        omap5xxx_check_revision();
+       omap54xx_voltagedomains_init();
+       omap54xx_powerdomains_init();
+       omap54xx_clockdomains_init();
+       omap54xx_hwmod_init();
+       omap_hwmod_init_postsetup();
 }
 #endif
 
index 0ea09faf327b2faa48d1889d63cc49246ee9eb37..4ea308114165689e1638eca94f1099d436cce803 100644 (file)
@@ -49,7 +49,7 @@ END(omap5_secondary_startup)
  * The primary core will update this flag using a hardware
  * register AuxCoreBoot0.
  */
-ENTRY(omap_secondary_startup)
+ENTRY(omap4_secondary_startup)
 hold:  ldr     r12,=0x103
        dsb
        smc     #0                      @ read from AuxCoreBoot0
@@ -64,9 +64,9 @@ hold: ldr     r12,=0x103
         * should now contain the SVC stack for this core
         */
        b       secondary_startup
-ENDPROC(omap_secondary_startup)
+ENDPROC(omap4_secondary_startup)
 
-ENTRY(omap_secondary_startup_4460)
+ENTRY(omap4460_secondary_startup)
 hold_2:        ldr     r12,=0x103
        dsb
        smc     #0                      @ read from AuxCoreBoot0
@@ -101,4 +101,4 @@ hold_2:     ldr     r12,=0x103
         * should now contain the SVC stack for this core
         */
        b       secondary_startup
-ENDPROC(omap_secondary_startup_4460)
+ENDPROC(omap4460_secondary_startup)
index e80327b6c81f68520206e10058e7e4c18cc496ae..f993a41887010f726e7bee233f3bb80754cc4a47 100644 (file)
@@ -71,10 +71,43 @@ struct omap4_cpu_pm_info {
        void (*secondary_startup)(void);
 };
 
+/**
+ * struct cpu_pm_ops - CPU pm operations
+ * @finish_suspend:    CPU suspend finisher function pointer
+ * @resume:            CPU resume function pointer
+ * @scu_prepare:       CPU Snoop Control program function pointer
+ *
+ * Structure holds functions pointer for CPU low power operations like
+ * suspend, resume and scu programming.
+ */
+struct cpu_pm_ops {
+       int (*finish_suspend)(unsigned long cpu_state);
+       void (*resume)(void);
+       void (*scu_prepare)(unsigned int cpu_id, unsigned int cpu_state);
+};
+
 static DEFINE_PER_CPU(struct omap4_cpu_pm_info, omap4_pm_info);
 static struct powerdomain *mpuss_pd;
 static void __iomem *sar_base;
 
+static int default_finish_suspend(unsigned long cpu_state)
+{
+       omap_do_wfi();
+       return 0;
+}
+
+static void dummy_cpu_resume(void)
+{}
+
+static void dummy_scu_prepare(unsigned int cpu_id, unsigned int cpu_state)
+{}
+
+struct cpu_pm_ops omap_pm_ops = {
+       .finish_suspend         = default_finish_suspend,
+       .resume                 = dummy_cpu_resume,
+       .scu_prepare            = dummy_scu_prepare,
+};
+
 /*
  * Program the wakeup routine address for the CPU0 and CPU1
  * used for OFF or DORMANT wakeup.
@@ -158,11 +191,12 @@ static void save_l2x0_context(void)
 {
        u32 val;
        void __iomem *l2x0_base = omap4_get_l2cache_base();
-
-       val = __raw_readl(l2x0_base + L2X0_AUX_CTRL);
-       __raw_writel(val, sar_base + L2X0_AUXCTRL_OFFSET);
-       val = __raw_readl(l2x0_base + L2X0_PREFETCH_CTRL);
-       __raw_writel(val, sar_base + L2X0_PREFETCH_CTRL_OFFSET);
+       if (l2x0_base) {
+               val = __raw_readl(l2x0_base + L2X0_AUX_CTRL);
+               __raw_writel(val, sar_base + L2X0_AUXCTRL_OFFSET);
+               val = __raw_readl(l2x0_base + L2X0_PREFETCH_CTRL);
+               __raw_writel(val, sar_base + L2X0_PREFETCH_CTRL_OFFSET);
+       }
 }
 #else
 static void save_l2x0_context(void)
@@ -225,14 +259,17 @@ int omap4_enter_lowpower(unsigned int cpu, unsigned int power_state)
 
        cpu_clear_prev_logic_pwrst(cpu);
        pwrdm_set_next_pwrst(pm_info->pwrdm, power_state);
-       set_cpu_wakeup_addr(cpu, virt_to_phys(omap4_cpu_resume));
-       scu_pwrst_prepare(cpu, power_state);
+       set_cpu_wakeup_addr(cpu, virt_to_phys(omap_pm_ops.resume));
+       omap_pm_ops.scu_prepare(cpu, power_state);
        l2x0_pwrst_prepare(cpu, save_state);
 
        /*
         * Call low level function  with targeted low power state.
         */
-       cpu_suspend(save_state, omap4_finish_suspend);
+       if (save_state)
+               cpu_suspend(save_state, omap_pm_ops.finish_suspend);
+       else
+               omap_pm_ops.finish_suspend(save_state);
 
        /*
         * Restore the CPUx power state to ON otherwise CPUx
@@ -268,14 +305,14 @@ int __cpuinit omap4_hotplug_cpu(unsigned int cpu, unsigned int power_state)
        pwrdm_clear_all_prev_pwrst(pm_info->pwrdm);
        pwrdm_set_next_pwrst(pm_info->pwrdm, power_state);
        set_cpu_wakeup_addr(cpu, virt_to_phys(pm_info->secondary_startup));
-       scu_pwrst_prepare(cpu, power_state);
+       omap_pm_ops.scu_prepare(cpu, power_state);
 
        /*
         * CPU never retuns back if targeted power state is OFF mode.
         * CPU ONLINE follows normal CPU ONLINE ptah via
-        * omap_secondary_startup().
+        * omap4_secondary_startup().
         */
-       omap4_finish_suspend(cpu_state);
+       omap_pm_ops.finish_suspend(cpu_state);
 
        pwrdm_set_next_pwrst(pm_info->pwrdm, PWRDM_POWER_ON);
        return 0;
@@ -319,9 +356,9 @@ int __init omap4_mpuss_init(void)
        pm_info->wkup_sar_addr = sar_base + CPU1_WAKEUP_NS_PA_ADDR_OFFSET;
        pm_info->l2x0_sar_addr = sar_base + L2X0_SAVE_OFFSET1;
        if (cpu_is_omap446x())
-               pm_info->secondary_startup = omap_secondary_startup_4460;
+               pm_info->secondary_startup = omap4460_secondary_startup;
        else
-               pm_info->secondary_startup = omap_secondary_startup;
+               pm_info->secondary_startup = omap4_secondary_startup;
 
        pm_info->pwrdm = pwrdm_lookup("cpu1_pwrdm");
        if (!pm_info->pwrdm) {
@@ -352,6 +389,12 @@ int __init omap4_mpuss_init(void)
 
        save_l2x0_context();
 
+       if (cpu_is_omap44xx()) {
+               omap_pm_ops.finish_suspend = omap4_finish_suspend;
+               omap_pm_ops.resume = omap4_cpu_resume;
+               omap_pm_ops.scu_prepare = scu_pwrst_prepare;
+       }
+
        return 0;
 }
 
index 2a551f997aea526a5ac8367271f62e953d4d8609..98a11463a843afdaca3ef99680e0a7c785d5fc33 100644 (file)
@@ -87,7 +87,7 @@ static int __cpuinit omap4_boot_secondary(unsigned int cpu, struct task_struct *
 
        /*
         * Update the AuxCoreBoot0 with boot state for secondary core.
-        * omap_secondary_startup() routine will hold the secondary core till
+        * omap4_secondary_startup() routine will hold the secondary core till
         * the AuxCoreBoot1 register is updated with cpu state
         * A barrier is added to ensure that write buffer is drained
         */
@@ -200,7 +200,7 @@ static void __init omap4_smp_init_cpus(void)
 
 static void __init omap4_smp_prepare_cpus(unsigned int max_cpus)
 {
-       void *startup_addr = omap_secondary_startup;
+       void *startup_addr = omap4_secondary_startup;
        void __iomem *base = omap_get_wakeupgen_base();
 
        /*
@@ -211,7 +211,7 @@ static void __init omap4_smp_prepare_cpus(unsigned int max_cpus)
                scu_enable(scu_base);
 
        if (cpu_is_omap446x()) {
-               startup_addr = omap_secondary_startup_4460;
+               startup_addr = omap4460_secondary_startup;
                pm44xx_errata |= PM_OMAP4_ROM_SMP_BOOT_ERRATUM_GICD;
        }
 
index 13b27ffaf45e481523b092b55c14a4db7382913d..38cd3a69cff3686f45829eb9b58023142acadb02 100644 (file)
@@ -339,19 +339,3 @@ int __init omap4_twl6030_hsmmc_init(struct omap2_hsmmc_info *controllers)
        return 0;
 }
 #endif
-
-/**
- * omap44xx_restart - trigger a software restart of the SoC
- * @mode: the "reboot mode", see arch/arm/kernel/{setup,process}.c
- * @cmd: passed from the userspace program rebooting the system (if provided)
- *
- * Resets the SoC.  For @cmd, see the 'reboot' syscall in
- * kernel/sys.c.  No return value.
- */
-void omap44xx_restart(char mode, const char *cmd)
-{
-       /* XXX Should save 'cmd' into scratchpad for use after reboot */
-       omap4_prminst_global_warm_sw_reset(); /* never returns */
-       while (1);
-}
-
diff --git a/arch/arm/mach-omap2/omap4-restart.c b/arch/arm/mach-omap2/omap4-restart.c
new file mode 100644 (file)
index 0000000..f90e02e
--- /dev/null
@@ -0,0 +1,27 @@
+/*
+ * omap4-restart.c - Common to OMAP4 and OMAP5
+ *
+ *
+ * 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/types.h>
+#include "prminst44xx.h"
+
+/**
+ * omap44xx_restart - trigger a software restart of the SoC
+ * @mode: the "reboot mode", see arch/arm/kernel/{setup,process}.c
+ * @cmd: passed from the userspace program rebooting the system (if provided)
+ *
+ * Resets the SoC.  For @cmd, see the 'reboot' syscall in
+ * kernel/sys.c.  No return value.
+ */
+void omap44xx_restart(char mode, const char *cmd)
+{
+       /* XXX Should save 'cmd' into scratchpad for use after reboot */
+       omap4_prminst_global_warm_sw_reset(); /* never returns */
+       while (1)
+               ;
+}
index 0c898f58ac9bb490e8873a24074e53c1480530a6..aab33fd814c0329e178cbfe265fdf9ff5ffb766c 100644 (file)
@@ -699,6 +699,7 @@ extern int omap2420_hwmod_init(void);
 extern int omap2430_hwmod_init(void);
 extern int omap3xxx_hwmod_init(void);
 extern int omap44xx_hwmod_init(void);
+extern int omap54xx_hwmod_init(void);
 extern int am33xx_hwmod_init(void);
 
 extern int __init omap_hwmod_register_links(struct omap_hwmod_ocp_if **ois);
index 69337af748cc5ddb6c58c11f35b12708f3e432ab..0c9a183131e2a79733c7eb74fde02de1d6ecda2c 100644 (file)
@@ -329,7 +329,7 @@ static struct omap_hwmod_class am33xx_gfx_hwmod_class = {
 };
 
 static struct omap_hwmod_rst_info am33xx_gfx_resets[] = {
-       { .name = "gfx", .rst_shift = 0 },
+       { .name = "gfx", .rst_shift = 0, .st_shift = 0},
 };
 
 static struct omap_hwmod_irq_info am33xx_gfx_irqs[] = {
@@ -347,6 +347,7 @@ static struct omap_hwmod am33xx_gfx_hwmod = {
                .omap4  = {
                        .clkctrl_offs   = AM33XX_CM_GFX_GFX_CLKCTRL_OFFSET,
                        .rstctrl_offs   = AM33XX_RM_GFX_RSTCTRL_OFFSET,
+                       .rstst_offs     = AM33XX_RM_GFX_RSTST_OFFSET,
                        .modulemode     = MODULEMODE_SWCTRL,
                },
        },
diff --git a/arch/arm/mach-omap2/omap_hwmod_54xx_data.c b/arch/arm/mach-omap2/omap_hwmod_54xx_data.c
new file mode 100644 (file)
index 0000000..f37ae96
--- /dev/null
@@ -0,0 +1,2150 @@
+/*
+ * Hardware modules present on the OMAP54xx chips
+ *
+ * Copyright (C) 2013 Texas Instruments Incorporated - http://www.ti.com
+ *
+ * Paul Walmsley
+ * Benoit Cousson
+ *
+ * This file is automatically generated from the OMAP hardware databases.
+ * We respectfully ask that any modifications to this file be coordinated
+ * with the public linux-omap@vger.kernel.org mailing list and the
+ * authors above to ensure that the autogeneration scripts are kept
+ * up-to-date with the file contents.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include <linux/io.h>
+#include <linux/platform_data/gpio-omap.h>
+#include <linux/power/smartreflex.h>
+#include <linux/i2c-omap.h>
+
+#include <linux/omap-dma.h>
+#include <linux/platform_data/spi-omap2-mcspi.h>
+#include <linux/platform_data/asoc-ti-mcbsp.h>
+#include <plat/dmtimer.h>
+
+#include "omap_hwmod.h"
+#include "omap_hwmod_common_data.h"
+#include "cm1_54xx.h"
+#include "cm2_54xx.h"
+#include "prm54xx.h"
+#include "prm-regbits-54xx.h"
+#include "i2c.h"
+#include "mmc.h"
+#include "wd_timer.h"
+
+/* Base offset for all OMAP5 interrupts external to MPUSS */
+#define OMAP54XX_IRQ_GIC_START 32
+
+/* Base offset for all OMAP5 dma requests */
+#define OMAP54XX_DMA_REQ_START 1
+
+
+/*
+ * IP blocks
+ */
+
+/*
+ * 'dmm' class
+ * instance(s): dmm
+ */
+static struct omap_hwmod_class omap54xx_dmm_hwmod_class = {
+       .name   = "dmm",
+};
+
+/* dmm */
+static struct omap_hwmod omap54xx_dmm_hwmod = {
+       .name           = "dmm",
+       .class          = &omap54xx_dmm_hwmod_class,
+       .clkdm_name     = "emif_clkdm",
+       .prcm = {
+               .omap4 = {
+                       .clkctrl_offs = OMAP54XX_CM_EMIF_DMM_CLKCTRL_OFFSET,
+                       .context_offs = OMAP54XX_RM_EMIF_DMM_CONTEXT_OFFSET,
+               },
+       },
+};
+
+/*
+ * 'l3' class
+ * instance(s): l3_instr, l3_main_1, l3_main_2, l3_main_3
+ */
+static struct omap_hwmod_class omap54xx_l3_hwmod_class = {
+       .name   = "l3",
+};
+
+/* l3_instr */
+static struct omap_hwmod omap54xx_l3_instr_hwmod = {
+       .name           = "l3_instr",
+       .class          = &omap54xx_l3_hwmod_class,
+       .clkdm_name     = "l3instr_clkdm",
+       .prcm = {
+               .omap4 = {
+                       .clkctrl_offs = OMAP54XX_CM_L3INSTR_L3_INSTR_CLKCTRL_OFFSET,
+                       .context_offs = OMAP54XX_RM_L3INSTR_L3_INSTR_CONTEXT_OFFSET,
+                       .modulemode   = MODULEMODE_HWCTRL,
+               },
+       },
+};
+
+/* l3_main_1 */
+static struct omap_hwmod omap54xx_l3_main_1_hwmod = {
+       .name           = "l3_main_1",
+       .class          = &omap54xx_l3_hwmod_class,
+       .clkdm_name     = "l3main1_clkdm",
+       .prcm = {
+               .omap4 = {
+                       .clkctrl_offs = OMAP54XX_CM_L3MAIN1_L3_MAIN_1_CLKCTRL_OFFSET,
+                       .context_offs = OMAP54XX_RM_L3MAIN1_L3_MAIN_1_CONTEXT_OFFSET,
+               },
+       },
+};
+
+/* l3_main_2 */
+static struct omap_hwmod omap54xx_l3_main_2_hwmod = {
+       .name           = "l3_main_2",
+       .class          = &omap54xx_l3_hwmod_class,
+       .clkdm_name     = "l3main2_clkdm",
+       .prcm = {
+               .omap4 = {
+                       .clkctrl_offs = OMAP54XX_CM_L3MAIN2_L3_MAIN_2_CLKCTRL_OFFSET,
+                       .context_offs = OMAP54XX_RM_L3MAIN2_L3_MAIN_2_CONTEXT_OFFSET,
+               },
+       },
+};
+
+/* l3_main_3 */
+static struct omap_hwmod omap54xx_l3_main_3_hwmod = {
+       .name           = "l3_main_3",
+       .class          = &omap54xx_l3_hwmod_class,
+       .clkdm_name     = "l3instr_clkdm",
+       .prcm = {
+               .omap4 = {
+                       .clkctrl_offs = OMAP54XX_CM_L3INSTR_L3_MAIN_3_CLKCTRL_OFFSET,
+                       .context_offs = OMAP54XX_RM_L3INSTR_L3_MAIN_3_CONTEXT_OFFSET,
+                       .modulemode   = MODULEMODE_HWCTRL,
+               },
+       },
+};
+
+/*
+ * 'l4' class
+ * instance(s): l4_abe, l4_cfg, l4_per, l4_wkup
+ */
+static struct omap_hwmod_class omap54xx_l4_hwmod_class = {
+       .name   = "l4",
+};
+
+/* l4_abe */
+static struct omap_hwmod omap54xx_l4_abe_hwmod = {
+       .name           = "l4_abe",
+       .class          = &omap54xx_l4_hwmod_class,
+       .clkdm_name     = "abe_clkdm",
+       .prcm = {
+               .omap4 = {
+                       .clkctrl_offs = OMAP54XX_CM_ABE_L4_ABE_CLKCTRL_OFFSET,
+                       .flags = HWMOD_OMAP4_NO_CONTEXT_LOSS_BIT,
+               },
+       },
+};
+
+/* l4_cfg */
+static struct omap_hwmod omap54xx_l4_cfg_hwmod = {
+       .name           = "l4_cfg",
+       .class          = &omap54xx_l4_hwmod_class,
+       .clkdm_name     = "l4cfg_clkdm",
+       .prcm = {
+               .omap4 = {
+                       .clkctrl_offs = OMAP54XX_CM_L4CFG_L4_CFG_CLKCTRL_OFFSET,
+                       .context_offs = OMAP54XX_RM_L4CFG_L4_CFG_CONTEXT_OFFSET,
+               },
+       },
+};
+
+/* l4_per */
+static struct omap_hwmod omap54xx_l4_per_hwmod = {
+       .name           = "l4_per",
+       .class          = &omap54xx_l4_hwmod_class,
+       .clkdm_name     = "l4per_clkdm",
+       .prcm = {
+               .omap4 = {
+                       .clkctrl_offs = OMAP54XX_CM_L4PER_L4_PER_CLKCTRL_OFFSET,
+                       .context_offs = OMAP54XX_RM_L4PER_L4_PER_CONTEXT_OFFSET,
+               },
+       },
+};
+
+/* l4_wkup */
+static struct omap_hwmod omap54xx_l4_wkup_hwmod = {
+       .name           = "l4_wkup",
+       .class          = &omap54xx_l4_hwmod_class,
+       .clkdm_name     = "wkupaon_clkdm",
+       .prcm = {
+               .omap4 = {
+                       .clkctrl_offs = OMAP54XX_CM_WKUPAON_L4_WKUP_CLKCTRL_OFFSET,
+                       .context_offs = OMAP54XX_RM_WKUPAON_L4_WKUP_CONTEXT_OFFSET,
+               },
+       },
+};
+
+/*
+ * 'mpu_bus' class
+ * instance(s): mpu_private
+ */
+static struct omap_hwmod_class omap54xx_mpu_bus_hwmod_class = {
+       .name   = "mpu_bus",
+};
+
+/* mpu_private */
+static struct omap_hwmod omap54xx_mpu_private_hwmod = {
+       .name           = "mpu_private",
+       .class          = &omap54xx_mpu_bus_hwmod_class,
+       .clkdm_name     = "mpu_clkdm",
+       .prcm = {
+               .omap4 = {
+                       .flags = HWMOD_OMAP4_NO_CONTEXT_LOSS_BIT,
+               },
+       },
+};
+
+/*
+ * 'counter' class
+ * 32-bit ordinary counter, clocked by the falling edge of the 32 khz clock
+ */
+
+static struct omap_hwmod_class_sysconfig omap54xx_counter_sysc = {
+       .rev_offs       = 0x0000,
+       .sysc_offs      = 0x0010,
+       .sysc_flags     = SYSC_HAS_SIDLEMODE,
+       .idlemodes      = (SIDLE_FORCE | SIDLE_NO),
+       .sysc_fields    = &omap_hwmod_sysc_type1,
+};
+
+static struct omap_hwmod_class omap54xx_counter_hwmod_class = {
+       .name   = "counter",
+       .sysc   = &omap54xx_counter_sysc,
+};
+
+/* counter_32k */
+static struct omap_hwmod omap54xx_counter_32k_hwmod = {
+       .name           = "counter_32k",
+       .class          = &omap54xx_counter_hwmod_class,
+       .clkdm_name     = "wkupaon_clkdm",
+       .flags          = HWMOD_SWSUP_SIDLE,
+       .main_clk       = "wkupaon_iclk_mux",
+       .prcm = {
+               .omap4 = {
+                       .clkctrl_offs = OMAP54XX_CM_WKUPAON_COUNTER_32K_CLKCTRL_OFFSET,
+                       .context_offs = OMAP54XX_RM_WKUPAON_COUNTER_32K_CONTEXT_OFFSET,
+               },
+       },
+};
+
+/*
+ * 'dma' class
+ * dma controller for data exchange between memory to memory (i.e. internal or
+ * external memory) and gp peripherals to memory or memory to gp peripherals
+ */
+
+static struct omap_hwmod_class_sysconfig omap54xx_dma_sysc = {
+       .rev_offs       = 0x0000,
+       .sysc_offs      = 0x002c,
+       .syss_offs      = 0x0028,
+       .sysc_flags     = (SYSC_HAS_AUTOIDLE | SYSC_HAS_CLOCKACTIVITY |
+                          SYSC_HAS_EMUFREE | SYSC_HAS_MIDLEMODE |
+                          SYSC_HAS_SIDLEMODE | SYSC_HAS_SOFTRESET |
+                          SYSS_HAS_RESET_STATUS),
+       .idlemodes      = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART |
+                          MSTANDBY_FORCE | MSTANDBY_NO | MSTANDBY_SMART),
+       .sysc_fields    = &omap_hwmod_sysc_type1,
+};
+
+static struct omap_hwmod_class omap54xx_dma_hwmod_class = {
+       .name   = "dma",
+       .sysc   = &omap54xx_dma_sysc,
+};
+
+/* dma dev_attr */
+static struct omap_dma_dev_attr dma_dev_attr = {
+       .dev_caps       = RESERVE_CHANNEL | DMA_LINKED_LCH | GLOBAL_PRIORITY |
+                         IS_CSSA_32 | IS_CDSA_32 | IS_RW_PRIORITY,
+       .lch_count      = 32,
+};
+
+/* dma_system */
+static struct omap_hwmod_irq_info omap54xx_dma_system_irqs[] = {
+       { .name = "0", .irq = 12 + OMAP54XX_IRQ_GIC_START },
+       { .name = "1", .irq = 13 + OMAP54XX_IRQ_GIC_START },
+       { .name = "2", .irq = 14 + OMAP54XX_IRQ_GIC_START },
+       { .name = "3", .irq = 15 + OMAP54XX_IRQ_GIC_START },
+       { .irq = -1 }
+};
+
+static struct omap_hwmod omap54xx_dma_system_hwmod = {
+       .name           = "dma_system",
+       .class          = &omap54xx_dma_hwmod_class,
+       .clkdm_name     = "dma_clkdm",
+       .mpu_irqs       = omap54xx_dma_system_irqs,
+       .main_clk       = "l3_iclk_div",
+       .prcm = {
+               .omap4 = {
+                       .clkctrl_offs = OMAP54XX_CM_DMA_DMA_SYSTEM_CLKCTRL_OFFSET,
+                       .context_offs = OMAP54XX_RM_DMA_DMA_SYSTEM_CONTEXT_OFFSET,
+               },
+       },
+       .dev_attr       = &dma_dev_attr,
+};
+
+/*
+ * 'dmic' class
+ * digital microphone controller
+ */
+
+static struct omap_hwmod_class_sysconfig omap54xx_dmic_sysc = {
+       .rev_offs       = 0x0000,
+       .sysc_offs      = 0x0010,
+       .sysc_flags     = (SYSC_HAS_EMUFREE | SYSC_HAS_RESET_STATUS |
+                          SYSC_HAS_SIDLEMODE | SYSC_HAS_SOFTRESET),
+       .idlemodes      = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART |
+                          SIDLE_SMART_WKUP),
+       .sysc_fields    = &omap_hwmod_sysc_type2,
+};
+
+static struct omap_hwmod_class omap54xx_dmic_hwmod_class = {
+       .name   = "dmic",
+       .sysc   = &omap54xx_dmic_sysc,
+};
+
+/* dmic */
+static struct omap_hwmod omap54xx_dmic_hwmod = {
+       .name           = "dmic",
+       .class          = &omap54xx_dmic_hwmod_class,
+       .clkdm_name     = "abe_clkdm",
+       .main_clk       = "dmic_gfclk",
+       .prcm = {
+               .omap4 = {
+                       .clkctrl_offs = OMAP54XX_CM_ABE_DMIC_CLKCTRL_OFFSET,
+                       .context_offs = OMAP54XX_RM_ABE_DMIC_CONTEXT_OFFSET,
+                       .modulemode   = MODULEMODE_SWCTRL,
+               },
+       },
+};
+
+/*
+ * 'emif' class
+ * external memory interface no1 (wrapper)
+ */
+
+static struct omap_hwmod_class_sysconfig omap54xx_emif_sysc = {
+       .rev_offs       = 0x0000,
+};
+
+static struct omap_hwmod_class omap54xx_emif_hwmod_class = {
+       .name   = "emif",
+       .sysc   = &omap54xx_emif_sysc,
+};
+
+/* emif1 */
+static struct omap_hwmod omap54xx_emif1_hwmod = {
+       .name           = "emif1",
+       .class          = &omap54xx_emif_hwmod_class,
+       .clkdm_name     = "emif_clkdm",
+       .flags          = HWMOD_INIT_NO_IDLE | HWMOD_INIT_NO_RESET,
+       .main_clk       = "dpll_core_h11x2_ck",
+       .prcm = {
+               .omap4 = {
+                       .clkctrl_offs = OMAP54XX_CM_EMIF_EMIF1_CLKCTRL_OFFSET,
+                       .context_offs = OMAP54XX_RM_EMIF_EMIF1_CONTEXT_OFFSET,
+                       .modulemode   = MODULEMODE_HWCTRL,
+               },
+       },
+};
+
+/* emif2 */
+static struct omap_hwmod omap54xx_emif2_hwmod = {
+       .name           = "emif2",
+       .class          = &omap54xx_emif_hwmod_class,
+       .clkdm_name     = "emif_clkdm",
+       .flags          = HWMOD_INIT_NO_IDLE | HWMOD_INIT_NO_RESET,
+       .main_clk       = "dpll_core_h11x2_ck",
+       .prcm = {
+               .omap4 = {
+                       .clkctrl_offs = OMAP54XX_CM_EMIF_EMIF2_CLKCTRL_OFFSET,
+                       .context_offs = OMAP54XX_RM_EMIF_EMIF2_CONTEXT_OFFSET,
+                       .modulemode   = MODULEMODE_HWCTRL,
+               },
+       },
+};
+
+/*
+ * 'gpio' class
+ * general purpose io module
+ */
+
+static struct omap_hwmod_class_sysconfig omap54xx_gpio_sysc = {
+       .rev_offs       = 0x0000,
+       .sysc_offs      = 0x0010,
+       .syss_offs      = 0x0114,
+       .sysc_flags     = (SYSC_HAS_AUTOIDLE | SYSC_HAS_ENAWAKEUP |
+                          SYSC_HAS_SIDLEMODE | SYSC_HAS_SOFTRESET |
+                          SYSS_HAS_RESET_STATUS),
+       .idlemodes      = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART |
+                          SIDLE_SMART_WKUP),
+       .sysc_fields    = &omap_hwmod_sysc_type1,
+};
+
+static struct omap_hwmod_class omap54xx_gpio_hwmod_class = {
+       .name   = "gpio",
+       .sysc   = &omap54xx_gpio_sysc,
+       .rev    = 2,
+};
+
+/* gpio dev_attr */
+static struct omap_gpio_dev_attr gpio_dev_attr = {
+       .bank_width     = 32,
+       .dbck_flag      = true,
+};
+
+/* gpio1 */
+static struct omap_hwmod_opt_clk gpio1_opt_clks[] = {
+       { .role = "dbclk", .clk = "gpio1_dbclk" },
+};
+
+static struct omap_hwmod omap54xx_gpio1_hwmod = {
+       .name           = "gpio1",
+       .class          = &omap54xx_gpio_hwmod_class,
+       .clkdm_name     = "wkupaon_clkdm",
+       .main_clk       = "wkupaon_iclk_mux",
+       .prcm = {
+               .omap4 = {
+                       .clkctrl_offs = OMAP54XX_CM_WKUPAON_GPIO1_CLKCTRL_OFFSET,
+                       .context_offs = OMAP54XX_RM_WKUPAON_GPIO1_CONTEXT_OFFSET,
+                       .modulemode   = MODULEMODE_HWCTRL,
+               },
+       },
+       .opt_clks       = gpio1_opt_clks,
+       .opt_clks_cnt   = ARRAY_SIZE(gpio1_opt_clks),
+       .dev_attr       = &gpio_dev_attr,
+};
+
+/* gpio2 */
+static struct omap_hwmod_opt_clk gpio2_opt_clks[] = {
+       { .role = "dbclk", .clk = "gpio2_dbclk" },
+};
+
+static struct omap_hwmod omap54xx_gpio2_hwmod = {
+       .name           = "gpio2",
+       .class          = &omap54xx_gpio_hwmod_class,
+       .clkdm_name     = "l4per_clkdm",
+       .flags          = HWMOD_CONTROL_OPT_CLKS_IN_RESET,
+       .main_clk       = "l4_root_clk_div",
+       .prcm = {
+               .omap4 = {
+                       .clkctrl_offs = OMAP54XX_CM_L4PER_GPIO2_CLKCTRL_OFFSET,
+                       .context_offs = OMAP54XX_RM_L4PER_GPIO2_CONTEXT_OFFSET,
+                       .modulemode   = MODULEMODE_HWCTRL,
+               },
+       },
+       .opt_clks       = gpio2_opt_clks,
+       .opt_clks_cnt   = ARRAY_SIZE(gpio2_opt_clks),
+       .dev_attr       = &gpio_dev_attr,
+};
+
+/* gpio3 */
+static struct omap_hwmod_opt_clk gpio3_opt_clks[] = {
+       { .role = "dbclk", .clk = "gpio3_dbclk" },
+};
+
+static struct omap_hwmod omap54xx_gpio3_hwmod = {
+       .name           = "gpio3",
+       .class          = &omap54xx_gpio_hwmod_class,
+       .clkdm_name     = "l4per_clkdm",
+       .flags          = HWMOD_CONTROL_OPT_CLKS_IN_RESET,
+       .main_clk       = "l4_root_clk_div",
+       .prcm = {
+               .omap4 = {
+                       .clkctrl_offs = OMAP54XX_CM_L4PER_GPIO3_CLKCTRL_OFFSET,
+                       .context_offs = OMAP54XX_RM_L4PER_GPIO3_CONTEXT_OFFSET,
+                       .modulemode   = MODULEMODE_HWCTRL,
+               },
+       },
+       .opt_clks       = gpio3_opt_clks,
+       .opt_clks_cnt   = ARRAY_SIZE(gpio3_opt_clks),
+       .dev_attr       = &gpio_dev_attr,
+};
+
+/* gpio4 */
+static struct omap_hwmod_opt_clk gpio4_opt_clks[] = {
+       { .role = "dbclk", .clk = "gpio4_dbclk" },
+};
+
+static struct omap_hwmod omap54xx_gpio4_hwmod = {
+       .name           = "gpio4",
+       .class          = &omap54xx_gpio_hwmod_class,
+       .clkdm_name     = "l4per_clkdm",
+       .flags          = HWMOD_CONTROL_OPT_CLKS_IN_RESET,
+       .main_clk       = "l4_root_clk_div",
+       .prcm = {
+               .omap4 = {
+                       .clkctrl_offs = OMAP54XX_CM_L4PER_GPIO4_CLKCTRL_OFFSET,
+                       .context_offs = OMAP54XX_RM_L4PER_GPIO4_CONTEXT_OFFSET,
+                       .modulemode   = MODULEMODE_HWCTRL,
+               },
+       },
+       .opt_clks       = gpio4_opt_clks,
+       .opt_clks_cnt   = ARRAY_SIZE(gpio4_opt_clks),
+       .dev_attr       = &gpio_dev_attr,
+};
+
+/* gpio5 */
+static struct omap_hwmod_opt_clk gpio5_opt_clks[] = {
+       { .role = "dbclk", .clk = "gpio5_dbclk" },
+};
+
+static struct omap_hwmod omap54xx_gpio5_hwmod = {
+       .name           = "gpio5",
+       .class          = &omap54xx_gpio_hwmod_class,
+       .clkdm_name     = "l4per_clkdm",
+       .flags          = HWMOD_CONTROL_OPT_CLKS_IN_RESET,
+       .main_clk       = "l4_root_clk_div",
+       .prcm = {
+               .omap4 = {
+                       .clkctrl_offs = OMAP54XX_CM_L4PER_GPIO5_CLKCTRL_OFFSET,
+                       .context_offs = OMAP54XX_RM_L4PER_GPIO5_CONTEXT_OFFSET,
+                       .modulemode   = MODULEMODE_HWCTRL,
+               },
+       },
+       .opt_clks       = gpio5_opt_clks,
+       .opt_clks_cnt   = ARRAY_SIZE(gpio5_opt_clks),
+       .dev_attr       = &gpio_dev_attr,
+};
+
+/* gpio6 */
+static struct omap_hwmod_opt_clk gpio6_opt_clks[] = {
+       { .role = "dbclk", .clk = "gpio6_dbclk" },
+};
+
+static struct omap_hwmod omap54xx_gpio6_hwmod = {
+       .name           = "gpio6",
+       .class          = &omap54xx_gpio_hwmod_class,
+       .clkdm_name     = "l4per_clkdm",
+       .flags          = HWMOD_CONTROL_OPT_CLKS_IN_RESET,
+       .main_clk       = "l4_root_clk_div",
+       .prcm = {
+               .omap4 = {
+                       .clkctrl_offs = OMAP54XX_CM_L4PER_GPIO6_CLKCTRL_OFFSET,
+                       .context_offs = OMAP54XX_RM_L4PER_GPIO6_CONTEXT_OFFSET,
+                       .modulemode   = MODULEMODE_HWCTRL,
+               },
+       },
+       .opt_clks       = gpio6_opt_clks,
+       .opt_clks_cnt   = ARRAY_SIZE(gpio6_opt_clks),
+       .dev_attr       = &gpio_dev_attr,
+};
+
+/* gpio7 */
+static struct omap_hwmod_opt_clk gpio7_opt_clks[] = {
+       { .role = "dbclk", .clk = "gpio7_dbclk" },
+};
+
+static struct omap_hwmod omap54xx_gpio7_hwmod = {
+       .name           = "gpio7",
+       .class          = &omap54xx_gpio_hwmod_class,
+       .clkdm_name     = "l4per_clkdm",
+       .flags          = HWMOD_CONTROL_OPT_CLKS_IN_RESET,
+       .main_clk       = "l4_root_clk_div",
+       .prcm = {
+               .omap4 = {
+                       .clkctrl_offs = OMAP54XX_CM_L4PER_GPIO7_CLKCTRL_OFFSET,
+                       .context_offs = OMAP54XX_RM_L4PER_GPIO7_CONTEXT_OFFSET,
+                       .modulemode   = MODULEMODE_HWCTRL,
+               },
+       },
+       .opt_clks       = gpio7_opt_clks,
+       .opt_clks_cnt   = ARRAY_SIZE(gpio7_opt_clks),
+       .dev_attr       = &gpio_dev_attr,
+};
+
+/* gpio8 */
+static struct omap_hwmod_opt_clk gpio8_opt_clks[] = {
+       { .role = "dbclk", .clk = "gpio8_dbclk" },
+};
+
+static struct omap_hwmod omap54xx_gpio8_hwmod = {
+       .name           = "gpio8",
+       .class          = &omap54xx_gpio_hwmod_class,
+       .clkdm_name     = "l4per_clkdm",
+       .flags          = HWMOD_CONTROL_OPT_CLKS_IN_RESET,
+       .main_clk       = "l4_root_clk_div",
+       .prcm = {
+               .omap4 = {
+                       .clkctrl_offs = OMAP54XX_CM_L4PER_GPIO8_CLKCTRL_OFFSET,
+                       .context_offs = OMAP54XX_RM_L4PER_GPIO8_CONTEXT_OFFSET,
+                       .modulemode   = MODULEMODE_HWCTRL,
+               },
+       },
+       .opt_clks       = gpio8_opt_clks,
+       .opt_clks_cnt   = ARRAY_SIZE(gpio8_opt_clks),
+       .dev_attr       = &gpio_dev_attr,
+};
+
+/*
+ * 'i2c' class
+ * multimaster high-speed i2c controller
+ */
+
+static struct omap_hwmod_class_sysconfig omap54xx_i2c_sysc = {
+       .sysc_offs      = 0x0010,
+       .syss_offs      = 0x0090,
+       .sysc_flags     = (SYSC_HAS_AUTOIDLE | SYSC_HAS_CLOCKACTIVITY |
+                          SYSC_HAS_ENAWAKEUP | SYSC_HAS_SIDLEMODE |
+                          SYSC_HAS_SOFTRESET | SYSS_HAS_RESET_STATUS),
+       .idlemodes      = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART |
+                          SIDLE_SMART_WKUP),
+       .clockact       = CLOCKACT_TEST_ICLK,
+       .sysc_fields    = &omap_hwmod_sysc_type1,
+};
+
+static struct omap_hwmod_class omap54xx_i2c_hwmod_class = {
+       .name   = "i2c",
+       .sysc   = &omap54xx_i2c_sysc,
+       .reset  = &omap_i2c_reset,
+       .rev    = OMAP_I2C_IP_VERSION_2,
+};
+
+/* i2c dev_attr */
+static struct omap_i2c_dev_attr i2c_dev_attr = {
+       .flags  = OMAP_I2C_FLAG_BUS_SHIFT_NONE,
+};
+
+/* i2c1 */
+static struct omap_hwmod omap54xx_i2c1_hwmod = {
+       .name           = "i2c1",
+       .class          = &omap54xx_i2c_hwmod_class,
+       .clkdm_name     = "l4per_clkdm",
+       .flags          = HWMOD_16BIT_REG | HWMOD_SET_DEFAULT_CLOCKACT,
+       .main_clk       = "func_96m_fclk",
+       .prcm = {
+               .omap4 = {
+                       .clkctrl_offs = OMAP54XX_CM_L4PER_I2C1_CLKCTRL_OFFSET,
+                       .context_offs = OMAP54XX_RM_L4PER_I2C1_CONTEXT_OFFSET,
+                       .modulemode   = MODULEMODE_SWCTRL,
+               },
+       },
+       .dev_attr       = &i2c_dev_attr,
+};
+
+/* i2c2 */
+static struct omap_hwmod omap54xx_i2c2_hwmod = {
+       .name           = "i2c2",
+       .class          = &omap54xx_i2c_hwmod_class,
+       .clkdm_name     = "l4per_clkdm",
+       .flags          = HWMOD_16BIT_REG | HWMOD_SET_DEFAULT_CLOCKACT,
+       .main_clk       = "func_96m_fclk",
+       .prcm = {
+               .omap4 = {
+                       .clkctrl_offs = OMAP54XX_CM_L4PER_I2C2_CLKCTRL_OFFSET,
+                       .context_offs = OMAP54XX_RM_L4PER_I2C2_CONTEXT_OFFSET,
+                       .modulemode   = MODULEMODE_SWCTRL,
+               },
+       },
+       .dev_attr       = &i2c_dev_attr,
+};
+
+/* i2c3 */
+static struct omap_hwmod omap54xx_i2c3_hwmod = {
+       .name           = "i2c3",
+       .class          = &omap54xx_i2c_hwmod_class,
+       .clkdm_name     = "l4per_clkdm",
+       .flags          = HWMOD_16BIT_REG | HWMOD_SET_DEFAULT_CLOCKACT,
+       .main_clk       = "func_96m_fclk",
+       .prcm = {
+               .omap4 = {
+                       .clkctrl_offs = OMAP54XX_CM_L4PER_I2C3_CLKCTRL_OFFSET,
+                       .context_offs = OMAP54XX_RM_L4PER_I2C3_CONTEXT_OFFSET,
+                       .modulemode   = MODULEMODE_SWCTRL,
+               },
+       },
+       .dev_attr       = &i2c_dev_attr,
+};
+
+/* i2c4 */
+static struct omap_hwmod omap54xx_i2c4_hwmod = {
+       .name           = "i2c4",
+       .class          = &omap54xx_i2c_hwmod_class,
+       .clkdm_name     = "l4per_clkdm",
+       .flags          = HWMOD_16BIT_REG | HWMOD_SET_DEFAULT_CLOCKACT,
+       .main_clk       = "func_96m_fclk",
+       .prcm = {
+               .omap4 = {
+                       .clkctrl_offs = OMAP54XX_CM_L4PER_I2C4_CLKCTRL_OFFSET,
+                       .context_offs = OMAP54XX_RM_L4PER_I2C4_CONTEXT_OFFSET,
+                       .modulemode   = MODULEMODE_SWCTRL,
+               },
+       },
+       .dev_attr       = &i2c_dev_attr,
+};
+
+/* i2c5 */
+static struct omap_hwmod omap54xx_i2c5_hwmod = {
+       .name           = "i2c5",
+       .class          = &omap54xx_i2c_hwmod_class,
+       .clkdm_name     = "l4per_clkdm",
+       .flags          = HWMOD_16BIT_REG | HWMOD_SET_DEFAULT_CLOCKACT,
+       .main_clk       = "func_96m_fclk",
+       .prcm = {
+               .omap4 = {
+                       .clkctrl_offs = OMAP54XX_CM_L4PER_I2C5_CLKCTRL_OFFSET,
+                       .context_offs = OMAP54XX_RM_L4PER_I2C5_CONTEXT_OFFSET,
+                       .modulemode   = MODULEMODE_SWCTRL,
+               },
+       },
+       .dev_attr       = &i2c_dev_attr,
+};
+
+/*
+ * 'kbd' class
+ * keyboard controller
+ */
+
+static struct omap_hwmod_class_sysconfig omap54xx_kbd_sysc = {
+       .rev_offs       = 0x0000,
+       .sysc_offs      = 0x0010,
+       .sysc_flags     = (SYSC_HAS_EMUFREE | SYSC_HAS_SIDLEMODE |
+                          SYSC_HAS_SOFTRESET),
+       .idlemodes      = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART),
+       .sysc_fields    = &omap_hwmod_sysc_type1,
+};
+
+static struct omap_hwmod_class omap54xx_kbd_hwmod_class = {
+       .name   = "kbd",
+       .sysc   = &omap54xx_kbd_sysc,
+};
+
+/* kbd */
+static struct omap_hwmod omap54xx_kbd_hwmod = {
+       .name           = "kbd",
+       .class          = &omap54xx_kbd_hwmod_class,
+       .clkdm_name     = "wkupaon_clkdm",
+       .main_clk       = "sys_32k_ck",
+       .prcm = {
+               .omap4 = {
+                       .clkctrl_offs = OMAP54XX_CM_WKUPAON_KBD_CLKCTRL_OFFSET,
+                       .context_offs = OMAP54XX_RM_WKUPAON_KBD_CONTEXT_OFFSET,
+                       .modulemode   = MODULEMODE_SWCTRL,
+               },
+       },
+};
+
+/*
+ * 'mcbsp' class
+ * multi channel buffered serial port controller
+ */
+
+static struct omap_hwmod_class_sysconfig omap54xx_mcbsp_sysc = {
+       .sysc_offs      = 0x008c,
+       .sysc_flags     = (SYSC_HAS_CLOCKACTIVITY | SYSC_HAS_ENAWAKEUP |
+                          SYSC_HAS_SIDLEMODE | SYSC_HAS_SOFTRESET),
+       .idlemodes      = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART),
+       .sysc_fields    = &omap_hwmod_sysc_type1,
+};
+
+static struct omap_hwmod_class omap54xx_mcbsp_hwmod_class = {
+       .name   = "mcbsp",
+       .sysc   = &omap54xx_mcbsp_sysc,
+       .rev    = MCBSP_CONFIG_TYPE4,
+};
+
+/* mcbsp1 */
+static struct omap_hwmod_opt_clk mcbsp1_opt_clks[] = {
+       { .role = "pad_fck", .clk = "pad_clks_ck" },
+       { .role = "prcm_fck", .clk = "mcbsp1_sync_mux_ck" },
+};
+
+static struct omap_hwmod omap54xx_mcbsp1_hwmod = {
+       .name           = "mcbsp1",
+       .class          = &omap54xx_mcbsp_hwmod_class,
+       .clkdm_name     = "abe_clkdm",
+       .main_clk       = "mcbsp1_gfclk",
+       .prcm = {
+               .omap4 = {
+                       .clkctrl_offs = OMAP54XX_CM_ABE_MCBSP1_CLKCTRL_OFFSET,
+                       .context_offs = OMAP54XX_RM_ABE_MCBSP1_CONTEXT_OFFSET,
+                       .modulemode   = MODULEMODE_SWCTRL,
+               },
+       },
+       .opt_clks       = mcbsp1_opt_clks,
+       .opt_clks_cnt   = ARRAY_SIZE(mcbsp1_opt_clks),
+};
+
+/* mcbsp2 */
+static struct omap_hwmod_opt_clk mcbsp2_opt_clks[] = {
+       { .role = "pad_fck", .clk = "pad_clks_ck" },
+       { .role = "prcm_fck", .clk = "mcbsp2_sync_mux_ck" },
+};
+
+static struct omap_hwmod omap54xx_mcbsp2_hwmod = {
+       .name           = "mcbsp2",
+       .class          = &omap54xx_mcbsp_hwmod_class,
+       .clkdm_name     = "abe_clkdm",
+       .main_clk       = "mcbsp2_gfclk",
+       .prcm = {
+               .omap4 = {
+                       .clkctrl_offs = OMAP54XX_CM_ABE_MCBSP2_CLKCTRL_OFFSET,
+                       .context_offs = OMAP54XX_RM_ABE_MCBSP2_CONTEXT_OFFSET,
+                       .modulemode   = MODULEMODE_SWCTRL,
+               },
+       },
+       .opt_clks       = mcbsp2_opt_clks,
+       .opt_clks_cnt   = ARRAY_SIZE(mcbsp2_opt_clks),
+};
+
+/* mcbsp3 */
+static struct omap_hwmod_opt_clk mcbsp3_opt_clks[] = {
+       { .role = "pad_fck", .clk = "pad_clks_ck" },
+       { .role = "prcm_fck", .clk = "mcbsp3_sync_mux_ck" },
+};
+
+static struct omap_hwmod omap54xx_mcbsp3_hwmod = {
+       .name           = "mcbsp3",
+       .class          = &omap54xx_mcbsp_hwmod_class,
+       .clkdm_name     = "abe_clkdm",
+       .main_clk       = "mcbsp3_gfclk",
+       .prcm = {
+               .omap4 = {
+                       .clkctrl_offs = OMAP54XX_CM_ABE_MCBSP3_CLKCTRL_OFFSET,
+                       .context_offs = OMAP54XX_RM_ABE_MCBSP3_CONTEXT_OFFSET,
+                       .modulemode   = MODULEMODE_SWCTRL,
+               },
+       },
+       .opt_clks       = mcbsp3_opt_clks,
+       .opt_clks_cnt   = ARRAY_SIZE(mcbsp3_opt_clks),
+};
+
+/*
+ * 'mcpdm' class
+ * multi channel pdm controller (proprietary interface with phoenix power
+ * ic)
+ */
+
+static struct omap_hwmod_class_sysconfig omap54xx_mcpdm_sysc = {
+       .rev_offs       = 0x0000,
+       .sysc_offs      = 0x0010,
+       .sysc_flags     = (SYSC_HAS_EMUFREE | SYSC_HAS_RESET_STATUS |
+                          SYSC_HAS_SIDLEMODE | SYSC_HAS_SOFTRESET),
+       .idlemodes      = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART |
+                          SIDLE_SMART_WKUP),
+       .sysc_fields    = &omap_hwmod_sysc_type2,
+};
+
+static struct omap_hwmod_class omap54xx_mcpdm_hwmod_class = {
+       .name   = "mcpdm",
+       .sysc   = &omap54xx_mcpdm_sysc,
+};
+
+/* mcpdm */
+static struct omap_hwmod omap54xx_mcpdm_hwmod = {
+       .name           = "mcpdm",
+       .class          = &omap54xx_mcpdm_hwmod_class,
+       .clkdm_name     = "abe_clkdm",
+       /*
+        * It's suspected that the McPDM requires an off-chip main
+        * functional clock, controlled via I2C.  This IP block is
+        * currently reset very early during boot, before I2C is
+        * available, so it doesn't seem that we have any choice in
+        * the kernel other than to avoid resetting it.  XXX This is
+        * really a hardware issue workaround: every IP block should
+        * be able to source its main functional clock from either
+        * on-chip or off-chip sources.  McPDM seems to be the only
+        * current exception.
+        */
+
+       .flags          = HWMOD_EXT_OPT_MAIN_CLK,
+       .main_clk       = "pad_clks_ck",
+       .prcm = {
+               .omap4 = {
+                       .clkctrl_offs = OMAP54XX_CM_ABE_MCPDM_CLKCTRL_OFFSET,
+                       .context_offs = OMAP54XX_RM_ABE_MCPDM_CONTEXT_OFFSET,
+                       .modulemode   = MODULEMODE_SWCTRL,
+               },
+       },
+};
+
+/*
+ * 'mcspi' class
+ * multichannel serial port interface (mcspi) / master/slave synchronous serial
+ * bus
+ */
+
+static struct omap_hwmod_class_sysconfig omap54xx_mcspi_sysc = {
+       .rev_offs       = 0x0000,
+       .sysc_offs      = 0x0010,
+       .sysc_flags     = (SYSC_HAS_EMUFREE | SYSC_HAS_RESET_STATUS |
+                          SYSC_HAS_SIDLEMODE | SYSC_HAS_SOFTRESET),
+       .idlemodes      = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART |
+                          SIDLE_SMART_WKUP),
+       .sysc_fields    = &omap_hwmod_sysc_type2,
+};
+
+static struct omap_hwmod_class omap54xx_mcspi_hwmod_class = {
+       .name   = "mcspi",
+       .sysc   = &omap54xx_mcspi_sysc,
+       .rev    = OMAP4_MCSPI_REV,
+};
+
+/* mcspi1 */
+/* mcspi1 dev_attr */
+static struct omap2_mcspi_dev_attr mcspi1_dev_attr = {
+       .num_chipselect = 4,
+};
+
+static struct omap_hwmod omap54xx_mcspi1_hwmod = {
+       .name           = "mcspi1",
+       .class          = &omap54xx_mcspi_hwmod_class,
+       .clkdm_name     = "l4per_clkdm",
+       .main_clk       = "func_48m_fclk",
+       .prcm = {
+               .omap4 = {
+                       .clkctrl_offs = OMAP54XX_CM_L4PER_MCSPI1_CLKCTRL_OFFSET,
+                       .context_offs = OMAP54XX_RM_L4PER_MCSPI1_CONTEXT_OFFSET,
+                       .modulemode   = MODULEMODE_SWCTRL,
+               },
+       },
+       .dev_attr       = &mcspi1_dev_attr,
+};
+
+/* mcspi2 */
+/* mcspi2 dev_attr */
+static struct omap2_mcspi_dev_attr mcspi2_dev_attr = {
+       .num_chipselect = 2,
+};
+
+static struct omap_hwmod omap54xx_mcspi2_hwmod = {
+       .name           = "mcspi2",
+       .class          = &omap54xx_mcspi_hwmod_class,
+       .clkdm_name     = "l4per_clkdm",
+       .main_clk       = "func_48m_fclk",
+       .prcm = {
+               .omap4 = {
+                       .clkctrl_offs = OMAP54XX_CM_L4PER_MCSPI2_CLKCTRL_OFFSET,
+                       .context_offs = OMAP54XX_RM_L4PER_MCSPI2_CONTEXT_OFFSET,
+                       .modulemode   = MODULEMODE_SWCTRL,
+               },
+       },
+       .dev_attr       = &mcspi2_dev_attr,
+};
+
+/* mcspi3 */
+/* mcspi3 dev_attr */
+static struct omap2_mcspi_dev_attr mcspi3_dev_attr = {
+       .num_chipselect = 2,
+};
+
+static struct omap_hwmod omap54xx_mcspi3_hwmod = {
+       .name           = "mcspi3",
+       .class          = &omap54xx_mcspi_hwmod_class,
+       .clkdm_name     = "l4per_clkdm",
+       .main_clk       = "func_48m_fclk",
+       .prcm = {
+               .omap4 = {
+                       .clkctrl_offs = OMAP54XX_CM_L4PER_MCSPI3_CLKCTRL_OFFSET,
+                       .context_offs = OMAP54XX_RM_L4PER_MCSPI3_CONTEXT_OFFSET,
+                       .modulemode   = MODULEMODE_SWCTRL,
+               },
+       },
+       .dev_attr       = &mcspi3_dev_attr,
+};
+
+/* mcspi4 */
+/* mcspi4 dev_attr */
+static struct omap2_mcspi_dev_attr mcspi4_dev_attr = {
+       .num_chipselect = 1,
+};
+
+static struct omap_hwmod omap54xx_mcspi4_hwmod = {
+       .name           = "mcspi4",
+       .class          = &omap54xx_mcspi_hwmod_class,
+       .clkdm_name     = "l4per_clkdm",
+       .main_clk       = "func_48m_fclk",
+       .prcm = {
+               .omap4 = {
+                       .clkctrl_offs = OMAP54XX_CM_L4PER_MCSPI4_CLKCTRL_OFFSET,
+                       .context_offs = OMAP54XX_RM_L4PER_MCSPI4_CONTEXT_OFFSET,
+                       .modulemode   = MODULEMODE_SWCTRL,
+               },
+       },
+       .dev_attr       = &mcspi4_dev_attr,
+};
+
+/*
+ * 'mmc' class
+ * multimedia card high-speed/sd/sdio (mmc/sd/sdio) host controller
+ */
+
+static struct omap_hwmod_class_sysconfig omap54xx_mmc_sysc = {
+       .rev_offs       = 0x0000,
+       .sysc_offs      = 0x0010,
+       .sysc_flags     = (SYSC_HAS_EMUFREE | SYSC_HAS_MIDLEMODE |
+                          SYSC_HAS_RESET_STATUS | SYSC_HAS_SIDLEMODE |
+                          SYSC_HAS_SOFTRESET),
+       .idlemodes      = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART |
+                          SIDLE_SMART_WKUP | MSTANDBY_FORCE | MSTANDBY_NO |
+                          MSTANDBY_SMART | MSTANDBY_SMART_WKUP),
+       .sysc_fields    = &omap_hwmod_sysc_type2,
+};
+
+static struct omap_hwmod_class omap54xx_mmc_hwmod_class = {
+       .name   = "mmc",
+       .sysc   = &omap54xx_mmc_sysc,
+};
+
+/* mmc1 */
+static struct omap_hwmod_opt_clk mmc1_opt_clks[] = {
+       { .role = "32khz_clk", .clk = "mmc1_32khz_clk" },
+};
+
+/* mmc1 dev_attr */
+static struct omap_mmc_dev_attr mmc1_dev_attr = {
+       .flags  = OMAP_HSMMC_SUPPORTS_DUAL_VOLT,
+};
+
+static struct omap_hwmod omap54xx_mmc1_hwmod = {
+       .name           = "mmc1",
+       .class          = &omap54xx_mmc_hwmod_class,
+       .clkdm_name     = "l3init_clkdm",
+       .main_clk       = "mmc1_fclk",
+       .prcm = {
+               .omap4 = {
+                       .clkctrl_offs = OMAP54XX_CM_L3INIT_MMC1_CLKCTRL_OFFSET,
+                       .context_offs = OMAP54XX_RM_L3INIT_MMC1_CONTEXT_OFFSET,
+                       .modulemode   = MODULEMODE_SWCTRL,
+               },
+       },
+       .opt_clks       = mmc1_opt_clks,
+       .opt_clks_cnt   = ARRAY_SIZE(mmc1_opt_clks),
+       .dev_attr       = &mmc1_dev_attr,
+};
+
+/* mmc2 */
+static struct omap_hwmod omap54xx_mmc2_hwmod = {
+       .name           = "mmc2",
+       .class          = &omap54xx_mmc_hwmod_class,
+       .clkdm_name     = "l3init_clkdm",
+       .main_clk       = "mmc2_fclk",
+       .prcm = {
+               .omap4 = {
+                       .clkctrl_offs = OMAP54XX_CM_L3INIT_MMC2_CLKCTRL_OFFSET,
+                       .context_offs = OMAP54XX_RM_L3INIT_MMC2_CONTEXT_OFFSET,
+                       .modulemode   = MODULEMODE_SWCTRL,
+               },
+       },
+};
+
+/* mmc3 */
+static struct omap_hwmod omap54xx_mmc3_hwmod = {
+       .name           = "mmc3",
+       .class          = &omap54xx_mmc_hwmod_class,
+       .clkdm_name     = "l4per_clkdm",
+       .main_clk       = "func_48m_fclk",
+       .prcm = {
+               .omap4 = {
+                       .clkctrl_offs = OMAP54XX_CM_L4PER_MMC3_CLKCTRL_OFFSET,
+                       .context_offs = OMAP54XX_RM_L4PER_MMC3_CONTEXT_OFFSET,
+                       .modulemode   = MODULEMODE_SWCTRL,
+               },
+       },
+};
+
+/* mmc4 */
+static struct omap_hwmod omap54xx_mmc4_hwmod = {
+       .name           = "mmc4",
+       .class          = &omap54xx_mmc_hwmod_class,
+       .clkdm_name     = "l4per_clkdm",
+       .main_clk       = "func_48m_fclk",
+       .prcm = {
+               .omap4 = {
+                       .clkctrl_offs = OMAP54XX_CM_L4PER_MMC4_CLKCTRL_OFFSET,
+                       .context_offs = OMAP54XX_RM_L4PER_MMC4_CONTEXT_OFFSET,
+                       .modulemode   = MODULEMODE_SWCTRL,
+               },
+       },
+};
+
+/* mmc5 */
+static struct omap_hwmod omap54xx_mmc5_hwmod = {
+       .name           = "mmc5",
+       .class          = &omap54xx_mmc_hwmod_class,
+       .clkdm_name     = "l4per_clkdm",
+       .main_clk       = "func_96m_fclk",
+       .prcm = {
+               .omap4 = {
+                       .clkctrl_offs = OMAP54XX_CM_L4PER_MMC5_CLKCTRL_OFFSET,
+                       .context_offs = OMAP54XX_RM_L4PER_MMC5_CONTEXT_OFFSET,
+                       .modulemode   = MODULEMODE_SWCTRL,
+               },
+       },
+};
+
+/*
+ * 'mpu' class
+ * mpu sub-system
+ */
+
+static struct omap_hwmod_class omap54xx_mpu_hwmod_class = {
+       .name   = "mpu",
+};
+
+/* mpu */
+static struct omap_hwmod omap54xx_mpu_hwmod = {
+       .name           = "mpu",
+       .class          = &omap54xx_mpu_hwmod_class,
+       .clkdm_name     = "mpu_clkdm",
+       .flags          = HWMOD_INIT_NO_IDLE | HWMOD_INIT_NO_RESET,
+       .main_clk       = "dpll_mpu_m2_ck",
+       .prcm = {
+               .omap4 = {
+                       .clkctrl_offs = OMAP54XX_CM_MPU_MPU_CLKCTRL_OFFSET,
+                       .context_offs = OMAP54XX_RM_MPU_MPU_CONTEXT_OFFSET,
+               },
+       },
+};
+
+/*
+ * 'timer' class
+ * general purpose timer module with accurate 1ms tick
+ * This class contains several variants: ['timer_1ms', 'timer']
+ */
+
+static struct omap_hwmod_class_sysconfig omap54xx_timer_1ms_sysc = {
+       .rev_offs       = 0x0000,
+       .sysc_offs      = 0x0010,
+       .sysc_flags     = (SYSC_HAS_EMUFREE | SYSC_HAS_RESET_STATUS |
+                          SYSC_HAS_SIDLEMODE | SYSC_HAS_SOFTRESET),
+       .idlemodes      = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART |
+                          SIDLE_SMART_WKUP),
+       .sysc_fields    = &omap_hwmod_sysc_type2,
+       .clockact       = CLOCKACT_TEST_ICLK,
+};
+
+static struct omap_hwmod_class omap54xx_timer_1ms_hwmod_class = {
+       .name   = "timer",
+       .sysc   = &omap54xx_timer_1ms_sysc,
+};
+
+static struct omap_hwmod_class_sysconfig omap54xx_timer_sysc = {
+       .rev_offs       = 0x0000,
+       .sysc_offs      = 0x0010,
+       .sysc_flags     = (SYSC_HAS_EMUFREE | SYSC_HAS_RESET_STATUS |
+                          SYSC_HAS_SIDLEMODE | SYSC_HAS_SOFTRESET),
+       .idlemodes      = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART |
+                          SIDLE_SMART_WKUP),
+       .sysc_fields    = &omap_hwmod_sysc_type2,
+};
+
+static struct omap_hwmod_class omap54xx_timer_hwmod_class = {
+       .name   = "timer",
+       .sysc   = &omap54xx_timer_sysc,
+};
+
+/* timer1 */
+static struct omap_hwmod omap54xx_timer1_hwmod = {
+       .name           = "timer1",
+       .class          = &omap54xx_timer_1ms_hwmod_class,
+       .clkdm_name     = "wkupaon_clkdm",
+       .main_clk       = "timer1_gfclk_mux",
+       .flags          = HWMOD_SET_DEFAULT_CLOCKACT,
+       .prcm = {
+               .omap4 = {
+                       .clkctrl_offs = OMAP54XX_CM_WKUPAON_TIMER1_CLKCTRL_OFFSET,
+                       .context_offs = OMAP54XX_RM_WKUPAON_TIMER1_CONTEXT_OFFSET,
+                       .modulemode   = MODULEMODE_SWCTRL,
+               },
+       },
+};
+
+/* timer2 */
+static struct omap_hwmod omap54xx_timer2_hwmod = {
+       .name           = "timer2",
+       .class          = &omap54xx_timer_1ms_hwmod_class,
+       .clkdm_name     = "l4per_clkdm",
+       .main_clk       = "timer2_gfclk_mux",
+       .flags          = HWMOD_SET_DEFAULT_CLOCKACT,
+       .prcm = {
+               .omap4 = {
+                       .clkctrl_offs = OMAP54XX_CM_L4PER_TIMER2_CLKCTRL_OFFSET,
+                       .context_offs = OMAP54XX_RM_L4PER_TIMER2_CONTEXT_OFFSET,
+                       .modulemode   = MODULEMODE_SWCTRL,
+               },
+       },
+};
+
+/* timer3 */
+static struct omap_hwmod omap54xx_timer3_hwmod = {
+       .name           = "timer3",
+       .class          = &omap54xx_timer_hwmod_class,
+       .clkdm_name     = "l4per_clkdm",
+       .main_clk       = "timer3_gfclk_mux",
+       .prcm = {
+               .omap4 = {
+                       .clkctrl_offs = OMAP54XX_CM_L4PER_TIMER3_CLKCTRL_OFFSET,
+                       .context_offs = OMAP54XX_RM_L4PER_TIMER3_CONTEXT_OFFSET,
+                       .modulemode   = MODULEMODE_SWCTRL,
+               },
+       },
+};
+
+/* timer4 */
+static struct omap_hwmod omap54xx_timer4_hwmod = {
+       .name           = "timer4",
+       .class          = &omap54xx_timer_hwmod_class,
+       .clkdm_name     = "l4per_clkdm",
+       .main_clk       = "timer4_gfclk_mux",
+       .prcm = {
+               .omap4 = {
+                       .clkctrl_offs = OMAP54XX_CM_L4PER_TIMER4_CLKCTRL_OFFSET,
+                       .context_offs = OMAP54XX_RM_L4PER_TIMER4_CONTEXT_OFFSET,
+                       .modulemode   = MODULEMODE_SWCTRL,
+               },
+       },
+};
+
+/* timer5 */
+static struct omap_hwmod omap54xx_timer5_hwmod = {
+       .name           = "timer5",
+       .class          = &omap54xx_timer_hwmod_class,
+       .clkdm_name     = "abe_clkdm",
+       .main_clk       = "timer5_gfclk_mux",
+       .prcm = {
+               .omap4 = {
+                       .clkctrl_offs = OMAP54XX_CM_ABE_TIMER5_CLKCTRL_OFFSET,
+                       .context_offs = OMAP54XX_RM_ABE_TIMER5_CONTEXT_OFFSET,
+                       .modulemode   = MODULEMODE_SWCTRL,
+               },
+       },
+};
+
+/* timer6 */
+static struct omap_hwmod omap54xx_timer6_hwmod = {
+       .name           = "timer6",
+       .class          = &omap54xx_timer_hwmod_class,
+       .clkdm_name     = "abe_clkdm",
+       .main_clk       = "timer6_gfclk_mux",
+       .prcm = {
+               .omap4 = {
+                       .clkctrl_offs = OMAP54XX_CM_ABE_TIMER6_CLKCTRL_OFFSET,
+                       .context_offs = OMAP54XX_RM_ABE_TIMER6_CONTEXT_OFFSET,
+                       .modulemode   = MODULEMODE_SWCTRL,
+               },
+       },
+};
+
+/* timer7 */
+static struct omap_hwmod omap54xx_timer7_hwmod = {
+       .name           = "timer7",
+       .class          = &omap54xx_timer_hwmod_class,
+       .clkdm_name     = "abe_clkdm",
+       .main_clk       = "timer7_gfclk_mux",
+       .prcm = {
+               .omap4 = {
+                       .clkctrl_offs = OMAP54XX_CM_ABE_TIMER7_CLKCTRL_OFFSET,
+                       .context_offs = OMAP54XX_RM_ABE_TIMER7_CONTEXT_OFFSET,
+                       .modulemode   = MODULEMODE_SWCTRL,
+               },
+       },
+};
+
+/* timer8 */
+static struct omap_hwmod omap54xx_timer8_hwmod = {
+       .name           = "timer8",
+       .class          = &omap54xx_timer_hwmod_class,
+       .clkdm_name     = "abe_clkdm",
+       .main_clk       = "timer8_gfclk_mux",
+       .prcm = {
+               .omap4 = {
+                       .clkctrl_offs = OMAP54XX_CM_ABE_TIMER8_CLKCTRL_OFFSET,
+                       .context_offs = OMAP54XX_RM_ABE_TIMER8_CONTEXT_OFFSET,
+                       .modulemode   = MODULEMODE_SWCTRL,
+               },
+       },
+};
+
+/* timer9 */
+static struct omap_hwmod omap54xx_timer9_hwmod = {
+       .name           = "timer9",
+       .class          = &omap54xx_timer_hwmod_class,
+       .clkdm_name     = "l4per_clkdm",
+       .main_clk       = "timer9_gfclk_mux",
+       .prcm = {
+               .omap4 = {
+                       .clkctrl_offs = OMAP54XX_CM_L4PER_TIMER9_CLKCTRL_OFFSET,
+                       .context_offs = OMAP54XX_RM_L4PER_TIMER9_CONTEXT_OFFSET,
+                       .modulemode   = MODULEMODE_SWCTRL,
+               },
+       },
+};
+
+/* timer10 */
+static struct omap_hwmod omap54xx_timer10_hwmod = {
+       .name           = "timer10",
+       .class          = &omap54xx_timer_1ms_hwmod_class,
+       .clkdm_name     = "l4per_clkdm",
+       .main_clk       = "timer10_gfclk_mux",
+       .flags          = HWMOD_SET_DEFAULT_CLOCKACT,
+       .prcm = {
+               .omap4 = {
+                       .clkctrl_offs = OMAP54XX_CM_L4PER_TIMER10_CLKCTRL_OFFSET,
+                       .context_offs = OMAP54XX_RM_L4PER_TIMER10_CONTEXT_OFFSET,
+                       .modulemode   = MODULEMODE_SWCTRL,
+               },
+       },
+};
+
+/* timer11 */
+static struct omap_hwmod omap54xx_timer11_hwmod = {
+       .name           = "timer11",
+       .class          = &omap54xx_timer_hwmod_class,
+       .clkdm_name     = "l4per_clkdm",
+       .main_clk       = "timer11_gfclk_mux",
+       .prcm = {
+               .omap4 = {
+                       .clkctrl_offs = OMAP54XX_CM_L4PER_TIMER11_CLKCTRL_OFFSET,
+                       .context_offs = OMAP54XX_RM_L4PER_TIMER11_CONTEXT_OFFSET,
+                       .modulemode   = MODULEMODE_SWCTRL,
+               },
+       },
+};
+
+/*
+ * 'uart' class
+ * universal asynchronous receiver/transmitter (uart)
+ */
+
+static struct omap_hwmod_class_sysconfig omap54xx_uart_sysc = {
+       .rev_offs       = 0x0050,
+       .sysc_offs      = 0x0054,
+       .syss_offs      = 0x0058,
+       .sysc_flags     = (SYSC_HAS_AUTOIDLE | SYSC_HAS_ENAWAKEUP |
+                          SYSC_HAS_SIDLEMODE | SYSC_HAS_SOFTRESET |
+                          SYSS_HAS_RESET_STATUS),
+       .idlemodes      = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART |
+                          SIDLE_SMART_WKUP),
+       .sysc_fields    = &omap_hwmod_sysc_type1,
+};
+
+static struct omap_hwmod_class omap54xx_uart_hwmod_class = {
+       .name   = "uart",
+       .sysc   = &omap54xx_uart_sysc,
+};
+
+/* uart1 */
+static struct omap_hwmod omap54xx_uart1_hwmod = {
+       .name           = "uart1",
+       .class          = &omap54xx_uart_hwmod_class,
+       .clkdm_name     = "l4per_clkdm",
+       .main_clk       = "func_48m_fclk",
+       .prcm = {
+               .omap4 = {
+                       .clkctrl_offs = OMAP54XX_CM_L4PER_UART1_CLKCTRL_OFFSET,
+                       .context_offs = OMAP54XX_RM_L4PER_UART1_CONTEXT_OFFSET,
+                       .modulemode   = MODULEMODE_SWCTRL,
+               },
+       },
+};
+
+/* uart2 */
+static struct omap_hwmod omap54xx_uart2_hwmod = {
+       .name           = "uart2",
+       .class          = &omap54xx_uart_hwmod_class,
+       .clkdm_name     = "l4per_clkdm",
+       .main_clk       = "func_48m_fclk",
+       .prcm = {
+               .omap4 = {
+                       .clkctrl_offs = OMAP54XX_CM_L4PER_UART2_CLKCTRL_OFFSET,
+                       .context_offs = OMAP54XX_RM_L4PER_UART2_CONTEXT_OFFSET,
+                       .modulemode   = MODULEMODE_SWCTRL,
+               },
+       },
+};
+
+/* uart3 */
+static struct omap_hwmod omap54xx_uart3_hwmod = {
+       .name           = "uart3",
+       .class          = &omap54xx_uart_hwmod_class,
+       .clkdm_name     = "l4per_clkdm",
+       .flags          = HWMOD_INIT_NO_IDLE | HWMOD_INIT_NO_RESET,
+       .main_clk       = "func_48m_fclk",
+       .prcm = {
+               .omap4 = {
+                       .clkctrl_offs = OMAP54XX_CM_L4PER_UART3_CLKCTRL_OFFSET,
+                       .context_offs = OMAP54XX_RM_L4PER_UART3_CONTEXT_OFFSET,
+                       .modulemode   = MODULEMODE_SWCTRL,
+               },
+       },
+};
+
+/* uart4 */
+static struct omap_hwmod omap54xx_uart4_hwmod = {
+       .name           = "uart4",
+       .class          = &omap54xx_uart_hwmod_class,
+       .clkdm_name     = "l4per_clkdm",
+       .main_clk       = "func_48m_fclk",
+       .prcm = {
+               .omap4 = {
+                       .clkctrl_offs = OMAP54XX_CM_L4PER_UART4_CLKCTRL_OFFSET,
+                       .context_offs = OMAP54XX_RM_L4PER_UART4_CONTEXT_OFFSET,
+                       .modulemode   = MODULEMODE_SWCTRL,
+               },
+       },
+};
+
+/* uart5 */
+static struct omap_hwmod omap54xx_uart5_hwmod = {
+       .name           = "uart5",
+       .class          = &omap54xx_uart_hwmod_class,
+       .clkdm_name     = "l4per_clkdm",
+       .main_clk       = "func_48m_fclk",
+       .prcm = {
+               .omap4 = {
+                       .clkctrl_offs = OMAP54XX_CM_L4PER_UART5_CLKCTRL_OFFSET,
+                       .context_offs = OMAP54XX_RM_L4PER_UART5_CONTEXT_OFFSET,
+                       .modulemode   = MODULEMODE_SWCTRL,
+               },
+       },
+};
+
+/* uart6 */
+static struct omap_hwmod omap54xx_uart6_hwmod = {
+       .name           = "uart6",
+       .class          = &omap54xx_uart_hwmod_class,
+       .clkdm_name     = "l4per_clkdm",
+       .main_clk       = "func_48m_fclk",
+       .prcm = {
+               .omap4 = {
+                       .clkctrl_offs = OMAP54XX_CM_L4PER_UART6_CLKCTRL_OFFSET,
+                       .context_offs = OMAP54XX_RM_L4PER_UART6_CONTEXT_OFFSET,
+                       .modulemode   = MODULEMODE_SWCTRL,
+               },
+       },
+};
+
+/*
+ * 'usb_otg_ss' class
+ * 2.0 super speed (usb_otg_ss) controller
+ */
+
+static struct omap_hwmod_class_sysconfig omap54xx_usb_otg_ss_sysc = {
+       .rev_offs       = 0x0000,
+       .sysc_offs      = 0x0010,
+       .sysc_flags     = (SYSC_HAS_DMADISABLE | SYSC_HAS_MIDLEMODE |
+                          SYSC_HAS_SIDLEMODE),
+       .idlemodes      = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART |
+                          SIDLE_SMART_WKUP | MSTANDBY_FORCE | MSTANDBY_NO |
+                          MSTANDBY_SMART | MSTANDBY_SMART_WKUP),
+       .sysc_fields    = &omap_hwmod_sysc_type2,
+};
+
+static struct omap_hwmod_class omap54xx_usb_otg_ss_hwmod_class = {
+       .name   = "usb_otg_ss",
+       .sysc   = &omap54xx_usb_otg_ss_sysc,
+};
+
+/* usb_otg_ss */
+static struct omap_hwmod_opt_clk usb_otg_ss_opt_clks[] = {
+       { .role = "refclk960m", .clk = "usb_otg_ss_refclk960m" },
+};
+
+static struct omap_hwmod omap54xx_usb_otg_ss_hwmod = {
+       .name           = "usb_otg_ss",
+       .class          = &omap54xx_usb_otg_ss_hwmod_class,
+       .clkdm_name     = "l3init_clkdm",
+       .flags          = HWMOD_SWSUP_SIDLE,
+       .main_clk       = "dpll_core_h13x2_ck",
+       .prcm = {
+               .omap4 = {
+                       .clkctrl_offs = OMAP54XX_CM_L3INIT_USB_OTG_SS_CLKCTRL_OFFSET,
+                       .context_offs = OMAP54XX_RM_L3INIT_USB_OTG_SS_CONTEXT_OFFSET,
+                       .modulemode   = MODULEMODE_HWCTRL,
+               },
+       },
+       .opt_clks       = usb_otg_ss_opt_clks,
+       .opt_clks_cnt   = ARRAY_SIZE(usb_otg_ss_opt_clks),
+};
+
+/*
+ * 'wd_timer' class
+ * 32-bit watchdog upward counter that generates a pulse on the reset pin on
+ * overflow condition
+ */
+
+static struct omap_hwmod_class_sysconfig omap54xx_wd_timer_sysc = {
+       .rev_offs       = 0x0000,
+       .sysc_offs      = 0x0010,
+       .syss_offs      = 0x0014,
+       .sysc_flags     = (SYSC_HAS_EMUFREE | SYSC_HAS_SIDLEMODE |
+                          SYSC_HAS_SOFTRESET | SYSS_HAS_RESET_STATUS),
+       .idlemodes      = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART |
+                          SIDLE_SMART_WKUP),
+       .sysc_fields    = &omap_hwmod_sysc_type1,
+};
+
+static struct omap_hwmod_class omap54xx_wd_timer_hwmod_class = {
+       .name           = "wd_timer",
+       .sysc           = &omap54xx_wd_timer_sysc,
+       .pre_shutdown   = &omap2_wd_timer_disable,
+};
+
+/* wd_timer2 */
+static struct omap_hwmod omap54xx_wd_timer2_hwmod = {
+       .name           = "wd_timer2",
+       .class          = &omap54xx_wd_timer_hwmod_class,
+       .clkdm_name     = "wkupaon_clkdm",
+       .main_clk       = "sys_32k_ck",
+       .prcm = {
+               .omap4 = {
+                       .clkctrl_offs = OMAP54XX_CM_WKUPAON_WD_TIMER2_CLKCTRL_OFFSET,
+                       .context_offs = OMAP54XX_RM_WKUPAON_WD_TIMER2_CONTEXT_OFFSET,
+                       .modulemode   = MODULEMODE_SWCTRL,
+               },
+       },
+};
+
+
+/*
+ * Interfaces
+ */
+
+/* l3_main_1 -> dmm */
+static struct omap_hwmod_ocp_if omap54xx_l3_main_1__dmm = {
+       .master         = &omap54xx_l3_main_1_hwmod,
+       .slave          = &omap54xx_dmm_hwmod,
+       .clk            = "l3_iclk_div",
+       .user           = OCP_USER_SDMA,
+};
+
+/* l3_main_3 -> l3_instr */
+static struct omap_hwmod_ocp_if omap54xx_l3_main_3__l3_instr = {
+       .master         = &omap54xx_l3_main_3_hwmod,
+       .slave          = &omap54xx_l3_instr_hwmod,
+       .clk            = "l3_iclk_div",
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+/* l3_main_2 -> l3_main_1 */
+static struct omap_hwmod_ocp_if omap54xx_l3_main_2__l3_main_1 = {
+       .master         = &omap54xx_l3_main_2_hwmod,
+       .slave          = &omap54xx_l3_main_1_hwmod,
+       .clk            = "l3_iclk_div",
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+/* l4_cfg -> l3_main_1 */
+static struct omap_hwmod_ocp_if omap54xx_l4_cfg__l3_main_1 = {
+       .master         = &omap54xx_l4_cfg_hwmod,
+       .slave          = &omap54xx_l3_main_1_hwmod,
+       .clk            = "l3_iclk_div",
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+/* mpu -> l3_main_1 */
+static struct omap_hwmod_ocp_if omap54xx_mpu__l3_main_1 = {
+       .master         = &omap54xx_mpu_hwmod,
+       .slave          = &omap54xx_l3_main_1_hwmod,
+       .clk            = "l3_iclk_div",
+       .user           = OCP_USER_MPU,
+};
+
+/* l3_main_1 -> l3_main_2 */
+static struct omap_hwmod_ocp_if omap54xx_l3_main_1__l3_main_2 = {
+       .master         = &omap54xx_l3_main_1_hwmod,
+       .slave          = &omap54xx_l3_main_2_hwmod,
+       .clk            = "l3_iclk_div",
+       .user           = OCP_USER_MPU,
+};
+
+/* l4_cfg -> l3_main_2 */
+static struct omap_hwmod_ocp_if omap54xx_l4_cfg__l3_main_2 = {
+       .master         = &omap54xx_l4_cfg_hwmod,
+       .slave          = &omap54xx_l3_main_2_hwmod,
+       .clk            = "l3_iclk_div",
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+/* l3_main_1 -> l3_main_3 */
+static struct omap_hwmod_ocp_if omap54xx_l3_main_1__l3_main_3 = {
+       .master         = &omap54xx_l3_main_1_hwmod,
+       .slave          = &omap54xx_l3_main_3_hwmod,
+       .clk            = "l3_iclk_div",
+       .user           = OCP_USER_MPU,
+};
+
+/* l3_main_2 -> l3_main_3 */
+static struct omap_hwmod_ocp_if omap54xx_l3_main_2__l3_main_3 = {
+       .master         = &omap54xx_l3_main_2_hwmod,
+       .slave          = &omap54xx_l3_main_3_hwmod,
+       .clk            = "l3_iclk_div",
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+/* l4_cfg -> l3_main_3 */
+static struct omap_hwmod_ocp_if omap54xx_l4_cfg__l3_main_3 = {
+       .master         = &omap54xx_l4_cfg_hwmod,
+       .slave          = &omap54xx_l3_main_3_hwmod,
+       .clk            = "l3_iclk_div",
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+/* l3_main_1 -> l4_abe */
+static struct omap_hwmod_ocp_if omap54xx_l3_main_1__l4_abe = {
+       .master         = &omap54xx_l3_main_1_hwmod,
+       .slave          = &omap54xx_l4_abe_hwmod,
+       .clk            = "abe_iclk",
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+/* mpu -> l4_abe */
+static struct omap_hwmod_ocp_if omap54xx_mpu__l4_abe = {
+       .master         = &omap54xx_mpu_hwmod,
+       .slave          = &omap54xx_l4_abe_hwmod,
+       .clk            = "abe_iclk",
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+/* l3_main_1 -> l4_cfg */
+static struct omap_hwmod_ocp_if omap54xx_l3_main_1__l4_cfg = {
+       .master         = &omap54xx_l3_main_1_hwmod,
+       .slave          = &omap54xx_l4_cfg_hwmod,
+       .clk            = "l4_root_clk_div",
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+/* l3_main_2 -> l4_per */
+static struct omap_hwmod_ocp_if omap54xx_l3_main_2__l4_per = {
+       .master         = &omap54xx_l3_main_2_hwmod,
+       .slave          = &omap54xx_l4_per_hwmod,
+       .clk            = "l4_root_clk_div",
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+/* l3_main_1 -> l4_wkup */
+static struct omap_hwmod_ocp_if omap54xx_l3_main_1__l4_wkup = {
+       .master         = &omap54xx_l3_main_1_hwmod,
+       .slave          = &omap54xx_l4_wkup_hwmod,
+       .clk            = "wkupaon_iclk_mux",
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+/* mpu -> mpu_private */
+static struct omap_hwmod_ocp_if omap54xx_mpu__mpu_private = {
+       .master         = &omap54xx_mpu_hwmod,
+       .slave          = &omap54xx_mpu_private_hwmod,
+       .clk            = "l3_iclk_div",
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+/* l4_wkup -> counter_32k */
+static struct omap_hwmod_ocp_if omap54xx_l4_wkup__counter_32k = {
+       .master         = &omap54xx_l4_wkup_hwmod,
+       .slave          = &omap54xx_counter_32k_hwmod,
+       .clk            = "wkupaon_iclk_mux",
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+static struct omap_hwmod_addr_space omap54xx_dma_system_addrs[] = {
+       {
+               .pa_start       = 0x4a056000,
+               .pa_end         = 0x4a056fff,
+               .flags          = ADDR_TYPE_RT
+       },
+       { }
+};
+
+/* l4_cfg -> dma_system */
+static struct omap_hwmod_ocp_if omap54xx_l4_cfg__dma_system = {
+       .master         = &omap54xx_l4_cfg_hwmod,
+       .slave          = &omap54xx_dma_system_hwmod,
+       .clk            = "l4_root_clk_div",
+       .addr           = omap54xx_dma_system_addrs,
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+/* l4_abe -> dmic */
+static struct omap_hwmod_ocp_if omap54xx_l4_abe__dmic = {
+       .master         = &omap54xx_l4_abe_hwmod,
+       .slave          = &omap54xx_dmic_hwmod,
+       .clk            = "abe_iclk",
+       .user           = OCP_USER_MPU,
+};
+
+/* mpu -> emif1 */
+static struct omap_hwmod_ocp_if omap54xx_mpu__emif1 = {
+       .master         = &omap54xx_mpu_hwmod,
+       .slave          = &omap54xx_emif1_hwmod,
+       .clk            = "dpll_core_h11x2_ck",
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+/* mpu -> emif2 */
+static struct omap_hwmod_ocp_if omap54xx_mpu__emif2 = {
+       .master         = &omap54xx_mpu_hwmod,
+       .slave          = &omap54xx_emif2_hwmod,
+       .clk            = "dpll_core_h11x2_ck",
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+/* l4_wkup -> gpio1 */
+static struct omap_hwmod_ocp_if omap54xx_l4_wkup__gpio1 = {
+       .master         = &omap54xx_l4_wkup_hwmod,
+       .slave          = &omap54xx_gpio1_hwmod,
+       .clk            = "wkupaon_iclk_mux",
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+/* l4_per -> gpio2 */
+static struct omap_hwmod_ocp_if omap54xx_l4_per__gpio2 = {
+       .master         = &omap54xx_l4_per_hwmod,
+       .slave          = &omap54xx_gpio2_hwmod,
+       .clk            = "l4_root_clk_div",
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+/* l4_per -> gpio3 */
+static struct omap_hwmod_ocp_if omap54xx_l4_per__gpio3 = {
+       .master         = &omap54xx_l4_per_hwmod,
+       .slave          = &omap54xx_gpio3_hwmod,
+       .clk            = "l4_root_clk_div",
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+/* l4_per -> gpio4 */
+static struct omap_hwmod_ocp_if omap54xx_l4_per__gpio4 = {
+       .master         = &omap54xx_l4_per_hwmod,
+       .slave          = &omap54xx_gpio4_hwmod,
+       .clk            = "l4_root_clk_div",
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+/* l4_per -> gpio5 */
+static struct omap_hwmod_ocp_if omap54xx_l4_per__gpio5 = {
+       .master         = &omap54xx_l4_per_hwmod,
+       .slave          = &omap54xx_gpio5_hwmod,
+       .clk            = "l4_root_clk_div",
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+/* l4_per -> gpio6 */
+static struct omap_hwmod_ocp_if omap54xx_l4_per__gpio6 = {
+       .master         = &omap54xx_l4_per_hwmod,
+       .slave          = &omap54xx_gpio6_hwmod,
+       .clk            = "l4_root_clk_div",
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+/* l4_per -> gpio7 */
+static struct omap_hwmod_ocp_if omap54xx_l4_per__gpio7 = {
+       .master         = &omap54xx_l4_per_hwmod,
+       .slave          = &omap54xx_gpio7_hwmod,
+       .clk            = "l4_root_clk_div",
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+/* l4_per -> gpio8 */
+static struct omap_hwmod_ocp_if omap54xx_l4_per__gpio8 = {
+       .master         = &omap54xx_l4_per_hwmod,
+       .slave          = &omap54xx_gpio8_hwmod,
+       .clk            = "l4_root_clk_div",
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+/* l4_per -> i2c1 */
+static struct omap_hwmod_ocp_if omap54xx_l4_per__i2c1 = {
+       .master         = &omap54xx_l4_per_hwmod,
+       .slave          = &omap54xx_i2c1_hwmod,
+       .clk            = "l4_root_clk_div",
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+/* l4_per -> i2c2 */
+static struct omap_hwmod_ocp_if omap54xx_l4_per__i2c2 = {
+       .master         = &omap54xx_l4_per_hwmod,
+       .slave          = &omap54xx_i2c2_hwmod,
+       .clk            = "l4_root_clk_div",
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+/* l4_per -> i2c3 */
+static struct omap_hwmod_ocp_if omap54xx_l4_per__i2c3 = {
+       .master         = &omap54xx_l4_per_hwmod,
+       .slave          = &omap54xx_i2c3_hwmod,
+       .clk            = "l4_root_clk_div",
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+/* l4_per -> i2c4 */
+static struct omap_hwmod_ocp_if omap54xx_l4_per__i2c4 = {
+       .master         = &omap54xx_l4_per_hwmod,
+       .slave          = &omap54xx_i2c4_hwmod,
+       .clk            = "l4_root_clk_div",
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+/* l4_per -> i2c5 */
+static struct omap_hwmod_ocp_if omap54xx_l4_per__i2c5 = {
+       .master         = &omap54xx_l4_per_hwmod,
+       .slave          = &omap54xx_i2c5_hwmod,
+       .clk            = "l4_root_clk_div",
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+/* l4_wkup -> kbd */
+static struct omap_hwmod_ocp_if omap54xx_l4_wkup__kbd = {
+       .master         = &omap54xx_l4_wkup_hwmod,
+       .slave          = &omap54xx_kbd_hwmod,
+       .clk            = "wkupaon_iclk_mux",
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+/* l4_abe -> mcbsp1 */
+static struct omap_hwmod_ocp_if omap54xx_l4_abe__mcbsp1 = {
+       .master         = &omap54xx_l4_abe_hwmod,
+       .slave          = &omap54xx_mcbsp1_hwmod,
+       .clk            = "abe_iclk",
+       .user           = OCP_USER_MPU,
+};
+
+/* l4_abe -> mcbsp2 */
+static struct omap_hwmod_ocp_if omap54xx_l4_abe__mcbsp2 = {
+       .master         = &omap54xx_l4_abe_hwmod,
+       .slave          = &omap54xx_mcbsp2_hwmod,
+       .clk            = "abe_iclk",
+       .user           = OCP_USER_MPU,
+};
+
+/* l4_abe -> mcbsp3 */
+static struct omap_hwmod_ocp_if omap54xx_l4_abe__mcbsp3 = {
+       .master         = &omap54xx_l4_abe_hwmod,
+       .slave          = &omap54xx_mcbsp3_hwmod,
+       .clk            = "abe_iclk",
+       .user           = OCP_USER_MPU,
+};
+
+/* l4_abe -> mcpdm */
+static struct omap_hwmod_ocp_if omap54xx_l4_abe__mcpdm = {
+       .master         = &omap54xx_l4_abe_hwmod,
+       .slave          = &omap54xx_mcpdm_hwmod,
+       .clk            = "abe_iclk",
+       .user           = OCP_USER_MPU,
+};
+
+/* l4_per -> mcspi1 */
+static struct omap_hwmod_ocp_if omap54xx_l4_per__mcspi1 = {
+       .master         = &omap54xx_l4_per_hwmod,
+       .slave          = &omap54xx_mcspi1_hwmod,
+       .clk            = "l4_root_clk_div",
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+/* l4_per -> mcspi2 */
+static struct omap_hwmod_ocp_if omap54xx_l4_per__mcspi2 = {
+       .master         = &omap54xx_l4_per_hwmod,
+       .slave          = &omap54xx_mcspi2_hwmod,
+       .clk            = "l4_root_clk_div",
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+/* l4_per -> mcspi3 */
+static struct omap_hwmod_ocp_if omap54xx_l4_per__mcspi3 = {
+       .master         = &omap54xx_l4_per_hwmod,
+       .slave          = &omap54xx_mcspi3_hwmod,
+       .clk            = "l4_root_clk_div",
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+/* l4_per -> mcspi4 */
+static struct omap_hwmod_ocp_if omap54xx_l4_per__mcspi4 = {
+       .master         = &omap54xx_l4_per_hwmod,
+       .slave          = &omap54xx_mcspi4_hwmod,
+       .clk            = "l4_root_clk_div",
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+/* l4_per -> mmc1 */
+static struct omap_hwmod_ocp_if omap54xx_l4_per__mmc1 = {
+       .master         = &omap54xx_l4_per_hwmod,
+       .slave          = &omap54xx_mmc1_hwmod,
+       .clk            = "l3_iclk_div",
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+/* l4_per -> mmc2 */
+static struct omap_hwmod_ocp_if omap54xx_l4_per__mmc2 = {
+       .master         = &omap54xx_l4_per_hwmod,
+       .slave          = &omap54xx_mmc2_hwmod,
+       .clk            = "l3_iclk_div",
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+/* l4_per -> mmc3 */
+static struct omap_hwmod_ocp_if omap54xx_l4_per__mmc3 = {
+       .master         = &omap54xx_l4_per_hwmod,
+       .slave          = &omap54xx_mmc3_hwmod,
+       .clk            = "l4_root_clk_div",
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+/* l4_per -> mmc4 */
+static struct omap_hwmod_ocp_if omap54xx_l4_per__mmc4 = {
+       .master         = &omap54xx_l4_per_hwmod,
+       .slave          = &omap54xx_mmc4_hwmod,
+       .clk            = "l4_root_clk_div",
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+/* l4_per -> mmc5 */
+static struct omap_hwmod_ocp_if omap54xx_l4_per__mmc5 = {
+       .master         = &omap54xx_l4_per_hwmod,
+       .slave          = &omap54xx_mmc5_hwmod,
+       .clk            = "l4_root_clk_div",
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+/* l4_cfg -> mpu */
+static struct omap_hwmod_ocp_if omap54xx_l4_cfg__mpu = {
+       .master         = &omap54xx_l4_cfg_hwmod,
+       .slave          = &omap54xx_mpu_hwmod,
+       .clk            = "l4_root_clk_div",
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+/* l4_wkup -> timer1 */
+static struct omap_hwmod_ocp_if omap54xx_l4_wkup__timer1 = {
+       .master         = &omap54xx_l4_wkup_hwmod,
+       .slave          = &omap54xx_timer1_hwmod,
+       .clk            = "wkupaon_iclk_mux",
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+/* l4_per -> timer2 */
+static struct omap_hwmod_ocp_if omap54xx_l4_per__timer2 = {
+       .master         = &omap54xx_l4_per_hwmod,
+       .slave          = &omap54xx_timer2_hwmod,
+       .clk            = "l4_root_clk_div",
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+/* l4_per -> timer3 */
+static struct omap_hwmod_ocp_if omap54xx_l4_per__timer3 = {
+       .master         = &omap54xx_l4_per_hwmod,
+       .slave          = &omap54xx_timer3_hwmod,
+       .clk            = "l4_root_clk_div",
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+/* l4_per -> timer4 */
+static struct omap_hwmod_ocp_if omap54xx_l4_per__timer4 = {
+       .master         = &omap54xx_l4_per_hwmod,
+       .slave          = &omap54xx_timer4_hwmod,
+       .clk            = "l4_root_clk_div",
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+/* l4_abe -> timer5 */
+static struct omap_hwmod_ocp_if omap54xx_l4_abe__timer5 = {
+       .master         = &omap54xx_l4_abe_hwmod,
+       .slave          = &omap54xx_timer5_hwmod,
+       .clk            = "abe_iclk",
+       .user           = OCP_USER_MPU,
+};
+
+/* l4_abe -> timer6 */
+static struct omap_hwmod_ocp_if omap54xx_l4_abe__timer6 = {
+       .master         = &omap54xx_l4_abe_hwmod,
+       .slave          = &omap54xx_timer6_hwmod,
+       .clk            = "abe_iclk",
+       .user           = OCP_USER_MPU,
+};
+
+/* l4_abe -> timer7 */
+static struct omap_hwmod_ocp_if omap54xx_l4_abe__timer7 = {
+       .master         = &omap54xx_l4_abe_hwmod,
+       .slave          = &omap54xx_timer7_hwmod,
+       .clk            = "abe_iclk",
+       .user           = OCP_USER_MPU,
+};
+
+/* l4_abe -> timer8 */
+static struct omap_hwmod_ocp_if omap54xx_l4_abe__timer8 = {
+       .master         = &omap54xx_l4_abe_hwmod,
+       .slave          = &omap54xx_timer8_hwmod,
+       .clk            = "abe_iclk",
+       .user           = OCP_USER_MPU,
+};
+
+/* l4_per -> timer9 */
+static struct omap_hwmod_ocp_if omap54xx_l4_per__timer9 = {
+       .master         = &omap54xx_l4_per_hwmod,
+       .slave          = &omap54xx_timer9_hwmod,
+       .clk            = "l4_root_clk_div",
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+/* l4_per -> timer10 */
+static struct omap_hwmod_ocp_if omap54xx_l4_per__timer10 = {
+       .master         = &omap54xx_l4_per_hwmod,
+       .slave          = &omap54xx_timer10_hwmod,
+       .clk            = "l4_root_clk_div",
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+/* l4_per -> timer11 */
+static struct omap_hwmod_ocp_if omap54xx_l4_per__timer11 = {
+       .master         = &omap54xx_l4_per_hwmod,
+       .slave          = &omap54xx_timer11_hwmod,
+       .clk            = "l4_root_clk_div",
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+/* l4_per -> uart1 */
+static struct omap_hwmod_ocp_if omap54xx_l4_per__uart1 = {
+       .master         = &omap54xx_l4_per_hwmod,
+       .slave          = &omap54xx_uart1_hwmod,
+       .clk            = "l4_root_clk_div",
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+/* l4_per -> uart2 */
+static struct omap_hwmod_ocp_if omap54xx_l4_per__uart2 = {
+       .master         = &omap54xx_l4_per_hwmod,
+       .slave          = &omap54xx_uart2_hwmod,
+       .clk            = "l4_root_clk_div",
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+/* l4_per -> uart3 */
+static struct omap_hwmod_ocp_if omap54xx_l4_per__uart3 = {
+       .master         = &omap54xx_l4_per_hwmod,
+       .slave          = &omap54xx_uart3_hwmod,
+       .clk            = "l4_root_clk_div",
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+/* l4_per -> uart4 */
+static struct omap_hwmod_ocp_if omap54xx_l4_per__uart4 = {
+       .master         = &omap54xx_l4_per_hwmod,
+       .slave          = &omap54xx_uart4_hwmod,
+       .clk            = "l4_root_clk_div",
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+/* l4_per -> uart5 */
+static struct omap_hwmod_ocp_if omap54xx_l4_per__uart5 = {
+       .master         = &omap54xx_l4_per_hwmod,
+       .slave          = &omap54xx_uart5_hwmod,
+       .clk            = "l4_root_clk_div",
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+/* l4_per -> uart6 */
+static struct omap_hwmod_ocp_if omap54xx_l4_per__uart6 = {
+       .master         = &omap54xx_l4_per_hwmod,
+       .slave          = &omap54xx_uart6_hwmod,
+       .clk            = "l4_root_clk_div",
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+/* l4_cfg -> usb_otg_ss */
+static struct omap_hwmod_ocp_if omap54xx_l4_cfg__usb_otg_ss = {
+       .master         = &omap54xx_l4_cfg_hwmod,
+       .slave          = &omap54xx_usb_otg_ss_hwmod,
+       .clk            = "dpll_core_h13x2_ck",
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+/* l4_wkup -> wd_timer2 */
+static struct omap_hwmod_ocp_if omap54xx_l4_wkup__wd_timer2 = {
+       .master         = &omap54xx_l4_wkup_hwmod,
+       .slave          = &omap54xx_wd_timer2_hwmod,
+       .clk            = "wkupaon_iclk_mux",
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+static struct omap_hwmod_ocp_if *omap54xx_hwmod_ocp_ifs[] __initdata = {
+       &omap54xx_l3_main_1__dmm,
+       &omap54xx_l3_main_3__l3_instr,
+       &omap54xx_l3_main_2__l3_main_1,
+       &omap54xx_l4_cfg__l3_main_1,
+       &omap54xx_mpu__l3_main_1,
+       &omap54xx_l3_main_1__l3_main_2,
+       &omap54xx_l4_cfg__l3_main_2,
+       &omap54xx_l3_main_1__l3_main_3,
+       &omap54xx_l3_main_2__l3_main_3,
+       &omap54xx_l4_cfg__l3_main_3,
+       &omap54xx_l3_main_1__l4_abe,
+       &omap54xx_mpu__l4_abe,
+       &omap54xx_l3_main_1__l4_cfg,
+       &omap54xx_l3_main_2__l4_per,
+       &omap54xx_l3_main_1__l4_wkup,
+       &omap54xx_mpu__mpu_private,
+       &omap54xx_l4_wkup__counter_32k,
+       &omap54xx_l4_cfg__dma_system,
+       &omap54xx_l4_abe__dmic,
+       &omap54xx_mpu__emif1,
+       &omap54xx_mpu__emif2,
+       &omap54xx_l4_wkup__gpio1,
+       &omap54xx_l4_per__gpio2,
+       &omap54xx_l4_per__gpio3,
+       &omap54xx_l4_per__gpio4,
+       &omap54xx_l4_per__gpio5,
+       &omap54xx_l4_per__gpio6,
+       &omap54xx_l4_per__gpio7,
+       &omap54xx_l4_per__gpio8,
+       &omap54xx_l4_per__i2c1,
+       &omap54xx_l4_per__i2c2,
+       &omap54xx_l4_per__i2c3,
+       &omap54xx_l4_per__i2c4,
+       &omap54xx_l4_per__i2c5,
+       &omap54xx_l4_wkup__kbd,
+       &omap54xx_l4_abe__mcbsp1,
+       &omap54xx_l4_abe__mcbsp2,
+       &omap54xx_l4_abe__mcbsp3,
+       &omap54xx_l4_abe__mcpdm,
+       &omap54xx_l4_per__mcspi1,
+       &omap54xx_l4_per__mcspi2,
+       &omap54xx_l4_per__mcspi3,
+       &omap54xx_l4_per__mcspi4,
+       &omap54xx_l4_per__mmc1,
+       &omap54xx_l4_per__mmc2,
+       &omap54xx_l4_per__mmc3,
+       &omap54xx_l4_per__mmc4,
+       &omap54xx_l4_per__mmc5,
+       &omap54xx_l4_cfg__mpu,
+       &omap54xx_l4_wkup__timer1,
+       &omap54xx_l4_per__timer2,
+       &omap54xx_l4_per__timer3,
+       &omap54xx_l4_per__timer4,
+       &omap54xx_l4_abe__timer5,
+       &omap54xx_l4_abe__timer6,
+       &omap54xx_l4_abe__timer7,
+       &omap54xx_l4_abe__timer8,
+       &omap54xx_l4_per__timer9,
+       &omap54xx_l4_per__timer10,
+       &omap54xx_l4_per__timer11,
+       &omap54xx_l4_per__uart1,
+       &omap54xx_l4_per__uart2,
+       &omap54xx_l4_per__uart3,
+       &omap54xx_l4_per__uart4,
+       &omap54xx_l4_per__uart5,
+       &omap54xx_l4_per__uart6,
+       &omap54xx_l4_cfg__usb_otg_ss,
+       &omap54xx_l4_wkup__wd_timer2,
+       NULL,
+};
+
+int __init omap54xx_hwmod_init(void)
+{
+       omap_hwmod_init();
+       return omap_hwmod_register_links(omap54xx_hwmod_ocp_ifs);
+}
index a251f87fa2a2d08145d5e403e43705f988fa0c9a..82f0698933d85a5715282378736de84fa16ebad6 100644 (file)
@@ -1,7 +1,7 @@
 /*
- * OMAP4 Power Management Routines
+ * OMAP4+ Power Management Routines
  *
- * Copyright (C) 2010-2011 Texas Instruments, Inc.
+ * Copyright (C) 2010-2013 Texas Instruments, Inc.
  * Rajendra Nayak <rnayak@ti.com>
  * Santosh Shilimkar <santosh.shilimkar@ti.com>
  *
@@ -135,16 +135,16 @@ static void omap_default_idle(void)
 }
 
 /**
- * omap4_pm_init - Init routine for OMAP4 PM
+ * omap4_init_static_deps - Add OMAP4 static dependencies
  *
- * Initializes all powerdomain and clockdomain target states
- * and all PRCM settings.
+ * Add needed static clockdomain dependencies on OMAP4 devices.
+ * Return: 0 on success or 'err' on failures
  */
-int __init omap4_pm_init(void)
+static inline int omap4_init_static_deps(void)
 {
-       int ret;
        struct clockdomain *emif_clkdm, *mpuss_clkdm, *l3_1_clkdm;
        struct clockdomain *ducati_clkdm, *l3_2_clkdm;
+       int ret = 0;
 
        if (omap_rev() == OMAP4430_REV_ES1_0) {
                WARN(1, "Power Management not supported on OMAP4430 ES1.0\n");
@@ -163,7 +163,7 @@ int __init omap4_pm_init(void)
        ret = pwrdm_for_each(pwrdms_setup, NULL);
        if (ret) {
                pr_err("Failed to setup powerdomains\n");
-               goto err2;
+               return ret;
        }
 
        /*
@@ -171,6 +171,10 @@ int __init omap4_pm_init(void)
         * MPUSS -> L4_PER/L3_* and DUCATI -> L3_* doesn't work as
         * expected. The hardware recommendation is to enable static
         * dependencies for these to avoid system lock ups or random crashes.
+        * The L4 wakeup depedency is added to workaround the OCP sync hardware
+        * BUG with 32K synctimer which lead to incorrect timer value read
+        * from the 32K counter. The BUG applies for GPTIMER1 and WDT2 which
+        * are part of L4 wakeup clockdomain.
         */
        mpuss_clkdm = clkdm_lookup("mpuss_clkdm");
        emif_clkdm = clkdm_lookup("l3_emif_clkdm");
@@ -179,7 +183,7 @@ int __init omap4_pm_init(void)
        ducati_clkdm = clkdm_lookup("ducati_clkdm");
        if ((!mpuss_clkdm) || (!emif_clkdm) || (!l3_1_clkdm) ||
                (!l3_2_clkdm) || (!ducati_clkdm))
-               goto err2;
+               return -EINVAL;
 
        ret = clkdm_add_wkdep(mpuss_clkdm, emif_clkdm);
        ret |= clkdm_add_wkdep(mpuss_clkdm, l3_1_clkdm);
@@ -188,9 +192,42 @@ int __init omap4_pm_init(void)
        ret |= clkdm_add_wkdep(ducati_clkdm, l3_2_clkdm);
        if (ret) {
                pr_err("Failed to add MPUSS -> L3/EMIF/L4PER, DUCATI -> L3 wakeup dependency\n");
+               return -EINVAL;
+       }
+
+       return ret;
+}
+
+/**
+ * omap4_pm_init - Init routine for OMAP4+ devices
+ *
+ * Initializes all powerdomain and clockdomain target states
+ * and all PRCM settings.
+ * Return: Returns the error code returned by called functions.
+ */
+int __init omap4_pm_init(void)
+{
+       int ret = 0;
+
+       if (omap_rev() == OMAP4430_REV_ES1_0) {
+               WARN(1, "Power Management not supported on OMAP4430 ES1.0\n");
+               return -ENODEV;
+       }
+
+       pr_info("Power Management for TI OMAP4+ devices.\n");
+
+       ret = pwrdm_for_each(pwrdms_setup, NULL);
+       if (ret) {
+               pr_err("Failed to setup powerdomains.\n");
                goto err2;
        }
 
+       if (cpu_is_omap44xx()) {
+               ret = omap4_init_static_deps();
+               if (ret)
+                       goto err2;
+       }
+
        ret = omap4_mpuss_init();
        if (ret) {
                pr_err("Failed to initialise OMAP4 MPUSS\n");
@@ -206,7 +243,8 @@ int __init omap4_pm_init(void)
        /* Overwrite the default cpu_do_idle() */
        arm_pm_idle = omap_default_idle;
 
-       omap4_idle_init();
+       if (cpu_is_omap44xx())
+               omap4_idle_init();
 
 err2:
        return ret;
index 9701ad5778b9b20e26af797406ca587c46b96d2b..e4d7bd6f94b89bda9e20f9e80ed46116d03b1338 100644 (file)
@@ -255,6 +255,7 @@ extern void omap243x_powerdomains_init(void);
 extern void omap3xxx_powerdomains_init(void);
 extern void am33xx_powerdomains_init(void);
 extern void omap44xx_powerdomains_init(void);
+extern void omap54xx_powerdomains_init(void);
 
 extern struct pwrdm_ops omap2_pwrdm_operations;
 extern struct pwrdm_ops omap3_pwrdm_operations;
index f0e14e9efe5a18bccff639a6894480a7120c43a3..e2d4bd804523316e5b9400d4870916a01827834c 100644 (file)
@@ -336,6 +336,54 @@ static struct powerdomain dpll5_pwrdm = {
        .voltdm           = { .name = "core" },
 };
 
+static struct powerdomain device_81xx_pwrdm = {
+       .name             = "device_pwrdm",
+       .prcm_offs        = TI81XX_PRM_DEVICE_MOD,
+       .voltdm           = { .name = "core" },
+};
+
+static struct powerdomain active_816x_pwrdm = {
+       .name             = "active_pwrdm",
+       .prcm_offs        = TI816X_PRM_ACTIVE_MOD,
+       .pwrsts           = PWRSTS_OFF_ON,
+       .voltdm           = { .name = "core" },
+};
+
+static struct powerdomain default_816x_pwrdm = {
+       .name             = "default_pwrdm",
+       .prcm_offs        = TI81XX_PRM_DEFAULT_MOD,
+       .pwrsts           = PWRSTS_OFF_ON,
+       .voltdm           = { .name = "core" },
+};
+
+static struct powerdomain ivahd0_816x_pwrdm = {
+       .name             = "ivahd0_pwrdm",
+       .prcm_offs        = TI816X_PRM_IVAHD0_MOD,
+       .pwrsts           = PWRSTS_OFF_ON,
+       .voltdm           = { .name = "mpu_iva" },
+};
+
+static struct powerdomain ivahd1_816x_pwrdm = {
+       .name             = "ivahd1_pwrdm",
+       .prcm_offs        = TI816X_PRM_IVAHD1_MOD,
+       .pwrsts           = PWRSTS_OFF_ON,
+       .voltdm           = { .name = "mpu_iva" },
+};
+
+static struct powerdomain ivahd2_816x_pwrdm = {
+       .name             = "ivahd2_pwrdm",
+       .prcm_offs        = TI816X_PRM_IVAHD2_MOD,
+       .pwrsts           = PWRSTS_OFF_ON,
+       .voltdm           = { .name = "mpu_iva" },
+};
+
+static struct powerdomain sgx_816x_pwrdm = {
+       .name             = "sgx_pwrdm",
+       .prcm_offs        = TI816X_PRM_SGX_MOD,
+       .pwrsts           = PWRSTS_OFF_ON,
+       .voltdm           = { .name = "core" },
+};
+
 /* As powerdomains are added or removed above, this list must also be changed */
 static struct powerdomain *powerdomains_omap3430_common[] __initdata = {
        &wkup_omap2_pwrdm,
@@ -393,6 +441,17 @@ static struct powerdomain *powerdomains_am35x[] __initdata = {
        NULL
 };
 
+static struct powerdomain *powerdomains_ti81xx[] __initdata = {
+       &device_81xx_pwrdm,
+       &active_816x_pwrdm,
+       &default_816x_pwrdm,
+       &ivahd0_816x_pwrdm,
+       &ivahd1_816x_pwrdm,
+       &ivahd2_816x_pwrdm,
+       &sgx_816x_pwrdm,
+       NULL
+};
+
 void __init omap3xxx_powerdomains_init(void)
 {
        unsigned int rev;
@@ -406,6 +465,9 @@ void __init omap3xxx_powerdomains_init(void)
 
        if (rev == AM35XX_REV_ES1_0 || rev == AM35XX_REV_ES1_1) {
                pwrdm_register_pwrdms(powerdomains_am35x);
+       } else if (rev == TI8168_REV_ES1_0 || rev == TI8168_REV_ES1_1
+                       || rev == TI8168_REV_ES2_0 || rev == TI8168_REV_ES2_1) {
+               pwrdm_register_pwrdms(powerdomains_ti81xx);
        } else {
                pwrdm_register_pwrdms(powerdomains_omap3430_common);
 
diff --git a/arch/arm/mach-omap2/powerdomains54xx_data.c b/arch/arm/mach-omap2/powerdomains54xx_data.c
new file mode 100644 (file)
index 0000000..81f8a7c
--- /dev/null
@@ -0,0 +1,331 @@
+/*
+ * OMAP54XX Power domains framework
+ *
+ * Copyright (C) 2013 Texas Instruments, Inc.
+ *
+ * Abhijit Pagare (abhijitpagare@ti.com)
+ * Benoit Cousson (b-cousson@ti.com)
+ * Paul Walmsley (paul@pwsan.com)
+ *
+ * This file is automatically generated from the OMAP hardware databases.
+ * We respectfully ask that any modifications to this file be coordinated
+ * with the public linux-omap@vger.kernel.org mailing list and the
+ * authors above to ensure that the autogeneration scripts are kept
+ * up-to-date with the file contents.
+ *
+ * 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/init.h>
+
+#include "powerdomain.h"
+
+#include "prcm-common.h"
+#include "prcm44xx.h"
+#include "prm-regbits-54xx.h"
+#include "prm54xx.h"
+#include "prcm_mpu54xx.h"
+
+/* core_54xx_pwrdm: CORE power domain */
+static struct powerdomain core_54xx_pwrdm = {
+       .name             = "core_pwrdm",
+       .voltdm           = { .name = "core" },
+       .prcm_offs        = OMAP54XX_PRM_CORE_INST,
+       .prcm_partition   = OMAP54XX_PRM_PARTITION,
+       .pwrsts           = PWRSTS_RET_ON,
+       .pwrsts_logic_ret = PWRSTS_OFF_RET,
+       .banks            = 5,
+       .pwrsts_mem_ret = {
+               [0] = PWRSTS_OFF_RET,   /* core_nret_bank */
+               [1] = PWRSTS_OFF_RET,   /* core_ocmram */
+               [2] = PWRSTS_OFF_RET,   /* core_other_bank */
+               [3] = PWRSTS_OFF_RET,   /* ipu_l2ram */
+               [4] = PWRSTS_OFF_RET,   /* ipu_unicache */
+       },
+       .pwrsts_mem_on  = {
+               [0] = PWRSTS_OFF_RET,   /* core_nret_bank */
+               [1] = PWRSTS_OFF_RET,   /* core_ocmram */
+               [2] = PWRSTS_OFF_RET,   /* core_other_bank */
+               [3] = PWRSTS_OFF_RET,   /* ipu_l2ram */
+               [4] = PWRSTS_OFF_RET,   /* ipu_unicache */
+       },
+       .flags            = PWRDM_HAS_LOWPOWERSTATECHANGE,
+};
+
+/* abe_54xx_pwrdm: Audio back end power domain */
+static struct powerdomain abe_54xx_pwrdm = {
+       .name             = "abe_pwrdm",
+       .voltdm           = { .name = "core" },
+       .prcm_offs        = OMAP54XX_PRM_ABE_INST,
+       .prcm_partition   = OMAP54XX_PRM_PARTITION,
+       .pwrsts           = PWRSTS_OFF_RET_ON,
+       .pwrsts_logic_ret = PWRSTS_OFF,
+       .banks            = 2,
+       .pwrsts_mem_ret = {
+               [0] = PWRSTS_OFF_RET,   /* aessmem */
+               [1] = PWRSTS_OFF_RET,   /* periphmem */
+       },
+       .pwrsts_mem_on  = {
+               [0] = PWRSTS_OFF_RET,   /* aessmem */
+               [1] = PWRSTS_OFF_RET,   /* periphmem */
+       },
+       .flags            = PWRDM_HAS_LOWPOWERSTATECHANGE,
+};
+
+/* coreaon_54xx_pwrdm: Always ON logic that sits in VDD_CORE voltage domain */
+static struct powerdomain coreaon_54xx_pwrdm = {
+       .name             = "coreaon_pwrdm",
+       .voltdm           = { .name = "core" },
+       .prcm_offs        = OMAP54XX_PRM_COREAON_INST,
+       .prcm_partition   = OMAP54XX_PRM_PARTITION,
+       .pwrsts           = PWRSTS_ON,
+};
+
+/* dss_54xx_pwrdm: Display subsystem power domain */
+static struct powerdomain dss_54xx_pwrdm = {
+       .name             = "dss_pwrdm",
+       .voltdm           = { .name = "core" },
+       .prcm_offs        = OMAP54XX_PRM_DSS_INST,
+       .prcm_partition   = OMAP54XX_PRM_PARTITION,
+       .pwrsts           = PWRSTS_OFF_RET_ON,
+       .pwrsts_logic_ret = PWRSTS_OFF,
+       .banks            = 1,
+       .pwrsts_mem_ret = {
+               [0] = PWRSTS_OFF_RET,   /* dss_mem */
+       },
+       .pwrsts_mem_on  = {
+               [0] = PWRSTS_OFF_RET,   /* dss_mem */
+       },
+       .flags            = PWRDM_HAS_LOWPOWERSTATECHANGE,
+};
+
+/* cpu0_54xx_pwrdm: MPU0 processor and Neon coprocessor power domain */
+static struct powerdomain cpu0_54xx_pwrdm = {
+       .name             = "cpu0_pwrdm",
+       .voltdm           = { .name = "mpu" },
+       .prcm_offs        = OMAP54XX_PRCM_MPU_PRM_C0_INST,
+       .prcm_partition   = OMAP54XX_PRCM_MPU_PARTITION,
+       .pwrsts           = PWRSTS_OFF_RET_ON,
+       .pwrsts_logic_ret = PWRSTS_OFF_RET,
+       .banks            = 1,
+       .pwrsts_mem_ret = {
+               [0] = PWRSTS_OFF_RET,   /* cpu0_l1 */
+       },
+       .pwrsts_mem_on  = {
+               [0] = PWRSTS_ON,        /* cpu0_l1 */
+       },
+};
+
+/* cpu1_54xx_pwrdm: MPU1 processor and Neon coprocessor power domain */
+static struct powerdomain cpu1_54xx_pwrdm = {
+       .name             = "cpu1_pwrdm",
+       .voltdm           = { .name = "mpu" },
+       .prcm_offs        = OMAP54XX_PRCM_MPU_PRM_C1_INST,
+       .prcm_partition   = OMAP54XX_PRCM_MPU_PARTITION,
+       .pwrsts           = PWRSTS_OFF_RET_ON,
+       .pwrsts_logic_ret = PWRSTS_OFF_RET,
+       .banks            = 1,
+       .pwrsts_mem_ret = {
+               [0] = PWRSTS_OFF_RET,   /* cpu1_l1 */
+       },
+       .pwrsts_mem_on  = {
+               [0] = PWRSTS_ON,        /* cpu1_l1 */
+       },
+};
+
+/* emu_54xx_pwrdm: Emulation power domain */
+static struct powerdomain emu_54xx_pwrdm = {
+       .name             = "emu_pwrdm",
+       .voltdm           = { .name = "wkup" },
+       .prcm_offs        = OMAP54XX_PRM_EMU_INST,
+       .prcm_partition   = OMAP54XX_PRM_PARTITION,
+       .pwrsts           = PWRSTS_OFF_ON,
+       .banks            = 1,
+       .pwrsts_mem_ret = {
+               [0] = PWRSTS_OFF_RET,   /* emu_bank */
+       },
+       .pwrsts_mem_on  = {
+               [0] = PWRSTS_OFF_RET,   /* emu_bank */
+       },
+};
+
+/* mpu_54xx_pwrdm: Modena processor and the Neon coprocessor power domain */
+static struct powerdomain mpu_54xx_pwrdm = {
+       .name             = "mpu_pwrdm",
+       .voltdm           = { .name = "mpu" },
+       .prcm_offs        = OMAP54XX_PRM_MPU_INST,
+       .prcm_partition   = OMAP54XX_PRM_PARTITION,
+       .pwrsts           = PWRSTS_RET_ON,
+       .pwrsts_logic_ret = PWRSTS_OFF_RET,
+       .banks            = 2,
+       .pwrsts_mem_ret = {
+               [0] = PWRSTS_OFF_RET,   /* mpu_l2 */
+               [1] = PWRSTS_RET,       /* mpu_ram */
+       },
+       .pwrsts_mem_on  = {
+               [0] = PWRSTS_OFF_RET,   /* mpu_l2 */
+               [1] = PWRSTS_OFF_RET,   /* mpu_ram */
+       },
+};
+
+/* custefuse_54xx_pwrdm: Customer efuse controller power domain */
+static struct powerdomain custefuse_54xx_pwrdm = {
+       .name             = "custefuse_pwrdm",
+       .voltdm           = { .name = "core" },
+       .prcm_offs        = OMAP54XX_PRM_CUSTEFUSE_INST,
+       .prcm_partition   = OMAP54XX_PRM_PARTITION,
+       .pwrsts           = PWRSTS_OFF_ON,
+       .flags            = PWRDM_HAS_LOWPOWERSTATECHANGE,
+};
+
+/* dsp_54xx_pwrdm: Tesla processor power domain */
+static struct powerdomain dsp_54xx_pwrdm = {
+       .name             = "dsp_pwrdm",
+       .voltdm           = { .name = "mm" },
+       .prcm_offs        = OMAP54XX_PRM_DSP_INST,
+       .prcm_partition   = OMAP54XX_PRM_PARTITION,
+       .pwrsts           = PWRSTS_OFF_RET_ON,
+       .pwrsts_logic_ret = PWRSTS_OFF_RET,
+       .banks            = 3,
+       .pwrsts_mem_ret = {
+               [0] = PWRSTS_OFF_RET,   /* dsp_edma */
+               [1] = PWRSTS_OFF_RET,   /* dsp_l1 */
+               [2] = PWRSTS_OFF_RET,   /* dsp_l2 */
+       },
+       .pwrsts_mem_on  = {
+               [0] = PWRSTS_OFF_RET,   /* dsp_edma */
+               [1] = PWRSTS_OFF_RET,   /* dsp_l1 */
+               [2] = PWRSTS_OFF_RET,   /* dsp_l2 */
+       },
+       .flags            = PWRDM_HAS_LOWPOWERSTATECHANGE,
+};
+
+/* cam_54xx_pwrdm: Camera subsystem power domain */
+static struct powerdomain cam_54xx_pwrdm = {
+       .name             = "cam_pwrdm",
+       .voltdm           = { .name = "core" },
+       .prcm_offs        = OMAP54XX_PRM_CAM_INST,
+       .prcm_partition   = OMAP54XX_PRM_PARTITION,
+       .pwrsts           = PWRSTS_OFF_ON,
+       .banks            = 1,
+       .pwrsts_mem_ret = {
+               [0] = PWRSTS_OFF_RET,   /* cam_mem */
+       },
+       .pwrsts_mem_on  = {
+               [0] = PWRSTS_OFF_RET,   /* cam_mem */
+       },
+       .flags            = PWRDM_HAS_LOWPOWERSTATECHANGE,
+};
+
+/* l3init_54xx_pwrdm: L3 initators pheripherals power domain  */
+static struct powerdomain l3init_54xx_pwrdm = {
+       .name             = "l3init_pwrdm",
+       .voltdm           = { .name = "core" },
+       .prcm_offs        = OMAP54XX_PRM_L3INIT_INST,
+       .prcm_partition   = OMAP54XX_PRM_PARTITION,
+       .pwrsts           = PWRSTS_RET_ON,
+       .pwrsts_logic_ret = PWRSTS_OFF_RET,
+       .banks            = 2,
+       .pwrsts_mem_ret = {
+               [0] = PWRSTS_OFF_RET,   /* l3init_bank1 */
+               [1] = PWRSTS_OFF_RET,   /* l3init_bank2 */
+       },
+       .pwrsts_mem_on  = {
+               [0] = PWRSTS_OFF_RET,   /* l3init_bank1 */
+               [1] = PWRSTS_OFF_RET,   /* l3init_bank2 */
+       },
+       .flags            = PWRDM_HAS_LOWPOWERSTATECHANGE,
+};
+
+/* gpu_54xx_pwrdm: 3D accelerator power domain */
+static struct powerdomain gpu_54xx_pwrdm = {
+       .name             = "gpu_pwrdm",
+       .voltdm           = { .name = "mm" },
+       .prcm_offs        = OMAP54XX_PRM_GPU_INST,
+       .prcm_partition   = OMAP54XX_PRM_PARTITION,
+       .pwrsts           = PWRSTS_OFF_ON,
+       .banks            = 1,
+       .pwrsts_mem_ret = {
+               [0] = PWRSTS_OFF_RET,   /* gpu_mem */
+       },
+       .pwrsts_mem_on  = {
+               [0] = PWRSTS_OFF_RET,   /* gpu_mem */
+       },
+       .flags            = PWRDM_HAS_LOWPOWERSTATECHANGE,
+};
+
+/* wkupaon_54xx_pwrdm: Wake-up power domain */
+static struct powerdomain wkupaon_54xx_pwrdm = {
+       .name             = "wkupaon_pwrdm",
+       .voltdm           = { .name = "wkup" },
+       .prcm_offs        = OMAP54XX_PRM_WKUPAON_INST,
+       .prcm_partition   = OMAP54XX_PRM_PARTITION,
+       .pwrsts           = PWRSTS_ON,
+       .banks            = 1,
+       .pwrsts_mem_ret = {
+       },
+       .pwrsts_mem_on  = {
+               [0] = PWRSTS_ON,        /* wkup_bank */
+       },
+};
+
+/* iva_54xx_pwrdm: IVA-HD power domain */
+static struct powerdomain iva_54xx_pwrdm = {
+       .name             = "iva_pwrdm",
+       .voltdm           = { .name = "mm" },
+       .prcm_offs        = OMAP54XX_PRM_IVA_INST,
+       .prcm_partition   = OMAP54XX_PRM_PARTITION,
+       .pwrsts           = PWRSTS_OFF_RET_ON,
+       .pwrsts_logic_ret = PWRSTS_OFF,
+       .banks            = 4,
+       .pwrsts_mem_ret = {
+               [0] = PWRSTS_OFF_RET,   /* hwa_mem */
+               [1] = PWRSTS_OFF_RET,   /* sl2_mem */
+               [2] = PWRSTS_OFF_RET,   /* tcm1_mem */
+               [3] = PWRSTS_OFF_RET,   /* tcm2_mem */
+       },
+       .pwrsts_mem_on  = {
+               [0] = PWRSTS_OFF_RET,   /* hwa_mem */
+               [1] = PWRSTS_OFF_RET,   /* sl2_mem */
+               [2] = PWRSTS_OFF_RET,   /* tcm1_mem */
+               [3] = PWRSTS_OFF_RET,   /* tcm2_mem */
+       },
+       .flags            = PWRDM_HAS_LOWPOWERSTATECHANGE,
+};
+
+/*
+ * The following power domains are not under SW control
+ *
+ * mpuaon
+ * mmaon
+ */
+
+/* As powerdomains are added or removed above, this list must also be changed */
+static struct powerdomain *powerdomains_omap54xx[] __initdata = {
+       &core_54xx_pwrdm,
+       &abe_54xx_pwrdm,
+       &coreaon_54xx_pwrdm,
+       &dss_54xx_pwrdm,
+       &cpu0_54xx_pwrdm,
+       &cpu1_54xx_pwrdm,
+       &emu_54xx_pwrdm,
+       &mpu_54xx_pwrdm,
+       &custefuse_54xx_pwrdm,
+       &dsp_54xx_pwrdm,
+       &cam_54xx_pwrdm,
+       &l3init_54xx_pwrdm,
+       &gpu_54xx_pwrdm,
+       &wkupaon_54xx_pwrdm,
+       &iva_54xx_pwrdm,
+       NULL
+};
+
+void __init omap54xx_powerdomains_init(void)
+{
+       pwrdm_register_platform_funcs(&omap4_pwrdm_operations);
+       pwrdm_register_pwrdms(powerdomains_omap54xx);
+       pwrdm_complete_init();
+}
index c7d355fafd24ef27b363e44fbc3220ffd13ab7c8..ff1ac4a82a04a036b15e6a5f33c9f645ffb7d2f3 100644 (file)
 #define OMAP3430_NEON_MOD                              0xb00
 #define OMAP3430ES2_USBHOST_MOD                                0xc00
 
+/*
+ * TI81XX PRM module offsets
+ */
+#define TI81XX_PRM_DEVICE_MOD                  0x0000
+#define TI816X_PRM_ACTIVE_MOD                  0x0a00
+#define TI81XX_PRM_DEFAULT_MOD                 0x0b00
+#define TI816X_PRM_IVAHD0_MOD                  0x0c00
+#define TI816X_PRM_IVAHD1_MOD                  0x0d00
+#define TI816X_PRM_IVAHD2_MOD                  0x0e00
+#define TI816X_PRM_SGX_MOD                             0x0f00
+
 /* 24XX register bits shared between CM & PRM registers */
 
 /* CM_FCLKEN1_CORE, CM_ICLKEN1_CORE, PM_WKEN1_CORE shared bits */
index 7334ffb9d2c1ea666a1f326e5f2a9076df0c16a9..f429cdd5a118aa5ca3ea647b1ee3307b18c3bf20 100644 (file)
 #define OMAP4430_SCRM_PARTITION                        4
 #define OMAP4430_PRCM_MPU_PARTITION            5
 
+#define OMAP54XX_PRM_PARTITION                 1
+#define OMAP54XX_CM_CORE_AON_PARTITION         2
+#define OMAP54XX_CM_CORE_PARTITION             3
+#define OMAP54XX_SCRM_PARTITION                        4
+#define OMAP54XX_PRCM_MPU_PARTITION            5
+
 /*
  * OMAP4_MAX_PRCM_PARTITIONS: set to the highest value of the PRCM partition
  * IDs, plus one
index 884af7bb4afd952b67a55e70fb06dc1457c4292d..059bd4f4903552f00b5185bb5b57f95a067b81b9 100644 (file)
 #ifndef __ARCH_ARM_MACH_OMAP2_PRCM_MPU44XX_H
 #define __ARCH_ARM_MACH_OMAP2_PRCM_MPU44XX_H
 
+#include "prcm_mpu_44xx_54xx.h"
 #include "common.h"
 
-# ifndef __ASSEMBLER__
-extern void __iomem *prcm_mpu_base;
-# endif
-
 #define OMAP4430_PRCM_MPU_BASE                 0x48243000
 
 #define OMAP44XX_PRCM_MPU_REGADDR(inst, reg)                           \
@@ -98,13 +95,4 @@ extern void __iomem *prcm_mpu_base;
 #define OMAP4_CM_CPU1_CLKSTCTRL_OFFSET         0x0018
 #define OMAP4430_CM_CPU1_CLKSTCTRL             OMAP44XX_PRCM_MPU_REGADDR(OMAP4430_PRCM_MPU_CPU1_INST, 0x0018)
 
-/* Function prototypes */
-# ifndef __ASSEMBLER__
-extern u32 omap4_prcm_mpu_read_inst_reg(s16 inst, u16 idx);
-extern void omap4_prcm_mpu_write_inst_reg(u32 val, s16 inst, u16 idx);
-extern u32 omap4_prcm_mpu_rmw_inst_reg_bits(u32 mask, u32 bits, s16 inst,
-                                           s16 idx);
-extern void __init omap2_set_globals_prcm_mpu(void __iomem *prcm_mpu);
-# endif
-
 #endif
diff --git a/arch/arm/mach-omap2/prcm_mpu54xx.h b/arch/arm/mach-omap2/prcm_mpu54xx.h
new file mode 100644 (file)
index 0000000..bc2ce32
--- /dev/null
@@ -0,0 +1,87 @@
+/*
+ * OMAP54xx PRCM MPU instance offset macros
+ *
+ * Copyright (C) 2013 Texas Instruments Incorporated - http://www.ti.com
+ *
+ * Paul Walmsley (paul@pwsan.com)
+ * Rajendra Nayak (rnayak@ti.com)
+ * Benoit Cousson (b-cousson@ti.com)
+ *
+ * This file is automatically generated from the OMAP hardware databases.
+ * We respectfully ask that any modifications to this file be coordinated
+ * with the public linux-omap@vger.kernel.org mailing list and the
+ * authors above to ensure that the autogeneration scripts are kept
+ * up-to-date with the file contents.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#ifndef __ARCH_ARM_MACH_OMAP2_PRCM_MPU54XX_H
+#define __ARCH_ARM_MACH_OMAP2_PRCM_MPU54XX_H
+
+#include "prcm_mpu_44xx_54xx.h"
+#include "common.h"
+
+#define OMAP54XX_PRCM_MPU_BASE                 0x48243000
+
+#define OMAP54XX_PRCM_MPU_REGADDR(inst, reg)                           \
+       OMAP2_L4_IO_ADDRESS(OMAP54XX_PRCM_MPU_BASE + (inst) + (reg))
+
+/* PRCM_MPU instances */
+#define OMAP54XX_PRCM_MPU_OCP_SOCKET_INST      0x0000
+#define OMAP54XX_PRCM_MPU_DEVICE_INST          0x0200
+#define OMAP54XX_PRCM_MPU_PRM_C0_INST          0x0400
+#define OMAP54XX_PRCM_MPU_CM_C0_INST           0x0600
+#define OMAP54XX_PRCM_MPU_PRM_C1_INST          0x0800
+#define OMAP54XX_PRCM_MPU_CM_C1_INST           0x0a00
+
+/* PRCM_MPU clockdomain register offsets (from instance start) */
+#define OMAP54XX_PRCM_MPU_CM_C0_CPU0_CDOFFS    0x0000
+#define OMAP54XX_PRCM_MPU_CM_C1_CPU1_CDOFFS    0x0000
+
+
+/*
+ * PRCM_MPU
+ *
+ * The PRCM_MPU is a local PRCM inside the MPU subsystem. For the PRCM (global)
+ * point of view the PRCM_MPU is a single entity. It shares the same
+ * programming model as the global PRCM and thus can be assimilate as two new
+ * MOD inside the PRCM
+ */
+
+/* PRCM_MPU.PRCM_MPU_OCP_SOCKET register offsets */
+#define OMAP54XX_REVISION_PRCM_MPU_OFFSET                      0x0000
+
+/* PRCM_MPU.PRCM_MPU_DEVICE register offsets */
+#define OMAP54XX_PRCM_MPU_PRM_RSTST_OFFSET                     0x0000
+#define OMAP54XX_PRCM_MPU_PRM_PSCON_COUNT_OFFSET               0x0004
+#define OMAP54XX_PRM_FRAC_INCREMENTER_NUMERATOR_OFFSET         0x0010
+#define OMAP54XX_PRM_FRAC_INCREMENTER_DENUMERATOR_RELOAD_OFFSET        0x0014
+
+/* PRCM_MPU.PRCM_MPU_PRM_C0 register offsets */
+#define OMAP54XX_PM_CPU0_PWRSTCTRL_OFFSET                      0x0000
+#define OMAP54XX_PM_CPU0_PWRSTST_OFFSET                                0x0004
+#define OMAP54XX_RM_CPU0_CPU0_RSTCTRL_OFFSET                   0x0010
+#define OMAP54XX_RM_CPU0_CPU0_RSTST_OFFSET                     0x0014
+#define OMAP54XX_RM_CPU0_CPU0_CONTEXT_OFFSET                   0x0024
+
+/* PRCM_MPU.PRCM_MPU_CM_C0 register offsets */
+#define OMAP54XX_CM_CPU0_CLKSTCTRL_OFFSET                      0x0000
+#define OMAP54XX_CM_CPU0_CPU0_CLKCTRL_OFFSET                   0x0020
+#define OMAP54XX_CM_CPU0_CPU0_CLKCTRL                          OMAP54XX_PRCM_MPU_REGADDR(OMAP54XX_PRCM_MPU_CM_C0_INST, 0x0020)
+
+/* PRCM_MPU.PRCM_MPU_PRM_C1 register offsets */
+#define OMAP54XX_PM_CPU1_PWRSTCTRL_OFFSET                      0x0000
+#define OMAP54XX_PM_CPU1_PWRSTST_OFFSET                                0x0004
+#define OMAP54XX_RM_CPU1_CPU1_RSTCTRL_OFFSET                   0x0010
+#define OMAP54XX_RM_CPU1_CPU1_RSTST_OFFSET                     0x0014
+#define OMAP54XX_RM_CPU1_CPU1_CONTEXT_OFFSET                   0x0024
+
+/* PRCM_MPU.PRCM_MPU_CM_C1 register offsets */
+#define OMAP54XX_CM_CPU1_CLKSTCTRL_OFFSET                      0x0000
+#define OMAP54XX_CM_CPU1_CPU1_CLKCTRL_OFFSET                   0x0020
+#define OMAP54XX_CM_CPU1_CPU1_CLKCTRL                          OMAP54XX_PRCM_MPU_REGADDR(OMAP54XX_PRCM_MPU_CM_C1_INST, 0x0020)
+
+#endif
diff --git a/arch/arm/mach-omap2/prcm_mpu_44xx_54xx.h b/arch/arm/mach-omap2/prcm_mpu_44xx_54xx.h
new file mode 100644 (file)
index 0000000..ca149e7
--- /dev/null
@@ -0,0 +1,36 @@
+/*
+ * OMAP44xx and OMAP54xx PRCM MPU function prototypes
+ *
+ * Copyright (C) 2010, 2013 Texas Instruments, Inc.
+ * Copyright (C) 2010 Nokia Corporation
+ *
+ * Paul Walmsley (paul@pwsan.com)
+ * Rajendra Nayak (rnayak@ti.com)
+ * Benoit Cousson (b-cousson@ti.com)
+ *
+ * This file is automatically generated from the OMAP hardware databases.
+ * We respectfully ask that any modifications to this file be coordinated
+ * with the public linux-omap@vger.kernel.org mailing list and the
+ * authors above to ensure that the autogeneration scripts are kept
+ * up-to-date with the file contents.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ */
+
+#ifndef __ARCH_ARM_MACH_OMAP2_PRCM_MPU_44XX_54XX_H
+#define __ARCH_ARM_MACH_OMAP2_PRCM_MPU_44XX_54XX_H
+
+#ifndef __ASSEMBLER__
+extern void __iomem *prcm_mpu_base;
+
+extern u32 omap4_prcm_mpu_read_inst_reg(s16 inst, u16 idx);
+extern void omap4_prcm_mpu_write_inst_reg(u32 val, s16 inst, u16 idx);
+extern u32 omap4_prcm_mpu_rmw_inst_reg_bits(u32 mask, u32 bits, s16 inst,
+                                           s16 idx);
+extern void __init omap2_set_globals_prcm_mpu(void __iomem *prcm_mpu);
+#endif
+
+#endif
diff --git a/arch/arm/mach-omap2/prm-regbits-54xx.h b/arch/arm/mach-omap2/prm-regbits-54xx.h
new file mode 100644 (file)
index 0000000..be31b21
--- /dev/null
@@ -0,0 +1,2701 @@
+/*
+ * OMAP54xx Power Management register bits
+ *
+ * Copyright (C) 2013 Texas Instruments Incorporated - http://www.ti.com
+ *
+ * Paul Walmsley (paul@pwsan.com)
+ * Rajendra Nayak (rnayak@ti.com)
+ * Benoit Cousson (b-cousson@ti.com)
+ *
+ * This file is automatically generated from the OMAP hardware databases.
+ * We respectfully ask that any modifications to this file be coordinated
+ * with the public linux-omap@vger.kernel.org mailing list and the
+ * authors above to ensure that the autogeneration scripts are kept
+ * up-to-date with the file contents.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#ifndef __ARCH_ARM_MACH_OMAP2_PRM_REGBITS_54XX_H
+#define __ARCH_ARM_MACH_OMAP2_PRM_REGBITS_54XX_H
+
+/* Used by PRM_SLDO_CORE_SETUP, PRM_SLDO_MM_SETUP, PRM_SLDO_MPU_SETUP */
+#define OMAP54XX_ABBOFF_ACT_SHIFT                                              1
+#define OMAP54XX_ABBOFF_ACT_WIDTH                                              0x1
+#define OMAP54XX_ABBOFF_ACT_MASK                                               (1 << 1)
+
+/* Used by PRM_SLDO_CORE_SETUP, PRM_SLDO_MM_SETUP, PRM_SLDO_MPU_SETUP */
+#define OMAP54XX_ABBOFF_SLEEP_SHIFT                                            2
+#define OMAP54XX_ABBOFF_SLEEP_WIDTH                                            0x1
+#define OMAP54XX_ABBOFF_SLEEP_MASK                                             (1 << 2)
+
+/* Used by PRM_IRQENABLE_IPU, PRM_IRQENABLE_MPU */
+#define OMAP54XX_ABB_MM_DONE_EN_SHIFT                                          31
+#define OMAP54XX_ABB_MM_DONE_EN_WIDTH                                          0x1
+#define OMAP54XX_ABB_MM_DONE_EN_MASK                                           (1 << 31)
+
+/* Used by PRM_IRQSTATUS_IPU, PRM_IRQSTATUS_MPU */
+#define OMAP54XX_ABB_MM_DONE_ST_SHIFT                                          31
+#define OMAP54XX_ABB_MM_DONE_ST_WIDTH                                          0x1
+#define OMAP54XX_ABB_MM_DONE_ST_MASK                                           (1 << 31)
+
+/* Used by PRM_IRQENABLE_MPU_2 */
+#define OMAP54XX_ABB_MPU_DONE_EN_SHIFT                                         7
+#define OMAP54XX_ABB_MPU_DONE_EN_WIDTH                                         0x1
+#define OMAP54XX_ABB_MPU_DONE_EN_MASK                                          (1 << 7)
+
+/* Used by PRM_IRQSTATUS_MPU_2 */
+#define OMAP54XX_ABB_MPU_DONE_ST_SHIFT                                         7
+#define OMAP54XX_ABB_MPU_DONE_ST_WIDTH                                         0x1
+#define OMAP54XX_ABB_MPU_DONE_ST_MASK                                          (1 << 7)
+
+/* Used by PRM_ABBLDO_MM_SETUP, PRM_ABBLDO_MPU_SETUP */
+#define OMAP54XX_ACTIVE_FBB_SEL_SHIFT                                          2
+#define OMAP54XX_ACTIVE_FBB_SEL_WIDTH                                          0x1
+#define OMAP54XX_ACTIVE_FBB_SEL_MASK                                           (1 << 2)
+
+/* Used by PM_ABE_PWRSTCTRL */
+#define OMAP54XX_AESSMEM_ONSTATE_SHIFT                                         16
+#define OMAP54XX_AESSMEM_ONSTATE_WIDTH                                         0x2
+#define OMAP54XX_AESSMEM_ONSTATE_MASK                                          (0x3 << 16)
+
+/* Used by PM_ABE_PWRSTCTRL */
+#define OMAP54XX_AESSMEM_RETSTATE_SHIFT                                                8
+#define OMAP54XX_AESSMEM_RETSTATE_WIDTH                                                0x1
+#define OMAP54XX_AESSMEM_RETSTATE_MASK                                         (1 << 8)
+
+/* Used by PM_ABE_PWRSTST */
+#define OMAP54XX_AESSMEM_STATEST_SHIFT                                         4
+#define OMAP54XX_AESSMEM_STATEST_WIDTH                                         0x2
+#define OMAP54XX_AESSMEM_STATEST_MASK                                          (0x3 << 4)
+
+/* Used by PRM_SLDO_CORE_SETUP, PRM_SLDO_MM_SETUP, PRM_SLDO_MPU_SETUP */
+#define OMAP54XX_AIPOFF_SHIFT                                                  8
+#define OMAP54XX_AIPOFF_WIDTH                                                  0x1
+#define OMAP54XX_AIPOFF_MASK                                                   (1 << 8)
+
+/* Used by PRM_VOLTCTRL */
+#define OMAP54XX_AUTO_CTRL_VDD_CORE_L_SHIFT                                    0
+#define OMAP54XX_AUTO_CTRL_VDD_CORE_L_WIDTH                                    0x2
+#define OMAP54XX_AUTO_CTRL_VDD_CORE_L_MASK                                     (0x3 << 0)
+
+/* Used by PRM_VOLTCTRL */
+#define OMAP54XX_AUTO_CTRL_VDD_MM_L_SHIFT                                      4
+#define OMAP54XX_AUTO_CTRL_VDD_MM_L_WIDTH                                      0x2
+#define OMAP54XX_AUTO_CTRL_VDD_MM_L_MASK                                       (0x3 << 4)
+
+/* Used by PRM_VOLTCTRL */
+#define OMAP54XX_AUTO_CTRL_VDD_MPU_L_SHIFT                                     2
+#define OMAP54XX_AUTO_CTRL_VDD_MPU_L_WIDTH                                     0x2
+#define OMAP54XX_AUTO_CTRL_VDD_MPU_L_MASK                                      (0x3 << 2)
+
+/* Used by PRM_VC_BYPASS_ERRST */
+#define OMAP54XX_BYPS_RA_ERR_SHIFT                                             1
+#define OMAP54XX_BYPS_RA_ERR_WIDTH                                             0x1
+#define OMAP54XX_BYPS_RA_ERR_MASK                                              (1 << 1)
+
+/* Used by PRM_VC_BYPASS_ERRST */
+#define OMAP54XX_BYPS_SA_ERR_SHIFT                                             0
+#define OMAP54XX_BYPS_SA_ERR_WIDTH                                             0x1
+#define OMAP54XX_BYPS_SA_ERR_MASK                                              (1 << 0)
+
+/* Used by PRM_VC_BYPASS_ERRST */
+#define OMAP54XX_BYPS_TIMEOUT_ERR_SHIFT                                                2
+#define OMAP54XX_BYPS_TIMEOUT_ERR_WIDTH                                                0x1
+#define OMAP54XX_BYPS_TIMEOUT_ERR_MASK                                         (1 << 2)
+
+/* Used by PRM_RSTST */
+#define OMAP54XX_C2C_RST_SHIFT                                                 10
+#define OMAP54XX_C2C_RST_WIDTH                                                 0x1
+#define OMAP54XX_C2C_RST_MASK                                                  (1 << 10)
+
+/* Used by PM_CAM_PWRSTCTRL */
+#define OMAP54XX_CAM_MEM_ONSTATE_SHIFT                                         16
+#define OMAP54XX_CAM_MEM_ONSTATE_WIDTH                                         0x2
+#define OMAP54XX_CAM_MEM_ONSTATE_MASK                                          (0x3 << 16)
+
+/* Used by PM_CAM_PWRSTST */
+#define OMAP54XX_CAM_MEM_STATEST_SHIFT                                         4
+#define OMAP54XX_CAM_MEM_STATEST_WIDTH                                         0x2
+#define OMAP54XX_CAM_MEM_STATEST_MASK                                          (0x3 << 4)
+
+/* Used by PRM_CLKREQCTRL */
+#define OMAP54XX_CLKREQ_COND_SHIFT                                             0
+#define OMAP54XX_CLKREQ_COND_WIDTH                                             0x3
+#define OMAP54XX_CLKREQ_COND_MASK                                              (0x7 << 0)
+
+/* Used by PRM_VC_SMPS_CORE_CONFIG */
+#define OMAP54XX_CMDRA_VDD_CORE_L_SHIFT                                                16
+#define OMAP54XX_CMDRA_VDD_CORE_L_WIDTH                                                0x8
+#define OMAP54XX_CMDRA_VDD_CORE_L_MASK                                         (0xff << 16)
+
+/* Used by PRM_VC_SMPS_MM_CONFIG */
+#define OMAP54XX_CMDRA_VDD_MM_L_SHIFT                                          16
+#define OMAP54XX_CMDRA_VDD_MM_L_WIDTH                                          0x8
+#define OMAP54XX_CMDRA_VDD_MM_L_MASK                                           (0xff << 16)
+
+/* Used by PRM_VC_SMPS_MPU_CONFIG */
+#define OMAP54XX_CMDRA_VDD_MPU_L_SHIFT                                         16
+#define OMAP54XX_CMDRA_VDD_MPU_L_WIDTH                                         0x8
+#define OMAP54XX_CMDRA_VDD_MPU_L_MASK                                          (0xff << 16)
+
+/* Used by PRM_VC_SMPS_CORE_CONFIG */
+#define OMAP54XX_CMD_VDD_CORE_L_SHIFT                                          28
+#define OMAP54XX_CMD_VDD_CORE_L_WIDTH                                          0x1
+#define OMAP54XX_CMD_VDD_CORE_L_MASK                                           (1 << 28)
+
+/* Used by PRM_VC_SMPS_MM_CONFIG */
+#define OMAP54XX_CMD_VDD_MM_L_SHIFT                                            28
+#define OMAP54XX_CMD_VDD_MM_L_WIDTH                                            0x1
+#define OMAP54XX_CMD_VDD_MM_L_MASK                                             (1 << 28)
+
+/* Used by PRM_VC_SMPS_MPU_CONFIG */
+#define OMAP54XX_CMD_VDD_MPU_L_SHIFT                                           28
+#define OMAP54XX_CMD_VDD_MPU_L_WIDTH                                           0x1
+#define OMAP54XX_CMD_VDD_MPU_L_MASK                                            (1 << 28)
+
+/* Used by PM_CORE_PWRSTCTRL */
+#define OMAP54XX_CORE_OCMRAM_ONSTATE_SHIFT                                     18
+#define OMAP54XX_CORE_OCMRAM_ONSTATE_WIDTH                                     0x2
+#define OMAP54XX_CORE_OCMRAM_ONSTATE_MASK                                      (0x3 << 18)
+
+/* Used by PM_CORE_PWRSTCTRL */
+#define OMAP54XX_CORE_OCMRAM_RETSTATE_SHIFT                                    9
+#define OMAP54XX_CORE_OCMRAM_RETSTATE_WIDTH                                    0x1
+#define OMAP54XX_CORE_OCMRAM_RETSTATE_MASK                                     (1 << 9)
+
+/* Used by PM_CORE_PWRSTST */
+#define OMAP54XX_CORE_OCMRAM_STATEST_SHIFT                                     6
+#define OMAP54XX_CORE_OCMRAM_STATEST_WIDTH                                     0x2
+#define OMAP54XX_CORE_OCMRAM_STATEST_MASK                                      (0x3 << 6)
+
+/* Used by PM_CORE_PWRSTCTRL */
+#define OMAP54XX_CORE_OTHER_BANK_ONSTATE_SHIFT                                 16
+#define OMAP54XX_CORE_OTHER_BANK_ONSTATE_WIDTH                                 0x2
+#define OMAP54XX_CORE_OTHER_BANK_ONSTATE_MASK                                  (0x3 << 16)
+
+/* Used by PM_CORE_PWRSTCTRL */
+#define OMAP54XX_CORE_OTHER_BANK_RETSTATE_SHIFT                                        8
+#define OMAP54XX_CORE_OTHER_BANK_RETSTATE_WIDTH                                        0x1
+#define OMAP54XX_CORE_OTHER_BANK_RETSTATE_MASK                                 (1 << 8)
+
+/* Used by PM_CORE_PWRSTST */
+#define OMAP54XX_CORE_OTHER_BANK_STATEST_SHIFT                                 4
+#define OMAP54XX_CORE_OTHER_BANK_STATEST_WIDTH                                 0x2
+#define OMAP54XX_CORE_OTHER_BANK_STATEST_MASK                                  (0x3 << 4)
+
+/* Used by REVISION_PRM */
+#define OMAP54XX_CUSTOM_SHIFT                                                  6
+#define OMAP54XX_CUSTOM_WIDTH                                                  0x2
+#define OMAP54XX_CUSTOM_MASK                                                   (0x3 << 6)
+
+/* Used by PRM_VC_VAL_BYPASS */
+#define OMAP54XX_DATA_SHIFT                                                    16
+#define OMAP54XX_DATA_WIDTH                                                    0x8
+#define OMAP54XX_DATA_MASK                                                     (0xff << 16)
+
+/* Used by PRM_DEBUG_CORE_RET_TRANS */
+#define OMAP54XX_PRM_DEBUG_OUT_SHIFT                                           0
+#define OMAP54XX_PRM_DEBUG_OUT_WIDTH                                           0x1c
+#define OMAP54XX_PRM_DEBUG_OUT_MASK                                            (0xfffffff << 0)
+
+/* Renamed from DEBUG_OUT Used by PRM_DEBUG_MM_RET_TRANS */
+#define OMAP54XX_DEBUG_OUT_0_9_SHIFT                                           0
+#define OMAP54XX_DEBUG_OUT_0_9_WIDTH                                           0xa
+#define OMAP54XX_DEBUG_OUT_0_9_MASK                                            (0x3ff << 0)
+
+/* Renamed from DEBUG_OUT Used by PRM_DEBUG_MPU_RET_TRANS */
+#define OMAP54XX_DEBUG_OUT_0_6_SHIFT                                           0
+#define OMAP54XX_DEBUG_OUT_0_6_WIDTH                                           0x7
+#define OMAP54XX_DEBUG_OUT_0_6_MASK                                            (0x7f << 0)
+
+/* Renamed from DEBUG_OUT Used by PRM_DEBUG_OFF_TRANS */
+#define OMAP54XX_DEBUG_OUT_0_31_SHIFT                                          0
+#define OMAP54XX_DEBUG_OUT_0_31_WIDTH                                          0x20
+#define OMAP54XX_DEBUG_OUT_0_31_MASK                                           (0xffffffff << 0)
+
+/* Renamed from DEBUG_OUT Used by PRM_DEBUG_WKUPAON_FD_TRANS */
+#define OMAP54XX_DEBUG_OUT_0_11_SHIFT                                          0
+#define OMAP54XX_DEBUG_OUT_0_11_WIDTH                                          0xc
+#define OMAP54XX_DEBUG_OUT_0_11_MASK                                           (0xfff << 0)
+
+/* Used by PRM_DEVICE_OFF_CTRL */
+#define OMAP54XX_DEVICE_OFF_ENABLE_SHIFT                                       0
+#define OMAP54XX_DEVICE_OFF_ENABLE_WIDTH                                       0x1
+#define OMAP54XX_DEVICE_OFF_ENABLE_MASK                                                (1 << 0)
+
+/* Used by PRM_VC_CFG_I2C_MODE */
+#define OMAP54XX_DFILTEREN_SHIFT                                               6
+#define OMAP54XX_DFILTEREN_WIDTH                                               0x1
+#define OMAP54XX_DFILTEREN_MASK                                                        (1 << 6)
+
+/* Used by PRM_IRQENABLE_DSP, PRM_IRQENABLE_IPU, PRM_IRQENABLE_MPU */
+#define OMAP54XX_DPLL_ABE_RECAL_EN_SHIFT                                       4
+#define OMAP54XX_DPLL_ABE_RECAL_EN_WIDTH                                       0x1
+#define OMAP54XX_DPLL_ABE_RECAL_EN_MASK                                                (1 << 4)
+
+/* Used by PRM_IRQSTATUS_DSP, PRM_IRQSTATUS_IPU, PRM_IRQSTATUS_MPU */
+#define OMAP54XX_DPLL_ABE_RECAL_ST_SHIFT                                       4
+#define OMAP54XX_DPLL_ABE_RECAL_ST_WIDTH                                       0x1
+#define OMAP54XX_DPLL_ABE_RECAL_ST_MASK                                                (1 << 4)
+
+/* Used by PRM_IRQENABLE_IPU, PRM_IRQENABLE_MPU */
+#define OMAP54XX_DPLL_CORE_RECAL_EN_SHIFT                                      0
+#define OMAP54XX_DPLL_CORE_RECAL_EN_WIDTH                                      0x1
+#define OMAP54XX_DPLL_CORE_RECAL_EN_MASK                                       (1 << 0)
+
+/* Used by PRM_IRQSTATUS_IPU, PRM_IRQSTATUS_MPU */
+#define OMAP54XX_DPLL_CORE_RECAL_ST_SHIFT                                      0
+#define OMAP54XX_DPLL_CORE_RECAL_ST_WIDTH                                      0x1
+#define OMAP54XX_DPLL_CORE_RECAL_ST_MASK                                       (1 << 0)
+
+/* Used by PRM_IRQENABLE_DSP, PRM_IRQENABLE_IPU, PRM_IRQENABLE_MPU */
+#define OMAP54XX_DPLL_IVA_RECAL_EN_SHIFT                                       2
+#define OMAP54XX_DPLL_IVA_RECAL_EN_WIDTH                                       0x1
+#define OMAP54XX_DPLL_IVA_RECAL_EN_MASK                                                (1 << 2)
+
+/* Used by PRM_IRQSTATUS_DSP, PRM_IRQSTATUS_IPU, PRM_IRQSTATUS_MPU */
+#define OMAP54XX_DPLL_IVA_RECAL_ST_SHIFT                                       2
+#define OMAP54XX_DPLL_IVA_RECAL_ST_WIDTH                                       0x1
+#define OMAP54XX_DPLL_IVA_RECAL_ST_MASK                                                (1 << 2)
+
+/* Used by PRM_IRQENABLE_MPU */
+#define OMAP54XX_DPLL_MPU_RECAL_EN_SHIFT                                       1
+#define OMAP54XX_DPLL_MPU_RECAL_EN_WIDTH                                       0x1
+#define OMAP54XX_DPLL_MPU_RECAL_EN_MASK                                                (1 << 1)
+
+/* Used by PRM_IRQSTATUS_MPU */
+#define OMAP54XX_DPLL_MPU_RECAL_ST_SHIFT                                       1
+#define OMAP54XX_DPLL_MPU_RECAL_ST_WIDTH                                       0x1
+#define OMAP54XX_DPLL_MPU_RECAL_ST_MASK                                                (1 << 1)
+
+/* Used by PRM_IRQENABLE_IPU, PRM_IRQENABLE_MPU */
+#define OMAP54XX_DPLL_PER_RECAL_EN_SHIFT                                       3
+#define OMAP54XX_DPLL_PER_RECAL_EN_WIDTH                                       0x1
+#define OMAP54XX_DPLL_PER_RECAL_EN_MASK                                                (1 << 3)
+
+/* Used by PRM_IRQSTATUS_IPU, PRM_IRQSTATUS_MPU */
+#define OMAP54XX_DPLL_PER_RECAL_ST_SHIFT                                       3
+#define OMAP54XX_DPLL_PER_RECAL_ST_WIDTH                                       0x1
+#define OMAP54XX_DPLL_PER_RECAL_ST_MASK                                                (1 << 3)
+
+/* Used by PM_DSP_PWRSTCTRL */
+#define OMAP54XX_DSP_EDMA_ONSTATE_SHIFT                                                20
+#define OMAP54XX_DSP_EDMA_ONSTATE_WIDTH                                                0x2
+#define OMAP54XX_DSP_EDMA_ONSTATE_MASK                                         (0x3 << 20)
+
+/* Used by PM_DSP_PWRSTCTRL */
+#define OMAP54XX_DSP_EDMA_RETSTATE_SHIFT                                       10
+#define OMAP54XX_DSP_EDMA_RETSTATE_WIDTH                                       0x1
+#define OMAP54XX_DSP_EDMA_RETSTATE_MASK                                                (1 << 10)
+
+/* Used by PM_DSP_PWRSTST */
+#define OMAP54XX_DSP_EDMA_STATEST_SHIFT                                                8
+#define OMAP54XX_DSP_EDMA_STATEST_WIDTH                                                0x2
+#define OMAP54XX_DSP_EDMA_STATEST_MASK                                         (0x3 << 8)
+
+/* Used by PM_DSP_PWRSTCTRL */
+#define OMAP54XX_DSP_L1_ONSTATE_SHIFT                                          16
+#define OMAP54XX_DSP_L1_ONSTATE_WIDTH                                          0x2
+#define OMAP54XX_DSP_L1_ONSTATE_MASK                                           (0x3 << 16)
+
+/* Used by PM_DSP_PWRSTCTRL */
+#define OMAP54XX_DSP_L1_RETSTATE_SHIFT                                         8
+#define OMAP54XX_DSP_L1_RETSTATE_WIDTH                                         0x1
+#define OMAP54XX_DSP_L1_RETSTATE_MASK                                          (1 << 8)
+
+/* Used by PM_DSP_PWRSTST */
+#define OMAP54XX_DSP_L1_STATEST_SHIFT                                          4
+#define OMAP54XX_DSP_L1_STATEST_WIDTH                                          0x2
+#define OMAP54XX_DSP_L1_STATEST_MASK                                           (0x3 << 4)
+
+/* Used by PM_DSP_PWRSTCTRL */
+#define OMAP54XX_DSP_L2_ONSTATE_SHIFT                                          18
+#define OMAP54XX_DSP_L2_ONSTATE_WIDTH                                          0x2
+#define OMAP54XX_DSP_L2_ONSTATE_MASK                                           (0x3 << 18)
+
+/* Used by PM_DSP_PWRSTCTRL */
+#define OMAP54XX_DSP_L2_RETSTATE_SHIFT                                         9
+#define OMAP54XX_DSP_L2_RETSTATE_WIDTH                                         0x1
+#define OMAP54XX_DSP_L2_RETSTATE_MASK                                          (1 << 9)
+
+/* Used by PM_DSP_PWRSTST */
+#define OMAP54XX_DSP_L2_STATEST_SHIFT                                          6
+#define OMAP54XX_DSP_L2_STATEST_WIDTH                                          0x2
+#define OMAP54XX_DSP_L2_STATEST_MASK                                           (0x3 << 6)
+
+/* Used by PM_DSS_PWRSTCTRL */
+#define OMAP54XX_DSS_MEM_ONSTATE_SHIFT                                         16
+#define OMAP54XX_DSS_MEM_ONSTATE_WIDTH                                         0x2
+#define OMAP54XX_DSS_MEM_ONSTATE_MASK                                          (0x3 << 16)
+
+/* Used by PM_DSS_PWRSTCTRL */
+#define OMAP54XX_DSS_MEM_RETSTATE_SHIFT                                                8
+#define OMAP54XX_DSS_MEM_RETSTATE_WIDTH                                                0x1
+#define OMAP54XX_DSS_MEM_RETSTATE_MASK                                         (1 << 8)
+
+/* Used by PM_DSS_PWRSTST */
+#define OMAP54XX_DSS_MEM_STATEST_SHIFT                                         4
+#define OMAP54XX_DSS_MEM_STATEST_WIDTH                                         0x2
+#define OMAP54XX_DSS_MEM_STATEST_MASK                                          (0x3 << 4)
+
+/* Used by PRM_DEVICE_OFF_CTRL */
+#define OMAP54XX_EMIF1_OFFWKUP_DISABLE_SHIFT                                   8
+#define OMAP54XX_EMIF1_OFFWKUP_DISABLE_WIDTH                                   0x1
+#define OMAP54XX_EMIF1_OFFWKUP_DISABLE_MASK                                    (1 << 8)
+
+/* Used by PRM_DEVICE_OFF_CTRL */
+#define OMAP54XX_EMIF2_OFFWKUP_DISABLE_SHIFT                                   9
+#define OMAP54XX_EMIF2_OFFWKUP_DISABLE_WIDTH                                   0x1
+#define OMAP54XX_EMIF2_OFFWKUP_DISABLE_MASK                                    (1 << 9)
+
+/* Used by PM_EMU_PWRSTCTRL */
+#define OMAP54XX_EMU_BANK_ONSTATE_SHIFT                                                16
+#define OMAP54XX_EMU_BANK_ONSTATE_WIDTH                                                0x2
+#define OMAP54XX_EMU_BANK_ONSTATE_MASK                                         (0x3 << 16)
+
+/* Used by PM_EMU_PWRSTST */
+#define OMAP54XX_EMU_BANK_STATEST_SHIFT                                                4
+#define OMAP54XX_EMU_BANK_STATEST_WIDTH                                                0x2
+#define OMAP54XX_EMU_BANK_STATEST_MASK                                         (0x3 << 4)
+
+/*
+ * Used by PRM_SLDO_CORE_SETUP, PRM_SLDO_MM_SETUP, PRM_SLDO_MPU_SETUP,
+ * PRM_SRAM_WKUP_SETUP
+ */
+#define OMAP54XX_ENABLE_RTA_SHIFT                                              0
+#define OMAP54XX_ENABLE_RTA_WIDTH                                              0x1
+#define OMAP54XX_ENABLE_RTA_MASK                                               (1 << 0)
+
+/* Used by PRM_SLDO_CORE_SETUP, PRM_SLDO_MM_SETUP, PRM_SLDO_MPU_SETUP */
+#define OMAP54XX_ENFUNC1_SHIFT                                                 3
+#define OMAP54XX_ENFUNC1_WIDTH                                                 0x1
+#define OMAP54XX_ENFUNC1_MASK                                                  (1 << 3)
+
+/* Used by PRM_SLDO_CORE_SETUP, PRM_SLDO_MM_SETUP, PRM_SLDO_MPU_SETUP */
+#define OMAP54XX_ENFUNC2_SHIFT                                                 4
+#define OMAP54XX_ENFUNC2_WIDTH                                                 0x1
+#define OMAP54XX_ENFUNC2_MASK                                                  (1 << 4)
+
+/* Used by PRM_SLDO_CORE_SETUP, PRM_SLDO_MM_SETUP, PRM_SLDO_MPU_SETUP */
+#define OMAP54XX_ENFUNC3_SHIFT                                                 5
+#define OMAP54XX_ENFUNC3_WIDTH                                                 0x1
+#define OMAP54XX_ENFUNC3_MASK                                                  (1 << 5)
+
+/* Used by PRM_SLDO_CORE_SETUP, PRM_SLDO_MM_SETUP, PRM_SLDO_MPU_SETUP */
+#define OMAP54XX_ENFUNC4_SHIFT                                                 6
+#define OMAP54XX_ENFUNC4_WIDTH                                                 0x1
+#define OMAP54XX_ENFUNC4_MASK                                                  (1 << 6)
+
+/* Used by PRM_SLDO_CORE_SETUP, PRM_SLDO_MM_SETUP, PRM_SLDO_MPU_SETUP */
+#define OMAP54XX_ENFUNC5_SHIFT                                                 7
+#define OMAP54XX_ENFUNC5_WIDTH                                                 0x1
+#define OMAP54XX_ENFUNC5_MASK                                                  (1 << 7)
+
+/* Used by PRM_VP_CORE_CONFIG, PRM_VP_MM_CONFIG, PRM_VP_MPU_CONFIG */
+#define OMAP54XX_ERRORGAIN_SHIFT                                               16
+#define OMAP54XX_ERRORGAIN_WIDTH                                               0x8
+#define OMAP54XX_ERRORGAIN_MASK                                                        (0xff << 16)
+
+/* Used by PRM_VP_CORE_CONFIG, PRM_VP_MM_CONFIG, PRM_VP_MPU_CONFIG */
+#define OMAP54XX_ERROROFFSET_SHIFT                                             24
+#define OMAP54XX_ERROROFFSET_WIDTH                                             0x8
+#define OMAP54XX_ERROROFFSET_MASK                                              (0xff << 24)
+
+/* Used by PRM_RSTST */
+#define OMAP54XX_EXTERNAL_WARM_RST_SHIFT                                       5
+#define OMAP54XX_EXTERNAL_WARM_RST_WIDTH                                       0x1
+#define OMAP54XX_EXTERNAL_WARM_RST_MASK                                                (1 << 5)
+
+/* Used by PRM_VP_CORE_CONFIG, PRM_VP_MM_CONFIG, PRM_VP_MPU_CONFIG */
+#define OMAP54XX_FORCEUPDATE_SHIFT                                             1
+#define OMAP54XX_FORCEUPDATE_WIDTH                                             0x1
+#define OMAP54XX_FORCEUPDATE_MASK                                              (1 << 1)
+
+/* Used by PRM_VP_CORE_VOLTAGE, PRM_VP_MM_VOLTAGE, PRM_VP_MPU_VOLTAGE */
+#define OMAP54XX_FORCEUPDATEWAIT_SHIFT                                         8
+#define OMAP54XX_FORCEUPDATEWAIT_WIDTH                                         0x18
+#define OMAP54XX_FORCEUPDATEWAIT_MASK                                          (0xffffff << 8)
+
+/* Used by PRM_IRQENABLE_DSP, PRM_IRQENABLE_IPU */
+#define OMAP54XX_FORCEWKUP_EN_SHIFT                                            10
+#define OMAP54XX_FORCEWKUP_EN_WIDTH                                            0x1
+#define OMAP54XX_FORCEWKUP_EN_MASK                                             (1 << 10)
+
+/* Used by PRM_IRQSTATUS_DSP, PRM_IRQSTATUS_IPU */
+#define OMAP54XX_FORCEWKUP_ST_SHIFT                                            10
+#define OMAP54XX_FORCEWKUP_ST_WIDTH                                            0x1
+#define OMAP54XX_FORCEWKUP_ST_MASK                                             (1 << 10)
+
+/* Used by REVISION_PRM */
+#define OMAP54XX_FUNC_SHIFT                                                    16
+#define OMAP54XX_FUNC_WIDTH                                                    0xc
+#define OMAP54XX_FUNC_MASK                                                     (0xfff << 16)
+
+/* Used by PRM_RSTST */
+#define OMAP54XX_GLOBAL_COLD_RST_SHIFT                                         0
+#define OMAP54XX_GLOBAL_COLD_RST_WIDTH                                         0x1
+#define OMAP54XX_GLOBAL_COLD_RST_MASK                                          (1 << 0)
+
+/* Used by PRM_RSTST */
+#define OMAP54XX_GLOBAL_WARM_SW_RST_SHIFT                                      1
+#define OMAP54XX_GLOBAL_WARM_SW_RST_WIDTH                                      0x1
+#define OMAP54XX_GLOBAL_WARM_SW_RST_MASK                                       (1 << 1)
+
+/* Used by PRM_IO_PMCTRL */
+#define OMAP54XX_GLOBAL_WUEN_SHIFT                                             16
+#define OMAP54XX_GLOBAL_WUEN_WIDTH                                             0x1
+#define OMAP54XX_GLOBAL_WUEN_MASK                                              (1 << 16)
+
+/* Used by PM_GPU_PWRSTCTRL */
+#define OMAP54XX_GPU_MEM_ONSTATE_SHIFT                                         16
+#define OMAP54XX_GPU_MEM_ONSTATE_WIDTH                                         0x2
+#define OMAP54XX_GPU_MEM_ONSTATE_MASK                                          (0x3 << 16)
+
+/* Used by PM_GPU_PWRSTST */
+#define OMAP54XX_GPU_MEM_STATEST_SHIFT                                         4
+#define OMAP54XX_GPU_MEM_STATEST_WIDTH                                         0x2
+#define OMAP54XX_GPU_MEM_STATEST_MASK                                          (0x3 << 4)
+
+/* Used by PRM_VC_CFG_I2C_MODE */
+#define OMAP54XX_HSMCODE_SHIFT                                                 0
+#define OMAP54XX_HSMCODE_WIDTH                                                 0x3
+#define OMAP54XX_HSMCODE_MASK                                                  (0x7 << 0)
+
+/* Used by PRM_VC_CFG_I2C_MODE */
+#define OMAP54XX_HSMODEEN_SHIFT                                                        3
+#define OMAP54XX_HSMODEEN_WIDTH                                                        0x1
+#define OMAP54XX_HSMODEEN_MASK                                                 (1 << 3)
+
+/* Used by PRM_VC_CFG_I2C_CLK */
+#define OMAP54XX_HSSCLH_SHIFT                                                  16
+#define OMAP54XX_HSSCLH_WIDTH                                                  0x8
+#define OMAP54XX_HSSCLH_MASK                                                   (0xff << 16)
+
+/* Used by PRM_VC_CFG_I2C_CLK */
+#define OMAP54XX_HSSCLL_SHIFT                                                  24
+#define OMAP54XX_HSSCLL_WIDTH                                                  0x8
+#define OMAP54XX_HSSCLL_MASK                                                   (0xff << 24)
+
+/* Used by PM_IVA_PWRSTCTRL */
+#define OMAP54XX_HWA_MEM_ONSTATE_SHIFT                                         16
+#define OMAP54XX_HWA_MEM_ONSTATE_WIDTH                                         0x2
+#define OMAP54XX_HWA_MEM_ONSTATE_MASK                                          (0x3 << 16)
+
+/* Used by PM_IVA_PWRSTCTRL */
+#define OMAP54XX_HWA_MEM_RETSTATE_SHIFT                                                8
+#define OMAP54XX_HWA_MEM_RETSTATE_WIDTH                                                0x1
+#define OMAP54XX_HWA_MEM_RETSTATE_MASK                                         (1 << 8)
+
+/* Used by PM_IVA_PWRSTST */
+#define OMAP54XX_HWA_MEM_STATEST_SHIFT                                         4
+#define OMAP54XX_HWA_MEM_STATEST_WIDTH                                         0x2
+#define OMAP54XX_HWA_MEM_STATEST_MASK                                          (0x3 << 4)
+
+/* Used by PRM_RSTST */
+#define OMAP54XX_ICEPICK_RST_SHIFT                                             9
+#define OMAP54XX_ICEPICK_RST_WIDTH                                             0x1
+#define OMAP54XX_ICEPICK_RST_MASK                                              (1 << 9)
+
+/* Used by PRM_VP_CORE_CONFIG, PRM_VP_MM_CONFIG, PRM_VP_MPU_CONFIG */
+#define OMAP54XX_INITVDD_SHIFT                                                 2
+#define OMAP54XX_INITVDD_WIDTH                                                 0x1
+#define OMAP54XX_INITVDD_MASK                                                  (1 << 2)
+
+/* Used by PRM_VP_CORE_CONFIG, PRM_VP_MM_CONFIG, PRM_VP_MPU_CONFIG */
+#define OMAP54XX_INITVOLTAGE_SHIFT                                             8
+#define OMAP54XX_INITVOLTAGE_WIDTH                                             0x8
+#define OMAP54XX_INITVOLTAGE_MASK                                              (0xff << 8)
+
+/*
+ * Used by PM_ABE_PWRSTST, PM_CAM_PWRSTST, PM_CORE_PWRSTST,
+ * PM_CUSTEFUSE_PWRSTST, PM_DSP_PWRSTST, PM_DSS_PWRSTST, PM_EMU_PWRSTST,
+ * PM_GPU_PWRSTST, PM_IVA_PWRSTST, PM_L3INIT_PWRSTST, PM_MPU_PWRSTST,
+ * PRM_VOLTST_MM, PRM_VOLTST_MPU
+ */
+#define OMAP54XX_INTRANSITION_SHIFT                                            20
+#define OMAP54XX_INTRANSITION_WIDTH                                            0x1
+#define OMAP54XX_INTRANSITION_MASK                                             (1 << 20)
+
+/* Used by PRM_IRQENABLE_IPU, PRM_IRQENABLE_MPU */
+#define OMAP54XX_IO_EN_SHIFT                                                   9
+#define OMAP54XX_IO_EN_WIDTH                                                   0x1
+#define OMAP54XX_IO_EN_MASK                                                    (1 << 9)
+
+/* Used by PRM_IO_PMCTRL */
+#define OMAP54XX_IO_ON_STATUS_SHIFT                                            5
+#define OMAP54XX_IO_ON_STATUS_WIDTH                                            0x1
+#define OMAP54XX_IO_ON_STATUS_MASK                                             (1 << 5)
+
+/* Used by PRM_IRQSTATUS_IPU, PRM_IRQSTATUS_MPU */
+#define OMAP54XX_IO_ST_SHIFT                                                   9
+#define OMAP54XX_IO_ST_WIDTH                                                   0x1
+#define OMAP54XX_IO_ST_MASK                                                    (1 << 9)
+
+/* Used by PM_CORE_PWRSTCTRL */
+#define OMAP54XX_IPU_L2RAM_ONSTATE_SHIFT                                       20
+#define OMAP54XX_IPU_L2RAM_ONSTATE_WIDTH                                       0x2
+#define OMAP54XX_IPU_L2RAM_ONSTATE_MASK                                                (0x3 << 20)
+
+/* Used by PM_CORE_PWRSTCTRL */
+#define OMAP54XX_IPU_L2RAM_RETSTATE_SHIFT                                      10
+#define OMAP54XX_IPU_L2RAM_RETSTATE_WIDTH                                      0x1
+#define OMAP54XX_IPU_L2RAM_RETSTATE_MASK                                       (1 << 10)
+
+/* Used by PM_CORE_PWRSTST */
+#define OMAP54XX_IPU_L2RAM_STATEST_SHIFT                                       8
+#define OMAP54XX_IPU_L2RAM_STATEST_WIDTH                                       0x2
+#define OMAP54XX_IPU_L2RAM_STATEST_MASK                                                (0x3 << 8)
+
+/* Used by PM_CORE_PWRSTCTRL */
+#define OMAP54XX_IPU_UNICACHE_ONSTATE_SHIFT                                    22
+#define OMAP54XX_IPU_UNICACHE_ONSTATE_WIDTH                                    0x2
+#define OMAP54XX_IPU_UNICACHE_ONSTATE_MASK                                     (0x3 << 22)
+
+/* Used by PM_CORE_PWRSTCTRL */
+#define OMAP54XX_IPU_UNICACHE_RETSTATE_SHIFT                                   11
+#define OMAP54XX_IPU_UNICACHE_RETSTATE_WIDTH                                   0x1
+#define OMAP54XX_IPU_UNICACHE_RETSTATE_MASK                                    (1 << 11)
+
+/* Used by PM_CORE_PWRSTST */
+#define OMAP54XX_IPU_UNICACHE_STATEST_SHIFT                                    10
+#define OMAP54XX_IPU_UNICACHE_STATEST_WIDTH                                    0x2
+#define OMAP54XX_IPU_UNICACHE_STATEST_MASK                                     (0x3 << 10)
+
+/* Used by PRM_IO_PMCTRL */
+#define OMAP54XX_ISOCLK_OVERRIDE_SHIFT                                         0
+#define OMAP54XX_ISOCLK_OVERRIDE_WIDTH                                         0x1
+#define OMAP54XX_ISOCLK_OVERRIDE_MASK                                          (1 << 0)
+
+/* Used by PRM_IO_PMCTRL */
+#define OMAP54XX_ISOCLK_STATUS_SHIFT                                           1
+#define OMAP54XX_ISOCLK_STATUS_WIDTH                                           0x1
+#define OMAP54XX_ISOCLK_STATUS_MASK                                            (1 << 1)
+
+/* Used by PRM_IO_PMCTRL */
+#define OMAP54XX_ISOOVR_EXTEND_SHIFT                                           4
+#define OMAP54XX_ISOOVR_EXTEND_WIDTH                                           0x1
+#define OMAP54XX_ISOOVR_EXTEND_MASK                                            (1 << 4)
+
+/* Used by PRM_IO_COUNT */
+#define OMAP54XX_ISO_2_ON_TIME_SHIFT                                           0
+#define OMAP54XX_ISO_2_ON_TIME_WIDTH                                           0x8
+#define OMAP54XX_ISO_2_ON_TIME_MASK                                            (0xff << 0)
+
+/* Used by PM_L3INIT_PWRSTCTRL */
+#define OMAP54XX_L3INIT_BANK1_ONSTATE_SHIFT                                    16
+#define OMAP54XX_L3INIT_BANK1_ONSTATE_WIDTH                                    0x2
+#define OMAP54XX_L3INIT_BANK1_ONSTATE_MASK                                     (0x3 << 16)
+
+/* Used by PM_L3INIT_PWRSTCTRL */
+#define OMAP54XX_L3INIT_BANK1_RETSTATE_SHIFT                                   8
+#define OMAP54XX_L3INIT_BANK1_RETSTATE_WIDTH                                   0x1
+#define OMAP54XX_L3INIT_BANK1_RETSTATE_MASK                                    (1 << 8)
+
+/* Used by PM_L3INIT_PWRSTST */
+#define OMAP54XX_L3INIT_BANK1_STATEST_SHIFT                                    4
+#define OMAP54XX_L3INIT_BANK1_STATEST_WIDTH                                    0x2
+#define OMAP54XX_L3INIT_BANK1_STATEST_MASK                                     (0x3 << 4)
+
+/* Used by PM_L3INIT_PWRSTCTRL */
+#define OMAP54XX_L3INIT_BANK2_ONSTATE_SHIFT                                    18
+#define OMAP54XX_L3INIT_BANK2_ONSTATE_WIDTH                                    0x2
+#define OMAP54XX_L3INIT_BANK2_ONSTATE_MASK                                     (0x3 << 18)
+
+/* Used by PM_L3INIT_PWRSTCTRL */
+#define OMAP54XX_L3INIT_BANK2_RETSTATE_SHIFT                                   9
+#define OMAP54XX_L3INIT_BANK2_RETSTATE_WIDTH                                   0x1
+#define OMAP54XX_L3INIT_BANK2_RETSTATE_MASK                                    (1 << 9)
+
+/* Used by PM_L3INIT_PWRSTST */
+#define OMAP54XX_L3INIT_BANK2_STATEST_SHIFT                                    6
+#define OMAP54XX_L3INIT_BANK2_STATEST_WIDTH                                    0x2
+#define OMAP54XX_L3INIT_BANK2_STATEST_MASK                                     (0x3 << 6)
+
+/*
+ * Used by PM_ABE_PWRSTST, PM_CAM_PWRSTST, PM_CORE_PWRSTST,
+ * PM_CUSTEFUSE_PWRSTST, PM_DSP_PWRSTST, PM_DSS_PWRSTST, PM_EMU_PWRSTST,
+ * PM_GPU_PWRSTST, PM_IVA_PWRSTST, PM_L3INIT_PWRSTST, PM_MPU_PWRSTST
+ */
+#define OMAP54XX_LASTPOWERSTATEENTERED_SHIFT                                   24
+#define OMAP54XX_LASTPOWERSTATEENTERED_WIDTH                                   0x2
+#define OMAP54XX_LASTPOWERSTATEENTERED_MASK                                    (0x3 << 24)
+
+/* Used by PRM_RSTST */
+#define OMAP54XX_LLI_RST_SHIFT                                                 14
+#define OMAP54XX_LLI_RST_WIDTH                                                 0x1
+#define OMAP54XX_LLI_RST_MASK                                                  (1 << 14)
+
+/*
+ * Used by PM_ABE_PWRSTCTRL, PM_CORE_PWRSTCTRL, PM_DSP_PWRSTCTRL,
+ * PM_DSS_PWRSTCTRL, PM_IVA_PWRSTCTRL, PM_L3INIT_PWRSTCTRL, PM_MPU_PWRSTCTRL
+ */
+#define OMAP54XX_LOGICRETSTATE_SHIFT                                           2
+#define OMAP54XX_LOGICRETSTATE_WIDTH                                           0x1
+#define OMAP54XX_LOGICRETSTATE_MASK                                            (1 << 2)
+
+/*
+ * Used by PM_ABE_PWRSTST, PM_CAM_PWRSTST, PM_CORE_PWRSTST,
+ * PM_CUSTEFUSE_PWRSTST, PM_DSP_PWRSTST, PM_DSS_PWRSTST, PM_EMU_PWRSTST,
+ * PM_GPU_PWRSTST, PM_IVA_PWRSTST, PM_L3INIT_PWRSTST, PM_MPU_PWRSTST
+ */
+#define OMAP54XX_LOGICSTATEST_SHIFT                                            2
+#define OMAP54XX_LOGICSTATEST_WIDTH                                            0x1
+#define OMAP54XX_LOGICSTATEST_MASK                                             (1 << 2)
+
+/*
+ * Used by RM_ABE_AESS_CONTEXT, RM_ABE_DMIC_CONTEXT, RM_ABE_MCASP_CONTEXT,
+ * RM_ABE_MCBSP1_CONTEXT, RM_ABE_MCBSP2_CONTEXT, RM_ABE_MCBSP3_CONTEXT,
+ * RM_ABE_MCPDM_CONTEXT, RM_ABE_SLIMBUS1_CONTEXT, RM_ABE_TIMER5_CONTEXT,
+ * RM_ABE_TIMER6_CONTEXT, RM_ABE_TIMER7_CONTEXT, RM_ABE_TIMER8_CONTEXT,
+ * RM_ABE_WD_TIMER3_CONTEXT, RM_C2C_C2C_CONTEXT, RM_C2C_C2C_OCP_FW_CONTEXT,
+ * RM_CAM_CAL_CONTEXT, RM_CAM_FDIF_CONTEXT, RM_CAM_ISS_CONTEXT,
+ * RM_COREAON_SMARTREFLEX_CORE_CONTEXT, RM_COREAON_SMARTREFLEX_MM_CONTEXT,
+ * RM_COREAON_SMARTREFLEX_MPU_CONTEXT, RM_CUSTEFUSE_EFUSE_CTRL_CUST_CONTEXT,
+ * RM_DSP_DSP_CONTEXT, RM_DSS_BB2D_CONTEXT, RM_DSS_DSS_CONTEXT,
+ * RM_EMIF_DMM_CONTEXT, RM_EMIF_EMIF1_CONTEXT, RM_EMIF_EMIF2_CONTEXT,
+ * RM_EMIF_EMIF_DLL_CONTEXT, RM_EMIF_EMIF_OCP_FW_CONTEXT,
+ * RM_EMU_DEBUGSS_CONTEXT, RM_GPU_GPU_CONTEXT, RM_IPU_IPU_CONTEXT,
+ * RM_IVA_IVA_CONTEXT, RM_IVA_SL2_CONTEXT, RM_L3INIT_IEEE1500_2_OCP_CONTEXT,
+ * RM_L3INIT_OCP2SCP1_CONTEXT, RM_L3INIT_OCP2SCP3_CONTEXT,
+ * RM_L3INIT_SATA_CONTEXT, RM_L3INIT_UNIPRO2_CONTEXT,
+ * RM_L3INSTR_L3_INSTR_CONTEXT, RM_L3INSTR_L3_MAIN_3_CONTEXT,
+ * RM_L3INSTR_OCP_WP_NOC_CONTEXT, RM_L3MAIN1_L3_MAIN_1_CONTEXT,
+ * RM_L3MAIN2_L3_MAIN_2_CONTEXT, RM_L3MAIN2_OCMC_RAM_CONTEXT,
+ * RM_L4CFG_L4_CFG_CONTEXT, RM_L4CFG_OCP2SCP2_CONTEXT,
+ * RM_L4CFG_SAR_ROM_CONTEXT, RM_L4PER_ELM_CONTEXT, RM_L4PER_HDQ1W_CONTEXT,
+ * RM_L4PER_I2C2_CONTEXT, RM_L4PER_I2C3_CONTEXT, RM_L4PER_I2C4_CONTEXT,
+ * RM_L4PER_I2C5_CONTEXT, RM_L4PER_L4_PER_CONTEXT, RM_L4PER_MCSPI1_CONTEXT,
+ * RM_L4PER_MCSPI2_CONTEXT, RM_L4PER_MCSPI3_CONTEXT, RM_L4PER_MCSPI4_CONTEXT,
+ * RM_L4PER_MMC3_CONTEXT, RM_L4PER_MMC4_CONTEXT, RM_L4PER_MMC5_CONTEXT,
+ * RM_L4PER_TIMER10_CONTEXT, RM_L4PER_TIMER11_CONTEXT, RM_L4PER_TIMER2_CONTEXT,
+ * RM_L4PER_TIMER3_CONTEXT, RM_L4PER_TIMER4_CONTEXT, RM_L4PER_TIMER9_CONTEXT,
+ * RM_L4SEC_FPKA_CONTEXT, RM_MIPIEXT_LLI_CONTEXT,
+ * RM_MIPIEXT_LLI_OCP_FW_CONTEXT, RM_MIPIEXT_MPHY_CONTEXT, RM_MPU_MPU_CONTEXT,
+ * RM_WKUPAON_COUNTER_32K_CONTEXT, RM_WKUPAON_GPIO1_CONTEXT,
+ * RM_WKUPAON_KBD_CONTEXT, RM_WKUPAON_L4_WKUP_CONTEXT,
+ * RM_WKUPAON_SAR_RAM_CONTEXT, RM_WKUPAON_TIMER12_CONTEXT,
+ * RM_WKUPAON_TIMER1_CONTEXT, RM_WKUPAON_WD_TIMER1_CONTEXT,
+ * RM_WKUPAON_WD_TIMER2_CONTEXT
+ */
+#define OMAP54XX_LOSTCONTEXT_DFF_SHIFT                                         0
+#define OMAP54XX_LOSTCONTEXT_DFF_WIDTH                                         0x1
+#define OMAP54XX_LOSTCONTEXT_DFF_MASK                                          (1 << 0)
+
+/*
+ * Used by RM_C2C_C2C_CONTEXT, RM_C2C_C2C_OCP_FW_CONTEXT,
+ * RM_C2C_MODEM_ICR_CONTEXT, RM_DMA_DMA_SYSTEM_CONTEXT, RM_DSP_DSP_CONTEXT,
+ * RM_DSS_DSS_CONTEXT, RM_EMIF_DMM_CONTEXT, RM_EMIF_EMIF1_CONTEXT,
+ * RM_EMIF_EMIF2_CONTEXT, RM_EMIF_EMIF_OCP_FW_CONTEXT, RM_IPU_IPU_CONTEXT,
+ * RM_L3INIT_HSI_CONTEXT, RM_L3INIT_MMC1_CONTEXT, RM_L3INIT_MMC2_CONTEXT,
+ * RM_L3INIT_USB_HOST_HS_CONTEXT, RM_L3INIT_USB_OTG_SS_CONTEXT,
+ * RM_L3INIT_USB_TLL_HS_CONTEXT, RM_L3INSTR_L3_MAIN_3_CONTEXT,
+ * RM_L3INSTR_OCP_WP_NOC_CONTEXT, RM_L3MAIN1_L3_MAIN_1_CONTEXT,
+ * RM_L3MAIN2_GPMC_CONTEXT, RM_L3MAIN2_L3_MAIN_2_CONTEXT,
+ * RM_L4CFG_L4_CFG_CONTEXT, RM_L4CFG_MAILBOX_CONTEXT,
+ * RM_L4CFG_SPINLOCK_CONTEXT, RM_L4PER_GPIO2_CONTEXT, RM_L4PER_GPIO3_CONTEXT,
+ * RM_L4PER_GPIO4_CONTEXT, RM_L4PER_GPIO5_CONTEXT, RM_L4PER_GPIO6_CONTEXT,
+ * RM_L4PER_GPIO7_CONTEXT, RM_L4PER_GPIO8_CONTEXT, RM_L4PER_I2C1_CONTEXT,
+ * RM_L4PER_L4_PER_CONTEXT, RM_L4PER_UART1_CONTEXT, RM_L4PER_UART2_CONTEXT,
+ * RM_L4PER_UART3_CONTEXT, RM_L4PER_UART4_CONTEXT, RM_L4PER_UART5_CONTEXT,
+ * RM_L4PER_UART6_CONTEXT, RM_L4SEC_AES1_CONTEXT, RM_L4SEC_AES2_CONTEXT,
+ * RM_L4SEC_DES3DES_CONTEXT, RM_L4SEC_DMA_CRYPTO_CONTEXT, RM_L4SEC_RNG_CONTEXT,
+ * RM_L4SEC_SHA2MD5_CONTEXT, RM_MIPIEXT_LLI_CONTEXT,
+ * RM_MIPIEXT_LLI_OCP_FW_CONTEXT, RM_MIPIEXT_MPHY_CONTEXT, RM_MPU_MPU_CONTEXT
+ */
+#define OMAP54XX_LOSTCONTEXT_RFF_SHIFT                                         1
+#define OMAP54XX_LOSTCONTEXT_RFF_WIDTH                                         0x1
+#define OMAP54XX_LOSTCONTEXT_RFF_MASK                                          (1 << 1)
+
+/* Used by RM_ABE_AESS_CONTEXT */
+#define OMAP54XX_LOSTMEM_AESSMEM_SHIFT                                         8
+#define OMAP54XX_LOSTMEM_AESSMEM_WIDTH                                         0x1
+#define OMAP54XX_LOSTMEM_AESSMEM_MASK                                          (1 << 8)
+
+/* Used by RM_CAM_CAL_CONTEXT */
+#define OMAP54XX_LOSTMEM_CAL_MEM_SHIFT                                         8
+#define OMAP54XX_LOSTMEM_CAL_MEM_WIDTH                                         0x1
+#define OMAP54XX_LOSTMEM_CAL_MEM_MASK                                          (1 << 8)
+
+/* Used by RM_CAM_FDIF_CONTEXT, RM_CAM_ISS_CONTEXT */
+#define OMAP54XX_LOSTMEM_CAM_MEM_SHIFT                                         8
+#define OMAP54XX_LOSTMEM_CAM_MEM_WIDTH                                         0x1
+#define OMAP54XX_LOSTMEM_CAM_MEM_MASK                                          (1 << 8)
+
+/* Used by RM_EMIF_DMM_CONTEXT */
+#define OMAP54XX_LOSTMEM_CORE_NRET_BANK_SHIFT                                  9
+#define OMAP54XX_LOSTMEM_CORE_NRET_BANK_WIDTH                                  0x1
+#define OMAP54XX_LOSTMEM_CORE_NRET_BANK_MASK                                   (1 << 9)
+
+/* Renamed from LOSTMEM_CORE_NRET_BANK Used by RM_L3INSTR_OCP_WP_NOC_CONTEXT */
+#define OMAP54XX_LOSTMEM_CORE_NRET_BANK_8_8_SHIFT                              8
+#define OMAP54XX_LOSTMEM_CORE_NRET_BANK_8_8_WIDTH                              0x1
+#define OMAP54XX_LOSTMEM_CORE_NRET_BANK_8_8_MASK                               (1 << 8)
+
+/* Used by RM_L3MAIN2_OCMC_RAM_CONTEXT */
+#define OMAP54XX_LOSTMEM_CORE_OCMRAM_SHIFT                                     8
+#define OMAP54XX_LOSTMEM_CORE_OCMRAM_WIDTH                                     0x1
+#define OMAP54XX_LOSTMEM_CORE_OCMRAM_MASK                                      (1 << 8)
+
+/* Used by RM_DMA_DMA_SYSTEM_CONTEXT, RM_EMIF_DMM_CONTEXT */
+#define OMAP54XX_LOSTMEM_CORE_OTHER_BANK_SHIFT                                 8
+#define OMAP54XX_LOSTMEM_CORE_OTHER_BANK_WIDTH                                 0x1
+#define OMAP54XX_LOSTMEM_CORE_OTHER_BANK_MASK                                  (1 << 8)
+
+/* Used by RM_DSP_DSP_CONTEXT */
+#define OMAP54XX_LOSTMEM_DSP_EDMA_SHIFT                                                10
+#define OMAP54XX_LOSTMEM_DSP_EDMA_WIDTH                                                0x1
+#define OMAP54XX_LOSTMEM_DSP_EDMA_MASK                                         (1 << 10)
+
+/* Used by RM_DSP_DSP_CONTEXT */
+#define OMAP54XX_LOSTMEM_DSP_L1_SHIFT                                          8
+#define OMAP54XX_LOSTMEM_DSP_L1_WIDTH                                          0x1
+#define OMAP54XX_LOSTMEM_DSP_L1_MASK                                           (1 << 8)
+
+/* Used by RM_DSP_DSP_CONTEXT */
+#define OMAP54XX_LOSTMEM_DSP_L2_SHIFT                                          9
+#define OMAP54XX_LOSTMEM_DSP_L2_WIDTH                                          0x1
+#define OMAP54XX_LOSTMEM_DSP_L2_MASK                                           (1 << 9)
+
+/* Used by RM_DSS_BB2D_CONTEXT, RM_DSS_DSS_CONTEXT */
+#define OMAP54XX_LOSTMEM_DSS_MEM_SHIFT                                         8
+#define OMAP54XX_LOSTMEM_DSS_MEM_WIDTH                                         0x1
+#define OMAP54XX_LOSTMEM_DSS_MEM_MASK                                          (1 << 8)
+
+/* Used by RM_EMU_DEBUGSS_CONTEXT */
+#define OMAP54XX_LOSTMEM_EMU_BANK_SHIFT                                                8
+#define OMAP54XX_LOSTMEM_EMU_BANK_WIDTH                                                0x1
+#define OMAP54XX_LOSTMEM_EMU_BANK_MASK                                         (1 << 8)
+
+/* Used by RM_GPU_GPU_CONTEXT */
+#define OMAP54XX_LOSTMEM_GPU_MEM_SHIFT                                         8
+#define OMAP54XX_LOSTMEM_GPU_MEM_WIDTH                                         0x1
+#define OMAP54XX_LOSTMEM_GPU_MEM_MASK                                          (1 << 8)
+
+/* Used by RM_IVA_IVA_CONTEXT */
+#define OMAP54XX_LOSTMEM_HWA_MEM_SHIFT                                         10
+#define OMAP54XX_LOSTMEM_HWA_MEM_WIDTH                                         0x1
+#define OMAP54XX_LOSTMEM_HWA_MEM_MASK                                          (1 << 10)
+
+/* Used by RM_IPU_IPU_CONTEXT */
+#define OMAP54XX_LOSTMEM_IPU_L2RAM_SHIFT                                       9
+#define OMAP54XX_LOSTMEM_IPU_L2RAM_WIDTH                                       0x1
+#define OMAP54XX_LOSTMEM_IPU_L2RAM_MASK                                                (1 << 9)
+
+/* Used by RM_IPU_IPU_CONTEXT */
+#define OMAP54XX_LOSTMEM_IPU_UNICACHE_SHIFT                                    8
+#define OMAP54XX_LOSTMEM_IPU_UNICACHE_WIDTH                                    0x1
+#define OMAP54XX_LOSTMEM_IPU_UNICACHE_MASK                                     (1 << 8)
+
+/*
+ * Used by RM_L3INIT_HSI_CONTEXT, RM_L3INIT_MMC1_CONTEXT,
+ * RM_L3INIT_MMC2_CONTEXT, RM_L3INIT_SATA_CONTEXT, RM_L3INIT_UNIPRO2_CONTEXT,
+ * RM_L3INIT_USB_OTG_SS_CONTEXT
+ */
+#define OMAP54XX_LOSTMEM_L3INIT_BANK1_SHIFT                                    8
+#define OMAP54XX_LOSTMEM_L3INIT_BANK1_WIDTH                                    0x1
+#define OMAP54XX_LOSTMEM_L3INIT_BANK1_MASK                                     (1 << 8)
+
+/* Used by RM_MPU_MPU_CONTEXT */
+#define OMAP54XX_LOSTMEM_MPU_L2_SHIFT                                          9
+#define OMAP54XX_LOSTMEM_MPU_L2_WIDTH                                          0x1
+#define OMAP54XX_LOSTMEM_MPU_L2_MASK                                           (1 << 9)
+
+/* Used by RM_MPU_MPU_CONTEXT */
+#define OMAP54XX_LOSTMEM_MPU_RAM_SHIFT                                         10
+#define OMAP54XX_LOSTMEM_MPU_RAM_WIDTH                                         0x1
+#define OMAP54XX_LOSTMEM_MPU_RAM_MASK                                          (1 << 10)
+
+/*
+ * Used by RM_L4PER_MMC3_CONTEXT, RM_L4PER_MMC4_CONTEXT, RM_L4PER_MMC5_CONTEXT,
+ * RM_L4SEC_FPKA_CONTEXT
+ */
+#define OMAP54XX_LOSTMEM_NONRETAINED_BANK_SHIFT                                        8
+#define OMAP54XX_LOSTMEM_NONRETAINED_BANK_WIDTH                                        0x1
+#define OMAP54XX_LOSTMEM_NONRETAINED_BANK_MASK                                 (1 << 8)
+
+/*
+ * Used by RM_ABE_DMIC_CONTEXT, RM_ABE_MCBSP1_CONTEXT, RM_ABE_MCBSP2_CONTEXT,
+ * RM_ABE_MCBSP3_CONTEXT, RM_ABE_MCPDM_CONTEXT, RM_ABE_SLIMBUS1_CONTEXT
+ */
+#define OMAP54XX_LOSTMEM_PERIHPMEM_SHIFT                                       8
+#define OMAP54XX_LOSTMEM_PERIHPMEM_WIDTH                                       0x1
+#define OMAP54XX_LOSTMEM_PERIHPMEM_MASK                                                (1 << 8)
+
+/*
+ * Used by RM_L4PER_UART1_CONTEXT, RM_L4PER_UART2_CONTEXT,
+ * RM_L4PER_UART3_CONTEXT, RM_L4PER_UART4_CONTEXT, RM_L4PER_UART5_CONTEXT,
+ * RM_L4PER_UART6_CONTEXT, RM_L4SEC_DMA_CRYPTO_CONTEXT
+ */
+#define OMAP54XX_LOSTMEM_RETAINED_BANK_SHIFT                                   8
+#define OMAP54XX_LOSTMEM_RETAINED_BANK_WIDTH                                   0x1
+#define OMAP54XX_LOSTMEM_RETAINED_BANK_MASK                                    (1 << 8)
+
+/* Used by RM_IVA_SL2_CONTEXT */
+#define OMAP54XX_LOSTMEM_SL2_MEM_SHIFT                                         8
+#define OMAP54XX_LOSTMEM_SL2_MEM_WIDTH                                         0x1
+#define OMAP54XX_LOSTMEM_SL2_MEM_MASK                                          (1 << 8)
+
+/* Used by RM_IVA_IVA_CONTEXT */
+#define OMAP54XX_LOSTMEM_TCM1_MEM_SHIFT                                                8
+#define OMAP54XX_LOSTMEM_TCM1_MEM_WIDTH                                                0x1
+#define OMAP54XX_LOSTMEM_TCM1_MEM_MASK                                         (1 << 8)
+
+/* Used by RM_IVA_IVA_CONTEXT */
+#define OMAP54XX_LOSTMEM_TCM2_MEM_SHIFT                                                9
+#define OMAP54XX_LOSTMEM_TCM2_MEM_WIDTH                                                0x1
+#define OMAP54XX_LOSTMEM_TCM2_MEM_MASK                                         (1 << 9)
+
+/* Used by RM_WKUPAON_SAR_RAM_CONTEXT */
+#define OMAP54XX_LOSTMEM_WKUP_BANK_SHIFT                                       8
+#define OMAP54XX_LOSTMEM_WKUP_BANK_WIDTH                                       0x1
+#define OMAP54XX_LOSTMEM_WKUP_BANK_MASK                                                (1 << 8)
+
+/*
+ * Used by PM_ABE_PWRSTCTRL, PM_CAM_PWRSTCTRL, PM_CORE_PWRSTCTRL,
+ * PM_CUSTEFUSE_PWRSTCTRL, PM_DSP_PWRSTCTRL, PM_DSS_PWRSTCTRL,
+ * PM_GPU_PWRSTCTRL, PM_IVA_PWRSTCTRL, PM_L3INIT_PWRSTCTRL, PM_MPU_PWRSTCTRL
+ */
+#define OMAP54XX_LOWPOWERSTATECHANGE_SHIFT                                     4
+#define OMAP54XX_LOWPOWERSTATECHANGE_WIDTH                                     0x1
+#define OMAP54XX_LOWPOWERSTATECHANGE_MASK                                      (1 << 4)
+
+/* Used by PRM_DEBUG_TRANS_CFG */
+#define OMAP54XX_MODE_SHIFT                                                    0
+#define OMAP54XX_MODE_WIDTH                                                    0x2
+#define OMAP54XX_MODE_MASK                                                     (0x3 << 0)
+
+/* Used by PRM_MODEM_IF_CTRL */
+#define OMAP54XX_MODEM_SHUTDOWN_IRQ_SHIFT                                      9
+#define OMAP54XX_MODEM_SHUTDOWN_IRQ_WIDTH                                      0x1
+#define OMAP54XX_MODEM_SHUTDOWN_IRQ_MASK                                       (1 << 9)
+
+/* Used by PRM_MODEM_IF_CTRL */
+#define OMAP54XX_MODEM_WAKE_IRQ_SHIFT                                          8
+#define OMAP54XX_MODEM_WAKE_IRQ_WIDTH                                          0x1
+#define OMAP54XX_MODEM_WAKE_IRQ_MASK                                           (1 << 8)
+
+/* Used by PM_MPU_PWRSTCTRL */
+#define OMAP54XX_MPU_L2_ONSTATE_SHIFT                                          18
+#define OMAP54XX_MPU_L2_ONSTATE_WIDTH                                          0x2
+#define OMAP54XX_MPU_L2_ONSTATE_MASK                                           (0x3 << 18)
+
+/* Used by PM_MPU_PWRSTCTRL */
+#define OMAP54XX_MPU_L2_RETSTATE_SHIFT                                         9
+#define OMAP54XX_MPU_L2_RETSTATE_WIDTH                                         0x1
+#define OMAP54XX_MPU_L2_RETSTATE_MASK                                          (1 << 9)
+
+/* Used by PM_MPU_PWRSTST */
+#define OMAP54XX_MPU_L2_STATEST_SHIFT                                          6
+#define OMAP54XX_MPU_L2_STATEST_WIDTH                                          0x2
+#define OMAP54XX_MPU_L2_STATEST_MASK                                           (0x3 << 6)
+
+/* Used by PM_MPU_PWRSTCTRL */
+#define OMAP54XX_MPU_RAM_ONSTATE_SHIFT                                         20
+#define OMAP54XX_MPU_RAM_ONSTATE_WIDTH                                         0x2
+#define OMAP54XX_MPU_RAM_ONSTATE_MASK                                          (0x3 << 20)
+
+/* Used by PM_MPU_PWRSTCTRL */
+#define OMAP54XX_MPU_RAM_RETSTATE_SHIFT                                                10
+#define OMAP54XX_MPU_RAM_RETSTATE_WIDTH                                                0x1
+#define OMAP54XX_MPU_RAM_RETSTATE_MASK                                         (1 << 10)
+
+/* Used by PM_MPU_PWRSTST */
+#define OMAP54XX_MPU_RAM_STATEST_SHIFT                                         8
+#define OMAP54XX_MPU_RAM_STATEST_WIDTH                                         0x2
+#define OMAP54XX_MPU_RAM_STATEST_MASK                                          (0x3 << 8)
+
+/* Used by PRM_RSTST */
+#define OMAP54XX_MPU_SECURITY_VIOL_RST_SHIFT                                   2
+#define OMAP54XX_MPU_SECURITY_VIOL_RST_WIDTH                                   0x1
+#define OMAP54XX_MPU_SECURITY_VIOL_RST_MASK                                    (1 << 2)
+
+/* Used by PRM_RSTST */
+#define OMAP54XX_MPU_WDT_RST_SHIFT                                             3
+#define OMAP54XX_MPU_WDT_RST_WIDTH                                             0x1
+#define OMAP54XX_MPU_WDT_RST_MASK                                              (1 << 3)
+
+/* Used by PRM_ABBLDO_MM_SETUP, PRM_ABBLDO_MPU_SETUP */
+#define OMAP54XX_NOCAP_SHIFT                                                   4
+#define OMAP54XX_NOCAP_WIDTH                                                   0x1
+#define OMAP54XX_NOCAP_MASK                                                    (1 << 4)
+
+/* Used by PM_CORE_PWRSTCTRL */
+#define OMAP54XX_OCP_NRET_BANK_ONSTATE_SHIFT                                   24
+#define OMAP54XX_OCP_NRET_BANK_ONSTATE_WIDTH                                   0x2
+#define OMAP54XX_OCP_NRET_BANK_ONSTATE_MASK                                    (0x3 << 24)
+
+/* Used by PM_CORE_PWRSTCTRL */
+#define OMAP54XX_OCP_NRET_BANK_RETSTATE_SHIFT                                  12
+#define OMAP54XX_OCP_NRET_BANK_RETSTATE_WIDTH                                  0x1
+#define OMAP54XX_OCP_NRET_BANK_RETSTATE_MASK                                   (1 << 12)
+
+/* Used by PM_CORE_PWRSTST */
+#define OMAP54XX_OCP_NRET_BANK_STATEST_SHIFT                                   12
+#define OMAP54XX_OCP_NRET_BANK_STATEST_WIDTH                                   0x2
+#define OMAP54XX_OCP_NRET_BANK_STATEST_MASK                                    (0x3 << 12)
+
+/*
+ * Used by PRM_VC_VAL_CMD_VDD_CORE_L, PRM_VC_VAL_CMD_VDD_MM_L,
+ * PRM_VC_VAL_CMD_VDD_MPU_L
+ */
+#define OMAP54XX_OFF_SHIFT                                                     0
+#define OMAP54XX_OFF_WIDTH                                                     0x8
+#define OMAP54XX_OFF_MASK                                                      (0xff << 0)
+
+/*
+ * Used by PRM_VC_VAL_CMD_VDD_CORE_L, PRM_VC_VAL_CMD_VDD_MM_L,
+ * PRM_VC_VAL_CMD_VDD_MPU_L
+ */
+#define OMAP54XX_ON_SHIFT                                                      24
+#define OMAP54XX_ON_WIDTH                                                      0x8
+#define OMAP54XX_ON_MASK                                                       (0xff << 24)
+
+/*
+ * Used by PRM_VC_VAL_CMD_VDD_CORE_L, PRM_VC_VAL_CMD_VDD_MM_L,
+ * PRM_VC_VAL_CMD_VDD_MPU_L
+ */
+#define OMAP54XX_ONLP_SHIFT                                                    16
+#define OMAP54XX_ONLP_WIDTH                                                    0x8
+#define OMAP54XX_ONLP_MASK                                                     (0xff << 16)
+
+/* Used by PRM_ABBLDO_MM_CTRL, PRM_ABBLDO_MPU_CTRL */
+#define OMAP54XX_OPP_CHANGE_SHIFT                                              2
+#define OMAP54XX_OPP_CHANGE_WIDTH                                              0x1
+#define OMAP54XX_OPP_CHANGE_MASK                                               (1 << 2)
+
+/* Used by PRM_VC_VAL_BYPASS */
+#define OMAP54XX_OPP_CHANGE_EMIF_LVL_SHIFT                                     25
+#define OMAP54XX_OPP_CHANGE_EMIF_LVL_WIDTH                                     0x1
+#define OMAP54XX_OPP_CHANGE_EMIF_LVL_MASK                                      (1 << 25)
+
+/* Used by PRM_ABBLDO_MM_CTRL, PRM_ABBLDO_MPU_CTRL */
+#define OMAP54XX_OPP_SEL_SHIFT                                                 0
+#define OMAP54XX_OPP_SEL_WIDTH                                                 0x2
+#define OMAP54XX_OPP_SEL_MASK                                                  (0x3 << 0)
+
+/* Used by PRM_DEBUG_OUT */
+#define OMAP54XX_OUTPUT_SHIFT                                                  0
+#define OMAP54XX_OUTPUT_WIDTH                                                  0x20
+#define OMAP54XX_OUTPUT_MASK                                                   (0xffffffff << 0)
+
+/* Used by PRM_SRAM_COUNT */
+#define OMAP54XX_PCHARGECNT_VALUE_SHIFT                                                0
+#define OMAP54XX_PCHARGECNT_VALUE_WIDTH                                                0x6
+#define OMAP54XX_PCHARGECNT_VALUE_MASK                                         (0x3f << 0)
+
+/* Used by PRM_PSCON_COUNT */
+#define OMAP54XX_PCHARGE_TIME_SHIFT                                            0
+#define OMAP54XX_PCHARGE_TIME_WIDTH                                            0x8
+#define OMAP54XX_PCHARGE_TIME_MASK                                             (0xff << 0)
+
+/* Used by PM_ABE_PWRSTCTRL */
+#define OMAP54XX_PERIPHMEM_ONSTATE_SHIFT                                       20
+#define OMAP54XX_PERIPHMEM_ONSTATE_WIDTH                                       0x2
+#define OMAP54XX_PERIPHMEM_ONSTATE_MASK                                                (0x3 << 20)
+
+/* Used by PM_ABE_PWRSTCTRL */
+#define OMAP54XX_PERIPHMEM_RETSTATE_SHIFT                                      10
+#define OMAP54XX_PERIPHMEM_RETSTATE_WIDTH                                      0x1
+#define OMAP54XX_PERIPHMEM_RETSTATE_MASK                                       (1 << 10)
+
+/* Used by PM_ABE_PWRSTST */
+#define OMAP54XX_PERIPHMEM_STATEST_SHIFT                                       8
+#define OMAP54XX_PERIPHMEM_STATEST_WIDTH                                       0x2
+#define OMAP54XX_PERIPHMEM_STATEST_MASK                                                (0x3 << 8)
+
+/* Used by PRM_PHASE1_CNDP */
+#define OMAP54XX_PHASE1_CNDP_SHIFT                                             0
+#define OMAP54XX_PHASE1_CNDP_WIDTH                                             0x20
+#define OMAP54XX_PHASE1_CNDP_MASK                                              (0xffffffff << 0)
+
+/* Used by PRM_PHASE2A_CNDP */
+#define OMAP54XX_PHASE2A_CNDP_SHIFT                                            0
+#define OMAP54XX_PHASE2A_CNDP_WIDTH                                            0x20
+#define OMAP54XX_PHASE2A_CNDP_MASK                                             (0xffffffff << 0)
+
+/* Used by PRM_PHASE2B_CNDP */
+#define OMAP54XX_PHASE2B_CNDP_SHIFT                                            0
+#define OMAP54XX_PHASE2B_CNDP_WIDTH                                            0x20
+#define OMAP54XX_PHASE2B_CNDP_MASK                                             (0xffffffff << 0)
+
+/* Used by PRM_PSCON_COUNT */
+#define OMAP54XX_PONOUT_2_PGOODIN_TIME_SHIFT                                   8
+#define OMAP54XX_PONOUT_2_PGOODIN_TIME_WIDTH                                   0x8
+#define OMAP54XX_PONOUT_2_PGOODIN_TIME_MASK                                    (0xff << 8)
+
+/*
+ * Used by PM_ABE_PWRSTCTRL, PM_CAM_PWRSTCTRL, PM_CORE_PWRSTCTRL,
+ * PM_CUSTEFUSE_PWRSTCTRL, PM_DSP_PWRSTCTRL, PM_DSS_PWRSTCTRL,
+ * PM_EMU_PWRSTCTRL, PM_GPU_PWRSTCTRL, PM_IVA_PWRSTCTRL, PM_L3INIT_PWRSTCTRL,
+ * PM_MPU_PWRSTCTRL
+ */
+#define OMAP54XX_POWERSTATE_SHIFT                                              0
+#define OMAP54XX_POWERSTATE_WIDTH                                              0x2
+#define OMAP54XX_POWERSTATE_MASK                                               (0x3 << 0)
+
+/*
+ * Used by PM_ABE_PWRSTST, PM_CAM_PWRSTST, PM_CORE_PWRSTST,
+ * PM_CUSTEFUSE_PWRSTST, PM_DSP_PWRSTST, PM_DSS_PWRSTST, PM_EMU_PWRSTST,
+ * PM_GPU_PWRSTST, PM_IVA_PWRSTST, PM_L3INIT_PWRSTST, PM_MPU_PWRSTST
+ */
+#define OMAP54XX_POWERSTATEST_SHIFT                                            0
+#define OMAP54XX_POWERSTATEST_WIDTH                                            0x2
+#define OMAP54XX_POWERSTATEST_MASK                                             (0x3 << 0)
+
+/* Used by PRM_PWRREQCTRL */
+#define OMAP54XX_PWRREQ_COND_SHIFT                                             0
+#define OMAP54XX_PWRREQ_COND_WIDTH                                             0x2
+#define OMAP54XX_PWRREQ_COND_MASK                                              (0x3 << 0)
+
+/* Used by PRM_VC_SMPS_CORE_CONFIG */
+#define OMAP54XX_RACEN_VDD_CORE_L_SHIFT                                                27
+#define OMAP54XX_RACEN_VDD_CORE_L_WIDTH                                                0x1
+#define OMAP54XX_RACEN_VDD_CORE_L_MASK                                         (1 << 27)
+
+/* Used by PRM_VC_SMPS_MM_CONFIG */
+#define OMAP54XX_RACEN_VDD_MM_L_SHIFT                                          27
+#define OMAP54XX_RACEN_VDD_MM_L_WIDTH                                          0x1
+#define OMAP54XX_RACEN_VDD_MM_L_MASK                                           (1 << 27)
+
+/* Used by PRM_VC_SMPS_MPU_CONFIG */
+#define OMAP54XX_RACEN_VDD_MPU_L_SHIFT                                         27
+#define OMAP54XX_RACEN_VDD_MPU_L_WIDTH                                         0x1
+#define OMAP54XX_RACEN_VDD_MPU_L_MASK                                          (1 << 27)
+
+/* Used by PRM_VC_SMPS_CORE_CONFIG */
+#define OMAP54XX_RAC_VDD_CORE_L_SHIFT                                          26
+#define OMAP54XX_RAC_VDD_CORE_L_WIDTH                                          0x1
+#define OMAP54XX_RAC_VDD_CORE_L_MASK                                           (1 << 26)
+
+/* Used by PRM_VC_SMPS_MM_CONFIG */
+#define OMAP54XX_RAC_VDD_MM_L_SHIFT                                            26
+#define OMAP54XX_RAC_VDD_MM_L_WIDTH                                            0x1
+#define OMAP54XX_RAC_VDD_MM_L_MASK                                             (1 << 26)
+
+/* Used by PRM_VC_SMPS_MPU_CONFIG */
+#define OMAP54XX_RAC_VDD_MPU_L_SHIFT                                           26
+#define OMAP54XX_RAC_VDD_MPU_L_WIDTH                                           0x1
+#define OMAP54XX_RAC_VDD_MPU_L_MASK                                            (1 << 26)
+
+/*
+ * Used by PRM_VOLTSETUP_CORE_OFF, PRM_VOLTSETUP_CORE_RET_SLEEP,
+ * PRM_VOLTSETUP_MM_OFF, PRM_VOLTSETUP_MM_RET_SLEEP, PRM_VOLTSETUP_MPU_OFF,
+ * PRM_VOLTSETUP_MPU_RET_SLEEP
+ */
+#define OMAP54XX_RAMP_DOWN_COUNT_SHIFT                                         16
+#define OMAP54XX_RAMP_DOWN_COUNT_WIDTH                                         0x6
+#define OMAP54XX_RAMP_DOWN_COUNT_MASK                                          (0x3f << 16)
+
+/*
+ * Used by PRM_VOLTSETUP_CORE_OFF, PRM_VOLTSETUP_CORE_RET_SLEEP,
+ * PRM_VOLTSETUP_MM_OFF, PRM_VOLTSETUP_MM_RET_SLEEP, PRM_VOLTSETUP_MPU_OFF,
+ * PRM_VOLTSETUP_MPU_RET_SLEEP
+ */
+#define OMAP54XX_RAMP_DOWN_PRESCAL_SHIFT                                       24
+#define OMAP54XX_RAMP_DOWN_PRESCAL_WIDTH                                       0x2
+#define OMAP54XX_RAMP_DOWN_PRESCAL_MASK                                                (0x3 << 24)
+
+/*
+ * Used by PRM_VOLTSETUP_CORE_OFF, PRM_VOLTSETUP_CORE_RET_SLEEP,
+ * PRM_VOLTSETUP_MM_OFF, PRM_VOLTSETUP_MM_RET_SLEEP, PRM_VOLTSETUP_MPU_OFF,
+ * PRM_VOLTSETUP_MPU_RET_SLEEP
+ */
+#define OMAP54XX_RAMP_UP_COUNT_SHIFT                                           0
+#define OMAP54XX_RAMP_UP_COUNT_WIDTH                                           0x6
+#define OMAP54XX_RAMP_UP_COUNT_MASK                                            (0x3f << 0)
+
+/*
+ * Used by PRM_VOLTSETUP_CORE_OFF, PRM_VOLTSETUP_CORE_RET_SLEEP,
+ * PRM_VOLTSETUP_MM_OFF, PRM_VOLTSETUP_MM_RET_SLEEP, PRM_VOLTSETUP_MPU_OFF,
+ * PRM_VOLTSETUP_MPU_RET_SLEEP
+ */
+#define OMAP54XX_RAMP_UP_PRESCAL_SHIFT                                         8
+#define OMAP54XX_RAMP_UP_PRESCAL_WIDTH                                         0x2
+#define OMAP54XX_RAMP_UP_PRESCAL_MASK                                          (0x3 << 8)
+
+/* Used by PRM_VC_SMPS_CORE_CONFIG */
+#define OMAP54XX_RAV_VDD_CORE_L_SHIFT                                          25
+#define OMAP54XX_RAV_VDD_CORE_L_WIDTH                                          0x1
+#define OMAP54XX_RAV_VDD_CORE_L_MASK                                           (1 << 25)
+
+/* Used by PRM_VC_SMPS_MM_CONFIG */
+#define OMAP54XX_RAV_VDD_MM_L_SHIFT                                            25
+#define OMAP54XX_RAV_VDD_MM_L_WIDTH                                            0x1
+#define OMAP54XX_RAV_VDD_MM_L_MASK                                             (1 << 25)
+
+/* Used by PRM_VC_SMPS_MPU_CONFIG */
+#define OMAP54XX_RAV_VDD_MPU_L_SHIFT                                           25
+#define OMAP54XX_RAV_VDD_MPU_L_WIDTH                                           0x1
+#define OMAP54XX_RAV_VDD_MPU_L_MASK                                            (1 << 25)
+
+/* Used by PRM_VC_VAL_BYPASS */
+#define OMAP54XX_REGADDR_SHIFT                                                 8
+#define OMAP54XX_REGADDR_WIDTH                                                 0x8
+#define OMAP54XX_REGADDR_MASK                                                  (0xff << 8)
+
+/*
+ * Used by PRM_VC_VAL_CMD_VDD_CORE_L, PRM_VC_VAL_CMD_VDD_MM_L,
+ * PRM_VC_VAL_CMD_VDD_MPU_L
+ */
+#define OMAP54XX_RET_SHIFT                                                     8
+#define OMAP54XX_RET_WIDTH                                                     0x8
+#define OMAP54XX_RET_MASK                                                      (0xff << 8)
+
+/* Used by PRM_SLDO_CORE_CTRL, PRM_SLDO_MM_CTRL, PRM_SLDO_MPU_CTRL */
+#define OMAP54XX_RETMODE_ENABLE_SHIFT                                          0
+#define OMAP54XX_RETMODE_ENABLE_WIDTH                                          0x1
+#define OMAP54XX_RETMODE_ENABLE_MASK                                           (1 << 0)
+
+/* Used by PRM_RSTTIME */
+#define OMAP54XX_RSTTIME1_SHIFT                                                        0
+#define OMAP54XX_RSTTIME1_WIDTH                                                        0xa
+#define OMAP54XX_RSTTIME1_MASK                                                 (0x3ff << 0)
+
+/* Used by PRM_RSTTIME */
+#define OMAP54XX_RSTTIME2_SHIFT                                                        10
+#define OMAP54XX_RSTTIME2_WIDTH                                                        0x5
+#define OMAP54XX_RSTTIME2_MASK                                                 (0x1f << 10)
+
+/* Used by RM_IPU_RSTCTRL, RM_IPU_RSTST */
+#define OMAP54XX_RST_CPU0_SHIFT                                                        0
+#define OMAP54XX_RST_CPU0_WIDTH                                                        0x1
+#define OMAP54XX_RST_CPU0_MASK                                                 (1 << 0)
+
+/* Used by RM_IPU_RSTCTRL, RM_IPU_RSTST */
+#define OMAP54XX_RST_CPU1_SHIFT                                                        1
+#define OMAP54XX_RST_CPU1_WIDTH                                                        0x1
+#define OMAP54XX_RST_CPU1_MASK                                                 (1 << 1)
+
+/* Used by RM_DSP_RSTCTRL, RM_DSP_RSTST */
+#define OMAP54XX_RST_DSP_SHIFT                                                 0
+#define OMAP54XX_RST_DSP_WIDTH                                                 0x1
+#define OMAP54XX_RST_DSP_MASK                                                  (1 << 0)
+
+/* Used by RM_DSP_RSTST */
+#define OMAP54XX_RST_DSP_EMU_SHIFT                                             2
+#define OMAP54XX_RST_DSP_EMU_WIDTH                                             0x1
+#define OMAP54XX_RST_DSP_EMU_MASK                                              (1 << 2)
+
+/* Used by RM_DSP_RSTST */
+#define OMAP54XX_RST_DSP_EMU_REQ_SHIFT                                         3
+#define OMAP54XX_RST_DSP_EMU_REQ_WIDTH                                         0x1
+#define OMAP54XX_RST_DSP_EMU_REQ_MASK                                          (1 << 3)
+
+/* Used by RM_DSP_RSTCTRL, RM_DSP_RSTST */
+#define OMAP54XX_RST_DSP_MMU_CACHE_SHIFT                                       1
+#define OMAP54XX_RST_DSP_MMU_CACHE_WIDTH                                       0x1
+#define OMAP54XX_RST_DSP_MMU_CACHE_MASK                                                (1 << 1)
+
+/* Used by RM_IPU_RSTST */
+#define OMAP54XX_RST_EMULATION_CPU0_SHIFT                                      3
+#define OMAP54XX_RST_EMULATION_CPU0_WIDTH                                      0x1
+#define OMAP54XX_RST_EMULATION_CPU0_MASK                                       (1 << 3)
+
+/* Used by RM_IPU_RSTST */
+#define OMAP54XX_RST_EMULATION_CPU1_SHIFT                                      4
+#define OMAP54XX_RST_EMULATION_CPU1_WIDTH                                      0x1
+#define OMAP54XX_RST_EMULATION_CPU1_MASK                                       (1 << 4)
+
+/* Used by RM_IVA_RSTST */
+#define OMAP54XX_RST_EMULATION_SEQ1_SHIFT                                      3
+#define OMAP54XX_RST_EMULATION_SEQ1_WIDTH                                      0x1
+#define OMAP54XX_RST_EMULATION_SEQ1_MASK                                       (1 << 3)
+
+/* Used by RM_IVA_RSTST */
+#define OMAP54XX_RST_EMULATION_SEQ2_SHIFT                                      4
+#define OMAP54XX_RST_EMULATION_SEQ2_WIDTH                                      0x1
+#define OMAP54XX_RST_EMULATION_SEQ2_MASK                                       (1 << 4)
+
+/* Used by PRM_RSTCTRL */
+#define OMAP54XX_RST_GLOBAL_COLD_SW_SHIFT                                      1
+#define OMAP54XX_RST_GLOBAL_COLD_SW_WIDTH                                      0x1
+#define OMAP54XX_RST_GLOBAL_COLD_SW_MASK                                       (1 << 1)
+
+/* Used by PRM_RSTCTRL */
+#define OMAP54XX_RST_GLOBAL_WARM_SW_SHIFT                                      0
+#define OMAP54XX_RST_GLOBAL_WARM_SW_WIDTH                                      0x1
+#define OMAP54XX_RST_GLOBAL_WARM_SW_MASK                                       (1 << 0)
+
+/* Used by RM_IPU_RSTST */
+#define OMAP54XX_RST_ICECRUSHER_CPU0_SHIFT                                     5
+#define OMAP54XX_RST_ICECRUSHER_CPU0_WIDTH                                     0x1
+#define OMAP54XX_RST_ICECRUSHER_CPU0_MASK                                      (1 << 5)
+
+/* Used by RM_IPU_RSTST */
+#define OMAP54XX_RST_ICECRUSHER_CPU1_SHIFT                                     6
+#define OMAP54XX_RST_ICECRUSHER_CPU1_WIDTH                                     0x1
+#define OMAP54XX_RST_ICECRUSHER_CPU1_MASK                                      (1 << 6)
+
+/* Used by RM_IVA_RSTST */
+#define OMAP54XX_RST_ICECRUSHER_SEQ1_SHIFT                                     5
+#define OMAP54XX_RST_ICECRUSHER_SEQ1_WIDTH                                     0x1
+#define OMAP54XX_RST_ICECRUSHER_SEQ1_MASK                                      (1 << 5)
+
+/* Used by RM_IVA_RSTST */
+#define OMAP54XX_RST_ICECRUSHER_SEQ2_SHIFT                                     6
+#define OMAP54XX_RST_ICECRUSHER_SEQ2_WIDTH                                     0x1
+#define OMAP54XX_RST_ICECRUSHER_SEQ2_MASK                                      (1 << 6)
+
+/* Used by RM_IPU_RSTCTRL, RM_IPU_RSTST */
+#define OMAP54XX_RST_IPU_MMU_CACHE_SHIFT                                       2
+#define OMAP54XX_RST_IPU_MMU_CACHE_WIDTH                                       0x1
+#define OMAP54XX_RST_IPU_MMU_CACHE_MASK                                                (1 << 2)
+
+/* Used by RM_IVA_RSTCTRL, RM_IVA_RSTST */
+#define OMAP54XX_RST_LOGIC_SHIFT                                               2
+#define OMAP54XX_RST_LOGIC_WIDTH                                               0x1
+#define OMAP54XX_RST_LOGIC_MASK                                                        (1 << 2)
+
+/* Used by RM_IVA_RSTCTRL, RM_IVA_RSTST */
+#define OMAP54XX_RST_SEQ1_SHIFT                                                        0
+#define OMAP54XX_RST_SEQ1_WIDTH                                                        0x1
+#define OMAP54XX_RST_SEQ1_MASK                                                 (1 << 0)
+
+/* Used by RM_IVA_RSTCTRL, RM_IVA_RSTST */
+#define OMAP54XX_RST_SEQ2_SHIFT                                                        1
+#define OMAP54XX_RST_SEQ2_WIDTH                                                        0x1
+#define OMAP54XX_RST_SEQ2_MASK                                                 (1 << 1)
+
+/* Used by REVISION_PRM */
+#define OMAP54XX_R_RTL_SHIFT                                                   11
+#define OMAP54XX_R_RTL_WIDTH                                                   0x5
+#define OMAP54XX_R_RTL_MASK                                                    (0x1f << 11)
+
+/* Used by PRM_VC_SMPS_CORE_CONFIG */
+#define OMAP54XX_SA_VDD_CORE_L_SHIFT                                           0
+#define OMAP54XX_SA_VDD_CORE_L_WIDTH                                           0x7
+#define OMAP54XX_SA_VDD_CORE_L_MASK                                            (0x7f << 0)
+
+/* Used by PRM_VC_SMPS_MM_CONFIG */
+#define OMAP54XX_SA_VDD_MM_L_SHIFT                                             0
+#define OMAP54XX_SA_VDD_MM_L_WIDTH                                             0x7
+#define OMAP54XX_SA_VDD_MM_L_MASK                                              (0x7f << 0)
+
+/* Used by PRM_VC_SMPS_MPU_CONFIG */
+#define OMAP54XX_SA_VDD_MPU_L_SHIFT                                            0
+#define OMAP54XX_SA_VDD_MPU_L_WIDTH                                            0x7
+#define OMAP54XX_SA_VDD_MPU_L_MASK                                             (0x7f << 0)
+
+/* Used by REVISION_PRM */
+#define OMAP54XX_SCHEME_SHIFT                                                  30
+#define OMAP54XX_SCHEME_WIDTH                                                  0x2
+#define OMAP54XX_SCHEME_MASK                                                   (0x3 << 30)
+
+/* Used by PRM_VC_CFG_I2C_CLK */
+#define OMAP54XX_SCLH_SHIFT                                                    0
+#define OMAP54XX_SCLH_WIDTH                                                    0x8
+#define OMAP54XX_SCLH_MASK                                                     (0xff << 0)
+
+/* Used by PRM_VC_CFG_I2C_CLK */
+#define OMAP54XX_SCLL_SHIFT                                                    8
+#define OMAP54XX_SCLL_WIDTH                                                    0x8
+#define OMAP54XX_SCLL_MASK                                                     (0xff << 8)
+
+/* Used by PRM_RSTST */
+#define OMAP54XX_SECURE_WDT_RST_SHIFT                                          4
+#define OMAP54XX_SECURE_WDT_RST_WIDTH                                          0x1
+#define OMAP54XX_SECURE_WDT_RST_MASK                                           (1 << 4)
+
+/* Used by PRM_VC_SMPS_CORE_CONFIG */
+#define OMAP54XX_SEL_SA_VDD_CORE_L_SHIFT                                       24
+#define OMAP54XX_SEL_SA_VDD_CORE_L_WIDTH                                       0x1
+#define OMAP54XX_SEL_SA_VDD_CORE_L_MASK                                                (1 << 24)
+
+/* Used by PRM_VC_SMPS_MM_CONFIG */
+#define OMAP54XX_SEL_SA_VDD_MM_L_SHIFT                                         24
+#define OMAP54XX_SEL_SA_VDD_MM_L_WIDTH                                         0x1
+#define OMAP54XX_SEL_SA_VDD_MM_L_MASK                                          (1 << 24)
+
+/* Used by PRM_VC_SMPS_MPU_CONFIG */
+#define OMAP54XX_SEL_SA_VDD_MPU_L_SHIFT                                                24
+#define OMAP54XX_SEL_SA_VDD_MPU_L_WIDTH                                                0x1
+#define OMAP54XX_SEL_SA_VDD_MPU_L_MASK                                         (1 << 24)
+
+/* Used by PM_IVA_PWRSTCTRL */
+#define OMAP54XX_SL2_MEM_ONSTATE_SHIFT                                         18
+#define OMAP54XX_SL2_MEM_ONSTATE_WIDTH                                         0x2
+#define OMAP54XX_SL2_MEM_ONSTATE_MASK                                          (0x3 << 18)
+
+/* Used by PM_IVA_PWRSTCTRL */
+#define OMAP54XX_SL2_MEM_RETSTATE_SHIFT                                                9
+#define OMAP54XX_SL2_MEM_RETSTATE_WIDTH                                                0x1
+#define OMAP54XX_SL2_MEM_RETSTATE_MASK                                         (1 << 9)
+
+/* Used by PM_IVA_PWRSTST */
+#define OMAP54XX_SL2_MEM_STATEST_SHIFT                                         6
+#define OMAP54XX_SL2_MEM_STATEST_WIDTH                                         0x2
+#define OMAP54XX_SL2_MEM_STATEST_MASK                                          (0x3 << 6)
+
+/* Used by PRM_VC_VAL_BYPASS */
+#define OMAP54XX_SLAVEADDR_SHIFT                                               0
+#define OMAP54XX_SLAVEADDR_WIDTH                                               0x7
+#define OMAP54XX_SLAVEADDR_MASK                                                        (0x7f << 0)
+
+/* Used by PRM_SRAM_COUNT */
+#define OMAP54XX_SLPCNT_VALUE_SHIFT                                            16
+#define OMAP54XX_SLPCNT_VALUE_WIDTH                                            0x8
+#define OMAP54XX_SLPCNT_VALUE_MASK                                             (0xff << 16)
+
+/* Used by PRM_VP_CORE_VSTEPMAX, PRM_VP_MM_VSTEPMAX, PRM_VP_MPU_VSTEPMAX */
+#define OMAP54XX_SMPSWAITTIMEMAX_SHIFT                                         8
+#define OMAP54XX_SMPSWAITTIMEMAX_WIDTH                                         0x10
+#define OMAP54XX_SMPSWAITTIMEMAX_MASK                                          (0xffff << 8)
+
+/* Used by PRM_VP_CORE_VSTEPMIN, PRM_VP_MM_VSTEPMIN, PRM_VP_MPU_VSTEPMIN */
+#define OMAP54XX_SMPSWAITTIMEMIN_SHIFT                                         8
+#define OMAP54XX_SMPSWAITTIMEMIN_WIDTH                                         0x10
+#define OMAP54XX_SMPSWAITTIMEMIN_MASK                                          (0xffff << 8)
+
+/* Used by PRM_VC_CORE_ERRST */
+#define OMAP54XX_SMPS_RA_ERR_CORE_SHIFT                                                1
+#define OMAP54XX_SMPS_RA_ERR_CORE_WIDTH                                                0x1
+#define OMAP54XX_SMPS_RA_ERR_CORE_MASK                                         (1 << 1)
+
+/* Used by PRM_VC_MM_ERRST */
+#define OMAP54XX_SMPS_RA_ERR_MM_SHIFT                                          1
+#define OMAP54XX_SMPS_RA_ERR_MM_WIDTH                                          0x1
+#define OMAP54XX_SMPS_RA_ERR_MM_MASK                                           (1 << 1)
+
+/* Used by PRM_VC_MPU_ERRST */
+#define OMAP54XX_SMPS_RA_ERR_MPU_SHIFT                                         1
+#define OMAP54XX_SMPS_RA_ERR_MPU_WIDTH                                         0x1
+#define OMAP54XX_SMPS_RA_ERR_MPU_MASK                                          (1 << 1)
+
+/* Used by PRM_VC_CORE_ERRST */
+#define OMAP54XX_SMPS_SA_ERR_CORE_SHIFT                                                0
+#define OMAP54XX_SMPS_SA_ERR_CORE_WIDTH                                                0x1
+#define OMAP54XX_SMPS_SA_ERR_CORE_MASK                                         (1 << 0)
+
+/* Used by PRM_VC_MM_ERRST */
+#define OMAP54XX_SMPS_SA_ERR_MM_SHIFT                                          0
+#define OMAP54XX_SMPS_SA_ERR_MM_WIDTH                                          0x1
+#define OMAP54XX_SMPS_SA_ERR_MM_MASK                                           (1 << 0)
+
+/* Used by PRM_VC_MPU_ERRST */
+#define OMAP54XX_SMPS_SA_ERR_MPU_SHIFT                                         0
+#define OMAP54XX_SMPS_SA_ERR_MPU_WIDTH                                         0x1
+#define OMAP54XX_SMPS_SA_ERR_MPU_MASK                                          (1 << 0)
+
+/* Used by PRM_VC_CORE_ERRST */
+#define OMAP54XX_SMPS_TIMEOUT_ERR_CORE_SHIFT                                   2
+#define OMAP54XX_SMPS_TIMEOUT_ERR_CORE_WIDTH                                   0x1
+#define OMAP54XX_SMPS_TIMEOUT_ERR_CORE_MASK                                    (1 << 2)
+
+/* Used by PRM_VC_MM_ERRST */
+#define OMAP54XX_SMPS_TIMEOUT_ERR_MM_SHIFT                                     2
+#define OMAP54XX_SMPS_TIMEOUT_ERR_MM_WIDTH                                     0x1
+#define OMAP54XX_SMPS_TIMEOUT_ERR_MM_MASK                                      (1 << 2)
+
+/* Used by PRM_VC_MPU_ERRST */
+#define OMAP54XX_SMPS_TIMEOUT_ERR_MPU_SHIFT                                    2
+#define OMAP54XX_SMPS_TIMEOUT_ERR_MPU_WIDTH                                    0x1
+#define OMAP54XX_SMPS_TIMEOUT_ERR_MPU_MASK                                     (1 << 2)
+
+/* Used by PRM_ABBLDO_MM_SETUP, PRM_ABBLDO_MPU_SETUP */
+#define OMAP54XX_SR2EN_SHIFT                                                   0
+#define OMAP54XX_SR2EN_WIDTH                                                   0x1
+#define OMAP54XX_SR2EN_MASK                                                    (1 << 0)
+
+/* Used by PRM_ABBLDO_MM_CTRL, PRM_ABBLDO_MPU_CTRL */
+#define OMAP54XX_SR2_IN_TRANSITION_SHIFT                                       6
+#define OMAP54XX_SR2_IN_TRANSITION_WIDTH                                       0x1
+#define OMAP54XX_SR2_IN_TRANSITION_MASK                                                (1 << 6)
+
+/* Used by PRM_ABBLDO_MM_CTRL, PRM_ABBLDO_MPU_CTRL */
+#define OMAP54XX_SR2_STATUS_SHIFT                                              3
+#define OMAP54XX_SR2_STATUS_WIDTH                                              0x2
+#define OMAP54XX_SR2_STATUS_MASK                                               (0x3 << 3)
+
+/* Used by PRM_ABBLDO_MM_SETUP, PRM_ABBLDO_MPU_SETUP */
+#define OMAP54XX_SR2_WTCNT_VALUE_SHIFT                                         8
+#define OMAP54XX_SR2_WTCNT_VALUE_WIDTH                                         0x8
+#define OMAP54XX_SR2_WTCNT_VALUE_MASK                                          (0xff << 8)
+
+/* Used by PRM_SLDO_CORE_CTRL, PRM_SLDO_MM_CTRL, PRM_SLDO_MPU_CTRL */
+#define OMAP54XX_SRAMLDO_STATUS_SHIFT                                          8
+#define OMAP54XX_SRAMLDO_STATUS_WIDTH                                          0x1
+#define OMAP54XX_SRAMLDO_STATUS_MASK                                           (1 << 8)
+
+/* Used by PRM_SLDO_CORE_CTRL, PRM_SLDO_MM_CTRL, PRM_SLDO_MPU_CTRL */
+#define OMAP54XX_SRAM_IN_TRANSITION_SHIFT                                      9
+#define OMAP54XX_SRAM_IN_TRANSITION_WIDTH                                      0x1
+#define OMAP54XX_SRAM_IN_TRANSITION_MASK                                       (1 << 9)
+
+/* Used by PRM_VC_CFG_I2C_MODE */
+#define OMAP54XX_SRMODEEN_SHIFT                                                        4
+#define OMAP54XX_SRMODEEN_WIDTH                                                        0x1
+#define OMAP54XX_SRMODEEN_MASK                                                 (1 << 4)
+
+/* Used by PRM_VOLTSETUP_WARMRESET */
+#define OMAP54XX_STABLE_COUNT_SHIFT                                            0
+#define OMAP54XX_STABLE_COUNT_WIDTH                                            0x6
+#define OMAP54XX_STABLE_COUNT_MASK                                             (0x3f << 0)
+
+/* Used by PRM_VOLTSETUP_WARMRESET */
+#define OMAP54XX_STABLE_PRESCAL_SHIFT                                          8
+#define OMAP54XX_STABLE_PRESCAL_WIDTH                                          0x2
+#define OMAP54XX_STABLE_PRESCAL_MASK                                           (0x3 << 8)
+
+/* Used by PRM_BANDGAP_SETUP */
+#define OMAP54XX_STARTUP_COUNT_SHIFT                                           0
+#define OMAP54XX_STARTUP_COUNT_WIDTH                                           0x8
+#define OMAP54XX_STARTUP_COUNT_MASK                                            (0xff << 0)
+
+/* Renamed from STARTUP_COUNT Used by PRM_SRAM_COUNT */
+#define OMAP54XX_STARTUP_COUNT_24_31_SHIFT                                     24
+#define OMAP54XX_STARTUP_COUNT_24_31_WIDTH                                     0x8
+#define OMAP54XX_STARTUP_COUNT_24_31_MASK                                      (0xff << 24)
+
+/* Used by PM_IVA_PWRSTCTRL */
+#define OMAP54XX_TCM1_MEM_ONSTATE_SHIFT                                                20
+#define OMAP54XX_TCM1_MEM_ONSTATE_WIDTH                                                0x2
+#define OMAP54XX_TCM1_MEM_ONSTATE_MASK                                         (0x3 << 20)
+
+/* Used by PM_IVA_PWRSTCTRL */
+#define OMAP54XX_TCM1_MEM_RETSTATE_SHIFT                                       10
+#define OMAP54XX_TCM1_MEM_RETSTATE_WIDTH                                       0x1
+#define OMAP54XX_TCM1_MEM_RETSTATE_MASK                                                (1 << 10)
+
+/* Used by PM_IVA_PWRSTST */
+#define OMAP54XX_TCM1_MEM_STATEST_SHIFT                                                8
+#define OMAP54XX_TCM1_MEM_STATEST_WIDTH                                                0x2
+#define OMAP54XX_TCM1_MEM_STATEST_MASK                                         (0x3 << 8)
+
+/* Used by PM_IVA_PWRSTCTRL */
+#define OMAP54XX_TCM2_MEM_ONSTATE_SHIFT                                                22
+#define OMAP54XX_TCM2_MEM_ONSTATE_WIDTH                                                0x2
+#define OMAP54XX_TCM2_MEM_ONSTATE_MASK                                         (0x3 << 22)
+
+/* Used by PM_IVA_PWRSTCTRL */
+#define OMAP54XX_TCM2_MEM_RETSTATE_SHIFT                                       11
+#define OMAP54XX_TCM2_MEM_RETSTATE_WIDTH                                       0x1
+#define OMAP54XX_TCM2_MEM_RETSTATE_MASK                                                (1 << 11)
+
+/* Used by PM_IVA_PWRSTST */
+#define OMAP54XX_TCM2_MEM_STATEST_SHIFT                                                10
+#define OMAP54XX_TCM2_MEM_STATEST_WIDTH                                                0x2
+#define OMAP54XX_TCM2_MEM_STATEST_MASK                                         (0x3 << 10)
+
+/* Used by PRM_VP_CORE_VLIMITTO, PRM_VP_MM_VLIMITTO, PRM_VP_MPU_VLIMITTO */
+#define OMAP54XX_TIMEOUT_SHIFT                                                 0
+#define OMAP54XX_TIMEOUT_WIDTH                                                 0x10
+#define OMAP54XX_TIMEOUT_MASK                                                  (0xffff << 0)
+
+/* Used by PRM_VP_CORE_CONFIG, PRM_VP_MM_CONFIG, PRM_VP_MPU_CONFIG */
+#define OMAP54XX_TIMEOUTEN_SHIFT                                               3
+#define OMAP54XX_TIMEOUTEN_WIDTH                                               0x1
+#define OMAP54XX_TIMEOUTEN_MASK                                                        (1 << 3)
+
+/* Used by PRM_IRQENABLE_IPU, PRM_IRQENABLE_MPU */
+#define OMAP54XX_TRANSITION_EN_SHIFT                                           8
+#define OMAP54XX_TRANSITION_EN_WIDTH                                           0x1
+#define OMAP54XX_TRANSITION_EN_MASK                                            (1 << 8)
+
+/* Used by PRM_IRQSTATUS_IPU, PRM_IRQSTATUS_MPU */
+#define OMAP54XX_TRANSITION_ST_SHIFT                                           8
+#define OMAP54XX_TRANSITION_ST_WIDTH                                           0x1
+#define OMAP54XX_TRANSITION_ST_MASK                                            (1 << 8)
+
+/* Used by PRM_DEBUG_TRANS_CFG */
+#define OMAP54XX_TRIGGER_CLEAR_SHIFT                                           2
+#define OMAP54XX_TRIGGER_CLEAR_WIDTH                                           0x1
+#define OMAP54XX_TRIGGER_CLEAR_MASK                                            (1 << 2)
+
+/* Used by PRM_RSTST */
+#define OMAP54XX_TSHUT_CORE_RST_SHIFT                                          13
+#define OMAP54XX_TSHUT_CORE_RST_WIDTH                                          0x1
+#define OMAP54XX_TSHUT_CORE_RST_MASK                                           (1 << 13)
+
+/* Used by PRM_RSTST */
+#define OMAP54XX_TSHUT_MM_RST_SHIFT                                            12
+#define OMAP54XX_TSHUT_MM_RST_WIDTH                                            0x1
+#define OMAP54XX_TSHUT_MM_RST_MASK                                             (1 << 12)
+
+/* Used by PRM_RSTST */
+#define OMAP54XX_TSHUT_MPU_RST_SHIFT                                           11
+#define OMAP54XX_TSHUT_MPU_RST_WIDTH                                           0x1
+#define OMAP54XX_TSHUT_MPU_RST_MASK                                            (1 << 11)
+
+/* Used by PRM_VC_VAL_BYPASS */
+#define OMAP54XX_VALID_SHIFT                                                   24
+#define OMAP54XX_VALID_WIDTH                                                   0x1
+#define OMAP54XX_VALID_MASK                                                    (1 << 24)
+
+/* Used by PRM_IRQENABLE_IPU, PRM_IRQENABLE_MPU */
+#define OMAP54XX_VC_BYPASSACK_EN_SHIFT                                         14
+#define OMAP54XX_VC_BYPASSACK_EN_WIDTH                                         0x1
+#define OMAP54XX_VC_BYPASSACK_EN_MASK                                          (1 << 14)
+
+/* Used by PRM_IRQSTATUS_IPU, PRM_IRQSTATUS_MPU */
+#define OMAP54XX_VC_BYPASSACK_ST_SHIFT                                         14
+#define OMAP54XX_VC_BYPASSACK_ST_WIDTH                                         0x1
+#define OMAP54XX_VC_BYPASSACK_ST_MASK                                          (1 << 14)
+
+/* Used by PRM_IRQENABLE_IPU, PRM_IRQENABLE_MPU */
+#define OMAP54XX_VC_CORE_VPACK_EN_SHIFT                                                22
+#define OMAP54XX_VC_CORE_VPACK_EN_WIDTH                                                0x1
+#define OMAP54XX_VC_CORE_VPACK_EN_MASK                                         (1 << 22)
+
+/* Used by PRM_IRQSTATUS_IPU, PRM_IRQSTATUS_MPU */
+#define OMAP54XX_VC_CORE_VPACK_ST_SHIFT                                                22
+#define OMAP54XX_VC_CORE_VPACK_ST_WIDTH                                                0x1
+#define OMAP54XX_VC_CORE_VPACK_ST_MASK                                         (1 << 22)
+
+/* Used by PRM_IRQENABLE_IPU, PRM_IRQENABLE_MPU */
+#define OMAP54XX_VC_MM_VPACK_EN_SHIFT                                          30
+#define OMAP54XX_VC_MM_VPACK_EN_WIDTH                                          0x1
+#define OMAP54XX_VC_MM_VPACK_EN_MASK                                           (1 << 30)
+
+/* Used by PRM_IRQSTATUS_IPU, PRM_IRQSTATUS_MPU */
+#define OMAP54XX_VC_MM_VPACK_ST_SHIFT                                          30
+#define OMAP54XX_VC_MM_VPACK_ST_WIDTH                                          0x1
+#define OMAP54XX_VC_MM_VPACK_ST_MASK                                           (1 << 30)
+
+/* Used by PRM_IRQENABLE_MPU_2 */
+#define OMAP54XX_VC_MPU_VPACK_EN_SHIFT                                         6
+#define OMAP54XX_VC_MPU_VPACK_EN_WIDTH                                         0x1
+#define OMAP54XX_VC_MPU_VPACK_EN_MASK                                          (1 << 6)
+
+/* Used by PRM_IRQSTATUS_MPU_2 */
+#define OMAP54XX_VC_MPU_VPACK_ST_SHIFT                                         6
+#define OMAP54XX_VC_MPU_VPACK_ST_WIDTH                                         0x1
+#define OMAP54XX_VC_MPU_VPACK_ST_MASK                                          (1 << 6)
+
+/* Used by PRM_IRQENABLE_IPU, PRM_IRQENABLE_MPU */
+#define OMAP54XX_VC_RAERR_EN_SHIFT                                             12
+#define OMAP54XX_VC_RAERR_EN_WIDTH                                             0x1
+#define OMAP54XX_VC_RAERR_EN_MASK                                              (1 << 12)
+
+/* Used by PRM_IRQSTATUS_IPU, PRM_IRQSTATUS_MPU */
+#define OMAP54XX_VC_RAERR_ST_SHIFT                                             12
+#define OMAP54XX_VC_RAERR_ST_WIDTH                                             0x1
+#define OMAP54XX_VC_RAERR_ST_MASK                                              (1 << 12)
+
+/* Used by PRM_IRQENABLE_IPU, PRM_IRQENABLE_MPU */
+#define OMAP54XX_VC_SAERR_EN_SHIFT                                             11
+#define OMAP54XX_VC_SAERR_EN_WIDTH                                             0x1
+#define OMAP54XX_VC_SAERR_EN_MASK                                              (1 << 11)
+
+/* Used by PRM_IRQSTATUS_IPU, PRM_IRQSTATUS_MPU */
+#define OMAP54XX_VC_SAERR_ST_SHIFT                                             11
+#define OMAP54XX_VC_SAERR_ST_WIDTH                                             0x1
+#define OMAP54XX_VC_SAERR_ST_MASK                                              (1 << 11)
+
+/* Used by PRM_IRQENABLE_IPU, PRM_IRQENABLE_MPU */
+#define OMAP54XX_VC_TOERR_EN_SHIFT                                             13
+#define OMAP54XX_VC_TOERR_EN_WIDTH                                             0x1
+#define OMAP54XX_VC_TOERR_EN_MASK                                              (1 << 13)
+
+/* Used by PRM_IRQSTATUS_IPU, PRM_IRQSTATUS_MPU */
+#define OMAP54XX_VC_TOERR_ST_SHIFT                                             13
+#define OMAP54XX_VC_TOERR_ST_WIDTH                                             0x1
+#define OMAP54XX_VC_TOERR_ST_MASK                                              (1 << 13)
+
+/* Used by PRM_VP_CORE_VLIMITTO, PRM_VP_MM_VLIMITTO, PRM_VP_MPU_VLIMITTO */
+#define OMAP54XX_VDDMAX_SHIFT                                                  24
+#define OMAP54XX_VDDMAX_WIDTH                                                  0x8
+#define OMAP54XX_VDDMAX_MASK                                                   (0xff << 24)
+
+/* Used by PRM_VP_CORE_VLIMITTO, PRM_VP_MM_VLIMITTO, PRM_VP_MPU_VLIMITTO */
+#define OMAP54XX_VDDMIN_SHIFT                                                  16
+#define OMAP54XX_VDDMIN_WIDTH                                                  0x8
+#define OMAP54XX_VDDMIN_MASK                                                   (0xff << 16)
+
+/* Used by PRM_VOLTCTRL */
+#define OMAP54XX_VDD_CORE_I2C_DISABLE_SHIFT                                    12
+#define OMAP54XX_VDD_CORE_I2C_DISABLE_WIDTH                                    0x1
+#define OMAP54XX_VDD_CORE_I2C_DISABLE_MASK                                     (1 << 12)
+
+/* Used by PRM_RSTST */
+#define OMAP54XX_VDD_CORE_VOLT_MGR_RST_SHIFT                                   8
+#define OMAP54XX_VDD_CORE_VOLT_MGR_RST_WIDTH                                   0x1
+#define OMAP54XX_VDD_CORE_VOLT_MGR_RST_MASK                                    (1 << 8)
+
+/* Used by PRM_VOLTCTRL */
+#define OMAP54XX_VDD_MM_I2C_DISABLE_SHIFT                                      14
+#define OMAP54XX_VDD_MM_I2C_DISABLE_WIDTH                                      0x1
+#define OMAP54XX_VDD_MM_I2C_DISABLE_MASK                                       (1 << 14)
+
+/* Used by PRM_VOLTCTRL */
+#define OMAP54XX_VDD_MM_PRESENCE_SHIFT                                         9
+#define OMAP54XX_VDD_MM_PRESENCE_WIDTH                                         0x1
+#define OMAP54XX_VDD_MM_PRESENCE_MASK                                          (1 << 9)
+
+/* Used by PRM_RSTST */
+#define OMAP54XX_VDD_MM_VOLT_MGR_RST_SHIFT                                     7
+#define OMAP54XX_VDD_MM_VOLT_MGR_RST_WIDTH                                     0x1
+#define OMAP54XX_VDD_MM_VOLT_MGR_RST_MASK                                      (1 << 7)
+
+/* Used by PRM_VOLTCTRL */
+#define OMAP54XX_VDD_MPU_I2C_DISABLE_SHIFT                                     13
+#define OMAP54XX_VDD_MPU_I2C_DISABLE_WIDTH                                     0x1
+#define OMAP54XX_VDD_MPU_I2C_DISABLE_MASK                                      (1 << 13)
+
+/* Used by PRM_VOLTCTRL */
+#define OMAP54XX_VDD_MPU_PRESENCE_SHIFT                                                8
+#define OMAP54XX_VDD_MPU_PRESENCE_WIDTH                                                0x1
+#define OMAP54XX_VDD_MPU_PRESENCE_MASK                                         (1 << 8)
+
+/* Used by PRM_RSTST */
+#define OMAP54XX_VDD_MPU_VOLT_MGR_RST_SHIFT                                    6
+#define OMAP54XX_VDD_MPU_VOLT_MGR_RST_WIDTH                                    0x1
+#define OMAP54XX_VDD_MPU_VOLT_MGR_RST_MASK                                     (1 << 6)
+
+/* Used by PRM_VC_CORE_ERRST */
+#define OMAP54XX_VFSM_RA_ERR_CORE_SHIFT                                                4
+#define OMAP54XX_VFSM_RA_ERR_CORE_WIDTH                                                0x1
+#define OMAP54XX_VFSM_RA_ERR_CORE_MASK                                         (1 << 4)
+
+/* Used by PRM_VC_MM_ERRST */
+#define OMAP54XX_VFSM_RA_ERR_MM_SHIFT                                          4
+#define OMAP54XX_VFSM_RA_ERR_MM_WIDTH                                          0x1
+#define OMAP54XX_VFSM_RA_ERR_MM_MASK                                           (1 << 4)
+
+/* Used by PRM_VC_MPU_ERRST */
+#define OMAP54XX_VFSM_RA_ERR_MPU_SHIFT                                         4
+#define OMAP54XX_VFSM_RA_ERR_MPU_WIDTH                                         0x1
+#define OMAP54XX_VFSM_RA_ERR_MPU_MASK                                          (1 << 4)
+
+/* Used by PRM_VC_CORE_ERRST */
+#define OMAP54XX_VFSM_SA_ERR_CORE_SHIFT                                                3
+#define OMAP54XX_VFSM_SA_ERR_CORE_WIDTH                                                0x1
+#define OMAP54XX_VFSM_SA_ERR_CORE_MASK                                         (1 << 3)
+
+/* Used by PRM_VC_MM_ERRST */
+#define OMAP54XX_VFSM_SA_ERR_MM_SHIFT                                          3
+#define OMAP54XX_VFSM_SA_ERR_MM_WIDTH                                          0x1
+#define OMAP54XX_VFSM_SA_ERR_MM_MASK                                           (1 << 3)
+
+/* Used by PRM_VC_MPU_ERRST */
+#define OMAP54XX_VFSM_SA_ERR_MPU_SHIFT                                         3
+#define OMAP54XX_VFSM_SA_ERR_MPU_WIDTH                                         0x1
+#define OMAP54XX_VFSM_SA_ERR_MPU_MASK                                          (1 << 3)
+
+/* Used by PRM_VC_CORE_ERRST */
+#define OMAP54XX_VFSM_TIMEOUT_ERR_CORE_SHIFT                                   5
+#define OMAP54XX_VFSM_TIMEOUT_ERR_CORE_WIDTH                                   0x1
+#define OMAP54XX_VFSM_TIMEOUT_ERR_CORE_MASK                                    (1 << 5)
+
+/* Used by PRM_VC_MM_ERRST */
+#define OMAP54XX_VFSM_TIMEOUT_ERR_MM_SHIFT                                     5
+#define OMAP54XX_VFSM_TIMEOUT_ERR_MM_WIDTH                                     0x1
+#define OMAP54XX_VFSM_TIMEOUT_ERR_MM_MASK                                      (1 << 5)
+
+/* Used by PRM_VC_MPU_ERRST */
+#define OMAP54XX_VFSM_TIMEOUT_ERR_MPU_SHIFT                                    5
+#define OMAP54XX_VFSM_TIMEOUT_ERR_MPU_WIDTH                                    0x1
+#define OMAP54XX_VFSM_TIMEOUT_ERR_MPU_MASK                                     (1 << 5)
+
+/* Used by PRM_VC_SMPS_CORE_CONFIG */
+#define OMAP54XX_VOLRA_VDD_CORE_L_SHIFT                                                8
+#define OMAP54XX_VOLRA_VDD_CORE_L_WIDTH                                                0x8
+#define OMAP54XX_VOLRA_VDD_CORE_L_MASK                                         (0xff << 8)
+
+/* Used by PRM_VC_SMPS_MM_CONFIG */
+#define OMAP54XX_VOLRA_VDD_MM_L_SHIFT                                          8
+#define OMAP54XX_VOLRA_VDD_MM_L_WIDTH                                          0x8
+#define OMAP54XX_VOLRA_VDD_MM_L_MASK                                           (0xff << 8)
+
+/* Used by PRM_VC_SMPS_MPU_CONFIG */
+#define OMAP54XX_VOLRA_VDD_MPU_L_SHIFT                                         8
+#define OMAP54XX_VOLRA_VDD_MPU_L_WIDTH                                         0x8
+#define OMAP54XX_VOLRA_VDD_MPU_L_MASK                                          (0xff << 8)
+
+/* Used by PRM_VOLTST_MM, PRM_VOLTST_MPU */
+#define OMAP54XX_VOLTSTATEST_SHIFT                                             0
+#define OMAP54XX_VOLTSTATEST_WIDTH                                             0x2
+#define OMAP54XX_VOLTSTATEST_MASK                                              (0x3 << 0)
+
+/* Used by PRM_VP_CORE_CONFIG, PRM_VP_MM_CONFIG, PRM_VP_MPU_CONFIG */
+#define OMAP54XX_VPENABLE_SHIFT                                                        0
+#define OMAP54XX_VPENABLE_WIDTH                                                        0x1
+#define OMAP54XX_VPENABLE_MASK                                                 (1 << 0)
+
+/* Used by PRM_VP_CORE_STATUS, PRM_VP_MM_STATUS, PRM_VP_MPU_STATUS */
+#define OMAP54XX_VPINIDLE_SHIFT                                                        0
+#define OMAP54XX_VPINIDLE_WIDTH                                                        0x1
+#define OMAP54XX_VPINIDLE_MASK                                                 (1 << 0)
+
+/* Used by PRM_VP_CORE_VOLTAGE, PRM_VP_MM_VOLTAGE, PRM_VP_MPU_VOLTAGE */
+#define OMAP54XX_VPVOLTAGE_SHIFT                                               0
+#define OMAP54XX_VPVOLTAGE_WIDTH                                               0x8
+#define OMAP54XX_VPVOLTAGE_MASK                                                        (0xff << 0)
+
+/* Used by PRM_IRQENABLE_IPU, PRM_IRQENABLE_MPU */
+#define OMAP54XX_VP_CORE_EQVALUE_EN_SHIFT                                      20
+#define OMAP54XX_VP_CORE_EQVALUE_EN_WIDTH                                      0x1
+#define OMAP54XX_VP_CORE_EQVALUE_EN_MASK                                       (1 << 20)
+
+/* Used by PRM_IRQSTATUS_IPU, PRM_IRQSTATUS_MPU */
+#define OMAP54XX_VP_CORE_EQVALUE_ST_SHIFT                                      20
+#define OMAP54XX_VP_CORE_EQVALUE_ST_WIDTH                                      0x1
+#define OMAP54XX_VP_CORE_EQVALUE_ST_MASK                                       (1 << 20)
+
+/* Used by PRM_IRQENABLE_IPU, PRM_IRQENABLE_MPU */
+#define OMAP54XX_VP_CORE_MAXVDD_EN_SHIFT                                       18
+#define OMAP54XX_VP_CORE_MAXVDD_EN_WIDTH                                       0x1
+#define OMAP54XX_VP_CORE_MAXVDD_EN_MASK                                                (1 << 18)
+
+/* Used by PRM_IRQSTATUS_IPU, PRM_IRQSTATUS_MPU */
+#define OMAP54XX_VP_CORE_MAXVDD_ST_SHIFT                                       18
+#define OMAP54XX_VP_CORE_MAXVDD_ST_WIDTH                                       0x1
+#define OMAP54XX_VP_CORE_MAXVDD_ST_MASK                                                (1 << 18)
+
+/* Used by PRM_IRQENABLE_IPU, PRM_IRQENABLE_MPU */
+#define OMAP54XX_VP_CORE_MINVDD_EN_SHIFT                                       17
+#define OMAP54XX_VP_CORE_MINVDD_EN_WIDTH                                       0x1
+#define OMAP54XX_VP_CORE_MINVDD_EN_MASK                                                (1 << 17)
+
+/* Used by PRM_IRQSTATUS_IPU, PRM_IRQSTATUS_MPU */
+#define OMAP54XX_VP_CORE_MINVDD_ST_SHIFT                                       17
+#define OMAP54XX_VP_CORE_MINVDD_ST_WIDTH                                       0x1
+#define OMAP54XX_VP_CORE_MINVDD_ST_MASK                                                (1 << 17)
+
+/* Used by PRM_IRQENABLE_IPU, PRM_IRQENABLE_MPU */
+#define OMAP54XX_VP_CORE_NOSMPSACK_EN_SHIFT                                    19
+#define OMAP54XX_VP_CORE_NOSMPSACK_EN_WIDTH                                    0x1
+#define OMAP54XX_VP_CORE_NOSMPSACK_EN_MASK                                     (1 << 19)
+
+/* Used by PRM_IRQSTATUS_IPU, PRM_IRQSTATUS_MPU */
+#define OMAP54XX_VP_CORE_NOSMPSACK_ST_SHIFT                                    19
+#define OMAP54XX_VP_CORE_NOSMPSACK_ST_WIDTH                                    0x1
+#define OMAP54XX_VP_CORE_NOSMPSACK_ST_MASK                                     (1 << 19)
+
+/* Used by PRM_IRQENABLE_IPU, PRM_IRQENABLE_MPU */
+#define OMAP54XX_VP_CORE_OPPCHANGEDONE_EN_SHIFT                                        16
+#define OMAP54XX_VP_CORE_OPPCHANGEDONE_EN_WIDTH                                        0x1
+#define OMAP54XX_VP_CORE_OPPCHANGEDONE_EN_MASK                                 (1 << 16)
+
+/* Used by PRM_IRQSTATUS_IPU, PRM_IRQSTATUS_MPU */
+#define OMAP54XX_VP_CORE_OPPCHANGEDONE_ST_SHIFT                                        16
+#define OMAP54XX_VP_CORE_OPPCHANGEDONE_ST_WIDTH                                        0x1
+#define OMAP54XX_VP_CORE_OPPCHANGEDONE_ST_MASK                                 (1 << 16)
+
+/* Used by PRM_IRQENABLE_IPU, PRM_IRQENABLE_MPU */
+#define OMAP54XX_VP_CORE_TRANXDONE_EN_SHIFT                                    21
+#define OMAP54XX_VP_CORE_TRANXDONE_EN_WIDTH                                    0x1
+#define OMAP54XX_VP_CORE_TRANXDONE_EN_MASK                                     (1 << 21)
+
+/* Used by PRM_IRQSTATUS_IPU, PRM_IRQSTATUS_MPU */
+#define OMAP54XX_VP_CORE_TRANXDONE_ST_SHIFT                                    21
+#define OMAP54XX_VP_CORE_TRANXDONE_ST_WIDTH                                    0x1
+#define OMAP54XX_VP_CORE_TRANXDONE_ST_MASK                                     (1 << 21)
+
+/* Used by PRM_IRQENABLE_IPU, PRM_IRQENABLE_MPU */
+#define OMAP54XX_VP_MM_EQVALUE_EN_SHIFT                                                28
+#define OMAP54XX_VP_MM_EQVALUE_EN_WIDTH                                                0x1
+#define OMAP54XX_VP_MM_EQVALUE_EN_MASK                                         (1 << 28)
+
+/* Used by PRM_IRQSTATUS_IPU, PRM_IRQSTATUS_MPU */
+#define OMAP54XX_VP_MM_EQVALUE_ST_SHIFT                                                28
+#define OMAP54XX_VP_MM_EQVALUE_ST_WIDTH                                                0x1
+#define OMAP54XX_VP_MM_EQVALUE_ST_MASK                                         (1 << 28)
+
+/* Used by PRM_IRQENABLE_IPU, PRM_IRQENABLE_MPU */
+#define OMAP54XX_VP_MM_MAXVDD_EN_SHIFT                                         26
+#define OMAP54XX_VP_MM_MAXVDD_EN_WIDTH                                         0x1
+#define OMAP54XX_VP_MM_MAXVDD_EN_MASK                                          (1 << 26)
+
+/* Used by PRM_IRQSTATUS_IPU, PRM_IRQSTATUS_MPU */
+#define OMAP54XX_VP_MM_MAXVDD_ST_SHIFT                                         26
+#define OMAP54XX_VP_MM_MAXVDD_ST_WIDTH                                         0x1
+#define OMAP54XX_VP_MM_MAXVDD_ST_MASK                                          (1 << 26)
+
+/* Used by PRM_IRQENABLE_IPU, PRM_IRQENABLE_MPU */
+#define OMAP54XX_VP_MM_MINVDD_EN_SHIFT                                         25
+#define OMAP54XX_VP_MM_MINVDD_EN_WIDTH                                         0x1
+#define OMAP54XX_VP_MM_MINVDD_EN_MASK                                          (1 << 25)
+
+/* Used by PRM_IRQSTATUS_IPU, PRM_IRQSTATUS_MPU */
+#define OMAP54XX_VP_MM_MINVDD_ST_SHIFT                                         25
+#define OMAP54XX_VP_MM_MINVDD_ST_WIDTH                                         0x1
+#define OMAP54XX_VP_MM_MINVDD_ST_MASK                                          (1 << 25)
+
+/* Used by PRM_IRQENABLE_IPU, PRM_IRQENABLE_MPU */
+#define OMAP54XX_VP_MM_NOSMPSACK_EN_SHIFT                                      27
+#define OMAP54XX_VP_MM_NOSMPSACK_EN_WIDTH                                      0x1
+#define OMAP54XX_VP_MM_NOSMPSACK_EN_MASK                                       (1 << 27)
+
+/* Used by PRM_IRQSTATUS_IPU, PRM_IRQSTATUS_MPU */
+#define OMAP54XX_VP_MM_NOSMPSACK_ST_SHIFT                                      27
+#define OMAP54XX_VP_MM_NOSMPSACK_ST_WIDTH                                      0x1
+#define OMAP54XX_VP_MM_NOSMPSACK_ST_MASK                                       (1 << 27)
+
+/* Used by PRM_IRQENABLE_IPU, PRM_IRQENABLE_MPU */
+#define OMAP54XX_VP_MM_OPPCHANGEDONE_EN_SHIFT                                  24
+#define OMAP54XX_VP_MM_OPPCHANGEDONE_EN_WIDTH                                  0x1
+#define OMAP54XX_VP_MM_OPPCHANGEDONE_EN_MASK                                   (1 << 24)
+
+/* Used by PRM_IRQSTATUS_IPU, PRM_IRQSTATUS_MPU */
+#define OMAP54XX_VP_MM_OPPCHANGEDONE_ST_SHIFT                                  24
+#define OMAP54XX_VP_MM_OPPCHANGEDONE_ST_WIDTH                                  0x1
+#define OMAP54XX_VP_MM_OPPCHANGEDONE_ST_MASK                                   (1 << 24)
+
+/* Used by PRM_IRQENABLE_IPU, PRM_IRQENABLE_MPU */
+#define OMAP54XX_VP_MM_TRANXDONE_EN_SHIFT                                      29
+#define OMAP54XX_VP_MM_TRANXDONE_EN_WIDTH                                      0x1
+#define OMAP54XX_VP_MM_TRANXDONE_EN_MASK                                       (1 << 29)
+
+/* Used by PRM_IRQSTATUS_IPU, PRM_IRQSTATUS_MPU */
+#define OMAP54XX_VP_MM_TRANXDONE_ST_SHIFT                                      29
+#define OMAP54XX_VP_MM_TRANXDONE_ST_WIDTH                                      0x1
+#define OMAP54XX_VP_MM_TRANXDONE_ST_MASK                                       (1 << 29)
+
+/* Used by PRM_IRQENABLE_MPU_2 */
+#define OMAP54XX_VP_MPU_EQVALUE_EN_SHIFT                                       4
+#define OMAP54XX_VP_MPU_EQVALUE_EN_WIDTH                                       0x1
+#define OMAP54XX_VP_MPU_EQVALUE_EN_MASK                                                (1 << 4)
+
+/* Used by PRM_IRQSTATUS_MPU_2 */
+#define OMAP54XX_VP_MPU_EQVALUE_ST_SHIFT                                       4
+#define OMAP54XX_VP_MPU_EQVALUE_ST_WIDTH                                       0x1
+#define OMAP54XX_VP_MPU_EQVALUE_ST_MASK                                                (1 << 4)
+
+/* Used by PRM_IRQENABLE_MPU_2 */
+#define OMAP54XX_VP_MPU_MAXVDD_EN_SHIFT                                                2
+#define OMAP54XX_VP_MPU_MAXVDD_EN_WIDTH                                                0x1
+#define OMAP54XX_VP_MPU_MAXVDD_EN_MASK                                         (1 << 2)
+
+/* Used by PRM_IRQSTATUS_MPU_2 */
+#define OMAP54XX_VP_MPU_MAXVDD_ST_SHIFT                                                2
+#define OMAP54XX_VP_MPU_MAXVDD_ST_WIDTH                                                0x1
+#define OMAP54XX_VP_MPU_MAXVDD_ST_MASK                                         (1 << 2)
+
+/* Used by PRM_IRQENABLE_MPU_2 */
+#define OMAP54XX_VP_MPU_MINVDD_EN_SHIFT                                                1
+#define OMAP54XX_VP_MPU_MINVDD_EN_WIDTH                                                0x1
+#define OMAP54XX_VP_MPU_MINVDD_EN_MASK                                         (1 << 1)
+
+/* Used by PRM_IRQSTATUS_MPU_2 */
+#define OMAP54XX_VP_MPU_MINVDD_ST_SHIFT                                                1
+#define OMAP54XX_VP_MPU_MINVDD_ST_WIDTH                                                0x1
+#define OMAP54XX_VP_MPU_MINVDD_ST_MASK                                         (1 << 1)
+
+/* Used by PRM_IRQENABLE_MPU_2 */
+#define OMAP54XX_VP_MPU_NOSMPSACK_EN_SHIFT                                     3
+#define OMAP54XX_VP_MPU_NOSMPSACK_EN_WIDTH                                     0x1
+#define OMAP54XX_VP_MPU_NOSMPSACK_EN_MASK                                      (1 << 3)
+
+/* Used by PRM_IRQSTATUS_MPU_2 */
+#define OMAP54XX_VP_MPU_NOSMPSACK_ST_SHIFT                                     3
+#define OMAP54XX_VP_MPU_NOSMPSACK_ST_WIDTH                                     0x1
+#define OMAP54XX_VP_MPU_NOSMPSACK_ST_MASK                                      (1 << 3)
+
+/* Used by PRM_IRQENABLE_MPU_2 */
+#define OMAP54XX_VP_MPU_OPPCHANGEDONE_EN_SHIFT                                 0
+#define OMAP54XX_VP_MPU_OPPCHANGEDONE_EN_WIDTH                                 0x1
+#define OMAP54XX_VP_MPU_OPPCHANGEDONE_EN_MASK                                  (1 << 0)
+
+/* Used by PRM_IRQSTATUS_MPU_2 */
+#define OMAP54XX_VP_MPU_OPPCHANGEDONE_ST_SHIFT                                 0
+#define OMAP54XX_VP_MPU_OPPCHANGEDONE_ST_WIDTH                                 0x1
+#define OMAP54XX_VP_MPU_OPPCHANGEDONE_ST_MASK                                  (1 << 0)
+
+/* Used by PRM_IRQENABLE_MPU_2 */
+#define OMAP54XX_VP_MPU_TRANXDONE_EN_SHIFT                                     5
+#define OMAP54XX_VP_MPU_TRANXDONE_EN_WIDTH                                     0x1
+#define OMAP54XX_VP_MPU_TRANXDONE_EN_MASK                                      (1 << 5)
+
+/* Used by PRM_IRQSTATUS_MPU_2 */
+#define OMAP54XX_VP_MPU_TRANXDONE_ST_SHIFT                                     5
+#define OMAP54XX_VP_MPU_TRANXDONE_ST_WIDTH                                     0x1
+#define OMAP54XX_VP_MPU_TRANXDONE_ST_MASK                                      (1 << 5)
+
+/* Used by PRM_SRAM_COUNT */
+#define OMAP54XX_VSETUPCNT_VALUE_SHIFT                                         8
+#define OMAP54XX_VSETUPCNT_VALUE_WIDTH                                         0x8
+#define OMAP54XX_VSETUPCNT_VALUE_MASK                                          (0xff << 8)
+
+/* Used by PRM_VP_CORE_VSTEPMAX, PRM_VP_MM_VSTEPMAX, PRM_VP_MPU_VSTEPMAX */
+#define OMAP54XX_VSTEPMAX_SHIFT                                                        0
+#define OMAP54XX_VSTEPMAX_WIDTH                                                        0x8
+#define OMAP54XX_VSTEPMAX_MASK                                                 (0xff << 0)
+
+/* Used by PRM_VP_CORE_VSTEPMIN, PRM_VP_MM_VSTEPMIN, PRM_VP_MPU_VSTEPMIN */
+#define OMAP54XX_VSTEPMIN_SHIFT                                                        0
+#define OMAP54XX_VSTEPMIN_WIDTH                                                        0x8
+#define OMAP54XX_VSTEPMIN_MASK                                                 (0xff << 0)
+
+/* Used by PM_DSS_DSS_WKDEP */
+#define OMAP54XX_WKUPDEP_DISPC_DSP_SHIFT                                       2
+#define OMAP54XX_WKUPDEP_DISPC_DSP_WIDTH                                       0x1
+#define OMAP54XX_WKUPDEP_DISPC_DSP_MASK                                                (1 << 2)
+
+/* Used by PM_DSS_DSS_WKDEP */
+#define OMAP54XX_WKUPDEP_DISPC_IPU_SHIFT                                       1
+#define OMAP54XX_WKUPDEP_DISPC_IPU_WIDTH                                       0x1
+#define OMAP54XX_WKUPDEP_DISPC_IPU_MASK                                                (1 << 1)
+
+/* Used by PM_DSS_DSS_WKDEP */
+#define OMAP54XX_WKUPDEP_DISPC_MPU_SHIFT                                       0
+#define OMAP54XX_WKUPDEP_DISPC_MPU_WIDTH                                       0x1
+#define OMAP54XX_WKUPDEP_DISPC_MPU_MASK                                                (1 << 0)
+
+/* Used by PM_DSS_DSS_WKDEP */
+#define OMAP54XX_WKUPDEP_DISPC_SDMA_SHIFT                                      3
+#define OMAP54XX_WKUPDEP_DISPC_SDMA_WIDTH                                      0x1
+#define OMAP54XX_WKUPDEP_DISPC_SDMA_MASK                                       (1 << 3)
+
+/* Used by PM_ABE_DMIC_WKDEP */
+#define OMAP54XX_WKUPDEP_DMIC_DMA_DSP_SHIFT                                    6
+#define OMAP54XX_WKUPDEP_DMIC_DMA_DSP_WIDTH                                    0x1
+#define OMAP54XX_WKUPDEP_DMIC_DMA_DSP_MASK                                     (1 << 6)
+
+/* Used by PM_ABE_DMIC_WKDEP */
+#define OMAP54XX_WKUPDEP_DMIC_DMA_SDMA_SHIFT                                   7
+#define OMAP54XX_WKUPDEP_DMIC_DMA_SDMA_WIDTH                                   0x1
+#define OMAP54XX_WKUPDEP_DMIC_DMA_SDMA_MASK                                    (1 << 7)
+
+/* Used by PM_ABE_DMIC_WKDEP */
+#define OMAP54XX_WKUPDEP_DMIC_IRQ_DSP_SHIFT                                    2
+#define OMAP54XX_WKUPDEP_DMIC_IRQ_DSP_WIDTH                                    0x1
+#define OMAP54XX_WKUPDEP_DMIC_IRQ_DSP_MASK                                     (1 << 2)
+
+/* Used by PM_ABE_DMIC_WKDEP */
+#define OMAP54XX_WKUPDEP_DMIC_IRQ_MPU_SHIFT                                    0
+#define OMAP54XX_WKUPDEP_DMIC_IRQ_MPU_WIDTH                                    0x1
+#define OMAP54XX_WKUPDEP_DMIC_IRQ_MPU_MASK                                     (1 << 0)
+
+/* Used by PM_DSS_DSS_WKDEP */
+#define OMAP54XX_WKUPDEP_DSI1_A_DSP_SHIFT                                      6
+#define OMAP54XX_WKUPDEP_DSI1_A_DSP_WIDTH                                      0x1
+#define OMAP54XX_WKUPDEP_DSI1_A_DSP_MASK                                       (1 << 6)
+
+/* Used by PM_DSS_DSS_WKDEP */
+#define OMAP54XX_WKUPDEP_DSI1_A_IPU_SHIFT                                      5
+#define OMAP54XX_WKUPDEP_DSI1_A_IPU_WIDTH                                      0x1
+#define OMAP54XX_WKUPDEP_DSI1_A_IPU_MASK                                       (1 << 5)
+
+/* Used by PM_DSS_DSS_WKDEP */
+#define OMAP54XX_WKUPDEP_DSI1_A_MPU_SHIFT                                      4
+#define OMAP54XX_WKUPDEP_DSI1_A_MPU_WIDTH                                      0x1
+#define OMAP54XX_WKUPDEP_DSI1_A_MPU_MASK                                       (1 << 4)
+
+/* Used by PM_DSS_DSS_WKDEP */
+#define OMAP54XX_WKUPDEP_DSI1_A_SDMA_SHIFT                                     7
+#define OMAP54XX_WKUPDEP_DSI1_A_SDMA_WIDTH                                     0x1
+#define OMAP54XX_WKUPDEP_DSI1_A_SDMA_MASK                                      (1 << 7)
+
+/* Used by PM_DSS_DSS_WKDEP */
+#define OMAP54XX_WKUPDEP_DSI1_B_DSP_SHIFT                                      10
+#define OMAP54XX_WKUPDEP_DSI1_B_DSP_WIDTH                                      0x1
+#define OMAP54XX_WKUPDEP_DSI1_B_DSP_MASK                                       (1 << 10)
+
+/* Used by PM_DSS_DSS_WKDEP */
+#define OMAP54XX_WKUPDEP_DSI1_B_IPU_SHIFT                                      9
+#define OMAP54XX_WKUPDEP_DSI1_B_IPU_WIDTH                                      0x1
+#define OMAP54XX_WKUPDEP_DSI1_B_IPU_MASK                                       (1 << 9)
+
+/* Used by PM_DSS_DSS_WKDEP */
+#define OMAP54XX_WKUPDEP_DSI1_B_MPU_SHIFT                                      8
+#define OMAP54XX_WKUPDEP_DSI1_B_MPU_WIDTH                                      0x1
+#define OMAP54XX_WKUPDEP_DSI1_B_MPU_MASK                                       (1 << 8)
+
+/* Used by PM_DSS_DSS_WKDEP */
+#define OMAP54XX_WKUPDEP_DSI1_B_SDMA_SHIFT                                     11
+#define OMAP54XX_WKUPDEP_DSI1_B_SDMA_WIDTH                                     0x1
+#define OMAP54XX_WKUPDEP_DSI1_B_SDMA_MASK                                      (1 << 11)
+
+/* Used by PM_DSS_DSS_WKDEP */
+#define OMAP54XX_WKUPDEP_DSI1_C_DSP_SHIFT                                      17
+#define OMAP54XX_WKUPDEP_DSI1_C_DSP_WIDTH                                      0x1
+#define OMAP54XX_WKUPDEP_DSI1_C_DSP_MASK                                       (1 << 17)
+
+/* Used by PM_DSS_DSS_WKDEP */
+#define OMAP54XX_WKUPDEP_DSI1_C_IPU_SHIFT                                      16
+#define OMAP54XX_WKUPDEP_DSI1_C_IPU_WIDTH                                      0x1
+#define OMAP54XX_WKUPDEP_DSI1_C_IPU_MASK                                       (1 << 16)
+
+/* Used by PM_DSS_DSS_WKDEP */
+#define OMAP54XX_WKUPDEP_DSI1_C_MPU_SHIFT                                      15
+#define OMAP54XX_WKUPDEP_DSI1_C_MPU_WIDTH                                      0x1
+#define OMAP54XX_WKUPDEP_DSI1_C_MPU_MASK                                       (1 << 15)
+
+/* Used by PM_DSS_DSS_WKDEP */
+#define OMAP54XX_WKUPDEP_DSI1_C_SDMA_SHIFT                                     18
+#define OMAP54XX_WKUPDEP_DSI1_C_SDMA_WIDTH                                     0x1
+#define OMAP54XX_WKUPDEP_DSI1_C_SDMA_MASK                                      (1 << 18)
+
+/* Used by PM_WKUPAON_GPIO1_WKDEP */
+#define OMAP54XX_WKUPDEP_GPIO1_IRQ1_IPU_SHIFT                                  1
+#define OMAP54XX_WKUPDEP_GPIO1_IRQ1_IPU_WIDTH                                  0x1
+#define OMAP54XX_WKUPDEP_GPIO1_IRQ1_IPU_MASK                                   (1 << 1)
+
+/* Used by PM_WKUPAON_GPIO1_WKDEP */
+#define OMAP54XX_WKUPDEP_GPIO1_IRQ1_MPU_SHIFT                                  0
+#define OMAP54XX_WKUPDEP_GPIO1_IRQ1_MPU_WIDTH                                  0x1
+#define OMAP54XX_WKUPDEP_GPIO1_IRQ1_MPU_MASK                                   (1 << 0)
+
+/* Used by PM_WKUPAON_GPIO1_WKDEP */
+#define OMAP54XX_WKUPDEP_GPIO1_IRQ2_DSP_SHIFT                                  6
+#define OMAP54XX_WKUPDEP_GPIO1_IRQ2_DSP_WIDTH                                  0x1
+#define OMAP54XX_WKUPDEP_GPIO1_IRQ2_DSP_MASK                                   (1 << 6)
+
+/* Used by PM_L4PER_GPIO2_WKDEP */
+#define OMAP54XX_WKUPDEP_GPIO2_IRQ1_IPU_SHIFT                                  1
+#define OMAP54XX_WKUPDEP_GPIO2_IRQ1_IPU_WIDTH                                  0x1
+#define OMAP54XX_WKUPDEP_GPIO2_IRQ1_IPU_MASK                                   (1 << 1)
+
+/* Used by PM_L4PER_GPIO2_WKDEP */
+#define OMAP54XX_WKUPDEP_GPIO2_IRQ1_MPU_SHIFT                                  0
+#define OMAP54XX_WKUPDEP_GPIO2_IRQ1_MPU_WIDTH                                  0x1
+#define OMAP54XX_WKUPDEP_GPIO2_IRQ1_MPU_MASK                                   (1 << 0)
+
+/* Used by PM_L4PER_GPIO2_WKDEP */
+#define OMAP54XX_WKUPDEP_GPIO2_IRQ2_DSP_SHIFT                                  6
+#define OMAP54XX_WKUPDEP_GPIO2_IRQ2_DSP_WIDTH                                  0x1
+#define OMAP54XX_WKUPDEP_GPIO2_IRQ2_DSP_MASK                                   (1 << 6)
+
+/* Used by PM_L4PER_GPIO3_WKDEP */
+#define OMAP54XX_WKUPDEP_GPIO3_IRQ1_MPU_SHIFT                                  0
+#define OMAP54XX_WKUPDEP_GPIO3_IRQ1_MPU_WIDTH                                  0x1
+#define OMAP54XX_WKUPDEP_GPIO3_IRQ1_MPU_MASK                                   (1 << 0)
+
+/* Used by PM_L4PER_GPIO3_WKDEP */
+#define OMAP54XX_WKUPDEP_GPIO3_IRQ2_DSP_SHIFT                                  6
+#define OMAP54XX_WKUPDEP_GPIO3_IRQ2_DSP_WIDTH                                  0x1
+#define OMAP54XX_WKUPDEP_GPIO3_IRQ2_DSP_MASK                                   (1 << 6)
+
+/* Used by PM_L4PER_GPIO4_WKDEP */
+#define OMAP54XX_WKUPDEP_GPIO4_IRQ1_MPU_SHIFT                                  0
+#define OMAP54XX_WKUPDEP_GPIO4_IRQ1_MPU_WIDTH                                  0x1
+#define OMAP54XX_WKUPDEP_GPIO4_IRQ1_MPU_MASK                                   (1 << 0)
+
+/* Used by PM_L4PER_GPIO4_WKDEP */
+#define OMAP54XX_WKUPDEP_GPIO4_IRQ2_DSP_SHIFT                                  6
+#define OMAP54XX_WKUPDEP_GPIO4_IRQ2_DSP_WIDTH                                  0x1
+#define OMAP54XX_WKUPDEP_GPIO4_IRQ2_DSP_MASK                                   (1 << 6)
+
+/* Used by PM_L4PER_GPIO5_WKDEP */
+#define OMAP54XX_WKUPDEP_GPIO5_IRQ1_MPU_SHIFT                                  0
+#define OMAP54XX_WKUPDEP_GPIO5_IRQ1_MPU_WIDTH                                  0x1
+#define OMAP54XX_WKUPDEP_GPIO5_IRQ1_MPU_MASK                                   (1 << 0)
+
+/* Used by PM_L4PER_GPIO5_WKDEP */
+#define OMAP54XX_WKUPDEP_GPIO5_IRQ2_DSP_SHIFT                                  6
+#define OMAP54XX_WKUPDEP_GPIO5_IRQ2_DSP_WIDTH                                  0x1
+#define OMAP54XX_WKUPDEP_GPIO5_IRQ2_DSP_MASK                                   (1 << 6)
+
+/* Used by PM_L4PER_GPIO6_WKDEP */
+#define OMAP54XX_WKUPDEP_GPIO6_IRQ1_MPU_SHIFT                                  0
+#define OMAP54XX_WKUPDEP_GPIO6_IRQ1_MPU_WIDTH                                  0x1
+#define OMAP54XX_WKUPDEP_GPIO6_IRQ1_MPU_MASK                                   (1 << 0)
+
+/* Used by PM_L4PER_GPIO6_WKDEP */
+#define OMAP54XX_WKUPDEP_GPIO6_IRQ2_DSP_SHIFT                                  6
+#define OMAP54XX_WKUPDEP_GPIO6_IRQ2_DSP_WIDTH                                  0x1
+#define OMAP54XX_WKUPDEP_GPIO6_IRQ2_DSP_MASK                                   (1 << 6)
+
+/* Used by PM_L4PER_GPIO7_WKDEP */
+#define OMAP54XX_WKUPDEP_GPIO7_IRQ1_MPU_SHIFT                                  0
+#define OMAP54XX_WKUPDEP_GPIO7_IRQ1_MPU_WIDTH                                  0x1
+#define OMAP54XX_WKUPDEP_GPIO7_IRQ1_MPU_MASK                                   (1 << 0)
+
+/* Used by PM_L4PER_GPIO8_WKDEP */
+#define OMAP54XX_WKUPDEP_GPIO8_IRQ1_MPU_SHIFT                                  0
+#define OMAP54XX_WKUPDEP_GPIO8_IRQ1_MPU_WIDTH                                  0x1
+#define OMAP54XX_WKUPDEP_GPIO8_IRQ1_MPU_MASK                                   (1 << 0)
+
+/* Used by PM_DSS_DSS_WKDEP */
+#define OMAP54XX_WKUPDEP_HDMIDMA_SDMA_SHIFT                                    19
+#define OMAP54XX_WKUPDEP_HDMIDMA_SDMA_WIDTH                                    0x1
+#define OMAP54XX_WKUPDEP_HDMIDMA_SDMA_MASK                                     (1 << 19)
+
+/* Used by PM_DSS_DSS_WKDEP */
+#define OMAP54XX_WKUPDEP_HDMIIRQ_DSP_SHIFT                                     14
+#define OMAP54XX_WKUPDEP_HDMIIRQ_DSP_WIDTH                                     0x1
+#define OMAP54XX_WKUPDEP_HDMIIRQ_DSP_MASK                                      (1 << 14)
+
+/* Used by PM_DSS_DSS_WKDEP */
+#define OMAP54XX_WKUPDEP_HDMIIRQ_IPU_SHIFT                                     13
+#define OMAP54XX_WKUPDEP_HDMIIRQ_IPU_WIDTH                                     0x1
+#define OMAP54XX_WKUPDEP_HDMIIRQ_IPU_MASK                                      (1 << 13)
+
+/* Used by PM_DSS_DSS_WKDEP */
+#define OMAP54XX_WKUPDEP_HDMIIRQ_MPU_SHIFT                                     12
+#define OMAP54XX_WKUPDEP_HDMIIRQ_MPU_WIDTH                                     0x1
+#define OMAP54XX_WKUPDEP_HDMIIRQ_MPU_MASK                                      (1 << 12)
+
+/* Used by PM_L3INIT_HSI_WKDEP */
+#define OMAP54XX_WKUPDEP_HSI_DSP_DSP_SHIFT                                     6
+#define OMAP54XX_WKUPDEP_HSI_DSP_DSP_WIDTH                                     0x1
+#define OMAP54XX_WKUPDEP_HSI_DSP_DSP_MASK                                      (1 << 6)
+
+/* Used by PM_L3INIT_HSI_WKDEP */
+#define OMAP54XX_WKUPDEP_HSI_MCU_IPU_SHIFT                                     1
+#define OMAP54XX_WKUPDEP_HSI_MCU_IPU_WIDTH                                     0x1
+#define OMAP54XX_WKUPDEP_HSI_MCU_IPU_MASK                                      (1 << 1)
+
+/* Used by PM_L3INIT_HSI_WKDEP */
+#define OMAP54XX_WKUPDEP_HSI_MCU_MPU_SHIFT                                     0
+#define OMAP54XX_WKUPDEP_HSI_MCU_MPU_WIDTH                                     0x1
+#define OMAP54XX_WKUPDEP_HSI_MCU_MPU_MASK                                      (1 << 0)
+
+/* Used by PM_L4PER_I2C1_WKDEP */
+#define OMAP54XX_WKUPDEP_I2C1_DMA_SDMA_SHIFT                                   7
+#define OMAP54XX_WKUPDEP_I2C1_DMA_SDMA_WIDTH                                   0x1
+#define OMAP54XX_WKUPDEP_I2C1_DMA_SDMA_MASK                                    (1 << 7)
+
+/* Used by PM_L4PER_I2C1_WKDEP */
+#define OMAP54XX_WKUPDEP_I2C1_IRQ_IPU_SHIFT                                    1
+#define OMAP54XX_WKUPDEP_I2C1_IRQ_IPU_WIDTH                                    0x1
+#define OMAP54XX_WKUPDEP_I2C1_IRQ_IPU_MASK                                     (1 << 1)
+
+/* Used by PM_L4PER_I2C1_WKDEP */
+#define OMAP54XX_WKUPDEP_I2C1_IRQ_MPU_SHIFT                                    0
+#define OMAP54XX_WKUPDEP_I2C1_IRQ_MPU_WIDTH                                    0x1
+#define OMAP54XX_WKUPDEP_I2C1_IRQ_MPU_MASK                                     (1 << 0)
+
+/* Used by PM_L4PER_I2C2_WKDEP */
+#define OMAP54XX_WKUPDEP_I2C2_DMA_SDMA_SHIFT                                   7
+#define OMAP54XX_WKUPDEP_I2C2_DMA_SDMA_WIDTH                                   0x1
+#define OMAP54XX_WKUPDEP_I2C2_DMA_SDMA_MASK                                    (1 << 7)
+
+/* Used by PM_L4PER_I2C2_WKDEP */
+#define OMAP54XX_WKUPDEP_I2C2_IRQ_IPU_SHIFT                                    1
+#define OMAP54XX_WKUPDEP_I2C2_IRQ_IPU_WIDTH                                    0x1
+#define OMAP54XX_WKUPDEP_I2C2_IRQ_IPU_MASK                                     (1 << 1)
+
+/* Used by PM_L4PER_I2C2_WKDEP */
+#define OMAP54XX_WKUPDEP_I2C2_IRQ_MPU_SHIFT                                    0
+#define OMAP54XX_WKUPDEP_I2C2_IRQ_MPU_WIDTH                                    0x1
+#define OMAP54XX_WKUPDEP_I2C2_IRQ_MPU_MASK                                     (1 << 0)
+
+/* Used by PM_L4PER_I2C3_WKDEP */
+#define OMAP54XX_WKUPDEP_I2C3_DMA_SDMA_SHIFT                                   7
+#define OMAP54XX_WKUPDEP_I2C3_DMA_SDMA_WIDTH                                   0x1
+#define OMAP54XX_WKUPDEP_I2C3_DMA_SDMA_MASK                                    (1 << 7)
+
+/* Used by PM_L4PER_I2C3_WKDEP */
+#define OMAP54XX_WKUPDEP_I2C3_IRQ_IPU_SHIFT                                    1
+#define OMAP54XX_WKUPDEP_I2C3_IRQ_IPU_WIDTH                                    0x1
+#define OMAP54XX_WKUPDEP_I2C3_IRQ_IPU_MASK                                     (1 << 1)
+
+/* Used by PM_L4PER_I2C3_WKDEP */
+#define OMAP54XX_WKUPDEP_I2C3_IRQ_MPU_SHIFT                                    0
+#define OMAP54XX_WKUPDEP_I2C3_IRQ_MPU_WIDTH                                    0x1
+#define OMAP54XX_WKUPDEP_I2C3_IRQ_MPU_MASK                                     (1 << 0)
+
+/* Used by PM_L4PER_I2C4_WKDEP */
+#define OMAP54XX_WKUPDEP_I2C4_DMA_SDMA_SHIFT                                   7
+#define OMAP54XX_WKUPDEP_I2C4_DMA_SDMA_WIDTH                                   0x1
+#define OMAP54XX_WKUPDEP_I2C4_DMA_SDMA_MASK                                    (1 << 7)
+
+/* Used by PM_L4PER_I2C4_WKDEP */
+#define OMAP54XX_WKUPDEP_I2C4_IRQ_IPU_SHIFT                                    1
+#define OMAP54XX_WKUPDEP_I2C4_IRQ_IPU_WIDTH                                    0x1
+#define OMAP54XX_WKUPDEP_I2C4_IRQ_IPU_MASK                                     (1 << 1)
+
+/* Used by PM_L4PER_I2C4_WKDEP */
+#define OMAP54XX_WKUPDEP_I2C4_IRQ_MPU_SHIFT                                    0
+#define OMAP54XX_WKUPDEP_I2C4_IRQ_MPU_WIDTH                                    0x1
+#define OMAP54XX_WKUPDEP_I2C4_IRQ_MPU_MASK                                     (1 << 0)
+
+/* Used by PM_L4PER_I2C5_WKDEP */
+#define OMAP54XX_WKUPDEP_I2C5_IRQ_MPU_SHIFT                                    0
+#define OMAP54XX_WKUPDEP_I2C5_IRQ_MPU_WIDTH                                    0x1
+#define OMAP54XX_WKUPDEP_I2C5_IRQ_MPU_MASK                                     (1 << 0)
+
+/* Used by PM_WKUPAON_KBD_WKDEP */
+#define OMAP54XX_WKUPDEP_KBD_MPU_SHIFT                                         0
+#define OMAP54XX_WKUPDEP_KBD_MPU_WIDTH                                         0x1
+#define OMAP54XX_WKUPDEP_KBD_MPU_MASK                                          (1 << 0)
+
+/* Used by PM_ABE_MCASP_WKDEP */
+#define OMAP54XX_WKUPDEP_MCASP_DMA_DSP_SHIFT                                   6
+#define OMAP54XX_WKUPDEP_MCASP_DMA_DSP_WIDTH                                   0x1
+#define OMAP54XX_WKUPDEP_MCASP_DMA_DSP_MASK                                    (1 << 6)
+
+/* Used by PM_ABE_MCASP_WKDEP */
+#define OMAP54XX_WKUPDEP_MCASP_DMA_SDMA_SHIFT                                  7
+#define OMAP54XX_WKUPDEP_MCASP_DMA_SDMA_WIDTH                                  0x1
+#define OMAP54XX_WKUPDEP_MCASP_DMA_SDMA_MASK                                   (1 << 7)
+
+/* Used by PM_ABE_MCASP_WKDEP */
+#define OMAP54XX_WKUPDEP_MCASP_IRQ_DSP_SHIFT                                   2
+#define OMAP54XX_WKUPDEP_MCASP_IRQ_DSP_WIDTH                                   0x1
+#define OMAP54XX_WKUPDEP_MCASP_IRQ_DSP_MASK                                    (1 << 2)
+
+/* Used by PM_ABE_MCASP_WKDEP */
+#define OMAP54XX_WKUPDEP_MCASP_IRQ_MPU_SHIFT                                   0
+#define OMAP54XX_WKUPDEP_MCASP_IRQ_MPU_WIDTH                                   0x1
+#define OMAP54XX_WKUPDEP_MCASP_IRQ_MPU_MASK                                    (1 << 0)
+
+/* Used by PM_ABE_MCBSP1_WKDEP */
+#define OMAP54XX_WKUPDEP_MCBSP1_DSP_SHIFT                                      2
+#define OMAP54XX_WKUPDEP_MCBSP1_DSP_WIDTH                                      0x1
+#define OMAP54XX_WKUPDEP_MCBSP1_DSP_MASK                                       (1 << 2)
+
+/* Used by PM_ABE_MCBSP1_WKDEP */
+#define OMAP54XX_WKUPDEP_MCBSP1_MPU_SHIFT                                      0
+#define OMAP54XX_WKUPDEP_MCBSP1_MPU_WIDTH                                      0x1
+#define OMAP54XX_WKUPDEP_MCBSP1_MPU_MASK                                       (1 << 0)
+
+/* Used by PM_ABE_MCBSP1_WKDEP */
+#define OMAP54XX_WKUPDEP_MCBSP1_SDMA_SHIFT                                     3
+#define OMAP54XX_WKUPDEP_MCBSP1_SDMA_WIDTH                                     0x1
+#define OMAP54XX_WKUPDEP_MCBSP1_SDMA_MASK                                      (1 << 3)
+
+/* Used by PM_ABE_MCBSP2_WKDEP */
+#define OMAP54XX_WKUPDEP_MCBSP2_DSP_SHIFT                                      2
+#define OMAP54XX_WKUPDEP_MCBSP2_DSP_WIDTH                                      0x1
+#define OMAP54XX_WKUPDEP_MCBSP2_DSP_MASK                                       (1 << 2)
+
+/* Used by PM_ABE_MCBSP2_WKDEP */
+#define OMAP54XX_WKUPDEP_MCBSP2_MPU_SHIFT                                      0
+#define OMAP54XX_WKUPDEP_MCBSP2_MPU_WIDTH                                      0x1
+#define OMAP54XX_WKUPDEP_MCBSP2_MPU_MASK                                       (1 << 0)
+
+/* Used by PM_ABE_MCBSP2_WKDEP */
+#define OMAP54XX_WKUPDEP_MCBSP2_SDMA_SHIFT                                     3
+#define OMAP54XX_WKUPDEP_MCBSP2_SDMA_WIDTH                                     0x1
+#define OMAP54XX_WKUPDEP_MCBSP2_SDMA_MASK                                      (1 << 3)
+
+/* Used by PM_ABE_MCBSP3_WKDEP */
+#define OMAP54XX_WKUPDEP_MCBSP3_DSP_SHIFT                                      2
+#define OMAP54XX_WKUPDEP_MCBSP3_DSP_WIDTH                                      0x1
+#define OMAP54XX_WKUPDEP_MCBSP3_DSP_MASK                                       (1 << 2)
+
+/* Used by PM_ABE_MCBSP3_WKDEP */
+#define OMAP54XX_WKUPDEP_MCBSP3_MPU_SHIFT                                      0
+#define OMAP54XX_WKUPDEP_MCBSP3_MPU_WIDTH                                      0x1
+#define OMAP54XX_WKUPDEP_MCBSP3_MPU_MASK                                       (1 << 0)
+
+/* Used by PM_ABE_MCBSP3_WKDEP */
+#define OMAP54XX_WKUPDEP_MCBSP3_SDMA_SHIFT                                     3
+#define OMAP54XX_WKUPDEP_MCBSP3_SDMA_WIDTH                                     0x1
+#define OMAP54XX_WKUPDEP_MCBSP3_SDMA_MASK                                      (1 << 3)
+
+/* Used by PM_ABE_MCPDM_WKDEP */
+#define OMAP54XX_WKUPDEP_MCPDM_DMA_DSP_SHIFT                                   6
+#define OMAP54XX_WKUPDEP_MCPDM_DMA_DSP_WIDTH                                   0x1
+#define OMAP54XX_WKUPDEP_MCPDM_DMA_DSP_MASK                                    (1 << 6)
+
+/* Used by PM_ABE_MCPDM_WKDEP */
+#define OMAP54XX_WKUPDEP_MCPDM_DMA_SDMA_SHIFT                                  7
+#define OMAP54XX_WKUPDEP_MCPDM_DMA_SDMA_WIDTH                                  0x1
+#define OMAP54XX_WKUPDEP_MCPDM_DMA_SDMA_MASK                                   (1 << 7)
+
+/* Used by PM_ABE_MCPDM_WKDEP */
+#define OMAP54XX_WKUPDEP_MCPDM_IRQ_DSP_SHIFT                                   2
+#define OMAP54XX_WKUPDEP_MCPDM_IRQ_DSP_WIDTH                                   0x1
+#define OMAP54XX_WKUPDEP_MCPDM_IRQ_DSP_MASK                                    (1 << 2)
+
+/* Used by PM_ABE_MCPDM_WKDEP */
+#define OMAP54XX_WKUPDEP_MCPDM_IRQ_MPU_SHIFT                                   0
+#define OMAP54XX_WKUPDEP_MCPDM_IRQ_MPU_WIDTH                                   0x1
+#define OMAP54XX_WKUPDEP_MCPDM_IRQ_MPU_MASK                                    (1 << 0)
+
+/* Used by PM_L4PER_MCSPI1_WKDEP */
+#define OMAP54XX_WKUPDEP_MCSPI1_DSP_SHIFT                                      2
+#define OMAP54XX_WKUPDEP_MCSPI1_DSP_WIDTH                                      0x1
+#define OMAP54XX_WKUPDEP_MCSPI1_DSP_MASK                                       (1 << 2)
+
+/* Used by PM_L4PER_MCSPI1_WKDEP */
+#define OMAP54XX_WKUPDEP_MCSPI1_IPU_SHIFT                                      1
+#define OMAP54XX_WKUPDEP_MCSPI1_IPU_WIDTH                                      0x1
+#define OMAP54XX_WKUPDEP_MCSPI1_IPU_MASK                                       (1 << 1)
+
+/* Used by PM_L4PER_MCSPI1_WKDEP */
+#define OMAP54XX_WKUPDEP_MCSPI1_MPU_SHIFT                                      0
+#define OMAP54XX_WKUPDEP_MCSPI1_MPU_WIDTH                                      0x1
+#define OMAP54XX_WKUPDEP_MCSPI1_MPU_MASK                                       (1 << 0)
+
+/* Used by PM_L4PER_MCSPI1_WKDEP */
+#define OMAP54XX_WKUPDEP_MCSPI1_SDMA_SHIFT                                     3
+#define OMAP54XX_WKUPDEP_MCSPI1_SDMA_WIDTH                                     0x1
+#define OMAP54XX_WKUPDEP_MCSPI1_SDMA_MASK                                      (1 << 3)
+
+/* Used by PM_L4PER_MCSPI2_WKDEP */
+#define OMAP54XX_WKUPDEP_MCSPI2_IPU_SHIFT                                      1
+#define OMAP54XX_WKUPDEP_MCSPI2_IPU_WIDTH                                      0x1
+#define OMAP54XX_WKUPDEP_MCSPI2_IPU_MASK                                       (1 << 1)
+
+/* Used by PM_L4PER_MCSPI2_WKDEP */
+#define OMAP54XX_WKUPDEP_MCSPI2_MPU_SHIFT                                      0
+#define OMAP54XX_WKUPDEP_MCSPI2_MPU_WIDTH                                      0x1
+#define OMAP54XX_WKUPDEP_MCSPI2_MPU_MASK                                       (1 << 0)
+
+/* Used by PM_L4PER_MCSPI2_WKDEP */
+#define OMAP54XX_WKUPDEP_MCSPI2_SDMA_SHIFT                                     3
+#define OMAP54XX_WKUPDEP_MCSPI2_SDMA_WIDTH                                     0x1
+#define OMAP54XX_WKUPDEP_MCSPI2_SDMA_MASK                                      (1 << 3)
+
+/* Used by PM_L4PER_MCSPI3_WKDEP */
+#define OMAP54XX_WKUPDEP_MCSPI3_MPU_SHIFT                                      0
+#define OMAP54XX_WKUPDEP_MCSPI3_MPU_WIDTH                                      0x1
+#define OMAP54XX_WKUPDEP_MCSPI3_MPU_MASK                                       (1 << 0)
+
+/* Used by PM_L4PER_MCSPI3_WKDEP */
+#define OMAP54XX_WKUPDEP_MCSPI3_SDMA_SHIFT                                     3
+#define OMAP54XX_WKUPDEP_MCSPI3_SDMA_WIDTH                                     0x1
+#define OMAP54XX_WKUPDEP_MCSPI3_SDMA_MASK                                      (1 << 3)
+
+/* Used by PM_L4PER_MCSPI4_WKDEP */
+#define OMAP54XX_WKUPDEP_MCSPI4_MPU_SHIFT                                      0
+#define OMAP54XX_WKUPDEP_MCSPI4_MPU_WIDTH                                      0x1
+#define OMAP54XX_WKUPDEP_MCSPI4_MPU_MASK                                       (1 << 0)
+
+/* Used by PM_L4PER_MCSPI4_WKDEP */
+#define OMAP54XX_WKUPDEP_MCSPI4_SDMA_SHIFT                                     3
+#define OMAP54XX_WKUPDEP_MCSPI4_SDMA_WIDTH                                     0x1
+#define OMAP54XX_WKUPDEP_MCSPI4_SDMA_MASK                                      (1 << 3)
+
+/* Used by PM_L3INIT_MMC1_WKDEP */
+#define OMAP54XX_WKUPDEP_MMC1_DSP_SHIFT                                                2
+#define OMAP54XX_WKUPDEP_MMC1_DSP_WIDTH                                                0x1
+#define OMAP54XX_WKUPDEP_MMC1_DSP_MASK                                         (1 << 2)
+
+/* Used by PM_L3INIT_MMC1_WKDEP */
+#define OMAP54XX_WKUPDEP_MMC1_IPU_SHIFT                                                1
+#define OMAP54XX_WKUPDEP_MMC1_IPU_WIDTH                                                0x1
+#define OMAP54XX_WKUPDEP_MMC1_IPU_MASK                                         (1 << 1)
+
+/* Used by PM_L3INIT_MMC1_WKDEP */
+#define OMAP54XX_WKUPDEP_MMC1_MPU_SHIFT                                                0
+#define OMAP54XX_WKUPDEP_MMC1_MPU_WIDTH                                                0x1
+#define OMAP54XX_WKUPDEP_MMC1_MPU_MASK                                         (1 << 0)
+
+/* Used by PM_L3INIT_MMC1_WKDEP */
+#define OMAP54XX_WKUPDEP_MMC1_SDMA_SHIFT                                       3
+#define OMAP54XX_WKUPDEP_MMC1_SDMA_WIDTH                                       0x1
+#define OMAP54XX_WKUPDEP_MMC1_SDMA_MASK                                                (1 << 3)
+
+/* Used by PM_L3INIT_MMC2_WKDEP */
+#define OMAP54XX_WKUPDEP_MMC2_DSP_SHIFT                                                2
+#define OMAP54XX_WKUPDEP_MMC2_DSP_WIDTH                                                0x1
+#define OMAP54XX_WKUPDEP_MMC2_DSP_MASK                                         (1 << 2)
+
+/* Used by PM_L3INIT_MMC2_WKDEP */
+#define OMAP54XX_WKUPDEP_MMC2_IPU_SHIFT                                                1
+#define OMAP54XX_WKUPDEP_MMC2_IPU_WIDTH                                                0x1
+#define OMAP54XX_WKUPDEP_MMC2_IPU_MASK                                         (1 << 1)
+
+/* Used by PM_L3INIT_MMC2_WKDEP */
+#define OMAP54XX_WKUPDEP_MMC2_MPU_SHIFT                                                0
+#define OMAP54XX_WKUPDEP_MMC2_MPU_WIDTH                                                0x1
+#define OMAP54XX_WKUPDEP_MMC2_MPU_MASK                                         (1 << 0)
+
+/* Used by PM_L3INIT_MMC2_WKDEP */
+#define OMAP54XX_WKUPDEP_MMC2_SDMA_SHIFT                                       3
+#define OMAP54XX_WKUPDEP_MMC2_SDMA_WIDTH                                       0x1
+#define OMAP54XX_WKUPDEP_MMC2_SDMA_MASK                                                (1 << 3)
+
+/* Used by PM_L4PER_MMC3_WKDEP */
+#define OMAP54XX_WKUPDEP_MMC3_IPU_SHIFT                                                1
+#define OMAP54XX_WKUPDEP_MMC3_IPU_WIDTH                                                0x1
+#define OMAP54XX_WKUPDEP_MMC3_IPU_MASK                                         (1 << 1)
+
+/* Used by PM_L4PER_MMC3_WKDEP */
+#define OMAP54XX_WKUPDEP_MMC3_MPU_SHIFT                                                0
+#define OMAP54XX_WKUPDEP_MMC3_MPU_WIDTH                                                0x1
+#define OMAP54XX_WKUPDEP_MMC3_MPU_MASK                                         (1 << 0)
+
+/* Used by PM_L4PER_MMC3_WKDEP */
+#define OMAP54XX_WKUPDEP_MMC3_SDMA_SHIFT                                       3
+#define OMAP54XX_WKUPDEP_MMC3_SDMA_WIDTH                                       0x1
+#define OMAP54XX_WKUPDEP_MMC3_SDMA_MASK                                                (1 << 3)
+
+/* Used by PM_L4PER_MMC4_WKDEP */
+#define OMAP54XX_WKUPDEP_MMC4_MPU_SHIFT                                                0
+#define OMAP54XX_WKUPDEP_MMC4_MPU_WIDTH                                                0x1
+#define OMAP54XX_WKUPDEP_MMC4_MPU_MASK                                         (1 << 0)
+
+/* Used by PM_L4PER_MMC4_WKDEP */
+#define OMAP54XX_WKUPDEP_MMC4_SDMA_SHIFT                                       3
+#define OMAP54XX_WKUPDEP_MMC4_SDMA_WIDTH                                       0x1
+#define OMAP54XX_WKUPDEP_MMC4_SDMA_MASK                                                (1 << 3)
+
+/* Used by PM_L4PER_MMC5_WKDEP */
+#define OMAP54XX_WKUPDEP_MMC5_MPU_SHIFT                                                0
+#define OMAP54XX_WKUPDEP_MMC5_MPU_WIDTH                                                0x1
+#define OMAP54XX_WKUPDEP_MMC5_MPU_MASK                                         (1 << 0)
+
+/* Used by PM_L4PER_MMC5_WKDEP */
+#define OMAP54XX_WKUPDEP_MMC5_SDMA_SHIFT                                       3
+#define OMAP54XX_WKUPDEP_MMC5_SDMA_WIDTH                                       0x1
+#define OMAP54XX_WKUPDEP_MMC5_SDMA_MASK                                                (1 << 3)
+
+/* Used by PM_L3INIT_SATA_WKDEP */
+#define OMAP54XX_WKUPDEP_SATA_MPU_SHIFT                                                0
+#define OMAP54XX_WKUPDEP_SATA_MPU_WIDTH                                                0x1
+#define OMAP54XX_WKUPDEP_SATA_MPU_MASK                                         (1 << 0)
+
+/* Used by PM_ABE_SLIMBUS1_WKDEP */
+#define OMAP54XX_WKUPDEP_SLIMBUS1_DMA_DSP_SHIFT                                        6
+#define OMAP54XX_WKUPDEP_SLIMBUS1_DMA_DSP_WIDTH                                        0x1
+#define OMAP54XX_WKUPDEP_SLIMBUS1_DMA_DSP_MASK                                 (1 << 6)
+
+/* Used by PM_ABE_SLIMBUS1_WKDEP */
+#define OMAP54XX_WKUPDEP_SLIMBUS1_DMA_SDMA_SHIFT                               7
+#define OMAP54XX_WKUPDEP_SLIMBUS1_DMA_SDMA_WIDTH                               0x1
+#define OMAP54XX_WKUPDEP_SLIMBUS1_DMA_SDMA_MASK                                        (1 << 7)
+
+/* Used by PM_ABE_SLIMBUS1_WKDEP */
+#define OMAP54XX_WKUPDEP_SLIMBUS1_IRQ_DSP_SHIFT                                        2
+#define OMAP54XX_WKUPDEP_SLIMBUS1_IRQ_DSP_WIDTH                                        0x1
+#define OMAP54XX_WKUPDEP_SLIMBUS1_IRQ_DSP_MASK                                 (1 << 2)
+
+/* Used by PM_ABE_SLIMBUS1_WKDEP */
+#define OMAP54XX_WKUPDEP_SLIMBUS1_IRQ_MPU_SHIFT                                        0
+#define OMAP54XX_WKUPDEP_SLIMBUS1_IRQ_MPU_WIDTH                                        0x1
+#define OMAP54XX_WKUPDEP_SLIMBUS1_IRQ_MPU_MASK                                 (1 << 0)
+
+/* Used by PM_COREAON_SMARTREFLEX_CORE_WKDEP */
+#define OMAP54XX_WKUPDEP_SMARTREFLEX_CORE_IPU_SHIFT                            1
+#define OMAP54XX_WKUPDEP_SMARTREFLEX_CORE_IPU_WIDTH                            0x1
+#define OMAP54XX_WKUPDEP_SMARTREFLEX_CORE_IPU_MASK                             (1 << 1)
+
+/* Used by PM_COREAON_SMARTREFLEX_CORE_WKDEP */
+#define OMAP54XX_WKUPDEP_SMARTREFLEX_CORE_MPU_SHIFT                            0
+#define OMAP54XX_WKUPDEP_SMARTREFLEX_CORE_MPU_WIDTH                            0x1
+#define OMAP54XX_WKUPDEP_SMARTREFLEX_CORE_MPU_MASK                             (1 << 0)
+
+/* Used by PM_COREAON_SMARTREFLEX_MM_WKDEP */
+#define OMAP54XX_WKUPDEP_SMARTREFLEX_MM_MPU_SHIFT                              0
+#define OMAP54XX_WKUPDEP_SMARTREFLEX_MM_MPU_WIDTH                              0x1
+#define OMAP54XX_WKUPDEP_SMARTREFLEX_MM_MPU_MASK                               (1 << 0)
+
+/* Used by PM_COREAON_SMARTREFLEX_MPU_WKDEP */
+#define OMAP54XX_WKUPDEP_SMARTREFLEX_MPU_MPU_SHIFT                             0
+#define OMAP54XX_WKUPDEP_SMARTREFLEX_MPU_MPU_WIDTH                             0x1
+#define OMAP54XX_WKUPDEP_SMARTREFLEX_MPU_MPU_MASK                              (1 << 0)
+
+/* Used by PM_L4PER_TIMER10_WKDEP */
+#define OMAP54XX_WKUPDEP_TIMER10_MPU_SHIFT                                     0
+#define OMAP54XX_WKUPDEP_TIMER10_MPU_WIDTH                                     0x1
+#define OMAP54XX_WKUPDEP_TIMER10_MPU_MASK                                      (1 << 0)
+
+/* Used by PM_L4PER_TIMER11_WKDEP */
+#define OMAP54XX_WKUPDEP_TIMER11_IPU_SHIFT                                     1
+#define OMAP54XX_WKUPDEP_TIMER11_IPU_WIDTH                                     0x1
+#define OMAP54XX_WKUPDEP_TIMER11_IPU_MASK                                      (1 << 1)
+
+/* Used by PM_L4PER_TIMER11_WKDEP */
+#define OMAP54XX_WKUPDEP_TIMER11_MPU_SHIFT                                     0
+#define OMAP54XX_WKUPDEP_TIMER11_MPU_WIDTH                                     0x1
+#define OMAP54XX_WKUPDEP_TIMER11_MPU_MASK                                      (1 << 0)
+
+/* Used by PM_WKUPAON_TIMER12_WKDEP */
+#define OMAP54XX_WKUPDEP_TIMER12_MPU_SHIFT                                     0
+#define OMAP54XX_WKUPDEP_TIMER12_MPU_WIDTH                                     0x1
+#define OMAP54XX_WKUPDEP_TIMER12_MPU_MASK                                      (1 << 0)
+
+/* Used by PM_WKUPAON_TIMER1_WKDEP */
+#define OMAP54XX_WKUPDEP_TIMER1_MPU_SHIFT                                      0
+#define OMAP54XX_WKUPDEP_TIMER1_MPU_WIDTH                                      0x1
+#define OMAP54XX_WKUPDEP_TIMER1_MPU_MASK                                       (1 << 0)
+
+/* Used by PM_L4PER_TIMER2_WKDEP */
+#define OMAP54XX_WKUPDEP_TIMER2_MPU_SHIFT                                      0
+#define OMAP54XX_WKUPDEP_TIMER2_MPU_WIDTH                                      0x1
+#define OMAP54XX_WKUPDEP_TIMER2_MPU_MASK                                       (1 << 0)
+
+/* Used by PM_L4PER_TIMER3_WKDEP */
+#define OMAP54XX_WKUPDEP_TIMER3_IPU_SHIFT                                      1
+#define OMAP54XX_WKUPDEP_TIMER3_IPU_WIDTH                                      0x1
+#define OMAP54XX_WKUPDEP_TIMER3_IPU_MASK                                       (1 << 1)
+
+/* Used by PM_L4PER_TIMER3_WKDEP */
+#define OMAP54XX_WKUPDEP_TIMER3_MPU_SHIFT                                      0
+#define OMAP54XX_WKUPDEP_TIMER3_MPU_WIDTH                                      0x1
+#define OMAP54XX_WKUPDEP_TIMER3_MPU_MASK                                       (1 << 0)
+
+/* Used by PM_L4PER_TIMER4_WKDEP */
+#define OMAP54XX_WKUPDEP_TIMER4_IPU_SHIFT                                      1
+#define OMAP54XX_WKUPDEP_TIMER4_IPU_WIDTH                                      0x1
+#define OMAP54XX_WKUPDEP_TIMER4_IPU_MASK                                       (1 << 1)
+
+/* Used by PM_L4PER_TIMER4_WKDEP */
+#define OMAP54XX_WKUPDEP_TIMER4_MPU_SHIFT                                      0
+#define OMAP54XX_WKUPDEP_TIMER4_MPU_WIDTH                                      0x1
+#define OMAP54XX_WKUPDEP_TIMER4_MPU_MASK                                       (1 << 0)
+
+/* Used by PM_ABE_TIMER5_WKDEP */
+#define OMAP54XX_WKUPDEP_TIMER5_DSP_SHIFT                                      2
+#define OMAP54XX_WKUPDEP_TIMER5_DSP_WIDTH                                      0x1
+#define OMAP54XX_WKUPDEP_TIMER5_DSP_MASK                                       (1 << 2)
+
+/* Used by PM_ABE_TIMER5_WKDEP */
+#define OMAP54XX_WKUPDEP_TIMER5_MPU_SHIFT                                      0
+#define OMAP54XX_WKUPDEP_TIMER5_MPU_WIDTH                                      0x1
+#define OMAP54XX_WKUPDEP_TIMER5_MPU_MASK                                       (1 << 0)
+
+/* Used by PM_ABE_TIMER6_WKDEP */
+#define OMAP54XX_WKUPDEP_TIMER6_DSP_SHIFT                                      2
+#define OMAP54XX_WKUPDEP_TIMER6_DSP_WIDTH                                      0x1
+#define OMAP54XX_WKUPDEP_TIMER6_DSP_MASK                                       (1 << 2)
+
+/* Used by PM_ABE_TIMER6_WKDEP */
+#define OMAP54XX_WKUPDEP_TIMER6_MPU_SHIFT                                      0
+#define OMAP54XX_WKUPDEP_TIMER6_MPU_WIDTH                                      0x1
+#define OMAP54XX_WKUPDEP_TIMER6_MPU_MASK                                       (1 << 0)
+
+/* Used by PM_ABE_TIMER7_WKDEP */
+#define OMAP54XX_WKUPDEP_TIMER7_DSP_SHIFT                                      2
+#define OMAP54XX_WKUPDEP_TIMER7_DSP_WIDTH                                      0x1
+#define OMAP54XX_WKUPDEP_TIMER7_DSP_MASK                                       (1 << 2)
+
+/* Used by PM_ABE_TIMER7_WKDEP */
+#define OMAP54XX_WKUPDEP_TIMER7_MPU_SHIFT                                      0
+#define OMAP54XX_WKUPDEP_TIMER7_MPU_WIDTH                                      0x1
+#define OMAP54XX_WKUPDEP_TIMER7_MPU_MASK                                       (1 << 0)
+
+/* Used by PM_ABE_TIMER8_WKDEP */
+#define OMAP54XX_WKUPDEP_TIMER8_DSP_SHIFT                                      2
+#define OMAP54XX_WKUPDEP_TIMER8_DSP_WIDTH                                      0x1
+#define OMAP54XX_WKUPDEP_TIMER8_DSP_MASK                                       (1 << 2)
+
+/* Used by PM_ABE_TIMER8_WKDEP */
+#define OMAP54XX_WKUPDEP_TIMER8_MPU_SHIFT                                      0
+#define OMAP54XX_WKUPDEP_TIMER8_MPU_WIDTH                                      0x1
+#define OMAP54XX_WKUPDEP_TIMER8_MPU_MASK                                       (1 << 0)
+
+/* Used by PM_L4PER_TIMER9_WKDEP */
+#define OMAP54XX_WKUPDEP_TIMER9_IPU_SHIFT                                      1
+#define OMAP54XX_WKUPDEP_TIMER9_IPU_WIDTH                                      0x1
+#define OMAP54XX_WKUPDEP_TIMER9_IPU_MASK                                       (1 << 1)
+
+/* Used by PM_L4PER_TIMER9_WKDEP */
+#define OMAP54XX_WKUPDEP_TIMER9_MPU_SHIFT                                      0
+#define OMAP54XX_WKUPDEP_TIMER9_MPU_WIDTH                                      0x1
+#define OMAP54XX_WKUPDEP_TIMER9_MPU_MASK                                       (1 << 0)
+
+/* Used by PM_L4PER_UART1_WKDEP */
+#define OMAP54XX_WKUPDEP_UART1_MPU_SHIFT                                       0
+#define OMAP54XX_WKUPDEP_UART1_MPU_WIDTH                                       0x1
+#define OMAP54XX_WKUPDEP_UART1_MPU_MASK                                                (1 << 0)
+
+/* Used by PM_L4PER_UART1_WKDEP */
+#define OMAP54XX_WKUPDEP_UART1_SDMA_SHIFT                                      3
+#define OMAP54XX_WKUPDEP_UART1_SDMA_WIDTH                                      0x1
+#define OMAP54XX_WKUPDEP_UART1_SDMA_MASK                                       (1 << 3)
+
+/* Used by PM_L4PER_UART2_WKDEP */
+#define OMAP54XX_WKUPDEP_UART2_MPU_SHIFT                                       0
+#define OMAP54XX_WKUPDEP_UART2_MPU_WIDTH                                       0x1
+#define OMAP54XX_WKUPDEP_UART2_MPU_MASK                                                (1 << 0)
+
+/* Used by PM_L4PER_UART2_WKDEP */
+#define OMAP54XX_WKUPDEP_UART2_SDMA_SHIFT                                      3
+#define OMAP54XX_WKUPDEP_UART2_SDMA_WIDTH                                      0x1
+#define OMAP54XX_WKUPDEP_UART2_SDMA_MASK                                       (1 << 3)
+
+/* Used by PM_L4PER_UART3_WKDEP */
+#define OMAP54XX_WKUPDEP_UART3_DSP_SHIFT                                       2
+#define OMAP54XX_WKUPDEP_UART3_DSP_WIDTH                                       0x1
+#define OMAP54XX_WKUPDEP_UART3_DSP_MASK                                                (1 << 2)
+
+/* Used by PM_L4PER_UART3_WKDEP */
+#define OMAP54XX_WKUPDEP_UART3_IPU_SHIFT                                       1
+#define OMAP54XX_WKUPDEP_UART3_IPU_WIDTH                                       0x1
+#define OMAP54XX_WKUPDEP_UART3_IPU_MASK                                                (1 << 1)
+
+/* Used by PM_L4PER_UART3_WKDEP */
+#define OMAP54XX_WKUPDEP_UART3_MPU_SHIFT                                       0
+#define OMAP54XX_WKUPDEP_UART3_MPU_WIDTH                                       0x1
+#define OMAP54XX_WKUPDEP_UART3_MPU_MASK                                                (1 << 0)
+
+/* Used by PM_L4PER_UART3_WKDEP */
+#define OMAP54XX_WKUPDEP_UART3_SDMA_SHIFT                                      3
+#define OMAP54XX_WKUPDEP_UART3_SDMA_WIDTH                                      0x1
+#define OMAP54XX_WKUPDEP_UART3_SDMA_MASK                                       (1 << 3)
+
+/* Used by PM_L4PER_UART4_WKDEP */
+#define OMAP54XX_WKUPDEP_UART4_MPU_SHIFT                                       0
+#define OMAP54XX_WKUPDEP_UART4_MPU_WIDTH                                       0x1
+#define OMAP54XX_WKUPDEP_UART4_MPU_MASK                                                (1 << 0)
+
+/* Used by PM_L4PER_UART4_WKDEP */
+#define OMAP54XX_WKUPDEP_UART4_SDMA_SHIFT                                      3
+#define OMAP54XX_WKUPDEP_UART4_SDMA_WIDTH                                      0x1
+#define OMAP54XX_WKUPDEP_UART4_SDMA_MASK                                       (1 << 3)
+
+/* Used by PM_L4PER_UART5_WKDEP */
+#define OMAP54XX_WKUPDEP_UART5_MPU_SHIFT                                       0
+#define OMAP54XX_WKUPDEP_UART5_MPU_WIDTH                                       0x1
+#define OMAP54XX_WKUPDEP_UART5_MPU_MASK                                                (1 << 0)
+
+/* Used by PM_L4PER_UART5_WKDEP */
+#define OMAP54XX_WKUPDEP_UART5_SDMA_SHIFT                                      3
+#define OMAP54XX_WKUPDEP_UART5_SDMA_WIDTH                                      0x1
+#define OMAP54XX_WKUPDEP_UART5_SDMA_MASK                                       (1 << 3)
+
+/* Used by PM_L4PER_UART6_WKDEP */
+#define OMAP54XX_WKUPDEP_UART6_MPU_SHIFT                                       0
+#define OMAP54XX_WKUPDEP_UART6_MPU_WIDTH                                       0x1
+#define OMAP54XX_WKUPDEP_UART6_MPU_MASK                                                (1 << 0)
+
+/* Used by PM_L4PER_UART6_WKDEP */
+#define OMAP54XX_WKUPDEP_UART6_SDMA_SHIFT                                      3
+#define OMAP54XX_WKUPDEP_UART6_SDMA_WIDTH                                      0x1
+#define OMAP54XX_WKUPDEP_UART6_SDMA_MASK                                       (1 << 3)
+
+/* Used by PM_L3INIT_UNIPRO2_WKDEP */
+#define OMAP54XX_WKUPDEP_UNIPRO2_MPU_SHIFT                                     0
+#define OMAP54XX_WKUPDEP_UNIPRO2_MPU_WIDTH                                     0x1
+#define OMAP54XX_WKUPDEP_UNIPRO2_MPU_MASK                                      (1 << 0)
+
+/* Used by PM_L3INIT_USB_HOST_HS_WKDEP */
+#define OMAP54XX_WKUPDEP_USB_HOST_HS_IPU_SHIFT                                 1
+#define OMAP54XX_WKUPDEP_USB_HOST_HS_IPU_WIDTH                                 0x1
+#define OMAP54XX_WKUPDEP_USB_HOST_HS_IPU_MASK                                  (1 << 1)
+
+/* Used by PM_L3INIT_USB_HOST_HS_WKDEP */
+#define OMAP54XX_WKUPDEP_USB_HOST_HS_MPU_SHIFT                                 0
+#define OMAP54XX_WKUPDEP_USB_HOST_HS_MPU_WIDTH                                 0x1
+#define OMAP54XX_WKUPDEP_USB_HOST_HS_MPU_MASK                                  (1 << 0)
+
+/* Used by PM_L3INIT_USB_OTG_SS_WKDEP */
+#define OMAP54XX_WKUPDEP_USB_OTG_SS_IPU_SHIFT                                  1
+#define OMAP54XX_WKUPDEP_USB_OTG_SS_IPU_WIDTH                                  0x1
+#define OMAP54XX_WKUPDEP_USB_OTG_SS_IPU_MASK                                   (1 << 1)
+
+/* Used by PM_L3INIT_USB_OTG_SS_WKDEP */
+#define OMAP54XX_WKUPDEP_USB_OTG_SS_MPU_SHIFT                                  0
+#define OMAP54XX_WKUPDEP_USB_OTG_SS_MPU_WIDTH                                  0x1
+#define OMAP54XX_WKUPDEP_USB_OTG_SS_MPU_MASK                                   (1 << 0)
+
+/* Used by PM_L3INIT_USB_TLL_HS_WKDEP */
+#define OMAP54XX_WKUPDEP_USB_TLL_HS_IPU_SHIFT                                  1
+#define OMAP54XX_WKUPDEP_USB_TLL_HS_IPU_WIDTH                                  0x1
+#define OMAP54XX_WKUPDEP_USB_TLL_HS_IPU_MASK                                   (1 << 1)
+
+/* Used by PM_L3INIT_USB_TLL_HS_WKDEP */
+#define OMAP54XX_WKUPDEP_USB_TLL_HS_MPU_SHIFT                                  0
+#define OMAP54XX_WKUPDEP_USB_TLL_HS_MPU_WIDTH                                  0x1
+#define OMAP54XX_WKUPDEP_USB_TLL_HS_MPU_MASK                                   (1 << 0)
+
+/* Used by PM_WKUPAON_WD_TIMER2_WKDEP */
+#define OMAP54XX_WKUPDEP_WD_TIMER2_MPU_SHIFT                                   0
+#define OMAP54XX_WKUPDEP_WD_TIMER2_MPU_WIDTH                                   0x1
+#define OMAP54XX_WKUPDEP_WD_TIMER2_MPU_MASK                                    (1 << 0)
+
+/* Used by PM_ABE_WD_TIMER3_WKDEP */
+#define OMAP54XX_WKUPDEP_WD_TIMER3_MPU_SHIFT                                   0
+#define OMAP54XX_WKUPDEP_WD_TIMER3_MPU_WIDTH                                   0x1
+#define OMAP54XX_WKUPDEP_WD_TIMER3_MPU_MASK                                    (1 << 0)
+
+/* Used by PRM_IO_PMCTRL */
+#define OMAP54XX_WUCLK_CTRL_SHIFT                                              8
+#define OMAP54XX_WUCLK_CTRL_WIDTH                                              0x1
+#define OMAP54XX_WUCLK_CTRL_MASK                                               (1 << 8)
+
+/* Used by PRM_IO_PMCTRL */
+#define OMAP54XX_WUCLK_STATUS_SHIFT                                            9
+#define OMAP54XX_WUCLK_STATUS_WIDTH                                            0x1
+#define OMAP54XX_WUCLK_STATUS_MASK                                             (1 << 9)
+
+/* Used by REVISION_PRM */
+#define OMAP54XX_X_MAJOR_SHIFT                                                 8
+#define OMAP54XX_X_MAJOR_WIDTH                                                 0x3
+#define OMAP54XX_X_MAJOR_MASK                                                  (0x7 << 8)
+
+/* Used by REVISION_PRM */
+#define OMAP54XX_Y_MINOR_SHIFT                                                 0
+#define OMAP54XX_Y_MINOR_WIDTH                                                 0x6
+#define OMAP54XX_Y_MINOR_MASK                                                  (0x3f << 0)
+#endif
index 8ee1fbdec5615c47c9345c88eb689249e8ea90ae..7db2422faa16e8b788901c8f1a8396226a0e1123 100644 (file)
@@ -25,6 +25,7 @@
 #ifndef __ARCH_ARM_MACH_OMAP2_PRM44XX_H
 #define __ARCH_ARM_MACH_OMAP2_PRM44XX_H
 
+#include "prm44xx_54xx.h"
 #include "prcm-common.h"
 #include "prm.h"
 
 #define OMAP4_PRM_VC_ERRST_OFFSET                      0x00f8
 #define OMAP4430_PRM_VC_ERRST                          OMAP44XX_PRM_REGADDR(OMAP4430_PRM_DEVICE_INST, 0x00f8)
 
-/* Function prototypes */
-# ifndef __ASSEMBLER__
-
-extern u32 omap4_prm_read_inst_reg(s16 inst, u16 idx);
-extern void omap4_prm_write_inst_reg(u32 val, s16 inst, u16 idx);
-extern u32 omap4_prm_rmw_inst_reg_bits(u32 mask, u32 bits, s16 inst, s16 idx);
-
-/* OMAP4-specific VP functions */
-u32 omap4_prm_vp_check_txdone(u8 vp_id);
-void omap4_prm_vp_clear_txdone(u8 vp_id);
-
-/*
- * OMAP4 access functions for voltage controller (VC) and
- * voltage proccessor (VP) in the PRM.
- */
-extern u32 omap4_prm_vcvp_read(u8 offset);
-extern void omap4_prm_vcvp_write(u32 val, u8 offset);
-extern u32 omap4_prm_vcvp_rmw(u32 mask, u32 bits, u8 offset);
-
-extern void omap44xx_prm_reconfigure_io_chain(void);
-
-/* PRM interrupt-related functions */
-extern void omap44xx_prm_read_pending_irqs(unsigned long *events);
-extern void omap44xx_prm_ocp_barrier(void);
-extern void omap44xx_prm_save_and_clear_irqen(u32 *saved_mask);
-extern void omap44xx_prm_restore_irqen(u32 *saved_mask);
-
-extern int __init omap44xx_prm_init(void);
-extern u32 omap44xx_prm_get_reset_sources(void);
-
-# endif
-
 #endif
diff --git a/arch/arm/mach-omap2/prm44xx_54xx.h b/arch/arm/mach-omap2/prm44xx_54xx.h
new file mode 100644 (file)
index 0000000..7cd22ab
--- /dev/null
@@ -0,0 +1,58 @@
+/*
+ * OMAP44xx and 54xx PRM common functions
+ *
+ * Copyright (C) 2009-2013 Texas Instruments, Inc.
+ * Copyright (C) 2009-2010 Nokia Corporation
+ *
+ * Paul Walmsley (paul@pwsan.com)
+ * Rajendra Nayak (rnayak@ti.com)
+ * Benoit Cousson (b-cousson@ti.com)
+ *
+ * This file is automatically generated from the OMAP hardware databases.
+ * We respectfully ask that any modifications to this file be coordinated
+ * with the public linux-omap@vger.kernel.org mailing list and the
+ * authors above to ensure that the autogeneration scripts are kept
+ * up-to-date with the file contents.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ */
+
+#ifndef __ARCH_ARM_MACH_OMAP2_PRM44XX_54XX_H
+#define __ARCH_ARM_MACH_OMAP2_PRM44XX_54XX_H
+
+/* Function prototypes */
+#ifndef __ASSEMBLER__
+
+extern u32 omap4_prm_read_inst_reg(s16 inst, u16 idx);
+extern void omap4_prm_write_inst_reg(u32 val, s16 inst, u16 idx);
+extern u32 omap4_prm_rmw_inst_reg_bits(u32 mask, u32 bits, s16 inst, s16 idx);
+
+/* OMAP4/OMAP5-specific VP functions */
+u32 omap4_prm_vp_check_txdone(u8 vp_id);
+void omap4_prm_vp_clear_txdone(u8 vp_id);
+
+/*
+ * OMAP4/OMAP5 access functions for voltage controller (VC) and
+ * voltage proccessor (VP) in the PRM.
+ */
+extern u32 omap4_prm_vcvp_read(u8 offset);
+extern void omap4_prm_vcvp_write(u32 val, u8 offset);
+extern u32 omap4_prm_vcvp_rmw(u32 mask, u32 bits, u8 offset);
+
+extern void omap44xx_prm_reconfigure_io_chain(void);
+
+/* PRM interrupt-related functions */
+extern void omap44xx_prm_read_pending_irqs(unsigned long *events);
+extern void omap44xx_prm_ocp_barrier(void);
+extern void omap44xx_prm_save_and_clear_irqen(u32 *saved_mask);
+extern void omap44xx_prm_restore_irqen(u32 *saved_mask);
+
+extern int __init omap44xx_prm_init(void);
+extern u32 omap44xx_prm_get_reset_sources(void);
+
+#endif
+
+#endif
diff --git a/arch/arm/mach-omap2/prm54xx.h b/arch/arm/mach-omap2/prm54xx.h
new file mode 100644 (file)
index 0000000..e441101
--- /dev/null
@@ -0,0 +1,421 @@
+/*
+ * OMAP54xx PRM instance offset macros
+ *
+ * Copyright (C) 2013 Texas Instruments Incorporated - http://www.ti.com
+ *
+ * Paul Walmsley (paul@pwsan.com)
+ * Rajendra Nayak (rnayak@ti.com)
+ * Benoit Cousson (b-cousson@ti.com)
+ *
+ * This file is automatically generated from the OMAP hardware databases.
+ * We respectfully ask that any modifications to this file be coordinated
+ * with the public linux-omap@vger.kernel.org mailing list and the
+ * authors above to ensure that the autogeneration scripts are kept
+ * up-to-date with the file contents.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#ifndef __ARCH_ARM_MACH_OMAP2_PRM54XX_H
+#define __ARCH_ARM_MACH_OMAP2_PRM54XX_H
+
+#include "prm44xx_54xx.h"
+#include "prcm-common.h"
+#include "prm.h"
+
+#define OMAP54XX_PRM_BASE              0x4ae06000
+
+#define OMAP54XX_PRM_REGADDR(inst, reg)                                \
+       OMAP2_L4_IO_ADDRESS(OMAP54XX_PRM_BASE + (inst) + (reg))
+
+
+/* PRM instances */
+#define OMAP54XX_PRM_OCP_SOCKET_INST   0x0000
+#define OMAP54XX_PRM_CKGEN_INST                0x0100
+#define OMAP54XX_PRM_MPU_INST          0x0300
+#define OMAP54XX_PRM_DSP_INST          0x0400
+#define OMAP54XX_PRM_ABE_INST          0x0500
+#define OMAP54XX_PRM_COREAON_INST      0x0600
+#define OMAP54XX_PRM_CORE_INST         0x0700
+#define OMAP54XX_PRM_IVA_INST          0x1200
+#define OMAP54XX_PRM_CAM_INST          0x1300
+#define OMAP54XX_PRM_DSS_INST          0x1400
+#define OMAP54XX_PRM_GPU_INST          0x1500
+#define OMAP54XX_PRM_L3INIT_INST       0x1600
+#define OMAP54XX_PRM_CUSTEFUSE_INST    0x1700
+#define OMAP54XX_PRM_WKUPAON_INST      0x1800
+#define OMAP54XX_PRM_WKUPAON_CM_INST   0x1900
+#define OMAP54XX_PRM_EMU_INST          0x1a00
+#define OMAP54XX_PRM_EMU_CM_INST       0x1b00
+#define OMAP54XX_PRM_DEVICE_INST       0x1c00
+#define OMAP54XX_PRM_INSTR_INST                0x1f00
+
+/* PRM clockdomain register offsets (from instance start) */
+#define OMAP54XX_PRM_WKUPAON_CM_WKUPAON_CDOFFS 0x0000
+#define OMAP54XX_PRM_EMU_CM_EMU_CDOFFS         0x0000
+
+/* PRM */
+
+/* PRM.OCP_SOCKET_PRM register offsets */
+#define OMAP54XX_REVISION_PRM_OFFSET                           0x0000
+#define OMAP54XX_PRM_IRQSTATUS_MPU_OFFSET                      0x0010
+#define OMAP54XX_PRM_IRQSTATUS_MPU_2_OFFSET                    0x0014
+#define OMAP54XX_PRM_IRQENABLE_MPU_OFFSET                      0x0018
+#define OMAP54XX_PRM_IRQENABLE_MPU_2_OFFSET                    0x001c
+#define OMAP54XX_PRM_IRQSTATUS_IPU_OFFSET                      0x0020
+#define OMAP54XX_PRM_IRQENABLE_IPU_OFFSET                      0x0028
+#define OMAP54XX_PRM_IRQSTATUS_DSP_OFFSET                      0x0030
+#define OMAP54XX_PRM_IRQENABLE_DSP_OFFSET                      0x0038
+#define OMAP54XX_CM_PRM_PROFILING_CLKCTRL_OFFSET               0x0040
+#define OMAP54XX_CM_PRM_PROFILING_CLKCTRL                      OMAP54XX_PRM_REGADDR(OMAP54XX_PRM_OCP_SOCKET_INST, 0x0040)
+#define OMAP54XX_PRM_DEBUG_OUT_OFFSET                          0x0084
+#define OMAP54XX_PRM_DEBUG_TRANS_CFG_OFFSET                    0x0090
+#define OMAP54XX_PRM_DEBUG_OFF_TRANS_OFFSET                    0x0094
+#define OMAP54XX_PRM_DEBUG_CORE_RET_TRANS_OFFSET               0x0098
+#define OMAP54XX_PRM_DEBUG_MPU_RET_TRANS_OFFSET                        0x009c
+#define OMAP54XX_PRM_DEBUG_MM_RET_TRANS_OFFSET                 0x00a0
+#define OMAP54XX_PRM_DEBUG_WKUPAON_FD_TRANS_OFFSET             0x00a4
+
+/* PRM.CKGEN_PRM register offsets */
+#define OMAP54XX_CM_CLKSEL_ABE_DSS_SYS_OFFSET                  0x0000
+#define OMAP54XX_CM_CLKSEL_ABE_DSS_SYS                         OMAP54XX_PRM_REGADDR(OMAP54XX_PRM_CKGEN_INST, 0x0000)
+#define OMAP54XX_CM_CLKSEL_WKUPAON_OFFSET                      0x0008
+#define OMAP54XX_CM_CLKSEL_WKUPAON                             OMAP54XX_PRM_REGADDR(OMAP54XX_PRM_CKGEN_INST, 0x0008)
+#define OMAP54XX_CM_CLKSEL_ABE_PLL_REF_OFFSET                  0x000c
+#define OMAP54XX_CM_CLKSEL_ABE_PLL_REF                         OMAP54XX_PRM_REGADDR(OMAP54XX_PRM_CKGEN_INST, 0x000c)
+#define OMAP54XX_CM_CLKSEL_SYS_OFFSET                          0x0010
+#define OMAP54XX_CM_CLKSEL_SYS                                 OMAP54XX_PRM_REGADDR(OMAP54XX_PRM_CKGEN_INST, 0x0010)
+
+/* PRM.MPU_PRM register offsets */
+#define OMAP54XX_PM_MPU_PWRSTCTRL_OFFSET                       0x0000
+#define OMAP54XX_PM_MPU_PWRSTST_OFFSET                         0x0004
+#define OMAP54XX_RM_MPU_MPU_CONTEXT_OFFSET                     0x0024
+
+/* PRM.DSP_PRM register offsets */
+#define OMAP54XX_PM_DSP_PWRSTCTRL_OFFSET                       0x0000
+#define OMAP54XX_PM_DSP_PWRSTST_OFFSET                         0x0004
+#define OMAP54XX_RM_DSP_RSTCTRL_OFFSET                         0x0010
+#define OMAP54XX_RM_DSP_RSTST_OFFSET                           0x0014
+#define OMAP54XX_RM_DSP_DSP_CONTEXT_OFFSET                     0x0024
+
+/* PRM.ABE_PRM register offsets */
+#define OMAP54XX_PM_ABE_PWRSTCTRL_OFFSET                       0x0000
+#define OMAP54XX_PM_ABE_PWRSTST_OFFSET                         0x0004
+#define OMAP54XX_RM_ABE_AESS_CONTEXT_OFFSET                    0x002c
+#define OMAP54XX_PM_ABE_MCPDM_WKDEP_OFFSET                     0x0030
+#define OMAP54XX_RM_ABE_MCPDM_CONTEXT_OFFSET                   0x0034
+#define OMAP54XX_PM_ABE_DMIC_WKDEP_OFFSET                      0x0038
+#define OMAP54XX_RM_ABE_DMIC_CONTEXT_OFFSET                    0x003c
+#define OMAP54XX_PM_ABE_MCASP_WKDEP_OFFSET                     0x0040
+#define OMAP54XX_RM_ABE_MCASP_CONTEXT_OFFSET                   0x0044
+#define OMAP54XX_PM_ABE_MCBSP1_WKDEP_OFFSET                    0x0048
+#define OMAP54XX_RM_ABE_MCBSP1_CONTEXT_OFFSET                  0x004c
+#define OMAP54XX_PM_ABE_MCBSP2_WKDEP_OFFSET                    0x0050
+#define OMAP54XX_RM_ABE_MCBSP2_CONTEXT_OFFSET                  0x0054
+#define OMAP54XX_PM_ABE_MCBSP3_WKDEP_OFFSET                    0x0058
+#define OMAP54XX_RM_ABE_MCBSP3_CONTEXT_OFFSET                  0x005c
+#define OMAP54XX_PM_ABE_SLIMBUS1_WKDEP_OFFSET                  0x0060
+#define OMAP54XX_RM_ABE_SLIMBUS1_CONTEXT_OFFSET                        0x0064
+#define OMAP54XX_PM_ABE_TIMER5_WKDEP_OFFSET                    0x0068
+#define OMAP54XX_RM_ABE_TIMER5_CONTEXT_OFFSET                  0x006c
+#define OMAP54XX_PM_ABE_TIMER6_WKDEP_OFFSET                    0x0070
+#define OMAP54XX_RM_ABE_TIMER6_CONTEXT_OFFSET                  0x0074
+#define OMAP54XX_PM_ABE_TIMER7_WKDEP_OFFSET                    0x0078
+#define OMAP54XX_RM_ABE_TIMER7_CONTEXT_OFFSET                  0x007c
+#define OMAP54XX_PM_ABE_TIMER8_WKDEP_OFFSET                    0x0080
+#define OMAP54XX_RM_ABE_TIMER8_CONTEXT_OFFSET                  0x0084
+#define OMAP54XX_PM_ABE_WD_TIMER3_WKDEP_OFFSET                 0x0088
+#define OMAP54XX_RM_ABE_WD_TIMER3_CONTEXT_OFFSET               0x008c
+
+/* PRM.COREAON_PRM register offsets */
+#define OMAP54XX_PM_COREAON_SMARTREFLEX_MPU_WKDEP_OFFSET       0x0028
+#define OMAP54XX_RM_COREAON_SMARTREFLEX_MPU_CONTEXT_OFFSET     0x002c
+#define OMAP54XX_PM_COREAON_SMARTREFLEX_MM_WKDEP_OFFSET                0x0030
+#define OMAP54XX_RM_COREAON_SMARTREFLEX_MM_CONTEXT_OFFSET      0x0034
+#define OMAP54XX_PM_COREAON_SMARTREFLEX_CORE_WKDEP_OFFSET      0x0038
+#define OMAP54XX_RM_COREAON_SMARTREFLEX_CORE_CONTEXT_OFFSET    0x003c
+
+/* PRM.CORE_PRM register offsets */
+#define OMAP54XX_PM_CORE_PWRSTCTRL_OFFSET                      0x0000
+#define OMAP54XX_PM_CORE_PWRSTST_OFFSET                                0x0004
+#define OMAP54XX_RM_L3MAIN1_L3_MAIN_1_CONTEXT_OFFSET           0x0024
+#define OMAP54XX_RM_L3MAIN2_L3_MAIN_2_CONTEXT_OFFSET           0x0124
+#define OMAP54XX_RM_L3MAIN2_GPMC_CONTEXT_OFFSET                        0x012c
+#define OMAP54XX_RM_L3MAIN2_OCMC_RAM_CONTEXT_OFFSET            0x0134
+#define OMAP54XX_RM_IPU_RSTCTRL_OFFSET                         0x0210
+#define OMAP54XX_RM_IPU_RSTST_OFFSET                           0x0214
+#define OMAP54XX_RM_IPU_IPU_CONTEXT_OFFSET                     0x0224
+#define OMAP54XX_RM_DMA_DMA_SYSTEM_CONTEXT_OFFSET              0x0324
+#define OMAP54XX_RM_EMIF_DMM_CONTEXT_OFFSET                    0x0424
+#define OMAP54XX_RM_EMIF_EMIF_OCP_FW_CONTEXT_OFFSET            0x042c
+#define OMAP54XX_RM_EMIF_EMIF1_CONTEXT_OFFSET                  0x0434
+#define OMAP54XX_RM_EMIF_EMIF2_CONTEXT_OFFSET                  0x043c
+#define OMAP54XX_RM_EMIF_EMIF_DLL_CONTEXT_OFFSET               0x0444
+#define OMAP54XX_RM_C2C_C2C_CONTEXT_OFFSET                     0x0524
+#define OMAP54XX_RM_C2C_MODEM_ICR_CONTEXT_OFFSET               0x052c
+#define OMAP54XX_RM_C2C_C2C_OCP_FW_CONTEXT_OFFSET              0x0534
+#define OMAP54XX_RM_L4CFG_L4_CFG_CONTEXT_OFFSET                        0x0624
+#define OMAP54XX_RM_L4CFG_SPINLOCK_CONTEXT_OFFSET              0x062c
+#define OMAP54XX_RM_L4CFG_MAILBOX_CONTEXT_OFFSET               0x0634
+#define OMAP54XX_RM_L4CFG_SAR_ROM_CONTEXT_OFFSET               0x063c
+#define OMAP54XX_RM_L4CFG_OCP2SCP2_CONTEXT_OFFSET              0x0644
+#define OMAP54XX_RM_L3INSTR_L3_MAIN_3_CONTEXT_OFFSET           0x0724
+#define OMAP54XX_RM_L3INSTR_L3_INSTR_CONTEXT_OFFSET            0x072c
+#define OMAP54XX_RM_L3INSTR_OCP_WP_NOC_CONTEXT_OFFSET          0x0744
+#define OMAP54XX_RM_MIPIEXT_LLI_CONTEXT_OFFSET                 0x0824
+#define OMAP54XX_RM_MIPIEXT_LLI_OCP_FW_CONTEXT_OFFSET          0x082c
+#define OMAP54XX_RM_MIPIEXT_MPHY_CONTEXT_OFFSET                        0x0834
+#define OMAP54XX_PM_L4PER_TIMER10_WKDEP_OFFSET                 0x0928
+#define OMAP54XX_RM_L4PER_TIMER10_CONTEXT_OFFSET               0x092c
+#define OMAP54XX_PM_L4PER_TIMER11_WKDEP_OFFSET                 0x0930
+#define OMAP54XX_RM_L4PER_TIMER11_CONTEXT_OFFSET               0x0934
+#define OMAP54XX_PM_L4PER_TIMER2_WKDEP_OFFSET                  0x0938
+#define OMAP54XX_RM_L4PER_TIMER2_CONTEXT_OFFSET                        0x093c
+#define OMAP54XX_PM_L4PER_TIMER3_WKDEP_OFFSET                  0x0940
+#define OMAP54XX_RM_L4PER_TIMER3_CONTEXT_OFFSET                        0x0944
+#define OMAP54XX_PM_L4PER_TIMER4_WKDEP_OFFSET                  0x0948
+#define OMAP54XX_RM_L4PER_TIMER4_CONTEXT_OFFSET                        0x094c
+#define OMAP54XX_PM_L4PER_TIMER9_WKDEP_OFFSET                  0x0950
+#define OMAP54XX_RM_L4PER_TIMER9_CONTEXT_OFFSET                        0x0954
+#define OMAP54XX_RM_L4PER_ELM_CONTEXT_OFFSET                   0x095c
+#define OMAP54XX_PM_L4PER_GPIO2_WKDEP_OFFSET                   0x0960
+#define OMAP54XX_RM_L4PER_GPIO2_CONTEXT_OFFSET                 0x0964
+#define OMAP54XX_PM_L4PER_GPIO3_WKDEP_OFFSET                   0x0968
+#define OMAP54XX_RM_L4PER_GPIO3_CONTEXT_OFFSET                 0x096c
+#define OMAP54XX_PM_L4PER_GPIO4_WKDEP_OFFSET                   0x0970
+#define OMAP54XX_RM_L4PER_GPIO4_CONTEXT_OFFSET                 0x0974
+#define OMAP54XX_PM_L4PER_GPIO5_WKDEP_OFFSET                   0x0978
+#define OMAP54XX_RM_L4PER_GPIO5_CONTEXT_OFFSET                 0x097c
+#define OMAP54XX_PM_L4PER_GPIO6_WKDEP_OFFSET                   0x0980
+#define OMAP54XX_RM_L4PER_GPIO6_CONTEXT_OFFSET                 0x0984
+#define OMAP54XX_RM_L4PER_HDQ1W_CONTEXT_OFFSET                 0x098c
+#define OMAP54XX_PM_L4PER_I2C1_WKDEP_OFFSET                    0x09a0
+#define OMAP54XX_RM_L4PER_I2C1_CONTEXT_OFFSET                  0x09a4
+#define OMAP54XX_PM_L4PER_I2C2_WKDEP_OFFSET                    0x09a8
+#define OMAP54XX_RM_L4PER_I2C2_CONTEXT_OFFSET                  0x09ac
+#define OMAP54XX_PM_L4PER_I2C3_WKDEP_OFFSET                    0x09b0
+#define OMAP54XX_RM_L4PER_I2C3_CONTEXT_OFFSET                  0x09b4
+#define OMAP54XX_PM_L4PER_I2C4_WKDEP_OFFSET                    0x09b8
+#define OMAP54XX_RM_L4PER_I2C4_CONTEXT_OFFSET                  0x09bc
+#define OMAP54XX_RM_L4PER_L4_PER_CONTEXT_OFFSET                        0x09c0
+#define OMAP54XX_PM_L4PER_MCSPI1_WKDEP_OFFSET                  0x09f0
+#define OMAP54XX_RM_L4PER_MCSPI1_CONTEXT_OFFSET                        0x09f4
+#define OMAP54XX_PM_L4PER_MCSPI2_WKDEP_OFFSET                  0x09f8
+#define OMAP54XX_RM_L4PER_MCSPI2_CONTEXT_OFFSET                        0x09fc
+#define OMAP54XX_PM_L4PER_MCSPI3_WKDEP_OFFSET                  0x0a00
+#define OMAP54XX_RM_L4PER_MCSPI3_CONTEXT_OFFSET                        0x0a04
+#define OMAP54XX_PM_L4PER_MCSPI4_WKDEP_OFFSET                  0x0a08
+#define OMAP54XX_RM_L4PER_MCSPI4_CONTEXT_OFFSET                        0x0a0c
+#define OMAP54XX_PM_L4PER_GPIO7_WKDEP_OFFSET                   0x0a10
+#define OMAP54XX_RM_L4PER_GPIO7_CONTEXT_OFFSET                 0x0a14
+#define OMAP54XX_PM_L4PER_GPIO8_WKDEP_OFFSET                   0x0a18
+#define OMAP54XX_RM_L4PER_GPIO8_CONTEXT_OFFSET                 0x0a1c
+#define OMAP54XX_PM_L4PER_MMC3_WKDEP_OFFSET                    0x0a20
+#define OMAP54XX_RM_L4PER_MMC3_CONTEXT_OFFSET                  0x0a24
+#define OMAP54XX_PM_L4PER_MMC4_WKDEP_OFFSET                    0x0a28
+#define OMAP54XX_RM_L4PER_MMC4_CONTEXT_OFFSET                  0x0a2c
+#define OMAP54XX_PM_L4PER_UART1_WKDEP_OFFSET                   0x0a40
+#define OMAP54XX_RM_L4PER_UART1_CONTEXT_OFFSET                 0x0a44
+#define OMAP54XX_PM_L4PER_UART2_WKDEP_OFFSET                   0x0a48
+#define OMAP54XX_RM_L4PER_UART2_CONTEXT_OFFSET                 0x0a4c
+#define OMAP54XX_PM_L4PER_UART3_WKDEP_OFFSET                   0x0a50
+#define OMAP54XX_RM_L4PER_UART3_CONTEXT_OFFSET                 0x0a54
+#define OMAP54XX_RM_L4PER_UART4_CONTEXT_OFFSET                 0x0a58
+#define OMAP54XX_PM_L4PER_UART4_WKDEP_OFFSET                   0x0a5c
+#define OMAP54XX_PM_L4PER_MMC5_WKDEP_OFFSET                    0x0a60
+#define OMAP54XX_RM_L4PER_MMC5_CONTEXT_OFFSET                  0x0a64
+#define OMAP54XX_PM_L4PER_I2C5_WKDEP_OFFSET                    0x0a68
+#define OMAP54XX_RM_L4PER_I2C5_CONTEXT_OFFSET                  0x0a6c
+#define OMAP54XX_PM_L4PER_UART5_WKDEP_OFFSET                   0x0a70
+#define OMAP54XX_RM_L4PER_UART5_CONTEXT_OFFSET                 0x0a74
+#define OMAP54XX_PM_L4PER_UART6_WKDEP_OFFSET                   0x0a78
+#define OMAP54XX_RM_L4PER_UART6_CONTEXT_OFFSET                 0x0a7c
+#define OMAP54XX_RM_L4SEC_AES1_CONTEXT_OFFSET                  0x0aa4
+#define OMAP54XX_RM_L4SEC_AES2_CONTEXT_OFFSET                  0x0aac
+#define OMAP54XX_RM_L4SEC_DES3DES_CONTEXT_OFFSET               0x0ab4
+#define OMAP54XX_RM_L4SEC_FPKA_CONTEXT_OFFSET                  0x0abc
+#define OMAP54XX_RM_L4SEC_RNG_CONTEXT_OFFSET                   0x0ac4
+#define OMAP54XX_RM_L4SEC_SHA2MD5_CONTEXT_OFFSET               0x0acc
+#define OMAP54XX_RM_L4SEC_DMA_CRYPTO_CONTEXT_OFFSET            0x0adc
+
+/* PRM.IVA_PRM register offsets */
+#define OMAP54XX_PM_IVA_PWRSTCTRL_OFFSET                       0x0000
+#define OMAP54XX_PM_IVA_PWRSTST_OFFSET                         0x0004
+#define OMAP54XX_RM_IVA_RSTCTRL_OFFSET                         0x0010
+#define OMAP54XX_RM_IVA_RSTST_OFFSET                           0x0014
+#define OMAP54XX_RM_IVA_IVA_CONTEXT_OFFSET                     0x0024
+#define OMAP54XX_RM_IVA_SL2_CONTEXT_OFFSET                     0x002c
+
+/* PRM.CAM_PRM register offsets */
+#define OMAP54XX_PM_CAM_PWRSTCTRL_OFFSET                       0x0000
+#define OMAP54XX_PM_CAM_PWRSTST_OFFSET                         0x0004
+#define OMAP54XX_RM_CAM_ISS_CONTEXT_OFFSET                     0x0024
+#define OMAP54XX_RM_CAM_FDIF_CONTEXT_OFFSET                    0x002c
+#define OMAP54XX_RM_CAM_CAL_CONTEXT_OFFSET                     0x0034
+
+/* PRM.DSS_PRM register offsets */
+#define OMAP54XX_PM_DSS_PWRSTCTRL_OFFSET                       0x0000
+#define OMAP54XX_PM_DSS_PWRSTST_OFFSET                         0x0004
+#define OMAP54XX_PM_DSS_DSS_WKDEP_OFFSET                       0x0020
+#define OMAP54XX_RM_DSS_DSS_CONTEXT_OFFSET                     0x0024
+#define OMAP54XX_RM_DSS_BB2D_CONTEXT_OFFSET                    0x0034
+
+/* PRM.GPU_PRM register offsets */
+#define OMAP54XX_PM_GPU_PWRSTCTRL_OFFSET                       0x0000
+#define OMAP54XX_PM_GPU_PWRSTST_OFFSET                         0x0004
+#define OMAP54XX_RM_GPU_GPU_CONTEXT_OFFSET                     0x0024
+
+/* PRM.L3INIT_PRM register offsets */
+#define OMAP54XX_PM_L3INIT_PWRSTCTRL_OFFSET                    0x0000
+#define OMAP54XX_PM_L3INIT_PWRSTST_OFFSET                      0x0004
+#define OMAP54XX_PM_L3INIT_MMC1_WKDEP_OFFSET                   0x0028
+#define OMAP54XX_RM_L3INIT_MMC1_CONTEXT_OFFSET                 0x002c
+#define OMAP54XX_PM_L3INIT_MMC2_WKDEP_OFFSET                   0x0030
+#define OMAP54XX_RM_L3INIT_MMC2_CONTEXT_OFFSET                 0x0034
+#define OMAP54XX_PM_L3INIT_HSI_WKDEP_OFFSET                    0x0038
+#define OMAP54XX_RM_L3INIT_HSI_CONTEXT_OFFSET                  0x003c
+#define OMAP54XX_PM_L3INIT_UNIPRO2_WKDEP_OFFSET                        0x0040
+#define OMAP54XX_RM_L3INIT_UNIPRO2_CONTEXT_OFFSET              0x0044
+#define OMAP54XX_PM_L3INIT_USB_HOST_HS_WKDEP_OFFSET            0x0058
+#define OMAP54XX_RM_L3INIT_USB_HOST_HS_CONTEXT_OFFSET          0x005c
+#define OMAP54XX_PM_L3INIT_USB_TLL_HS_WKDEP_OFFSET             0x0068
+#define OMAP54XX_RM_L3INIT_USB_TLL_HS_CONTEXT_OFFSET           0x006c
+#define OMAP54XX_RM_L3INIT_IEEE1500_2_OCP_CONTEXT_OFFSET       0x007c
+#define OMAP54XX_PM_L3INIT_SATA_WKDEP_OFFSET                   0x0088
+#define OMAP54XX_RM_L3INIT_SATA_CONTEXT_OFFSET                 0x008c
+#define OMAP54XX_RM_L3INIT_OCP2SCP1_CONTEXT_OFFSET             0x00e4
+#define OMAP54XX_RM_L3INIT_OCP2SCP3_CONTEXT_OFFSET             0x00ec
+#define OMAP54XX_PM_L3INIT_USB_OTG_SS_WKDEP_OFFSET             0x00f0
+#define OMAP54XX_RM_L3INIT_USB_OTG_SS_CONTEXT_OFFSET           0x00f4
+
+/* PRM.CUSTEFUSE_PRM register offsets */
+#define OMAP54XX_PM_CUSTEFUSE_PWRSTCTRL_OFFSET                 0x0000
+#define OMAP54XX_PM_CUSTEFUSE_PWRSTST_OFFSET                   0x0004
+#define OMAP54XX_RM_CUSTEFUSE_EFUSE_CTRL_CUST_CONTEXT_OFFSET   0x0024
+
+/* PRM.WKUPAON_PRM register offsets */
+#define OMAP54XX_RM_WKUPAON_L4_WKUP_CONTEXT_OFFSET             0x0024
+#define OMAP54XX_RM_WKUPAON_WD_TIMER1_CONTEXT_OFFSET           0x002c
+#define OMAP54XX_PM_WKUPAON_WD_TIMER2_WKDEP_OFFSET             0x0030
+#define OMAP54XX_RM_WKUPAON_WD_TIMER2_CONTEXT_OFFSET           0x0034
+#define OMAP54XX_PM_WKUPAON_GPIO1_WKDEP_OFFSET                 0x0038
+#define OMAP54XX_RM_WKUPAON_GPIO1_CONTEXT_OFFSET               0x003c
+#define OMAP54XX_PM_WKUPAON_TIMER1_WKDEP_OFFSET                        0x0040
+#define OMAP54XX_RM_WKUPAON_TIMER1_CONTEXT_OFFSET              0x0044
+#define OMAP54XX_PM_WKUPAON_TIMER12_WKDEP_OFFSET               0x0048
+#define OMAP54XX_RM_WKUPAON_TIMER12_CONTEXT_OFFSET             0x004c
+#define OMAP54XX_RM_WKUPAON_COUNTER_32K_CONTEXT_OFFSET         0x0054
+#define OMAP54XX_RM_WKUPAON_SAR_RAM_CONTEXT_OFFSET             0x0064
+#define OMAP54XX_PM_WKUPAON_KBD_WKDEP_OFFSET                   0x0078
+#define OMAP54XX_RM_WKUPAON_KBD_CONTEXT_OFFSET                 0x007c
+
+/* PRM.WKUPAON_CM register offsets */
+#define OMAP54XX_CM_WKUPAON_CLKSTCTRL_OFFSET                   0x0000
+#define OMAP54XX_CM_WKUPAON_L4_WKUP_CLKCTRL_OFFSET             0x0020
+#define OMAP54XX_CM_WKUPAON_L4_WKUP_CLKCTRL                    OMAP54XX_PRM_REGADDR(OMAP54XX_PRM_WKUPAON_CM_INST, 0x0020)
+#define OMAP54XX_CM_WKUPAON_WD_TIMER1_CLKCTRL_OFFSET           0x0028
+#define OMAP54XX_CM_WKUPAON_WD_TIMER1_CLKCTRL                  OMAP54XX_PRM_REGADDR(OMAP54XX_PRM_WKUPAON_CM_INST, 0x0028)
+#define OMAP54XX_CM_WKUPAON_WD_TIMER2_CLKCTRL_OFFSET           0x0030
+#define OMAP54XX_CM_WKUPAON_WD_TIMER2_CLKCTRL                  OMAP54XX_PRM_REGADDR(OMAP54XX_PRM_WKUPAON_CM_INST, 0x0030)
+#define OMAP54XX_CM_WKUPAON_GPIO1_CLKCTRL_OFFSET               0x0038
+#define OMAP54XX_CM_WKUPAON_GPIO1_CLKCTRL                      OMAP54XX_PRM_REGADDR(OMAP54XX_PRM_WKUPAON_CM_INST, 0x0038)
+#define OMAP54XX_CM_WKUPAON_TIMER1_CLKCTRL_OFFSET              0x0040
+#define OMAP54XX_CM_WKUPAON_TIMER1_CLKCTRL                     OMAP54XX_PRM_REGADDR(OMAP54XX_PRM_WKUPAON_CM_INST, 0x0040)
+#define OMAP54XX_CM_WKUPAON_TIMER12_CLKCTRL_OFFSET             0x0048
+#define OMAP54XX_CM_WKUPAON_TIMER12_CLKCTRL                    OMAP54XX_PRM_REGADDR(OMAP54XX_PRM_WKUPAON_CM_INST, 0x0048)
+#define OMAP54XX_CM_WKUPAON_COUNTER_32K_CLKCTRL_OFFSET         0x0050
+#define OMAP54XX_CM_WKUPAON_COUNTER_32K_CLKCTRL                        OMAP54XX_PRM_REGADDR(OMAP54XX_PRM_WKUPAON_CM_INST, 0x0050)
+#define OMAP54XX_CM_WKUPAON_SAR_RAM_CLKCTRL_OFFSET             0x0060
+#define OMAP54XX_CM_WKUPAON_SAR_RAM_CLKCTRL                    OMAP54XX_PRM_REGADDR(OMAP54XX_PRM_WKUPAON_CM_INST, 0x0060)
+#define OMAP54XX_CM_WKUPAON_KBD_CLKCTRL_OFFSET                 0x0078
+#define OMAP54XX_CM_WKUPAON_KBD_CLKCTRL                                OMAP54XX_PRM_REGADDR(OMAP54XX_PRM_WKUPAON_CM_INST, 0x0078)
+#define OMAP54XX_CM_WKUPAON_SCRM_CLKCTRL_OFFSET                        0x0090
+#define OMAP54XX_CM_WKUPAON_SCRM_CLKCTRL                       OMAP54XX_PRM_REGADDR(OMAP54XX_PRM_WKUPAON_CM_INST, 0x0090)
+#define OMAP54XX_CM_WKUPAON_IO_SRCOMP_CLKCTRL_OFFSET           0x0098
+#define OMAP54XX_CM_WKUPAON_IO_SRCOMP_CLKCTRL                  OMAP54XX_PRM_REGADDR(OMAP54XX_PRM_WKUPAON_CM_INST, 0x0098)
+
+/* PRM.EMU_PRM register offsets */
+#define OMAP54XX_PM_EMU_PWRSTCTRL_OFFSET                       0x0000
+#define OMAP54XX_PM_EMU_PWRSTST_OFFSET                         0x0004
+#define OMAP54XX_RM_EMU_DEBUGSS_CONTEXT_OFFSET                 0x0024
+
+/* PRM.EMU_CM register offsets */
+#define OMAP54XX_CM_EMU_CLKSTCTRL_OFFSET                       0x0000
+#define OMAP54XX_CM_EMU_DYNAMICDEP_OFFSET                      0x0008
+#define OMAP54XX_CM_EMU_DEBUGSS_CLKCTRL_OFFSET                 0x0020
+#define OMAP54XX_CM_EMU_DEBUGSS_CLKCTRL                                OMAP54XX_PRM_REGADDR(OMAP54XX_PRM_EMU_CM_INST, 0x0020)
+#define OMAP54XX_CM_EMU_MPU_EMU_DBG_CLKCTRL_OFFSET             0x0028
+#define OMAP54XX_CM_EMU_MPU_EMU_DBG_CLKCTRL                    OMAP54XX_PRM_REGADDR(OMAP54XX_PRM_EMU_CM_INST, 0x0028)
+
+/* PRM.DEVICE_PRM register offsets */
+#define OMAP54XX_PRM_RSTCTRL_OFFSET                            0x0000
+#define OMAP54XX_PRM_RSTST_OFFSET                              0x0004
+#define OMAP54XX_PRM_RSTTIME_OFFSET                            0x0008
+#define OMAP54XX_PRM_CLKREQCTRL_OFFSET                         0x000c
+#define OMAP54XX_PRM_VOLTCTRL_OFFSET                           0x0010
+#define OMAP54XX_PRM_PWRREQCTRL_OFFSET                         0x0014
+#define OMAP54XX_PRM_PSCON_COUNT_OFFSET                                0x0018
+#define OMAP54XX_PRM_IO_COUNT_OFFSET                           0x001c
+#define OMAP54XX_PRM_IO_PMCTRL_OFFSET                          0x0020
+#define OMAP54XX_PRM_VOLTSETUP_WARMRESET_OFFSET                        0x0024
+#define OMAP54XX_PRM_VOLTSETUP_CORE_OFF_OFFSET                 0x0028
+#define OMAP54XX_PRM_VOLTSETUP_MPU_OFF_OFFSET                  0x002c
+#define OMAP54XX_PRM_VOLTSETUP_MM_OFF_OFFSET                   0x0030
+#define OMAP54XX_PRM_VOLTSETUP_CORE_RET_SLEEP_OFFSET           0x0034
+#define OMAP54XX_PRM_VOLTSETUP_MPU_RET_SLEEP_OFFSET            0x0038
+#define OMAP54XX_PRM_VOLTSETUP_MM_RET_SLEEP_OFFSET             0x003c
+#define OMAP54XX_PRM_VP_CORE_CONFIG_OFFSET                     0x0040
+#define OMAP54XX_PRM_VP_CORE_STATUS_OFFSET                     0x0044
+#define OMAP54XX_PRM_VP_CORE_VLIMITTO_OFFSET                   0x0048
+#define OMAP54XX_PRM_VP_CORE_VOLTAGE_OFFSET                    0x004c
+#define OMAP54XX_PRM_VP_CORE_VSTEPMAX_OFFSET                   0x0050
+#define OMAP54XX_PRM_VP_CORE_VSTEPMIN_OFFSET                   0x0054
+#define OMAP54XX_PRM_VP_MPU_CONFIG_OFFSET                      0x0058
+#define OMAP54XX_PRM_VP_MPU_STATUS_OFFSET                      0x005c
+#define OMAP54XX_PRM_VP_MPU_VLIMITTO_OFFSET                    0x0060
+#define OMAP54XX_PRM_VP_MPU_VOLTAGE_OFFSET                     0x0064
+#define OMAP54XX_PRM_VP_MPU_VSTEPMAX_OFFSET                    0x0068
+#define OMAP54XX_PRM_VP_MPU_VSTEPMIN_OFFSET                    0x006c
+#define OMAP54XX_PRM_VP_MM_CONFIG_OFFSET                       0x0070
+#define OMAP54XX_PRM_VP_MM_STATUS_OFFSET                       0x0074
+#define OMAP54XX_PRM_VP_MM_VLIMITTO_OFFSET                     0x0078
+#define OMAP54XX_PRM_VP_MM_VOLTAGE_OFFSET                      0x007c
+#define OMAP54XX_PRM_VP_MM_VSTEPMAX_OFFSET                     0x0080
+#define OMAP54XX_PRM_VP_MM_VSTEPMIN_OFFSET                     0x0084
+#define OMAP54XX_PRM_VC_SMPS_CORE_CONFIG_OFFSET                        0x0088
+#define OMAP54XX_PRM_VC_SMPS_MM_CONFIG_OFFSET                  0x008c
+#define OMAP54XX_PRM_VC_SMPS_MPU_CONFIG_OFFSET                 0x0090
+#define OMAP54XX_PRM_VC_VAL_CMD_VDD_CORE_L_OFFSET              0x0094
+#define OMAP54XX_PRM_VC_VAL_CMD_VDD_MM_L_OFFSET                        0x0098
+#define OMAP54XX_PRM_VC_VAL_CMD_VDD_MPU_L_OFFSET               0x009c
+#define OMAP54XX_PRM_VC_VAL_BYPASS_OFFSET                      0x00a0
+#define OMAP54XX_PRM_VC_CORE_ERRST_OFFSET                      0x00a4
+#define OMAP54XX_PRM_VC_MM_ERRST_OFFSET                                0x00a8
+#define OMAP54XX_PRM_VC_MPU_ERRST_OFFSET                       0x00ac
+#define OMAP54XX_PRM_VC_BYPASS_ERRST_OFFSET                    0x00b0
+#define OMAP54XX_PRM_VC_CFG_I2C_MODE_OFFSET                    0x00b4
+#define OMAP54XX_PRM_VC_CFG_I2C_CLK_OFFSET                     0x00b8
+#define OMAP54XX_PRM_SRAM_COUNT_OFFSET                         0x00bc
+#define OMAP54XX_PRM_SRAM_WKUP_SETUP_OFFSET                    0x00c0
+#define OMAP54XX_PRM_SLDO_CORE_SETUP_OFFSET                    0x00c4
+#define OMAP54XX_PRM_SLDO_CORE_CTRL_OFFSET                     0x00c8
+#define OMAP54XX_PRM_SLDO_MPU_SETUP_OFFSET                     0x00cc
+#define OMAP54XX_PRM_SLDO_MPU_CTRL_OFFSET                      0x00d0
+#define OMAP54XX_PRM_SLDO_MM_SETUP_OFFSET                      0x00d4
+#define OMAP54XX_PRM_SLDO_MM_CTRL_OFFSET                       0x00d8
+#define OMAP54XX_PRM_ABBLDO_MPU_SETUP_OFFSET                   0x00dc
+#define OMAP54XX_PRM_ABBLDO_MPU_CTRL_OFFSET                    0x00e0
+#define OMAP54XX_PRM_ABBLDO_MM_SETUP_OFFSET                    0x00e4
+#define OMAP54XX_PRM_ABBLDO_MM_CTRL_OFFSET                     0x00e8
+#define OMAP54XX_PRM_BANDGAP_SETUP_OFFSET                      0x00ec
+#define OMAP54XX_PRM_DEVICE_OFF_CTRL_OFFSET                    0x00f0
+#define OMAP54XX_PRM_PHASE1_CNDP_OFFSET                                0x00f4
+#define OMAP54XX_PRM_PHASE2A_CNDP_OFFSET                       0x00f8
+#define OMAP54XX_PRM_PHASE2B_CNDP_OFFSET                       0x00fc
+#define OMAP54XX_PRM_MODEM_IF_CTRL_OFFSET                      0x0100
+#define OMAP54XX_PRM_VOLTST_MPU_OFFSET                         0x0110
+#define OMAP54XX_PRM_VOLTST_MM_OFFSET                          0x0114
+
+#endif
diff --git a/arch/arm/mach-omap2/scrm54xx.h b/arch/arm/mach-omap2/scrm54xx.h
new file mode 100644 (file)
index 0000000..57e86c8
--- /dev/null
@@ -0,0 +1,231 @@
+/*
+ * OMAP54XX SCRM registers and bitfields
+ *
+ * Copyright (C) 2013 Texas Instruments Incorporated - http://www.ti.com
+ *
+ * Benoit Cousson (b-cousson@ti.com)
+ *
+ * This file is automatically generated from the OMAP hardware databases.
+ * We respectfully ask that any modifications to this file be coordinated
+ * with the public linux-omap@vger.kernel.org mailing list and the
+ * authors above to ensure that the autogeneration scripts are kept
+ * up-to-date with the file contents.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#ifndef __ARCH_ARM_MACH_OMAP2_SCRM_54XX_H
+#define __ARCH_ARM_MACH_OMAP2_SCRM_54XX_H
+
+#define OMAP5_SCRM_BASE                0x4ae0a000
+
+#define OMAP54XX_SCRM_REGADDR(reg)                             \
+       OMAP2_L4_IO_ADDRESS(OMAP5_SCRM_BASE + (reg))
+
+/* SCRM */
+
+/* SCRM.SCRM register offsets */
+#define OMAP5_SCRM_REVISION_SCRM_OFFSET                0x0000
+#define OMAP5_SCRM_REVISION_SCRM               OMAP54XX_SCRM_REGADDR(0x0000)
+#define OMAP5_SCRM_CLKSETUPTIME_OFFSET         0x0100
+#define OMAP5_SCRM_CLKSETUPTIME                        OMAP54XX_SCRM_REGADDR(0x0100)
+#define OMAP5_SCRM_PMICSETUPTIME_OFFSET                0x0104
+#define OMAP5_SCRM_PMICSETUPTIME               OMAP54XX_SCRM_REGADDR(0x0104)
+#define OMAP5_SCRM_ALTCLKSRC_OFFSET            0x0110
+#define OMAP5_SCRM_ALTCLKSRC                   OMAP54XX_SCRM_REGADDR(0x0110)
+#define OMAP5_SCRM_MODEMCLKM_OFFSET            0x0118
+#define OMAP5_SCRM_MODEMCLKM                   OMAP54XX_SCRM_REGADDR(0x0118)
+#define OMAP5_SCRM_D2DCLKM_OFFSET              0x011c
+#define OMAP5_SCRM_D2DCLKM                     OMAP54XX_SCRM_REGADDR(0x011c)
+#define OMAP5_SCRM_EXTCLKREQ_OFFSET            0x0200
+#define OMAP5_SCRM_EXTCLKREQ                   OMAP54XX_SCRM_REGADDR(0x0200)
+#define OMAP5_SCRM_ACCCLKREQ_OFFSET            0x0204
+#define OMAP5_SCRM_ACCCLKREQ                   OMAP54XX_SCRM_REGADDR(0x0204)
+#define OMAP5_SCRM_PWRREQ_OFFSET               0x0208
+#define OMAP5_SCRM_PWRREQ                      OMAP54XX_SCRM_REGADDR(0x0208)
+#define OMAP5_SCRM_AUXCLKREQ0_OFFSET           0x0210
+#define OMAP5_SCRM_AUXCLKREQ0                  OMAP54XX_SCRM_REGADDR(0x0210)
+#define OMAP5_SCRM_AUXCLKREQ1_OFFSET           0x0214
+#define OMAP5_SCRM_AUXCLKREQ1                  OMAP54XX_SCRM_REGADDR(0x0214)
+#define OMAP5_SCRM_AUXCLKREQ2_OFFSET           0x0218
+#define OMAP5_SCRM_AUXCLKREQ2                  OMAP54XX_SCRM_REGADDR(0x0218)
+#define OMAP5_SCRM_AUXCLKREQ3_OFFSET           0x021c
+#define OMAP5_SCRM_AUXCLKREQ3                  OMAP54XX_SCRM_REGADDR(0x021c)
+#define OMAP5_SCRM_AUXCLKREQ4_OFFSET           0x0220
+#define OMAP5_SCRM_AUXCLKREQ4                  OMAP54XX_SCRM_REGADDR(0x0220)
+#define OMAP5_SCRM_AUXCLKREQ5_OFFSET           0x0224
+#define OMAP5_SCRM_AUXCLKREQ5                  OMAP54XX_SCRM_REGADDR(0x0224)
+#define OMAP5_SCRM_D2DCLKREQ_OFFSET            0x0234
+#define OMAP5_SCRM_D2DCLKREQ                   OMAP54XX_SCRM_REGADDR(0x0234)
+#define OMAP5_SCRM_AUXCLK0_OFFSET              0x0310
+#define OMAP5_SCRM_AUXCLK0                     OMAP54XX_SCRM_REGADDR(0x0310)
+#define OMAP5_SCRM_AUXCLK1_OFFSET              0x0314
+#define OMAP5_SCRM_AUXCLK1                     OMAP54XX_SCRM_REGADDR(0x0314)
+#define OMAP5_SCRM_AUXCLK2_OFFSET              0x0318
+#define OMAP5_SCRM_AUXCLK2                     OMAP54XX_SCRM_REGADDR(0x0318)
+#define OMAP5_SCRM_AUXCLK3_OFFSET              0x031c
+#define OMAP5_SCRM_AUXCLK3                     OMAP54XX_SCRM_REGADDR(0x031c)
+#define OMAP5_SCRM_AUXCLK4_OFFSET              0x0320
+#define OMAP5_SCRM_AUXCLK4                     OMAP54XX_SCRM_REGADDR(0x0320)
+#define OMAP5_SCRM_AUXCLK5_OFFSET              0x0324
+#define OMAP5_SCRM_AUXCLK5                     OMAP54XX_SCRM_REGADDR(0x0324)
+#define OMAP5_SCRM_RSTTIME_OFFSET              0x0400
+#define OMAP5_SCRM_RSTTIME                     OMAP54XX_SCRM_REGADDR(0x0400)
+#define OMAP5_SCRM_MODEMRSTCTRL_OFFSET         0x0418
+#define OMAP5_SCRM_MODEMRSTCTRL                        OMAP54XX_SCRM_REGADDR(0x0418)
+#define OMAP5_SCRM_D2DRSTCTRL_OFFSET           0x041c
+#define OMAP5_SCRM_D2DRSTCTRL                  OMAP54XX_SCRM_REGADDR(0x041c)
+#define OMAP5_SCRM_EXTPWRONRSTCTRL_OFFSET      0x0420
+#define OMAP5_SCRM_EXTPWRONRSTCTRL             OMAP54XX_SCRM_REGADDR(0x0420)
+#define OMAP5_SCRM_EXTWARMRSTST_OFFSET         0x0510
+#define OMAP5_SCRM_EXTWARMRSTST                        OMAP54XX_SCRM_REGADDR(0x0510)
+#define OMAP5_SCRM_APEWARMRSTST_OFFSET         0x0514
+#define OMAP5_SCRM_APEWARMRSTST                        OMAP54XX_SCRM_REGADDR(0x0514)
+#define OMAP5_SCRM_MODEMWARMRSTST_OFFSET       0x0518
+#define OMAP5_SCRM_MODEMWARMRSTST              OMAP54XX_SCRM_REGADDR(0x0518)
+#define OMAP5_SCRM_D2DWARMRSTST_OFFSET         0x051c
+#define OMAP5_SCRM_D2DWARMRSTST                        OMAP54XX_SCRM_REGADDR(0x051c)
+
+/*
+ * Used by AUXCLKREQ0, AUXCLKREQ1, AUXCLKREQ2, AUXCLKREQ3, AUXCLKREQ4,
+ * AUXCLKREQ5, D2DCLKREQ
+ */
+#define OMAP5_ACCURACY_SHIFT                   1
+#define OMAP5_ACCURACY_WIDTH                   0x1
+#define OMAP5_ACCURACY_MASK                    (1 << 1)
+
+/* Used by APEWARMRSTST */
+#define OMAP5_APEWARMRSTST_SHIFT               1
+#define OMAP5_APEWARMRSTST_WIDTH               0x1
+#define OMAP5_APEWARMRSTST_MASK                        (1 << 1)
+
+/* Used by AUXCLK0, AUXCLK1, AUXCLK2, AUXCLK3, AUXCLK4, AUXCLK5 */
+#define OMAP5_CLKDIV_SHIFT                     16
+#define OMAP5_CLKDIV_WIDTH                     0x4
+#define OMAP5_CLKDIV_MASK                      (0xf << 16)
+
+/* Used by D2DCLKM, MODEMCLKM */
+#define OMAP5_CLK_32KHZ_SHIFT                  0
+#define OMAP5_CLK_32KHZ_WIDTH                  0x1
+#define OMAP5_CLK_32KHZ_MASK                   (1 << 0)
+
+/* Used by D2DRSTCTRL, MODEMRSTCTRL */
+#define OMAP5_COLDRST_SHIFT                    0
+#define OMAP5_COLDRST_WIDTH                    0x1
+#define OMAP5_COLDRST_MASK                     (1 << 0)
+
+/* Used by D2DWARMRSTST */
+#define OMAP5_D2DWARMRSTST_SHIFT               3
+#define OMAP5_D2DWARMRSTST_WIDTH               0x1
+#define OMAP5_D2DWARMRSTST_MASK                        (1 << 3)
+
+/* Used by AUXCLK0 */
+#define OMAP5_DISABLECLK_SHIFT                 9
+#define OMAP5_DISABLECLK_WIDTH                 0x1
+#define OMAP5_DISABLECLK_MASK                  (1 << 9)
+
+/* Used by CLKSETUPTIME */
+#define OMAP5_DOWNTIME_SHIFT                   16
+#define OMAP5_DOWNTIME_WIDTH                   0x6
+#define OMAP5_DOWNTIME_MASK                    (0x3f << 16)
+
+/* Used by AUXCLK0, AUXCLK1, AUXCLK2, AUXCLK3, AUXCLK4, AUXCLK5 */
+#define OMAP5_ENABLE_SHIFT                     8
+#define OMAP5_ENABLE_WIDTH                     0x1
+#define OMAP5_ENABLE_MASK                      (1 << 8)
+
+/* Renamed from ENABLE Used by EXTPWRONRSTCTRL */
+#define OMAP5_ENABLE_0_0_SHIFT                 0
+#define OMAP5_ENABLE_0_0_WIDTH                 0x1
+#define OMAP5_ENABLE_0_0_MASK                  (1 << 0)
+
+/* Used by ALTCLKSRC */
+#define OMAP5_ENABLE_EXT_SHIFT                 3
+#define OMAP5_ENABLE_EXT_WIDTH                 0x1
+#define OMAP5_ENABLE_EXT_MASK                  (1 << 3)
+
+/* Used by ALTCLKSRC */
+#define OMAP5_ENABLE_INT_SHIFT                 2
+#define OMAP5_ENABLE_INT_WIDTH                 0x1
+#define OMAP5_ENABLE_INT_MASK                  (1 << 2)
+
+/* Used by EXTWARMRSTST */
+#define OMAP5_EXTWARMRSTST_SHIFT               0
+#define OMAP5_EXTWARMRSTST_WIDTH               0x1
+#define OMAP5_EXTWARMRSTST_MASK                        (1 << 0)
+
+/*
+ * Used by AUXCLKREQ0, AUXCLKREQ1, AUXCLKREQ2, AUXCLKREQ3, AUXCLKREQ4,
+ * AUXCLKREQ5
+ */
+#define OMAP5_MAPPING_SHIFT                    2
+#define OMAP5_MAPPING_WIDTH                    0x3
+#define OMAP5_MAPPING_MASK                     (0x7 << 2)
+
+/* Used by ALTCLKSRC */
+#define OMAP5_MODE_SHIFT                       0
+#define OMAP5_MODE_WIDTH                       0x2
+#define OMAP5_MODE_MASK                                (0x3 << 0)
+
+/* Used by MODEMWARMRSTST */
+#define OMAP5_MODEMWARMRSTST_SHIFT             2
+#define OMAP5_MODEMWARMRSTST_WIDTH             0x1
+#define OMAP5_MODEMWARMRSTST_MASK              (1 << 2)
+
+/*
+ * Used by ACCCLKREQ, AUXCLK0, AUXCLK1, AUXCLK2, AUXCLK3, AUXCLK4, AUXCLK5,
+ * AUXCLKREQ0, AUXCLKREQ1, AUXCLKREQ2, AUXCLKREQ3, AUXCLKREQ4, AUXCLKREQ5,
+ * D2DCLKREQ, EXTCLKREQ, PWRREQ
+ */
+#define OMAP5_POLARITY_SHIFT                   0
+#define OMAP5_POLARITY_WIDTH                   0x1
+#define OMAP5_POLARITY_MASK                    (1 << 0)
+
+/* Used by EXTPWRONRSTCTRL */
+#define OMAP5_PWRONRST_SHIFT                   1
+#define OMAP5_PWRONRST_WIDTH                   0x1
+#define OMAP5_PWRONRST_MASK                    (1 << 1)
+
+/* Used by REVISION_SCRM */
+#define OMAP5_REV_SHIFT                                0
+#define OMAP5_REV_WIDTH                                0x8
+#define OMAP5_REV_MASK                         (0xff << 0)
+
+/* Used by RSTTIME */
+#define OMAP5_RSTTIME_SHIFT                    0
+#define OMAP5_RSTTIME_WIDTH                    0x4
+#define OMAP5_RSTTIME_MASK                     (0xf << 0)
+
+/* Used by CLKSETUPTIME */
+#define OMAP5_SETUPTIME_SHIFT                  0
+#define OMAP5_SETUPTIME_WIDTH                  0xc
+#define OMAP5_SETUPTIME_MASK                   (0xfff << 0)
+
+/* Used by PMICSETUPTIME */
+#define OMAP5_SLEEPTIME_SHIFT                  0
+#define OMAP5_SLEEPTIME_WIDTH                  0x6
+#define OMAP5_SLEEPTIME_MASK                   (0x3f << 0)
+
+/* Used by AUXCLK0, AUXCLK1, AUXCLK2, AUXCLK3, AUXCLK4, AUXCLK5 */
+#define OMAP5_SRCSELECT_SHIFT                  1
+#define OMAP5_SRCSELECT_WIDTH                  0x2
+#define OMAP5_SRCSELECT_MASK                   (0x3 << 1)
+
+/* Used by D2DCLKM */
+#define OMAP5_SYSCLK_SHIFT                     1
+#define OMAP5_SYSCLK_WIDTH                     0x1
+#define OMAP5_SYSCLK_MASK                      (1 << 1)
+
+/* Used by PMICSETUPTIME */
+#define OMAP5_WAKEUPTIME_SHIFT                 16
+#define OMAP5_WAKEUPTIME_WIDTH                 0x6
+#define OMAP5_WAKEUPTIME_MASK                  (0x3f << 16)
+
+/* Used by D2DRSTCTRL, MODEMRSTCTRL */
+#define OMAP5_WARMRST_SHIFT                    1
+#define OMAP5_WARMRST_WIDTH                    0x1
+#define OMAP5_WARMRST_MASK                     (1 << 1)
+
+#endif
index 197cc16870d9e7f3a223817f9870307c0f99a968..8c616e436bc7bcf0ff1d4ac2ac11eb9497535ce4 100644 (file)
 # endif
 #endif
 
+#ifdef CONFIG_SOC_AM43XX
+# ifdef OMAP_NAME
+#  undef  MULTI_OMAP2
+#  define MULTI_OMAP2
+# else
+#  define OMAP_NAME am43xx
+# endif
+#endif
+
 /*
  * Omap device type i.e. EMU/HS/TST/GP/BAD
  */
@@ -187,6 +196,7 @@ IS_OMAP_CLASS(44xx, 0x44)
 IS_AM_CLASS(35xx, 0x35)
 IS_OMAP_CLASS(54xx, 0x54)
 IS_AM_CLASS(33xx, 0x33)
+IS_AM_CLASS(43xx, 0x43)
 
 IS_TI_CLASS(81xx, 0x81)
 
@@ -202,6 +212,7 @@ IS_OMAP_SUBCLASS(543x, 0x543)
 IS_TI_SUBCLASS(816x, 0x816)
 IS_TI_SUBCLASS(814x, 0x814)
 IS_AM_SUBCLASS(335x, 0x335)
+IS_AM_SUBCLASS(437x, 0x437)
 
 #define cpu_is_omap24xx()              0
 #define cpu_is_omap242x()              0
@@ -214,6 +225,8 @@ IS_AM_SUBCLASS(335x, 0x335)
 #define soc_is_am35xx()                        0
 #define soc_is_am33xx()                        0
 #define soc_is_am335x()                        0
+#define soc_is_am43xx()                        0
+#define soc_is_am437x()                        0
 #define cpu_is_omap44xx()              0
 #define cpu_is_omap443x()              0
 #define cpu_is_omap446x()              0
@@ -341,6 +354,13 @@ IS_OMAP_TYPE(3430, 0x3430)
 # define soc_is_am335x()               is_am335x()
 #endif
 
+#ifdef CONFIG_SOC_AM43XX
+# undef soc_is_am43xx
+# undef soc_is_am437x
+# define soc_is_am43xx()               is_am43xx()
+# define soc_is_am437x()               is_am437x()
+#endif
+
 # if defined(CONFIG_ARCH_OMAP4)
 # undef cpu_is_omap44xx
 # undef cpu_is_omap443x
@@ -383,6 +403,8 @@ IS_OMAP_TYPE(3430, 0x3430)
 #define TI816X_CLASS           0x81600034
 #define TI8168_REV_ES1_0       TI816X_CLASS
 #define TI8168_REV_ES1_1       (TI816X_CLASS | (0x1 << 8))
+#define TI8168_REV_ES2_0       (TI816X_CLASS | (0x2 << 8))
+#define TI8168_REV_ES2_1       (TI816X_CLASS | (0x3 << 8))
 
 #define TI814X_CLASS           0x81400034
 #define TI8148_REV_ES1_0       TI814X_CLASS
@@ -398,6 +420,9 @@ IS_OMAP_TYPE(3430, 0x3430)
 #define AM335X_REV_ES2_0       (AM335X_CLASS | (0x1 << 8))
 #define AM335X_REV_ES2_1       (AM335X_CLASS | (0x2 << 8))
 
+#define AM437X_CLASS           0x43700000
+#define AM437X_REV_ES1_0       AM437X_CLASS
+
 #define OMAP443X_CLASS         0x44300044
 #define OMAP4430_REV_ES1_0     (OMAP443X_CLASS | (0x10 << 8))
 #define OMAP4430_REV_ES2_0     (OMAP443X_CLASS | (0x20 << 8))
@@ -424,6 +449,7 @@ void omap4xxx_check_revision(void);
 void omap5xxx_check_revision(void);
 void omap3xxx_check_features(void);
 void ti81xx_check_features(void);
+void am33xx_check_features(void);
 void omap4xxx_check_features(void);
 
 /*
index 0ff0f068bea85d0a671e00619e9f903069cc5cc0..4bd096836235bfead4dae8ad7425bb4823600798 100644 (file)
@@ -119,6 +119,9 @@ static void __init omap_detect_sram(void)
                if (soc_is_am33xx()) {
                        omap_sram_start = AM33XX_SRAM_PA;
                        omap_sram_size = 0x10000; /* 64K */
+               } else if (soc_is_am43xx()) {
+                       omap_sram_start = AM33XX_SRAM_PA;
+                       omap_sram_size = SZ_256K;
                } else if (cpu_is_omap34xx()) {
                        omap_sram_start = OMAP3_SRAM_PA;
                        omap_sram_size = 0x10000; /* 64K */
index f8b23b8040d9aa61a1593d30a55c5ed951cc5f6a..3bdb0fb020285d8a2b603a4771c7eea60d69baa9 100644 (file)
@@ -582,7 +582,7 @@ OMAP_SYS_32K_TIMER_INIT(2, 1, "timer_32k_ck", "ti,timer-alwon",
                        2, "timer_sys_ck", NULL);
 #endif /* CONFIG_ARCH_OMAP2 */
 
-#ifdef CONFIG_ARCH_OMAP3
+#if defined(CONFIG_ARCH_OMAP3) || defined(CONFIG_SOC_AM43XX)
 OMAP_SYS_32K_TIMER_INIT(3, 1, "timer_32k_ck", "ti,timer-alwon",
                        2, "timer_sys_ck", NULL);
 OMAP_SYS_32K_TIMER_INIT(3_secure, 12, "secure_32k_fck", "ti,timer-secure",
index 9bf796df1b9e149b47f2dee6609c7240d5a263dd..f7f2879b31b0218b7c9d20a08cc4d2d73e09bb20 100644 (file)
@@ -170,6 +170,7 @@ int omap_voltage_late_init(void);
 extern void omap2xxx_voltagedomains_init(void);
 extern void omap3xxx_voltagedomains_init(void);
 extern void omap44xx_voltagedomains_init(void);
+extern void omap54xx_voltagedomains_init(void);
 
 struct voltagedomain *voltdm_lookup(const char *name);
 void voltdm_init(struct voltagedomain **voltdm_list);
diff --git a/arch/arm/mach-omap2/voltagedomains54xx_data.c b/arch/arm/mach-omap2/voltagedomains54xx_data.c
new file mode 100644 (file)
index 0000000..72b8971
--- /dev/null
@@ -0,0 +1,102 @@
+/*
+ * OMAP5 Voltage Management Routines
+ *
+ * Based on voltagedomains44xx_data.c
+ *
+ * Copyright (C) 2013 Texas Instruments Incorporated - http://www.ti.com
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+#include <linux/kernel.h>
+#include <linux/err.h>
+#include <linux/init.h>
+
+#include "common.h"
+
+#include "prm54xx.h"
+#include "voltage.h"
+#include "omap_opp_data.h"
+#include "vc.h"
+#include "vp.h"
+
+static const struct omap_vfsm_instance omap5_vdd_mpu_vfsm = {
+       .voltsetup_reg = OMAP54XX_PRM_VOLTSETUP_MPU_RET_SLEEP_OFFSET,
+};
+
+static const struct omap_vfsm_instance omap5_vdd_mm_vfsm = {
+       .voltsetup_reg = OMAP54XX_PRM_VOLTSETUP_MM_RET_SLEEP_OFFSET,
+};
+
+static const struct omap_vfsm_instance omap5_vdd_core_vfsm = {
+       .voltsetup_reg = OMAP54XX_PRM_VOLTSETUP_CORE_RET_SLEEP_OFFSET,
+};
+
+static struct voltagedomain omap5_voltdm_mpu = {
+       .name = "mpu",
+       .scalable = true,
+       .read = omap4_prm_vcvp_read,
+       .write = omap4_prm_vcvp_write,
+       .rmw = omap4_prm_vcvp_rmw,
+       .vc = &omap4_vc_mpu,
+       .vfsm = &omap5_vdd_mpu_vfsm,
+       .vp = &omap4_vp_mpu,
+};
+
+static struct voltagedomain omap5_voltdm_mm = {
+       .name = "mm",
+       .scalable = true,
+       .read = omap4_prm_vcvp_read,
+       .write = omap4_prm_vcvp_write,
+       .rmw = omap4_prm_vcvp_rmw,
+       .vc = &omap4_vc_iva,
+       .vfsm = &omap5_vdd_mm_vfsm,
+       .vp = &omap4_vp_iva,
+};
+
+static struct voltagedomain omap5_voltdm_core = {
+       .name = "core",
+       .scalable = true,
+       .read = omap4_prm_vcvp_read,
+       .write = omap4_prm_vcvp_write,
+       .rmw = omap4_prm_vcvp_rmw,
+       .vc = &omap4_vc_core,
+       .vfsm = &omap5_vdd_core_vfsm,
+       .vp = &omap4_vp_core,
+};
+
+static struct voltagedomain omap5_voltdm_wkup = {
+       .name = "wkup",
+};
+
+static struct voltagedomain *voltagedomains_omap5[] __initdata = {
+       &omap5_voltdm_mpu,
+       &omap5_voltdm_mm,
+       &omap5_voltdm_core,
+       &omap5_voltdm_wkup,
+       NULL,
+};
+
+static const char *sys_clk_name __initdata = "sys_clkin";
+
+void __init omap54xx_voltagedomains_init(void)
+{
+       struct voltagedomain *voltdm;
+       int i;
+
+       /*
+        * XXX Will depend on the process, validation, and binning
+        * for the currently-running IC. Use OMAP4 data for time being.
+        */
+#ifdef CONFIG_PM_OPP
+       omap5_voltdm_mpu.volt_data = omap446x_vdd_mpu_volt_data;
+       omap5_voltdm_mm.volt_data = omap446x_vdd_iva_volt_data;
+       omap5_voltdm_core.volt_data = omap446x_vdd_core_volt_data;
+#endif
+
+       for (i = 0; voltdm = voltagedomains_omap5[i], voltdm; i++)
+               voltdm->sys_clk.name = sys_clk_name;
+
+       voltdm_init(voltagedomains_omap5);
+};
index ab1700ec8e64f9cf3870179b4d2d2afc733e5d60..b7e094671522d33d9b197fc28272d83473031310 100644 (file)
@@ -35,121 +35,95 @@ static struct s3c24xx_dma_map __initdata s3c2412_dma_mappings[] = {
        [DMACH_XD0] = {
                .name           = "xdreq0",
                .channels       = MAP(S3C2412_DMAREQSEL_XDREQ0),
-               .channels_rx    = MAP(S3C2412_DMAREQSEL_XDREQ0),
        },
        [DMACH_XD1] = {
                .name           = "xdreq1",
                .channels       = MAP(S3C2412_DMAREQSEL_XDREQ1),
-               .channels_rx    = MAP(S3C2412_DMAREQSEL_XDREQ1),
        },
        [DMACH_SDI] = {
                .name           = "sdi",
                .channels       = MAP(S3C2412_DMAREQSEL_SDI),
-               .channels_rx    = MAP(S3C2412_DMAREQSEL_SDI),
        },
-       [DMACH_SPI0] = {
-               .name           = "spi0",
+       [DMACH_SPI0_RX] = {
+               .name           = "spi0-rx",
+               .channels       = MAP(S3C2412_DMAREQSEL_SPI0RX),
+       },
+       [DMACH_SPI0_TX] = {
+               .name           = "spi0-tx",
                .channels       = MAP(S3C2412_DMAREQSEL_SPI0TX),
-               .channels_rx    = MAP(S3C2412_DMAREQSEL_SPI0RX),
        },
-       [DMACH_SPI1] = {
-               .name           = "spi1",
+       [DMACH_SPI1_RX] = {
+               .name           = "spi1-rx",
+               .channels       = MAP(S3C2412_DMAREQSEL_SPI1RX),
+       },
+       [DMACH_SPI1_TX] = {
+               .name           = "spi1-tx",
                .channels       = MAP(S3C2412_DMAREQSEL_SPI1TX),
-               .channels_rx    = MAP(S3C2412_DMAREQSEL_SPI1RX),
        },
        [DMACH_UART0] = {
                .name           = "uart0",
                .channels       = MAP(S3C2412_DMAREQSEL_UART0_0),
-               .channels_rx    = MAP(S3C2412_DMAREQSEL_UART0_0),
        },
        [DMACH_UART1] = {
                .name           = "uart1",
                .channels       = MAP(S3C2412_DMAREQSEL_UART1_0),
-               .channels_rx    = MAP(S3C2412_DMAREQSEL_UART1_0),
        },
        [DMACH_UART2] = {
                .name           = "uart2",
                .channels       = MAP(S3C2412_DMAREQSEL_UART2_0),
-               .channels_rx    = MAP(S3C2412_DMAREQSEL_UART2_0),
        },
        [DMACH_UART0_SRC2] = {
                .name           = "uart0",
                .channels       = MAP(S3C2412_DMAREQSEL_UART0_1),
-               .channels_rx    = MAP(S3C2412_DMAREQSEL_UART0_1),
        },
        [DMACH_UART1_SRC2] = {
                .name           = "uart1",
                .channels       = MAP(S3C2412_DMAREQSEL_UART1_1),
-               .channels_rx    = MAP(S3C2412_DMAREQSEL_UART1_1),
        },
        [DMACH_UART2_SRC2] = {
                .name           = "uart2",
                .channels       = MAP(S3C2412_DMAREQSEL_UART2_1),
-               .channels_rx    = MAP(S3C2412_DMAREQSEL_UART2_1),
        },
        [DMACH_TIMER] = {
                .name           = "timer",
                .channels       = MAP(S3C2412_DMAREQSEL_TIMER),
-               .channels_rx    = MAP(S3C2412_DMAREQSEL_TIMER),
        },
        [DMACH_I2S_IN] = {
                .name           = "i2s-sdi",
                .channels       = MAP(S3C2412_DMAREQSEL_I2SRX),
-               .channels_rx    = MAP(S3C2412_DMAREQSEL_I2SRX),
        },
        [DMACH_I2S_OUT] = {
                .name           = "i2s-sdo",
                .channels       = MAP(S3C2412_DMAREQSEL_I2STX),
-               .channels_rx    = MAP(S3C2412_DMAREQSEL_I2STX),
        },
        [DMACH_USB_EP1] = {
                .name           = "usb-ep1",
                .channels       = MAP(S3C2412_DMAREQSEL_USBEP1),
-               .channels_rx    = MAP(S3C2412_DMAREQSEL_USBEP1),
        },
        [DMACH_USB_EP2] = {
                .name           = "usb-ep2",
                .channels       = MAP(S3C2412_DMAREQSEL_USBEP2),
-               .channels_rx    = MAP(S3C2412_DMAREQSEL_USBEP2),
        },
        [DMACH_USB_EP3] = {
                .name           = "usb-ep3",
                .channels       = MAP(S3C2412_DMAREQSEL_USBEP3),
-               .channels_rx    = MAP(S3C2412_DMAREQSEL_USBEP3),
        },
        [DMACH_USB_EP4] = {
                .name           = "usb-ep4",
                .channels       = MAP(S3C2412_DMAREQSEL_USBEP4),
-               .channels_rx    = MAP(S3C2412_DMAREQSEL_USBEP4),
        },
 };
 
-static void s3c2412_dma_direction(struct s3c2410_dma_chan *chan,
-                                 struct s3c24xx_dma_map *map,
-                                 enum dma_data_direction dir)
-{
-       unsigned long chsel;
-
-       if (dir == DMA_FROM_DEVICE)
-               chsel = map->channels_rx[0];
-       else
-               chsel = map->channels[0];
-
-       chsel &= ~DMA_CH_VALID;
-       chsel |= S3C2412_DMAREQSEL_HW;
-
-       writel(chsel, chan->regs + S3C2412_DMA_DMAREQSEL);
-}
-
 static void s3c2412_dma_select(struct s3c2410_dma_chan *chan,
                               struct s3c24xx_dma_map *map)
 {
-       s3c2412_dma_direction(chan, map, chan->source);
+       unsigned long chsel = map->channels[0] & (~DMA_CH_VALID);
+       writel(chsel | S3C2412_DMAREQSEL_HW,
+              chan->regs + S3C2412_DMA_DMAREQSEL);
 }
 
 static struct s3c24xx_dma_selection __initdata s3c2412_dma_sel = {
        .select         = s3c2412_dma_select,
-       .direction      = s3c2412_dma_direction,
        .dcon_mask      = 0,
        .map            = s3c2412_dma_mappings,
        .map_size       = ARRAY_SIZE(s3c2412_dma_mappings),
index 5fe3539dc2b5a097ab46c7712b63b96344d86378..95b9f759fe97fdea1df49efdf78f062f11a8d2aa 100644 (file)
@@ -128,7 +128,8 @@ static struct s3c24xx_dma_map __initdata s3c2443_dma_mappings[] = {
 static void s3c2443_dma_select(struct s3c2410_dma_chan *chan,
                               struct s3c24xx_dma_map *map)
 {
-       writel(map->channels[0] | S3C2443_DMAREQSEL_HW,
+       unsigned long chsel = map->channels[0] & (~DMA_CH_VALID);
+       writel(chsel | S3C2443_DMAREQSEL_HW,
               chan->regs + S3C2443_DMA_DMAREQSEL);
 }
 
index aab64909e9a3a4528a340dc33521393f1515e422..4a65cba3295d69ce0bcec9168307f81dfa36fc09 100644 (file)
@@ -1159,9 +1159,6 @@ int s3c2410_dma_devconfig(enum dma_ch channel,
                return -EINVAL;
        }
 
-       if (dma_sel.direction != NULL)
-               (dma_sel.direction)(chan, chan->map, source);
-
        return 0;
 }
 
index 1a517e2fe44900d7ca8e70a79f185a5d49aba21d..757c4e97375ffc2aebb9ed3ee2782d8ab7ac9c0c 100644 (file)
@@ -36,10 +36,13 @@ config ARCH_R8A7740
        select RENESAS_INTC_IRQPIN
 
 config ARCH_R8A7778
-       bool "R-Car M1 (R8A77780)"
+       bool "R-Car M1A (R8A77781)"
+       select ARCH_WANT_OPTIONAL_GPIOLIB
        select CPU_V7
        select SH_CLK_CPG
        select ARM_GIC
+       select USB_ARCH_HAS_EHCI
+       select USB_ARCH_HAS_OHCI
 
 config ARCH_R8A7779
        bool "R-Car H1 (R8A77790)"
@@ -169,6 +172,8 @@ config MACH_KZM9D
 config MACH_KZM9G
        bool "KZM-A9-GT board"
        depends on ARCH_SH73A0
+       select ARCH_HAS_CPUFREQ
+       select ARCH_HAS_OPP
        select ARCH_REQUIRE_GPIOLIB
        select REGULATOR_FIXED_VOLTAGE if REGULATOR
        select SND_SOC_AK4642 if SND_SIMPLE_CARD
index 45f78cadec1dffbbcce57cb0976e491542c26b2c..297bf5eec5ab2a3edf801f6db15e0a91bc242849 100644 (file)
@@ -1026,10 +1026,8 @@ out:
 
 /* TouchScreen */
 #ifdef CONFIG_AP4EVB_QHD
-# define GPIO_TSC_IRQ  GPIO_FN_IRQ28_123
 # define GPIO_TSC_PORT 123
 #else /* WVGA */
-# define GPIO_TSC_IRQ  GPIO_FN_IRQ7_40
 # define GPIO_TSC_PORT 40
 #endif
 
@@ -1037,22 +1035,12 @@ out:
 #define IRQ7   evt2irq(0x02e0) /* IRQ7A */
 static int ts_get_pendown_state(void)
 {
-       int val;
-
-       gpio_free(GPIO_TSC_IRQ);
-
-       gpio_request_one(GPIO_TSC_PORT, GPIOF_IN, NULL);
-
-       val = gpio_get_value(GPIO_TSC_PORT);
-
-       gpio_request(GPIO_TSC_IRQ, NULL);
-
-       return !val;
+       return !gpio_get_value(GPIO_TSC_PORT);
 }
 
 static int ts_init(void)
 {
-       gpio_request(GPIO_TSC_IRQ, NULL);
+       gpio_request_one(GPIO_TSC_PORT, GPIOF_IN, NULL);
 
        return 0;
 }
@@ -1086,11 +1074,42 @@ static struct i2c_board_info i2c1_devices[] = {
 
 
 static const struct pinctrl_map ap4evb_pinctrl_map[] = {
+       /* CEU */
+       PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_ceu.0", "pfc-sh7372",
+                                 "ceu_clk_0", "ceu"),
+       /* FSIA (AK4643) */
+       PIN_MAP_MUX_GROUP_DEFAULT("asoc-simple-card.0", "pfc-sh7372",
+                                 "fsia_sclk_in", "fsia"),
+       PIN_MAP_MUX_GROUP_DEFAULT("asoc-simple-card.0", "pfc-sh7372",
+                                 "fsia_data_in", "fsia"),
+       PIN_MAP_MUX_GROUP_DEFAULT("asoc-simple-card.0", "pfc-sh7372",
+                                 "fsia_data_out", "fsia"),
+       /* FSIB (HDMI) */
+       PIN_MAP_MUX_GROUP_DEFAULT("asoc-simple-card.1", "pfc-sh7372",
+                                 "fsib_mclk_in", "fsib"),
+       /* HDMI */
+       PIN_MAP_MUX_GROUP_DEFAULT("sh-mobile-hdmi", "pfc-sh7372",
+                                 "hdmi", "hdmi"),
+       /* KEYSC */
+       PIN_MAP_MUX_GROUP_DEFAULT("sh_keysc", "pfc-sh7372",
+                                 "keysc_in04_0", "keysc"),
+       PIN_MAP_MUX_GROUP_DEFAULT("sh_keysc", "pfc-sh7372",
+                                 "keysc_out5", "keysc"),
+#ifndef CONFIG_AP4EVB_QHD
+       /* LCDC */
+       PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_lcdc_fb.0", "pfc-sh7372",
+                                 "lcd_data18", "lcd"),
+       PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_lcdc_fb.0", "pfc-sh7372",
+                                 "lcd_sync", "lcd"),
+#endif
        /* 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"),
+       /* SCIFA0 */
+       PIN_MAP_MUX_GROUP_DEFAULT("sh-sci.0", "pfc-sh7372",
+                                 "scifa0_data", "scifa0"),
        /* SDHI0 */
        PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.0", "pfc-sh7372",
                                  "sdhi0_data4", "sdhi0"),
@@ -1105,6 +1124,26 @@ static const struct pinctrl_map ap4evb_pinctrl_map[] = {
                                  "sdhi1_data4", "sdhi1"),
        PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.1", "pfc-sh7372",
                                  "sdhi1_ctrl", "sdhi1"),
+       /* SMSC911X */
+       PIN_MAP_MUX_GROUP_DEFAULT("smsc911x", "pfc-sh7372",
+                                 "bsc_cs5a", "bsc"),
+       PIN_MAP_MUX_GROUP_DEFAULT("smsc911x", "pfc-sh7372",
+                                 "intc_irq6_0", "intc"),
+       /* TSC2007 */
+#ifdef CONFIG_AP4EVB_QHD
+       PIN_MAP_MUX_GROUP_DEFAULT("1-0048", "pfc-sh7372",
+                                 "intc_irq28_0", "intc"),
+#else /* WVGA */
+       PIN_MAP_MUX_GROUP_DEFAULT("1-0048", "pfc-sh7372",
+                                 "intc_irq7_0", "intc"),
+#endif
+       /* USBHS1 */
+       PIN_MAP_MUX_GROUP_DEFAULT("r8a66597_hcd.1", "pfc-sh7372",
+                                 "usb1_vbus", "usb1"),
+       PIN_MAP_MUX_GROUP_DEFAULT("r8a66597_hcd.1", "pfc-sh7372",
+                                 "usb1_otg_id_0", "usb1"),
+       PIN_MAP_MUX_GROUP_DEFAULT("r8a66597_hcd.1", "pfc-sh7372",
+                                 "usb1_otg_ctrl_0", "usb1"),
 };
 
 #define GPIO_PORT9CR   IOMEM(0xE6051009)
@@ -1137,36 +1176,16 @@ static void __init ap4evb_init(void)
                                  ARRAY_SIZE(ap4evb_pinctrl_map));
        sh7372_pinmux_init();
 
-       /* enable SCIFA0 */
-       gpio_request(GPIO_FN_SCIFA0_TXD, NULL);
-       gpio_request(GPIO_FN_SCIFA0_RXD, NULL);
-
-       /* enable SMSC911X */
-       gpio_request(GPIO_FN_CS5A,      NULL);
-       gpio_request(GPIO_FN_IRQ6_39,   NULL);
-
        /* enable Debug switch (S6) */
        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);
-       gpio_request(GPIO_FN_IDIN_1_18,  NULL);
-       gpio_request(GPIO_FN_PWEN_1_115, NULL);
-       gpio_request(GPIO_FN_OVCN_1_114, NULL);
-       gpio_request(GPIO_FN_EXTLP_1,    NULL);
-       gpio_request(GPIO_FN_OVCN2_1,    NULL);
-
        /* setup USB phy */
        __raw_writew(0x8a0a, IOMEM(0xE6058130));        /* USBCR4 */
 
-       /* enable FSI2 port A (ak4643) */
-       gpio_request(GPIO_FN_FSIAIBT,   NULL);
-       gpio_request(GPIO_FN_FSIAILR,   NULL);
-       gpio_request(GPIO_FN_FSIAISLD,  NULL);
-       gpio_request(GPIO_FN_FSIAOSLD,  NULL);
+       /* FSI2 port A (ak4643) */
        gpio_request_one(161, GPIOF_OUT_INIT_LOW, NULL); /* slave */
 
        gpio_request(9, NULL);
@@ -1177,8 +1196,7 @@ static void __init ap4evb_init(void)
        /* card detect pin for MMC slot (CN7) */
        gpio_request_one(41, GPIOF_IN, NULL);
 
-       /* setup FSI2 port B (HDMI) */
-       gpio_request(GPIO_FN_FSIBCK, NULL);
+       /* FSI2 port B (HDMI) */
        __raw_writew(__raw_readw(USCCR1) & ~(1 << 6), USCCR1); /* use SPDIF */
 
        /* set SPU2 clock to 119.6 MHz */
@@ -1208,18 +1226,6 @@ static void __init ap4evb_init(void)
         * IRQ28 for Touch Panel, set dip switches S3, S43 as OFF, ON.
         */
 
-       /* enable KEYSC */
-       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_KEYIN0_136, NULL);
-       gpio_request(GPIO_FN_KEYIN1_135, NULL);
-       gpio_request(GPIO_FN_KEYIN2_134, NULL);
-       gpio_request(GPIO_FN_KEYIN3_133, NULL);
-       gpio_request(GPIO_FN_KEYIN4,     NULL);
-
        /* enable TouchScreen */
        irq_set_irq_type(IRQ28, IRQ_TYPE_LEVEL_LOW);
 
@@ -1241,28 +1247,6 @@ static void __init ap4evb_init(void)
         * For WVGA Panel (18-bit RGB, CONFIG_AP4EVB_WVGA=y) and
         * IRQ7 for Touch Panel, set dip switches S3, S43 to ON, OFF.
         */
-
-       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(189, GPIOF_OUT_INIT_HIGH, NULL); /* backlight */
        gpio_request_one(151, GPIOF_OUT_INIT_HIGH, NULL); /* LCDDON */
 
@@ -1288,8 +1272,6 @@ static void __init ap4evb_init(void)
         */
 
        /* MIPI-CSI stuff */
-       gpio_request(GPIO_FN_VIO_CKO, NULL);
-
        clk = clk_get(NULL, "vck1_clk");
        if (!IS_ERR(clk)) {
                clk_set_rate(clk, clk_round_rate(clk, 13000000));
@@ -1299,10 +1281,6 @@ static void __init ap4evb_init(void)
 
        sh7372_add_standard_devices();
 
-       /* HDMI */
-       gpio_request(GPIO_FN_HDMI_HPD, NULL);
-       gpio_request(GPIO_FN_HDMI_CEC, NULL);
-
        /* Reset HDMI, must be held at least one EXTALR (32768Hz) period */
 #define SRCR4 IOMEM(0xe61580bc)
        srcr4 = __raw_readl(SRCR4);
index b85b2882dbd05cc57d644d15f9349abe75cc7293..44a621505eeb63ead22467caefc969627a738ca2 100644 (file)
@@ -584,7 +584,7 @@ static struct regulator_init_data vcc_sdhi0_init_data = {
 static struct fixed_voltage_config vcc_sdhi0_info = {
        .supply_name = "SDHI0 Vcc",
        .microvolts = 3300000,
-       .gpio = GPIO_PORT75,
+       .gpio = 75,
        .enable_high = 1,
        .init_data = &vcc_sdhi0_init_data,
 };
@@ -615,7 +615,7 @@ static struct regulator_init_data vccq_sdhi0_init_data = {
 };
 
 static struct gpio vccq_sdhi0_gpios[] = {
-       {GPIO_PORT17, GPIOF_OUT_INIT_LOW, "vccq-sdhi0" },
+       {17, GPIOF_OUT_INIT_LOW, "vccq-sdhi0" },
 };
 
 static struct gpio_regulator_state vccq_sdhi0_states[] = {
@@ -626,7 +626,7 @@ static struct gpio_regulator_state vccq_sdhi0_states[] = {
 static struct gpio_regulator_config vccq_sdhi0_info = {
        .supply_name = "vqmmc",
 
-       .enable_gpio = GPIO_PORT74,
+       .enable_gpio = 74,
        .enable_high = 1,
        .enabled_at_boot = 0,
 
@@ -664,7 +664,7 @@ static struct regulator_init_data vcc_sdhi1_init_data = {
 static struct fixed_voltage_config vcc_sdhi1_info = {
        .supply_name = "SDHI1 Vcc",
        .microvolts = 3300000,
-       .gpio = GPIO_PORT16,
+       .gpio = 16,
        .enable_high = 1,
        .init_data = &vcc_sdhi1_init_data,
 };
@@ -693,7 +693,7 @@ static struct sh_mobile_sdhi_info sdhi0_info = {
        .tmio_caps      = MMC_CAP_SD_HIGHSPEED | MMC_CAP_SDIO_IRQ |
                          MMC_CAP_POWER_OFF_CARD,
        .tmio_flags     = TMIO_MMC_HAS_IDLE_WAIT | TMIO_MMC_USE_GPIO_CD,
-       .cd_gpio        = GPIO_PORT167,
+       .cd_gpio        = 167,
 };
 
 static struct resource sdhi0_resources[] = {
@@ -736,7 +736,7 @@ static struct sh_mobile_sdhi_info sdhi1_info = {
                          MMC_CAP_POWER_OFF_CARD,
        .tmio_flags     = TMIO_MMC_HAS_IDLE_WAIT | TMIO_MMC_USE_GPIO_CD,
        /* Port72 cannot generate IRQs, will be used in polling mode. */
-       .cd_gpio        = GPIO_PORT72,
+       .cd_gpio        = 72,
 };
 
 static struct resource sdhi1_resources[] = {
@@ -1046,6 +1046,35 @@ static struct platform_device *eva_devices[] __initdata = {
 };
 
 static const struct pinctrl_map eva_pinctrl_map[] = {
+       /* CEU0 */
+       PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_ceu.0", "pfc-r8a7740",
+                                 "ceu0_data_0_7", "ceu0"),
+       PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_ceu.0", "pfc-r8a7740",
+                                 "ceu0_clk_0", "ceu0"),
+       PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_ceu.0", "pfc-r8a7740",
+                                 "ceu0_sync", "ceu0"),
+       PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_ceu.0", "pfc-r8a7740",
+                                 "ceu0_field", "ceu0"),
+       /* FSIA */
+       PIN_MAP_MUX_GROUP_DEFAULT("asoc-simple-card.0", "pfc-r8a7740",
+                                 "fsia_sclk_in", "fsia"),
+       PIN_MAP_MUX_GROUP_DEFAULT("asoc-simple-card.0", "pfc-r8a7740",
+                                 "fsia_mclk_out", "fsia"),
+       PIN_MAP_MUX_GROUP_DEFAULT("asoc-simple-card.0", "pfc-r8a7740",
+                                 "fsia_data_in_1", "fsia"),
+       PIN_MAP_MUX_GROUP_DEFAULT("asoc-simple-card.0", "pfc-r8a7740",
+                                 "fsia_data_out_0", "fsia"),
+       /* FSIB */
+       PIN_MAP_MUX_GROUP_DEFAULT("asoc-simple-card.1", "pfc-r8a7740",
+                                 "fsib_mclk_in", "fsib"),
+       /* GETHER */
+       PIN_MAP_MUX_GROUP_DEFAULT("sh-eth", "pfc-r8a7740",
+                                 "gether_mii", "gether"),
+       PIN_MAP_MUX_GROUP_DEFAULT("sh-eth", "pfc-r8a7740",
+                                 "gether_int", "gether"),
+       /* HDMI */
+       PIN_MAP_MUX_GROUP_DEFAULT("sh-mobile-hdmi", "pfc-r8a7740",
+                                 "hdmi", "hdmi"),
        /* LCD0 */
        PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_lcdc_fb.0", "pfc-r8a7740",
                                  "lcd0_data24_0", "lcd0"),
@@ -1058,6 +1087,9 @@ static const struct pinctrl_map eva_pinctrl_map[] = {
                                  "mmc0_data8_1", "mmc0"),
        PIN_MAP_MUX_GROUP_DEFAULT("sh_mmcif.0", "pfc-r8a7740",
                                  "mmc0_ctrl_1", "mmc0"),
+       /* SCIFA1 */
+       PIN_MAP_MUX_GROUP_DEFAULT("sh-sci.1", "pfc-r8a7740",
+                                 "scifa1_data", "scifa1"),
        /* SDHI0 */
        PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.0", "pfc-r8a7740",
                                  "sdhi0_data4", "sdhi0"),
@@ -1065,6 +1097,12 @@ static const struct pinctrl_map eva_pinctrl_map[] = {
                                  "sdhi0_ctrl", "sdhi0"),
        PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.0", "pfc-r8a7740",
                                  "sdhi0_wp", "sdhi0"),
+       /* ST1232 */
+       PIN_MAP_MUX_GROUP_DEFAULT("0-0055", "pfc-r8a7740",
+                                 "intc_irq10", "intc"),
+       /* USBHS */
+       PIN_MAP_MUX_GROUP_DEFAULT("renesas_usbhs", "pfc-r8a7740",
+                                 "intc_irq7_1", "intc"),
 };
 
 static void __init eva_clock_init(void)
@@ -1119,40 +1157,14 @@ static void __init eva_init(void)
        r8a7740_pinmux_init();
        r8a7740_meram_workaround();
 
-       /* SCIFA1 */
-       gpio_request(GPIO_FN_SCIFA1_RXD, NULL);
-       gpio_request(GPIO_FN_SCIFA1_TXD, NULL);
-
        /* LCDC0 */
-       gpio_request(GPIO_FN_LCDC0_SELECT,      NULL);
-
        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(166, GPIOF_OUT_INIT_HIGH, NULL); /* TP_RST_B */
 
        /* GETHER */
-       gpio_request(GPIO_FN_ET_CRS,            NULL);
-       gpio_request(GPIO_FN_ET_MDC,            NULL);
-       gpio_request(GPIO_FN_ET_MDIO,           NULL);
-       gpio_request(GPIO_FN_ET_TX_ER,          NULL);
-       gpio_request(GPIO_FN_ET_RX_ER,          NULL);
-       gpio_request(GPIO_FN_ET_ERXD0,          NULL);
-       gpio_request(GPIO_FN_ET_ERXD1,          NULL);
-       gpio_request(GPIO_FN_ET_ERXD2,          NULL);
-       gpio_request(GPIO_FN_ET_ERXD3,          NULL);
-       gpio_request(GPIO_FN_ET_TX_CLK,         NULL);
-       gpio_request(GPIO_FN_ET_TX_EN,          NULL);
-       gpio_request(GPIO_FN_ET_ETXD0,          NULL);
-       gpio_request(GPIO_FN_ET_ETXD1,          NULL);
-       gpio_request(GPIO_FN_ET_ETXD2,          NULL);
-       gpio_request(GPIO_FN_ET_ETXD3,          NULL);
-       gpio_request(GPIO_FN_ET_PHY_INT,        NULL);
-       gpio_request(GPIO_FN_ET_COL,            NULL);
-       gpio_request(GPIO_FN_ET_RX_DV,          NULL);
-       gpio_request(GPIO_FN_ET_RX_CLK,         NULL);
-
        gpio_request_one(18, GPIOF_OUT_INIT_HIGH, NULL); /* PHY_RST */
 
        /* USB */
@@ -1163,34 +1175,17 @@ static void __init eva_init(void)
        } else {
                /* USB Func */
                /*
-                * A1 chip has 2 IRQ7 pin and it was controled by MSEL register.
-                * 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 209 here
+                * The USBHS interrupt handlers needs to read the IRQ pin value
+                * (HI/LOW) to diffentiate USB connection and disconnection
+                * events (usbhsf_get_vbus()). We thus need to select both the
+                * intc_irq7_1 pin group and GPIO 209 here.
                 */
-               gpio_request(GPIO_FN_IRQ7_PORT209, NULL);
                gpio_request_one(209, GPIOF_IN, NULL);
 
                platform_device_register(&usbhsf_device);
                usb = &usbhsf_device;
        }
 
-       /* CEU0 */
-       gpio_request(GPIO_FN_VIO0_D7,           NULL);
-       gpio_request(GPIO_FN_VIO0_D6,           NULL);
-       gpio_request(GPIO_FN_VIO0_D5,           NULL);
-       gpio_request(GPIO_FN_VIO0_D4,           NULL);
-       gpio_request(GPIO_FN_VIO0_D3,           NULL);
-       gpio_request(GPIO_FN_VIO0_D2,           NULL);
-       gpio_request(GPIO_FN_VIO0_D1,           NULL);
-       gpio_request(GPIO_FN_VIO0_D0,           NULL);
-       gpio_request(GPIO_FN_VIO0_CLK,          NULL);
-       gpio_request(GPIO_FN_VIO0_HD,           NULL);
-       gpio_request(GPIO_FN_VIO0_VD,           NULL);
-       gpio_request(GPIO_FN_VIO0_FIELD,        NULL);
-       gpio_request(GPIO_FN_VIO_CKO,           NULL);
-
        /* CON1/CON15 Camera */
        gpio_request_one(173, GPIOF_OUT_INIT_LOW, NULL);  /* STANDBY */
        gpio_request_one(172, GPIOF_OUT_INIT_HIGH, NULL); /* RST */
@@ -1198,24 +1193,11 @@ static void __init eva_init(void)
        gpio_request_one(158, GPIOF_OUT_INIT_LOW, NULL);  /* CAM_PON */
 
        /* FSI-WM8978 */
-       gpio_request(GPIO_FN_FSIAIBT,           NULL);
-       gpio_request(GPIO_FN_FSIAILR,           NULL);
-       gpio_request(GPIO_FN_FSIAOMC,           NULL);
-       gpio_request(GPIO_FN_FSIAOSLD,          NULL);
-       gpio_request(GPIO_FN_FSIAISLD_PORT5,    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 */
 
-       /* FSI-HDMI */
-       gpio_request(GPIO_FN_FSIBCK,            NULL);
-
-       /* HDMI */
-       gpio_request(GPIO_FN_HDMI_HPD,          NULL);
-       gpio_request(GPIO_FN_HDMI_CEC,          NULL);
-
        /*
         * CAUTION
         *
index 38e5e50fb3180fb6d8db907ddea4680da8966e30..7ed2401b899c05044d2e8471545571711dc9d515 100644 (file)
@@ -18,6 +18,7 @@
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  */
 
+#include <linux/pinctrl/machine.h>
 #include <linux/platform_device.h>
 #include <linux/smsc911x.h>
 #include <mach/common.h>
@@ -37,6 +38,20 @@ static struct resource smsc911x_resources[] = {
        DEFINE_RES_IRQ(irq_pin(0)), /* IRQ 0 */
 };
 
+static struct rcar_phy_platform_data usb_phy_platform_data __initdata;
+
+static const struct pinctrl_map bockw_pinctrl_map[] = {
+       /* SCIF0 */
+       PIN_MAP_MUX_GROUP_DEFAULT("sh-sci.0", "pfc-r8a7778",
+                                 "scif0_data_a", "scif0"),
+       PIN_MAP_MUX_GROUP_DEFAULT("sh-sci.0", "pfc-r8a7778",
+                                 "scif0_ctrl", "scif0"),
+       PIN_MAP_MUX_GROUP_DEFAULT("ehci-platform", "pfc-r8a7778",
+                                 "usb0", "usb0"),
+       PIN_MAP_MUX_GROUP_DEFAULT("ehci-platform", "pfc-r8a7778",
+                                 "usb1", "usb1"),
+};
+
 #define IRQ0MR 0x30
 static void __init bockw_init(void)
 {
@@ -45,6 +60,11 @@ static void __init bockw_init(void)
        r8a7778_clock_init();
        r8a7778_init_irq_extpin(1);
        r8a7778_add_standard_devices();
+       r8a7778_add_usb_phy_device(&usb_phy_platform_data);
+
+       pinctrl_register_mappings(bockw_pinctrl_map,
+                                 ARRAY_SIZE(bockw_pinctrl_map));
+       r8a7778_pinmux_init();
 
        fpga = ioremap_nocache(0x18200000, SZ_1M);
        if (fpga) {
@@ -78,4 +98,5 @@ DT_MACHINE_START(BOCKW_DT, "bockw")
        .init_machine   = bockw_init,
        .init_time      = shmobile_timer_init,
        .dt_compat      = bockw_boards_compat_dt,
+       .init_late      = r8a7778_init_late,
 MACHINE_END
index 70d992c540aeb7b6cc599596d407b7403253b62d..b373e9ced5730de764fe9f198541911a82b4831a 100644 (file)
@@ -330,12 +330,6 @@ static struct platform_device smsc_device = {
        .num_resources  = ARRAY_SIZE(smsc_resources),
 };
 
-/*
- * core board devices
- */
-static struct platform_device *bonito_core_devices[] __initdata = {
-};
-
 /*
  * base board devices
  */
@@ -375,12 +369,37 @@ static void __init bonito_map_io(void)
 #define VCCQ1CR                IOMEM(0xE6058140)
 #define VCCQ1LCDCR     IOMEM(0xE6058186)
 
+/*
+ * HACK: The FPGA mappings should be associated with the FPGA device, but we
+ * don't have one at the moment. Associate them with the PFC device to make
+ * sure they will be applied.
+ */
+static const struct pinctrl_map fpga_pinctrl_map[] = {
+       /* FPGA */
+       PIN_MAP_MUX_GROUP_DEFAULT("pfc-r8a7740", "pfc-r8a7740",
+                                 "bsc_cs5a_0", "bsc"),
+       PIN_MAP_MUX_GROUP_DEFAULT("pfc-r8a7740", "pfc-r8a7740",
+                                 "bsc_cs5b", "bsc"),
+       PIN_MAP_MUX_GROUP_DEFAULT("pfc-r8a7740", "pfc-r8a7740",
+                                 "bsc_cs6a", "bsc"),
+       PIN_MAP_MUX_GROUP_DEFAULT("pfc-r8a7740", "pfc-r8a7740",
+                                 "intc_irq10", "intc"),
+};
+
+static const struct pinctrl_map scifa5_pinctrl_map[] = {
+       /* SCIFA5 */
+       PIN_MAP_MUX_GROUP_DEFAULT("sh-sci.5", "pfc-r8a7740",
+                                 "scifa5_data_2", "scifa5"),
+};
+
 static void __init bonito_init(void)
 {
        u16 val;
 
        regulator_register_fixed(0, dummy_supplies, ARRAY_SIZE(dummy_supplies));
 
+       pinctrl_register_mappings(fpga_pinctrl_map,
+                                 ARRAY_SIZE(fpga_pinctrl_map));
        r8a7740_pinmux_init();
        bonito_fpga_init();
 
@@ -397,9 +416,6 @@ static void __init bonito_init(void)
 
        r8a7740_add_standard_devices();
 
-       platform_add_devices(bonito_core_devices,
-                            ARRAY_SIZE(bonito_core_devices));
-
        /*
         * base board settings
         */
@@ -409,14 +425,6 @@ static void __init bonito_init(void)
                u16 bsw3;
                u16 bsw4;
 
-               /*
-                * FPGA
-                */
-               gpio_request(GPIO_FN_CS5B,              NULL);
-               gpio_request(GPIO_FN_CS6A,              NULL);
-               gpio_request(GPIO_FN_CS5A_PORT105,      NULL);
-               gpio_request(GPIO_FN_IRQ10,             NULL);
-
                val = bonito_fpga_read(BVERR);
                pr_info("bonito version: cpu %02x, base %02x\n",
                        ((val >> 8) & 0xFF),
@@ -432,8 +440,8 @@ static void __init bonito_init(void)
                if (BIT_OFF(bsw2, 1) && /* S38.3 = ON */
                    BIT_OFF(bsw3, 9) && /* S39.6 = ON */
                    BIT_OFF(bsw4, 4)) { /* S43.1 = ON */
-                       gpio_request(GPIO_FN_SCIFA5_TXD_PORT91, NULL);
-                       gpio_request(GPIO_FN_SCIFA5_RXD_PORT92, NULL);
+                       pinctrl_register_mappings(scifa5_pinctrl_map,
+                                                 ARRAY_SIZE(scifa5_pinctrl_map));
                }
 
                /*
@@ -443,7 +451,6 @@ static void __init bonito_init(void)
                    BIT_ON(bsw2, 2)) {  /* S38.2 = OFF */
                        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 */
index aefa50d385b71704fcde80fd8e7e568abaaff998..44055fe8a45c25c573b810608a6fbfa27730e6c5 100644 (file)
@@ -79,7 +79,6 @@ static void __init kzm_init(void)
        sh73a0_pinmux_init();
 
        /* enable SD */
-       gpio_request(GPIO_FN_SDHI0_VCCQ_MC0_ON, NULL);
        gpio_request_one(15, GPIOF_OUT_INIT_HIGH, NULL); /* power */
 
        gpio_request_one(14, GPIOF_OUT_INIT_HIGH, NULL); /* power */
index e6b775a10aad8fc0f51951a551c1cd5da13fad55..1fdf05cb6da1b00f7c6c06d8f77b1fc004dda3b8 100644 (file)
@@ -663,13 +663,13 @@ static unsigned long pin_pullup_conf[] = {
 
 static const struct pinctrl_map kzm_pinctrl_map[] = {
        /* FSIA (AK4648) */
-       PIN_MAP_MUX_GROUP_DEFAULT("sh_fsi2.0", "pfc-sh73a0",
+       PIN_MAP_MUX_GROUP_DEFAULT("sh_fsi2", "pfc-sh73a0",
                                  "fsia_mclk_in", "fsia"),
-       PIN_MAP_MUX_GROUP_DEFAULT("sh_fsi2.0", "pfc-sh73a0",
+       PIN_MAP_MUX_GROUP_DEFAULT("sh_fsi2", "pfc-sh73a0",
                                  "fsia_sclk_in", "fsia"),
-       PIN_MAP_MUX_GROUP_DEFAULT("sh_fsi2.0", "pfc-sh73a0",
+       PIN_MAP_MUX_GROUP_DEFAULT("sh_fsi2", "pfc-sh73a0",
                                  "fsia_data_in", "fsia"),
-       PIN_MAP_MUX_GROUP_DEFAULT("sh_fsi2.0", "pfc-sh73a0",
+       PIN_MAP_MUX_GROUP_DEFAULT("sh_fsi2", "pfc-sh73a0",
                                  "fsia_data_out", "fsia"),
        /* I2C3 */
        PIN_MAP_MUX_GROUP_DEFAULT("i2c-sh_mobile.3", "pfc-sh73a0",
@@ -788,9 +788,6 @@ static void __init kzm_init(void)
        /* Touchscreen */
        gpio_request_one(223, GPIOF_IN, NULL); /* IRQ8 */
 
-       /* enable SD */
-       gpio_request(GPIO_FN_SDHI0_VCCQ_MC0_ON, NULL);
-
 #ifdef CONFIG_CACHE_L2X0
        /* Early BRESP enable, Shared attribute override enable, 64K*8way */
        l2x0_init(IOMEM(0xf0100000), 0x40460000, 0x82000fff);
index f587187a86031f1c88d236818d712ee31e7d098a..6114edd0a977271f131a6b1b4300590754ea003e 100644 (file)
 #include <linux/interrupt.h>
 #include <linux/irqchip.h>
 #include <linux/kernel.h>
+#include <linux/pinctrl/machine.h>
 #include <linux/platform_device.h>
 #include <mach/common.h>
 #include <mach/r8a7790.h>
 #include <asm/mach-types.h>
 #include <asm/mach/arch.h>
 
+static const struct pinctrl_map lager_pinctrl_map[] = {
+       /* SCIF0 (CN19: DEBUG SERIAL0) */
+       PIN_MAP_MUX_GROUP_DEFAULT("sh-sci.6", "pfc-r8a7790",
+                                 "scif0_data", "scif0"),
+       /* SCIF1 (CN20: DEBUG SERIAL1) */
+       PIN_MAP_MUX_GROUP_DEFAULT("sh-sci.7", "pfc-r8a7790",
+                                 "scif1_data", "scif1"),
+};
+
 static void __init lager_add_standard_devices(void)
 {
        r8a7790_clock_init();
+
+       pinctrl_register_mappings(lager_pinctrl_map,
+                                 ARRAY_SIZE(lager_pinctrl_map));
+       r8a7790_pinmux_init();
+
        r8a7790_add_standard_devices();
 }
 
index fa3407da682ad59a08042c383d4297bbe354af41..85f51a849a5043a7f122c6a25c7c63dd97877ec1 100644 (file)
@@ -1309,6 +1309,49 @@ static struct i2c_board_info i2c1_devices[] = {
 };
 
 static const struct pinctrl_map mackerel_pinctrl_map[] = {
+       /* ADXL34X */
+       PIN_MAP_MUX_GROUP_DEFAULT("1-0053", "pfc-sh7372",
+                                 "intc_irq21", "intc"),
+       /* CEU */
+       PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_ceu.0", "pfc-sh7372",
+                                 "ceu_data_0_7", "ceu"),
+       PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_ceu.0", "pfc-sh7372",
+                                 "ceu_clk_0", "ceu"),
+       PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_ceu.0", "pfc-sh7372",
+                                 "ceu_sync", "ceu"),
+       PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_ceu.0", "pfc-sh7372",
+                                 "ceu_field", "ceu"),
+       /* FLCTL */
+       PIN_MAP_MUX_GROUP_DEFAULT("sh_flctl.0", "pfc-sh7372",
+                                 "flctl_data", "flctl"),
+       PIN_MAP_MUX_GROUP_DEFAULT("sh_flctl.0", "pfc-sh7372",
+                                 "flctl_ce0", "flctl"),
+       PIN_MAP_MUX_GROUP_DEFAULT("sh_flctl.0", "pfc-sh7372",
+                                 "flctl_ctrl", "flctl"),
+       /* FSIA (AK4643) */
+       PIN_MAP_MUX_GROUP_DEFAULT("asoc-simple-card.0", "pfc-sh7372",
+                                 "fsia_sclk_in", "fsia"),
+       PIN_MAP_MUX_GROUP_DEFAULT("asoc-simple-card.0", "pfc-sh7372",
+                                 "fsia_data_in", "fsia"),
+       PIN_MAP_MUX_GROUP_DEFAULT("asoc-simple-card.0", "pfc-sh7372",
+                                 "fsia_data_out", "fsia"),
+       /* FSIB (HDMI) */
+       PIN_MAP_MUX_GROUP_DEFAULT("asoc-simple-card.1", "pfc-sh7372",
+                                 "fsib_mclk_in", "fsib"),
+       /* HDMI */
+       PIN_MAP_MUX_GROUP_DEFAULT("sh-mobile-hdmi", "pfc-sh7372",
+                                 "hdmi", "hdmi"),
+       /* LCDC */
+       PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_lcdc_fb.0", "pfc-sh7372",
+                                 "lcd_data24", "lcd"),
+       PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_lcdc_fb.0", "pfc-sh7372",
+                                 "lcd_sync", "lcd"),
+       /* SCIFA0 */
+       PIN_MAP_MUX_GROUP_DEFAULT("sh-sci.0", "pfc-sh7372",
+                                 "scifa0_data", "scifa0"),
+       /* SCIFA2 (GT-720F GPS module) */
+       PIN_MAP_MUX_GROUP_DEFAULT("sh-sci.2", "pfc-sh7372",
+                                 "scifa2_data", "scifa2"),
        /* SDHI0 */
        PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.0", "pfc-sh7372",
                                  "sdhi0_data4", "sdhi0"),
@@ -1316,6 +1359,8 @@ static const struct pinctrl_map mackerel_pinctrl_map[] = {
                                  "sdhi0_ctrl", "sdhi0"),
        PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.0", "pfc-sh7372",
                                  "sdhi0_wp", "sdhi0"),
+       PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.0", "pfc-sh7372",
+                                 "intc_irq26_1", "intc"),
        /* SDHI1 */
 #if !IS_ENABLED(CONFIG_MMC_SH_MMCIF)
        PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.1", "pfc-sh7372",
@@ -1334,6 +1379,25 @@ static const struct pinctrl_map mackerel_pinctrl_map[] = {
                                  "sdhi2_data4", "sdhi2"),
        PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.2", "pfc-sh7372",
                                  "sdhi2_ctrl", "sdhi2"),
+       /* SMSC911X */
+       PIN_MAP_MUX_GROUP_DEFAULT("smsc911x", "pfc-sh7372",
+                                 "bsc_cs5a", "bsc"),
+       PIN_MAP_MUX_GROUP_DEFAULT("smsc911x", "pfc-sh7372",
+                                 "intc_irq6_0", "intc"),
+       /* ST1232 */
+       PIN_MAP_MUX_GROUP_DEFAULT("0-0055", "pfc-sh7372",
+                                 "intc_irq7_0", "intc"),
+       /* TCA6416 */
+       PIN_MAP_MUX_GROUP_DEFAULT("0-0020", "pfc-sh7372",
+                                 "intc_irq9_0", "intc"),
+       /* USBHS0 */
+       PIN_MAP_MUX_GROUP_DEFAULT("renesas_usbhs.0", "pfc-sh7372",
+                                 "usb0_vbus", "usb0"),
+       /* USBHS1 */
+       PIN_MAP_MUX_GROUP_DEFAULT("renesas_usbhs.1", "pfc-sh7372",
+                                 "usb1_vbus", "usb1"),
+       PIN_MAP_MUX_GROUP_DEFAULT("renesas_usbhs.1", "pfc-sh7372",
+                                 "usb1_otg_id_0", "usb1"),
 };
 
 #define GPIO_PORT9CR   IOMEM(0xE6051009)
@@ -1377,61 +1441,18 @@ static void __init mackerel_init(void)
                                  ARRAY_SIZE(mackerel_pinctrl_map));
        sh7372_pinmux_init();
 
-       /* enable SCIFA0 */
-       gpio_request(GPIO_FN_SCIFA0_TXD, NULL);
-       gpio_request(GPIO_FN_SCIFA0_RXD, NULL);
-
-       /* enable SMSC911X */
-       gpio_request(GPIO_FN_CS5A,      NULL);
-       gpio_request(GPIO_FN_IRQ6_39,   NULL);
-
-       /* 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);
-
        /* backlight, off by default */
        gpio_request_one(31, GPIOF_OUT_INIT_LOW, NULL);
 
        gpio_request_one(151, GPIOF_OUT_INIT_HIGH, NULL); /* LCDDON */
 
        /* USBHS0 */
-       gpio_request(GPIO_FN_VBUS0_0, NULL);
        gpio_request_pulldown(GPIO_PORT168CR); /* VBUS0_0 pull down */
 
        /* USBHS1 */
-       gpio_request(GPIO_FN_VBUS0_1, NULL);
        gpio_request_pulldown(GPIO_PORT167CR); /* VBUS0_1 pull down */
-       gpio_request(GPIO_FN_IDIN_1_113, NULL);
 
-       /* enable FSI2 port A (ak4643) */
-       gpio_request(GPIO_FN_FSIAIBT,   NULL);
-       gpio_request(GPIO_FN_FSIAILR,   NULL);
-       gpio_request(GPIO_FN_FSIAISLD,  NULL);
-       gpio_request(GPIO_FN_FSIAOSLD,  NULL);
+       /* FSI2 port A (ak4643) */
        gpio_request_one(161, GPIOF_OUT_INIT_LOW, NULL); /* slave */
 
        gpio_request(9,  NULL);
@@ -1441,8 +1462,7 @@ static void __init mackerel_init(void)
 
        intc_set_priority(IRQ_FSI, 3); /* irq priority FSI(3) > SMSC911X(2) */
 
-       /* setup FSI2 port B (HDMI) */
-       gpio_request(GPIO_FN_FSIBCK, NULL);
+       /* FSI2 port B (HDMI) */
        __raw_writew(__raw_readw(USCCR1) & ~(1 << 6), USCCR1); /* use SPDIF */
 
        /* set SPU2 clock to 119.6 MHz */
@@ -1452,68 +1472,15 @@ static void __init mackerel_init(void)
                clk_put(clk);
        }
 
-       /* enable Keypad */
-       gpio_request(GPIO_FN_IRQ9_42,   NULL);
+       /* Keypad */
        irq_set_irq_type(IRQ9, IRQ_TYPE_LEVEL_HIGH);
 
-       /* enable Touchscreen */
-       gpio_request(GPIO_FN_IRQ7_40,   NULL);
+       /* Touchscreen */
        irq_set_irq_type(IRQ7, IRQ_TYPE_LEVEL_LOW);
 
-       /* enable Accelerometer */
-       gpio_request(GPIO_FN_IRQ21,     NULL);
+       /* Accelerometer */
        irq_set_irq_type(IRQ21, IRQ_TYPE_LEVEL_HIGH);
 
-       /* SDHI0 PORT172 card-detect IRQ26 */
-       gpio_request(GPIO_FN_IRQ26_172, NULL);
-
-       /* FLCTL */
-       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_FCE0, NULL);
-       gpio_request(GPIO_FN_WE0_FWE, NULL);
-       gpio_request(GPIO_FN_FRB, NULL);
-       gpio_request(GPIO_FN_A4_FOE, NULL);
-       gpio_request(GPIO_FN_A5_FCDE, NULL);
-       gpio_request(GPIO_FN_RD_FSC, NULL);
-
-       /* enable GPS module (GT-720F) */
-       gpio_request(GPIO_FN_SCIFA2_TXD1, NULL);
-       gpio_request(GPIO_FN_SCIFA2_RXD1, NULL);
-
-       /* CEU */
-       gpio_request(GPIO_FN_VIO_CLK, NULL);
-       gpio_request(GPIO_FN_VIO_VD, NULL);
-       gpio_request(GPIO_FN_VIO_HD, NULL);
-       gpio_request(GPIO_FN_VIO_FIELD, NULL);
-       gpio_request(GPIO_FN_VIO_CKO, NULL);
-       gpio_request(GPIO_FN_VIO_D7, NULL);
-       gpio_request(GPIO_FN_VIO_D6, NULL);
-       gpio_request(GPIO_FN_VIO_D5, NULL);
-       gpio_request(GPIO_FN_VIO_D4, NULL);
-       gpio_request(GPIO_FN_VIO_D3, NULL);
-       gpio_request(GPIO_FN_VIO_D2, NULL);
-       gpio_request(GPIO_FN_VIO_D1, NULL);
-       gpio_request(GPIO_FN_VIO_D0, NULL);
-
-       /* HDMI */
-       gpio_request(GPIO_FN_HDMI_HPD, NULL);
-       gpio_request(GPIO_FN_HDMI_CEC, NULL);
-
        /* Reset HDMI, must be held at least one EXTALR (32768Hz) period */
        srcr4 = __raw_readl(SRCR4);
        __raw_writel(srcr4 | (1 << 13), SRCR4);
index b9594e911ce7680d28448fa50cf854ceb91b33bf..b1b41b199f99b429c1e54f865fda63591b2f6930 100644 (file)
@@ -28,6 +28,7 @@
 #include <linux/leds.h>
 #include <linux/dma-mapping.h>
 #include <linux/pinctrl/machine.h>
+#include <linux/platform_data/gpio-rcar.h>
 #include <linux/regulator/fixed.h>
 #include <linux/regulator/machine.h>
 #include <linux/smsc911x.h>
 #include <linux/mmc/host.h>
 #include <linux/mmc/sh_mobile_sdhi.h>
 #include <linux/mfd/tmio.h>
-#include <linux/usb/otg.h>
-#include <linux/usb/ehci_pdriver.h>
-#include <linux/usb/ohci_pdriver.h>
-#include <linux/pm_runtime.h>
 #include <mach/hardware.h>
 #include <mach/r8a7779.h>
 #include <mach/common.h>
@@ -60,6 +57,8 @@ static struct regulator_consumer_supply dummy_supplies[] = {
        REGULATOR_SUPPLY("vdd33a", "smsc911x"),
 };
 
+static struct rcar_phy_platform_data usb_phy_platform_data __initdata;
+
 /* SMSC LAN89218 */
 static struct resource smsc911x_resources[] = {
        [0] = {
@@ -149,39 +148,19 @@ static struct platform_device hspi_device = {
        .num_resources  = ARRAY_SIZE(hspi_resources),
 };
 
-/* USB PHY */
-static struct resource usb_phy_resources[] = {
-       [0] = {
-               .start          = 0xffe70000,
-               .end            = 0xffe70900 - 1,
-               .flags          = IORESOURCE_MEM,
-       },
-       [1] = {
-               .start          = 0xfff70000,
-               .end            = 0xfff70900 - 1,
-               .flags          = IORESOURCE_MEM,
-       },
-};
-
-static struct platform_device usb_phy_device = {
-       .name           = "rcar_usb_phy",
-       .resource       = usb_phy_resources,
-       .num_resources  = ARRAY_SIZE(usb_phy_resources),
-};
-
 /* LEDS */
 static struct gpio_led marzen_leds[] = {
        {
                .name           = "led2",
-               .gpio           = 157,
+               .gpio           = RCAR_GP_PIN(4, 29),
                .default_state  = LEDS_GPIO_DEFSTATE_ON,
        }, {
                .name           = "led3",
-               .gpio           = 158,
+               .gpio           = RCAR_GP_PIN(4, 30),
                .default_state  = LEDS_GPIO_DEFSTATE_ON,
        }, {
                .name           = "led4",
-               .gpio           = 159,
+               .gpio           = RCAR_GP_PIN(4, 31),
                .default_state  = LEDS_GPIO_DEFSTATE_ON,
        },
 };
@@ -204,161 +183,9 @@ static struct platform_device *marzen_devices[] __initdata = {
        &sdhi0_device,
        &thermal_device,
        &hspi_device,
-       &usb_phy_device,
        &leds_device,
 };
 
-/* USB */
-static struct usb_phy *phy;
-static int usb_power_on(struct platform_device *pdev)
-{
-       if (IS_ERR(phy))
-               return PTR_ERR(phy);
-
-       pm_runtime_enable(&pdev->dev);
-       pm_runtime_get_sync(&pdev->dev);
-
-       usb_phy_init(phy);
-
-       return 0;
-}
-
-static void usb_power_off(struct platform_device *pdev)
-{
-       if (IS_ERR(phy))
-               return;
-
-       usb_phy_shutdown(phy);
-
-       pm_runtime_put_sync(&pdev->dev);
-       pm_runtime_disable(&pdev->dev);
-}
-
-static struct usb_ehci_pdata ehcix_pdata = {
-       .power_on       = usb_power_on,
-       .power_off      = usb_power_off,
-       .power_suspend  = usb_power_off,
-};
-
-static struct resource ehci0_resources[] = {
-       [0] = {
-               .start  = 0xffe70000,
-               .end    = 0xffe70400 - 1,
-               .flags  = IORESOURCE_MEM,
-       },
-       [1] = {
-               .start  = gic_iid(0x4c),
-               .flags  = IORESOURCE_IRQ,
-       },
-};
-
-static struct platform_device ehci0_device = {
-       .name   = "ehci-platform",
-       .id     = 0,
-       .dev    = {
-               .dma_mask               = &ehci0_device.dev.coherent_dma_mask,
-               .coherent_dma_mask      = 0xffffffff,
-               .platform_data          = &ehcix_pdata,
-       },
-       .num_resources  = ARRAY_SIZE(ehci0_resources),
-       .resource       = ehci0_resources,
-};
-
-static struct resource ehci1_resources[] = {
-       [0] = {
-               .start  = 0xfff70000,
-               .end    = 0xfff70400 - 1,
-               .flags  = IORESOURCE_MEM,
-       },
-       [1] = {
-               .start  = gic_iid(0x4d),
-               .flags  = IORESOURCE_IRQ,
-       },
-};
-
-static struct platform_device ehci1_device = {
-       .name   = "ehci-platform",
-       .id     = 1,
-       .dev    = {
-               .dma_mask               = &ehci1_device.dev.coherent_dma_mask,
-               .coherent_dma_mask      = 0xffffffff,
-               .platform_data          = &ehcix_pdata,
-       },
-       .num_resources  = ARRAY_SIZE(ehci1_resources),
-       .resource       = ehci1_resources,
-};
-
-static struct usb_ohci_pdata ohcix_pdata = {
-       .power_on       = usb_power_on,
-       .power_off      = usb_power_off,
-       .power_suspend  = usb_power_off,
-};
-
-static struct resource ohci0_resources[] = {
-       [0] = {
-               .start  = 0xffe70400,
-               .end    = 0xffe70800 - 1,
-               .flags  = IORESOURCE_MEM,
-       },
-       [1] = {
-               .start  = gic_iid(0x4c),
-               .flags  = IORESOURCE_IRQ,
-       },
-};
-
-static struct platform_device ohci0_device = {
-       .name   = "ohci-platform",
-       .id     = 0,
-       .dev    = {
-               .dma_mask               = &ohci0_device.dev.coherent_dma_mask,
-               .coherent_dma_mask      = 0xffffffff,
-               .platform_data          = &ohcix_pdata,
-       },
-       .num_resources  = ARRAY_SIZE(ohci0_resources),
-       .resource       = ohci0_resources,
-};
-
-static struct resource ohci1_resources[] = {
-       [0] = {
-               .start  = 0xfff70400,
-               .end    = 0xfff70800 - 1,
-               .flags  = IORESOURCE_MEM,
-       },
-       [1] = {
-               .start  = gic_iid(0x4d),
-               .flags  = IORESOURCE_IRQ,
-       },
-};
-
-static struct platform_device ohci1_device = {
-       .name   = "ohci-platform",
-       .id     = 1,
-       .dev    = {
-               .dma_mask               = &ohci1_device.dev.coherent_dma_mask,
-               .coherent_dma_mask      = 0xffffffff,
-               .platform_data          = &ohcix_pdata,
-       },
-       .num_resources  = ARRAY_SIZE(ohci1_resources),
-       .resource       = ohci1_resources,
-};
-
-static struct platform_device *marzen_late_devices[] __initdata = {
-       &ehci0_device,
-       &ehci1_device,
-       &ohci0_device,
-       &ohci1_device,
-};
-
-void __init marzen_init_late(void)
-{
-       /* get usb phy */
-       phy = usb_get_phy(USB_PHY_TYPE_USB2);
-
-       shmobile_init_late();
-       platform_add_devices(marzen_late_devices,
-                            ARRAY_SIZE(marzen_late_devices));
-}
-
 static const struct pinctrl_map marzen_pinctrl_map[] = {
        /* HSPI0 */
        PIN_MAP_MUX_GROUP_DEFAULT("sh-hspi.0", "pfc-r8a7779",
@@ -406,6 +233,7 @@ static void __init marzen_init(void)
        r8a7779_pinmux_init();
 
        r8a7779_add_standard_devices();
+       r8a7779_add_usb_phy_device(&usb_phy_platform_data);
        platform_add_devices(marzen_devices, ARRAY_SIZE(marzen_devices));
 }
 
@@ -416,6 +244,6 @@ MACHINE_START(MARZEN, "marzen")
        .nr_irqs        = NR_IRQS_LEGACY,
        .init_irq       = r8a7779_init_irq,
        .init_machine   = marzen_init,
-       .init_late      = marzen_init_late,
+       .init_late      = r8a7779_init_late,
        .init_time      = r8a7779_earlytimer_init,
 MACHINE_END
index e710c00c3822168035a9a9182522392165f83f65..5f7fe628b8a1fbbc4cee40d633353177ad29e310 100644 (file)
 #include <linux/kernel.h>
 #include <linux/sh_clk.h>
 #include <linux/clkdev.h>
+#include <mach/clock.h>
 #include <mach/common.h>
 
 #define CPG_BASE 0xe6150000
 #define CPG_LEN 0x270
 
-#define MPCKCR 0xe6150080
 #define SMSTPCR2 0xe6150138
+#define SMSTPCR3 0xe615013c
 #define SMSTPCR5 0xe6150144
 
+#define FRQCRA         0xE6150000
+#define FRQCRB         0xE6150004
+#define VCLKCR1                0xE6150008
+#define VCLKCR2                0xE615000C
+#define VCLKCR3                0xE615001C
+#define VCLKCR4                0xE6150014
+#define VCLKCR5                0xE6150034
+#define ZBCKCR         0xE6150010
+#define SD0CKCR                0xE6150074
+#define SD1CKCR                0xE6150078
+#define SD2CKCR                0xE615007C
+#define MMC0CKCR       0xE6150240
+#define MMC1CKCR       0xE6150244
+#define FSIACKCR       0xE6150018
+#define FSIBCKCR       0xE6150090
+#define MPCKCR         0xe6150080
+#define SPUVCKCR       0xE6150094
+#define HSICKCR                0xE615026C
+#define M4CKCR         0xE6150098
+#define PLLECR         0xE61500D0
+#define PLL1CR         0xE6150028
+#define PLL2CR         0xE615002C
+#define PLL2SCR                0xE61501F4
+#define PLL2HCR                0xE61501E4
+#define CKSCR          0xE61500C0
+
+#define CPG_MAP(o) ((o - CPG_BASE) + cpg_mapping.base)
+
 static struct clk_mapping cpg_mapping = {
        .phys   = CPG_BASE,
        .len    = CPG_LEN,
@@ -51,29 +80,327 @@ static struct clk extal2_clk = {
        .mapping        = &cpg_mapping,
 };
 
+static struct sh_clk_ops followparent_clk_ops = {
+       .recalc = followparent_recalc,
+};
+
+static struct clk main_clk = {
+       /* .parent will be set r8a73a4_clock_init */
+       .ops    = &followparent_clk_ops,
+};
+
+SH_CLK_RATIO(div2,     1, 2);
+SH_CLK_RATIO(div4,     1, 4);
+
+SH_FIXED_RATIO_CLK(main_div2_clk,      main_clk,               div2);
+SH_FIXED_RATIO_CLK(extal1_div2_clk,    extal1_clk,             div2);
+SH_FIXED_RATIO_CLK(extal2_div2_clk,    extal2_clk,             div2);
+SH_FIXED_RATIO_CLK(extal2_div4_clk,    extal2_clk,             div4);
+
+/* External FSIACK/FSIBCK clock */
+static struct clk fsiack_clk = {
+};
+
+static struct clk fsibck_clk = {
+};
+
+/*
+ *             PLL clocks
+ */
+static struct clk *pll_parent_main[] = {
+       [0] = &main_clk,
+       [1] = &main_div2_clk
+};
+
+static struct clk *pll_parent_main_extal[8] = {
+       [0] = &main_div2_clk,
+       [1] = &extal2_div2_clk,
+       [3] = &extal2_div4_clk,
+       [4] = &main_clk,
+       [5] = &extal2_clk,
+};
+
+static unsigned long pll_recalc(struct clk *clk)
+{
+       unsigned long mult = 1;
+
+       if (ioread32(CPG_MAP(PLLECR)) & (1 << clk->enable_bit))
+               mult = (((ioread32(clk->mapped_reg) >> 24) & 0x7f) + 1);
+
+       return clk->parent->rate * mult;
+}
+
+static int pll_set_parent(struct clk *clk, struct clk *parent)
+{
+       u32 val;
+       int i, ret;
+
+       if (!clk->parent_table || !clk->parent_num)
+               return -EINVAL;
+
+       /* Search the parent */
+       for (i = 0; i < clk->parent_num; i++)
+               if (clk->parent_table[i] == parent)
+                       break;
+
+       if (i == clk->parent_num)
+               return -ENODEV;
+
+       ret = clk_reparent(clk, parent);
+       if (ret < 0)
+               return ret;
+
+       val = ioread32(clk->mapped_reg) &
+               ~(((1 << clk->src_width) - 1) << clk->src_shift);
+
+       iowrite32(val | i << clk->src_shift, clk->mapped_reg);
+
+       return 0;
+}
+
+static struct sh_clk_ops pll_clk_ops = {
+       .recalc         = pll_recalc,
+       .set_parent     = pll_set_parent,
+};
+
+#define PLL_CLOCK(name, p, pt, w, s, reg, e)           \
+       static struct clk name = {                      \
+               .ops            = &pll_clk_ops,         \
+               .flags          = CLK_ENABLE_ON_INIT,   \
+               .parent         = p,                    \
+               .parent_table   = pt,                   \
+               .parent_num     = ARRAY_SIZE(pt),       \
+               .src_width      = w,                    \
+               .src_shift      = s,                    \
+               .enable_reg     = (void __iomem *)reg,  \
+               .enable_bit     = e,                    \
+               .mapping        = &cpg_mapping,         \
+       }
+
+PLL_CLOCK(pll1_clk,  &main_clk,      pll_parent_main,       1, 7, PLL1CR,  1);
+PLL_CLOCK(pll2_clk,  &main_div2_clk, pll_parent_main_extal, 3, 5, PLL2CR,  2);
+PLL_CLOCK(pll2s_clk, &main_div2_clk, pll_parent_main_extal, 3, 5, PLL2SCR, 4);
+PLL_CLOCK(pll2h_clk, &main_div2_clk, pll_parent_main_extal, 3, 5, PLL2HCR, 5);
+
+SH_FIXED_RATIO_CLK(pll1_div2_clk,      pll1_clk,       div2);
+
 static struct clk *main_clks[] = {
        &extalr_clk,
        &extal1_clk,
+       &extal1_div2_clk,
        &extal2_clk,
+       &extal2_div2_clk,
+       &extal2_div4_clk,
+       &main_clk,
+       &main_div2_clk,
+       &fsiack_clk,
+       &fsibck_clk,
+       &pll1_clk,
+       &pll1_div2_clk,
+       &pll2_clk,
+       &pll2s_clk,
+       &pll2h_clk,
+};
+
+/* DIV4 */
+static void div4_kick(struct clk *clk)
+{
+       unsigned long value;
+
+       /* set KICK bit in FRQCRB to update hardware setting */
+       value = ioread32(CPG_MAP(FRQCRB));
+       value |= (1 << 31);
+       iowrite32(value, CPG_MAP(FRQCRB));
+}
+
+static int divisors[] = { 2, 3, 4, 6, 8, 12, 16, 18, 24, 0, 36, 48, 10};
+
+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,
+       .kick           = div4_kick,
+};
+
+enum {
+       DIV4_I, DIV4_M3, DIV4_B, DIV4_M1, DIV4_M2,
+       DIV4_ZX, DIV4_ZS, DIV4_HP,
+       DIV4_NR };
+
+static struct clk div4_clks[DIV4_NR] = {
+       [DIV4_I]        = SH_CLK_DIV4(&pll1_clk, FRQCRA, 20, 0x0dff, CLK_ENABLE_ON_INIT),
+       [DIV4_M3]       = SH_CLK_DIV4(&pll1_clk, FRQCRA, 12, 0x1dff, CLK_ENABLE_ON_INIT),
+       [DIV4_B]        = SH_CLK_DIV4(&pll1_clk, FRQCRA,  8, 0x0dff, CLK_ENABLE_ON_INIT),
+       [DIV4_M1]       = SH_CLK_DIV4(&pll1_clk, FRQCRA,  4, 0x1dff, 0),
+       [DIV4_M2]       = SH_CLK_DIV4(&pll1_clk, FRQCRA,  0, 0x1dff, 0),
+       [DIV4_ZX]       = SH_CLK_DIV4(&pll1_clk, FRQCRB, 12, 0x0dff, 0),
+       [DIV4_ZS]       = SH_CLK_DIV4(&pll1_clk, FRQCRB,  8, 0x0dff, 0),
+       [DIV4_HP]       = SH_CLK_DIV4(&pll1_clk, FRQCRB,  4, 0x0dff, 0),
 };
 
+enum {
+       DIV6_ZB,
+       DIV6_SDHI0, DIV6_SDHI1, DIV6_SDHI2,
+       DIV6_MMC0, DIV6_MMC1,
+       DIV6_VCK1, DIV6_VCK2, DIV6_VCK3, DIV6_VCK4, DIV6_VCK5,
+       DIV6_FSIA, DIV6_FSIB,
+       DIV6_MP, DIV6_M4, DIV6_HSI, DIV6_SPUV,
+       DIV6_NR };
+
+static struct clk *div6_parents[8] = {
+       [0] = &pll1_div2_clk,
+       [1] = &pll2s_clk,
+       [3] = &extal2_clk,
+       [4] = &main_div2_clk,
+       [6] = &extalr_clk,
+};
+
+static struct clk *fsia_parents[4] = {
+       [0] = &pll1_div2_clk,
+       [1] = &pll2s_clk,
+       [2] = &fsiack_clk,
+};
+
+static struct clk *fsib_parents[4] = {
+       [0] = &pll1_div2_clk,
+       [1] = &pll2s_clk,
+       [2] = &fsibck_clk,
+};
+
+static struct clk *mp_parents[4] = {
+       [0] = &pll1_div2_clk,
+       [1] = &pll2s_clk,
+       [2] = &extal2_clk,
+       [3] = &extal2_clk,
+};
+
+static struct clk *m4_parents[2] = {
+       [0] = &pll2s_clk,
+};
+
+static struct clk *hsi_parents[4] = {
+       [0] = &pll2h_clk,
+       [1] = &pll1_div2_clk,
+       [3] = &pll2s_clk,
+};
+
+/*** FIXME ***
+ * SH_CLK_DIV6_EXT() macro doesn't care .mapping
+ * but, it is necessary on R-Car (= ioremap() base CPG)
+ * The difference between
+ * SH_CLK_DIV6_EXT() <--> SH_CLK_MAP_DIV6_EXT()
+ * is only .mapping
+ */
+#define SH_CLK_MAP_DIV6_EXT(_reg, _flags, _parents,                    \
+                           _num_parents, _src_shift, _src_width)       \
+{                                                                      \
+       .enable_reg     = (void __iomem *)_reg,                         \
+       .enable_bit     = 0, /* unused */                               \
+       .flags          = _flags | CLK_MASK_DIV_ON_DISABLE,             \
+       .div_mask       = SH_CLK_DIV6_MSK,                              \
+       .parent_table   = _parents,                                     \
+       .parent_num     = _num_parents,                                 \
+       .src_shift      = _src_shift,                                   \
+       .src_width      = _src_width,                                   \
+       .mapping        = &cpg_mapping,                                 \
+}
+
+static struct clk div6_clks[DIV6_NR] = {
+       [DIV6_ZB] = SH_CLK_MAP_DIV6_EXT(ZBCKCR, CLK_ENABLE_ON_INIT,
+                               div6_parents, 2, 7, 1),
+       [DIV6_SDHI0] = SH_CLK_MAP_DIV6_EXT(SD0CKCR, 0,
+                               div6_parents, 2, 6, 2),
+       [DIV6_SDHI1] = SH_CLK_MAP_DIV6_EXT(SD1CKCR, 0,
+                               div6_parents, 2, 6, 2),
+       [DIV6_SDHI2] = SH_CLK_MAP_DIV6_EXT(SD2CKCR, 0,
+                               div6_parents, 2, 6, 2),
+       [DIV6_MMC0] = SH_CLK_MAP_DIV6_EXT(MMC0CKCR, 0,
+                               div6_parents, 2, 6, 2),
+       [DIV6_MMC1] = SH_CLK_MAP_DIV6_EXT(MMC1CKCR, 0,
+                               div6_parents, 2, 6, 2),
+       [DIV6_VCK1] = SH_CLK_MAP_DIV6_EXT(VCLKCR1, 0, /* didn't care bit[6-7] */
+                               div6_parents, ARRAY_SIZE(div6_parents), 12, 3),
+       [DIV6_VCK2] = SH_CLK_MAP_DIV6_EXT(VCLKCR2, 0, /* didn't care bit[6-7] */
+                               div6_parents, ARRAY_SIZE(div6_parents), 12, 3),
+       [DIV6_VCK3] = SH_CLK_MAP_DIV6_EXT(VCLKCR3, 0, /* didn't care bit[6-7] */
+                               div6_parents, ARRAY_SIZE(div6_parents), 12, 3),
+       [DIV6_VCK4] = SH_CLK_MAP_DIV6_EXT(VCLKCR4, 0, /* didn't care bit[6-7] */
+                               div6_parents, ARRAY_SIZE(div6_parents), 12, 3),
+       [DIV6_VCK5] = SH_CLK_MAP_DIV6_EXT(VCLKCR5, 0, /* didn't care bit[6-7] */
+                               div6_parents, ARRAY_SIZE(div6_parents), 12, 3),
+       [DIV6_FSIA] = SH_CLK_MAP_DIV6_EXT(FSIACKCR, 0,
+                               fsia_parents, ARRAY_SIZE(fsia_parents), 6, 2),
+       [DIV6_FSIB] = SH_CLK_MAP_DIV6_EXT(FSIBCKCR, 0,
+                               fsib_parents, ARRAY_SIZE(fsib_parents), 6, 2),
+       [DIV6_MP] = SH_CLK_MAP_DIV6_EXT(MPCKCR, 0, /* it needs bit[9-11] control */
+                               mp_parents, ARRAY_SIZE(mp_parents), 6, 2),
+       /* pll2s will be selected always for M4 */
+       [DIV6_M4] = SH_CLK_MAP_DIV6_EXT(M4CKCR, 0, /* it needs bit[9] control */
+                               m4_parents, ARRAY_SIZE(m4_parents), 6, 1),
+       [DIV6_HSI] = SH_CLK_MAP_DIV6_EXT(HSICKCR, 0, /* it needs bit[9] control */
+                               hsi_parents, ARRAY_SIZE(hsi_parents), 6, 2),
+       [DIV6_SPUV] = SH_CLK_MAP_DIV6_EXT(SPUVCKCR, 0,
+                               mp_parents, ARRAY_SIZE(mp_parents), 6, 2),
+};
+
+/* MSTP */
 enum {
        MSTP217, MSTP216, MSTP207, MSTP206, MSTP204, MSTP203,
+       MSTP315, MSTP314, MSTP313, MSTP312, MSTP305,
        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 */
+       [MSTP204] = SH_CLK_MSTP32(&div6_clks[DIV6_MP],  SMSTPCR2, 4, 0), /* SCIFA0 */
+       [MSTP203] = SH_CLK_MSTP32(&div6_clks[DIV6_MP],  SMSTPCR2, 3, 0), /* SCIFA1 */
+       [MSTP206] = SH_CLK_MSTP32(&div6_clks[DIV6_MP],  SMSTPCR2, 6, 0), /* SCIFB0 */
+       [MSTP207] = SH_CLK_MSTP32(&div6_clks[DIV6_MP],  SMSTPCR2, 7, 0), /* SCIFB1 */
+       [MSTP216] = SH_CLK_MSTP32(&div6_clks[DIV6_MP],  SMSTPCR2, 16, 0), /* SCIFB2 */
+       [MSTP217] = SH_CLK_MSTP32(&div6_clks[DIV6_MP],  SMSTPCR2, 17, 0), /* SCIFB3 */
+       [MSTP305] = SH_CLK_MSTP32(&div6_clks[DIV6_MMC1],SMSTPCR3, 5, 0), /* MMCIF1 */
+       [MSTP312] = SH_CLK_MSTP32(&div6_clks[DIV6_SDHI2],SMSTPCR3, 12, 0), /* SDHI2 */
+       [MSTP313] = SH_CLK_MSTP32(&div6_clks[DIV6_SDHI1],SMSTPCR3, 13, 0), /* SDHI1 */
+       [MSTP314] = SH_CLK_MSTP32(&div6_clks[DIV6_SDHI0],SMSTPCR3, 14, 0), /* SDHI0 */
+       [MSTP315] = SH_CLK_MSTP32(&div6_clks[DIV6_MMC0],SMSTPCR3, 15, 0), /* MMCIF0 */
        [MSTP522] = SH_CLK_MSTP32(&extal2_clk, SMSTPCR5, 22, 0), /* Thermal */
 };
 
 static struct clk_lookup lookups[] = {
+       /* main clock */
+       CLKDEV_CON_ID("extal1",                 &extal1_clk),
+       CLKDEV_CON_ID("extal1_div2",            &extal1_div2_clk),
+       CLKDEV_CON_ID("extal2",                 &extal2_clk),
+       CLKDEV_CON_ID("extal2_div2",            &extal2_div2_clk),
+       CLKDEV_CON_ID("extal2_div4",            &extal2_div4_clk),
+       CLKDEV_CON_ID("fsiack",                 &fsiack_clk),
+       CLKDEV_CON_ID("fsibck",                 &fsibck_clk),
+
+       /* pll clock */
+       CLKDEV_CON_ID("pll1",                   &pll1_clk),
+       CLKDEV_CON_ID("pll1_div2",              &pll1_div2_clk),
+       CLKDEV_CON_ID("pll2",                   &pll2_clk),
+       CLKDEV_CON_ID("pll2s",                  &pll2s_clk),
+       CLKDEV_CON_ID("pll2h",                  &pll2h_clk),
+
+       /* DIV6 */
+       CLKDEV_CON_ID("zb",                     &div6_clks[DIV6_ZB]),
+       CLKDEV_CON_ID("vck1",                   &div6_clks[DIV6_VCK1]),
+       CLKDEV_CON_ID("vck2",                   &div6_clks[DIV6_VCK2]),
+       CLKDEV_CON_ID("vck3",                   &div6_clks[DIV6_VCK3]),
+       CLKDEV_CON_ID("vck4",                   &div6_clks[DIV6_VCK4]),
+       CLKDEV_CON_ID("vck5",                   &div6_clks[DIV6_VCK5]),
+       CLKDEV_CON_ID("fsia",                   &div6_clks[DIV6_FSIA]),
+       CLKDEV_CON_ID("fsib",                   &div6_clks[DIV6_FSIB]),
+       CLKDEV_CON_ID("mp",                     &div6_clks[DIV6_MP]),
+       CLKDEV_CON_ID("m4",                     &div6_clks[DIV6_M4]),
+       CLKDEV_CON_ID("hsi",                    &div6_clks[DIV6_HSI]),
+       CLKDEV_CON_ID("spuv",                   &div6_clks[DIV6_SPUV]),
+
+       /* MSTP */
        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]),
@@ -81,6 +408,16 @@ static struct clk_lookup lookups[] = {
        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]),
+       CLKDEV_DEV_ID("sh_mmcif.1", &mstp_clks[MSTP305]),
+       CLKDEV_DEV_ID("ee220000.mmcif", &mstp_clks[MSTP305]),
+       CLKDEV_DEV_ID("sh_mobile_sdhi.2", &mstp_clks[MSTP312]),
+       CLKDEV_DEV_ID("ee140000.sdhi", &mstp_clks[MSTP312]),
+       CLKDEV_DEV_ID("sh_mobile_sdhi.1", &mstp_clks[MSTP313]),
+       CLKDEV_DEV_ID("ee120000.sdhi", &mstp_clks[MSTP313]),
+       CLKDEV_DEV_ID("sh_mobile_sdhi.0", &mstp_clks[MSTP314]),
+       CLKDEV_DEV_ID("ee100000.sdhi", &mstp_clks[MSTP314]),
+       CLKDEV_DEV_ID("sh_mmcif.0", &mstp_clks[MSTP315]),
+       CLKDEV_DEV_ID("ee200000.mmcif", &mstp_clks[MSTP315]),
 
        /* for DT */
        CLKDEV_DEV_ID("e61f0000.thermal", &mstp_clks[MSTP522]),
@@ -88,21 +425,39 @@ static struct clk_lookup lookups[] = {
 
 void __init r8a73a4_clock_init(void)
 {
-       void __iomem *cpg_base, *reg;
+       void __iomem *reg;
        int k, ret = 0;
+       u32 ckscr;
+
+       reg = ioremap_nocache(CKSCR, PAGE_SIZE);
+       BUG_ON(!reg);
+       ckscr = ioread32(reg);
+       iounmap(reg);
 
-       /* 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);
+       switch ((ckscr >> 28) & 0x3) {
+       case 0:
+               main_clk.parent = &extal1_clk;
+               break;
+       case 1:
+               main_clk.parent = &extal1_div2_clk;
+               break;
+       case 2:
+               main_clk.parent = &extal2_clk;
+               break;
+       case 3:
+               main_clk.parent = &extal2_div2_clk;
+               break;
+       }
 
        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_div6_reparent_register(div6_clks, DIV6_NR);
+
        if (!ret)
                ret = sh_clk_mstp_register(mstp_clks, MSTP_NR);
 
index c0d39aa6de5092f0137c0ee187a0376b4edcb00e..7fd32d604e342b5ccb6b1e119fb1e4ae1e72a59e 100644 (file)
@@ -266,7 +266,7 @@ static struct clk fsiack_clk = {
 static struct clk fsibck_clk = {
 };
 
-struct clk *main_clks[] = {
+static struct clk *main_clks[] = {
        &extalr_clk,
        &extal1_clk,
        &extal2_clk,
@@ -317,7 +317,7 @@ enum {
        DIV4_NR
 };
 
-struct clk div4_clks[DIV4_NR] = {
+static 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),
@@ -461,7 +461,7 @@ enum {
 
        MSTP329, MSTP328, MSTP323, MSTP320,
        MSTP314, MSTP313, MSTP312,
-       MSTP309,
+       MSTP309, MSTP304,
 
        MSTP416, MSTP415, MSTP407, MSTP406,
 
@@ -499,6 +499,7 @@ static struct clk mstp_clks[MSTP_NR] = {
        [MSTP313] = SH_CLK_MSTP32(&div4_clks[DIV4_HP],  SMSTPCR3, 13, 0), /* SDHI1 */
        [MSTP312] = SH_CLK_MSTP32(&div4_clks[DIV4_HP],  SMSTPCR3, 12, 0), /* MMC */
        [MSTP309] = SH_CLK_MSTP32(&div4_clks[DIV4_HP],  SMSTPCR3,  9, 0), /* GEther */
+       [MSTP304] = SH_CLK_MSTP32(&div4_clks[DIV4_CP],  SMSTPCR3,  4, 0), /* TPU0 */
 
        [MSTP416] = SH_CLK_MSTP32(&div4_clks[DIV4_HP],  SMSTPCR4, 16, 0), /* USBHOST */
        [MSTP415] = SH_CLK_MSTP32(&div4_clks[DIV4_HP],  SMSTPCR4, 15, 0), /* SDHI2 */
@@ -551,6 +552,7 @@ static struct clk_lookup lookups[] = {
        CLKDEV_DEV_ID("sh_tmu.4",               &mstp_clks[MSTP111]),
        CLKDEV_DEV_ID("sh_tmu.5",               &mstp_clks[MSTP111]),
        CLKDEV_DEV_ID("i2c-sh_mobile.0",        &mstp_clks[MSTP116]),
+       CLKDEV_DEV_ID("fff20000.i2c",           &mstp_clks[MSTP116]),
        CLKDEV_DEV_ID("sh_mobile_lcdc_fb.1",    &mstp_clks[MSTP117]),
        CLKDEV_DEV_ID("sh_tmu.0",               &mstp_clks[MSTP125]),
        CLKDEV_DEV_ID("sh_tmu.1",               &mstp_clks[MSTP125]),
@@ -584,6 +586,7 @@ static struct clk_lookup lookups[] = {
        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("e6c20000.i2c",           &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]),
@@ -592,6 +595,8 @@ static struct clk_lookup lookups[] = {
        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("e9a00000.sh-eth",        &mstp_clks[MSTP309]),
+       CLKDEV_DEV_ID("renesas_tpu_pwm",        &mstp_clks[MSTP304]),
 
        CLKDEV_DEV_ID("sh_mobile_sdhi.2",       &mstp_clks[MSTP415]),
        CLKDEV_DEV_ID("e6870000.sdhi",          &mstp_clks[MSTP415]),
index cd6855290b1fe27f56ba44dfa11923903b7c17bb..53798e5037d7a98b24f9a375db35a653d0c5291a 100644 (file)
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
 
+/*
+ *     MD      MD      MD      MD       PLLA   PLLB    EXTAL   clki    clkz
+ *     19      18      12      11                      (HMz)   (MHz)   (MHz)
+ *----------------------------------------------------------------------------
+ *     1       0       0       0       x21     x21     38.00   800     800
+ *     1       0       0       1       x24     x24     33.33   800     800
+ *     1       0       1       0       x28     x28     28.50   800     800
+ *     1       0       1       1       x32     x32     25.00   800     800
+ *     1       1       0       1       x24     x21     33.33   800     700
+ *     1       1       1       0       x28     x21     28.50   800     600
+ *     1       1       1       1       x32     x24     25.00   800     600
+ */
+
 #include <linux/io.h>
 #include <linux/sh_clk.h>
 #include <linux/clkdev.h>
+#include <mach/clock.h>
 #include <mach/common.h>
 
 #define MSTPCR0                IOMEM(0xffc80030)
@@ -37,6 +51,9 @@
 #define MSTPCR4                IOMEM(0xffc80050)
 #define MSTPCR5                IOMEM(0xffc80054)
 #define MSTPCR6                IOMEM(0xffc80058)
+#define MODEMR         0xFFCC0020
+
+#define MD(nr) BIT(nr)
 
 /* ioremap() through clock mapping mandatory to avoid
  * collision with ARM coherent DMA virtual memory range.
@@ -47,37 +64,94 @@ static struct clk_mapping cpg_mapping = {
        .len    = 0x80,
 };
 
-static struct clk clkp = {
-       .rate   = 62500000, /* FIXME: shortcut */
-       .flags  = CLK_ENABLE_ON_INIT,
+static struct clk extal_clk = {
+       /* .rate will be updated on r8a7778_clock_init() */
        .mapping = &cpg_mapping,
 };
 
+/*
+ * clock ratio of these clock will be updated
+ * on r8a7778_clock_init()
+ */
+SH_FIXED_RATIO_CLK_SET(plla_clk,       extal_clk, 1, 1);
+SH_FIXED_RATIO_CLK_SET(pllb_clk,       extal_clk, 1, 1);
+SH_FIXED_RATIO_CLK_SET(i_clk,          plla_clk,  1, 1);
+SH_FIXED_RATIO_CLK_SET(s_clk,          plla_clk,  1, 1);
+SH_FIXED_RATIO_CLK_SET(s1_clk,         plla_clk,  1, 1);
+SH_FIXED_RATIO_CLK_SET(s3_clk,         plla_clk,  1, 1);
+SH_FIXED_RATIO_CLK_SET(s4_clk,         plla_clk,  1, 1);
+SH_FIXED_RATIO_CLK_SET(b_clk,          plla_clk,  1, 1);
+SH_FIXED_RATIO_CLK_SET(out_clk,                plla_clk,  1, 1);
+SH_FIXED_RATIO_CLK_SET(p_clk,          plla_clk,  1, 1);
+SH_FIXED_RATIO_CLK_SET(g_clk,          plla_clk,  1, 1);
+SH_FIXED_RATIO_CLK_SET(z_clk,          pllb_clk,  1, 1);
+
 static struct clk *main_clks[] = {
-       &clkp,
+       &extal_clk,
+       &plla_clk,
+       &pllb_clk,
+       &i_clk,
+       &s_clk,
+       &s1_clk,
+       &s3_clk,
+       &s4_clk,
+       &b_clk,
+       &out_clk,
+       &p_clk,
+       &g_clk,
+       &z_clk,
 };
 
 enum {
+       MSTP331,
+       MSTP323, MSTP322, MSTP321,
        MSTP114,
-       MSTP026, MSTP025, MSTP024, MSTP023, MSTP022, MSTP021,
+       MSTP100,
+       MSTP030,
+       MSTP029, MSTP028, MSTP027, MSTP026, MSTP025, MSTP024, MSTP023, MSTP022, MSTP021,
        MSTP016, MSTP015,
+       MSTP007,
        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 */
+       [MSTP331] = SH_CLK_MSTP32(&s4_clk, MSTPCR3, 31, 0), /* MMC */
+       [MSTP323] = SH_CLK_MSTP32(&p_clk, MSTPCR3, 23, 0), /* SDHI0 */
+       [MSTP322] = SH_CLK_MSTP32(&p_clk, MSTPCR3, 22, 0), /* SDHI1 */
+       [MSTP321] = SH_CLK_MSTP32(&p_clk, MSTPCR3, 21, 0), /* SDHI2 */
+       [MSTP114] = SH_CLK_MSTP32(&p_clk, MSTPCR1, 14, 0), /* Ether */
+       [MSTP100] = SH_CLK_MSTP32(&p_clk, MSTPCR1,  0, 0), /* USB0/1 */
+       [MSTP030] = SH_CLK_MSTP32(&p_clk, MSTPCR0, 30, 0), /* I2C0 */
+       [MSTP029] = SH_CLK_MSTP32(&p_clk, MSTPCR0, 29, 0), /* I2C1 */
+       [MSTP028] = SH_CLK_MSTP32(&p_clk, MSTPCR0, 28, 0), /* I2C2 */
+       [MSTP027] = SH_CLK_MSTP32(&p_clk, MSTPCR0, 27, 0), /* I2C3 */
+       [MSTP026] = SH_CLK_MSTP32(&p_clk, MSTPCR0, 26, 0), /* SCIF0 */
+       [MSTP025] = SH_CLK_MSTP32(&p_clk, MSTPCR0, 25, 0), /* SCIF1 */
+       [MSTP024] = SH_CLK_MSTP32(&p_clk, MSTPCR0, 24, 0), /* SCIF2 */
+       [MSTP023] = SH_CLK_MSTP32(&p_clk, MSTPCR0, 23, 0), /* SCIF3 */
+       [MSTP022] = SH_CLK_MSTP32(&p_clk, MSTPCR0, 22, 0), /* SCIF4 */
+       [MSTP021] = SH_CLK_MSTP32(&p_clk, MSTPCR0, 21, 0), /* SCIF5 */
+       [MSTP016] = SH_CLK_MSTP32(&p_clk, MSTPCR0, 16, 0), /* TMU0 */
+       [MSTP015] = SH_CLK_MSTP32(&p_clk, MSTPCR0, 15, 0), /* TMU1 */
+       [MSTP007] = SH_CLK_MSTP32(&p_clk, MSTPCR0,  7, 0), /* HSPI */
 };
 
 static struct clk_lookup lookups[] = {
+       /* main */
+       CLKDEV_CON_ID("shyway_clk",     &s_clk),
+       CLKDEV_CON_ID("peripheral_clk", &p_clk),
+
        /* MSTP32 clocks */
+       CLKDEV_DEV_ID("sh_mmcif", &mstp_clks[MSTP331]), /* MMC */
+       CLKDEV_DEV_ID("sh_mobile_sdhi.0", &mstp_clks[MSTP323]), /* SDHI0 */
+       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-eth", &mstp_clks[MSTP114]), /* Ether */
+       CLKDEV_DEV_ID("ehci-platform", &mstp_clks[MSTP100]), /* USB EHCI port0/1 */
+       CLKDEV_DEV_ID("ohci-platform", &mstp_clks[MSTP100]), /* USB OHCI port0/1 */
+       CLKDEV_DEV_ID("i2c-rcar.0", &mstp_clks[MSTP030]), /* I2C0 */
+       CLKDEV_DEV_ID("i2c-rcar.1", &mstp_clks[MSTP029]), /* I2C1 */
+       CLKDEV_DEV_ID("i2c-rcar.2", &mstp_clks[MSTP028]), /* I2C2 */
+       CLKDEV_DEV_ID("i2c-rcar.3", &mstp_clks[MSTP027]), /* I2C3 */
        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 */
@@ -86,12 +160,93 @@ static struct clk_lookup lookups[] = {
        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 */
+       CLKDEV_DEV_ID("sh-hspi.0", &mstp_clks[MSTP007]), /* HSPI0 */
+       CLKDEV_DEV_ID("sh-hspi.1", &mstp_clks[MSTP007]), /* HSPI1 */
+       CLKDEV_DEV_ID("sh-hspi.2", &mstp_clks[MSTP007]), /* HSPI2 */
 };
 
 void __init r8a7778_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);
+
+       switch (mode & (MD(19) | MD(18) | MD(12) | MD(11))) {
+       case MD(19):
+               extal_clk.rate = 38000000;
+               SH_CLK_SET_RATIO(&plla_clk_ratio,       21, 1);
+               SH_CLK_SET_RATIO(&pllb_clk_ratio,       21, 1);
+               break;
+       case MD(19) | MD(11):
+               extal_clk.rate = 33333333;
+               SH_CLK_SET_RATIO(&plla_clk_ratio,       24, 1);
+               SH_CLK_SET_RATIO(&pllb_clk_ratio,       24, 1);
+               break;
+       case MD(19) | MD(12):
+               extal_clk.rate = 28500000;
+               SH_CLK_SET_RATIO(&plla_clk_ratio,       28, 1);
+               SH_CLK_SET_RATIO(&pllb_clk_ratio,       28, 1);
+               break;
+       case MD(19) | MD(12) | MD(11):
+               extal_clk.rate = 25000000;
+               SH_CLK_SET_RATIO(&plla_clk_ratio,       32, 1);
+               SH_CLK_SET_RATIO(&pllb_clk_ratio,       32, 1);
+               break;
+       case MD(19) | MD(18) | MD(11):
+               extal_clk.rate = 33333333;
+               SH_CLK_SET_RATIO(&plla_clk_ratio,       24, 1);
+               SH_CLK_SET_RATIO(&pllb_clk_ratio,       21, 1);
+               break;
+       case MD(19) | MD(18) | MD(12):
+               extal_clk.rate = 28500000;
+               SH_CLK_SET_RATIO(&plla_clk_ratio,       28, 1);
+               SH_CLK_SET_RATIO(&pllb_clk_ratio,       21, 1);
+               break;
+       case MD(19) | MD(18) | MD(12) | MD(11):
+               extal_clk.rate = 25000000;
+               SH_CLK_SET_RATIO(&plla_clk_ratio,       32, 1);
+               SH_CLK_SET_RATIO(&pllb_clk_ratio,       24, 1);
+               break;
+       default:
+               BUG();
+       }
+
+       if (mode & MD(1)) {
+               SH_CLK_SET_RATIO(&i_clk_ratio,  1, 1);
+               SH_CLK_SET_RATIO(&s_clk_ratio,  1, 3);
+               SH_CLK_SET_RATIO(&s1_clk_ratio, 1, 6);
+               SH_CLK_SET_RATIO(&s3_clk_ratio, 1, 4);
+               SH_CLK_SET_RATIO(&s4_clk_ratio, 1, 8);
+               SH_CLK_SET_RATIO(&p_clk_ratio,  1, 12);
+               SH_CLK_SET_RATIO(&g_clk_ratio,  1, 12);
+               if (mode & MD(2)) {
+                       SH_CLK_SET_RATIO(&b_clk_ratio,          1, 18);
+                       SH_CLK_SET_RATIO(&out_clk_ratio,        1, 18);
+               } else {
+                       SH_CLK_SET_RATIO(&b_clk_ratio,          1, 12);
+                       SH_CLK_SET_RATIO(&out_clk_ratio,        1, 12);
+               }
+       } else {
+               SH_CLK_SET_RATIO(&i_clk_ratio,  1, 1);
+               SH_CLK_SET_RATIO(&s_clk_ratio,  1, 4);
+               SH_CLK_SET_RATIO(&s1_clk_ratio, 1, 8);
+               SH_CLK_SET_RATIO(&s3_clk_ratio, 1, 4);
+               SH_CLK_SET_RATIO(&s4_clk_ratio, 1, 8);
+               SH_CLK_SET_RATIO(&p_clk_ratio,  1, 16);
+               SH_CLK_SET_RATIO(&g_clk_ratio,  1, 12);
+               if (mode & MD(2)) {
+                       SH_CLK_SET_RATIO(&b_clk_ratio,          1, 16);
+                       SH_CLK_SET_RATIO(&out_clk_ratio,        1, 16);
+               } else {
+                       SH_CLK_SET_RATIO(&b_clk_ratio,          1, 12);
+                       SH_CLK_SET_RATIO(&out_clk_ratio,        1, 12);
+               }
+       }
+
        for (k = 0; !ret && (k < ARRAY_SIZE(main_clks)); k++)
                ret = clk_register(main_clks[k]);
 
index 31d5cd4d97879f7d9243c9310eb0ea1dd8c7f047..9daeb8c374833b239c8d7bfc95f322c6253369aa 100644 (file)
@@ -112,7 +112,7 @@ static struct clk *main_clks[] = {
 };
 
 enum { MSTP323, MSTP322, MSTP321, MSTP320,
-       MSTP115, MSTP114,
+       MSTP116, MSTP115, MSTP114,
        MSTP103, MSTP101, MSTP100,
        MSTP030,
        MSTP029, MSTP028, MSTP027, MSTP026, MSTP025, MSTP024, MSTP023, MSTP022, MSTP021,
@@ -125,6 +125,7 @@ static struct clk mstp_clks[MSTP_NR] = {
        [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 */
+       [MSTP116] = SH_CLK_MSTP32(&clkp_clk, MSTPCR1, 16, 0), /* PCIe */
        [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 */
@@ -161,6 +162,7 @@ static struct clk_lookup lookups[] = {
        CLKDEV_CON_ID("peripheral_clk", &clkp_clk),
 
        /* MSTP32 clocks */
+       CLKDEV_DEV_ID("rcar-pcie", &mstp_clks[MSTP116]), /* PCIe */
        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 */
index bad9bf2e34d600a37037e348f8599226f8b38110..5d71313df52d92d732db8bad1c52df047d88633d 100644 (file)
 #include <linux/kernel.h>
 #include <linux/sh_clk.h>
 #include <linux/clkdev.h>
+#include <mach/clock.h>
 #include <mach/common.h>
 
+/*
+ *   MD                EXTAL           PLL0    PLL1    PLL3
+ * 14 13 19    (MHz)           *1      *1
+ *---------------------------------------------------
+ * 0  0  0     15 x 1          x172/2  x208/2  x106
+ * 0  0  1     15 x 1          x172/2  x208/2  x88
+ * 0  1  0     20 x 1          x130/2  x156/2  x80
+ * 0  1  1     20 x 1          x130/2  x156/2  x66
+ * 1  0  0     26 / 2          x200/2  x240/2  x122
+ * 1  0  1     26 / 2          x200/2  x240/2  x102
+ * 1  1  0     30 / 2          x172/2  x208/2  x106
+ * 1  1  1     30 / 2          x172/2  x208/2  x88
+ *
+ * *1 :        Table 7.6 indicates VCO ouput (PLLx = VCO/2)
+ *     see "p1 / 2" on R8A7790_CLOCK_ROOT() below
+ */
+
+#define MD(nr) (1 << nr)
+
 #define CPG_BASE 0xe6150000
 #define CPG_LEN 0x1000
 
 #define SMSTPCR2 0xe6150138
+#define SMSTPCR3 0xe615013c
 #define SMSTPCR7 0xe615014c
 
+#define MODEMR         0xE6160060
+#define SDCKCR         0xE6150074
+#define SD2CKCR                0xE6150078
+#define SD3CKCR                0xE615007C
+#define MMC0CKCR       0xE6150240
+#define MMC1CKCR       0xE6150244
+#define SSPCKCR                0xE6150248
+#define SSPRSCKCR      0xE615024C
+
 static struct clk_mapping cpg_mapping = {
        .phys   = CPG_BASE,
        .len    = CPG_LEN,
 };
 
-static struct clk p_clk = {
-       .rate   = 65000000, /* shortcut for now */
+static struct clk extal_clk = {
+       /* .rate will be updated on r8a7790_clock_init() */
        .mapping        = &cpg_mapping,
 };
 
-static struct clk mp_clk = {
-       .rate   = 52000000,  /* shortcut for now */
-       .mapping        = &cpg_mapping,
+static struct sh_clk_ops followparent_clk_ops = {
+       .recalc = followparent_recalc,
+};
+
+static struct clk main_clk = {
+       /* .parent will be set r8a73a4_clock_init */
+       .ops    = &followparent_clk_ops,
 };
 
+/*
+ * clock ratio of these clock will be updated
+ * on r8a7790_clock_init()
+ */
+SH_FIXED_RATIO_CLK_SET(pll1_clk,               main_clk,       1, 1);
+SH_FIXED_RATIO_CLK_SET(pll3_clk,               main_clk,       1, 1);
+SH_FIXED_RATIO_CLK_SET(lb_clk,                 pll1_clk,       1, 1);
+SH_FIXED_RATIO_CLK_SET(qspi_clk,               pll1_clk,       1, 1);
+
+/* fixed ratio clock */
+SH_FIXED_RATIO_CLK_SET(extal_div2_clk,         extal_clk,      1, 2);
+SH_FIXED_RATIO_CLK_SET(cp_clk,                 extal_clk,      1, 2);
+
+SH_FIXED_RATIO_CLK_SET(pll1_div2_clk,          pll1_clk,       1, 2);
+SH_FIXED_RATIO_CLK_SET(zg_clk,                 pll1_clk,       1, 3);
+SH_FIXED_RATIO_CLK_SET(zx_clk,                 pll1_clk,       1, 3);
+SH_FIXED_RATIO_CLK_SET(zs_clk,                 pll1_clk,       1, 6);
+SH_FIXED_RATIO_CLK_SET(hp_clk,                 pll1_clk,       1, 12);
+SH_FIXED_RATIO_CLK_SET(i_clk,                  pll1_clk,       1, 2);
+SH_FIXED_RATIO_CLK_SET(b_clk,                  pll1_clk,       1, 12);
+SH_FIXED_RATIO_CLK_SET(p_clk,                  pll1_clk,       1, 24);
+SH_FIXED_RATIO_CLK_SET(cl_clk,                 pll1_clk,       1, 48);
+SH_FIXED_RATIO_CLK_SET(m2_clk,                 pll1_clk,       1, 8);
+SH_FIXED_RATIO_CLK_SET(imp_clk,                        pll1_clk,       1, 4);
+SH_FIXED_RATIO_CLK_SET(rclk_clk,               pll1_clk,       1, (48 * 1024));
+SH_FIXED_RATIO_CLK_SET(oscclk_clk,             pll1_clk,       1, (12 * 1024));
+
+SH_FIXED_RATIO_CLK_SET(zb3_clk,                        pll3_clk,       1, 4);
+SH_FIXED_RATIO_CLK_SET(zb3d2_clk,              pll3_clk,       1, 8);
+SH_FIXED_RATIO_CLK_SET(ddr_clk,                        pll3_clk,       1, 8);
+SH_FIXED_RATIO_CLK_SET(mp_clk,                 pll1_div2_clk,  1, 15);
+
 static struct clk *main_clks[] = {
+       &extal_clk,
+       &extal_div2_clk,
+       &main_clk,
+       &pll1_clk,
+       &pll1_div2_clk,
+       &pll3_clk,
+       &lb_clk,
+       &qspi_clk,
+       &zg_clk,
+       &zx_clk,
+       &zs_clk,
+       &hp_clk,
+       &i_clk,
+       &b_clk,
        &p_clk,
+       &cl_clk,
+       &m2_clk,
+       &imp_clk,
+       &rclk_clk,
+       &oscclk_clk,
+       &zb3_clk,
+       &zb3d2_clk,
+       &ddr_clk,
        &mp_clk,
+       &cp_clk,
+};
+
+/* SDHI (DIV4) clock */
+static int divisors[] = { 2, 3, 4, 6, 8, 12, 16, 18, 24, 0, 36, 48, 10 };
+
+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_SDH, DIV4_SD0, DIV4_SD1, DIV4_NR
+};
+
+static struct clk div4_clks[DIV4_NR] = {
+       [DIV4_SDH] = SH_CLK_DIV4(&pll1_clk, SDCKCR, 8, 0x0dff, CLK_ENABLE_ON_INIT),
+       [DIV4_SD0] = SH_CLK_DIV4(&pll1_clk, SDCKCR, 4, 0x1de0, CLK_ENABLE_ON_INIT),
+       [DIV4_SD1] = SH_CLK_DIV4(&pll1_clk, SDCKCR, 0, 0x1de0, CLK_ENABLE_ON_INIT),
+};
+
+/* DIV6 clocks */
+enum {
+       DIV6_SD2, DIV6_SD3,
+       DIV6_MMC0, DIV6_MMC1,
+       DIV6_SSP, DIV6_SSPRS,
+       DIV6_NR
+};
+
+static struct clk div6_clks[DIV6_NR] = {
+       [DIV6_SD2]      = SH_CLK_DIV6(&pll1_div2_clk, SD2CKCR, 0),
+       [DIV6_SD3]      = SH_CLK_DIV6(&pll1_div2_clk, SD3CKCR, 0),
+       [DIV6_MMC0]     = SH_CLK_DIV6(&pll1_div2_clk, MMC0CKCR, 0),
+       [DIV6_MMC1]     = SH_CLK_DIV6(&pll1_div2_clk, MMC1CKCR, 0),
+       [DIV6_SSP]      = SH_CLK_DIV6(&pll1_div2_clk, SSPCKCR, 0),
+       [DIV6_SSPRS]    = SH_CLK_DIV6(&pll1_div2_clk, SSPRSCKCR, 0),
+};
+
+/* MSTP */
+enum {
+       MSTP721, MSTP720,
+       MSTP717, MSTP716,
+       MSTP315, MSTP314, MSTP313, MSTP312, MSTP311, MSTP305, MSTP304,
+       MSTP216, MSTP207, MSTP206, MSTP204, MSTP203, MSTP202,
+       MSTP_NR
 };
 
-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 */
+       [MSTP315] = SH_CLK_MSTP32(&div6_clks[DIV6_MMC0], SMSTPCR3, 15, 0), /* MMC0 */
+       [MSTP314] = SH_CLK_MSTP32(&div4_clks[DIV4_SD0], SMSTPCR3, 14, 0), /* SDHI0 */
+       [MSTP313] = SH_CLK_MSTP32(&div4_clks[DIV4_SD1], SMSTPCR3, 13, 0), /* SDHI1 */
+       [MSTP312] = SH_CLK_MSTP32(&div6_clks[DIV6_SD2], SMSTPCR3, 12, 0), /* SDHI2 */
+       [MSTP311] = SH_CLK_MSTP32(&div6_clks[DIV6_SD3], SMSTPCR3, 11, 0), /* SDHI3 */
+       [MSTP305] = SH_CLK_MSTP32(&div6_clks[DIV6_MMC1], SMSTPCR3, 5, 0), /* MMC1 */
+       [MSTP304] = SH_CLK_MSTP32(&cp_clk, SMSTPCR3, 4, 0), /* TPU0 */
        [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 */
+       [MSTP717] = SH_CLK_MSTP32(&zs_clk, SMSTPCR7, 17, 0), /* HSCIF0 */
+       [MSTP716] = SH_CLK_MSTP32(&zs_clk, SMSTPCR7, 16, 0), /* HSCIF1 */
 };
 
 static struct clk_lookup lookups[] = {
+
+       /* main clocks */
+       CLKDEV_CON_ID("extal",          &extal_clk),
+       CLKDEV_CON_ID("extal_div2",     &extal_div2_clk),
+       CLKDEV_CON_ID("main",           &main_clk),
+       CLKDEV_CON_ID("pll1",           &pll1_clk),
+       CLKDEV_CON_ID("pll1_div2",      &pll1_div2_clk),
+       CLKDEV_CON_ID("pll3",           &pll3_clk),
+       CLKDEV_CON_ID("zg",             &zg_clk),
+       CLKDEV_CON_ID("zx",             &zx_clk),
+       CLKDEV_CON_ID("zs",             &zs_clk),
+       CLKDEV_CON_ID("hp",             &hp_clk),
+       CLKDEV_CON_ID("i",              &i_clk),
+       CLKDEV_CON_ID("b",              &b_clk),
+       CLKDEV_CON_ID("lb",             &lb_clk),
+       CLKDEV_CON_ID("p",              &p_clk),
+       CLKDEV_CON_ID("cl",             &cl_clk),
+       CLKDEV_CON_ID("m2",             &m2_clk),
+       CLKDEV_CON_ID("imp",            &imp_clk),
+       CLKDEV_CON_ID("rclk",           &rclk_clk),
+       CLKDEV_CON_ID("oscclk",         &oscclk_clk),
+       CLKDEV_CON_ID("zb3",            &zb3_clk),
+       CLKDEV_CON_ID("zb3d2",          &zb3d2_clk),
+       CLKDEV_CON_ID("ddr",            &ddr_clk),
+       CLKDEV_CON_ID("mp",             &mp_clk),
+       CLKDEV_CON_ID("qspi",           &qspi_clk),
+       CLKDEV_CON_ID("cp",             &cp_clk),
+
+       /* DIV4 */
+       CLKDEV_CON_ID("sdh",            &div4_clks[DIV4_SDH]),
+
+       /* DIV6 */
+       CLKDEV_CON_ID("ssp",            &div6_clks[DIV6_SSP]),
+       CLKDEV_CON_ID("ssprs",          &div6_clks[DIV6_SSPRS]),
+
+       /* MSTP */
        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]),
@@ -72,15 +252,76 @@ static struct clk_lookup lookups[] = {
        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]),
+       CLKDEV_DEV_ID("sh-sci.8", &mstp_clks[MSTP717]),
+       CLKDEV_DEV_ID("sh-sci.9", &mstp_clks[MSTP716]),
+       CLKDEV_DEV_ID("ee200000.mmcif", &mstp_clks[MSTP315]),
+       CLKDEV_DEV_ID("sh_mmcif.0", &mstp_clks[MSTP315]),
+       CLKDEV_DEV_ID("ee100000.sdhi", &mstp_clks[MSTP314]),
+       CLKDEV_DEV_ID("sh_mobile_sdhi.0", &mstp_clks[MSTP314]),
+       CLKDEV_DEV_ID("ee120000.sdhi", &mstp_clks[MSTP313]),
+       CLKDEV_DEV_ID("sh_mobile_sdhi.1", &mstp_clks[MSTP313]),
+       CLKDEV_DEV_ID("ee140000.sdhi", &mstp_clks[MSTP312]),
+       CLKDEV_DEV_ID("sh_mobile_sdhi.2", &mstp_clks[MSTP312]),
+       CLKDEV_DEV_ID("ee160000.sdhi", &mstp_clks[MSTP311]),
+       CLKDEV_DEV_ID("sh_mobile_sdhi.3", &mstp_clks[MSTP311]),
+       CLKDEV_DEV_ID("ee220000.mmcif", &mstp_clks[MSTP305]),
+       CLKDEV_DEV_ID("sh_mmcif.1", &mstp_clks[MSTP305]),
 };
 
+#define R8A7790_CLOCK_ROOT(e, m, p0, p1, p30, p31)             \
+       extal_clk.rate  = e * 1000 * 1000;                      \
+       main_clk.parent = m;                                    \
+       SH_CLK_SET_RATIO(&pll1_clk_ratio, p1 / 2, 1);           \
+       if (mode & MD(19))                                      \
+               SH_CLK_SET_RATIO(&pll3_clk_ratio, p31, 1);      \
+       else                                                    \
+               SH_CLK_SET_RATIO(&pll3_clk_ratio, p30, 1)
+
+
 void __init r8a7790_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);
+
+       switch (mode & (MD(14) | MD(13))) {
+       case 0:
+               R8A7790_CLOCK_ROOT(15, &extal_clk, 172, 208, 106, 88);
+               break;
+       case MD(13):
+               R8A7790_CLOCK_ROOT(20, &extal_clk, 130, 156, 80, 66);
+               break;
+       case MD(14):
+               R8A7790_CLOCK_ROOT(26, &extal_div2_clk, 200, 240, 122, 102);
+               break;
+       case MD(13) | MD(14):
+               R8A7790_CLOCK_ROOT(30, &extal_div2_clk, 172, 208, 106, 88);
+               break;
+       }
+
+       if (mode & (MD(18)))
+               SH_CLK_SET_RATIO(&lb_clk_ratio, 1, 36);
+       else
+               SH_CLK_SET_RATIO(&lb_clk_ratio, 1, 24);
+
+       if ((mode & (MD(3) | MD(2) | MD(1))) == MD(2))
+               SH_CLK_SET_RATIO(&qspi_clk_ratio, 1, 16);
+       else
+               SH_CLK_SET_RATIO(&qspi_clk_ratio, 1, 20);
+
        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_div6_register(div6_clks, DIV6_NR);
+
        if (!ret)
                ret = sh_clk_mstp_register(mstp_clks, MSTP_NR);
 
index 784fbaa4cc55e6bbe826df552e876737ce6dd7c4..d9fd0336b910b9fd1cbb79de09a9e5fdca612385 100644 (file)
@@ -228,6 +228,11 @@ enum { DIV4_I, DIV4_ZG, DIV4_M3, DIV4_B, DIV4_M1, DIV4_M2,
 
 static struct clk div4_clks[DIV4_NR] = {
        [DIV4_I] = DIV4(FRQCRA, 20, 0xdff, CLK_ENABLE_ON_INIT),
+       /*
+        * ZG clock is dividing PLL0 frequency to supply SGX. Make sure not to
+        * exceed maximum frequencies of 201.5MHz for VDD_DVFS=1.175 and
+        * 239.2MHz for VDD_DVFS=1.315V.
+        */
        [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),
@@ -252,6 +257,101 @@ static struct clk twd_clk = {
        .ops = &twd_clk_ops,
 };
 
+static struct sh_clk_ops zclk_ops, kicker_ops;
+static const struct sh_clk_ops *div4_clk_ops;
+
+static int zclk_set_rate(struct clk *clk, unsigned long rate)
+{
+       int ret;
+
+       if (!clk->parent || !__clk_get(clk->parent))
+               return -ENODEV;
+
+       if (readl(FRQCRB) & (1 << 31))
+               return -EBUSY;
+
+       if (rate == clk_get_rate(clk->parent)) {
+               /* 1:1 - switch off divider */
+               __raw_writel(__raw_readl(FRQCRB) & ~(1 << 28), FRQCRB);
+               /* nullify the divider to prepare for the next time */
+               ret = div4_clk_ops->set_rate(clk, rate / 2);
+               if (!ret)
+                       ret = frqcr_kick();
+               if (ret > 0)
+                       ret = 0;
+       } else {
+               /* Enable the divider */
+               __raw_writel(__raw_readl(FRQCRB) | (1 << 28), FRQCRB);
+
+               ret = frqcr_kick();
+               if (ret >= 0)
+                       /*
+                        * set the divider - call the DIV4 method, it will kick
+                        * FRQCRB too
+                        */
+                       ret = div4_clk_ops->set_rate(clk, rate);
+               if (ret < 0)
+                       goto esetrate;
+       }
+
+esetrate:
+       __clk_put(clk->parent);
+       return ret;
+}
+
+static long zclk_round_rate(struct clk *clk, unsigned long rate)
+{
+       unsigned long div_freq = div4_clk_ops->round_rate(clk, rate),
+               parent_freq = clk_get_rate(clk->parent);
+
+       if (rate > div_freq && abs(parent_freq - rate) < rate - div_freq)
+               return parent_freq;
+
+       return div_freq;
+}
+
+static unsigned long zclk_recalc(struct clk *clk)
+{
+       /*
+        * Must recalculate frequencies in case PLL0 has been changed, even if
+        * the divisor is unused ATM!
+        */
+       unsigned long div_freq = div4_clk_ops->recalc(clk);
+
+       if (__raw_readl(FRQCRB) & (1 << 28))
+               return div_freq;
+
+       return clk_get_rate(clk->parent);
+}
+
+static int kicker_set_rate(struct clk *clk, unsigned long rate)
+{
+       if (__raw_readl(FRQCRB) & (1 << 31))
+               return -EBUSY;
+
+       return div4_clk_ops->set_rate(clk, rate);
+}
+
+static void div4_clk_extend(void)
+{
+       int i;
+
+       div4_clk_ops = div4_clks[0].ops;
+
+       /* Add a kicker-busy check before changing the rate */
+       kicker_ops = *div4_clk_ops;
+       /* We extend the DIV4 clock with a 1:1 pass-through case */
+       zclk_ops = *div4_clk_ops;
+
+       kicker_ops.set_rate = kicker_set_rate;
+       zclk_ops.set_rate = zclk_set_rate;
+       zclk_ops.round_rate = zclk_round_rate;
+       zclk_ops.recalc = zclk_recalc;
+
+       for (i = 0; i < DIV4_NR; i++)
+               div4_clks[i].ops = i == DIV4_Z ? &zclk_ops : &kicker_ops;
+}
+
 enum { DIV6_VCK1, DIV6_VCK2, DIV6_VCK3, DIV6_ZB1,
        DIV6_FLCTL, DIV6_SDHI0, DIV6_SDHI1, DIV6_SDHI2,
        DIV6_FSIA, DIV6_FSIB, DIV6_SUB,
@@ -450,7 +550,7 @@ static struct clk *late_main_clks[] = {
 };
 
 enum { MSTP001,
-       MSTP129, MSTP128, MSTP127, MSTP126, MSTP125, MSTP118, MSTP116, MSTP100,
+       MSTP129, MSTP128, MSTP127, MSTP126, MSTP125, MSTP118, MSTP116, MSTP112, MSTP100,
        MSTP219, MSTP218, MSTP217,
        MSTP207, MSTP206, MSTP204, MSTP203, MSTP202, MSTP201, MSTP200,
        MSTP331, MSTP329, MSTP328, MSTP325, MSTP323, MSTP322,
@@ -471,6 +571,7 @@ static struct clk mstp_clks[MSTP_NR] = {
        [MSTP125] = MSTP(&div6_clks[DIV6_SUB], SMSTPCR1, 25, 0), /* TMU0 */
        [MSTP118] = MSTP(&div4_clks[DIV4_B], SMSTPCR1, 18, 0), /* DSITX0 */
        [MSTP116] = MSTP(&div4_clks[DIV4_HP], SMSTPCR1, 16, 0), /* IIC0 */
+       [MSTP112] = MSTP(&div4_clks[DIV4_ZG], SMSTPCR1, 12, 0), /* SGX */
        [MSTP100] = MSTP(&div4_clks[DIV4_B], SMSTPCR1, 0, 0), /* LCDC0 */
        [MSTP219] = MSTP(&div6_clks[DIV6_SUB], SMSTPCR2, 19, 0), /* SCIFA7 */
        [MSTP218] = MSTP(&div4_clks[DIV4_HP], SMSTPCR2, 18, 0), /* SY-DMAC */
@@ -513,6 +614,9 @@ static struct clk_lookup lookups[] = {
        CLKDEV_CON_ID("r_clk", &r_clk),
        CLKDEV_DEV_ID("smp_twd", &twd_clk), /* smp_twd */
 
+       /* DIV4 clocks */
+       CLKDEV_DEV_ID("cpufreq-cpu0", &div4_clks[DIV4_Z]),
+
        /* DIV6 clocks */
        CLKDEV_CON_ID("vck1_clk", &div6_clks[DIV6_VCK1]),
        CLKDEV_CON_ID("vck2_clk", &div6_clks[DIV6_VCK2]),
@@ -604,8 +708,11 @@ void __init sh73a0_clock_init(void)
        for (k = 0; !ret && (k < ARRAY_SIZE(main_clks)); k++)
                ret = clk_register(main_clks[k]);
 
-       if (!ret)
+       if (!ret) {
                ret = sh_clk_div4_register(div4_clks, DIV4_NR, &div4_table);
+               if (!ret)
+                       div4_clk_extend();
+       }
 
        if (!ret)
                ret = sh_clk_div6_reparent_register(div6_clks, DIV6_NR);
index 76ac61292e48ace6cc6740ebac5d2c03c8ff8267..03e56074928c23fcb053b22b0ac523240e3976d8 100644 (file)
@@ -24,16 +24,16 @@ struct clk name = {                 \
 }
 
 #define SH_FIXED_RATIO_CLK(name, p, r)         \
-static SH_FIXED_RATIO_CLKg(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);
+       SH_FIXED_RATIO_CLK(name, p, name)
 
 #define SH_CLK_SET_RATIO(p, m, d)      \
-{                      \
+do {                   \
        (p)->mul = m;   \
        (p)->div = d;   \
-}
+} while (0)
 
 #endif
index b2074e2acb15f2641f5b92fc65fad9ff619c54cb..d241bfd6926de3d4f9fddaed6aa6ab19e9158383 100644 (file)
@@ -16,4 +16,9 @@
 #define IRQPIN_BASE            2000
 #define irq_pin(nr)            ((nr) + IRQPIN_BASE)
 
+/* GPIO IRQ */
+#define _GPIO_IRQ_BASE         2500
+#define GPIO_IRQ_BASE(x)       (_GPIO_IRQ_BASE + (32 * x))
+#define GPIO_IRQ(x, y)         (_GPIO_IRQ_BASE + (32 * x) + y)
+
 #endif /* __ASM_MACH_IRQS_H */
index abdc4d4efa28938bdb3b37ab494787e4ba22e540..9c9a66ccaf6f7db7657a8318832d5d0a5ec9b702 100644 (file)
 #define MD_CK1 (1 << 1)
 #define MD_CK0 (1 << 0)
 
-/*
- * Pin Function Controller:
- *     GPIO_FN_xx - GPIO used to select pin function
- *     GPIO_PORTxx - GPIO mapped to real I/O pin on CPU
- */
-enum {
-       /* PORT */
-       GPIO_PORT0, GPIO_PORT1, GPIO_PORT2, GPIO_PORT3, GPIO_PORT4,
-       GPIO_PORT5, GPIO_PORT6, GPIO_PORT7, GPIO_PORT8, GPIO_PORT9,
-
-       GPIO_PORT10, GPIO_PORT11, GPIO_PORT12, GPIO_PORT13, GPIO_PORT14,
-       GPIO_PORT15, GPIO_PORT16, GPIO_PORT17, GPIO_PORT18, GPIO_PORT19,
-
-       GPIO_PORT20, GPIO_PORT21, GPIO_PORT22, GPIO_PORT23, GPIO_PORT24,
-       GPIO_PORT25, GPIO_PORT26, GPIO_PORT27, GPIO_PORT28, GPIO_PORT29,
-
-       GPIO_PORT30, GPIO_PORT31, GPIO_PORT32, GPIO_PORT33, GPIO_PORT34,
-       GPIO_PORT35, GPIO_PORT36, GPIO_PORT37, GPIO_PORT38, GPIO_PORT39,
-
-       GPIO_PORT40, GPIO_PORT41, GPIO_PORT42, GPIO_PORT43, GPIO_PORT44,
-       GPIO_PORT45, GPIO_PORT46, GPIO_PORT47, GPIO_PORT48, GPIO_PORT49,
-
-       GPIO_PORT50, GPIO_PORT51, GPIO_PORT52, GPIO_PORT53, GPIO_PORT54,
-       GPIO_PORT55, GPIO_PORT56, GPIO_PORT57, GPIO_PORT58, GPIO_PORT59,
-
-       GPIO_PORT60, GPIO_PORT61, GPIO_PORT62, GPIO_PORT63, GPIO_PORT64,
-       GPIO_PORT65, GPIO_PORT66, GPIO_PORT67, GPIO_PORT68, GPIO_PORT69,
-
-       GPIO_PORT70, GPIO_PORT71, GPIO_PORT72, GPIO_PORT73, GPIO_PORT74,
-       GPIO_PORT75, GPIO_PORT76, GPIO_PORT77, GPIO_PORT78, GPIO_PORT79,
-
-       GPIO_PORT80, GPIO_PORT81, GPIO_PORT82, GPIO_PORT83, GPIO_PORT84,
-       GPIO_PORT85, GPIO_PORT86, GPIO_PORT87, GPIO_PORT88, GPIO_PORT89,
-
-       GPIO_PORT90, GPIO_PORT91, GPIO_PORT92, GPIO_PORT93, GPIO_PORT94,
-       GPIO_PORT95, GPIO_PORT96, GPIO_PORT97, GPIO_PORT98, GPIO_PORT99,
-
-       GPIO_PORT100, GPIO_PORT101, GPIO_PORT102, GPIO_PORT103, GPIO_PORT104,
-       GPIO_PORT105, GPIO_PORT106, GPIO_PORT107, GPIO_PORT108, GPIO_PORT109,
-
-       GPIO_PORT110, GPIO_PORT111, GPIO_PORT112, GPIO_PORT113, GPIO_PORT114,
-       GPIO_PORT115, GPIO_PORT116, GPIO_PORT117, GPIO_PORT118, GPIO_PORT119,
-
-       GPIO_PORT120, GPIO_PORT121, GPIO_PORT122, GPIO_PORT123, GPIO_PORT124,
-       GPIO_PORT125, GPIO_PORT126, GPIO_PORT127, GPIO_PORT128, GPIO_PORT129,
-
-       GPIO_PORT130, GPIO_PORT131, GPIO_PORT132, GPIO_PORT133, GPIO_PORT134,
-       GPIO_PORT135, GPIO_PORT136, GPIO_PORT137, GPIO_PORT138, GPIO_PORT139,
-
-       GPIO_PORT140, GPIO_PORT141, GPIO_PORT142, GPIO_PORT143, GPIO_PORT144,
-       GPIO_PORT145, GPIO_PORT146, GPIO_PORT147, GPIO_PORT148, GPIO_PORT149,
-
-       GPIO_PORT150, GPIO_PORT151, GPIO_PORT152, GPIO_PORT153, GPIO_PORT154,
-       GPIO_PORT155, GPIO_PORT156, GPIO_PORT157, GPIO_PORT158, GPIO_PORT159,
-
-       GPIO_PORT160, GPIO_PORT161, GPIO_PORT162, GPIO_PORT163, GPIO_PORT164,
-       GPIO_PORT165, GPIO_PORT166, GPIO_PORT167, GPIO_PORT168, GPIO_PORT169,
-
-       GPIO_PORT170, GPIO_PORT171, GPIO_PORT172, GPIO_PORT173, GPIO_PORT174,
-       GPIO_PORT175, GPIO_PORT176, GPIO_PORT177, GPIO_PORT178, GPIO_PORT179,
-
-       GPIO_PORT180, GPIO_PORT181, GPIO_PORT182, GPIO_PORT183, GPIO_PORT184,
-       GPIO_PORT185, GPIO_PORT186, GPIO_PORT187, GPIO_PORT188, GPIO_PORT189,
-
-       GPIO_PORT190, GPIO_PORT191, GPIO_PORT192, GPIO_PORT193, GPIO_PORT194,
-       GPIO_PORT195, GPIO_PORT196, GPIO_PORT197, GPIO_PORT198, GPIO_PORT199,
-
-       GPIO_PORT200, GPIO_PORT201, GPIO_PORT202, GPIO_PORT203, GPIO_PORT204,
-       GPIO_PORT205, GPIO_PORT206, GPIO_PORT207, GPIO_PORT208, GPIO_PORT209,
-
-       GPIO_PORT210, GPIO_PORT211,
-
-       /* IRQ */
-       GPIO_FN_IRQ0_PORT2,     GPIO_FN_IRQ0_PORT13,
-       GPIO_FN_IRQ1,
-       GPIO_FN_IRQ2_PORT11,    GPIO_FN_IRQ2_PORT12,
-       GPIO_FN_IRQ3_PORT10,    GPIO_FN_IRQ3_PORT14,
-       GPIO_FN_IRQ4_PORT15,    GPIO_FN_IRQ4_PORT172,
-       GPIO_FN_IRQ5_PORT0,     GPIO_FN_IRQ5_PORT1,
-       GPIO_FN_IRQ6_PORT121,   GPIO_FN_IRQ6_PORT173,
-       GPIO_FN_IRQ7_PORT120,   GPIO_FN_IRQ7_PORT209,
-       GPIO_FN_IRQ8,
-       GPIO_FN_IRQ9_PORT118,   GPIO_FN_IRQ9_PORT210,
-       GPIO_FN_IRQ10,
-       GPIO_FN_IRQ11,
-       GPIO_FN_IRQ12_PORT42,   GPIO_FN_IRQ12_PORT97,
-       GPIO_FN_IRQ13_PORT64,   GPIO_FN_IRQ13_PORT98,
-       GPIO_FN_IRQ14_PORT63,   GPIO_FN_IRQ14_PORT99,
-       GPIO_FN_IRQ15_PORT62,   GPIO_FN_IRQ15_PORT100,
-       GPIO_FN_IRQ16_PORT68,   GPIO_FN_IRQ16_PORT211,
-       GPIO_FN_IRQ17,
-       GPIO_FN_IRQ18,
-       GPIO_FN_IRQ19,
-       GPIO_FN_IRQ20,
-       GPIO_FN_IRQ21,
-       GPIO_FN_IRQ22,
-       GPIO_FN_IRQ23,
-       GPIO_FN_IRQ24,
-       GPIO_FN_IRQ25,
-       GPIO_FN_IRQ26_PORT58,   GPIO_FN_IRQ26_PORT81,
-       GPIO_FN_IRQ27_PORT57,   GPIO_FN_IRQ27_PORT168,
-       GPIO_FN_IRQ28_PORT56,   GPIO_FN_IRQ28_PORT169,
-       GPIO_FN_IRQ29_PORT50,   GPIO_FN_IRQ29_PORT170,
-       GPIO_FN_IRQ30_PORT49,   GPIO_FN_IRQ30_PORT171,
-       GPIO_FN_IRQ31_PORT41,   GPIO_FN_IRQ31_PORT167,
-
-       /* Function */
-
-       /* DBGT */
-       GPIO_FN_DBGMDT2,        GPIO_FN_DBGMDT1,        GPIO_FN_DBGMDT0,
-       GPIO_FN_DBGMD10,        GPIO_FN_DBGMD11,        GPIO_FN_DBGMD20,
-       GPIO_FN_DBGMD21,
-
-       /* FSI-A */
-       GPIO_FN_FSIAISLD_PORT0,         /* FSIAISLD Port 0/5 */
-       GPIO_FN_FSIAISLD_PORT5,
-       GPIO_FN_FSIASPDIF_PORT9,        /* FSIASPDIF Port 9/18 */
-       GPIO_FN_FSIASPDIF_PORT18,
-       GPIO_FN_FSIAOSLD1,      GPIO_FN_FSIAOSLD2,
-       GPIO_FN_FSIAOLR,        GPIO_FN_FSIAOBT,
-       GPIO_FN_FSIAOSLD,       GPIO_FN_FSIAOMC,
-       GPIO_FN_FSIACK,         GPIO_FN_FSIAILR,
-       GPIO_FN_FSIAIBT,
-
-       /* FSI-B */
-       GPIO_FN_FSIBCK,
-
-       /* FMSI */
-       GPIO_FN_FMSISLD_PORT1, /* FMSISLD Port 1/6 */
-       GPIO_FN_FMSISLD_PORT6,
-       GPIO_FN_FMSIILR,        GPIO_FN_FMSIIBT,
-       GPIO_FN_FMSIOLR,        GPIO_FN_FMSIOBT,
-       GPIO_FN_FMSICK,         GPIO_FN_FMSOILR,
-       GPIO_FN_FMSOIBT,        GPIO_FN_FMSOOLR,
-       GPIO_FN_FMSOOBT,        GPIO_FN_FMSOSLD,
-       GPIO_FN_FMSOCK,
-
-       /* SCIFA0 */
-       GPIO_FN_SCIFA0_SCK,     GPIO_FN_SCIFA0_CTS,
-       GPIO_FN_SCIFA0_RTS,     GPIO_FN_SCIFA0_RXD,
-       GPIO_FN_SCIFA0_TXD,
-
-       /* SCIFA1 */
-       GPIO_FN_SCIFA1_CTS,     GPIO_FN_SCIFA1_SCK,
-       GPIO_FN_SCIFA1_RXD,     GPIO_FN_SCIFA1_TXD,
-       GPIO_FN_SCIFA1_RTS,
-
-       /* SCIFA2 */
-       GPIO_FN_SCIFA2_SCK_PORT22, /* SCIFA2_SCK Port 22/199 */
-       GPIO_FN_SCIFA2_SCK_PORT199,
-       GPIO_FN_SCIFA2_RXD,     GPIO_FN_SCIFA2_TXD,
-       GPIO_FN_SCIFA2_CTS,     GPIO_FN_SCIFA2_RTS,
-
-       /* SCIFA3 */
-       GPIO_FN_SCIFA3_RTS_PORT105, /* MSEL5CR_8_0 */
-       GPIO_FN_SCIFA3_SCK_PORT116,
-       GPIO_FN_SCIFA3_CTS_PORT117,
-       GPIO_FN_SCIFA3_RXD_PORT174,
-       GPIO_FN_SCIFA3_TXD_PORT175,
-
-       GPIO_FN_SCIFA3_RTS_PORT161, /* MSEL5CR_8_1 */
-       GPIO_FN_SCIFA3_SCK_PORT158,
-       GPIO_FN_SCIFA3_CTS_PORT162,
-       GPIO_FN_SCIFA3_RXD_PORT159,
-       GPIO_FN_SCIFA3_TXD_PORT160,
-
-       /* SCIFA4 */
-       GPIO_FN_SCIFA4_RXD_PORT12, /* MSEL5CR[12:11] = 00 */
-       GPIO_FN_SCIFA4_TXD_PORT13,
-
-       GPIO_FN_SCIFA4_RXD_PORT204, /* MSEL5CR[12:11] = 01 */
-       GPIO_FN_SCIFA4_TXD_PORT203,
-
-       GPIO_FN_SCIFA4_RXD_PORT94, /* MSEL5CR[12:11] = 10 */
-       GPIO_FN_SCIFA4_TXD_PORT93,
-
-       GPIO_FN_SCIFA4_SCK_PORT21, /* SCIFA4_SCK Port 21/205 */
-       GPIO_FN_SCIFA4_SCK_PORT205,
-
-       /* SCIFA5 */
-       GPIO_FN_SCIFA5_TXD_PORT20, /* MSEL5CR[15:14] = 00 */
-       GPIO_FN_SCIFA5_RXD_PORT10,
-
-       GPIO_FN_SCIFA5_RXD_PORT207, /* MSEL5CR[15:14] = 01 */
-       GPIO_FN_SCIFA5_TXD_PORT208,
-
-       GPIO_FN_SCIFA5_TXD_PORT91, /* MSEL5CR[15:14] = 10 */
-       GPIO_FN_SCIFA5_RXD_PORT92,
-
-       GPIO_FN_SCIFA5_SCK_PORT23, /* SCIFA5_SCK Port 23/206 */
-       GPIO_FN_SCIFA5_SCK_PORT206,
-
-       /* SCIFA6 */
-       GPIO_FN_SCIFA6_SCK,     GPIO_FN_SCIFA6_RXD,     GPIO_FN_SCIFA6_TXD,
-
-       /* SCIFA7 */
-       GPIO_FN_SCIFA7_TXD,     GPIO_FN_SCIFA7_RXD,
-
-       /* SCIFAB */
-       GPIO_FN_SCIFB_SCK_PORT190, /* MSEL5CR_17_0 */
-       GPIO_FN_SCIFB_RXD_PORT191,
-       GPIO_FN_SCIFB_TXD_PORT192,
-       GPIO_FN_SCIFB_RTS_PORT186,
-       GPIO_FN_SCIFB_CTS_PORT187,
-
-       GPIO_FN_SCIFB_SCK_PORT2, /* MSEL5CR_17_1 */
-       GPIO_FN_SCIFB_RXD_PORT3,
-       GPIO_FN_SCIFB_TXD_PORT4,
-       GPIO_FN_SCIFB_RTS_PORT172,
-       GPIO_FN_SCIFB_CTS_PORT173,
-
-       /* LCD0 */
-       GPIO_FN_LCDC0_SELECT,
-
-       /* LCD1 */
-       GPIO_FN_LCDC1_SELECT,
-
-       /* RSPI */
-       GPIO_FN_RSPI_SSL0_A,    GPIO_FN_RSPI_SSL1_A,
-       GPIO_FN_RSPI_SSL2_A,    GPIO_FN_RSPI_SSL3_A,
-       GPIO_FN_RSPI_MOSI_A,    GPIO_FN_RSPI_MISO_A,
-       GPIO_FN_RSPI_CK_A,
-
-       /* VIO CKO */
-       GPIO_FN_VIO_CKO1,
-       GPIO_FN_VIO_CKO2,
-       GPIO_FN_VIO_CKO_1,
-       GPIO_FN_VIO_CKO,
-
-       /* VIO0 */
-       GPIO_FN_VIO0_D0,        GPIO_FN_VIO0_D1,        GPIO_FN_VIO0_D2,
-       GPIO_FN_VIO0_D3,        GPIO_FN_VIO0_D4,        GPIO_FN_VIO0_D5,
-       GPIO_FN_VIO0_D6,        GPIO_FN_VIO0_D7,        GPIO_FN_VIO0_D8,
-       GPIO_FN_VIO0_D9,        GPIO_FN_VIO0_D10,       GPIO_FN_VIO0_D11,
-       GPIO_FN_VIO0_D12,       GPIO_FN_VIO0_VD,        GPIO_FN_VIO0_HD,
-       GPIO_FN_VIO0_CLK,       GPIO_FN_VIO0_FIELD,
-
-       GPIO_FN_VIO0_D13_PORT26, /* MSEL5CR_27_0 */
-       GPIO_FN_VIO0_D14_PORT25,
-       GPIO_FN_VIO0_D15_PORT24,
-
-       GPIO_FN_VIO0_D13_PORT22, /* MSEL5CR_27_1 */
-       GPIO_FN_VIO0_D14_PORT95,
-       GPIO_FN_VIO0_D15_PORT96,
-
-       /* VIO1 */
-       GPIO_FN_VIO1_D0,        GPIO_FN_VIO1_D1,        GPIO_FN_VIO1_D2,
-       GPIO_FN_VIO1_D3,        GPIO_FN_VIO1_D4,        GPIO_FN_VIO1_D5,
-       GPIO_FN_VIO1_D6,        GPIO_FN_VIO1_D7,        GPIO_FN_VIO1_VD,
-       GPIO_FN_VIO1_HD,        GPIO_FN_VIO1_CLK,       GPIO_FN_VIO1_FIELD,
-
-       /* TPU0 */
-       GPIO_FN_TPU0TO0,        GPIO_FN_TPU0TO1,
-       GPIO_FN_TPU0TO3,
-       GPIO_FN_TPU0TO2_PORT66, /* TPU0TO2 Port 66/202 */
-       GPIO_FN_TPU0TO2_PORT202,
-
-       /* SSP1 0 */
-       GPIO_FN_STP0_IPD0,      GPIO_FN_STP0_IPD1,      GPIO_FN_STP0_IPD2,
-       GPIO_FN_STP0_IPD3,      GPIO_FN_STP0_IPD4,      GPIO_FN_STP0_IPD5,
-       GPIO_FN_STP0_IPD6,      GPIO_FN_STP0_IPD7,      GPIO_FN_STP0_IPEN,
-       GPIO_FN_STP0_IPCLK,     GPIO_FN_STP0_IPSYNC,
-
-       /* SSP1 1 */
-       GPIO_FN_STP1_IPD1,      GPIO_FN_STP1_IPD2,      GPIO_FN_STP1_IPD3,
-       GPIO_FN_STP1_IPD4,      GPIO_FN_STP1_IPD5,      GPIO_FN_STP1_IPD6,
-       GPIO_FN_STP1_IPD7,      GPIO_FN_STP1_IPCLK,     GPIO_FN_STP1_IPSYNC,
-
-       GPIO_FN_STP1_IPD0_PORT186, /* MSEL5CR_23_0 */
-       GPIO_FN_STP1_IPEN_PORT187,
-
-       GPIO_FN_STP1_IPD0_PORT194, /* MSEL5CR_23_1 */
-       GPIO_FN_STP1_IPEN_PORT193,
-
-       /* SIM */
-       GPIO_FN_SIM_RST,        GPIO_FN_SIM_CLK,
-       GPIO_FN_SIM_D_PORT22, /* SIM_D  Port 22/199 */
-       GPIO_FN_SIM_D_PORT199,
-
-       /* 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,
-       GPIO_FN_MSIOF2_MCK1,    GPIO_FN_MSIOF2_MCK0,    GPIO_FN_MSIOF2_RSYNC,
-       GPIO_FN_MSIOF2_RSCK,
-
-       /* KEYSC */
-       GPIO_FN_KEYIN4,         GPIO_FN_KEYIN5,
-       GPIO_FN_KEYIN6,         GPIO_FN_KEYIN7,
-       GPIO_FN_KEYOUT0,        GPIO_FN_KEYOUT1,        GPIO_FN_KEYOUT2,
-       GPIO_FN_KEYOUT3,        GPIO_FN_KEYOUT4,        GPIO_FN_KEYOUT5,
-       GPIO_FN_KEYOUT6,        GPIO_FN_KEYOUT7,
-
-       GPIO_FN_KEYIN0_PORT43, /* MSEL4CR_18_0 */
-       GPIO_FN_KEYIN1_PORT44,
-       GPIO_FN_KEYIN2_PORT45,
-       GPIO_FN_KEYIN3_PORT46,
-
-       GPIO_FN_KEYIN0_PORT58, /* MSEL4CR_18_1 */
-       GPIO_FN_KEYIN1_PORT57,
-       GPIO_FN_KEYIN2_PORT56,
-       GPIO_FN_KEYIN3_PORT55,
-
-       /* VOU */
-       GPIO_FN_DV_D0,  GPIO_FN_DV_D1,  GPIO_FN_DV_D2,  GPIO_FN_DV_D3,
-       GPIO_FN_DV_D4,  GPIO_FN_DV_D5,  GPIO_FN_DV_D6,  GPIO_FN_DV_D7,
-       GPIO_FN_DV_D8,  GPIO_FN_DV_D9,  GPIO_FN_DV_D10, GPIO_FN_DV_D11,
-       GPIO_FN_DV_D12, GPIO_FN_DV_D13, GPIO_FN_DV_D14, GPIO_FN_DV_D15,
-       GPIO_FN_DV_CLK,
-       GPIO_FN_DV_VSYNC,
-       GPIO_FN_DV_HSYNC,
-
-       /* MEMC */
-       GPIO_FN_MEMC_AD0,       GPIO_FN_MEMC_AD1,       GPIO_FN_MEMC_AD2,
-       GPIO_FN_MEMC_AD3,       GPIO_FN_MEMC_AD4,       GPIO_FN_MEMC_AD5,
-       GPIO_FN_MEMC_AD6,       GPIO_FN_MEMC_AD7,       GPIO_FN_MEMC_AD8,
-       GPIO_FN_MEMC_AD9,       GPIO_FN_MEMC_AD10,      GPIO_FN_MEMC_AD11,
-       GPIO_FN_MEMC_AD12,      GPIO_FN_MEMC_AD13,      GPIO_FN_MEMC_AD14,
-       GPIO_FN_MEMC_AD15,      GPIO_FN_MEMC_CS0,       GPIO_FN_MEMC_INT,
-       GPIO_FN_MEMC_NWE,       GPIO_FN_MEMC_NOE,
-
-       GPIO_FN_MEMC_CS1, /* MSEL4CR_6_0 */
-       GPIO_FN_MEMC_ADV,
-       GPIO_FN_MEMC_WAIT,
-       GPIO_FN_MEMC_BUSCLK,
-
-       GPIO_FN_MEMC_A1, /* MSEL4CR_6_1 */
-       GPIO_FN_MEMC_DREQ0,
-       GPIO_FN_MEMC_DREQ1,
-       GPIO_FN_MEMC_A0,
-
-       /* 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,
-       GPIO_FN_MSIOF0_RSYNC,   GPIO_FN_MSIOF0_RSCK,
-       GPIO_FN_MSIOF0_TSCK,    GPIO_FN_MSIOF0_TSYNC,
-
-       /* MSIOF1 */
-       GPIO_FN_MSIOF1_RSCK,    GPIO_FN_MSIOF1_RSYNC,
-       GPIO_FN_MSIOF1_MCK0,    GPIO_FN_MSIOF1_MCK1,
-
-       GPIO_FN_MSIOF1_SS2_PORT116,     GPIO_FN_MSIOF1_SS1_PORT117,
-       GPIO_FN_MSIOF1_RXD_PORT118,     GPIO_FN_MSIOF1_TXD_PORT119,
-       GPIO_FN_MSIOF1_TSYNC_PORT120,
-       GPIO_FN_MSIOF1_TSCK_PORT121,    /* MSEL4CR_10_0 */
-
-       GPIO_FN_MSIOF1_SS1_PORT67,      GPIO_FN_MSIOF1_TSCK_PORT72,
-       GPIO_FN_MSIOF1_TSYNC_PORT73,    GPIO_FN_MSIOF1_TXD_PORT74,
-       GPIO_FN_MSIOF1_RXD_PORT75,
-       GPIO_FN_MSIOF1_SS2_PORT202,     /* MSEL4CR_10_1 */
-
-       /* GPIO */
-       GPIO_FN_GPO0,   GPIO_FN_GPI0,
-       GPIO_FN_GPO1,   GPIO_FN_GPI1,
-
-       /* USB0 */
-       GPIO_FN_USB0_OCI,       GPIO_FN_USB0_PPON,      GPIO_FN_VBUS,
-
-       /* USB1 */
-       GPIO_FN_USB1_OCI,       GPIO_FN_USB1_PPON,
-
-       /* BBIF1 */
-       GPIO_FN_BBIF1_RXD,      GPIO_FN_BBIF1_TXD,      GPIO_FN_BBIF1_TSYNC,
-       GPIO_FN_BBIF1_TSCK,     GPIO_FN_BBIF1_RSCK,     GPIO_FN_BBIF1_RSYNC,
-       GPIO_FN_BBIF1_FLOW,     GPIO_FN_BBIF1_RX_FLOW_N,
-
-       /* BBIF2 */
-       GPIO_FN_BBIF2_TXD2_PORT5, /* MSEL5CR_0_0 */
-       GPIO_FN_BBIF2_RXD2_PORT60,
-       GPIO_FN_BBIF2_TSYNC2_PORT6,
-       GPIO_FN_BBIF2_TSCK2_PORT59,
-
-       GPIO_FN_BBIF2_RXD2_PORT90, /* MSEL5CR_0_1 */
-       GPIO_FN_BBIF2_TXD2_PORT183,
-       GPIO_FN_BBIF2_TSCK2_PORT89,
-       GPIO_FN_BBIF2_TSYNC2_PORT184,
-
-       /* BSC / FLCTL / PCMCIA */
-       GPIO_FN_CS0,    GPIO_FN_CS2,    GPIO_FN_CS4,
-       GPIO_FN_CS5B,   GPIO_FN_CS6A,
-       GPIO_FN_CS5A_PORT105, /* CS5A PORT 19/105 */
-       GPIO_FN_CS5A_PORT19,
-       GPIO_FN_IOIS16, /* ? */
-
-       GPIO_FN_A0,     GPIO_FN_A1,     GPIO_FN_A2,     GPIO_FN_A3,
-       GPIO_FN_A4_FOE,         /* share with FLCTL */
-       GPIO_FN_A5_FCDE,        /* share with FLCTL */
-       GPIO_FN_A6,     GPIO_FN_A7,     GPIO_FN_A8,     GPIO_FN_A9,
-       GPIO_FN_A10,    GPIO_FN_A11,    GPIO_FN_A12,    GPIO_FN_A13,
-       GPIO_FN_A14,    GPIO_FN_A15,    GPIO_FN_A16,    GPIO_FN_A17,
-       GPIO_FN_A18,    GPIO_FN_A19,    GPIO_FN_A20,    GPIO_FN_A21,
-       GPIO_FN_A22,    GPIO_FN_A23,    GPIO_FN_A24,    GPIO_FN_A25,
-       GPIO_FN_A26,
-
-       GPIO_FN_D0_NAF0,        GPIO_FN_D1_NAF1,        /* share with FLCTL */
-       GPIO_FN_D2_NAF2,        GPIO_FN_D3_NAF3,        /* share with FLCTL */
-       GPIO_FN_D4_NAF4,        GPIO_FN_D5_NAF5,        /* share with FLCTL */
-       GPIO_FN_D6_NAF6,        GPIO_FN_D7_NAF7,        /* share with FLCTL */
-       GPIO_FN_D8_NAF8,        GPIO_FN_D9_NAF9,        /* share with FLCTL */
-       GPIO_FN_D10_NAF10,      GPIO_FN_D11_NAF11,      /* share with FLCTL */
-       GPIO_FN_D12_NAF12,      GPIO_FN_D13_NAF13,      /* share with FLCTL */
-       GPIO_FN_D14_NAF14,      GPIO_FN_D15_NAF15,      /* share with FLCTL */
-
-       GPIO_FN_D16,    GPIO_FN_D17,    GPIO_FN_D18,    GPIO_FN_D19,
-       GPIO_FN_D20,    GPIO_FN_D21,    GPIO_FN_D22,    GPIO_FN_D23,
-       GPIO_FN_D24,    GPIO_FN_D25,    GPIO_FN_D26,    GPIO_FN_D27,
-       GPIO_FN_D28,    GPIO_FN_D29,    GPIO_FN_D30,    GPIO_FN_D31,
-
-       GPIO_FN_WE0_FWE,        /* share with FLCTL */
-       GPIO_FN_WE1,
-       GPIO_FN_WE2_ICIORD,     /* share with PCMCIA */
-       GPIO_FN_WE3_ICIOWR,     /* share with PCMCIA */
-       GPIO_FN_CKO,    GPIO_FN_BS,     GPIO_FN_RDWR,
-       GPIO_FN_RD_FSC,         /* share with FLCTL */
-       GPIO_FN_WAIT_PORT177,   /* WAIT Port 90/177 */
-       GPIO_FN_WAIT_PORT90,
-
-       GPIO_FN_FCE0,   GPIO_FN_FCE1,   GPIO_FN_FRB, /* FLCTL */
-
-       /* IRDA */
-       GPIO_FN_IRDA_FIRSEL,    GPIO_FN_IRDA_IN,        GPIO_FN_IRDA_OUT,
-
-       /* ATAPI */
-       GPIO_FN_IDE_D0,         GPIO_FN_IDE_D1,         GPIO_FN_IDE_D2,
-       GPIO_FN_IDE_D3,         GPIO_FN_IDE_D4,         GPIO_FN_IDE_D5,
-       GPIO_FN_IDE_D6,         GPIO_FN_IDE_D7,         GPIO_FN_IDE_D8,
-       GPIO_FN_IDE_D9,         GPIO_FN_IDE_D10,        GPIO_FN_IDE_D11,
-       GPIO_FN_IDE_D12,        GPIO_FN_IDE_D13,        GPIO_FN_IDE_D14,
-       GPIO_FN_IDE_D15,        GPIO_FN_IDE_A0,         GPIO_FN_IDE_A1,
-       GPIO_FN_IDE_A2,         GPIO_FN_IDE_CS0,        GPIO_FN_IDE_CS1,
-       GPIO_FN_IDE_IOWR,       GPIO_FN_IDE_IORD,       GPIO_FN_IDE_IORDY,
-       GPIO_FN_IDE_INT,        GPIO_FN_IDE_RST,        GPIO_FN_IDE_DIRECTION,
-       GPIO_FN_IDE_EXBUF_ENB,  GPIO_FN_IDE_IODACK,     GPIO_FN_IDE_IODREQ,
-
-       /* RMII */
-       GPIO_FN_RMII_CRS_DV,    GPIO_FN_RMII_RX_ER,     GPIO_FN_RMII_RXD0,
-       GPIO_FN_RMII_RXD1,      GPIO_FN_RMII_TX_EN,     GPIO_FN_RMII_TXD0,
-       GPIO_FN_RMII_MDC,       GPIO_FN_RMII_TXD1,      GPIO_FN_RMII_MDIO,
-       GPIO_FN_RMII_REF50CK,   /* for RMII */
-       GPIO_FN_RMII_REF125CK,  /* for GMII */
-
-       /* GEther */
-       GPIO_FN_ET_TX_CLK,      GPIO_FN_ET_TX_EN,       GPIO_FN_ET_ETXD0,
-       GPIO_FN_ET_ETXD1,       GPIO_FN_ET_ETXD2,       GPIO_FN_ET_ETXD3,
-       GPIO_FN_ET_ETXD4,       GPIO_FN_ET_ETXD5, /* for GEther */
-       GPIO_FN_ET_ETXD6,       GPIO_FN_ET_ETXD7, /* for GEther */
-       GPIO_FN_ET_COL,         GPIO_FN_ET_TX_ER,
-       GPIO_FN_ET_RX_CLK,      GPIO_FN_ET_RX_DV,
-       GPIO_FN_ET_ERXD0,       GPIO_FN_ET_ERXD1,
-       GPIO_FN_ET_ERXD2,       GPIO_FN_ET_ERXD3,
-       GPIO_FN_ET_ERXD4,       GPIO_FN_ET_ERXD5, /* for GEther */
-       GPIO_FN_ET_ERXD6,       GPIO_FN_ET_ERXD7, /* for GEther */
-       GPIO_FN_ET_RX_ER,       GPIO_FN_ET_CRS,
-       GPIO_FN_ET_MDC,         GPIO_FN_ET_MDIO,
-       GPIO_FN_ET_LINK,        GPIO_FN_ET_PHY_INT,
-       GPIO_FN_ET_WOL,         GPIO_FN_ET_GTX_CLK,
-
-       /* DMA0 */
-       GPIO_FN_DREQ0,          GPIO_FN_DACK0,
-
-       /* DMA1 */
-       GPIO_FN_DREQ1,          GPIO_FN_DACK1,
-
-       /* SYSC */
-       GPIO_FN_RESETOUTS,
-       GPIO_FN_RESETP_PULLUP,
-       GPIO_FN_RESETP_PLAIN,
-
-       /* HDMI */
-       GPIO_FN_HDMI_HPD,
-       GPIO_FN_HDMI_CEC,
-
-       /* SDENC */
-       GPIO_FN_SDENC_CPG,
-       GPIO_FN_SDENC_DV_CLKI,
-
-       /* IRREM */
-       GPIO_FN_IROUT,
-
-       /* DEBUG */
-       GPIO_FN_EDEBGREQ_PULLDOWN,
-       GPIO_FN_EDEBGREQ_PULLUP,
-
-       GPIO_FN_TRACEAUD_FROM_VIO,
-       GPIO_FN_TRACEAUD_FROM_LCDC0,
-       GPIO_FN_TRACEAUD_FROM_MEMC,
-};
-
 /* DMA slave IDs */
 enum {
        SHDMA_SLAVE_INVALID,
index 951149e6bcca20ca26df5b177086435ce50adc1e..851d027a2f06143a1ec938789f3d1aa5c294e1f7 100644 (file)
 #ifndef __ASM_R8A7778_H__
 #define __ASM_R8A7778_H__
 
+#include <linux/mmc/sh_mmcif.h>
+#include <linux/mmc/sh_mobile_sdhi.h>
 #include <linux/sh_eth.h>
+#include <linux/platform_data/usb-rcar-phy.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_add_usb_phy_device(struct rcar_phy_platform_data *pdata);
+extern void r8a7778_add_i2c_device(int id);
+extern void r8a7778_add_hspi_device(int id);
+extern void r8a7778_add_mmc_device(struct sh_mmcif_plat_data *info);
+
+extern void r8a7778_init_late(void);
 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);
+extern void r8a7778_pinmux_init(void);
+extern void r8a7778_sdhi_init(int id, struct sh_mobile_sdhi_info *info);
 
 #endif /* __ASM_R8A7778_H__ */
index 188b295938a5cab5a9599f3874444074323ad97f..fc47073c7ba905d0a74c3a723cd4e5e29abb6e0e 100644 (file)
@@ -4,6 +4,7 @@
 #include <linux/sh_clk.h>
 #include <linux/pm_domain.h>
 #include <linux/sh_eth.h>
+#include <linux/platform_data/usb-rcar-phy.h>
 
 struct platform_device;
 
@@ -33,6 +34,8 @@ 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_add_usb_phy_device(struct rcar_phy_platform_data *pdata);
+extern void r8a7779_init_late(void);
 extern void r8a7779_clock_init(void);
 extern void r8a7779_pinmux_init(void);
 extern void r8a7779_pm_init(void);
index fd7cba024c392a83e73f9d1f0f620aaa0f3cf1f6..e882717ca97ff4fe05723e0120f0efe6d640441b 100644 (file)
 #include <linux/pm_domain.h>
 #include <mach/pm-rmobile.h>
 
-/*
- * Pin Function Controller:
- *     GPIO_FN_xx - GPIO used to select pin function
- *     GPIO_PORTxx - GPIO mapped to real I/O pin on CPU
- */
-enum {
-       /* PORT */
-       GPIO_PORT0, GPIO_PORT1, GPIO_PORT2, GPIO_PORT3, GPIO_PORT4,
-       GPIO_PORT5, GPIO_PORT6, GPIO_PORT7, GPIO_PORT8, GPIO_PORT9,
-
-       GPIO_PORT10, GPIO_PORT11, GPIO_PORT12, GPIO_PORT13, GPIO_PORT14,
-       GPIO_PORT15, GPIO_PORT16, GPIO_PORT17, GPIO_PORT18, GPIO_PORT19,
-
-       GPIO_PORT20, GPIO_PORT21, GPIO_PORT22, GPIO_PORT23, GPIO_PORT24,
-       GPIO_PORT25, GPIO_PORT26, GPIO_PORT27, GPIO_PORT28, GPIO_PORT29,
-
-       GPIO_PORT30, GPIO_PORT31, GPIO_PORT32, GPIO_PORT33, GPIO_PORT34,
-       GPIO_PORT35, GPIO_PORT36, GPIO_PORT37, GPIO_PORT38, GPIO_PORT39,
-
-       GPIO_PORT40, GPIO_PORT41, GPIO_PORT42, GPIO_PORT43, GPIO_PORT44,
-       GPIO_PORT45, GPIO_PORT46, GPIO_PORT47, GPIO_PORT48, GPIO_PORT49,
-
-       GPIO_PORT50, GPIO_PORT51, GPIO_PORT52, GPIO_PORT53, GPIO_PORT54,
-       GPIO_PORT55, GPIO_PORT56, GPIO_PORT57, GPIO_PORT58, GPIO_PORT59,
-
-       GPIO_PORT60, GPIO_PORT61, GPIO_PORT62, GPIO_PORT63, GPIO_PORT64,
-       GPIO_PORT65, GPIO_PORT66, GPIO_PORT67, GPIO_PORT68, GPIO_PORT69,
-
-       GPIO_PORT70, GPIO_PORT71, GPIO_PORT72, GPIO_PORT73, GPIO_PORT74,
-       GPIO_PORT75, GPIO_PORT76, GPIO_PORT77, GPIO_PORT78, GPIO_PORT79,
-
-       GPIO_PORT80, GPIO_PORT81, GPIO_PORT82, GPIO_PORT83, GPIO_PORT84,
-       GPIO_PORT85, GPIO_PORT86, GPIO_PORT87, GPIO_PORT88, GPIO_PORT89,
-
-       GPIO_PORT90, GPIO_PORT91, GPIO_PORT92, GPIO_PORT93, GPIO_PORT94,
-       GPIO_PORT95, GPIO_PORT96, GPIO_PORT97, GPIO_PORT98, GPIO_PORT99,
-
-       GPIO_PORT100, GPIO_PORT101, GPIO_PORT102, GPIO_PORT103, GPIO_PORT104,
-       GPIO_PORT105, GPIO_PORT106, GPIO_PORT107, GPIO_PORT108, GPIO_PORT109,
-
-       GPIO_PORT110, GPIO_PORT111, GPIO_PORT112, GPIO_PORT113, GPIO_PORT114,
-       GPIO_PORT115, GPIO_PORT116, GPIO_PORT117, GPIO_PORT118, GPIO_PORT119,
-
-       GPIO_PORT120, GPIO_PORT121, GPIO_PORT122, GPIO_PORT123, GPIO_PORT124,
-       GPIO_PORT125, GPIO_PORT126, GPIO_PORT127, GPIO_PORT128, GPIO_PORT129,
-
-       GPIO_PORT130, GPIO_PORT131, GPIO_PORT132, GPIO_PORT133, GPIO_PORT134,
-       GPIO_PORT135, GPIO_PORT136, GPIO_PORT137, GPIO_PORT138, GPIO_PORT139,
-
-       GPIO_PORT140, GPIO_PORT141, GPIO_PORT142, GPIO_PORT143, GPIO_PORT144,
-       GPIO_PORT145, GPIO_PORT146, GPIO_PORT147, GPIO_PORT148, GPIO_PORT149,
-
-       GPIO_PORT150, GPIO_PORT151, GPIO_PORT152, GPIO_PORT153, GPIO_PORT154,
-       GPIO_PORT155, GPIO_PORT156, GPIO_PORT157, GPIO_PORT158, GPIO_PORT159,
-
-       GPIO_PORT160, GPIO_PORT161, GPIO_PORT162, GPIO_PORT163, GPIO_PORT164,
-       GPIO_PORT165, GPIO_PORT166, GPIO_PORT167, GPIO_PORT168, GPIO_PORT169,
-
-       GPIO_PORT170, GPIO_PORT171, GPIO_PORT172, GPIO_PORT173, GPIO_PORT174,
-       GPIO_PORT175, GPIO_PORT176, GPIO_PORT177, GPIO_PORT178, GPIO_PORT179,
-
-       GPIO_PORT180, GPIO_PORT181, GPIO_PORT182, GPIO_PORT183, GPIO_PORT184,
-       GPIO_PORT185, GPIO_PORT186, GPIO_PORT187, GPIO_PORT188, GPIO_PORT189,
-
-       GPIO_PORT190,
-
-       /* IRQ */
-       GPIO_FN_IRQ0_6,         /* PORT   6 */
-       GPIO_FN_IRQ0_162,       /* PORT 162 */
-       GPIO_FN_IRQ1,           /* PORT  12 */
-       GPIO_FN_IRQ2_4,         /* PORT   4 */
-       GPIO_FN_IRQ2_5,         /* PORT   5 */
-       GPIO_FN_IRQ3_8,         /* PORT   8 */
-       GPIO_FN_IRQ3_16,        /* PORT  16 */
-       GPIO_FN_IRQ4_17,        /* PORT  17 */
-       GPIO_FN_IRQ4_163,       /* PORT 163 */
-       GPIO_FN_IRQ5,           /* PORT  18 */
-       GPIO_FN_IRQ6_39,        /* PORT  39 */
-       GPIO_FN_IRQ6_164,       /* PORT 164 */
-       GPIO_FN_IRQ7_40,        /* PORT  40 */
-       GPIO_FN_IRQ7_167,       /* PORT 167 */
-       GPIO_FN_IRQ8_41,        /* PORT  41 */
-       GPIO_FN_IRQ8_168,       /* PORT 168 */
-       GPIO_FN_IRQ9_42,        /* PORT  42 */
-       GPIO_FN_IRQ9_169,       /* PORT 169 */
-       GPIO_FN_IRQ10,          /* PORT  65 */
-       GPIO_FN_IRQ11,          /* PORT  67 */
-       GPIO_FN_IRQ12_80,       /* PORT  80 */
-       GPIO_FN_IRQ12_137,      /* PORT 137 */
-       GPIO_FN_IRQ13_81,       /* PORT  81 */
-       GPIO_FN_IRQ13_145,      /* PORT 145 */
-       GPIO_FN_IRQ14_82,       /* PORT  82 */
-       GPIO_FN_IRQ14_146,      /* PORT 146 */
-       GPIO_FN_IRQ15_83,       /* PORT  83 */
-       GPIO_FN_IRQ15_147,      /* PORT 147 */
-       GPIO_FN_IRQ16_84,       /* PORT  84 */
-       GPIO_FN_IRQ16_170,      /* PORT 170 */
-       GPIO_FN_IRQ17,          /* PORT  85 */
-       GPIO_FN_IRQ18,          /* PORT  86 */
-       GPIO_FN_IRQ19,          /* PORT  87 */
-       GPIO_FN_IRQ20,          /* PORT  92 */
-       GPIO_FN_IRQ21,          /* PORT  93 */
-       GPIO_FN_IRQ22,          /* PORT  94 */
-       GPIO_FN_IRQ23,          /* PORT  95 */
-       GPIO_FN_IRQ24,          /* PORT 112 */
-       GPIO_FN_IRQ25,          /* PORT 119 */
-       GPIO_FN_IRQ26_121,      /* PORT 121 */
-       GPIO_FN_IRQ26_172,      /* PORT 172 */
-       GPIO_FN_IRQ27_122,      /* PORT 122 */
-       GPIO_FN_IRQ27_180,      /* PORT 180 */
-       GPIO_FN_IRQ28_123,      /* PORT 123 */
-       GPIO_FN_IRQ28_181,      /* PORT 181 */
-       GPIO_FN_IRQ29_129,      /* PORT 129 */
-       GPIO_FN_IRQ29_182,      /* PORT 182 */
-       GPIO_FN_IRQ30_130,      /* PORT 130 */
-       GPIO_FN_IRQ30_183,      /* PORT 183 */
-       GPIO_FN_IRQ31_138,      /* PORT 138 */
-       GPIO_FN_IRQ31_184,      /* PORT 184 */
-
-       /*
-        * MSIOF0       (PORT 36, 37, 38, 39
-        *                    40, 41, 42, 43, 44, 45)
-        */
-       GPIO_FN_MSIOF0_TSYNC,   GPIO_FN_MSIOF0_TSCK,
-       GPIO_FN_MSIOF0_RXD,     GPIO_FN_MSIOF0_RSCK,
-       GPIO_FN_MSIOF0_RSYNC,   GPIO_FN_MSIOF0_MCK0,
-       GPIO_FN_MSIOF0_MCK1,    GPIO_FN_MSIOF0_SS1,
-       GPIO_FN_MSIOF0_SS2,     GPIO_FN_MSIOF0_TXD,
-
-       /*
-        * MSIOF1       (PORT 39, 40, 41, 42, 43, 44
-        *                    84, 85, 86, 87, 88, 89, 90, 91, 92, 93)
-        */
-       GPIO_FN_MSIOF1_TSCK_39, GPIO_FN_MSIOF1_TSYNC_40,
-       GPIO_FN_MSIOF1_TSCK_88, GPIO_FN_MSIOF1_TSYNC_89,
-       GPIO_FN_MSIOF1_TXD_41,  GPIO_FN_MSIOF1_RXD_42,
-       GPIO_FN_MSIOF1_TXD_90,  GPIO_FN_MSIOF1_RXD_91,
-       GPIO_FN_MSIOF1_SS1_43,  GPIO_FN_MSIOF1_SS2_44,
-       GPIO_FN_MSIOF1_SS1_92,  GPIO_FN_MSIOF1_SS2_93,
-       GPIO_FN_MSIOF1_RSCK,    GPIO_FN_MSIOF1_RSYNC,
-       GPIO_FN_MSIOF1_MCK0,    GPIO_FN_MSIOF1_MCK1,
-
-       /*
-        * MSIOF2       (PORT 134, 135, 136, 137, 138, 139
-        *                    148, 149, 150, 151)
-        */
-       GPIO_FN_MSIOF2_RSCK,    GPIO_FN_MSIOF2_RSYNC,
-       GPIO_FN_MSIOF2_MCK0,    GPIO_FN_MSIOF2_MCK1,
-       GPIO_FN_MSIOF2_SS1,     GPIO_FN_MSIOF2_SS2,
-       GPIO_FN_MSIOF2_TSYNC,   GPIO_FN_MSIOF2_TSCK,
-       GPIO_FN_MSIOF2_RXD,     GPIO_FN_MSIOF2_TXD,
-
-       /* MSIOF3       (PORT 76, 77, 78, 79, 80, 81, 82, 83) */
-       GPIO_FN_BBIF1_RXD,      GPIO_FN_BBIF1_TSYNC,
-       GPIO_FN_BBIF1_TSCK,     GPIO_FN_BBIF1_TXD,
-       GPIO_FN_BBIF1_RSCK,     GPIO_FN_BBIF1_RSYNC,
-       GPIO_FN_BBIF1_FLOW,     GPIO_FN_BB_RX_FLOW_N,
-
-       /* MSIOF4       (PORT 0, 1, 2, 3) */
-       GPIO_FN_BBIF2_TSCK1,    GPIO_FN_BBIF2_TSYNC1,
-       GPIO_FN_BBIF2_TXD1,     GPIO_FN_BBIF2_RXD,
-
-       /* FSI          (PORT 4, 5, 6, 7, 8, 9, 10, 11, 15) */
-       GPIO_FN_FSIACK,         GPIO_FN_FSIBCK,
-       GPIO_FN_FSIAILR,        GPIO_FN_FSIAIBT,
-       GPIO_FN_FSIAISLD,       GPIO_FN_FSIAOMC,
-       GPIO_FN_FSIAOLR,        GPIO_FN_FSIAOBT,
-       GPIO_FN_FSIAOSLD,       GPIO_FN_FSIASPDIF_11,
-       GPIO_FN_FSIASPDIF_15,
-
-       /* FMSI         (PORT 12, 13, 14, 15, 16, 17, 18, 65) */
-       GPIO_FN_FMSOCK,         GPIO_FN_FMSOOLR,
-       GPIO_FN_FMSIOLR,        GPIO_FN_FMSOOBT,
-       GPIO_FN_FMSIOBT,        GPIO_FN_FMSOSLD,
-       GPIO_FN_FMSOILR,        GPIO_FN_FMSIILR,
-       GPIO_FN_FMSOIBT,        GPIO_FN_FMSIIBT,
-       GPIO_FN_FMSISLD,        GPIO_FN_FMSICK,
-
-       /* SCIFA0       (PORT 152, 153, 156, 157, 158) */
-       GPIO_FN_SCIFA0_TXD,     GPIO_FN_SCIFA0_RXD,
-       GPIO_FN_SCIFA0_SCK,     GPIO_FN_SCIFA0_RTS,
-       GPIO_FN_SCIFA0_CTS,
-
-       /* SCIFA1       (PORT 154, 155, 159, 160, 161) */
-       GPIO_FN_SCIFA1_TXD,     GPIO_FN_SCIFA1_RXD,
-       GPIO_FN_SCIFA1_SCK,     GPIO_FN_SCIFA1_RTS,
-       GPIO_FN_SCIFA1_CTS,
-
-       /* SCIFA2       (PORT 94, 95, 96, 97, 98) */
-       GPIO_FN_SCIFA2_CTS1,    GPIO_FN_SCIFA2_RTS1,
-       GPIO_FN_SCIFA2_TXD1,    GPIO_FN_SCIFA2_RXD1,
-       GPIO_FN_SCIFA2_SCK1,
-
-       /* SCIFA3       (PORT 43, 44,
-                            140, 141, 142, 143, 144) */
-       GPIO_FN_SCIFA3_CTS_43,  GPIO_FN_SCIFA3_CTS_140,
-       GPIO_FN_SCIFA3_RTS_44,  GPIO_FN_SCIFA3_RTS_141,
-       GPIO_FN_SCIFA3_SCK,     GPIO_FN_SCIFA3_TXD,
-       GPIO_FN_SCIFA3_RXD,
-
-       /* SCIFA4       (PORT 5, 6) */
-       GPIO_FN_SCIFA4_RXD,     GPIO_FN_SCIFA4_TXD,
-
-       /* SCIFA5       (PORT 8, 12) */
-       GPIO_FN_SCIFA5_RXD,     GPIO_FN_SCIFA5_TXD,
-
-       /* SCIFB        (PORT 162, 163, 164, 165, 166) */
-       GPIO_FN_SCIFB_SCK,      GPIO_FN_SCIFB_RTS,
-       GPIO_FN_SCIFB_CTS,      GPIO_FN_SCIFB_TXD,
-       GPIO_FN_SCIFB_RXD,
-
-       /*
-        * CEU          (PORT 16, 17,
-        *                    100, 101, 102, 103, 104, 105, 106, 107, 108, 109,
-        *                    110, 111, 112, 113, 114, 115, 116, 117, 118, 119,
-        *                    120)
-        */
-       GPIO_FN_VIO_HD,         GPIO_FN_VIO_CKO1,       GPIO_FN_VIO_CKO2,
-       GPIO_FN_VIO_VD,         GPIO_FN_VIO_CLK,        GPIO_FN_VIO_FIELD,
-       GPIO_FN_VIO_CKO,
-       GPIO_FN_VIO_D0,         GPIO_FN_VIO_D1,         GPIO_FN_VIO_D2,
-       GPIO_FN_VIO_D3,         GPIO_FN_VIO_D4,         GPIO_FN_VIO_D5,
-       GPIO_FN_VIO_D6,         GPIO_FN_VIO_D7,         GPIO_FN_VIO_D8,
-       GPIO_FN_VIO_D9,         GPIO_FN_VIO_D10,        GPIO_FN_VIO_D11,
-       GPIO_FN_VIO_D12,        GPIO_FN_VIO_D13,        GPIO_FN_VIO_D14,
-       GPIO_FN_VIO_D15,
-
-       /* USB0         (PORT 113, 114, 115, 116, 117, 167) */
-       GPIO_FN_IDIN_0,         GPIO_FN_EXTLP_0,
-       GPIO_FN_OVCN2_0,        GPIO_FN_PWEN_0,
-       GPIO_FN_OVCN_0,         GPIO_FN_VBUS0_0,
-
-       /* USB1         (PORT 18, 113, 114, 115, 116, 117, 138, 162, 168) */
-       GPIO_FN_IDIN_1_18,      GPIO_FN_IDIN_1_113,
-       GPIO_FN_PWEN_1_115,     GPIO_FN_PWEN_1_138,
-       GPIO_FN_OVCN_1_114,     GPIO_FN_OVCN_1_162,
-       GPIO_FN_EXTLP_1,        GPIO_FN_OVCN2_1,
-       GPIO_FN_VBUS0_1,
-
-       /* GPIO         (PORT 41, 42, 43, 44) */
-       GPIO_FN_GPI0,   GPIO_FN_GPI1,   GPIO_FN_GPO0,   GPIO_FN_GPO1,
-
-       /*
-        * BSC          (PORT 19,
-        *                    20, 21, 22, 25, 26, 27, 28, 29,
-        *                    30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
-        *                    40, 41, 42, 43, 44, 45,
-        *                    62, 63, 64, 65, 66, 67,
-        *                    71, 72, 74, 75)
-        */
-       GPIO_FN_BS,     GPIO_FN_WE1,
-       GPIO_FN_CKO,    GPIO_FN_WAIT,   GPIO_FN_RDWR,
-
-       GPIO_FN_A0,     GPIO_FN_A1,     GPIO_FN_A2,     GPIO_FN_A3,
-       GPIO_FN_A6,     GPIO_FN_A7,     GPIO_FN_A8,     GPIO_FN_A9,
-       GPIO_FN_A10,    GPIO_FN_A11,    GPIO_FN_A12,    GPIO_FN_A13,
-       GPIO_FN_A14,    GPIO_FN_A15,    GPIO_FN_A16,    GPIO_FN_A17,
-       GPIO_FN_A18,    GPIO_FN_A19,    GPIO_FN_A20,    GPIO_FN_A21,
-       GPIO_FN_A22,    GPIO_FN_A23,    GPIO_FN_A24,    GPIO_FN_A25,
-       GPIO_FN_A26,
-
-       GPIO_FN_CS0,    GPIO_FN_CS2,    GPIO_FN_CS4,
-       GPIO_FN_CS5A,   GPIO_FN_CS5B,   GPIO_FN_CS6A,
-
-       /*
-        * BSC/FLCTL            (PORT 23, 24,
-        *                            46, 47, 48, 49,
-        *                            50, 51, 52, 53, 54, 55, 56, 57, 58, 59,
-        *                            60, 61, 69, 70)
-        */
-       GPIO_FN_RD_FSC,         GPIO_FN_WE0_FWE,
-       GPIO_FN_A4_FOE,         GPIO_FN_A5_FCDE,
-       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,
-
-       /* SPU2         (PORT 65) */
-       GPIO_FN_VINT_I,
-
-       /* FLCTL        (PORT 66, 68, 73) */
-       GPIO_FN_FCE1,   GPIO_FN_FCE0,   GPIO_FN_FRB,
-
-       /* HSI          (PORT 76, 77, 78, 79, 80, 81, 82, 83) */
-       GPIO_FN_GP_RX_FLAG,     GPIO_FN_GP_RX_DATA,     GPIO_FN_GP_TX_READY,
-       GPIO_FN_GP_RX_WAKE,     GPIO_FN_MP_TX_FLAG,     GPIO_FN_MP_TX_DATA,
-       GPIO_FN_MP_RX_READY,    GPIO_FN_MP_TX_WAKE,
-
-       /*
-        * MFI          (PORT 76, 77, 78, 79,
-        *                    80, 81, 82, 83, 84, 85, 86, 87, 88, 89,
-        *                    90, 91, 92, 93, 94, 95, 96, 97, 98, 99)
-        */
-       GPIO_FN_MFIv6,  /* see MSEL4CR 6 */
-       GPIO_FN_MFIv4,  /* see MSEL4CR 6 */
-
-       GPIO_FN_MEMC_CS0,               GPIO_FN_MEMC_BUSCLK_MEMC_A0,
-       GPIO_FN_MEMC_CS1_MEMC_A1,       GPIO_FN_MEMC_ADV_MEMC_DREQ0,
-       GPIO_FN_MEMC_WAIT_MEMC_DREQ1,   GPIO_FN_MEMC_NOE,
-       GPIO_FN_MEMC_NWE,               GPIO_FN_MEMC_INT,
-
-       GPIO_FN_MEMC_AD0,       GPIO_FN_MEMC_AD1,       GPIO_FN_MEMC_AD2,
-       GPIO_FN_MEMC_AD3,       GPIO_FN_MEMC_AD4,       GPIO_FN_MEMC_AD5,
-       GPIO_FN_MEMC_AD6,       GPIO_FN_MEMC_AD7,       GPIO_FN_MEMC_AD8,
-       GPIO_FN_MEMC_AD9,       GPIO_FN_MEMC_AD10,      GPIO_FN_MEMC_AD11,
-       GPIO_FN_MEMC_AD12,      GPIO_FN_MEMC_AD13,      GPIO_FN_MEMC_AD14,
-       GPIO_FN_MEMC_AD15,
-
-       /* SIM          (PORT 94, 95, 98) */
-       GPIO_FN_SIM_RST,        GPIO_FN_SIM_CLK,        GPIO_FN_SIM_D,
-
-       /* TPU          (PORT 93, 99, 112, 160, 161) */
-       GPIO_FN_TPU0TO0,        GPIO_FN_TPU0TO1,
-       GPIO_FN_TPU0TO2_93,     GPIO_FN_TPU0TO2_99,
-       GPIO_FN_TPU0TO3,
-
-       /* I2C2         (PORT 110, 111) */
-       GPIO_FN_I2C_SCL2,       GPIO_FN_I2C_SDA2,
-
-       /* I2C3(1)      (PORT 114, 115) */
-       GPIO_FN_I2C_SCL3,       GPIO_FN_I2C_SDA3,
-
-       /* I2C3(2)      (PORT 137, 145) */
-       GPIO_FN_I2C_SCL3S,      GPIO_FN_I2C_SDA3S,
-
-       /* I2C4(2)      (PORT 116, 117) */
-       GPIO_FN_I2C_SCL4,       GPIO_FN_I2C_SDA4,
-
-       /* I2C4(2)      (PORT 146, 147) */
-       GPIO_FN_I2C_SCL4S,      GPIO_FN_I2C_SDA4S,
-
-       /*
-        * KEYSC        (PORT 121, 122, 123, 124, 125, 126, 127, 128, 129,
-        *                    130, 131, 132, 133, 134, 135, 136)
-        */
-       GPIO_FN_KEYOUT0,        GPIO_FN_KEYIN0_121,     GPIO_FN_KEYIN0_136,
-       GPIO_FN_KEYOUT1,        GPIO_FN_KEYIN1_122,     GPIO_FN_KEYIN1_135,
-       GPIO_FN_KEYOUT2,        GPIO_FN_KEYIN2_123,     GPIO_FN_KEYIN2_134,
-       GPIO_FN_KEYOUT3,        GPIO_FN_KEYIN3_124,     GPIO_FN_KEYIN3_133,
-       GPIO_FN_KEYOUT4,        GPIO_FN_KEYIN4,
-       GPIO_FN_KEYOUT5,        GPIO_FN_KEYIN5,
-       GPIO_FN_KEYOUT6,        GPIO_FN_KEYIN6,
-       GPIO_FN_KEYOUT7,        GPIO_FN_KEYIN7,
-
-       /*
-        * LCDC         (PORT      121, 122, 123, 124, 125, 126, 127, 128, 129,
-        *                    130, 131, 132, 133, 134, 135, 136, 137, 138, 139,
-        *                    140, 141, 142, 143, 144, 145, 146, 147, 148, 149,
-        *                    150, 151)
-        */
-       GPIO_FN_LCDC0_SELECT, /* LCDC 0 */
-       GPIO_FN_LCDC1_SELECT, /* LCDC 1 */
-       GPIO_FN_LCDHSYN,        GPIO_FN_LCDCS,  GPIO_FN_LCDVSYN,
-       GPIO_FN_LCDDCK,         GPIO_FN_LCDWR,  GPIO_FN_LCDRD,
-       GPIO_FN_LCDDISP,        GPIO_FN_LCDRS,  GPIO_FN_LCDLCLK,
-       GPIO_FN_LCDDON,
-
-       GPIO_FN_LCDD0,  GPIO_FN_LCDD1,  GPIO_FN_LCDD2,  GPIO_FN_LCDD3,
-       GPIO_FN_LCDD4,  GPIO_FN_LCDD5,  GPIO_FN_LCDD6,  GPIO_FN_LCDD7,
-       GPIO_FN_LCDD8,  GPIO_FN_LCDD9,  GPIO_FN_LCDD10, GPIO_FN_LCDD11,
-       GPIO_FN_LCDD12, GPIO_FN_LCDD13, GPIO_FN_LCDD14, GPIO_FN_LCDD15,
-       GPIO_FN_LCDD16, GPIO_FN_LCDD17, GPIO_FN_LCDD18, GPIO_FN_LCDD19,
-       GPIO_FN_LCDD20, GPIO_FN_LCDD21, GPIO_FN_LCDD22, GPIO_FN_LCDD23,
-
-       /* IRDA         (PORT 139, 140, 141, 142) */
-       GPIO_FN_IRDA_OUT,       GPIO_FN_IRDA_IN,        GPIO_FN_IRDA_FIRSEL,
-       GPIO_FN_IROUT_139,      GPIO_FN_IROUT_140,
-
-       /* TSIF1        (PORT 156, 157, 158, 159) */
-       GPIO_FN_TS0_1SELECT, /* TSIF0 - 1 select */
-       GPIO_FN_TS0_2SELECT, /* TSIF0 - 2 select */
-       GPIO_FN_TS1_1SELECT, /* TSIF1 - 1 select */
-       GPIO_FN_TS1_2SELECT, /* TSIF1 - 2 select */
-
-       GPIO_FN_TS_SPSYNC1,     GPIO_FN_TS_SDAT1,
-       GPIO_FN_TS_SDEN1,       GPIO_FN_TS_SCK1,
-
-       /* TSIF2        (PORT 137, 145, 146, 147) */
-       GPIO_FN_TS_SPSYNC2,     GPIO_FN_TS_SDAT2,
-       GPIO_FN_TS_SDEN2,       GPIO_FN_TS_SCK2,
-
-       /* HDMI         (PORT 169, 170) */
-       GPIO_FN_HDMI_HPD,       GPIO_FN_HDMI_CEC,
-
-       /* SDENC        see MSEL4CR 19 */
-       GPIO_FN_SDENC_CPG,
-       GPIO_FN_SDENC_DV_CLKI,
-};
-
 /* DMA slave IDs */
 enum {
        SHDMA_SLAVE_INVALID,
index 326a4ab0bd5f8ea0f6ba64f6a202ce60d9a66b40..3a6b6fe7b6c098bed8ecd22101e137fb7d568ceb 100644 (file)
@@ -70,29 +70,15 @@ void __init r8a7740_map_io(void)
 }
 
 /* PFC */
-static struct resource r8a7740_pfc_resources[] = {
-       [0] = {
-               .start  = 0xe6050000,
-               .end    = 0xe6057fff,
-               .flags  = IORESOURCE_MEM,
-       },
-       [1] = {
-               .start  = 0xe605800c,
-               .end    = 0xe605802b,
-               .flags  = IORESOURCE_MEM,
-       }
-};
-
-static struct platform_device r8a7740_pfc_device = {
-       .name           = "pfc-r8a7740",
-       .id             = -1,
-       .resource       = r8a7740_pfc_resources,
-       .num_resources  = ARRAY_SIZE(r8a7740_pfc_resources),
+static const struct resource pfc_resources[] = {
+       DEFINE_RES_MEM(0xe6050000, 0x8000),
+       DEFINE_RES_MEM(0xe605800c, 0x0020),
 };
 
 void __init r8a7740_pinmux_init(void)
 {
-       platform_device_register(&r8a7740_pfc_device);
+       platform_device_register_simple("pfc-r8a7740", -1, pfc_resources,
+                                       ARRAY_SIZE(pfc_resources));
 }
 
 static struct renesas_intc_irqpin_config irqpin0_platform_data = {
index 30b4a336308febb035259e7bc475a26627bd3712..80c20392ad7ce6c9711d83d006f2cc6e7c776a62 100644 (file)
 #include <linux/irqchip/arm-gic.h>
 #include <linux/of.h>
 #include <linux/of_platform.h>
+#include <linux/platform_data/gpio-rcar.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 <linux/pm_runtime.h>
+#include <linux/usb/phy.h>
+#include <linux/usb/hcd.h>
+#include <linux/usb/ehci_pdriver.h>
+#include <linux/usb/ohci_pdriver.h>
+#include <linux/dma-mapping.h>
 #include <mach/irqs.h>
 #include <mach/r8a7778.h>
 #include <mach/common.h>
@@ -80,12 +87,6 @@ static struct sh_timer_config sh_tmu1_platform_data = {
        .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,           \
@@ -94,6 +95,244 @@ static struct resource ether_resources[] = {
                &sh_tmu##idx##_platform_data,           \
                sizeof(sh_tmu##idx##_platform_data))
 
+/* USB PHY */
+static struct resource usb_phy_resources[] __initdata = {
+       DEFINE_RES_MEM(0xffe70800, 0x100),
+       DEFINE_RES_MEM(0xffe76000, 0x100),
+};
+
+void __init r8a7778_add_usb_phy_device(struct rcar_phy_platform_data *pdata)
+{
+       platform_device_register_resndata(&platform_bus, "rcar_usb_phy", -1,
+                                         usb_phy_resources,
+                                         ARRAY_SIZE(usb_phy_resources),
+                                         pdata, sizeof(*pdata));
+}
+
+/* USB */
+static struct usb_phy *phy;
+
+static int usb_power_on(struct platform_device *pdev)
+{
+       if (IS_ERR(phy))
+               return PTR_ERR(phy);
+
+       pm_runtime_enable(&pdev->dev);
+       pm_runtime_get_sync(&pdev->dev);
+
+       usb_phy_init(phy);
+
+       return 0;
+}
+
+static void usb_power_off(struct platform_device *pdev)
+{
+       if (IS_ERR(phy))
+               return;
+
+       usb_phy_shutdown(phy);
+
+       pm_runtime_put_sync(&pdev->dev);
+       pm_runtime_disable(&pdev->dev);
+}
+
+static int ehci_init_internal_buffer(struct usb_hcd *hcd)
+{
+       /*
+        * Below are recommended values from the datasheet;
+        * see [USB :: Setting of EHCI Internal Buffer].
+        */
+       /* EHCI IP internal buffer setting */
+       iowrite32(0x00ff0040, hcd->regs + 0x0094);
+       /* EHCI IP internal buffer enable */
+       iowrite32(0x00000001, hcd->regs + 0x009C);
+
+       return 0;
+}
+
+static struct usb_ehci_pdata ehci_pdata __initdata = {
+       .power_on       = usb_power_on,
+       .power_off      = usb_power_off,
+       .power_suspend  = usb_power_off,
+       .pre_setup      = ehci_init_internal_buffer,
+};
+
+static struct resource ehci_resources[] __initdata = {
+       DEFINE_RES_MEM(0xffe70000, 0x400),
+       DEFINE_RES_IRQ(gic_iid(0x4c)),
+};
+
+static struct usb_ohci_pdata ohci_pdata __initdata = {
+       .power_on       = usb_power_on,
+       .power_off      = usb_power_off,
+       .power_suspend  = usb_power_off,
+};
+
+static struct resource ohci_resources[] __initdata = {
+       DEFINE_RES_MEM(0xffe70400, 0x400),
+       DEFINE_RES_IRQ(gic_iid(0x4c)),
+};
+
+#define USB_PLATFORM_INFO(hci)                                 \
+static struct platform_device_info hci##_info __initdata = {   \
+       .parent         = &platform_bus,                        \
+       .name           = #hci "-platform",                     \
+       .id             = -1,                                   \
+       .res            = hci##_resources,                      \
+       .num_res        = ARRAY_SIZE(hci##_resources),          \
+       .data           = &hci##_pdata,                         \
+       .size_data      = sizeof(hci##_pdata),                  \
+       .dma_mask       = DMA_BIT_MASK(32),                     \
+}
+
+USB_PLATFORM_INFO(ehci);
+USB_PLATFORM_INFO(ohci);
+
+/* Ether */
+static struct resource ether_resources[] = {
+       DEFINE_RES_MEM(0xfde00000, 0x400),
+       DEFINE_RES_IRQ(gic_iid(0x89)),
+};
+
+void __init r8a7778_add_ether_device(struct sh_eth_plat_data *pdata)
+{
+       platform_device_register_resndata(&platform_bus, "r8a777x-ether", -1,
+                                         ether_resources,
+                                         ARRAY_SIZE(ether_resources),
+                                         pdata, sizeof(*pdata));
+}
+
+/* PFC/GPIO */
+static struct resource pfc_resources[] = {
+       DEFINE_RES_MEM(0xfffc0000, 0x118),
+};
+
+#define R8A7778_GPIO(idx)                                              \
+static struct resource r8a7778_gpio##idx##_resources[] = {             \
+       DEFINE_RES_MEM(0xffc40000 + 0x1000 * (idx), 0x30),              \
+       DEFINE_RES_IRQ(gic_iid(0x87)),                                  \
+};                                                                     \
+                                                                       \
+static struct gpio_rcar_config r8a7778_gpio##idx##_platform_data = {   \
+       .gpio_base      = 32 * (idx),                                   \
+       .irq_base       = GPIO_IRQ_BASE(idx),                           \
+       .number_of_pins = 32,                                           \
+       .pctl_name      = "pfc-r8a7778",                                \
+}
+
+R8A7778_GPIO(0);
+R8A7778_GPIO(1);
+R8A7778_GPIO(2);
+R8A7778_GPIO(3);
+R8A7778_GPIO(4);
+
+#define r8a7778_register_gpio(idx)                             \
+       platform_device_register_resndata(                      \
+               &platform_bus, "gpio_rcar", idx,                \
+               r8a7778_gpio##idx##_resources,                  \
+               ARRAY_SIZE(r8a7778_gpio##idx##_resources),      \
+               &r8a7778_gpio##idx##_platform_data,             \
+               sizeof(r8a7778_gpio##idx##_platform_data))
+
+void __init r8a7778_pinmux_init(void)
+{
+       platform_device_register_simple(
+               "pfc-r8a7778", -1,
+               pfc_resources,
+               ARRAY_SIZE(pfc_resources));
+
+       r8a7778_register_gpio(0);
+       r8a7778_register_gpio(1);
+       r8a7778_register_gpio(2);
+       r8a7778_register_gpio(3);
+       r8a7778_register_gpio(4);
+};
+
+/* SDHI */
+static struct resource sdhi_resources[] = {
+       /* SDHI0 */
+       DEFINE_RES_MEM(0xFFE4C000, 0x100),
+       DEFINE_RES_IRQ(gic_iid(0x77)),
+       /* SDHI1 */
+       DEFINE_RES_MEM(0xFFE4D000, 0x100),
+       DEFINE_RES_IRQ(gic_iid(0x78)),
+       /* SDHI2 */
+       DEFINE_RES_MEM(0xFFE4F000, 0x100),
+       DEFINE_RES_IRQ(gic_iid(0x76)),
+};
+
+void __init r8a7778_sdhi_init(int id,
+                             struct sh_mobile_sdhi_info *info)
+{
+       BUG_ON(id < 0 || id > 2);
+
+       platform_device_register_resndata(
+               &platform_bus, "sh_mobile_sdhi", id,
+               sdhi_resources + (2 * id), 2,
+               info, sizeof(*info));
+}
+
+/* I2C */
+static struct resource i2c_resources[] __initdata = {
+       /* I2C0 */
+       DEFINE_RES_MEM(0xffc70000, 0x1000),
+       DEFINE_RES_IRQ(gic_iid(0x63)),
+       /* I2C1 */
+       DEFINE_RES_MEM(0xffc71000, 0x1000),
+       DEFINE_RES_IRQ(gic_iid(0x6e)),
+       /* I2C2 */
+       DEFINE_RES_MEM(0xffc72000, 0x1000),
+       DEFINE_RES_IRQ(gic_iid(0x6c)),
+       /* I2C3 */
+       DEFINE_RES_MEM(0xffc73000, 0x1000),
+       DEFINE_RES_IRQ(gic_iid(0x6d)),
+};
+
+void __init r8a7778_add_i2c_device(int id)
+{
+       BUG_ON(id < 0 || id > 3);
+
+       platform_device_register_simple(
+               "i2c-rcar", id,
+               i2c_resources + (2 * id), 2);
+}
+
+/* HSPI */
+static struct resource hspi_resources[] __initdata = {
+       /* HSPI0 */
+       DEFINE_RES_MEM(0xfffc7000, 0x18),
+       DEFINE_RES_IRQ(gic_iid(0x5f)),
+       /* HSPI1 */
+       DEFINE_RES_MEM(0xfffc8000, 0x18),
+       DEFINE_RES_IRQ(gic_iid(0x74)),
+       /* HSPI2 */
+       DEFINE_RES_MEM(0xfffc6000, 0x18),
+       DEFINE_RES_IRQ(gic_iid(0x75)),
+};
+
+void __init r8a7778_add_hspi_device(int id)
+{
+       BUG_ON(id < 0 || id > 2);
+
+       platform_device_register_simple(
+               "sh-hspi", id,
+               hspi_resources + (2 * id), 2);
+}
+
+/* MMC */
+static struct resource mmc_resources[] __initdata = {
+       DEFINE_RES_MEM(0xffe4e000, 0x100),
+       DEFINE_RES_IRQ(gic_iid(0x5d)),
+};
+
+void __init r8a7778_add_mmc_device(struct sh_mmcif_plat_data *info)
+{
+       platform_device_register_resndata(
+               &platform_bus, "sh_mmcif", -1,
+               mmc_resources, ARRAY_SIZE(mmc_resources),
+               info, sizeof(*info));
+}
+
 void __init r8a7778_add_standard_devices(void)
 {
        int i;
@@ -118,12 +357,12 @@ void __init r8a7778_add_standard_devices(void)
        r8a7778_register_tmu(1);
 }
 
-void __init r8a7778_add_ether_device(struct sh_eth_plat_data *pdata)
+void __init r8a7778_init_late(void)
 {
-       platform_device_register_resndata(&platform_bus, "sh_eth", -1,
-                                         ether_resources,
-                                         ARRAY_SIZE(ether_resources),
-                                         pdata, sizeof(*pdata));
+       phy = usb_get_phy(USB_PHY_TYPE_USB2);
+
+       platform_device_register_full(&ehci_info);
+       platform_device_register_full(&ohci_info);
 }
 
 static struct renesas_intc_irqpin_config irqpin_platform_data = {
@@ -239,6 +478,7 @@ DT_MACHINE_START(R8A7778_DT, "Generic R8A7778 (Flattened Device Tree)")
        .init_machine   = r8a7778_add_standard_devices_dt,
        .init_time      = shmobile_timer_init,
        .dt_compat      = r8a7778_compat_dt,
+       .init_late      = r8a7778_init_late,
 MACHINE_END
 
 #endif /* CONFIG_USE_OF */
index b0b394842ea5011b31b678a8b53b012cea2580ba..398687761f504046a5567c5d2ac58f4e8076a528 100644 (file)
 #include <linux/sh_intc.h>
 #include <linux/sh_timer.h>
 #include <linux/dma-mapping.h>
+#include <linux/usb/otg.h>
+#include <linux/usb/hcd.h>
+#include <linux/usb/ehci_pdriver.h>
+#include <linux/usb/ohci_pdriver.h>
+#include <linux/pm_runtime.h>
 #include <mach/hardware.h>
 #include <mach/irqs.h>
 #include <mach/r8a7779.h>
@@ -65,11 +70,7 @@ void __init r8a7779_map_io(void)
 }
 
 static struct resource r8a7779_pfc_resources[] = {
-       [0] = {
-               .start  = 0xfffc0000,
-               .end    = 0xfffc023b,
-               .flags  = IORESOURCE_MEM,
-       },
+       DEFINE_RES_MEM(0xfffc0000, 0x023c),
 };
 
 static struct platform_device r8a7779_pfc_device = {
@@ -81,15 +82,8 @@ static struct platform_device r8a7779_pfc_device = {
 
 #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,                               \
-       }                                                               \
+       DEFINE_RES_MEM(0xffc40000 + (0x1000 * (idx)), 0x002c),          \
+       DEFINE_RES_IRQ(gic_iid(0xad + (idx))),                          \
 };                                                                     \
                                                                        \
 static struct gpio_rcar_config r8a7779_gpio##idx##_platform_data = {   \
@@ -394,6 +388,165 @@ static struct platform_device sata_device = {
        },
 };
 
+/* USB PHY */
+static struct resource usb_phy_resources[] __initdata = {
+       [0] = {
+               .start          = 0xffe70800,
+               .end            = 0xffe70900 - 1,
+               .flags          = IORESOURCE_MEM,
+       },
+};
+
+/* USB */
+static struct usb_phy *phy;
+
+static int usb_power_on(struct platform_device *pdev)
+{
+       if (IS_ERR(phy))
+               return PTR_ERR(phy);
+
+       pm_runtime_enable(&pdev->dev);
+       pm_runtime_get_sync(&pdev->dev);
+
+       usb_phy_init(phy);
+
+       return 0;
+}
+
+static void usb_power_off(struct platform_device *pdev)
+{
+       if (IS_ERR(phy))
+               return;
+
+       usb_phy_shutdown(phy);
+
+       pm_runtime_put_sync(&pdev->dev);
+       pm_runtime_disable(&pdev->dev);
+}
+
+static int ehci_init_internal_buffer(struct usb_hcd *hcd)
+{
+       /*
+        * Below are recommended values from the datasheet;
+        * see [USB :: Setting of EHCI Internal Buffer].
+        */
+       /* EHCI IP internal buffer setting */
+       iowrite32(0x00ff0040, hcd->regs + 0x0094);
+       /* EHCI IP internal buffer enable */
+       iowrite32(0x00000001, hcd->regs + 0x009C);
+
+       return 0;
+}
+
+static struct usb_ehci_pdata ehcix_pdata = {
+       .power_on       = usb_power_on,
+       .power_off      = usb_power_off,
+       .power_suspend  = usb_power_off,
+       .pre_setup      = ehci_init_internal_buffer,
+};
+
+static struct resource ehci0_resources[] = {
+       [0] = {
+               .start  = 0xffe70000,
+               .end    = 0xffe70400 - 1,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start  = gic_iid(0x4c),
+               .flags  = IORESOURCE_IRQ,
+       },
+};
+
+static struct platform_device ehci0_device = {
+       .name   = "ehci-platform",
+       .id     = 0,
+       .dev    = {
+               .dma_mask               = &ehci0_device.dev.coherent_dma_mask,
+               .coherent_dma_mask      = 0xffffffff,
+               .platform_data          = &ehcix_pdata,
+       },
+       .num_resources  = ARRAY_SIZE(ehci0_resources),
+       .resource       = ehci0_resources,
+};
+
+static struct resource ehci1_resources[] = {
+       [0] = {
+               .start  = 0xfff70000,
+               .end    = 0xfff70400 - 1,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start  = gic_iid(0x4d),
+               .flags  = IORESOURCE_IRQ,
+       },
+};
+
+static struct platform_device ehci1_device = {
+       .name   = "ehci-platform",
+       .id     = 1,
+       .dev    = {
+               .dma_mask               = &ehci1_device.dev.coherent_dma_mask,
+               .coherent_dma_mask      = 0xffffffff,
+               .platform_data          = &ehcix_pdata,
+       },
+       .num_resources  = ARRAY_SIZE(ehci1_resources),
+       .resource       = ehci1_resources,
+};
+
+static struct usb_ohci_pdata ohcix_pdata = {
+       .power_on       = usb_power_on,
+       .power_off      = usb_power_off,
+       .power_suspend  = usb_power_off,
+};
+
+static struct resource ohci0_resources[] = {
+       [0] = {
+               .start  = 0xffe70400,
+               .end    = 0xffe70800 - 1,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start  = gic_iid(0x4c),
+               .flags  = IORESOURCE_IRQ,
+       },
+};
+
+static struct platform_device ohci0_device = {
+       .name   = "ohci-platform",
+       .id     = 0,
+       .dev    = {
+               .dma_mask               = &ohci0_device.dev.coherent_dma_mask,
+               .coherent_dma_mask      = 0xffffffff,
+               .platform_data          = &ohcix_pdata,
+       },
+       .num_resources  = ARRAY_SIZE(ohci0_resources),
+       .resource       = ohci0_resources,
+};
+
+static struct resource ohci1_resources[] = {
+       [0] = {
+               .start  = 0xfff70400,
+               .end    = 0xfff70800 - 1,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start  = gic_iid(0x4d),
+               .flags  = IORESOURCE_IRQ,
+       },
+};
+
+static struct platform_device ohci1_device = {
+       .name   = "ohci-platform",
+       .id     = 1,
+       .dev    = {
+               .dma_mask               = &ohci1_device.dev.coherent_dma_mask,
+               .coherent_dma_mask      = 0xffffffff,
+               .platform_data          = &ohcix_pdata,
+       },
+       .num_resources  = ARRAY_SIZE(ohci1_resources),
+       .resource       = ohci1_resources,
+};
+
 /* Ether */
 static struct resource ether_resources[] = {
        {
@@ -417,7 +570,7 @@ static struct platform_device *r8a7779_devices_dt[] __initdata = {
        &tmu01_device,
 };
 
-static struct platform_device *r8a7779_late_devices[] __initdata = {
+static struct platform_device *r8a7779_standard_devices[] __initdata = {
        &i2c0_device,
        &i2c1_device,
        &i2c2_device,
@@ -437,18 +590,26 @@ void __init r8a7779_add_standard_devices(void)
 
        platform_add_devices(r8a7779_devices_dt,
                            ARRAY_SIZE(r8a7779_devices_dt));
-       platform_add_devices(r8a7779_late_devices,
-                           ARRAY_SIZE(r8a7779_late_devices));
+       platform_add_devices(r8a7779_standard_devices,
+                           ARRAY_SIZE(r8a7779_standard_devices));
 }
 
 void __init r8a7779_add_ether_device(struct sh_eth_plat_data *pdata)
 {
-       platform_device_register_resndata(&platform_bus, "sh_eth", -1,
+       platform_device_register_resndata(&platform_bus, "r8a777x-ether", -1,
                                          ether_resources,
                                          ARRAY_SIZE(ether_resources),
                                          pdata, sizeof(*pdata));
 }
 
+void __init r8a7779_add_usb_phy_device(struct rcar_phy_platform_data *pdata)
+{
+       platform_device_register_resndata(&platform_bus, "rcar_usb_phy", -1,
+                                         usb_phy_resources,
+                                         ARRAY_SIZE(usb_phy_resources),
+                                         pdata, sizeof(*pdata));
+}
+
 /* do nothing for !CONFIG_SMP or !CONFIG_HAVE_TWD */
 void __init __weak r8a7779_register_twd(void) { }
 
@@ -481,6 +642,23 @@ void __init r8a7779_add_early_devices(void)
         */
 }
 
+static struct platform_device *r8a7779_late_devices[] __initdata = {
+       &ehci0_device,
+       &ehci1_device,
+       &ohci0_device,
+       &ohci1_device,
+};
+
+void __init r8a7779_init_late(void)
+{
+       /* get USB PHY */
+       phy = usb_get_phy(USB_PHY_TYPE_USB2);
+
+       shmobile_init_late();
+       platform_add_devices(r8a7779_late_devices,
+                            ARRAY_SIZE(r8a7779_late_devices));
+}
+
 #ifdef CONFIG_USE_OF
 void __init r8a7779_init_delay(void)
 {
@@ -514,6 +692,7 @@ DT_MACHINE_START(R8A7779_DT, "Generic R8A7779 (Flattened Device Tree)")
        .init_irq       = r8a7779_init_irq_dt,
        .init_machine   = r8a7779_add_standard_devices_dt,
        .init_time      = shmobile_timer_init,
+       .init_late      = r8a7779_init_late,
        .dt_compat      = r8a7779_compat_dt,
 MACHINE_END
 #endif /* CONFIG_USE_OF */
index 49de2d56f86db50bc18e66dd17ebb5bed986e812..b461d93431ed4e29a500e41749e6ca3698090f5f 100644 (file)
@@ -23,6 +23,7 @@
 #include <linux/kernel.h>
 #include <linux/of_platform.h>
 #include <linux/serial_sci.h>
+#include <linux/platform_data/gpio-rcar.h>
 #include <linux/platform_data/irq-renesas-irqc.h>
 #include <mach/common.h>
 #include <mach/irqs.h>
 
 static const struct resource pfc_resources[] = {
        DEFINE_RES_MEM(0xe6060000, 0x250),
-       DEFINE_RES_MEM(0xe6050000, 0x5050),
 };
 
+#define R8A7790_GPIO(idx)                                              \
+static struct resource r8a7790_gpio##idx##_resources[] = {             \
+       DEFINE_RES_MEM(0xe6050000 + 0x1000 * (idx), 0x50),              \
+       DEFINE_RES_IRQ(gic_spi(4 + (idx))),                             \
+};                                                                     \
+                                                                       \
+static struct gpio_rcar_config r8a7790_gpio##idx##_platform_data = {   \
+       .gpio_base      = 32 * (idx),                                   \
+       .irq_base       = 0,                                            \
+       .number_of_pins = 32,                                           \
+       .pctl_name      = "pfc-r8a7790",                                \
+       .has_both_edge_trigger = 1,                                     \
+};                                                                     \
+
+R8A7790_GPIO(0);
+R8A7790_GPIO(1);
+R8A7790_GPIO(2);
+R8A7790_GPIO(3);
+R8A7790_GPIO(4);
+R8A7790_GPIO(5);
+
+#define r8a7790_register_gpio(idx)                                     \
+       platform_device_register_resndata(&platform_bus, "gpio_rcar", idx, \
+               r8a7790_gpio##idx##_resources,                          \
+               ARRAY_SIZE(r8a7790_gpio##idx##_resources),              \
+               &r8a7790_gpio##idx##_platform_data,                     \
+               sizeof(r8a7790_gpio##idx##_platform_data))
+
 void __init r8a7790_pinmux_init(void)
 {
        platform_device_register_simple("pfc-r8a7790", -1, pfc_resources,
                                        ARRAY_SIZE(pfc_resources));
+       r8a7790_register_gpio(0);
+       r8a7790_register_gpio(1);
+       r8a7790_register_gpio(2);
+       r8a7790_register_gpio(3);
+       r8a7790_register_gpio(4);
+       r8a7790_register_gpio(5);
 }
 
 #define SCIF_COMMON(scif_type, baseaddr, irq)                  \
index 9696f36468643956c37466a0e77d5de5292b2e5f..96e7ca1e4e117877a7071c00ad08513675667095 100644 (file)
@@ -288,12 +288,7 @@ static struct sh_timer_config tmu00_platform_data = {
 };
 
 static struct resource tmu00_resources[] = {
-       [0] = {
-               .name   = "TMU00",
-               .start  = 0xfff60008,
-               .end    = 0xfff60013,
-               .flags  = IORESOURCE_MEM,
-       },
+       [0] = DEFINE_RES_MEM_NAMED(0xfff60008, 0xc, "TMU00"),
        [1] = {
                .start  = intcs_evt2irq(0x0e80), /* TMU0_TUNI00 */
                .flags  = IORESOURCE_IRQ,
@@ -318,12 +313,7 @@ static struct sh_timer_config tmu01_platform_data = {
 };
 
 static struct resource tmu01_resources[] = {
-       [0] = {
-               .name   = "TMU01",
-               .start  = 0xfff60014,
-               .end    = 0xfff6001f,
-               .flags  = IORESOURCE_MEM,
-       },
+       [0] = DEFINE_RES_MEM_NAMED(0xfff60014, 0xc, "TMU00"),
        [1] = {
                .start  = intcs_evt2irq(0x0ea0), /* TMU0_TUNI01 */
                .flags  = IORESOURCE_IRQ,
@@ -341,12 +331,7 @@ static struct platform_device tmu01_device = {
 };
 
 static struct resource i2c0_resources[] = {
-       [0] = {
-               .name   = "IIC0",
-               .start  = 0xe6820000,
-               .end    = 0xe6820425 - 1,
-               .flags  = IORESOURCE_MEM,
-       },
+       [0] = DEFINE_RES_MEM_NAMED(0xe6820000, 0x426, "IIC0"),
        [1] = {
                .start  = gic_spi(167),
                .end    = gic_spi(170),
@@ -355,12 +340,7 @@ static struct resource i2c0_resources[] = {
 };
 
 static struct resource i2c1_resources[] = {
-       [0] = {
-               .name   = "IIC1",
-               .start  = 0xe6822000,
-               .end    = 0xe6822425 - 1,
-               .flags  = IORESOURCE_MEM,
-       },
+       [0] = DEFINE_RES_MEM_NAMED(0xe6822000, 0x426, "IIC1"),
        [1] = {
                .start  = gic_spi(51),
                .end    = gic_spi(54),
@@ -369,12 +349,7 @@ static struct resource i2c1_resources[] = {
 };
 
 static struct resource i2c2_resources[] = {
-       [0] = {
-               .name   = "IIC2",
-               .start  = 0xe6824000,
-               .end    = 0xe6824425 - 1,
-               .flags  = IORESOURCE_MEM,
-       },
+       [0] = DEFINE_RES_MEM_NAMED(0xe6824000, 0x426, "IIC2"),
        [1] = {
                .start  = gic_spi(171),
                .end    = gic_spi(174),
@@ -383,12 +358,7 @@ static struct resource i2c2_resources[] = {
 };
 
 static struct resource i2c3_resources[] = {
-       [0] = {
-               .name   = "IIC3",
-               .start  = 0xe6826000,
-               .end    = 0xe6826425 - 1,
-               .flags  = IORESOURCE_MEM,
-       },
+       [0] = DEFINE_RES_MEM_NAMED(0xe6826000, 0x426, "IIC3"),
        [1] = {
                .start  = gic_spi(183),
                .end    = gic_spi(186),
@@ -397,12 +367,7 @@ static struct resource i2c3_resources[] = {
 };
 
 static struct resource i2c4_resources[] = {
-       [0] = {
-               .name   = "IIC4",
-               .start  = 0xe6828000,
-               .end    = 0xe6828425 - 1,
-               .flags  = IORESOURCE_MEM,
-       },
+       [0] = DEFINE_RES_MEM_NAMED(0xe6828000, 0x426, "IIC4"),
        [1] = {
                .start  = gic_spi(187),
                .end    = gic_spi(190),
@@ -623,12 +588,7 @@ static struct sh_dmae_pdata sh73a0_dmae_platform_data = {
 };
 
 static struct resource sh73a0_dmae_resources[] = {
-       {
-               /* Registers including DMAOR and channels including DMARSx */
-               .start  = 0xfe000020,
-               .end    = 0xfe008a00 - 1,
-               .flags  = IORESOURCE_MEM,
-       },
+       DEFINE_RES_MEM(0xfe000020, 0x89e0),
        {
                .name   = "error_irq",
                .start  = gic_spi(129),
@@ -727,18 +687,10 @@ static struct sh_dmae_pdata sh73a0_mpdma_platform_data = {
 
 /* Resource order important! */
 static struct resource sh73a0_mpdma_resources[] = {
-       {
-               /* Channel registers and DMAOR */
-               .start  = 0xec618020,
-               .end    = 0xec61828f,
-               .flags  = IORESOURCE_MEM,
-       },
-       {
-               /* DMARSx */
-               .start  = 0xec619000,
-               .end    = 0xec61900b,
-               .flags  = IORESOURCE_MEM,
-       },
+       /* Channel registers and DMAOR */
+       DEFINE_RES_MEM(0xec618020, 0x270),
+       /* DMARSx */
+       DEFINE_RES_MEM(0xec619000, 0xc),
        {
                .name   = "error_irq",
                .start  = gic_spi(181),
@@ -785,12 +737,7 @@ static struct platform_device pmu_device = {
 
 /* an IPMMU module for ICB */
 static struct resource ipmmu_resources[] = {
-       [0] = {
-               .name   = "IPMMU",
-               .start  = 0xfe951000,
-               .end    = 0xfe9510ff,
-               .flags  = IORESOURCE_MEM,
-       },
+       DEFINE_RES_MEM_NAMED(0xfe951000, 0x100, "IPMMU"),
 };
 
 static const char * const ipmmu_dev_names[] = {
@@ -982,11 +929,17 @@ void __init sh73a0_add_standard_devices(void)
                            ARRAY_SIZE(sh73a0_late_devices));
 }
 
+void __init sh73a0_init_delay(void)
+{
+       shmobile_setup_delay(1196, 44, 46); /* Cortex-A9 @ 1196MHz */
+}
+
 /* do nothing for !CONFIG_SMP or !CONFIG_HAVE_TWD */
 void __init __weak sh73a0_register_twd(void) { }
 
 void __init sh73a0_earlytimer_init(void)
 {
+       sh73a0_init_delay();
        sh73a0_clock_init();
        shmobile_earlytimer_init();
        sh73a0_register_twd();
@@ -1005,17 +958,14 @@ void __init sh73a0_add_early_devices(void)
 
 #ifdef CONFIG_USE_OF
 
-void __init sh73a0_init_delay(void)
-{
-       shmobile_setup_delay(1196, 44, 46); /* Cortex-A9 @ 1196MHz */
-}
-
 static const struct of_dev_auxdata sh73a0_auxdata_lookup[] __initconst = {
        {},
 };
 
 void __init sh73a0_add_standard_devices_dt(void)
 {
+       struct platform_device_info devinfo = { .name = "cpufreq-cpu0", .id = -1, };
+
        /* clocks are setup late during boot in the case of DT */
        sh73a0_clock_init();
 
@@ -1023,6 +973,9 @@ void __init sh73a0_add_standard_devices_dt(void)
                             ARRAY_SIZE(sh73a0_devices_dt));
        of_platform_populate(NULL, of_default_bus_match_table,
                             sh73a0_auxdata_lookup, NULL);
+
+       /* Instantiate cpufreq-cpu0 */
+       platform_device_register_full(&devinfo);
 }
 
 static const char *sh73a0_boards_compat_dt[] __initdata = {
index 566e804d40367c8a13bf83164b4c3af7b7320750..07dff6f184172a5824e189b6d6d86b51e7b6c0dd 100644 (file)
@@ -13,5 +13,6 @@ config ARCH_SOCFPGA
        select GPIO_PL061 if GPIOLIB
        select HAVE_ARM_SCU
        select HAVE_SMP
+       select MFD_SYSCON
        select SPARSE_IRQ
        select USE_OF
index 706ce35396b8d61f54bdab0e8e0f111f858a0477..a42d8743ba7f7c5088b8f5ec67fd7676fa71c80d 100644 (file)
@@ -14,7 +14,6 @@
 #include <linux/delay.h>
 #include <linux/kernel.h>
 #include <linux/init.h>
-#include <linux/irqchip.h>
 #include <linux/of_address.h>
 #include <linux/of_irq.h>
 #include <linux/of_platform.h>
@@ -110,6 +109,7 @@ static void __init sunxi_dt_init(void)
 
 static const char * const sunxi_board_dt_compat[] = {
        "allwinner,sun4i-a10",
+       "allwinner,sun5i-a10s",
        "allwinner,sun5i-a13",
        NULL,
 };
@@ -117,7 +117,6 @@ static const char * const sunxi_board_dt_compat[] = {
 DT_MACHINE_START(SUNXI_DT, "Allwinner A1X (Device Tree)")
        .init_machine   = sunxi_dt_init,
        .map_io         = sunxi_map_io,
-       .init_irq       = irqchip_init,
        .init_time      = sunxi_timer_init,
        .dt_compat      = sunxi_board_dt_compat,
 MACHINE_END
index d011f0ad49c41c13f38d3f30b668d23d6d7aa7f4..98b184efc11043d1439594449a7ccf44973a9530 100644 (file)
@@ -30,6 +30,7 @@ obj-$(CONFIG_HOTPLUG_CPU)               += hotplug.o
 obj-$(CONFIG_TEGRA_PCI)                        += pcie.o
 
 obj-$(CONFIG_ARCH_TEGRA_114_SOC)       += tegra114_speedo.o
+obj-$(CONFIG_ARCH_TEGRA_114_SOC)       += sleep-tegra30.o
 ifeq ($(CONFIG_CPU_IDLE),y)
 obj-$(CONFIG_ARCH_TEGRA_114_SOC)       += cpuidle-tegra114.o
 endif
index 9f852c6fe5b97360fb9a557c00fb734273802951..ec5836b1e7133d75118f082710337505bc800dcc 100644 (file)
@@ -29,6 +29,7 @@
 
 #include "board.h"
 #include "common.h"
+#include "cpuidle.h"
 #include "fuse.h"
 #include "iomap.h"
 #include "irq.h"
@@ -108,5 +109,6 @@ void __init tegra_init_early(void)
 void __init tegra_init_late(void)
 {
        tegra_init_suspend();
+       tegra_cpuidle_init();
        tegra_powergate_debugfs_init();
 }
index 5900cc44f780d33ab84434d3d4393643bab4e541..32f8eb3fe344958d395d89b17785b38f17f06673 100644 (file)
@@ -2,3 +2,4 @@ extern struct smp_operations tegra_smp_ops;
 
 extern int tegra_cpu_kill(unsigned int cpu);
 extern void tegra_cpu_die(unsigned int cpu);
+extern int tegra_cpu_disable(unsigned int cpu);
index 0cdba8de8c77b2f576a415648d762fff82fb81da..706aa4215c3636ffd39a2211dda5cc1319ce52db 100644 (file)
@@ -177,7 +177,6 @@ static int tegra20_idle_lp2_coupled(struct cpuidle_device *dev,
                                    struct cpuidle_driver *drv,
                                    int index)
 {
-       u32 cpu = is_smp() ? cpu_logical_map(dev->cpu) : dev->cpu;
        bool entered_lp2 = false;
 
        if (tegra_pending_sgi())
@@ -193,16 +192,16 @@ static int tegra20_idle_lp2_coupled(struct cpuidle_device *dev,
 
        local_fiq_disable();
 
-       tegra_set_cpu_in_lp2(cpu);
+       tegra_set_cpu_in_lp2();
        cpu_pm_enter();
 
-       if (cpu == 0)
+       if (dev->cpu == 0)
                entered_lp2 = tegra20_cpu_cluster_power_down(dev, drv, index);
        else
                entered_lp2 = tegra20_idle_enter_lp2_cpu_1(dev, drv, index);
 
        cpu_pm_exit();
-       tegra_clear_cpu_in_lp2(cpu);
+       tegra_clear_cpu_in_lp2();
 
        local_fiq_enable();
 
@@ -214,8 +213,5 @@ static int tegra20_idle_lp2_coupled(struct cpuidle_device *dev,
 
 int __init tegra20_cpuidle_init(void)
 {
-#ifdef CONFIG_PM_SLEEP
-       tegra_tear_down_cpu = tegra20_tear_down_cpu;
-#endif
        return cpuidle_register(&tegra_idle_driver, cpu_possible_mask);
 }
index 3cf9aca5f3ea9de1266d11b67a1e7c4ae62a0ee8..ed2a2a7bae4d00ef1107b15681612b663c99bf67 100644 (file)
@@ -114,16 +114,15 @@ static int tegra30_idle_lp2(struct cpuidle_device *dev,
                            struct cpuidle_driver *drv,
                            int index)
 {
-       u32 cpu = is_smp() ? cpu_logical_map(dev->cpu) : dev->cpu;
        bool entered_lp2 = false;
        bool last_cpu;
 
        local_fiq_disable();
 
-       last_cpu = tegra_set_cpu_in_lp2(cpu);
+       last_cpu = tegra_set_cpu_in_lp2();
        cpu_pm_enter();
 
-       if (cpu == 0) {
+       if (dev->cpu == 0) {
                if (last_cpu)
                        entered_lp2 = tegra30_cpu_cluster_power_down(dev, drv,
                                                                     index);
@@ -134,7 +133,7 @@ static int tegra30_idle_lp2(struct cpuidle_device *dev,
        }
 
        cpu_pm_exit();
-       tegra_clear_cpu_in_lp2(cpu);
+       tegra_clear_cpu_in_lp2();
 
        local_fiq_enable();
 
@@ -146,8 +145,5 @@ static int tegra30_idle_lp2(struct cpuidle_device *dev,
 
 int __init tegra30_cpuidle_init(void)
 {
-#ifdef CONFIG_PM_SLEEP
-       tegra_tear_down_cpu = tegra30_tear_down_cpu;
-#endif
        return cpuidle_register(&tegra_idle_driver, NULL);
 }
index 4b744c4661e20d2cb4f809235e7e629143c7901a..e85973cef037e02509cb1a774df7285682795806 100644 (file)
 #include "fuse.h"
 #include "cpuidle.h"
 
-static int __init tegra_cpuidle_init(void)
+void __init tegra_cpuidle_init(void)
 {
-       int ret;
-
        switch (tegra_chip_id) {
        case TEGRA20:
-               ret = tegra20_cpuidle_init();
+               if (IS_ENABLED(CONFIG_ARCH_TEGRA_2x_SOC))
+                       tegra20_cpuidle_init();
                break;
        case TEGRA30:
-               ret = tegra30_cpuidle_init();
+               if (IS_ENABLED(CONFIG_ARCH_TEGRA_3x_SOC))
+                       tegra30_cpuidle_init();
                break;
        case TEGRA114:
-               ret = tegra114_cpuidle_init();
-               break;
-       default:
-               ret = -ENODEV;
+               if (IS_ENABLED(CONFIG_ARCH_TEGRA_114_SOC))
+                       tegra114_cpuidle_init();
                break;
        }
-
-       return ret;
 }
-device_initcall(tegra_cpuidle_init);
index d733f75d02082e83950911765489fa6909103c56..9ec2c1ab0fa4c76a390bfc9673ba9436e18983af 100644 (file)
 #ifndef __MACH_TEGRA_CPUIDLE_H
 #define __MACH_TEGRA_CPUIDLE_H
 
-#ifdef CONFIG_ARCH_TEGRA_2x_SOC
+#ifdef CONFIG_CPU_IDLE
 int tegra20_cpuidle_init(void);
-#else
-static inline int tegra20_cpuidle_init(void) { return -ENODEV; }
-#endif
-
-#ifdef CONFIG_ARCH_TEGRA_3x_SOC
 int tegra30_cpuidle_init(void);
-#else
-static inline int tegra30_cpuidle_init(void) { return -ENODEV; }
-#endif
-
-#ifdef CONFIG_ARCH_TEGRA_114_SOC
 int tegra114_cpuidle_init(void);
+void tegra_cpuidle_init(void);
 #else
-static inline int tegra114_cpuidle_init(void) { return -ENODEV; }
+static inline void tegra_cpuidle_init(void) {}
 #endif
 
 #endif
index 67eab56699bd49f66925b66ed4c5b8d5922de037..7a29bae799a7fc4cc674e5703ead29cfb94182ac 100644 (file)
@@ -25,6 +25,7 @@
 #define FLOW_CTRL_WAITEVENT            (2 << 29)
 #define FLOW_CTRL_WAIT_FOR_INTERRUPT   (4 << 29)
 #define FLOW_CTRL_JTAG_RESUME          (1 << 28)
+#define FLOW_CTRL_SCLK_RESUME          (1 << 27)
 #define FLOW_CTRL_HALT_CPU_IRQ         (1 << 10)
 #define        FLOW_CTRL_HALT_CPU_FIQ          (1 << 8)
 #define FLOW_CTRL_CPU0_CSR             0x8
index aacc00d059801bbfef78faa9251c276f9e4bf8da..def79683bef62d2af19d6b17d8b93063c8b2d508 100644 (file)
 #ifndef __MACH_TEGRA_FUSE_H
 #define __MACH_TEGRA_FUSE_H
 
-enum tegra_revision {
-       TEGRA_REVISION_UNKNOWN = 0,
-       TEGRA_REVISION_A01,
-       TEGRA_REVISION_A02,
-       TEGRA_REVISION_A03,
-       TEGRA_REVISION_A03p,
-       TEGRA_REVISION_A04,
-       TEGRA_REVISION_MAX,
-};
-
 #define SKU_ID_T20     8
 #define SKU_ID_T25SE   20
 #define SKU_ID_AP25    23
@@ -40,6 +30,17 @@ enum tegra_revision {
 #define TEGRA30                0x30
 #define TEGRA114       0x35
 
+#ifndef __ASSEMBLY__
+enum tegra_revision {
+       TEGRA_REVISION_UNKNOWN = 0,
+       TEGRA_REVISION_A01,
+       TEGRA_REVISION_A02,
+       TEGRA_REVISION_A03,
+       TEGRA_REVISION_A03p,
+       TEGRA_REVISION_A04,
+       TEGRA_REVISION_MAX,
+};
+
 extern int tegra_sku_id;
 extern int tegra_cpu_process_id;
 extern int tegra_core_process_id;
@@ -72,5 +73,6 @@ void tegra114_init_speedo_data(void);
 #else
 static inline void tegra114_init_speedo_data(void) {}
 #endif
+#endif /* __ASSEMBLY__ */
 
 #endif
index 184914a68d7319bc2a54292849e637c1e15310d1..a52c10e0a85752cc0a47f9919d73eb46233c36aa 100644 (file)
@@ -46,6 +46,17 @@ void __ref tegra_cpu_die(unsigned int cpu)
        BUG();
 }
 
+int tegra_cpu_disable(unsigned int cpu)
+{
+       switch (tegra_chip_id) {
+       case TEGRA20:
+       case TEGRA30:
+               return cpu == 0 ? -EPERM : 0;
+       default:
+               return 0;
+       }
+}
+
 void __init tegra_hotplug_init(void)
 {
        if (!IS_ENABLED(CONFIG_HOTPLUG_CPU))
@@ -55,4 +66,6 @@ void __init tegra_hotplug_init(void)
                tegra_hotplug_shutdown = tegra20_hotplug_shutdown;
        if (IS_ENABLED(CONFIG_ARCH_TEGRA_3x_SOC) && tegra_chip_id == TEGRA30)
                tegra_hotplug_shutdown = tegra30_hotplug_shutdown;
+       if (IS_ENABLED(CONFIG_ARCH_TEGRA_114_SOC) && tegra_chip_id == TEGRA114)
+               tegra_hotplug_shutdown = tegra30_hotplug_shutdown;
 }
index fad4226ef710da28f19c3ada496495e563c89f49..24db4ac428ae9641e503a1cc1c3638ebf05c9142 100644 (file)
@@ -140,8 +140,31 @@ remove_clamps:
 
 static int tegra114_boot_secondary(unsigned int cpu, struct task_struct *idle)
 {
+       int ret = 0;
+
        cpu = cpu_logical_map(cpu);
-       return tegra_pmc_cpu_power_on(cpu);
+
+       if (cpumask_test_cpu(cpu, &tegra_cpu_init_mask)) {
+               /*
+                * Warm boot flow
+                * The flow controller in charge of the power state and
+                * control for each CPU.
+                */
+               /* set SCLK as event trigger for flow controller */
+               flowctrl_write_cpu_csr(cpu, 1);
+               flowctrl_write_cpu_halt(cpu,
+                               FLOW_CTRL_WAITEVENT | FLOW_CTRL_SCLK_RESUME);
+       } else {
+               /*
+                * Cold boot flow
+                * The CPU is powered up by toggling PMC directly. It will
+                * also initial power state in flow controller. After that,
+                * the CPU's power state is maintained by flow controller.
+                */
+               ret = tegra_pmc_cpu_power_on(cpu);
+       }
+
+       return ret;
 }
 
 static int __cpuinit tegra_boot_secondary(unsigned int cpu,
@@ -173,5 +196,6 @@ struct smp_operations tegra_smp_ops __initdata = {
 #ifdef CONFIG_HOTPLUG_CPU
        .cpu_kill               = tegra_cpu_kill,
        .cpu_die                = tegra_cpu_die,
+       .cpu_disable            = tegra_cpu_disable,
 #endif
 };
index 45cf52c7e528684f2400416298f161f9ffea4d34..94e69bee3da50b12933ae419d4affac950150ca0 100644 (file)
 static DEFINE_SPINLOCK(tegra_lp2_lock);
 void (*tegra_tear_down_cpu)(void);
 
+static void tegra_tear_down_cpu_init(void)
+{
+       switch (tegra_chip_id) {
+       case TEGRA20:
+               if (IS_ENABLED(CONFIG_ARCH_TEGRA_2x_SOC))
+                       tegra_tear_down_cpu = tegra20_tear_down_cpu;
+               break;
+       case TEGRA30:
+               if (IS_ENABLED(CONFIG_ARCH_TEGRA_3x_SOC))
+                       tegra_tear_down_cpu = tegra30_tear_down_cpu;
+               break;
+       }
+}
+
 /*
  * restore_cpu_complex
  *
@@ -91,8 +105,9 @@ static void suspend_cpu_complex(void)
        flowctrl_cpu_suspend_enter(cpu);
 }
 
-void tegra_clear_cpu_in_lp2(int phy_cpu_id)
+void tegra_clear_cpu_in_lp2(void)
 {
+       int phy_cpu_id = cpu_logical_map(smp_processor_id());
        u32 *cpu_in_lp2 = tegra_cpu_lp2_mask;
 
        spin_lock(&tegra_lp2_lock);
@@ -103,8 +118,9 @@ void tegra_clear_cpu_in_lp2(int phy_cpu_id)
        spin_unlock(&tegra_lp2_lock);
 }
 
-bool tegra_set_cpu_in_lp2(int phy_cpu_id)
+bool tegra_set_cpu_in_lp2(void)
 {
+       int phy_cpu_id = cpu_logical_map(smp_processor_id());
        bool last_cpu = false;
        cpumask_t *cpu_lp2_mask = tegra_cpu_lp2_mask;
        u32 *cpu_in_lp2 = tegra_cpu_lp2_mask;
@@ -192,7 +208,7 @@ static int __cpuinit tegra_suspend_enter(suspend_state_t state)
        suspend_cpu_complex();
        switch (mode) {
        case TEGRA_SUSPEND_LP2:
-               tegra_set_cpu_in_lp2(0);
+               tegra_set_cpu_in_lp2();
                break;
        default:
                break;
@@ -202,7 +218,7 @@ static int __cpuinit tegra_suspend_enter(suspend_state_t state)
 
        switch (mode) {
        case TEGRA_SUSPEND_LP2:
-               tegra_clear_cpu_in_lp2(0);
+               tegra_clear_cpu_in_lp2();
                break;
        default:
                break;
@@ -224,6 +240,7 @@ void __init tegra_init_suspend(void)
        if (tegra_pmc_get_suspend_mode() == TEGRA_SUSPEND_NONE)
                return;
 
+       tegra_tear_down_cpu_init();
        tegra_pmc_suspend_init();
 
        suspend_set_ops(&tegra_suspend_ops);
index 778a4aa7c3fa4c0b8dab0811da25057b5c43fdee..94c4b9d9077cf56fc2365ccdcf5eb8dfc3c88fc6 100644 (file)
@@ -28,8 +28,8 @@ extern unsigned long l2x0_saved_regs_addr;
 void save_cpu_arch_register(void);
 void restore_cpu_arch_register(void);
 
-void tegra_clear_cpu_in_lp2(int phy_cpu_id);
-bool tegra_set_cpu_in_lp2(int phy_cpu_id);
+void tegra_clear_cpu_in_lp2(void);
+bool tegra_set_cpu_in_lp2(void);
 
 void tegra_idle_lp2_last(void);
 extern void (*tegra_tear_down_cpu)(void);
index e6de88a2ea06c022604f3909ea1400c658445380..39dc9e7834f38b161d2cc7ac3e53d140c97383d7 100644 (file)
 #include <asm/hardware/cache-l2x0.h>
 
 #include "flowctrl.h"
+#include "fuse.h"
 #include "iomap.h"
 #include "reset.h"
 #include "sleep.h"
 
-#define APB_MISC_GP_HIDREV     0x804
 #define PMC_SCRATCH41  0x140
 
 #define RESET_DATA(x)  ((TEGRA_RESET_##x)*4)
  *       CPU boot vector when restarting the a CPU following
  *       an LP2 transition. Also branched to by LP0 and LP1 resume after
  *       re-enabling sdram.
+ *
+ *     r6: SoC ID
  */
 ENTRY(tegra_resume)
        bl      v7_invalidate_l1
 
        cpu_id  r0
+       tegra_get_soc_id TEGRA_APB_MISC_BASE, r6
+       cmp     r6, #TEGRA114
+       beq     no_cpu0_chk
+
        cmp     r0, #0                          @ CPU0?
  THUMB(        it      ne )
        bne     cpu_resume                      @ no
+no_cpu0_chk:
 
-#ifdef CONFIG_ARCH_TEGRA_3x_SOC
        /* Are we on Tegra20? */
-       mov32   r6, TEGRA_APB_MISC_BASE
-       ldr     r0, [r6, #APB_MISC_GP_HIDREV]
-       and     r0, r0, #0xff00
-       cmp     r0, #(0x20 << 8)
+       cmp     r6, #TEGRA20
        beq     1f                              @ Yes
        /* Clear the flow controller flags for this CPU. */
-       mov32   r2, TEGRA_FLOW_CTRL_BASE + FLOW_CTRL_CPU0_CSR   @ CPU0 CSR
-       ldr     r1, [r2]
+       cpu_to_csr_reg r1, r0
+       mov32   r2, TEGRA_FLOW_CTRL_BASE
+       ldr     r1, [r2, r1]
        /* Clear event & intr flag */
        orr     r1, r1, \
                #FLOW_CTRL_CSR_INTR_FLAG | FLOW_CTRL_CSR_EVENT_FLAG
-       movw    r0, #0x0FFD     @ enable, cluster_switch, immed, & bitmaps
+       movw    r0, #0x3FFD     @ enable, cluster_switch, immed, bitmaps
+                               @ & ext flags for CPU power mgnt
        bic     r1, r1, r0
        str     r1, [r2]
 1:
-#endif
 
+       check_cpu_part_num 0xc09, r8, r9
+       bne     not_ca9
 #ifdef CONFIG_HAVE_ARM_SCU
        /* enable SCU */
        mov32   r0, TEGRA_ARM_PERIF_BASE
@@ -76,6 +82,7 @@ ENTRY(tegra_resume)
 
        /* L2 cache resume & re-enable */
        l2_cache_resume r0, r1, r2, l2x0_saved_regs_addr
+not_ca9:
 
        b       cpu_resume
 ENDPROC(tegra_resume)
@@ -98,7 +105,7 @@ ENTRY(__tegra_cpu_reset_handler_start)
  * Register usage within the reset handler:
  *
  *      Others: scratch
- *      R6  = SoC ID << 8
+ *      R6  = SoC ID
  *      R7  = CPU present (to the OS) mask
  *      R8  = CPU in LP1 state mask
  *      R9  = CPU in LP2 state mask
@@ -115,12 +122,10 @@ ENTRY(__tegra_cpu_reset_handler)
 
        cpsid   aif, 0x13                       @ SVC mode, interrupts disabled
 
-       mov32   r6, TEGRA_APB_MISC_BASE
-       ldr     r6, [r6, #APB_MISC_GP_HIDREV]
-       and     r6, r6, #0xff00
+       tegra_get_soc_id TEGRA_APB_MISC_BASE, r6
 #ifdef CONFIG_ARCH_TEGRA_2x_SOC
 t20_check:
-       cmp     r6, #(0x20 << 8)
+       cmp     r6, #TEGRA20
        bne     after_t20_check
 t20_errata:
        # Tegra20 is a Cortex-A9 r1p1
@@ -136,7 +141,7 @@ after_t20_check:
 #endif
 #ifdef CONFIG_ARCH_TEGRA_3x_SOC
 t30_check:
-       cmp     r6, #(0x30 << 8)
+       cmp     r6, #TEGRA30
        bne     after_t30_check
 t30_errata:
        # Tegra30 is a Cortex-A9 r2p9
@@ -163,7 +168,7 @@ after_errata:
 
 #ifdef CONFIG_ARCH_TEGRA_2x_SOC
        /* Are we on Tegra20? */
-       cmp     r6, #(0x20 << 8)
+       cmp     r6, #TEGRA20
        bne     1f
        /* If not CPU0, don't let CPU0 reset CPU1 now that CPU1 is coming up. */
        mov32   r5, TEGRA_PMC_BASE
@@ -186,11 +191,14 @@ __is_not_lp2:
 
 #ifdef CONFIG_SMP
        /*
-        * Can only be secondary boot (initial or hotplug) but CPU 0
-        * cannot be here.
+        * Can only be secondary boot (initial or hotplug)
+        * CPU0 can't be here for Tegra20/30
         */
+       cmp     r6, #TEGRA114
+       beq     __no_cpu0_chk
        cmp     r10, #0
        bleq    __die                           @ CPU0 cannot be here
+__no_cpu0_chk:
        ldr     lr, [r12, #RESET_DATA(STARTUP_SECONDARY)]
        cmp     lr, #0
        bleq    __die                           @ no secondary startup handler
@@ -210,10 +218,7 @@ __die:
        mov32   r7, TEGRA_CLK_RESET_BASE
 
        /* Are we on Tegra20? */
-       mov32   r6, TEGRA_APB_MISC_BASE
-       ldr     r0, [r6, #APB_MISC_GP_HIDREV]
-       and     r0, r0, #0xff00
-       cmp     r0, #(0x20 << 8)
+       cmp     r6, #TEGRA20
        bne     1f
 
 #ifdef CONFIG_ARCH_TEGRA_2x_SOC
index d29dfcce948d247c8abaadad0a9cf3f9d667cc7f..ada8821b48be932a2cf1c81dbb7b388f98da8498 100644 (file)
@@ -19,6 +19,7 @@
 #include <asm/assembler.h>
 #include <asm/asm-offsets.h>
 
+#include "fuse.h"
 #include "sleep.h"
 #include "flowctrl.h"
 
@@ -43,14 +44,19 @@ ENDPROC(tegra30_hotplug_shutdown)
  *
  * Puts the current CPU in wait-for-event mode on the flow controller
  * and powergates it -- flags (in R0) indicate the request type.
- * Must never be called for CPU 0.
  *
- * corrupts r0-r4, r12
+ * r10 = SoC ID
+ * corrupts r0-r4, r10-r12
  */
 ENTRY(tegra30_cpu_shutdown)
        cpu_id  r3
+       tegra_get_soc_id TEGRA_APB_MISC_VIRT, r10
+       cmp     r10, #TEGRA30
+       bne     _no_cpu0_chk    @ It's not Tegra30
+
        cmp     r3, #0
        moveq   pc, lr          @ Must never be called for CPU 0
+_no_cpu0_chk:
 
        ldr     r12, =TEGRA_FLOW_CTRL_VIRT
        cpu_to_csr_reg r1, r3
@@ -65,7 +71,9 @@ ENTRY(tegra30_cpu_shutdown)
        movw    r12, \
                FLOW_CTRL_CSR_INTR_FLAG | FLOW_CTRL_CSR_EVENT_FLAG | \
                FLOW_CTRL_CSR_ENABLE
-       mov     r4, #(1 << 4)
+       cmp     r10, #TEGRA30
+       moveq   r4, #(1 << 4)                   @ wfe bitmap
+       movne   r4, #(1 << 8)                   @ wfi bitmap
  ARM(  orr     r12, r12, r4, lsl r3    )
  THUMB(        lsl     r4, r4, r3              )
  THUMB(        orr     r12, r12, r4            )
@@ -79,9 +87,20 @@ delay_1:
        cpsid   a                               @ disable imprecise aborts.
        ldr     r3, [r1]                        @ read CSR
        str     r3, [r1]                        @ clear CSR
+
        tst     r0, #TEGRA30_POWER_HOTPLUG_SHUTDOWN
+       beq     flow_ctrl_setting_for_lp2
+
+       /* flow controller set up for hotplug */
+       mov     r3, #FLOW_CTRL_WAITEVENT                @ For hotplug
+       b       flow_ctrl_done
+flow_ctrl_setting_for_lp2:
+       /* flow controller set up for LP2 */
+       cmp     r10, #TEGRA30
        moveq   r3, #FLOW_CTRL_WAIT_FOR_INTERRUPT       @ For LP2
-       movne   r3, #FLOW_CTRL_WAITEVENT                @ For hotplug
+       movne   r3, #FLOW_CTRL_WAITEVENT
+flow_ctrl_done:
+       cmp     r10, #TEGRA30
        str     r3, [r2]
        ldr     r0, [r2]
        b       wfe_war
@@ -89,7 +108,8 @@ delay_1:
 __cpu_reset_again:
        dsb
        .align 5
-       wfe                                     @ CPU should be power gated here
+       wfeeq                                   @ CPU should be power gated here
+       wfine
 wfe_war:
        b       __cpu_reset_again
 
index 364d84523fbac99e0516af8f5b91f7e398c340a7..9daaef26b0f68e353048a2df80e204cfd57f54f6 100644 (file)
@@ -106,9 +106,11 @@ ENTRY(tegra_shut_off_mmu)
        isb
 #ifdef CONFIG_CACHE_L2X0
        /* Disable L2 cache */
-       mov32   r4, TEGRA_ARM_PERIF_BASE + 0x3000
-       mov     r5, #0
-       str     r5, [r4, #L2X0_CTRL]
+       check_cpu_part_num 0xc09, r9, r10
+       movweq  r4, #:lower16:(TEGRA_ARM_PERIF_BASE + 0x3000)
+       movteq  r4, #:upper16:(TEGRA_ARM_PERIF_BASE + 0x3000)
+       moveq   r5, #0
+       streq   r5, [r4, #L2X0_CTRL]
 #endif
        mov     pc, r0
 ENDPROC(tegra_shut_off_mmu)
index 2080fb12ce269132d50c7ae2566fd29004df25fc..98b7da698f2b1626d891d9db4a5305c13ae695d4 100644 (file)
@@ -25,6 +25,8 @@
                                        + IO_PPSB_VIRT)
 #define TEGRA_CLK_RESET_VIRT (TEGRA_CLK_RESET_BASE - IO_PPSB_PHYS \
                                        + IO_PPSB_VIRT)
+#define TEGRA_APB_MISC_VIRT (TEGRA_APB_MISC_BASE - IO_APB_PHYS \
+                                       + IO_APB_VIRT)
 #define TEGRA_PMC_VIRT (TEGRA_PMC_BASE - IO_APB_PHYS + IO_APB_VIRT)
 
 /* PMC_SCRATCH37-39 and 41 are used for tegra_pen_lock and idle */
        movt    \reg, #:upper16:\val
 .endm
 
+/* Marco to check CPU part num */
+.macro check_cpu_part_num part_num, tmp1, tmp2
+       mrc     p15, 0, \tmp1, c0, c0, 0
+       ubfx    \tmp1, \tmp1, #4, #12
+       mov32   \tmp2, \part_num
+       cmp     \tmp1, \tmp2
+.endm
+
 /* Macro to exit SMP coherency. */
 .macro exit_smp, tmp1, tmp2
        mrc     p15, 0, \tmp1, c1, c0, 1        @ ACTLR
        bic     \tmp1, \tmp1, #(1<<6) | (1<<0)  @ clear ACTLR.SMP | ACTLR.FW
        mcr     p15, 0, \tmp1, c1, c0, 1        @ ACTLR
        isb
-       cpu_id  \tmp1
-       mov     \tmp1, \tmp1, lsl #2
-       mov     \tmp2, #0xf
-       mov     \tmp2, \tmp2, lsl \tmp1
-       mov32   \tmp1, TEGRA_ARM_PERIF_VIRT + 0xC
-       str     \tmp2, [\tmp1]                  @ invalidate SCU tags for CPU
+#ifdef CONFIG_HAVE_ARM_SCU
+       check_cpu_part_num 0xc09, \tmp1, \tmp2
+       mrceq   p15, 0, \tmp1, c0, c0, 5
+       andeq   \tmp1, \tmp1, #0xF
+       moveq   \tmp1, \tmp1, lsl #2
+       moveq   \tmp2, #0xf
+       moveq   \tmp2, \tmp2, lsl \tmp1
+       ldreq   \tmp1, =(TEGRA_ARM_PERIF_VIRT + 0xC)
+       streq   \tmp2, [\tmp1]                  @ invalidate SCU tags for CPU
        dsb
+#endif
+.endm
+
+/* Macro to check Tegra revision */
+#define APB_MISC_GP_HIDREV     0x804
+.macro tegra_get_soc_id base, tmp1
+       mov32   \tmp1, \base
+       ldr     \tmp1, [\tmp1, #APB_MISC_GP_HIDREV]
+       and     \tmp1, \tmp1, #0xff00
+       mov     \tmp1, \tmp1, lsr #8
 .endm
 
 /* Macro to resume & re-enable L2 cache */
index 31e69a019bdd999bd53338d669a090697122922b..3ae4a7f1a2fb4568625c8b430d2bbaa05c984333 100644 (file)
@@ -183,7 +183,7 @@ static struct device_node *tegra_emc_ramcode_devnode(struct device_node *np)
        u32 reg;
 
        for_each_child_of_node(np, iter) {
-               if (of_property_read_u32(np, "nvidia,ram-code", &reg))
+               if (of_property_read_u32(iter, "nvidia,ram-code", &reg))
                        continue;
                if (reg == tegra_bct_strapping)
                        return of_node_get(iter);
index 1f597647d431be82d88bb62f79d6b938ec8b18c1..a85adcd00882e4ad193cd3b177179a5ad8162e6a 100644 (file)
@@ -1,24 +1,46 @@
-if ARCH_U300
-
 menu "ST-Ericsson AB U300/U335 Platform"
 
 comment "ST-Ericsson Mobile Platform Products"
 
-config MACH_U300
-       bool "U300"
+config ARCH_U300
+       bool "ST-Ericsson U300 Series" if ARCH_MULTI_V5
+       depends on MMU
+       select ARCH_REQUIRE_GPIOLIB
+       select ARM_AMBA
+       select ARM_PATCH_PHYS_VIRT
+       select ARM_VIC
+       select CLKDEV_LOOKUP
+       select CLKSRC_MMIO
+       select CLKSRC_OF
+       select COMMON_CLK
+       select CPU_ARM926T
+       select GENERIC_CLOCKEVENTS
+       select HAVE_TCM
        select PINCTRL
        select PINCTRL_COH901
        select PINCTRL_U300
+       select SPARSE_IRQ
+       select MFD_SYSCON
+       select USE_OF
+       help
+         Support for ST-Ericsson U300 series mobile platforms.
 
 comment "ST-Ericsson U300/U335 Feature Selections"
 
+config MACH_U300
+       depends on ARCH_U300
+       bool "U300"
+       default y
+
 config U300_DEBUG
+       depends on ARCH_U300
        bool "Debug support for U300"
        depends on PM
        help
                Debug support for U300 in sysfs, procfs etc.
 
 config MACH_U300_SPIDUMMY
+       depends on ARCH_U300
        bool "SSP/SPI dummy chip"
        select SPI
        select SPI_MASTER
@@ -31,5 +53,3 @@ config MACH_U300_SPIDUMMY
                SPI framework and ARM PL022 support.
 
 endmenu
-
-endif
index 5a86c58da396b98bbbc312f732d1d64e3efee752..0f362b64fb878c02a03d4647ba7076353631b926 100644 (file)
@@ -7,7 +7,5 @@ obj-m           :=
 obj-n          :=
 obj-           :=
 
-obj-$(CONFIG_SPI_PL022)           += spi.o
 obj-$(CONFIG_MACH_U300_SPIDUMMY)  += dummyspichip.o
-obj-$(CONFIG_I2C_STU300)          += i2c.o
 obj-$(CONFIG_REGULATOR_AB3100)    += regulator.o
index a683d17b2ce43ad5380186eaaa214f862f6748b7..4f7ac2a114520f5fcb28a9e3a35a3f44a213b0a4 100644 (file)
  * Author: Linus Walleij <linus.walleij@stericsson.com>
  */
 #include <linux/kernel.h>
-#include <linux/init.h>
-#include <linux/spinlock.h>
-#include <linux/interrupt.h>
-#include <linux/bitops.h>
-#include <linux/device.h>
-#include <linux/mm.h>
-#include <linux/termios.h>
-#include <linux/dmaengine.h>
-#include <linux/amba/bus.h>
-#include <linux/amba/mmci.h>
-#include <linux/amba/serial.h>
-#include <linux/platform_device.h>
-#include <linux/gpio.h>
-#include <linux/clk.h>
-#include <linux/err.h>
-#include <linux/mtd/nand.h>
-#include <linux/mtd/fsmc.h>
 #include <linux/pinctrl/machine.h>
 #include <linux/pinctrl/pinconf-generic.h>
-#include <linux/dma-mapping.h>
 #include <linux/platform_data/clk-u300.h>
-#include <linux/platform_data/pinctrl-coh901.h>
-#include <linux/platform_data/dma-coh901318.h>
-#include <linux/irqchip/arm-vic.h>
+#include <linux/irqchip.h>
+#include <linux/of_address.h>
+#include <linux/of_platform.h>
+#include <linux/clocksource.h>
+#include <linux/clk.h>
 
-#include <asm/types.h>
-#include <asm/setup.h>
-#include <asm/memory.h>
 #include <asm/mach/map.h>
-#include <asm/mach-types.h>
 #include <asm/mach/arch.h>
 
-#include <mach/hardware.h>
-#include <mach/syscon.h>
-#include <mach/irqs.h>
+/*
+ * These are the large blocks of memory allocated for I/O.
+ * the defines are used for setting up the I/O memory mapping.
+ */
+
+/* NAND Flash CS0 */
+#define U300_NAND_CS0_PHYS_BASE                0x80000000
+/* NFIF */
+#define U300_NAND_IF_PHYS_BASE         0x9f800000
+/* ALE, CLE offset for FSMC NAND */
+#define PLAT_NAND_CLE                  (1 << 16)
+#define PLAT_NAND_ALE                  (1 << 17)
+/* AHB Peripherals */
+#define U300_AHB_PER_PHYS_BASE         0xa0000000
+#define U300_AHB_PER_VIRT_BASE         0xff010000
+/* FAST Peripherals */
+#define U300_FAST_PER_PHYS_BASE                0xc0000000
+#define U300_FAST_PER_VIRT_BASE                0xff020000
+/* SLOW Peripherals */
+#define U300_SLOW_PER_PHYS_BASE                0xc0010000
+#define U300_SLOW_PER_VIRT_BASE                0xff000000
+/* Boot ROM */
+#define U300_BOOTROM_PHYS_BASE         0xffff0000
+#define U300_BOOTROM_VIRT_BASE         0xffff0000
+/* SEMI config base */
+#define U300_SEMI_CONFIG_BASE          0x2FFE0000
+
+/*
+ * AHB peripherals
+ */
+
+/* AHB Peripherals Bridge Controller */
+#define U300_AHB_BRIDGE_BASE           (U300_AHB_PER_PHYS_BASE+0x0000)
+/* Vectored Interrupt Controller 0, servicing 32 interrupts */
+#define U300_INTCON0_BASE              (U300_AHB_PER_PHYS_BASE+0x1000)
+#define U300_INTCON0_VBASE             IOMEM(U300_AHB_PER_VIRT_BASE+0x1000)
+/* Vectored Interrupt Controller 1, servicing 32 interrupts */
+#define U300_INTCON1_BASE              (U300_AHB_PER_PHYS_BASE+0x2000)
+#define U300_INTCON1_VBASE             IOMEM(U300_AHB_PER_VIRT_BASE+0x2000)
+/* Memory Stick Pro (MSPRO) controller */
+#define U300_MSPRO_BASE                        (U300_AHB_PER_PHYS_BASE+0x3000)
+/* EMIF Configuration Area */
+#define U300_EMIF_CFG_BASE             (U300_AHB_PER_PHYS_BASE+0x4000)
+
+/*
+ * FAST peripherals
+ */
+
+/* FAST bridge control */
+#define U300_FAST_BRIDGE_BASE          (U300_FAST_PER_PHYS_BASE+0x0000)
+/* MMC/SD controller */
+#define U300_MMCSD_BASE                        (U300_FAST_PER_PHYS_BASE+0x1000)
+/* PCM I2S0 controller */
+#define U300_PCM_I2S0_BASE             (U300_FAST_PER_PHYS_BASE+0x2000)
+/* PCM I2S1 controller */
+#define U300_PCM_I2S1_BASE             (U300_FAST_PER_PHYS_BASE+0x3000)
+/* I2C0 controller */
+#define U300_I2C0_BASE                 (U300_FAST_PER_PHYS_BASE+0x4000)
+/* I2C1 controller */
+#define U300_I2C1_BASE                 (U300_FAST_PER_PHYS_BASE+0x5000)
+/* SPI controller */
+#define U300_SPI_BASE                  (U300_FAST_PER_PHYS_BASE+0x6000)
+/* Fast UART1 on U335 only */
+#define U300_UART1_BASE                        (U300_FAST_PER_PHYS_BASE+0x7000)
+
+/*
+ * SLOW peripherals
+ */
+
+/* SLOW bridge control */
+#define U300_SLOW_BRIDGE_BASE          (U300_SLOW_PER_PHYS_BASE)
+/* SYSCON */
+#define U300_SYSCON_BASE               (U300_SLOW_PER_PHYS_BASE+0x1000)
+#define U300_SYSCON_VBASE              IOMEM(U300_SLOW_PER_VIRT_BASE+0x1000)
+/* Watchdog */
+#define U300_WDOG_BASE                 (U300_SLOW_PER_PHYS_BASE+0x2000)
+/* UART0 */
+#define U300_UART0_BASE                        (U300_SLOW_PER_PHYS_BASE+0x3000)
+/* APP side special timer */
+#define U300_TIMER_APP_BASE            (U300_SLOW_PER_PHYS_BASE+0x4000)
+#define U300_TIMER_APP_VBASE           IOMEM(U300_SLOW_PER_VIRT_BASE+0x4000)
+/* Keypad */
+#define U300_KEYPAD_BASE               (U300_SLOW_PER_PHYS_BASE+0x5000)
+/* GPIO */
+#define U300_GPIO_BASE                 (U300_SLOW_PER_PHYS_BASE+0x6000)
+/* RTC */
+#define U300_RTC_BASE                  (U300_SLOW_PER_PHYS_BASE+0x7000)
+/* Bus tracer */
+#define U300_BUSTR_BASE                        (U300_SLOW_PER_PHYS_BASE+0x8000)
+/* Event handler (hardware queue) */
+#define U300_EVHIST_BASE               (U300_SLOW_PER_PHYS_BASE+0x9000)
+/* Genric Timer */
+#define U300_TIMER_BASE                        (U300_SLOW_PER_PHYS_BASE+0xa000)
+/* PPM */
+#define U300_PPM_BASE                  (U300_SLOW_PER_PHYS_BASE+0xb000)
+
+/*
+ * REST peripherals
+ */
+
+/* ISP (image signal processor) */
+#define U300_ISP_BASE                  (0xA0008000)
+/* DMA Controller base */
+#define U300_DMAC_BASE                 (0xC0020000)
+/* MSL Base */
+#define U300_MSL_BASE                  (0xc0022000)
+/* APEX Base */
+#define U300_APEX_BASE                 (0xc0030000)
+/* Video Encoder Base */
+#define U300_VIDEOENC_BASE             (0xc0080000)
+/* XGAM Base */
+#define U300_XGAM_BASE                 (0xd0000000)
+
+/*
+ * SYSCON addresses applicable to the core machine.
+ */
 
-#include "timer.h"
-#include "spi.h"
-#include "i2c.h"
-#include "u300-gpio.h"
+/* Chip ID register 16bit (R/-) */
+#define U300_SYSCON_CIDR                                       (0x400)
+/* SMCR */
+#define U300_SYSCON_SMCR                                       (0x4d0)
+#define U300_SYSCON_SMCR_FIELD_MASK                            (0x000e)
+#define U300_SYSCON_SMCR_SEMI_SREFACK_IND                      (0x0008)
+#define U300_SYSCON_SMCR_SEMI_SREFREQ_ENABLE                   (0x0004)
+#define U300_SYSCON_SMCR_SEMI_EXT_BOOT_MODE_ENABLE             (0x0002)
+/* CPU_SW_DBGEN Software Debug Enable 16bit (R/W) */
+#define U300_SYSCON_CSDR                                       (0x4f0)
+#define U300_SYSCON_CSDR_SW_DEBUG_ENABLE                       (0x0001)
+/* PRINT_CONTROL Print Control 16bit (R/-) */
+#define U300_SYSCON_PCR                                                (0x4f8)
+#define U300_SYSCON_PCR_SERV_IND                               (0x0001)
+/* BOOT_CONTROL 16bit (R/-) */
+#define U300_SYSCON_BCR                                                (0x4fc)
+#define U300_SYSCON_BCR_ACC_CPU_SUBSYS_VINITHI_IND             (0x0400)
+#define U300_SYSCON_BCR_APP_CPU_SUBSYS_VINITHI_IND             (0x0200)
+#define U300_SYSCON_BCR_EXTRA_BOOT_OPTION_MASK                 (0x01FC)
+#define U300_SYSCON_BCR_APP_BOOT_SERV_MASK                     (0x0003)
+
+static void __iomem *syscon_base;
 
 /*
  * Static I/O mappings that are needed for booting the U300 platforms. The
@@ -82,365 +193,6 @@ static void __init u300_map_io(void)
        iotable_init(u300_io_desc, ARRAY_SIZE(u300_io_desc));
 }
 
-/*
- * Declaration of devices found on the U300 board and
- * their respective memory locations.
- */
-
-static struct amba_pl011_data uart0_plat_data = {
-#ifdef CONFIG_COH901318
-       .dma_filter = coh901318_filter_id,
-       .dma_rx_param = (void *) U300_DMA_UART0_RX,
-       .dma_tx_param = (void *) U300_DMA_UART0_TX,
-#endif
-};
-
-/* Slow device at 0x3000 offset */
-static AMBA_APB_DEVICE(uart0, "uart0", 0, U300_UART0_BASE,
-       { IRQ_U300_UART0 }, &uart0_plat_data);
-
-/* The U335 have an additional UART1 on the APP CPU */
-static struct amba_pl011_data uart1_plat_data = {
-#ifdef CONFIG_COH901318
-       .dma_filter = coh901318_filter_id,
-       .dma_rx_param = (void *) U300_DMA_UART1_RX,
-       .dma_tx_param = (void *) U300_DMA_UART1_TX,
-#endif
-};
-
-/* Fast device at 0x7000 offset */
-static AMBA_APB_DEVICE(uart1, "uart1", 0, U300_UART1_BASE,
-       { IRQ_U300_UART1 }, &uart1_plat_data);
-
-/* AHB device at 0x4000 offset */
-static AMBA_APB_DEVICE(pl172, "pl172", 0, U300_EMIF_CFG_BASE, { }, NULL);
-
-/* Fast device at 0x6000 offset */
-static AMBA_APB_DEVICE(pl022, "pl022", 0, U300_SPI_BASE,
-       { IRQ_U300_SPI }, NULL);
-
-/* Fast device at 0x1000 offset */
-#define U300_MMCSD_IRQS        { IRQ_U300_MMCSD_MCIINTR0, IRQ_U300_MMCSD_MCIINTR1 }
-
-static struct mmci_platform_data mmcsd_platform_data = {
-       /*
-        * Do not set ocr_mask or voltage translation function,
-        * we have a regulator we can control instead.
-        */
-       .f_max = 24000000,
-       .gpio_wp = -1,
-       .gpio_cd = U300_GPIO_PIN_MMC_CD,
-       .cd_invert = true,
-       .capabilities = MMC_CAP_MMC_HIGHSPEED |
-       MMC_CAP_SD_HIGHSPEED | MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA,
-#ifdef CONFIG_COH901318
-       .dma_filter = coh901318_filter_id,
-       .dma_rx_param = (void *) U300_DMA_MMCSD_RX_TX,
-       /* Don't specify a TX channel, this RX channel is bidirectional */
-#endif
-};
-
-static AMBA_APB_DEVICE(mmcsd, "mmci", 0, U300_MMCSD_BASE,
-       U300_MMCSD_IRQS, &mmcsd_platform_data);
-
-/*
- * The order of device declaration may be important, since some devices
- * have dependencies on other devices being initialized first.
- */
-static struct amba_device *amba_devs[] __initdata = {
-       &uart0_device,
-       &uart1_device,
-       &pl022_device,
-       &pl172_device,
-       &mmcsd_device,
-};
-
-/* Here follows a list of all hw resources that the platform devices
- * allocate. Note, clock dependencies are not included
- */
-
-static struct resource gpio_resources[] = {
-       {
-               .start = U300_GPIO_BASE,
-               .end   = (U300_GPIO_BASE + SZ_4K - 1),
-               .flags = IORESOURCE_MEM,
-       },
-       {
-               .name  = "gpio0",
-               .start = IRQ_U300_GPIO_PORT0,
-               .end   = IRQ_U300_GPIO_PORT0,
-               .flags = IORESOURCE_IRQ,
-       },
-       {
-               .name  = "gpio1",
-               .start = IRQ_U300_GPIO_PORT1,
-               .end   = IRQ_U300_GPIO_PORT1,
-               .flags = IORESOURCE_IRQ,
-       },
-       {
-               .name  = "gpio2",
-               .start = IRQ_U300_GPIO_PORT2,
-               .end   = IRQ_U300_GPIO_PORT2,
-               .flags = IORESOURCE_IRQ,
-       },
-       {
-               .name  = "gpio3",
-               .start = IRQ_U300_GPIO_PORT3,
-               .end   = IRQ_U300_GPIO_PORT3,
-               .flags = IORESOURCE_IRQ,
-       },
-       {
-               .name  = "gpio4",
-               .start = IRQ_U300_GPIO_PORT4,
-               .end   = IRQ_U300_GPIO_PORT4,
-               .flags = IORESOURCE_IRQ,
-       },
-       {
-               .name  = "gpio5",
-               .start = IRQ_U300_GPIO_PORT5,
-               .end   = IRQ_U300_GPIO_PORT5,
-               .flags = IORESOURCE_IRQ,
-       },
-       {
-               .name  = "gpio6",
-               .start = IRQ_U300_GPIO_PORT6,
-               .end   = IRQ_U300_GPIO_PORT6,
-               .flags = IORESOURCE_IRQ,
-       },
-};
-
-static struct resource keypad_resources[] = {
-       {
-               .start = U300_KEYPAD_BASE,
-               .end   = U300_KEYPAD_BASE + SZ_4K - 1,
-               .flags = IORESOURCE_MEM,
-       },
-       {
-               .name  = "coh901461-press",
-               .start = IRQ_U300_KEYPAD_KEYBF,
-               .end   = IRQ_U300_KEYPAD_KEYBF,
-               .flags = IORESOURCE_IRQ,
-       },
-       {
-               .name  = "coh901461-release",
-               .start = IRQ_U300_KEYPAD_KEYBR,
-               .end   = IRQ_U300_KEYPAD_KEYBR,
-               .flags = IORESOURCE_IRQ,
-       },
-};
-
-static struct resource rtc_resources[] = {
-       {
-               .start = U300_RTC_BASE,
-               .end   = U300_RTC_BASE + SZ_4K - 1,
-               .flags = IORESOURCE_MEM,
-       },
-       {
-               .start = IRQ_U300_RTC,
-               .end   = IRQ_U300_RTC,
-               .flags = IORESOURCE_IRQ,
-       },
-};
-
-/*
- * Fsmc does have IRQs: #43 and #44 (NFIF and NFIF2)
- * but these are not yet used by the driver.
- */
-static struct resource fsmc_resources[] = {
-       {
-               .name  = "nand_addr",
-               .start = U300_NAND_CS0_PHYS_BASE + PLAT_NAND_ALE,
-               .end   = U300_NAND_CS0_PHYS_BASE + PLAT_NAND_ALE + SZ_16K - 1,
-               .flags = IORESOURCE_MEM,
-       },
-       {
-               .name  = "nand_cmd",
-               .start = U300_NAND_CS0_PHYS_BASE + PLAT_NAND_CLE,
-               .end   = U300_NAND_CS0_PHYS_BASE + PLAT_NAND_CLE + SZ_16K - 1,
-               .flags = IORESOURCE_MEM,
-       },
-       {
-               .name  = "nand_data",
-               .start = U300_NAND_CS0_PHYS_BASE,
-               .end   = U300_NAND_CS0_PHYS_BASE + SZ_16K - 1,
-               .flags = IORESOURCE_MEM,
-       },
-       {
-               .name  = "fsmc_regs",
-               .start = U300_NAND_IF_PHYS_BASE,
-               .end   = U300_NAND_IF_PHYS_BASE + SZ_4K - 1,
-               .flags = IORESOURCE_MEM,
-       },
-};
-
-static struct resource i2c0_resources[] = {
-       {
-               .start = U300_I2C0_BASE,
-               .end   = U300_I2C0_BASE + SZ_4K - 1,
-               .flags = IORESOURCE_MEM,
-       },
-       {
-               .start = IRQ_U300_I2C0,
-               .end   = IRQ_U300_I2C0,
-               .flags = IORESOURCE_IRQ,
-       },
-};
-
-static struct resource i2c1_resources[] = {
-       {
-               .start = U300_I2C1_BASE,
-               .end   = U300_I2C1_BASE + SZ_4K - 1,
-               .flags = IORESOURCE_MEM,
-       },
-       {
-               .start = IRQ_U300_I2C1,
-               .end   = IRQ_U300_I2C1,
-               .flags = IORESOURCE_IRQ,
-       },
-
-};
-
-static struct resource wdog_resources[] = {
-       {
-               .start = U300_WDOG_BASE,
-               .end   = U300_WDOG_BASE + SZ_4K - 1,
-               .flags = IORESOURCE_MEM,
-       },
-       {
-               .start = IRQ_U300_WDOG,
-               .end   = IRQ_U300_WDOG,
-               .flags = IORESOURCE_IRQ,
-       }
-};
-
-static struct resource dma_resource[] = {
-       {
-               .start = U300_DMAC_BASE,
-               .end = U300_DMAC_BASE + PAGE_SIZE - 1,
-               .flags =  IORESOURCE_MEM,
-       },
-       {
-               .start = IRQ_U300_DMA,
-               .end = IRQ_U300_DMA,
-               .flags =  IORESOURCE_IRQ,
-       }
-};
-
-
-static struct resource pinctrl_resources[] = {
-       {
-               .start = U300_SYSCON_BASE,
-               .end   = U300_SYSCON_BASE + SZ_4K - 1,
-               .flags = IORESOURCE_MEM,
-       },
-};
-
-static struct platform_device wdog_device = {
-       .name = "coh901327_wdog",
-       .id = -1,
-       .num_resources = ARRAY_SIZE(wdog_resources),
-       .resource = wdog_resources,
-};
-
-static struct platform_device i2c0_device = {
-       .name = "stu300",
-       .id = 0,
-       .num_resources = ARRAY_SIZE(i2c0_resources),
-       .resource = i2c0_resources,
-};
-
-static struct platform_device i2c1_device = {
-       .name = "stu300",
-       .id = 1,
-       .num_resources = ARRAY_SIZE(i2c1_resources),
-       .resource = i2c1_resources,
-};
-
-static struct platform_device pinctrl_device = {
-       .name = "pinctrl-u300",
-       .id = -1,
-       .num_resources = ARRAY_SIZE(pinctrl_resources),
-       .resource = pinctrl_resources,
-};
-
-/*
- * The different variants have a few different versions of the
- * GPIO block, with different number of ports.
- */
-static struct u300_gpio_platform u300_gpio_plat = {
-       .ports = 7,
-       .gpio_base = 0,
-};
-
-static struct platform_device gpio_device = {
-       .name = "u300-gpio",
-       .id = -1,
-       .num_resources = ARRAY_SIZE(gpio_resources),
-       .resource = gpio_resources,
-       .dev = {
-               .platform_data = &u300_gpio_plat,
-       },
-};
-
-static struct platform_device keypad_device = {
-       .name = "keypad",
-       .id = -1,
-       .num_resources = ARRAY_SIZE(keypad_resources),
-       .resource = keypad_resources,
-};
-
-static struct platform_device rtc_device = {
-       .name = "rtc-coh901331",
-       .id = -1,
-       .num_resources = ARRAY_SIZE(rtc_resources),
-       .resource = rtc_resources,
-};
-
-static struct mtd_partition u300_partitions[] = {
-       {
-               .name = "bootrecords",
-               .offset = 0,
-               .size = SZ_128K,
-       },
-       {
-               .name = "free",
-               .offset = SZ_128K,
-               .size = 8064 * SZ_1K,
-       },
-       {
-               .name = "platform",
-               .offset = 8192 * SZ_1K,
-               .size = 253952 * SZ_1K,
-       },
-};
-
-static struct fsmc_nand_platform_data nand_platform_data = {
-       .partitions = u300_partitions,
-       .nr_partitions = ARRAY_SIZE(u300_partitions),
-       .options = NAND_SKIP_BBTSCAN,
-       .width = FSMC_NAND_BW8,
-};
-
-static struct platform_device nand_device = {
-       .name = "fsmc-nand",
-       .id = -1,
-       .resource = fsmc_resources,
-       .num_resources = ARRAY_SIZE(fsmc_resources),
-       .dev = {
-               .platform_data = &nand_platform_data,
-       },
-};
-
-static struct platform_device dma_device = {
-       .name           = "coh901318",
-       .id             = -1,
-       .resource       = dma_resource,
-       .num_resources  = ARRAY_SIZE(dma_resource),
-       .dev = {
-               .coherent_dma_mask = ~0,
-       },
-};
-
 static unsigned long pin_pullup_conf[] = {
        PIN_CONF_PACKED(PIN_CONFIG_BIAS_PULL_UP, 1),
 };
@@ -467,61 +219,6 @@ static struct pinctrl_map __initdata u300_pinmux_map[] = {
                                    pin_highz_conf),
 };
 
-/*
- * Notice that AMBA devices are initialized before platform devices.
- *
- */
-static struct platform_device *platform_devs[] __initdata = {
-       &dma_device,
-       &i2c0_device,
-       &i2c1_device,
-       &keypad_device,
-       &rtc_device,
-       &pinctrl_device,
-       &gpio_device,
-       &nand_device,
-       &wdog_device,
-};
-
-/*
- * Interrupts: the U300 platforms have two pl190 ARM PrimeCells connected
- * together so some interrupts are connected to the first one and some
- * to the second one.
- */
-static void __init u300_init_irq(void)
-{
-       u32 mask[2] = {0, 0};
-       struct clk *clk;
-       int i;
-
-       /* initialize clocking early, we want to clock the INTCON */
-       u300_clk_init(U300_SYSCON_VBASE);
-
-       /* Bootstrap EMIF and SEMI clocks */
-       clk = clk_get_sys("pl172", NULL);
-       BUG_ON(IS_ERR(clk));
-       clk_prepare_enable(clk);
-       clk = clk_get_sys("semi", NULL);
-       BUG_ON(IS_ERR(clk));
-       clk_prepare_enable(clk);
-
-       /* Clock the interrupt controller */
-       clk = clk_get_sys("intcon", NULL);
-       BUG_ON(IS_ERR(clk));
-       clk_prepare_enable(clk);
-
-       for (i = 0; i < U300_VIC_IRQS_END; i++)
-               set_bit(i, (unsigned long *) &mask[0]);
-       vic_init((void __iomem *) U300_INTCON0_VBASE, IRQ_U300_INTCON0_START,
-                mask[0], mask[0]);
-       vic_init((void __iomem *) U300_INTCON1_VBASE, IRQ_U300_INTCON1_START,
-                mask[1], mask[1]);
-}
-
-
-/*
- * U300 platforms peripheral handling
- */
 struct db_chip {
        u16 chipid;
        const char *name;
@@ -578,7 +275,7 @@ static void __init u300_init_check_chip(void)
        const char unknown[] = "UNKNOWN";
 
        /* Read out and print chip ID */
-       val = readw(U300_SYSCON_VBASE + U300_SYSCON_CIDR);
+       val = readw(syscon_base + U300_SYSCON_CIDR);
        /* This is in funky bigendian order... */
        val = (val & 0xFFU) << 8 | (val >> 8);
        chip = db_chips;
@@ -600,74 +297,6 @@ static void __init u300_init_check_chip(void)
        }
 }
 
-/*
- * Some devices and their resources require reserved physical memory from
- * the end of the available RAM. This function traverses the list of devices
- * and assigns actual addresses to these.
- */
-static void __init u300_assign_physmem(void)
-{
-       unsigned long curr_start = __pa(high_memory);
-       int i, j;
-
-       for (i = 0; i < ARRAY_SIZE(platform_devs); i++) {
-               for (j = 0; j < platform_devs[i]->num_resources; j++) {
-                       struct resource *const res =
-                         &platform_devs[i]->resource[j];
-
-                       if (IORESOURCE_MEM == res->flags &&
-                                    0 == res->start) {
-                               res->start  = curr_start;
-                               res->end   += curr_start;
-                               curr_start += resource_size(res);
-
-                               printk(KERN_INFO "core.c: Mapping RAM " \
-                                      "%#x-%#x to device %s:%s\n",
-                                       res->start, res->end,
-                                      platform_devs[i]->name, res->name);
-                       }
-               }
-       }
-}
-
-static void __init u300_init_machine(void)
-{
-       int i;
-       u16 val;
-
-       /* Check what platform we run and print some status information */
-       u300_init_check_chip();
-
-       /* Initialize SPI device with some board specifics */
-       u300_spi_init(&pl022_device);
-
-       /* Register the AMBA devices in the AMBA bus abstraction layer */
-       for (i = 0; i < ARRAY_SIZE(amba_devs); i++) {
-               struct amba_device *d = amba_devs[i];
-               amba_device_register(d, &iomem_resource);
-       }
-
-       u300_assign_physmem();
-
-       /* Initialize pinmuxing */
-       pinctrl_register_mappings(u300_pinmux_map,
-                                 ARRAY_SIZE(u300_pinmux_map));
-
-       /* Register subdevices on the I2C buses */
-       u300_i2c_register_board_devices();
-
-       /* Register the platform devices */
-       platform_add_devices(platform_devs, ARRAY_SIZE(platform_devs));
-
-       /* Register subdevices on the SPI bus */
-       u300_spi_register_board_devices();
-
-       /* Enable SEMI self refresh */
-       val = readw(U300_SYSCON_VBASE + U300_SYSCON_SMCR) |
-               U300_SYSCON_SMCR_SEMI_SREFREQ_ENABLE;
-       writew(val, U300_SYSCON_VBASE + U300_SYSCON_SMCR);
-}
-
 /* Forward declare this function from the watchdog */
 void coh901327_watchdog_reset(void);
 
@@ -688,13 +317,99 @@ static void u300_restart(char mode, const char *cmd)
        while (1);
 }
 
-MACHINE_START(U300, "Ericsson AB U335 S335/B335 Prototype Board")
-       /* Maintainer: Linus Walleij <linus.walleij@stericsson.com> */
-       .atag_offset    = 0x100,
+/* These are mostly to get the right device names for the clock lookups */
+static struct of_dev_auxdata u300_auxdata_lookup[] __initdata = {
+       OF_DEV_AUXDATA("stericsson,pinctrl-u300", U300_SYSCON_BASE,
+               "pinctrl-u300", NULL),
+       OF_DEV_AUXDATA("stericsson,gpio-coh901", U300_GPIO_BASE,
+               "u300-gpio", NULL),
+       OF_DEV_AUXDATA("stericsson,coh901327", U300_WDOG_BASE,
+               "coh901327_wdog", NULL),
+       OF_DEV_AUXDATA("stericsson,coh901331", U300_RTC_BASE,
+               "rtc-coh901331", NULL),
+       OF_DEV_AUXDATA("stericsson,coh901318", U300_DMAC_BASE,
+               "coh901318", NULL),
+       OF_DEV_AUXDATA("stericsson,fsmc-nand", U300_NAND_IF_PHYS_BASE,
+               "fsmc-nand", NULL),
+       OF_DEV_AUXDATA("arm,primecell", U300_UART0_BASE,
+               "uart0", NULL),
+       OF_DEV_AUXDATA("arm,primecell", U300_UART1_BASE,
+               "uart1", NULL),
+       OF_DEV_AUXDATA("arm,primecell", U300_SPI_BASE,
+               "pl022", NULL),
+       OF_DEV_AUXDATA("st,ddci2c", U300_I2C0_BASE,
+               "stu300.0", NULL),
+       OF_DEV_AUXDATA("st,ddci2c", U300_I2C1_BASE,
+               "stu300.1", NULL),
+       OF_DEV_AUXDATA("arm,primecell", U300_MMCSD_BASE,
+               "mmci", NULL),
+       { /* sentinel */ },
+};
+
+static void __init u300_init_irq_dt(void)
+{
+       struct device_node *syscon;
+       struct clk *clk;
+
+       syscon = of_find_node_by_path("/syscon@c0011000");
+       if (!syscon) {
+               pr_crit("could not find syscon node\n");
+               return;
+       }
+       syscon_base = of_iomap(syscon, 0);
+       if (!syscon_base) {
+               pr_crit("could not remap syscon\n");
+               return;
+       }
+       /* initialize clocking early, we want to clock the INTCON */
+       u300_clk_init(syscon_base);
+
+       /* Bootstrap EMIF and SEMI clocks */
+       clk = clk_get_sys("pl172", NULL);
+       BUG_ON(IS_ERR(clk));
+       clk_prepare_enable(clk);
+       clk = clk_get_sys("semi", NULL);
+       BUG_ON(IS_ERR(clk));
+       clk_prepare_enable(clk);
+
+       /* Clock the interrupt controller */
+       clk = clk_get_sys("intcon", NULL);
+       BUG_ON(IS_ERR(clk));
+       clk_prepare_enable(clk);
+
+       irqchip_init();
+}
+
+static void __init u300_init_machine_dt(void)
+{
+       u16 val;
+
+       /* Check what platform we run and print some status information */
+       u300_init_check_chip();
+
+       /* Initialize pinmuxing */
+       pinctrl_register_mappings(u300_pinmux_map,
+                                 ARRAY_SIZE(u300_pinmux_map));
+
+       of_platform_populate(NULL, of_default_bus_match_table,
+                       u300_auxdata_lookup, NULL);
+
+       /* Enable SEMI self refresh */
+       val = readw(syscon_base + U300_SYSCON_SMCR) |
+               U300_SYSCON_SMCR_SEMI_SREFREQ_ENABLE;
+       writew(val, syscon_base + U300_SYSCON_SMCR);
+}
+
+static const char * u300_board_compat[] = {
+       "stericsson,u300",
+       NULL,
+};
+
+DT_MACHINE_START(U300_DT, "U300 S335/B335 (Device Tree)")
        .map_io         = u300_map_io,
-       .nr_irqs        = 0,
-       .init_irq       = u300_init_irq,
-       .init_time      = u300_timer_init,
-       .init_machine   = u300_init_machine,
+       .init_irq       = u300_init_irq_dt,
+       .init_time      = clocksource_of_init,
+       .init_machine   = u300_init_machine_dt,
        .restart        = u300_restart,
+       .dt_compat      = u300_board_compat,
 MACHINE_END
index 2785cb67b5e81025a55b387d96b9bc0ae64f9d34..ec0283cf9a32498617feacce6170a9a3c69c465c 100644 (file)
@@ -263,28 +263,22 @@ static int pl022_dummy_remove(struct spi_device *spi)
        return 0;
 }
 
+static const struct of_device_id pl022_dummy_dt_match[] = {
+       { .compatible = "arm,pl022-dummy" },
+       {},
+};
+
 static struct spi_driver pl022_dummy_driver = {
        .driver = {
                .name   = "spi-dummy",
                .owner  = THIS_MODULE,
+               .of_match_table = pl022_dummy_dt_match,
        },
        .probe  = pl022_dummy_probe,
        .remove = pl022_dummy_remove,
 };
 
-static int __init pl022_init_dummy(void)
-{
-       return spi_register_driver(&pl022_dummy_driver);
-}
-
-static void __exit pl022_exit_dummy(void)
-{
-       spi_unregister_driver(&pl022_dummy_driver);
-}
-
-module_init(pl022_init_dummy);
-module_exit(pl022_exit_dummy);
-
+module_spi_driver(pl022_dummy_driver);
 MODULE_AUTHOR("Linus Walleij <linus.walleij@stericsson.com>");
 MODULE_DESCRIPTION("PL022 SSP/SPI DUMMY Linux driver");
 MODULE_LICENSE("GPL");
diff --git a/arch/arm/mach-u300/i2c.c b/arch/arm/mach-u300/i2c.c
deleted file mode 100644 (file)
index 96800aa..0000000
+++ /dev/null
@@ -1,285 +0,0 @@
-/*
- * arch/arm/mach-u300/i2c.c
- *
- * Copyright (C) 2009-2012 ST-Ericsson AB
- * License terms: GNU General Public License (GPL) version 2
- *
- * Register board i2c devices
- * Author: Linus Walleij <linus.walleij@stericsson.com>
- */
-#include <linux/kernel.h>
-#include <linux/i2c.h>
-#include <linux/mfd/ab3100.h>
-#include <linux/regulator/machine.h>
-#include <linux/amba/bus.h>
-#include <mach/irqs.h>
-
-/*
- * Initial settings of ab3100 registers.
- * Common for below LDO regulator settings are that
- * bit 7-5 controls voltage. Bit 4 turns regulator ON(1) or OFF(0).
- * Bit 3-2 controls sleep enable and bit 1-0 controls sleep mode.
- */
-
-/* LDO_A 0x16: 2.75V, ON, SLEEP_A, SLEEP OFF GND */
-#define LDO_A_SETTING          0x16
-/* LDO_C 0x10: 2.65V, ON, SLEEP_A or B, SLEEP full power */
-#define LDO_C_SETTING          0x10
-/* LDO_D 0x10: 2.65V, ON, sleep mode not used */
-#define LDO_D_SETTING          0x10
-/* LDO_E 0x10: 1.8V, ON, SLEEP_A or B, SLEEP full power */
-#define LDO_E_SETTING          0x10
-/* LDO_E SLEEP 0x00: 1.8V, not used, SLEEP_A or B, not used */
-#define LDO_E_SLEEP_SETTING    0x00
-/* LDO_F 0xD0: 2.5V, ON, SLEEP_A or B, SLEEP full power */
-#define LDO_F_SETTING          0xD0
-/* LDO_G 0x00: 2.85V, OFF, SLEEP_A or B, SLEEP full power */
-#define LDO_G_SETTING          0x00
-/* LDO_H 0x18: 2.75V, ON, SLEEP_B, SLEEP full power */
-#define LDO_H_SETTING          0x18
-/* LDO_K 0x00: 2.75V, OFF, SLEEP_A or B, SLEEP full power */
-#define LDO_K_SETTING          0x00
-/* LDO_EXT 0x00: Voltage not set, OFF, not used, not used */
-#define LDO_EXT_SETTING                0x00
-/* BUCK 0x7D: 1.2V, ON, SLEEP_A and B, SLEEP low power */
-#define BUCK_SETTING   0x7D
-/* BUCK SLEEP 0xAC: 1.05V, Not used, SLEEP_A and B, Not used */
-#define BUCK_SLEEP_SETTING     0xAC
-
-#ifdef CONFIG_AB3100_CORE
-static struct regulator_consumer_supply supply_ldo_c[] = {
-       {
-               .dev_name = "ab3100-codec",
-               .supply = "vaudio", /* Powers the codec */
-       },
-};
-
-/*
- * This one needs to be a supply so we can turn it off
- * in order to shut down the system.
- */
-static struct regulator_consumer_supply supply_ldo_d[] = {
-       {
-               .supply = "vana15", /* Powers the SoC (CPU etc) */
-       },
-};
-
-static struct regulator_consumer_supply supply_ldo_g[] = {
-       {
-               .dev_name = "mmci",
-               .supply = "vmmc", /* Powers MMC/SD card */
-       },
-};
-
-static struct regulator_consumer_supply supply_ldo_h[] = {
-       {
-               .dev_name = "xgam_pdi",
-               .supply = "vdisp", /* Powers camera, display etc */
-       },
-};
-
-static struct regulator_consumer_supply supply_ldo_k[] = {
-       {
-               .dev_name = "irda",
-               .supply = "vir", /* Power IrDA */
-       },
-};
-
-/*
- * This is a placeholder for whoever wish to use the
- * external power.
- */
-static struct regulator_consumer_supply supply_ldo_ext[] = {
-       {
-               .supply = "vext", /* External power */
-       },
-};
-
-/* Preset (hardware defined) voltages for these regulators */
-#define LDO_A_VOLTAGE 2750000
-#define LDO_C_VOLTAGE 2650000
-#define LDO_D_VOLTAGE 2650000
-
-static struct ab3100_platform_data ab3100_plf_data = {
-       .reg_constraints = {
-               /* LDO A routing and constraints */
-               {
-                       .constraints = {
-                               .name = "vrad",
-                               .min_uV = LDO_A_VOLTAGE,
-                               .max_uV = LDO_A_VOLTAGE,
-                               .valid_modes_mask = REGULATOR_MODE_NORMAL,
-                               .always_on = 1,
-                               .boot_on = 1,
-                       },
-               },
-               /* LDO C routing and constraints */
-               {
-                       .constraints = {
-                               .min_uV = LDO_C_VOLTAGE,
-                               .max_uV = LDO_C_VOLTAGE,
-                               .valid_modes_mask = REGULATOR_MODE_NORMAL,
-                       },
-                       .num_consumer_supplies = ARRAY_SIZE(supply_ldo_c),
-                       .consumer_supplies = supply_ldo_c,
-               },
-               /* LDO D routing and constraints */
-               {
-                       .constraints = {
-                               .min_uV = LDO_D_VOLTAGE,
-                               .max_uV = LDO_D_VOLTAGE,
-                               .valid_modes_mask = REGULATOR_MODE_NORMAL,
-                               .valid_ops_mask = REGULATOR_CHANGE_STATUS,
-                               /*
-                                * Actually this is boot_on but we need
-                                * to reference count it externally to
-                                * be able to shut down the system.
-                                */
-                       },
-                       .num_consumer_supplies = ARRAY_SIZE(supply_ldo_d),
-                       .consumer_supplies = supply_ldo_d,
-               },
-               /* LDO E routing and constraints */
-               {
-                       .constraints = {
-                               .name = "vio",
-                               .min_uV = 1800000,
-                               .max_uV = 1800000,
-                               .valid_modes_mask = REGULATOR_MODE_NORMAL,
-                               .always_on = 1,
-                               .boot_on = 1,
-                       },
-               },
-               /* LDO F routing and constraints */
-               {
-                       .constraints = {
-                               .name = "vana25",
-                               .min_uV = 2500000,
-                               .max_uV = 2500000,
-                               .valid_modes_mask = REGULATOR_MODE_NORMAL,
-                               .always_on = 1,
-                               .boot_on = 1,
-                       },
-               },
-               /* LDO G routing and constraints */
-               {
-                       .constraints = {
-                               .min_uV = 1500000,
-                               .max_uV = 2850000,
-                               .valid_modes_mask = REGULATOR_MODE_NORMAL,
-                               .valid_ops_mask =
-                               REGULATOR_CHANGE_VOLTAGE |
-                               REGULATOR_CHANGE_STATUS,
-                       },
-                       .num_consumer_supplies = ARRAY_SIZE(supply_ldo_g),
-                       .consumer_supplies = supply_ldo_g,
-               },
-               /* LDO H routing and constraints */
-               {
-                       .constraints = {
-                               .min_uV = 1200000,
-                               .max_uV = 2750000,
-                               .valid_modes_mask = REGULATOR_MODE_NORMAL,
-                               .valid_ops_mask =
-                               REGULATOR_CHANGE_VOLTAGE |
-                               REGULATOR_CHANGE_STATUS,
-                       },
-                       .num_consumer_supplies = ARRAY_SIZE(supply_ldo_h),
-                       .consumer_supplies = supply_ldo_h,
-               },
-               /* LDO K routing and constraints */
-               {
-                       .constraints = {
-                               .min_uV = 1800000,
-                               .max_uV = 2750000,
-                               .valid_modes_mask = REGULATOR_MODE_NORMAL,
-                               .valid_ops_mask =
-                               REGULATOR_CHANGE_VOLTAGE |
-                               REGULATOR_CHANGE_STATUS,
-                       },
-                       .num_consumer_supplies = ARRAY_SIZE(supply_ldo_k),
-                       .consumer_supplies = supply_ldo_k,
-               },
-               /* External regulator interface. No fixed voltage specified.
-                * If we knew the voltage of the external regulator and it
-                * was connected on the board, we could add the (fixed)
-                * voltage for it here.
-                */
-               {
-                       .constraints = {
-                               .min_uV = 0,
-                               .max_uV = 0,
-                               .valid_modes_mask = REGULATOR_MODE_NORMAL,
-                               .valid_ops_mask =
-                               REGULATOR_CHANGE_STATUS,
-                       },
-                       .num_consumer_supplies = ARRAY_SIZE(supply_ldo_ext),
-                       .consumer_supplies = supply_ldo_ext,
-               },
-               /* Buck converter routing and constraints */
-               {
-                       .constraints = {
-                               .name = "vcore",
-                               .min_uV = 1200000,
-                               .max_uV = 1800000,
-                               .valid_modes_mask = REGULATOR_MODE_NORMAL,
-                               .valid_ops_mask =
-                               REGULATOR_CHANGE_VOLTAGE,
-                               .always_on = 1,
-                               .boot_on = 1,
-                       },
-               },
-       },
-       .reg_initvals = {
-               LDO_A_SETTING,
-               LDO_C_SETTING,
-               LDO_E_SETTING,
-               LDO_E_SLEEP_SETTING,
-               LDO_F_SETTING,
-               LDO_G_SETTING,
-               LDO_H_SETTING,
-               LDO_K_SETTING,
-               LDO_EXT_SETTING,
-               BUCK_SETTING,
-               BUCK_SLEEP_SETTING,
-               LDO_D_SETTING,
-       },
-};
-#endif
-
-static struct i2c_board_info __initdata bus0_i2c_board_info[] = {
-#ifdef CONFIG_AB3100_CORE
-       {
-               .type = "ab3100",
-               .addr = 0x48,
-               .irq = IRQ_U300_IRQ0_EXT,
-               .platform_data = &ab3100_plf_data,
-       },
-#else
-       { },
-#endif
-};
-
-static struct i2c_board_info __initdata bus1_i2c_board_info[] = {
-       {
-               .type = "fwcam",
-               .addr = 0x10,
-       },
-       {
-               .type = "fwcam",
-               .addr = 0x5d,
-       },
-};
-
-void __init u300_i2c_register_board_devices(void)
-{
-       i2c_register_board_info(0, bus0_i2c_board_info,
-                               ARRAY_SIZE(bus0_i2c_board_info));
-       /*
-        * This makes the core shut down all unused regulators
-        * after all the initcalls have completed.
-        */
-       regulator_has_full_constraints();
-       i2c_register_board_info(1, bus1_i2c_board_info,
-                               ARRAY_SIZE(bus1_i2c_board_info));
-}
diff --git a/arch/arm/mach-u300/i2c.h b/arch/arm/mach-u300/i2c.h
deleted file mode 100644 (file)
index 485c02e..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * arch/arm/mach-u300/i2c.h
- *
- * Copyright (C) 2009 ST-Ericsson AB
- * License terms: GNU General Public License (GPL) version 2
- *
- * Register board i2c devices
- * Author: Linus Walleij <linus.walleij@stericsson.com>
- */
-
-#ifndef MACH_U300_I2C_H
-#define MACH_U300_I2C_H
-
-#ifdef CONFIG_I2C_STU300
-void __init u300_i2c_register_board_devices(void);
-#else
-/* Compile out this stuff if no I2C adapter is available */
-static inline void __init u300_i2c_register_board_devices(void)
-{
-}
-#endif
-
-#endif
diff --git a/arch/arm/mach-u300/include/mach/hardware.h b/arch/arm/mach-u300/include/mach/hardware.h
deleted file mode 100644 (file)
index b99d4ce..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-/*
- * arch/arm/mach-u300/include/mach/hardware.h
- */
-#include <asm/sizes.h>
-#include <mach/u300-regs.h>
diff --git a/arch/arm/mach-u300/include/mach/irqs.h b/arch/arm/mach-u300/include/mach/irqs.h
deleted file mode 100644 (file)
index 21d5e76..0000000
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- *
- * arch/arm/mach-u300/include/mach/irqs.h
- *
- *
- * Copyright (C) 2006-2012 ST-Ericsson AB
- * License terms: GNU General Public License (GPL) version 2
- * IRQ channel definitions for the U300 platforms.
- * Author: Linus Walleij <linus.walleij@stericsson.com>
- */
-
-#ifndef __MACH_IRQS_H
-#define __MACH_IRQS_H
-
-#define IRQ_U300_INTCON0_START         32
-#define IRQ_U300_INTCON1_START         64
-/* These are on INTCON0 - 30 lines */
-#define IRQ_U300_IRQ0_EXT              32
-#define IRQ_U300_IRQ1_EXT              33
-#define IRQ_U300_DMA                   34
-#define IRQ_U300_VIDEO_ENC_0           35
-#define IRQ_U300_VIDEO_ENC_1           36
-#define IRQ_U300_AAIF_RX               37
-#define IRQ_U300_AAIF_TX               38
-#define IRQ_U300_AAIF_VGPIO            39
-#define IRQ_U300_AAIF_WAKEUP           40
-#define IRQ_U300_PCM_I2S0_FRAME                41
-#define IRQ_U300_PCM_I2S0_FIFO         42
-#define IRQ_U300_PCM_I2S1_FRAME                43
-#define IRQ_U300_PCM_I2S1_FIFO         44
-#define IRQ_U300_XGAM_GAMCON           45
-#define IRQ_U300_XGAM_CDI              46
-#define IRQ_U300_XGAM_CDICON           47
-#define IRQ_U300_XGAM_PDI              49
-#define IRQ_U300_XGAM_PDICON           50
-#define IRQ_U300_XGAM_GAMEACC          51
-#define IRQ_U300_XGAM_MCIDCT           52
-#define IRQ_U300_APEX                  53
-#define IRQ_U300_UART0                 54
-#define IRQ_U300_SPI                   55
-#define IRQ_U300_TIMER_APP_OS          56
-#define IRQ_U300_TIMER_APP_DD          57
-#define IRQ_U300_TIMER_APP_GP1         58
-#define IRQ_U300_TIMER_APP_GP2         59
-#define IRQ_U300_TIMER_OS              60
-#define IRQ_U300_TIMER_MS              61
-#define IRQ_U300_KEYPAD_KEYBF          62
-#define IRQ_U300_KEYPAD_KEYBR          63
-/* These are on INTCON1 - 32 lines */
-#define IRQ_U300_GPIO_PORT0            64
-#define IRQ_U300_GPIO_PORT1            65
-#define IRQ_U300_GPIO_PORT2            66
-
-/* These are for DB3150, DB3200 and DB3350 */
-#define IRQ_U300_WDOG                  67
-#define IRQ_U300_EVHIST                        68
-#define IRQ_U300_MSPRO                 69
-#define IRQ_U300_MMCSD_MCIINTR0                70
-#define IRQ_U300_MMCSD_MCIINTR1                71
-#define IRQ_U300_I2C0                  72
-#define IRQ_U300_I2C1                  73
-#define IRQ_U300_RTC                   74
-#define IRQ_U300_NFIF                  75
-#define IRQ_U300_NFIF2                 76
-
-/* The DB3350-specific interrupt lines */
-#define IRQ_U300_ISP_F0                        77
-#define IRQ_U300_ISP_F1                        78
-#define IRQ_U300_ISP_F2                        79
-#define IRQ_U300_ISP_F3                        80
-#define IRQ_U300_ISP_F4                        81
-#define IRQ_U300_GPIO_PORT3            82
-#define IRQ_U300_SYSCON_PLL_LOCK       83
-#define IRQ_U300_UART1                 84
-#define IRQ_U300_GPIO_PORT4            85
-#define IRQ_U300_GPIO_PORT5            86
-#define IRQ_U300_GPIO_PORT6            87
-#define U300_VIC_IRQS_END              88
-
-#endif
diff --git a/arch/arm/mach-u300/include/mach/syscon.h b/arch/arm/mach-u300/include/mach/syscon.h
deleted file mode 100644 (file)
index 10bdd0b..0000000
+++ /dev/null
@@ -1,592 +0,0 @@
-/*
- *
- * arch/arm/mach-u300/include/mach/syscon.h
- *
- *
- * Copyright (C) 2008-2012 ST-Ericsson AB
- *
- * Author: Rickard Andersson <rickard.andersson@stericsson.com>
- */
-
-#ifndef __MACH_SYSCON_H
-#define __MACH_SYSCON_H
-
-/*
- * All register defines for SYSCON registers that concerns individual
- * block clocks and reset lines are registered here. This is because
- * we don't want any other file to try to fool around with this stuff.
- */
-
-/* APP side SYSCON registers */
-/* TODO: this is incomplete. Add all from asic_syscon_map.h eventually. */
-/* CLK Control Register 16bit (R/W) */
-#define U300_SYSCON_CCR                                                (0x0000)
-#define U300_SYSCON_CCR_I2S1_USE_VCXO                          (0x0040)
-#define U300_SYSCON_CCR_I2S0_USE_VCXO                          (0x0020)
-#define U300_SYSCON_CCR_TURN_VCXO_ON                           (0x0008)
-#define U300_SYSCON_CCR_CLKING_PERFORMANCE_MASK                        (0x0007)
-#define U300_SYSCON_CCR_CLKING_PERFORMANCE_LOW_POWER           (0x04)
-#define U300_SYSCON_CCR_CLKING_PERFORMANCE_LOW                 (0x03)
-#define U300_SYSCON_CCR_CLKING_PERFORMANCE_INTERMEDIATE                (0x02)
-#define U300_SYSCON_CCR_CLKING_PERFORMANCE_HIGH                        (0x01)
-#define U300_SYSCON_CCR_CLKING_PERFORMANCE_BEST                        (0x00)
-/* CLK Status Register 16bit (R/W) */
-#define U300_SYSCON_CSR                                                (0x0004)
-#define U300_SYSCON_CSR_PLL208_LOCK_IND                                (0x0002)
-#define U300_SYSCON_CSR_PLL13_LOCK_IND                         (0x0001)
-/* Reset lines for SLOW devices 16bit (R/W) */
-#define U300_SYSCON_RSR                                                (0x0014)
-#define U300_SYSCON_RSR_PPM_RESET_EN                           (0x0200)
-#define U300_SYSCON_RSR_ACC_TMR_RESET_EN                       (0x0100)
-#define U300_SYSCON_RSR_APP_TMR_RESET_EN                       (0x0080)
-#define U300_SYSCON_RSR_RTC_RESET_EN                           (0x0040)
-#define U300_SYSCON_RSR_KEYPAD_RESET_EN                                (0x0020)
-#define U300_SYSCON_RSR_GPIO_RESET_EN                          (0x0010)
-#define U300_SYSCON_RSR_EH_RESET_EN                            (0x0008)
-#define U300_SYSCON_RSR_BTR_RESET_EN                           (0x0004)
-#define U300_SYSCON_RSR_UART_RESET_EN                          (0x0002)
-#define U300_SYSCON_RSR_SLOW_BRIDGE_RESET_EN                   (0x0001)
-/* Reset lines for FAST devices 16bit (R/W) */
-#define U300_SYSCON_RFR                                                (0x0018)
-#define U300_SYSCON_RFR_UART1_RESET_ENABLE                     (0x0080)
-#define U300_SYSCON_RFR_SPI_RESET_ENABLE                       (0x0040)
-#define U300_SYSCON_RFR_MMC_RESET_ENABLE                       (0x0020)
-#define U300_SYSCON_RFR_PCM_I2S1_RESET_ENABLE                  (0x0010)
-#define U300_SYSCON_RFR_PCM_I2S0_RESET_ENABLE                  (0x0008)
-#define U300_SYSCON_RFR_I2C1_RESET_ENABLE                      (0x0004)
-#define U300_SYSCON_RFR_I2C0_RESET_ENABLE                      (0x0002)
-#define U300_SYSCON_RFR_FAST_BRIDGE_RESET_ENABLE               (0x0001)
-/* Reset lines for the rest of the peripherals 16bit (R/W) */
-#define U300_SYSCON_RRR                                                (0x001c)
-#define U300_SYSCON_RRR_CDS_RESET_EN                           (0x4000)
-#define U300_SYSCON_RRR_ISP_RESET_EN                           (0x2000)
-#define U300_SYSCON_RRR_INTCON_RESET_EN                                (0x1000)
-#define U300_SYSCON_RRR_MSPRO_RESET_EN                         (0x0800)
-#define U300_SYSCON_RRR_XGAM_RESET_EN                          (0x0100)
-#define U300_SYSCON_RRR_XGAM_VC_SYNC_RESET_EN                  (0x0080)
-#define U300_SYSCON_RRR_NANDIF_RESET_EN                                (0x0040)
-#define U300_SYSCON_RRR_EMIF_RESET_EN                          (0x0020)
-#define U300_SYSCON_RRR_DMAC_RESET_EN                          (0x0010)
-#define U300_SYSCON_RRR_CPU_RESET_EN                           (0x0008)
-#define U300_SYSCON_RRR_APEX_RESET_EN                          (0x0004)
-#define U300_SYSCON_RRR_AHB_RESET_EN                           (0x0002)
-#define U300_SYSCON_RRR_AAIF_RESET_EN                          (0x0001)
-/* Clock enable for SLOW peripherals 16bit (R/W) */
-#define U300_SYSCON_CESR                                       (0x0020)
-#define U300_SYSCON_CESR_PPM_CLK_EN                            (0x0200)
-#define U300_SYSCON_CESR_ACC_TMR_CLK_EN                                (0x0100)
-#define U300_SYSCON_CESR_APP_TMR_CLK_EN                                (0x0080)
-#define U300_SYSCON_CESR_KEYPAD_CLK_EN                         (0x0040)
-#define U300_SYSCON_CESR_GPIO_CLK_EN                           (0x0010)
-#define U300_SYSCON_CESR_EH_CLK_EN                             (0x0008)
-#define U300_SYSCON_CESR_BTR_CLK_EN                            (0x0004)
-#define U300_SYSCON_CESR_UART_CLK_EN                           (0x0002)
-#define U300_SYSCON_CESR_SLOW_BRIDGE_CLK_EN                    (0x0001)
-/* Clock enable for FAST peripherals 16bit (R/W) */
-#define U300_SYSCON_CEFR                                       (0x0024)
-#define U300_SYSCON_CEFR_UART1_CLK_EN                          (0x0200)
-#define U300_SYSCON_CEFR_I2S1_CORE_CLK_EN                      (0x0100)
-#define U300_SYSCON_CEFR_I2S0_CORE_CLK_EN                      (0x0080)
-#define U300_SYSCON_CEFR_SPI_CLK_EN                            (0x0040)
-#define U300_SYSCON_CEFR_MMC_CLK_EN                            (0x0020)
-#define U300_SYSCON_CEFR_I2S1_CLK_EN                           (0x0010)
-#define U300_SYSCON_CEFR_I2S0_CLK_EN                           (0x0008)
-#define U300_SYSCON_CEFR_I2C1_CLK_EN                           (0x0004)
-#define U300_SYSCON_CEFR_I2C0_CLK_EN                           (0x0002)
-#define U300_SYSCON_CEFR_FAST_BRIDGE_CLK_EN                    (0x0001)
-/* Clock enable for the rest of the peripherals 16bit (R/W) */
-#define U300_SYSCON_CERR                                       (0x0028)
-#define U300_SYSCON_CERR_CDS_CLK_EN                            (0x2000)
-#define U300_SYSCON_CERR_ISP_CLK_EN                            (0x1000)
-#define U300_SYSCON_CERR_MSPRO_CLK_EN                          (0x0800)
-#define U300_SYSCON_CERR_AHB_SUBSYS_BRIDGE_CLK_EN              (0x0400)
-#define U300_SYSCON_CERR_SEMI_CLK_EN                           (0x0200)
-#define U300_SYSCON_CERR_XGAM_CLK_EN                           (0x0100)
-#define U300_SYSCON_CERR_VIDEO_ENC_CLK_EN                      (0x0080)
-#define U300_SYSCON_CERR_NANDIF_CLK_EN                         (0x0040)
-#define U300_SYSCON_CERR_EMIF_CLK_EN                           (0x0020)
-#define U300_SYSCON_CERR_DMAC_CLK_EN                           (0x0010)
-#define U300_SYSCON_CERR_CPU_CLK_EN                            (0x0008)
-#define U300_SYSCON_CERR_APEX_CLK_EN                           (0x0004)
-#define U300_SYSCON_CERR_AHB_CLK_EN                            (0x0002)
-#define U300_SYSCON_CERR_AAIF_CLK_EN                           (0x0001)
-/* Single block clock enable 16bit (-/W) */
-#define U300_SYSCON_SBCER                                      (0x002c)
-#define U300_SYSCON_SBCER_PPM_CLK_EN                           (0x0009)
-#define U300_SYSCON_SBCER_ACC_TMR_CLK_EN                       (0x0008)
-#define U300_SYSCON_SBCER_APP_TMR_CLK_EN                       (0x0007)
-#define U300_SYSCON_SBCER_KEYPAD_CLK_EN                                (0x0006)
-#define U300_SYSCON_SBCER_GPIO_CLK_EN                          (0x0004)
-#define U300_SYSCON_SBCER_EH_CLK_EN                            (0x0003)
-#define U300_SYSCON_SBCER_BTR_CLK_EN                           (0x0002)
-#define U300_SYSCON_SBCER_UART_CLK_EN                          (0x0001)
-#define U300_SYSCON_SBCER_SLOW_BRIDGE_CLK_EN                   (0x0000)
-#define U300_SYSCON_SBCER_UART1_CLK_EN                         (0x0019)
-#define U300_SYSCON_SBCER_I2S1_CORE_CLK_EN                     (0x0018)
-#define U300_SYSCON_SBCER_I2S0_CORE_CLK_EN                     (0x0017)
-#define U300_SYSCON_SBCER_SPI_CLK_EN                           (0x0016)
-#define U300_SYSCON_SBCER_MMC_CLK_EN                           (0x0015)
-#define U300_SYSCON_SBCER_I2S1_CLK_EN                          (0x0014)
-#define U300_SYSCON_SBCER_I2S0_CLK_EN                          (0x0013)
-#define U300_SYSCON_SBCER_I2C1_CLK_EN                          (0x0012)
-#define U300_SYSCON_SBCER_I2C0_CLK_EN                          (0x0011)
-#define U300_SYSCON_SBCER_FAST_BRIDGE_CLK_EN                   (0x0010)
-#define U300_SYSCON_SBCER_CDS_CLK_EN                           (0x002D)
-#define U300_SYSCON_SBCER_ISP_CLK_EN                           (0x002C)
-#define U300_SYSCON_SBCER_MSPRO_CLK_EN                         (0x002B)
-#define U300_SYSCON_SBCER_AHB_SUBSYS_BRIDGE_CLK_EN             (0x002A)
-#define U300_SYSCON_SBCER_SEMI_CLK_EN                          (0x0029)
-#define U300_SYSCON_SBCER_XGAM_CLK_EN                          (0x0028)
-#define U300_SYSCON_SBCER_VIDEO_ENC_CLK_EN                     (0x0027)
-#define U300_SYSCON_SBCER_NANDIF_CLK_EN                                (0x0026)
-#define U300_SYSCON_SBCER_EMIF_CLK_EN                          (0x0025)
-#define U300_SYSCON_SBCER_DMAC_CLK_EN                          (0x0024)
-#define U300_SYSCON_SBCER_CPU_CLK_EN                           (0x0023)
-#define U300_SYSCON_SBCER_APEX_CLK_EN                          (0x0022)
-#define U300_SYSCON_SBCER_AHB_CLK_EN                           (0x0021)
-#define U300_SYSCON_SBCER_AAIF_CLK_EN                          (0x0020)
-/* Single block clock disable 16bit (-/W) */
-#define U300_SYSCON_SBCDR                                      (0x0030)
-/* Same values as above for SBCER */
-/* Clock force SLOW peripherals 16bit (R/W) */
-#define U300_SYSCON_CFSR                                       (0x003c)
-#define U300_SYSCON_CFSR_PPM_CLK_FORCE_EN                      (0x0200)
-#define U300_SYSCON_CFSR_ACC_TMR_CLK_FORCE_EN                  (0x0100)
-#define U300_SYSCON_CFSR_APP_TMR_CLK_FORCE_EN                  (0x0080)
-#define U300_SYSCON_CFSR_KEYPAD_CLK_FORCE_EN                   (0x0020)
-#define U300_SYSCON_CFSR_GPIO_CLK_FORCE_EN                     (0x0010)
-#define U300_SYSCON_CFSR_EH_CLK_FORCE_EN                       (0x0008)
-#define U300_SYSCON_CFSR_BTR_CLK_FORCE_EN                      (0x0004)
-#define U300_SYSCON_CFSR_UART_CLK_FORCE_EN                     (0x0002)
-#define U300_SYSCON_CFSR_SLOW_BRIDGE_CLK_FORCE_EN              (0x0001)
-/* Clock force FAST peripherals 16bit (R/W) */
-#define U300_SYSCON_CFFR                                       (0x40)
-/* Values not defined. Define if you want to use them. */
-/* Clock force the rest of the peripherals 16bit (R/W) */
-#define U300_SYSCON_CFRR                                       (0x44)
-#define U300_SYSCON_CFRR_CDS_CLK_FORCE_EN                      (0x2000)
-#define U300_SYSCON_CFRR_ISP_CLK_FORCE_EN                      (0x1000)
-#define U300_SYSCON_CFRR_MSPRO_CLK_FORCE_EN                    (0x0800)
-#define U300_SYSCON_CFRR_AHB_SUBSYS_BRIDGE_CLK_FORCE_EN                (0x0400)
-#define U300_SYSCON_CFRR_SEMI_CLK_FORCE_EN                     (0x0200)
-#define U300_SYSCON_CFRR_XGAM_CLK_FORCE_EN                     (0x0100)
-#define U300_SYSCON_CFRR_VIDEO_ENC_CLK_FORCE_EN                        (0x0080)
-#define U300_SYSCON_CFRR_NANDIF_CLK_FORCE_EN                   (0x0040)
-#define U300_SYSCON_CFRR_EMIF_CLK_FORCE_EN                     (0x0020)
-#define U300_SYSCON_CFRR_DMAC_CLK_FORCE_EN                     (0x0010)
-#define U300_SYSCON_CFRR_CPU_CLK_FORCE_EN                      (0x0008)
-#define U300_SYSCON_CFRR_APEX_CLK_FORCE_EN                     (0x0004)
-#define U300_SYSCON_CFRR_AHB_CLK_FORCE_EN                      (0x0002)
-#define U300_SYSCON_CFRR_AAIF_CLK_FORCE_EN                     (0x0001)
-/* PLL208 Frequency Control 16bit (R/W) */
-#define U300_SYSCON_PFCR                                       (0x48)
-#define U300_SYSCON_PFCR_DPLL_MULT_NUM                         (0x000F)
-/* Power Management Control 16bit (R/W) */
-#define U300_SYSCON_PMCR                                       (0x50)
-#define U300_SYSCON_PMCR_DCON_ENABLE                           (0x0002)
-#define U300_SYSCON_PMCR_PWR_MGNT_ENABLE                       (0x0001)
-/*
- * All other clocking registers moved to clock.c!
- */
-/* Reset Out 16bit (R/W) */
-#define U300_SYSCON_RCR                                                (0x6c)
-#define U300_SYSCON_RCR_RESOUT0_RST_N_DISABLE                  (0x0001)
-/* EMIF Slew Rate Control 16bit (R/W) */
-#define U300_SYSCON_SRCLR                                      (0x70)
-#define U300_SYSCON_SRCLR_MASK                                 (0x03FF)
-#define U300_SYSCON_SRCLR_VALUE                                        (0x03FF)
-#define U300_SYSCON_SRCLR_EMIF_1_SLRC_5_B                      (0x0200)
-#define U300_SYSCON_SRCLR_EMIF_1_SLRC_5_A                      (0x0100)
-#define U300_SYSCON_SRCLR_EMIF_1_SLRC_4_B                      (0x0080)
-#define U300_SYSCON_SRCLR_EMIF_1_SLRC_4_A                      (0x0040)
-#define U300_SYSCON_SRCLR_EMIF_1_SLRC_3_B                      (0x0020)
-#define U300_SYSCON_SRCLR_EMIF_1_SLRC_3_A                      (0x0010)
-#define U300_SYSCON_SRCLR_EMIF_1_SLRC_2_B                      (0x0008)
-#define U300_SYSCON_SRCLR_EMIF_1_SLRC_2_A                      (0x0004)
-#define U300_SYSCON_SRCLR_EMIF_1_SLRC_1_B                      (0x0002)
-#define U300_SYSCON_SRCLR_EMIF_1_SLRC_1_A                      (0x0001)
-/* EMIF Clock Control Register 16bit (R/W) */
-#define U300_SYSCON_ECCR                                       (0x0078)
-#define U300_SYSCON_ECCR_MASK                                  (0x000F)
-#define U300_SYSCON_ECCR_EMIF_1_STATIC_CLK_EN_N_DISABLE                (0x0008)
-#define U300_SYSCON_ECCR_EMIF_1_RET_OUT_CLK_EN_N_DISABLE       (0x0004)
-#define U300_SYSCON_ECCR_EMIF_MEMCLK_RET_EN_N_DISABLE          (0x0002)
-#define U300_SYSCON_ECCR_EMIF_SDRCLK_RET_EN_N_DISABLE          (0x0001)
-/* Step one for killing the applications system 16bit (-/W) */
-#define U300_SYSCON_KA1R                                       (0x0080)
-#define U300_SYSCON_KA1R_MASK                                  (0xFFFF)
-#define U300_SYSCON_KA1R_VALUE                                 (0xFFFF)
-/* Step two for killing the application system 16bit (-/W) */
-#define U300_SYSCON_KA2R                                       (0x0084)
-#define U300_SYSCON_KA2R_MASK                                  (0xFFFF)
-#define U300_SYSCON_KA2R_VALUE                                 (0xFFFF)
-/* MMC/MSPRO frequency divider register 0 16bit (R/W) */
-#define U300_SYSCON_MMF0R                                      (0x90)
-#define U300_SYSCON_MMF0R_MASK                                 (0x00FF)
-#define U300_SYSCON_MMF0R_FREQ_0_HIGH_MASK                     (0x00F0)
-#define U300_SYSCON_MMF0R_FREQ_0_LOW_MASK                      (0x000F)
-/* MMC/MSPRO frequency divider register 1 16bit (R/W) */
-#define U300_SYSCON_MMF1R                                      (0x94)
-#define U300_SYSCON_MMF1R_MASK                                 (0x00FF)
-#define U300_SYSCON_MMF1R_FREQ_1_HIGH_MASK                     (0x00F0)
-#define U300_SYSCON_MMF1R_FREQ_1_LOW_MASK                      (0x000F)
-/* AAIF control register 16 bit (R/W) */
-#define U300_SYSCON_AAIFCR                                     (0x98)
-#define U300_SYSCON_AAIFCR_MASK                                        (0x0003)
-#define U300_SYSCON_AAIFCR_AASW_CTRL_MASK                      (0x0003)
-#define U300_SYSCON_AAIFCR_AASW_CTRL_FUNCTIONAL                        (0x0000)
-#define U300_SYSCON_AAIFCR_AASW_CTRL_MONITORING                        (0x0001)
-#define U300_SYSCON_AAIFCR_AASW_CTRL_ACC_TO_EXT                        (0x0002)
-#define U300_SYSCON_AAIFCR_AASW_CTRL_APP_TO_EXT                        (0x0003)
-/* Clock control for the MMC and MSPRO blocks 16bit (R/W) */
-#define U300_SYSCON_MMCR                                       (0x9C)
-#define U300_SYSCON_MMCR_MASK                                  (0x0003)
-#define U300_SYSCON_MMCR_MMC_FB_CLK_SEL_ENABLE                 (0x0002)
-#define U300_SYSCON_MMCR_MSPRO_FREQSEL_ENABLE                  (0x0001)
-/* Pull up/down control (R/W) */
-#define U300_SYSCON_PUCR                                       (0x104)
-#define U300_SYSCON_PUCR_EMIF_1_WAIT_N_PU_ENABLE               (0x0200)
-#define U300_SYSCON_PUCR_EMIF_1_NFIF_READY_PU_ENABLE           (0x0100)
-#define U300_SYSCON_PUCR_EMIF_1_16BIT_PU_ENABLE                        (0x0080)
-#define U300_SYSCON_PUCR_EMIF_1_8BIT_PU_ENABLE                 (0x0040)
-#define U300_SYSCON_PUCR_KEY_IN_PU_EN_MASK                     (0x003F)
-/* SYS_0_CLK_CONTROL first clock control 16bit (R/W) */
-#define U300_SYSCON_S0CCR                                      (0x120)
-#define U300_SYSCON_S0CCR_FIELD_MASK                           (0x43FF)
-#define U300_SYSCON_S0CCR_CLOCK_REQ                            (0x4000)
-#define U300_SYSCON_S0CCR_CLOCK_REQ_MONITOR                    (0x2000)
-#define U300_SYSCON_S0CCR_CLOCK_INV                            (0x0200)
-#define U300_SYSCON_S0CCR_CLOCK_FREQ_MASK                      (0x01E0)
-#define U300_SYSCON_S0CCR_CLOCK_SELECT_MASK                    (0x001E)
-#define U300_SYSCON_S0CCR_CLOCK_ENABLE                         (0x0001)
-#define U300_SYSCON_S0CCR_SEL_MCLK                             (0x8<<1)
-#define U300_SYSCON_S0CCR_SEL_ACC_FSM_CLK                      (0xA<<1)
-#define U300_SYSCON_S0CCR_SEL_PLL60_48_CLK                     (0xC<<1)
-#define U300_SYSCON_S0CCR_SEL_PLL60_60_CLK                     (0xD<<1)
-#define U300_SYSCON_S0CCR_SEL_ACC_PLL208_CLK                   (0xE<<1)
-#define U300_SYSCON_S0CCR_SEL_APP_PLL13_CLK                    (0x0<<1)
-#define U300_SYSCON_S0CCR_SEL_APP_FSM_CLK                      (0x2<<1)
-#define U300_SYSCON_S0CCR_SEL_RTC_CLK                          (0x4<<1)
-#define U300_SYSCON_S0CCR_SEL_APP_PLL208_CLK                   (0x6<<1)
-/* SYS_1_CLK_CONTROL second clock control 16 bit (R/W) */
-#define U300_SYSCON_S1CCR                                      (0x124)
-#define U300_SYSCON_S1CCR_FIELD_MASK                           (0x43FF)
-#define U300_SYSCON_S1CCR_CLOCK_REQ                            (0x4000)
-#define U300_SYSCON_S1CCR_CLOCK_REQ_MONITOR                    (0x2000)
-#define U300_SYSCON_S1CCR_CLOCK_INV                            (0x0200)
-#define U300_SYSCON_S1CCR_CLOCK_FREQ_MASK                      (0x01E0)
-#define U300_SYSCON_S1CCR_CLOCK_SELECT_MASK                    (0x001E)
-#define U300_SYSCON_S1CCR_CLOCK_ENABLE                         (0x0001)
-#define U300_SYSCON_S1CCR_SEL_MCLK                             (0x8<<1)
-#define U300_SYSCON_S1CCR_SEL_ACC_FSM_CLK                      (0xA<<1)
-#define U300_SYSCON_S1CCR_SEL_PLL60_48_CLK                     (0xC<<1)
-#define U300_SYSCON_S1CCR_SEL_PLL60_60_CLK                     (0xD<<1)
-#define U300_SYSCON_S1CCR_SEL_ACC_PLL208_CLK                   (0xE<<1)
-#define U300_SYSCON_S1CCR_SEL_ACC_PLL13_CLK                    (0x0<<1)
-#define U300_SYSCON_S1CCR_SEL_APP_FSM_CLK                      (0x2<<1)
-#define U300_SYSCON_S1CCR_SEL_RTC_CLK                          (0x4<<1)
-#define U300_SYSCON_S1CCR_SEL_APP_PLL208_CLK                   (0x6<<1)
-/* SYS_2_CLK_CONTROL third clock contol 16 bit (R/W) */
-#define U300_SYSCON_S2CCR                                      (0x128)
-#define U300_SYSCON_S2CCR_FIELD_MASK                           (0xC3FF)
-#define U300_SYSCON_S2CCR_CLK_STEAL                            (0x8000)
-#define U300_SYSCON_S2CCR_CLOCK_REQ                            (0x4000)
-#define U300_SYSCON_S2CCR_CLOCK_REQ_MONITOR                    (0x2000)
-#define U300_SYSCON_S2CCR_CLOCK_INV                            (0x0200)
-#define U300_SYSCON_S2CCR_CLOCK_FREQ_MASK                      (0x01E0)
-#define U300_SYSCON_S2CCR_CLOCK_SELECT_MASK                    (0x001E)
-#define U300_SYSCON_S2CCR_CLOCK_ENABLE                         (0x0001)
-#define U300_SYSCON_S2CCR_SEL_MCLK                             (0x8<<1)
-#define U300_SYSCON_S2CCR_SEL_ACC_FSM_CLK                      (0xA<<1)
-#define U300_SYSCON_S2CCR_SEL_PLL60_48_CLK                     (0xC<<1)
-#define U300_SYSCON_S2CCR_SEL_PLL60_60_CLK                     (0xD<<1)
-#define U300_SYSCON_S2CCR_SEL_ACC_PLL208_CLK                   (0xE<<1)
-#define U300_SYSCON_S2CCR_SEL_ACC_PLL13_CLK                    (0x0<<1)
-#define U300_SYSCON_S2CCR_SEL_APP_FSM_CLK                      (0x2<<1)
-#define U300_SYSCON_S2CCR_SEL_RTC_CLK                          (0x4<<1)
-#define U300_SYSCON_S2CCR_SEL_APP_PLL208_CLK                   (0x6<<1)
-/* SYS_MISC_CONTROL, miscellaneous 16bit (R/W) */
-#define U300_SYSCON_MCR                                                (0x12c)
-#define U300_SYSCON_MCR_FIELD_MASK                             (0x00FF)
-#define U300_SYSCON_MCR_PMGEN_CR_4_MASK                                (0x00C0)
-#define U300_SYSCON_MCR_PMGEN_CR_4_GPIO                                (0x0000)
-#define U300_SYSCON_MCR_PMGEN_CR_4_SPI                         (0x0040)
-#define U300_SYSCON_MCR_PMGEN_CR_4_AAIF                                (0x00C0)
-#define U300_SYSCON_MCR_PMGEN_CR_2_MASK                                (0x0030)
-#define U300_SYSCON_MCR_PMGEN_CR_2_GPIO                                (0x0000)
-#define U300_SYSCON_MCR_PMGEN_CR_2_EMIF_1_STATIC               (0x0010)
-#define U300_SYSCON_MCR_PMGEN_CR_2_DSP                         (0x0020)
-#define U300_SYSCON_MCR_PMGEN_CR_2_AAIF                                (0x0030)
-#define U300_SYSCON_MCR_PMGEN_CR_0_MASK                                (0x000C)
-#define U300_SYSCON_MCR_PMGEN_CR_0_EMIF_1_SDRAM_M1             (0x0000)
-#define U300_SYSCON_MCR_PMGEN_CR_0_EMIF_1_SDRAM_M2             (0x0004)
-#define U300_SYSCON_MCR_PMGEN_CR_0_EMIF_1_SDRAM_M3             (0x0008)
-#define U300_SYSCON_MCR_PMGEN_CR_0_EMIF_0_SDRAM                        (0x000C)
-#define U300_SYSCON_MCR_PM1G_MODE_ENABLE                       (0x0002)
-#define U300_SYSCON_MCR_PMTG5_MODE_ENABLE                      (0x0001)
-/* SC_PLL_IRQ_CONTROL 16bit (R/W) */
-#define U300_SYSCON_PICR                                       (0x0130)
-#define U300_SYSCON_PICR_MASK                                  (0x00FF)
-#define U300_SYSCON_PICR_FORCE_PLL208_LOCK_LOW_ENABLE          (0x0080)
-#define U300_SYSCON_PICR_FORCE_PLL208_LOCK_HIGH_ENABLE         (0x0040)
-#define U300_SYSCON_PICR_FORCE_PLL13_LOCK_LOW_ENABLE           (0x0020)
-#define U300_SYSCON_PICR_FORCE_PLL13_LOCK_HIGH_ENABLE          (0x0010)
-#define U300_SYSCON_PICR_IRQMASK_PLL13_UNLOCK_ENABLE           (0x0008)
-#define U300_SYSCON_PICR_IRQMASK_PLL13_LOCK_ENABLE             (0x0004)
-#define U300_SYSCON_PICR_IRQMASK_PLL208_UNLOCK_ENABLE          (0x0002)
-#define U300_SYSCON_PICR_IRQMASK_PLL208_LOCK_ENABLE            (0x0001)
-/* SC_PLL_IRQ_STATUS 16 bit (R/-) */
-#define U300_SYSCON_PISR                                       (0x0134)
-#define U300_SYSCON_PISR_MASK                                  (0x000F)
-#define U300_SYSCON_PISR_PLL13_UNLOCK_IND                      (0x0008)
-#define U300_SYSCON_PISR_PLL13_LOCK_IND                                (0x0004)
-#define U300_SYSCON_PISR_PLL208_UNLOCK_IND                     (0x0002)
-#define U300_SYSCON_PISR_PLL208_LOCK_IND                       (0x0001)
-/* SC_PLL_IRQ_CLEAR 16 bit (-/W) */
-#define U300_SYSCON_PICLR                                      (0x0138)
-#define U300_SYSCON_PICLR_MASK                                 (0x000F)
-#define U300_SYSCON_PICLR_RWMASK                               (0x0000)
-#define U300_SYSCON_PICLR_PLL13_UNLOCK_SC                      (0x0008)
-#define U300_SYSCON_PICLR_PLL13_LOCK_SC                                (0x0004)
-#define U300_SYSCON_PICLR_PLL208_UNLOCK_SC                     (0x0002)
-#define U300_SYSCON_PICLR_PLL208_LOCK_SC                       (0x0001)
-/* CAMIF_CONTROL 16 bit (-/W) */
-#define U300_SYSCON_CICR                                       (0x013C)
-#define U300_SYSCON_CICR_MASK                                  (0x0FFF)
-#define U300_SYSCON_CICR_APP_SUBLVDS_TESTMODE_MASK             (0x0F00)
-#define U300_SYSCON_CICR_APP_SUBLVDS_TESTMODE_PORT1            (0x0C00)
-#define U300_SYSCON_CICR_APP_SUBLVDS_TESTMODE_PORT0            (0x0300)
-#define U300_SYSCON_CICR_APP_SUBLVDS_RESCON_MASK               (0x00F0)
-#define U300_SYSCON_CICR_APP_SUBLVDS_RESCON_PORT1              (0x00C0)
-#define U300_SYSCON_CICR_APP_SUBLVDS_RESCON_PORT0              (0x0030)
-#define U300_SYSCON_CICR_APP_SUBLVDS_PWR_DWN_N_MASK            (0x000F)
-#define U300_SYSCON_CICR_APP_SUBLVDS_PWR_DWN_N_PORT1           (0x000C)
-#define U300_SYSCON_CICR_APP_SUBLVDS_PWR_DWN_N_PORT0           (0x0003)
-/* Clock activity observability register 0 */
-#define U300_SYSCON_C0OAR                                      (0x140)
-#define U300_SYSCON_C0OAR_MASK                                 (0xFFFF)
-#define U300_SYSCON_C0OAR_VALUE                                        (0xFFFF)
-#define U300_SYSCON_C0OAR_BT_H_CLK                             (0x8000)
-#define U300_SYSCON_C0OAR_ASPB_P_CLK                           (0x4000)
-#define U300_SYSCON_C0OAR_APP_SEMI_H_CLK                       (0x2000)
-#define U300_SYSCON_C0OAR_APP_SEMI_CLK                         (0x1000)
-#define U300_SYSCON_C0OAR_APP_MMC_MSPRO_CLK                    (0x0800)
-#define U300_SYSCON_C0OAR_APP_I2S1_CLK                         (0x0400)
-#define U300_SYSCON_C0OAR_APP_I2S0_CLK                         (0x0200)
-#define U300_SYSCON_C0OAR_APP_CPU_CLK                          (0x0100)
-#define U300_SYSCON_C0OAR_APP_52_CLK                           (0x0080)
-#define U300_SYSCON_C0OAR_APP_208_CLK                          (0x0040)
-#define U300_SYSCON_C0OAR_APP_104_CLK                          (0x0020)
-#define U300_SYSCON_C0OAR_APEX_CLK                             (0x0010)
-#define U300_SYSCON_C0OAR_AHPB_M_H_CLK                         (0x0008)
-#define U300_SYSCON_C0OAR_AHB_CLK                              (0x0004)
-#define U300_SYSCON_C0OAR_AFPB_P_CLK                           (0x0002)
-#define U300_SYSCON_C0OAR_AAIF_CLK                             (0x0001)
-/* Clock activity observability register 1 */
-#define U300_SYSCON_C1OAR                                      (0x144)
-#define U300_SYSCON_C1OAR_MASK                                 (0x3FFE)
-#define U300_SYSCON_C1OAR_VALUE                                        (0x3FFE)
-#define U300_SYSCON_C1OAR_NFIF_F_CLK                           (0x2000)
-#define U300_SYSCON_C1OAR_MSPRO_CLK                            (0x1000)
-#define U300_SYSCON_C1OAR_MMC_P_CLK                            (0x0800)
-#define U300_SYSCON_C1OAR_MMC_CLK                              (0x0400)
-#define U300_SYSCON_C1OAR_KP_P_CLK                             (0x0200)
-#define U300_SYSCON_C1OAR_I2C1_P_CLK                           (0x0100)
-#define U300_SYSCON_C1OAR_I2C0_P_CLK                           (0x0080)
-#define U300_SYSCON_C1OAR_GPIO_CLK                             (0x0040)
-#define U300_SYSCON_C1OAR_EMIF_MPMC_CLK                                (0x0020)
-#define U300_SYSCON_C1OAR_EMIF_H_CLK                           (0x0010)
-#define U300_SYSCON_C1OAR_EVHIST_CLK                           (0x0008)
-#define U300_SYSCON_C1OAR_PPM_CLK                              (0x0004)
-#define U300_SYSCON_C1OAR_DMA_CLK                              (0x0002)
-/* Clock activity observability register 2 */
-#define U300_SYSCON_C2OAR                                      (0x148)
-#define U300_SYSCON_C2OAR_MASK                                 (0x0FFF)
-#define U300_SYSCON_C2OAR_VALUE                                        (0x0FFF)
-#define U300_SYSCON_C2OAR_XGAM_CDI_CLK                         (0x0800)
-#define U300_SYSCON_C2OAR_XGAM_CLK                             (0x0400)
-#define U300_SYSCON_C2OAR_VC_H_CLK                             (0x0200)
-#define U300_SYSCON_C2OAR_VC_CLK                               (0x0100)
-#define U300_SYSCON_C2OAR_UA_P_CLK                             (0x0080)
-#define U300_SYSCON_C2OAR_TMR1_CLK                             (0x0040)
-#define U300_SYSCON_C2OAR_TMR0_CLK                             (0x0020)
-#define U300_SYSCON_C2OAR_SPI_P_CLK                            (0x0010)
-#define U300_SYSCON_C2OAR_PCM_I2S1_CORE_CLK                    (0x0008)
-#define U300_SYSCON_C2OAR_PCM_I2S1_CLK                         (0x0004)
-#define U300_SYSCON_C2OAR_PCM_I2S0_CORE_CLK                    (0x0002)
-#define U300_SYSCON_C2OAR_PCM_I2S0_CLK                         (0x0001)
-
-/* Chip ID register 16bit (R/-) */
-#define U300_SYSCON_CIDR                                       (0x400)
-/* Video IRQ clear 16bit (R/W) */
-#define U300_SYSCON_VICR                                       (0x404)
-#define U300_SYSCON_VICR_VIDEO1_IRQ_CLEAR_ENABLE               (0x0002)
-#define U300_SYSCON_VICR_VIDEO0_IRQ_CLEAR_ENABLE               (0x0001)
-/* SMCR */
-#define U300_SYSCON_SMCR                                       (0x4d0)
-#define U300_SYSCON_SMCR_FIELD_MASK                            (0x000e)
-#define U300_SYSCON_SMCR_SEMI_SREFACK_IND                      (0x0008)
-#define U300_SYSCON_SMCR_SEMI_SREFREQ_ENABLE                   (0x0004)
-#define U300_SYSCON_SMCR_SEMI_EXT_BOOT_MODE_ENABLE             (0x0002)
-/* CPU_SW_DBGEN Software Debug Enable 16bit (R/W) */
-#define U300_SYSCON_CSDR                                       (0x4f0)
-#define U300_SYSCON_CSDR_SW_DEBUG_ENABLE                       (0x0001)
-/* PRINT_CONTROL Print Control 16bit (R/-) */
-#define U300_SYSCON_PCR                                                (0x4f8)
-#define U300_SYSCON_PCR_SERV_IND                               (0x0001)
-/* BOOT_CONTROL 16bit (R/-) */
-#define U300_SYSCON_BCR                                                (0x4fc)
-#define U300_SYSCON_BCR_ACC_CPU_SUBSYS_VINITHI_IND             (0x0400)
-#define U300_SYSCON_BCR_APP_CPU_SUBSYS_VINITHI_IND             (0x0200)
-#define U300_SYSCON_BCR_EXTRA_BOOT_OPTION_MASK                 (0x01FC)
-#define U300_SYSCON_BCR_APP_BOOT_SERV_MASK                     (0x0003)
-
-
-/* CPU clock defines */
-/**
- * CPU high frequency in MHz
- */
-#define SYSCON_CPU_CLOCK_HIGH    208
-/**
- * CPU medium frequency in MHz
- */
-#define SYSCON_CPU_CLOCK_MEDIUM   52
-/**
- * CPU low frequency in MHz
- */
-#define SYSCON_CPU_CLOCK_LOW      13
-
-/* EMIF clock defines */
-/**
- * EMIF high frequency in MHz
- */
-#define SYSCON_EMIF_CLOCK_HIGH   104
-/**
- * EMIF medium frequency in MHz
- */
-#define SYSCON_EMIF_CLOCK_MEDIUM  52
-/**
- * EMIF low frequency in MHz
- */
-#define SYSCON_EMIF_CLOCK_LOW     13
-
-/* AHB clock defines */
-/**
- * AHB high frequency in MHz
- */
-#define SYSCON_AHB_CLOCK_HIGH     52
-/**
- * AHB medium frequency in MHz
- */
-#define SYSCON_AHB_CLOCK_MEDIUM   26
-/**
- * AHB low frequency in MHz
- */
-#define SYSCON_AHB_CLOCK_LOW       7  /* i.e 13/2=6.5MHz */
-
-enum syscon_busmaster {
-  SYSCON_BM_DMAC,
-  SYSCON_BM_XGAM,
-  SYSCON_BM_VIDEO_ENC
-};
-
-/* Selectr a resistor or a set of resistors */
-enum syscon_pull_up_down {
-  SYSCON_PU_KEY_IN_EN,
-  SYSCON_PU_EMIF_1_8_BIT_EN,
-  SYSCON_PU_EMIF_1_16_BIT_EN,
-  SYSCON_PU_EMIF_1_NFIF_READY_EN,
-  SYSCON_PU_EMIF_1_NFIF_WAIT_N_EN,
-};
-
-/*
- * Note that this array must match the order of the array "clk_reg"
- * in syscon.c
- */
-enum syscon_clk {
-  SYSCON_CLKCONTROL_SLOW_BRIDGE,
-  SYSCON_CLKCONTROL_UART,
-  SYSCON_CLKCONTROL_BTR,
-  SYSCON_CLKCONTROL_EH,
-  SYSCON_CLKCONTROL_GPIO,
-  SYSCON_CLKCONTROL_KEYPAD,
-  SYSCON_CLKCONTROL_APP_TIMER,
-  SYSCON_CLKCONTROL_ACC_TIMER,
-  SYSCON_CLKCONTROL_FAST_BRIDGE,
-  SYSCON_CLKCONTROL_I2C0,
-  SYSCON_CLKCONTROL_I2C1,
-  SYSCON_CLKCONTROL_I2S0,
-  SYSCON_CLKCONTROL_I2S1,
-  SYSCON_CLKCONTROL_MMC,
-  SYSCON_CLKCONTROL_SPI,
-  SYSCON_CLKCONTROL_I2S0_CORE,
-  SYSCON_CLKCONTROL_I2S1_CORE,
-  SYSCON_CLKCONTROL_UART1,
-  SYSCON_CLKCONTROL_AAIF,
-  SYSCON_CLKCONTROL_AHB,
-  SYSCON_CLKCONTROL_APEX,
-  SYSCON_CLKCONTROL_CPU,
-  SYSCON_CLKCONTROL_DMA,
-  SYSCON_CLKCONTROL_EMIF,
-  SYSCON_CLKCONTROL_NAND_IF,
-  SYSCON_CLKCONTROL_VIDEO_ENC,
-  SYSCON_CLKCONTROL_XGAM,
-  SYSCON_CLKCONTROL_SEMI,
-  SYSCON_CLKCONTROL_AHB_SUBSYS,
-  SYSCON_CLKCONTROL_MSPRO
-};
-
-enum syscon_sysclk_mode {
-  SYSCON_SYSCLK_DISABLED,
-  SYSCON_SYSCLK_M_CLK,
-  SYSCON_SYSCLK_ACC_FSM,
-  SYSCON_SYSCLK_PLL60_48,
-  SYSCON_SYSCLK_PLL60_60,
-  SYSCON_SYSCLK_ACC_PLL208,
-  SYSCON_SYSCLK_APP_PLL13,
-  SYSCON_SYSCLK_APP_FSM,
-  SYSCON_SYSCLK_RTC,
-  SYSCON_SYSCLK_APP_PLL208
-};
-
-enum syscon_sysclk_req {
-  SYSCON_SYSCLKREQ_DISABLED,
-  SYSCON_SYSCLKREQ_ACTIVE_LOW,
-  SYSCON_SYSCLKREQ_MONITOR
-};
-
-enum syscon_clk_mode {
-  SYSCON_CLKMODE_OFF,
-  SYSCON_CLKMODE_DEFAULT,
-  SYSCON_CLKMODE_LOW,
-  SYSCON_CLKMODE_MEDIUM,
-  SYSCON_CLKMODE_HIGH,
-  SYSCON_CLKMODE_PERMANENT,
-  SYSCON_CLKMODE_ON,
-};
-
-enum syscon_call_mode {
-  SYSCON_CLKCALL_NOWAIT,
-  SYSCON_CLKCALL_WAIT,
-};
-
-int syscon_dc_on(bool keep_power_on);
-int syscon_set_busmaster_active_state(enum syscon_busmaster busmaster,
-                                     bool active);
-bool syscon_get_busmaster_active_state(void);
-int syscon_set_sleep_mask(enum syscon_clk,
-                         bool sleep_ctrl);
-int syscon_config_sysclk(u32 sysclk,
-                        enum syscon_sysclk_mode sysclkmode,
-                        bool inverse,
-                        u32 divisor,
-                        enum syscon_sysclk_req sysclkreq);
-bool syscon_can_turn_off_semi_clock(void);
-
-/* This function is restricted to core.c */
-int syscon_request_normal_power(bool req);
-
-/* This function is restricted to be used by platform_speed.c */
-int syscon_speed_request(enum syscon_call_mode wait_mode,
-                        enum syscon_clk_mode req_clk_mode);
-#endif /* __MACH_SYSCON_H */
diff --git a/arch/arm/mach-u300/include/mach/timex.h b/arch/arm/mach-u300/include/mach/timex.h
deleted file mode 100644 (file)
index f233b72..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-/*
- *
- * arch/arm/mach-u300/include/mach/timex.h
- *
- *
- * Copyright (C) 2006-2009 ST-Ericsson AB
- * License terms: GNU General Public License (GPL) version 2
- * Platform tick rate definition.
- * Author: Linus Walleij <linus.walleij@stericsson.com>
- */
-#ifndef __MACH_TIMEX_H
-#define __MACH_TIMEX_H
-
-/* This is for the APP OS GP1 (General Purpose 1) timer */
-#define CLOCK_TICK_RATE                1000000
-
-#endif
diff --git a/arch/arm/mach-u300/include/mach/u300-regs.h b/arch/arm/mach-u300/include/mach/u300-regs.h
deleted file mode 100644 (file)
index 0320495..0000000
+++ /dev/null
@@ -1,165 +0,0 @@
-/*
- *
- * arch/arm/mach-u300/include/mach/u300-regs.h
- *
- *
- * Copyright (C) 2006-2009 ST-Ericsson AB
- * License terms: GNU General Public License (GPL) version 2
- * Basic register address definitions in physical memory and
- * some block definitions for core devices like the timer.
- * Author: Linus Walleij <linus.walleij@stericsson.com>
- */
-
-#ifndef __MACH_U300_REGS_H
-#define __MACH_U300_REGS_H
-
-/*
- * These are the large blocks of memory allocated for I/O.
- * the defines are used for setting up the I/O memory mapping.
- */
-
-/* NAND Flash CS0 */
-#define U300_NAND_CS0_PHYS_BASE                0x80000000
-
-/* NFIF */
-#define U300_NAND_IF_PHYS_BASE         0x9f800000
-
-/* ALE, CLE offset for FSMC NAND */
-#define PLAT_NAND_CLE                  (1 << 16)
-#define PLAT_NAND_ALE                  (1 << 17)
-
-/* AHB Peripherals */
-#define U300_AHB_PER_PHYS_BASE         0xa0000000
-#define U300_AHB_PER_VIRT_BASE         0xff010000
-
-/* FAST Peripherals */
-#define U300_FAST_PER_PHYS_BASE                0xc0000000
-#define U300_FAST_PER_VIRT_BASE                0xff020000
-
-/* SLOW Peripherals */
-#define U300_SLOW_PER_PHYS_BASE                0xc0010000
-#define U300_SLOW_PER_VIRT_BASE                0xff000000
-
-/* Boot ROM */
-#define U300_BOOTROM_PHYS_BASE         0xffff0000
-#define U300_BOOTROM_VIRT_BASE         0xffff0000
-
-/* SEMI config base */
-#define U300_SEMI_CONFIG_BASE          0x2FFE0000
-
-/*
- * AHB peripherals
- */
-
-/* AHB Peripherals Bridge Controller */
-#define U300_AHB_BRIDGE_BASE           (U300_AHB_PER_PHYS_BASE+0x0000)
-
-/* Vectored Interrupt Controller 0, servicing 32 interrupts */
-#define U300_INTCON0_BASE              (U300_AHB_PER_PHYS_BASE+0x1000)
-#define U300_INTCON0_VBASE             IOMEM(U300_AHB_PER_VIRT_BASE+0x1000)
-
-/* Vectored Interrupt Controller 1, servicing 32 interrupts */
-#define U300_INTCON1_BASE              (U300_AHB_PER_PHYS_BASE+0x2000)
-#define U300_INTCON1_VBASE             IOMEM(U300_AHB_PER_VIRT_BASE+0x2000)
-
-/* Memory Stick Pro (MSPRO) controller */
-#define U300_MSPRO_BASE                        (U300_AHB_PER_PHYS_BASE+0x3000)
-
-/* EMIF Configuration Area */
-#define U300_EMIF_CFG_BASE             (U300_AHB_PER_PHYS_BASE+0x4000)
-
-
-/*
- * FAST peripherals
- */
-
-/* FAST bridge control */
-#define U300_FAST_BRIDGE_BASE          (U300_FAST_PER_PHYS_BASE+0x0000)
-
-/* MMC/SD controller */
-#define U300_MMCSD_BASE                        (U300_FAST_PER_PHYS_BASE+0x1000)
-
-/* PCM I2S0 controller */
-#define U300_PCM_I2S0_BASE             (U300_FAST_PER_PHYS_BASE+0x2000)
-
-/* PCM I2S1 controller */
-#define U300_PCM_I2S1_BASE             (U300_FAST_PER_PHYS_BASE+0x3000)
-
-/* I2C0 controller */
-#define U300_I2C0_BASE                 (U300_FAST_PER_PHYS_BASE+0x4000)
-
-/* I2C1 controller */
-#define U300_I2C1_BASE                 (U300_FAST_PER_PHYS_BASE+0x5000)
-
-/* SPI controller */
-#define U300_SPI_BASE                  (U300_FAST_PER_PHYS_BASE+0x6000)
-
-/* Fast UART1 on U335 only */
-#define U300_UART1_BASE                        (U300_FAST_PER_PHYS_BASE+0x7000)
-
-/*
- * SLOW peripherals
- */
-
-/* SLOW bridge control */
-#define U300_SLOW_BRIDGE_BASE          (U300_SLOW_PER_PHYS_BASE)
-
-/* SYSCON */
-#define U300_SYSCON_BASE               (U300_SLOW_PER_PHYS_BASE+0x1000)
-#define U300_SYSCON_VBASE              IOMEM(U300_SLOW_PER_VIRT_BASE+0x1000)
-
-/* Watchdog */
-#define U300_WDOG_BASE                 (U300_SLOW_PER_PHYS_BASE+0x2000)
-
-/* UART0 */
-#define U300_UART0_BASE                        (U300_SLOW_PER_PHYS_BASE+0x3000)
-
-/* APP side special timer */
-#define U300_TIMER_APP_BASE            (U300_SLOW_PER_PHYS_BASE+0x4000)
-#define U300_TIMER_APP_VBASE           IOMEM(U300_SLOW_PER_VIRT_BASE+0x4000)
-
-/* Keypad */
-#define U300_KEYPAD_BASE               (U300_SLOW_PER_PHYS_BASE+0x5000)
-
-/* GPIO */
-#define U300_GPIO_BASE                 (U300_SLOW_PER_PHYS_BASE+0x6000)
-
-/* RTC */
-#define U300_RTC_BASE                  (U300_SLOW_PER_PHYS_BASE+0x7000)
-
-/* Bus tracer */
-#define U300_BUSTR_BASE                        (U300_SLOW_PER_PHYS_BASE+0x8000)
-
-/* Event handler (hardware queue) */
-#define U300_EVHIST_BASE               (U300_SLOW_PER_PHYS_BASE+0x9000)
-
-/* Genric Timer */
-#define U300_TIMER_BASE                        (U300_SLOW_PER_PHYS_BASE+0xa000)
-
-/* PPM */
-#define U300_PPM_BASE                  (U300_SLOW_PER_PHYS_BASE+0xb000)
-
-
-/*
- * REST peripherals
- */
-
-/* ISP (image signal processor) */
-#define U300_ISP_BASE                  (0xA0008000)
-
-/* DMA Controller base */
-#define U300_DMAC_BASE                 (0xC0020000)
-
-/* MSL Base */
-#define U300_MSL_BASE                  (0xc0022000)
-
-/* APEX Base */
-#define U300_APEX_BASE                 (0xc0030000)
-
-/* Video Encoder Base */
-#define U300_VIDEOENC_BASE             (0xc0080000)
-
-/* XGAM Base */
-#define U300_XGAM_BASE                 (0xd0000000)
-
-#endif
diff --git a/arch/arm/mach-u300/include/mach/uncompress.h b/arch/arm/mach-u300/include/mach/uncompress.h
deleted file mode 100644 (file)
index 783e7e6..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * arch/arm/mach-u300/include/mach/uncompress.h
- *
- * Copyright (C) 2003 ARM Limited
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This 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
- */
-#define AMBA_UART_DR   (*(volatile unsigned char *)0xc0013000)
-#define AMBA_UART_LCRH (*(volatile unsigned char *)0xc001302C)
-#define AMBA_UART_CR   (*(volatile unsigned char *)0xc0013030)
-#define AMBA_UART_FR   (*(volatile unsigned char *)0xc0013018)
-
-/*
- * This does not append a newline
- */
-static inline void putc(int c)
-{
-       while (AMBA_UART_FR & (1 << 5))
-               barrier();
-
-       AMBA_UART_DR = c;
-}
-
-static inline void flush(void)
-{
-       while (AMBA_UART_FR & (1 << 3))
-               barrier();
-}
-
-/*
- * nothing to do
- */
-#define arch_decomp_setup()
index 9c53f01c62ebe36151b1b114af9b31572005d468..bf40cd478fe95d82d64073bb1ff184c07f25808f 100644 (file)
 #include <linux/device.h>
 #include <linux/signal.h>
 #include <linux/err.h>
+#include <linux/of.h>
+#include <linux/module.h>
+#include <linux/platform_device.h>
+#include <linux/regulator/machine.h>
 #include <linux/regulator/consumer.h>
-/* Those are just for writing in syscon */
-#include <linux/io.h>
-#include <mach/hardware.h>
-#include <mach/syscon.h>
+#include <linux/mfd/syscon.h>
+#include <linux/regmap.h>
+
+/* Power Management Control 16bit (R/W) */
+#define U300_SYSCON_PMCR                                       (0x50)
+#define U300_SYSCON_PMCR_DCON_ENABLE                           (0x0002)
+#define U300_SYSCON_PMCR_PWR_MGNT_ENABLE                       (0x0001)
 
 /*
  * Regulators that power the board and chip and which are
@@ -47,13 +54,28 @@ void u300_pm_poweroff(void)
 /*
  * Hog the regulators needed to power up the board.
  */
-static int __init u300_init_boardpower(void)
+static int __init __u300_init_boardpower(struct platform_device *pdev)
 {
+       struct device_node *np = pdev->dev.of_node;
+       struct device_node *syscon_np;
+       struct regmap *regmap;
        int err;
-       u32 val;
 
        pr_info("U300: setting up board power\n");
-       main_power_15 = regulator_get(NULL, "vana15");
+
+       syscon_np = of_parse_phandle(np, "syscon", 0);
+       if (!syscon_np) {
+               pr_crit("U300: no syscon node\n");
+               return -ENODEV;
+       }
+       regmap = syscon_node_to_regmap(syscon_np);
+       if (!regmap) {
+               pr_crit("U300: could not locate syscon regmap\n");
+               return -ENODEV;
+       }
+
+       main_power_15 = regulator_get(&pdev->dev, "vana15");
+
        if (IS_ERR(main_power_15)) {
                pr_err("could not get vana15");
                return PTR_ERR(main_power_15);
@@ -72,9 +94,8 @@ static int __init u300_init_boardpower(void)
         * the rest of the U300 power management is implemented.
         */
        pr_info("U300: disable system controller pull-up\n");
-       val = readw(U300_SYSCON_VBASE + U300_SYSCON_PMCR);
-       val &= ~U300_SYSCON_PMCR_DCON_ENABLE;
-       writew(val, U300_SYSCON_VBASE + U300_SYSCON_PMCR);
+       regmap_update_bits(regmap, U300_SYSCON_PMCR,
+                          U300_SYSCON_PMCR_DCON_ENABLE, 0);
 
        /* Register globally exported PM poweroff hook */
        pm_power_off = u300_pm_poweroff;
@@ -82,7 +103,31 @@ static int __init u300_init_boardpower(void)
        return 0;
 }
 
+static int __init s365_board_probe(struct platform_device *pdev)
+{
+       return __u300_init_boardpower(pdev);
+}
+
+static const struct of_device_id s365_board_match[] = {
+       { .compatible = "stericsson,s365" },
+       {},
+};
+
+static struct platform_driver s365_board_driver = {
+       .driver         = {
+               .name   = "s365-board",
+               .owner  = THIS_MODULE,
+               .of_match_table = s365_board_match,
+       },
+};
+
 /*
  * So at module init time we hog the regulator!
  */
-module_init(u300_init_boardpower);
+static int __init u300_init_boardpower(void)
+{
+       return platform_driver_probe(&s365_board_driver,
+                                    s365_board_probe);
+}
+
+device_initcall(u300_init_boardpower);
diff --git a/arch/arm/mach-u300/spi.c b/arch/arm/mach-u300/spi.c
deleted file mode 100644 (file)
index 9106982..0000000
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * arch/arm/mach-u300/spi.c
- *
- * Copyright (C) 2009 ST-Ericsson AB
- * License terms: GNU General Public License (GPL) version 2
- *
- * Author: Linus Walleij <linus.walleij@stericsson.com>
- */
-#include <linux/device.h>
-#include <linux/amba/bus.h>
-#include <linux/spi/spi.h>
-#include <linux/amba/pl022.h>
-#include <linux/platform_data/dma-coh901318.h>
-#include <linux/err.h>
-
-/*
- * The following is for the actual devices on the SSP/SPI bus
- */
-#ifdef CONFIG_MACH_U300_SPIDUMMY
-static void select_dummy_chip(u32 chipselect)
-{
-       pr_debug("CORE: %s called with CS=0x%x (%s)\n",
-                __func__,
-                chipselect,
-                chipselect ? "unselect chip" : "select chip");
-       /*
-        * Here you would write the chip select value to the GPIO pins if
-        * this was a real chip (but this is a loopback dummy).
-        */
-}
-
-struct pl022_config_chip dummy_chip_info = {
-       /* available POLLING_TRANSFER, INTERRUPT_TRANSFER, DMA_TRANSFER */
-       .com_mode = DMA_TRANSFER,
-       .iface = SSP_INTERFACE_MOTOROLA_SPI,
-       /* We can only act as master but SSP_SLAVE is possible in theory */
-       .hierarchy = SSP_MASTER,
-       /* 0 = drive TX even as slave, 1 = do not drive TX as slave */
-       .slave_tx_disable = 0,
-       .rx_lev_trig = SSP_RX_4_OR_MORE_ELEM,
-       .tx_lev_trig = SSP_TX_4_OR_MORE_EMPTY_LOC,
-       .ctrl_len = SSP_BITS_12,
-       .wait_state = SSP_MWIRE_WAIT_ZERO,
-       .duplex = SSP_MICROWIRE_CHANNEL_FULL_DUPLEX,
-       /*
-        * This is where you insert a call to a function to enable CS
-        * (usually GPIO) for a certain chip.
-        */
-       .cs_control = select_dummy_chip,
-};
-#endif
-
-static struct spi_board_info u300_spi_devices[] = {
-#ifdef CONFIG_MACH_U300_SPIDUMMY
-       {
-               /* A dummy chip used for loopback tests */
-               .modalias       = "spi-dummy",
-               /* Really dummy, pass in additional chip config here */
-               .platform_data  = NULL,
-               /* This defines how the controller shall handle the device */
-               .controller_data = &dummy_chip_info,
-               /* .irq - no external IRQ routed from this device */
-               .max_speed_hz   = 1000000,
-               .bus_num        = 0, /* Only one bus on this chip */
-               .chip_select    = 0,
-               /* Means SPI_CS_HIGH, change if e.g low CS */
-               .mode           = SPI_MODE_1 | SPI_LOOP,
-       },
-#endif
-};
-
-static struct pl022_ssp_controller ssp_platform_data = {
-       /* If you have several SPI buses this varies, we have only bus 0 */
-       .bus_id = 0,
-       /*
-        * On the APP CPU GPIO 4, 5 and 6 are connected as generic
-        * chip selects for SPI. (Same on U330, U335 and U365.)
-        * TODO: make sure the GPIO driver can select these properly
-        * and do padmuxing accordingly too.
-        */
-       .num_chipselect = 3,
-#ifdef CONFIG_COH901318
-       .enable_dma = 1,
-       .dma_filter = coh901318_filter_id,
-       .dma_rx_param = (void *) U300_DMA_SPI_RX,
-       .dma_tx_param = (void *) U300_DMA_SPI_TX,
-#else
-       .enable_dma = 0,
-#endif
-};
-
-
-void __init u300_spi_init(struct amba_device *adev)
-{
-       adev->dev.platform_data = &ssp_platform_data;
-}
-
-void __init u300_spi_register_board_devices(void)
-{
-       /* Register any SPI devices */
-       spi_register_board_info(u300_spi_devices, ARRAY_SIZE(u300_spi_devices));
-}
diff --git a/arch/arm/mach-u300/spi.h b/arch/arm/mach-u300/spi.h
deleted file mode 100644 (file)
index bd3d867..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * arch/arm/mach-u300/spi.h
- *
- * Copyright (C) 2009 ST-Ericsson AB
- * License terms: GNU General Public License (GPL) version 2
- *
- * Author: Linus Walleij <linus.walleij@stericsson.com>
- */
-#ifndef SPI_H
-#define SPI_H
-#include <linux/amba/bus.h>
-
-#ifdef CONFIG_SPI_PL022
-void __init u300_spi_init(struct amba_device *adev);
-void __init u300_spi_register_board_devices(void);
-#else
-/* Compile out SPI support if PL022 is not selected */
-static inline void __init u300_spi_init(struct amba_device *adev)
-{
-}
-static inline void __init u300_spi_register_board_devices(void)
-{
-}
-#endif
-
-#endif
index d9e73209c9b8d7aa0d26b9957ed7401f9b53b61d..390ae5feb1d00f802e117618d75cfae080f74232 100644 (file)
 #include <linux/clk.h>
 #include <linux/err.h>
 #include <linux/irq.h>
-
-#include <mach/hardware.h>
-#include <mach/irqs.h>
+#include <linux/delay.h>
+#include <linux/of_address.h>
+#include <linux/of_irq.h>
 
 /* Generic stuff */
 #include <asm/sched_clock.h>
 #include <asm/mach/map.h>
 #include <asm/mach/time.h>
 
-#include "timer.h"
-
 /*
  * APP side special timer registers
  * This timer contains four timers which can fire an interrupt each.
 #define TICKS_PER_JIFFY ((CLOCK_TICK_RATE + (HZ/2)) / HZ)
 #define US_PER_TICK ((1000000 + (HZ/2)) / HZ)
 
+static void __iomem *u300_timer_base;
+
 /*
  * The u300_set_mode() function is always called first, if we
  * have oneshot timer active, the oneshot scheduling function
@@ -201,28 +201,28 @@ static void u300_set_mode(enum clock_event_mode mode,
        case CLOCK_EVT_MODE_PERIODIC:
                /* Disable interrupts on GPT1 */
                writel(U300_TIMER_APP_GPT1IE_IRQ_DISABLE,
-                      U300_TIMER_APP_VBASE + U300_TIMER_APP_GPT1IE);
+                      u300_timer_base + U300_TIMER_APP_GPT1IE);
                /* Disable GP1 while we're reprogramming it. */
                writel(U300_TIMER_APP_DGPT1_TIMER_DISABLE,
-                      U300_TIMER_APP_VBASE + U300_TIMER_APP_DGPT1);
+                      u300_timer_base + U300_TIMER_APP_DGPT1);
                /*
                 * Set the periodic mode to a certain number of ticks per
                 * jiffy.
                 */
                writel(TICKS_PER_JIFFY,
-                      U300_TIMER_APP_VBASE + U300_TIMER_APP_GPT1TC);
+                      u300_timer_base + U300_TIMER_APP_GPT1TC);
                /*
                 * Set continuous mode, so the timer keeps triggering
                 * interrupts.
                 */
                writel(U300_TIMER_APP_SGPT1M_MODE_CONTINUOUS,
-                      U300_TIMER_APP_VBASE + U300_TIMER_APP_SGPT1M);
+                      u300_timer_base + U300_TIMER_APP_SGPT1M);
                /* Enable timer interrupts */
                writel(U300_TIMER_APP_GPT1IE_IRQ_ENABLE,
-                      U300_TIMER_APP_VBASE + U300_TIMER_APP_GPT1IE);
+                      u300_timer_base + U300_TIMER_APP_GPT1IE);
                /* Then enable the OS timer again */
                writel(U300_TIMER_APP_EGPT1_TIMER_ENABLE,
-                      U300_TIMER_APP_VBASE + U300_TIMER_APP_EGPT1);
+                      u300_timer_base + U300_TIMER_APP_EGPT1);
                break;
        case CLOCK_EVT_MODE_ONESHOT:
                /* Just break; here? */
@@ -233,33 +233,33 @@ static void u300_set_mode(enum clock_event_mode mode,
                 */
                /* Disable interrupts on GPT1 */
                writel(U300_TIMER_APP_GPT1IE_IRQ_DISABLE,
-                      U300_TIMER_APP_VBASE + U300_TIMER_APP_GPT1IE);
+                      u300_timer_base + U300_TIMER_APP_GPT1IE);
                /* Disable GP1 while we're reprogramming it. */
                writel(U300_TIMER_APP_DGPT1_TIMER_DISABLE,
-                      U300_TIMER_APP_VBASE + U300_TIMER_APP_DGPT1);
+                      u300_timer_base + U300_TIMER_APP_DGPT1);
                /*
                 * Expire far in the future, u300_set_next_event() will be
                 * called soon...
                 */
-               writel(0xFFFFFFFF, U300_TIMER_APP_VBASE + U300_TIMER_APP_GPT1TC);
+               writel(0xFFFFFFFF, u300_timer_base + U300_TIMER_APP_GPT1TC);
                /* We run one shot per tick here! */
                writel(U300_TIMER_APP_SGPT1M_MODE_ONE_SHOT,
-                      U300_TIMER_APP_VBASE + U300_TIMER_APP_SGPT1M);
+                      u300_timer_base + U300_TIMER_APP_SGPT1M);
                /* Enable interrupts for this timer */
                writel(U300_TIMER_APP_GPT1IE_IRQ_ENABLE,
-                      U300_TIMER_APP_VBASE + U300_TIMER_APP_GPT1IE);
+                      u300_timer_base + U300_TIMER_APP_GPT1IE);
                /* Enable timer */
                writel(U300_TIMER_APP_EGPT1_TIMER_ENABLE,
-                      U300_TIMER_APP_VBASE + U300_TIMER_APP_EGPT1);
+                      u300_timer_base + U300_TIMER_APP_EGPT1);
                break;
        case CLOCK_EVT_MODE_UNUSED:
        case CLOCK_EVT_MODE_SHUTDOWN:
                /* Disable interrupts on GP1 */
                writel(U300_TIMER_APP_GPT1IE_IRQ_DISABLE,
-                      U300_TIMER_APP_VBASE + U300_TIMER_APP_GPT1IE);
+                      u300_timer_base + U300_TIMER_APP_GPT1IE);
                /* Disable GP1 */
                writel(U300_TIMER_APP_DGPT1_TIMER_DISABLE,
-                      U300_TIMER_APP_VBASE + U300_TIMER_APP_DGPT1);
+                      u300_timer_base + U300_TIMER_APP_DGPT1);
                break;
        case CLOCK_EVT_MODE_RESUME:
                /* Ignore this call */
@@ -281,27 +281,27 @@ static int u300_set_next_event(unsigned long cycles,
 {
        /* Disable interrupts on GPT1 */
        writel(U300_TIMER_APP_GPT1IE_IRQ_DISABLE,
-              U300_TIMER_APP_VBASE + U300_TIMER_APP_GPT1IE);
+              u300_timer_base + U300_TIMER_APP_GPT1IE);
        /* Disable GP1 while we're reprogramming it. */
        writel(U300_TIMER_APP_DGPT1_TIMER_DISABLE,
-              U300_TIMER_APP_VBASE + U300_TIMER_APP_DGPT1);
+              u300_timer_base + U300_TIMER_APP_DGPT1);
        /* Reset the General Purpose timer 1. */
        writel(U300_TIMER_APP_RGPT1_TIMER_RESET,
-              U300_TIMER_APP_VBASE + U300_TIMER_APP_RGPT1);
+              u300_timer_base + U300_TIMER_APP_RGPT1);
        /* IRQ in n * cycles */
-       writel(cycles, U300_TIMER_APP_VBASE + U300_TIMER_APP_GPT1TC);
+       writel(cycles, u300_timer_base + U300_TIMER_APP_GPT1TC);
        /*
         * We run one shot per tick here! (This is necessary to reconfigure,
         * the timer will tilt if you don't!)
         */
        writel(U300_TIMER_APP_SGPT1M_MODE_ONE_SHOT,
-              U300_TIMER_APP_VBASE + U300_TIMER_APP_SGPT1M);
+              u300_timer_base + U300_TIMER_APP_SGPT1M);
        /* Enable timer interrupts */
        writel(U300_TIMER_APP_GPT1IE_IRQ_ENABLE,
-              U300_TIMER_APP_VBASE + U300_TIMER_APP_GPT1IE);
+              u300_timer_base + U300_TIMER_APP_GPT1IE);
        /* Then enable the OS timer again */
        writel(U300_TIMER_APP_EGPT1_TIMER_ENABLE,
-              U300_TIMER_APP_VBASE + U300_TIMER_APP_EGPT1);
+              u300_timer_base + U300_TIMER_APP_EGPT1);
        return 0;
 }
 
@@ -320,8 +320,9 @@ static irqreturn_t u300_timer_interrupt(int irq, void *dev_id)
 {
        struct clock_event_device *evt = &clockevent_u300_1mhz;
        /* ACK/Clear timer IRQ for the APP GPT1 Timer */
+
        writel(U300_TIMER_APP_GPT1IA_IRQ_ACK,
-               U300_TIMER_APP_VBASE + U300_TIMER_APP_GPT1IA);
+               u300_timer_base + U300_TIMER_APP_GPT1IA);
        evt->event_handler(evt);
        return IRQ_HANDLED;
 }
@@ -342,65 +343,88 @@ static struct irqaction u300_timer_irq = {
 
 static u32 notrace u300_read_sched_clock(void)
 {
-       return readl(U300_TIMER_APP_VBASE + U300_TIMER_APP_GPT2CC);
+       return readl(u300_timer_base + U300_TIMER_APP_GPT2CC);
+}
+
+static unsigned long u300_read_current_timer(void)
+{
+       return readl(u300_timer_base + U300_TIMER_APP_GPT2CC);
 }
 
+static struct delay_timer u300_delay_timer;
 
 /*
  * This sets up the system timers, clock source and clock event.
  */
-void __init u300_timer_init(void)
+static void __init u300_timer_init_of(struct device_node *np)
 {
+       struct resource irq_res;
+       int irq;
        struct clk *clk;
        unsigned long rate;
 
+       u300_timer_base = of_iomap(np, 0);
+       if (!u300_timer_base)
+               panic("could not ioremap system timer\n");
+
+       /* Get the IRQ for the GP1 timer */
+       irq = of_irq_to_resource(np, 2, &irq_res);
+       if (irq <= 0)
+               panic("no IRQ for system timer\n");
+
+       pr_info("U300 GP1 timer @ base: %p, IRQ: %d\n", u300_timer_base, irq);
+
        /* Clock the interrupt controller */
-       clk = clk_get_sys("apptimer", NULL);
+       clk = of_clk_get(np, 0);
        BUG_ON(IS_ERR(clk));
        clk_prepare_enable(clk);
        rate = clk_get_rate(clk);
 
        setup_sched_clock(u300_read_sched_clock, 32, rate);
 
+       u300_delay_timer.read_current_timer = &u300_read_current_timer;
+       u300_delay_timer.freq = rate;
+       register_current_timer_delay(&u300_delay_timer);
+
        /*
         * Disable the "OS" and "DD" timers - these are designed for Symbian!
         * Example usage in cnh1601578 cpu subsystem pd_timer_app.c
         */
        writel(U300_TIMER_APP_CRC_CLOCK_REQUEST_ENABLE,
-               U300_TIMER_APP_VBASE + U300_TIMER_APP_CRC);
+               u300_timer_base + U300_TIMER_APP_CRC);
        writel(U300_TIMER_APP_ROST_TIMER_RESET,
-               U300_TIMER_APP_VBASE + U300_TIMER_APP_ROST);
+               u300_timer_base + U300_TIMER_APP_ROST);
        writel(U300_TIMER_APP_DOST_TIMER_DISABLE,
-               U300_TIMER_APP_VBASE + U300_TIMER_APP_DOST);
+               u300_timer_base + U300_TIMER_APP_DOST);
        writel(U300_TIMER_APP_RDDT_TIMER_RESET,
-               U300_TIMER_APP_VBASE + U300_TIMER_APP_RDDT);
+               u300_timer_base + U300_TIMER_APP_RDDT);
        writel(U300_TIMER_APP_DDDT_TIMER_DISABLE,
-               U300_TIMER_APP_VBASE + U300_TIMER_APP_DDDT);
+               u300_timer_base + U300_TIMER_APP_DDDT);
 
        /* Reset the General Purpose timer 1. */
        writel(U300_TIMER_APP_RGPT1_TIMER_RESET,
-               U300_TIMER_APP_VBASE + U300_TIMER_APP_RGPT1);
+               u300_timer_base + U300_TIMER_APP_RGPT1);
 
        /* Set up the IRQ handler */
-       setup_irq(IRQ_U300_TIMER_APP_GP1, &u300_timer_irq);
+       setup_irq(irq, &u300_timer_irq);
 
        /* Reset the General Purpose timer 2 */
        writel(U300_TIMER_APP_RGPT2_TIMER_RESET,
-               U300_TIMER_APP_VBASE + U300_TIMER_APP_RGPT2);
+               u300_timer_base + U300_TIMER_APP_RGPT2);
        /* Set this timer to run around forever */
-       writel(0xFFFFFFFFU, U300_TIMER_APP_VBASE + U300_TIMER_APP_GPT2TC);
+       writel(0xFFFFFFFFU, u300_timer_base + U300_TIMER_APP_GPT2TC);
        /* Set continuous mode so it wraps around */
        writel(U300_TIMER_APP_SGPT2M_MODE_CONTINUOUS,
-              U300_TIMER_APP_VBASE + U300_TIMER_APP_SGPT2M);
+              u300_timer_base + U300_TIMER_APP_SGPT2M);
        /* Disable timer interrupts */
        writel(U300_TIMER_APP_GPT2IE_IRQ_DISABLE,
-               U300_TIMER_APP_VBASE + U300_TIMER_APP_GPT2IE);
+               u300_timer_base + U300_TIMER_APP_GPT2IE);
        /* Then enable the GP2 timer to use as a free running us counter */
        writel(U300_TIMER_APP_EGPT2_TIMER_ENABLE,
-               U300_TIMER_APP_VBASE + U300_TIMER_APP_EGPT2);
+               u300_timer_base + U300_TIMER_APP_EGPT2);
 
        /* Use general purpose timer 2 as clock source */
-       if (clocksource_mmio_init(U300_TIMER_APP_VBASE + U300_TIMER_APP_GPT2CC,
+       if (clocksource_mmio_init(u300_timer_base + U300_TIMER_APP_GPT2CC,
                        "GPT2", rate, 300, 32, clocksource_mmio_readl_up))
                pr_err("timer: failed to initialize U300 clock source\n");
 
@@ -413,3 +437,6 @@ void __init u300_timer_init(void)
         * used by hrtimers!
         */
 }
+
+CLOCKSOURCE_OF_DECLARE(u300_timer, "stericsson,u300-apptimer",
+                      u300_timer_init_of);
diff --git a/arch/arm/mach-u300/timer.h b/arch/arm/mach-u300/timer.h
deleted file mode 100644 (file)
index d34287b..0000000
+++ /dev/null
@@ -1 +0,0 @@
-extern void u300_timer_init(void);
diff --git a/arch/arm/mach-u300/u300-gpio.h b/arch/arm/mach-u300/u300-gpio.h
deleted file mode 100644 (file)
index 83f5077..0000000
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Individual pin assignments for the B335/S335.
- * Notice that the actual usage of these pins depends on the
- * PAD MUX settings, that is why the same number can potentially
- * appear several times. In the reference design each pin is only
- * used for one purpose. These were determined by inspecting the
- * S365 schematic.
- */
-#define U300_GPIO_PIN_UART_RX          0
-#define U300_GPIO_PIN_UART_TX          1
-#define U300_GPIO_PIN_UART_CTS         2
-#define U300_GPIO_PIN_UART_RTS         3
-#define U300_GPIO_PIN_CAM_MAIN_STANDBY 4 /* Camera MAIN standby */
-#define U300_GPIO_PIN_GPIO05           5 /* Unrouted */
-#define U300_GPIO_PIN_MS_CD            6 /* Memory Stick Card insertion */
-#define U300_GPIO_PIN_GPIO07           7 /* Test point TP2430 */
-
-#define U300_GPIO_PIN_GPIO08           8 /* Test point TP2437 */
-#define U300_GPIO_PIN_GPIO09           9 /* Test point TP2431 */
-#define U300_GPIO_PIN_GPIO10           10 /* Test point TP2432 */
-#define U300_GPIO_PIN_MMC_CLKRET       11 /* Clock return from MMC/SD card */
-#define U300_GPIO_PIN_MMC_CD           12 /* MMC Card insertion detection */
-#define U300_GPIO_PIN_CAM_SUB_STANDBY  13 /* Camera SUB standby */
-#define U300_GPIO_PIN_GPIO14           14 /* Test point TP2436 */
-#define U300_GPIO_PIN_GPIO15           15 /* Unrouted */
-
-#define U300_GPIO_PIN_GPIO16           16 /* Test point TP2438 */
-#define U300_GPIO_PIN_PHFSENSE         17 /* Headphone jack sensing */
-#define U300_GPIO_PIN_GPIO18           18 /* Test point TP2439 */
-#define U300_GPIO_PIN_GPIO19           19 /* Routed somewhere */
-#define U300_GPIO_PIN_GPIO20           20 /* Unrouted */
-#define U300_GPIO_PIN_GPIO21           21 /* Unrouted */
-#define U300_GPIO_PIN_GPIO22           22 /* Unrouted */
-#define U300_GPIO_PIN_GPIO23           23 /* Unrouted */
-
-#define U300_GPIO_PIN_GPIO24           24 /* Unrouted */
-#define U300_GPIO_PIN_GPIO25           25 /* Unrouted */
-#define U300_GPIO_PIN_GPIO26           26 /* Unrouted */
-#define U300_GPIO_PIN_GPIO27           27 /* Unrouted */
-#define U300_GPIO_PIN_GPIO28           28 /* Unrouted */
-#define U300_GPIO_PIN_GPIO29           29 /* Unrouted */
-#define U300_GPIO_PIN_GPIO30           30 /* Unrouted */
-#define U300_GPIO_PIN_GPIO31           31 /* Unrouted */
-
-#define U300_GPIO_PIN_GPIO32           32 /* Unrouted */
-#define U300_GPIO_PIN_GPIO33           33 /* Unrouted */
-#define U300_GPIO_PIN_GPIO34           34 /* Unrouted */
-#define U300_GPIO_PIN_GPIO35           35 /* Unrouted */
-#define U300_GPIO_PIN_GPIO36           36 /* Unrouted */
-#define U300_GPIO_PIN_GPIO37           37 /* Unrouted */
-#define U300_GPIO_PIN_GPIO38           38 /* Unrouted */
-#define U300_GPIO_PIN_GPIO39           39 /* Unrouted */
-
-#define U300_GPIO_PIN_GPIO40           40 /* Unrouted */
-#define U300_GPIO_PIN_GPIO41           41 /* Unrouted */
-#define U300_GPIO_PIN_GPIO42           42 /* Unrouted */
-#define U300_GPIO_PIN_GPIO43           43 /* Unrouted */
-#define U300_GPIO_PIN_GPIO44           44 /* Unrouted */
-#define U300_GPIO_PIN_GPIO45           45 /* Unrouted */
-#define U300_GPIO_PIN_GPIO46           46 /* Unrouted */
-#define U300_GPIO_PIN_GPIO47           47 /* Unrouted */
-
-#define U300_GPIO_PIN_GPIO48           48 /* Unrouted */
-#define U300_GPIO_PIN_GPIO49           49 /* Unrouted */
-#define U300_GPIO_PIN_GPIO50           50 /* Unrouted */
-#define U300_GPIO_PIN_GPIO51           51 /* Unrouted */
-#define U300_GPIO_PIN_GPIO52           52 /* Unrouted */
-#define U300_GPIO_PIN_GPIO53           53 /* Unrouted */
-#define U300_GPIO_PIN_GPIO54           54 /* Unrouted */
-#define U300_GPIO_PIN_GPIO55           55 /* Unrouted */
index 5907e10c37fd6eef7616a1bd6020a986a200c3d9..b8bbabec6310b1a1090a23b60dd84d4009275b0c 100644 (file)
@@ -57,4 +57,13 @@ config ARCH_VEXPRESS_CORTEX_A5_A9_ERRATA
 config ARCH_VEXPRESS_CA9X4
        bool "Versatile Express Cortex-A9x4 tile"
 
+config ARCH_VEXPRESS_DCSCB
+       bool "Dual Cluster System Control Block (DCSCB) support"
+       depends on MCPM
+       select ARM_CCI
+       help
+         Support for the Dual Cluster System Configuration Block (DCSCB).
+         This is needed to provide CPU and cluster power management
+         on RTSM implementing big.LITTLE.
+
 endmenu
index 42703e8b4d3bcdb674b99f4c01425e0dbcb44a21..48ba89a8149ff13aefff4f5ba4119b58059e2dba 100644 (file)
@@ -6,5 +6,6 @@ ccflags-$(CONFIG_ARCH_MULTIPLATFORM) := -I$(srctree)/$(src)/include \
 
 obj-y                                  := v2m.o
 obj-$(CONFIG_ARCH_VEXPRESS_CA9X4)      += ct-ca9x4.o
+obj-$(CONFIG_ARCH_VEXPRESS_DCSCB)      += dcscb.o      dcscb_setup.o
 obj-$(CONFIG_SMP)                      += platsmp.o
 obj-$(CONFIG_HOTPLUG_CPU)              += hotplug.o
index f134cd4a85f1d98e2ca68baa6fed34d5577b0eab..bde4374ab6d5eb119d24a0e167ea13a20598f5c4 100644 (file)
@@ -6,6 +6,8 @@
 
 void vexpress_dt_smp_map_io(void);
 
+bool vexpress_smp_init_ops(void);
+
 extern struct smp_operations   vexpress_smp_ops;
 
 extern void vexpress_cpu_die(unsigned int cpu);
diff --git a/arch/arm/mach-vexpress/dcscb.c b/arch/arm/mach-vexpress/dcscb.c
new file mode 100644 (file)
index 0000000..16d57a8
--- /dev/null
@@ -0,0 +1,253 @@
+/*
+ * arch/arm/mach-vexpress/dcscb.c - Dual Cluster System Configuration Block
+ *
+ * Created by: Nicolas Pitre, May 2012
+ * Copyright:  (C) 2012-2013  Linaro Limited
+ *
+ * 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/init.h>
+#include <linux/kernel.h>
+#include <linux/io.h>
+#include <linux/spinlock.h>
+#include <linux/errno.h>
+#include <linux/of_address.h>
+#include <linux/vexpress.h>
+#include <linux/arm-cci.h>
+
+#include <asm/mcpm.h>
+#include <asm/proc-fns.h>
+#include <asm/cacheflush.h>
+#include <asm/cputype.h>
+#include <asm/cp15.h>
+
+
+#define RST_HOLD0      0x0
+#define RST_HOLD1      0x4
+#define SYS_SWRESET    0x8
+#define RST_STAT0      0xc
+#define RST_STAT1      0x10
+#define EAG_CFG_R      0x20
+#define EAG_CFG_W      0x24
+#define KFC_CFG_R      0x28
+#define KFC_CFG_W      0x2c
+#define DCS_CFG_R      0x30
+
+/*
+ * We can't use regular spinlocks. In the switcher case, it is possible
+ * for an outbound CPU to call power_down() while its inbound counterpart
+ * is already live using the same logical CPU number which trips lockdep
+ * debugging.
+ */
+static arch_spinlock_t dcscb_lock = __ARCH_SPIN_LOCK_UNLOCKED;
+
+static void __iomem *dcscb_base;
+static int dcscb_use_count[4][2];
+static int dcscb_allcpus_mask[2];
+
+static int dcscb_power_up(unsigned int cpu, unsigned int cluster)
+{
+       unsigned int rst_hold, cpumask = (1 << cpu);
+       unsigned int all_mask = dcscb_allcpus_mask[cluster];
+
+       pr_debug("%s: cpu %u cluster %u\n", __func__, cpu, cluster);
+       if (cpu >= 4 || cluster >= 2)
+               return -EINVAL;
+
+       /*
+        * Since this is called with IRQs enabled, and no arch_spin_lock_irq
+        * variant exists, we need to disable IRQs manually here.
+        */
+       local_irq_disable();
+       arch_spin_lock(&dcscb_lock);
+
+       dcscb_use_count[cpu][cluster]++;
+       if (dcscb_use_count[cpu][cluster] == 1) {
+               rst_hold = readl_relaxed(dcscb_base + RST_HOLD0 + cluster * 4);
+               if (rst_hold & (1 << 8)) {
+                       /* remove cluster reset and add individual CPU's reset */
+                       rst_hold &= ~(1 << 8);
+                       rst_hold |= all_mask;
+               }
+               rst_hold &= ~(cpumask | (cpumask << 4));
+               writel_relaxed(rst_hold, dcscb_base + RST_HOLD0 + cluster * 4);
+       } else if (dcscb_use_count[cpu][cluster] != 2) {
+               /*
+                * The only possible values are:
+                * 0 = CPU down
+                * 1 = CPU (still) up
+                * 2 = CPU requested to be up before it had a chance
+                *     to actually make itself down.
+                * Any other value is a bug.
+                */
+               BUG();
+       }
+
+       arch_spin_unlock(&dcscb_lock);
+       local_irq_enable();
+
+       return 0;
+}
+
+static void dcscb_power_down(void)
+{
+       unsigned int mpidr, cpu, cluster, rst_hold, cpumask, all_mask;
+       bool last_man = false, skip_wfi = false;
+
+       mpidr = read_cpuid_mpidr();
+       cpu = MPIDR_AFFINITY_LEVEL(mpidr, 0);
+       cluster = MPIDR_AFFINITY_LEVEL(mpidr, 1);
+       cpumask = (1 << cpu);
+       all_mask = dcscb_allcpus_mask[cluster];
+
+       pr_debug("%s: cpu %u cluster %u\n", __func__, cpu, cluster);
+       BUG_ON(cpu >= 4 || cluster >= 2);
+
+       __mcpm_cpu_going_down(cpu, cluster);
+
+       arch_spin_lock(&dcscb_lock);
+       BUG_ON(__mcpm_cluster_state(cluster) != CLUSTER_UP);
+       dcscb_use_count[cpu][cluster]--;
+       if (dcscb_use_count[cpu][cluster] == 0) {
+               rst_hold = readl_relaxed(dcscb_base + RST_HOLD0 + cluster * 4);
+               rst_hold |= cpumask;
+               if (((rst_hold | (rst_hold >> 4)) & all_mask) == all_mask) {
+                       rst_hold |= (1 << 8);
+                       last_man = true;
+               }
+               writel_relaxed(rst_hold, dcscb_base + RST_HOLD0 + cluster * 4);
+       } else if (dcscb_use_count[cpu][cluster] == 1) {
+               /*
+                * A power_up request went ahead of us.
+                * Even if we do not want to shut this CPU down,
+                * the caller expects a certain state as if the WFI
+                * was aborted.  So let's continue with cache cleaning.
+                */
+               skip_wfi = true;
+       } else
+               BUG();
+
+       if (last_man && __mcpm_outbound_enter_critical(cpu, cluster)) {
+               arch_spin_unlock(&dcscb_lock);
+
+               /*
+                * Flush all cache levels for this cluster.
+                *
+                * A15/A7 can hit in the cache with SCTLR.C=0, so we don't need
+                * a preliminary flush here for those CPUs.  At least, that's
+                * the theory -- without the extra flush, Linux explodes on
+                * RTSM (to be investigated).
+                */
+               flush_cache_all();
+               set_cr(get_cr() & ~CR_C);
+               flush_cache_all();
+
+               /*
+                * This is a harmless no-op.  On platforms with a real
+                * outer cache this might either be needed or not,
+                * depending on where the outer cache sits.
+                */
+               outer_flush_all();
+
+               /* Disable local coherency by clearing the ACTLR "SMP" bit: */
+               set_auxcr(get_auxcr() & ~(1 << 6));
+
+               /*
+                * Disable cluster-level coherency by masking
+                * incoming snoops and DVM messages:
+                */
+               cci_disable_port_by_cpu(mpidr);
+
+               __mcpm_outbound_leave_critical(cluster, CLUSTER_DOWN);
+       } else {
+               arch_spin_unlock(&dcscb_lock);
+
+               /*
+                * Flush the local CPU cache.
+                *
+                * A15/A7 can hit in the cache with SCTLR.C=0, so we don't need
+                * a preliminary flush here for those CPUs.  At least, that's
+                * the theory -- without the extra flush, Linux explodes on
+                * RTSM (to be investigated).
+                */
+               flush_cache_louis();
+               set_cr(get_cr() & ~CR_C);
+               flush_cache_louis();
+
+               /* Disable local coherency by clearing the ACTLR "SMP" bit: */
+               set_auxcr(get_auxcr() & ~(1 << 6));
+       }
+
+       __mcpm_cpu_down(cpu, cluster);
+
+       /* Now we are prepared for power-down, do it: */
+       dsb();
+       if (!skip_wfi)
+               wfi();
+
+       /* Not dead at this point?  Let our caller cope. */
+}
+
+static const struct mcpm_platform_ops dcscb_power_ops = {
+       .power_up       = dcscb_power_up,
+       .power_down     = dcscb_power_down,
+};
+
+static void __init dcscb_usage_count_init(void)
+{
+       unsigned int mpidr, cpu, cluster;
+
+       mpidr = read_cpuid_mpidr();
+       cpu = MPIDR_AFFINITY_LEVEL(mpidr, 0);
+       cluster = MPIDR_AFFINITY_LEVEL(mpidr, 1);
+
+       pr_debug("%s: cpu %u cluster %u\n", __func__, cpu, cluster);
+       BUG_ON(cpu >= 4 || cluster >= 2);
+       dcscb_use_count[cpu][cluster] = 1;
+}
+
+extern void dcscb_power_up_setup(unsigned int affinity_level);
+
+static int __init dcscb_init(void)
+{
+       struct device_node *node;
+       unsigned int cfg;
+       int ret;
+
+       if (!cci_probed())
+               return -ENODEV;
+
+       node = of_find_compatible_node(NULL, NULL, "arm,rtsm,dcscb");
+       if (!node)
+               return -ENODEV;
+       dcscb_base = of_iomap(node, 0);
+       if (!dcscb_base)
+               return -EADDRNOTAVAIL;
+       cfg = readl_relaxed(dcscb_base + DCS_CFG_R);
+       dcscb_allcpus_mask[0] = (1 << (((cfg >> 16) >> (0 << 2)) & 0xf)) - 1;
+       dcscb_allcpus_mask[1] = (1 << (((cfg >> 16) >> (1 << 2)) & 0xf)) - 1;
+       dcscb_usage_count_init();
+
+       ret = mcpm_platform_register(&dcscb_power_ops);
+       if (!ret)
+               ret = mcpm_sync_init(dcscb_power_up_setup);
+       if (ret) {
+               iounmap(dcscb_base);
+               return ret;
+       }
+
+       pr_info("VExpress DCSCB support installed\n");
+
+       /*
+        * Future entries into the kernel can now go
+        * through the cluster entry vectors.
+        */
+       vexpress_flags_set(virt_to_phys(mcpm_entry_point));
+
+       return 0;
+}
+
+early_initcall(dcscb_init);
diff --git a/arch/arm/mach-vexpress/dcscb_setup.S b/arch/arm/mach-vexpress/dcscb_setup.S
new file mode 100644 (file)
index 0000000..4bb7fbe
--- /dev/null
@@ -0,0 +1,38 @@
+/*
+ * arch/arm/include/asm/dcscb_setup.S
+ *
+ * Created by:  Dave Martin, 2012-06-22
+ * Copyright:   (C) 2012-2013  Linaro Limited
+ *
+ * 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>
+
+
+ENTRY(dcscb_power_up_setup)
+
+       cmp     r0, #0                  @ check affinity level
+       beq     2f
+
+/*
+ * Enable cluster-level coherency, in preparation for turning on the MMU.
+ * The ACTLR SMP bit does not need to be set here, because cpu_resume()
+ * already restores that.
+ *
+ * A15/A7 may not require explicit L2 invalidation on reset, dependent
+ * on hardware integration decisions.
+ * For now, this code assumes that L2 is either already invalidated,
+ * or invalidation is not required.
+ */
+
+       b       cci_enable_port_for_self
+
+2:     @ Implementation-specific local CPU setup operations should go here,
+       @ if any.  In this case, there is nothing to do.
+
+       bx      lr
+
+ENDPROC(dcscb_power_up_setup)
index dc1ace55d5578bdcb96930fa7dabde0bb692ddd9..993c9ae5dc5e16f01605770da107bfb20b1a027f 100644 (file)
 #include <linux/errno.h>
 #include <linux/smp.h>
 #include <linux/io.h>
+#include <linux/of.h>
 #include <linux/of_fdt.h>
 #include <linux/vexpress.h>
 
+#include <asm/mcpm.h>
 #include <asm/smp_scu.h>
 #include <asm/mach/map.h>
 
@@ -203,3 +205,21 @@ struct smp_operations __initdata vexpress_smp_ops = {
        .cpu_die                = vexpress_cpu_die,
 #endif
 };
+
+bool __init vexpress_smp_init_ops(void)
+{
+#ifdef CONFIG_MCPM
+       /*
+        * The best way to detect a multi-cluster configuration at the moment
+        * is to look for the presence of a CCI in the system.
+        * Override the default vexpress_smp_ops if so.
+        */
+       struct device_node *node;
+       node = of_find_compatible_node(NULL, NULL, "arm,cci-400");
+       if (node && of_device_is_available(node)) {
+               mcpm_smp_set_ops();
+               return true;
+       }
+#endif
+       return false;
+}
index 8802030df98d0fbac53f4cd1f01df30f598f1773..b0eccf7e06ecb0331a32973acc5664d8fedaa933 100644 (file)
@@ -456,6 +456,7 @@ static const char * const v2m_dt_match[] __initconst = {
 DT_MACHINE_START(VEXPRESS_DT, "ARM-Versatile Express")
        .dt_compat      = v2m_dt_match,
        .smp            = smp_ops(vexpress_smp_ops),
+       .smp_init       = smp_init_ops(vexpress_smp_init_ops),
        .map_io         = v2m_dt_map_io,
        .init_early     = v2m_dt_init_early,
        .init_irq       = irqchip_init,
index 042afc1f8c4425f4ce887910dd4a5daddb4e8615..7ddbfa60227f8e267acc58bca381428fdb99e294 100644 (file)
@@ -3,4 +3,3 @@
 #
 
 obj-y                                  := virt.o
-obj-$(CONFIG_SMP)                      += platsmp.o
diff --git a/arch/arm/mach-virt/platsmp.c b/arch/arm/mach-virt/platsmp.c
deleted file mode 100644 (file)
index f4143f5..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Dummy Virtual Machine - does what it says on the tin.
- *
- * Copyright (C) 2012 ARM Ltd
- * Author: Will Deacon <will.deacon@arm.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-#include <linux/init.h>
-#include <linux/smp.h>
-#include <linux/of.h>
-
-#include <asm/psci.h>
-#include <asm/smp_plat.h>
-
-extern void secondary_startup(void);
-
-static void __init virt_smp_init_cpus(void)
-{
-}
-
-static void __init virt_smp_prepare_cpus(unsigned int max_cpus)
-{
-}
-
-static int __cpuinit virt_boot_secondary(unsigned int cpu,
-                                        struct task_struct *idle)
-{
-       if (psci_ops.cpu_on)
-               return psci_ops.cpu_on(cpu_logical_map(cpu),
-                                      __pa(secondary_startup));
-       return -ENODEV;
-}
-
-struct smp_operations __initdata virt_smp_ops = {
-       .smp_init_cpus          = virt_smp_init_cpus,
-       .smp_prepare_cpus       = virt_smp_prepare_cpus,
-       .smp_boot_secondary     = virt_boot_secondary,
-};
index 061f283f579e891b59f8a0c17c0dcafa7bdc4288..a67d2dd5bb6062e7eede85ef612ac6c072c9e7ea 100644 (file)
@@ -36,11 +36,8 @@ static const char *virt_dt_match[] = {
        NULL
 };
 
-extern struct smp_operations virt_smp_ops;
-
 DT_MACHINE_START(VIRT, "Dummy Virtual Machine")
        .init_irq       = irqchip_init,
        .init_machine   = virt_init,
-       .smp            = smp_ops(virt_smp_ops),
        .dt_compat      = virt_dt_match,
 MACHINE_END
index c70969b9c258d47a49880699a621f9e2c58997b3..50d008d8f87f17cf7e2f1c0c0a65e443d4b8cc2a 100644 (file)
@@ -117,7 +117,7 @@ int __init zynq_slcr_init(void)
 
        pr_info("%s mapped to %p\n", np->name, zynq_slcr_base);
 
-       xilinx_zynq_clocks_init(zynq_slcr_base);
+       zynq_clock_init(zynq_slcr_base);
 
        of_node_put(np);
 
index 35955b54944c1c5ed39bf051667b337aeaa7dee3..9e8101ecd63e6a2b158849b74e14921a2b273177 100644 (file)
@@ -397,6 +397,15 @@ config CPU_V7
        select CPU_PABRT_V7
        select CPU_TLB_V7 if MMU
 
+# ARMv7M
+config CPU_V7M
+       bool
+       select CPU_32v7M
+       select CPU_ABRT_NOMMU
+       select CPU_CACHE_NOP
+       select CPU_PABRT_LEGACY
+       select CPU_THUMBONLY
+
 config CPU_THUMBONLY
        bool
        # There are no CPUs available with MMU that don't implement an ARM ISA:
@@ -441,6 +450,9 @@ config CPU_32v6K
 config CPU_32v7
        bool
 
+config CPU_32v7M
+       bool
+
 # The abort model
 config CPU_ABRT_NOMMU
        bool
@@ -491,6 +503,9 @@ config CPU_CACHE_V6
 config CPU_CACHE_V7
        bool
 
+config CPU_CACHE_NOP
+       bool
+
 config CPU_CACHE_VIVT
        bool
 
@@ -613,7 +628,11 @@ config ARCH_DMA_ADDR_T_64BIT
 
 config ARM_THUMB
        bool "Support Thumb user binaries" if !CPU_THUMBONLY
-       depends on CPU_ARM720T || CPU_ARM740T || CPU_ARM920T || CPU_ARM922T || CPU_ARM925T || CPU_ARM926T || CPU_ARM940T || CPU_ARM946E || CPU_ARM1020 || CPU_ARM1020E || CPU_ARM1022 || CPU_ARM1026 || CPU_XSCALE || CPU_XSC3 || CPU_MOHAWK || CPU_V6 || CPU_V6K || CPU_V7 || CPU_FEROCEON
+       depends on CPU_ARM720T || CPU_ARM740T || CPU_ARM920T || CPU_ARM922T || \
+               CPU_ARM925T || CPU_ARM926T || CPU_ARM940T || CPU_ARM946E || \
+               CPU_ARM1020 || CPU_ARM1020E || CPU_ARM1022 || CPU_ARM1026 || \
+               CPU_XSCALE || CPU_XSC3 || CPU_MOHAWK || CPU_V6 || CPU_V6K || \
+               CPU_V7 || CPU_FEROCEON || CPU_V7M
        default y
        help
          Say Y if you want to include kernel support for running user space
index 9e51be96f635b5945b978bed2c6978fd3d2b61ba..ee558a01f390925ca016f901697091660be48af4 100644 (file)
@@ -39,6 +39,7 @@ obj-$(CONFIG_CPU_CACHE_V4WB)  += cache-v4wb.o
 obj-$(CONFIG_CPU_CACHE_V6)     += cache-v6.o
 obj-$(CONFIG_CPU_CACHE_V7)     += cache-v7.o
 obj-$(CONFIG_CPU_CACHE_FA)     += cache-fa.o
+obj-$(CONFIG_CPU_CACHE_NOP)    += cache-nop.o
 
 AFLAGS_cache-v6.o      :=-Wa,-march=armv6
 AFLAGS_cache-v7.o      :=-Wa,-march=armv7-a
@@ -87,6 +88,7 @@ obj-$(CONFIG_CPU_FEROCEON)    += proc-feroceon.o
 obj-$(CONFIG_CPU_V6)           += proc-v6.o
 obj-$(CONFIG_CPU_V6K)          += proc-v6.o
 obj-$(CONFIG_CPU_V7)           += proc-v7.o
+obj-$(CONFIG_CPU_V7M)          += proc-v7m.o
 
 AFLAGS_proc-v6.o       :=-Wa,-march=armv6
 AFLAGS_proc-v7.o       :=-Wa,-march=armv7-a
diff --git a/arch/arm/mm/cache-nop.S b/arch/arm/mm/cache-nop.S
new file mode 100644 (file)
index 0000000..8e12ddc
--- /dev/null
@@ -0,0 +1,50 @@
+/*
+ * 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>
+
+#include "proc-macros.S"
+
+ENTRY(nop_flush_icache_all)
+       mov     pc, lr
+ENDPROC(nop_flush_icache_all)
+
+       .globl nop_flush_kern_cache_all
+       .equ nop_flush_kern_cache_all, nop_flush_icache_all
+
+       .globl nop_flush_kern_cache_louis
+       .equ nop_flush_kern_cache_louis, nop_flush_icache_all
+
+       .globl nop_flush_user_cache_all
+       .equ nop_flush_user_cache_all, nop_flush_icache_all
+
+       .globl nop_flush_user_cache_range
+       .equ nop_flush_user_cache_range, nop_flush_icache_all
+
+       .globl nop_coherent_kern_range
+       .equ nop_coherent_kern_range, nop_flush_icache_all
+
+ENTRY(nop_coherent_user_range)
+       mov     r0, 0
+       mov     pc, lr
+ENDPROC(nop_coherent_user_range)
+
+       .globl nop_flush_kern_dcache_area
+       .equ nop_flush_kern_dcache_area, nop_flush_icache_all
+
+       .globl nop_dma_flush_range
+       .equ nop_dma_flush_range, nop_flush_icache_all
+
+       .globl nop_dma_map_area
+       .equ nop_dma_map_area, nop_flush_icache_all
+
+       .globl nop_dma_unmap_area
+       .equ nop_dma_unmap_area, nop_flush_icache_all
+
+       __INITDATA
+
+       @ define struct cpu_cache_fns (see <asm/cacheflush.h> and proc-macros.S)
+       define_cache_functions nop
index d51225f90ae2d5d3af909ec87d29910bea4f23d5..dd3a6c670f088b7d2892970c370d4dbc51e03a4c 100644 (file)
 
 void __init arm_mm_memblock_reserve(void)
 {
+#ifndef CONFIG_CPU_V7M
        /*
         * Register the exception vector page.
         * some architectures which the DRAM is the exception vector to trap,
         * alloc_page breaks with error, although it is not NULL, but "0."
         */
        memblock_reserve(CONFIG_VECTORS_BASE, PAGE_SIZE);
+#else /* ifndef CONFIG_CPU_V7M */
+       /*
+        * There is no dedicated vector page on V7-M. So nothing needs to be
+        * reserved here.
+        */
+#endif
 }
 
 void __init sanity_check_meminfo(void)
diff --git a/arch/arm/mm/proc-v7m.S b/arch/arm/mm/proc-v7m.S
new file mode 100644 (file)
index 0000000..0c93588
--- /dev/null
@@ -0,0 +1,157 @@
+/*
+ *  linux/arch/arm/mm/proc-v7m.S
+ *
+ *  Copyright (C) 2008 ARM Ltd.
+ *  Copyright (C) 2001 Deep Blue Solutions 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 is the "shell" of the ARMv7-M processor support.
+ */
+#include <linux/linkage.h>
+#include <asm/assembler.h>
+#include <asm/v7m.h>
+#include "proc-macros.S"
+
+ENTRY(cpu_v7m_proc_init)
+       mov     pc, lr
+ENDPROC(cpu_v7m_proc_init)
+
+ENTRY(cpu_v7m_proc_fin)
+       mov     pc, lr
+ENDPROC(cpu_v7m_proc_fin)
+
+/*
+ *     cpu_v7m_reset(loc)
+ *
+ *     Perform a soft reset of the system.  Put the CPU into the
+ *     same state as it would be if it had been reset, and branch
+ *     to what would be the reset vector.
+ *
+ *     - loc   - location to jump to for soft reset
+ */
+       .align  5
+ENTRY(cpu_v7m_reset)
+       mov     pc, r0
+ENDPROC(cpu_v7m_reset)
+
+/*
+ *     cpu_v7m_do_idle()
+ *
+ *     Idle the processor (eg, wait for interrupt).
+ *
+ *     IRQs are already disabled.
+ */
+ENTRY(cpu_v7m_do_idle)
+       wfi
+       mov     pc, lr
+ENDPROC(cpu_v7m_do_idle)
+
+ENTRY(cpu_v7m_dcache_clean_area)
+       mov     pc, lr
+ENDPROC(cpu_v7m_dcache_clean_area)
+
+/*
+ * There is no MMU, so here is nothing to do.
+ */
+ENTRY(cpu_v7m_switch_mm)
+       mov     pc, lr
+ENDPROC(cpu_v7m_switch_mm)
+
+.globl cpu_v7m_suspend_size
+.equ   cpu_v7m_suspend_size, 0
+
+#ifdef CONFIG_ARM_CPU_SUSPEND
+ENTRY(cpu_v7m_do_suspend)
+       mov     pc, lr
+ENDPROC(cpu_v7m_do_suspend)
+
+ENTRY(cpu_v7m_do_resume)
+       mov     pc, lr
+ENDPROC(cpu_v7m_do_resume)
+#endif
+
+       .section ".text.init", #alloc, #execinstr
+
+/*
+ *     __v7m_setup
+ *
+ *     This should be able to cover all ARMv7-M cores.
+ */
+__v7m_setup:
+       @ Configure the vector table base address
+       ldr     r0, =BASEADDR_V7M_SCB
+       ldr     r12, =vector_table
+       str     r12, [r0, V7M_SCB_VTOR]
+
+       @ enable UsageFault, BusFault and MemManage fault.
+       ldr     r5, [r0, #V7M_SCB_SHCSR]
+       orr     r5, #(V7M_SCB_SHCSR_USGFAULTENA | V7M_SCB_SHCSR_BUSFAULTENA | V7M_SCB_SHCSR_MEMFAULTENA)
+       str     r5, [r0, #V7M_SCB_SHCSR]
+
+       @ Lower the priority of the SVC and PendSV exceptions
+       mov     r5, #0x80000000
+       str     r5, [r0, V7M_SCB_SHPR2] @ set SVC priority
+       mov     r5, #0x00800000
+       str     r5, [r0, V7M_SCB_SHPR3] @ set PendSV priority
+
+       @ SVC to run the kernel in this mode
+       adr     r1, BSYM(1f)
+       ldr     r5, [r12, #11 * 4]      @ read the SVC vector entry
+       str     r1, [r12, #11 * 4]      @ write the temporary SVC vector entry
+       mov     r6, lr                  @ save LR
+       mov     r7, sp                  @ save SP
+       ldr     sp, =__v7m_setup_stack_top
+       cpsie   i
+       svc     #0
+1:     cpsid   i
+       str     r5, [r12, #11 * 4]      @ restore the original SVC vector entry
+       mov     lr, r6                  @ restore LR
+       mov     sp, r7                  @ restore SP
+
+       @ Special-purpose control register
+       mov     r1, #1
+       msr     control, r1             @ Thread mode has unpriviledged access
+
+       @ Configure the System Control Register to ensure 8-byte stack alignment
+       @ Note the STKALIGN bit is either RW or RAO.
+       ldr     r12, [r0, V7M_SCB_CCR]  @ system control register
+       orr     r12, #V7M_SCB_CCR_STKALIGN
+       str     r12, [r0, V7M_SCB_CCR]
+       mov     pc, lr
+ENDPROC(__v7m_setup)
+
+       define_processor_functions v7m, dabort=nommu_early_abort, pabort=legacy_pabort, nommu=1
+
+       .section ".rodata"
+       string cpu_arch_name, "armv7m"
+       string cpu_elf_name "v7m"
+       string cpu_v7m_name "ARMv7-M"
+
+       .section ".proc.info.init", #alloc, #execinstr
+
+       /*
+        * Match any ARMv7-M processor core.
+        */
+       .type   __v7m_proc_info, #object
+__v7m_proc_info:
+       .long   0x000f0000              @ Required ID value
+       .long   0x000f0000              @ Mask for ID
+       .long   0                       @ proc_info_list.__cpu_mm_mmu_flags
+       .long   0                       @ proc_info_list.__cpu_io_mmu_flags
+       b       __v7m_setup             @ proc_info_list.__cpu_flush
+       .long   cpu_arch_name
+       .long   cpu_elf_name
+       .long   HWCAP_HALF|HWCAP_THUMB|HWCAP_FAST_MULT
+       .long   cpu_v7m_name
+       .long   v7m_processor_functions @ proc_info_list.proc
+       .long   0                       @ proc_info_list.tlb
+       .long   0                       @ proc_info_list.user
+       .long   nop_cache_fns           @ proc_info_list.cache
+       .size   __v7m_proc_info, . - __v7m_proc_info
+
+__v7m_setup_stack:
+       .space  4 * 8                           @ 8 registers
+__v7m_setup_stack_top:
index d01576318b2c82e445a0fb01b6781b077f88bb19..bd3a6db14cbb65987c3c20d1db3e9ccd8a5d4db6 100644 (file)
@@ -28,7 +28,6 @@ struct s3c24xx_dma_map {
        const char              *name;
 
        unsigned long            channels[S3C_DMA_CHANNELS];
-       unsigned long            channels_rx[S3C_DMA_CHANNELS];
 };
 
 struct s3c24xx_dma_selection {
@@ -38,10 +37,6 @@ struct s3c24xx_dma_selection {
 
        void    (*select)(struct s3c2410_dma_chan *chan,
                          struct s3c24xx_dma_map *map);
-
-       void    (*direction)(struct s3c2410_dma_chan *chan,
-                            struct s3c24xx_dma_map *map,
-                            enum dma_data_direction dir);
 };
 
 extern int s3c24xx_dma_init_map(struct s3c24xx_dma_selection *sel);
index b05ecab915c4ba30e1ea668f09f700b1d2519937..5286e2d333b09752b0bf7a342dc63f4650b29f63 100644 (file)
@@ -26,4 +26,11 @@ config OMAP_INTERCONNECT
 
        help
          Driver to enable OMAP interconnect error handling driver.
+
+config ARM_CCI
+       bool "ARM CCI driver support"
+       depends on ARM
+       help
+         Driver supporting the CCI cache coherent interconnect for ARM
+         platforms.
 endmenu
index 3c7b53c12091cb0cdafa5ab74fd43ddc616ae5c9..670cea4438023cce1d71d2f62af509855ccee694 100644 (file)
@@ -7,3 +7,5 @@ obj-$(CONFIG_OMAP_OCP2SCP)      += omap-ocp2scp.o
 
 # Interconnect bus driver for OMAP SoCs.
 obj-$(CONFIG_OMAP_INTERCONNECT)        += omap_l3_smx.o omap_l3_noc.o
+# CCI cache coherent interconnect for ARM platforms
+obj-$(CONFIG_ARM_CCI)          += arm-cci.o
diff --git a/drivers/bus/arm-cci.c b/drivers/bus/arm-cci.c
new file mode 100644 (file)
index 0000000..7332889
--- /dev/null
@@ -0,0 +1,533 @@
+/*
+ * CCI cache coherent interconnect driver
+ *
+ * Copyright (C) 2013 ARM Ltd.
+ * Author: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed "as is" WITHOUT ANY WARRANTY of any
+ * kind, whether express or implied; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
+
+#include <linux/arm-cci.h>
+#include <linux/io.h>
+#include <linux/module.h>
+#include <linux/of_address.h>
+#include <linux/slab.h>
+
+#include <asm/cacheflush.h>
+#include <asm/smp_plat.h>
+
+#define CCI_PORT_CTRL          0x0
+#define CCI_CTRL_STATUS                0xc
+
+#define CCI_ENABLE_SNOOP_REQ   0x1
+#define CCI_ENABLE_DVM_REQ     0x2
+#define CCI_ENABLE_REQ         (CCI_ENABLE_SNOOP_REQ | CCI_ENABLE_DVM_REQ)
+
+struct cci_nb_ports {
+       unsigned int nb_ace;
+       unsigned int nb_ace_lite;
+};
+
+enum cci_ace_port_type {
+       ACE_INVALID_PORT = 0x0,
+       ACE_PORT,
+       ACE_LITE_PORT,
+};
+
+struct cci_ace_port {
+       void __iomem *base;
+       unsigned long phys;
+       enum cci_ace_port_type type;
+       struct device_node *dn;
+};
+
+static struct cci_ace_port *ports;
+static unsigned int nb_cci_ports;
+
+static void __iomem *cci_ctrl_base;
+static unsigned long cci_ctrl_phys;
+
+struct cpu_port {
+       u64 mpidr;
+       u32 port;
+};
+
+/*
+ * Use the port MSB as valid flag, shift can be made dynamic
+ * by computing number of bits required for port indexes.
+ * Code disabling CCI cpu ports runs with D-cache invalidated
+ * and SCTLR bit clear so data accesses must be kept to a minimum
+ * to improve performance; for now shift is left static to
+ * avoid one more data access while disabling the CCI port.
+ */
+#define PORT_VALID_SHIFT       31
+#define PORT_VALID             (0x1 << PORT_VALID_SHIFT)
+
+static inline void init_cpu_port(struct cpu_port *port, u32 index, u64 mpidr)
+{
+       port->port = PORT_VALID | index;
+       port->mpidr = mpidr;
+}
+
+static inline bool cpu_port_is_valid(struct cpu_port *port)
+{
+       return !!(port->port & PORT_VALID);
+}
+
+static inline bool cpu_port_match(struct cpu_port *port, u64 mpidr)
+{
+       return port->mpidr == (mpidr & MPIDR_HWID_BITMASK);
+}
+
+static struct cpu_port cpu_port[NR_CPUS];
+
+/**
+ * __cci_ace_get_port - Function to retrieve the port index connected to
+ *                     a cpu or device.
+ *
+ * @dn: device node of the device to look-up
+ * @type: port type
+ *
+ * Return value:
+ *     - CCI port index if success
+ *     - -ENODEV if failure
+ */
+static int __cci_ace_get_port(struct device_node *dn, int type)
+{
+       int i;
+       bool ace_match;
+       struct device_node *cci_portn;
+
+       cci_portn = of_parse_phandle(dn, "cci-control-port", 0);
+       for (i = 0; i < nb_cci_ports; i++) {
+               ace_match = ports[i].type == type;
+               if (ace_match && cci_portn == ports[i].dn)
+                       return i;
+       }
+       return -ENODEV;
+}
+
+int cci_ace_get_port(struct device_node *dn)
+{
+       return __cci_ace_get_port(dn, ACE_LITE_PORT);
+}
+EXPORT_SYMBOL_GPL(cci_ace_get_port);
+
+static void __init cci_ace_init_ports(void)
+{
+       int port, ac, cpu;
+       u64 hwid;
+       const u32 *cell;
+       struct device_node *cpun, *cpus;
+
+       cpus = of_find_node_by_path("/cpus");
+       if (WARN(!cpus, "Missing cpus node, bailing out\n"))
+               return;
+
+       if (WARN_ON(of_property_read_u32(cpus, "#address-cells", &ac)))
+               ac = of_n_addr_cells(cpus);
+
+       /*
+        * Port index look-up speeds up the function disabling ports by CPU,
+        * since the logical to port index mapping is done once and does
+        * not change after system boot.
+        * The stashed index array is initialized for all possible CPUs
+        * at probe time.
+        */
+       for_each_child_of_node(cpus, cpun) {
+               if (of_node_cmp(cpun->type, "cpu"))
+                       continue;
+               cell = of_get_property(cpun, "reg", NULL);
+               if (WARN(!cell, "%s: missing reg property\n", cpun->full_name))
+                       continue;
+
+               hwid = of_read_number(cell, ac);
+               cpu = get_logical_index(hwid & MPIDR_HWID_BITMASK);
+
+               if (cpu < 0 || !cpu_possible(cpu))
+                       continue;
+               port = __cci_ace_get_port(cpun, ACE_PORT);
+               if (port < 0)
+                       continue;
+
+               init_cpu_port(&cpu_port[cpu], port, cpu_logical_map(cpu));
+       }
+
+       for_each_possible_cpu(cpu) {
+               WARN(!cpu_port_is_valid(&cpu_port[cpu]),
+                       "CPU %u does not have an associated CCI port\n",
+                       cpu);
+       }
+}
+/*
+ * Functions to enable/disable a CCI interconnect slave port
+ *
+ * They are called by low-level power management code to disable slave
+ * interfaces snoops and DVM broadcast.
+ * Since they may execute with cache data allocation disabled and
+ * after the caches have been cleaned and invalidated the functions provide
+ * no explicit locking since they may run with D-cache disabled, so normal
+ * cacheable kernel locks based on ldrex/strex may not work.
+ * Locking has to be provided by BSP implementations to ensure proper
+ * operations.
+ */
+
+/**
+ * cci_port_control() - function to control a CCI port
+ *
+ * @port: index of the port to setup
+ * @enable: if true enables the port, if false disables it
+ */
+static void notrace cci_port_control(unsigned int port, bool enable)
+{
+       void __iomem *base = ports[port].base;
+
+       writel_relaxed(enable ? CCI_ENABLE_REQ : 0, base + CCI_PORT_CTRL);
+       /*
+        * This function is called from power down procedures
+        * and must not execute any instruction that might
+        * cause the processor to be put in a quiescent state
+        * (eg wfi). Hence, cpu_relax() can not be added to this
+        * read loop to optimize power, since it might hide possibly
+        * disruptive operations.
+        */
+       while (readl_relaxed(cci_ctrl_base + CCI_CTRL_STATUS) & 0x1)
+                       ;
+}
+
+/**
+ * cci_disable_port_by_cpu() - function to disable a CCI port by CPU
+ *                            reference
+ *
+ * @mpidr: mpidr of the CPU whose CCI port should be disabled
+ *
+ * Disabling a CCI port for a CPU implies disabling the CCI port
+ * controlling that CPU cluster. Code disabling CPU CCI ports
+ * must make sure that the CPU running the code is the last active CPU
+ * in the cluster ie all other CPUs are quiescent in a low power state.
+ *
+ * Return:
+ *     0 on success
+ *     -ENODEV on port look-up failure
+ */
+int notrace cci_disable_port_by_cpu(u64 mpidr)
+{
+       int cpu;
+       bool is_valid;
+       for (cpu = 0; cpu < nr_cpu_ids; cpu++) {
+               is_valid = cpu_port_is_valid(&cpu_port[cpu]);
+               if (is_valid && cpu_port_match(&cpu_port[cpu], mpidr)) {
+                       cci_port_control(cpu_port[cpu].port, false);
+                       return 0;
+               }
+       }
+       return -ENODEV;
+}
+EXPORT_SYMBOL_GPL(cci_disable_port_by_cpu);
+
+/**
+ * cci_enable_port_for_self() - enable a CCI port for calling CPU
+ *
+ * Enabling a CCI port for the calling CPU implies enabling the CCI
+ * port controlling that CPU's cluster. Caller must make sure that the
+ * CPU running the code is the first active CPU in the cluster and all
+ * other CPUs are quiescent in a low power state  or waiting for this CPU
+ * to complete the CCI initialization.
+ *
+ * Because this is called when the MMU is still off and with no stack,
+ * the code must be position independent and ideally rely on callee
+ * clobbered registers only.  To achieve this we must code this function
+ * entirely in assembler.
+ *
+ * On success this returns with the proper CCI port enabled.  In case of
+ * any failure this never returns as the inability to enable the CCI is
+ * fatal and there is no possible recovery at this stage.
+ */
+asmlinkage void __naked cci_enable_port_for_self(void)
+{
+       asm volatile ("\n"
+"      .arch armv7-a\n"
+"      mrc     p15, 0, r0, c0, c0, 5   @ get MPIDR value \n"
+"      and     r0, r0, #"__stringify(MPIDR_HWID_BITMASK)" \n"
+"      adr     r1, 5f \n"
+"      ldr     r2, [r1] \n"
+"      add     r1, r1, r2              @ &cpu_port \n"
+"      add     ip, r1, %[sizeof_cpu_port] \n"
+
+       /* Loop over the cpu_port array looking for a matching MPIDR */
+"1:    ldr     r2, [r1, %[offsetof_cpu_port_mpidr_lsb]] \n"
+"      cmp     r2, r0                  @ compare MPIDR \n"
+"      bne     2f \n"
+
+       /* Found a match, now test port validity */
+"      ldr     r3, [r1, %[offsetof_cpu_port_port]] \n"
+"      tst     r3, #"__stringify(PORT_VALID)" \n"
+"      bne     3f \n"
+
+       /* no match, loop with the next cpu_port entry */
+"2:    add     r1, r1, %[sizeof_struct_cpu_port] \n"
+"      cmp     r1, ip                  @ done? \n"
+"      blo     1b \n"
+
+       /* CCI port not found -- cheaply try to stall this CPU */
+"cci_port_not_found: \n"
+"      wfi \n"
+"      wfe \n"
+"      b       cci_port_not_found \n"
+
+       /* Use matched port index to look up the corresponding ports entry */
+"3:    bic     r3, r3, #"__stringify(PORT_VALID)" \n"
+"      adr     r0, 6f \n"
+"      ldmia   r0, {r1, r2} \n"
+"      sub     r1, r1, r0              @ virt - phys \n"
+"      ldr     r0, [r0, r2]            @ *(&ports) \n"
+"      mov     r2, %[sizeof_struct_ace_port] \n"
+"      mla     r0, r2, r3, r0          @ &ports[index] \n"
+"      sub     r0, r0, r1              @ virt_to_phys() \n"
+
+       /* Enable the CCI port */
+"      ldr     r0, [r0, %[offsetof_port_phys]] \n"
+"      mov     r3, #"__stringify(CCI_ENABLE_REQ)" \n"
+"      str     r3, [r0, #"__stringify(CCI_PORT_CTRL)"] \n"
+
+       /* poll the status reg for completion */
+"      adr     r1, 7f \n"
+"      ldr     r0, [r1] \n"
+"      ldr     r0, [r0, r1]            @ cci_ctrl_base \n"
+"4:    ldr     r1, [r0, #"__stringify(CCI_CTRL_STATUS)"] \n"
+"      tst     r1, #1 \n"
+"      bne     4b \n"
+
+"      mov     r0, #0 \n"
+"      bx      lr \n"
+
+"      .align  2 \n"
+"5:    .word   cpu_port - . \n"
+"6:    .word   . \n"
+"      .word   ports - 6b \n"
+"7:    .word   cci_ctrl_phys - . \n"
+       : :
+       [sizeof_cpu_port] "i" (sizeof(cpu_port)),
+#ifndef __ARMEB__
+       [offsetof_cpu_port_mpidr_lsb] "i" (offsetof(struct cpu_port, mpidr)),
+#else
+       [offsetof_cpu_port_mpidr_lsb] "i" (offsetof(struct cpu_port, mpidr)+4),
+#endif
+       [offsetof_cpu_port_port] "i" (offsetof(struct cpu_port, port)),
+       [sizeof_struct_cpu_port] "i" (sizeof(struct cpu_port)),
+       [sizeof_struct_ace_port] "i" (sizeof(struct cci_ace_port)),
+       [offsetof_port_phys] "i" (offsetof(struct cci_ace_port, phys)) );
+
+       unreachable();
+}
+
+/**
+ * __cci_control_port_by_device() - function to control a CCI port by device
+ *                                 reference
+ *
+ * @dn: device node pointer of the device whose CCI port should be
+ *      controlled
+ * @enable: if true enables the port, if false disables it
+ *
+ * Return:
+ *     0 on success
+ *     -ENODEV on port look-up failure
+ */
+int notrace __cci_control_port_by_device(struct device_node *dn, bool enable)
+{
+       int port;
+
+       if (!dn)
+               return -ENODEV;
+
+       port = __cci_ace_get_port(dn, ACE_LITE_PORT);
+       if (WARN_ONCE(port < 0, "node %s ACE lite port look-up failure\n",
+                               dn->full_name))
+               return -ENODEV;
+       cci_port_control(port, enable);
+       return 0;
+}
+EXPORT_SYMBOL_GPL(__cci_control_port_by_device);
+
+/**
+ * __cci_control_port_by_index() - function to control a CCI port by port index
+ *
+ * @port: port index previously retrieved with cci_ace_get_port()
+ * @enable: if true enables the port, if false disables it
+ *
+ * Return:
+ *     0 on success
+ *     -ENODEV on port index out of range
+ *     -EPERM if operation carried out on an ACE PORT
+ */
+int notrace __cci_control_port_by_index(u32 port, bool enable)
+{
+       if (port >= nb_cci_ports || ports[port].type == ACE_INVALID_PORT)
+               return -ENODEV;
+       /*
+        * CCI control for ports connected to CPUS is extremely fragile
+        * and must be made to go through a specific and controlled
+        * interface (ie cci_disable_port_by_cpu(); control by general purpose
+        * indexing is therefore disabled for ACE ports.
+        */
+       if (ports[port].type == ACE_PORT)
+               return -EPERM;
+
+       cci_port_control(port, enable);
+       return 0;
+}
+EXPORT_SYMBOL_GPL(__cci_control_port_by_index);
+
+static const struct cci_nb_ports cci400_ports = {
+       .nb_ace = 2,
+       .nb_ace_lite = 3
+};
+
+static const struct of_device_id arm_cci_matches[] = {
+       {.compatible = "arm,cci-400", .data = &cci400_ports },
+       {},
+};
+
+static const struct of_device_id arm_cci_ctrl_if_matches[] = {
+       {.compatible = "arm,cci-400-ctrl-if", },
+       {},
+};
+
+static int __init cci_probe(void)
+{
+       struct cci_nb_ports const *cci_config;
+       int ret, i, nb_ace = 0, nb_ace_lite = 0;
+       struct device_node *np, *cp;
+       struct resource res;
+       const char *match_str;
+       bool is_ace;
+
+       np = of_find_matching_node(NULL, arm_cci_matches);
+       if (!np)
+               return -ENODEV;
+
+       cci_config = of_match_node(arm_cci_matches, np)->data;
+       if (!cci_config)
+               return -ENODEV;
+
+       nb_cci_ports = cci_config->nb_ace + cci_config->nb_ace_lite;
+
+       ports = kcalloc(sizeof(*ports), nb_cci_ports, GFP_KERNEL);
+       if (!ports)
+               return -ENOMEM;
+
+       ret = of_address_to_resource(np, 0, &res);
+       if (!ret) {
+               cci_ctrl_base = ioremap(res.start, resource_size(&res));
+               cci_ctrl_phys = res.start;
+       }
+       if (ret || !cci_ctrl_base) {
+               WARN(1, "unable to ioremap CCI ctrl\n");
+               ret = -ENXIO;
+               goto memalloc_err;
+       }
+
+       for_each_child_of_node(np, cp) {
+               if (!of_match_node(arm_cci_ctrl_if_matches, cp))
+                       continue;
+
+               i = nb_ace + nb_ace_lite;
+
+               if (i >= nb_cci_ports)
+                       break;
+
+               if (of_property_read_string(cp, "interface-type",
+                                       &match_str)) {
+                       WARN(1, "node %s missing interface-type property\n",
+                                 cp->full_name);
+                       continue;
+               }
+               is_ace = strcmp(match_str, "ace") == 0;
+               if (!is_ace && strcmp(match_str, "ace-lite")) {
+                       WARN(1, "node %s containing invalid interface-type property, skipping it\n",
+                                       cp->full_name);
+                       continue;
+               }
+
+               ret = of_address_to_resource(cp, 0, &res);
+               if (!ret) {
+                       ports[i].base = ioremap(res.start, resource_size(&res));
+                       ports[i].phys = res.start;
+               }
+               if (ret || !ports[i].base) {
+                       WARN(1, "unable to ioremap CCI port %d\n", i);
+                       continue;
+               }
+
+               if (is_ace) {
+                       if (WARN_ON(nb_ace >= cci_config->nb_ace))
+                               continue;
+                       ports[i].type = ACE_PORT;
+                       ++nb_ace;
+               } else {
+                       if (WARN_ON(nb_ace_lite >= cci_config->nb_ace_lite))
+                               continue;
+                       ports[i].type = ACE_LITE_PORT;
+                       ++nb_ace_lite;
+               }
+               ports[i].dn = cp;
+       }
+
+        /* initialize a stashed array of ACE ports to speed-up look-up */
+       cci_ace_init_ports();
+
+       /*
+        * Multi-cluster systems may need this data when non-coherent, during
+        * cluster power-up/power-down. Make sure it reaches main memory.
+        */
+       sync_cache_w(&cci_ctrl_base);
+       sync_cache_w(&cci_ctrl_phys);
+       sync_cache_w(&ports);
+       sync_cache_w(&cpu_port);
+       __sync_cache_range_w(ports, sizeof(*ports) * nb_cci_ports);
+       pr_info("ARM CCI driver probed\n");
+       return 0;
+
+memalloc_err:
+
+       kfree(ports);
+       return ret;
+}
+
+static int cci_init_status = -EAGAIN;
+static DEFINE_MUTEX(cci_probing);
+
+static int __init cci_init(void)
+{
+       if (cci_init_status != -EAGAIN)
+               return cci_init_status;
+
+       mutex_lock(&cci_probing);
+       if (cci_init_status == -EAGAIN)
+               cci_init_status = cci_probe();
+       mutex_unlock(&cci_probing);
+       return cci_init_status;
+}
+
+/*
+ * To sort out early init calls ordering a helper function is provided to
+ * check if the CCI driver has beed initialized. Function check if the driver
+ * has been initialized, if not it calls the init function that probes
+ * the driver and updates the return value.
+ */
+bool __init cci_probed(void)
+{
+       return cci_init() == 0;
+}
+EXPORT_SYMBOL_GPL(cci_probed);
+
+early_initcall(cci_init);
+MODULE_LICENSE("GPL");
+MODULE_DESCRIPTION("ARM CCI support");
index 137d3e730f866a2f10f75701801179c53d6340a5..fa435bcf9f1a1d42396f6ba8c664c3cf9d510998 100644 (file)
@@ -27,7 +27,7 @@ obj-$(CONFIG_MACH_LOONGSON1)  += clk-ls1x.o
 obj-$(CONFIG_ARCH_SUNXI)       += sunxi/
 obj-$(CONFIG_ARCH_U8500)       += ux500/
 obj-$(CONFIG_ARCH_VT8500)      += clk-vt8500.o
-obj-$(CONFIG_ARCH_ZYNQ)                += clk-zynq.o
+obj-$(CONFIG_ARCH_ZYNQ)                += zynq/
 obj-$(CONFIG_ARCH_TEGRA)       += tegra/
 obj-$(CONFIG_PLAT_SAMSUNG)     += samsung/
 
index a15f7928fb111310a4353684b3bf7b9769c3e2c5..8774e058cb6cb5db9e290d2d45091ae839c149b3 100644 (file)
 #include <linux/io.h>
 #include <linux/clk-provider.h>
 #include <linux/spinlock.h>
-#include <mach/syscon.h>
+#include <linux/of.h>
+
+/* APP side SYSCON registers */
+/* CLK Control Register 16bit (R/W) */
+#define U300_SYSCON_CCR                                                (0x0000)
+#define U300_SYSCON_CCR_I2S1_USE_VCXO                          (0x0040)
+#define U300_SYSCON_CCR_I2S0_USE_VCXO                          (0x0020)
+#define U300_SYSCON_CCR_TURN_VCXO_ON                           (0x0008)
+#define U300_SYSCON_CCR_CLKING_PERFORMANCE_MASK                        (0x0007)
+#define U300_SYSCON_CCR_CLKING_PERFORMANCE_LOW_POWER           (0x04)
+#define U300_SYSCON_CCR_CLKING_PERFORMANCE_LOW                 (0x03)
+#define U300_SYSCON_CCR_CLKING_PERFORMANCE_INTERMEDIATE                (0x02)
+#define U300_SYSCON_CCR_CLKING_PERFORMANCE_HIGH                        (0x01)
+#define U300_SYSCON_CCR_CLKING_PERFORMANCE_BEST                        (0x00)
+/* CLK Status Register 16bit (R/W) */
+#define U300_SYSCON_CSR                                                (0x0004)
+#define U300_SYSCON_CSR_PLL208_LOCK_IND                                (0x0002)
+#define U300_SYSCON_CSR_PLL13_LOCK_IND                         (0x0001)
+/* Reset lines for SLOW devices 16bit (R/W) */
+#define U300_SYSCON_RSR                                                (0x0014)
+#define U300_SYSCON_RSR_PPM_RESET_EN                           (0x0200)
+#define U300_SYSCON_RSR_ACC_TMR_RESET_EN                       (0x0100)
+#define U300_SYSCON_RSR_APP_TMR_RESET_EN                       (0x0080)
+#define U300_SYSCON_RSR_RTC_RESET_EN                           (0x0040)
+#define U300_SYSCON_RSR_KEYPAD_RESET_EN                                (0x0020)
+#define U300_SYSCON_RSR_GPIO_RESET_EN                          (0x0010)
+#define U300_SYSCON_RSR_EH_RESET_EN                            (0x0008)
+#define U300_SYSCON_RSR_BTR_RESET_EN                           (0x0004)
+#define U300_SYSCON_RSR_UART_RESET_EN                          (0x0002)
+#define U300_SYSCON_RSR_SLOW_BRIDGE_RESET_EN                   (0x0001)
+/* Reset lines for FAST devices 16bit (R/W) */
+#define U300_SYSCON_RFR                                                (0x0018)
+#define U300_SYSCON_RFR_UART1_RESET_ENABLE                     (0x0080)
+#define U300_SYSCON_RFR_SPI_RESET_ENABLE                       (0x0040)
+#define U300_SYSCON_RFR_MMC_RESET_ENABLE                       (0x0020)
+#define U300_SYSCON_RFR_PCM_I2S1_RESET_ENABLE                  (0x0010)
+#define U300_SYSCON_RFR_PCM_I2S0_RESET_ENABLE                  (0x0008)
+#define U300_SYSCON_RFR_I2C1_RESET_ENABLE                      (0x0004)
+#define U300_SYSCON_RFR_I2C0_RESET_ENABLE                      (0x0002)
+#define U300_SYSCON_RFR_FAST_BRIDGE_RESET_ENABLE               (0x0001)
+/* Reset lines for the rest of the peripherals 16bit (R/W) */
+#define U300_SYSCON_RRR                                                (0x001c)
+#define U300_SYSCON_RRR_CDS_RESET_EN                           (0x4000)
+#define U300_SYSCON_RRR_ISP_RESET_EN                           (0x2000)
+#define U300_SYSCON_RRR_INTCON_RESET_EN                                (0x1000)
+#define U300_SYSCON_RRR_MSPRO_RESET_EN                         (0x0800)
+#define U300_SYSCON_RRR_XGAM_RESET_EN                          (0x0100)
+#define U300_SYSCON_RRR_XGAM_VC_SYNC_RESET_EN                  (0x0080)
+#define U300_SYSCON_RRR_NANDIF_RESET_EN                                (0x0040)
+#define U300_SYSCON_RRR_EMIF_RESET_EN                          (0x0020)
+#define U300_SYSCON_RRR_DMAC_RESET_EN                          (0x0010)
+#define U300_SYSCON_RRR_CPU_RESET_EN                           (0x0008)
+#define U300_SYSCON_RRR_APEX_RESET_EN                          (0x0004)
+#define U300_SYSCON_RRR_AHB_RESET_EN                           (0x0002)
+#define U300_SYSCON_RRR_AAIF_RESET_EN                          (0x0001)
+/* Clock enable for SLOW peripherals 16bit (R/W) */
+#define U300_SYSCON_CESR                                       (0x0020)
+#define U300_SYSCON_CESR_PPM_CLK_EN                            (0x0200)
+#define U300_SYSCON_CESR_ACC_TMR_CLK_EN                                (0x0100)
+#define U300_SYSCON_CESR_APP_TMR_CLK_EN                                (0x0080)
+#define U300_SYSCON_CESR_KEYPAD_CLK_EN                         (0x0040)
+#define U300_SYSCON_CESR_GPIO_CLK_EN                           (0x0010)
+#define U300_SYSCON_CESR_EH_CLK_EN                             (0x0008)
+#define U300_SYSCON_CESR_BTR_CLK_EN                            (0x0004)
+#define U300_SYSCON_CESR_UART_CLK_EN                           (0x0002)
+#define U300_SYSCON_CESR_SLOW_BRIDGE_CLK_EN                    (0x0001)
+/* Clock enable for FAST peripherals 16bit (R/W) */
+#define U300_SYSCON_CEFR                                       (0x0024)
+#define U300_SYSCON_CEFR_UART1_CLK_EN                          (0x0200)
+#define U300_SYSCON_CEFR_I2S1_CORE_CLK_EN                      (0x0100)
+#define U300_SYSCON_CEFR_I2S0_CORE_CLK_EN                      (0x0080)
+#define U300_SYSCON_CEFR_SPI_CLK_EN                            (0x0040)
+#define U300_SYSCON_CEFR_MMC_CLK_EN                            (0x0020)
+#define U300_SYSCON_CEFR_I2S1_CLK_EN                           (0x0010)
+#define U300_SYSCON_CEFR_I2S0_CLK_EN                           (0x0008)
+#define U300_SYSCON_CEFR_I2C1_CLK_EN                           (0x0004)
+#define U300_SYSCON_CEFR_I2C0_CLK_EN                           (0x0002)
+#define U300_SYSCON_CEFR_FAST_BRIDGE_CLK_EN                    (0x0001)
+/* Clock enable for the rest of the peripherals 16bit (R/W) */
+#define U300_SYSCON_CERR                                       (0x0028)
+#define U300_SYSCON_CERR_CDS_CLK_EN                            (0x2000)
+#define U300_SYSCON_CERR_ISP_CLK_EN                            (0x1000)
+#define U300_SYSCON_CERR_MSPRO_CLK_EN                          (0x0800)
+#define U300_SYSCON_CERR_AHB_SUBSYS_BRIDGE_CLK_EN              (0x0400)
+#define U300_SYSCON_CERR_SEMI_CLK_EN                           (0x0200)
+#define U300_SYSCON_CERR_XGAM_CLK_EN                           (0x0100)
+#define U300_SYSCON_CERR_VIDEO_ENC_CLK_EN                      (0x0080)
+#define U300_SYSCON_CERR_NANDIF_CLK_EN                         (0x0040)
+#define U300_SYSCON_CERR_EMIF_CLK_EN                           (0x0020)
+#define U300_SYSCON_CERR_DMAC_CLK_EN                           (0x0010)
+#define U300_SYSCON_CERR_CPU_CLK_EN                            (0x0008)
+#define U300_SYSCON_CERR_APEX_CLK_EN                           (0x0004)
+#define U300_SYSCON_CERR_AHB_CLK_EN                            (0x0002)
+#define U300_SYSCON_CERR_AAIF_CLK_EN                           (0x0001)
+/* Single block clock enable 16bit (-/W) */
+#define U300_SYSCON_SBCER                                      (0x002c)
+#define U300_SYSCON_SBCER_PPM_CLK_EN                           (0x0009)
+#define U300_SYSCON_SBCER_ACC_TMR_CLK_EN                       (0x0008)
+#define U300_SYSCON_SBCER_APP_TMR_CLK_EN                       (0x0007)
+#define U300_SYSCON_SBCER_KEYPAD_CLK_EN                                (0x0006)
+#define U300_SYSCON_SBCER_GPIO_CLK_EN                          (0x0004)
+#define U300_SYSCON_SBCER_EH_CLK_EN                            (0x0003)
+#define U300_SYSCON_SBCER_BTR_CLK_EN                           (0x0002)
+#define U300_SYSCON_SBCER_UART_CLK_EN                          (0x0001)
+#define U300_SYSCON_SBCER_SLOW_BRIDGE_CLK_EN                   (0x0000)
+#define U300_SYSCON_SBCER_UART1_CLK_EN                         (0x0019)
+#define U300_SYSCON_SBCER_I2S1_CORE_CLK_EN                     (0x0018)
+#define U300_SYSCON_SBCER_I2S0_CORE_CLK_EN                     (0x0017)
+#define U300_SYSCON_SBCER_SPI_CLK_EN                           (0x0016)
+#define U300_SYSCON_SBCER_MMC_CLK_EN                           (0x0015)
+#define U300_SYSCON_SBCER_I2S1_CLK_EN                          (0x0014)
+#define U300_SYSCON_SBCER_I2S0_CLK_EN                          (0x0013)
+#define U300_SYSCON_SBCER_I2C1_CLK_EN                          (0x0012)
+#define U300_SYSCON_SBCER_I2C0_CLK_EN                          (0x0011)
+#define U300_SYSCON_SBCER_FAST_BRIDGE_CLK_EN                   (0x0010)
+#define U300_SYSCON_SBCER_CDS_CLK_EN                           (0x002D)
+#define U300_SYSCON_SBCER_ISP_CLK_EN                           (0x002C)
+#define U300_SYSCON_SBCER_MSPRO_CLK_EN                         (0x002B)
+#define U300_SYSCON_SBCER_AHB_SUBSYS_BRIDGE_CLK_EN             (0x002A)
+#define U300_SYSCON_SBCER_SEMI_CLK_EN                          (0x0029)
+#define U300_SYSCON_SBCER_XGAM_CLK_EN                          (0x0028)
+#define U300_SYSCON_SBCER_VIDEO_ENC_CLK_EN                     (0x0027)
+#define U300_SYSCON_SBCER_NANDIF_CLK_EN                                (0x0026)
+#define U300_SYSCON_SBCER_EMIF_CLK_EN                          (0x0025)
+#define U300_SYSCON_SBCER_DMAC_CLK_EN                          (0x0024)
+#define U300_SYSCON_SBCER_CPU_CLK_EN                           (0x0023)
+#define U300_SYSCON_SBCER_APEX_CLK_EN                          (0x0022)
+#define U300_SYSCON_SBCER_AHB_CLK_EN                           (0x0021)
+#define U300_SYSCON_SBCER_AAIF_CLK_EN                          (0x0020)
+/* Single block clock disable 16bit (-/W) */
+#define U300_SYSCON_SBCDR                                      (0x0030)
+/* Same values as above for SBCER */
+/* Clock force SLOW peripherals 16bit (R/W) */
+#define U300_SYSCON_CFSR                                       (0x003c)
+#define U300_SYSCON_CFSR_PPM_CLK_FORCE_EN                      (0x0200)
+#define U300_SYSCON_CFSR_ACC_TMR_CLK_FORCE_EN                  (0x0100)
+#define U300_SYSCON_CFSR_APP_TMR_CLK_FORCE_EN                  (0x0080)
+#define U300_SYSCON_CFSR_KEYPAD_CLK_FORCE_EN                   (0x0020)
+#define U300_SYSCON_CFSR_GPIO_CLK_FORCE_EN                     (0x0010)
+#define U300_SYSCON_CFSR_EH_CLK_FORCE_EN                       (0x0008)
+#define U300_SYSCON_CFSR_BTR_CLK_FORCE_EN                      (0x0004)
+#define U300_SYSCON_CFSR_UART_CLK_FORCE_EN                     (0x0002)
+#define U300_SYSCON_CFSR_SLOW_BRIDGE_CLK_FORCE_EN              (0x0001)
+/* Clock force FAST peripherals 16bit (R/W) */
+#define U300_SYSCON_CFFR                                       (0x40)
+/* Values not defined. Define if you want to use them. */
+/* Clock force the rest of the peripherals 16bit (R/W) */
+#define U300_SYSCON_CFRR                                       (0x44)
+#define U300_SYSCON_CFRR_CDS_CLK_FORCE_EN                      (0x2000)
+#define U300_SYSCON_CFRR_ISP_CLK_FORCE_EN                      (0x1000)
+#define U300_SYSCON_CFRR_MSPRO_CLK_FORCE_EN                    (0x0800)
+#define U300_SYSCON_CFRR_AHB_SUBSYS_BRIDGE_CLK_FORCE_EN                (0x0400)
+#define U300_SYSCON_CFRR_SEMI_CLK_FORCE_EN                     (0x0200)
+#define U300_SYSCON_CFRR_XGAM_CLK_FORCE_EN                     (0x0100)
+#define U300_SYSCON_CFRR_VIDEO_ENC_CLK_FORCE_EN                        (0x0080)
+#define U300_SYSCON_CFRR_NANDIF_CLK_FORCE_EN                   (0x0040)
+#define U300_SYSCON_CFRR_EMIF_CLK_FORCE_EN                     (0x0020)
+#define U300_SYSCON_CFRR_DMAC_CLK_FORCE_EN                     (0x0010)
+#define U300_SYSCON_CFRR_CPU_CLK_FORCE_EN                      (0x0008)
+#define U300_SYSCON_CFRR_APEX_CLK_FORCE_EN                     (0x0004)
+#define U300_SYSCON_CFRR_AHB_CLK_FORCE_EN                      (0x0002)
+#define U300_SYSCON_CFRR_AAIF_CLK_FORCE_EN                     (0x0001)
+/* PLL208 Frequency Control 16bit (R/W) */
+#define U300_SYSCON_PFCR                                       (0x48)
+#define U300_SYSCON_PFCR_DPLL_MULT_NUM                         (0x000F)
+/* Power Management Control 16bit (R/W) */
+#define U300_SYSCON_PMCR                                       (0x50)
+#define U300_SYSCON_PMCR_DCON_ENABLE                           (0x0002)
+#define U300_SYSCON_PMCR_PWR_MGNT_ENABLE                       (0x0001)
+/* Reset Out 16bit (R/W) */
+#define U300_SYSCON_RCR                                                (0x6c)
+#define U300_SYSCON_RCR_RESOUT0_RST_N_DISABLE                  (0x0001)
+/* EMIF Slew Rate Control 16bit (R/W) */
+#define U300_SYSCON_SRCLR                                      (0x70)
+#define U300_SYSCON_SRCLR_MASK                                 (0x03FF)
+#define U300_SYSCON_SRCLR_VALUE                                        (0x03FF)
+#define U300_SYSCON_SRCLR_EMIF_1_SLRC_5_B                      (0x0200)
+#define U300_SYSCON_SRCLR_EMIF_1_SLRC_5_A                      (0x0100)
+#define U300_SYSCON_SRCLR_EMIF_1_SLRC_4_B                      (0x0080)
+#define U300_SYSCON_SRCLR_EMIF_1_SLRC_4_A                      (0x0040)
+#define U300_SYSCON_SRCLR_EMIF_1_SLRC_3_B                      (0x0020)
+#define U300_SYSCON_SRCLR_EMIF_1_SLRC_3_A                      (0x0010)
+#define U300_SYSCON_SRCLR_EMIF_1_SLRC_2_B                      (0x0008)
+#define U300_SYSCON_SRCLR_EMIF_1_SLRC_2_A                      (0x0004)
+#define U300_SYSCON_SRCLR_EMIF_1_SLRC_1_B                      (0x0002)
+#define U300_SYSCON_SRCLR_EMIF_1_SLRC_1_A                      (0x0001)
+/* EMIF Clock Control Register 16bit (R/W) */
+#define U300_SYSCON_ECCR                                       (0x0078)
+#define U300_SYSCON_ECCR_MASK                                  (0x000F)
+#define U300_SYSCON_ECCR_EMIF_1_STATIC_CLK_EN_N_DISABLE                (0x0008)
+#define U300_SYSCON_ECCR_EMIF_1_RET_OUT_CLK_EN_N_DISABLE       (0x0004)
+#define U300_SYSCON_ECCR_EMIF_MEMCLK_RET_EN_N_DISABLE          (0x0002)
+#define U300_SYSCON_ECCR_EMIF_SDRCLK_RET_EN_N_DISABLE          (0x0001)
+/* MMC/MSPRO frequency divider register 0 16bit (R/W) */
+#define U300_SYSCON_MMF0R                                      (0x90)
+#define U300_SYSCON_MMF0R_MASK                                 (0x00FF)
+#define U300_SYSCON_MMF0R_FREQ_0_HIGH_MASK                     (0x00F0)
+#define U300_SYSCON_MMF0R_FREQ_0_LOW_MASK                      (0x000F)
+/* MMC/MSPRO frequency divider register 1 16bit (R/W) */
+#define U300_SYSCON_MMF1R                                      (0x94)
+#define U300_SYSCON_MMF1R_MASK                                 (0x00FF)
+#define U300_SYSCON_MMF1R_FREQ_1_HIGH_MASK                     (0x00F0)
+#define U300_SYSCON_MMF1R_FREQ_1_LOW_MASK                      (0x000F)
+/* Clock control for the MMC and MSPRO blocks 16bit (R/W) */
+#define U300_SYSCON_MMCR                                       (0x9C)
+#define U300_SYSCON_MMCR_MASK                                  (0x0003)
+#define U300_SYSCON_MMCR_MMC_FB_CLK_SEL_ENABLE                 (0x0002)
+#define U300_SYSCON_MMCR_MSPRO_FREQSEL_ENABLE                  (0x0001)
+/* SYS_0_CLK_CONTROL first clock control 16bit (R/W) */
+#define U300_SYSCON_S0CCR                                      (0x120)
+#define U300_SYSCON_S0CCR_FIELD_MASK                           (0x43FF)
+#define U300_SYSCON_S0CCR_CLOCK_REQ                            (0x4000)
+#define U300_SYSCON_S0CCR_CLOCK_REQ_MONITOR                    (0x2000)
+#define U300_SYSCON_S0CCR_CLOCK_INV                            (0x0200)
+#define U300_SYSCON_S0CCR_CLOCK_FREQ_MASK                      (0x01E0)
+#define U300_SYSCON_S0CCR_CLOCK_SELECT_MASK                    (0x001E)
+#define U300_SYSCON_S0CCR_CLOCK_ENABLE                         (0x0001)
+#define U300_SYSCON_S0CCR_SEL_MCLK                             (0x8<<1)
+#define U300_SYSCON_S0CCR_SEL_ACC_FSM_CLK                      (0xA<<1)
+#define U300_SYSCON_S0CCR_SEL_PLL60_48_CLK                     (0xC<<1)
+#define U300_SYSCON_S0CCR_SEL_PLL60_60_CLK                     (0xD<<1)
+#define U300_SYSCON_S0CCR_SEL_ACC_PLL208_CLK                   (0xE<<1)
+#define U300_SYSCON_S0CCR_SEL_APP_PLL13_CLK                    (0x0<<1)
+#define U300_SYSCON_S0CCR_SEL_APP_FSM_CLK                      (0x2<<1)
+#define U300_SYSCON_S0CCR_SEL_RTC_CLK                          (0x4<<1)
+#define U300_SYSCON_S0CCR_SEL_APP_PLL208_CLK                   (0x6<<1)
+/* SYS_1_CLK_CONTROL second clock control 16 bit (R/W) */
+#define U300_SYSCON_S1CCR                                      (0x124)
+#define U300_SYSCON_S1CCR_FIELD_MASK                           (0x43FF)
+#define U300_SYSCON_S1CCR_CLOCK_REQ                            (0x4000)
+#define U300_SYSCON_S1CCR_CLOCK_REQ_MONITOR                    (0x2000)
+#define U300_SYSCON_S1CCR_CLOCK_INV                            (0x0200)
+#define U300_SYSCON_S1CCR_CLOCK_FREQ_MASK                      (0x01E0)
+#define U300_SYSCON_S1CCR_CLOCK_SELECT_MASK                    (0x001E)
+#define U300_SYSCON_S1CCR_CLOCK_ENABLE                         (0x0001)
+#define U300_SYSCON_S1CCR_SEL_MCLK                             (0x8<<1)
+#define U300_SYSCON_S1CCR_SEL_ACC_FSM_CLK                      (0xA<<1)
+#define U300_SYSCON_S1CCR_SEL_PLL60_48_CLK                     (0xC<<1)
+#define U300_SYSCON_S1CCR_SEL_PLL60_60_CLK                     (0xD<<1)
+#define U300_SYSCON_S1CCR_SEL_ACC_PLL208_CLK                   (0xE<<1)
+#define U300_SYSCON_S1CCR_SEL_ACC_PLL13_CLK                    (0x0<<1)
+#define U300_SYSCON_S1CCR_SEL_APP_FSM_CLK                      (0x2<<1)
+#define U300_SYSCON_S1CCR_SEL_RTC_CLK                          (0x4<<1)
+#define U300_SYSCON_S1CCR_SEL_APP_PLL208_CLK                   (0x6<<1)
+/* SYS_2_CLK_CONTROL third clock contol 16 bit (R/W) */
+#define U300_SYSCON_S2CCR                                      (0x128)
+#define U300_SYSCON_S2CCR_FIELD_MASK                           (0xC3FF)
+#define U300_SYSCON_S2CCR_CLK_STEAL                            (0x8000)
+#define U300_SYSCON_S2CCR_CLOCK_REQ                            (0x4000)
+#define U300_SYSCON_S2CCR_CLOCK_REQ_MONITOR                    (0x2000)
+#define U300_SYSCON_S2CCR_CLOCK_INV                            (0x0200)
+#define U300_SYSCON_S2CCR_CLOCK_FREQ_MASK                      (0x01E0)
+#define U300_SYSCON_S2CCR_CLOCK_SELECT_MASK                    (0x001E)
+#define U300_SYSCON_S2CCR_CLOCK_ENABLE                         (0x0001)
+#define U300_SYSCON_S2CCR_SEL_MCLK                             (0x8<<1)
+#define U300_SYSCON_S2CCR_SEL_ACC_FSM_CLK                      (0xA<<1)
+#define U300_SYSCON_S2CCR_SEL_PLL60_48_CLK                     (0xC<<1)
+#define U300_SYSCON_S2CCR_SEL_PLL60_60_CLK                     (0xD<<1)
+#define U300_SYSCON_S2CCR_SEL_ACC_PLL208_CLK                   (0xE<<1)
+#define U300_SYSCON_S2CCR_SEL_ACC_PLL13_CLK                    (0x0<<1)
+#define U300_SYSCON_S2CCR_SEL_APP_FSM_CLK                      (0x2<<1)
+#define U300_SYSCON_S2CCR_SEL_RTC_CLK                          (0x4<<1)
+#define U300_SYSCON_S2CCR_SEL_APP_PLL208_CLK                   (0x6<<1)
+/* SC_PLL_IRQ_CONTROL 16bit (R/W) */
+#define U300_SYSCON_PICR                                       (0x0130)
+#define U300_SYSCON_PICR_MASK                                  (0x00FF)
+#define U300_SYSCON_PICR_FORCE_PLL208_LOCK_LOW_ENABLE          (0x0080)
+#define U300_SYSCON_PICR_FORCE_PLL208_LOCK_HIGH_ENABLE         (0x0040)
+#define U300_SYSCON_PICR_FORCE_PLL13_LOCK_LOW_ENABLE           (0x0020)
+#define U300_SYSCON_PICR_FORCE_PLL13_LOCK_HIGH_ENABLE          (0x0010)
+#define U300_SYSCON_PICR_IRQMASK_PLL13_UNLOCK_ENABLE           (0x0008)
+#define U300_SYSCON_PICR_IRQMASK_PLL13_LOCK_ENABLE             (0x0004)
+#define U300_SYSCON_PICR_IRQMASK_PLL208_UNLOCK_ENABLE          (0x0002)
+#define U300_SYSCON_PICR_IRQMASK_PLL208_LOCK_ENABLE            (0x0001)
+/* SC_PLL_IRQ_STATUS 16 bit (R/-) */
+#define U300_SYSCON_PISR                                       (0x0134)
+#define U300_SYSCON_PISR_MASK                                  (0x000F)
+#define U300_SYSCON_PISR_PLL13_UNLOCK_IND                      (0x0008)
+#define U300_SYSCON_PISR_PLL13_LOCK_IND                                (0x0004)
+#define U300_SYSCON_PISR_PLL208_UNLOCK_IND                     (0x0002)
+#define U300_SYSCON_PISR_PLL208_LOCK_IND                       (0x0001)
+/* SC_PLL_IRQ_CLEAR 16 bit (-/W) */
+#define U300_SYSCON_PICLR                                      (0x0138)
+#define U300_SYSCON_PICLR_MASK                                 (0x000F)
+#define U300_SYSCON_PICLR_RWMASK                               (0x0000)
+#define U300_SYSCON_PICLR_PLL13_UNLOCK_SC                      (0x0008)
+#define U300_SYSCON_PICLR_PLL13_LOCK_SC                                (0x0004)
+#define U300_SYSCON_PICLR_PLL208_UNLOCK_SC                     (0x0002)
+#define U300_SYSCON_PICLR_PLL208_LOCK_SC                       (0x0001)
+/* Clock activity observability register 0 */
+#define U300_SYSCON_C0OAR                                      (0x140)
+#define U300_SYSCON_C0OAR_MASK                                 (0xFFFF)
+#define U300_SYSCON_C0OAR_VALUE                                        (0xFFFF)
+#define U300_SYSCON_C0OAR_BT_H_CLK                             (0x8000)
+#define U300_SYSCON_C0OAR_ASPB_P_CLK                           (0x4000)
+#define U300_SYSCON_C0OAR_APP_SEMI_H_CLK                       (0x2000)
+#define U300_SYSCON_C0OAR_APP_SEMI_CLK                         (0x1000)
+#define U300_SYSCON_C0OAR_APP_MMC_MSPRO_CLK                    (0x0800)
+#define U300_SYSCON_C0OAR_APP_I2S1_CLK                         (0x0400)
+#define U300_SYSCON_C0OAR_APP_I2S0_CLK                         (0x0200)
+#define U300_SYSCON_C0OAR_APP_CPU_CLK                          (0x0100)
+#define U300_SYSCON_C0OAR_APP_52_CLK                           (0x0080)
+#define U300_SYSCON_C0OAR_APP_208_CLK                          (0x0040)
+#define U300_SYSCON_C0OAR_APP_104_CLK                          (0x0020)
+#define U300_SYSCON_C0OAR_APEX_CLK                             (0x0010)
+#define U300_SYSCON_C0OAR_AHPB_M_H_CLK                         (0x0008)
+#define U300_SYSCON_C0OAR_AHB_CLK                              (0x0004)
+#define U300_SYSCON_C0OAR_AFPB_P_CLK                           (0x0002)
+#define U300_SYSCON_C0OAR_AAIF_CLK                             (0x0001)
+/* Clock activity observability register 1 */
+#define U300_SYSCON_C1OAR                                      (0x144)
+#define U300_SYSCON_C1OAR_MASK                                 (0x3FFE)
+#define U300_SYSCON_C1OAR_VALUE                                        (0x3FFE)
+#define U300_SYSCON_C1OAR_NFIF_F_CLK                           (0x2000)
+#define U300_SYSCON_C1OAR_MSPRO_CLK                            (0x1000)
+#define U300_SYSCON_C1OAR_MMC_P_CLK                            (0x0800)
+#define U300_SYSCON_C1OAR_MMC_CLK                              (0x0400)
+#define U300_SYSCON_C1OAR_KP_P_CLK                             (0x0200)
+#define U300_SYSCON_C1OAR_I2C1_P_CLK                           (0x0100)
+#define U300_SYSCON_C1OAR_I2C0_P_CLK                           (0x0080)
+#define U300_SYSCON_C1OAR_GPIO_CLK                             (0x0040)
+#define U300_SYSCON_C1OAR_EMIF_MPMC_CLK                                (0x0020)
+#define U300_SYSCON_C1OAR_EMIF_H_CLK                           (0x0010)
+#define U300_SYSCON_C1OAR_EVHIST_CLK                           (0x0008)
+#define U300_SYSCON_C1OAR_PPM_CLK                              (0x0004)
+#define U300_SYSCON_C1OAR_DMA_CLK                              (0x0002)
+/* Clock activity observability register 2 */
+#define U300_SYSCON_C2OAR                                      (0x148)
+#define U300_SYSCON_C2OAR_MASK                                 (0x0FFF)
+#define U300_SYSCON_C2OAR_VALUE                                        (0x0FFF)
+#define U300_SYSCON_C2OAR_XGAM_CDI_CLK                         (0x0800)
+#define U300_SYSCON_C2OAR_XGAM_CLK                             (0x0400)
+#define U300_SYSCON_C2OAR_VC_H_CLK                             (0x0200)
+#define U300_SYSCON_C2OAR_VC_CLK                               (0x0100)
+#define U300_SYSCON_C2OAR_UA_P_CLK                             (0x0080)
+#define U300_SYSCON_C2OAR_TMR1_CLK                             (0x0040)
+#define U300_SYSCON_C2OAR_TMR0_CLK                             (0x0020)
+#define U300_SYSCON_C2OAR_SPI_P_CLK                            (0x0010)
+#define U300_SYSCON_C2OAR_PCM_I2S1_CORE_CLK                    (0x0008)
+#define U300_SYSCON_C2OAR_PCM_I2S1_CLK                         (0x0004)
+#define U300_SYSCON_C2OAR_PCM_I2S0_CORE_CLK                    (0x0002)
+#define U300_SYSCON_C2OAR_PCM_I2S0_CLK                         (0x0001)
+
 
 /*
  * The clocking hierarchy currently looks like this.
@@ -386,6 +728,213 @@ syscon_clk_register(struct device *dev, const char *name,
        return clk;
 }
 
+#define U300_CLK_TYPE_SLOW 0
+#define U300_CLK_TYPE_FAST 1
+#define U300_CLK_TYPE_REST 2
+
+/**
+ * struct u300_clock - defines the bits and pieces for a certain clock
+ * @type: the clock type, slow fast or rest
+ * @id: the bit in the slow/fast/rest register for this clock
+ * @hw_ctrld: whether the clock is hardware controlled
+ * @clk_val: a value to poke in the one-write enable/disable registers
+ */
+struct u300_clock {
+       u8 type;
+       u8 id;
+       bool hw_ctrld;
+       u16 clk_val;
+};
+
+struct u300_clock const __initconst u300_clk_lookup[] = {
+       {
+               .type = U300_CLK_TYPE_REST,
+               .id = 3,
+               .hw_ctrld = true,
+               .clk_val = U300_SYSCON_SBCER_CPU_CLK_EN,
+       },
+       {
+               .type = U300_CLK_TYPE_REST,
+               .id = 4,
+               .hw_ctrld = true,
+               .clk_val = U300_SYSCON_SBCER_DMAC_CLK_EN,
+       },
+       {
+               .type = U300_CLK_TYPE_REST,
+               .id = 5,
+               .hw_ctrld = false,
+               .clk_val = U300_SYSCON_SBCER_EMIF_CLK_EN,
+       },
+       {
+               .type = U300_CLK_TYPE_REST,
+               .id = 6,
+               .hw_ctrld = false,
+               .clk_val = U300_SYSCON_SBCER_NANDIF_CLK_EN,
+       },
+       {
+               .type = U300_CLK_TYPE_REST,
+               .id = 8,
+               .hw_ctrld = true,
+               .clk_val = U300_SYSCON_SBCER_XGAM_CLK_EN,
+       },
+       {
+               .type = U300_CLK_TYPE_REST,
+               .id = 9,
+               .hw_ctrld = false,
+               .clk_val = U300_SYSCON_SBCER_SEMI_CLK_EN,
+       },
+       {
+               .type = U300_CLK_TYPE_REST,
+               .id = 10,
+               .hw_ctrld = true,
+               .clk_val = U300_SYSCON_SBCER_AHB_SUBSYS_BRIDGE_CLK_EN,
+       },
+       {
+               .type = U300_CLK_TYPE_REST,
+               .id = 12,
+               .hw_ctrld = false,
+               /* INTCON: cannot be enabled, just taken out of reset */
+               .clk_val = 0xFFFFU,
+       },
+       {
+               .type = U300_CLK_TYPE_FAST,
+               .id = 0,
+               .hw_ctrld = true,
+               .clk_val = U300_SYSCON_SBCER_FAST_BRIDGE_CLK_EN,
+       },
+       {
+               .type = U300_CLK_TYPE_FAST,
+               .id = 1,
+               .hw_ctrld = false,
+               .clk_val = U300_SYSCON_SBCER_I2C0_CLK_EN,
+       },
+       {
+               .type = U300_CLK_TYPE_FAST,
+               .id = 2,
+               .hw_ctrld = false,
+               .clk_val = U300_SYSCON_SBCER_I2C1_CLK_EN,
+       },
+       {
+               .type = U300_CLK_TYPE_FAST,
+               .id = 5,
+               .hw_ctrld = false,
+               .clk_val = U300_SYSCON_SBCER_MMC_CLK_EN,
+       },
+       {
+               .type = U300_CLK_TYPE_FAST,
+               .id = 6,
+               .hw_ctrld = false,
+               .clk_val = U300_SYSCON_SBCER_SPI_CLK_EN,
+       },
+       {
+               .type = U300_CLK_TYPE_SLOW,
+               .id = 0,
+               .hw_ctrld = true,
+               .clk_val = U300_SYSCON_SBCER_SLOW_BRIDGE_CLK_EN,
+       },
+       {
+               .type = U300_CLK_TYPE_SLOW,
+               .id = 1,
+               .hw_ctrld = false,
+               .clk_val = U300_SYSCON_SBCER_UART_CLK_EN,
+       },
+       {
+               .type = U300_CLK_TYPE_SLOW,
+               .id = 4,
+               .hw_ctrld = false,
+               .clk_val = U300_SYSCON_SBCER_GPIO_CLK_EN,
+       },
+       {
+               .type = U300_CLK_TYPE_SLOW,
+               .id = 6,
+               .hw_ctrld = true,
+               /* No clock enable register bit */
+               .clk_val = 0xFFFFU,
+       },
+       {
+               .type = U300_CLK_TYPE_SLOW,
+               .id = 7,
+               .hw_ctrld = false,
+               .clk_val = U300_SYSCON_SBCER_APP_TMR_CLK_EN,
+       },
+       {
+               .type = U300_CLK_TYPE_SLOW,
+               .id = 8,
+               .hw_ctrld = false,
+               .clk_val = U300_SYSCON_SBCER_ACC_TMR_CLK_EN,
+       },
+};
+
+static void __init of_u300_syscon_clk_init(struct device_node *np)
+{
+       struct clk *clk = ERR_PTR(-EINVAL);
+       const char *clk_name = np->name;
+       const char *parent_name;
+       void __iomem *res_reg;
+       void __iomem *en_reg;
+       u32 clk_type;
+       u32 clk_id;
+       int i;
+
+       if (of_property_read_u32(np, "clock-type", &clk_type)) {
+               pr_err("%s: syscon clock \"%s\" missing clock-type property\n",
+                      __func__, clk_name);
+               return;
+       }
+       if (of_property_read_u32(np, "clock-id", &clk_id)) {
+               pr_err("%s: syscon clock \"%s\" missing clock-id property\n",
+                      __func__, clk_name);
+               return;
+       }
+       parent_name = of_clk_get_parent_name(np, 0);
+
+       switch (clk_type) {
+       case U300_CLK_TYPE_SLOW:
+               res_reg = syscon_vbase + U300_SYSCON_RSR;
+               en_reg = syscon_vbase + U300_SYSCON_CESR;
+               break;
+       case U300_CLK_TYPE_FAST:
+               res_reg = syscon_vbase + U300_SYSCON_RFR;
+               en_reg = syscon_vbase + U300_SYSCON_CEFR;
+               break;
+       case U300_CLK_TYPE_REST:
+               res_reg = syscon_vbase + U300_SYSCON_RRR;
+               en_reg = syscon_vbase + U300_SYSCON_CERR;
+               break;
+       default:
+               pr_err("unknown clock type %x specified\n", clk_type);
+               return;
+       }
+
+       for (i = 0; i < ARRAY_SIZE(u300_clk_lookup); i++) {
+               const struct u300_clock *u3clk = &u300_clk_lookup[i];
+
+               if (u3clk->type == clk_type && u3clk->id == clk_id)
+                       clk = syscon_clk_register(NULL,
+                                                 clk_name, parent_name,
+                                                 0, u3clk->hw_ctrld,
+                                                 res_reg, u3clk->id,
+                                                 en_reg, u3clk->id,
+                                                 u3clk->clk_val);
+       }
+
+       if (!IS_ERR(clk)) {
+               of_clk_add_provider(np, of_clk_src_simple_get, clk);
+
+               /*
+                * Some few system clocks - device tree does not
+                * represent clocks without a corresponding device node.
+                * for now we add these three clocks here.
+                */
+               if (clk_type == U300_CLK_TYPE_REST && clk_id == 5)
+                       clk_register_clkdev(clk, NULL, "pl172");
+               if (clk_type == U300_CLK_TYPE_REST && clk_id == 9)
+                       clk_register_clkdev(clk, NULL, "semi");
+               if (clk_type == U300_CLK_TYPE_REST && clk_id == 12)
+                       clk_register_clkdev(clk, NULL, "intcon");
+       }
+}
+
 /**
  * struct clk_mclk - U300 MCLK clock (MMC/SD clock)
  * @hw: corresponding clock hardware entry
@@ -590,10 +1139,41 @@ mclk_clk_register(struct device *dev, const char *name,
        return clk;
 }
 
+static void __init of_u300_syscon_mclk_init(struct device_node *np)
+{
+       struct clk *clk = ERR_PTR(-EINVAL);
+       const char *clk_name = np->name;
+       const char *parent_name;
+
+       parent_name = of_clk_get_parent_name(np, 0);
+       clk = mclk_clk_register(NULL, clk_name, parent_name, false);
+       if (!IS_ERR(clk))
+               of_clk_add_provider(np, of_clk_src_simple_get, clk);
+}
+
+static const __initconst struct of_device_id u300_clk_match[] = {
+       {
+               .compatible = "fixed-clock",
+               .data = of_fixed_clk_setup,
+       },
+       {
+               .compatible = "fixed-factor-clock",
+               .data = of_fixed_factor_clk_setup,
+       },
+       {
+               .compatible = "stericsson,u300-syscon-clk",
+               .data = of_u300_syscon_clk_init,
+       },
+       {
+               .compatible = "stericsson,u300-syscon-mclk",
+               .data = of_u300_syscon_mclk_init,
+       },
+};
+
+
 void __init u300_clk_init(void __iomem *base)
 {
        u16 val;
-       struct clk *clk;
 
        syscon_vbase = base;
 
@@ -610,137 +1190,5 @@ void __init u300_clk_init(void __iomem *base)
        val |= U300_SYSCON_PMCR_PWR_MGNT_ENABLE;
        writew(val, syscon_vbase + U300_SYSCON_PMCR);
 
-       /* These are always available (RTC and PLL13) */
-       clk = clk_register_fixed_rate(NULL, "app_32_clk", NULL,
-                                     CLK_IS_ROOT, 32768);
-       /* The watchdog sits directly on the 32 kHz clock */
-       clk_register_clkdev(clk, NULL, "coh901327_wdog");
-       clk = clk_register_fixed_rate(NULL, "pll13", NULL,
-                                     CLK_IS_ROOT, 13000000);
-
-       /* These derive from PLL208 */
-       clk = clk_register_fixed_rate(NULL, "pll208", NULL,
-                                     CLK_IS_ROOT, 208000000);
-       clk = clk_register_fixed_factor(NULL, "app_208_clk", "pll208",
-                                       0, 1, 1);
-       clk = clk_register_fixed_factor(NULL, "app_104_clk", "pll208",
-                                       0, 1, 2);
-       clk = clk_register_fixed_factor(NULL, "app_52_clk", "pll208",
-                                       0, 1, 4);
-       /* The 52 MHz is divided down to 26 MHz */
-       clk = clk_register_fixed_factor(NULL, "app_26_clk", "app_52_clk",
-                                       0, 1, 2);
-
-       /* Directly on the AMBA interconnect */
-       clk = syscon_clk_register(NULL, "cpu_clk", "app_208_clk", 0, true,
-                                 syscon_vbase + U300_SYSCON_RRR, 3,
-                                 syscon_vbase + U300_SYSCON_CERR, 3,
-                                 U300_SYSCON_SBCER_CPU_CLK_EN);
-       clk = syscon_clk_register(NULL, "dmac_clk", "app_52_clk", 0, true,
-                                 syscon_vbase + U300_SYSCON_RRR, 4,
-                                 syscon_vbase + U300_SYSCON_CERR, 4,
-                                 U300_SYSCON_SBCER_DMAC_CLK_EN);
-       clk_register_clkdev(clk, NULL, "dma");
-       clk = syscon_clk_register(NULL, "fsmc_clk", "app_52_clk", 0, false,
-                                 syscon_vbase + U300_SYSCON_RRR, 6,
-                                 syscon_vbase + U300_SYSCON_CERR, 6,
-                                 U300_SYSCON_SBCER_NANDIF_CLK_EN);
-       clk_register_clkdev(clk, NULL, "fsmc-nand");
-       clk = syscon_clk_register(NULL, "xgam_clk", "app_52_clk", 0, true,
-                                 syscon_vbase + U300_SYSCON_RRR, 8,
-                                 syscon_vbase + U300_SYSCON_CERR, 8,
-                                 U300_SYSCON_SBCER_XGAM_CLK_EN);
-       clk_register_clkdev(clk, NULL, "xgam");
-       clk = syscon_clk_register(NULL, "semi_clk", "app_104_clk", 0, false,
-                                 syscon_vbase + U300_SYSCON_RRR, 9,
-                                 syscon_vbase + U300_SYSCON_CERR, 9,
-                                 U300_SYSCON_SBCER_SEMI_CLK_EN);
-       clk_register_clkdev(clk, NULL, "semi");
-
-       /* AHB bridge clocks */
-       clk = syscon_clk_register(NULL, "ahb_subsys_clk", "app_52_clk", 0, true,
-                                 syscon_vbase + U300_SYSCON_RRR, 10,
-                                 syscon_vbase + U300_SYSCON_CERR, 10,
-                                 U300_SYSCON_SBCER_AHB_SUBSYS_BRIDGE_CLK_EN);
-       clk = syscon_clk_register(NULL, "intcon_clk", "ahb_subsys_clk", 0, false,
-                                 syscon_vbase + U300_SYSCON_RRR, 12,
-                                 syscon_vbase + U300_SYSCON_CERR, 12,
-                                 /* Cannot be enabled, just taken out of reset */
-                                 0xFFFFU);
-       clk_register_clkdev(clk, NULL, "intcon");
-       clk = syscon_clk_register(NULL, "emif_clk", "ahb_subsys_clk", 0, false,
-                                 syscon_vbase + U300_SYSCON_RRR, 5,
-                                 syscon_vbase + U300_SYSCON_CERR, 5,
-                                 U300_SYSCON_SBCER_EMIF_CLK_EN);
-       clk_register_clkdev(clk, NULL, "pl172");
-
-       /* FAST bridge clocks */
-       clk = syscon_clk_register(NULL, "fast_clk", "app_26_clk", 0, true,
-                                 syscon_vbase + U300_SYSCON_RFR, 0,
-                                 syscon_vbase + U300_SYSCON_CEFR, 0,
-                                 U300_SYSCON_SBCER_FAST_BRIDGE_CLK_EN);
-       clk = syscon_clk_register(NULL, "i2c0_p_clk", "fast_clk", 0, false,
-                                 syscon_vbase + U300_SYSCON_RFR, 1,
-                                 syscon_vbase + U300_SYSCON_CEFR, 1,
-                                 U300_SYSCON_SBCER_I2C0_CLK_EN);
-       clk_register_clkdev(clk, NULL, "stu300.0");
-       clk = syscon_clk_register(NULL, "i2c1_p_clk", "fast_clk", 0, false,
-                                 syscon_vbase + U300_SYSCON_RFR, 2,
-                                 syscon_vbase + U300_SYSCON_CEFR, 2,
-                                 U300_SYSCON_SBCER_I2C1_CLK_EN);
-       clk_register_clkdev(clk, NULL, "stu300.1");
-       clk = syscon_clk_register(NULL, "mmc_p_clk", "fast_clk", 0, false,
-                                 syscon_vbase + U300_SYSCON_RFR, 5,
-                                 syscon_vbase + U300_SYSCON_CEFR, 5,
-                                 U300_SYSCON_SBCER_MMC_CLK_EN);
-       clk_register_clkdev(clk, "apb_pclk", "mmci");
-       clk = syscon_clk_register(NULL, "spi_p_clk", "fast_clk", 0, false,
-                                 syscon_vbase + U300_SYSCON_RFR, 6,
-                                 syscon_vbase + U300_SYSCON_CEFR, 6,
-                                 U300_SYSCON_SBCER_SPI_CLK_EN);
-       /* The SPI has no external clock for the outward bus, uses the pclk */
-       clk_register_clkdev(clk, NULL, "pl022");
-       clk_register_clkdev(clk, "apb_pclk", "pl022");
-
-       /* SLOW bridge clocks */
-       clk = syscon_clk_register(NULL, "slow_clk", "pll13", 0, true,
-                                 syscon_vbase + U300_SYSCON_RSR, 0,
-                                 syscon_vbase + U300_SYSCON_CESR, 0,
-                                 U300_SYSCON_SBCER_SLOW_BRIDGE_CLK_EN);
-       clk = syscon_clk_register(NULL, "uart0_clk", "slow_clk", 0, false,
-                                 syscon_vbase + U300_SYSCON_RSR, 1,
-                                 syscon_vbase + U300_SYSCON_CESR, 1,
-                                 U300_SYSCON_SBCER_UART_CLK_EN);
-       /* Same clock is used for APB and outward bus */
-       clk_register_clkdev(clk, NULL, "uart0");
-       clk_register_clkdev(clk, "apb_pclk", "uart0");
-       clk = syscon_clk_register(NULL, "gpio_clk", "slow_clk", 0, false,
-                                 syscon_vbase + U300_SYSCON_RSR, 4,
-                                 syscon_vbase + U300_SYSCON_CESR, 4,
-                                 U300_SYSCON_SBCER_GPIO_CLK_EN);
-       clk_register_clkdev(clk, NULL, "u300-gpio");
-       clk = syscon_clk_register(NULL, "keypad_clk", "slow_clk", 0, false,
-                                 syscon_vbase + U300_SYSCON_RSR, 5,
-                                 syscon_vbase + U300_SYSCON_CESR, 6,
-                                 U300_SYSCON_SBCER_KEYPAD_CLK_EN);
-       clk_register_clkdev(clk, NULL, "coh901461-keypad");
-       clk = syscon_clk_register(NULL, "rtc_clk", "slow_clk", 0, true,
-                                 syscon_vbase + U300_SYSCON_RSR, 6,
-                                 /* No clock enable register bit */
-                                 NULL, 0, 0xFFFFU);
-       clk_register_clkdev(clk, NULL, "rtc-coh901331");
-       clk = syscon_clk_register(NULL, "app_tmr_clk", "slow_clk", 0, false,
-                                 syscon_vbase + U300_SYSCON_RSR, 7,
-                                 syscon_vbase + U300_SYSCON_CESR, 7,
-                                 U300_SYSCON_SBCER_APP_TMR_CLK_EN);
-       clk_register_clkdev(clk, NULL, "apptimer");
-       clk = syscon_clk_register(NULL, "acc_tmr_clk", "slow_clk", 0, false,
-                                 syscon_vbase + U300_SYSCON_RSR, 8,
-                                 syscon_vbase + U300_SYSCON_CESR, 8,
-                                 U300_SYSCON_SBCER_ACC_TMR_CLK_EN);
-       clk_register_clkdev(clk, NULL, "timer");
-
-       /* Then this special MMC/SD clock */
-       clk = mclk_clk_register(NULL, "mmc_clk", "mmc_p_clk", false);
-       clk_register_clkdev(clk, NULL, "mmci");
+       of_clk_init(u300_clk_match);
 }
diff --git a/drivers/clk/clk-zynq.c b/drivers/clk/clk-zynq.c
deleted file mode 100644 (file)
index 3206297..0000000
+++ /dev/null
@@ -1,378 +0,0 @@
-/*
- * Copyright (c) 2012 National Instruments
- *
- * Josh Cartwright <josh.cartwright@ni.com>
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms and conditions of the GNU General Public License,
- * version 2, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along with
- * this program.  If not, see <http://www.gnu.org/licenses/>.
- */
-#include <linux/io.h>
-#include <linux/of.h>
-#include <linux/slab.h>
-#include <linux/kernel.h>
-#include <linux/clk-provider.h>
-#include <linux/clk/zynq.h>
-
-static void __iomem *slcr_base;
-
-struct zynq_pll_clk {
-       struct clk_hw   hw;
-       void __iomem    *pll_ctrl;
-       void __iomem    *pll_cfg;
-};
-
-#define to_zynq_pll_clk(hw)    container_of(hw, struct zynq_pll_clk, hw)
-
-#define CTRL_PLL_FDIV(x)       ((x) >> 12)
-
-static unsigned long zynq_pll_recalc_rate(struct clk_hw *hw,
-                                         unsigned long parent_rate)
-{
-       struct zynq_pll_clk *pll = to_zynq_pll_clk(hw);
-       return parent_rate * CTRL_PLL_FDIV(ioread32(pll->pll_ctrl));
-}
-
-static const struct clk_ops zynq_pll_clk_ops = {
-       .recalc_rate    = zynq_pll_recalc_rate,
-};
-
-static void __init zynq_pll_clk_setup(struct device_node *np)
-{
-       struct clk_init_data init;
-       struct zynq_pll_clk *pll;
-       const char *parent_name;
-       struct clk *clk;
-       u32 regs[2];
-       int ret;
-
-       ret = of_property_read_u32_array(np, "reg", regs, ARRAY_SIZE(regs));
-       if (WARN_ON(ret))
-               return;
-
-       pll = kzalloc(sizeof(*pll), GFP_KERNEL);
-       if (WARN_ON(!pll))
-               return;
-
-       pll->pll_ctrl = slcr_base + regs[0];
-       pll->pll_cfg  = slcr_base + regs[1];
-
-       of_property_read_string(np, "clock-output-names", &init.name);
-
-       init.ops = &zynq_pll_clk_ops;
-       parent_name = of_clk_get_parent_name(np, 0);
-       init.parent_names = &parent_name;
-       init.num_parents = 1;
-
-       pll->hw.init = &init;
-
-       clk = clk_register(NULL, &pll->hw);
-       if (WARN_ON(IS_ERR(clk)))
-               return;
-
-       ret = of_clk_add_provider(np, of_clk_src_simple_get, clk);
-       if (WARN_ON(ret))
-               return;
-}
-CLK_OF_DECLARE(zynq_pll, "xlnx,zynq-pll", zynq_pll_clk_setup);
-
-struct zynq_periph_clk {
-       struct clk_hw           hw;
-       struct clk_onecell_data onecell_data;
-       struct clk              *gates[2];
-       void __iomem            *clk_ctrl;
-       spinlock_t              clkact_lock;
-};
-
-#define to_zynq_periph_clk(hw) container_of(hw, struct zynq_periph_clk, hw)
-
-static const u8 periph_clk_parent_map[] = {
-       0, 0, 1, 2
-};
-#define PERIPH_CLK_CTRL_SRC(x) (periph_clk_parent_map[((x) & 0x30) >> 4])
-#define PERIPH_CLK_CTRL_DIV(x) (((x) & 0x3F00) >> 8)
-
-static unsigned long zynq_periph_recalc_rate(struct clk_hw *hw,
-                                            unsigned long parent_rate)
-{
-       struct zynq_periph_clk *periph = to_zynq_periph_clk(hw);
-       return parent_rate / PERIPH_CLK_CTRL_DIV(ioread32(periph->clk_ctrl));
-}
-
-static u8 zynq_periph_get_parent(struct clk_hw *hw)
-{
-       struct zynq_periph_clk *periph = to_zynq_periph_clk(hw);
-       return PERIPH_CLK_CTRL_SRC(ioread32(periph->clk_ctrl));
-}
-
-static const struct clk_ops zynq_periph_clk_ops = {
-       .recalc_rate    = zynq_periph_recalc_rate,
-       .get_parent     = zynq_periph_get_parent,
-};
-
-static void __init zynq_periph_clk_setup(struct device_node *np)
-{
-       struct zynq_periph_clk *periph;
-       const char *parent_names[3];
-       struct clk_init_data init;
-       int clk_num = 0, err;
-       const char *name;
-       struct clk *clk;
-       u32 reg;
-       int i;
-
-       err = of_property_read_u32(np, "reg", &reg);
-       if (WARN_ON(err))
-               return;
-
-       periph = kzalloc(sizeof(*periph), GFP_KERNEL);
-       if (WARN_ON(!periph))
-               return;
-
-       periph->clk_ctrl = slcr_base + reg;
-       spin_lock_init(&periph->clkact_lock);
-
-       init.name = np->name;
-       init.ops = &zynq_periph_clk_ops;
-       for (i = 0; i < ARRAY_SIZE(parent_names); i++)
-               parent_names[i] = of_clk_get_parent_name(np, i);
-       init.parent_names = parent_names;
-       init.num_parents = ARRAY_SIZE(parent_names);
-
-       periph->hw.init = &init;
-
-       clk = clk_register(NULL, &periph->hw);
-       if (WARN_ON(IS_ERR(clk)))
-               return;
-
-       err = of_clk_add_provider(np, of_clk_src_simple_get, clk);
-       if (WARN_ON(err))
-               return;
-
-       err = of_property_read_string_index(np, "clock-output-names", 0,
-                                           &name);
-       if (WARN_ON(err))
-               return;
-
-       periph->gates[0] = clk_register_gate(NULL, name, np->name, 0,
-                                            periph->clk_ctrl, 0, 0,
-                                            &periph->clkact_lock);
-       if (WARN_ON(IS_ERR(periph->gates[0])))
-               return;
-       clk_num++;
-
-       /* some periph clks have 2 downstream gates */
-       err = of_property_read_string_index(np, "clock-output-names", 1,
-                                           &name);
-       if (err != -ENODATA) {
-               periph->gates[1] = clk_register_gate(NULL, name, np->name, 0,
-                                                    periph->clk_ctrl, 1, 0,
-                                                    &periph->clkact_lock);
-               if (WARN_ON(IS_ERR(periph->gates[1])))
-                       return;
-               clk_num++;
-       }
-
-       periph->onecell_data.clks = periph->gates;
-       periph->onecell_data.clk_num = clk_num;
-
-       err = of_clk_add_provider(np, of_clk_src_onecell_get,
-                                 &periph->onecell_data);
-       if (WARN_ON(err))
-               return;
-}
-CLK_OF_DECLARE(zynq_periph, "xlnx,zynq-periph-clock", zynq_periph_clk_setup);
-
-/* CPU Clock domain is modelled as a mux with 4 children subclks, whose
- * derivative rates depend on CLK_621_TRUE
- */
-
-struct zynq_cpu_clk {
-       struct clk_hw           hw;
-       struct clk_onecell_data onecell_data;
-       struct clk              *subclks[4];
-       void __iomem            *clk_ctrl;
-       spinlock_t              clkact_lock;
-};
-
-#define to_zynq_cpu_clk(hw)    container_of(hw, struct zynq_cpu_clk, hw)
-
-static const u8 zynq_cpu_clk_parent_map[] = {
-       1, 1, 2, 0
-};
-#define CPU_CLK_SRCSEL(x)      (zynq_cpu_clk_parent_map[(((x) & 0x30) >> 4)])
-#define CPU_CLK_CTRL_DIV(x)    (((x) & 0x3F00) >> 8)
-
-static u8 zynq_cpu_clk_get_parent(struct clk_hw *hw)
-{
-       struct zynq_cpu_clk *cpuclk = to_zynq_cpu_clk(hw);
-       return CPU_CLK_SRCSEL(ioread32(cpuclk->clk_ctrl));
-}
-
-static unsigned long zynq_cpu_clk_recalc_rate(struct clk_hw *hw,
-                                             unsigned long parent_rate)
-{
-       struct zynq_cpu_clk *cpuclk = to_zynq_cpu_clk(hw);
-       return parent_rate / CPU_CLK_CTRL_DIV(ioread32(cpuclk->clk_ctrl));
-}
-
-static const struct clk_ops zynq_cpu_clk_ops = {
-       .get_parent     = zynq_cpu_clk_get_parent,
-       .recalc_rate    = zynq_cpu_clk_recalc_rate,
-};
-
-struct zynq_cpu_subclk {
-       struct clk_hw   hw;
-       void __iomem    *clk_621;
-       enum {
-               CPU_SUBCLK_6X4X,
-               CPU_SUBCLK_3X2X,
-               CPU_SUBCLK_2X,
-               CPU_SUBCLK_1X,
-       } which;
-};
-
-#define CLK_621_TRUE(x)        ((x) & 1)
-
-#define to_zynq_cpu_subclk(hw) container_of(hw, struct zynq_cpu_subclk, hw);
-
-static unsigned long zynq_cpu_subclk_recalc_rate(struct clk_hw *hw,
-                                                unsigned long parent_rate)
-{
-       unsigned long uninitialized_var(rate);
-       struct zynq_cpu_subclk *subclk;
-       bool is_621;
-
-       subclk = to_zynq_cpu_subclk(hw)
-       is_621 = CLK_621_TRUE(ioread32(subclk->clk_621));
-
-       switch (subclk->which) {
-       case CPU_SUBCLK_6X4X:
-               rate = parent_rate;
-               break;
-       case CPU_SUBCLK_3X2X:
-               rate = parent_rate / 2;
-               break;
-       case CPU_SUBCLK_2X:
-               rate = parent_rate / (is_621 ? 3 : 2);
-               break;
-       case CPU_SUBCLK_1X:
-               rate = parent_rate / (is_621 ? 6 : 4);
-               break;
-       };
-
-       return rate;
-}
-
-static const struct clk_ops zynq_cpu_subclk_ops = {
-       .recalc_rate    = zynq_cpu_subclk_recalc_rate,
-};
-
-static struct clk *zynq_cpu_subclk_setup(struct device_node *np, u8 which,
-                                        void __iomem *clk_621)
-{
-       struct zynq_cpu_subclk *subclk;
-       struct clk_init_data init;
-       struct clk *clk;
-       int err;
-
-       err = of_property_read_string_index(np, "clock-output-names",
-                                           which, &init.name);
-       if (WARN_ON(err))
-               goto err_read_output_name;
-
-       subclk = kzalloc(sizeof(*subclk), GFP_KERNEL);
-       if (!subclk)
-               goto err_subclk_alloc;
-
-       subclk->clk_621 = clk_621;
-       subclk->which = which;
-
-       init.ops = &zynq_cpu_subclk_ops;
-       init.parent_names = &np->name;
-       init.num_parents = 1;
-
-       subclk->hw.init = &init;
-
-       clk = clk_register(NULL, &subclk->hw);
-       if (WARN_ON(IS_ERR(clk)))
-               goto err_clk_register;
-
-       return clk;
-
-err_clk_register:
-       kfree(subclk);
-err_subclk_alloc:
-err_read_output_name:
-       return ERR_PTR(-EINVAL);
-}
-
-static void __init zynq_cpu_clk_setup(struct device_node *np)
-{
-       struct zynq_cpu_clk *cpuclk;
-       const char *parent_names[3];
-       struct clk_init_data init;
-       void __iomem *clk_621;
-       struct clk *clk;
-       u32 reg[2];
-       int err;
-       int i;
-
-       err = of_property_read_u32_array(np, "reg", reg, ARRAY_SIZE(reg));
-       if (WARN_ON(err))
-               return;
-
-       cpuclk = kzalloc(sizeof(*cpuclk), GFP_KERNEL);
-       if (WARN_ON(!cpuclk))
-               return;
-
-       cpuclk->clk_ctrl = slcr_base + reg[0];
-       clk_621 = slcr_base + reg[1];
-       spin_lock_init(&cpuclk->clkact_lock);
-
-       init.name = np->name;
-       init.ops = &zynq_cpu_clk_ops;
-       for (i = 0; i < ARRAY_SIZE(parent_names); i++)
-               parent_names[i] = of_clk_get_parent_name(np, i);
-       init.parent_names = parent_names;
-       init.num_parents = ARRAY_SIZE(parent_names);
-
-       cpuclk->hw.init = &init;
-
-       clk = clk_register(NULL, &cpuclk->hw);
-       if (WARN_ON(IS_ERR(clk)))
-               return;
-
-       err = of_clk_add_provider(np, of_clk_src_simple_get, clk);
-       if (WARN_ON(err))
-               return;
-
-       for (i = 0; i < 4; i++) {
-               cpuclk->subclks[i] = zynq_cpu_subclk_setup(np, i, clk_621);
-               if (WARN_ON(IS_ERR(cpuclk->subclks[i])))
-                       return;
-       }
-
-       cpuclk->onecell_data.clks = cpuclk->subclks;
-       cpuclk->onecell_data.clk_num = i;
-
-       err = of_clk_add_provider(np, of_clk_src_onecell_get,
-                                 &cpuclk->onecell_data);
-       if (WARN_ON(err))
-               return;
-}
-CLK_OF_DECLARE(zynq_cpu, "xlnx,zynq-cpu-clock", zynq_cpu_clk_setup);
-
-void __init xilinx_zynq_clocks_init(void __iomem *slcr)
-{
-       slcr_base = slcr;
-       of_clk_init(NULL);
-}
index 57323fd15ec96b7afb6ea00489a9370acbb270f2..0b0f3e729cf7ca5ec18c322a6322ab2001a55a70 100644 (file)
@@ -1,8 +1,23 @@
-config MVEBU_CLK_CORE
-       bool
+config MVEBU_CLK_COMMON
+       bool
 
 config MVEBU_CLK_CPU
-       bool
+       bool
 
-config MVEBU_CLK_GATING
-       bool
+config ARMADA_370_CLK
+       bool
+       select MVEBU_CLK_COMMON
+       select MVEBU_CLK_CPU
+
+config ARMADA_XP_CLK
+       bool
+       select MVEBU_CLK_COMMON
+       select MVEBU_CLK_CPU
+
+config DOVE_CLK
+       bool
+       select MVEBU_CLK_COMMON
+
+config KIRKWOOD_CLK
+       bool
+       select MVEBU_CLK_COMMON
index 58df3dc493636baa4a498fa8684c27b566288b32..1c7e70c63fb26b80145b5e506015874b5da16b64 100644 (file)
@@ -1,3 +1,7 @@
-obj-$(CONFIG_MVEBU_CLK_CORE)   += clk.o clk-core.o
+obj-$(CONFIG_MVEBU_CLK_COMMON) += common.o
 obj-$(CONFIG_MVEBU_CLK_CPU)    += clk-cpu.o
-obj-$(CONFIG_MVEBU_CLK_GATING)         += clk-gating-ctrl.o
+
+obj-$(CONFIG_ARMADA_370_CLK)   += armada-370.o
+obj-$(CONFIG_ARMADA_XP_CLK)    += armada-xp.o
+obj-$(CONFIG_DOVE_CLK)         += dove.o
+obj-$(CONFIG_KIRKWOOD_CLK)     += kirkwood.o
diff --git a/drivers/clk/mvebu/armada-370.c b/drivers/clk/mvebu/armada-370.c
new file mode 100644 (file)
index 0000000..079960e
--- /dev/null
@@ -0,0 +1,176 @@
+/*
+ * Marvell Armada 370 SoC clocks
+ *
+ * Copyright (C) 2012 Marvell
+ *
+ * Gregory CLEMENT <gregory.clement@free-electrons.com>
+ * Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
+ * Andrew Lunn <andrew@lunn.ch>
+ *
+ * This file is licensed under the terms of the GNU General Public
+ * License version 2.  This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+ */
+
+#include <linux/kernel.h>
+#include <linux/clk-provider.h>
+#include <linux/io.h>
+#include <linux/of.h>
+#include "common.h"
+
+/*
+ * Core Clocks
+ */
+
+#define SARL                           0       /* Low part [0:31] */
+#define         SARL_A370_PCLK_FREQ_OPT        11
+#define         SARL_A370_PCLK_FREQ_OPT_MASK   0xF
+#define         SARL_A370_FAB_FREQ_OPT         15
+#define         SARL_A370_FAB_FREQ_OPT_MASK    0x1F
+#define         SARL_A370_TCLK_FREQ_OPT        20
+#define         SARL_A370_TCLK_FREQ_OPT_MASK   0x1
+
+enum { A370_CPU_TO_NBCLK, A370_CPU_TO_HCLK, A370_CPU_TO_DRAMCLK };
+
+static const struct coreclk_ratio __initconst a370_coreclk_ratios[] = {
+       { .id = A370_CPU_TO_NBCLK, .name = "nbclk" },
+       { .id = A370_CPU_TO_HCLK, .name = "hclk" },
+       { .id = A370_CPU_TO_DRAMCLK, .name = "dramclk" },
+};
+
+static const u32 __initconst a370_tclk_freqs[] = {
+       16600000,
+       20000000,
+};
+
+static u32 __init a370_get_tclk_freq(void __iomem *sar)
+{
+       u8 tclk_freq_select = 0;
+
+       tclk_freq_select = ((readl(sar) >> SARL_A370_TCLK_FREQ_OPT) &
+                           SARL_A370_TCLK_FREQ_OPT_MASK);
+       return a370_tclk_freqs[tclk_freq_select];
+}
+
+static const u32 __initconst a370_cpu_freqs[] = {
+       400000000,
+       533000000,
+       667000000,
+       800000000,
+       1000000000,
+       1067000000,
+       1200000000,
+};
+
+static u32 __init a370_get_cpu_freq(void __iomem *sar)
+{
+       u32 cpu_freq;
+       u8 cpu_freq_select = 0;
+
+       cpu_freq_select = ((readl(sar) >> SARL_A370_PCLK_FREQ_OPT) &
+                          SARL_A370_PCLK_FREQ_OPT_MASK);
+       if (cpu_freq_select >= ARRAY_SIZE(a370_cpu_freqs)) {
+               pr_err("CPU freq select unsupported %d\n", cpu_freq_select);
+               cpu_freq = 0;
+       } else
+               cpu_freq = a370_cpu_freqs[cpu_freq_select];
+
+       return cpu_freq;
+}
+
+static const int __initconst a370_nbclk_ratios[32][2] = {
+       {0, 1}, {1, 2}, {2, 2}, {2, 2},
+       {1, 2}, {1, 2}, {1, 1}, {2, 3},
+       {0, 1}, {1, 2}, {2, 4}, {0, 1},
+       {1, 2}, {0, 1}, {0, 1}, {2, 2},
+       {0, 1}, {0, 1}, {0, 1}, {1, 1},
+       {2, 3}, {0, 1}, {0, 1}, {0, 1},
+       {0, 1}, {0, 1}, {0, 1}, {1, 1},
+       {0, 1}, {0, 1}, {0, 1}, {0, 1},
+};
+
+static const int __initconst a370_hclk_ratios[32][2] = {
+       {0, 1}, {1, 2}, {2, 6}, {2, 3},
+       {1, 3}, {1, 4}, {1, 2}, {2, 6},
+       {0, 1}, {1, 6}, {2, 10}, {0, 1},
+       {1, 4}, {0, 1}, {0, 1}, {2, 5},
+       {0, 1}, {0, 1}, {0, 1}, {1, 2},
+       {2, 6}, {0, 1}, {0, 1}, {0, 1},
+       {0, 1}, {0, 1}, {0, 1}, {1, 1},
+       {0, 1}, {0, 1}, {0, 1}, {0, 1},
+};
+
+static const int __initconst a370_dramclk_ratios[32][2] = {
+       {0, 1}, {1, 2}, {2, 3}, {2, 3},
+       {1, 3}, {1, 2}, {1, 2}, {2, 6},
+       {0, 1}, {1, 3}, {2, 5}, {0, 1},
+       {1, 4}, {0, 1}, {0, 1}, {2, 5},
+       {0, 1}, {0, 1}, {0, 1}, {1, 1},
+       {2, 3}, {0, 1}, {0, 1}, {0, 1},
+       {0, 1}, {0, 1}, {0, 1}, {1, 1},
+       {0, 1}, {0, 1}, {0, 1}, {0, 1},
+};
+
+static void __init a370_get_clk_ratio(
+       void __iomem *sar, int id, int *mult, int *div)
+{
+       u32 opt = ((readl(sar) >> SARL_A370_FAB_FREQ_OPT) &
+               SARL_A370_FAB_FREQ_OPT_MASK);
+
+       switch (id) {
+       case A370_CPU_TO_NBCLK:
+               *mult = a370_nbclk_ratios[opt][0];
+               *div = a370_nbclk_ratios[opt][1];
+               break;
+       case A370_CPU_TO_HCLK:
+               *mult = a370_hclk_ratios[opt][0];
+               *div = a370_hclk_ratios[opt][1];
+               break;
+       case A370_CPU_TO_DRAMCLK:
+               *mult = a370_dramclk_ratios[opt][0];
+               *div = a370_dramclk_ratios[opt][1];
+               break;
+       }
+}
+
+static const struct coreclk_soc_desc a370_coreclks = {
+       .get_tclk_freq = a370_get_tclk_freq,
+       .get_cpu_freq = a370_get_cpu_freq,
+       .get_clk_ratio = a370_get_clk_ratio,
+       .ratios = a370_coreclk_ratios,
+       .num_ratios = ARRAY_SIZE(a370_coreclk_ratios),
+};
+
+static void __init a370_coreclk_init(struct device_node *np)
+{
+       mvebu_coreclk_setup(np, &a370_coreclks);
+}
+CLK_OF_DECLARE(a370_core_clk, "marvell,armada-370-core-clock",
+              a370_coreclk_init);
+
+/*
+ * Clock Gating Control
+ */
+
+static const struct clk_gating_soc_desc __initconst a370_gating_desc[] = {
+       { "audio", NULL, 0, 0 },
+       { "pex0_en", NULL, 1, 0 },
+       { "pex1_en", NULL,  2, 0 },
+       { "ge1", NULL, 3, 0 },
+       { "ge0", NULL, 4, 0 },
+       { "pex0", "pex0_en", 5, 0 },
+       { "pex1", "pex1_en", 9, 0 },
+       { "sata0", NULL, 15, 0 },
+       { "sdio", NULL, 17, 0 },
+       { "tdm", NULL, 25, 0 },
+       { "ddr", NULL, 28, CLK_IGNORE_UNUSED },
+       { "sata1", NULL, 30, 0 },
+       { }
+};
+
+static void __init a370_clk_gating_init(struct device_node *np)
+{
+       mvebu_clk_gating_setup(np, a370_gating_desc);
+}
+CLK_OF_DECLARE(a370_clk_gating, "marvell,armada-370-gating-clock",
+              a370_clk_gating_init);
diff --git a/drivers/clk/mvebu/armada-xp.c b/drivers/clk/mvebu/armada-xp.c
new file mode 100644 (file)
index 0000000..13b62ce
--- /dev/null
@@ -0,0 +1,210 @@
+/*
+ * Marvell Armada XP SoC clocks
+ *
+ * Copyright (C) 2012 Marvell
+ *
+ * Gregory CLEMENT <gregory.clement@free-electrons.com>
+ * Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
+ * Andrew Lunn <andrew@lunn.ch>
+ *
+ * This file is licensed under the terms of the GNU General Public
+ * License version 2.  This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+ */
+
+#include <linux/kernel.h>
+#include <linux/clk-provider.h>
+#include <linux/io.h>
+#include <linux/of.h>
+#include "common.h"
+
+/*
+ * Core Clocks
+ *
+ * Armada XP Sample At Reset is a 64 bit bitfiled split in two
+ * register of 32 bits
+ */
+
+#define SARL                           0       /* Low part [0:31] */
+#define         SARL_AXP_PCLK_FREQ_OPT         21
+#define         SARL_AXP_PCLK_FREQ_OPT_MASK    0x7
+#define         SARL_AXP_FAB_FREQ_OPT          24
+#define         SARL_AXP_FAB_FREQ_OPT_MASK     0xF
+#define SARH                           4       /* High part [32:63] */
+#define         SARH_AXP_PCLK_FREQ_OPT         (52-32)
+#define         SARH_AXP_PCLK_FREQ_OPT_MASK    0x1
+#define         SARH_AXP_PCLK_FREQ_OPT_SHIFT   3
+#define         SARH_AXP_FAB_FREQ_OPT          (51-32)
+#define         SARH_AXP_FAB_FREQ_OPT_MASK     0x1
+#define         SARH_AXP_FAB_FREQ_OPT_SHIFT    4
+
+enum { AXP_CPU_TO_NBCLK, AXP_CPU_TO_HCLK, AXP_CPU_TO_DRAMCLK };
+
+static const struct coreclk_ratio __initconst axp_coreclk_ratios[] = {
+       { .id = AXP_CPU_TO_NBCLK, .name = "nbclk" },
+       { .id = AXP_CPU_TO_HCLK, .name = "hclk" },
+       { .id = AXP_CPU_TO_DRAMCLK, .name = "dramclk" },
+};
+
+/* Armada XP TCLK frequency is fixed to 250MHz */
+static u32 __init axp_get_tclk_freq(void __iomem *sar)
+{
+       return 250000000;
+}
+
+static const u32 __initconst axp_cpu_freqs[] = {
+       1000000000,
+       1066000000,
+       1200000000,
+       1333000000,
+       1500000000,
+       1666000000,
+       1800000000,
+       2000000000,
+       667000000,
+       0,
+       800000000,
+       1600000000,
+};
+
+static u32 __init axp_get_cpu_freq(void __iomem *sar)
+{
+       u32 cpu_freq;
+       u8 cpu_freq_select = 0;
+
+       cpu_freq_select = ((readl(sar + SARL) >> SARL_AXP_PCLK_FREQ_OPT) &
+                          SARL_AXP_PCLK_FREQ_OPT_MASK);
+       /*
+        * The upper bit is not contiguous to the other ones and
+        * located in the high part of the SAR registers
+        */
+       cpu_freq_select |= (((readl(sar + SARH) >> SARH_AXP_PCLK_FREQ_OPT) &
+            SARH_AXP_PCLK_FREQ_OPT_MASK) << SARH_AXP_PCLK_FREQ_OPT_SHIFT);
+       if (cpu_freq_select >= ARRAY_SIZE(axp_cpu_freqs)) {
+               pr_err("CPU freq select unsupported: %d\n", cpu_freq_select);
+               cpu_freq = 0;
+       } else
+               cpu_freq = axp_cpu_freqs[cpu_freq_select];
+
+       return cpu_freq;
+}
+
+static const int __initconst axp_nbclk_ratios[32][2] = {
+       {0, 1}, {1, 2}, {2, 2}, {2, 2},
+       {1, 2}, {1, 2}, {1, 1}, {2, 3},
+       {0, 1}, {1, 2}, {2, 4}, {0, 1},
+       {1, 2}, {0, 1}, {0, 1}, {2, 2},
+       {0, 1}, {0, 1}, {0, 1}, {1, 1},
+       {2, 3}, {0, 1}, {0, 1}, {0, 1},
+       {0, 1}, {0, 1}, {0, 1}, {1, 1},
+       {0, 1}, {0, 1}, {0, 1}, {0, 1},
+};
+
+static const int __initconst axp_hclk_ratios[32][2] = {
+       {0, 1}, {1, 2}, {2, 6}, {2, 3},
+       {1, 3}, {1, 4}, {1, 2}, {2, 6},
+       {0, 1}, {1, 6}, {2, 10}, {0, 1},
+       {1, 4}, {0, 1}, {0, 1}, {2, 5},
+       {0, 1}, {0, 1}, {0, 1}, {1, 2},
+       {2, 6}, {0, 1}, {0, 1}, {0, 1},
+       {0, 1}, {0, 1}, {0, 1}, {1, 1},
+       {0, 1}, {0, 1}, {0, 1}, {0, 1},
+};
+
+static const int __initconst axp_dramclk_ratios[32][2] = {
+       {0, 1}, {1, 2}, {2, 3}, {2, 3},
+       {1, 3}, {1, 2}, {1, 2}, {2, 6},
+       {0, 1}, {1, 3}, {2, 5}, {0, 1},
+       {1, 4}, {0, 1}, {0, 1}, {2, 5},
+       {0, 1}, {0, 1}, {0, 1}, {1, 1},
+       {2, 3}, {0, 1}, {0, 1}, {0, 1},
+       {0, 1}, {0, 1}, {0, 1}, {1, 1},
+       {0, 1}, {0, 1}, {0, 1}, {0, 1},
+};
+
+static void __init axp_get_clk_ratio(
+       void __iomem *sar, int id, int *mult, int *div)
+{
+       u32 opt = ((readl(sar + SARL) >> SARL_AXP_FAB_FREQ_OPT) &
+             SARL_AXP_FAB_FREQ_OPT_MASK);
+       /*
+        * The upper bit is not contiguous to the other ones and
+        * located in the high part of the SAR registers
+        */
+       opt |= (((readl(sar + SARH) >> SARH_AXP_FAB_FREQ_OPT) &
+                SARH_AXP_FAB_FREQ_OPT_MASK) << SARH_AXP_FAB_FREQ_OPT_SHIFT);
+
+       switch (id) {
+       case AXP_CPU_TO_NBCLK:
+               *mult = axp_nbclk_ratios[opt][0];
+               *div = axp_nbclk_ratios[opt][1];
+               break;
+       case AXP_CPU_TO_HCLK:
+               *mult = axp_hclk_ratios[opt][0];
+               *div = axp_hclk_ratios[opt][1];
+               break;
+       case AXP_CPU_TO_DRAMCLK:
+               *mult = axp_dramclk_ratios[opt][0];
+               *div = axp_dramclk_ratios[opt][1];
+               break;
+       }
+}
+
+static const struct coreclk_soc_desc axp_coreclks = {
+       .get_tclk_freq = axp_get_tclk_freq,
+       .get_cpu_freq = axp_get_cpu_freq,
+       .get_clk_ratio = axp_get_clk_ratio,
+       .ratios = axp_coreclk_ratios,
+       .num_ratios = ARRAY_SIZE(axp_coreclk_ratios),
+};
+
+static void __init axp_coreclk_init(struct device_node *np)
+{
+       mvebu_coreclk_setup(np, &axp_coreclks);
+}
+CLK_OF_DECLARE(axp_core_clk, "marvell,armada-xp-core-clock",
+              axp_coreclk_init);
+
+/*
+ * Clock Gating Control
+ */
+
+static const struct clk_gating_soc_desc __initconst axp_gating_desc[] = {
+       { "audio", NULL, 0, 0 },
+       { "ge3", NULL, 1, 0 },
+       { "ge2", NULL,  2, 0 },
+       { "ge1", NULL, 3, 0 },
+       { "ge0", NULL, 4, 0 },
+       { "pex00", NULL, 5, 0 },
+       { "pex01", NULL, 6, 0 },
+       { "pex02", NULL, 7, 0 },
+       { "pex03", NULL, 8, 0 },
+       { "pex10", NULL, 9, 0 },
+       { "pex11", NULL, 10, 0 },
+       { "pex12", NULL, 11, 0 },
+       { "pex13", NULL, 12, 0 },
+       { "bp", NULL, 13, 0 },
+       { "sata0lnk", NULL, 14, 0 },
+       { "sata0", "sata0lnk", 15, 0 },
+       { "lcd", NULL, 16, 0 },
+       { "sdio", NULL, 17, 0 },
+       { "usb0", NULL, 18, 0 },
+       { "usb1", NULL, 19, 0 },
+       { "usb2", NULL, 20, 0 },
+       { "xor0", NULL, 22, 0 },
+       { "crypto", NULL, 23, 0 },
+       { "tdm", NULL, 25, 0 },
+       { "pex20", NULL, 26, 0 },
+       { "pex30", NULL, 27, 0 },
+       { "xor1", NULL, 28, 0 },
+       { "sata1lnk", NULL, 29, 0 },
+       { "sata1", "sata1lnk", 30, 0 },
+       { }
+};
+
+static void __init axp_clk_gating_init(struct device_node *np)
+{
+       mvebu_clk_gating_setup(np, axp_gating_desc);
+}
+CLK_OF_DECLARE(axp_clk_gating, "marvell,armada-xp-gating-clock",
+              axp_clk_gating_init);
diff --git a/drivers/clk/mvebu/clk-core.c b/drivers/clk/mvebu/clk-core.c
deleted file mode 100644 (file)
index 0a53edb..0000000
+++ /dev/null
@@ -1,675 +0,0 @@
-/*
- * Marvell EBU clock core handling defined at reset
- *
- * Copyright (C) 2012 Marvell
- *
- * Gregory CLEMENT <gregory.clement@free-electrons.com>
- * Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
- *
- * This file is licensed under the terms of the GNU General Public
- * License version 2.  This program is licensed "as is" without any
- * warranty of any kind, whether express or implied.
- */
-#include <linux/kernel.h>
-#include <linux/clk.h>
-#include <linux/clkdev.h>
-#include <linux/clk-provider.h>
-#include <linux/of_address.h>
-#include <linux/io.h>
-#include <linux/of.h>
-#include "clk-core.h"
-
-struct core_ratio {
-       int id;
-       const char *name;
-};
-
-struct core_clocks {
-       u32 (*get_tclk_freq)(void __iomem *sar);
-       u32 (*get_cpu_freq)(void __iomem *sar);
-       void (*get_clk_ratio)(void __iomem *sar, int id, int *mult, int *div);
-       const struct core_ratio *ratios;
-       int num_ratios;
-};
-
-static struct clk_onecell_data clk_data;
-
-static void __init mvebu_clk_core_setup(struct device_node *np,
-                                struct core_clocks *coreclk)
-{
-       const char *tclk_name = "tclk";
-       const char *cpuclk_name = "cpuclk";
-       void __iomem *base;
-       unsigned long rate;
-       int n;
-
-       base = of_iomap(np, 0);
-       if (WARN_ON(!base))
-               return;
-
-       /*
-        * Allocate struct for TCLK, cpu clk, and core ratio clocks
-        */
-       clk_data.clk_num = 2 + coreclk->num_ratios;
-       clk_data.clks = kzalloc(clk_data.clk_num * sizeof(struct clk *),
-                               GFP_KERNEL);
-       if (WARN_ON(!clk_data.clks))
-               return;
-
-       /*
-        * Register TCLK
-        */
-       of_property_read_string_index(np, "clock-output-names", 0,
-                                     &tclk_name);
-       rate = coreclk->get_tclk_freq(base);
-       clk_data.clks[0] = clk_register_fixed_rate(NULL, tclk_name, NULL,
-                                                  CLK_IS_ROOT, rate);
-       WARN_ON(IS_ERR(clk_data.clks[0]));
-
-       /*
-        * Register CPU clock
-        */
-       of_property_read_string_index(np, "clock-output-names", 1,
-                                     &cpuclk_name);
-       rate = coreclk->get_cpu_freq(base);
-       clk_data.clks[1] = clk_register_fixed_rate(NULL, cpuclk_name, NULL,
-                                                  CLK_IS_ROOT, rate);
-       WARN_ON(IS_ERR(clk_data.clks[1]));
-
-       /*
-        * Register fixed-factor clocks derived from CPU clock
-        */
-       for (n = 0; n < coreclk->num_ratios; n++) {
-               const char *rclk_name = coreclk->ratios[n].name;
-               int mult, div;
-
-               of_property_read_string_index(np, "clock-output-names",
-                                             2+n, &rclk_name);
-               coreclk->get_clk_ratio(base, coreclk->ratios[n].id,
-                                      &mult, &div);
-               clk_data.clks[2+n] = clk_register_fixed_factor(NULL, rclk_name,
-                                      cpuclk_name, 0, mult, div);
-               WARN_ON(IS_ERR(clk_data.clks[2+n]));
-       };
-
-       /*
-        * SAR register isn't needed anymore
-        */
-       iounmap(base);
-
-       of_clk_add_provider(np, of_clk_src_onecell_get, &clk_data);
-}
-
-#ifdef CONFIG_MACH_ARMADA_370_XP
-/*
- * Armada 370/XP Sample At Reset is a 64 bit bitfiled split in two
- * register of 32 bits
- */
-
-#define SARL                               0   /* Low part [0:31] */
-#define            SARL_AXP_PCLK_FREQ_OPT          21
-#define            SARL_AXP_PCLK_FREQ_OPT_MASK     0x7
-#define            SARL_A370_PCLK_FREQ_OPT         11
-#define            SARL_A370_PCLK_FREQ_OPT_MASK    0xF
-#define            SARL_AXP_FAB_FREQ_OPT           24
-#define            SARL_AXP_FAB_FREQ_OPT_MASK      0xF
-#define            SARL_A370_FAB_FREQ_OPT          15
-#define            SARL_A370_FAB_FREQ_OPT_MASK     0x1F
-#define            SARL_A370_TCLK_FREQ_OPT         20
-#define            SARL_A370_TCLK_FREQ_OPT_MASK    0x1
-#define SARH                               4   /* High part [32:63] */
-#define            SARH_AXP_PCLK_FREQ_OPT          (52-32)
-#define            SARH_AXP_PCLK_FREQ_OPT_MASK     0x1
-#define            SARH_AXP_PCLK_FREQ_OPT_SHIFT    3
-#define            SARH_AXP_FAB_FREQ_OPT           (51-32)
-#define            SARH_AXP_FAB_FREQ_OPT_MASK      0x1
-#define            SARH_AXP_FAB_FREQ_OPT_SHIFT     4
-
-static const u32 __initconst armada_370_tclk_frequencies[] = {
-       16600000,
-       20000000,
-};
-
-static u32 __init armada_370_get_tclk_freq(void __iomem *sar)
-{
-       u8 tclk_freq_select = 0;
-
-       tclk_freq_select = ((readl(sar) >> SARL_A370_TCLK_FREQ_OPT) &
-                           SARL_A370_TCLK_FREQ_OPT_MASK);
-       return armada_370_tclk_frequencies[tclk_freq_select];
-}
-
-static const u32 __initconst armada_370_cpu_frequencies[] = {
-       400000000,
-       533000000,
-       667000000,
-       800000000,
-       1000000000,
-       1067000000,
-       1200000000,
-};
-
-static u32 __init armada_370_get_cpu_freq(void __iomem *sar)
-{
-       u32 cpu_freq;
-       u8 cpu_freq_select = 0;
-
-       cpu_freq_select = ((readl(sar) >> SARL_A370_PCLK_FREQ_OPT) &
-                          SARL_A370_PCLK_FREQ_OPT_MASK);
-       if (cpu_freq_select >= ARRAY_SIZE(armada_370_cpu_frequencies)) {
-               pr_err("CPU freq select unsupported %d\n", cpu_freq_select);
-               cpu_freq = 0;
-       } else
-               cpu_freq = armada_370_cpu_frequencies[cpu_freq_select];
-
-       return cpu_freq;
-}
-
-enum { A370_XP_NBCLK, A370_XP_HCLK, A370_XP_DRAMCLK };
-
-static const struct core_ratio __initconst armada_370_xp_core_ratios[] = {
-       { .id = A370_XP_NBCLK,   .name = "nbclk" },
-       { .id = A370_XP_HCLK,    .name = "hclk" },
-       { .id = A370_XP_DRAMCLK, .name = "dramclk" },
-};
-
-static const int __initconst armada_370_xp_nbclk_ratios[32][2] = {
-       {0, 1}, {1, 2}, {2, 2}, {2, 2},
-       {1, 2}, {1, 2}, {1, 1}, {2, 3},
-       {0, 1}, {1, 2}, {2, 4}, {0, 1},
-       {1, 2}, {0, 1}, {0, 1}, {2, 2},
-       {0, 1}, {0, 1}, {0, 1}, {1, 1},
-       {2, 3}, {0, 1}, {0, 1}, {0, 1},
-       {0, 1}, {0, 1}, {0, 1}, {1, 1},
-       {0, 1}, {0, 1}, {0, 1}, {0, 1},
-};
-
-static const int __initconst armada_370_xp_hclk_ratios[32][2] = {
-       {0, 1}, {1, 2}, {2, 6}, {2, 3},
-       {1, 3}, {1, 4}, {1, 2}, {2, 6},
-       {0, 1}, {1, 6}, {2, 10}, {0, 1},
-       {1, 4}, {0, 1}, {0, 1}, {2, 5},
-       {0, 1}, {0, 1}, {0, 1}, {1, 2},
-       {2, 6}, {0, 1}, {0, 1}, {0, 1},
-       {0, 1}, {0, 1}, {0, 1}, {1, 1},
-       {0, 1}, {0, 1}, {0, 1}, {0, 1},
-};
-
-static const int __initconst armada_370_xp_dramclk_ratios[32][2] = {
-       {0, 1}, {1, 2}, {2, 3}, {2, 3},
-       {1, 3}, {1, 2}, {1, 2}, {2, 6},
-       {0, 1}, {1, 3}, {2, 5}, {0, 1},
-       {1, 4}, {0, 1}, {0, 1}, {2, 5},
-       {0, 1}, {0, 1}, {0, 1}, {1, 1},
-       {2, 3}, {0, 1}, {0, 1}, {0, 1},
-       {0, 1}, {0, 1}, {0, 1}, {1, 1},
-       {0, 1}, {0, 1}, {0, 1}, {0, 1},
-};
-
-static void __init armada_370_xp_get_clk_ratio(u32 opt,
-       void __iomem *sar, int id, int *mult, int *div)
-{
-       switch (id) {
-       case A370_XP_NBCLK:
-               *mult = armada_370_xp_nbclk_ratios[opt][0];
-               *div = armada_370_xp_nbclk_ratios[opt][1];
-               break;
-       case A370_XP_HCLK:
-               *mult = armada_370_xp_hclk_ratios[opt][0];
-               *div = armada_370_xp_hclk_ratios[opt][1];
-               break;
-       case A370_XP_DRAMCLK:
-               *mult = armada_370_xp_dramclk_ratios[opt][0];
-               *div = armada_370_xp_dramclk_ratios[opt][1];
-               break;
-       }
-}
-
-static void __init armada_370_get_clk_ratio(
-       void __iomem *sar, int id, int *mult, int *div)
-{
-       u32 opt = ((readl(sar) >> SARL_A370_FAB_FREQ_OPT) &
-               SARL_A370_FAB_FREQ_OPT_MASK);
-
-       armada_370_xp_get_clk_ratio(opt, sar, id, mult, div);
-}
-
-
-static const struct core_clocks armada_370_core_clocks = {
-       .get_tclk_freq = armada_370_get_tclk_freq,
-       .get_cpu_freq = armada_370_get_cpu_freq,
-       .get_clk_ratio = armada_370_get_clk_ratio,
-       .ratios = armada_370_xp_core_ratios,
-       .num_ratios = ARRAY_SIZE(armada_370_xp_core_ratios),
-};
-
-static const u32 __initconst armada_xp_cpu_frequencies[] = {
-       1000000000,
-       1066000000,
-       1200000000,
-       1333000000,
-       1500000000,
-       1666000000,
-       1800000000,
-       2000000000,
-       667000000,
-       0,
-       800000000,
-       1600000000,
-};
-
-/* For Armada XP TCLK frequency is fix: 250MHz */
-static u32 __init armada_xp_get_tclk_freq(void __iomem *sar)
-{
-       return 250 * 1000 * 1000;
-}
-
-static u32 __init armada_xp_get_cpu_freq(void __iomem *sar)
-{
-       u32 cpu_freq;
-       u8 cpu_freq_select = 0;
-
-       cpu_freq_select = ((readl(sar) >> SARL_AXP_PCLK_FREQ_OPT) &
-                          SARL_AXP_PCLK_FREQ_OPT_MASK);
-       /*
-        * The upper bit is not contiguous to the other ones and
-        * located in the high part of the SAR registers
-        */
-       cpu_freq_select |= (((readl(sar+4) >> SARH_AXP_PCLK_FREQ_OPT) &
-                            SARH_AXP_PCLK_FREQ_OPT_MASK)
-                           << SARH_AXP_PCLK_FREQ_OPT_SHIFT);
-       if (cpu_freq_select >= ARRAY_SIZE(armada_xp_cpu_frequencies)) {
-               pr_err("CPU freq select unsupported: %d\n", cpu_freq_select);
-               cpu_freq = 0;
-       } else
-               cpu_freq = armada_xp_cpu_frequencies[cpu_freq_select];
-
-       return cpu_freq;
-}
-
-static void __init armada_xp_get_clk_ratio(
-       void __iomem *sar, int id, int *mult, int *div)
-{
-
-       u32 opt = ((readl(sar) >> SARL_AXP_FAB_FREQ_OPT) &
-             SARL_AXP_FAB_FREQ_OPT_MASK);
-       /*
-        * The upper bit is not contiguous to the other ones and
-        * located in the high part of the SAR registers
-        */
-       opt |= (((readl(sar+4) >> SARH_AXP_FAB_FREQ_OPT) &
-               SARH_AXP_FAB_FREQ_OPT_MASK)
-              << SARH_AXP_FAB_FREQ_OPT_SHIFT);
-
-       armada_370_xp_get_clk_ratio(opt, sar, id, mult, div);
-}
-
-static const struct core_clocks armada_xp_core_clocks = {
-       .get_tclk_freq = armada_xp_get_tclk_freq,
-       .get_cpu_freq = armada_xp_get_cpu_freq,
-       .get_clk_ratio = armada_xp_get_clk_ratio,
-       .ratios = armada_370_xp_core_ratios,
-       .num_ratios = ARRAY_SIZE(armada_370_xp_core_ratios),
-};
-
-#endif /* CONFIG_MACH_ARMADA_370_XP */
-
-/*
- * Dove PLL sample-at-reset configuration
- *
- * SAR0[8:5]   : CPU frequency
- *              5  = 1000 MHz
- *              6  =  933 MHz
- *              7  =  933 MHz
- *              8  =  800 MHz
- *              9  =  800 MHz
- *              10 =  800 MHz
- *              11 = 1067 MHz
- *              12 =  667 MHz
- *              13 =  533 MHz
- *              14 =  400 MHz
- *              15 =  333 MHz
- *              others reserved.
- *
- * SAR0[11:9]  : CPU to L2 Clock divider ratio
- *              0 = (1/1) * CPU
- *              2 = (1/2) * CPU
- *              4 = (1/3) * CPU
- *              6 = (1/4) * CPU
- *              others reserved.
- *
- * SAR0[15:12] : CPU to DDR DRAM Clock divider ratio
- *              0  = (1/1) * CPU
- *              2  = (1/2) * CPU
- *              3  = (2/5) * CPU
- *              4  = (1/3) * CPU
- *              6  = (1/4) * CPU
- *              8  = (1/5) * CPU
- *              10 = (1/6) * CPU
- *              12 = (1/7) * CPU
- *              14 = (1/8) * CPU
- *              15 = (1/10) * CPU
- *              others reserved.
- *
- * SAR0[24:23] : TCLK frequency
- *              0 = 166 MHz
- *              1 = 125 MHz
- *              others reserved.
- */
-#ifdef CONFIG_ARCH_DOVE
-#define SAR_DOVE_CPU_FREQ              5
-#define SAR_DOVE_CPU_FREQ_MASK         0xf
-#define SAR_DOVE_L2_RATIO              9
-#define SAR_DOVE_L2_RATIO_MASK         0x7
-#define SAR_DOVE_DDR_RATIO             12
-#define SAR_DOVE_DDR_RATIO_MASK                0xf
-#define SAR_DOVE_TCLK_FREQ             23
-#define SAR_DOVE_TCLK_FREQ_MASK                0x3
-
-static const u32 __initconst dove_tclk_frequencies[] = {
-       166666667,
-       125000000,
-       0, 0
-};
-
-static u32 __init dove_get_tclk_freq(void __iomem *sar)
-{
-       u32 opt = (readl(sar) >> SAR_DOVE_TCLK_FREQ) &
-               SAR_DOVE_TCLK_FREQ_MASK;
-       return dove_tclk_frequencies[opt];
-}
-
-static const u32 __initconst dove_cpu_frequencies[] = {
-       0, 0, 0, 0, 0,
-       1000000000,
-       933333333, 933333333,
-       800000000, 800000000, 800000000,
-       1066666667,
-       666666667,
-       533333333,
-       400000000,
-       333333333
-};
-
-static u32 __init dove_get_cpu_freq(void __iomem *sar)
-{
-       u32 opt = (readl(sar) >> SAR_DOVE_CPU_FREQ) &
-               SAR_DOVE_CPU_FREQ_MASK;
-       return dove_cpu_frequencies[opt];
-}
-
-enum { DOVE_CPU_TO_L2, DOVE_CPU_TO_DDR };
-
-static const struct core_ratio __initconst dove_core_ratios[] = {
-       { .id = DOVE_CPU_TO_L2, .name = "l2clk", },
-       { .id = DOVE_CPU_TO_DDR, .name = "ddrclk", }
-};
-
-static const int __initconst dove_cpu_l2_ratios[8][2] = {
-       { 1, 1 }, { 0, 1 }, { 1, 2 }, { 0, 1 },
-       { 1, 3 }, { 0, 1 }, { 1, 4 }, { 0, 1 }
-};
-
-static const int __initconst dove_cpu_ddr_ratios[16][2] = {
-       { 1, 1 }, { 0, 1 }, { 1, 2 }, { 2, 5 },
-       { 1, 3 }, { 0, 1 }, { 1, 4 }, { 0, 1 },
-       { 1, 5 }, { 0, 1 }, { 1, 6 }, { 0, 1 },
-       { 1, 7 }, { 0, 1 }, { 1, 8 }, { 1, 10 }
-};
-
-static void __init dove_get_clk_ratio(
-       void __iomem *sar, int id, int *mult, int *div)
-{
-       switch (id) {
-       case DOVE_CPU_TO_L2:
-       {
-               u32 opt = (readl(sar) >> SAR_DOVE_L2_RATIO) &
-                       SAR_DOVE_L2_RATIO_MASK;
-               *mult = dove_cpu_l2_ratios[opt][0];
-               *div = dove_cpu_l2_ratios[opt][1];
-               break;
-       }
-       case DOVE_CPU_TO_DDR:
-       {
-               u32 opt = (readl(sar) >> SAR_DOVE_DDR_RATIO) &
-                       SAR_DOVE_DDR_RATIO_MASK;
-               *mult = dove_cpu_ddr_ratios[opt][0];
-               *div = dove_cpu_ddr_ratios[opt][1];
-               break;
-       }
-       }
-}
-
-static const struct core_clocks dove_core_clocks = {
-       .get_tclk_freq = dove_get_tclk_freq,
-       .get_cpu_freq = dove_get_cpu_freq,
-       .get_clk_ratio = dove_get_clk_ratio,
-       .ratios = dove_core_ratios,
-       .num_ratios = ARRAY_SIZE(dove_core_ratios),
-};
-#endif /* CONFIG_ARCH_DOVE */
-
-/*
- * Kirkwood PLL sample-at-reset configuration
- * (6180 has different SAR layout than other Kirkwood SoCs)
- *
- * SAR0[4:3,22,1] : CPU frequency (6281,6292,6282)
- *     4  =  600 MHz
- *     6  =  800 MHz
- *     7  = 1000 MHz
- *     9  = 1200 MHz
- *     12 = 1500 MHz
- *     13 = 1600 MHz
- *     14 = 1800 MHz
- *     15 = 2000 MHz
- *     others reserved.
- *
- * SAR0[19,10:9] : CPU to L2 Clock divider ratio (6281,6292,6282)
- *     1 = (1/2) * CPU
- *     3 = (1/3) * CPU
- *     5 = (1/4) * CPU
- *     others reserved.
- *
- * SAR0[8:5] : CPU to DDR DRAM Clock divider ratio (6281,6292,6282)
- *     2 = (1/2) * CPU
- *     4 = (1/3) * CPU
- *     6 = (1/4) * CPU
- *     7 = (2/9) * CPU
- *     8 = (1/5) * CPU
- *     9 = (1/6) * CPU
- *     others reserved.
- *
- * SAR0[4:2] : Kirkwood 6180 cpu/l2/ddr clock configuration (6180 only)
- *     5 = [CPU =  600 MHz, L2 = (1/2) * CPU, DDR = 200 MHz = (1/3) * CPU]
- *     6 = [CPU =  800 MHz, L2 = (1/2) * CPU, DDR = 200 MHz = (1/4) * CPU]
- *     7 = [CPU = 1000 MHz, L2 = (1/2) * CPU, DDR = 200 MHz = (1/5) * CPU]
- *     others reserved.
- *
- * SAR0[21] : TCLK frequency
- *     0 = 200 MHz
- *     1 = 166 MHz
- *     others reserved.
- */
-#ifdef CONFIG_ARCH_KIRKWOOD
-#define SAR_KIRKWOOD_CPU_FREQ(x)       \
-       (((x & (1 <<  1)) >>  1) |      \
-        ((x & (1 << 22)) >> 21) |      \
-        ((x & (3 <<  3)) >>  1))
-#define SAR_KIRKWOOD_L2_RATIO(x)       \
-       (((x & (3 <<  9)) >> 9) |       \
-        (((x & (1 << 19)) >> 17)))
-#define SAR_KIRKWOOD_DDR_RATIO         5
-#define SAR_KIRKWOOD_DDR_RATIO_MASK    0xf
-#define SAR_MV88F6180_CLK              2
-#define SAR_MV88F6180_CLK_MASK         0x7
-#define SAR_KIRKWOOD_TCLK_FREQ         21
-#define SAR_KIRKWOOD_TCLK_FREQ_MASK    0x1
-
-enum { KIRKWOOD_CPU_TO_L2, KIRKWOOD_CPU_TO_DDR };
-
-static const struct core_ratio __initconst kirkwood_core_ratios[] = {
-       { .id = KIRKWOOD_CPU_TO_L2, .name = "l2clk", },
-       { .id = KIRKWOOD_CPU_TO_DDR, .name = "ddrclk", }
-};
-
-static u32 __init kirkwood_get_tclk_freq(void __iomem *sar)
-{
-       u32 opt = (readl(sar) >> SAR_KIRKWOOD_TCLK_FREQ) &
-               SAR_KIRKWOOD_TCLK_FREQ_MASK;
-       return (opt) ? 166666667 : 200000000;
-}
-
-static const u32 __initconst kirkwood_cpu_frequencies[] = {
-       0, 0, 0, 0,
-       600000000,
-       0,
-       800000000,
-       1000000000,
-       0,
-       1200000000,
-       0, 0,
-       1500000000,
-       1600000000,
-       1800000000,
-       2000000000
-};
-
-static u32 __init kirkwood_get_cpu_freq(void __iomem *sar)
-{
-       u32 opt = SAR_KIRKWOOD_CPU_FREQ(readl(sar));
-       return kirkwood_cpu_frequencies[opt];
-}
-
-static const int __initconst kirkwood_cpu_l2_ratios[8][2] = {
-       { 0, 1 }, { 1, 2 }, { 0, 1 }, { 1, 3 },
-       { 0, 1 }, { 1, 4 }, { 0, 1 }, { 0, 1 }
-};
-
-static const int __initconst kirkwood_cpu_ddr_ratios[16][2] = {
-       { 0, 1 }, { 0, 1 }, { 1, 2 }, { 0, 1 },
-       { 1, 3 }, { 0, 1 }, { 1, 4 }, { 2, 9 },
-       { 1, 5 }, { 1, 6 }, { 0, 1 }, { 0, 1 },
-       { 0, 1 }, { 0, 1 }, { 0, 1 }, { 0, 1 }
-};
-
-static void __init kirkwood_get_clk_ratio(
-       void __iomem *sar, int id, int *mult, int *div)
-{
-       switch (id) {
-       case KIRKWOOD_CPU_TO_L2:
-       {
-               u32 opt = SAR_KIRKWOOD_L2_RATIO(readl(sar));
-               *mult = kirkwood_cpu_l2_ratios[opt][0];
-               *div = kirkwood_cpu_l2_ratios[opt][1];
-               break;
-       }
-       case KIRKWOOD_CPU_TO_DDR:
-       {
-               u32 opt = (readl(sar) >> SAR_KIRKWOOD_DDR_RATIO) &
-                       SAR_KIRKWOOD_DDR_RATIO_MASK;
-               *mult = kirkwood_cpu_ddr_ratios[opt][0];
-               *div = kirkwood_cpu_ddr_ratios[opt][1];
-               break;
-       }
-       }
-}
-
-static const struct core_clocks kirkwood_core_clocks = {
-       .get_tclk_freq = kirkwood_get_tclk_freq,
-       .get_cpu_freq = kirkwood_get_cpu_freq,
-       .get_clk_ratio = kirkwood_get_clk_ratio,
-       .ratios = kirkwood_core_ratios,
-       .num_ratios = ARRAY_SIZE(kirkwood_core_ratios),
-};
-
-static const u32 __initconst mv88f6180_cpu_frequencies[] = {
-       0, 0, 0, 0, 0,
-       600000000,
-       800000000,
-       1000000000
-};
-
-static u32 __init mv88f6180_get_cpu_freq(void __iomem *sar)
-{
-       u32 opt = (readl(sar) >> SAR_MV88F6180_CLK) & SAR_MV88F6180_CLK_MASK;
-       return mv88f6180_cpu_frequencies[opt];
-}
-
-static const int __initconst mv88f6180_cpu_ddr_ratios[8][2] = {
-       { 0, 1 }, { 0, 1 }, { 0, 1 }, { 0, 1 },
-       { 0, 1 }, { 1, 3 }, { 1, 4 }, { 1, 5 }
-};
-
-static void __init mv88f6180_get_clk_ratio(
-       void __iomem *sar, int id, int *mult, int *div)
-{
-       switch (id) {
-       case KIRKWOOD_CPU_TO_L2:
-       {
-               /* mv88f6180 has a fixed 1:2 CPU-to-L2 ratio */
-               *mult = 1;
-               *div = 2;
-               break;
-       }
-       case KIRKWOOD_CPU_TO_DDR:
-       {
-               u32 opt = (readl(sar) >> SAR_MV88F6180_CLK) &
-                       SAR_MV88F6180_CLK_MASK;
-               *mult = mv88f6180_cpu_ddr_ratios[opt][0];
-               *div = mv88f6180_cpu_ddr_ratios[opt][1];
-               break;
-       }
-       }
-}
-
-static const struct core_clocks mv88f6180_core_clocks = {
-       .get_tclk_freq = kirkwood_get_tclk_freq,
-       .get_cpu_freq = mv88f6180_get_cpu_freq,
-       .get_clk_ratio = mv88f6180_get_clk_ratio,
-       .ratios = kirkwood_core_ratios,
-       .num_ratios = ARRAY_SIZE(kirkwood_core_ratios),
-};
-#endif /* CONFIG_ARCH_KIRKWOOD */
-
-static const __initdata struct of_device_id clk_core_match[] = {
-#ifdef CONFIG_MACH_ARMADA_370_XP
-       {
-               .compatible = "marvell,armada-370-core-clock",
-               .data = &armada_370_core_clocks,
-       },
-       {
-               .compatible = "marvell,armada-xp-core-clock",
-               .data = &armada_xp_core_clocks,
-       },
-#endif
-#ifdef CONFIG_ARCH_DOVE
-       {
-               .compatible = "marvell,dove-core-clock",
-               .data = &dove_core_clocks,
-       },
-#endif
-
-#ifdef CONFIG_ARCH_KIRKWOOD
-       {
-               .compatible = "marvell,kirkwood-core-clock",
-               .data = &kirkwood_core_clocks,
-       },
-       {
-               .compatible = "marvell,mv88f6180-core-clock",
-               .data = &mv88f6180_core_clocks,
-       },
-#endif
-
-       { }
-};
-
-void __init mvebu_core_clk_init(void)
-{
-       struct device_node *np;
-
-       for_each_matching_node(np, clk_core_match) {
-               const struct of_device_id *match =
-                       of_match_node(clk_core_match, np);
-               mvebu_clk_core_setup(np, (struct core_clocks *)match->data);
-       }
-}
diff --git a/drivers/clk/mvebu/clk-core.h b/drivers/clk/mvebu/clk-core.h
deleted file mode 100644 (file)
index 28b5e02..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
- *  * Marvell EBU clock core handling defined at reset
- *
- * Copyright (C) 2012 Marvell
- *
- * Gregory CLEMENT <gregory.clement@free-electrons.com>
- *
- * This file is licensed under the terms of the GNU General Public
- * License version 2.  This program is licensed "as is" without any
- * warranty of any kind, whether express or implied.
- */
-
-#ifndef __MVEBU_CLK_CORE_H
-#define __MVEBU_CLK_CORE_H
-
-void __init mvebu_core_clk_init(void);
-
-#endif
diff --git a/drivers/clk/mvebu/clk-gating-ctrl.c b/drivers/clk/mvebu/clk-gating-ctrl.c
deleted file mode 100644 (file)
index ebf141d..0000000
+++ /dev/null
@@ -1,250 +0,0 @@
-/*
- * Marvell MVEBU clock gating control.
- *
- * Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
- * Andrew Lunn <andrew@lunn.ch>
- *
- * This file is licensed under the terms of the GNU General Public
- * License version 2. This program is licensed "as is" without any
- * warranty of any kind, whether express or implied.
- */
-#include <linux/kernel.h>
-#include <linux/bitops.h>
-#include <linux/io.h>
-#include <linux/clk.h>
-#include <linux/clkdev.h>
-#include <linux/clk-provider.h>
-#include <linux/clk/mvebu.h>
-#include <linux/of.h>
-#include <linux/of_address.h>
-
-struct mvebu_gating_ctrl {
-       spinlock_t lock;
-       struct clk **gates;
-       int num_gates;
-};
-
-struct mvebu_soc_descr {
-       const char *name;
-       const char *parent;
-       int bit_idx;
-};
-
-#define to_clk_gate(_hw) container_of(_hw, struct clk_gate, hw)
-
-static struct clk *mvebu_clk_gating_get_src(
-       struct of_phandle_args *clkspec, void *data)
-{
-       struct mvebu_gating_ctrl *ctrl = (struct mvebu_gating_ctrl *)data;
-       int n;
-
-       if (clkspec->args_count < 1)
-               return ERR_PTR(-EINVAL);
-
-       for (n = 0; n < ctrl->num_gates; n++) {
-               struct clk_gate *gate =
-                       to_clk_gate(__clk_get_hw(ctrl->gates[n]));
-               if (clkspec->args[0] == gate->bit_idx)
-                       return ctrl->gates[n];
-       }
-       return ERR_PTR(-ENODEV);
-}
-
-static void __init mvebu_clk_gating_setup(
-       struct device_node *np, const struct mvebu_soc_descr *descr)
-{
-       struct mvebu_gating_ctrl *ctrl;
-       struct clk *clk;
-       void __iomem *base;
-       const char *default_parent = NULL;
-       int n;
-
-       base = of_iomap(np, 0);
-
-       clk = of_clk_get(np, 0);
-       if (!IS_ERR(clk)) {
-               default_parent = __clk_get_name(clk);
-               clk_put(clk);
-       }
-
-       ctrl = kzalloc(sizeof(struct mvebu_gating_ctrl), GFP_KERNEL);
-       if (WARN_ON(!ctrl))
-               return;
-
-       spin_lock_init(&ctrl->lock);
-
-       /*
-        * Count, allocate, and register clock gates
-        */
-       for (n = 0; descr[n].name;)
-               n++;
-
-       ctrl->num_gates = n;
-       ctrl->gates = kzalloc(ctrl->num_gates * sizeof(struct clk *),
-                             GFP_KERNEL);
-       if (WARN_ON(!ctrl->gates)) {
-               kfree(ctrl);
-               return;
-       }
-
-       for (n = 0; n < ctrl->num_gates; n++) {
-               u8 flags = 0;
-               const char *parent =
-                       (descr[n].parent) ? descr[n].parent : default_parent;
-
-               /*
-                * On Armada 370, the DDR clock is a special case: it
-                * isn't taken by any driver, but should anyway be
-                * kept enabled, so we mark it as IGNORE_UNUSED for
-                * now.
-                */
-               if (!strcmp(descr[n].name, "ddr"))
-                       flags |= CLK_IGNORE_UNUSED;
-
-               ctrl->gates[n] = clk_register_gate(NULL, descr[n].name, parent,
-                                  flags, base, descr[n].bit_idx, 0, &ctrl->lock);
-               WARN_ON(IS_ERR(ctrl->gates[n]));
-       }
-       of_clk_add_provider(np, mvebu_clk_gating_get_src, ctrl);
-}
-
-/*
- * SoC specific clock gating control
- */
-
-#ifdef CONFIG_MACH_ARMADA_370
-static const struct mvebu_soc_descr __initconst armada_370_gating_descr[] = {
-       { "audio", NULL, 0 },
-       { "pex0_en", NULL, 1 },
-       { "pex1_en", NULL,  2 },
-       { "ge1", NULL, 3 },
-       { "ge0", NULL, 4 },
-       { "pex0", NULL, 5 },
-       { "pex1", NULL, 9 },
-       { "sata0", NULL, 15 },
-       { "sdio", NULL, 17 },
-       { "tdm", NULL, 25 },
-       { "ddr", NULL, 28 },
-       { "sata1", NULL, 30 },
-       { }
-};
-#endif
-
-#ifdef CONFIG_MACH_ARMADA_XP
-static const struct mvebu_soc_descr __initconst armada_xp_gating_descr[] = {
-       { "audio", NULL, 0 },
-       { "ge3", NULL, 1 },
-       { "ge2", NULL,  2 },
-       { "ge1", NULL, 3 },
-       { "ge0", NULL, 4 },
-       { "pex0", NULL, 5 },
-       { "pex1", NULL, 6 },
-       { "pex2", NULL, 7 },
-       { "pex3", NULL, 8 },
-       { "bp", NULL, 13 },
-       { "sata0lnk", NULL, 14 },
-       { "sata0", "sata0lnk", 15 },
-       { "lcd", NULL, 16 },
-       { "sdio", NULL, 17 },
-       { "usb0", NULL, 18 },
-       { "usb1", NULL, 19 },
-       { "usb2", NULL, 20 },
-       { "xor0", NULL, 22 },
-       { "crypto", NULL, 23 },
-       { "tdm", NULL, 25 },
-       { "xor1", NULL, 28 },
-       { "sata1lnk", NULL, 29 },
-       { "sata1", "sata1lnk", 30 },
-       { }
-};
-#endif
-
-#ifdef CONFIG_ARCH_DOVE
-static const struct mvebu_soc_descr __initconst dove_gating_descr[] = {
-       { "usb0", NULL, 0 },
-       { "usb1", NULL, 1 },
-       { "ge", "gephy", 2 },
-       { "sata", NULL, 3 },
-       { "pex0", NULL, 4 },
-       { "pex1", NULL, 5 },
-       { "sdio0", NULL, 8 },
-       { "sdio1", NULL, 9 },
-       { "nand", NULL, 10 },
-       { "camera", NULL, 11 },
-       { "i2s0", NULL, 12 },
-       { "i2s1", NULL, 13 },
-       { "crypto", NULL, 15 },
-       { "ac97", NULL, 21 },
-       { "pdma", NULL, 22 },
-       { "xor0", NULL, 23 },
-       { "xor1", NULL, 24 },
-       { "gephy", NULL, 30 },
-       { }
-};
-#endif
-
-#ifdef CONFIG_ARCH_KIRKWOOD
-static const struct mvebu_soc_descr __initconst kirkwood_gating_descr[] = {
-       { "ge0", NULL, 0 },
-       { "pex0", NULL, 2 },
-       { "usb0", NULL, 3 },
-       { "sdio", NULL, 4 },
-       { "tsu", NULL, 5 },
-       { "runit", NULL, 7 },
-       { "xor0", NULL, 8 },
-       { "audio", NULL, 9 },
-       { "powersave", "cpuclk", 11 },
-       { "sata0", NULL, 14 },
-       { "sata1", NULL, 15 },
-       { "xor1", NULL, 16 },
-       { "crypto", NULL, 17 },
-       { "pex1", NULL, 18 },
-       { "ge1", NULL, 19 },
-       { "tdm", NULL, 20 },
-       { }
-};
-#endif
-
-static const __initdata struct of_device_id clk_gating_match[] = {
-#ifdef CONFIG_MACH_ARMADA_370
-       {
-               .compatible = "marvell,armada-370-gating-clock",
-               .data = armada_370_gating_descr,
-       },
-#endif
-
-#ifdef CONFIG_MACH_ARMADA_XP
-       {
-               .compatible = "marvell,armada-xp-gating-clock",
-               .data = armada_xp_gating_descr,
-       },
-#endif
-
-#ifdef CONFIG_ARCH_DOVE
-       {
-               .compatible = "marvell,dove-gating-clock",
-               .data = dove_gating_descr,
-       },
-#endif
-
-#ifdef CONFIG_ARCH_KIRKWOOD
-       {
-               .compatible = "marvell,kirkwood-gating-clock",
-               .data = kirkwood_gating_descr,
-       },
-#endif
-
-       { }
-};
-
-void __init mvebu_gating_clk_init(void)
-{
-       struct device_node *np;
-
-       for_each_matching_node(np, clk_gating_match) {
-               const struct of_device_id *match =
-                       of_match_node(clk_gating_match, np);
-               mvebu_clk_gating_setup(np,
-                      (const struct mvebu_soc_descr *)match->data);
-       }
-}
diff --git a/drivers/clk/mvebu/clk-gating-ctrl.h b/drivers/clk/mvebu/clk-gating-ctrl.h
deleted file mode 100644 (file)
index 9275d1e..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Marvell EBU gating clock handling
- *
- * Copyright (C) 2012 Marvell
- *
- * Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
- *
- * This file is licensed under the terms of the GNU General Public
- * License version 2.  This program is licensed "as is" without any
- * warranty of any kind, whether express or implied.
- */
-
-#ifndef __MVEBU_CLK_GATING_H
-#define __MVEBU_CLK_GATING_H
-
-#ifdef CONFIG_MVEBU_CLK_GATING
-void __init mvebu_gating_clk_init(void);
-#else
-void mvebu_gating_clk_init(void) {}
-#endif
-
-#endif
diff --git a/drivers/clk/mvebu/clk.c b/drivers/clk/mvebu/clk.c
deleted file mode 100644 (file)
index 29f10fb..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Marvell EBU SoC clock handling.
- *
- * Copyright (C) 2012 Marvell
- *
- * Gregory CLEMENT <gregory.clement@free-electrons.com>
- *
- * This file is licensed under the terms of the GNU General Public
- * License version 2.  This program is licensed "as is" without any
- * warranty of any kind, whether express or implied.
- */
-#include <linux/kernel.h>
-#include <linux/clk-provider.h>
-#include <linux/of.h>
-#include "clk-core.h"
-#include "clk-gating-ctrl.h"
-
-void __init mvebu_clocks_init(void)
-{
-       mvebu_core_clk_init();
-       mvebu_gating_clk_init();
-       of_clk_init(NULL);
-}
diff --git a/drivers/clk/mvebu/common.c b/drivers/clk/mvebu/common.c
new file mode 100644 (file)
index 0000000..adaa4a1
--- /dev/null
@@ -0,0 +1,163 @@
+/*
+ * Marvell EBU SoC common clock handling
+ *
+ * Copyright (C) 2012 Marvell
+ *
+ * Gregory CLEMENT <gregory.clement@free-electrons.com>
+ * Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
+ * Andrew Lunn <andrew@lunn.ch>
+ *
+ * This file is licensed under the terms of the GNU General Public
+ * License version 2.  This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+ */
+
+#include <linux/kernel.h>
+#include <linux/clk.h>
+#include <linux/clkdev.h>
+#include <linux/clk-provider.h>
+#include <linux/io.h>
+#include <linux/of.h>
+#include <linux/of_address.h>
+
+#include "common.h"
+
+/*
+ * Core Clocks
+ */
+
+static struct clk_onecell_data clk_data;
+
+void __init mvebu_coreclk_setup(struct device_node *np,
+                               const struct coreclk_soc_desc *desc)
+{
+       const char *tclk_name = "tclk";
+       const char *cpuclk_name = "cpuclk";
+       void __iomem *base;
+       unsigned long rate;
+       int n;
+
+       base = of_iomap(np, 0);
+       if (WARN_ON(!base))
+               return;
+
+       /* Allocate struct for TCLK, cpu clk, and core ratio clocks */
+       clk_data.clk_num = 2 + desc->num_ratios;
+       clk_data.clks = kzalloc(clk_data.clk_num * sizeof(struct clk *),
+                               GFP_KERNEL);
+       if (WARN_ON(!clk_data.clks))
+               return;
+
+       /* Register TCLK */
+       of_property_read_string_index(np, "clock-output-names", 0,
+                                     &tclk_name);
+       rate = desc->get_tclk_freq(base);
+       clk_data.clks[0] = clk_register_fixed_rate(NULL, tclk_name, NULL,
+                                                  CLK_IS_ROOT, rate);
+       WARN_ON(IS_ERR(clk_data.clks[0]));
+
+       /* Register CPU clock */
+       of_property_read_string_index(np, "clock-output-names", 1,
+                                     &cpuclk_name);
+       rate = desc->get_cpu_freq(base);
+       clk_data.clks[1] = clk_register_fixed_rate(NULL, cpuclk_name, NULL,
+                                                  CLK_IS_ROOT, rate);
+       WARN_ON(IS_ERR(clk_data.clks[1]));
+
+       /* Register fixed-factor clocks derived from CPU clock */
+       for (n = 0; n < desc->num_ratios; n++) {
+               const char *rclk_name = desc->ratios[n].name;
+               int mult, div;
+
+               of_property_read_string_index(np, "clock-output-names",
+                                             2+n, &rclk_name);
+               desc->get_clk_ratio(base, desc->ratios[n].id, &mult, &div);
+               clk_data.clks[2+n] = clk_register_fixed_factor(NULL, rclk_name,
+                                      cpuclk_name, 0, mult, div);
+               WARN_ON(IS_ERR(clk_data.clks[2+n]));
+       };
+
+       /* SAR register isn't needed anymore */
+       iounmap(base);
+
+       of_clk_add_provider(np, of_clk_src_onecell_get, &clk_data);
+}
+
+/*
+ * Clock Gating Control
+ */
+
+struct clk_gating_ctrl {
+       spinlock_t lock;
+       struct clk **gates;
+       int num_gates;
+};
+
+#define to_clk_gate(_hw) container_of(_hw, struct clk_gate, hw)
+
+static struct clk *clk_gating_get_src(
+       struct of_phandle_args *clkspec, void *data)
+{
+       struct clk_gating_ctrl *ctrl = (struct clk_gating_ctrl *)data;
+       int n;
+
+       if (clkspec->args_count < 1)
+               return ERR_PTR(-EINVAL);
+
+       for (n = 0; n < ctrl->num_gates; n++) {
+               struct clk_gate *gate =
+                       to_clk_gate(__clk_get_hw(ctrl->gates[n]));
+               if (clkspec->args[0] == gate->bit_idx)
+                       return ctrl->gates[n];
+       }
+       return ERR_PTR(-ENODEV);
+}
+
+void __init mvebu_clk_gating_setup(struct device_node *np,
+                                  const struct clk_gating_soc_desc *desc)
+{
+       struct clk_gating_ctrl *ctrl;
+       struct clk *clk;
+       void __iomem *base;
+       const char *default_parent = NULL;
+       int n;
+
+       base = of_iomap(np, 0);
+       if (WARN_ON(!base))
+               return;
+
+       clk = of_clk_get(np, 0);
+       if (!IS_ERR(clk)) {
+               default_parent = __clk_get_name(clk);
+               clk_put(clk);
+       }
+
+       ctrl = kzalloc(sizeof(*ctrl), GFP_KERNEL);
+       if (WARN_ON(!ctrl))
+               return;
+
+       spin_lock_init(&ctrl->lock);
+
+       /* Count, allocate, and register clock gates */
+       for (n = 0; desc[n].name;)
+               n++;
+
+       ctrl->num_gates = n;
+       ctrl->gates = kzalloc(ctrl->num_gates * sizeof(struct clk *),
+                             GFP_KERNEL);
+       if (WARN_ON(!ctrl->gates)) {
+               kfree(ctrl);
+               return;
+       }
+
+       for (n = 0; n < ctrl->num_gates; n++) {
+               const char *parent =
+                       (desc[n].parent) ? desc[n].parent : default_parent;
+               ctrl->gates[n] = clk_register_gate(NULL, desc[n].name, parent,
+                                       desc[n].flags, base, desc[n].bit_idx,
+                                       0, &ctrl->lock);
+               WARN_ON(IS_ERR(ctrl->gates[n]));
+       }
+
+       of_clk_add_provider(np, clk_gating_get_src, ctrl);
+}
diff --git a/drivers/clk/mvebu/common.h b/drivers/clk/mvebu/common.h
new file mode 100644 (file)
index 0000000..f968b4d
--- /dev/null
@@ -0,0 +1,48 @@
+/*
+ * Marvell EBU SoC common clock handling
+ *
+ * Copyright (C) 2012 Marvell
+ *
+ * Gregory CLEMENT <gregory.clement@free-electrons.com>
+ * Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
+ * Andrew Lunn <andrew@lunn.ch>
+ *
+ * This file is licensed under the terms of the GNU General Public
+ * License version 2. This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+ */
+
+#ifndef __CLK_MVEBU_COMMON_H_
+#define __CLK_MVEBU_COMMON_H_
+
+#include <linux/kernel.h>
+
+struct device_node;
+
+struct coreclk_ratio {
+       int id;
+       const char *name;
+};
+
+struct coreclk_soc_desc {
+       u32 (*get_tclk_freq)(void __iomem *sar);
+       u32 (*get_cpu_freq)(void __iomem *sar);
+       void (*get_clk_ratio)(void __iomem *sar, int id, int *mult, int *div);
+       const struct coreclk_ratio *ratios;
+       int num_ratios;
+};
+
+struct clk_gating_soc_desc {
+       const char *name;
+       const char *parent;
+       int bit_idx;
+       unsigned long flags;
+};
+
+void __init mvebu_coreclk_setup(struct device_node *np,
+                               const struct coreclk_soc_desc *desc);
+
+void __init mvebu_clk_gating_setup(struct device_node *np,
+                                  const struct clk_gating_soc_desc *desc);
+
+#endif
diff --git a/drivers/clk/mvebu/dove.c b/drivers/clk/mvebu/dove.c
new file mode 100644 (file)
index 0000000..79d7aed
--- /dev/null
@@ -0,0 +1,194 @@
+/*
+ * Marvell Dove SoC clocks
+ *
+ * Copyright (C) 2012 Marvell
+ *
+ * Gregory CLEMENT <gregory.clement@free-electrons.com>
+ * Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
+ * Andrew Lunn <andrew@lunn.ch>
+ *
+ * This file is licensed under the terms of the GNU General Public
+ * License version 2.  This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+ */
+
+#include <linux/kernel.h>
+#include <linux/clk-provider.h>
+#include <linux/io.h>
+#include <linux/of.h>
+#include "common.h"
+
+/*
+ * Core Clocks
+ *
+ * Dove PLL sample-at-reset configuration
+ *
+ * SAR0[8:5]   : CPU frequency
+ *              5  = 1000 MHz
+ *              6  =  933 MHz
+ *              7  =  933 MHz
+ *              8  =  800 MHz
+ *              9  =  800 MHz
+ *              10 =  800 MHz
+ *              11 = 1067 MHz
+ *              12 =  667 MHz
+ *              13 =  533 MHz
+ *              14 =  400 MHz
+ *              15 =  333 MHz
+ *              others reserved.
+ *
+ * SAR0[11:9]  : CPU to L2 Clock divider ratio
+ *              0 = (1/1) * CPU
+ *              2 = (1/2) * CPU
+ *              4 = (1/3) * CPU
+ *              6 = (1/4) * CPU
+ *              others reserved.
+ *
+ * SAR0[15:12] : CPU to DDR DRAM Clock divider ratio
+ *              0  = (1/1) * CPU
+ *              2  = (1/2) * CPU
+ *              3  = (2/5) * CPU
+ *              4  = (1/3) * CPU
+ *              6  = (1/4) * CPU
+ *              8  = (1/5) * CPU
+ *              10 = (1/6) * CPU
+ *              12 = (1/7) * CPU
+ *              14 = (1/8) * CPU
+ *              15 = (1/10) * CPU
+ *              others reserved.
+ *
+ * SAR0[24:23] : TCLK frequency
+ *              0 = 166 MHz
+ *              1 = 125 MHz
+ *              others reserved.
+ */
+
+#define SAR_DOVE_CPU_FREQ              5
+#define SAR_DOVE_CPU_FREQ_MASK         0xf
+#define SAR_DOVE_L2_RATIO              9
+#define SAR_DOVE_L2_RATIO_MASK         0x7
+#define SAR_DOVE_DDR_RATIO             12
+#define SAR_DOVE_DDR_RATIO_MASK                0xf
+#define SAR_DOVE_TCLK_FREQ             23
+#define SAR_DOVE_TCLK_FREQ_MASK                0x3
+
+enum { DOVE_CPU_TO_L2, DOVE_CPU_TO_DDR };
+
+static const struct coreclk_ratio __initconst dove_coreclk_ratios[] = {
+       { .id = DOVE_CPU_TO_L2, .name = "l2clk", },
+       { .id = DOVE_CPU_TO_DDR, .name = "ddrclk", }
+};
+
+static const u32 __initconst dove_tclk_freqs[] = {
+       166666667,
+       125000000,
+       0, 0
+};
+
+static u32 __init dove_get_tclk_freq(void __iomem *sar)
+{
+       u32 opt = (readl(sar) >> SAR_DOVE_TCLK_FREQ) &
+               SAR_DOVE_TCLK_FREQ_MASK;
+       return dove_tclk_freqs[opt];
+}
+
+static const u32 __initconst dove_cpu_freqs[] = {
+       0, 0, 0, 0, 0,
+       1000000000,
+       933333333, 933333333,
+       800000000, 800000000, 800000000,
+       1066666667,
+       666666667,
+       533333333,
+       400000000,
+       333333333
+};
+
+static u32 __init dove_get_cpu_freq(void __iomem *sar)
+{
+       u32 opt = (readl(sar) >> SAR_DOVE_CPU_FREQ) &
+               SAR_DOVE_CPU_FREQ_MASK;
+       return dove_cpu_freqs[opt];
+}
+
+static const int __initconst dove_cpu_l2_ratios[8][2] = {
+       { 1, 1 }, { 0, 1 }, { 1, 2 }, { 0, 1 },
+       { 1, 3 }, { 0, 1 }, { 1, 4 }, { 0, 1 }
+};
+
+static const int __initconst dove_cpu_ddr_ratios[16][2] = {
+       { 1, 1 }, { 0, 1 }, { 1, 2 }, { 2, 5 },
+       { 1, 3 }, { 0, 1 }, { 1, 4 }, { 0, 1 },
+       { 1, 5 }, { 0, 1 }, { 1, 6 }, { 0, 1 },
+       { 1, 7 }, { 0, 1 }, { 1, 8 }, { 1, 10 }
+};
+
+static void __init dove_get_clk_ratio(
+       void __iomem *sar, int id, int *mult, int *div)
+{
+       switch (id) {
+       case DOVE_CPU_TO_L2:
+       {
+               u32 opt = (readl(sar) >> SAR_DOVE_L2_RATIO) &
+                       SAR_DOVE_L2_RATIO_MASK;
+               *mult = dove_cpu_l2_ratios[opt][0];
+               *div = dove_cpu_l2_ratios[opt][1];
+               break;
+       }
+       case DOVE_CPU_TO_DDR:
+       {
+               u32 opt = (readl(sar) >> SAR_DOVE_DDR_RATIO) &
+                       SAR_DOVE_DDR_RATIO_MASK;
+               *mult = dove_cpu_ddr_ratios[opt][0];
+               *div = dove_cpu_ddr_ratios[opt][1];
+               break;
+       }
+       }
+}
+
+static const struct coreclk_soc_desc dove_coreclks = {
+       .get_tclk_freq = dove_get_tclk_freq,
+       .get_cpu_freq = dove_get_cpu_freq,
+       .get_clk_ratio = dove_get_clk_ratio,
+       .ratios = dove_coreclk_ratios,
+       .num_ratios = ARRAY_SIZE(dove_coreclk_ratios),
+};
+
+static void __init dove_coreclk_init(struct device_node *np)
+{
+       mvebu_coreclk_setup(np, &dove_coreclks);
+}
+CLK_OF_DECLARE(dove_core_clk, "marvell,dove-core-clock", dove_coreclk_init);
+
+/*
+ * Clock Gating Control
+ */
+
+static const struct clk_gating_soc_desc __initconst dove_gating_desc[] = {
+       { "usb0", NULL, 0, 0 },
+       { "usb1", NULL, 1, 0 },
+       { "ge", "gephy", 2, 0 },
+       { "sata", NULL, 3, 0 },
+       { "pex0", NULL, 4, 0 },
+       { "pex1", NULL, 5, 0 },
+       { "sdio0", NULL, 8, 0 },
+       { "sdio1", NULL, 9, 0 },
+       { "nand", NULL, 10, 0 },
+       { "camera", NULL, 11, 0 },
+       { "i2s0", NULL, 12, 0 },
+       { "i2s1", NULL, 13, 0 },
+       { "crypto", NULL, 15, 0 },
+       { "ac97", NULL, 21, 0 },
+       { "pdma", NULL, 22, 0 },
+       { "xor0", NULL, 23, 0 },
+       { "xor1", NULL, 24, 0 },
+       { "gephy", NULL, 30, 0 },
+       { }
+};
+
+static void __init dove_clk_gating_init(struct device_node *np)
+{
+       mvebu_clk_gating_setup(np, dove_gating_desc);
+}
+CLK_OF_DECLARE(dove_clk_gating, "marvell,dove-gating-clock",
+              dove_clk_gating_init);
diff --git a/drivers/clk/mvebu/kirkwood.c b/drivers/clk/mvebu/kirkwood.c
new file mode 100644 (file)
index 0000000..71d2461
--- /dev/null
@@ -0,0 +1,247 @@
+/*
+ * Marvell Kirkwood SoC clocks
+ *
+ * Copyright (C) 2012 Marvell
+ *
+ * Gregory CLEMENT <gregory.clement@free-electrons.com>
+ * Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
+ * Andrew Lunn <andrew@lunn.ch>
+ *
+ * This file is licensed under the terms of the GNU General Public
+ * License version 2.  This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+ */
+
+#include <linux/kernel.h>
+#include <linux/clk-provider.h>
+#include <linux/io.h>
+#include <linux/of.h>
+#include "common.h"
+
+/*
+ * Core Clocks
+ *
+ * Kirkwood PLL sample-at-reset configuration
+ * (6180 has different SAR layout than other Kirkwood SoCs)
+ *
+ * SAR0[4:3,22,1] : CPU frequency (6281,6292,6282)
+ *     4  =  600 MHz
+ *     6  =  800 MHz
+ *     7  = 1000 MHz
+ *     9  = 1200 MHz
+ *     12 = 1500 MHz
+ *     13 = 1600 MHz
+ *     14 = 1800 MHz
+ *     15 = 2000 MHz
+ *     others reserved.
+ *
+ * SAR0[19,10:9] : CPU to L2 Clock divider ratio (6281,6292,6282)
+ *     1 = (1/2) * CPU
+ *     3 = (1/3) * CPU
+ *     5 = (1/4) * CPU
+ *     others reserved.
+ *
+ * SAR0[8:5] : CPU to DDR DRAM Clock divider ratio (6281,6292,6282)
+ *     2 = (1/2) * CPU
+ *     4 = (1/3) * CPU
+ *     6 = (1/4) * CPU
+ *     7 = (2/9) * CPU
+ *     8 = (1/5) * CPU
+ *     9 = (1/6) * CPU
+ *     others reserved.
+ *
+ * SAR0[4:2] : Kirkwood 6180 cpu/l2/ddr clock configuration (6180 only)
+ *     5 = [CPU =  600 MHz, L2 = (1/2) * CPU, DDR = 200 MHz = (1/3) * CPU]
+ *     6 = [CPU =  800 MHz, L2 = (1/2) * CPU, DDR = 200 MHz = (1/4) * CPU]
+ *     7 = [CPU = 1000 MHz, L2 = (1/2) * CPU, DDR = 200 MHz = (1/5) * CPU]
+ *     others reserved.
+ *
+ * SAR0[21] : TCLK frequency
+ *     0 = 200 MHz
+ *     1 = 166 MHz
+ *     others reserved.
+ */
+
+#define SAR_KIRKWOOD_CPU_FREQ(x)       \
+       (((x & (1 <<  1)) >>  1) |      \
+        ((x & (1 << 22)) >> 21) |      \
+        ((x & (3 <<  3)) >>  1))
+#define SAR_KIRKWOOD_L2_RATIO(x)       \
+       (((x & (3 <<  9)) >> 9) |       \
+        (((x & (1 << 19)) >> 17)))
+#define SAR_KIRKWOOD_DDR_RATIO         5
+#define SAR_KIRKWOOD_DDR_RATIO_MASK    0xf
+#define SAR_MV88F6180_CLK              2
+#define SAR_MV88F6180_CLK_MASK         0x7
+#define SAR_KIRKWOOD_TCLK_FREQ         21
+#define SAR_KIRKWOOD_TCLK_FREQ_MASK    0x1
+
+enum { KIRKWOOD_CPU_TO_L2, KIRKWOOD_CPU_TO_DDR };
+
+static const struct coreclk_ratio __initconst kirkwood_coreclk_ratios[] = {
+       { .id = KIRKWOOD_CPU_TO_L2, .name = "l2clk", },
+       { .id = KIRKWOOD_CPU_TO_DDR, .name = "ddrclk", }
+};
+
+static u32 __init kirkwood_get_tclk_freq(void __iomem *sar)
+{
+       u32 opt = (readl(sar) >> SAR_KIRKWOOD_TCLK_FREQ) &
+               SAR_KIRKWOOD_TCLK_FREQ_MASK;
+       return (opt) ? 166666667 : 200000000;
+}
+
+static const u32 __initconst kirkwood_cpu_freqs[] = {
+       0, 0, 0, 0,
+       600000000,
+       0,
+       800000000,
+       1000000000,
+       0,
+       1200000000,
+       0, 0,
+       1500000000,
+       1600000000,
+       1800000000,
+       2000000000
+};
+
+static u32 __init kirkwood_get_cpu_freq(void __iomem *sar)
+{
+       u32 opt = SAR_KIRKWOOD_CPU_FREQ(readl(sar));
+       return kirkwood_cpu_freqs[opt];
+}
+
+static const int __initconst kirkwood_cpu_l2_ratios[8][2] = {
+       { 0, 1 }, { 1, 2 }, { 0, 1 }, { 1, 3 },
+       { 0, 1 }, { 1, 4 }, { 0, 1 }, { 0, 1 }
+};
+
+static const int __initconst kirkwood_cpu_ddr_ratios[16][2] = {
+       { 0, 1 }, { 0, 1 }, { 1, 2 }, { 0, 1 },
+       { 1, 3 }, { 0, 1 }, { 1, 4 }, { 2, 9 },
+       { 1, 5 }, { 1, 6 }, { 0, 1 }, { 0, 1 },
+       { 0, 1 }, { 0, 1 }, { 0, 1 }, { 0, 1 }
+};
+
+static void __init kirkwood_get_clk_ratio(
+       void __iomem *sar, int id, int *mult, int *div)
+{
+       switch (id) {
+       case KIRKWOOD_CPU_TO_L2:
+       {
+               u32 opt = SAR_KIRKWOOD_L2_RATIO(readl(sar));
+               *mult = kirkwood_cpu_l2_ratios[opt][0];
+               *div = kirkwood_cpu_l2_ratios[opt][1];
+               break;
+       }
+       case KIRKWOOD_CPU_TO_DDR:
+       {
+               u32 opt = (readl(sar) >> SAR_KIRKWOOD_DDR_RATIO) &
+                       SAR_KIRKWOOD_DDR_RATIO_MASK;
+               *mult = kirkwood_cpu_ddr_ratios[opt][0];
+               *div = kirkwood_cpu_ddr_ratios[opt][1];
+               break;
+       }
+       }
+}
+
+static const u32 __initconst mv88f6180_cpu_freqs[] = {
+       0, 0, 0, 0, 0,
+       600000000,
+       800000000,
+       1000000000
+};
+
+static u32 __init mv88f6180_get_cpu_freq(void __iomem *sar)
+{
+       u32 opt = (readl(sar) >> SAR_MV88F6180_CLK) & SAR_MV88F6180_CLK_MASK;
+       return mv88f6180_cpu_freqs[opt];
+}
+
+static const int __initconst mv88f6180_cpu_ddr_ratios[8][2] = {
+       { 0, 1 }, { 0, 1 }, { 0, 1 }, { 0, 1 },
+       { 0, 1 }, { 1, 3 }, { 1, 4 }, { 1, 5 }
+};
+
+static void __init mv88f6180_get_clk_ratio(
+       void __iomem *sar, int id, int *mult, int *div)
+{
+       switch (id) {
+       case KIRKWOOD_CPU_TO_L2:
+       {
+               /* mv88f6180 has a fixed 1:2 CPU-to-L2 ratio */
+               *mult = 1;
+               *div = 2;
+               break;
+       }
+       case KIRKWOOD_CPU_TO_DDR:
+       {
+               u32 opt = (readl(sar) >> SAR_MV88F6180_CLK) &
+                       SAR_MV88F6180_CLK_MASK;
+               *mult = mv88f6180_cpu_ddr_ratios[opt][0];
+               *div = mv88f6180_cpu_ddr_ratios[opt][1];
+               break;
+       }
+       }
+}
+
+static const struct coreclk_soc_desc kirkwood_coreclks = {
+       .get_tclk_freq = kirkwood_get_tclk_freq,
+       .get_cpu_freq = kirkwood_get_cpu_freq,
+       .get_clk_ratio = kirkwood_get_clk_ratio,
+       .ratios = kirkwood_coreclk_ratios,
+       .num_ratios = ARRAY_SIZE(kirkwood_coreclk_ratios),
+};
+
+static void __init kirkwood_coreclk_init(struct device_node *np)
+{
+       mvebu_coreclk_setup(np, &kirkwood_coreclks);
+}
+CLK_OF_DECLARE(kirkwood_core_clk, "marvell,kirkwood-core-clock",
+              kirkwood_coreclk_init);
+
+static const struct coreclk_soc_desc mv88f6180_coreclks = {
+       .get_tclk_freq = kirkwood_get_tclk_freq,
+       .get_cpu_freq = mv88f6180_get_cpu_freq,
+       .get_clk_ratio = mv88f6180_get_clk_ratio,
+       .ratios = kirkwood_coreclk_ratios,
+       .num_ratios = ARRAY_SIZE(kirkwood_coreclk_ratios),
+};
+
+static void __init mv88f6180_coreclk_init(struct device_node *np)
+{
+       mvebu_coreclk_setup(np, &mv88f6180_coreclks);
+}
+CLK_OF_DECLARE(mv88f6180_core_clk, "marvell,mv88f6180-core-clock",
+              mv88f6180_coreclk_init);
+
+/*
+ * Clock Gating Control
+ */
+
+static const struct clk_gating_soc_desc __initconst kirkwood_gating_desc[] = {
+       { "ge0", NULL, 0, 0 },
+       { "pex0", NULL, 2, 0 },
+       { "usb0", NULL, 3, 0 },
+       { "sdio", NULL, 4, 0 },
+       { "tsu", NULL, 5, 0 },
+       { "runit", NULL, 7, 0 },
+       { "xor0", NULL, 8, 0 },
+       { "audio", NULL, 9, 0 },
+       { "powersave", "cpuclk", 11, 0 },
+       { "sata0", NULL, 14, 0 },
+       { "sata1", NULL, 15, 0 },
+       { "xor1", NULL, 16, 0 },
+       { "crypto", NULL, 17, 0 },
+       { "pex1", NULL, 18, 0 },
+       { "ge1", NULL, 19, 0 },
+       { "tdm", NULL, 20, 0 },
+       { }
+};
+
+static void __init kirkwood_clk_gating_init(struct device_node *np)
+{
+       mvebu_clk_gating_setup(np, kirkwood_gating_desc);
+}
+CLK_OF_DECLARE(kirkwood_clk_gating, "marvell,kirkwood-gating-clock",
+              kirkwood_clk_gating_init);
index bd11315cf5ab50fc2b179861ab44f8c6a64b688a..5bb848cac6ece40ab0e5bceef82d4facafdbd80d 100644 (file)
 #include <linux/of.h>
 
 /* Clock Manager offsets */
-#define CLKMGR_CTRL    0x0
-#define CLKMGR_BYPASS 0x4
+#define CLKMGR_CTRL    0x0
+#define CLKMGR_BYPASS  0x4
+#define CLKMGR_L4SRC   0x70
+#define CLKMGR_PERPLL_SRC      0xAC
 
 /* Clock bypass bits */
-#define MAINPLL_BYPASS (1<<0)
-#define SDRAMPLL_BYPASS (1<<1)
-#define SDRAMPLL_SRC_BYPASS (1<<2)
-#define PERPLL_BYPASS (1<<3)
-#define PERPLL_SRC_BYPASS (1<<4)
+#define MAINPLL_BYPASS         (1<<0)
+#define SDRAMPLL_BYPASS                (1<<1)
+#define SDRAMPLL_SRC_BYPASS    (1<<2)
+#define PERPLL_BYPASS          (1<<3)
+#define PERPLL_SRC_BYPASS      (1<<4)
 
 #define SOCFPGA_PLL_BG_PWRDWN          0
 #define SOCFPGA_PLL_EXT_ENA            1
 #define SOCFPGA_PLL_DIVF_SHIFT 3
 #define SOCFPGA_PLL_DIVQ_MASK          0x003F0000
 #define SOCFPGA_PLL_DIVQ_SHIFT 16
+#define SOCFGPA_MAX_PARENTS    3
+
+#define SOCFPGA_L4_MP_CLK              "l4_mp_clk"
+#define SOCFPGA_L4_SP_CLK              "l4_sp_clk"
+#define SOCFPGA_NAND_CLK               "nand_clk"
+#define SOCFPGA_NAND_X_CLK             "nand_x_clk"
+#define SOCFPGA_MMC_CLK                        "mmc_clk"
+#define SOCFPGA_DB_CLK                 "gpio_db_clk"
+
+#define div_mask(width)        ((1 << (width)) - 1)
+#define streq(a, b) (strcmp((a), (b)) == 0)
 
 extern void __iomem *clk_mgr_base_addr;
 
@@ -49,6 +62,9 @@ struct socfpga_clk {
        char *parent_name;
        char *clk_name;
        u32 fixed_div;
+       void __iomem *div_reg;
+       u32 width;      /* only valid if div_reg != 0 */
+       u32 shift;      /* only valid if div_reg != 0 */
 };
 #define to_socfpga_clk(p) container_of(p, struct socfpga_clk, hw.hw)
 
@@ -132,8 +148,9 @@ static __init struct clk *socfpga_clk_init(struct device_node *node,
 
        socfpga_clk->hw.hw.init = &init;
 
-       if (strcmp(clk_name, "main_pll") || strcmp(clk_name, "periph_pll") ||
-                       strcmp(clk_name, "sdram_pll")) {
+       if (streq(clk_name, "main_pll") ||
+               streq(clk_name, "periph_pll") ||
+               streq(clk_name, "sdram_pll")) {
                socfpga_clk->hw.bit_idx = SOCFPGA_PLL_EXT_ENA;
                clk_pll_ops.enable = clk_gate_ops.enable;
                clk_pll_ops.disable = clk_gate_ops.disable;
@@ -148,6 +165,159 @@ static __init struct clk *socfpga_clk_init(struct device_node *node,
        return clk;
 }
 
+static u8 socfpga_clk_get_parent(struct clk_hw *hwclk)
+{
+       u32 l4_src;
+       u32 perpll_src;
+
+       if (streq(hwclk->init->name, SOCFPGA_L4_MP_CLK)) {
+               l4_src = readl(clk_mgr_base_addr + CLKMGR_L4SRC);
+               return l4_src &= 0x1;
+       }
+       if (streq(hwclk->init->name, SOCFPGA_L4_SP_CLK)) {
+               l4_src = readl(clk_mgr_base_addr + CLKMGR_L4SRC);
+               return !!(l4_src & 2);
+       }
+
+       perpll_src = readl(clk_mgr_base_addr + CLKMGR_PERPLL_SRC);
+       if (streq(hwclk->init->name, SOCFPGA_MMC_CLK))
+               return perpll_src &= 0x3;
+       if (streq(hwclk->init->name, SOCFPGA_NAND_CLK) ||
+                       streq(hwclk->init->name, SOCFPGA_NAND_X_CLK))
+                       return (perpll_src >> 2) & 3;
+
+       /* QSPI clock */
+       return (perpll_src >> 4) & 3;
+
+}
+
+static int socfpga_clk_set_parent(struct clk_hw *hwclk, u8 parent)
+{
+       u32 src_reg;
+
+       if (streq(hwclk->init->name, SOCFPGA_L4_MP_CLK)) {
+               src_reg = readl(clk_mgr_base_addr + CLKMGR_L4SRC);
+               src_reg &= ~0x1;
+               src_reg |= parent;
+               writel(src_reg, clk_mgr_base_addr + CLKMGR_L4SRC);
+       } else if (streq(hwclk->init->name, SOCFPGA_L4_SP_CLK)) {
+               src_reg = readl(clk_mgr_base_addr + CLKMGR_L4SRC);
+               src_reg &= ~0x2;
+               src_reg |= (parent << 1);
+               writel(src_reg, clk_mgr_base_addr + CLKMGR_L4SRC);
+       } else {
+               src_reg = readl(clk_mgr_base_addr + CLKMGR_PERPLL_SRC);
+               if (streq(hwclk->init->name, SOCFPGA_MMC_CLK)) {
+                       src_reg &= ~0x3;
+                       src_reg |= parent;
+               } else if (streq(hwclk->init->name, SOCFPGA_NAND_CLK) ||
+                       streq(hwclk->init->name, SOCFPGA_NAND_X_CLK)) {
+                       src_reg &= ~0xC;
+                       src_reg |= (parent << 2);
+               } else {/* QSPI clock */
+                       src_reg &= ~0x30;
+                       src_reg |= (parent << 4);
+               }
+               writel(src_reg, clk_mgr_base_addr + CLKMGR_PERPLL_SRC);
+       }
+
+       return 0;
+}
+
+static unsigned long socfpga_clk_recalc_rate(struct clk_hw *hwclk,
+       unsigned long parent_rate)
+{
+       struct socfpga_clk *socfpgaclk = to_socfpga_clk(hwclk);
+       u32 div = 1, val;
+
+       if (socfpgaclk->fixed_div)
+               div = socfpgaclk->fixed_div;
+       else if (socfpgaclk->div_reg) {
+               val = readl(socfpgaclk->div_reg) >> socfpgaclk->shift;
+               val &= div_mask(socfpgaclk->width);
+               if (streq(hwclk->init->name, SOCFPGA_DB_CLK))
+                       div = val + 1;
+               else
+                       div = (1 << val);
+       }
+
+       return parent_rate / div;
+}
+
+static struct clk_ops gateclk_ops = {
+       .recalc_rate = socfpga_clk_recalc_rate,
+       .get_parent = socfpga_clk_get_parent,
+       .set_parent = socfpga_clk_set_parent,
+};
+
+static void __init socfpga_gate_clk_init(struct device_node *node,
+       const struct clk_ops *ops)
+{
+       u32 clk_gate[2];
+       u32 div_reg[3];
+       u32 fixed_div;
+       struct clk *clk;
+       struct socfpga_clk *socfpga_clk;
+       const char *clk_name = node->name;
+       const char *parent_name[SOCFGPA_MAX_PARENTS];
+       struct clk_init_data init;
+       int rc;
+       int i = 0;
+
+       socfpga_clk = kzalloc(sizeof(*socfpga_clk), GFP_KERNEL);
+       if (WARN_ON(!socfpga_clk))
+               return;
+
+       rc = of_property_read_u32_array(node, "clk-gate", clk_gate, 2);
+       if (rc)
+               clk_gate[0] = 0;
+
+       if (clk_gate[0]) {
+               socfpga_clk->hw.reg = clk_mgr_base_addr + clk_gate[0];
+               socfpga_clk->hw.bit_idx = clk_gate[1];
+
+               gateclk_ops.enable = clk_gate_ops.enable;
+               gateclk_ops.disable = clk_gate_ops.disable;
+       }
+
+       rc = of_property_read_u32(node, "fixed-divider", &fixed_div);
+       if (rc)
+               socfpga_clk->fixed_div = 0;
+       else
+               socfpga_clk->fixed_div = fixed_div;
+
+       rc = of_property_read_u32_array(node, "div-reg", div_reg, 3);
+       if (!rc) {
+               socfpga_clk->div_reg = clk_mgr_base_addr + div_reg[0];
+               socfpga_clk->shift = div_reg[1];
+               socfpga_clk->width = div_reg[2];
+       } else {
+               socfpga_clk->div_reg = 0;
+       }
+
+       of_property_read_string(node, "clock-output-names", &clk_name);
+
+       init.name = clk_name;
+       init.ops = ops;
+       init.flags = 0;
+       while (i < SOCFGPA_MAX_PARENTS && (parent_name[i] =
+                       of_clk_get_parent_name(node, i)) != NULL)
+               i++;
+
+       init.parent_names = parent_name;
+       init.num_parents = i;
+       socfpga_clk->hw.hw.init = &init;
+
+       clk = clk_register(NULL, &socfpga_clk->hw.hw);
+       if (WARN_ON(IS_ERR(clk))) {
+               kfree(socfpga_clk);
+               return;
+       }
+       rc = of_clk_add_provider(node, of_clk_src_simple_get, clk);
+       if (WARN_ON(rc))
+               return;
+}
+
 static void __init socfpga_pll_init(struct device_node *node)
 {
        socfpga_clk_init(node, &clk_pll_ops);
@@ -160,6 +330,12 @@ static void __init socfpga_periph_init(struct device_node *node)
 }
 CLK_OF_DECLARE(socfpga_periph, "altr,socfpga-perip-clk", socfpga_periph_init);
 
+static void __init socfpga_gate_init(struct device_node *node)
+{
+       socfpga_gate_clk_init(node, &gateclk_ops);
+}
+CLK_OF_DECLARE(socfpga_gate, "altr,socfpga-gate-clk", socfpga_gate_init);
+
 void __init socfpga_init_clocks(void)
 {
        struct clk *clk;
index d78e16ee161c64ae7578872497e25fb5c8188d08..40d939d091bfc69608ea2a959cacef2cd87531a3 100644 (file)
 #define CLK_SOURCE_XUSB_DEV_SRC 0x60c
 #define CLK_SOURCE_EMC 0x19c
 
+/* Tegra CPU clock and reset control regs */
+#define CLK_RST_CONTROLLER_CPU_CMPLX_STATUS    0x470
+
 static int periph_clk_enb_refcnt[CLK_OUT_ENB_NUM * 32];
 
 static void __iomem *clk_base;
@@ -2000,7 +2003,25 @@ static __init void tegra114_periph_clk_init(void __iomem *clk_base)
        }
 }
 
-static struct tegra_cpu_car_ops tegra114_cpu_car_ops;
+/* Tegra114 CPU clock and reset control functions */
+static void tegra114_wait_cpu_in_reset(u32 cpu)
+{
+       unsigned int reg;
+
+       do {
+               reg = readl(clk_base + CLK_RST_CONTROLLER_CPU_CMPLX_STATUS);
+               cpu_relax();
+       } while (!(reg & (1 << cpu)));  /* check CPU been reset or not */
+}
+static void tegra114_disable_cpu_clock(u32 cpu)
+{
+       /* flow controller would take care in the power sequence. */
+}
+
+static struct tegra_cpu_car_ops tegra114_cpu_car_ops = {
+       .wait_for_reset = tegra114_wait_cpu_in_reset,
+       .disable_clock  = tegra114_disable_cpu_clock,
+};
 
 static const struct of_device_id pmc_match[] __initconst = {
        { .compatible = "nvidia,tegra114-pmc" },
diff --git a/drivers/clk/zynq/Makefile b/drivers/clk/zynq/Makefile
new file mode 100644 (file)
index 0000000..156d923
--- /dev/null
@@ -0,0 +1,3 @@
+# Zynq clock specific Makefile
+
+obj-$(CONFIG_ARCH_ZYNQ)        += clkc.o pll.o
diff --git a/drivers/clk/zynq/clkc.c b/drivers/clk/zynq/clkc.c
new file mode 100644 (file)
index 0000000..5c205b6
--- /dev/null
@@ -0,0 +1,533 @@
+/*
+ * Zynq clock controller
+ *
+ *  Copyright (C) 2012 - 2013 Xilinx
+ *
+ *  Sören Brinkmann <soren.brinkmann@xilinx.com>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License v2 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/>.
+ */
+
+#include <linux/clk/zynq.h>
+#include <linux/clk-provider.h>
+#include <linux/of.h>
+#include <linux/slab.h>
+#include <linux/string.h>
+#include <linux/io.h>
+
+static void __iomem *zynq_slcr_base_priv;
+
+#define SLCR_ARMPLL_CTRL               (zynq_slcr_base_priv + 0x100)
+#define SLCR_DDRPLL_CTRL               (zynq_slcr_base_priv + 0x104)
+#define SLCR_IOPLL_CTRL                        (zynq_slcr_base_priv + 0x108)
+#define SLCR_PLL_STATUS                        (zynq_slcr_base_priv + 0x10c)
+#define SLCR_ARM_CLK_CTRL              (zynq_slcr_base_priv + 0x120)
+#define SLCR_DDR_CLK_CTRL              (zynq_slcr_base_priv + 0x124)
+#define SLCR_DCI_CLK_CTRL              (zynq_slcr_base_priv + 0x128)
+#define SLCR_APER_CLK_CTRL             (zynq_slcr_base_priv + 0x12c)
+#define SLCR_GEM0_CLK_CTRL             (zynq_slcr_base_priv + 0x140)
+#define SLCR_GEM1_CLK_CTRL             (zynq_slcr_base_priv + 0x144)
+#define SLCR_SMC_CLK_CTRL              (zynq_slcr_base_priv + 0x148)
+#define SLCR_LQSPI_CLK_CTRL            (zynq_slcr_base_priv + 0x14c)
+#define SLCR_SDIO_CLK_CTRL             (zynq_slcr_base_priv + 0x150)
+#define SLCR_UART_CLK_CTRL             (zynq_slcr_base_priv + 0x154)
+#define SLCR_SPI_CLK_CTRL              (zynq_slcr_base_priv + 0x158)
+#define SLCR_CAN_CLK_CTRL              (zynq_slcr_base_priv + 0x15c)
+#define SLCR_CAN_MIOCLK_CTRL           (zynq_slcr_base_priv + 0x160)
+#define SLCR_DBG_CLK_CTRL              (zynq_slcr_base_priv + 0x164)
+#define SLCR_PCAP_CLK_CTRL             (zynq_slcr_base_priv + 0x168)
+#define SLCR_FPGA0_CLK_CTRL            (zynq_slcr_base_priv + 0x170)
+#define SLCR_621_TRUE                  (zynq_slcr_base_priv + 0x1c4)
+#define SLCR_SWDT_CLK_SEL              (zynq_slcr_base_priv + 0x304)
+
+#define NUM_MIO_PINS   54
+
+enum zynq_clk {
+       armpll, ddrpll, iopll,
+       cpu_6or4x, cpu_3or2x, cpu_2x, cpu_1x,
+       ddr2x, ddr3x, dci,
+       lqspi, smc, pcap, gem0, gem1, fclk0, fclk1, fclk2, fclk3, can0, can1,
+       sdio0, sdio1, uart0, uart1, spi0, spi1, dma,
+       usb0_aper, usb1_aper, gem0_aper, gem1_aper,
+       sdio0_aper, sdio1_aper, spi0_aper, spi1_aper, can0_aper, can1_aper,
+       i2c0_aper, i2c1_aper, uart0_aper, uart1_aper, gpio_aper, lqspi_aper,
+       smc_aper, swdt, dbg_trc, dbg_apb, clk_max};
+
+static struct clk *ps_clk;
+static struct clk *clks[clk_max];
+static struct clk_onecell_data clk_data;
+
+static DEFINE_SPINLOCK(armpll_lock);
+static DEFINE_SPINLOCK(ddrpll_lock);
+static DEFINE_SPINLOCK(iopll_lock);
+static DEFINE_SPINLOCK(armclk_lock);
+static DEFINE_SPINLOCK(ddrclk_lock);
+static DEFINE_SPINLOCK(dciclk_lock);
+static DEFINE_SPINLOCK(gem0clk_lock);
+static DEFINE_SPINLOCK(gem1clk_lock);
+static DEFINE_SPINLOCK(canclk_lock);
+static DEFINE_SPINLOCK(canmioclk_lock);
+static DEFINE_SPINLOCK(dbgclk_lock);
+static DEFINE_SPINLOCK(aperclk_lock);
+
+static const char dummy_nm[] __initconst = "dummy_name";
+
+static const char *armpll_parents[] __initdata = {"armpll_int", "ps_clk"};
+static const char *ddrpll_parents[] __initdata = {"ddrpll_int", "ps_clk"};
+static const char *iopll_parents[] __initdata = {"iopll_int", "ps_clk"};
+static const char *gem0_mux_parents[] __initdata = {"gem0_div1", dummy_nm};
+static const char *gem1_mux_parents[] __initdata = {"gem1_div1", dummy_nm};
+static const char *can0_mio_mux2_parents[] __initdata = {"can0_gate",
+       "can0_mio_mux"};
+static const char *can1_mio_mux2_parents[] __initdata = {"can1_gate",
+       "can1_mio_mux"};
+static const char *dbg_emio_mux_parents[] __initdata = {"dbg_div",
+       dummy_nm};
+
+static const char *dbgtrc_emio_input_names[] __initdata = {"trace_emio_clk"};
+static const char *gem0_emio_input_names[] __initdata = {"gem0_emio_clk"};
+static const char *gem1_emio_input_names[] __initdata = {"gem1_emio_clk"};
+static const char *swdt_ext_clk_input_names[] __initdata = {"swdt_ext_clk"};
+
+static void __init zynq_clk_register_fclk(enum zynq_clk fclk,
+               const char *clk_name, void __iomem *fclk_ctrl_reg,
+               const char **parents)
+{
+       struct clk *clk;
+       char *mux_name;
+       char *div0_name;
+       char *div1_name;
+       spinlock_t *fclk_lock;
+       spinlock_t *fclk_gate_lock;
+       void __iomem *fclk_gate_reg = fclk_ctrl_reg + 8;
+
+       fclk_lock = kmalloc(sizeof(*fclk_lock), GFP_KERNEL);
+       if (!fclk_lock)
+               goto err;
+       fclk_gate_lock = kmalloc(sizeof(*fclk_gate_lock), GFP_KERNEL);
+       if (!fclk_gate_lock)
+               goto err;
+       spin_lock_init(fclk_lock);
+       spin_lock_init(fclk_gate_lock);
+
+       mux_name = kasprintf(GFP_KERNEL, "%s_mux", clk_name);
+       div0_name = kasprintf(GFP_KERNEL, "%s_div0", clk_name);
+       div1_name = kasprintf(GFP_KERNEL, "%s_div1", clk_name);
+
+       clk = clk_register_mux(NULL, mux_name, parents, 4, 0,
+                       fclk_ctrl_reg, 4, 2, 0, fclk_lock);
+
+       clk = clk_register_divider(NULL, div0_name, mux_name,
+                       0, fclk_ctrl_reg, 8, 6, CLK_DIVIDER_ONE_BASED |
+                       CLK_DIVIDER_ALLOW_ZERO, fclk_lock);
+
+       clk = clk_register_divider(NULL, div1_name, div0_name,
+                       CLK_SET_RATE_PARENT, fclk_ctrl_reg, 20, 6,
+                       CLK_DIVIDER_ONE_BASED | CLK_DIVIDER_ALLOW_ZERO,
+                       fclk_lock);
+
+       clks[fclk] = clk_register_gate(NULL, clk_name,
+                       div1_name, CLK_SET_RATE_PARENT, fclk_gate_reg,
+                       0, CLK_GATE_SET_TO_DISABLE, fclk_gate_lock);
+       kfree(mux_name);
+       kfree(div0_name);
+       kfree(div1_name);
+
+       return;
+
+err:
+       clks[fclk] = ERR_PTR(-ENOMEM);
+}
+
+static void __init zynq_clk_register_periph_clk(enum zynq_clk clk0,
+               enum zynq_clk clk1, const char *clk_name0,
+               const char *clk_name1, void __iomem *clk_ctrl,
+               const char **parents, unsigned int two_gates)
+{
+       struct clk *clk;
+       char *mux_name;
+       char *div_name;
+       spinlock_t *lock;
+
+       lock = kmalloc(sizeof(*lock), GFP_KERNEL);
+       if (!lock)
+               goto err;
+       spin_lock_init(lock);
+
+       mux_name = kasprintf(GFP_KERNEL, "%s_mux", clk_name0);
+       div_name = kasprintf(GFP_KERNEL, "%s_div", clk_name0);
+
+       clk = clk_register_mux(NULL, mux_name, parents, 4, 0,
+                       clk_ctrl, 4, 2, 0, lock);
+
+       clk = clk_register_divider(NULL, div_name, mux_name, 0, clk_ctrl, 8, 6,
+                       CLK_DIVIDER_ONE_BASED | CLK_DIVIDER_ALLOW_ZERO, lock);
+
+       clks[clk0] = clk_register_gate(NULL, clk_name0, div_name,
+                       CLK_SET_RATE_PARENT, clk_ctrl, 0, 0, lock);
+       if (two_gates)
+               clks[clk1] = clk_register_gate(NULL, clk_name1, div_name,
+                               CLK_SET_RATE_PARENT, clk_ctrl, 1, 0, lock);
+
+       kfree(mux_name);
+       kfree(div_name);
+
+       return;
+
+err:
+       clks[clk0] = ERR_PTR(-ENOMEM);
+       if (two_gates)
+               clks[clk1] = ERR_PTR(-ENOMEM);
+}
+
+static void __init zynq_clk_setup(struct device_node *np)
+{
+       int i;
+       u32 tmp;
+       int ret;
+       struct clk *clk;
+       char *clk_name;
+       const char *clk_output_name[clk_max];
+       const char *cpu_parents[4];
+       const char *periph_parents[4];
+       const char *swdt_ext_clk_mux_parents[2];
+       const char *can_mio_mux_parents[NUM_MIO_PINS];
+
+       pr_info("Zynq clock init\n");
+
+       /* get clock output names from DT */
+       for (i = 0; i < clk_max; i++) {
+               if (of_property_read_string_index(np, "clock-output-names",
+                                 i, &clk_output_name[i])) {
+                       pr_err("%s: clock output name not in DT\n", __func__);
+                       BUG();
+               }
+       }
+       cpu_parents[0] = clk_output_name[armpll];
+       cpu_parents[1] = clk_output_name[armpll];
+       cpu_parents[2] = clk_output_name[ddrpll];
+       cpu_parents[3] = clk_output_name[iopll];
+       periph_parents[0] = clk_output_name[iopll];
+       periph_parents[1] = clk_output_name[iopll];
+       periph_parents[2] = clk_output_name[armpll];
+       periph_parents[3] = clk_output_name[ddrpll];
+
+       /* ps_clk */
+       ret = of_property_read_u32(np, "ps-clk-frequency", &tmp);
+       if (ret) {
+               pr_warn("ps_clk frequency not specified, using 33 MHz.\n");
+               tmp = 33333333;
+       }
+       ps_clk = clk_register_fixed_rate(NULL, "ps_clk", NULL, CLK_IS_ROOT,
+                       tmp);
+
+       /* PLLs */
+       clk = clk_register_zynq_pll("armpll_int", "ps_clk", SLCR_ARMPLL_CTRL,
+                       SLCR_PLL_STATUS, 0, &armpll_lock);
+       clks[armpll] = clk_register_mux(NULL, clk_output_name[armpll],
+                       armpll_parents, 2, 0, SLCR_ARMPLL_CTRL, 4, 1, 0,
+                       &armpll_lock);
+
+       clk = clk_register_zynq_pll("ddrpll_int", "ps_clk", SLCR_DDRPLL_CTRL,
+                       SLCR_PLL_STATUS, 1, &ddrpll_lock);
+       clks[ddrpll] = clk_register_mux(NULL, clk_output_name[ddrpll],
+                       ddrpll_parents, 2, 0, SLCR_DDRPLL_CTRL, 4, 1, 0,
+                       &ddrpll_lock);
+
+       clk = clk_register_zynq_pll("iopll_int", "ps_clk", SLCR_IOPLL_CTRL,
+                       SLCR_PLL_STATUS, 2, &iopll_lock);
+       clks[iopll] = clk_register_mux(NULL, clk_output_name[iopll],
+                       iopll_parents, 2, 0, SLCR_IOPLL_CTRL, 4, 1, 0,
+                       &iopll_lock);
+
+       /* CPU clocks */
+       tmp = readl(SLCR_621_TRUE) & 1;
+       clk = clk_register_mux(NULL, "cpu_mux", cpu_parents, 4, 0,
+                       SLCR_ARM_CLK_CTRL, 4, 2, 0, &armclk_lock);
+       clk = clk_register_divider(NULL, "cpu_div", "cpu_mux", 0,
+                       SLCR_ARM_CLK_CTRL, 8, 6, CLK_DIVIDER_ONE_BASED |
+                       CLK_DIVIDER_ALLOW_ZERO, &armclk_lock);
+
+       clks[cpu_6or4x] = clk_register_gate(NULL, clk_output_name[cpu_6or4x],
+                       "cpu_div", CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
+                       SLCR_ARM_CLK_CTRL, 24, 0, &armclk_lock);
+
+       clk = clk_register_fixed_factor(NULL, "cpu_3or2x_div", "cpu_div", 0,
+                       1, 2);
+       clks[cpu_3or2x] = clk_register_gate(NULL, clk_output_name[cpu_3or2x],
+                       "cpu_3or2x_div", CLK_IGNORE_UNUSED,
+                       SLCR_ARM_CLK_CTRL, 25, 0, &armclk_lock);
+
+       clk = clk_register_fixed_factor(NULL, "cpu_2x_div", "cpu_div", 0, 1,
+                       2 + tmp);
+       clks[cpu_2x] = clk_register_gate(NULL, clk_output_name[cpu_2x],
+                       "cpu_2x_div", CLK_IGNORE_UNUSED, SLCR_ARM_CLK_CTRL,
+                       26, 0, &armclk_lock);
+
+       clk = clk_register_fixed_factor(NULL, "cpu_1x_div", "cpu_div", 0, 1,
+                       4 + 2 * tmp);
+       clks[cpu_1x] = clk_register_gate(NULL, clk_output_name[cpu_1x],
+                       "cpu_1x_div", CLK_IGNORE_UNUSED, SLCR_ARM_CLK_CTRL, 27,
+                       0, &armclk_lock);
+
+       /* Timers */
+       swdt_ext_clk_mux_parents[0] = clk_output_name[cpu_1x];
+       for (i = 0; i < ARRAY_SIZE(swdt_ext_clk_input_names); i++) {
+               int idx = of_property_match_string(np, "clock-names",
+                               swdt_ext_clk_input_names[i]);
+               if (idx >= 0)
+                       swdt_ext_clk_mux_parents[i + 1] =
+                               of_clk_get_parent_name(np, idx);
+               else
+                       swdt_ext_clk_mux_parents[i + 1] = dummy_nm;
+       }
+       clks[swdt] = clk_register_mux(NULL, clk_output_name[swdt],
+                       swdt_ext_clk_mux_parents, 2, CLK_SET_RATE_PARENT,
+                       SLCR_SWDT_CLK_SEL, 0, 1, 0, &gem0clk_lock);
+
+       /* DDR clocks */
+       clk = clk_register_divider(NULL, "ddr2x_div", "ddrpll", 0,
+                       SLCR_DDR_CLK_CTRL, 26, 6, CLK_DIVIDER_ONE_BASED |
+                       CLK_DIVIDER_ALLOW_ZERO, &ddrclk_lock);
+       clks[ddr2x] = clk_register_gate(NULL, clk_output_name[ddr2x],
+                       "ddr2x_div", 0, SLCR_DDR_CLK_CTRL, 1, 0, &ddrclk_lock);
+       clk_prepare_enable(clks[ddr2x]);
+       clk = clk_register_divider(NULL, "ddr3x_div", "ddrpll", 0,
+                       SLCR_DDR_CLK_CTRL, 20, 6, CLK_DIVIDER_ONE_BASED |
+                       CLK_DIVIDER_ALLOW_ZERO, &ddrclk_lock);
+       clks[ddr3x] = clk_register_gate(NULL, clk_output_name[ddr3x],
+                       "ddr3x_div", 0, SLCR_DDR_CLK_CTRL, 0, 0, &ddrclk_lock);
+       clk_prepare_enable(clks[ddr3x]);
+
+       clk = clk_register_divider(NULL, "dci_div0", "ddrpll", 0,
+                       SLCR_DCI_CLK_CTRL, 8, 6, CLK_DIVIDER_ONE_BASED |
+                       CLK_DIVIDER_ALLOW_ZERO, &dciclk_lock);
+       clk = clk_register_divider(NULL, "dci_div1", "dci_div0",
+                       CLK_SET_RATE_PARENT, SLCR_DCI_CLK_CTRL, 20, 6,
+                       CLK_DIVIDER_ONE_BASED | CLK_DIVIDER_ALLOW_ZERO,
+                       &dciclk_lock);
+       clks[dci] = clk_register_gate(NULL, clk_output_name[dci], "dci_div1",
+                       CLK_SET_RATE_PARENT, SLCR_DCI_CLK_CTRL, 0, 0,
+                       &dciclk_lock);
+       clk_prepare_enable(clks[dci]);
+
+       /* Peripheral clocks */
+       for (i = fclk0; i <= fclk3; i++)
+               zynq_clk_register_fclk(i, clk_output_name[i],
+                               SLCR_FPGA0_CLK_CTRL + 0x10 * (i - fclk0),
+                               periph_parents);
+
+       zynq_clk_register_periph_clk(lqspi, 0, clk_output_name[lqspi], NULL,
+                       SLCR_LQSPI_CLK_CTRL, periph_parents, 0);
+
+       zynq_clk_register_periph_clk(smc, 0, clk_output_name[smc], NULL,
+                       SLCR_SMC_CLK_CTRL, periph_parents, 0);
+
+       zynq_clk_register_periph_clk(pcap, 0, clk_output_name[pcap], NULL,
+                       SLCR_PCAP_CLK_CTRL, periph_parents, 0);
+
+       zynq_clk_register_periph_clk(sdio0, sdio1, clk_output_name[sdio0],
+                       clk_output_name[sdio1], SLCR_SDIO_CLK_CTRL,
+                       periph_parents, 1);
+
+       zynq_clk_register_periph_clk(uart0, uart1, clk_output_name[uart0],
+                       clk_output_name[uart1], SLCR_UART_CLK_CTRL,
+                       periph_parents, 1);
+
+       zynq_clk_register_periph_clk(spi0, spi1, clk_output_name[spi0],
+                       clk_output_name[spi1], SLCR_SPI_CLK_CTRL,
+                       periph_parents, 1);
+
+       for (i = 0; i < ARRAY_SIZE(gem0_emio_input_names); i++) {
+               int idx = of_property_match_string(np, "clock-names",
+                               gem0_emio_input_names[i]);
+               if (idx >= 0)
+                       gem0_mux_parents[i + 1] = of_clk_get_parent_name(np,
+                                       idx);
+       }
+       clk = clk_register_mux(NULL, "gem0_mux", periph_parents, 4, 0,
+                       SLCR_GEM0_CLK_CTRL, 4, 2, 0, &gem0clk_lock);
+       clk = clk_register_divider(NULL, "gem0_div0", "gem0_mux", 0,
+                       SLCR_GEM0_CLK_CTRL, 8, 6, CLK_DIVIDER_ONE_BASED |
+                       CLK_DIVIDER_ALLOW_ZERO, &gem0clk_lock);
+       clk = clk_register_divider(NULL, "gem0_div1", "gem0_div0",
+                       CLK_SET_RATE_PARENT, SLCR_GEM0_CLK_CTRL, 20, 6,
+                       CLK_DIVIDER_ONE_BASED | CLK_DIVIDER_ALLOW_ZERO,
+                       &gem0clk_lock);
+       clk = clk_register_mux(NULL, "gem0_emio_mux", gem0_mux_parents, 2, 0,
+                       SLCR_GEM0_CLK_CTRL, 6, 1, 0, &gem0clk_lock);
+       clks[gem0] = clk_register_gate(NULL, clk_output_name[gem0],
+                       "gem0_emio_mux", CLK_SET_RATE_PARENT,
+                       SLCR_GEM0_CLK_CTRL, 0, 0, &gem0clk_lock);
+
+       for (i = 0; i < ARRAY_SIZE(gem1_emio_input_names); i++) {
+               int idx = of_property_match_string(np, "clock-names",
+                               gem1_emio_input_names[i]);
+               if (idx >= 0)
+                       gem1_mux_parents[i + 1] = of_clk_get_parent_name(np,
+                                       idx);
+       }
+       clk = clk_register_mux(NULL, "gem1_mux", periph_parents, 4, 0,
+                       SLCR_GEM1_CLK_CTRL, 4, 2, 0, &gem1clk_lock);
+       clk = clk_register_divider(NULL, "gem1_div0", "gem1_mux", 0,
+                       SLCR_GEM1_CLK_CTRL, 8, 6, CLK_DIVIDER_ONE_BASED |
+                       CLK_DIVIDER_ALLOW_ZERO, &gem1clk_lock);
+       clk = clk_register_divider(NULL, "gem1_div1", "gem1_div0",
+                       CLK_SET_RATE_PARENT, SLCR_GEM1_CLK_CTRL, 20, 6,
+                       CLK_DIVIDER_ONE_BASED | CLK_DIVIDER_ALLOW_ZERO,
+                       &gem1clk_lock);
+       clk = clk_register_mux(NULL, "gem1_emio_mux", gem1_mux_parents, 2, 0,
+                       SLCR_GEM1_CLK_CTRL, 6, 1, 0, &gem1clk_lock);
+       clks[gem1] = clk_register_gate(NULL, clk_output_name[gem1],
+                       "gem1_emio_mux", CLK_SET_RATE_PARENT,
+                       SLCR_GEM1_CLK_CTRL, 0, 0, &gem1clk_lock);
+
+       tmp = strlen("mio_clk_00x");
+       clk_name = kmalloc(tmp, GFP_KERNEL);
+       for (i = 0; i < NUM_MIO_PINS; i++) {
+               int idx;
+
+               snprintf(clk_name, tmp, "mio_clk_%2.2d", i);
+               idx = of_property_match_string(np, "clock-names", clk_name);
+               if (idx >= 0)
+                       can_mio_mux_parents[i] = of_clk_get_parent_name(np,
+                                               idx);
+               else
+                       can_mio_mux_parents[i] = dummy_nm;
+       }
+       kfree(clk_name);
+       clk = clk_register_mux(NULL, "can_mux", periph_parents, 4, 0,
+                       SLCR_CAN_CLK_CTRL, 4, 2, 0, &canclk_lock);
+       clk = clk_register_divider(NULL, "can_div0", "can_mux", 0,
+                       SLCR_CAN_CLK_CTRL, 8, 6, CLK_DIVIDER_ONE_BASED |
+                       CLK_DIVIDER_ALLOW_ZERO, &canclk_lock);
+       clk = clk_register_divider(NULL, "can_div1", "can_div0",
+                       CLK_SET_RATE_PARENT, SLCR_CAN_CLK_CTRL, 20, 6,
+                       CLK_DIVIDER_ONE_BASED | CLK_DIVIDER_ALLOW_ZERO,
+                       &canclk_lock);
+       clk = clk_register_gate(NULL, "can0_gate", "can_div1",
+                       CLK_SET_RATE_PARENT, SLCR_CAN_CLK_CTRL, 0, 0,
+                       &canclk_lock);
+       clk = clk_register_gate(NULL, "can1_gate", "can_div1",
+                       CLK_SET_RATE_PARENT, SLCR_CAN_CLK_CTRL, 1, 0,
+                       &canclk_lock);
+       clk = clk_register_mux(NULL, "can0_mio_mux",
+                       can_mio_mux_parents, 54, CLK_SET_RATE_PARENT,
+                       SLCR_CAN_MIOCLK_CTRL, 0, 6, 0, &canmioclk_lock);
+       clk = clk_register_mux(NULL, "can1_mio_mux",
+                       can_mio_mux_parents, 54, CLK_SET_RATE_PARENT,
+                       SLCR_CAN_MIOCLK_CTRL, 16, 6, 0, &canmioclk_lock);
+       clks[can0] = clk_register_mux(NULL, clk_output_name[can0],
+                       can0_mio_mux2_parents, 2, CLK_SET_RATE_PARENT,
+                       SLCR_CAN_MIOCLK_CTRL, 6, 1, 0, &canmioclk_lock);
+       clks[can1] = clk_register_mux(NULL, clk_output_name[can1],
+                       can1_mio_mux2_parents, 2, CLK_SET_RATE_PARENT,
+                       SLCR_CAN_MIOCLK_CTRL, 22, 1, 0, &canmioclk_lock);
+
+       for (i = 0; i < ARRAY_SIZE(dbgtrc_emio_input_names); i++) {
+               int idx = of_property_match_string(np, "clock-names",
+                               dbgtrc_emio_input_names[i]);
+               if (idx >= 0)
+                       dbg_emio_mux_parents[i + 1] = of_clk_get_parent_name(np,
+                                       idx);
+       }
+       clk = clk_register_mux(NULL, "dbg_mux", periph_parents, 4, 0,
+                       SLCR_DBG_CLK_CTRL, 4, 2, 0, &dbgclk_lock);
+       clk = clk_register_divider(NULL, "dbg_div", "dbg_mux", 0,
+                       SLCR_DBG_CLK_CTRL, 8, 6, CLK_DIVIDER_ONE_BASED |
+                       CLK_DIVIDER_ALLOW_ZERO, &dbgclk_lock);
+       clk = clk_register_mux(NULL, "dbg_emio_mux", dbg_emio_mux_parents, 2, 0,
+                       SLCR_DBG_CLK_CTRL, 6, 1, 0, &dbgclk_lock);
+       clks[dbg_trc] = clk_register_gate(NULL, clk_output_name[dbg_trc],
+                       "dbg_emio_mux", CLK_SET_RATE_PARENT, SLCR_DBG_CLK_CTRL,
+                       0, 0, &dbgclk_lock);
+       clks[dbg_apb] = clk_register_gate(NULL, clk_output_name[dbg_apb],
+                       clk_output_name[cpu_1x], 0, SLCR_DBG_CLK_CTRL, 1, 0,
+                       &dbgclk_lock);
+
+       /* One gated clock for all APER clocks. */
+       clks[dma] = clk_register_gate(NULL, clk_output_name[dma],
+                       clk_output_name[cpu_2x], 0, SLCR_APER_CLK_CTRL, 0, 0,
+                       &aperclk_lock);
+       clks[usb0_aper] = clk_register_gate(NULL, clk_output_name[usb0_aper],
+                       clk_output_name[cpu_1x], 0, SLCR_APER_CLK_CTRL, 2, 0,
+                       &aperclk_lock);
+       clks[usb1_aper] = clk_register_gate(NULL, clk_output_name[usb1_aper],
+                       clk_output_name[cpu_1x], 0, SLCR_APER_CLK_CTRL, 3, 0,
+                       &aperclk_lock);
+       clks[gem0_aper] = clk_register_gate(NULL, clk_output_name[gem0_aper],
+                       clk_output_name[cpu_1x], 0, SLCR_APER_CLK_CTRL, 6, 0,
+                       &aperclk_lock);
+       clks[gem1_aper] = clk_register_gate(NULL, clk_output_name[gem1_aper],
+                       clk_output_name[cpu_1x], 0, SLCR_APER_CLK_CTRL, 7, 0,
+                       &aperclk_lock);
+       clks[sdio0_aper] = clk_register_gate(NULL, clk_output_name[sdio0_aper],
+                       clk_output_name[cpu_1x], 0, SLCR_APER_CLK_CTRL, 10, 0,
+                       &aperclk_lock);
+       clks[sdio1_aper] = clk_register_gate(NULL, clk_output_name[sdio1_aper],
+                       clk_output_name[cpu_1x], 0, SLCR_APER_CLK_CTRL, 11, 0,
+                       &aperclk_lock);
+       clks[spi0_aper] = clk_register_gate(NULL, clk_output_name[spi0_aper],
+                       clk_output_name[cpu_1x], 0, SLCR_APER_CLK_CTRL, 14, 0,
+                       &aperclk_lock);
+       clks[spi1_aper] = clk_register_gate(NULL, clk_output_name[spi1_aper],
+                       clk_output_name[cpu_1x], 0, SLCR_APER_CLK_CTRL, 15, 0,
+                       &aperclk_lock);
+       clks[can0_aper] = clk_register_gate(NULL, clk_output_name[can0_aper],
+                       clk_output_name[cpu_1x], 0, SLCR_APER_CLK_CTRL, 16, 0,
+                       &aperclk_lock);
+       clks[can1_aper] = clk_register_gate(NULL, clk_output_name[can1_aper],
+                       clk_output_name[cpu_1x], 0, SLCR_APER_CLK_CTRL, 17, 0,
+                       &aperclk_lock);
+       clks[i2c0_aper] = clk_register_gate(NULL, clk_output_name[i2c0_aper],
+                       clk_output_name[cpu_1x], 0, SLCR_APER_CLK_CTRL, 18, 0,
+                       &aperclk_lock);
+       clks[i2c1_aper] = clk_register_gate(NULL, clk_output_name[i2c1_aper],
+                       clk_output_name[cpu_1x], 0, SLCR_APER_CLK_CTRL, 19, 0,
+                       &aperclk_lock);
+       clks[uart0_aper] = clk_register_gate(NULL, clk_output_name[uart0_aper],
+                       clk_output_name[cpu_1x], 0, SLCR_APER_CLK_CTRL, 20, 0,
+                       &aperclk_lock);
+       clks[uart1_aper] = clk_register_gate(NULL, clk_output_name[uart1_aper],
+                       clk_output_name[cpu_1x], 0, SLCR_APER_CLK_CTRL, 21, 0,
+                       &aperclk_lock);
+       clks[gpio_aper] = clk_register_gate(NULL, clk_output_name[gpio_aper],
+                       clk_output_name[cpu_1x], 0, SLCR_APER_CLK_CTRL, 22, 0,
+                       &aperclk_lock);
+       clks[lqspi_aper] = clk_register_gate(NULL, clk_output_name[lqspi_aper],
+                       clk_output_name[cpu_1x], 0, SLCR_APER_CLK_CTRL, 23, 0,
+                       &aperclk_lock);
+       clks[smc_aper] = clk_register_gate(NULL, clk_output_name[smc_aper],
+                       clk_output_name[cpu_1x], 0, SLCR_APER_CLK_CTRL, 24, 0,
+                       &aperclk_lock);
+
+       for (i = 0; i < ARRAY_SIZE(clks); i++) {
+               if (IS_ERR(clks[i])) {
+                       pr_err("Zynq clk %d: register failed with %ld\n",
+                              i, PTR_ERR(clks[i]));
+                       BUG();
+               }
+       }
+
+       clk_data.clks = clks;
+       clk_data.clk_num = ARRAY_SIZE(clks);
+       of_clk_add_provider(np, of_clk_src_onecell_get, &clk_data);
+}
+
+CLK_OF_DECLARE(zynq_clkc, "xlnx,ps7-clkc", zynq_clk_setup);
+
+void __init zynq_clock_init(void __iomem *slcr_base)
+{
+       zynq_slcr_base_priv = slcr_base;
+       of_clk_init(NULL);
+}
diff --git a/drivers/clk/zynq/pll.c b/drivers/clk/zynq/pll.c
new file mode 100644 (file)
index 0000000..47e307c
--- /dev/null
@@ -0,0 +1,235 @@
+/*
+ * Zynq PLL driver
+ *
+ *  Copyright (C) 2013 Xilinx
+ *
+ *  Sören Brinkmann <soren.brinkmann@xilinx.com>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License v2 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/>.
+ *
+ */
+#include <linux/clk/zynq.h>
+#include <linux/clk-provider.h>
+#include <linux/slab.h>
+#include <linux/io.h>
+
+/**
+ * struct zynq_pll
+ * @hw:                Handle between common and hardware-specific interfaces
+ * @pll_ctrl:  PLL control register
+ * @pll_status:        PLL status register
+ * @lock:      Register lock
+ * @lockbit:   Indicates the associated PLL_LOCKED bit in the PLL status
+ *             register.
+ */
+struct zynq_pll {
+       struct clk_hw   hw;
+       void __iomem    *pll_ctrl;
+       void __iomem    *pll_status;
+       spinlock_t      *lock;
+       u8              lockbit;
+};
+#define to_zynq_pll(_hw)       container_of(_hw, struct zynq_pll, hw)
+
+/* Register bitfield defines */
+#define PLLCTRL_FBDIV_MASK     0x7f000
+#define PLLCTRL_FBDIV_SHIFT    12
+#define PLLCTRL_BPQUAL_MASK    (1 << 3)
+#define PLLCTRL_PWRDWN_MASK    2
+#define PLLCTRL_PWRDWN_SHIFT   1
+#define PLLCTRL_RESET_MASK     1
+#define PLLCTRL_RESET_SHIFT    0
+
+/**
+ * zynq_pll_round_rate() - Round a clock frequency
+ * @hw:                Handle between common and hardware-specific interfaces
+ * @rate:      Desired clock frequency
+ * @prate:     Clock frequency of parent clock
+ * Returns frequency closest to @rate the hardware can generate.
+ */
+static long zynq_pll_round_rate(struct clk_hw *hw, unsigned long rate,
+               unsigned long *prate)
+{
+       u32 fbdiv;
+
+       fbdiv = DIV_ROUND_CLOSEST(rate, *prate);
+       if (fbdiv < 13)
+               fbdiv = 13;
+       else if (fbdiv > 66)
+               fbdiv = 66;
+
+       return *prate * fbdiv;
+}
+
+/**
+ * zynq_pll_recalc_rate() - Recalculate clock frequency
+ * @hw:                        Handle between common and hardware-specific interfaces
+ * @parent_rate:       Clock frequency of parent clock
+ * Returns current clock frequency.
+ */
+static unsigned long zynq_pll_recalc_rate(struct clk_hw *hw,
+               unsigned long parent_rate)
+{
+       struct zynq_pll *clk = to_zynq_pll(hw);
+       u32 fbdiv;
+
+       /*
+        * makes probably sense to redundantly save fbdiv in the struct
+        * zynq_pll to save the IO access.
+        */
+       fbdiv = (readl(clk->pll_ctrl) & PLLCTRL_FBDIV_MASK) >>
+                       PLLCTRL_FBDIV_SHIFT;
+
+       return parent_rate * fbdiv;
+}
+
+/**
+ * zynq_pll_is_enabled - Check if a clock is enabled
+ * @hw:                Handle between common and hardware-specific interfaces
+ * Returns 1 if the clock is enabled, 0 otherwise.
+ *
+ * Not sure this is a good idea, but since disabled means bypassed for
+ * this clock implementation we say we are always enabled.
+ */
+static int zynq_pll_is_enabled(struct clk_hw *hw)
+{
+       unsigned long flags = 0;
+       u32 reg;
+       struct zynq_pll *clk = to_zynq_pll(hw);
+
+       spin_lock_irqsave(clk->lock, flags);
+
+       reg = readl(clk->pll_ctrl);
+
+       spin_unlock_irqrestore(clk->lock, flags);
+
+       return !(reg & (PLLCTRL_RESET_MASK | PLLCTRL_PWRDWN_MASK));
+}
+
+/**
+ * zynq_pll_enable - Enable clock
+ * @hw:                Handle between common and hardware-specific interfaces
+ * Returns 0 on success
+ */
+static int zynq_pll_enable(struct clk_hw *hw)
+{
+       unsigned long flags = 0;
+       u32 reg;
+       struct zynq_pll *clk = to_zynq_pll(hw);
+
+       if (zynq_pll_is_enabled(hw))
+               return 0;
+
+       pr_info("PLL: enable\n");
+
+       /* Power up PLL and wait for lock */
+       spin_lock_irqsave(clk->lock, flags);
+
+       reg = readl(clk->pll_ctrl);
+       reg &= ~(PLLCTRL_RESET_MASK | PLLCTRL_PWRDWN_MASK);
+       writel(reg, clk->pll_ctrl);
+       while (!(readl(clk->pll_status) & (1 << clk->lockbit)))
+               ;
+
+       spin_unlock_irqrestore(clk->lock, flags);
+
+       return 0;
+}
+
+/**
+ * zynq_pll_disable - Disable clock
+ * @hw:                Handle between common and hardware-specific interfaces
+ * Returns 0 on success
+ */
+static void zynq_pll_disable(struct clk_hw *hw)
+{
+       unsigned long flags = 0;
+       u32 reg;
+       struct zynq_pll *clk = to_zynq_pll(hw);
+
+       if (!zynq_pll_is_enabled(hw))
+               return;
+
+       pr_info("PLL: shutdown\n");
+
+       /* shut down PLL */
+       spin_lock_irqsave(clk->lock, flags);
+
+       reg = readl(clk->pll_ctrl);
+       reg |= PLLCTRL_RESET_MASK | PLLCTRL_PWRDWN_MASK;
+       writel(reg, clk->pll_ctrl);
+
+       spin_unlock_irqrestore(clk->lock, flags);
+}
+
+static const struct clk_ops zynq_pll_ops = {
+       .enable = zynq_pll_enable,
+       .disable = zynq_pll_disable,
+       .is_enabled = zynq_pll_is_enabled,
+       .round_rate = zynq_pll_round_rate,
+       .recalc_rate = zynq_pll_recalc_rate
+};
+
+/**
+ * clk_register_zynq_pll() - Register PLL with the clock framework
+ * @np Pointer to the DT device node
+ */
+struct clk *clk_register_zynq_pll(const char *name, const char *parent,
+               void __iomem *pll_ctrl, void __iomem *pll_status, u8 lock_index,
+               spinlock_t *lock)
+{
+       struct zynq_pll *pll;
+       struct clk *clk;
+       u32 reg;
+       const char *parent_arr[1] = {parent};
+       unsigned long flags = 0;
+       struct clk_init_data initd = {
+               .name = name,
+               .parent_names = parent_arr,
+               .ops = &zynq_pll_ops,
+               .num_parents = 1,
+               .flags = 0
+       };
+
+       pll = kmalloc(sizeof(*pll), GFP_KERNEL);
+       if (!pll) {
+               pr_err("%s: Could not allocate Zynq PLL clk.\n", __func__);
+               return ERR_PTR(-ENOMEM);
+       }
+
+       /* Populate the struct */
+       pll->hw.init = &initd;
+       pll->pll_ctrl = pll_ctrl;
+       pll->pll_status = pll_status;
+       pll->lockbit = lock_index;
+       pll->lock = lock;
+
+       spin_lock_irqsave(pll->lock, flags);
+
+       reg = readl(pll->pll_ctrl);
+       reg &= ~PLLCTRL_BPQUAL_MASK;
+       writel(reg, pll->pll_ctrl);
+
+       spin_unlock_irqrestore(pll->lock, flags);
+
+       clk = clk_register(NULL, &pll->hw);
+       if (WARN_ON(IS_ERR(clk)))
+               goto free_pll;
+
+       return clk;
+
+free_pll:
+       kfree(pll);
+
+       return clk;
+}
index 685bc60e210ad45ae45192376c496e3cfbf73926..4cbe28c74631eaa5ef8df596865db2a92bd02cb7 100644 (file)
@@ -51,6 +51,8 @@
 
 #define TTC_CNT_CNTRL_DISABLE_MASK     0x1
 
+#define TTC_CLK_CNTRL_CSRC_MASK                (1 << 5)        /* clock source */
+
 /*
  * 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
@@ -396,8 +398,9 @@ static void __init ttc_timer_init(struct device_node *timer)
 {
        unsigned int irq;
        void __iomem *timer_baseaddr;
-       struct clk *clk;
+       struct clk *clk_cs, *clk_ce;
        static int initialized;
+       int clksel;
 
        if (initialized)
                return;
@@ -421,14 +424,24 @@ static void __init ttc_timer_init(struct device_node *timer)
                BUG();
        }
 
-       clk = of_clk_get_by_name(timer, "cpu_1x");
-       if (IS_ERR(clk)) {
+       clksel = __raw_readl(timer_baseaddr + TTC_CLK_CNTRL_OFFSET);
+       clksel = !!(clksel & TTC_CLK_CNTRL_CSRC_MASK);
+       clk_cs = of_clk_get(timer, clksel);
+       if (IS_ERR(clk_cs)) {
+               pr_err("ERROR: timer input clock not found\n");
+               BUG();
+       }
+
+       clksel = __raw_readl(timer_baseaddr + 4 + TTC_CLK_CNTRL_OFFSET);
+       clksel = !!(clksel & TTC_CLK_CNTRL_CSRC_MASK);
+       clk_ce = of_clk_get(timer, clksel);
+       if (IS_ERR(clk_ce)) {
                pr_err("ERROR: timer input clock not found\n");
                BUG();
        }
 
-       ttc_setup_clocksource(clk, timer_baseaddr);
-       ttc_setup_clockevent(clk, timer_baseaddr + 4, irq);
+       ttc_setup_clocksource(clk_cs, timer_baseaddr);
+       ttc_setup_clockevent(clk_ce, timer_baseaddr + 4, irq);
 
        pr_info("%s #0 at %p, irq=%d\n", timer->name, timer_baseaddr, irq);
 }
index 223379169cb08d01907906919882da5941cd1843..0e6e408c0a630b71c466f3fabaa7decd1b97fed0 100644 (file)
 extern void highbank_set_cpu_jump(int cpu, void *jump_addr);
 extern void *scu_base_addr;
 
-static inline unsigned int get_auxcr(void)
-{
-       unsigned int val;
-       asm("mrc p15, 0, %0, c1, c0, 1  @ get AUXCR" : "=r" (val) : : "cc");
-       return val;
-}
-
-static inline void set_auxcr(unsigned int val)
-{
-       asm volatile("mcr p15, 0, %0, c1, c0, 1 @ set AUXCR"
-         : : "r" (val) : "cc");
-       isb();
-}
-
 static noinline void calxeda_idle_restore(void)
 {
        set_cr(get_cr() | CR_C);
index 3b23061cdb41bd0e963a5160bb4fbd7edf62de2d..9bfaddd57ef1ab80c301a7d38b8c40e898e047c1 100644 (file)
@@ -22,6 +22,7 @@
 #include <linux/uaccess.h>
 #include <linux/debugfs.h>
 #include <linux/platform_data/dma-coh901318.h>
+#include <linux/of_dma.h>
 
 #include "coh901318.h"
 #include "dmaengine.h"
@@ -1788,6 +1789,35 @@ bool coh901318_filter_id(struct dma_chan *chan, void *chan_id)
 }
 EXPORT_SYMBOL(coh901318_filter_id);
 
+struct coh901318_filter_args {
+       struct coh901318_base *base;
+       unsigned int ch_nr;
+};
+
+static bool coh901318_filter_base_and_id(struct dma_chan *chan, void *data)
+{
+       struct coh901318_filter_args *args = data;
+
+       if (&args->base->dma_slave == chan->device &&
+           args->ch_nr == to_coh901318_chan(chan)->id)
+               return true;
+
+       return false;
+}
+
+static struct dma_chan *coh901318_xlate(struct of_phandle_args *dma_spec,
+                                       struct of_dma *ofdma)
+{
+       struct coh901318_filter_args args = {
+               .base = ofdma->of_dma_data,
+               .ch_nr = dma_spec->args[0],
+       };
+       dma_cap_mask_t cap;
+       dma_cap_zero(cap);
+       dma_cap_set(DMA_SLAVE, cap);
+
+       return dma_request_channel(cap, coh901318_filter_base_and_id, &args);
+}
 /*
  * DMA channel allocation
  */
@@ -2735,12 +2765,19 @@ static int __init coh901318_probe(struct platform_device *pdev)
        if (err)
                goto err_register_memcpy;
 
+       err = of_dma_controller_register(pdev->dev.of_node, coh901318_xlate,
+                                        base);
+       if (err)
+               goto err_register_of_dma;
+
        platform_set_drvdata(pdev, base);
        dev_info(&pdev->dev, "Initialized COH901318 DMA on virtual base 0x%08x\n",
                (u32) base->virtbase);
 
        return err;
 
+ err_register_of_dma:
+       dma_async_device_unregister(&base->dma_memcpy);
  err_register_memcpy:
        dma_async_device_unregister(&base->dma_slave);
  err_register_slave:
@@ -2752,17 +2789,23 @@ static int coh901318_remove(struct platform_device *pdev)
 {
        struct coh901318_base *base = platform_get_drvdata(pdev);
 
+       of_dma_controller_free(pdev->dev.of_node);
        dma_async_device_unregister(&base->dma_memcpy);
        dma_async_device_unregister(&base->dma_slave);
        coh901318_pool_destroy(&base->pool);
        return 0;
 }
 
+static const struct of_device_id coh901318_dt_match[] = {
+       { .compatible = "stericsson,coh901318" },
+       {},
+};
 
 static struct platform_driver coh901318_driver = {
        .remove = coh901318_remove,
        .driver = {
                .name   = "coh901318",
+               .of_match_table = coh901318_dt_match,
        },
 };
 
index cd7e3280fadd121e9dfbd13fef93212c4b217435..5f3e532436ee40c5f035b4c9bd6b2b008700b350 100644 (file)
@@ -24,7 +24,7 @@
 #include <linux/slab.h>
 #include <linux/spinlock.h>
 
-#include <mach/edma.h>
+#include <linux/platform_data/edma.h>
 
 #include "dmaengine.h"
 #include "virt-dma.h"
index 573c449c49b9138a69f8aaf9a999e8a41898d2e1..23d1d0155bb3053eae7effa0524b9dc5699a834b 100644 (file)
@@ -109,8 +109,11 @@ config GPIO_MAX730X
 comment "Memory mapped GPIO drivers:"
 
 config GPIO_CLPS711X
-       def_bool y
+       tristate "CLPS711X GPIO support"
        depends on ARCH_CLPS711X
+       select GPIO_GENERIC
+       help
+         Say yes here to support GPIO on CLPS711X SoCs.
 
 config GPIO_GENERIC_PLATFORM
        tristate "Generic memory-mapped GPIO controller support (MMIO platform device)"
index ce63b75b13f5ae1eb9869d499862668222b8a2fe..0edaf2ce92663557a7e4a67dc5cf9364c1ef6716 100644 (file)
@@ -1,7 +1,7 @@
 /*
  *  CLPS711X GPIO driver
  *
- *  Copyright (C) 2012 Alexander Shiyan <shc_work@mail.ru>
+ *  Copyright (C) 2012,2013 Alexander Shiyan <shc_work@mail.ru>
  *
  * 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
  * (at your option) any later version.
  */
 
-#include <linux/io.h>
-#include <linux/slab.h>
+#include <linux/err.h>
 #include <linux/gpio.h>
 #include <linux/module.h>
-#include <linux/spinlock.h>
+#include <linux/basic_mmio_gpio.h>
 #include <linux/platform_device.h>
 
-#include <mach/hardware.h>
-
-#define CLPS711X_GPIO_PORTS    5
-#define CLPS711X_GPIO_NAME     "gpio-clps711x"
-
-struct clps711x_gpio {
-       struct gpio_chip        chip[CLPS711X_GPIO_PORTS];
-       spinlock_t              lock;
-};
-
-static void __iomem *clps711x_ports[] = {
-       CLPS711X_VIRT_BASE + PADR,
-       CLPS711X_VIRT_BASE + PBDR,
-       CLPS711X_VIRT_BASE + PCDR,
-       CLPS711X_VIRT_BASE + PDDR,
-       CLPS711X_VIRT_BASE + PEDR,
-};
-
-static void __iomem *clps711x_pdirs[] = {
-       CLPS711X_VIRT_BASE + PADDR,
-       CLPS711X_VIRT_BASE + PBDDR,
-       CLPS711X_VIRT_BASE + PCDDR,
-       CLPS711X_VIRT_BASE + PDDDR,
-       CLPS711X_VIRT_BASE + PEDDR,
-};
-
-#define clps711x_port(x)       clps711x_ports[x->base / 8]
-#define clps711x_pdir(x)       clps711x_pdirs[x->base / 8]
-
-static int gpio_clps711x_get(struct gpio_chip *chip, unsigned offset)
+static int clps711x_gpio_probe(struct platform_device *pdev)
 {
-       return !!(readb(clps711x_port(chip)) & (1 << offset));
-}
+       struct device_node *np = pdev->dev.of_node;
+       void __iomem *dat, *dir;
+       struct bgpio_chip *bgc;
+       struct resource *res;
+       int err, id = np ? of_alias_get_id(np, "gpio") : pdev->id;
 
-static void gpio_clps711x_set(struct gpio_chip *chip, unsigned offset,
-                             int value)
-{
-       int tmp;
-       unsigned long flags;
-       struct clps711x_gpio *gpio = dev_get_drvdata(chip->dev);
-
-       spin_lock_irqsave(&gpio->lock, flags);
-       tmp = readb(clps711x_port(chip)) & ~(1 << offset);
-       if (value)
-               tmp |= 1 << offset;
-       writeb(tmp, clps711x_port(chip));
-       spin_unlock_irqrestore(&gpio->lock, flags);
-}
-
-static int gpio_clps711x_dir_in(struct gpio_chip *chip, unsigned offset)
-{
-       int tmp;
-       unsigned long flags;
-       struct clps711x_gpio *gpio = dev_get_drvdata(chip->dev);
+       if ((id < 0) || (id > 4))
+               return -ENODEV;
 
-       spin_lock_irqsave(&gpio->lock, flags);
-       tmp = readb(clps711x_pdir(chip)) & ~(1 << offset);
-       writeb(tmp, clps711x_pdir(chip));
-       spin_unlock_irqrestore(&gpio->lock, flags);
+       bgc = devm_kzalloc(&pdev->dev, sizeof(*bgc), GFP_KERNEL);
+       if (!bgc)
+               return -ENOMEM;
 
-       return 0;
-}
+       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       dat = devm_ioremap_resource(&pdev->dev, res);
+       if (IS_ERR(dat))
+               return PTR_ERR(dat);
+
+       res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
+       dir = devm_ioremap_resource(&pdev->dev, res);
+       if (IS_ERR(dir))
+               return PTR_ERR(dir);
+
+       switch (id) {
+       case 3:
+               /* PORTD is inverted logic for direction register */
+               err = bgpio_init(bgc, &pdev->dev, 1, dat, NULL, NULL,
+                                NULL, dir, 0);
+               break;
+       default:
+               err = bgpio_init(bgc, &pdev->dev, 1, dat, NULL, NULL,
+                                dir, NULL, 0);
+               break;
+       }
 
-static int gpio_clps711x_dir_out(struct gpio_chip *chip, unsigned offset,
-                                int value)
-{
-       int tmp;
-       unsigned long flags;
-       struct clps711x_gpio *gpio = dev_get_drvdata(chip->dev);
-
-       spin_lock_irqsave(&gpio->lock, flags);
-       tmp = readb(clps711x_pdir(chip)) | (1 << offset);
-       writeb(tmp, clps711x_pdir(chip));
-       tmp = readb(clps711x_port(chip)) & ~(1 << offset);
-       if (value)
-               tmp |= 1 << offset;
-       writeb(tmp, clps711x_port(chip));
-       spin_unlock_irqrestore(&gpio->lock, flags);
-
-       return 0;
-}
+       if (err)
+               return err;
 
-static int gpio_clps711x_dir_in_inv(struct gpio_chip *chip, unsigned offset)
-{
-       int tmp;
-       unsigned long flags;
-       struct clps711x_gpio *gpio = dev_get_drvdata(chip->dev);
+       switch (id) {
+       case 4:
+               /* PORTE is 3 lines only */
+               bgc->gc.ngpio = 3;
+               break;
+       default:
+               break;
+       }
 
-       spin_lock_irqsave(&gpio->lock, flags);
-       tmp = readb(clps711x_pdir(chip)) | (1 << offset);
-       writeb(tmp, clps711x_pdir(chip));
-       spin_unlock_irqrestore(&gpio->lock, flags);
+       bgc->gc.base = id * 8;
+       platform_set_drvdata(pdev, bgc);
 
-       return 0;
+       return gpiochip_add(&bgc->gc);
 }
 
-static int gpio_clps711x_dir_out_inv(struct gpio_chip *chip, unsigned offset,
-                                    int value)
+static int clps711x_gpio_remove(struct platform_device *pdev)
 {
-       int tmp;
-       unsigned long flags;
-       struct clps711x_gpio *gpio = dev_get_drvdata(chip->dev);
-
-       spin_lock_irqsave(&gpio->lock, flags);
-       tmp = readb(clps711x_pdir(chip)) & ~(1 << offset);
-       writeb(tmp, clps711x_pdir(chip));
-       tmp = readb(clps711x_port(chip)) & ~(1 << offset);
-       if (value)
-               tmp |= 1 << offset;
-       writeb(tmp, clps711x_port(chip));
-       spin_unlock_irqrestore(&gpio->lock, flags);
-
-       return 0;
+       struct bgpio_chip *bgc = platform_get_drvdata(pdev);
+
+       return bgpio_remove(bgc);
 }
 
-static struct {
-       char    *name;
-       int     nr;
-       int     inv_dir;
-} clps711x_gpio_ports[] __initconst = {
-       { "PORTA", 8, 0, },
-       { "PORTB", 8, 0, },
-       { "PORTC", 8, 0, },
-       { "PORTD", 8, 1, },
-       { "PORTE", 3, 0, },
+static const struct of_device_id clps711x_gpio_ids[] = {
+       { .compatible = "cirrus,clps711x-gpio" },
+       { }
 };
+MODULE_DEVICE_TABLE(of, clps711x_gpio_ids);
+
+static struct platform_driver clps711x_gpio_driver = {
+       .driver = {
+               .name           = "clps711x-gpio",
+               .owner          = THIS_MODULE,
+               .of_match_table = of_match_ptr(clps711x_gpio_ids),
+       },
+       .probe  = clps711x_gpio_probe,
+       .remove = clps711x_gpio_remove,
+};
+module_platform_driver(clps711x_gpio_driver);
 
-static int __init gpio_clps711x_init(void)
-{
-       int i;
-       struct platform_device *pdev;
-       struct clps711x_gpio *gpio;
-
-       pdev = platform_device_alloc(CLPS711X_GPIO_NAME, 0);
-       if (!pdev) {
-               pr_err("Cannot create platform device: %s\n",
-                      CLPS711X_GPIO_NAME);
-               return -ENOMEM;
-       }
-
-       platform_device_add(pdev);
-
-       gpio = devm_kzalloc(&pdev->dev, sizeof(struct clps711x_gpio),
-                           GFP_KERNEL);
-       if (!gpio) {
-               dev_err(&pdev->dev, "GPIO allocating memory error\n");
-               platform_device_unregister(pdev);
-               return -ENOMEM;
-       }
-
-       platform_set_drvdata(pdev, gpio);
-
-       spin_lock_init(&gpio->lock);
-
-       for (i = 0; i < CLPS711X_GPIO_PORTS; i++) {
-               gpio->chip[i].owner             = THIS_MODULE;
-               gpio->chip[i].dev               = &pdev->dev;
-               gpio->chip[i].label             = clps711x_gpio_ports[i].name;
-               gpio->chip[i].base              = i * 8;
-               gpio->chip[i].ngpio             = clps711x_gpio_ports[i].nr;
-               gpio->chip[i].get               = gpio_clps711x_get;
-               gpio->chip[i].set               = gpio_clps711x_set;
-               if (!clps711x_gpio_ports[i].inv_dir) {
-                       gpio->chip[i].direction_input = gpio_clps711x_dir_in;
-                       gpio->chip[i].direction_output = gpio_clps711x_dir_out;
-               } else {
-                       gpio->chip[i].direction_input = gpio_clps711x_dir_in_inv;
-                       gpio->chip[i].direction_output = gpio_clps711x_dir_out_inv;
-               }
-               WARN_ON(gpiochip_add(&gpio->chip[i]));
-       }
-
-       dev_info(&pdev->dev, "GPIO driver initialized\n");
-
-       return 0;
-}
-arch_initcall(gpio_clps711x_init);
-
-MODULE_LICENSE("GPL v2");
+MODULE_LICENSE("GPL");
 MODULE_AUTHOR("Alexander Shiyan <shc_work@mail.ru>");
 MODULE_DESCRIPTION("CLPS711X GPIO driver");
index b4ca450947b8f4b8f041c35ddfb9e21dde797487..d173d56dbb8c5790ecc77d0718a438947b1867d9 100644 (file)
@@ -49,6 +49,7 @@ struct gpio_rcar_priv {
 #define POSNEG 0x20
 #define EDGLEVEL 0x24
 #define FILONOFF 0x28
+#define BOTHEDGE 0x4c
 
 static inline u32 gpio_rcar_read(struct gpio_rcar_priv *p, int offs)
 {
@@ -91,7 +92,8 @@ static void gpio_rcar_irq_enable(struct irq_data *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)
+                                                 bool level_trigger,
+                                                 bool both)
 {
        unsigned long flags;
 
@@ -108,6 +110,10 @@ static void gpio_rcar_config_interrupt_input_mode(struct gpio_rcar_priv *p,
        /* Configure edge or level trigger in EDGLEVEL */
        gpio_rcar_modify_bit(p, EDGLEVEL, hwirq, !level_trigger);
 
+       /* Select one edge or both edges in BOTHEDGE */
+       if (p->config.has_both_edge_trigger)
+               gpio_rcar_modify_bit(p, BOTHEDGE, hwirq, both);
+
        /* Select "Interrupt Input Mode" in IOINTSEL */
        gpio_rcar_modify_bit(p, IOINTSEL, hwirq, true);
 
@@ -127,16 +133,26 @@ static int gpio_rcar_irq_set_type(struct irq_data *d, unsigned int type)
 
        switch (type & IRQ_TYPE_SENSE_MASK) {
        case IRQ_TYPE_LEVEL_HIGH:
-               gpio_rcar_config_interrupt_input_mode(p, hwirq, true, true);
+               gpio_rcar_config_interrupt_input_mode(p, hwirq, true, true,
+                                                     false);
                break;
        case IRQ_TYPE_LEVEL_LOW:
-               gpio_rcar_config_interrupt_input_mode(p, hwirq, false, true);
+               gpio_rcar_config_interrupt_input_mode(p, hwirq, false, true,
+                                                     false);
                break;
        case IRQ_TYPE_EDGE_RISING:
-               gpio_rcar_config_interrupt_input_mode(p, hwirq, true, false);
+               gpio_rcar_config_interrupt_input_mode(p, hwirq, true, false,
+                                                     false);
                break;
        case IRQ_TYPE_EDGE_FALLING:
-               gpio_rcar_config_interrupt_input_mode(p, hwirq, false, false);
+               gpio_rcar_config_interrupt_input_mode(p, hwirq, false, false,
+                                                     false);
+               break;
+       case IRQ_TYPE_EDGE_BOTH:
+               if (!p->config.has_both_edge_trigger)
+                       return -EINVAL;
+               gpio_rcar_config_interrupt_input_mode(p, hwirq, true, false,
+                                                     true);
                break;
        default:
                return -EINVAL;
@@ -333,7 +349,7 @@ static int gpio_rcar_probe(struct platform_device *pdev)
        }
 
        if (devm_request_irq(&pdev->dev, irq->start,
-                            gpio_rcar_irq_handler, 0, name, p)) {
+                            gpio_rcar_irq_handler, IRQF_SHARED, name, p)) {
                dev_err(&pdev->dev, "failed to request IRQ\n");
                ret = -ENOENT;
                goto err1;
index 0a6f941133f66d3cce251403e606088db7fb326c..d1a6b204af00856748b67e7d42253ebb7c849e3f 100644 (file)
@@ -17,6 +17,7 @@
 #include <linux/clk.h>
 #include <linux/io.h>
 #include <linux/slab.h>
+#include <linux/of_i2c.h>
 
 /* the name of this kernel module */
 #define NAME "stu300"
@@ -867,7 +868,6 @@ stu300_probe(struct platform_device *pdev)
        struct resource *res;
        int bus_nr;
        int ret = 0;
-       char clk_name[] = "I2C0";
 
        dev = devm_kzalloc(&pdev->dev, sizeof(struct stu300_dev), GFP_KERNEL);
        if (!dev) {
@@ -876,8 +876,7 @@ stu300_probe(struct platform_device *pdev)
        }
 
        bus_nr = pdev->id;
-       clk_name[3] += (char)bus_nr;
-       dev->clk = devm_clk_get(&pdev->dev, clk_name);
+       dev->clk = devm_clk_get(&pdev->dev, NULL);
        if (IS_ERR(dev->clk)) {
                dev_err(&pdev->dev, "could not retrieve i2c bus clock\n");
                return PTR_ERR(dev->clk);
@@ -923,6 +922,7 @@ stu300_probe(struct platform_device *pdev)
        adap->nr = bus_nr;
        adap->algo = &stu300_algo;
        adap->dev.parent = &pdev->dev;
+       adap->dev.of_node = pdev->dev.of_node;
        i2c_set_adapdata(adap, dev);
 
        /* i2c device drivers may be active on return from add_adapter() */
@@ -934,6 +934,10 @@ stu300_probe(struct platform_device *pdev)
        }
 
        platform_set_drvdata(pdev, dev);
+       dev_info(&pdev->dev, "ST DDC I2C @ %p, irq %d\n",
+                dev->virtbase, dev->irq);
+       of_i2c_register_devices(adap);
+
        return 0;
 }
 
@@ -978,11 +982,17 @@ stu300_remove(struct platform_device *pdev)
        return 0;
 }
 
+static const struct of_device_id stu300_dt_match[] = {
+       { .compatible = "st,ddci2c" },
+       {},
+};
+
 static struct platform_driver stu300_i2c_driver = {
        .driver = {
                .name   = NAME,
                .owner  = THIS_MODULE,
                .pm     = STU300_I2C_PM,
+               .of_match_table = stu300_dt_match,
        },
        .remove         = __exit_p(stu300_remove),
 
index 962a6e17a01a1f75a3e783a94f4eb0d126273b60..1a31512369f9a4e9ef0b8b7a36853301d0c80a09 100644 (file)
@@ -159,6 +159,9 @@ static int syscon_probe(struct platform_device *pdev)
 
 static const struct platform_device_id syscon_ids[] = {
        { "syscon", },
+#ifdef CONFIG_ARCH_CLPS711X
+       { "clps711x-syscon", },
+#endif
        { }
 };
 
index 3946a0eb3a0345995b9f292816fdf53825c6d650..5dfb70c669dcb47f4d44888092e26a2c3d1b55de 100644 (file)
@@ -37,6 +37,7 @@
 #include <linux/of.h>
 #include <linux/of_device.h>
 
+#include <linux/platform_data/edma.h>
 #include <linux/platform_data/mmc-davinci.h>
 
 /*
index bed9d58d5741246f58bafe178851e8faf42744e2..8b27ca054c59ba1d4e2ee5bd20cfd600dce79afa 100644 (file)
@@ -297,13 +297,6 @@ config MTD_IXP4XX
          IXDP425 and Coyote. If you have an IXP4xx based board and
          would like to use the flash chips on it, say 'Y'.
 
-config MTD_AUTCPU12
-       bool "NV-RAM mapping AUTCPU12 board"
-       depends on ARCH_AUTCPU12
-       help
-         This enables access to the NV-RAM on autronix autcpu12 board.
-         If you have such a board, say 'Y'.
-
 config MTD_IMPA7
        tristate "JEDEC Flash device mapped on impA7"
        depends on ARM && MTD_JEDECPROBE
index 395a12444048e6f2c7fbaa64d028be488551e187..9fdbd4ba64419f45576e0833470680f0d4194003 100644 (file)
@@ -32,7 +32,6 @@ obj-$(CONFIG_MTD_VMAX)                += vmax301.o
 obj-$(CONFIG_MTD_SCx200_DOCFLASH)+= scx200_docflash.o
 obj-$(CONFIG_MTD_SOLUTIONENGINE)+= solutionengine.o
 obj-$(CONFIG_MTD_PCI)          += pci.o
-obj-$(CONFIG_MTD_AUTCPU12)     += autcpu12-nvram.o
 obj-$(CONFIG_MTD_IMPA7)                += impa7.o
 obj-$(CONFIG_MTD_UCLINUX)      += uclinux.o
 obj-$(CONFIG_MTD_NETtel)       += nettel.o
diff --git a/drivers/mtd/maps/autcpu12-nvram.c b/drivers/mtd/maps/autcpu12-nvram.c
deleted file mode 100644 (file)
index c3525d2..0000000
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- * NV-RAM memory access on autcpu12
- * (C) 2002 Thomas Gleixner (gleixner@autronix.de)
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * 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/err.h>
-#include <linux/sizes.h>
-
-#include <linux/types.h>
-#include <linux/kernel.h>
-#include <linux/init.h>
-#include <linux/device.h>
-#include <linux/module.h>
-#include <linux/platform_device.h>
-
-#include <linux/mtd/mtd.h>
-#include <linux/mtd/map.h>
-
-struct autcpu12_nvram_priv {
-       struct mtd_info *mtd;
-       struct map_info map;
-};
-
-static int autcpu12_nvram_probe(struct platform_device *pdev)
-{
-       map_word tmp, save0, save1;
-       struct resource *res;
-       struct autcpu12_nvram_priv *priv;
-
-       priv = devm_kzalloc(&pdev->dev,
-                           sizeof(struct autcpu12_nvram_priv), GFP_KERNEL);
-       if (!priv)
-               return -ENOMEM;
-
-       platform_set_drvdata(pdev, priv);
-
-       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       if (!res) {
-               dev_err(&pdev->dev, "failed to get memory resource\n");
-               return -ENOENT;
-       }
-
-       priv->map.bankwidth     = 4;
-       priv->map.phys          = res->start;
-       priv->map.size          = resource_size(res);
-       priv->map.virt = devm_ioremap_resource(&pdev->dev, res);
-       strcpy((char *)priv->map.name, res->name);
-       if (IS_ERR(priv->map.virt))
-               return PTR_ERR(priv->map.virt);
-
-       simple_map_init(&priv->map);
-
-       /*
-        * Check for 32K/128K
-        * read ofs 0
-        * read ofs 0x10000
-        * Write complement to ofs 0x100000
-        * Read and check result on ofs 0x0
-        * Restore contents
-        */
-       save0 = map_read(&priv->map, 0);
-       save1 = map_read(&priv->map, 0x10000);
-       tmp.x[0] = ~save0.x[0];
-       map_write(&priv->map, tmp, 0x10000);
-       tmp = map_read(&priv->map, 0);
-       /* if we find this pattern on 0x0, we have 32K size */
-       if (!map_word_equal(&priv->map, tmp, save0)) {
-               map_write(&priv->map, save0, 0x0);
-               priv->map.size = SZ_32K;
-       } else
-               map_write(&priv->map, save1, 0x10000);
-
-       priv->mtd = do_map_probe("map_ram", &priv->map);
-       if (!priv->mtd) {
-               dev_err(&pdev->dev, "probing failed\n");
-               return -ENXIO;
-       }
-
-       priv->mtd->owner        = THIS_MODULE;
-       priv->mtd->erasesize    = 16;
-       priv->mtd->dev.parent   = &pdev->dev;
-       if (!mtd_device_register(priv->mtd, NULL, 0)) {
-               dev_info(&pdev->dev,
-                        "NV-RAM device size %ldKiB registered on AUTCPU12\n",
-                        priv->map.size / SZ_1K);
-               return 0;
-       }
-
-       map_destroy(priv->mtd);
-       dev_err(&pdev->dev, "NV-RAM device addition failed\n");
-       return -ENOMEM;
-}
-
-static int autcpu12_nvram_remove(struct platform_device *pdev)
-{
-       struct autcpu12_nvram_priv *priv = platform_get_drvdata(pdev);
-
-       mtd_device_unregister(priv->mtd);
-       map_destroy(priv->mtd);
-
-       return 0;
-}
-
-static struct platform_driver autcpu12_nvram_driver = {
-       .driver         = {
-               .name   = "autcpu12_nvram",
-               .owner  = THIS_MODULE,
-       },
-       .probe          = autcpu12_nvram_probe,
-       .remove         = autcpu12_nvram_remove,
-};
-module_platform_driver(autcpu12_nvram_driver);
-
-MODULE_AUTHOR("Thomas Gleixner");
-MODULE_DESCRIPTION("autcpu12 NVRAM map driver");
-MODULE_LICENSE("GPL");
index 04da786c84d2451b79be8bcbcb61c469030f977e..fdd0636a987d1fe9165c0d4917d86efc8cce40c3 100644 (file)
@@ -227,6 +227,73 @@ int of_pci_address_to_resource(struct device_node *dev, int bar,
        return __of_address_to_resource(dev, addrp, size, flags, NULL, r);
 }
 EXPORT_SYMBOL_GPL(of_pci_address_to_resource);
+
+int of_pci_range_parser_init(struct of_pci_range_parser *parser,
+                               struct device_node *node)
+{
+       const int na = 3, ns = 2;
+       int rlen;
+
+       parser->node = node;
+       parser->pna = of_n_addr_cells(node);
+       parser->np = parser->pna + na + ns;
+
+       parser->range = of_get_property(node, "ranges", &rlen);
+       if (parser->range == NULL)
+               return -ENOENT;
+
+       parser->end = parser->range + rlen / sizeof(__be32);
+
+       return 0;
+}
+EXPORT_SYMBOL_GPL(of_pci_range_parser_init);
+
+struct of_pci_range *of_pci_range_parser_one(struct of_pci_range_parser *parser,
+                                               struct of_pci_range *range)
+{
+       const int na = 3, ns = 2;
+
+       if (!range)
+               return NULL;
+
+       if (!parser->range || parser->range + parser->np > parser->end)
+               return NULL;
+
+       range->pci_space = parser->range[0];
+       range->flags = of_bus_pci_get_flags(parser->range);
+       range->pci_addr = of_read_number(parser->range + 1, ns);
+       range->cpu_addr = of_translate_address(parser->node,
+                               parser->range + na);
+       range->size = of_read_number(parser->range + parser->pna + na, ns);
+
+       parser->range += parser->np;
+
+       /* Now consume following elements while they are contiguous */
+       while (parser->range + parser->np <= parser->end) {
+               u32 flags, pci_space;
+               u64 pci_addr, cpu_addr, size;
+
+               pci_space = be32_to_cpup(parser->range);
+               flags = of_bus_pci_get_flags(parser->range);
+               pci_addr = of_read_number(parser->range + 1, ns);
+               cpu_addr = of_translate_address(parser->node,
+                               parser->range + na);
+               size = of_read_number(parser->range + parser->pna + na, ns);
+
+               if (flags != range->flags)
+                       break;
+               if (pci_addr != range->pci_addr + range->size ||
+                   cpu_addr != range->cpu_addr + range->size)
+                       break;
+
+               range->size += size;
+               parser->range += parser->np;
+       }
+
+       return range;
+}
+EXPORT_SYMBOL_GPL(of_pci_range_parser_one);
+
 #endif /* CONFIG_PCI */
 
 /*
index 13e37e2d8ec16ba8b4179198cfbf759015628da9..42c687a820ac3bedcb0eae90b64e8c4911509d09 100644 (file)
@@ -5,14 +5,15 @@
 #include <asm/prom.h>
 
 static inline int __of_pci_pci_compare(struct device_node *node,
-                                      unsigned int devfn)
+                                      unsigned int data)
 {
-       unsigned int size;
-       const __be32 *reg = of_get_property(node, "reg", &size);
+       int devfn;
 
-       if (!reg || size < 5 * sizeof(__be32))
+       devfn = of_pci_get_devfn(node);
+       if (devfn < 0)
                return 0;
-       return ((be32_to_cpup(&reg[0]) >> 8) & 0xff) == devfn;
+
+       return devfn == data;
 }
 
 struct device_node *of_pci_find_child_device(struct device_node *parent,
@@ -40,3 +41,51 @@ struct device_node *of_pci_find_child_device(struct device_node *parent,
        return NULL;
 }
 EXPORT_SYMBOL_GPL(of_pci_find_child_device);
+
+/**
+ * of_pci_get_devfn() - Get device and function numbers for a device node
+ * @np: device node
+ *
+ * Parses a standard 5-cell PCI resource and returns an 8-bit value that can
+ * be passed to the PCI_SLOT() and PCI_FUNC() macros to extract the device
+ * and function numbers respectively. On error a negative error code is
+ * returned.
+ */
+int of_pci_get_devfn(struct device_node *np)
+{
+       unsigned int size;
+       const __be32 *reg;
+
+       reg = of_get_property(np, "reg", &size);
+
+       if (!reg || size < 5 * sizeof(__be32))
+               return -EINVAL;
+
+       return (be32_to_cpup(reg) >> 8) & 0xff;
+}
+EXPORT_SYMBOL_GPL(of_pci_get_devfn);
+
+/**
+ * of_pci_parse_bus_range() - parse the bus-range property of a PCI device
+ * @node: device node
+ * @res: address to a struct resource to return the bus-range
+ *
+ * Returns 0 on success or a negative error-code on failure.
+ */
+int of_pci_parse_bus_range(struct device_node *node, struct resource *res)
+{
+       const __be32 *values;
+       int len;
+
+       values = of_get_property(node, "bus-range", &len);
+       if (!values || len < sizeof(*values) * 2)
+               return -EINVAL;
+
+       res->name = node->name;
+       res->start = be32_to_cpup(values++);
+       res->end = be32_to_cpup(values);
+       res->flags = IORESOURCE_BUS;
+
+       return 0;
+}
+EXPORT_SYMBOL_GPL(of_pci_parse_bus_range);
index 6d51aa68ec7a635dc85e7e533d1de8ba0c0674ed..ac45398ebb8e96e1422dfea5dd2c63474343d26b 100644 (file)
@@ -119,3 +119,5 @@ config PCI_IOAPIC
 config PCI_LABEL
        def_bool y if (DMI || ACPI)
        select NLS
+
+source "drivers/pci/host/Kconfig"
index 0c3efcffa83b4c7cfdfb591402cdf0165935477d..6ebf5bf8e7a7d149fa8c091ed4071ba1b7e6af69 100644 (file)
@@ -67,3 +67,6 @@ obj-$(CONFIG_XEN_PCIDEV_FRONTEND) += xen-pcifront.o
 obj-$(CONFIG_OF) += of.o
 
 ccflags-$(CONFIG_PCI_DEBUG) := -DDEBUG
+
+# PCI host controller drivers
+obj-y += host/
diff --git a/drivers/pci/host/Kconfig b/drivers/pci/host/Kconfig
new file mode 100644 (file)
index 0000000..1f1d67f
--- /dev/null
@@ -0,0 +1,8 @@
+menu "PCI host controller drivers"
+       depends on PCI
+
+config PCI_MVEBU
+       bool "Marvell EBU PCIe controller"
+       depends on ARCH_MVEBU || ARCH_KIRKWOOD
+
+endmenu
diff --git a/drivers/pci/host/Makefile b/drivers/pci/host/Makefile
new file mode 100644 (file)
index 0000000..5ea2d8b
--- /dev/null
@@ -0,0 +1 @@
+obj-$(CONFIG_PCI_MVEBU) += pci-mvebu.o
diff --git a/drivers/pci/host/pci-mvebu.c b/drivers/pci/host/pci-mvebu.c
new file mode 100644 (file)
index 0000000..13a633b
--- /dev/null
@@ -0,0 +1,914 @@
+/*
+ * PCIe driver for Marvell Armada 370 and Armada XP SoCs
+ *
+ * This file is licensed under the terms of the GNU General Public
+ * License version 2.  This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+ */
+
+#include <linux/kernel.h>
+#include <linux/pci.h>
+#include <linux/clk.h>
+#include <linux/module.h>
+#include <linux/mbus.h>
+#include <linux/slab.h>
+#include <linux/platform_device.h>
+#include <linux/of_address.h>
+#include <linux/of_pci.h>
+#include <linux/of_irq.h>
+#include <linux/of_platform.h>
+
+/*
+ * PCIe unit register offsets.
+ */
+#define PCIE_DEV_ID_OFF                0x0000
+#define PCIE_CMD_OFF           0x0004
+#define PCIE_DEV_REV_OFF       0x0008
+#define PCIE_BAR_LO_OFF(n)     (0x0010 + ((n) << 3))
+#define PCIE_BAR_HI_OFF(n)     (0x0014 + ((n) << 3))
+#define PCIE_HEADER_LOG_4_OFF  0x0128
+#define PCIE_BAR_CTRL_OFF(n)   (0x1804 + (((n) - 1) * 4))
+#define PCIE_WIN04_CTRL_OFF(n) (0x1820 + ((n) << 4))
+#define PCIE_WIN04_BASE_OFF(n) (0x1824 + ((n) << 4))
+#define PCIE_WIN04_REMAP_OFF(n)        (0x182c + ((n) << 4))
+#define PCIE_WIN5_CTRL_OFF     0x1880
+#define PCIE_WIN5_BASE_OFF     0x1884
+#define PCIE_WIN5_REMAP_OFF    0x188c
+#define PCIE_CONF_ADDR_OFF     0x18f8
+#define  PCIE_CONF_ADDR_EN             0x80000000
+#define  PCIE_CONF_REG(r)              ((((r) & 0xf00) << 16) | ((r) & 0xfc))
+#define  PCIE_CONF_BUS(b)              (((b) & 0xff) << 16)
+#define  PCIE_CONF_DEV(d)              (((d) & 0x1f) << 11)
+#define  PCIE_CONF_FUNC(f)             (((f) & 0x7) << 8)
+#define  PCIE_CONF_ADDR(bus, devfn, where) \
+       (PCIE_CONF_BUS(bus) | PCIE_CONF_DEV(PCI_SLOT(devfn))    | \
+        PCIE_CONF_FUNC(PCI_FUNC(devfn)) | PCIE_CONF_REG(where) | \
+        PCIE_CONF_ADDR_EN)
+#define PCIE_CONF_DATA_OFF     0x18fc
+#define PCIE_MASK_OFF          0x1910
+#define  PCIE_MASK_ENABLE_INTS          0x0f000000
+#define PCIE_CTRL_OFF          0x1a00
+#define  PCIE_CTRL_X1_MODE             0x0001
+#define PCIE_STAT_OFF          0x1a04
+#define  PCIE_STAT_BUS                  0xff00
+#define  PCIE_STAT_DEV                  0x1f0000
+#define  PCIE_STAT_LINK_DOWN           BIT(0)
+#define PCIE_DEBUG_CTRL         0x1a60
+#define  PCIE_DEBUG_SOFT_RESET         BIT(20)
+
+/*
+ * This product ID is registered by Marvell, and used when the Marvell
+ * SoC is not the root complex, but an endpoint on the PCIe bus. It is
+ * therefore safe to re-use this PCI ID for our emulated PCI-to-PCI
+ * bridge.
+ */
+#define MARVELL_EMULATED_PCI_PCI_BRIDGE_ID 0x7846
+
+/* PCI configuration space of a PCI-to-PCI bridge */
+struct mvebu_sw_pci_bridge {
+       u16 vendor;
+       u16 device;
+       u16 command;
+       u16 class;
+       u8 interface;
+       u8 revision;
+       u8 bist;
+       u8 header_type;
+       u8 latency_timer;
+       u8 cache_line_size;
+       u32 bar[2];
+       u8 primary_bus;
+       u8 secondary_bus;
+       u8 subordinate_bus;
+       u8 secondary_latency_timer;
+       u8 iobase;
+       u8 iolimit;
+       u16 secondary_status;
+       u16 membase;
+       u16 memlimit;
+       u16 prefmembase;
+       u16 prefmemlimit;
+       u32 prefbaseupper;
+       u32 preflimitupper;
+       u16 iobaseupper;
+       u16 iolimitupper;
+       u8 cappointer;
+       u8 reserved1;
+       u16 reserved2;
+       u32 romaddr;
+       u8 intline;
+       u8 intpin;
+       u16 bridgectrl;
+};
+
+struct mvebu_pcie_port;
+
+/* Structure representing all PCIe interfaces */
+struct mvebu_pcie {
+       struct platform_device *pdev;
+       struct mvebu_pcie_port *ports;
+       struct resource io;
+       struct resource realio;
+       struct resource mem;
+       struct resource busn;
+       int nports;
+};
+
+/* Structure representing one PCIe interface */
+struct mvebu_pcie_port {
+       char *name;
+       void __iomem *base;
+       spinlock_t conf_lock;
+       int haslink;
+       u32 port;
+       u32 lane;
+       int devfn;
+       struct clk *clk;
+       struct mvebu_sw_pci_bridge bridge;
+       struct device_node *dn;
+       struct mvebu_pcie *pcie;
+       phys_addr_t memwin_base;
+       size_t memwin_size;
+       phys_addr_t iowin_base;
+       size_t iowin_size;
+};
+
+static bool mvebu_pcie_link_up(struct mvebu_pcie_port *port)
+{
+       return !(readl(port->base + PCIE_STAT_OFF) & PCIE_STAT_LINK_DOWN);
+}
+
+static void mvebu_pcie_set_local_bus_nr(struct mvebu_pcie_port *port, int nr)
+{
+       u32 stat;
+
+       stat = readl(port->base + PCIE_STAT_OFF);
+       stat &= ~PCIE_STAT_BUS;
+       stat |= nr << 8;
+       writel(stat, port->base + PCIE_STAT_OFF);
+}
+
+static void mvebu_pcie_set_local_dev_nr(struct mvebu_pcie_port *port, int nr)
+{
+       u32 stat;
+
+       stat = readl(port->base + PCIE_STAT_OFF);
+       stat &= ~PCIE_STAT_DEV;
+       stat |= nr << 16;
+       writel(stat, port->base + PCIE_STAT_OFF);
+}
+
+/*
+ * Setup PCIE BARs and Address Decode Wins:
+ * BAR[0,2] -> disabled, BAR[1] -> covers all DRAM banks
+ * WIN[0-3] -> DRAM bank[0-3]
+ */
+static void __init mvebu_pcie_setup_wins(struct mvebu_pcie_port *port)
+{
+       const struct mbus_dram_target_info *dram;
+       u32 size;
+       int i;
+
+       dram = mv_mbus_dram_info();
+
+       /* First, disable and clear BARs and windows. */
+       for (i = 1; i < 3; i++) {
+               writel(0, port->base + PCIE_BAR_CTRL_OFF(i));
+               writel(0, port->base + PCIE_BAR_LO_OFF(i));
+               writel(0, port->base + PCIE_BAR_HI_OFF(i));
+       }
+
+       for (i = 0; i < 5; i++) {
+               writel(0, port->base + PCIE_WIN04_CTRL_OFF(i));
+               writel(0, port->base + PCIE_WIN04_BASE_OFF(i));
+               writel(0, port->base + PCIE_WIN04_REMAP_OFF(i));
+       }
+
+       writel(0, port->base + PCIE_WIN5_CTRL_OFF);
+       writel(0, port->base + PCIE_WIN5_BASE_OFF);
+       writel(0, port->base + PCIE_WIN5_REMAP_OFF);
+
+       /* Setup windows for DDR banks.  Count total DDR size on the fly. */
+       size = 0;
+       for (i = 0; i < dram->num_cs; i++) {
+               const struct mbus_dram_window *cs = dram->cs + i;
+
+               writel(cs->base & 0xffff0000,
+                      port->base + PCIE_WIN04_BASE_OFF(i));
+               writel(0, port->base + PCIE_WIN04_REMAP_OFF(i));
+               writel(((cs->size - 1) & 0xffff0000) |
+                       (cs->mbus_attr << 8) |
+                       (dram->mbus_dram_target_id << 4) | 1,
+                      port->base + PCIE_WIN04_CTRL_OFF(i));
+
+               size += cs->size;
+       }
+
+       /* Round up 'size' to the nearest power of two. */
+       if ((size & (size - 1)) != 0)
+               size = 1 << fls(size);
+
+       /* Setup BAR[1] to all DRAM banks. */
+       writel(dram->cs[0].base, port->base + PCIE_BAR_LO_OFF(1));
+       writel(0, port->base + PCIE_BAR_HI_OFF(1));
+       writel(((size - 1) & 0xffff0000) | 1,
+              port->base + PCIE_BAR_CTRL_OFF(1));
+}
+
+static void __init mvebu_pcie_setup_hw(struct mvebu_pcie_port *port)
+{
+       u16 cmd;
+       u32 mask;
+
+       /* Point PCIe unit MBUS decode windows to DRAM space. */
+       mvebu_pcie_setup_wins(port);
+
+       /* Master + slave enable. */
+       cmd = readw(port->base + PCIE_CMD_OFF);
+       cmd |= PCI_COMMAND_IO;
+       cmd |= PCI_COMMAND_MEMORY;
+       cmd |= PCI_COMMAND_MASTER;
+       writew(cmd, port->base + PCIE_CMD_OFF);
+
+       /* Enable interrupt lines A-D. */
+       mask = readl(port->base + PCIE_MASK_OFF);
+       mask |= PCIE_MASK_ENABLE_INTS;
+       writel(mask, port->base + PCIE_MASK_OFF);
+}
+
+static int mvebu_pcie_hw_rd_conf(struct mvebu_pcie_port *port,
+                                struct pci_bus *bus,
+                                u32 devfn, int where, int size, u32 *val)
+{
+       writel(PCIE_CONF_ADDR(bus->number, devfn, where),
+              port->base + PCIE_CONF_ADDR_OFF);
+
+       *val = readl(port->base + PCIE_CONF_DATA_OFF);
+
+       if (size == 1)
+               *val = (*val >> (8 * (where & 3))) & 0xff;
+       else if (size == 2)
+               *val = (*val >> (8 * (where & 3))) & 0xffff;
+
+       return PCIBIOS_SUCCESSFUL;
+}
+
+static int mvebu_pcie_hw_wr_conf(struct mvebu_pcie_port *port,
+                                struct pci_bus *bus,
+                                u32 devfn, int where, int size, u32 val)
+{
+       int ret = PCIBIOS_SUCCESSFUL;
+
+       writel(PCIE_CONF_ADDR(bus->number, devfn, where),
+              port->base + PCIE_CONF_ADDR_OFF);
+
+       if (size == 4)
+               writel(val, port->base + PCIE_CONF_DATA_OFF);
+       else if (size == 2)
+               writew(val, port->base + PCIE_CONF_DATA_OFF + (where & 3));
+       else if (size == 1)
+               writeb(val, port->base + PCIE_CONF_DATA_OFF + (where & 3));
+       else
+               ret = PCIBIOS_BAD_REGISTER_NUMBER;
+
+       return ret;
+}
+
+static void mvebu_pcie_handle_iobase_change(struct mvebu_pcie_port *port)
+{
+       phys_addr_t iobase;
+
+       /* Are the new iobase/iolimit values invalid? */
+       if (port->bridge.iolimit < port->bridge.iobase ||
+           port->bridge.iolimitupper < port->bridge.iobaseupper) {
+
+               /* If a window was configured, remove it */
+               if (port->iowin_base) {
+                       mvebu_mbus_del_window(port->iowin_base,
+                                             port->iowin_size);
+                       port->iowin_base = 0;
+                       port->iowin_size = 0;
+               }
+
+               return;
+       }
+
+       /*
+        * We read the PCI-to-PCI bridge emulated registers, and
+        * calculate the base address and size of the address decoding
+        * window to setup, according to the PCI-to-PCI bridge
+        * specifications. iobase is the bus address, port->iowin_base
+        * is the CPU address.
+        */
+       iobase = ((port->bridge.iobase & 0xF0) << 8) |
+               (port->bridge.iobaseupper << 16);
+       port->iowin_base = port->pcie->io.start + iobase;
+       port->iowin_size = ((0xFFF | ((port->bridge.iolimit & 0xF0) << 8) |
+                           (port->bridge.iolimitupper << 16)) -
+                           iobase);
+
+       mvebu_mbus_add_window_remap_flags(port->name, port->iowin_base,
+                                         port->iowin_size,
+                                         iobase,
+                                         MVEBU_MBUS_PCI_IO);
+
+       pci_ioremap_io(iobase, port->iowin_base);
+}
+
+static void mvebu_pcie_handle_membase_change(struct mvebu_pcie_port *port)
+{
+       /* Are the new membase/memlimit values invalid? */
+       if (port->bridge.memlimit < port->bridge.membase) {
+
+               /* If a window was configured, remove it */
+               if (port->memwin_base) {
+                       mvebu_mbus_del_window(port->memwin_base,
+                                             port->memwin_size);
+                       port->memwin_base = 0;
+                       port->memwin_size = 0;
+               }
+
+               return;
+       }
+
+       /*
+        * We read the PCI-to-PCI bridge emulated registers, and
+        * calculate the base address and size of the address decoding
+        * window to setup, according to the PCI-to-PCI bridge
+        * specifications.
+        */
+       port->memwin_base  = ((port->bridge.membase & 0xFFF0) << 16);
+       port->memwin_size  =
+               (((port->bridge.memlimit & 0xFFF0) << 16) | 0xFFFFF) -
+               port->memwin_base;
+
+       mvebu_mbus_add_window_remap_flags(port->name, port->memwin_base,
+                                         port->memwin_size,
+                                         MVEBU_MBUS_NO_REMAP,
+                                         MVEBU_MBUS_PCI_MEM);
+}
+
+/*
+ * Initialize the configuration space of the PCI-to-PCI bridge
+ * associated with the given PCIe interface.
+ */
+static void mvebu_sw_pci_bridge_init(struct mvebu_pcie_port *port)
+{
+       struct mvebu_sw_pci_bridge *bridge = &port->bridge;
+
+       memset(bridge, 0, sizeof(struct mvebu_sw_pci_bridge));
+
+       bridge->class = PCI_CLASS_BRIDGE_PCI;
+       bridge->vendor = PCI_VENDOR_ID_MARVELL;
+       bridge->device = MARVELL_EMULATED_PCI_PCI_BRIDGE_ID;
+       bridge->header_type = PCI_HEADER_TYPE_BRIDGE;
+       bridge->cache_line_size = 0x10;
+
+       /* We support 32 bits I/O addressing */
+       bridge->iobase = PCI_IO_RANGE_TYPE_32;
+       bridge->iolimit = PCI_IO_RANGE_TYPE_32;
+}
+
+/*
+ * Read the configuration space of the PCI-to-PCI bridge associated to
+ * the given PCIe interface.
+ */
+static int mvebu_sw_pci_bridge_read(struct mvebu_pcie_port *port,
+                                 unsigned int where, int size, u32 *value)
+{
+       struct mvebu_sw_pci_bridge *bridge = &port->bridge;
+
+       switch (where & ~3) {
+       case PCI_VENDOR_ID:
+               *value = bridge->device << 16 | bridge->vendor;
+               break;
+
+       case PCI_COMMAND:
+               *value = bridge->command;
+               break;
+
+       case PCI_CLASS_REVISION:
+               *value = bridge->class << 16 | bridge->interface << 8 |
+                        bridge->revision;
+               break;
+
+       case PCI_CACHE_LINE_SIZE:
+               *value = bridge->bist << 24 | bridge->header_type << 16 |
+                        bridge->latency_timer << 8 | bridge->cache_line_size;
+               break;
+
+       case PCI_BASE_ADDRESS_0 ... PCI_BASE_ADDRESS_1:
+               *value = bridge->bar[((where & ~3) - PCI_BASE_ADDRESS_0) / 4];
+               break;
+
+       case PCI_PRIMARY_BUS:
+               *value = (bridge->secondary_latency_timer << 24 |
+                         bridge->subordinate_bus         << 16 |
+                         bridge->secondary_bus           <<  8 |
+                         bridge->primary_bus);
+               break;
+
+       case PCI_IO_BASE:
+               *value = (bridge->secondary_status << 16 |
+                         bridge->iolimit          <<  8 |
+                         bridge->iobase);
+               break;
+
+       case PCI_MEMORY_BASE:
+               *value = (bridge->memlimit << 16 | bridge->membase);
+               break;
+
+       case PCI_PREF_MEMORY_BASE:
+               *value = (bridge->prefmemlimit << 16 | bridge->prefmembase);
+               break;
+
+       case PCI_PREF_BASE_UPPER32:
+               *value = bridge->prefbaseupper;
+               break;
+
+       case PCI_PREF_LIMIT_UPPER32:
+               *value = bridge->preflimitupper;
+               break;
+
+       case PCI_IO_BASE_UPPER16:
+               *value = (bridge->iolimitupper << 16 | bridge->iobaseupper);
+               break;
+
+       case PCI_ROM_ADDRESS1:
+               *value = 0;
+               break;
+
+       default:
+               *value = 0xffffffff;
+               return PCIBIOS_BAD_REGISTER_NUMBER;
+       }
+
+       if (size == 2)
+               *value = (*value >> (8 * (where & 3))) & 0xffff;
+       else if (size == 1)
+               *value = (*value >> (8 * (where & 3))) & 0xff;
+
+       return PCIBIOS_SUCCESSFUL;
+}
+
+/* Write to the PCI-to-PCI bridge configuration space */
+static int mvebu_sw_pci_bridge_write(struct mvebu_pcie_port *port,
+                                    unsigned int where, int size, u32 value)
+{
+       struct mvebu_sw_pci_bridge *bridge = &port->bridge;
+       u32 mask, reg;
+       int err;
+
+       if (size == 4)
+               mask = 0x0;
+       else if (size == 2)
+               mask = ~(0xffff << ((where & 3) * 8));
+       else if (size == 1)
+               mask = ~(0xff << ((where & 3) * 8));
+       else
+               return PCIBIOS_BAD_REGISTER_NUMBER;
+
+       err = mvebu_sw_pci_bridge_read(port, where & ~3, 4, &reg);
+       if (err)
+               return err;
+
+       value = (reg & mask) | value << ((where & 3) * 8);
+
+       switch (where & ~3) {
+       case PCI_COMMAND:
+               bridge->command = value & 0xffff;
+               break;
+
+       case PCI_BASE_ADDRESS_0 ... PCI_BASE_ADDRESS_1:
+               bridge->bar[((where & ~3) - PCI_BASE_ADDRESS_0) / 4] = value;
+               break;
+
+       case PCI_IO_BASE:
+               /*
+                * We also keep bit 1 set, it is a read-only bit that
+                * indicates we support 32 bits addressing for the
+                * I/O
+                */
+               bridge->iobase = (value & 0xff) | PCI_IO_RANGE_TYPE_32;
+               bridge->iolimit = ((value >> 8) & 0xff) | PCI_IO_RANGE_TYPE_32;
+               bridge->secondary_status = value >> 16;
+               mvebu_pcie_handle_iobase_change(port);
+               break;
+
+       case PCI_MEMORY_BASE:
+               bridge->membase = value & 0xffff;
+               bridge->memlimit = value >> 16;
+               mvebu_pcie_handle_membase_change(port);
+               break;
+
+       case PCI_PREF_MEMORY_BASE:
+               bridge->prefmembase = value & 0xffff;
+               bridge->prefmemlimit = value >> 16;
+               break;
+
+       case PCI_PREF_BASE_UPPER32:
+               bridge->prefbaseupper = value;
+               break;
+
+       case PCI_PREF_LIMIT_UPPER32:
+               bridge->preflimitupper = value;
+               break;
+
+       case PCI_IO_BASE_UPPER16:
+               bridge->iobaseupper = value & 0xffff;
+               bridge->iolimitupper = value >> 16;
+               mvebu_pcie_handle_iobase_change(port);
+               break;
+
+       case PCI_PRIMARY_BUS:
+               bridge->primary_bus             = value & 0xff;
+               bridge->secondary_bus           = (value >> 8) & 0xff;
+               bridge->subordinate_bus         = (value >> 16) & 0xff;
+               bridge->secondary_latency_timer = (value >> 24) & 0xff;
+               mvebu_pcie_set_local_bus_nr(port, bridge->secondary_bus);
+               break;
+
+       default:
+               break;
+       }
+
+       return PCIBIOS_SUCCESSFUL;
+}
+
+static inline struct mvebu_pcie *sys_to_pcie(struct pci_sys_data *sys)
+{
+       return sys->private_data;
+}
+
+static struct mvebu_pcie_port *
+mvebu_pcie_find_port(struct mvebu_pcie *pcie, struct pci_bus *bus,
+                    int devfn)
+{
+       int i;
+
+       for (i = 0; i < pcie->nports; i++) {
+               struct mvebu_pcie_port *port = &pcie->ports[i];
+               if (bus->number == 0 && port->devfn == devfn)
+                       return port;
+               if (bus->number != 0 &&
+                   bus->number >= port->bridge.secondary_bus &&
+                   bus->number <= port->bridge.subordinate_bus)
+                       return port;
+       }
+
+       return NULL;
+}
+
+/* PCI configuration space write function */
+static int mvebu_pcie_wr_conf(struct pci_bus *bus, u32 devfn,
+                             int where, int size, u32 val)
+{
+       struct mvebu_pcie *pcie = sys_to_pcie(bus->sysdata);
+       struct mvebu_pcie_port *port;
+       unsigned long flags;
+       int ret;
+
+       port = mvebu_pcie_find_port(pcie, bus, devfn);
+       if (!port)
+               return PCIBIOS_DEVICE_NOT_FOUND;
+
+       /* Access the emulated PCI-to-PCI bridge */
+       if (bus->number == 0)
+               return mvebu_sw_pci_bridge_write(port, where, size, val);
+
+       if (!port->haslink)
+               return PCIBIOS_DEVICE_NOT_FOUND;
+
+       /*
+        * On the secondary bus, we don't want to expose any other
+        * device than the device physically connected in the PCIe
+        * slot, visible in slot 0. In slot 1, there's a special
+        * Marvell device that only makes sense when the Armada is
+        * used as a PCIe endpoint.
+        */
+       if (bus->number == port->bridge.secondary_bus &&
+           PCI_SLOT(devfn) != 0)
+               return PCIBIOS_DEVICE_NOT_FOUND;
+
+       /* Access the real PCIe interface */
+       spin_lock_irqsave(&port->conf_lock, flags);
+       ret = mvebu_pcie_hw_wr_conf(port, bus, devfn,
+                                   where, size, val);
+       spin_unlock_irqrestore(&port->conf_lock, flags);
+
+       return ret;
+}
+
+/* PCI configuration space read function */
+static int mvebu_pcie_rd_conf(struct pci_bus *bus, u32 devfn, int where,
+                             int size, u32 *val)
+{
+       struct mvebu_pcie *pcie = sys_to_pcie(bus->sysdata);
+       struct mvebu_pcie_port *port;
+       unsigned long flags;
+       int ret;
+
+       port = mvebu_pcie_find_port(pcie, bus, devfn);
+       if (!port) {
+               *val = 0xffffffff;
+               return PCIBIOS_DEVICE_NOT_FOUND;
+       }
+
+       /* Access the emulated PCI-to-PCI bridge */
+       if (bus->number == 0)
+               return mvebu_sw_pci_bridge_read(port, where, size, val);
+
+       if (!port->haslink) {
+               *val = 0xffffffff;
+               return PCIBIOS_DEVICE_NOT_FOUND;
+       }
+
+       /*
+        * On the secondary bus, we don't want to expose any other
+        * device than the device physically connected in the PCIe
+        * slot, visible in slot 0. In slot 1, there's a special
+        * Marvell device that only makes sense when the Armada is
+        * used as a PCIe endpoint.
+        */
+       if (bus->number == port->bridge.secondary_bus &&
+           PCI_SLOT(devfn) != 0) {
+               *val = 0xffffffff;
+               return PCIBIOS_DEVICE_NOT_FOUND;
+       }
+
+       /* Access the real PCIe interface */
+       spin_lock_irqsave(&port->conf_lock, flags);
+       ret = mvebu_pcie_hw_rd_conf(port, bus, devfn,
+                                   where, size, val);
+       spin_unlock_irqrestore(&port->conf_lock, flags);
+
+       return ret;
+}
+
+static struct pci_ops mvebu_pcie_ops = {
+       .read = mvebu_pcie_rd_conf,
+       .write = mvebu_pcie_wr_conf,
+};
+
+static int __init mvebu_pcie_setup(int nr, struct pci_sys_data *sys)
+{
+       struct mvebu_pcie *pcie = sys_to_pcie(sys);
+       int i;
+
+       pci_add_resource_offset(&sys->resources, &pcie->realio, sys->io_offset);
+       pci_add_resource_offset(&sys->resources, &pcie->mem, sys->mem_offset);
+       pci_add_resource(&sys->resources, &pcie->busn);
+
+       for (i = 0; i < pcie->nports; i++) {
+               struct mvebu_pcie_port *port = &pcie->ports[i];
+               mvebu_pcie_setup_hw(port);
+       }
+
+       return 1;
+}
+
+static int __init mvebu_pcie_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
+{
+       struct of_irq oirq;
+       int ret;
+
+       ret = of_irq_map_pci(dev, &oirq);
+       if (ret)
+               return ret;
+
+       return irq_create_of_mapping(oirq.controller, oirq.specifier,
+                                    oirq.size);
+}
+
+static struct pci_bus *mvebu_pcie_scan_bus(int nr, struct pci_sys_data *sys)
+{
+       struct mvebu_pcie *pcie = sys_to_pcie(sys);
+       struct pci_bus *bus;
+
+       bus = pci_create_root_bus(&pcie->pdev->dev, sys->busnr,
+                                 &mvebu_pcie_ops, sys, &sys->resources);
+       if (!bus)
+               return NULL;
+
+       pci_scan_child_bus(bus);
+
+       return bus;
+}
+
+resource_size_t mvebu_pcie_align_resource(struct pci_dev *dev,
+                                         const struct resource *res,
+                                         resource_size_t start,
+                                         resource_size_t size,
+                                         resource_size_t align)
+{
+       if (dev->bus->number != 0)
+               return start;
+
+       /*
+        * On the PCI-to-PCI bridge side, the I/O windows must have at
+        * least a 64 KB size and be aligned on their size, and the
+        * memory windows must have at least a 1 MB size and be
+        * aligned on their size
+        */
+       if (res->flags & IORESOURCE_IO)
+               return round_up(start, max((resource_size_t)SZ_64K, size));
+       else if (res->flags & IORESOURCE_MEM)
+               return round_up(start, max((resource_size_t)SZ_1M, size));
+       else
+               return start;
+}
+
+static void __init mvebu_pcie_enable(struct mvebu_pcie *pcie)
+{
+       struct hw_pci hw;
+
+       memset(&hw, 0, sizeof(hw));
+
+       hw.nr_controllers = 1;
+       hw.private_data   = (void **)&pcie;
+       hw.setup          = mvebu_pcie_setup;
+       hw.scan           = mvebu_pcie_scan_bus;
+       hw.map_irq        = mvebu_pcie_map_irq;
+       hw.ops            = &mvebu_pcie_ops;
+       hw.align_resource = mvebu_pcie_align_resource;
+
+       pci_common_init(&hw);
+}
+
+/*
+ * Looks up the list of register addresses encoded into the reg =
+ * <...> property for one that matches the given port/lane. Once
+ * found, maps it.
+ */
+static void __iomem * __init
+mvebu_pcie_map_registers(struct platform_device *pdev,
+                        struct device_node *np,
+                        struct mvebu_pcie_port *port)
+{
+       struct resource regs;
+       int ret = 0;
+
+       ret = of_address_to_resource(np, 0, &regs);
+       if (ret)
+               return NULL;
+
+       return devm_request_and_ioremap(&pdev->dev, &regs);
+}
+
+static int __init mvebu_pcie_probe(struct platform_device *pdev)
+{
+       struct mvebu_pcie *pcie;
+       struct device_node *np = pdev->dev.of_node;
+       struct of_pci_range range;
+       struct of_pci_range_parser parser;
+       struct device_node *child;
+       int i, ret;
+
+       pcie = devm_kzalloc(&pdev->dev, sizeof(struct mvebu_pcie),
+                           GFP_KERNEL);
+       if (!pcie)
+               return -ENOMEM;
+
+       pcie->pdev = pdev;
+
+       if (of_pci_range_parser_init(&parser, np))
+               return -EINVAL;
+
+       /* Get the I/O and memory ranges from DT */
+       for_each_of_pci_range(&parser, &range) {
+               unsigned long restype = range.flags & IORESOURCE_TYPE_BITS;
+               if (restype == IORESOURCE_IO) {
+                       of_pci_range_to_resource(&range, np, &pcie->io);
+                       of_pci_range_to_resource(&range, np, &pcie->realio);
+                       pcie->io.name = "I/O";
+                       pcie->realio.start = max_t(resource_size_t,
+                                                  PCIBIOS_MIN_IO,
+                                                  range.pci_addr);
+                       pcie->realio.end = min_t(resource_size_t,
+                                                IO_SPACE_LIMIT,
+                                                range.pci_addr + range.size);
+               }
+               if (restype == IORESOURCE_MEM) {
+                       of_pci_range_to_resource(&range, np, &pcie->mem);
+                       pcie->mem.name = "MEM";
+               }
+       }
+
+       /* Get the bus range */
+       ret = of_pci_parse_bus_range(np, &pcie->busn);
+       if (ret) {
+               dev_err(&pdev->dev, "failed to parse bus-range property: %d\n",
+                       ret);
+               return ret;
+       }
+
+       for_each_child_of_node(pdev->dev.of_node, child) {
+               if (!of_device_is_available(child))
+                       continue;
+               pcie->nports++;
+       }
+
+       pcie->ports = devm_kzalloc(&pdev->dev, pcie->nports *
+                                  sizeof(struct mvebu_pcie_port),
+                                  GFP_KERNEL);
+       if (!pcie->ports)
+               return -ENOMEM;
+
+       i = 0;
+       for_each_child_of_node(pdev->dev.of_node, child) {
+               struct mvebu_pcie_port *port = &pcie->ports[i];
+
+               if (!of_device_is_available(child))
+                       continue;
+
+               port->pcie = pcie;
+
+               if (of_property_read_u32(child, "marvell,pcie-port",
+                                        &port->port)) {
+                       dev_warn(&pdev->dev,
+                                "ignoring PCIe DT node, missing pcie-port property\n");
+                       continue;
+               }
+
+               if (of_property_read_u32(child, "marvell,pcie-lane",
+                                        &port->lane))
+                       port->lane = 0;
+
+               port->name = kasprintf(GFP_KERNEL, "pcie%d.%d",
+                                      port->port, port->lane);
+
+               port->devfn = of_pci_get_devfn(child);
+               if (port->devfn < 0)
+                       continue;
+
+               port->base = mvebu_pcie_map_registers(pdev, child, port);
+               if (!port->base) {
+                       dev_err(&pdev->dev, "PCIe%d.%d: cannot map registers\n",
+                               port->port, port->lane);
+                       continue;
+               }
+
+               mvebu_pcie_set_local_dev_nr(port, 1);
+
+               if (mvebu_pcie_link_up(port)) {
+                       port->haslink = 1;
+                       dev_info(&pdev->dev, "PCIe%d.%d: link up\n",
+                                port->port, port->lane);
+               } else {
+                       port->haslink = 0;
+                       dev_info(&pdev->dev, "PCIe%d.%d: link down\n",
+                                port->port, port->lane);
+               }
+
+               port->clk = of_clk_get_by_name(child, NULL);
+               if (IS_ERR(port->clk)) {
+                       dev_err(&pdev->dev, "PCIe%d.%d: cannot get clock\n",
+                              port->port, port->lane);
+                       iounmap(port->base);
+                       port->haslink = 0;
+                       continue;
+               }
+
+               port->dn = child;
+
+               clk_prepare_enable(port->clk);
+               spin_lock_init(&port->conf_lock);
+
+               mvebu_sw_pci_bridge_init(port);
+
+               i++;
+       }
+
+       mvebu_pcie_enable(pcie);
+
+       return 0;
+}
+
+static const struct of_device_id mvebu_pcie_of_match_table[] = {
+       { .compatible = "marvell,armada-xp-pcie", },
+       { .compatible = "marvell,armada-370-pcie", },
+       { .compatible = "marvell,kirkwood-pcie", },
+       {},
+};
+MODULE_DEVICE_TABLE(of, mvebu_pcie_of_match_table);
+
+static struct platform_driver mvebu_pcie_driver = {
+       .driver = {
+               .owner = THIS_MODULE,
+               .name = "mvebu-pcie",
+               .of_match_table =
+                  of_match_ptr(mvebu_pcie_of_match_table),
+       },
+};
+
+static int __init mvebu_pcie_init(void)
+{
+       return platform_driver_probe(&mvebu_pcie_driver,
+                                    mvebu_pcie_probe);
+}
+
+subsys_initcall(mvebu_pcie_init);
+
+MODULE_AUTHOR("Thomas Petazzoni <thomas.petazzoni@free-electrons.com>");
+MODULE_DESCRIPTION("Marvell EBU PCIe driver");
+MODULE_LICENSE("GPLv2");
index d6b41747d687e13c188340ed08a3027c9646245d..eeff7f7fc920d6b9362ee028d6e6a1f96e225cd0 100644 (file)
@@ -22,7 +22,6 @@
 #include <linux/slab.h>
 #include <linux/pinctrl/consumer.h>
 #include <linux/pinctrl/pinconf-generic.h>
-#include <linux/platform_data/pinctrl-coh901.h>
 #include "pinctrl-coh901.h"
 
 #define U300_GPIO_PORT_STRIDE                          (0x30)
@@ -58,8 +57,9 @@
 #define U300_GPIO_PXICR_IRQ_CONFIG_RISING_EDGE         (0x00000001UL)
 
 /* 8 bits per port, no version has more than 7 ports */
+#define U300_GPIO_NUM_PORTS 7
 #define U300_GPIO_PINS_PER_PORT 8
-#define U300_GPIO_MAX (U300_GPIO_PINS_PER_PORT * 7)
+#define U300_GPIO_MAX (U300_GPIO_PINS_PER_PORT * U300_GPIO_NUM_PORTS)
 
 struct u300_gpio {
        struct gpio_chip chip;
@@ -111,9 +111,6 @@ struct u300_gpio_confdata {
        int outval;
 };
 
-/* BS335 has seven ports of 8 bits each = GPIO pins 0..55 */
-#define BS335_GPIO_NUM_PORTS 7
-
 #define U300_FLOATING_INPUT { \
        .bias_mode = PIN_CONFIG_BIAS_HIGH_IMPEDANCE, \
        .output = false, \
@@ -136,7 +133,7 @@ struct u300_gpio_confdata {
 
 /* Initial configuration */
 static const struct __initconst u300_gpio_confdata
-bs335_gpio_config[BS335_GPIO_NUM_PORTS][U300_GPIO_PINS_PER_PORT] = {
+bs335_gpio_config[U300_GPIO_NUM_PORTS][U300_GPIO_PINS_PER_PORT] = {
        /* Port 0, pins 0-7 */
        {
                U300_FLOATING_INPUT,
@@ -630,13 +627,12 @@ static void __init u300_gpio_init_pin(struct u300_gpio *gpio,
        }
 }
 
-static void __init u300_gpio_init_coh901571(struct u300_gpio *gpio,
-                                    struct u300_gpio_platform *plat)
+static void __init u300_gpio_init_coh901571(struct u300_gpio *gpio)
 {
        int i, j;
 
        /* Write default config and values to all pins */
-       for (i = 0; i < plat->ports; i++) {
+       for (i = 0; i < U300_GPIO_NUM_PORTS; i++) {
                for (j = 0; j < 8; j++) {
                        const struct u300_gpio_confdata *conf;
                        int offset = (i*8) + j;
@@ -693,7 +689,6 @@ static struct coh901_pinpair coh901_pintable[] = {
 
 static int __init u300_gpio_probe(struct platform_device *pdev)
 {
-       struct u300_gpio_platform *plat = dev_get_platdata(&pdev->dev);
        struct u300_gpio *gpio;
        struct resource *memres;
        int err = 0;
@@ -707,9 +702,9 @@ static int __init u300_gpio_probe(struct platform_device *pdev)
                return -ENOMEM;
 
        gpio->chip = u300_gpio_chip;
-       gpio->chip.ngpio = plat->ports * U300_GPIO_PINS_PER_PORT;
+       gpio->chip.ngpio = U300_GPIO_NUM_PORTS * U300_GPIO_PINS_PER_PORT;
        gpio->chip.dev = &pdev->dev;
-       gpio->chip.base = plat->gpio_base;
+       gpio->chip.base = 0;
        gpio->dev = &pdev->dev;
 
        memres = platform_get_resource(pdev, IORESOURCE_MEM, 0);
@@ -750,11 +745,11 @@ static int __init u300_gpio_probe(struct platform_device *pdev)
                 ((val & 0x0000FE00) >> 9) * 8);
        writel(U300_GPIO_CR_BLOCK_CLKRQ_ENABLE,
               gpio->base + U300_GPIO_CR);
-       u300_gpio_init_coh901571(gpio, plat);
+       u300_gpio_init_coh901571(gpio);
 
        /* Add each port with its IRQ separately */
        INIT_LIST_HEAD(&gpio->port_list);
-       for (portno = 0 ; portno < plat->ports; portno++) {
+       for (portno = 0 ; portno < U300_GPIO_NUM_PORTS; portno++) {
                struct u300_gpio_port *port =
                        kmalloc(sizeof(struct u300_gpio_port), GFP_KERNEL);
 
@@ -768,8 +763,7 @@ static int __init u300_gpio_probe(struct platform_device *pdev)
                port->number = portno;
                port->gpio = gpio;
 
-               port->irq = platform_get_irq_byname(pdev,
-                                                   port->name);
+               port->irq = platform_get_irq(pdev, portno);
 
                dev_dbg(gpio->dev, "register IRQ %d for port %s\n", port->irq,
                        port->name);
@@ -806,6 +800,9 @@ static int __init u300_gpio_probe(struct platform_device *pdev)
        }
        dev_dbg(gpio->dev, "initialized %d GPIO ports\n", portno);
 
+#ifdef CONFIG_OF_GPIO
+       gpio->chip.of_node = pdev->dev.of_node;
+#endif
        err = gpiochip_add(&gpio->chip);
        if (err) {
                dev_err(gpio->dev, "unable to add gpiochip: %d\n", err);
@@ -860,9 +857,15 @@ static int __exit u300_gpio_remove(struct platform_device *pdev)
        return 0;
 }
 
+static const struct of_device_id u300_gpio_match[] = {
+       { .compatible = "stericsson,gpio-coh901" },
+       {},
+};
+
 static struct platform_driver u300_gpio_driver = {
        .driver         = {
                .name   = "u300-gpio",
+               .of_match_table = u300_gpio_match,
        },
        .remove         = __exit_p(u300_gpio_remove),
 };
index 6a3a7503e6a02ef91759fb44e70a9003601bc3ce..06bfa09bb15c1bfb9ba41cef0c5dfe2691ac8736 100644 (file)
@@ -1105,10 +1105,17 @@ static int u300_pmx_remove(struct platform_device *pdev)
        return 0;
 }
 
+static const struct of_device_id u300_pinctrl_match[] = {
+       { .compatible = "stericsson,pinctrl-u300" },
+       {},
+};
+
+
 static struct platform_driver u300_pmx_driver = {
        .driver = {
                .name = DRIVER_NAME,
                .owner = THIS_MODULE,
+               .of_match_table = u300_pinctrl_match,
        },
        .probe = u300_pmx_probe,
        .remove = u300_pmx_remove,
index f8a2ae413c7f1366901d66d1570eb2de87d3ce60..636a882b406ecb4d404609501a524de4b20e3aab 100644 (file)
@@ -5,8 +5,6 @@
 if ARCH_SHMOBILE || SUPERH
 
 config PINCTRL_SH_PFC
-       # XXX move off the gpio dependency
-       depends on GPIOLIB
        select GPIO_SH_PFC if ARCH_REQUIRE_GPIOLIB
        select PINMUX
        select PINCONF
@@ -32,11 +30,21 @@ config PINCTRL_PFC_R8A7740
        depends on ARCH_R8A7740
        select PINCTRL_SH_PFC
 
+config PINCTRL_PFC_R8A7778
+       def_bool y
+       depends on ARCH_R8A7778
+       select PINCTRL_SH_PFC
+
 config PINCTRL_PFC_R8A7779
        def_bool y
        depends on ARCH_R8A7779
        select PINCTRL_SH_PFC
 
+config PINCTRL_PFC_R8A7790
+       def_bool y
+       depends on ARCH_R8A7790
+       select PINCTRL_SH_PFC
+
 config PINCTRL_PFC_SH7203
        def_bool y
        depends on CPU_SUBTYPE_SH7203
@@ -64,6 +72,7 @@ config PINCTRL_PFC_SH73A0
        def_bool y
        depends on ARCH_SH73A0
        select PINCTRL_SH_PFC
+       select REGULATOR
 
 config PINCTRL_PFC_SH7720
        def_bool y
index 211cd8e98a8a6ca8797738f14c97b2755162b08d..5e0c222c12d7e0414b22658aed8b724b9352d92f 100644 (file)
@@ -5,7 +5,9 @@ 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_R8A7778)      += pfc-r8a7778.o
 obj-$(CONFIG_PINCTRL_PFC_R8A7779)      += pfc-r8a7779.o
+obj-$(CONFIG_PINCTRL_PFC_R8A7790)      += pfc-r8a7790.o
 obj-$(CONFIG_PINCTRL_PFC_SH7203)       += pfc-sh7203.o
 obj-$(CONFIG_PINCTRL_PFC_SH7264)       += pfc-sh7264.o
 obj-$(CONFIG_PINCTRL_PFC_SH7269)       += pfc-sh7269.o
index b551336924a55c4a6ce5d1ebd0f500b74250e646..3b2fd43ff2944ced1e8af02f1c8da50728816d0b 100644 (file)
@@ -372,6 +372,12 @@ static int sh_pfc_probe(struct platform_device *pdev)
 
        spin_lock_init(&pfc->lock);
 
+       if (info->ops && info->ops->init) {
+               ret = info->ops->init(pfc);
+               if (ret < 0)
+                       return ret;
+       }
+
        pinctrl_provide_dummies();
 
        /*
@@ -379,7 +385,7 @@ static int sh_pfc_probe(struct platform_device *pdev)
         */
        ret = sh_pfc_register_pinctrl(pfc);
        if (unlikely(ret != 0))
-               return ret;
+               goto error;
 
 #ifdef CONFIG_GPIO_SH_PFC
        /*
@@ -401,6 +407,11 @@ static int sh_pfc_probe(struct platform_device *pdev)
        dev_info(pfc->dev, "%s support registered\n", info->name);
 
        return 0;
+
+error:
+       if (info->ops && info->ops->exit)
+               info->ops->exit(pfc);
+       return ret;
 }
 
 static int sh_pfc_remove(struct platform_device *pdev)
@@ -412,6 +423,9 @@ static int sh_pfc_remove(struct platform_device *pdev)
 #endif
        sh_pfc_unregister_pinctrl(pfc);
 
+       if (pfc->info->ops && pfc->info->ops->exit)
+               pfc->info->ops->exit(pfc);
+
        platform_set_drvdata(pdev, NULL);
 
        return 0;
@@ -424,9 +438,15 @@ static const struct platform_device_id sh_pfc_id_table[] = {
 #ifdef CONFIG_PINCTRL_PFC_R8A7740
        { "pfc-r8a7740", (kernel_ulong_t)&r8a7740_pinmux_info },
 #endif
+#ifdef CONFIG_PINCTRL_PFC_R8A7778
+       { "pfc-r8a7778", (kernel_ulong_t)&r8a7778_pinmux_info },
+#endif
 #ifdef CONFIG_PINCTRL_PFC_R8A7779
        { "pfc-r8a7779", (kernel_ulong_t)&r8a7779_pinmux_info },
 #endif
+#ifdef CONFIG_PINCTRL_PFC_R8A7790
+       { "pfc-r8a7790", (kernel_ulong_t)&r8a7790_pinmux_info },
+#endif
 #ifdef CONFIG_PINCTRL_PFC_SH7203
        { "pfc-sh7203", (kernel_ulong_t)&sh7203_pinmux_info },
 #endif
index 89cb4289d76125abe17ad3ee7b710369af233cdb..f02ba1dde3a0738d4dd67b5c80c0b9e99537edba 100644 (file)
@@ -11,6 +11,7 @@
 #define __SH_PFC_CORE_H__
 
 #include <linux/compiler.h>
+#include <linux/spinlock.h>
 #include <linux/types.h>
 
 #include "sh_pfc.h"
@@ -27,6 +28,7 @@ struct sh_pfc_pinctrl;
 struct sh_pfc {
        struct device *dev;
        const struct sh_pfc_soc_info *info;
+       void *soc_data;
        spinlock_t lock;
 
        unsigned int num_windows;
@@ -56,7 +58,9 @@ int sh_pfc_config_mux(struct sh_pfc *pfc, unsigned mark, int pinmux_type);
 
 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 r8a7778_pinmux_info;
 extern const struct sh_pfc_soc_info r8a7779_pinmux_info;
+extern const struct sh_pfc_soc_info r8a7790_pinmux_info;
 extern const struct sh_pfc_soc_info sh7203_pinmux_info;
 extern const struct sh_pfc_soc_info sh7264_pinmux_info;
 extern const struct sh_pfc_soc_info sh7269_pinmux_info;
index bbd87d29bfd072cae153467fa58c178c8059077f..f6ea47c433b388cb2018ab42c96b6dc1890f975f 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/r8a7740.h>
 #include <mach/irqs.h>
 
+#include "core.h"
 #include "sh_pfc.h"
 
 #define CPU_ALL_PORT(fn, pfx, sfx)                                     \
        PORT_10(fn, pfx##20, sfx),                                      \
        PORT_1(fn, pfx##210, sfx),      PORT_1(fn, pfx##211, sfx)
 
+#undef _GPIO_PORT
+#define _GPIO_PORT(gpio, sfx)                                          \
+       [gpio] = {                                                      \
+               .name = __stringify(PORT##gpio),                        \
+               .enum_id = PORT##gpio##_DATA,                           \
+       }
+
+#define IRQC_PIN_MUX(irq, pin)                                         \
+static const unsigned int intc_irq##irq##_pins[] = {                   \
+       pin,                                                            \
+};                                                                     \
+static const unsigned int intc_irq##irq##_mux[] = {                    \
+       IRQ##irq##_MARK,                                                \
+}
+
+#define IRQC_PINS_MUX(irq, idx, pin)                                   \
+static const unsigned int intc_irq##irq##_##idx##_pins[] = {           \
+       pin,                                                            \
+};                                                                     \
+static const unsigned int intc_irq##irq##_##idx##_mux[] = {            \
+       IRQ##irq##_PORT##pin##_MARK,                                    \
+}
+
 enum {
        PINMUX_RESERVED = 0,
 
@@ -43,16 +70,6 @@ enum {
        PORT_ALL(IN),
        PINMUX_INPUT_END,
 
-       /* PORT0_IN_PU -> PORT211_IN_PU */
-       PINMUX_INPUT_PULLUP_BEGIN,
-       PORT_ALL(IN_PU),
-       PINMUX_INPUT_PULLUP_END,
-
-       /* PORT0_IN_PD -> PORT211_IN_PD */
-       PINMUX_INPUT_PULLDOWN_BEGIN,
-       PORT_ALL(IN_PD),
-       PINMUX_INPUT_PULLDOWN_END,
-
        /* PORT0_OUT -> PORT211_OUT */
        PINMUX_OUTPUT_BEGIN,
        PORT_ALL(OUT),
@@ -261,8 +278,6 @@ enum {
        SCIFB_CTS_PORT173_MARK,
 
        /* LCD0 */
-       LCDC0_SELECT_MARK,
-
        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,
@@ -285,8 +300,6 @@ enum {
        LCD0_LCLK_PORT102_MARK,
 
        /* LCD1 */
-       LCDC1_SELECT_MARK,
-
        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,
@@ -577,137 +590,11 @@ enum {
        PINMUX_MARK_END,
 };
 
+#define _PORT_DATA(pfx, sfx)   PORT_DATA_IO(pfx)
+#define PINMUX_DATA_GP_ALL()   CPU_ALL_PORT(_PORT_DATA, , unused)
+
 static const pinmux_enum_t pinmux_data[] = {
-       /* specify valid pin states for each pin in GPIO mode */
-
-       /* I/O and Pull U/D */
-       PORT_DATA_IO_PD(0),             PORT_DATA_IO_PD(1),
-       PORT_DATA_IO_PD(2),             PORT_DATA_IO_PD(3),
-       PORT_DATA_IO_PD(4),             PORT_DATA_IO_PD(5),
-       PORT_DATA_IO_PD(6),             PORT_DATA_IO(7),
-       PORT_DATA_IO(8),                PORT_DATA_IO(9),
-
-       PORT_DATA_IO_PD(10),            PORT_DATA_IO_PD(11),
-       PORT_DATA_IO_PD(12),            PORT_DATA_IO_PU_PD(13),
-       PORT_DATA_IO_PD(14),            PORT_DATA_IO_PD(15),
-       PORT_DATA_IO_PD(16),            PORT_DATA_IO_PD(17),
-       PORT_DATA_IO(18),               PORT_DATA_IO_PU(19),
-
-       PORT_DATA_IO_PU_PD(20),         PORT_DATA_IO_PD(21),
-       PORT_DATA_IO_PU_PD(22),         PORT_DATA_IO(23),
-       PORT_DATA_IO_PU(24),            PORT_DATA_IO_PU(25),
-       PORT_DATA_IO_PU(26),            PORT_DATA_IO_PU(27),
-       PORT_DATA_IO_PU(28),            PORT_DATA_IO_PU(29),
-
-       PORT_DATA_IO_PU(30),            PORT_DATA_IO_PD(31),
-       PORT_DATA_IO_PD(32),            PORT_DATA_IO_PD(33),
-       PORT_DATA_IO_PD(34),            PORT_DATA_IO_PU(35),
-       PORT_DATA_IO_PU(36),            PORT_DATA_IO_PD(37),
-       PORT_DATA_IO_PU(38),            PORT_DATA_IO_PD(39),
-
-       PORT_DATA_IO_PU_PD(40),         PORT_DATA_IO_PD(41),
-       PORT_DATA_IO_PD(42),            PORT_DATA_IO_PU_PD(43),
-       PORT_DATA_IO_PU_PD(44),         PORT_DATA_IO_PU_PD(45),
-       PORT_DATA_IO_PU_PD(46),         PORT_DATA_IO_PU_PD(47),
-       PORT_DATA_IO_PU_PD(48),         PORT_DATA_IO_PU_PD(49),
-
-       PORT_DATA_IO_PU_PD(50),         PORT_DATA_IO_PD(51),
-       PORT_DATA_IO_PD(52),            PORT_DATA_IO_PD(53),
-       PORT_DATA_IO_PD(54),            PORT_DATA_IO_PU_PD(55),
-       PORT_DATA_IO_PU_PD(56),         PORT_DATA_IO_PU_PD(57),
-       PORT_DATA_IO_PU_PD(58),         PORT_DATA_IO_PU_PD(59),
-
-       PORT_DATA_IO_PU_PD(60),         PORT_DATA_IO_PD(61),
-       PORT_DATA_IO_PD(62),            PORT_DATA_IO_PD(63),
-       PORT_DATA_IO_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_IO_PU_PD(73),
-       PORT_DATA_IO_PU_PD(74),         PORT_DATA_IO_PU_PD(75),
-       PORT_DATA_IO_PU_PD(76),         PORT_DATA_IO_PU_PD(77),
-       PORT_DATA_IO_PU_PD(78),         PORT_DATA_IO_PU_PD(79),
-
-       PORT_DATA_IO_PU_PD(80),         PORT_DATA_IO_PU_PD(81),
-       PORT_DATA_IO(82),               PORT_DATA_IO_PU_PD(83),
-       PORT_DATA_IO(84),               PORT_DATA_IO_PD(85),
-       PORT_DATA_IO_PD(86),            PORT_DATA_IO_PD(87),
-       PORT_DATA_IO_PD(88),            PORT_DATA_IO_PD(89),
-
-       PORT_DATA_IO_PD(90),            PORT_DATA_IO_PU_PD(91),
-       PORT_DATA_IO_PU_PD(92),         PORT_DATA_IO_PU_PD(93),
-       PORT_DATA_IO_PU_PD(94),         PORT_DATA_IO_PU_PD(95),
-       PORT_DATA_IO_PU_PD(96),         PORT_DATA_IO_PU_PD(97),
-       PORT_DATA_IO_PU_PD(98),         PORT_DATA_IO_PU_PD(99),
-
-       PORT_DATA_IO_PU_PD(100),        PORT_DATA_IO(101),
-       PORT_DATA_IO_PU(102),           PORT_DATA_IO_PU_PD(103),
-       PORT_DATA_IO_PU(104),           PORT_DATA_IO_PU(105),
-       PORT_DATA_IO_PU_PD(106),        PORT_DATA_IO(107),
-       PORT_DATA_IO(108),              PORT_DATA_IO(109),
-
-       PORT_DATA_IO(110),              PORT_DATA_IO(111),
-       PORT_DATA_IO(112),              PORT_DATA_IO(113),
-       PORT_DATA_IO_PU_PD(114),        PORT_DATA_IO(115),
-       PORT_DATA_IO_PD(116),           PORT_DATA_IO_PD(117),
-       PORT_DATA_IO_PD(118),           PORT_DATA_IO_PD(119),
-
-       PORT_DATA_IO_PD(120),           PORT_DATA_IO_PD(121),
-       PORT_DATA_IO_PD(122),           PORT_DATA_IO_PD(123),
-       PORT_DATA_IO_PD(124),           PORT_DATA_IO(125),
-       PORT_DATA_IO(126),              PORT_DATA_IO(127),
-       PORT_DATA_IO(128),              PORT_DATA_IO(129),
-
-       PORT_DATA_IO(130),              PORT_DATA_IO(131),
-       PORT_DATA_IO(132),              PORT_DATA_IO(133),
-       PORT_DATA_IO(134),              PORT_DATA_IO(135),
-       PORT_DATA_IO(136),              PORT_DATA_IO(137),
-       PORT_DATA_IO(138),              PORT_DATA_IO(139),
-
-       PORT_DATA_IO(140),              PORT_DATA_IO(141),
-       PORT_DATA_IO_PU(142),           PORT_DATA_IO_PU(143),
-       PORT_DATA_IO_PU(144),           PORT_DATA_IO_PU(145),
-       PORT_DATA_IO_PU(146),           PORT_DATA_IO_PU(147),
-       PORT_DATA_IO_PU(148),           PORT_DATA_IO_PU(149),
-
-       PORT_DATA_IO_PU(150),           PORT_DATA_IO_PU(151),
-       PORT_DATA_IO_PU(152),           PORT_DATA_IO_PU(153),
-       PORT_DATA_IO_PU(154),           PORT_DATA_IO_PU(155),
-       PORT_DATA_IO_PU(156),           PORT_DATA_IO_PU(157),
-       PORT_DATA_IO_PD(158),           PORT_DATA_IO_PD(159),
-
-       PORT_DATA_IO_PU_PD(160),        PORT_DATA_IO_PD(161),
-       PORT_DATA_IO_PD(162),           PORT_DATA_IO_PD(163),
-       PORT_DATA_IO_PD(164),           PORT_DATA_IO_PD(165),
-       PORT_DATA_IO_PU(166),           PORT_DATA_IO_PU(167),
-       PORT_DATA_IO_PU(168),           PORT_DATA_IO_PU(169),
-
-       PORT_DATA_IO_PU(170),           PORT_DATA_IO_PU(171),
-       PORT_DATA_IO_PD(172),           PORT_DATA_IO_PD(173),
-       PORT_DATA_IO_PD(174),           PORT_DATA_IO_PD(175),
-       PORT_DATA_IO_PU(176),           PORT_DATA_IO_PU_PD(177),
-       PORT_DATA_IO_PU(178),           PORT_DATA_IO_PD(179),
-
-       PORT_DATA_IO_PD(180),           PORT_DATA_IO_PU(181),
-       PORT_DATA_IO_PU(182),           PORT_DATA_IO(183),
-       PORT_DATA_IO_PD(184),           PORT_DATA_IO_PD(185),
-       PORT_DATA_IO_PD(186),           PORT_DATA_IO_PD(187),
-       PORT_DATA_IO_PD(188),           PORT_DATA_IO_PD(189),
-
-       PORT_DATA_IO_PD(190),           PORT_DATA_IO_PD(191),
-       PORT_DATA_IO_PD(192),           PORT_DATA_IO_PU_PD(193),
-       PORT_DATA_IO_PU_PD(194),        PORT_DATA_IO_PD(195),
-       PORT_DATA_IO_PU_PD(196),        PORT_DATA_IO_PD(197),
-       PORT_DATA_IO_PU_PD(198),        PORT_DATA_IO_PU_PD(199),
-
-       PORT_DATA_IO_PU_PD(200),        PORT_DATA_IO_PU(201),
-       PORT_DATA_IO_PU_PD(202),        PORT_DATA_IO(203),
-       PORT_DATA_IO_PU_PD(204),        PORT_DATA_IO_PU_PD(205),
-       PORT_DATA_IO_PU_PD(206),        PORT_DATA_IO_PU_PD(207),
-       PORT_DATA_IO_PU_PD(208),        PORT_DATA_IO_PD(209),
-
-       PORT_DATA_IO_PD(210),           PORT_DATA_IO_PD(211),
+       PINMUX_DATA_GP_ALL(),
 
        /* Port0 */
        PINMUX_DATA(DBGMDT2_MARK,               PORT0_FN1),
@@ -986,7 +873,7 @@ static const pinmux_enum_t pinmux_data[] = {
        PINMUX_DATA(IRQ27_PORT57_MARK,          PORT57_FN0,     MSEL1CR_27_1),
 
        /* Port58 */
-       PINMUX_DATA(LCD0_D0_MARK,               PORT58_FN1),
+       PINMUX_DATA(LCD0_D0_MARK,               PORT58_FN1,     MSEL3CR_6_0),
        PINMUX_DATA(KEYOUT7_MARK,               PORT58_FN3),
        PINMUX_DATA(KEYIN0_PORT58_MARK,         PORT58_FN4,     MSEL4CR_18_1),
        PINMUX_DATA(DV_D0_MARK,                 PORT58_FN6),
@@ -1633,10 +1520,6 @@ static const pinmux_enum_t pinmux_data[] = {
        PINMUX_DATA(IRQ16_PORT211_MARK,         PORT211_FN0,    MSEL1CR_16_1),
        PINMUX_DATA(HDMI_CEC_MARK,              PORT211_FN1),
 
-       /* LCDC select */
-       PINMUX_DATA(LCDC0_SELECT_MARK,                          MSEL3CR_6_0),
-       PINMUX_DATA(LCDC1_SELECT_MARK,                          MSEL3CR_6_1),
-
        /* SDENC */
        PINMUX_DATA(SDENC_CPG_MARK,                             MSEL4CR_19_0),
        PINMUX_DATA(SDENC_DV_CLKI_MARK,                         MSEL4CR_19_1),
@@ -1654,9 +1537,565 @@ static const pinmux_enum_t pinmux_data[] = {
        PINMUX_DATA(TRACEAUD_FROM_MEMC_MARK,                    MSEL5CR_30_1,   MSEL5CR_29_0),
 };
 
+#define R8A7740_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 R8A7740_PIN_I_PD(pin)          R8A7740_PIN(pin, __I | __PD)
+#define R8A7740_PIN_I_PU(pin)          R8A7740_PIN(pin, __I | __PU)
+#define R8A7740_PIN_I_PU_PD(pin)               R8A7740_PIN(pin, __I | __PUD)
+#define R8A7740_PIN_IO(pin)            R8A7740_PIN(pin, __IO)
+#define R8A7740_PIN_IO_PD(pin)         R8A7740_PIN(pin, __IO | __PD)
+#define R8A7740_PIN_IO_PU(pin)         R8A7740_PIN(pin, __IO | __PU)
+#define R8A7740_PIN_IO_PU_PD(pin)      R8A7740_PIN(pin, __IO | __PUD)
+#define R8A7740_PIN_O(pin)             R8A7740_PIN(pin, __O)
+#define R8A7740_PIN_O_PU_PD(pin)               R8A7740_PIN(pin, __O | __PUD)
+
 static struct sh_pfc_pin pinmux_pins[] = {
-       GPIO_PORT_ALL(),
+       /* Table 56-1 (I/O and Pull U/D) */
+       R8A7740_PIN_IO_PD(0),           R8A7740_PIN_IO_PD(1),
+       R8A7740_PIN_IO_PD(2),           R8A7740_PIN_IO_PD(3),
+       R8A7740_PIN_IO_PD(4),           R8A7740_PIN_IO_PD(5),
+       R8A7740_PIN_IO_PD(6),           R8A7740_PIN_IO(7),
+       R8A7740_PIN_IO(8),              R8A7740_PIN_IO(9),
+       R8A7740_PIN_IO_PD(10),          R8A7740_PIN_IO_PD(11),
+       R8A7740_PIN_IO_PD(12),          R8A7740_PIN_IO_PU_PD(13),
+       R8A7740_PIN_IO_PD(14),          R8A7740_PIN_IO_PD(15),
+       R8A7740_PIN_IO_PD(16),          R8A7740_PIN_IO_PD(17),
+       R8A7740_PIN_IO(18),             R8A7740_PIN_IO_PU(19),
+       R8A7740_PIN_IO_PU_PD(20),       R8A7740_PIN_IO_PD(21),
+       R8A7740_PIN_IO_PU_PD(22),       R8A7740_PIN_IO(23),
+       R8A7740_PIN_IO_PU(24),          R8A7740_PIN_IO_PU(25),
+       R8A7740_PIN_IO_PU(26),          R8A7740_PIN_IO_PU(27),
+       R8A7740_PIN_IO_PU(28),          R8A7740_PIN_IO_PU(29),
+       R8A7740_PIN_IO_PU(30),          R8A7740_PIN_IO_PD(31),
+       R8A7740_PIN_IO_PD(32),          R8A7740_PIN_IO_PD(33),
+       R8A7740_PIN_IO_PD(34),          R8A7740_PIN_IO_PU(35),
+       R8A7740_PIN_IO_PU(36),          R8A7740_PIN_IO_PD(37),
+       R8A7740_PIN_IO_PU(38),          R8A7740_PIN_IO_PD(39),
+       R8A7740_PIN_IO_PU_PD(40),       R8A7740_PIN_IO_PD(41),
+       R8A7740_PIN_IO_PD(42),          R8A7740_PIN_IO_PU_PD(43),
+       R8A7740_PIN_IO_PU_PD(44),       R8A7740_PIN_IO_PU_PD(45),
+       R8A7740_PIN_IO_PU_PD(46),       R8A7740_PIN_IO_PU_PD(47),
+       R8A7740_PIN_IO_PU_PD(48),       R8A7740_PIN_IO_PU_PD(49),
+       R8A7740_PIN_IO_PU_PD(50),       R8A7740_PIN_IO_PD(51),
+       R8A7740_PIN_IO_PD(52),          R8A7740_PIN_IO_PD(53),
+       R8A7740_PIN_IO_PD(54),          R8A7740_PIN_IO_PU_PD(55),
+       R8A7740_PIN_IO_PU_PD(56),       R8A7740_PIN_IO_PU_PD(57),
+       R8A7740_PIN_IO_PU_PD(58),       R8A7740_PIN_IO_PU_PD(59),
+       R8A7740_PIN_IO_PU_PD(60),       R8A7740_PIN_IO_PD(61),
+       R8A7740_PIN_IO_PD(62),          R8A7740_PIN_IO_PD(63),
+       R8A7740_PIN_IO_PD(64),          R8A7740_PIN_IO_PD(65),
+       R8A7740_PIN_IO_PU_PD(66),       R8A7740_PIN_IO_PU_PD(67),
+       R8A7740_PIN_IO_PU_PD(68),       R8A7740_PIN_IO_PU_PD(69),
+       R8A7740_PIN_IO_PU_PD(70),       R8A7740_PIN_IO_PU_PD(71),
+       R8A7740_PIN_IO_PU_PD(72),       R8A7740_PIN_IO_PU_PD(73),
+       R8A7740_PIN_IO_PU_PD(74),       R8A7740_PIN_IO_PU_PD(75),
+       R8A7740_PIN_IO_PU_PD(76),       R8A7740_PIN_IO_PU_PD(77),
+       R8A7740_PIN_IO_PU_PD(78),       R8A7740_PIN_IO_PU_PD(79),
+       R8A7740_PIN_IO_PU_PD(80),       R8A7740_PIN_IO_PU_PD(81),
+       R8A7740_PIN_IO(82),             R8A7740_PIN_IO_PU_PD(83),
+       R8A7740_PIN_IO(84),             R8A7740_PIN_IO_PD(85),
+       R8A7740_PIN_IO_PD(86),          R8A7740_PIN_IO_PD(87),
+       R8A7740_PIN_IO_PD(88),          R8A7740_PIN_IO_PD(89),
+       R8A7740_PIN_IO_PD(90),          R8A7740_PIN_IO_PU_PD(91),
+       R8A7740_PIN_IO_PU_PD(92),       R8A7740_PIN_IO_PU_PD(93),
+       R8A7740_PIN_IO_PU_PD(94),       R8A7740_PIN_IO_PU_PD(95),
+       R8A7740_PIN_IO_PU_PD(96),       R8A7740_PIN_IO_PU_PD(97),
+       R8A7740_PIN_IO_PU_PD(98),       R8A7740_PIN_IO_PU_PD(99),
+       R8A7740_PIN_IO_PU_PD(100),      R8A7740_PIN_IO(101),
+       R8A7740_PIN_IO_PU(102),         R8A7740_PIN_IO_PU_PD(103),
+       R8A7740_PIN_IO_PU(104),         R8A7740_PIN_IO_PU(105),
+       R8A7740_PIN_IO_PU_PD(106),      R8A7740_PIN_IO(107),
+       R8A7740_PIN_IO(108),            R8A7740_PIN_IO(109),
+       R8A7740_PIN_IO(110),            R8A7740_PIN_IO(111),
+       R8A7740_PIN_IO(112),            R8A7740_PIN_IO(113),
+       R8A7740_PIN_IO_PU_PD(114),      R8A7740_PIN_IO(115),
+       R8A7740_PIN_IO_PD(116),         R8A7740_PIN_IO_PD(117),
+       R8A7740_PIN_IO_PD(118),         R8A7740_PIN_IO_PD(119),
+       R8A7740_PIN_IO_PD(120),         R8A7740_PIN_IO_PD(121),
+       R8A7740_PIN_IO_PD(122),         R8A7740_PIN_IO_PD(123),
+       R8A7740_PIN_IO_PD(124),         R8A7740_PIN_IO(125),
+       R8A7740_PIN_IO(126),            R8A7740_PIN_IO(127),
+       R8A7740_PIN_IO(128),            R8A7740_PIN_IO(129),
+       R8A7740_PIN_IO(130),            R8A7740_PIN_IO(131),
+       R8A7740_PIN_IO(132),            R8A7740_PIN_IO(133),
+       R8A7740_PIN_IO(134),            R8A7740_PIN_IO(135),
+       R8A7740_PIN_IO(136),            R8A7740_PIN_IO(137),
+       R8A7740_PIN_IO(138),            R8A7740_PIN_IO(139),
+       R8A7740_PIN_IO(140),            R8A7740_PIN_IO(141),
+       R8A7740_PIN_IO_PU(142),         R8A7740_PIN_IO_PU(143),
+       R8A7740_PIN_IO_PU(144),         R8A7740_PIN_IO_PU(145),
+       R8A7740_PIN_IO_PU(146),         R8A7740_PIN_IO_PU(147),
+       R8A7740_PIN_IO_PU(148),         R8A7740_PIN_IO_PU(149),
+       R8A7740_PIN_IO_PU(150),         R8A7740_PIN_IO_PU(151),
+       R8A7740_PIN_IO_PU(152),         R8A7740_PIN_IO_PU(153),
+       R8A7740_PIN_IO_PU(154),         R8A7740_PIN_IO_PU(155),
+       R8A7740_PIN_IO_PU(156),         R8A7740_PIN_IO_PU(157),
+       R8A7740_PIN_IO_PD(158),         R8A7740_PIN_IO_PD(159),
+       R8A7740_PIN_IO_PU_PD(160),      R8A7740_PIN_IO_PD(161),
+       R8A7740_PIN_IO_PD(162),         R8A7740_PIN_IO_PD(163),
+       R8A7740_PIN_IO_PD(164),         R8A7740_PIN_IO_PD(165),
+       R8A7740_PIN_IO_PU(166),         R8A7740_PIN_IO_PU(167),
+       R8A7740_PIN_IO_PU(168),         R8A7740_PIN_IO_PU(169),
+       R8A7740_PIN_IO_PU(170),         R8A7740_PIN_IO_PU(171),
+       R8A7740_PIN_IO_PD(172),         R8A7740_PIN_IO_PD(173),
+       R8A7740_PIN_IO_PD(174),         R8A7740_PIN_IO_PD(175),
+       R8A7740_PIN_IO_PU(176),         R8A7740_PIN_IO_PU_PD(177),
+       R8A7740_PIN_IO_PU(178),         R8A7740_PIN_IO_PD(179),
+       R8A7740_PIN_IO_PD(180),         R8A7740_PIN_IO_PU(181),
+       R8A7740_PIN_IO_PU(182),         R8A7740_PIN_IO(183),
+       R8A7740_PIN_IO_PD(184),         R8A7740_PIN_IO_PD(185),
+       R8A7740_PIN_IO_PD(186),         R8A7740_PIN_IO_PD(187),
+       R8A7740_PIN_IO_PD(188),         R8A7740_PIN_IO_PD(189),
+       R8A7740_PIN_IO_PD(190),         R8A7740_PIN_IO_PD(191),
+       R8A7740_PIN_IO_PD(192),         R8A7740_PIN_IO_PU_PD(193),
+       R8A7740_PIN_IO_PU_PD(194),      R8A7740_PIN_IO_PD(195),
+       R8A7740_PIN_IO_PU_PD(196),      R8A7740_PIN_IO_PD(197),
+       R8A7740_PIN_IO_PU_PD(198),      R8A7740_PIN_IO_PU_PD(199),
+       R8A7740_PIN_IO_PU_PD(200),      R8A7740_PIN_IO_PU(201),
+       R8A7740_PIN_IO_PU_PD(202),      R8A7740_PIN_IO(203),
+       R8A7740_PIN_IO_PU_PD(204),      R8A7740_PIN_IO_PU_PD(205),
+       R8A7740_PIN_IO_PU_PD(206),      R8A7740_PIN_IO_PU_PD(207),
+       R8A7740_PIN_IO_PU_PD(208),      R8A7740_PIN_IO_PD(209),
+       R8A7740_PIN_IO_PD(210),         R8A7740_PIN_IO_PD(211),
+};
+
+/* - BSC -------------------------------------------------------------------- */
+static const unsigned int bsc_data8_pins[] = {
+       /* D[0:7] */
+       157, 156, 155, 154, 153, 152, 151, 150,
+};
+static const unsigned int bsc_data8_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_data16_pins[] = {
+       /* D[0:15] */
+       157, 156, 155, 154, 153, 152, 151, 150,
+       149, 148, 147, 146, 145, 144, 143, 142,
+};
+static const unsigned int bsc_data16_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,
+       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_data32_pins[] = {
+       /* D[0:31] */
+       157, 156, 155, 154, 153, 152, 151, 150,
+       149, 148, 147, 146, 145, 144, 143, 142,
+       171, 170, 169, 168, 167, 166, 173, 172,
+       165, 164, 163, 162, 161, 160, 159, 158,
+};
+static const unsigned int bsc_data32_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,
+       D8_NAF8_MARK, D9_NAF9_MARK, D10_NAF10_MARK, D11_NAF11_MARK,
+       D12_NAF12_MARK, D13_NAF13_MARK, D14_NAF14_MARK, D15_NAF15_MARK,
+       D16_MARK, D17_MARK, D18_MARK, D19_MARK,
+       D20_MARK, D21_MARK, D22_MARK, D23_MARK,
+       D24_MARK, D25_MARK, D26_MARK, D27_MARK,
+       D28_MARK, D29_MARK, D30_MARK, D31_MARK,
+};
+static const unsigned int bsc_cs0_pins[] = {
+       /* CS */
+       109,
+};
+static const unsigned int bsc_cs0_mux[] = {
+       CS0_MARK,
+};
+static const unsigned int bsc_cs2_pins[] = {
+       /* CS */
+       110,
+};
+static const unsigned int bsc_cs2_mux[] = {
+       CS2_MARK,
+};
+static const unsigned int bsc_cs4_pins[] = {
+       /* CS */
+       111,
+};
+static const unsigned int bsc_cs4_mux[] = {
+       CS4_MARK,
+};
+static const unsigned int bsc_cs5a_0_pins[] = {
+       /* CS */
+       105,
+};
+static const unsigned int bsc_cs5a_0_mux[] = {
+       CS5A_PORT105_MARK,
+};
+static const unsigned int bsc_cs5a_1_pins[] = {
+       /* CS */
+       19,
+};
+static const unsigned int bsc_cs5a_1_mux[] = {
+       CS5A_PORT19_MARK,
+};
+static const unsigned int bsc_cs5b_pins[] = {
+       /* CS */
+       103,
+};
+static const unsigned int bsc_cs5b_mux[] = {
+       CS5B_MARK,
+};
+static const unsigned int bsc_cs6a_pins[] = {
+       /* CS */
+       104,
+};
+static const unsigned int bsc_cs6a_mux[] = {
+       CS6A_MARK,
+};
+static const unsigned int bsc_rd_we8_pins[] = {
+       /* RD, WE[0] */
+       115, 113,
+};
+static const unsigned int bsc_rd_we8_mux[] = {
+       RD_FSC_MARK, WE0_FWE_MARK,
+};
+static const unsigned int bsc_rd_we16_pins[] = {
+       /* RD, WE[0:1] */
+       115, 113, 112,
+};
+static const unsigned int bsc_rd_we16_mux[] = {
+       RD_FSC_MARK, WE0_FWE_MARK, WE1_MARK,
+};
+static const unsigned int bsc_rd_we32_pins[] = {
+       /* RD, WE[0:3] */
+       115, 113, 112, 108, 107,
+};
+static const unsigned int bsc_rd_we32_mux[] = {
+       RD_FSC_MARK, WE0_FWE_MARK, WE1_MARK, WE2_ICIORD_MARK, WE3_ICIOWR_MARK,
+};
+static const unsigned int bsc_bs_pins[] = {
+       /* BS */
+       175,
+};
+static const unsigned int bsc_bs_mux[] = {
+       BS_MARK,
+};
+static const unsigned int bsc_rdwr_pins[] = {
+       /* RDWR */
+       114,
+};
+static const unsigned int bsc_rdwr_mux[] = {
+       RDWR_MARK,
+};
+/* - CEU0 ------------------------------------------------------------------- */
+static const unsigned int ceu0_data_0_7_pins[] = {
+       /* D[0:7] */
+       34, 33, 32, 31, 30, 29, 28, 27,
+};
+static const unsigned int ceu0_data_0_7_mux[] = {
+       VIO0_D0_MARK, VIO0_D1_MARK, VIO0_D2_MARK, VIO0_D3_MARK,
+       VIO0_D4_MARK, VIO0_D5_MARK, VIO0_D6_MARK, VIO0_D7_MARK,
+};
+static const unsigned int ceu0_data_8_15_0_pins[] = {
+       /* D[8:15] */
+       182, 181, 180, 179, 178, 26, 25, 24,
+};
+static const unsigned int ceu0_data_8_15_0_mux[] = {
+       VIO0_D8_MARK, VIO0_D9_MARK, VIO0_D10_MARK, VIO0_D11_MARK,
+       VIO0_D12_MARK, VIO0_D13_PORT26_MARK, VIO0_D14_PORT25_MARK,
+       VIO0_D15_PORT24_MARK,
+};
+static const unsigned int ceu0_data_8_15_1_pins[] = {
+       /* D[8:15] */
+       182, 181, 180, 179, 178, 22, 95, 96,
+};
+static const unsigned int ceu0_data_8_15_1_mux[] = {
+       VIO0_D8_MARK, VIO0_D9_MARK, VIO0_D10_MARK, VIO0_D11_MARK,
+       VIO0_D12_MARK, VIO0_D13_PORT22_MARK, VIO0_D14_PORT95_MARK,
+       VIO0_D15_PORT96_MARK,
+};
+static const unsigned int ceu0_clk_0_pins[] = {
+       /* CKO */
+       36,
+};
+static const unsigned int ceu0_clk_0_mux[] = {
+       VIO_CKO_MARK,
+};
+static const unsigned int ceu0_clk_1_pins[] = {
+       /* CKO */
+       14,
+};
+static const unsigned int ceu0_clk_1_mux[] = {
+       VIO_CKO1_MARK,
+};
+static const unsigned int ceu0_clk_2_pins[] = {
+       /* CKO */
+       15,
+};
+static const unsigned int ceu0_clk_2_mux[] = {
+       VIO_CKO2_MARK,
+};
+static const unsigned int ceu0_sync_pins[] = {
+       /* CLK, VD, HD */
+       35, 39, 37,
+};
+static const unsigned int ceu0_sync_mux[] = {
+       VIO0_CLK_MARK, VIO0_VD_MARK, VIO0_HD_MARK,
+};
+static const unsigned int ceu0_field_pins[] = {
+       /* FIELD */
+       38,
+};
+static const unsigned int ceu0_field_mux[] = {
+       VIO0_FIELD_MARK,
+};
+/* - CEU1 ------------------------------------------------------------------- */
+static const unsigned int ceu1_data_pins[] = {
+       /* D[0:7] */
+       182, 181, 180, 179, 178, 26, 25, 24,
+};
+static const unsigned int ceu1_data_mux[] = {
+       VIO1_D0_MARK, VIO1_D1_MARK, VIO1_D2_MARK, VIO1_D3_MARK,
+       VIO1_D4_MARK, VIO1_D5_MARK, VIO1_D6_MARK, VIO1_D7_MARK,
+};
+static const unsigned int ceu1_clk_pins[] = {
+       /* CKO */
+       23,
+};
+static const unsigned int ceu1_clk_mux[] = {
+       VIO_CKO_1_MARK,
+};
+static const unsigned int ceu1_sync_pins[] = {
+       /* CLK, VD, HD */
+       197, 198, 160,
+};
+static const unsigned int ceu1_sync_mux[] = {
+       VIO1_CLK_MARK, VIO1_VD_MARK, VIO1_HD_MARK,
+};
+static const unsigned int ceu1_field_pins[] = {
+       /* FIELD */
+       21,
+};
+static const unsigned int ceu1_field_mux[] = {
+       VIO1_FIELD_MARK,
+};
+/* - FSIA ------------------------------------------------------------------- */
+static const unsigned int fsia_mclk_in_pins[] = {
+       /* CK */
+       11,
+};
+static const unsigned int fsia_mclk_in_mux[] = {
+       FSIACK_MARK,
+};
+static const unsigned int fsia_mclk_out_pins[] = {
+       /* OMC */
+       10,
+};
+static const unsigned int fsia_mclk_out_mux[] = {
+       FSIAOMC_MARK,
+};
+static const unsigned int fsia_sclk_in_pins[] = {
+       /* ILR, IBT */
+       12, 13,
+};
+static const unsigned int fsia_sclk_in_mux[] = {
+       FSIAILR_MARK, FSIAIBT_MARK,
+};
+static const unsigned int fsia_sclk_out_pins[] = {
+       /* OLR, OBT */
+       7, 8,
+};
+static const unsigned int fsia_sclk_out_mux[] = {
+       FSIAOLR_MARK, FSIAOBT_MARK,
+};
+static const unsigned int fsia_data_in_0_pins[] = {
+       /* ISLD */
+       0,
 };
+static const unsigned int fsia_data_in_0_mux[] = {
+       FSIAISLD_PORT0_MARK,
+};
+static const unsigned int fsia_data_in_1_pins[] = {
+       /* ISLD */
+       5,
+};
+static const unsigned int fsia_data_in_1_mux[] = {
+       FSIAISLD_PORT5_MARK,
+};
+static const unsigned int fsia_data_out_0_pins[] = {
+       /* OSLD */
+       9,
+};
+static const unsigned int fsia_data_out_0_mux[] = {
+       FSIAOSLD_MARK,
+};
+static const unsigned int fsia_data_out_1_pins[] = {
+       /* OSLD */
+       0,
+};
+static const unsigned int fsia_data_out_1_mux[] = {
+       FSIAOSLD1_MARK,
+};
+static const unsigned int fsia_data_out_2_pins[] = {
+       /* OSLD */
+       1,
+};
+static const unsigned int fsia_data_out_2_mux[] = {
+       FSIAOSLD2_MARK,
+};
+static const unsigned int fsia_spdif_0_pins[] = {
+       /* SPDIF */
+       9,
+};
+static const unsigned int fsia_spdif_0_mux[] = {
+       FSIASPDIF_PORT9_MARK,
+};
+static const unsigned int fsia_spdif_1_pins[] = {
+       /* SPDIF */
+       18,
+};
+static const unsigned int fsia_spdif_1_mux[] = {
+       FSIASPDIF_PORT18_MARK,
+};
+/* - FSIB ------------------------------------------------------------------- */
+static const unsigned int fsib_mclk_in_pins[] = {
+       /* CK */
+       11,
+};
+static const unsigned int fsib_mclk_in_mux[] = {
+       FSIBCK_MARK,
+};
+/* - GETHER ----------------------------------------------------------------- */
+static const unsigned int gether_rmii_pins[] = {
+       /* RXD[0:1], RX_ER, CRS_DV, TXD[0:1], TX_EN, REF_CLK, MDC, MDIO */
+       195, 196, 194, 193, 200, 201, 199, 159, 202, 208,
+};
+static const unsigned int gether_rmii_mux[] = {
+       RMII_RXD0_MARK, RMII_RXD1_MARK, RMII_RX_ER_MARK, RMII_CRS_DV_MARK,
+       RMII_TXD0_MARK, RMII_TXD1_MARK, RMII_TX_EN_MARK, RMII_REF50CK_MARK,
+       RMII_MDC_MARK, RMII_MDIO_MARK,
+};
+static const unsigned int gether_mii_pins[] = {
+       /* RXD[0:3], RX_CLK, RX_DV, RX_ER
+        * TXD[0:3], TX_CLK, TX_EN, TX_ER
+        * CRS, COL, MDC, MDIO,
+        */
+       185, 186, 187, 188, 174, 161, 204,
+       171, 170, 169, 168, 184, 183, 203,
+       205, 163, 206, 207,
+};
+static const unsigned int gether_mii_mux[] = {
+       ET_ERXD0_MARK, ET_ERXD1_MARK, ET_ERXD2_MARK, ET_ERXD3_MARK,
+       ET_RX_CLK_MARK, ET_RX_DV_MARK, ET_RX_ER_MARK,
+       ET_ETXD0_MARK, ET_ETXD1_MARK, ET_ETXD2_MARK, ET_ETXD3_MARK,
+       ET_TX_CLK_MARK, ET_TX_EN_MARK, ET_TX_ER_MARK,
+       ET_CRS_MARK, ET_COL_MARK, ET_MDC_MARK, ET_MDIO_MARK,
+};
+static const unsigned int gether_gmii_pins[] = {
+       /* RXD[0:7], RX_CLK, RX_DV, RX_ER
+        * TXD[0:7], GTX_CLK, TX_CLK, TX_EN, TX_ER
+        * CRS, COL, MDC, MDIO, REF125CK_MARK,
+        */
+       185, 186, 187, 188, 189, 190, 191, 192, 174, 161, 204,
+       171, 170, 169, 168, 167, 166, 173, 172, 176, 184, 183, 203,
+       205, 163, 206, 207,
+};
+static const unsigned int gether_gmii_mux[] = {
+       ET_ERXD0_MARK, ET_ERXD1_MARK, ET_ERXD2_MARK, ET_ERXD3_MARK,
+       ET_ERXD4_MARK, ET_ERXD5_MARK, ET_ERXD6_MARK, ET_ERXD7_MARK,
+       ET_RX_CLK_MARK, ET_RX_DV_MARK, ET_RX_ER_MARK,
+       ET_ETXD0_MARK, ET_ETXD1_MARK, ET_ETXD2_MARK, ET_ETXD3_MARK,
+       ET_ETXD4_MARK, ET_ETXD5_MARK, ET_ETXD6_MARK, ET_ETXD7_MARK,
+       ET_GTX_CLK_MARK, ET_TX_CLK_MARK, ET_TX_EN_MARK, ET_TX_ER_MARK,
+       ET_CRS_MARK, ET_COL_MARK, ET_MDC_MARK, ET_MDIO_MARK,
+       RMII_REF125CK_MARK,
+};
+static const unsigned int gether_int_pins[] = {
+       /* PHY_INT */
+       164,
+};
+static const unsigned int gether_int_mux[] = {
+       ET_PHY_INT_MARK,
+};
+static const unsigned int gether_link_pins[] = {
+       /* LINK */
+       177,
+};
+static const unsigned int gether_link_mux[] = {
+       ET_LINK_MARK,
+};
+static const unsigned int gether_wol_pins[] = {
+       /* WOL */
+       175,
+};
+static const unsigned int gether_wol_mux[] = {
+       ET_WOL_MARK,
+};
+/* - HDMI ------------------------------------------------------------------- */
+static const unsigned int hdmi_pins[] = {
+       /* HPD, CEC */
+       210, 211,
+};
+static const unsigned int hdmi_mux[] = {
+       HDMI_HPD_MARK, HDMI_CEC_MARK,
+};
+/* - INTC ------------------------------------------------------------------- */
+IRQC_PINS_MUX(0, 0, 2);
+IRQC_PINS_MUX(0, 1, 13);
+IRQC_PIN_MUX(1, 20);
+IRQC_PINS_MUX(2, 0, 11);
+IRQC_PINS_MUX(2, 1, 12);
+IRQC_PINS_MUX(3, 0, 10);
+IRQC_PINS_MUX(3, 1, 14);
+IRQC_PINS_MUX(4, 0, 15);
+IRQC_PINS_MUX(4, 1, 172);
+IRQC_PINS_MUX(5, 0, 0);
+IRQC_PINS_MUX(5, 1, 1);
+IRQC_PINS_MUX(6, 0, 121);
+IRQC_PINS_MUX(6, 1, 173);
+IRQC_PINS_MUX(7, 0, 120);
+IRQC_PINS_MUX(7, 1, 209);
+IRQC_PIN_MUX(8, 119);
+IRQC_PINS_MUX(9, 0, 118);
+IRQC_PINS_MUX(9, 1, 210);
+IRQC_PIN_MUX(10, 19);
+IRQC_PIN_MUX(11, 104);
+IRQC_PINS_MUX(12, 0, 42);
+IRQC_PINS_MUX(12, 1, 97);
+IRQC_PINS_MUX(13, 0, 64);
+IRQC_PINS_MUX(13, 1, 98);
+IRQC_PINS_MUX(14, 0, 63);
+IRQC_PINS_MUX(14, 1, 99);
+IRQC_PINS_MUX(15, 0, 62);
+IRQC_PINS_MUX(15, 1, 100);
+IRQC_PINS_MUX(16, 0, 68);
+IRQC_PINS_MUX(16, 1, 211);
+IRQC_PIN_MUX(17, 69);
+IRQC_PIN_MUX(18, 70);
+IRQC_PIN_MUX(19, 71);
+IRQC_PIN_MUX(20, 67);
+IRQC_PIN_MUX(21, 202);
+IRQC_PIN_MUX(22, 95);
+IRQC_PIN_MUX(23, 96);
+IRQC_PIN_MUX(24, 180);
+IRQC_PIN_MUX(25, 38);
+IRQC_PINS_MUX(26, 0, 58);
+IRQC_PINS_MUX(26, 1, 81);
+IRQC_PINS_MUX(27, 0, 57);
+IRQC_PINS_MUX(27, 1, 168);
+IRQC_PINS_MUX(28, 0, 56);
+IRQC_PINS_MUX(28, 1, 169);
+IRQC_PINS_MUX(29, 0, 50);
+IRQC_PINS_MUX(29, 1, 170);
+IRQC_PINS_MUX(30, 0, 49);
+IRQC_PINS_MUX(30, 1, 171);
+IRQC_PINS_MUX(31, 0, 41);
+IRQC_PINS_MUX(31, 1, 167);
 
 /* - LCD0 ------------------------------------------------------------------- */
 static const unsigned int lcd0_data8_pins[] = {
@@ -1930,6 +2369,260 @@ static const unsigned int mmc0_ctrl_1_pins[] = {
 static const unsigned int mmc0_ctrl_1_mux[] = {
        MMC1_CMD_PORT104_MARK, MMC1_CLK_PORT103_MARK,
 };
+/* - SCIFA0 ----------------------------------------------------------------- */
+static const unsigned int scifa0_data_pins[] = {
+       /* RXD, TXD */
+       197, 198,
+};
+static const unsigned int scifa0_data_mux[] = {
+       SCIFA0_RXD_MARK, SCIFA0_TXD_MARK,
+};
+static const unsigned int scifa0_clk_pins[] = {
+       /* SCK */
+       188,
+};
+static const unsigned int scifa0_clk_mux[] = {
+       SCIFA0_SCK_MARK,
+};
+static const unsigned int scifa0_ctrl_pins[] = {
+       /* RTS, CTS */
+       194, 193,
+};
+static const unsigned int scifa0_ctrl_mux[] = {
+       SCIFA0_RTS_MARK, SCIFA0_CTS_MARK,
+};
+/* - SCIFA1 ----------------------------------------------------------------- */
+static const unsigned int scifa1_data_pins[] = {
+       /* RXD, TXD */
+       195, 196,
+};
+static const unsigned int scifa1_data_mux[] = {
+       SCIFA1_RXD_MARK, SCIFA1_TXD_MARK,
+};
+static const unsigned int scifa1_clk_pins[] = {
+       /* SCK */
+       185,
+};
+static const unsigned int scifa1_clk_mux[] = {
+       SCIFA1_SCK_MARK,
+};
+static const unsigned int scifa1_ctrl_pins[] = {
+       /* RTS, CTS */
+       23, 21,
+};
+static const unsigned int scifa1_ctrl_mux[] = {
+       SCIFA1_RTS_MARK, SCIFA1_CTS_MARK,
+};
+/* - SCIFA2 ----------------------------------------------------------------- */
+static const unsigned int scifa2_data_pins[] = {
+       /* RXD, TXD */
+       200, 201,
+};
+static const unsigned int scifa2_data_mux[] = {
+       SCIFA2_RXD_MARK, SCIFA2_TXD_MARK,
+};
+static const unsigned int scifa2_clk_0_pins[] = {
+       /* SCK */
+       22,
+};
+static const unsigned int scifa2_clk_0_mux[] = {
+       SCIFA2_SCK_PORT22_MARK,
+};
+static const unsigned int scifa2_clk_1_pins[] = {
+       /* SCK */
+       199,
+};
+static const unsigned int scifa2_clk_1_mux[] = {
+       SCIFA2_SCK_PORT199_MARK,
+};
+static const unsigned int scifa2_ctrl_pins[] = {
+       /* RTS, CTS */
+       96, 95,
+};
+static const unsigned int scifa2_ctrl_mux[] = {
+       SCIFA2_RTS_MARK, SCIFA2_CTS_MARK,
+};
+/* - SCIFA3 ----------------------------------------------------------------- */
+static const unsigned int scifa3_data_0_pins[] = {
+       /* RXD, TXD */
+       174, 175,
+};
+static const unsigned int scifa3_data_0_mux[] = {
+       SCIFA3_RXD_PORT174_MARK, SCIFA3_TXD_PORT175_MARK,
+};
+static const unsigned int scifa3_clk_0_pins[] = {
+       /* SCK */
+       116,
+};
+static const unsigned int scifa3_clk_0_mux[] = {
+       SCIFA3_SCK_PORT116_MARK,
+};
+static const unsigned int scifa3_ctrl_0_pins[] = {
+       /* RTS, CTS */
+       105, 117,
+};
+static const unsigned int scifa3_ctrl_0_mux[] = {
+       SCIFA3_RTS_PORT105_MARK, SCIFA3_CTS_PORT117_MARK,
+};
+static const unsigned int scifa3_data_1_pins[] = {
+       /* RXD, TXD */
+       159, 160,
+};
+static const unsigned int scifa3_data_1_mux[] = {
+       SCIFA3_RXD_PORT159_MARK, SCIFA3_TXD_PORT160_MARK,
+};
+static const unsigned int scifa3_clk_1_pins[] = {
+       /* SCK */
+       158,
+};
+static const unsigned int scifa3_clk_1_mux[] = {
+       SCIFA3_SCK_PORT158_MARK,
+};
+static const unsigned int scifa3_ctrl_1_pins[] = {
+       /* RTS, CTS */
+       161, 162,
+};
+static const unsigned int scifa3_ctrl_1_mux[] = {
+       SCIFA3_RTS_PORT161_MARK, SCIFA3_CTS_PORT162_MARK,
+};
+/* - SCIFA4 ----------------------------------------------------------------- */
+static const unsigned int scifa4_data_0_pins[] = {
+       /* RXD, TXD */
+       12, 13,
+};
+static const unsigned int scifa4_data_0_mux[] = {
+       SCIFA4_RXD_PORT12_MARK, SCIFA4_TXD_PORT13_MARK,
+};
+static const unsigned int scifa4_data_1_pins[] = {
+       /* RXD, TXD */
+       204, 203,
+};
+static const unsigned int scifa4_data_1_mux[] = {
+       SCIFA4_RXD_PORT204_MARK, SCIFA4_TXD_PORT203_MARK,
+};
+static const unsigned int scifa4_data_2_pins[] = {
+       /* RXD, TXD */
+       94, 93,
+};
+static const unsigned int scifa4_data_2_mux[] = {
+       SCIFA4_RXD_PORT94_MARK, SCIFA4_TXD_PORT93_MARK,
+};
+static const unsigned int scifa4_clk_0_pins[] = {
+       /* SCK */
+       21,
+};
+static const unsigned int scifa4_clk_0_mux[] = {
+       SCIFA4_SCK_PORT21_MARK,
+};
+static const unsigned int scifa4_clk_1_pins[] = {
+       /* SCK */
+       205,
+};
+static const unsigned int scifa4_clk_1_mux[] = {
+       SCIFA4_SCK_PORT205_MARK,
+};
+/* - SCIFA5 ----------------------------------------------------------------- */
+static const unsigned int scifa5_data_0_pins[] = {
+       /* RXD, TXD */
+       10, 20,
+};
+static const unsigned int scifa5_data_0_mux[] = {
+       SCIFA5_RXD_PORT10_MARK, SCIFA5_TXD_PORT20_MARK,
+};
+static const unsigned int scifa5_data_1_pins[] = {
+       /* RXD, TXD */
+       207, 208,
+};
+static const unsigned int scifa5_data_1_mux[] = {
+       SCIFA5_RXD_PORT207_MARK, SCIFA5_TXD_PORT208_MARK,
+};
+static const unsigned int scifa5_data_2_pins[] = {
+       /* RXD, TXD */
+       92, 91,
+};
+static const unsigned int scifa5_data_2_mux[] = {
+       SCIFA5_RXD_PORT92_MARK, SCIFA5_TXD_PORT91_MARK,
+};
+static const unsigned int scifa5_clk_0_pins[] = {
+       /* SCK */
+       23,
+};
+static const unsigned int scifa5_clk_0_mux[] = {
+       SCIFA5_SCK_PORT23_MARK,
+};
+static const unsigned int scifa5_clk_1_pins[] = {
+       /* SCK */
+       206,
+};
+static const unsigned int scifa5_clk_1_mux[] = {
+       SCIFA5_SCK_PORT206_MARK,
+};
+/* - SCIFA6 ----------------------------------------------------------------- */
+static const unsigned int scifa6_data_pins[] = {
+       /* RXD, TXD */
+       25, 26,
+};
+static const unsigned int scifa6_data_mux[] = {
+       SCIFA6_RXD_MARK, SCIFA6_TXD_MARK,
+};
+static const unsigned int scifa6_clk_pins[] = {
+       /* SCK */
+       24,
+};
+static const unsigned int scifa6_clk_mux[] = {
+       SCIFA6_SCK_MARK,
+};
+/* - SCIFA7 ----------------------------------------------------------------- */
+static const unsigned int scifa7_data_pins[] = {
+       /* RXD, TXD */
+       0, 1,
+};
+static const unsigned int scifa7_data_mux[] = {
+       SCIFA7_RXD_MARK, SCIFA7_TXD_MARK,
+};
+/* - SCIFB ------------------------------------------------------------------ */
+static const unsigned int scifb_data_0_pins[] = {
+       /* RXD, TXD */
+       191, 192,
+};
+static const unsigned int scifb_data_0_mux[] = {
+       SCIFB_RXD_PORT191_MARK, SCIFB_TXD_PORT192_MARK,
+};
+static const unsigned int scifb_clk_0_pins[] = {
+       /* SCK */
+       190,
+};
+static const unsigned int scifb_clk_0_mux[] = {
+       SCIFB_SCK_PORT190_MARK,
+};
+static const unsigned int scifb_ctrl_0_pins[] = {
+       /* RTS, CTS */
+       186, 187,
+};
+static const unsigned int scifb_ctrl_0_mux[] = {
+       SCIFB_RTS_PORT186_MARK, SCIFB_CTS_PORT187_MARK,
+};
+static const unsigned int scifb_data_1_pins[] = {
+       /* RXD, TXD */
+       3, 4,
+};
+static const unsigned int scifb_data_1_mux[] = {
+       SCIFB_RXD_PORT3_MARK, SCIFB_TXD_PORT4_MARK,
+};
+static const unsigned int scifb_clk_1_pins[] = {
+       /* SCK */
+       2,
+};
+static const unsigned int scifb_clk_1_mux[] = {
+       SCIFB_SCK_PORT2_MARK,
+};
+static const unsigned int scifb_ctrl_1_pins[] = {
+       /* RTS, CTS */
+       172, 173,
+};
+static const unsigned int scifb_ctrl_1_mux[] = {
+       SCIFB_RTS_PORT172_MARK, SCIFB_CTS_PORT173_MARK,
+};
 /* - SDHI0 ------------------------------------------------------------------ */
 static const unsigned int sdhi0_data1_pins[] = {
        /* D0 */
@@ -2052,8 +2745,141 @@ static const unsigned int sdhi2_wp_1_pins[] = {
 static const unsigned int sdhi2_wp_1_mux[] = {
        SDHI2_WP_PORT25_MARK,
 };
+/* - TPU0 ------------------------------------------------------------------- */
+static const unsigned int tpu0_to0_pins[] = {
+       /* TO */
+       23,
+};
+static const unsigned int tpu0_to0_mux[] = {
+       TPU0TO0_MARK,
+};
+static const unsigned int tpu0_to1_pins[] = {
+       /* TO */
+       21,
+};
+static const unsigned int tpu0_to1_mux[] = {
+       TPU0TO1_MARK,
+};
+static const unsigned int tpu0_to2_0_pins[] = {
+       /* TO */
+       66,
+};
+static const unsigned int tpu0_to2_0_mux[] = {
+       TPU0TO2_PORT66_MARK,
+};
+static const unsigned int tpu0_to2_1_pins[] = {
+       /* TO */
+       202,
+};
+static const unsigned int tpu0_to2_1_mux[] = {
+       TPU0TO2_PORT202_MARK,
+};
+static const unsigned int tpu0_to3_pins[] = {
+       /* TO */
+       180,
+};
+static const unsigned int tpu0_to3_mux[] = {
+       TPU0TO3_MARK,
+};
 
 static const struct sh_pfc_pin_group pinmux_groups[] = {
+       SH_PFC_PIN_GROUP(bsc_data8),
+       SH_PFC_PIN_GROUP(bsc_data16),
+       SH_PFC_PIN_GROUP(bsc_data32),
+       SH_PFC_PIN_GROUP(bsc_cs0),
+       SH_PFC_PIN_GROUP(bsc_cs2),
+       SH_PFC_PIN_GROUP(bsc_cs4),
+       SH_PFC_PIN_GROUP(bsc_cs5a_0),
+       SH_PFC_PIN_GROUP(bsc_cs5a_1),
+       SH_PFC_PIN_GROUP(bsc_cs5b),
+       SH_PFC_PIN_GROUP(bsc_cs6a),
+       SH_PFC_PIN_GROUP(bsc_rd_we8),
+       SH_PFC_PIN_GROUP(bsc_rd_we16),
+       SH_PFC_PIN_GROUP(bsc_rd_we32),
+       SH_PFC_PIN_GROUP(bsc_bs),
+       SH_PFC_PIN_GROUP(bsc_rdwr),
+       SH_PFC_PIN_GROUP(ceu0_data_0_7),
+       SH_PFC_PIN_GROUP(ceu0_data_8_15_0),
+       SH_PFC_PIN_GROUP(ceu0_data_8_15_1),
+       SH_PFC_PIN_GROUP(ceu0_clk_0),
+       SH_PFC_PIN_GROUP(ceu0_clk_1),
+       SH_PFC_PIN_GROUP(ceu0_clk_2),
+       SH_PFC_PIN_GROUP(ceu0_sync),
+       SH_PFC_PIN_GROUP(ceu0_field),
+       SH_PFC_PIN_GROUP(ceu1_data),
+       SH_PFC_PIN_GROUP(ceu1_clk),
+       SH_PFC_PIN_GROUP(ceu1_sync),
+       SH_PFC_PIN_GROUP(ceu1_field),
+       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_0),
+       SH_PFC_PIN_GROUP(fsia_data_in_1),
+       SH_PFC_PIN_GROUP(fsia_data_out_0),
+       SH_PFC_PIN_GROUP(fsia_data_out_1),
+       SH_PFC_PIN_GROUP(fsia_data_out_2),
+       SH_PFC_PIN_GROUP(fsia_spdif_0),
+       SH_PFC_PIN_GROUP(fsia_spdif_1),
+       SH_PFC_PIN_GROUP(fsib_mclk_in),
+       SH_PFC_PIN_GROUP(gether_rmii),
+       SH_PFC_PIN_GROUP(gether_mii),
+       SH_PFC_PIN_GROUP(gether_gmii),
+       SH_PFC_PIN_GROUP(gether_int),
+       SH_PFC_PIN_GROUP(gether_link),
+       SH_PFC_PIN_GROUP(gether_wol),
+       SH_PFC_PIN_GROUP(hdmi),
+       SH_PFC_PIN_GROUP(intc_irq0_0),
+       SH_PFC_PIN_GROUP(intc_irq0_1),
+       SH_PFC_PIN_GROUP(intc_irq1),
+       SH_PFC_PIN_GROUP(intc_irq2_0),
+       SH_PFC_PIN_GROUP(intc_irq2_1),
+       SH_PFC_PIN_GROUP(intc_irq3_0),
+       SH_PFC_PIN_GROUP(intc_irq3_1),
+       SH_PFC_PIN_GROUP(intc_irq4_0),
+       SH_PFC_PIN_GROUP(intc_irq4_1),
+       SH_PFC_PIN_GROUP(intc_irq5_0),
+       SH_PFC_PIN_GROUP(intc_irq5_1),
+       SH_PFC_PIN_GROUP(intc_irq6_0),
+       SH_PFC_PIN_GROUP(intc_irq6_1),
+       SH_PFC_PIN_GROUP(intc_irq7_0),
+       SH_PFC_PIN_GROUP(intc_irq7_1),
+       SH_PFC_PIN_GROUP(intc_irq8),
+       SH_PFC_PIN_GROUP(intc_irq9_0),
+       SH_PFC_PIN_GROUP(intc_irq9_1),
+       SH_PFC_PIN_GROUP(intc_irq10),
+       SH_PFC_PIN_GROUP(intc_irq11),
+       SH_PFC_PIN_GROUP(intc_irq12_0),
+       SH_PFC_PIN_GROUP(intc_irq12_1),
+       SH_PFC_PIN_GROUP(intc_irq13_0),
+       SH_PFC_PIN_GROUP(intc_irq13_1),
+       SH_PFC_PIN_GROUP(intc_irq14_0),
+       SH_PFC_PIN_GROUP(intc_irq14_1),
+       SH_PFC_PIN_GROUP(intc_irq15_0),
+       SH_PFC_PIN_GROUP(intc_irq15_1),
+       SH_PFC_PIN_GROUP(intc_irq16_0),
+       SH_PFC_PIN_GROUP(intc_irq16_1),
+       SH_PFC_PIN_GROUP(intc_irq17),
+       SH_PFC_PIN_GROUP(intc_irq18),
+       SH_PFC_PIN_GROUP(intc_irq19),
+       SH_PFC_PIN_GROUP(intc_irq20),
+       SH_PFC_PIN_GROUP(intc_irq21),
+       SH_PFC_PIN_GROUP(intc_irq22),
+       SH_PFC_PIN_GROUP(intc_irq23),
+       SH_PFC_PIN_GROUP(intc_irq24),
+       SH_PFC_PIN_GROUP(intc_irq25),
+       SH_PFC_PIN_GROUP(intc_irq26_0),
+       SH_PFC_PIN_GROUP(intc_irq26_1),
+       SH_PFC_PIN_GROUP(intc_irq27_0),
+       SH_PFC_PIN_GROUP(intc_irq27_1),
+       SH_PFC_PIN_GROUP(intc_irq28_0),
+       SH_PFC_PIN_GROUP(intc_irq28_1),
+       SH_PFC_PIN_GROUP(intc_irq29_0),
+       SH_PFC_PIN_GROUP(intc_irq29_1),
+       SH_PFC_PIN_GROUP(intc_irq30_0),
+       SH_PFC_PIN_GROUP(intc_irq30_1),
+       SH_PFC_PIN_GROUP(intc_irq31_0),
+       SH_PFC_PIN_GROUP(intc_irq31_1),
        SH_PFC_PIN_GROUP(lcd0_data8),
        SH_PFC_PIN_GROUP(lcd0_data9),
        SH_PFC_PIN_GROUP(lcd0_data12),
@@ -2084,6 +2910,41 @@ static const struct sh_pfc_pin_group pinmux_groups[] = {
        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),
+       SH_PFC_PIN_GROUP(scifa2_clk_0),
+       SH_PFC_PIN_GROUP(scifa2_clk_1),
+       SH_PFC_PIN_GROUP(scifa2_ctrl),
+       SH_PFC_PIN_GROUP(scifa3_data_0),
+       SH_PFC_PIN_GROUP(scifa3_clk_0),
+       SH_PFC_PIN_GROUP(scifa3_ctrl_0),
+       SH_PFC_PIN_GROUP(scifa3_data_1),
+       SH_PFC_PIN_GROUP(scifa3_clk_1),
+       SH_PFC_PIN_GROUP(scifa3_ctrl_1),
+       SH_PFC_PIN_GROUP(scifa4_data_0),
+       SH_PFC_PIN_GROUP(scifa4_data_1),
+       SH_PFC_PIN_GROUP(scifa4_data_2),
+       SH_PFC_PIN_GROUP(scifa4_clk_0),
+       SH_PFC_PIN_GROUP(scifa4_clk_1),
+       SH_PFC_PIN_GROUP(scifa5_data_0),
+       SH_PFC_PIN_GROUP(scifa5_data_1),
+       SH_PFC_PIN_GROUP(scifa5_data_2),
+       SH_PFC_PIN_GROUP(scifa5_clk_0),
+       SH_PFC_PIN_GROUP(scifa5_clk_1),
+       SH_PFC_PIN_GROUP(scifa6_data),
+       SH_PFC_PIN_GROUP(scifa6_clk),
+       SH_PFC_PIN_GROUP(scifa7_data),
+       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),
@@ -2101,6 +2962,132 @@ static const struct sh_pfc_pin_group pinmux_groups[] = {
        SH_PFC_PIN_GROUP(sdhi2_wp_0),
        SH_PFC_PIN_GROUP(sdhi2_cd_1),
        SH_PFC_PIN_GROUP(sdhi2_wp_1),
+       SH_PFC_PIN_GROUP(tpu0_to0),
+       SH_PFC_PIN_GROUP(tpu0_to1),
+       SH_PFC_PIN_GROUP(tpu0_to2_0),
+       SH_PFC_PIN_GROUP(tpu0_to2_1),
+       SH_PFC_PIN_GROUP(tpu0_to3),
+};
+
+static const char * const bsc_groups[] = {
+       "bsc_data8",
+       "bsc_data16",
+       "bsc_data32",
+       "bsc_cs0",
+       "bsc_cs2",
+       "bsc_cs4",
+       "bsc_cs5a_0",
+       "bsc_cs5a_1",
+       "bsc_cs5b",
+       "bsc_cs6a",
+       "bsc_rd_we8",
+       "bsc_rd_we16",
+       "bsc_rd_we32",
+       "bsc_bs",
+       "bsc_rdwr",
+};
+
+static const char * const ceu0_groups[] = {
+       "ceu0_data_0_7",
+       "ceu0_data_8_15_0",
+       "ceu0_data_8_15_1",
+       "ceu0_clk_0",
+       "ceu0_clk_1",
+       "ceu0_clk_2",
+       "ceu0_sync",
+       "ceu0_field",
+};
+
+static const char * const ceu1_groups[] = {
+       "ceu1_data",
+       "ceu1_clk",
+       "ceu1_sync",
+       "ceu1_field",
+};
+
+static const char * const fsia_groups[] = {
+       "fsia_mclk_in",
+       "fsia_mclk_out",
+       "fsia_sclk_in",
+       "fsia_sclk_out",
+       "fsia_data_in_0",
+       "fsia_data_in_1",
+       "fsia_data_out_0",
+       "fsia_data_out_1",
+       "fsia_data_out_2",
+       "fsia_spdif_0",
+       "fsia_spdif_1",
+};
+
+static const char * const fsib_groups[] = {
+       "fsib_mclk_in",
+};
+
+static const char * const gether_groups[] = {
+       "gether_rmii",
+       "gether_mii",
+       "gether_gmii",
+       "gether_int",
+       "gether_link",
+       "gether_wol",
+};
+
+static const char * const hdmi_groups[] = {
+       "hdmi",
+};
+
+static const char * const intc_groups[] = {
+       "intc_irq0_0",
+       "intc_irq0_1",
+       "intc_irq1",
+       "intc_irq2_0",
+       "intc_irq2_1",
+       "intc_irq3_0",
+       "intc_irq3_1",
+       "intc_irq4_0",
+       "intc_irq4_1",
+       "intc_irq5_0",
+       "intc_irq5_1",
+       "intc_irq6_0",
+       "intc_irq6_1",
+       "intc_irq7_0",
+       "intc_irq7_1",
+       "intc_irq8",
+       "intc_irq9_0",
+       "intc_irq9_1",
+       "intc_irq10",
+       "intc_irq11",
+       "intc_irq12_0",
+       "intc_irq12_1",
+       "intc_irq13_0",
+       "intc_irq13_1",
+       "intc_irq14_0",
+       "intc_irq14_1",
+       "intc_irq15_0",
+       "intc_irq15_1",
+       "intc_irq16_0",
+       "intc_irq16_1",
+       "intc_irq17",
+       "intc_irq18",
+       "intc_irq19",
+       "intc_irq20",
+       "intc_irq21",
+       "intc_irq22",
+       "intc_irq23",
+       "intc_irq24",
+       "intc_irq25",
+       "intc_irq26_0",
+       "intc_irq26_1",
+       "intc_irq27_0",
+       "intc_irq27_1",
+       "intc_irq28_0",
+       "intc_irq28_1",
+       "intc_irq29_0",
+       "intc_irq29_1",
+       "intc_irq30_0",
+       "intc_irq30_1",
+       "intc_irq31_0",
+       "intc_irq31_1",
 };
 
 static const char * const lcd0_groups[] = {
@@ -2142,6 +3129,68 @@ static const char * const mmc0_groups[] = {
        "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",
+       "scifa2_clk_0",
+       "scifa2_clk_1",
+       "scifa2_ctrl",
+};
+
+static const char * const scifa3_groups[] = {
+       "scifa3_data_0",
+       "scifa3_clk_0",
+       "scifa3_ctrl_0",
+       "scifa3_data_1",
+       "scifa3_clk_1",
+       "scifa3_ctrl_1",
+};
+
+static const char * const scifa4_groups[] = {
+       "scifa4_data_0",
+       "scifa4_data_1",
+       "scifa4_data_2",
+       "scifa4_clk_0",
+       "scifa4_clk_1",
+};
+
+static const char * const scifa5_groups[] = {
+       "scifa5_data_0",
+       "scifa5_data_1",
+       "scifa5_data_2",
+       "scifa5_clk_0",
+       "scifa5_clk_1",
+};
+
+static const char * const scifa6_groups[] = {
+       "scifa6_data",
+       "scifa6_clk",
+};
+
+static const char * const scifa7_groups[] = {
+       "scifa7_data",
+};
+
+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",
@@ -2168,412 +3217,51 @@ static const char * const sdhi2_groups[] = {
        "sdhi2_wp_1",
 };
 
+static const char * const tpu0_groups[] = {
+       "tpu0_to0",
+       "tpu0_to1",
+       "tpu0_to2_0",
+       "tpu0_to2_1",
+       "tpu0_to3",
+};
+
 static const struct sh_pfc_function pinmux_functions[] = {
+       SH_PFC_FUNCTION(bsc),
+       SH_PFC_FUNCTION(ceu0),
+       SH_PFC_FUNCTION(ceu1),
+       SH_PFC_FUNCTION(fsia),
+       SH_PFC_FUNCTION(fsib),
+       SH_PFC_FUNCTION(gether),
+       SH_PFC_FUNCTION(hdmi),
+       SH_PFC_FUNCTION(intc),
        SH_PFC_FUNCTION(lcd0),
        SH_PFC_FUNCTION(lcd1),
        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(tpu0),
 };
 
-#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),
-       GPIO_FN(IRQ2_PORT11),   GPIO_FN(IRQ2_PORT12),
-       GPIO_FN(IRQ3_PORT10),   GPIO_FN(IRQ3_PORT14),
-       GPIO_FN(IRQ4_PORT15),   GPIO_FN(IRQ4_PORT172),
-       GPIO_FN(IRQ5_PORT0),    GPIO_FN(IRQ5_PORT1),
-       GPIO_FN(IRQ6_PORT121),  GPIO_FN(IRQ6_PORT173),
-       GPIO_FN(IRQ7_PORT120),  GPIO_FN(IRQ7_PORT209),
-       GPIO_FN(IRQ8),
-       GPIO_FN(IRQ9_PORT118),  GPIO_FN(IRQ9_PORT210),
-       GPIO_FN(IRQ10),
-       GPIO_FN(IRQ11),
-       GPIO_FN(IRQ12_PORT42),  GPIO_FN(IRQ12_PORT97),
-       GPIO_FN(IRQ13_PORT64),  GPIO_FN(IRQ13_PORT98),
-       GPIO_FN(IRQ14_PORT63),  GPIO_FN(IRQ14_PORT99),
-       GPIO_FN(IRQ15_PORT62),  GPIO_FN(IRQ15_PORT100),
-       GPIO_FN(IRQ16_PORT68),  GPIO_FN(IRQ16_PORT211),
-       GPIO_FN(IRQ17),
-       GPIO_FN(IRQ18),
-       GPIO_FN(IRQ19),
-       GPIO_FN(IRQ20),
-       GPIO_FN(IRQ21),
-       GPIO_FN(IRQ22),
-       GPIO_FN(IRQ23),
-       GPIO_FN(IRQ24),
-       GPIO_FN(IRQ25),
-       GPIO_FN(IRQ26_PORT58),  GPIO_FN(IRQ26_PORT81),
-       GPIO_FN(IRQ27_PORT57),  GPIO_FN(IRQ27_PORT168),
-       GPIO_FN(IRQ28_PORT56),  GPIO_FN(IRQ28_PORT169),
-       GPIO_FN(IRQ29_PORT50),  GPIO_FN(IRQ29_PORT170),
-       GPIO_FN(IRQ30_PORT49),  GPIO_FN(IRQ30_PORT171),
-       GPIO_FN(IRQ31_PORT41),  GPIO_FN(IRQ31_PORT167),
-
-       /* Function */
-
-       /* DBGT */
-       GPIO_FN(DBGMDT2),       GPIO_FN(DBGMDT1),       GPIO_FN(DBGMDT0),
-       GPIO_FN(DBGMD10),       GPIO_FN(DBGMD11),       GPIO_FN(DBGMD20),
-       GPIO_FN(DBGMD21),
-
-       /* FSI-A */
-       GPIO_FN(FSIAISLD_PORT0),        /* FSIAISLD Port 0/5 */
-       GPIO_FN(FSIAISLD_PORT5),
-       GPIO_FN(FSIASPDIF_PORT9),       /* FSIASPDIF Port 9/18 */
-       GPIO_FN(FSIASPDIF_PORT18),
-       GPIO_FN(FSIAOSLD1),     GPIO_FN(FSIAOSLD2),     GPIO_FN(FSIAOLR),
-       GPIO_FN(FSIAOBT),       GPIO_FN(FSIAOSLD),      GPIO_FN(FSIAOMC),
-       GPIO_FN(FSIACK),        GPIO_FN(FSIAILR),       GPIO_FN(FSIAIBT),
-
-       /* FSI-B */
-       GPIO_FN(FSIBCK),
-
-       /* FMSI */
-       GPIO_FN(FMSISLD_PORT1), /* FMSISLD Port 1/6 */
-       GPIO_FN(FMSISLD_PORT6),
-       GPIO_FN(FMSIILR),       GPIO_FN(FMSIIBT),       GPIO_FN(FMSIOLR),
-       GPIO_FN(FMSIOBT),       GPIO_FN(FMSICK),        GPIO_FN(FMSOILR),
-       GPIO_FN(FMSOIBT),       GPIO_FN(FMSOOLR),       GPIO_FN(FMSOOBT),
-       GPIO_FN(FMSOSLD),       GPIO_FN(FMSOCK),
-
-       /* SCIFA0 */
-       GPIO_FN(SCIFA0_SCK),    GPIO_FN(SCIFA0_CTS),    GPIO_FN(SCIFA0_RTS),
-       GPIO_FN(SCIFA0_RXD),    GPIO_FN(SCIFA0_TXD),
-
-       /* SCIFA1 */
-       GPIO_FN(SCIFA1_CTS),    GPIO_FN(SCIFA1_SCK),
-       GPIO_FN(SCIFA1_RXD),    GPIO_FN(SCIFA1_TXD),    GPIO_FN(SCIFA1_RTS),
-
-       /* SCIFA2 */
-       GPIO_FN(SCIFA2_SCK_PORT22), /* SCIFA2_SCK Port 22/199 */
-       GPIO_FN(SCIFA2_SCK_PORT199),
-       GPIO_FN(SCIFA2_RXD),    GPIO_FN(SCIFA2_TXD),
-       GPIO_FN(SCIFA2_CTS),    GPIO_FN(SCIFA2_RTS),
-
-       /* SCIFA3 */
-       GPIO_FN(SCIFA3_RTS_PORT105), /* MSEL5CR_8_0 */
-       GPIO_FN(SCIFA3_SCK_PORT116),
-       GPIO_FN(SCIFA3_CTS_PORT117),
-       GPIO_FN(SCIFA3_RXD_PORT174),
-       GPIO_FN(SCIFA3_TXD_PORT175),
-
-       GPIO_FN(SCIFA3_RTS_PORT161), /* MSEL5CR_8_1 */
-       GPIO_FN(SCIFA3_SCK_PORT158),
-       GPIO_FN(SCIFA3_CTS_PORT162),
-       GPIO_FN(SCIFA3_RXD_PORT159),
-       GPIO_FN(SCIFA3_TXD_PORT160),
-
-       /* SCIFA4 */
-       GPIO_FN(SCIFA4_RXD_PORT12), /* MSEL5CR[12:11] = 00 */
-       GPIO_FN(SCIFA4_TXD_PORT13),
-
-       GPIO_FN(SCIFA4_RXD_PORT204), /* MSEL5CR[12:11] = 01 */
-       GPIO_FN(SCIFA4_TXD_PORT203),
-
-       GPIO_FN(SCIFA4_RXD_PORT94), /* MSEL5CR[12:11] = 10 */
-       GPIO_FN(SCIFA4_TXD_PORT93),
-
-       GPIO_FN(SCIFA4_SCK_PORT21), /* SCIFA4_SCK Port 21/205 */
-       GPIO_FN(SCIFA4_SCK_PORT205),
-
-       /* SCIFA5 */
-       GPIO_FN(SCIFA5_TXD_PORT20), /* MSEL5CR[15:14] = 00 */
-       GPIO_FN(SCIFA5_RXD_PORT10),
-
-       GPIO_FN(SCIFA5_RXD_PORT207), /* MSEL5CR[15:14] = 01 */
-       GPIO_FN(SCIFA5_TXD_PORT208),
-
-       GPIO_FN(SCIFA5_TXD_PORT91), /* MSEL5CR[15:14] = 10 */
-       GPIO_FN(SCIFA5_RXD_PORT92),
-
-       GPIO_FN(SCIFA5_SCK_PORT23), /* SCIFA5_SCK Port 23/206 */
-       GPIO_FN(SCIFA5_SCK_PORT206),
-
-       /* SCIFA6 */
-       GPIO_FN(SCIFA6_SCK),    GPIO_FN(SCIFA6_RXD),    GPIO_FN(SCIFA6_TXD),
-
-       /* SCIFA7 */
-       GPIO_FN(SCIFA7_TXD),    GPIO_FN(SCIFA7_RXD),
-
-       /* SCIFAB */
-       GPIO_FN(SCIFB_SCK_PORT190), /* MSEL5CR_17_0 */
-       GPIO_FN(SCIFB_RXD_PORT191),
-       GPIO_FN(SCIFB_TXD_PORT192),
-       GPIO_FN(SCIFB_RTS_PORT186),
-       GPIO_FN(SCIFB_CTS_PORT187),
-
-       GPIO_FN(SCIFB_SCK_PORT2), /* MSEL5CR_17_1 */
-       GPIO_FN(SCIFB_RXD_PORT3),
-       GPIO_FN(SCIFB_TXD_PORT4),
-       GPIO_FN(SCIFB_RTS_PORT172),
-       GPIO_FN(SCIFB_CTS_PORT173),
-
-       /* 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),
-       GPIO_FN(RSPI_MISO_A),
-
-       /* VIO CKO */
-       GPIO_FN(VIO_CKO1),
-       GPIO_FN(VIO_CKO2),
-       GPIO_FN(VIO_CKO_1),
-       GPIO_FN(VIO_CKO),
-
-       /* VIO0 */
-       GPIO_FN(VIO0_D0),       GPIO_FN(VIO0_D1),       GPIO_FN(VIO0_D2),
-       GPIO_FN(VIO0_D3),       GPIO_FN(VIO0_D4),       GPIO_FN(VIO0_D5),
-       GPIO_FN(VIO0_D6),       GPIO_FN(VIO0_D7),       GPIO_FN(VIO0_D8),
-       GPIO_FN(VIO0_D9),       GPIO_FN(VIO0_D10),      GPIO_FN(VIO0_D11),
-       GPIO_FN(VIO0_D12),      GPIO_FN(VIO0_VD),       GPIO_FN(VIO0_HD),
-       GPIO_FN(VIO0_CLK),      GPIO_FN(VIO0_FIELD),
-
-       GPIO_FN(VIO0_D13_PORT26), /* MSEL5CR_27_0 */
-       GPIO_FN(VIO0_D14_PORT25),
-       GPIO_FN(VIO0_D15_PORT24),
-
-       GPIO_FN(VIO0_D13_PORT22), /* MSEL5CR_27_1 */
-       GPIO_FN(VIO0_D14_PORT95),
-       GPIO_FN(VIO0_D15_PORT96),
-
-       /* VIO1 */
-       GPIO_FN(VIO1_D0),       GPIO_FN(VIO1_D1),       GPIO_FN(VIO1_D2),
-       GPIO_FN(VIO1_D3),       GPIO_FN(VIO1_D4),       GPIO_FN(VIO1_D5),
-       GPIO_FN(VIO1_D6),       GPIO_FN(VIO1_D7),       GPIO_FN(VIO1_VD),
-       GPIO_FN(VIO1_HD),       GPIO_FN(VIO1_CLK),      GPIO_FN(VIO1_FIELD),
-
-       /* TPU0 */
-       GPIO_FN(TPU0TO0),       GPIO_FN(TPU0TO1),       GPIO_FN(TPU0TO3),
-       GPIO_FN(TPU0TO2_PORT66), /* TPU0TO2 Port 66/202 */
-       GPIO_FN(TPU0TO2_PORT202),
-
-       /* SSP1 0 */
-       GPIO_FN(STP0_IPD0),     GPIO_FN(STP0_IPD1),     GPIO_FN(STP0_IPD2),
-       GPIO_FN(STP0_IPD3),     GPIO_FN(STP0_IPD4),     GPIO_FN(STP0_IPD5),
-       GPIO_FN(STP0_IPD6),     GPIO_FN(STP0_IPD7),     GPIO_FN(STP0_IPEN),
-       GPIO_FN(STP0_IPCLK),    GPIO_FN(STP0_IPSYNC),
-
-       /* SSP1 1 */
-       GPIO_FN(STP1_IPD1),     GPIO_FN(STP1_IPD2),     GPIO_FN(STP1_IPD3),
-       GPIO_FN(STP1_IPD4),     GPIO_FN(STP1_IPD5),     GPIO_FN(STP1_IPD6),
-       GPIO_FN(STP1_IPD7),     GPIO_FN(STP1_IPCLK),    GPIO_FN(STP1_IPSYNC),
-
-       GPIO_FN(STP1_IPD0_PORT186), /* MSEL5CR_23_0 */
-       GPIO_FN(STP1_IPEN_PORT187),
-
-       GPIO_FN(STP1_IPD0_PORT194), /* MSEL5CR_23_1 */
-       GPIO_FN(STP1_IPEN_PORT193),
-
-       /* SIM */
-       GPIO_FN(SIM_RST),       GPIO_FN(SIM_CLK),
-       GPIO_FN(SIM_D_PORT22), /* SIM_D  Port 22/199 */
-       GPIO_FN(SIM_D_PORT199),
-
-       /* 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),
-       GPIO_FN(MSIOF2_MCK1),   GPIO_FN(MSIOF2_MCK0),   GPIO_FN(MSIOF2_RSYNC),
-       GPIO_FN(MSIOF2_RSCK),
-
-       /* KEYSC */
-       GPIO_FN(KEYIN4),        GPIO_FN(KEYIN5),
-       GPIO_FN(KEYIN6),        GPIO_FN(KEYIN7),
-       GPIO_FN(KEYOUT0),       GPIO_FN(KEYOUT1),       GPIO_FN(KEYOUT2),
-       GPIO_FN(KEYOUT3),       GPIO_FN(KEYOUT4),       GPIO_FN(KEYOUT5),
-       GPIO_FN(KEYOUT6),       GPIO_FN(KEYOUT7),
-
-       GPIO_FN(KEYIN0_PORT43), /* MSEL4CR_18_0 */
-       GPIO_FN(KEYIN1_PORT44),
-       GPIO_FN(KEYIN2_PORT45),
-       GPIO_FN(KEYIN3_PORT46),
-
-       GPIO_FN(KEYIN0_PORT58), /* MSEL4CR_18_1 */
-       GPIO_FN(KEYIN1_PORT57),
-       GPIO_FN(KEYIN2_PORT56),
-       GPIO_FN(KEYIN3_PORT55),
-
-       /* VOU */
-       GPIO_FN(DV_D0),         GPIO_FN(DV_D1),         GPIO_FN(DV_D2),
-       GPIO_FN(DV_D3),         GPIO_FN(DV_D4),         GPIO_FN(DV_D5),
-       GPIO_FN(DV_D6),         GPIO_FN(DV_D7),         GPIO_FN(DV_D8),
-       GPIO_FN(DV_D9),         GPIO_FN(DV_D10),        GPIO_FN(DV_D11),
-       GPIO_FN(DV_D12),        GPIO_FN(DV_D13),        GPIO_FN(DV_D14),
-       GPIO_FN(DV_D15),        GPIO_FN(DV_CLK),
-       GPIO_FN(DV_VSYNC),      GPIO_FN(DV_HSYNC),
-
-       /* MEMC */
-       GPIO_FN(MEMC_AD0),      GPIO_FN(MEMC_AD1),      GPIO_FN(MEMC_AD2),
-       GPIO_FN(MEMC_AD3),      GPIO_FN(MEMC_AD4),      GPIO_FN(MEMC_AD5),
-       GPIO_FN(MEMC_AD6),      GPIO_FN(MEMC_AD7),      GPIO_FN(MEMC_AD8),
-       GPIO_FN(MEMC_AD9),      GPIO_FN(MEMC_AD10),     GPIO_FN(MEMC_AD11),
-       GPIO_FN(MEMC_AD12),     GPIO_FN(MEMC_AD13),     GPIO_FN(MEMC_AD14),
-       GPIO_FN(MEMC_AD15),     GPIO_FN(MEMC_CS0),      GPIO_FN(MEMC_INT),
-       GPIO_FN(MEMC_NWE),      GPIO_FN(MEMC_NOE),      GPIO_FN(MEMC_CS1),
-       GPIO_FN(MEMC_A1),       GPIO_FN(MEMC_ADV),      GPIO_FN(MEMC_DREQ0),
-       GPIO_FN(MEMC_WAIT),     GPIO_FN(MEMC_DREQ1),    GPIO_FN(MEMC_BUSCLK),
-       GPIO_FN(MEMC_A0),
-
-       /* 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),
-       GPIO_FN(MSIOF0_RSYNC),  GPIO_FN(MSIOF0_RSCK),   GPIO_FN(MSIOF0_TSCK),
-       GPIO_FN(MSIOF0_TSYNC),
-
-       /* MSIOF1 */
-       GPIO_FN(MSIOF1_RSCK),   GPIO_FN(MSIOF1_RSYNC),
-       GPIO_FN(MSIOF1_MCK0),   GPIO_FN(MSIOF1_MCK1),
-
-       GPIO_FN(MSIOF1_SS2_PORT116),    GPIO_FN(MSIOF1_SS1_PORT117),
-       GPIO_FN(MSIOF1_RXD_PORT118),    GPIO_FN(MSIOF1_TXD_PORT119),
-       GPIO_FN(MSIOF1_TSYNC_PORT120),
-       GPIO_FN(MSIOF1_TSCK_PORT121),   /* MSEL4CR_10_0 */
-
-       GPIO_FN(MSIOF1_SS1_PORT67),     GPIO_FN(MSIOF1_TSCK_PORT72),
-       GPIO_FN(MSIOF1_TSYNC_PORT73),   GPIO_FN(MSIOF1_TXD_PORT74),
-       GPIO_FN(MSIOF1_RXD_PORT75),
-       GPIO_FN(MSIOF1_SS2_PORT202),    /* MSEL4CR_10_1 */
-
-       /* GPIO */
-       GPIO_FN(GPO0),  GPIO_FN(GPI0),
-       GPIO_FN(GPO1),  GPIO_FN(GPI1),
-
-       /* USB0 */
-       GPIO_FN(USB0_OCI),      GPIO_FN(USB0_PPON),     GPIO_FN(VBUS),
-
-       /* USB1 */
-       GPIO_FN(USB1_OCI),      GPIO_FN(USB1_PPON),
-
-       /* BBIF1 */
-       GPIO_FN(BBIF1_RXD),     GPIO_FN(BBIF1_TXD),     GPIO_FN(BBIF1_TSYNC),
-       GPIO_FN(BBIF1_TSCK),    GPIO_FN(BBIF1_RSCK),    GPIO_FN(BBIF1_RSYNC),
-       GPIO_FN(BBIF1_FLOW),    GPIO_FN(BBIF1_RX_FLOW_N),
-
-       /* BBIF2 */
-       GPIO_FN(BBIF2_TXD2_PORT5), /* MSEL5CR_0_0 */
-       GPIO_FN(BBIF2_RXD2_PORT60),
-       GPIO_FN(BBIF2_TSYNC2_PORT6),
-       GPIO_FN(BBIF2_TSCK2_PORT59),
-
-       GPIO_FN(BBIF2_RXD2_PORT90), /* MSEL5CR_0_1 */
-       GPIO_FN(BBIF2_TXD2_PORT183),
-       GPIO_FN(BBIF2_TSCK2_PORT89),
-       GPIO_FN(BBIF2_TSYNC2_PORT184),
-
-       /* BSC / FLCTL / PCMCIA */
-       GPIO_FN(CS0),   GPIO_FN(CS2),   GPIO_FN(CS4),
-       GPIO_FN(CS5B),  GPIO_FN(CS6A),
-       GPIO_FN(CS5A_PORT105), /* CS5A PORT 19/105 */
-       GPIO_FN(CS5A_PORT19),
-       GPIO_FN(IOIS16), /* ? */
-
-       GPIO_FN(A0),    GPIO_FN(A1),    GPIO_FN(A2),    GPIO_FN(A3),
-       GPIO_FN(A4_FOE),        GPIO_FN(A5_FCDE),       /* share with FLCTL */
-       GPIO_FN(A6),    GPIO_FN(A7),    GPIO_FN(A8),    GPIO_FN(A9),
-       GPIO_FN(A10),   GPIO_FN(A11),   GPIO_FN(A12),   GPIO_FN(A13),
-       GPIO_FN(A14),   GPIO_FN(A15),   GPIO_FN(A16),   GPIO_FN(A17),
-       GPIO_FN(A18),   GPIO_FN(A19),   GPIO_FN(A20),   GPIO_FN(A21),
-       GPIO_FN(A22),   GPIO_FN(A23),   GPIO_FN(A24),   GPIO_FN(A25),
-       GPIO_FN(A26),
-
-       GPIO_FN(D0_NAF0),       GPIO_FN(D1_NAF1),       /* share with FLCTL */
-       GPIO_FN(D2_NAF2),       GPIO_FN(D3_NAF3),       /* share with FLCTL */
-       GPIO_FN(D4_NAF4),       GPIO_FN(D5_NAF5),       /* share with FLCTL */
-       GPIO_FN(D6_NAF6),       GPIO_FN(D7_NAF7),       /* share with FLCTL */
-       GPIO_FN(D8_NAF8),       GPIO_FN(D9_NAF9),       /* share with FLCTL */
-       GPIO_FN(D10_NAF10),     GPIO_FN(D11_NAF11),     /* share with FLCTL */
-       GPIO_FN(D12_NAF12),     GPIO_FN(D13_NAF13),     /* share with FLCTL */
-       GPIO_FN(D14_NAF14),     GPIO_FN(D15_NAF15),     /* share with FLCTL */
-       GPIO_FN(D16),   GPIO_FN(D17),   GPIO_FN(D18),   GPIO_FN(D19),
-       GPIO_FN(D20),   GPIO_FN(D21),   GPIO_FN(D22),   GPIO_FN(D23),
-       GPIO_FN(D24),   GPIO_FN(D25),   GPIO_FN(D26),   GPIO_FN(D27),
-       GPIO_FN(D28),   GPIO_FN(D29),   GPIO_FN(D30),   GPIO_FN(D31),
-
-       GPIO_FN(WE0_FWE),       /* share with FLCTL */
-       GPIO_FN(WE1),
-       GPIO_FN(WE2_ICIORD),    /* share with PCMCIA */
-       GPIO_FN(WE3_ICIOWR),    /* share with PCMCIA */
-       GPIO_FN(CKO),   GPIO_FN(BS),    GPIO_FN(RDWR),
-       GPIO_FN(RD_FSC),        /* share with FLCTL */
-       GPIO_FN(WAIT_PORT177), /* WAIT Port 90/177 */
-       GPIO_FN(WAIT_PORT90),
-
-       GPIO_FN(FCE0),  GPIO_FN(FCE1),  GPIO_FN(FRB), /* FLCTL */
-
-       /* IRDA */
-       GPIO_FN(IRDA_FIRSEL),   GPIO_FN(IRDA_IN),       GPIO_FN(IRDA_OUT),
-
-       /* ATAPI */
-       GPIO_FN(IDE_D0),        GPIO_FN(IDE_D1),        GPIO_FN(IDE_D2),
-       GPIO_FN(IDE_D3),        GPIO_FN(IDE_D4),        GPIO_FN(IDE_D5),
-       GPIO_FN(IDE_D6),        GPIO_FN(IDE_D7),        GPIO_FN(IDE_D8),
-       GPIO_FN(IDE_D9),        GPIO_FN(IDE_D10),       GPIO_FN(IDE_D11),
-       GPIO_FN(IDE_D12),       GPIO_FN(IDE_D13),       GPIO_FN(IDE_D14),
-       GPIO_FN(IDE_D15),       GPIO_FN(IDE_A0),        GPIO_FN(IDE_A1),
-       GPIO_FN(IDE_A2),        GPIO_FN(IDE_CS0),       GPIO_FN(IDE_CS1),
-       GPIO_FN(IDE_IOWR),      GPIO_FN(IDE_IORD),      GPIO_FN(IDE_IORDY),
-       GPIO_FN(IDE_INT),       GPIO_FN(IDE_RST),       GPIO_FN(IDE_DIRECTION),
-       GPIO_FN(IDE_EXBUF_ENB), GPIO_FN(IDE_IODACK),    GPIO_FN(IDE_IODREQ),
-
-       /* RMII */
-       GPIO_FN(RMII_CRS_DV),   GPIO_FN(RMII_RX_ER),    GPIO_FN(RMII_RXD0),
-       GPIO_FN(RMII_RXD1),     GPIO_FN(RMII_TX_EN),    GPIO_FN(RMII_TXD0),
-       GPIO_FN(RMII_MDC),      GPIO_FN(RMII_TXD1),     GPIO_FN(RMII_MDIO),
-       GPIO_FN(RMII_REF50CK),  GPIO_FN(RMII_REF125CK), /* for GMII */
-
-       /* GEther */
-       GPIO_FN(ET_TX_CLK),     GPIO_FN(ET_TX_EN),      GPIO_FN(ET_ETXD0),
-       GPIO_FN(ET_ETXD1),      GPIO_FN(ET_ETXD2),      GPIO_FN(ET_ETXD3),
-       GPIO_FN(ET_ETXD4),      GPIO_FN(ET_ETXD5), /* for GEther */
-       GPIO_FN(ET_ETXD6),      GPIO_FN(ET_ETXD7), /* for GEther */
-       GPIO_FN(ET_COL),        GPIO_FN(ET_TX_ER),      GPIO_FN(ET_RX_CLK),
-       GPIO_FN(ET_RX_DV),      GPIO_FN(ET_ERXD0),      GPIO_FN(ET_ERXD1),
-       GPIO_FN(ET_ERXD2),      GPIO_FN(ET_ERXD3),
-       GPIO_FN(ET_ERXD4),      GPIO_FN(ET_ERXD5), /* for GEther */
-       GPIO_FN(ET_ERXD6),      GPIO_FN(ET_ERXD7), /* for GEther */
-       GPIO_FN(ET_RX_ER),      GPIO_FN(ET_CRS),        GPIO_FN(ET_MDC),
-       GPIO_FN(ET_MDIO),       GPIO_FN(ET_LINK),       GPIO_FN(ET_PHY_INT),
-       GPIO_FN(ET_WOL),        GPIO_FN(ET_GTX_CLK),
-
-       /* DMA0 */
-       GPIO_FN(DREQ0), GPIO_FN(DACK0),
-
-       /* DMA1 */
-       GPIO_FN(DREQ1), GPIO_FN(DACK1),
-
-       /* SYSC */
-       GPIO_FN(RESETOUTS),
-
-       /* IRREM */
-       GPIO_FN(IROUT),
-
-       /* LCDC */
-       GPIO_FN(LCDC0_SELECT),
-       GPIO_FN(LCDC1_SELECT),
-
-       /* SDENC */
-       GPIO_FN(SDENC_CPG),
-       GPIO_FN(SDENC_DV_CLKI),
-
-       /* HDMI */
-       GPIO_FN(HDMI_HPD),
-       GPIO_FN(HDMI_CEC),
-
-       /* SYSC */
-       GPIO_FN(RESETP_PULLUP),
-       GPIO_FN(RESETP_PLAIN),
-
-       /* DEBUG */
-       GPIO_FN(EDEBGREQ_PULLDOWN),
-       GPIO_FN(EDEBGREQ_PULLUP),
-
-       GPIO_FN(TRACEAUD_FROM_VIO),
-       GPIO_FN(TRACEAUD_FROM_LCDC0),
-       GPIO_FN(TRACEAUD_FROM_MEMC),
-};
+#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 */
@@ -2994,48 +3682,114 @@ static const struct pinmux_data_reg pinmux_data_regs[] = {
 };
 
 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 */
+       PINMUX_IRQ(irq_pin(0), 2,   13),        /* IRQ0A */
+       PINMUX_IRQ(irq_pin(1), 20),             /* IRQ1A */
+       PINMUX_IRQ(irq_pin(2), 11,  12),        /* IRQ2A */
+       PINMUX_IRQ(irq_pin(3), 10,  14),        /* IRQ3A */
+       PINMUX_IRQ(irq_pin(4), 15,  172),       /* IRQ4A */
+       PINMUX_IRQ(irq_pin(5), 0,   1),         /* IRQ5A */
+       PINMUX_IRQ(irq_pin(6), 121, 173),       /* IRQ6A */
+       PINMUX_IRQ(irq_pin(7), 120, 209),       /* IRQ7A */
+       PINMUX_IRQ(irq_pin(8), 119),            /* IRQ8A */
+       PINMUX_IRQ(irq_pin(9), 118, 210),       /* IRQ9A */
+       PINMUX_IRQ(irq_pin(10), 19),            /* IRQ10A */
+       PINMUX_IRQ(irq_pin(11), 104),           /* IRQ11A */
+       PINMUX_IRQ(irq_pin(12), 42,  97),       /* IRQ12A */
+       PINMUX_IRQ(irq_pin(13), 64,  98),       /* IRQ13A */
+       PINMUX_IRQ(irq_pin(14), 63,  99),       /* IRQ14A */
+       PINMUX_IRQ(irq_pin(15), 62,  100),      /* IRQ15A */
+       PINMUX_IRQ(irq_pin(16), 68,  211),      /* IRQ16A */
+       PINMUX_IRQ(irq_pin(17), 69),            /* IRQ17A */
+       PINMUX_IRQ(irq_pin(18), 70),            /* IRQ18A */
+       PINMUX_IRQ(irq_pin(19), 71),            /* IRQ19A */
+       PINMUX_IRQ(irq_pin(20), 67),            /* IRQ20A */
+       PINMUX_IRQ(irq_pin(21), 202),           /* IRQ21A */
+       PINMUX_IRQ(irq_pin(22), 95),            /* IRQ22A */
+       PINMUX_IRQ(irq_pin(23), 96),            /* IRQ23A */
+       PINMUX_IRQ(irq_pin(24), 180),           /* IRQ24A */
+       PINMUX_IRQ(irq_pin(25), 38),            /* IRQ25A */
+       PINMUX_IRQ(irq_pin(26), 58,  81),       /* IRQ26A */
+       PINMUX_IRQ(irq_pin(27), 57,  168),      /* IRQ27A */
+       PINMUX_IRQ(irq_pin(28), 56,  169),      /* IRQ28A */
+       PINMUX_IRQ(irq_pin(29), 50,  170),      /* IRQ29A */
+       PINMUX_IRQ(irq_pin(30), 49,  171),      /* IRQ30A */
+       PINMUX_IRQ(irq_pin(31), 41,  167),      /* IRQ31A */
+};
+
+#define PORTnCR_PULMD_OFF      (0 << 6)
+#define PORTnCR_PULMD_DOWN     (2 << 6)
+#define PORTnCR_PULMD_UP       (3 << 6)
+#define PORTnCR_PULMD_MASK     (3 << 6)
+
+struct r8a7740_portcr_group {
+       unsigned int end_pin;
+       unsigned int offset;
+};
+
+static const struct r8a7740_portcr_group r8a7740_portcr_offsets[] = {
+       { 83, 0x0000 }, { 114, 0x1000 }, { 209, 0x2000 }, { 211, 0x3000 },
+};
+
+static void __iomem *r8a7740_pinmux_portcr(struct sh_pfc *pfc, unsigned int pin)
+{
+       unsigned int i;
+
+       for (i = 0; i < ARRAY_SIZE(r8a7740_portcr_offsets); ++i) {
+               const struct r8a7740_portcr_group *group =
+                       &r8a7740_portcr_offsets[i];
+
+               if (i <= group->end_pin)
+                       return pfc->window->virt + group->offset + pin;
+       }
+
+       return NULL;
+}
+
+static unsigned int r8a7740_pinmux_get_bias(struct sh_pfc *pfc, unsigned int pin)
+{
+       void __iomem *addr = r8a7740_pinmux_portcr(pfc, 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 r8a7740_pinmux_set_bias(struct sh_pfc *pfc, unsigned int pin,
+                                  unsigned int bias)
+{
+       void __iomem *addr = r8a7740_pinmux_portcr(pfc, 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 r8a7740_pinmux_ops = {
+       .get_bias = r8a7740_pinmux_get_bias,
+       .set_bias = r8a7740_pinmux_set_bias,
 };
 
 const struct sh_pfc_soc_info r8a7740_pinmux_info = {
        .name           = "r8a7740_pfc",
+       .ops            = &r8a7740_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 },
        .function       = { PINMUX_FUNCTION_BEGIN,
@@ -3048,9 +3802,6 @@ const struct sh_pfc_soc_info r8a7740_pinmux_info = {
        .functions      = pinmux_functions,
        .nr_functions   = ARRAY_SIZE(pinmux_functions),
 
-       .func_gpios     = pinmux_func_gpios,
-       .nr_func_gpios  = ARRAY_SIZE(pinmux_func_gpios),
-
        .cfg_regs       = pinmux_config_regs,
        .data_regs      = pinmux_data_regs,
 
diff --git a/drivers/pinctrl/sh-pfc/pfc-r8a7778.c b/drivers/pinctrl/sh-pfc/pfc-r8a7778.c
new file mode 100644 (file)
index 0000000..1dcbabc
--- /dev/null
@@ -0,0 +1,2783 @@
+/*
+ * r8a7778 processor support - PFC hardware block
+ *
+ * Copyright (C) 2013  Renesas Solutions Corp.
+ * Copyright (C) 2013  Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
+ * Copyright (C) 2013  Cogent Embedded, Inc.
+ *
+ * based on
+ * 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; 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/platform_data/gpio-rcar.h>
+#include <linux/kernel.h>
+#include "sh_pfc.h"
+
+#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_27(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)
+
+#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_27(4, fn, sfx)
+
+#define _GP_PORT_ALL(bank, pin, name, sfx)     name##_##sfx
+
+#define _GP_GPIO(bank, pin, _name, sfx)                \
+       [RCAR_GP_PIN(bank, 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_NOGP(ispr, fn)     PINMUX_DATA(fn##_MARK, FN_##fn)
+#define PINMUX_IPSR_DATA(ipsr, fn)     PINMUX_DATA(fn##_MARK, FN_##fn, FN_##ipsr)
+#define PINMUX_IPSR_MSEL(ipsr, fn, ms) PINMUX_DATA(fn##_MARK, FN_##fn, FN_##ipsr, FN_##ms)
+#define PINMUX_IPSR_NOGM(ispr, fn, ms) PINMUX_DATA(fn##_MARK, FN_##fn,            FN_##ms)
+
+enum {
+       PINMUX_RESERVED = 0,
+
+       PINMUX_DATA_BEGIN,
+       GP_ALL(DATA), /* GP_0_0_DATA -> GP_4_26_DATA */
+       PINMUX_DATA_END,
+
+       PINMUX_FUNCTION_BEGIN,
+       GP_ALL(FN), /* GP_0_0_FN -> GP_4_26_FN */
+
+       /* GPSR0 */
+       FN_IP0_1_0,     FN_PENC0,       FN_PENC1,       FN_IP0_4_2,
+       FN_IP0_7_5,     FN_IP0_11_8,    FN_IP0_14_12,   FN_A1,
+       FN_A2,          FN_A3,          FN_IP0_15,      FN_IP0_16,
+       FN_IP0_17,      FN_IP0_18,      FN_IP0_19,      FN_IP0_20,
+       FN_IP0_21,      FN_IP0_22,      FN_IP0_23,      FN_IP0_24,
+       FN_IP0_25,      FN_IP0_26,      FN_IP0_27,      FN_IP0_28,
+       FN_IP0_29,      FN_IP0_30,      FN_IP1_0,       FN_IP1_1,
+       FN_IP1_4_2,     FN_IP1_7_5,     FN_IP1_10_8,    FN_IP1_14_11,
+
+       /* GPSR1 */
+       FN_IP1_23_21,   FN_WE0,         FN_IP1_24,      FN_IP1_27_25,
+       FN_IP1_29_28,   FN_IP2_2_0,     FN_IP2_5_3,     FN_IP2_8_6,
+       FN_IP2_11_9,    FN_IP2_13_12,   FN_IP2_16_14,   FN_IP2_17,
+       FN_IP2_30,      FN_IP2_31,      FN_IP3_1_0,     FN_IP3_4_2,
+       FN_IP3_7_5,     FN_IP3_9_8,     FN_IP3_12_10,   FN_IP3_15_13,
+       FN_IP3_18_16,   FN_IP3_20_19,   FN_IP3_23_21,   FN_IP3_26_24,
+       FN_IP3_27,      FN_IP3_28,      FN_IP3_29,      FN_IP3_30,
+       FN_IP3_31,      FN_IP4_0,       FN_IP4_3_1,     FN_IP4_6_4,
+
+       /* GPSR2 */
+       FN_IP4_7,       FN_IP4_8,       FN_IP4_10_9,    FN_IP4_12_11,
+       FN_IP4_14_13,   FN_IP4_16_15,   FN_IP4_20_17,   FN_IP4_24_21,
+       FN_IP4_26_25,   FN_IP4_28_27,   FN_IP4_30_29,   FN_IP5_1_0,
+       FN_IP5_3_2,     FN_IP5_5_4,     FN_IP5_6,       FN_IP5_7,
+       FN_IP5_9_8,     FN_IP5_11_10,   FN_IP5_12,      FN_IP5_14_13,
+       FN_IP5_17_15,   FN_IP5_20_18,   FN_AUDIO_CLKA,  FN_AUDIO_CLKB,
+       FN_IP5_22_21,   FN_IP5_25_23,   FN_IP5_28_26,   FN_IP5_30_29,
+       FN_IP6_1_0,     FN_IP6_4_2,     FN_IP6_6_5,     FN_IP6_7,
+
+       /* GPSR3 */
+       FN_IP6_8,       FN_IP6_9,       FN_SSI_SCK34,   FN_IP6_10,
+       FN_IP6_12_11,   FN_IP6_13,      FN_IP6_15_14,   FN_IP6_16,
+       FN_IP6_18_17,   FN_IP6_20_19,   FN_IP6_21,      FN_IP6_23_22,
+       FN_IP6_25_24,   FN_IP6_27_26,   FN_IP6_29_28,   FN_IP6_31_30,
+       FN_IP7_1_0,     FN_IP7_3_2,     FN_IP7_5_4,     FN_IP7_8_6,
+       FN_IP7_11_9,    FN_IP7_14_12,   FN_IP7_17_15,   FN_IP7_20_18,
+       FN_IP7_21,      FN_IP7_24_22,   FN_IP7_28_25,   FN_IP7_31_29,
+       FN_IP8_2_0,     FN_IP8_5_3,     FN_IP8_8_6,     FN_IP8_10_9,
+
+       /* GPSR4 */
+       FN_IP8_13_11,   FN_IP8_15_14,   FN_IP8_18_16,   FN_IP8_21_19,
+       FN_IP8_23_22,   FN_IP8_26_24,   FN_IP8_29_27,   FN_IP9_2_0,
+       FN_IP9_5_3,     FN_IP9_8_6,     FN_IP9_11_9,    FN_IP9_14_12,
+       FN_IP9_17_15,   FN_IP9_20_18,   FN_IP9_23_21,   FN_IP9_26_24,
+       FN_IP9_29_27,   FN_IP10_2_0,    FN_IP10_5_3,    FN_IP10_8_6,
+       FN_IP10_12_9,   FN_IP10_15_13,  FN_IP10_18_16,  FN_IP10_21_19,
+       FN_IP10_24_22,  FN_AVS1,        FN_AVS2,
+
+       /* IPSR0 */
+       FN_PRESETOUT,   FN_PWM1,        FN_AUDATA0,     FN_ARM_TRACEDATA_0,
+       FN_GPSCLK_C,    FN_USB_OVC0,    FN_TX2_E,       FN_SDA2_B,
+       FN_AUDATA1,     FN_ARM_TRACEDATA_1,             FN_GPSIN_C,
+       FN_USB_OVC1,    FN_RX2_E,       FN_SCL2_B,      FN_SD1_DAT2_A,
+       FN_MMC_D2,      FN_BS,          FN_ATADIR0_A,   FN_SDSELF_A,
+       FN_PWM4_B,      FN_SD1_DAT3_A,  FN_MMC_D3,      FN_A0,
+       FN_ATAG0_A,     FN_REMOCON_B,   FN_A4,          FN_A5,
+       FN_A6,          FN_A7,          FN_A8,          FN_A9,
+       FN_A10,         FN_A11,         FN_A12,         FN_A13,
+       FN_A14,         FN_A15,         FN_A16,         FN_A17,
+       FN_A18,         FN_A19,
+
+       /* IPSR1 */
+       FN_A20,         FN_HSPI_CS1_B,  FN_A21,         FN_HSPI_CLK1_B,
+       FN_A22,         FN_HRTS0_B,     FN_RX2_B,       FN_DREQ2_A,
+       FN_A23,         FN_HTX0_B,      FN_TX2_B,       FN_DACK2_A,
+       FN_TS_SDEN0_A,  FN_SD1_CD_A,    FN_MMC_D6,      FN_A24,
+       FN_DREQ1_A,     FN_HRX0_B,      FN_TS_SPSYNC0_A,
+       FN_SD1_WP_A,    FN_MMC_D7,      FN_A25, FN_DACK1_A,
+       FN_HCTS0_B,     FN_RX3_C,       FN_TS_SDAT0_A,  FN_CLKOUT,
+       FN_HSPI_TX1_B,  FN_PWM0_B,      FN_CS0,         FN_HSPI_RX1_B,
+       FN_SSI_SCK1_B,  FN_ATAG0_B,     FN_CS1_A26,     FN_SDA2_A,
+       FN_SCK2_B,      FN_MMC_D5,      FN_ATADIR0_B,   FN_RD_WR,
+       FN_WE1,         FN_ATAWR0_B,    FN_SSI_WS1_B,   FN_EX_CS0,
+       FN_SCL2_A,      FN_TX3_C,       FN_TS_SCK0_A,   FN_EX_CS1,
+       FN_MMC_D4,
+
+       /* IPSR2 */
+       FN_SD1_CLK_A,   FN_MMC_CLK,     FN_ATACS00,     FN_EX_CS2,
+       FN_SD1_CMD_A,   FN_MMC_CMD,     FN_ATACS10,     FN_EX_CS3,
+       FN_SD1_DAT0_A,  FN_MMC_D0,      FN_ATARD0,      FN_EX_CS4,
+       FN_EX_WAIT1_A,  FN_SD1_DAT1_A,  FN_MMC_D1,      FN_ATAWR0_A,
+       FN_EX_CS5,      FN_EX_WAIT2_A,  FN_DREQ0_A,     FN_RX3_A,
+       FN_DACK0,       FN_TX3_A,       FN_DRACK0,      FN_EX_WAIT0,
+       FN_PWM0_C,      FN_D0,          FN_D1,          FN_D2,
+       FN_D3,          FN_D4,          FN_D5,          FN_D6,
+       FN_D7,          FN_D8,          FN_D9,          FN_D10,
+       FN_D11,         FN_RD_WR_B,     FN_IRQ0,        FN_MLB_CLK,
+       FN_IRQ1_A,
+
+       /* IPSR3 */
+       FN_MLB_SIG,     FN_RX5_B,       FN_SDA3_A,      FN_IRQ2_A,
+       FN_MLB_DAT,     FN_TX5_B,       FN_SCL3_A,      FN_IRQ3_A,
+       FN_SDSELF_B,    FN_SD1_CMD_B,   FN_SCIF_CLK,    FN_AUDIO_CLKOUT_B,
+       FN_CAN_CLK_B,   FN_SDA3_B,      FN_SD1_CLK_B,   FN_HTX0_A,
+       FN_TX0_A,       FN_SD1_DAT0_B,  FN_HRX0_A,      FN_RX0_A,
+       FN_SD1_DAT1_B,  FN_HSCK0,       FN_SCK0,        FN_SCL3_B,
+       FN_SD1_DAT2_B,  FN_HCTS0_A,     FN_CTS0,        FN_SD1_DAT3_B,
+       FN_HRTS0_A,     FN_RTS0,        FN_SSI_SCK4,    FN_DU0_DR0,
+       FN_LCDOUT0,     FN_AUDATA2,     FN_ARM_TRACEDATA_2,
+       FN_SDA3_C,      FN_ADICHS1,     FN_TS_SDEN0_B,  FN_SSI_WS4,
+       FN_DU0_DR1,     FN_LCDOUT1,     FN_AUDATA3,     FN_ARM_TRACEDATA_3,
+       FN_SCL3_C,      FN_ADICHS2,     FN_TS_SPSYNC0_B,
+       FN_DU0_DR2,     FN_LCDOUT2,     FN_DU0_DR3,     FN_LCDOUT3,
+       FN_DU0_DR4,     FN_LCDOUT4,     FN_DU0_DR5,     FN_LCDOUT5,
+       FN_DU0_DR6,     FN_LCDOUT6,
+
+       /* IPSR4 */
+       FN_DU0_DR7,     FN_LCDOUT7,     FN_DU0_DG0,     FN_LCDOUT8,
+       FN_AUDATA4,     FN_ARM_TRACEDATA_4,             FN_TX1_D,
+       FN_CAN0_TX_A,   FN_ADICHS0,     FN_DU0_DG1,     FN_LCDOUT9,
+       FN_AUDATA5,     FN_ARM_TRACEDATA_5,             FN_RX1_D,
+       FN_CAN0_RX_A,   FN_ADIDATA,     FN_DU0_DG2,     FN_LCDOUT10,
+       FN_DU0_DG3,     FN_LCDOUT11,    FN_DU0_DG4,     FN_LCDOUT12,
+       FN_RX0_B,       FN_DU0_DG5,     FN_LCDOUT13,    FN_TX0_B,
+       FN_DU0_DG6,     FN_LCDOUT14,    FN_RX4_A,       FN_DU0_DG7,
+       FN_LCDOUT15,    FN_TX4_A,       FN_SSI_SCK2_B,  FN_VI0_R0_B,
+       FN_DU0_DB0,     FN_LCDOUT16,    FN_AUDATA6,     FN_ARM_TRACEDATA_6,
+       FN_GPSCLK_A,    FN_PWM0_A,      FN_ADICLK,      FN_TS_SDAT0_B,
+       FN_AUDIO_CLKC,  FN_VI0_R1_B,    FN_DU0_DB1,     FN_LCDOUT17,
+       FN_AUDATA7,     FN_ARM_TRACEDATA_7,             FN_GPSIN_A,
+       FN_ADICS_SAMP,  FN_TS_SCK0_B,   FN_VI0_R2_B,    FN_DU0_DB2,
+       FN_LCDOUT18,    FN_VI0_R3_B,    FN_DU0_DB3,     FN_LCDOUT19,
+       FN_VI0_R4_B,    FN_DU0_DB4,     FN_LCDOUT20,
+
+       /* IPSR5 */
+       FN_VI0_R5_B,    FN_DU0_DB5,     FN_LCDOUT21,    FN_VI1_DATA10_B,
+       FN_DU0_DB6,     FN_LCDOUT22,    FN_VI1_DATA11_B,
+       FN_DU0_DB7,     FN_LCDOUT23,    FN_DU0_DOTCLKIN,
+       FN_QSTVA_QVS,   FN_DU0_DOTCLKO_UT0,             FN_QCLK,
+       FN_DU0_DOTCLKO_UT1,             FN_QSTVB_QVE,   FN_AUDIO_CLKOUT_A,
+       FN_REMOCON_C,   FN_SSI_WS2_B,   FN_DU0_EXHSYNC_DU0_HSYNC,
+       FN_QSTH_QHS,    FN_DU0_EXVSYNC_DU0_VSYNC,       FN_QSTB_QHE,
+       FN_DU0_EXODDF_DU0_ODDF_DISP_CDE,
+       FN_QCPV_QDE,    FN_FMCLK_D,     FN_SSI_SCK1_A,  FN_DU0_DISP,
+       FN_QPOLA,       FN_AUDCK,       FN_ARM_TRACECLK,
+       FN_BPFCLK_D,    FN_SSI_WS1_A,   FN_DU0_CDE,     FN_QPOLB,
+       FN_AUDSYNC,     FN_ARM_TRACECTL,                FN_FMIN_D,
+       FN_SD1_CD_B,    FN_SSI_SCK78,   FN_HSPI_RX0_B,  FN_TX1_B,
+       FN_SD1_WP_B,    FN_SSI_WS78,    FN_HSPI_CLK0_B, FN_RX1_B,
+       FN_CAN_CLK_D,   FN_SSI_SDATA8,  FN_SSI_SCK2_A,  FN_HSPI_CS0_B,
+       FN_TX2_A,       FN_CAN0_TX_B,   FN_SSI_SDATA7,  FN_HSPI_TX0_B,
+       FN_RX2_A,       FN_CAN0_RX_B,
+
+       /* IPSR6 */
+       FN_SSI_SCK6,    FN_HSPI_RX2_A,  FN_FMCLK_B,     FN_CAN1_TX_B,
+       FN_SSI_WS6,     FN_HSPI_CLK2_A, FN_BPFCLK_B,    FN_CAN1_RX_B,
+       FN_SSI_SDATA6,  FN_HSPI_TX2_A,  FN_FMIN_B,      FN_SSI_SCK5,
+       FN_RX4_C,       FN_SSI_WS5,     FN_TX4_C,       FN_SSI_SDATA5,
+       FN_RX0_D,       FN_SSI_WS34,    FN_ARM_TRACEDATA_8,
+       FN_SSI_SDATA4,  FN_SSI_WS2_A,   FN_ARM_TRACEDATA_9,
+       FN_SSI_SDATA3,  FN_ARM_TRACEDATA_10,
+       FN_SSI_SCK012,  FN_ARM_TRACEDATA_11,
+       FN_TX0_D,       FN_SSI_WS012,   FN_ARM_TRACEDATA_12,
+       FN_SSI_SDATA2,  FN_HSPI_CS2_A,  FN_ARM_TRACEDATA_13,
+       FN_SDA1_A,      FN_SSI_SDATA1,  FN_ARM_TRACEDATA_14,
+       FN_SCL1_A,      FN_SCK2_A,      FN_SSI_SDATA0,
+       FN_ARM_TRACEDATA_15,
+       FN_SD0_CLK,     FN_SUB_TDO,     FN_SD0_CMD,     FN_SUB_TRST,
+       FN_SD0_DAT0,    FN_SUB_TMS,     FN_SD0_DAT1,    FN_SUB_TCK,
+       FN_SD0_DAT2,    FN_SUB_TDI,
+
+       /* IPSR7 */
+       FN_SD0_DAT3,    FN_IRQ1_B,      FN_SD0_CD,      FN_TX5_A,
+       FN_SD0_WP,      FN_RX5_A,       FN_VI1_CLKENB,  FN_HSPI_CLK0_A,
+       FN_HTX1_A,      FN_RTS1_C,      FN_VI1_FIELD,   FN_HSPI_CS0_A,
+       FN_HRX1_A,      FN_SCK1_C,      FN_VI1_HSYNC,   FN_HSPI_RX0_A,
+       FN_HRTS1_A,     FN_FMCLK_A,     FN_RX1_C,       FN_VI1_VSYNC,
+       FN_HSPI_TX0,    FN_HCTS1_A,     FN_BPFCLK_A,    FN_TX1_C,
+       FN_TCLK0,       FN_HSCK1_A,     FN_FMIN_A,      FN_IRQ2_C,
+       FN_CTS1_C,      FN_SPEEDIN,     FN_VI0_CLK,     FN_CAN_CLK_A,
+       FN_VI0_CLKENB,  FN_SD2_DAT2_B,  FN_VI1_DATA0,   FN_DU1_DG6,
+       FN_HSPI_RX1_A,  FN_RX4_B,       FN_VI0_FIELD,   FN_SD2_DAT3_B,
+       FN_VI0_R3_C,    FN_VI1_DATA1,   FN_DU1_DG7,     FN_HSPI_CLK1_A,
+       FN_TX4_B,       FN_VI0_HSYNC,   FN_SD2_CD_B,    FN_VI1_DATA2,
+       FN_DU1_DR2,     FN_HSPI_CS1_A,  FN_RX3_B,
+
+       /* IPSR8 */
+       FN_VI0_VSYNC,   FN_SD2_WP_B,    FN_VI1_DATA3,   FN_DU1_DR3,
+       FN_HSPI_TX1_A,  FN_TX3_B,       FN_VI0_DATA0_VI0_B0,
+       FN_DU1_DG2,     FN_IRQ2_B,      FN_RX3_D,       FN_VI0_DATA1_VI0_B1,
+       FN_DU1_DG3,     FN_IRQ3_B,      FN_TX3_D,       FN_VI0_DATA2_VI0_B2,
+       FN_DU1_DG4,     FN_RX0_C,       FN_VI0_DATA3_VI0_B3,
+       FN_DU1_DG5,     FN_TX1_A,       FN_TX0_C,       FN_VI0_DATA4_VI0_B4,
+       FN_DU1_DB2,     FN_RX1_A,       FN_VI0_DATA5_VI0_B5,
+       FN_DU1_DB3,     FN_SCK1_A,      FN_PWM4,        FN_HSCK1_B,
+       FN_VI0_DATA6_VI0_G0,            FN_DU1_DB4,     FN_CTS1_A,
+       FN_PWM5,        FN_VI0_DATA7_VI0_G1,            FN_DU1_DB5,
+       FN_RTS1_A,      FN_VI0_G2,      FN_SD2_CLK_B,   FN_VI1_DATA4,
+       FN_DU1_DR4,     FN_HTX1_B,      FN_VI0_G3,      FN_SD2_CMD_B,
+       FN_VI1_DATA5,   FN_DU1_DR5,     FN_HRX1_B,
+
+       /* IPSR9 */
+       FN_VI0_G4,      FN_SD2_DAT0_B,  FN_VI1_DATA6,   FN_DU1_DR6,
+       FN_HRTS1_B,     FN_VI0_G5,      FN_SD2_DAT1_B,  FN_VI1_DATA7,
+       FN_DU1_DR7,     FN_HCTS1_B,     FN_VI0_R0_A,    FN_VI1_CLK,
+       FN_ETH_REF_CLK, FN_DU1_DOTCLKIN,                FN_VI0_R1_A,
+       FN_VI1_DATA8,   FN_DU1_DB6,     FN_ETH_TXD0,    FN_PWM2,
+       FN_TCLK1,       FN_VI0_R2_A,    FN_VI1_DATA9,   FN_DU1_DB7,
+       FN_ETH_TXD1,    FN_PWM3,        FN_VI0_R3_A,    FN_ETH_CRS_DV,
+       FN_IECLK,       FN_SCK2_C,      FN_VI0_R4_A,    FN_ETH_TX_EN,
+       FN_IETX,        FN_TX2_C,       FN_VI0_R5_A,    FN_ETH_RX_ER,
+       FN_FMCLK_C,     FN_IERX,        FN_RX2_C,       FN_VI1_DATA10_A,
+       FN_DU1_DOTCLKOUT,               FN_ETH_RXD0,    FN_BPFCLK_C,
+       FN_TX2_D,       FN_SDA2_C,      FN_VI1_DATA11_A,
+       FN_DU1_EXHSYNC_DU1_HSYNC,       FN_ETH_RXD1,    FN_FMIN_C,
+       FN_RX2_D,       FN_SCL2_C,
+
+       /* IPSR10 */
+       FN_SD2_CLK_A,   FN_DU1_EXVSYNC_DU1_VSYNC,       FN_ATARD1,
+       FN_ETH_MDC,     FN_SDA1_B,      FN_SD2_CMD_A,
+       FN_DU1_EXODDF_DU1_ODDF_DISP_CDE,                FN_ATAWR1,
+       FN_ETH_MDIO,    FN_SCL1_B,      FN_SD2_DAT0_A,  FN_DU1_DISP,
+       FN_ATACS01,     FN_DREQ1_B,     FN_ETH_LINK,    FN_CAN1_RX_A,
+       FN_SD2_DAT1_A,  FN_DU1_CDE,     FN_ATACS11,     FN_DACK1_B,
+       FN_ETH_MAGIC,   FN_CAN1_TX_A,   FN_PWM6,        FN_SD2_DAT2_A,
+       FN_VI1_DATA12,  FN_DREQ2_B,     FN_ATADIR1,     FN_HSPI_CLK2_B,
+       FN_GPSCLK_B,    FN_SD2_DAT3_A,  FN_VI1_DATA13,  FN_DACK2_B,
+       FN_ATAG1,       FN_HSPI_CS2_B,  FN_GPSIN_B,     FN_SD2_CD_A,
+       FN_VI1_DATA14,  FN_EX_WAIT1_B,  FN_DREQ0_B,     FN_HSPI_RX2_B,
+       FN_REMOCON_A,   FN_SD2_WP_A,    FN_VI1_DATA15,  FN_EX_WAIT2_B,
+       FN_DACK0_B,     FN_HSPI_TX2_B,  FN_CAN_CLK_C,
+
+       /* SEL */
+       FN_SEL_SCIF5_A, FN_SEL_SCIF5_B,
+       FN_SEL_SCIF4_A, FN_SEL_SCIF4_B, FN_SEL_SCIF4_C,
+       FN_SEL_SCIF3_A, FN_SEL_SCIF3_B, FN_SEL_SCIF3_C, FN_SEL_SCIF3_D,
+       FN_SEL_SCIF2_A, FN_SEL_SCIF2_B, FN_SEL_SCIF2_C, FN_SEL_SCIF2_D, FN_SEL_SCIF2_E,
+       FN_SEL_SCIF1_A, FN_SEL_SCIF1_B, FN_SEL_SCIF1_C, FN_SEL_SCIF1_D,
+       FN_SEL_SCIF0_A, FN_SEL_SCIF0_B, FN_SEL_SCIF0_C, FN_SEL_SCIF0_D,
+       FN_SEL_SSI2_A,  FN_SEL_SSI2_B,
+       FN_SEL_SSI1_A,  FN_SEL_SSI1_B,
+       FN_SEL_VI1_A,   FN_SEL_VI1_B,
+       FN_SEL_VI0_A,   FN_SEL_VI0_B,   FN_SEL_VI0_C,   FN_SEL_VI0_D,
+       FN_SEL_SD2_A,   FN_SEL_SD2_B,
+       FN_SEL_SD1_A,   FN_SEL_SD1_B,
+       FN_SEL_IRQ3_A,  FN_SEL_IRQ3_B,
+       FN_SEL_IRQ2_A,  FN_SEL_IRQ2_B,  FN_SEL_IRQ2_C,
+       FN_SEL_IRQ1_A,  FN_SEL_IRQ1_B,
+       FN_SEL_DREQ2_A, FN_SEL_DREQ2_B,
+       FN_SEL_DREQ1_A, FN_SEL_DREQ1_B,
+       FN_SEL_DREQ0_A, FN_SEL_DREQ0_B,
+       FN_SEL_WAIT2_A, FN_SEL_WAIT2_B,
+       FN_SEL_WAIT1_A, FN_SEL_WAIT1_B,
+       FN_SEL_CAN1_A,  FN_SEL_CAN1_B,
+       FN_SEL_CAN0_A,  FN_SEL_CAN0_B,
+       FN_SEL_CANCLK_A,        FN_SEL_CANCLK_B,
+       FN_SEL_CANCLK_C,        FN_SEL_CANCLK_D,
+       FN_SEL_HSCIF1_A,        FN_SEL_HSCIF1_B,
+       FN_SEL_HSCIF0_A,        FN_SEL_HSCIF0_B,
+       FN_SEL_REMOCON_A,       FN_SEL_REMOCON_B,       FN_SEL_REMOCON_C,
+       FN_SEL_FM_A,    FN_SEL_FM_B,    FN_SEL_FM_C,    FN_SEL_FM_D,
+       FN_SEL_GPS_A,   FN_SEL_GPS_B,   FN_SEL_GPS_C,
+       FN_SEL_TSIF0_A, FN_SEL_TSIF0_B,
+       FN_SEL_HSPI2_A, FN_SEL_HSPI2_B,
+       FN_SEL_HSPI1_A, FN_SEL_HSPI1_B,
+       FN_SEL_HSPI0_A, FN_SEL_HSPI0_B,
+       FN_SEL_I2C3_A,  FN_SEL_I2C3_B,  FN_SEL_I2C3_C,
+       FN_SEL_I2C2_A,  FN_SEL_I2C2_B,  FN_SEL_I2C2_C,
+       FN_SEL_I2C1_A,  FN_SEL_I2C1_B,
+       PINMUX_FUNCTION_END,
+
+       PINMUX_MARK_BEGIN,
+
+       /* GPSR0 */
+       PENC0_MARK,     PENC1_MARK,     A1_MARK,        A2_MARK,        A3_MARK,
+
+       /* GPSR1 */
+       WE0_MARK,
+
+       /* GPSR2 */
+       AUDIO_CLKA_MARK,
+       AUDIO_CLKB_MARK,
+
+       /* GPSR3 */
+       SSI_SCK34_MARK,
+
+       /* GPSR4 */
+       AVS1_MARK,
+       AVS2_MARK,
+
+       VI0_R0_C_MARK,          /* see sel_vi0 */
+       VI0_R1_C_MARK,          /* see sel_vi0 */
+       VI0_R2_C_MARK,          /* see sel_vi0 */
+       /* VI0_R3_C_MARK, */
+       VI0_R4_C_MARK,          /* see sel_vi0 */
+       VI0_R5_C_MARK,          /* see sel_vi0 */
+
+       VI0_R0_D_MARK,          /* see sel_vi0 */
+       VI0_R1_D_MARK,          /* see sel_vi0 */
+       VI0_R2_D_MARK,          /* see sel_vi0 */
+       VI0_R3_D_MARK,          /* see sel_vi0 */
+       VI0_R4_D_MARK,          /* see sel_vi0 */
+       VI0_R5_D_MARK,          /* see sel_vi0 */
+
+       /* IPSR0 */
+       PRESETOUT_MARK, PWM1_MARK,      AUDATA0_MARK,
+       ARM_TRACEDATA_0_MARK,           GPSCLK_C_MARK,  USB_OVC0_MARK,
+       TX2_E_MARK,     SDA2_B_MARK,    AUDATA1_MARK,   ARM_TRACEDATA_1_MARK,
+       GPSIN_C_MARK,   USB_OVC1_MARK,  RX2_E_MARK,     SCL2_B_MARK,
+       SD1_DAT2_A_MARK,                MMC_D2_MARK,    BS_MARK,
+       ATADIR0_A_MARK, SDSELF_A_MARK,  PWM4_B_MARK,    SD1_DAT3_A_MARK,
+       MMC_D3_MARK,    A0_MARK,        ATAG0_A_MARK,   REMOCON_B_MARK,
+       A4_MARK,        A5_MARK,        A6_MARK,        A7_MARK,
+       A8_MARK,        A9_MARK,        A10_MARK,       A11_MARK,
+       A12_MARK,       A13_MARK,       A14_MARK,       A15_MARK,
+       A16_MARK,       A17_MARK,       A18_MARK,       A19_MARK,
+
+       /* IPSR1 */
+       A20_MARK,       HSPI_CS1_B_MARK,                A21_MARK,
+       HSPI_CLK1_B_MARK,               A22_MARK,       HRTS0_B_MARK,
+       RX2_B_MARK,     DREQ2_A_MARK,   A23_MARK,       HTX0_B_MARK,
+       TX2_B_MARK,     DACK2_A_MARK,   TS_SDEN0_A_MARK,
+       SD1_CD_A_MARK,  MMC_D6_MARK,    A24_MARK,       DREQ1_A_MARK,
+       HRX0_B_MARK,    TS_SPSYNC0_A_MARK,              SD1_WP_A_MARK,
+       MMC_D7_MARK,    A25_MARK,       DACK1_A_MARK,   HCTS0_B_MARK,
+       RX3_C_MARK,     TS_SDAT0_A_MARK,                CLKOUT_MARK,
+       HSPI_TX1_B_MARK,                PWM0_B_MARK,    CS0_MARK,
+       HSPI_RX1_B_MARK,                SSI_SCK1_B_MARK,
+       ATAG0_B_MARK,   CS1_A26_MARK,   SDA2_A_MARK,    SCK2_B_MARK,
+       MMC_D5_MARK,    ATADIR0_B_MARK, RD_WR_MARK,     WE1_MARK,
+       ATAWR0_B_MARK,  SSI_WS1_B_MARK, EX_CS0_MARK,    SCL2_A_MARK,
+       TX3_C_MARK,     TS_SCK0_A_MARK, EX_CS1_MARK,    MMC_D4_MARK,
+
+       /* IPSR2 */
+       SD1_CLK_A_MARK, MMC_CLK_MARK,   ATACS00_MARK,   EX_CS2_MARK,
+       SD1_CMD_A_MARK, MMC_CMD_MARK,   ATACS10_MARK,   EX_CS3_MARK,
+       SD1_DAT0_A_MARK,                MMC_D0_MARK,    ATARD0_MARK,
+       EX_CS4_MARK,    EX_WAIT1_A_MARK,                SD1_DAT1_A_MARK,
+       MMC_D1_MARK,    ATAWR0_A_MARK,  EX_CS5_MARK,    EX_WAIT2_A_MARK,
+       DREQ0_A_MARK,   RX3_A_MARK,     DACK0_MARK,     TX3_A_MARK,
+       DRACK0_MARK,    EX_WAIT0_MARK,  PWM0_C_MARK,    D0_MARK,
+       D1_MARK,        D2_MARK,        D3_MARK,        D4_MARK,
+       D5_MARK,        D6_MARK,        D7_MARK,        D8_MARK,
+       D9_MARK,        D10_MARK,       D11_MARK,       RD_WR_B_MARK,
+       IRQ0_MARK,      MLB_CLK_MARK,   IRQ1_A_MARK,
+
+       /* IPSR3 */
+       MLB_SIG_MARK,   RX5_B_MARK,     SDA3_A_MARK,    IRQ2_A_MARK,
+       MLB_DAT_MARK,   TX5_B_MARK,     SCL3_A_MARK,    IRQ3_A_MARK,
+       SDSELF_B_MARK,  SD1_CMD_B_MARK, SCIF_CLK_MARK,  AUDIO_CLKOUT_B_MARK,
+       CAN_CLK_B_MARK, SDA3_B_MARK,    SD1_CLK_B_MARK, HTX0_A_MARK,
+       TX0_A_MARK,     SD1_DAT0_B_MARK,                HRX0_A_MARK,
+       RX0_A_MARK,     SD1_DAT1_B_MARK,                HSCK0_MARK,
+       SCK0_MARK,      SCL3_B_MARK,    SD1_DAT2_B_MARK,
+       HCTS0_A_MARK,   CTS0_MARK,      SD1_DAT3_B_MARK,
+       HRTS0_A_MARK,   RTS0_MARK,      SSI_SCK4_MARK,
+       DU0_DR0_MARK,   LCDOUT0_MARK,   AUDATA2_MARK,   ARM_TRACEDATA_2_MARK,
+       SDA3_C_MARK,    ADICHS1_MARK,   TS_SDEN0_B_MARK,
+       SSI_WS4_MARK,   DU0_DR1_MARK,   LCDOUT1_MARK,   AUDATA3_MARK,
+       ARM_TRACEDATA_3_MARK,           SCL3_C_MARK,    ADICHS2_MARK,
+       TS_SPSYNC0_B_MARK,              DU0_DR2_MARK,   LCDOUT2_MARK,
+       DU0_DR3_MARK,   LCDOUT3_MARK,   DU0_DR4_MARK,   LCDOUT4_MARK,
+       DU0_DR5_MARK,   LCDOUT5_MARK,   DU0_DR6_MARK,   LCDOUT6_MARK,
+
+       /* IPSR4 */
+       DU0_DR7_MARK,   LCDOUT7_MARK,   DU0_DG0_MARK,   LCDOUT8_MARK,
+       AUDATA4_MARK,   ARM_TRACEDATA_4_MARK,
+       TX1_D_MARK,     CAN0_TX_A_MARK, ADICHS0_MARK,   DU0_DG1_MARK,
+       LCDOUT9_MARK,   AUDATA5_MARK,   ARM_TRACEDATA_5_MARK,
+       RX1_D_MARK,     CAN0_RX_A_MARK, ADIDATA_MARK,   DU0_DG2_MARK,
+       LCDOUT10_MARK,  DU0_DG3_MARK,   LCDOUT11_MARK,  DU0_DG4_MARK,
+       LCDOUT12_MARK,  RX0_B_MARK,     DU0_DG5_MARK,   LCDOUT13_MARK,
+       TX0_B_MARK,     DU0_DG6_MARK,   LCDOUT14_MARK,  RX4_A_MARK,
+       DU0_DG7_MARK,   LCDOUT15_MARK,  TX4_A_MARK,     SSI_SCK2_B_MARK,
+       VI0_R0_B_MARK,  DU0_DB0_MARK,   LCDOUT16_MARK,  AUDATA6_MARK,
+       ARM_TRACEDATA_6_MARK,           GPSCLK_A_MARK,  PWM0_A_MARK,
+       ADICLK_MARK,    TS_SDAT0_B_MARK,                AUDIO_CLKC_MARK,
+       VI0_R1_B_MARK,  DU0_DB1_MARK,   LCDOUT17_MARK,  AUDATA7_MARK,
+       ARM_TRACEDATA_7_MARK,           GPSIN_A_MARK,   ADICS_SAMP_MARK,
+       TS_SCK0_B_MARK, VI0_R2_B_MARK,  DU0_DB2_MARK,   LCDOUT18_MARK,
+       VI0_R3_B_MARK,  DU0_DB3_MARK,   LCDOUT19_MARK,  VI0_R4_B_MARK,
+       DU0_DB4_MARK,   LCDOUT20_MARK,
+
+       /* IPSR5 */
+       VI0_R5_B_MARK,  DU0_DB5_MARK,   LCDOUT21_MARK,  VI1_DATA10_B_MARK,
+       DU0_DB6_MARK,   LCDOUT22_MARK,  VI1_DATA11_B_MARK,
+       DU0_DB7_MARK,   LCDOUT23_MARK,  DU0_DOTCLKIN_MARK,
+       QSTVA_QVS_MARK, DU0_DOTCLKO_UT0_MARK,
+       QCLK_MARK,      DU0_DOTCLKO_UT1_MARK,           QSTVB_QVE_MARK,
+       AUDIO_CLKOUT_A_MARK,            REMOCON_C_MARK, SSI_WS2_B_MARK,
+       DU0_EXHSYNC_DU0_HSYNC_MARK,     QSTH_QHS_MARK,
+       DU0_EXVSYNC_DU0_VSYNC_MARK,     QSTB_QHE_MARK,
+       DU0_EXODDF_DU0_ODDF_DISP_CDE_MARK,
+       QCPV_QDE_MARK,  FMCLK_D_MARK,   SSI_SCK1_A_MARK,
+       DU0_DISP_MARK,  QPOLA_MARK,     AUDCK_MARK,     ARM_TRACECLK_MARK,
+       BPFCLK_D_MARK,  SSI_WS1_A_MARK, DU0_CDE_MARK,   QPOLB_MARK,
+       AUDSYNC_MARK,   ARM_TRACECTL_MARK,              FMIN_D_MARK,
+       SD1_CD_B_MARK,  SSI_SCK78_MARK, HSPI_RX0_B_MARK,
+       TX1_B_MARK,     SD1_WP_B_MARK,  SSI_WS78_MARK,  HSPI_CLK0_B_MARK,
+       RX1_B_MARK,     CAN_CLK_D_MARK, SSI_SDATA8_MARK,
+       SSI_SCK2_A_MARK,                HSPI_CS0_B_MARK,
+       TX2_A_MARK,     CAN0_TX_B_MARK, SSI_SDATA7_MARK,
+       HSPI_TX0_B_MARK,                RX2_A_MARK,     CAN0_RX_B_MARK,
+
+       /* IPSR6 */
+       SSI_SCK6_MARK,  HSPI_RX2_A_MARK,                FMCLK_B_MARK,
+       CAN1_TX_B_MARK, SSI_WS6_MARK,   HSPI_CLK2_A_MARK,
+       BPFCLK_B_MARK,  CAN1_RX_B_MARK, SSI_SDATA6_MARK,
+       HSPI_TX2_A_MARK,                FMIN_B_MARK,    SSI_SCK5_MARK,
+       RX4_C_MARK,     SSI_WS5_MARK,   TX4_C_MARK,     SSI_SDATA5_MARK,
+       RX0_D_MARK,     SSI_WS34_MARK,  ARM_TRACEDATA_8_MARK,
+       SSI_SDATA4_MARK,                SSI_WS2_A_MARK, ARM_TRACEDATA_9_MARK,
+       SSI_SDATA3_MARK,                ARM_TRACEDATA_10_MARK,
+       SSI_SCK012_MARK,                ARM_TRACEDATA_11_MARK,
+       TX0_D_MARK,     SSI_WS012_MARK, ARM_TRACEDATA_12_MARK,
+       SSI_SDATA2_MARK,                HSPI_CS2_A_MARK,
+       ARM_TRACEDATA_13_MARK,          SDA1_A_MARK,    SSI_SDATA1_MARK,
+       ARM_TRACEDATA_14_MARK,          SCL1_A_MARK,    SCK2_A_MARK,
+       SSI_SDATA0_MARK,                ARM_TRACEDATA_15_MARK,
+       SD0_CLK_MARK,   SUB_TDO_MARK,   SD0_CMD_MARK,   SUB_TRST_MARK,
+       SD0_DAT0_MARK,  SUB_TMS_MARK,   SD0_DAT1_MARK,  SUB_TCK_MARK,
+       SD0_DAT2_MARK,  SUB_TDI_MARK,
+
+       /* IPSR7 */
+       SD0_DAT3_MARK,  IRQ1_B_MARK,    SD0_CD_MARK,    TX5_A_MARK,
+       SD0_WP_MARK,    RX5_A_MARK,     VI1_CLKENB_MARK,
+       HSPI_CLK0_A_MARK,       HTX1_A_MARK,    RTS1_C_MARK,    VI1_FIELD_MARK,
+       HSPI_CS0_A_MARK,        HRX1_A_MARK,    SCK1_C_MARK,    VI1_HSYNC_MARK,
+       HSPI_RX0_A_MARK,        HRTS1_A_MARK,   FMCLK_A_MARK,   RX1_C_MARK,
+       VI1_VSYNC_MARK, HSPI_TX0_MARK,  HCTS1_A_MARK,   BPFCLK_A_MARK,
+       TX1_C_MARK,     TCLK0_MARK,     HSCK1_A_MARK,   FMIN_A_MARK,
+       IRQ2_C_MARK,    CTS1_C_MARK,    SPEEDIN_MARK,   VI0_CLK_MARK,
+       CAN_CLK_A_MARK, VI0_CLKENB_MARK,                SD2_DAT2_B_MARK,
+       VI1_DATA0_MARK, DU1_DG6_MARK,   HSPI_RX1_A_MARK,
+       RX4_B_MARK,     VI0_FIELD_MARK, SD2_DAT3_B_MARK,
+       VI0_R3_C_MARK,  VI1_DATA1_MARK, DU1_DG7_MARK,   HSPI_CLK1_A_MARK,
+       TX4_B_MARK,     VI0_HSYNC_MARK, SD2_CD_B_MARK,  VI1_DATA2_MARK,
+       DU1_DR2_MARK,   HSPI_CS1_A_MARK,                RX3_B_MARK,
+
+       /* IPSR8 */
+       VI0_VSYNC_MARK, SD2_WP_B_MARK,  VI1_DATA3_MARK, DU1_DR3_MARK,
+       HSPI_TX1_A_MARK,                TX3_B_MARK,     VI0_DATA0_VI0_B0_MARK,
+       DU1_DG2_MARK,   IRQ2_B_MARK,    RX3_D_MARK,     VI0_DATA1_VI0_B1_MARK,
+       DU1_DG3_MARK,   IRQ3_B_MARK,    TX3_D_MARK,     VI0_DATA2_VI0_B2_MARK,
+       DU1_DG4_MARK,   RX0_C_MARK,     VI0_DATA3_VI0_B3_MARK,
+       DU1_DG5_MARK,   TX1_A_MARK,     TX0_C_MARK,     VI0_DATA4_VI0_B4_MARK,
+       DU1_DB2_MARK,   RX1_A_MARK,     VI0_DATA5_VI0_B5_MARK,
+       DU1_DB3_MARK,   SCK1_A_MARK,    PWM4_MARK,      HSCK1_B_MARK,
+       VI0_DATA6_VI0_G0_MARK,          DU1_DB4_MARK,   CTS1_A_MARK,
+       PWM5_MARK,      VI0_DATA7_VI0_G1_MARK,          DU1_DB5_MARK,
+       RTS1_A_MARK,    VI0_G2_MARK,    SD2_CLK_B_MARK, VI1_DATA4_MARK,
+       DU1_DR4_MARK,   HTX1_B_MARK,    VI0_G3_MARK,    SD2_CMD_B_MARK,
+       VI1_DATA5_MARK, DU1_DR5_MARK,   HRX1_B_MARK,
+
+       /* IPSR9 */
+       VI0_G4_MARK,    SD2_DAT0_B_MARK,                VI1_DATA6_MARK,
+       DU1_DR6_MARK,   HRTS1_B_MARK,   VI0_G5_MARK,    SD2_DAT1_B_MARK,
+       VI1_DATA7_MARK, DU1_DR7_MARK,   HCTS1_B_MARK,   VI0_R0_A_MARK,
+       VI1_CLK_MARK,   ETH_REF_CLK_MARK,               DU1_DOTCLKIN_MARK,
+       VI0_R1_A_MARK,  VI1_DATA8_MARK, DU1_DB6_MARK,   ETH_TXD0_MARK,
+       PWM2_MARK,      TCLK1_MARK,     VI0_R2_A_MARK,  VI1_DATA9_MARK,
+       DU1_DB7_MARK,   ETH_TXD1_MARK,  PWM3_MARK,      VI0_R3_A_MARK,
+       ETH_CRS_DV_MARK,                IECLK_MARK,     SCK2_C_MARK,
+       VI0_R4_A_MARK,                  ETH_TX_EN_MARK, IETX_MARK,
+       TX2_C_MARK,     VI0_R5_A_MARK,  ETH_RX_ER_MARK, FMCLK_C_MARK,
+       IERX_MARK,      RX2_C_MARK,     VI1_DATA10_A_MARK,
+       DU1_DOTCLKOUT_MARK,             ETH_RXD0_MARK,
+       BPFCLK_C_MARK,  TX2_D_MARK,     SDA2_C_MARK,    VI1_DATA11_A_MARK,
+       DU1_EXHSYNC_DU1_HSYNC_MARK,     ETH_RXD1_MARK,  FMIN_C_MARK,
+       RX2_D_MARK,     SCL2_C_MARK,
+
+       /* IPSR10 */
+       SD2_CLK_A_MARK, DU1_EXVSYNC_DU1_VSYNC_MARK,     ATARD1_MARK,
+       ETH_MDC_MARK,   SDA1_B_MARK,    SD2_CMD_A_MARK,
+       DU1_EXODDF_DU1_ODDF_DISP_CDE_MARK,              ATAWR1_MARK,
+       ETH_MDIO_MARK,  SCL1_B_MARK,    SD2_DAT0_A_MARK,
+       DU1_DISP_MARK,  ATACS01_MARK,   DREQ1_B_MARK,   ETH_LINK_MARK,
+       CAN1_RX_A_MARK, SD2_DAT1_A_MARK,                DU1_CDE_MARK,
+       ATACS11_MARK,   DACK1_B_MARK,   ETH_MAGIC_MARK, CAN1_TX_A_MARK,
+       PWM6_MARK,      SD2_DAT2_A_MARK,                VI1_DATA12_MARK,
+       DREQ2_B_MARK,   ATADIR1_MARK,   HSPI_CLK2_B_MARK,
+       GPSCLK_B_MARK,  SD2_DAT3_A_MARK,                VI1_DATA13_MARK,
+       DACK2_B_MARK,   ATAG1_MARK,     HSPI_CS2_B_MARK,
+       GPSIN_B_MARK,   SD2_CD_A_MARK,  VI1_DATA14_MARK,
+       EX_WAIT1_B_MARK,                DREQ0_B_MARK,   HSPI_RX2_B_MARK,
+       REMOCON_A_MARK, SD2_WP_A_MARK,  VI1_DATA15_MARK,
+       EX_WAIT2_B_MARK,                DACK0_B_MARK,
+       HSPI_TX2_B_MARK,                CAN_CLK_C_MARK,
+
+       PINMUX_MARK_END,
+};
+
+static const pinmux_enum_t pinmux_data[] = {
+       PINMUX_DATA_GP_ALL(), /* PINMUX_DATA(GP_M_N_DATA, GP_M_N_FN...), */
+
+       PINMUX_DATA(PENC0_MARK,         FN_PENC0),
+       PINMUX_DATA(PENC1_MARK,         FN_PENC1),
+       PINMUX_DATA(A1_MARK,            FN_A1),
+       PINMUX_DATA(A2_MARK,            FN_A2),
+       PINMUX_DATA(A3_MARK,            FN_A3),
+       PINMUX_DATA(WE0_MARK,           FN_WE0),
+       PINMUX_DATA(AUDIO_CLKA_MARK,    FN_AUDIO_CLKA),
+       PINMUX_DATA(AUDIO_CLKB_MARK,    FN_AUDIO_CLKB),
+       PINMUX_DATA(SSI_SCK34_MARK,     FN_SSI_SCK34),
+       PINMUX_DATA(AVS1_MARK,          FN_AVS1),
+       PINMUX_DATA(AVS2_MARK,          FN_AVS2),
+
+       /* IPSR0 */
+       PINMUX_IPSR_DATA(IP0_1_0,       PRESETOUT),
+       PINMUX_IPSR_DATA(IP0_1_0,       PWM1),
+
+       PINMUX_IPSR_DATA(IP0_4_2,       AUDATA0),
+       PINMUX_IPSR_DATA(IP0_4_2,       ARM_TRACEDATA_0),
+       PINMUX_IPSR_MSEL(IP0_4_2,       GPSCLK_C,       SEL_GPS_C),
+       PINMUX_IPSR_DATA(IP0_4_2,       USB_OVC0),
+       PINMUX_IPSR_DATA(IP0_4_2,       TX2_E),
+       PINMUX_IPSR_MSEL(IP0_4_2,       SDA2_B,         SEL_I2C2_B),
+
+       PINMUX_IPSR_DATA(IP0_7_5,       AUDATA1),
+       PINMUX_IPSR_DATA(IP0_7_5,       ARM_TRACEDATA_1),
+       PINMUX_IPSR_MSEL(IP0_7_5,       GPSIN_C,        SEL_GPS_C),
+       PINMUX_IPSR_DATA(IP0_7_5,       USB_OVC1),
+       PINMUX_IPSR_MSEL(IP0_7_5,       RX2_E,          SEL_SCIF2_E),
+       PINMUX_IPSR_MSEL(IP0_7_5,       SCL2_B,         SEL_I2C2_B),
+
+       PINMUX_IPSR_MSEL(IP0_11_8,      SD1_DAT2_A,     SEL_SD1_A),
+       PINMUX_IPSR_DATA(IP0_11_8,      MMC_D2),
+       PINMUX_IPSR_DATA(IP0_11_8,      BS),
+       PINMUX_IPSR_DATA(IP0_11_8,      ATADIR0_A),
+       PINMUX_IPSR_DATA(IP0_11_8,      SDSELF_A),
+       PINMUX_IPSR_DATA(IP0_11_8,      PWM4_B),
+
+       PINMUX_IPSR_MSEL(IP0_14_12,     SD1_DAT3_A,     SEL_SD1_A),
+       PINMUX_IPSR_DATA(IP0_14_12,     MMC_D3),
+       PINMUX_IPSR_DATA(IP0_14_12,     A0),
+       PINMUX_IPSR_DATA(IP0_14_12,     ATAG0_A),
+       PINMUX_IPSR_MSEL(IP0_14_12,     REMOCON_B,      SEL_REMOCON_B),
+
+       PINMUX_IPSR_DATA(IP0_15,        A4),
+       PINMUX_IPSR_DATA(IP0_16,        A5),
+       PINMUX_IPSR_DATA(IP0_17,        A6),
+       PINMUX_IPSR_DATA(IP0_18,        A7),
+       PINMUX_IPSR_DATA(IP0_19,        A8),
+       PINMUX_IPSR_DATA(IP0_20,        A9),
+       PINMUX_IPSR_DATA(IP0_21,        A10),
+       PINMUX_IPSR_DATA(IP0_22,        A11),
+       PINMUX_IPSR_DATA(IP0_23,        A12),
+       PINMUX_IPSR_DATA(IP0_24,        A13),
+       PINMUX_IPSR_DATA(IP0_25,        A14),
+       PINMUX_IPSR_DATA(IP0_26,        A15),
+       PINMUX_IPSR_DATA(IP0_27,        A16),
+       PINMUX_IPSR_DATA(IP0_28,        A17),
+       PINMUX_IPSR_DATA(IP0_29,        A18),
+       PINMUX_IPSR_DATA(IP0_30,        A19),
+
+       /* IPSR1 */
+       PINMUX_IPSR_DATA(IP1_0,         A20),
+       PINMUX_IPSR_MSEL(IP1_0,         HSPI_CS1_B,     SEL_HSPI1_B),
+
+       PINMUX_IPSR_DATA(IP1_1,         A21),
+       PINMUX_IPSR_MSEL(IP1_1,         HSPI_CLK1_B,    SEL_HSPI1_B),
+
+       PINMUX_IPSR_DATA(IP1_4_2,       A22),
+       PINMUX_IPSR_MSEL(IP1_4_2,       HRTS0_B,        SEL_HSCIF0_B),
+       PINMUX_IPSR_MSEL(IP1_4_2,       RX2_B,          SEL_SCIF2_B),
+       PINMUX_IPSR_MSEL(IP1_4_2,       DREQ2_A,        SEL_DREQ2_A),
+
+       PINMUX_IPSR_DATA(IP1_7_5,       A23),
+       PINMUX_IPSR_DATA(IP1_7_5,       HTX0_B),
+       PINMUX_IPSR_DATA(IP1_7_5,       TX2_B),
+       PINMUX_IPSR_DATA(IP1_7_5,       DACK2_A),
+       PINMUX_IPSR_MSEL(IP1_7_5,       TS_SDEN0_A,     SEL_TSIF0_A),
+
+       PINMUX_IPSR_MSEL(IP1_10_8,      SD1_CD_A,       SEL_SD1_A),
+       PINMUX_IPSR_DATA(IP1_10_8,      MMC_D6),
+       PINMUX_IPSR_DATA(IP1_10_8,      A24),
+       PINMUX_IPSR_MSEL(IP1_10_8,      DREQ1_A,        SEL_DREQ1_A),
+       PINMUX_IPSR_MSEL(IP1_10_8,      HRX0_B,         SEL_HSCIF0_B),
+       PINMUX_IPSR_MSEL(IP1_10_8,      TS_SPSYNC0_A,   SEL_TSIF0_A),
+
+       PINMUX_IPSR_MSEL(IP1_14_11,     SD1_WP_A,       SEL_SD1_A),
+       PINMUX_IPSR_DATA(IP1_14_11,     MMC_D7),
+       PINMUX_IPSR_DATA(IP1_14_11,     A25),
+       PINMUX_IPSR_DATA(IP1_14_11,     DACK1_A),
+       PINMUX_IPSR_MSEL(IP1_14_11,     HCTS0_B,        SEL_HSCIF0_B),
+       PINMUX_IPSR_MSEL(IP1_14_11,     RX3_C,          SEL_SCIF3_C),
+       PINMUX_IPSR_MSEL(IP1_14_11,     TS_SDAT0_A,     SEL_TSIF0_A),
+
+       PINMUX_IPSR_NOGP(IP1_16_15,     CLKOUT),
+       PINMUX_IPSR_NOGP(IP1_16_15,     HSPI_TX1_B),
+       PINMUX_IPSR_NOGP(IP1_16_15,     PWM0_B),
+
+       PINMUX_IPSR_NOGP(IP1_17,        CS0),
+       PINMUX_IPSR_NOGM(IP1_17,        HSPI_RX1_B,     SEL_HSPI1_B),
+
+       PINMUX_IPSR_NOGM(IP1_20_18,     SSI_SCK1_B,     SEL_SSI1_B),
+       PINMUX_IPSR_NOGP(IP1_20_18,     ATAG0_B),
+       PINMUX_IPSR_NOGP(IP1_20_18,     CS1_A26),
+       PINMUX_IPSR_NOGM(IP1_20_18,     SDA2_A,         SEL_I2C2_A),
+       PINMUX_IPSR_NOGM(IP1_20_18,     SCK2_B,         SEL_SCIF2_B),
+
+       PINMUX_IPSR_DATA(IP1_23_21,     MMC_D5),
+       PINMUX_IPSR_DATA(IP1_23_21,     ATADIR0_B),
+       PINMUX_IPSR_DATA(IP1_23_21,     RD_WR),
+
+       PINMUX_IPSR_DATA(IP1_24,        WE1),
+       PINMUX_IPSR_DATA(IP1_24,        ATAWR0_B),
+
+       PINMUX_IPSR_MSEL(IP1_27_25,     SSI_WS1_B,      SEL_SSI1_B),
+       PINMUX_IPSR_DATA(IP1_27_25,     EX_CS0),
+       PINMUX_IPSR_MSEL(IP1_27_25,     SCL2_A,         SEL_I2C2_A),
+       PINMUX_IPSR_DATA(IP1_27_25,     TX3_C),
+       PINMUX_IPSR_MSEL(IP1_27_25,     TS_SCK0_A,      SEL_TSIF0_A),
+
+       PINMUX_IPSR_DATA(IP1_29_28,     EX_CS1),
+       PINMUX_IPSR_DATA(IP1_29_28,     MMC_D4),
+
+       /* IPSR2 */
+       PINMUX_IPSR_DATA(IP2_2_0,       SD1_CLK_A),
+       PINMUX_IPSR_DATA(IP2_2_0,       MMC_CLK),
+       PINMUX_IPSR_DATA(IP2_2_0,       ATACS00),
+       PINMUX_IPSR_DATA(IP2_2_0,       EX_CS2),
+
+       PINMUX_IPSR_MSEL(IP2_5_3,       SD1_CMD_A,      SEL_SD1_A),
+       PINMUX_IPSR_DATA(IP2_5_3,       MMC_CMD),
+       PINMUX_IPSR_DATA(IP2_5_3,       ATACS10),
+       PINMUX_IPSR_DATA(IP2_5_3,       EX_CS3),
+
+       PINMUX_IPSR_MSEL(IP2_8_6,       SD1_DAT0_A,     SEL_SD1_A),
+       PINMUX_IPSR_DATA(IP2_8_6,       MMC_D0),
+       PINMUX_IPSR_DATA(IP2_8_6,       ATARD0),
+       PINMUX_IPSR_DATA(IP2_8_6,       EX_CS4),
+       PINMUX_IPSR_MSEL(IP2_8_6,       EX_WAIT1_A,     SEL_WAIT1_A),
+
+       PINMUX_IPSR_MSEL(IP2_11_9,      SD1_DAT1_A,     SEL_SD1_A),
+       PINMUX_IPSR_DATA(IP2_11_9,      MMC_D1),
+       PINMUX_IPSR_DATA(IP2_11_9,      ATAWR0_A),
+       PINMUX_IPSR_DATA(IP2_11_9,      EX_CS5),
+       PINMUX_IPSR_MSEL(IP2_11_9,      EX_WAIT2_A,     SEL_WAIT2_A),
+
+       PINMUX_IPSR_MSEL(IP2_13_12,     DREQ0_A,        SEL_DREQ0_A),
+       PINMUX_IPSR_MSEL(IP2_13_12,     RX3_A,          SEL_SCIF3_A),
+
+       PINMUX_IPSR_DATA(IP2_16_14,     DACK0),
+       PINMUX_IPSR_DATA(IP2_16_14,     TX3_A),
+       PINMUX_IPSR_DATA(IP2_16_14,     DRACK0),
+
+       PINMUX_IPSR_DATA(IP2_17,        EX_WAIT0),
+       PINMUX_IPSR_DATA(IP2_17,        PWM0_C),
+
+       PINMUX_IPSR_NOGP(IP2_18,        D0),
+       PINMUX_IPSR_NOGP(IP2_19,        D1),
+       PINMUX_IPSR_NOGP(IP2_20,        D2),
+       PINMUX_IPSR_NOGP(IP2_21,        D3),
+       PINMUX_IPSR_NOGP(IP2_22,        D4),
+       PINMUX_IPSR_NOGP(IP2_23,        D5),
+       PINMUX_IPSR_NOGP(IP2_24,        D6),
+       PINMUX_IPSR_NOGP(IP2_25,        D7),
+       PINMUX_IPSR_NOGP(IP2_26,        D8),
+       PINMUX_IPSR_NOGP(IP2_27,        D9),
+       PINMUX_IPSR_NOGP(IP2_28,        D10),
+       PINMUX_IPSR_NOGP(IP2_29,        D11),
+
+       PINMUX_IPSR_DATA(IP2_30,        RD_WR_B),
+       PINMUX_IPSR_DATA(IP2_30,        IRQ0),
+
+       PINMUX_IPSR_DATA(IP2_31,        MLB_CLK),
+       PINMUX_IPSR_MSEL(IP2_31,        IRQ1_A,         SEL_IRQ1_A),
+
+       /* IPSR3 */
+       PINMUX_IPSR_DATA(IP3_1_0,       MLB_SIG),
+       PINMUX_IPSR_MSEL(IP3_1_0,       RX5_B,          SEL_SCIF5_B),
+       PINMUX_IPSR_MSEL(IP3_1_0,       SDA3_A,         SEL_I2C3_A),
+       PINMUX_IPSR_MSEL(IP3_1_0,       IRQ2_A,         SEL_IRQ2_A),
+
+       PINMUX_IPSR_DATA(IP3_4_2,       MLB_DAT),
+       PINMUX_IPSR_DATA(IP3_4_2,       TX5_B),
+       PINMUX_IPSR_MSEL(IP3_4_2,       SCL3_A,         SEL_I2C3_A),
+       PINMUX_IPSR_MSEL(IP3_4_2,       IRQ3_A,         SEL_IRQ3_A),
+       PINMUX_IPSR_DATA(IP3_4_2,       SDSELF_B),
+
+       PINMUX_IPSR_MSEL(IP3_7_5,       SD1_CMD_B,      SEL_SD1_B),
+       PINMUX_IPSR_DATA(IP3_7_5,       SCIF_CLK),
+       PINMUX_IPSR_DATA(IP3_7_5,       AUDIO_CLKOUT_B),
+       PINMUX_IPSR_MSEL(IP3_7_5,       CAN_CLK_B,      SEL_CANCLK_B),
+       PINMUX_IPSR_MSEL(IP3_7_5,       SDA3_B,         SEL_I2C3_B),
+
+       PINMUX_IPSR_DATA(IP3_9_8,       SD1_CLK_B),
+       PINMUX_IPSR_DATA(IP3_9_8,       HTX0_A),
+       PINMUX_IPSR_DATA(IP3_9_8,       TX0_A),
+
+       PINMUX_IPSR_MSEL(IP3_12_10,     SD1_DAT0_B,     SEL_SD1_B),
+       PINMUX_IPSR_MSEL(IP3_12_10,     HRX0_A,         SEL_HSCIF0_A),
+       PINMUX_IPSR_MSEL(IP3_12_10,     RX0_A,          SEL_SCIF0_A),
+
+       PINMUX_IPSR_MSEL(IP3_15_13,     SD1_DAT1_B,     SEL_SD1_B),
+       PINMUX_IPSR_MSEL(IP3_15_13,     HSCK0,          SEL_HSCIF0_A),
+       PINMUX_IPSR_DATA(IP3_15_13,     SCK0),
+       PINMUX_IPSR_MSEL(IP3_15_13,     SCL3_B,         SEL_I2C3_B),
+
+       PINMUX_IPSR_MSEL(IP3_18_16,     SD1_DAT2_B,     SEL_SD1_B),
+       PINMUX_IPSR_MSEL(IP3_18_16,     HCTS0_A,        SEL_HSCIF0_A),
+       PINMUX_IPSR_DATA(IP3_18_16,     CTS0),
+
+       PINMUX_IPSR_MSEL(IP3_20_19,     SD1_DAT3_B,     SEL_SD1_B),
+       PINMUX_IPSR_MSEL(IP3_20_19,     HRTS0_A,        SEL_HSCIF0_A),
+       PINMUX_IPSR_DATA(IP3_20_19,     RTS0),
+
+       PINMUX_IPSR_DATA(IP3_23_21,     SSI_SCK4),
+       PINMUX_IPSR_DATA(IP3_23_21,     DU0_DR0),
+       PINMUX_IPSR_DATA(IP3_23_21,     LCDOUT0),
+       PINMUX_IPSR_DATA(IP3_23_21,     AUDATA2),
+       PINMUX_IPSR_DATA(IP3_23_21,     ARM_TRACEDATA_2),
+       PINMUX_IPSR_MSEL(IP3_23_21,     SDA3_C,         SEL_I2C3_C),
+       PINMUX_IPSR_DATA(IP3_23_21,     ADICHS1),
+       PINMUX_IPSR_MSEL(IP3_23_21,     TS_SDEN0_B,     SEL_TSIF0_B),
+
+       PINMUX_IPSR_DATA(IP3_26_24,     SSI_WS4),
+       PINMUX_IPSR_DATA(IP3_26_24,     DU0_DR1),
+       PINMUX_IPSR_DATA(IP3_26_24,     LCDOUT1),
+       PINMUX_IPSR_DATA(IP3_26_24,     AUDATA3),
+       PINMUX_IPSR_DATA(IP3_26_24,     ARM_TRACEDATA_3),
+       PINMUX_IPSR_MSEL(IP3_26_24,     SCL3_C,         SEL_I2C3_C),
+       PINMUX_IPSR_DATA(IP3_26_24,     ADICHS2),
+       PINMUX_IPSR_MSEL(IP3_26_24,     TS_SPSYNC0_B,   SEL_TSIF0_B),
+
+       PINMUX_IPSR_DATA(IP3_27,        DU0_DR2),
+       PINMUX_IPSR_DATA(IP3_27,        LCDOUT2),
+
+       PINMUX_IPSR_DATA(IP3_28,        DU0_DR3),
+       PINMUX_IPSR_DATA(IP3_28,        LCDOUT3),
+
+       PINMUX_IPSR_DATA(IP3_29,        DU0_DR4),
+       PINMUX_IPSR_DATA(IP3_29,        LCDOUT4),
+
+       PINMUX_IPSR_DATA(IP3_30,        DU0_DR5),
+       PINMUX_IPSR_DATA(IP3_30,        LCDOUT5),
+
+       PINMUX_IPSR_DATA(IP3_31,        DU0_DR6),
+       PINMUX_IPSR_DATA(IP3_31,        LCDOUT6),
+
+       /* IPSR4 */
+       PINMUX_IPSR_DATA(IP4_0,         DU0_DR7),
+       PINMUX_IPSR_DATA(IP4_0,         LCDOUT7),
+
+       PINMUX_IPSR_DATA(IP4_3_1,       DU0_DG0),
+       PINMUX_IPSR_DATA(IP4_3_1,       LCDOUT8),
+       PINMUX_IPSR_DATA(IP4_3_1,       AUDATA4),
+       PINMUX_IPSR_DATA(IP4_3_1,       ARM_TRACEDATA_4),
+       PINMUX_IPSR_DATA(IP4_3_1,       TX1_D),
+       PINMUX_IPSR_DATA(IP4_3_1,       CAN0_TX_A),
+       PINMUX_IPSR_DATA(IP4_3_1,       ADICHS0),
+
+       PINMUX_IPSR_DATA(IP4_6_4,       DU0_DG1),
+       PINMUX_IPSR_DATA(IP4_6_4,       LCDOUT9),
+       PINMUX_IPSR_DATA(IP4_6_4,       AUDATA5),
+       PINMUX_IPSR_DATA(IP4_6_4,       ARM_TRACEDATA_5),
+       PINMUX_IPSR_MSEL(IP4_6_4,       RX1_D,          SEL_SCIF1_D),
+       PINMUX_IPSR_MSEL(IP4_6_4,       CAN0_RX_A,      SEL_CAN0_A),
+       PINMUX_IPSR_DATA(IP4_6_4,       ADIDATA),
+
+       PINMUX_IPSR_DATA(IP4_7,         DU0_DG2),
+       PINMUX_IPSR_DATA(IP4_7,         LCDOUT10),
+
+       PINMUX_IPSR_DATA(IP4_8,         DU0_DG3),
+       PINMUX_IPSR_DATA(IP4_8,         LCDOUT11),
+
+       PINMUX_IPSR_DATA(IP4_10_9,      DU0_DG4),
+       PINMUX_IPSR_DATA(IP4_10_9,      LCDOUT12),
+       PINMUX_IPSR_MSEL(IP4_10_9,      RX0_B,          SEL_SCIF0_B),
+
+       PINMUX_IPSR_DATA(IP4_12_11,     DU0_DG5),
+       PINMUX_IPSR_DATA(IP4_12_11,     LCDOUT13),
+       PINMUX_IPSR_DATA(IP4_12_11,     TX0_B),
+
+       PINMUX_IPSR_DATA(IP4_14_13,     DU0_DG6),
+       PINMUX_IPSR_DATA(IP4_14_13,     LCDOUT14),
+       PINMUX_IPSR_MSEL(IP4_14_13,     RX4_A,          SEL_SCIF4_A),
+
+       PINMUX_IPSR_DATA(IP4_16_15,     DU0_DG7),
+       PINMUX_IPSR_DATA(IP4_16_15,     LCDOUT15),
+       PINMUX_IPSR_DATA(IP4_16_15,     TX4_A),
+
+       PINMUX_IPSR_MSEL(IP4_20_17,     SSI_SCK2_B,     SEL_SSI2_B),
+       PINMUX_DATA(VI0_R0_B_MARK,      FN_IP4_20_17,   FN_VI0_R0_B,    FN_SEL_VI0_B), /* see sel_vi0 */
+       PINMUX_DATA(VI0_R0_D_MARK,      FN_IP4_20_17,   FN_VI0_R0_B,    FN_SEL_VI0_D), /* see sel_vi0 */
+       PINMUX_IPSR_DATA(IP4_20_17,     DU0_DB0),
+       PINMUX_IPSR_DATA(IP4_20_17,     LCDOUT16),
+       PINMUX_IPSR_DATA(IP4_20_17,     AUDATA6),
+       PINMUX_IPSR_DATA(IP4_20_17,     ARM_TRACEDATA_6),
+       PINMUX_IPSR_MSEL(IP4_20_17,     GPSCLK_A,       SEL_GPS_A),
+       PINMUX_IPSR_DATA(IP4_20_17,     PWM0_A),
+       PINMUX_IPSR_DATA(IP4_20_17,     ADICLK),
+       PINMUX_IPSR_MSEL(IP4_20_17,     TS_SDAT0_B,     SEL_TSIF0_B),
+
+       PINMUX_IPSR_DATA(IP4_24_21,     AUDIO_CLKC),
+       PINMUX_DATA(VI0_R1_B_MARK,      FN_IP4_24_21,   FN_VI0_R1_B,    FN_SEL_VI0_B), /* see sel_vi0 */
+       PINMUX_DATA(VI0_R1_D_MARK,      FN_IP4_24_21,   FN_VI0_R1_B,    FN_SEL_VI0_D), /* see sel_vi0 */
+       PINMUX_IPSR_DATA(IP4_24_21,     DU0_DB1),
+       PINMUX_IPSR_DATA(IP4_24_21,     LCDOUT17),
+       PINMUX_IPSR_DATA(IP4_24_21,     AUDATA7),
+       PINMUX_IPSR_DATA(IP4_24_21,     ARM_TRACEDATA_7),
+       PINMUX_IPSR_MSEL(IP4_24_21,     GPSIN_A,        SEL_GPS_A),
+       PINMUX_IPSR_DATA(IP4_24_21,     ADICS_SAMP),
+       PINMUX_IPSR_MSEL(IP4_24_21,     TS_SCK0_B,      SEL_TSIF0_B),
+
+       PINMUX_DATA(VI0_R2_B_MARK,      FN_IP4_26_25,   FN_VI0_R2_B,    FN_SEL_VI0_B), /* see sel_vi0 */
+       PINMUX_DATA(VI0_R2_D_MARK,      FN_IP4_26_25,   FN_VI0_R2_B,    FN_SEL_VI0_D), /* see sel_vi0 */
+       PINMUX_IPSR_DATA(IP4_26_25,     DU0_DB2),
+       PINMUX_IPSR_DATA(IP4_26_25,     LCDOUT18),
+
+       PINMUX_IPSR_MSEL(IP4_28_27,     VI0_R3_B,       SEL_VI0_B),
+       PINMUX_IPSR_DATA(IP4_28_27,     DU0_DB3),
+       PINMUX_IPSR_DATA(IP4_28_27,     LCDOUT19),
+
+       PINMUX_DATA(VI0_R4_B_MARK,      FN_IP4_30_29,   FN_VI0_R4_B,    FN_SEL_VI0_B), /* see sel_vi0 */
+       PINMUX_DATA(VI0_R4_D_MARK,      FN_IP4_30_29,   FN_VI0_R4_B,    FN_SEL_VI0_D), /* see sel_vi0 */
+       PINMUX_IPSR_DATA(IP4_30_29,     DU0_DB4),
+       PINMUX_IPSR_DATA(IP4_30_29,     LCDOUT20),
+
+       /* IPSR5 */
+       PINMUX_DATA(VI0_R5_B_MARK,      FN_IP5_1_0,     FN_VI0_R5_B,    FN_SEL_VI0_B), /* see sel_vi0 */
+       PINMUX_DATA(VI0_R5_D_MARK,      FN_IP5_1_0,     FN_VI0_R5_B,    FN_SEL_VI0_D), /* see sel_vi0 */
+       PINMUX_IPSR_DATA(IP5_1_0,       DU0_DB5),
+       PINMUX_IPSR_DATA(IP5_1_0,       LCDOUT21),
+
+       PINMUX_IPSR_MSEL(IP5_3_2,       VI1_DATA10_B,   SEL_VI1_B),
+       PINMUX_IPSR_DATA(IP5_3_2,       DU0_DB6),
+       PINMUX_IPSR_DATA(IP5_3_2,       LCDOUT22),
+
+       PINMUX_IPSR_MSEL(IP5_5_4,       VI1_DATA11_B,   SEL_VI1_B),
+       PINMUX_IPSR_DATA(IP5_5_4,       DU0_DB7),
+       PINMUX_IPSR_DATA(IP5_5_4,       LCDOUT23),
+
+       PINMUX_IPSR_DATA(IP5_6,         DU0_DOTCLKIN),
+       PINMUX_IPSR_DATA(IP5_6,         QSTVA_QVS),
+
+       PINMUX_IPSR_DATA(IP5_7,         DU0_DOTCLKO_UT0),
+       PINMUX_IPSR_DATA(IP5_7,         QCLK),
+
+       PINMUX_IPSR_DATA(IP5_9_8,       DU0_DOTCLKO_UT1),
+       PINMUX_IPSR_DATA(IP5_9_8,       QSTVB_QVE),
+       PINMUX_IPSR_DATA(IP5_9_8,       AUDIO_CLKOUT_A),
+       PINMUX_IPSR_MSEL(IP5_9_8,       REMOCON_C,      SEL_REMOCON_C),
+
+       PINMUX_IPSR_MSEL(IP5_11_10,     SSI_WS2_B,      SEL_SSI2_B),
+       PINMUX_IPSR_DATA(IP5_11_10,     DU0_EXHSYNC_DU0_HSYNC),
+       PINMUX_IPSR_DATA(IP5_11_10,     QSTH_QHS),
+
+       PINMUX_IPSR_DATA(IP5_12,        DU0_EXVSYNC_DU0_VSYNC),
+       PINMUX_IPSR_DATA(IP5_12,        QSTB_QHE),
+
+       PINMUX_IPSR_DATA(IP5_14_13,     DU0_EXODDF_DU0_ODDF_DISP_CDE),
+       PINMUX_IPSR_DATA(IP5_14_13,     QCPV_QDE),
+       PINMUX_IPSR_MSEL(IP5_14_13,     FMCLK_D,        SEL_FM_D),
+
+       PINMUX_IPSR_MSEL(IP5_17_15,     SSI_SCK1_A,     SEL_SSI1_A),
+       PINMUX_IPSR_DATA(IP5_17_15,     DU0_DISP),
+       PINMUX_IPSR_DATA(IP5_17_15,     QPOLA),
+       PINMUX_IPSR_DATA(IP5_17_15,     AUDCK),
+       PINMUX_IPSR_DATA(IP5_17_15,     ARM_TRACECLK),
+       PINMUX_IPSR_DATA(IP5_17_15,     BPFCLK_D),
+
+       PINMUX_IPSR_MSEL(IP5_20_18,     SSI_WS1_A,      SEL_SSI1_A),
+       PINMUX_IPSR_DATA(IP5_20_18,     DU0_CDE),
+       PINMUX_IPSR_DATA(IP5_20_18,     QPOLB),
+       PINMUX_IPSR_DATA(IP5_20_18,     AUDSYNC),
+       PINMUX_IPSR_DATA(IP5_20_18,     ARM_TRACECTL),
+       PINMUX_IPSR_MSEL(IP5_20_18,     FMIN_D,         SEL_FM_D),
+
+       PINMUX_IPSR_MSEL(IP5_22_21,     SD1_CD_B,       SEL_SD1_B),
+       PINMUX_IPSR_DATA(IP5_22_21,     SSI_SCK78),
+       PINMUX_IPSR_MSEL(IP5_22_21,     HSPI_RX0_B,     SEL_HSPI0_B),
+       PINMUX_IPSR_DATA(IP5_22_21,     TX1_B),
+
+       PINMUX_IPSR_MSEL(IP5_25_23,     SD1_WP_B,       SEL_SD1_B),
+       PINMUX_IPSR_DATA(IP5_25_23,     SSI_WS78),
+       PINMUX_IPSR_MSEL(IP5_25_23,     HSPI_CLK0_B,    SEL_HSPI0_B),
+       PINMUX_IPSR_MSEL(IP5_25_23,     RX1_B,          SEL_SCIF1_B),
+       PINMUX_IPSR_MSEL(IP5_25_23,     CAN_CLK_D,      SEL_CANCLK_D),
+
+       PINMUX_IPSR_DATA(IP5_28_26,     SSI_SDATA8),
+       PINMUX_IPSR_MSEL(IP5_28_26,     SSI_SCK2_A,     SEL_SSI2_A),
+       PINMUX_IPSR_MSEL(IP5_28_26,     HSPI_CS0_B,     SEL_HSPI0_B),
+       PINMUX_IPSR_DATA(IP5_28_26,     TX2_A),
+       PINMUX_IPSR_DATA(IP5_28_26,     CAN0_TX_B),
+
+       PINMUX_IPSR_DATA(IP5_30_29,     SSI_SDATA7),
+       PINMUX_IPSR_DATA(IP5_30_29,     HSPI_TX0_B),
+       PINMUX_IPSR_MSEL(IP5_30_29,     RX2_A,          SEL_SCIF2_A),
+       PINMUX_IPSR_MSEL(IP5_30_29,     CAN0_RX_B,      SEL_CAN0_B),
+
+       /* IPSR6 */
+       PINMUX_IPSR_DATA(IP6_1_0,       SSI_SCK6),
+       PINMUX_IPSR_MSEL(IP6_1_0,       HSPI_RX2_A,     SEL_HSPI2_A),
+       PINMUX_IPSR_MSEL(IP6_1_0,       FMCLK_B,        SEL_FM_B),
+       PINMUX_IPSR_DATA(IP6_1_0,       CAN1_TX_B),
+
+       PINMUX_IPSR_DATA(IP6_4_2,       SSI_WS6),
+       PINMUX_IPSR_MSEL(IP6_4_2,       HSPI_CLK2_A,    SEL_HSPI2_A),
+       PINMUX_IPSR_DATA(IP6_4_2,       BPFCLK_B),
+       PINMUX_IPSR_MSEL(IP6_4_2,       CAN1_RX_B,      SEL_CAN1_B),
+
+       PINMUX_IPSR_DATA(IP6_6_5,       SSI_SDATA6),
+       PINMUX_IPSR_DATA(IP6_6_5,       HSPI_TX2_A),
+       PINMUX_IPSR_MSEL(IP6_6_5,       FMIN_B,         SEL_FM_B),
+
+       PINMUX_IPSR_DATA(IP6_7,         SSI_SCK5),
+       PINMUX_IPSR_MSEL(IP6_7,         RX4_C,          SEL_SCIF4_C),
+
+       PINMUX_IPSR_DATA(IP6_8,         SSI_WS5),
+       PINMUX_IPSR_DATA(IP6_8,         TX4_C),
+
+       PINMUX_IPSR_DATA(IP6_9,         SSI_SDATA5),
+       PINMUX_IPSR_MSEL(IP6_9,         RX0_D,          SEL_SCIF0_D),
+
+       PINMUX_IPSR_DATA(IP6_10,        SSI_WS34),
+       PINMUX_IPSR_DATA(IP6_10,        ARM_TRACEDATA_8),
+
+       PINMUX_IPSR_DATA(IP6_12_11,     SSI_SDATA4),
+       PINMUX_IPSR_MSEL(IP6_12_11,     SSI_WS2_A,      SEL_SSI2_A),
+       PINMUX_IPSR_DATA(IP6_12_11,     ARM_TRACEDATA_9),
+
+       PINMUX_IPSR_DATA(IP6_13,        SSI_SDATA3),
+       PINMUX_IPSR_DATA(IP6_13,        ARM_TRACEDATA_10),
+
+       PINMUX_IPSR_DATA(IP6_15_14,     SSI_SCK012),
+       PINMUX_IPSR_DATA(IP6_15_14,     ARM_TRACEDATA_11),
+       PINMUX_IPSR_DATA(IP6_15_14,     TX0_D),
+
+       PINMUX_IPSR_DATA(IP6_16,        SSI_WS012),
+       PINMUX_IPSR_DATA(IP6_16,        ARM_TRACEDATA_12),
+
+       PINMUX_IPSR_DATA(IP6_18_17,     SSI_SDATA2),
+       PINMUX_IPSR_MSEL(IP6_18_17,     HSPI_CS2_A,     SEL_HSPI2_A),
+       PINMUX_IPSR_DATA(IP6_18_17,     ARM_TRACEDATA_13),
+       PINMUX_IPSR_MSEL(IP6_18_17,     SDA1_A,         SEL_I2C1_A),
+
+       PINMUX_IPSR_DATA(IP6_20_19,     SSI_SDATA1),
+       PINMUX_IPSR_DATA(IP6_20_19,     ARM_TRACEDATA_14),
+       PINMUX_IPSR_MSEL(IP6_20_19,     SCL1_A,         SEL_I2C1_A),
+       PINMUX_IPSR_MSEL(IP6_20_19,     SCK2_A,         SEL_SCIF2_A),
+
+       PINMUX_IPSR_DATA(IP6_21,        SSI_SDATA0),
+       PINMUX_IPSR_DATA(IP6_21,        ARM_TRACEDATA_15),
+
+       PINMUX_IPSR_DATA(IP6_23_22,     SD0_CLK),
+       PINMUX_IPSR_DATA(IP6_23_22,     SUB_TDO),
+
+       PINMUX_IPSR_DATA(IP6_25_24,     SD0_CMD),
+       PINMUX_IPSR_DATA(IP6_25_24,     SUB_TRST),
+
+       PINMUX_IPSR_DATA(IP6_27_26,     SD0_DAT0),
+       PINMUX_IPSR_DATA(IP6_27_26,     SUB_TMS),
+
+       PINMUX_IPSR_DATA(IP6_29_28,     SD0_DAT1),
+       PINMUX_IPSR_DATA(IP6_29_28,     SUB_TCK),
+
+       PINMUX_IPSR_DATA(IP6_31_30,     SD0_DAT2),
+       PINMUX_IPSR_DATA(IP6_31_30,     SUB_TDI),
+
+       /* IPSR7 */
+       PINMUX_IPSR_DATA(IP7_1_0,       SD0_DAT3),
+       PINMUX_IPSR_MSEL(IP7_1_0,       IRQ1_B,         SEL_IRQ1_B),
+
+       PINMUX_IPSR_DATA(IP7_3_2,       SD0_CD),
+       PINMUX_IPSR_DATA(IP7_3_2,       TX5_A),
+
+       PINMUX_IPSR_DATA(IP7_5_4,       SD0_WP),
+       PINMUX_IPSR_MSEL(IP7_5_4,       RX5_A,          SEL_SCIF5_A),
+
+       PINMUX_IPSR_DATA(IP7_8_6,       VI1_CLKENB),
+       PINMUX_IPSR_MSEL(IP7_8_6,       HSPI_CLK0_A,    SEL_HSPI0_A),
+       PINMUX_IPSR_DATA(IP7_8_6,       HTX1_A),
+       PINMUX_IPSR_MSEL(IP7_8_6,       RTS1_C,         SEL_SCIF1_C),
+
+       PINMUX_IPSR_DATA(IP7_11_9,      VI1_FIELD),
+       PINMUX_IPSR_MSEL(IP7_11_9,      HSPI_CS0_A,     SEL_HSPI0_A),
+       PINMUX_IPSR_MSEL(IP7_11_9,      HRX1_A,         SEL_HSCIF1_A),
+       PINMUX_IPSR_MSEL(IP7_11_9,      SCK1_C,         SEL_SCIF1_C),
+
+       PINMUX_IPSR_DATA(IP7_14_12,     VI1_HSYNC),
+       PINMUX_IPSR_MSEL(IP7_14_12,     HSPI_RX0_A,     SEL_HSPI0_A),
+       PINMUX_IPSR_MSEL(IP7_14_12,     HRTS1_A,        SEL_HSCIF1_A),
+       PINMUX_IPSR_MSEL(IP7_14_12,     FMCLK_A,        SEL_FM_A),
+       PINMUX_IPSR_MSEL(IP7_14_12,     RX1_C,          SEL_SCIF1_C),
+
+       PINMUX_IPSR_DATA(IP7_17_15,     VI1_VSYNC),
+       PINMUX_IPSR_DATA(IP7_17_15,     HSPI_TX0),
+       PINMUX_IPSR_MSEL(IP7_17_15,     HCTS1_A,        SEL_HSCIF1_A),
+       PINMUX_IPSR_DATA(IP7_17_15,     BPFCLK_A),
+       PINMUX_IPSR_DATA(IP7_17_15,     TX1_C),
+
+       PINMUX_IPSR_DATA(IP7_20_18,     TCLK0),
+       PINMUX_IPSR_MSEL(IP7_20_18,     HSCK1_A,        SEL_HSCIF1_A),
+       PINMUX_IPSR_MSEL(IP7_20_18,     FMIN_A,         SEL_FM_A),
+       PINMUX_IPSR_MSEL(IP7_20_18,     IRQ2_C,         SEL_IRQ2_C),
+       PINMUX_IPSR_MSEL(IP7_20_18,     CTS1_C,         SEL_SCIF1_C),
+       PINMUX_IPSR_DATA(IP7_20_18,     SPEEDIN),
+
+       PINMUX_IPSR_DATA(IP7_21,        VI0_CLK),
+       PINMUX_IPSR_MSEL(IP7_21,        CAN_CLK_A,      SEL_CANCLK_A),
+
+       PINMUX_IPSR_DATA(IP7_24_22,     VI0_CLKENB),
+       PINMUX_IPSR_MSEL(IP7_24_22,     SD2_DAT2_B,     SEL_SD2_B),
+       PINMUX_IPSR_DATA(IP7_24_22,     VI1_DATA0),
+       PINMUX_IPSR_DATA(IP7_24_22,     DU1_DG6),
+       PINMUX_IPSR_MSEL(IP7_24_22,     HSPI_RX1_A,     SEL_HSPI1_A),
+       PINMUX_IPSR_MSEL(IP7_24_22,     RX4_B,          SEL_SCIF4_B),
+
+       PINMUX_IPSR_DATA(IP7_28_25,     VI0_FIELD),
+       PINMUX_IPSR_MSEL(IP7_28_25,     SD2_DAT3_B,     SEL_SD2_B),
+       PINMUX_DATA(VI0_R3_C_MARK,      FN_IP7_28_25,   FN_VI0_R3_C,    FN_SEL_VI0_C), /* see sel_vi0 */
+       PINMUX_DATA(VI0_R3_D_MARK,      FN_IP7_28_25,   FN_VI0_R3_C,    FN_SEL_VI0_D), /* see sel_vi0 */
+       PINMUX_IPSR_DATA(IP7_28_25,     VI1_DATA1),
+       PINMUX_IPSR_DATA(IP7_28_25,     DU1_DG7),
+       PINMUX_IPSR_MSEL(IP7_28_25,     HSPI_CLK1_A,    SEL_HSPI1_A),
+       PINMUX_IPSR_DATA(IP7_28_25,     TX4_B),
+
+       PINMUX_IPSR_DATA(IP7_31_29,     VI0_HSYNC),
+       PINMUX_IPSR_MSEL(IP7_31_29,     SD2_CD_B,       SEL_SD2_B),
+       PINMUX_IPSR_DATA(IP7_31_29,     VI1_DATA2),
+       PINMUX_IPSR_DATA(IP7_31_29,     DU1_DR2),
+       PINMUX_IPSR_MSEL(IP7_31_29,     HSPI_CS1_A,     SEL_HSPI1_A),
+       PINMUX_IPSR_MSEL(IP7_31_29,     RX3_B,          SEL_SCIF3_B),
+
+       /* IPSR8 */
+       PINMUX_IPSR_DATA(IP8_2_0,       VI0_VSYNC),
+       PINMUX_IPSR_MSEL(IP8_2_0,       SD2_WP_B,       SEL_SD2_B),
+       PINMUX_IPSR_DATA(IP8_2_0,       VI1_DATA3),
+       PINMUX_IPSR_DATA(IP8_2_0,       DU1_DR3),
+       PINMUX_IPSR_DATA(IP8_2_0,       HSPI_TX1_A),
+       PINMUX_IPSR_DATA(IP8_2_0,       TX3_B),
+
+       PINMUX_IPSR_DATA(IP8_5_3,       VI0_DATA0_VI0_B0),
+       PINMUX_IPSR_DATA(IP8_5_3,       DU1_DG2),
+       PINMUX_IPSR_MSEL(IP8_5_3,       IRQ2_B,         SEL_IRQ2_B),
+       PINMUX_IPSR_MSEL(IP8_5_3,       RX3_D,          SEL_SCIF3_D),
+
+       PINMUX_IPSR_DATA(IP8_8_6,       VI0_DATA1_VI0_B1),
+       PINMUX_IPSR_DATA(IP8_8_6,       DU1_DG3),
+       PINMUX_IPSR_MSEL(IP8_8_6,       IRQ3_B,         SEL_IRQ3_B),
+       PINMUX_IPSR_DATA(IP8_8_6,       TX3_D),
+
+       PINMUX_IPSR_DATA(IP8_10_9,      VI0_DATA2_VI0_B2),
+       PINMUX_IPSR_DATA(IP8_10_9,      DU1_DG4),
+       PINMUX_IPSR_MSEL(IP8_10_9,      RX0_C,          SEL_SCIF0_C),
+
+       PINMUX_IPSR_DATA(IP8_13_11,     VI0_DATA3_VI0_B3),
+       PINMUX_IPSR_DATA(IP8_13_11,     DU1_DG5),
+       PINMUX_IPSR_DATA(IP8_13_11,     TX1_A),
+       PINMUX_IPSR_DATA(IP8_13_11,     TX0_C),
+
+       PINMUX_IPSR_DATA(IP8_15_14,     VI0_DATA4_VI0_B4),
+       PINMUX_IPSR_DATA(IP8_15_14,     DU1_DB2),
+       PINMUX_IPSR_MSEL(IP8_15_14,     RX1_A,          SEL_SCIF1_A),
+
+       PINMUX_IPSR_DATA(IP8_18_16,     VI0_DATA5_VI0_B5),
+       PINMUX_IPSR_DATA(IP8_18_16,     DU1_DB3),
+       PINMUX_IPSR_MSEL(IP8_18_16,     SCK1_A,         SEL_SCIF1_A),
+       PINMUX_IPSR_DATA(IP8_18_16,     PWM4),
+       PINMUX_IPSR_MSEL(IP8_18_16,     HSCK1_B,        SEL_HSCIF1_B),
+
+       PINMUX_IPSR_DATA(IP8_21_19,     VI0_DATA6_VI0_G0),
+       PINMUX_IPSR_DATA(IP8_21_19,     DU1_DB4),
+       PINMUX_IPSR_MSEL(IP8_21_19,     CTS1_A,         SEL_SCIF1_A),
+       PINMUX_IPSR_DATA(IP8_21_19,     PWM5),
+
+       PINMUX_IPSR_DATA(IP8_23_22,     VI0_DATA7_VI0_G1),
+       PINMUX_IPSR_DATA(IP8_23_22,     DU1_DB5),
+       PINMUX_IPSR_MSEL(IP8_23_22,     RTS1_A,         SEL_SCIF1_A),
+
+       PINMUX_IPSR_DATA(IP8_26_24,     VI0_G2),
+       PINMUX_IPSR_DATA(IP8_26_24,     SD2_CLK_B),
+       PINMUX_IPSR_DATA(IP8_26_24,     VI1_DATA4),
+       PINMUX_IPSR_DATA(IP8_26_24,     DU1_DR4),
+       PINMUX_IPSR_DATA(IP8_26_24,     HTX1_B),
+
+       PINMUX_IPSR_DATA(IP8_29_27,     VI0_G3),
+       PINMUX_IPSR_MSEL(IP8_29_27,     SD2_CMD_B,      SEL_SD2_B),
+       PINMUX_IPSR_DATA(IP8_29_27,     VI1_DATA5),
+       PINMUX_IPSR_DATA(IP8_29_27,     DU1_DR5),
+       PINMUX_IPSR_MSEL(IP8_29_27,     HRX1_B,         SEL_HSCIF1_B),
+
+       /* IPSR9 */
+       PINMUX_IPSR_DATA(IP9_2_0,       VI0_G4),
+       PINMUX_IPSR_MSEL(IP9_2_0,       SD2_DAT0_B,     SEL_SD2_B),
+       PINMUX_IPSR_DATA(IP9_2_0,       VI1_DATA6),
+       PINMUX_IPSR_DATA(IP9_2_0,       DU1_DR6),
+       PINMUX_IPSR_MSEL(IP9_2_0,       HRTS1_B,        SEL_HSCIF1_B),
+
+       PINMUX_IPSR_DATA(IP9_5_3,       VI0_G5),
+       PINMUX_IPSR_MSEL(IP9_5_3,       SD2_DAT1_B,     SEL_SD2_B),
+       PINMUX_IPSR_DATA(IP9_5_3,       VI1_DATA7),
+       PINMUX_IPSR_DATA(IP9_5_3,       DU1_DR7),
+       PINMUX_IPSR_MSEL(IP9_5_3,       HCTS1_B,        SEL_HSCIF1_B),
+
+       PINMUX_DATA(VI0_R0_A_MARK,      FN_IP9_8_6,     FN_VI0_R0_A,    FN_SEL_VI0_A), /* see sel_vi0 */
+       PINMUX_DATA(VI0_R0_C_MARK,      FN_IP9_8_6,     FN_VI0_R0_A,    FN_SEL_VI0_C), /* see sel_vi0 */
+       PINMUX_IPSR_DATA(IP9_8_6,       VI1_CLK),
+       PINMUX_IPSR_DATA(IP9_8_6,       ETH_REF_CLK),
+       PINMUX_IPSR_DATA(IP9_8_6,       DU1_DOTCLKIN),
+
+       PINMUX_DATA(VI0_R1_A_MARK,      FN_IP9_11_9,    FN_VI0_R1_A,    FN_SEL_VI0_A), /* see sel_vi0 */
+       PINMUX_DATA(VI0_R1_C_MARK,      FN_IP9_11_9,    FN_VI0_R1_A,    FN_SEL_VI0_C), /* see sel_vi0 */
+       PINMUX_IPSR_DATA(IP9_11_9,      VI1_DATA8),
+       PINMUX_IPSR_DATA(IP9_11_9,      DU1_DB6),
+       PINMUX_IPSR_DATA(IP9_11_9,      ETH_TXD0),
+       PINMUX_IPSR_DATA(IP9_11_9,      PWM2),
+       PINMUX_IPSR_DATA(IP9_11_9,      TCLK1),
+
+       PINMUX_DATA(VI0_R2_A_MARK,      FN_IP9_14_12,   FN_VI0_R2_A,    FN_SEL_VI0_A), /* see sel_vi0 */
+       PINMUX_DATA(VI0_R2_C_MARK,      FN_IP9_14_12,   FN_VI0_R2_A,    FN_SEL_VI0_C), /* see sel_vi0 */
+       PINMUX_IPSR_DATA(IP9_14_12,     VI1_DATA9),
+       PINMUX_IPSR_DATA(IP9_14_12,     DU1_DB7),
+       PINMUX_IPSR_DATA(IP9_14_12,     ETH_TXD1),
+       PINMUX_IPSR_DATA(IP9_14_12,     PWM3),
+
+       PINMUX_IPSR_MSEL(IP9_17_15,     VI0_R3_A,       SEL_VI0_A),
+       PINMUX_IPSR_DATA(IP9_17_15,     ETH_CRS_DV),
+       PINMUX_IPSR_DATA(IP9_17_15,     IECLK),
+       PINMUX_IPSR_MSEL(IP9_17_15,     SCK2_C,         SEL_SCIF2_C),
+
+       PINMUX_DATA(VI0_R4_A_MARK,      FN_IP9_20_18,   FN_VI0_R4_A,    FN_SEL_VI0_A), /* see sel_vi0 */
+       PINMUX_DATA(VI0_R3_C_MARK,      FN_IP9_20_18,   FN_VI0_R4_A,    FN_SEL_VI0_C), /* see sel_vi0 */
+       PINMUX_IPSR_DATA(IP9_20_18,     ETH_TX_EN),
+       PINMUX_IPSR_DATA(IP9_20_18,     IETX),
+       PINMUX_IPSR_DATA(IP9_20_18,     TX2_C),
+
+       PINMUX_DATA(VI0_R5_A_MARK,      FN_IP9_23_21,   FN_VI0_R5_A,    FN_SEL_VI0_A), /* see sel_vi0 */
+       PINMUX_DATA(VI0_R5_C_MARK,      FN_IP9_23_21,   FN_VI0_R5_A,    FN_SEL_VI0_C), /* see sel_vi0 */
+       PINMUX_IPSR_DATA(IP9_23_21,     ETH_RX_ER),
+       PINMUX_IPSR_MSEL(IP9_23_21,     FMCLK_C,        SEL_FM_C),
+       PINMUX_IPSR_DATA(IP9_23_21,     IERX),
+       PINMUX_IPSR_MSEL(IP9_23_21,     RX2_C,          SEL_SCIF2_C),
+
+       PINMUX_IPSR_MSEL(IP9_26_24,     VI1_DATA10_A,   SEL_VI1_A),
+       PINMUX_IPSR_DATA(IP9_26_24,     DU1_DOTCLKOUT),
+       PINMUX_IPSR_DATA(IP9_26_24,     ETH_RXD0),
+       PINMUX_IPSR_DATA(IP9_26_24,     BPFCLK_C),
+       PINMUX_IPSR_DATA(IP9_26_24,     TX2_D),
+       PINMUX_IPSR_MSEL(IP9_26_24,     SDA2_C,         SEL_I2C2_C),
+
+       PINMUX_IPSR_MSEL(IP9_29_27,     VI1_DATA11_A,   SEL_VI1_A),
+       PINMUX_IPSR_DATA(IP9_29_27,     DU1_EXHSYNC_DU1_HSYNC),
+       PINMUX_IPSR_DATA(IP9_29_27,     ETH_RXD1),
+       PINMUX_IPSR_MSEL(IP9_29_27,     FMIN_C,         SEL_FM_C),
+       PINMUX_IPSR_MSEL(IP9_29_27,     RX2_D,          SEL_SCIF2_D),
+       PINMUX_IPSR_MSEL(IP9_29_27,     SCL2_C,         SEL_I2C2_C),
+
+       /* IPSR10 */
+       PINMUX_IPSR_DATA(IP10_2_0,      SD2_CLK_A),
+       PINMUX_IPSR_DATA(IP10_2_0,      DU1_EXVSYNC_DU1_VSYNC),
+       PINMUX_IPSR_DATA(IP10_2_0,      ATARD1),
+       PINMUX_IPSR_DATA(IP10_2_0,      ETH_MDC),
+       PINMUX_IPSR_MSEL(IP10_2_0,      SDA1_B,         SEL_I2C1_B),
+
+       PINMUX_IPSR_MSEL(IP10_5_3,      SD2_CMD_A,      SEL_SD2_A),
+       PINMUX_IPSR_DATA(IP10_5_3,      DU1_EXODDF_DU1_ODDF_DISP_CDE),
+       PINMUX_IPSR_DATA(IP10_5_3,      ATAWR1),
+       PINMUX_IPSR_DATA(IP10_5_3,      ETH_MDIO),
+       PINMUX_IPSR_MSEL(IP10_5_3,      SCL1_B,         SEL_I2C1_B),
+
+       PINMUX_IPSR_MSEL(IP10_8_6,      SD2_DAT0_A,     SEL_SD2_A),
+       PINMUX_IPSR_DATA(IP10_8_6,      DU1_DISP),
+       PINMUX_IPSR_DATA(IP10_8_6,      ATACS01),
+       PINMUX_IPSR_MSEL(IP10_8_6,      DREQ1_B,        SEL_DREQ1_B),
+       PINMUX_IPSR_DATA(IP10_8_6,      ETH_LINK),
+       PINMUX_IPSR_MSEL(IP10_8_6,      CAN1_RX_A,      SEL_CAN1_A),
+
+       PINMUX_IPSR_MSEL(IP10_12_9,     SD2_DAT1_A,     SEL_SD2_A),
+       PINMUX_IPSR_DATA(IP10_12_9,     DU1_CDE),
+       PINMUX_IPSR_DATA(IP10_12_9,     ATACS11),
+       PINMUX_IPSR_DATA(IP10_12_9,     DACK1_B),
+       PINMUX_IPSR_DATA(IP10_12_9,     ETH_MAGIC),
+       PINMUX_IPSR_DATA(IP10_12_9,     CAN1_TX_A),
+       PINMUX_IPSR_DATA(IP10_12_9,     PWM6),
+
+       PINMUX_IPSR_MSEL(IP10_15_13,    SD2_DAT2_A,     SEL_SD2_A),
+       PINMUX_IPSR_DATA(IP10_15_13,    VI1_DATA12),
+       PINMUX_IPSR_MSEL(IP10_15_13,    DREQ2_B,        SEL_DREQ2_B),
+       PINMUX_IPSR_DATA(IP10_15_13,    ATADIR1),
+       PINMUX_IPSR_MSEL(IP10_15_13,    HSPI_CLK2_B,    SEL_HSPI2_B),
+       PINMUX_IPSR_MSEL(IP10_15_13,    GPSCLK_B,       SEL_GPS_B),
+
+       PINMUX_IPSR_MSEL(IP10_18_16,    SD2_DAT3_A,     SEL_SD2_A),
+       PINMUX_IPSR_DATA(IP10_18_16,    VI1_DATA13),
+       PINMUX_IPSR_DATA(IP10_18_16,    DACK2_B),
+       PINMUX_IPSR_DATA(IP10_18_16,    ATAG1),
+       PINMUX_IPSR_MSEL(IP10_18_16,    HSPI_CS2_B,     SEL_HSPI2_B),
+       PINMUX_IPSR_MSEL(IP10_18_16,    GPSIN_B,        SEL_GPS_B),
+
+       PINMUX_IPSR_MSEL(IP10_21_19,    SD2_CD_A,       SEL_SD2_A),
+       PINMUX_IPSR_DATA(IP10_21_19,    VI1_DATA14),
+       PINMUX_IPSR_MSEL(IP10_21_19,    EX_WAIT1_B,     SEL_WAIT1_B),
+       PINMUX_IPSR_MSEL(IP10_21_19,    DREQ0_B,        SEL_DREQ0_B),
+       PINMUX_IPSR_MSEL(IP10_21_19,    HSPI_RX2_B,     SEL_HSPI2_B),
+       PINMUX_IPSR_MSEL(IP10_21_19,    REMOCON_A,      SEL_REMOCON_A),
+
+       PINMUX_IPSR_MSEL(IP10_24_22,    SD2_WP_A,       SEL_SD2_A),
+       PINMUX_IPSR_DATA(IP10_24_22,    VI1_DATA15),
+       PINMUX_IPSR_MSEL(IP10_24_22,    EX_WAIT2_B,     SEL_WAIT2_B),
+       PINMUX_IPSR_DATA(IP10_24_22,    DACK0_B),
+       PINMUX_IPSR_DATA(IP10_24_22,    HSPI_TX2_B),
+       PINMUX_IPSR_MSEL(IP10_24_22,    CAN_CLK_C,      SEL_CANCLK_C),
+};
+
+static struct sh_pfc_pin pinmux_pins[] = {
+       PINMUX_GPIO_GP_ALL(),
+};
+
+/* 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)*25+(col)-1)
+
+/* - macro */
+#define SH_PFC_PINS(name, args...) \
+       static const unsigned int name ##_pins[] = { args }
+#define SH_PFC_MUX1(name, arg1)                                        \
+       static const unsigned int name ##_mux[]  = { arg1##_MARK }
+#define SH_PFC_MUX2(name, arg1, arg2)                                  \
+       static const unsigned int name ##_mux[]  = { arg1##_MARK, arg2##_MARK, }
+#define SH_PFC_MUX3(name, arg1, arg2, arg3)                                    \
+       static const unsigned int name ##_mux[]  = { arg1##_MARK, arg2##_MARK,  \
+                                                    arg3##_MARK }
+#define SH_PFC_MUX4(name, arg1, arg2, arg3, arg4)                      \
+       static const unsigned int name ##_mux[]  = { arg1##_MARK, arg2##_MARK, \
+                                                    arg3##_MARK, arg4##_MARK }
+#define SH_PFC_MUX8(name, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8) \
+       static const unsigned int name ##_mux[]  = { arg1##_MARK, arg2##_MARK, \
+                                                    arg3##_MARK, arg4##_MARK, \
+                                                    arg5##_MARK, arg6##_MARK, \
+                                                    arg7##_MARK, arg8##_MARK, }
+
+/* - Ether ------------------------------------------------------------------ */
+SH_PFC_PINS(ether_rmii,                RCAR_GP_PIN(4, 10),     RCAR_GP_PIN(4, 11),
+                               RCAR_GP_PIN(4, 13),     RCAR_GP_PIN(4, 9),
+                               RCAR_GP_PIN(4, 15),     RCAR_GP_PIN(4, 16),
+                               RCAR_GP_PIN(4, 12),     RCAR_GP_PIN(4, 14),
+                               RCAR_GP_PIN(4, 18),     RCAR_GP_PIN(4, 17));
+static const unsigned int ether_rmii_mux[] = {
+       ETH_TXD0_MARK, ETH_TXD1_MARK, ETH_TX_EN_MARK,  ETH_REF_CLK_MARK,
+       ETH_RXD0_MARK, ETH_RXD1_MARK, ETH_CRS_DV_MARK, ETH_RX_ER_MARK,
+       ETH_MDIO_MARK, ETH_MDC_MARK,
+};
+SH_PFC_PINS(ether_link,                RCAR_GP_PIN(4, 19));
+SH_PFC_MUX1(ether_link,                ETH_LINK);
+SH_PFC_PINS(ether_magic,       RCAR_GP_PIN(4, 20));
+SH_PFC_MUX1(ether_magic,       ETH_MAGIC);
+
+/* - SCIF macro ------------------------------------------------------------- */
+#define SCIF_PFC_PIN(name, args...)    SH_PFC_PINS(name, args)
+#define SCIF_PFC_DAT(name, tx, rx)     SH_PFC_MUX2(name, tx, rx)
+#define SCIF_PFC_CTR(name, cts, rts)   SH_PFC_MUX2(name, cts, rts)
+#define SCIF_PFC_CLK(name, sck)                SH_PFC_MUX1(name, sck)
+
+/* - HSCIF0 ----------------------------------------------------------------- */
+SCIF_PFC_PIN(hscif0_data_a,    RCAR_GP_PIN(1, 17),     RCAR_GP_PIN(1, 18));
+SCIF_PFC_DAT(hscif0_data_a,    HTX0_A,                 HRX0_A);
+SCIF_PFC_PIN(hscif0_data_b,    RCAR_GP_PIN(0, 29),     RCAR_GP_PIN(0, 30));
+SCIF_PFC_DAT(hscif0_data_b,    HTX0_B,                 HRX0_B);
+SCIF_PFC_PIN(hscif0_ctrl_a,    RCAR_GP_PIN(1, 20),     RCAR_GP_PIN(1, 21));
+SCIF_PFC_CTR(hscif0_ctrl_a,    HCTS0_A,                HRTS0_A);
+SCIF_PFC_PIN(hscif0_ctrl_b,    RCAR_GP_PIN(0, 31),     RCAR_GP_PIN(0, 28));
+SCIF_PFC_CTR(hscif0_ctrl_b,    HCTS0_B,                HRTS0_B);
+SCIF_PFC_PIN(hscif0_clk,       RCAR_GP_PIN(1, 19));
+SCIF_PFC_CLK(hscif0_clk,       HSCK0);
+
+/* - HSCIF1 ----------------------------------------------------------------- */
+SCIF_PFC_PIN(hscif1_data_a,    RCAR_GP_PIN(3, 19),     RCAR_GP_PIN(3, 20));
+SCIF_PFC_DAT(hscif1_data_a,    HTX1_A,                 HRX1_A);
+SCIF_PFC_PIN(hscif1_data_b,    RCAR_GP_PIN(4, 5),      RCAR_GP_PIN(4, 6));
+SCIF_PFC_DAT(hscif1_data_b,    HTX1_B,                 HRX1_B);
+SCIF_PFC_PIN(hscif1_ctrl_a,    RCAR_GP_PIN(3, 22),     RCAR_GP_PIN(3, 21));
+SCIF_PFC_CTR(hscif1_ctrl_a,    HCTS1_A,                HRTS1_A);
+SCIF_PFC_PIN(hscif1_ctrl_b,    RCAR_GP_PIN(4, 8),      RCAR_GP_PIN(4, 7));
+SCIF_PFC_CTR(hscif1_ctrl_b,    HCTS1_B,                HRTS1_B);
+SCIF_PFC_PIN(hscif1_clk_a,     RCAR_GP_PIN(3, 23));
+SCIF_PFC_CLK(hscif1_clk_a,     HSCK1_A);
+SCIF_PFC_PIN(hscif1_clk_b,     RCAR_GP_PIN(4, 2));
+SCIF_PFC_CLK(hscif1_clk_b,     HSCK1_B);
+
+/* - HSPI macro --------------------------------------------------------------*/
+#define HSPI_PFC_PIN(name, args...)            SH_PFC_PINS(name, args)
+#define HSPI_PFC_DAT(name, clk, cs, rx, tx)    SH_PFC_MUX4(name, clk, cs, rx, tx)
+
+/* - HSPI0 -------------------------------------------------------------------*/
+HSPI_PFC_PIN(hspi0_a,  RCAR_GP_PIN(3, 19),     RCAR_GP_PIN(3, 20),
+                       RCAR_GP_PIN(3, 21),     RCAR_GP_PIN(3, 22));
+HSPI_PFC_DAT(hspi0_a,  HSPI_CLK0_A,            HSPI_CS0_A,
+                       HSPI_RX0_A,             HSPI_TX0);
+
+HSPI_PFC_PIN(hspi0_b,  RCAR_GP_PIN(2, 25),     RCAR_GP_PIN(2, 26),
+                       RCAR_GP_PIN(2, 24),     RCAR_GP_PIN(2, 27));
+HSPI_PFC_DAT(hspi0_b,  HSPI_CLK0_B,            HSPI_CS0_B,
+                       HSPI_RX0_B,             HSPI_TX0_B);
+
+/* - HSPI1 -------------------------------------------------------------------*/
+HSPI_PFC_PIN(hspi1_a,  RCAR_GP_PIN(3, 26),     RCAR_GP_PIN(3, 27),
+                       RCAR_GP_PIN(3, 25),     RCAR_GP_PIN(3, 28));
+HSPI_PFC_DAT(hspi1_a,  HSPI_CLK1_A,            HSPI_CS1_A,
+                       HSPI_RX1_A,             HSPI_TX1_A);
+
+HSPI_PFC_PIN(hspi1_b,  RCAR_GP_PIN(0, 27),     RCAR_GP_PIN(0, 26),
+                       PIN_NUMBER(20, 1),      PIN_NUMBER(25, 2));
+HSPI_PFC_DAT(hspi1_b,  HSPI_CLK1_B,            HSPI_CS1_B,
+                       HSPI_RX1_B,             HSPI_TX1_B);
+
+/* - HSPI2 -------------------------------------------------------------------*/
+HSPI_PFC_PIN(hspi2_a,  RCAR_GP_PIN(2, 29),     RCAR_GP_PIN(3, 8),
+                       RCAR_GP_PIN(2, 28),     RCAR_GP_PIN(2, 30));
+HSPI_PFC_DAT(hspi2_a,  HSPI_CLK2_A,            HSPI_CS2_A,
+                       HSPI_RX2_A,             HSPI_TX2_A);
+
+HSPI_PFC_PIN(hspi2_b,  RCAR_GP_PIN(4, 21),     RCAR_GP_PIN(4, 22),
+                       RCAR_GP_PIN(4, 23),     RCAR_GP_PIN(4, 24));
+HSPI_PFC_DAT(hspi2_b,  HSPI_CLK2_B,            HSPI_CS2_B,
+                       HSPI_RX2_B,             HSPI_TX2_B);
+
+/* - I2C macro ------------------------------------------------------------- */
+#define I2C_PFC_PIN(name, args...)     SH_PFC_PINS(name, args)
+#define I2C_PFC_MUX(name, sda, scl)    SH_PFC_MUX2(name, sda, scl)
+
+/* - I2C1 ------------------------------------------------------------------ */
+I2C_PFC_PIN(i2c1_a,    RCAR_GP_PIN(3, 8),      RCAR_GP_PIN(3, 9));
+I2C_PFC_MUX(i2c1_a,    SDA1_A,                 SCL1_A);
+I2C_PFC_PIN(i2c1_b,    RCAR_GP_PIN(4, 17),     RCAR_GP_PIN(4, 18));
+I2C_PFC_MUX(i2c1_b,    SDA1_B,                 SCL1_B);
+
+/* - I2C2 ------------------------------------------------------------------ */
+I2C_PFC_PIN(i2c2_a,    PIN_NUMBER(3, 20),      RCAR_GP_PIN(1, 3));
+I2C_PFC_MUX(i2c2_a,    SDA2_A,                 SCL2_A);
+I2C_PFC_PIN(i2c2_b,    RCAR_GP_PIN(0, 3),      RCAR_GP_PIN(0, 4));
+I2C_PFC_MUX(i2c2_b,    SDA2_B,                 SCL2_B);
+I2C_PFC_PIN(i2c2_c,    RCAR_GP_PIN(4, 15),     RCAR_GP_PIN(4, 16));
+I2C_PFC_MUX(i2c2_c,    SDA2_C,                 SCL2_C);
+
+/* - I2C3 ------------------------------------------------------------------ */
+I2C_PFC_PIN(i2c3_a,    RCAR_GP_PIN(1, 14),     RCAR_GP_PIN(1, 15));
+I2C_PFC_MUX(i2c3_a,    SDA3_A,                 SCL3_A);
+I2C_PFC_PIN(i2c3_b,    RCAR_GP_PIN(1, 16),     RCAR_GP_PIN(1, 19));
+I2C_PFC_MUX(i2c3_b,    SDA3_B,                 SCL3_B);
+I2C_PFC_PIN(i2c3_c,    RCAR_GP_PIN(1, 22),     RCAR_GP_PIN(1, 23));
+I2C_PFC_MUX(i2c3_c,    SDA3_C,                 SCL3_C);
+
+/* - MMC macro -------------------------------------------------------------- */
+#define MMC_PFC_PINS(name, args...)            SH_PFC_PINS(name, args)
+#define MMC_PFC_CTRL(name, clk, cmd)           SH_PFC_MUX2(name, clk, cmd)
+#define MMC_PFC_DAT1(name, d0)                 SH_PFC_MUX1(name, d0)
+#define MMC_PFC_DAT4(name, d0, d1, d2, d3)     SH_PFC_MUX4(name, d0, d1, d2, d3)
+#define MMC_PFC_DAT8(name, d0, d1, d2, d3, d4, d5, d6, d7)     \
+                       SH_PFC_MUX8(name, d0, d1, d2, d3, d4, d5, d6, d7)
+
+/* - MMC -------------------------------------------------------------------- */
+MMC_PFC_PINS(mmc_ctrl,         RCAR_GP_PIN(1, 5),      RCAR_GP_PIN(1, 6));
+MMC_PFC_CTRL(mmc_ctrl,         MMC_CLK,                MMC_CMD);
+MMC_PFC_PINS(mmc_data1,                RCAR_GP_PIN(1, 7));
+MMC_PFC_DAT1(mmc_data1,                MMC_D0);
+MMC_PFC_PINS(mmc_data4,                RCAR_GP_PIN(1, 7),      RCAR_GP_PIN(2, 8),
+                               RCAR_GP_PIN(0, 5),      RCAR_GP_PIN(0, 6));
+MMC_PFC_DAT4(mmc_data4,                MMC_D0,                 MMC_D1,
+                               MMC_D2,                 MMC_D3);
+MMC_PFC_PINS(mmc_data8,                RCAR_GP_PIN(1, 7),      RCAR_GP_PIN(2, 8),
+                               RCAR_GP_PIN(0, 5),      RCAR_GP_PIN(0, 6),
+                               RCAR_GP_PIN(1, 4),      RCAR_GP_PIN(1, 0),
+                               RCAR_GP_PIN(0, 30),     RCAR_GP_PIN(0, 31));
+MMC_PFC_DAT8(mmc_data8,                MMC_D0,                 MMC_D1,
+                               MMC_D2,                 MMC_D3,
+                               MMC_D4,                 MMC_D5,
+                               MMC_D6,                 MMC_D7);
+
+/* - SCIF CLOCK ------------------------------------------------------------- */
+SCIF_PFC_PIN(scif_clk,         RCAR_GP_PIN(1, 16));
+SCIF_PFC_CLK(scif_clk,         SCIF_CLK);
+
+/* - SCIF0 ------------------------------------------------------------------ */
+SCIF_PFC_PIN(scif0_data_a,     RCAR_GP_PIN(1, 17),     RCAR_GP_PIN(1, 18));
+SCIF_PFC_DAT(scif0_data_a,     TX0_A,                  RX0_A);
+SCIF_PFC_PIN(scif0_data_b,     RCAR_GP_PIN(2, 3),      RCAR_GP_PIN(2, 2));
+SCIF_PFC_DAT(scif0_data_b,     TX0_B,                  RX0_B);
+SCIF_PFC_PIN(scif0_data_c,     RCAR_GP_PIN(4, 0),      RCAR_GP_PIN(3, 31));
+SCIF_PFC_DAT(scif0_data_c,     TX0_C,                  RX0_C);
+SCIF_PFC_PIN(scif0_data_d,     RCAR_GP_PIN(3, 6),      RCAR_GP_PIN(3, 1));
+SCIF_PFC_DAT(scif0_data_d,     TX0_D,                  RX0_D);
+SCIF_PFC_PIN(scif0_ctrl,       RCAR_GP_PIN(1, 20),     RCAR_GP_PIN(1, 21));
+SCIF_PFC_CTR(scif0_ctrl,       CTS0,                   RTS0);
+SCIF_PFC_PIN(scif0_clk,                RCAR_GP_PIN(1, 19));
+SCIF_PFC_CLK(scif0_clk,                SCK0);
+
+/* - SCIF1 ------------------------------------------------------------------ */
+SCIF_PFC_PIN(scif1_data_a,     RCAR_GP_PIN(4, 0),      RCAR_GP_PIN(4, 1));
+SCIF_PFC_DAT(scif1_data_a,     TX1_A,                  RX1_A);
+SCIF_PFC_PIN(scif1_data_b,     RCAR_GP_PIN(2, 24),     RCAR_GP_PIN(2, 25));
+SCIF_PFC_DAT(scif1_data_b,     TX1_B,                  RX1_B);
+SCIF_PFC_PIN(scif1_data_c,     RCAR_GP_PIN(3, 22),     RCAR_GP_PIN(3, 21));
+SCIF_PFC_DAT(scif1_data_c,     TX1_C,                  RX1_C);
+SCIF_PFC_PIN(scif1_data_d,     RCAR_GP_PIN(1, 30),     RCAR_GP_PIN(1, 31));
+SCIF_PFC_DAT(scif1_data_d,     TX1_D,                  RX1_D);
+SCIF_PFC_PIN(scif1_ctrl_a,     RCAR_GP_PIN(4, 3),      RCAR_GP_PIN(4, 4));
+SCIF_PFC_CTR(scif1_ctrl_a,     CTS1_A,                 RTS1_A);
+SCIF_PFC_PIN(scif1_ctrl_c,     RCAR_GP_PIN(3, 23),     RCAR_GP_PIN(3, 19));
+SCIF_PFC_CTR(scif1_ctrl_c,     CTS1_C,                 RTS1_C);
+SCIF_PFC_PIN(scif1_clk_a,      RCAR_GP_PIN(4, 2));
+SCIF_PFC_CLK(scif1_clk_a,      SCK1_A);
+SCIF_PFC_PIN(scif1_clk_c,      RCAR_GP_PIN(3, 20));
+SCIF_PFC_CLK(scif1_clk_c,      SCK1_C);
+
+/* - SCIF2 ------------------------------------------------------------------ */
+SCIF_PFC_PIN(scif2_data_a,     RCAR_GP_PIN(2, 26),     RCAR_GP_PIN(2, 27));
+SCIF_PFC_DAT(scif2_data_a,     TX2_A,                  RX2_A);
+SCIF_PFC_PIN(scif2_data_b,     RCAR_GP_PIN(0, 29),     RCAR_GP_PIN(0, 28));
+SCIF_PFC_DAT(scif2_data_b,     TX2_B,                  RX2_B);
+SCIF_PFC_PIN(scif2_data_c,     RCAR_GP_PIN(4, 13),     RCAR_GP_PIN(4, 14));
+SCIF_PFC_DAT(scif2_data_c,     TX2_C,                  RX2_C);
+SCIF_PFC_PIN(scif2_data_d,     RCAR_GP_PIN(4, 15),     RCAR_GP_PIN(4, 16));
+SCIF_PFC_DAT(scif2_data_d,     TX2_D,                  RX2_D);
+SCIF_PFC_PIN(scif2_data_e,     RCAR_GP_PIN(0, 3),      RCAR_GP_PIN(0, 4));
+SCIF_PFC_DAT(scif2_data_e,     TX2_E,                  RX2_E);
+SCIF_PFC_PIN(scif2_clk_a,      RCAR_GP_PIN(3, 9));
+SCIF_PFC_CLK(scif2_clk_a,      SCK2_A);
+SCIF_PFC_PIN(scif2_clk_b,      PIN_NUMBER(3, 20));
+SCIF_PFC_CLK(scif2_clk_b,      SCK2_B);
+SCIF_PFC_PIN(scif2_clk_c,      RCAR_GP_PIN(4, 12));
+SCIF_PFC_CLK(scif2_clk_c,      SCK2_C);
+
+/* - SCIF3 ------------------------------------------------------------------ */
+SCIF_PFC_PIN(scif3_data_a,     RCAR_GP_PIN(1, 10),     RCAR_GP_PIN(1, 9));
+SCIF_PFC_DAT(scif3_data_a,     TX3_A,                  RX3_A);
+SCIF_PFC_PIN(scif3_data_b,     RCAR_GP_PIN(3, 28),     RCAR_GP_PIN(3, 27));
+SCIF_PFC_DAT(scif3_data_b,     TX3_B,                  RX3_B);
+SCIF_PFC_PIN(scif3_data_c,     RCAR_GP_PIN(1, 3),      RCAR_GP_PIN(0, 31));
+SCIF_PFC_DAT(scif3_data_c,     TX3_C,                  RX3_C);
+SCIF_PFC_PIN(scif3_data_d,     RCAR_GP_PIN(3, 30),     RCAR_GP_PIN(3, 29));
+SCIF_PFC_DAT(scif3_data_d,     TX3_D,                  RX3_D);
+
+/* - SCIF4 ------------------------------------------------------------------ */
+SCIF_PFC_PIN(scif4_data_a,     RCAR_GP_PIN(2, 5),      RCAR_GP_PIN(2, 4));
+SCIF_PFC_DAT(scif4_data_a,     TX4_A,                  RX4_A);
+SCIF_PFC_PIN(scif4_data_b,     RCAR_GP_PIN(3, 26),     RCAR_GP_PIN(3, 25));
+SCIF_PFC_DAT(scif4_data_b,     TX4_B,                  RX4_B);
+SCIF_PFC_PIN(scif4_data_c,     RCAR_GP_PIN(3, 0),      RCAR_GP_PIN(2, 31));
+SCIF_PFC_DAT(scif4_data_c,     TX4_C,                  RX4_C);
+
+/* - SCIF5 ------------------------------------------------------------------ */
+SCIF_PFC_PIN(scif5_data_a,     RCAR_GP_PIN(3, 17),     RCAR_GP_PIN(3, 18));
+SCIF_PFC_DAT(scif5_data_a,     TX5_A,                  RX5_A);
+SCIF_PFC_PIN(scif5_data_b,     RCAR_GP_PIN(1, 15),     RCAR_GP_PIN(1, 14));
+SCIF_PFC_DAT(scif5_data_b,     TX5_B,                  RX5_B);
+
+/* - SDHI macro ------------------------------------------------------------- */
+#define SDHI_PFC_PINS(name, args...)           SH_PFC_PINS(name, args)
+#define SDHI_PFC_DAT1(name, d0)                        SH_PFC_MUX1(name, d0)
+#define SDHI_PFC_DAT4(name, d0, d1, d2, d3)    SH_PFC_MUX4(name, d0, d1, d2, d3)
+#define SDHI_PFC_CTRL(name, clk, cmd)          SH_PFC_MUX2(name, clk, cmd)
+#define SDHI_PFC_CDPN(name, cd)                        SH_PFC_MUX1(name, cd)
+#define SDHI_PFC_WPPN(name, wp)                        SH_PFC_MUX1(name, wp)
+
+/* - SDHI0 ------------------------------------------------------------------ */
+SDHI_PFC_PINS(sdhi0_cd,                RCAR_GP_PIN(3, 17));
+SDHI_PFC_CDPN(sdhi0_cd,                SD0_CD);
+SDHI_PFC_PINS(sdhi0_ctrl,      RCAR_GP_PIN(3, 11),     RCAR_GP_PIN(3, 12));
+SDHI_PFC_CTRL(sdhi0_ctrl,      SD0_CLK,                SD0_CMD);
+SDHI_PFC_PINS(sdhi0_data1,     RCAR_GP_PIN(3, 13));
+SDHI_PFC_DAT1(sdhi0_data1,     SD0_DAT0);
+SDHI_PFC_PINS(sdhi0_data4,     RCAR_GP_PIN(3, 13),     RCAR_GP_PIN(3, 14),
+                               RCAR_GP_PIN(3, 15),     RCAR_GP_PIN(3, 16));
+SDHI_PFC_DAT4(sdhi0_data4,     SD0_DAT0,               SD0_DAT1,
+                               SD0_DAT2,               SD0_DAT3);
+SDHI_PFC_PINS(sdhi0_wp,                RCAR_GP_PIN(3, 18));
+SDHI_PFC_WPPN(sdhi0_wp,                SD0_WP);
+
+/* - SDHI1 ------------------------------------------------------------------ */
+SDHI_PFC_PINS(sdhi1_cd_a,      RCAR_GP_PIN(0, 30));
+SDHI_PFC_CDPN(sdhi1_cd_a,      SD1_CD_A);
+SDHI_PFC_PINS(sdhi1_cd_b,      RCAR_GP_PIN(2, 24));
+SDHI_PFC_CDPN(sdhi1_cd_b,      SD1_CD_B);
+SDHI_PFC_PINS(sdhi1_ctrl_a,    RCAR_GP_PIN(1, 5),      RCAR_GP_PIN(1, 6));
+SDHI_PFC_CTRL(sdhi1_ctrl_a,    SD1_CLK_A,              SD1_CMD_A);
+SDHI_PFC_PINS(sdhi1_ctrl_b,    RCAR_GP_PIN(1, 17),     RCAR_GP_PIN(1, 16));
+SDHI_PFC_CTRL(sdhi1_ctrl_b,    SD1_CLK_B,              SD1_CMD_B);
+SDHI_PFC_PINS(sdhi1_data1_a,   RCAR_GP_PIN(1, 7));
+SDHI_PFC_DAT1(sdhi1_data1_a,   SD1_DAT0_A);
+SDHI_PFC_PINS(sdhi1_data1_b,   RCAR_GP_PIN(1, 18));
+SDHI_PFC_DAT1(sdhi1_data1_b,   SD1_DAT0_B);
+SDHI_PFC_PINS(sdhi1_data4_a,   RCAR_GP_PIN(1, 7),      RCAR_GP_PIN(1, 8),
+                               RCAR_GP_PIN(0, 5),      RCAR_GP_PIN(0, 6));
+SDHI_PFC_DAT4(sdhi1_data4_a,   SD1_DAT0_A,             SD1_DAT1_A,
+                               SD1_DAT2_A,             SD1_DAT3_A);
+SDHI_PFC_PINS(sdhi1_data4_b,   RCAR_GP_PIN(1, 18),     RCAR_GP_PIN(1, 19),
+                               RCAR_GP_PIN(1, 20),     RCAR_GP_PIN(1, 21));
+SDHI_PFC_DAT4(sdhi1_data4_b,   SD1_DAT0_B,             SD1_DAT1_B,
+                               SD1_DAT2_B,             SD1_DAT3_B);
+SDHI_PFC_PINS(sdhi1_wp_a,      RCAR_GP_PIN(0, 31));
+SDHI_PFC_WPPN(sdhi1_wp_a,      SD1_WP_A);
+SDHI_PFC_PINS(sdhi1_wp_b,      RCAR_GP_PIN(2, 25));
+SDHI_PFC_WPPN(sdhi1_wp_b,      SD1_WP_B);
+
+/* - SDH2 ------------------------------------------------------------------- */
+SDHI_PFC_PINS(sdhi2_cd_a,      RCAR_GP_PIN(4, 23));
+SDHI_PFC_CDPN(sdhi2_cd_a,      SD2_CD_A);
+SDHI_PFC_PINS(sdhi2_cd_b,      RCAR_GP_PIN(3, 27));
+SDHI_PFC_CDPN(sdhi2_cd_b,      SD2_CD_B);
+SDHI_PFC_PINS(sdhi2_ctrl_a,    RCAR_GP_PIN(4, 17),     RCAR_GP_PIN(4, 18));
+SDHI_PFC_CTRL(sdhi2_ctrl_a,    SD2_CLK_A,              SD2_CMD_A);
+SDHI_PFC_PINS(sdhi2_ctrl_b,    RCAR_GP_PIN(4, 5),      RCAR_GP_PIN(4, 6));
+SDHI_PFC_CTRL(sdhi2_ctrl_b,    SD2_CLK_B,              SD2_CMD_B);
+SDHI_PFC_PINS(sdhi2_data1_a,   RCAR_GP_PIN(4, 19));
+SDHI_PFC_DAT1(sdhi2_data1_a,   SD2_DAT0_A);
+SDHI_PFC_PINS(sdhi2_data1_b,   RCAR_GP_PIN(4, 7));
+SDHI_PFC_DAT1(sdhi2_data1_b,   SD2_DAT0_B);
+SDHI_PFC_PINS(sdhi2_data4_a,   RCAR_GP_PIN(4, 19),     RCAR_GP_PIN(4, 20),
+                               RCAR_GP_PIN(4, 21),     RCAR_GP_PIN(4, 22));
+SDHI_PFC_DAT4(sdhi2_data4_a,   SD2_DAT0_A,             SD2_DAT1_A,
+                               SD2_DAT2_A,             SD2_DAT3_A);
+SDHI_PFC_PINS(sdhi2_data4_b,   RCAR_GP_PIN(4, 7),      RCAR_GP_PIN(4, 8),
+                               RCAR_GP_PIN(3, 25),     RCAR_GP_PIN(3, 26));
+SDHI_PFC_DAT4(sdhi2_data4_b,   SD2_DAT0_B,             SD2_DAT1_B,
+                               SD2_DAT2_B,             SD2_DAT3_B);
+SDHI_PFC_PINS(sdhi2_wp_a,      RCAR_GP_PIN(4, 24));
+SDHI_PFC_WPPN(sdhi2_wp_a,      SD2_WP_A);
+SDHI_PFC_PINS(sdhi2_wp_b,      RCAR_GP_PIN(3, 28));
+SDHI_PFC_WPPN(sdhi2_wp_b,      SD2_WP_B);
+
+/* - USB0 ------------------------------------------------------------------- */
+SH_PFC_PINS(usb0,              RCAR_GP_PIN(0, 1));
+SH_PFC_MUX1(usb0,              PENC0);
+SH_PFC_PINS(usb0_ovc,          RCAR_GP_PIN(0, 3));
+SH_PFC_MUX1(usb0_ovc,          USB_OVC0);
+
+/* - USB1 ------------------------------------------------------------------- */
+SH_PFC_PINS(usb1,              RCAR_GP_PIN(0, 2));
+SH_PFC_MUX1(usb1,              PENC1);
+SH_PFC_PINS(usb1_ovc,          RCAR_GP_PIN(0, 4));
+SH_PFC_MUX1(usb1_ovc,          USB_OVC1);
+
+/* - VIN macros ------------------------------------------------------------- */
+#define VIN_PFC_PINS(name, args...)            SH_PFC_PINS(name, args)
+#define VIN_PFC_DAT8(name, d0, d1, d2, d3, d4, d5, d6, d7)     \
+       SH_PFC_MUX8(name, d0, d1, d2, d3, d4, d5, d6, d7)
+#define VIN_PFC_CLK(name, clk)                 SH_PFC_MUX1(name, clk)
+#define VIN_PFC_SYNC(name, hsync, vsync)       SH_PFC_MUX2(name, hsync, vsync)
+
+/* - VIN0 ------------------------------------------------------------------- */
+VIN_PFC_PINS(vin0_data8,       RCAR_GP_PIN(3, 29),     RCAR_GP_PIN(3, 30),
+                               RCAR_GP_PIN(3, 31),     RCAR_GP_PIN(4, 0),
+                               RCAR_GP_PIN(4, 1),      RCAR_GP_PIN(4, 2),
+                               RCAR_GP_PIN(4, 3),      RCAR_GP_PIN(4, 4));
+VIN_PFC_DAT8(vin0_data8,       VI0_DATA0_VI0_B0,       VI0_DATA1_VI0_B1,
+                               VI0_DATA2_VI0_B2,       VI0_DATA3_VI0_B3,
+                               VI0_DATA4_VI0_B4,       VI0_DATA5_VI0_B5,
+                               VI0_DATA6_VI0_G0,       VI0_DATA7_VI0_G1);
+VIN_PFC_PINS(vin0_clk,         RCAR_GP_PIN(3, 24));
+VIN_PFC_CLK(vin0_clk,          VI0_CLK);
+VIN_PFC_PINS(vin0_sync,                RCAR_GP_PIN(3, 27),     RCAR_GP_PIN(3, 28));
+VIN_PFC_SYNC(vin0_sync,                VI0_HSYNC,              VI0_VSYNC);
+/* - VIN1 ------------------------------------------------------------------- */
+VIN_PFC_PINS(vin1_data8,       RCAR_GP_PIN(3, 25),     RCAR_GP_PIN(3, 26),
+                               RCAR_GP_PIN(3, 27),     RCAR_GP_PIN(3, 28),
+                               RCAR_GP_PIN(4, 5),      RCAR_GP_PIN(4, 6),
+                               RCAR_GP_PIN(4, 7),      RCAR_GP_PIN(4, 8));
+VIN_PFC_DAT8(vin1_data8,       VI1_DATA0,              VI1_DATA1,
+                               VI1_DATA2,              VI1_DATA3,
+                               VI1_DATA4,              VI1_DATA5,
+                               VI1_DATA6,              VI1_DATA7);
+VIN_PFC_PINS(vin1_clk,         RCAR_GP_PIN(4, 9));
+VIN_PFC_CLK(vin1_clk,          VI1_CLK);
+VIN_PFC_PINS(vin1_sync,                RCAR_GP_PIN(3, 21),     RCAR_GP_PIN(3, 22));
+VIN_PFC_SYNC(vin1_sync,                VI1_HSYNC,              VI1_VSYNC);
+
+static const struct sh_pfc_pin_group pinmux_groups[] = {
+       SH_PFC_PIN_GROUP(ether_rmii),
+       SH_PFC_PIN_GROUP(ether_link),
+       SH_PFC_PIN_GROUP(ether_magic),
+       SH_PFC_PIN_GROUP(hscif0_data_a),
+       SH_PFC_PIN_GROUP(hscif0_data_b),
+       SH_PFC_PIN_GROUP(hscif0_ctrl_a),
+       SH_PFC_PIN_GROUP(hscif0_ctrl_b),
+       SH_PFC_PIN_GROUP(hscif0_clk),
+       SH_PFC_PIN_GROUP(hscif1_data_a),
+       SH_PFC_PIN_GROUP(hscif1_data_b),
+       SH_PFC_PIN_GROUP(hscif1_ctrl_a),
+       SH_PFC_PIN_GROUP(hscif1_ctrl_b),
+       SH_PFC_PIN_GROUP(hscif1_clk_a),
+       SH_PFC_PIN_GROUP(hscif1_clk_b),
+       SH_PFC_PIN_GROUP(hspi0_a),
+       SH_PFC_PIN_GROUP(hspi0_b),
+       SH_PFC_PIN_GROUP(hspi1_a),
+       SH_PFC_PIN_GROUP(hspi1_b),
+       SH_PFC_PIN_GROUP(hspi2_a),
+       SH_PFC_PIN_GROUP(hspi2_b),
+       SH_PFC_PIN_GROUP(i2c1_a),
+       SH_PFC_PIN_GROUP(i2c1_b),
+       SH_PFC_PIN_GROUP(i2c2_a),
+       SH_PFC_PIN_GROUP(i2c2_b),
+       SH_PFC_PIN_GROUP(i2c2_c),
+       SH_PFC_PIN_GROUP(i2c3_a),
+       SH_PFC_PIN_GROUP(i2c3_b),
+       SH_PFC_PIN_GROUP(i2c3_c),
+       SH_PFC_PIN_GROUP(mmc_ctrl),
+       SH_PFC_PIN_GROUP(mmc_data1),
+       SH_PFC_PIN_GROUP(mmc_data4),
+       SH_PFC_PIN_GROUP(mmc_data8),
+       SH_PFC_PIN_GROUP(scif_clk),
+       SH_PFC_PIN_GROUP(scif0_data_a),
+       SH_PFC_PIN_GROUP(scif0_data_b),
+       SH_PFC_PIN_GROUP(scif0_data_c),
+       SH_PFC_PIN_GROUP(scif0_data_d),
+       SH_PFC_PIN_GROUP(scif0_ctrl),
+       SH_PFC_PIN_GROUP(scif0_clk),
+       SH_PFC_PIN_GROUP(scif1_data_a),
+       SH_PFC_PIN_GROUP(scif1_data_b),
+       SH_PFC_PIN_GROUP(scif1_data_c),
+       SH_PFC_PIN_GROUP(scif1_data_d),
+       SH_PFC_PIN_GROUP(scif1_ctrl_a),
+       SH_PFC_PIN_GROUP(scif1_ctrl_c),
+       SH_PFC_PIN_GROUP(scif1_clk_a),
+       SH_PFC_PIN_GROUP(scif1_clk_c),
+       SH_PFC_PIN_GROUP(scif2_data_a),
+       SH_PFC_PIN_GROUP(scif2_data_b),
+       SH_PFC_PIN_GROUP(scif2_data_c),
+       SH_PFC_PIN_GROUP(scif2_data_d),
+       SH_PFC_PIN_GROUP(scif2_data_e),
+       SH_PFC_PIN_GROUP(scif2_clk_a),
+       SH_PFC_PIN_GROUP(scif2_clk_b),
+       SH_PFC_PIN_GROUP(scif2_clk_c),
+       SH_PFC_PIN_GROUP(scif3_data_a),
+       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(scif4_data_a),
+       SH_PFC_PIN_GROUP(scif4_data_b),
+       SH_PFC_PIN_GROUP(scif4_data_c),
+       SH_PFC_PIN_GROUP(scif5_data_a),
+       SH_PFC_PIN_GROUP(scif5_data_b),
+       SH_PFC_PIN_GROUP(sdhi0_cd),
+       SH_PFC_PIN_GROUP(sdhi0_ctrl),
+       SH_PFC_PIN_GROUP(sdhi0_data1),
+       SH_PFC_PIN_GROUP(sdhi0_data4),
+       SH_PFC_PIN_GROUP(sdhi0_wp),
+       SH_PFC_PIN_GROUP(sdhi1_cd_a),
+       SH_PFC_PIN_GROUP(sdhi1_cd_b),
+       SH_PFC_PIN_GROUP(sdhi1_ctrl_a),
+       SH_PFC_PIN_GROUP(sdhi1_ctrl_b),
+       SH_PFC_PIN_GROUP(sdhi1_data1_a),
+       SH_PFC_PIN_GROUP(sdhi1_data1_b),
+       SH_PFC_PIN_GROUP(sdhi1_data4_a),
+       SH_PFC_PIN_GROUP(sdhi1_data4_b),
+       SH_PFC_PIN_GROUP(sdhi1_wp_a),
+       SH_PFC_PIN_GROUP(sdhi1_wp_b),
+       SH_PFC_PIN_GROUP(sdhi2_cd_a),
+       SH_PFC_PIN_GROUP(sdhi2_cd_b),
+       SH_PFC_PIN_GROUP(sdhi2_ctrl_a),
+       SH_PFC_PIN_GROUP(sdhi2_ctrl_b),
+       SH_PFC_PIN_GROUP(sdhi2_data1_a),
+       SH_PFC_PIN_GROUP(sdhi2_data1_b),
+       SH_PFC_PIN_GROUP(sdhi2_data4_a),
+       SH_PFC_PIN_GROUP(sdhi2_data4_b),
+       SH_PFC_PIN_GROUP(sdhi2_wp_a),
+       SH_PFC_PIN_GROUP(sdhi2_wp_b),
+       SH_PFC_PIN_GROUP(usb0),
+       SH_PFC_PIN_GROUP(usb0_ovc),
+       SH_PFC_PIN_GROUP(usb1),
+       SH_PFC_PIN_GROUP(usb1_ovc),
+       SH_PFC_PIN_GROUP(vin0_data8),
+       SH_PFC_PIN_GROUP(vin0_clk),
+       SH_PFC_PIN_GROUP(vin0_sync),
+       SH_PFC_PIN_GROUP(vin1_data8),
+       SH_PFC_PIN_GROUP(vin1_clk),
+       SH_PFC_PIN_GROUP(vin1_sync),
+};
+
+static const char * const ether_groups[] = {
+       "ether_rmii",
+       "ether_link",
+       "ether_magic",
+};
+
+static const char * const hscif0_groups[] = {
+       "hscif0_data_a",
+       "hscif0_data_b",
+       "hscif0_ctrl_a",
+       "hscif0_ctrl_b",
+       "hscif0_clk",
+};
+
+static const char * const hscif1_groups[] = {
+       "hscif1_data_a",
+       "hscif1_data_b",
+       "hscif1_ctrl_a",
+       "hscif1_ctrl_b",
+       "hscif1_clk_a",
+       "hscif1_clk_b",
+};
+
+static const char * const hspi0_groups[] = {
+       "hspi0_a",
+       "hspi0_b",
+};
+
+static const char * const hspi1_groups[] = {
+       "hspi1_a",
+       "hspi1_b",
+};
+
+static const char * const hspi2_groups[] = {
+       "hspi2_a",
+       "hspi2_b",
+};
+
+static const char * const i2c1_groups[] = {
+       "i2c1_a",
+       "i2c1_b",
+};
+
+static const char * const i2c2_groups[] = {
+       "i2c2_a",
+       "i2c2_b",
+       "i2c2_c",
+};
+
+static const char * const i2c3_groups[] = {
+       "i2c3_a",
+       "i2c3_b",
+       "i2c3_c",
+};
+
+static const char * const mmc_groups[] = {
+       "mmc_ctrl",
+       "mmc_data1",
+       "mmc_data4",
+       "mmc_data8",
+};
+
+static const char * const scif_clk_groups[] = {
+       "scif_clk",
+};
+
+static const char * const scif0_groups[] = {
+       "scif0_data_a",
+       "scif0_data_b",
+       "scif0_data_c",
+       "scif0_data_d",
+       "scif0_ctrl",
+       "scif0_clk",
+};
+
+static const char * const scif1_groups[] = {
+       "scif1_data_a",
+       "scif1_data_b",
+       "scif1_data_c",
+       "scif1_data_d",
+       "scif1_ctrl_a",
+       "scif1_ctrl_c",
+       "scif1_clk_a",
+       "scif1_clk_c",
+};
+
+static const char * const scif2_groups[] = {
+       "scif2_data_a",
+       "scif2_data_b",
+       "scif2_data_c",
+       "scif2_data_d",
+       "scif2_data_e",
+       "scif2_clk_a",
+       "scif2_clk_b",
+       "scif2_clk_c",
+};
+
+static const char * const scif3_groups[] = {
+       "scif3_data_a",
+       "scif3_data_b",
+       "scif3_data_c",
+       "scif3_data_d",
+};
+
+static const char * const scif4_groups[] = {
+       "scif4_data_a",
+       "scif4_data_b",
+       "scif4_data_c",
+};
+
+static const char * const scif5_groups[] = {
+       "scif5_data_a",
+       "scif5_data_b",
+};
+
+
+static const char * const sdhi0_groups[] = {
+       "sdhi0_cd",
+       "sdhi0_ctrl",
+       "sdhi0_data1",
+       "sdhi0_data4",
+       "sdhi0_wp",
+};
+
+static const char * const sdhi1_groups[] = {
+       "sdhi1_cd_a",
+       "sdhi1_cd_b",
+       "sdhi1_ctrl_a",
+       "sdhi1_ctrl_b",
+       "sdhi1_data1_a",
+       "sdhi1_data1_b",
+       "sdhi1_data4_a",
+       "sdhi1_data4_b",
+       "sdhi1_wp_a",
+       "sdhi1_wp_b",
+};
+
+static const char * const sdhi2_groups[] = {
+       "sdhi2_cd_a",
+       "sdhi2_cd_b",
+       "sdhi2_ctrl_a",
+       "sdhi2_ctrl_b",
+       "sdhi2_data1_a",
+       "sdhi2_data1_b",
+       "sdhi2_data4_a",
+       "sdhi2_data4_b",
+       "sdhi2_wp_a",
+       "sdhi2_wp_b",
+};
+
+static const char * const usb0_groups[] = {
+       "usb0",
+       "usb0_ovc",
+};
+
+static const char * const usb1_groups[] = {
+       "usb1",
+       "usb1_ovc",
+};
+
+static const char * const vin0_groups[] = {
+       "vin0_data8",
+       "vin0_clk",
+       "vin0_sync",
+};
+
+static const char * const vin1_groups[] = {
+       "vin1_data8",
+       "vin1_clk",
+       "vin1_sync",
+};
+
+static const struct sh_pfc_function pinmux_functions[] = {
+       SH_PFC_FUNCTION(ether),
+       SH_PFC_FUNCTION(hscif0),
+       SH_PFC_FUNCTION(hscif1),
+       SH_PFC_FUNCTION(hspi0),
+       SH_PFC_FUNCTION(hspi1),
+       SH_PFC_FUNCTION(hspi2),
+       SH_PFC_FUNCTION(i2c1),
+       SH_PFC_FUNCTION(i2c2),
+       SH_PFC_FUNCTION(i2c3),
+       SH_PFC_FUNCTION(mmc),
+       SH_PFC_FUNCTION(scif_clk),
+       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(sdhi0),
+       SH_PFC_FUNCTION(sdhi1),
+       SH_PFC_FUNCTION(sdhi2),
+       SH_PFC_FUNCTION(usb0),
+       SH_PFC_FUNCTION(usb1),
+       SH_PFC_FUNCTION(vin0),
+       SH_PFC_FUNCTION(vin1),
+};
+
+static struct pinmux_cfg_reg pinmux_config_regs[] = {
+       { PINMUX_CFG_REG("GPSR0", 0xfffc0004, 32, 1) {
+               GP_0_31_FN,     FN_IP1_14_11,
+               GP_0_30_FN,     FN_IP1_10_8,
+               GP_0_29_FN,     FN_IP1_7_5,
+               GP_0_28_FN,     FN_IP1_4_2,
+               GP_0_27_FN,     FN_IP1_1,
+               GP_0_26_FN,     FN_IP1_0,
+               GP_0_25_FN,     FN_IP0_30,
+               GP_0_24_FN,     FN_IP0_29,
+               GP_0_23_FN,     FN_IP0_28,
+               GP_0_22_FN,     FN_IP0_27,
+               GP_0_21_FN,     FN_IP0_26,
+               GP_0_20_FN,     FN_IP0_25,
+               GP_0_19_FN,     FN_IP0_24,
+               GP_0_18_FN,     FN_IP0_23,
+               GP_0_17_FN,     FN_IP0_22,
+               GP_0_16_FN,     FN_IP0_21,
+               GP_0_15_FN,     FN_IP0_20,
+               GP_0_14_FN,     FN_IP0_19,
+               GP_0_13_FN,     FN_IP0_18,
+               GP_0_12_FN,     FN_IP0_17,
+               GP_0_11_FN,     FN_IP0_16,
+               GP_0_10_FN,     FN_IP0_15,
+               GP_0_9_FN,      FN_A3,
+               GP_0_8_FN,      FN_A2,
+               GP_0_7_FN,      FN_A1,
+               GP_0_6_FN,      FN_IP0_14_12,
+               GP_0_5_FN,      FN_IP0_11_8,
+               GP_0_4_FN,      FN_IP0_7_5,
+               GP_0_3_FN,      FN_IP0_4_2,
+               GP_0_2_FN,      FN_PENC1,
+               GP_0_1_FN,      FN_PENC0,
+               GP_0_0_FN,      FN_IP0_1_0 }
+       },
+       { PINMUX_CFG_REG("GPSR1", 0xfffc0008, 32, 1) {
+               GP_1_31_FN,     FN_IP4_6_4,
+               GP_1_30_FN,     FN_IP4_3_1,
+               GP_1_29_FN,     FN_IP4_0,
+               GP_1_28_FN,     FN_IP3_31,
+               GP_1_27_FN,     FN_IP3_30,
+               GP_1_26_FN,     FN_IP3_29,
+               GP_1_25_FN,     FN_IP3_28,
+               GP_1_24_FN,     FN_IP3_27,
+               GP_1_23_FN,     FN_IP3_26_24,
+               GP_1_22_FN,     FN_IP3_23_21,
+               GP_1_21_FN,     FN_IP3_20_19,
+               GP_1_20_FN,     FN_IP3_18_16,
+               GP_1_19_FN,     FN_IP3_15_13,
+               GP_1_18_FN,     FN_IP3_12_10,
+               GP_1_17_FN,     FN_IP3_9_8,
+               GP_1_16_FN,     FN_IP3_7_5,
+               GP_1_15_FN,     FN_IP3_4_2,
+               GP_1_14_FN,     FN_IP3_1_0,
+               GP_1_13_FN,     FN_IP2_31,
+               GP_1_12_FN,     FN_IP2_30,
+               GP_1_11_FN,     FN_IP2_17,
+               GP_1_10_FN,     FN_IP2_16_14,
+               GP_1_9_FN,      FN_IP2_13_12,
+               GP_1_8_FN,      FN_IP2_11_9,
+               GP_1_7_FN,      FN_IP2_8_6,
+               GP_1_6_FN,      FN_IP2_5_3,
+               GP_1_5_FN,      FN_IP2_2_0,
+               GP_1_4_FN,      FN_IP1_29_28,
+               GP_1_3_FN,      FN_IP1_27_25,
+               GP_1_2_FN,      FN_IP1_24,
+               GP_1_1_FN,      FN_WE0,
+               GP_1_0_FN,      FN_IP1_23_21 }
+       },
+       { PINMUX_CFG_REG("GPSR2", 0xfffc000c, 32, 1) {
+               GP_2_31_FN,     FN_IP6_7,
+               GP_2_30_FN,     FN_IP6_6_5,
+               GP_2_29_FN,     FN_IP6_4_2,
+               GP_2_28_FN,     FN_IP6_1_0,
+               GP_2_27_FN,     FN_IP5_30_29,
+               GP_2_26_FN,     FN_IP5_28_26,
+               GP_2_25_FN,     FN_IP5_25_23,
+               GP_2_24_FN,     FN_IP5_22_21,
+               GP_2_23_FN,     FN_AUDIO_CLKB,
+               GP_2_22_FN,     FN_AUDIO_CLKA,
+               GP_2_21_FN,     FN_IP5_20_18,
+               GP_2_20_FN,     FN_IP5_17_15,
+               GP_2_19_FN,     FN_IP5_14_13,
+               GP_2_18_FN,     FN_IP5_12,
+               GP_2_17_FN,     FN_IP5_11_10,
+               GP_2_16_FN,     FN_IP5_9_8,
+               GP_2_15_FN,     FN_IP5_7,
+               GP_2_14_FN,     FN_IP5_6,
+               GP_2_13_FN,     FN_IP5_5_4,
+               GP_2_12_FN,     FN_IP5_3_2,
+               GP_2_11_FN,     FN_IP5_1_0,
+               GP_2_10_FN,     FN_IP4_30_29,
+               GP_2_9_FN,      FN_IP4_28_27,
+               GP_2_8_FN,      FN_IP4_26_25,
+               GP_2_7_FN,      FN_IP4_24_21,
+               GP_2_6_FN,      FN_IP4_20_17,
+               GP_2_5_FN,      FN_IP4_16_15,
+               GP_2_4_FN,      FN_IP4_14_13,
+               GP_2_3_FN,      FN_IP4_12_11,
+               GP_2_2_FN,      FN_IP4_10_9,
+               GP_2_1_FN,      FN_IP4_8,
+               GP_2_0_FN,      FN_IP4_7 }
+       },
+       { PINMUX_CFG_REG("GPSR3", 0xfffc0010, 32, 1) {
+               GP_3_31_FN,     FN_IP8_10_9,
+               GP_3_30_FN,     FN_IP8_8_6,
+               GP_3_29_FN,     FN_IP8_5_3,
+               GP_3_28_FN,     FN_IP8_2_0,
+               GP_3_27_FN,     FN_IP7_31_29,
+               GP_3_26_FN,     FN_IP7_28_25,
+               GP_3_25_FN,     FN_IP7_24_22,
+               GP_3_24_FN,     FN_IP7_21,
+               GP_3_23_FN,     FN_IP7_20_18,
+               GP_3_22_FN,     FN_IP7_17_15,
+               GP_3_21_FN,     FN_IP7_14_12,
+               GP_3_20_FN,     FN_IP7_11_9,
+               GP_3_19_FN,     FN_IP7_8_6,
+               GP_3_18_FN,     FN_IP7_5_4,
+               GP_3_17_FN,     FN_IP7_3_2,
+               GP_3_16_FN,     FN_IP7_1_0,
+               GP_3_15_FN,     FN_IP6_31_30,
+               GP_3_14_FN,     FN_IP6_29_28,
+               GP_3_13_FN,     FN_IP6_27_26,
+               GP_3_12_FN,     FN_IP6_25_24,
+               GP_3_11_FN,     FN_IP6_23_22,
+               GP_3_10_FN,     FN_IP6_21,
+               GP_3_9_FN,      FN_IP6_20_19,
+               GP_3_8_FN,      FN_IP6_18_17,
+               GP_3_7_FN,      FN_IP6_16,
+               GP_3_6_FN,      FN_IP6_15_14,
+               GP_3_5_FN,      FN_IP6_13,
+               GP_3_4_FN,      FN_IP6_12_11,
+               GP_3_3_FN,      FN_IP6_10,
+               GP_3_2_FN,      FN_SSI_SCK34,
+               GP_3_1_FN,      FN_IP6_9,
+               GP_3_0_FN,      FN_IP6_8 }
+       },
+       { PINMUX_CFG_REG("GPSR4", 0xfffc0014, 32, 1) {
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               0, 0,
+               GP_4_26_FN,     FN_AVS2,
+               GP_4_25_FN,     FN_AVS1,
+               GP_4_24_FN,     FN_IP10_24_22,
+               GP_4_23_FN,     FN_IP10_21_19,
+               GP_4_22_FN,     FN_IP10_18_16,
+               GP_4_21_FN,     FN_IP10_15_13,
+               GP_4_20_FN,     FN_IP10_12_9,
+               GP_4_19_FN,     FN_IP10_8_6,
+               GP_4_18_FN,     FN_IP10_5_3,
+               GP_4_17_FN,     FN_IP10_2_0,
+               GP_4_16_FN,     FN_IP9_29_27,
+               GP_4_15_FN,     FN_IP9_26_24,
+               GP_4_14_FN,     FN_IP9_23_21,
+               GP_4_13_FN,     FN_IP9_20_18,
+               GP_4_12_FN,     FN_IP9_17_15,
+               GP_4_11_FN,     FN_IP9_14_12,
+               GP_4_10_FN,     FN_IP9_11_9,
+               GP_4_9_FN,      FN_IP9_8_6,
+               GP_4_8_FN,      FN_IP9_5_3,
+               GP_4_7_FN,      FN_IP9_2_0,
+               GP_4_6_FN,      FN_IP8_29_27,
+               GP_4_5_FN,      FN_IP8_26_24,
+               GP_4_4_FN,      FN_IP8_23_22,
+               GP_4_3_FN,      FN_IP8_21_19,
+               GP_4_2_FN,      FN_IP8_18_16,
+               GP_4_1_FN,      FN_IP8_15_14,
+               GP_4_0_FN,      FN_IP8_13_11 }
+       },
+
+       { PINMUX_CFG_REG_VAR("IPSR0", 0xfffc0020, 32,
+                            1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+                            1, 1, 1, 1, 1, 1, 3, 4, 3, 3, 2) {
+               /* IP0_31 [1] */
+               0,      0,
+               /* IP0_30 [1] */
+               FN_A19, 0,
+               /* IP0_29 [1] */
+               FN_A18, 0,
+               /* IP0_28 [1] */
+               FN_A17, 0,
+               /* IP0_27 [1] */
+               FN_A16, 0,
+               /* IP0_26 [1] */
+               FN_A15, 0,
+               /* IP0_25 [1] */
+               FN_A14, 0,
+               /* IP0_24 [1] */
+               FN_A13, 0,
+               /* IP0_23 [1] */
+               FN_A12, 0,
+               /* IP0_22 [1] */
+               FN_A11, 0,
+               /* IP0_21 [1] */
+               FN_A10, 0,
+               /* IP0_20 [1] */
+               FN_A9,  0,
+               /* IP0_19 [1] */
+               FN_A8,  0,
+               /* IP0_18 [1] */
+               FN_A7,  0,
+               /* IP0_17 [1] */
+               FN_A6,  0,
+               /* IP0_16 [1] */
+               FN_A5,  0,
+               /* IP0_15 [1] */
+               FN_A4,  0,
+               /* IP0_14_12 [3] */
+               FN_SD1_DAT3_A,  FN_MMC_D3,      0,              FN_A0,
+               FN_ATAG0_A,     0,              FN_REMOCON_B,   0,
+               /* IP0_11_8 [4] */
+               FN_SD1_DAT2_A,  FN_MMC_D2,      0,              FN_BS,
+               FN_ATADIR0_A,   0,              FN_SDSELF_B,    0,
+               FN_PWM4_B,      0,              0,              0,
+               0,              0,              0,              0,
+               /* IP0_7_5 [3] */
+               FN_AUDATA1,     FN_ARM_TRACEDATA_1,     FN_GPSIN_C,     FN_USB_OVC1,
+               FN_RX2_E,       FN_SCL2_B,              0,              0,
+               /* IP0_4_2 [3] */
+               FN_AUDATA0,     FN_ARM_TRACEDATA_0,     FN_GPSCLK_C,    FN_USB_OVC0,
+               FN_TX2_E,       FN_SDA2_B,              0,              0,
+               /* IP0_1_0 [2] */
+               FN_PRESETOUT,   0,      FN_PWM1,        0,
+               }
+       },
+       { PINMUX_CFG_REG_VAR("IPSR1", 0xfffc0024, 32,
+                            1, 1, 2, 3, 1, 3, 3, 1, 2, 4, 3, 3, 3, 1, 1) {
+               /* IP1_31 [1] */
+               0,      0,
+               /* IP1_30 [1] */
+               0,      0,
+               /* IP1_29_28 [2] */
+               FN_EX_CS1,      FN_MMC_D4,      0,      0,
+               /* IP1_27_25 [3] */
+               FN_SSI_WS1_B,   FN_EX_CS0,      FN_SCL2_A,      FN_TX3_C,
+               FN_TS_SCK0_A,   0,              0,              0,
+               /* IP1_24 [1] */
+               FN_WE1,         FN_ATAWR0_B,
+               /* IP1_23_21 [3] */
+               FN_MMC_D5,      FN_ATADIR0_B,   0,              FN_RD_WR,
+               0,              0,              0,              0,
+               /* IP1_20_18 [3] */
+               FN_SSI_SCK1_B,  FN_ATAG0_B,     FN_CS1_A26,     FN_SDA2_A,
+               FN_SCK2_B,      0,              0,              0,
+               /* IP1_17 [1] */
+               FN_CS0,         FN_HSPI_RX1_B,
+               /* IP1_16_15 [2] */
+               FN_CLKOUT,      FN_HSPI_TX1_B,  FN_PWM0_B,      0,
+               /* IP1_14_11 [4] */
+               FN_SD1_WP_A,    FN_MMC_D7,      0,              FN_A25,
+               FN_DACK1_A,     0,              FN_HCTS0_B,     FN_RX3_C,
+               FN_TS_SDAT0_A,  0,              0,              0,
+               0,              0,              0,              0,
+               /* IP1_10_8 [3] */
+               FN_SD1_CLK_B,   FN_MMC_D6,      0,              FN_A24,
+               FN_DREQ1_A,     0,              FN_HRX0_B,      FN_TS_SPSYNC0_A,
+               /* IP1_7_5 [3] */
+               FN_A23,         FN_HTX0_B,      FN_TX2_B,       FN_DACK2_A,
+               FN_TS_SDEN0_A,  0,              0,              0,
+               /* IP1_4_2 [3] */
+               FN_A22,         FN_HRTS0_B,     FN_RX2_B,       FN_DREQ2_A,
+               0,              0,              0,              0,
+               /* IP1_1 [1] */
+               FN_A21,         FN_HSPI_CLK1_B,
+               /* IP1_0 [1] */
+               FN_A20,         FN_HSPI_CS1_B,
+               }
+       },
+       { PINMUX_CFG_REG_VAR("IPSR2", 0xfffc0028, 32,
+                            1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+                            1, 1, 1, 1, 3, 2, 3, 3, 3, 3) {
+               /* IP2_31 [1] */
+               FN_MLB_CLK,     FN_IRQ1_A,
+               /* IP2_30 [1] */
+               FN_RD_WR_B,     FN_IRQ0,
+               /* IP2_29 [1] */
+               FN_D11,         0,
+               /* IP2_28 [1] */
+               FN_D10,         0,
+               /* IP2_27 [1] */
+               FN_D9,          0,
+               /* IP2_26 [1] */
+               FN_D8,          0,
+               /* IP2_25 [1] */
+               FN_D7,          0,
+               /* IP2_24 [1] */
+               FN_D6,          0,
+               /* IP2_23 [1] */
+               FN_D5,          0,
+               /* IP2_22 [1] */
+               FN_D4,          0,
+               /* IP2_21 [1] */
+               FN_D3,          0,
+               /* IP2_20 [1] */
+               FN_D2,          0,
+               /* IP2_19 [1] */
+               FN_D1,          0,
+               /* IP2_18 [1] */
+               FN_D0,          0,
+               /* IP2_17 [1] */
+               FN_EX_WAIT0,    FN_PWM0_C,
+               /* IP2_16_14 [3] */
+               FN_DACK0,       0,      0,      FN_TX3_A,
+               FN_DRACK0,      0,      0,      0,
+               /* IP2_13_12 [2] */
+               FN_DREQ0_A,     0,      0,      FN_RX3_A,
+               /* IP2_11_9 [3] */
+               FN_SD1_DAT1_A,  FN_MMC_D1,      0,      FN_ATAWR0_A,
+               FN_EX_CS5,      FN_EX_WAIT2_A,  0,      0,
+               /* IP2_8_6 [3] */
+               FN_SD1_DAT0_A,  FN_MMC_D0,      0,      FN_ATARD0,
+               FN_EX_CS4,      FN_EX_WAIT1_A,  0,      0,
+               /* IP2_5_3 [3] */
+               FN_SD1_CMD_A,   FN_MMC_CMD,     0,      FN_ATACS10,
+               FN_EX_CS3,      0,              0,      0,
+               /* IP2_2_0 [3] */
+               FN_SD1_CLK_A,   FN_MMC_CLK,     0,      FN_ATACS00,
+               FN_EX_CS2,      0,              0,      0,
+               }
+       },
+       { PINMUX_CFG_REG_VAR("IPSR3", 0xfffc002c, 32,
+                            1, 1, 1, 1, 1, 3, 3, 2,
+                            3, 3, 3, 2, 3, 3, 2) {
+               /* IP3_31 [1] */
+               FN_DU0_DR6,     FN_LCDOUT6,
+               /* IP3_30 [1] */
+               FN_DU0_DR5,     FN_LCDOUT5,
+               /* IP3_29 [1] */
+               FN_DU0_DR4,     FN_LCDOUT4,
+               /* IP3_28 [1] */
+               FN_DU0_DR3,     FN_LCDOUT3,
+               /* IP3_27 [1] */
+               FN_DU0_DR2,     FN_LCDOUT2,
+               /* IP3_26_24 [3] */
+               FN_SSI_WS4,             FN_DU0_DR1,     FN_LCDOUT1,     FN_AUDATA3,
+               FN_ARM_TRACEDATA_3,     FN_SCL3_C,      FN_ADICHS2,     FN_TS_SPSYNC0_B,
+               /* IP3_23_21 [3] */
+               FN_SSI_SCK4,            FN_DU0_DR0,     FN_LCDOUT0,     FN_AUDATA2,
+               FN_ARM_TRACEDATA_2,     FN_SDA3_C,      FN_ADICHS1,     FN_TS_SDEN0_B,
+               /* IP3_20_19 [2] */
+               FN_SD1_DAT3_B,  FN_HRTS0_A,     FN_RTS0,        0,
+               /* IP3_18_16 [3] */
+               FN_SD1_DAT2_B,  FN_HCTS0_A,     FN_CTS0,        0,
+               0,              0,              0,              0,
+               /* IP3_15_13 [3] */
+               FN_SD1_DAT1_B,  FN_HSCK0,       FN_SCK0,        FN_SCL3_B,
+               0,              0,              0,              0,
+               /* IP3_12_10 [3] */
+               FN_SD1_DAT0_B,  FN_HRX0_A,      FN_RX0_A,       0,
+               0,              0,              0,              0,
+               /* IP3_9_8 [2] */
+               FN_SD1_CLK_B,   FN_HTX0_A,      FN_TX0_A,       0,
+               /* IP3_7_5 [3] */
+               FN_SD1_CMD_B,   FN_SCIF_CLK,    FN_AUDIO_CLKOUT_B,      FN_CAN_CLK_B,
+               FN_SDA3_B,      0,              0,                      0,
+               /* IP3_4_2 [3] */
+               FN_MLB_DAT,     FN_TX5_B,       FN_SCL3_A,      FN_IRQ3_A,
+               FN_SDSELF_B,    0,              0,              0,
+               /* IP3_1_0 [2] */
+               FN_MLB_SIG,     FN_RX5_B,       FN_SDA3_A,      FN_IRQ2_A,
+               }
+       },
+       { PINMUX_CFG_REG_VAR("IPSR4", 0xfffc0030, 32,
+                            1, 2, 2, 2, 4, 4, 2, 2, 2, 2, 1, 1, 3, 3, 1) {
+               /* IP4_31 [1] */
+               0,      0,
+               /* IP4_30_29 [2] */
+               FN_VI0_R4_B,    FN_DU0_DB4,     FN_LCDOUT20,    0,
+               /* IP4_28_27 [2] */
+               FN_VI0_R3_B,    FN_DU0_DB3,     FN_LCDOUT19,    0,
+               /* IP4_26_25 [2] */
+               FN_VI0_R2_B,    FN_DU0_DB2,     FN_LCDOUT18,    0,
+               /* IP4_24_21 [4] */
+               FN_AUDIO_CLKC,  FN_VI0_R1_B,            FN_DU0_DB1,     FN_LCDOUT17,
+               FN_AUDATA7,     FN_ARM_TRACEDATA_7,     FN_GPSIN_A,     0,
+               FN_ADICS_SAMP,  FN_TS_SCK0_B,           0,              0,
+               0,              0,                      0,              0,
+               /* IP4_20_17 [4] */
+               FN_SSI_SCK2_B,  FN_VI0_R0_B,            FN_DU0_DB0,     FN_LCDOUT16,
+               FN_AUDATA6,     FN_ARM_TRACEDATA_6,     FN_GPSCLK_A,    FN_PWM0_A,
+               FN_ADICLK,      FN_TS_SDAT0_B,          0,              0,
+               0,              0,                      0,              0,
+               /* IP4_16_15 [2] */
+               FN_DU0_DG7,     FN_LCDOUT15,    FN_TX4_A,       0,
+               /* IP4_14_13 [2] */
+               FN_DU0_DG6,     FN_LCDOUT14,    FN_RX4_A,       0,
+               /* IP4_12_11 [2] */
+               FN_DU0_DG5,     FN_LCDOUT13,    FN_TX0_B,       0,
+               /* IP4_10_9 [2] */
+               FN_DU0_DG4,     FN_LCDOUT12,    FN_RX0_B,       0,
+               /* IP4_8 [1] */
+               FN_DU0_DG3,     FN_LCDOUT11,
+               /* IP4_7 [1] */
+               FN_DU0_DG2,     FN_LCDOUT10,
+               /* IP4_6_4 [3] */
+               FN_DU0_DG1,     FN_LCDOUT9,     FN_AUDATA5,     FN_ARM_TRACEDATA_5,
+               FN_RX1_D,       FN_CAN0_RX_A,   FN_ADIDATA,     0,
+               /* IP4_3_1 [3] */
+               FN_DU0_DG0,     FN_LCDOUT8,     FN_AUDATA4,     FN_ARM_TRACEDATA_4,
+               FN_TX1_D,       FN_CAN0_TX_A,   FN_ADICHS0,     0,
+               /* IP4_0 [1] */
+               FN_DU0_DR7,     FN_LCDOUT7,
+               }
+       },
+       { PINMUX_CFG_REG_VAR("IPSR5", 0xfffc0034, 32,
+                            1, 2, 3, 3, 2, 3, 3, 2, 1, 2, 2, 1, 1, 2, 2, 2) {
+
+               /* IP5_31 [1] */
+               0, 0,
+               /* IP5_30_29 [2] */
+               FN_SSI_SDATA7,  FN_HSPI_TX0_B,  FN_RX2_A,       FN_CAN0_RX_B,
+               /* IP5_28_26 [3] */
+               FN_SSI_SDATA8,  FN_SSI_SCK2_A,  FN_HSPI_CS0_B,  FN_TX2_A,
+               FN_CAN0_TX_B,   0,              0,              0,
+               /* IP5_25_23 [3] */
+               FN_SD1_WP_B,    FN_SSI_WS78,    FN_HSPI_CLK0_B, FN_RX1_B,
+               FN_CAN_CLK_D,   0,              0,              0,
+               /* IP5_22_21 [2] */
+               FN_SD1_CD_B,    FN_SSI_SCK78,   FN_HSPI_RX0_B,  FN_TX1_B,
+               /* IP5_20_18 [3] */
+               FN_SSI_WS1_A,           FN_DU0_CDE,     FN_QPOLB,       FN_AUDSYNC,
+               FN_ARM_TRACECTL,        FN_FMIN_D,      0,              0,
+               /* IP5_17_15 [3] */
+               FN_SSI_SCK1_A,          FN_DU0_DISP,    FN_QPOLA,       FN_AUDCK,
+               FN_ARM_TRACECLK,        FN_BPFCLK_D,    0,              0,
+               /* IP5_14_13 [2] */
+               FN_DU0_EXODDF_DU0_ODDF_DISP_CDE,        FN_QCPV_QDE,
+               FN_FMCLK_D,                             0,
+               /* IP5_12 [1] */
+               FN_DU0_EXVSYNC_DU0_VSYNC,       FN_QSTB_QHE,
+               /* IP5_11_10 [2] */
+               FN_SSI_WS2_B,   FN_DU0_EXHSYNC_DU0_HSYNC,
+               FN_QSTH_QHS,    0,
+               /* IP5_9_8 [2] */
+               FN_DU0_DOTCLKO_UT1,     FN_QSTVB_QVE,
+               FN_AUDIO_CLKOUT_A,      FN_REMOCON_C,
+               /* IP5_7 [1] */
+               FN_DU0_DOTCLKO_UT0,     FN_QCLK,
+               /* IP5_6 [1] */
+               FN_DU0_DOTCLKIN,        FN_QSTVA_QVS,
+               /* IP5_5_4 [2] */
+               FN_VI1_DATA11_B,        FN_DU0_DB7,     FN_LCDOUT23,    0,
+               /* IP5_3_2 [2] */
+               FN_VI1_DATA10_B,        FN_DU0_DB6,     FN_LCDOUT22,    0,
+               /* IP5_1_0 [2] */
+               FN_VI0_R5_B,            FN_DU0_DB5,     FN_LCDOUT21,    0,
+               }
+       },
+       { PINMUX_CFG_REG_VAR("IPSR6", 0xfffc0038, 32,
+                            2, 2, 2, 2, 2, 1, 2, 2, 1, 2,
+                            1, 2, 1, 1, 1, 1, 2, 3, 2) {
+               /* IP6_31_30 [2] */
+               FN_SD0_DAT2,    0,      FN_SUB_TDI,     0,
+               /* IP6_29_28 [2] */
+               FN_SD0_DAT1,    0,      FN_SUB_TCK,     0,
+               /* IP6_27_26 [2] */
+               FN_SD0_DAT0,    0,      FN_SUB_TMS,     0,
+               /* IP6_25_24 [2] */
+               FN_SD0_CMD,     0,      FN_SUB_TRST,    0,
+               /* IP6_23_22 [2] */
+               FN_SD0_CLK,     0,      FN_SUB_TDO,     0,
+               /* IP6_21 [1] */
+               FN_SSI_SDATA0,          FN_ARM_TRACEDATA_15,
+               /* IP6_20_19 [2] */
+               FN_SSI_SDATA1,          FN_ARM_TRACEDATA_14,
+               FN_SCL1_A,              FN_SCK2_A,
+               /* IP6_18_17 [2] */
+               FN_SSI_SDATA2,          FN_HSPI_CS2_A,
+               FN_ARM_TRACEDATA_13,    FN_SDA1_A,
+               /* IP6_16 [1] */
+               FN_SSI_WS012,           FN_ARM_TRACEDATA_12,
+               /* IP6_15_14 [2] */
+               FN_SSI_SCK012,          FN_ARM_TRACEDATA_11,
+               FN_TX0_D,               0,
+               /* IP6_13 [1] */
+               FN_SSI_SDATA3,          FN_ARM_TRACEDATA_10,
+               /* IP6_12_11 [2] */
+               FN_SSI_SDATA4,          FN_SSI_WS2_A,
+               FN_ARM_TRACEDATA_9,     0,
+               /* IP6_10 [1] */
+               FN_SSI_WS34,            FN_ARM_TRACEDATA_8,
+               /* IP6_9 [1] */
+               FN_SSI_SDATA5,          FN_RX0_D,
+               /* IP6_8 [1] */
+               FN_SSI_WS5,             FN_TX4_C,
+               /* IP6_7 [1] */
+               FN_SSI_SCK5,            FN_RX4_C,
+               /* IP6_6_5 [2] */
+               FN_SSI_SDATA6,          FN_HSPI_TX2_A,
+               FN_FMIN_B,              0,
+               /* IP6_4_2 [3] */
+               FN_SSI_WS6,             FN_HSPI_CLK2_A,
+               FN_BPFCLK_B,            FN_CAN1_RX_B,
+               0,      0,      0,      0,
+               /* IP6_1_0 [2] */
+               FN_SSI_SCK6,            FN_HSPI_RX2_A,
+               FN_FMCLK_B,             FN_CAN1_TX_B,
+               }
+       },
+       { PINMUX_CFG_REG_VAR("IPSR7", 0xfffc003c, 32,
+                            3, 4, 3, 1, 3, 3, 3, 3, 3, 2, 2, 2) {
+
+               /* IP7_31_29 [3] */
+               FN_VI0_HSYNC,   FN_SD2_CD_B,    FN_VI1_DATA2,   FN_DU1_DR2,
+               0,              FN_HSPI_CS1_A,  FN_RX3_B,       0,
+               /* IP7_28_25 [4] */
+               FN_VI0_FIELD,   FN_SD2_DAT3_B,  FN_VI0_R3_C,    FN_VI1_DATA1,
+               FN_DU1_DG7,     0,              FN_HSPI_CLK1_A, FN_TX4_B,
+               0,      0,      0,      0,
+               0,      0,      0,      0,
+               /* IP7_24_22 [3] */
+               FN_VI0_CLKENB,  FN_SD2_DAT2_B,  FN_VI1_DATA0,   FN_DU1_DG6,
+               0,              FN_HSPI_RX1_A,  FN_RX4_B,       0,
+               /* IP7_21 [1] */
+               FN_VI0_CLK,     FN_CAN_CLK_A,
+               /* IP7_20_18 [3] */
+               FN_TCLK0,       FN_HSCK1_A,     FN_FMIN_A,      0,
+               FN_IRQ2_C,      FN_CTS1_C,      FN_SPEEDIN,     0,
+               /* IP7_17_15 [3] */
+               FN_VI1_VSYNC,   FN_HSPI_TX0,    FN_HCTS1_A,     FN_BPFCLK_A,
+               0,              FN_TX1_C,       0,              0,
+               /* IP7_14_12 [3] */
+               FN_VI1_HSYNC,   FN_HSPI_RX0_A,  FN_HRTS1_A,     FN_FMCLK_A,
+               0,              FN_RX1_C,       0,              0,
+               /* IP7_11_9 [3] */
+               FN_VI1_FIELD,   FN_HSPI_CS0_A,  FN_HRX1_A,      0,
+               FN_SCK1_C,      0,              0,              0,
+               /* IP7_8_6 [3] */
+               FN_VI1_CLKENB,  FN_HSPI_CLK0_A, FN_HTX1_A,      0,
+               FN_RTS1_C,      0,              0,              0,
+               /* IP7_5_4 [2] */
+               FN_SD0_WP,      0,              FN_RX5_A,       0,
+               /* IP7_3_2 [2] */
+               FN_SD0_CD,      0,              FN_TX5_A,       0,
+               /* IP7_1_0 [2] */
+               FN_SD0_DAT3,    0,              FN_IRQ1_B,      0,
+               }
+       },
+       { PINMUX_CFG_REG_VAR("IPSR8", 0xfffc0040, 32,
+                            1, 1, 3, 3, 2, 3, 3, 2, 3, 2, 3, 3, 3) {
+               /* IP8_31 [1] */
+               0, 0,
+               /* IP8_30 [1] */
+               0, 0,
+               /* IP8_29_27 [3] */
+               FN_VI0_G3,      FN_SD2_CMD_B,   FN_VI1_DATA5,   FN_DU1_DR5,
+               0,              FN_HRX1_B,      0,              0,
+               /* IP8_26_24 [3] */
+               FN_VI0_G2,      FN_SD2_CLK_B,   FN_VI1_DATA4,   FN_DU1_DR4,
+               0,              FN_HTX1_B,      0,              0,
+               /* IP8_23_22 [2] */
+               FN_VI0_DATA7_VI0_G1,    FN_DU1_DB5,
+               FN_RTS1_A,              0,
+               /* IP8_21_19 [3] */
+               FN_VI0_DATA6_VI0_G0,    FN_DU1_DB4,
+               FN_CTS1_A,              FN_PWM5,
+               0,      0,      0,      0,
+               /* IP8_18_16 [3] */
+               FN_VI0_DATA5_VI0_B5,    FN_DU1_DB3,     FN_SCK1_A,      FN_PWM4,
+               0,                      FN_HSCK1_B,     0,              0,
+               /* IP8_15_14 [2] */
+               FN_VI0_DATA4_VI0_B4,    FN_DU1_DB2,     FN_RX1_A,       0,
+               /* IP8_13_11 [3] */
+               FN_VI0_DATA3_VI0_B3,    FN_DU1_DG5,     FN_TX1_A,       FN_TX0_C,
+               0,                       0,             0,              0,
+               /* IP8_10_9 [2] */
+               FN_VI0_DATA2_VI0_B2,    FN_DU1_DG4,     FN_RX0_C,       0,
+               /* IP8_8_6 [3] */
+               FN_VI0_DATA1_VI0_B1,    FN_DU1_DG3,     FN_IRQ3_B,      FN_TX3_D,
+               0,                       0,             0,              0,
+               /* IP8_5_3 [3] */
+               FN_VI0_DATA0_VI0_B0,    FN_DU1_DG2,     FN_IRQ2_B,      FN_RX3_D,
+               0,                       0,             0,              0,
+               /* IP8_2_0 [3] */
+               FN_VI0_VSYNC,           FN_SD2_WP_B,    FN_VI1_DATA3,   FN_DU1_DR3,
+               0,                      FN_HSPI_TX1_A,  FN_TX3_B,       0,
+               }
+       },
+       { PINMUX_CFG_REG_VAR("IPSR9", 0xfffc0044, 32,
+                            1, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3) {
+               /* IP9_31 [1] */
+               0, 0,
+               /* IP9_30 [1] */
+               0, 0,
+               /* IP9_29_27 [3] */
+               FN_VI1_DATA11_A,        FN_DU1_EXHSYNC_DU1_HSYNC,
+               FN_ETH_RXD1,            FN_FMIN_C,
+               0,                      FN_RX2_D,
+               FN_SCL2_C,              0,
+               /* IP9_26_24 [3] */
+               FN_VI1_DATA10_A,        FN_DU1_DOTCLKOUT,
+               FN_ETH_RXD0,            FN_BPFCLK_C,
+               0,                      FN_TX2_D,
+               FN_SDA2_C,              0,
+               /* IP9_23_21 [3] */
+               FN_VI0_R5_A,    0,              FN_ETH_RX_ER,   FN_FMCLK_C,
+               FN_IERX,        FN_RX2_C,       0,              0,
+               /* IP9_20_18 [3] */
+               FN_VI0_R4_A,    FN_ETH_TX_EN,   0,              0,
+               FN_IETX,        FN_TX2_C,       0,              0,
+               /* IP9_17_15 [3] */
+               FN_VI0_R3_A,    FN_ETH_CRS_DV,  0,              FN_IECLK,
+               FN_SCK2_C,      0,              0,              0,
+               /* IP9_14_12 [3] */
+               FN_VI0_R2_A,    FN_VI1_DATA9,   FN_DU1_DB7,     FN_ETH_TXD1,
+               0,              FN_PWM3,        0,              0,
+               /* IP9_11_9 [3] */
+               FN_VI0_R1_A,    FN_VI1_DATA8,   FN_DU1_DB6,     FN_ETH_TXD0,
+               0,              FN_PWM2,        FN_TCLK1,       0,
+               /* IP9_8_6 [3] */
+               FN_VI0_R0_A,    FN_VI1_CLK,     FN_ETH_REF_CLK, FN_DU1_DOTCLKIN,
+               0,              0,              0,              0,
+               /* IP9_5_3 [3] */
+               FN_VI0_G5,      FN_SD2_DAT1_B,  FN_VI1_DATA7,   FN_DU1_DR7,
+               0,              FN_HCTS1_B,     0,              0,
+               /* IP9_2_0 [3] */
+               FN_VI0_G4,      FN_SD2_DAT0_B,  FN_VI1_DATA6,   FN_DU1_DR6,
+               0,              FN_HRTS1_B,     0,              0,
+               }
+       },
+       { PINMUX_CFG_REG_VAR("IPSR10", 0xfffc0048, 32,
+                            1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 4, 3, 3, 3) {
+
+               /* IP10_31 [1] */
+               0, 0,
+               /* IP10_30 [1] */
+               0, 0,
+               /* IP10_29 [1] */
+               0, 0,
+               /* IP10_28 [1] */
+               0, 0,
+               /* IP10_27 [1] */
+               0, 0,
+               /* IP10_26 [1] */
+               0, 0,
+               /* IP10_25 [1] */
+               0, 0,
+               /* IP10_24_22 [3] */
+               FN_SD2_WP_A,    FN_VI1_DATA15,  FN_EX_WAIT2_B,  FN_DACK0_B,
+               FN_HSPI_TX2_B,  FN_CAN_CLK_C,   0,              0,
+               /* IP10_21_19 [3] */
+               FN_SD2_CD_A,    FN_VI1_DATA14,  FN_EX_WAIT1_B,  FN_DREQ0_B,
+               FN_HSPI_RX2_B,  FN_REMOCON_A,   0,              0,
+               /* IP10_18_16 [3] */
+               FN_SD2_DAT3_A,  FN_VI1_DATA13,  FN_DACK2_B,     FN_ATAG1,
+               FN_HSPI_CS2_B,  FN_GPSIN_B,     0,              0,
+               /* IP10_15_13 [3] */
+               FN_SD2_DAT2_A,  FN_VI1_DATA12,  FN_DREQ2_B,     FN_ATADIR1,
+               FN_HSPI_CLK2_B, FN_GPSCLK_B,    0,              0,
+               /* IP10_12_9 [4] */
+               FN_SD2_DAT1_A,  FN_DU1_CDE,     FN_ATACS11,     FN_DACK1_B,
+               FN_ETH_MAGIC,   FN_CAN1_TX_A,   0,              FN_PWM6,
+               0, 0, 0, 0,
+               0, 0, 0, 0,
+               /* IP10_8_6 [3] */
+               FN_SD2_DAT0_A,  FN_DU1_DISP,    FN_ATACS01,     FN_DREQ1_B,
+               FN_ETH_LINK,    FN_CAN1_RX_A,   0,              0,
+               /* IP10_5_3 [3] */
+               FN_SD2_CMD_A,   FN_DU1_EXODDF_DU1_ODDF_DISP_CDE,
+               FN_ATAWR1,      FN_ETH_MDIO,
+               FN_SCL1_B,      0,
+               0,              0,
+               /* IP10_2_0 [3] */
+               FN_SD2_CLK_A,   FN_DU1_EXVSYNC_DU1_VSYNC,
+               FN_ATARD1,      FN_ETH_MDC,
+               FN_SDA1_B,      0,
+               0,              0,
+               }
+       },
+       { PINMUX_CFG_REG_VAR("MOD_SEL0", 0xfffc0050, 32,
+                            1, 1, 2, 2, 3, 2, 2, 1, 1, 1, 1, 2,
+                            1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1) {
+
+               /* SEL 31  [1] */
+               0, 0,
+               /* SEL_30 (SCIF5) [1] */
+               FN_SEL_SCIF5_A,         FN_SEL_SCIF5_B,
+               /* SEL_29_28 (SCIF4) [2] */
+               FN_SEL_SCIF4_A,         FN_SEL_SCIF4_B,
+               FN_SEL_SCIF4_C,         0,
+               /* SEL_27_26 (SCIF3) [2] */
+               FN_SEL_SCIF3_A,         FN_SEL_SCIF3_B,
+               FN_SEL_SCIF3_C,         FN_SEL_SCIF3_D,
+               /* SEL_25_23 (SCIF2) [3] */
+               FN_SEL_SCIF2_A,         FN_SEL_SCIF2_B,
+               FN_SEL_SCIF2_C,         FN_SEL_SCIF2_D,
+               FN_SEL_SCIF2_E,         0,
+               0,                      0,
+               /* SEL_22_21 (SCIF1) [2] */
+               FN_SEL_SCIF1_A,         FN_SEL_SCIF1_B,
+               FN_SEL_SCIF1_C,         FN_SEL_SCIF1_D,
+               /* SEL_20_19 (SCIF0) [2] */
+               FN_SEL_SCIF0_A,         FN_SEL_SCIF0_B,
+               FN_SEL_SCIF0_C,         FN_SEL_SCIF0_D,
+               /* SEL_18 [1] */
+               0, 0,
+               /* SEL_17 (SSI2) [1] */
+               FN_SEL_SSI2_A,          FN_SEL_SSI2_B,
+               /* SEL_16 (SSI1) [1] */
+               FN_SEL_SSI1_A,          FN_SEL_SSI1_B,
+               /* SEL_15 (VI1) [1] */
+               FN_SEL_VI1_A,           FN_SEL_VI1_B,
+               /* SEL_14_13 (VI0) [2] */
+               FN_SEL_VI0_A,           FN_SEL_VI0_B,
+               FN_SEL_VI0_C,           FN_SEL_VI0_D,
+               /* SEL_12 [1] */
+               0, 0,
+               /* SEL_11 (SD2) [1] */
+               FN_SEL_SD2_A,           FN_SEL_SD2_B,
+               /* SEL_10 (SD1) [1] */
+               FN_SEL_SD1_A,           FN_SEL_SD1_B,
+               /* SEL_9 (IRQ3) [1] */
+               FN_SEL_IRQ3_A,          FN_SEL_IRQ3_B,
+               /* SEL_8_7 (IRQ2) [2] */
+               FN_SEL_IRQ2_A,          FN_SEL_IRQ2_B,
+               FN_SEL_IRQ2_C,          0,
+               /* SEL_6 (IRQ1) [1] */
+               FN_SEL_IRQ1_A,          FN_SEL_IRQ1_B,
+               /* SEL_5 [1] */
+               0, 0,
+               /* SEL_4 (DREQ2) [1] */
+               FN_SEL_DREQ2_A,         FN_SEL_DREQ2_B,
+               /* SEL_3 (DREQ1) [1] */
+               FN_SEL_DREQ1_A,         FN_SEL_DREQ1_B,
+               /* SEL_2 (DREQ0) [1] */
+               FN_SEL_DREQ0_A,         FN_SEL_DREQ0_B,
+               /* SEL_1 (WAIT2) [1] */
+               FN_SEL_WAIT2_A,         FN_SEL_WAIT2_B,
+               /* SEL_0 (WAIT1) [1] */
+               FN_SEL_WAIT1_A,         FN_SEL_WAIT1_B,
+               }
+       },
+       { PINMUX_CFG_REG_VAR("MOD_SEL1", 0xfffc0054, 32,
+                            1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1,
+                            1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 2, 2, 1) {
+
+               /* SEL_31 [1] */
+               0, 0,
+               /* SEL_30 [1] */
+               0, 0,
+               /* SEL_29 [1] */
+               0, 0,
+               /* SEL_28 [1] */
+               0, 0,
+               /* SEL_27 (CAN1) [1] */
+               FN_SEL_CAN1_A,          FN_SEL_CAN1_B,
+               /* SEL_26 (CAN0) [1] */
+               FN_SEL_CAN0_A,          FN_SEL_CAN0_B,
+               /* SEL_25_24 (CANCLK) [2] */
+               FN_SEL_CANCLK_A,        FN_SEL_CANCLK_B,
+               FN_SEL_CANCLK_C,        FN_SEL_CANCLK_D,
+               /* SEL_23 (HSCIF1) [1] */
+               FN_SEL_HSCIF1_A,        FN_SEL_HSCIF1_B,
+               /* SEL_22 (HSCIF0) [1] */
+               FN_SEL_HSCIF0_A,        FN_SEL_HSCIF0_B,
+               /* SEL_21 [1] */
+               0, 0,
+               /* SEL_20 [1] */
+               0, 0,
+               /* SEL_19 [1] */
+               0, 0,
+               /* SEL_18 [1] */
+               0, 0,
+               /* SEL_17 [1] */
+               0, 0,
+               /* SEL_16 [1] */
+               0, 0,
+               /* SEL_15 [1] */
+               0, 0,
+               /* SEL_14_13 (REMOCON) [2] */
+               FN_SEL_REMOCON_A,       FN_SEL_REMOCON_B,
+               FN_SEL_REMOCON_C,       0,
+               /* SEL_12_11 (FM) [2] */
+               FN_SEL_FM_A,            FN_SEL_FM_B,
+               FN_SEL_FM_C,            FN_SEL_FM_D,
+               /* SEL_10_9 (GPS) [2] */
+               FN_SEL_GPS_A,           FN_SEL_GPS_B,
+               FN_SEL_GPS_C,           0,
+               /* SEL_8 (TSIF0) [1] */
+               FN_SEL_TSIF0_A,         FN_SEL_TSIF0_B,
+               /* SEL_7 (HSPI2) [1] */
+               FN_SEL_HSPI2_A,         FN_SEL_HSPI2_B,
+               /* SEL_6 (HSPI1) [1] */
+               FN_SEL_HSPI1_A,         FN_SEL_HSPI1_B,
+               /* SEL_5 (HSPI0) [1] */
+               FN_SEL_HSPI0_A,         FN_SEL_HSPI0_B,
+               /* SEL_4_3 (I2C3) [2] */
+               FN_SEL_I2C3_A,          FN_SEL_I2C3_B,
+               FN_SEL_I2C3_C,          0,
+               /* SEL_2_1 (I2C2) [2] */
+               FN_SEL_I2C2_A,          FN_SEL_I2C2_B,
+               FN_SEL_I2C2_C,          0,
+               /* SEL_0 (I2C1) [1] */
+               FN_SEL_I2C1_A,          FN_SEL_I2C1_B,
+               }
+       },
+       { },
+};
+
+const struct sh_pfc_soc_info r8a7778_pinmux_info = {
+       .name = "r8a7778_pfc",
+
+       .unlock_reg = 0xfffc0000, /* PMMR */
+
+       .function = { PINMUX_FUNCTION_BEGIN, PINMUX_FUNCTION_END },
+
+       .pins = pinmux_pins,
+       .nr_pins = ARRAY_SIZE(pinmux_pins),
+
+       .groups = pinmux_groups,
+       .nr_groups = ARRAY_SIZE(pinmux_groups),
+
+       .functions = pinmux_functions,
+       .nr_functions = ARRAY_SIZE(pinmux_functions),
+
+       .cfg_regs = pinmux_config_regs,
+
+       .gpio_data = pinmux_data,
+       .gpio_data_size = ARRAY_SIZE(pinmux_data),
+};
index 8cd90e7e945ae2317c73e42d6aa48bb6ffa4a160..8e22ca6c1044b252c93e86f2c744b28ba1d08c6a 100644 (file)
@@ -1,8 +1,9 @@
 /*
  * r8a7779 processor support - PFC hardware block
  *
- * 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
@@ -19,6 +20,7 @@
  */
 
 #include <linux/kernel.h>
+#include <linux/platform_data/gpio-rcar.h>
 
 #include "sh_pfc.h"
 
@@ -79,7 +81,7 @@
 #define _GP_PORT_ALL(bank, pin, name, sfx)     name##_##sfx
 
 #define _GP_GPIO(bank, pin, _name, sfx)                                        \
-       [(bank * 32) + pin] = {                                         \
+       [RCAR_GP_PIN(bank, pin)] = {                                    \
                .name = __stringify(_name),                             \
                .enum_id = _name##_DATA,                                \
        }
@@ -1472,9 +1474,12 @@ static struct sh_pfc_pin pinmux_pins[] = {
 /* - 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,
+       RCAR_GP_PIN(5, 28), RCAR_GP_PIN(5, 27), RCAR_GP_PIN(5, 26),
+       RCAR_GP_PIN(5, 25), RCAR_GP_PIN(5, 24), RCAR_GP_PIN(5, 23),
+       RCAR_GP_PIN(6, 2),  RCAR_GP_PIN(6, 1),  RCAR_GP_PIN(6, 0),
+       RCAR_GP_PIN(5, 31), RCAR_GP_PIN(5, 30), RCAR_GP_PIN(5, 29),
+       RCAR_GP_PIN(6, 8),  RCAR_GP_PIN(6, 7),  RCAR_GP_PIN(6, 6),
+       RCAR_GP_PIN(6, 5),  RCAR_GP_PIN(6, 4),  RCAR_GP_PIN(6, 3),
 };
 static const unsigned int du0_rgb666_mux[] = {
        DU0_DR7_MARK, DU0_DR6_MARK, DU0_DR5_MARK, DU0_DR4_MARK,
@@ -1486,9 +1491,14 @@ static const unsigned int du0_rgb666_mux[] = {
 };
 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,
+       RCAR_GP_PIN(5, 28), RCAR_GP_PIN(5, 27), RCAR_GP_PIN(5, 26),
+       RCAR_GP_PIN(5, 25), RCAR_GP_PIN(5, 24), RCAR_GP_PIN(5, 23),
+       RCAR_GP_PIN(0, 24), RCAR_GP_PIN(0, 23), RCAR_GP_PIN(6, 2),
+       RCAR_GP_PIN(6, 1),  RCAR_GP_PIN(6, 0),  RCAR_GP_PIN(5, 31),
+       RCAR_GP_PIN(5, 30), RCAR_GP_PIN(5, 29), RCAR_GP_PIN(0, 26),
+       RCAR_GP_PIN(0, 25), RCAR_GP_PIN(6, 8),  RCAR_GP_PIN(6, 7),
+       RCAR_GP_PIN(6, 6),  RCAR_GP_PIN(6, 5),  RCAR_GP_PIN(6, 4),
+       RCAR_GP_PIN(6, 3),  RCAR_GP_PIN(0, 28), RCAR_GP_PIN(0, 27),
 };
 static const unsigned int du0_rgb888_mux[] = {
        DU0_DR7_MARK, DU0_DR6_MARK, DU0_DR5_MARK, DU0_DR4_MARK,
@@ -1500,28 +1510,28 @@ static const unsigned int du0_rgb888_mux[] = {
 };
 static const unsigned int du0_clk_in_pins[] = {
        /* CLKIN */
-       29,
+       RCAR_GP_PIN(0, 29),
 };
 static const unsigned int du0_clk_in_mux[] = {
        DU0_DOTCLKIN_MARK,
 };
 static const unsigned int du0_clk_out_0_pins[] = {
        /* CLKOUT */
-       180,
+       RCAR_GP_PIN(5, 20),
 };
 static const unsigned int du0_clk_out_0_mux[] = {
        DU0_DOTCLKOUT0_MARK,
 };
 static const unsigned int du0_clk_out_1_pins[] = {
        /* CLKOUT */
-       30,
+       RCAR_GP_PIN(0, 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,
+       RCAR_GP_PIN(5, 22), RCAR_GP_PIN(5, 21), RCAR_GP_PIN(0, 31),
 };
 static const unsigned int du0_sync_0_mux[] = {
        DU0_EXHSYNC_DU0_HSYNC_MARK, DU0_EXVSYNC_DU0_VSYNC_MARK,
@@ -1529,7 +1539,7 @@ static const unsigned int du0_sync_0_mux[] = {
 };
 static const unsigned int du0_sync_1_pins[] = {
        /* VSYNC, HSYNC, DISP */
-       182, 181, 32,
+       RCAR_GP_PIN(5, 22), RCAR_GP_PIN(5, 21), RCAR_GP_PIN(1, 0),
 };
 static const unsigned int du0_sync_1_mux[] = {
        DU0_EXHSYNC_DU0_HSYNC_MARK, DU0_EXVSYNC_DU0_VSYNC_MARK,
@@ -1537,14 +1547,14 @@ static const unsigned int du0_sync_1_mux[] = {
 };
 static const unsigned int du0_oddf_pins[] = {
        /* ODDF */
-       31,
+       RCAR_GP_PIN(0, 31),
 };
 static const unsigned int du0_oddf_mux[] = {
        DU0_EXODDF_DU0_ODDF_DISP_CDE_MARK
 };
 static const unsigned int du0_cde_pins[] = {
        /* CDE */
-       33,
+       RCAR_GP_PIN(1, 1),
 };
 static const unsigned int du0_cde_mux[] = {
        DU0_CDE_MARK
@@ -1552,9 +1562,12 @@ static const unsigned int du0_cde_mux[] = {
 /* - 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,
+       RCAR_GP_PIN(1, 9),  RCAR_GP_PIN(1, 8),  RCAR_GP_PIN(1, 7),
+       RCAR_GP_PIN(1, 6),  RCAR_GP_PIN(1, 5),  RCAR_GP_PIN(1, 4),
+       RCAR_GP_PIN(1, 17), RCAR_GP_PIN(1, 16), RCAR_GP_PIN(1, 15),
+       RCAR_GP_PIN(1, 14), RCAR_GP_PIN(1, 13), RCAR_GP_PIN(1, 12),
+       RCAR_GP_PIN(1, 25), RCAR_GP_PIN(1, 24), RCAR_GP_PIN(1, 23),
+       RCAR_GP_PIN(1, 22), RCAR_GP_PIN(1, 21), RCAR_GP_PIN(1, 20),
 };
 static const unsigned int du1_rgb666_mux[] = {
        DU1_DR7_MARK, DU1_DR6_MARK, DU1_DR5_MARK, DU1_DR4_MARK,
@@ -1566,9 +1579,14 @@ static const unsigned int du1_rgb666_mux[] = {
 };
 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,
+       RCAR_GP_PIN(1, 9),  RCAR_GP_PIN(1, 8),  RCAR_GP_PIN(1, 7),
+       RCAR_GP_PIN(1, 6),  RCAR_GP_PIN(1, 5),  RCAR_GP_PIN(1, 4),
+       RCAR_GP_PIN(1, 3),  RCAR_GP_PIN(1, 2),  RCAR_GP_PIN(1, 17),
+       RCAR_GP_PIN(1, 16), RCAR_GP_PIN(1, 15), RCAR_GP_PIN(1, 14),
+       RCAR_GP_PIN(1, 13), RCAR_GP_PIN(1, 12), RCAR_GP_PIN(1, 11),
+       RCAR_GP_PIN(1, 0),  RCAR_GP_PIN(1, 25), RCAR_GP_PIN(1, 24),
+       RCAR_GP_PIN(1, 23), RCAR_GP_PIN(1, 22), RCAR_GP_PIN(1, 21),
+       RCAR_GP_PIN(1, 20), RCAR_GP_PIN(1, 19), RCAR_GP_PIN(1, 18),
 };
 static const unsigned int du1_rgb888_mux[] = {
        DU1_DR7_MARK, DU1_DR6_MARK, DU1_DR5_MARK, DU1_DR4_MARK,
@@ -1580,21 +1598,21 @@ static const unsigned int du1_rgb888_mux[] = {
 };
 static const unsigned int du1_clk_in_pins[] = {
        /* CLKIN */
-       58,
+       RCAR_GP_PIN(1, 26),
 };
 static const unsigned int du1_clk_in_mux[] = {
        DU1_DOTCLKIN_MARK,
 };
 static const unsigned int du1_clk_out_pins[] = {
        /* CLKOUT */
-       59,
+       RCAR_GP_PIN(1, 27),
 };
 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,
+       RCAR_GP_PIN(1, 29), RCAR_GP_PIN(1, 28), RCAR_GP_PIN(1, 30),
 };
 static const unsigned int du1_sync_0_mux[] = {
        DU1_EXVSYNC_DU1_VSYNC_MARK, DU1_EXHSYNC_DU1_HSYNC_MARK,
@@ -1602,7 +1620,7 @@ static const unsigned int du1_sync_0_mux[] = {
 };
 static const unsigned int du1_sync_1_pins[] = {
        /* VSYNC, HSYNC, DISP */
-       61, 60, 63,
+       RCAR_GP_PIN(1, 29), RCAR_GP_PIN(1, 28), RCAR_GP_PIN(1, 31),
 };
 static const unsigned int du1_sync_1_mux[] = {
        DU1_EXVSYNC_DU1_VSYNC_MARK, DU1_EXHSYNC_DU1_HSYNC_MARK,
@@ -1610,22 +1628,55 @@ static const unsigned int du1_sync_1_mux[] = {
 };
 static const unsigned int du1_oddf_pins[] = {
        /* ODDF */
-       62,
+       RCAR_GP_PIN(1, 30),
 };
 static const unsigned int du1_oddf_mux[] = {
        DU1_EXODDF_DU1_ODDF_DISP_CDE_MARK
 };
 static const unsigned int du1_cde_pins[] = {
        /* CDE */
-       64,
+       RCAR_GP_PIN(2, 0),
 };
 static const unsigned int du1_cde_mux[] = {
        DU1_CDE_MARK
 };
+/* - Ether ------------------------------------------------------------------ */
+static const unsigned int ether_rmii_pins[] = {
+       /*
+        * ETH_TXD0, ETH_TXD1, ETH_TX_EN,  ETH_REFCLK,
+        * ETH_RXD0, ETH_RXD1, ETH_CRS_DV, ETH_RX_ER,
+        * ETH_MDIO, ETH_MDC
+        */
+       RCAR_GP_PIN(2, 27), RCAR_GP_PIN(2, 16), RCAR_GP_PIN(2, 18),
+       RCAR_GP_PIN(2, 26),
+       RCAR_GP_PIN(2, 20), RCAR_GP_PIN(2, 21), RCAR_GP_PIN(2, 17),
+       RCAR_GP_PIN(2, 19),
+       RCAR_GP_PIN(2, 29), RCAR_GP_PIN(2, 28),
+};
+static const unsigned int ether_rmii_mux[] = {
+       ETH_TXD0_MARK, ETH_TXD1_MARK, ETH_TX_EN_MARK,  ETH_REFCLK_MARK,
+       ETH_RXD0_MARK, ETH_RXD1_MARK, ETH_CRS_DV_MARK, ETH_RX_ER_MARK,
+       ETH_MDIO_MARK, ETH_MDC_MARK,
+};
+static const unsigned int ether_link_pins[] = {
+       /* ETH_LINK */
+       RCAR_GP_PIN(2, 24),
+};
+static const unsigned int ether_link_mux[] = {
+       ETH_LINK_MARK,
+};
+static const unsigned int ether_magic_pins[] = {
+       /* ETH_MAGIC */
+       RCAR_GP_PIN(2, 25),
+};
+static const unsigned int ether_magic_mux[] = {
+       ETH_MAGIC_MARK,
+};
 /* - HSPI0 ------------------------------------------------------------------ */
 static const unsigned int hspi0_pins[] = {
        /* CLK, CS, RX, TX */
-       150, 151, 153, 152,
+       RCAR_GP_PIN(4, 22), RCAR_GP_PIN(4, 23), RCAR_GP_PIN(4, 25),
+       RCAR_GP_PIN(4, 24),
 };
 static const unsigned int hspi0_mux[] = {
        HSPI_CLK0_MARK, HSPI_CS0_MARK, HSPI_RX0_MARK, HSPI_TX0_MARK,
@@ -1633,28 +1684,32 @@ static const unsigned int hspi0_mux[] = {
 /* - HSPI1 ------------------------------------------------------------------ */
 static const unsigned int hspi1_pins[] = {
        /* CLK, CS, RX, TX */
-       63, 58, 64, 62,
+       RCAR_GP_PIN(1, 31), RCAR_GP_PIN(1, 26), RCAR_GP_PIN(2, 0),
+       RCAR_GP_PIN(1, 30),
 };
 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,
+       RCAR_GP_PIN(2, 26), RCAR_GP_PIN(2, 27), RCAR_GP_PIN(2, 29),
+       RCAR_GP_PIN(2, 28),
 };
 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,
+       RCAR_GP_PIN(4, 13), RCAR_GP_PIN(4, 14), RCAR_GP_PIN(4, 16),
+       RCAR_GP_PIN(4, 15),
 };
 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,
+       RCAR_GP_PIN(3, 5), RCAR_GP_PIN(3, 6), RCAR_GP_PIN(3, 8),
+       RCAR_GP_PIN(3, 7),
 };
 static const unsigned int hspi1_d_mux[] = {
        HSPI_CLK1_D_MARK, HSPI_CS1_D_MARK, HSPI_RX1_D_MARK, HSPI_TX1_D_MARK,
@@ -1662,14 +1717,16 @@ static const unsigned int hspi1_d_mux[] = {
 /* - HSPI2 ------------------------------------------------------------------ */
 static const unsigned int hspi2_pins[] = {
        /* CLK, CS, RX, TX */
-       9, 10, 11, 14,
+       RCAR_GP_PIN(0, 9), RCAR_GP_PIN(0, 10), RCAR_GP_PIN(0, 11),
+       RCAR_GP_PIN(0, 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,
+       RCAR_GP_PIN(0, 7), RCAR_GP_PIN(0, 13), RCAR_GP_PIN(0, 8),
+       RCAR_GP_PIN(0, 6),
 };
 static const unsigned int hspi2_b_mux[] = {
        HSPI_CLK2_B_MARK, HSPI_CS2_B_MARK, HSPI_RX2_B_MARK, HSPI_TX2_B_MARK,
@@ -1677,56 +1734,56 @@ static const unsigned int hspi2_b_mux[] = {
 /* - INTC ------------------------------------------------------------------- */
 static const unsigned int intc_irq0_pins[] = {
        /* IRQ */
-       78,
+       RCAR_GP_PIN(2, 14),
 };
 static const unsigned int intc_irq0_mux[] = {
        IRQ0_MARK,
 };
 static const unsigned int intc_irq0_b_pins[] = {
        /* IRQ */
-       141,
+       RCAR_GP_PIN(4, 13),
 };
 static const unsigned int intc_irq0_b_mux[] = {
        IRQ0_B_MARK,
 };
 static const unsigned int intc_irq1_pins[] = {
        /* IRQ */
-       79,
+       RCAR_GP_PIN(2, 15),
 };
 static const unsigned int intc_irq1_mux[] = {
        IRQ1_MARK,
 };
 static const unsigned int intc_irq1_b_pins[] = {
        /* IRQ */
-       142,
+       RCAR_GP_PIN(4, 14),
 };
 static const unsigned int intc_irq1_b_mux[] = {
        IRQ1_B_MARK,
 };
 static const unsigned int intc_irq2_pins[] = {
        /* IRQ */
-       88,
+       RCAR_GP_PIN(2, 24),
 };
 static const unsigned int intc_irq2_mux[] = {
        IRQ2_MARK,
 };
 static const unsigned int intc_irq2_b_pins[] = {
        /* IRQ */
-       143,
+       RCAR_GP_PIN(4, 15),
 };
 static const unsigned int intc_irq2_b_mux[] = {
        IRQ2_B_MARK,
 };
 static const unsigned int intc_irq3_pins[] = {
        /* IRQ */
-       89,
+       RCAR_GP_PIN(2, 25),
 };
 static const unsigned int intc_irq3_mux[] = {
        IRQ3_MARK,
 };
 static const unsigned int intc_irq3_b_pins[] = {
        /* IRQ */
-       144,
+       RCAR_GP_PIN(4, 16),
 };
 static const unsigned int intc_irq3_b_mux[] = {
        IRQ3_B_MARK,
@@ -1734,56 +1791,56 @@ static const unsigned int intc_irq3_b_mux[] = {
 /* - LSBC ------------------------------------------------------------------- */
 static const unsigned int lbsc_cs0_pins[] = {
        /* CS */
-       13,
+       RCAR_GP_PIN(0, 13),
 };
 static const unsigned int lbsc_cs0_mux[] = {
        CS0_MARK,
 };
 static const unsigned int lbsc_cs1_pins[] = {
        /* CS */
-       14,
+       RCAR_GP_PIN(0, 14),
 };
 static const unsigned int lbsc_cs1_mux[] = {
        CS1_A26_MARK,
 };
 static const unsigned int lbsc_ex_cs0_pins[] = {
        /* CS */
-       15,
+       RCAR_GP_PIN(0, 15),
 };
 static const unsigned int lbsc_ex_cs0_mux[] = {
        EX_CS0_MARK,
 };
 static const unsigned int lbsc_ex_cs1_pins[] = {
        /* CS */
-       16,
+       RCAR_GP_PIN(0, 16),
 };
 static const unsigned int lbsc_ex_cs1_mux[] = {
        EX_CS1_MARK,
 };
 static const unsigned int lbsc_ex_cs2_pins[] = {
        /* CS */
-       17,
+       RCAR_GP_PIN(0, 17),
 };
 static const unsigned int lbsc_ex_cs2_mux[] = {
        EX_CS2_MARK,
 };
 static const unsigned int lbsc_ex_cs3_pins[] = {
        /* CS */
-       18,
+       RCAR_GP_PIN(0, 18),
 };
 static const unsigned int lbsc_ex_cs3_mux[] = {
        EX_CS3_MARK,
 };
 static const unsigned int lbsc_ex_cs4_pins[] = {
        /* CS */
-       19,
+       RCAR_GP_PIN(0, 19),
 };
 static const unsigned int lbsc_ex_cs4_mux[] = {
        EX_CS4_MARK,
 };
 static const unsigned int lbsc_ex_cs5_pins[] = {
        /* CS */
-       20,
+       RCAR_GP_PIN(0, 20),
 };
 static const unsigned int lbsc_ex_cs5_mux[] = {
        EX_CS5_MARK,
@@ -1791,21 +1848,24 @@ static const unsigned int lbsc_ex_cs5_mux[] = {
 /* - MMCIF ------------------------------------------------------------------ */
 static const unsigned int mmc0_data1_pins[] = {
        /* D[0] */
-       19,
+       RCAR_GP_PIN(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,
+       RCAR_GP_PIN(0, 19), RCAR_GP_PIN(0, 20), RCAR_GP_PIN(0, 21),
+       RCAR_GP_PIN(0, 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,
+       RCAR_GP_PIN(0, 19), RCAR_GP_PIN(0, 20), RCAR_GP_PIN(0, 21),
+       RCAR_GP_PIN(0, 2),  RCAR_GP_PIN(0, 10), RCAR_GP_PIN(0, 11),
+       RCAR_GP_PIN(0, 15), RCAR_GP_PIN(0, 16),
 };
 static const unsigned int mmc0_data8_mux[] = {
        MMC0_D0_MARK, MMC0_D1_MARK, MMC0_D2_MARK, MMC0_D3_MARK,
@@ -1813,28 +1873,31 @@ static const unsigned int mmc0_data8_mux[] = {
 };
 static const unsigned int mmc0_ctrl_pins[] = {
        /* CMD, CLK */
-       18, 17,
+       RCAR_GP_PIN(0, 18), RCAR_GP_PIN(0, 17),
 };
 static const unsigned int mmc0_ctrl_mux[] = {
        MMC0_CMD_MARK, MMC0_CLK_MARK,
 };
 static const unsigned int mmc1_data1_pins[] = {
        /* D[0] */
-       72,
+       RCAR_GP_PIN(2, 8),
 };
 static const unsigned int mmc1_data1_mux[] = {
        MMC1_D0_MARK,
 };
 static const unsigned int mmc1_data4_pins[] = {
        /* D[0:3] */
-       72, 73, 74, 75,
+       RCAR_GP_PIN(2, 8), RCAR_GP_PIN(2, 9), RCAR_GP_PIN(2, 10),
+       RCAR_GP_PIN(2, 11),
 };
 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,
+       RCAR_GP_PIN(2, 8),  RCAR_GP_PIN(2, 9),  RCAR_GP_PIN(2, 10),
+       RCAR_GP_PIN(2, 11), RCAR_GP_PIN(2, 12), RCAR_GP_PIN(2, 13),
+       RCAR_GP_PIN(2, 16), RCAR_GP_PIN(2, 17),
 };
 static const unsigned int mmc1_data8_mux[] = {
        MMC1_D0_MARK, MMC1_D1_MARK, MMC1_D2_MARK, MMC1_D3_MARK,
@@ -1842,7 +1905,7 @@ static const unsigned int mmc1_data8_mux[] = {
 };
 static const unsigned int mmc1_ctrl_pins[] = {
        /* CMD, CLK */
-       68, 65,
+       RCAR_GP_PIN(2, 4), RCAR_GP_PIN(2, 1),
 };
 static const unsigned int mmc1_ctrl_mux[] = {
        MMC1_CMD_MARK, MMC1_CLK_MARK,
@@ -1850,84 +1913,84 @@ static const unsigned int mmc1_ctrl_mux[] = {
 /* - SCIF0 ------------------------------------------------------------------ */
 static const unsigned int scif0_data_pins[] = {
        /* RXD, TXD */
-       153, 152,
+       RCAR_GP_PIN(4, 25), RCAR_GP_PIN(4, 24),
 };
 static const unsigned int scif0_data_mux[] = {
        RX0_MARK, TX0_MARK,
 };
 static const unsigned int scif0_clk_pins[] = {
        /* SCK */
-       156,
+       RCAR_GP_PIN(4, 28),
 };
 static const unsigned int scif0_clk_mux[] = {
        SCK0_MARK,
 };
 static const unsigned int scif0_ctrl_pins[] = {
        /* RTS, CTS */
-       151, 150,
+       RCAR_GP_PIN(4, 23), RCAR_GP_PIN(4, 22),
 };
 static const unsigned int scif0_ctrl_mux[] = {
        RTS0_TANS_MARK, CTS0_MARK,
 };
 static const unsigned int scif0_data_b_pins[] = {
        /* RXD, TXD */
-       20, 19,
+       RCAR_GP_PIN(0, 20), RCAR_GP_PIN(0, 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,
+       RCAR_GP_PIN(1, 1),
 };
 static const unsigned int scif0_clk_b_mux[] = {
        SCK0_B_MARK,
 };
 static const unsigned int scif0_ctrl_b_pins[] = {
        /* RTS, CTS */
-       18, 11,
+       RCAR_GP_PIN(0, 18), RCAR_GP_PIN(0, 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,
+       RCAR_GP_PIN(4, 18), RCAR_GP_PIN(4, 19),
 };
 static const unsigned int scif0_data_c_mux[] = {
        RX0_C_MARK, TX0_C_MARK,
 };
 static const unsigned int scif0_clk_c_pins[] = {
        /* SCK */
-       145,
+       RCAR_GP_PIN(4, 17),
 };
 static const unsigned int scif0_clk_c_mux[] = {
        SCK0_C_MARK,
 };
 static const unsigned int scif0_ctrl_c_pins[] = {
        /* RTS, CTS */
-       149, 148,
+       RCAR_GP_PIN(4, 21), RCAR_GP_PIN(4, 20),
 };
 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,
+       RCAR_GP_PIN(1, 11), RCAR_GP_PIN(1, 10),
 };
 static const unsigned int scif0_data_d_mux[] = {
        RX0_D_MARK, TX0_D_MARK,
 };
 static const unsigned int scif0_clk_d_pins[] = {
        /* SCK */
-       50,
+       RCAR_GP_PIN(1, 18),
 };
 static const unsigned int scif0_clk_d_mux[] = {
        SCK0_D_MARK,
 };
 static const unsigned int scif0_ctrl_d_pins[] = {
        /* RTS, CTS */
-       51, 35,
+       RCAR_GP_PIN(1, 19), RCAR_GP_PIN(1, 3),
 };
 static const unsigned int scif0_ctrl_d_mux[] = {
        RTS0_D_TANS_D_MARK, CTS0_D_MARK,
@@ -1935,63 +1998,63 @@ static const unsigned int scif0_ctrl_d_mux[] = {
 /* - SCIF1 ------------------------------------------------------------------ */
 static const unsigned int scif1_data_pins[] = {
        /* RXD, TXD */
-       149, 148,
+       RCAR_GP_PIN(4, 21), RCAR_GP_PIN(4, 20),
 };
 static const unsigned int scif1_data_mux[] = {
        RX1_MARK, TX1_MARK,
 };
 static const unsigned int scif1_clk_pins[] = {
        /* SCK */
-       145,
+       RCAR_GP_PIN(4, 17),
 };
 static const unsigned int scif1_clk_mux[] = {
        SCK1_MARK,
 };
 static const unsigned int scif1_ctrl_pins[] = {
        /* RTS, CTS */
-       147, 146,
+       RCAR_GP_PIN(4, 19), RCAR_GP_PIN(4, 18),
 };
 static const unsigned int scif1_ctrl_mux[] = {
        RTS1_TANS_MARK, CTS1_MARK,
 };
 static const unsigned int scif1_data_b_pins[] = {
        /* RXD, TXD */
-       117, 114,
+       RCAR_GP_PIN(3, 21), RCAR_GP_PIN(3, 18),
 };
 static const unsigned int scif1_data_b_mux[] = {
        RX1_B_MARK, TX1_B_MARK,
 };
 static const unsigned int scif1_clk_b_pins[] = {
        /* SCK */
-       113,
+       RCAR_GP_PIN(3, 17),
 };
 static const unsigned int scif1_clk_b_mux[] = {
        SCK1_B_MARK,
 };
 static const unsigned int scif1_ctrl_b_pins[] = {
        /* RTS, CTS */
-       115, 116,
+       RCAR_GP_PIN(3, 19), RCAR_GP_PIN(3, 20),
 };
 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,
+       RCAR_GP_PIN(2, 3), RCAR_GP_PIN(2, 2),
 };
 static const unsigned int scif1_data_c_mux[] = {
        RX1_C_MARK, TX1_C_MARK,
 };
 static const unsigned int scif1_clk_c_pins[] = {
        /* SCK */
-       86,
+       RCAR_GP_PIN(2, 22),
 };
 static const unsigned int scif1_clk_c_mux[] = {
        SCK1_C_MARK,
 };
 static const unsigned int scif1_ctrl_c_pins[] = {
        /* RTS, CTS */
-       69, 68,
+       RCAR_GP_PIN(2, 5), RCAR_GP_PIN(2, 4),
 };
 static const unsigned int scif1_ctrl_c_mux[] = {
        RTS1_C_TANS_C_MARK, CTS1_C_MARK,
@@ -1999,63 +2062,63 @@ static const unsigned int scif1_ctrl_c_mux[] = {
 /* - SCIF2 ------------------------------------------------------------------ */
 static const unsigned int scif2_data_pins[] = {
        /* RXD, TXD */
-       106, 105,
+       RCAR_GP_PIN(3, 10), RCAR_GP_PIN(3, 9),
 };
 static const unsigned int scif2_data_mux[] = {
        RX2_MARK, TX2_MARK,
 };
 static const unsigned int scif2_clk_pins[] = {
        /* SCK */
-       107,
+       RCAR_GP_PIN(3, 11),
 };
 static const unsigned int scif2_clk_mux[] = {
        SCK2_MARK,
 };
 static const unsigned int scif2_data_b_pins[] = {
        /* RXD, TXD */
-       120, 119,
+       RCAR_GP_PIN(3, 24), RCAR_GP_PIN(3, 23),
 };
 static const unsigned int scif2_data_b_mux[] = {
        RX2_B_MARK, TX2_B_MARK,
 };
 static const unsigned int scif2_clk_b_pins[] = {
        /* SCK */
-       118,
+       RCAR_GP_PIN(3, 22),
 };
 static const unsigned int scif2_clk_b_mux[] = {
        SCK2_B_MARK,
 };
 static const unsigned int scif2_data_c_pins[] = {
        /* RXD, TXD */
-       33, 31,
+       RCAR_GP_PIN(1, 1), RCAR_GP_PIN(0, 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,
+       RCAR_GP_PIN(1, 0),
 };
 static const unsigned int scif2_clk_c_mux[] = {
        SCK2_C_MARK,
 };
 static const unsigned int scif2_data_d_pins[] = {
        /* RXD, TXD */
-       64, 62,
+       RCAR_GP_PIN(2, 0), RCAR_GP_PIN(1, 30),
 };
 static const unsigned int scif2_data_d_mux[] = {
        RX2_D_MARK, TX2_D_MARK,
 };
 static const unsigned int scif2_clk_d_pins[] = {
        /* SCK */
-       63,
+       RCAR_GP_PIN(1, 31),
 };
 static const unsigned int scif2_clk_d_mux[] = {
        SCK2_D_MARK,
 };
 static const unsigned int scif2_data_e_pins[] = {
        /* RXD, TXD */
-       20, 19,
+       RCAR_GP_PIN(0, 20), RCAR_GP_PIN(0, 19),
 };
 static const unsigned int scif2_data_e_mux[] = {
        RX2_E_MARK, TX2_E_MARK,
@@ -2063,14 +2126,14 @@ static const unsigned int scif2_data_e_mux[] = {
 /* - SCIF3 ------------------------------------------------------------------ */
 static const unsigned int scif3_data_pins[] = {
        /* RXD, TXD */
-       137, 136,
+       RCAR_GP_PIN(4, 9), RCAR_GP_PIN(4, 8),
 };
 static const unsigned int scif3_data_mux[] = {
        RX3_IRDA_RX_MARK, TX3_IRDA_TX_MARK,
 };
 static const unsigned int scif3_clk_pins[] = {
        /* SCK */
-       135,
+       RCAR_GP_PIN(4, 7),
 };
 static const unsigned int scif3_clk_mux[] = {
        SCK3_MARK,
@@ -2078,35 +2141,35 @@ static const unsigned int scif3_clk_mux[] = {
 
 static const unsigned int scif3_data_b_pins[] = {
        /* RXD, TXD */
-       64, 62,
+       RCAR_GP_PIN(2, 0), RCAR_GP_PIN(1, 30),
 };
 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,
+       RCAR_GP_PIN(0, 15), RCAR_GP_PIN(0, 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,
+       RCAR_GP_PIN(0, 30), RCAR_GP_PIN(0, 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,
+       RCAR_GP_PIN(1, 3), RCAR_GP_PIN(1, 2),
 };
 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,
+       RCAR_GP_PIN(1, 10),
 };
 static const unsigned int scif3_clk_e_mux[] = {
        SCK3_E_MARK,
@@ -2114,42 +2177,42 @@ static const unsigned int scif3_clk_e_mux[] = {
 /* - SCIF4 ------------------------------------------------------------------ */
 static const unsigned int scif4_data_pins[] = {
        /* RXD, TXD */
-       123, 122,
+       RCAR_GP_PIN(3, 27), RCAR_GP_PIN(3, 26),
 };
 static const unsigned int scif4_data_mux[] = {
        RX4_MARK, TX4_MARK,
 };
 static const unsigned int scif4_clk_pins[] = {
        /* SCK */
-       121,
+       RCAR_GP_PIN(3, 25),
 };
 static const unsigned int scif4_clk_mux[] = {
        SCK4_MARK,
 };
 static const unsigned int scif4_data_b_pins[] = {
        /* RXD, TXD */
-       111, 110,
+       RCAR_GP_PIN(3, 15), RCAR_GP_PIN(3, 14),
 };
 static const unsigned int scif4_data_b_mux[] = {
        RX4_B_MARK, TX4_B_MARK,
 };
 static const unsigned int scif4_clk_b_pins[] = {
        /* SCK */
-       112,
+       RCAR_GP_PIN(3, 16),
 };
 static const unsigned int scif4_clk_b_mux[] = {
        SCK4_B_MARK,
 };
 static const unsigned int scif4_data_c_pins[] = {
        /* RXD, TXD */
-       22, 21,
+       RCAR_GP_PIN(0, 22), RCAR_GP_PIN(0, 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,
+       RCAR_GP_PIN(2, 5), RCAR_GP_PIN(2, 4),
 };
 static const unsigned int scif4_data_d_mux[] = {
        RX4_D_MARK, TX4_D_MARK,
@@ -2157,56 +2220,56 @@ static const unsigned int scif4_data_d_mux[] = {
 /* - SCIF5 ------------------------------------------------------------------ */
 static const unsigned int scif5_data_pins[] = {
        /* RXD, TXD */
-       51, 50,
+       RCAR_GP_PIN(1, 19), RCAR_GP_PIN(1, 18),
 };
 static const unsigned int scif5_data_mux[] = {
        RX5_MARK, TX5_MARK,
 };
 static const unsigned int scif5_clk_pins[] = {
        /* SCK */
-       43,
+       RCAR_GP_PIN(1, 11),
 };
 static const unsigned int scif5_clk_mux[] = {
        SCK5_MARK,
 };
 static const unsigned int scif5_data_b_pins[] = {
        /* RXD, TXD */
-       18, 11,
+       RCAR_GP_PIN(0, 18), RCAR_GP_PIN(0, 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,
+       RCAR_GP_PIN(0, 19),
 };
 static const unsigned int scif5_clk_b_mux[] = {
        SCK5_B_MARK,
 };
 static const unsigned int scif5_data_c_pins[] = {
        /* RXD, TXD */
-       24, 23,
+       RCAR_GP_PIN(0, 24), RCAR_GP_PIN(0, 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,
+       RCAR_GP_PIN(0, 28),
 };
 static const unsigned int scif5_clk_c_mux[] = {
        SCK5_C_MARK,
 };
 static const unsigned int scif5_data_d_pins[] = {
        /* RXD, TXD */
-       8, 6,
+       RCAR_GP_PIN(0, 8), RCAR_GP_PIN(0, 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,
+       RCAR_GP_PIN(0, 7),
 };
 static const unsigned int scif5_clk_d_mux[] = {
        SCK5_D_MARK,
@@ -2214,35 +2277,36 @@ static const unsigned int scif5_clk_d_mux[] = {
 /* - SDHI0 ------------------------------------------------------------------ */
 static const unsigned int sdhi0_data1_pins[] = {
        /* D0 */
-       117,
+       RCAR_GP_PIN(3, 21),
 };
 static const unsigned int sdhi0_data1_mux[] = {
        SD0_DAT0_MARK,
 };
 static const unsigned int sdhi0_data4_pins[] = {
        /* D[0:3] */
-       117, 118, 119, 120,
+       RCAR_GP_PIN(3, 21), RCAR_GP_PIN(3, 22), RCAR_GP_PIN(3, 23),
+       RCAR_GP_PIN(3, 24),
 };
 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,
+       RCAR_GP_PIN(3, 18), RCAR_GP_PIN(3, 17),
 };
 static const unsigned int sdhi0_ctrl_mux[] = {
        SD0_CMD_MARK, SD0_CLK_MARK,
 };
 static const unsigned int sdhi0_cd_pins[] = {
        /* CD */
-       115,
+       RCAR_GP_PIN(3, 19),
 };
 static const unsigned int sdhi0_cd_mux[] = {
        SD0_CD_MARK,
 };
 static const unsigned int sdhi0_wp_pins[] = {
        /* WP */
-       116,
+       RCAR_GP_PIN(3, 20),
 };
 static const unsigned int sdhi0_wp_mux[] = {
        SD0_WP_MARK,
@@ -2250,35 +2314,36 @@ static const unsigned int sdhi0_wp_mux[] = {
 /* - SDHI1 ------------------------------------------------------------------ */
 static const unsigned int sdhi1_data1_pins[] = {
        /* D0 */
-       19,
+       RCAR_GP_PIN(0, 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,
+       RCAR_GP_PIN(0, 19), RCAR_GP_PIN(0, 20), RCAR_GP_PIN(0, 21),
+       RCAR_GP_PIN(0, 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,
+       RCAR_GP_PIN(0, 18), RCAR_GP_PIN(0, 17),
 };
 static const unsigned int sdhi1_ctrl_mux[] = {
        SD1_CMD_MARK, SD1_CLK_MARK,
 };
 static const unsigned int sdhi1_cd_pins[] = {
        /* CD */
-       10,
+       RCAR_GP_PIN(0, 10),
 };
 static const unsigned int sdhi1_cd_mux[] = {
        SD1_CD_MARK,
 };
 static const unsigned int sdhi1_wp_pins[] = {
        /* WP */
-       11,
+       RCAR_GP_PIN(0, 11),
 };
 static const unsigned int sdhi1_wp_mux[] = {
        SD1_WP_MARK,
@@ -2286,35 +2351,36 @@ static const unsigned int sdhi1_wp_mux[] = {
 /* - SDHI2 ------------------------------------------------------------------ */
 static const unsigned int sdhi2_data1_pins[] = {
        /* D0 */
-       97,
+       RCAR_GP_PIN(3, 1),
 };
 static const unsigned int sdhi2_data1_mux[] = {
        SD2_DAT0_MARK,
 };
 static const unsigned int sdhi2_data4_pins[] = {
        /* D[0:3] */
-       97, 98, 99, 100,
+       RCAR_GP_PIN(3, 1), RCAR_GP_PIN(3, 2), RCAR_GP_PIN(3, 3),
+       RCAR_GP_PIN(3, 4),
 };
 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,
+       RCAR_GP_PIN(3, 6), RCAR_GP_PIN(3, 5),
 };
 static const unsigned int sdhi2_ctrl_mux[] = {
        SD2_CMD_MARK, SD2_CLK_MARK,
 };
 static const unsigned int sdhi2_cd_pins[] = {
        /* CD */
-       103,
+       RCAR_GP_PIN(3, 7),
 };
 static const unsigned int sdhi2_cd_mux[] = {
        SD2_CD_MARK,
 };
 static const unsigned int sdhi2_wp_pins[] = {
        /* WP */
-       104,
+       RCAR_GP_PIN(3, 8),
 };
 static const unsigned int sdhi2_wp_mux[] = {
        SD2_WP_MARK,
@@ -2322,35 +2388,36 @@ static const unsigned int sdhi2_wp_mux[] = {
 /* - SDHI3 ------------------------------------------------------------------ */
 static const unsigned int sdhi3_data1_pins[] = {
        /* D0 */
-       50,
+       RCAR_GP_PIN(1, 18),
 };
 static const unsigned int sdhi3_data1_mux[] = {
        SD3_DAT0_MARK,
 };
 static const unsigned int sdhi3_data4_pins[] = {
        /* D[0:3] */
-       50, 51, 52, 53,
+       RCAR_GP_PIN(1, 18), RCAR_GP_PIN(1, 19), RCAR_GP_PIN(1, 20),
+       RCAR_GP_PIN(1, 21),
 };
 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,
+       RCAR_GP_PIN(1, 3), RCAR_GP_PIN(1, 2),
 };
 static const unsigned int sdhi3_ctrl_mux[] = {
        SD3_CMD_MARK, SD3_CLK_MARK,
 };
 static const unsigned int sdhi3_cd_pins[] = {
        /* CD */
-       62,
+       RCAR_GP_PIN(1, 30),
 };
 static const unsigned int sdhi3_cd_mux[] = {
        SD3_CD_MARK,
 };
 static const unsigned int sdhi3_wp_pins[] = {
        /* WP */
-       64,
+       RCAR_GP_PIN(2, 0),
 };
 static const unsigned int sdhi3_wp_mux[] = {
        SD3_WP_MARK,
@@ -2358,14 +2425,14 @@ static const unsigned int sdhi3_wp_mux[] = {
 /* - USB0 ------------------------------------------------------------------- */
 static const unsigned int usb0_pins[] = {
        /* PENC */
-       154,
+       RCAR_GP_PIN(4, 26),
 };
 static const unsigned int usb0_mux[] = {
        USB_PENC0_MARK,
 };
 static const unsigned int usb0_ovc_pins[] = {
        /* USB_OVC */
-       150
+       RCAR_GP_PIN(4, 22),
 };
 static const unsigned int usb0_ovc_mux[] = {
        USB_OVC0_MARK,
@@ -2373,14 +2440,14 @@ static const unsigned int usb0_ovc_mux[] = {
 /* - USB1 ------------------------------------------------------------------- */
 static const unsigned int usb1_pins[] = {
        /* PENC */
-       155,
+       RCAR_GP_PIN(4, 27),
 };
 static const unsigned int usb1_mux[] = {
        USB_PENC1_MARK,
 };
 static const unsigned int usb1_ovc_pins[] = {
        /* USB_OVC */
-       152,
+       RCAR_GP_PIN(4, 24),
 };
 static const unsigned int usb1_ovc_mux[] = {
        USB_OVC1_MARK,
@@ -2388,18 +2455,122 @@ static const unsigned int usb1_ovc_mux[] = {
 /* - USB2 ------------------------------------------------------------------- */
 static const unsigned int usb2_pins[] = {
        /* PENC */
-       156,
+       RCAR_GP_PIN(4, 28),
 };
 static const unsigned int usb2_mux[] = {
        USB_PENC2_MARK,
 };
 static const unsigned int usb2_ovc_pins[] = {
        /* USB_OVC */
-       125,
+       RCAR_GP_PIN(3, 29),
 };
 static const unsigned int usb2_ovc_mux[] = {
        USB_OVC2_MARK,
 };
+/* - VIN0 ------------------------------------------------------------------- */
+static const unsigned int vin0_data8_pins[] = {
+       /* D[0:7] */
+       RCAR_GP_PIN(2, 6),  RCAR_GP_PIN(2, 7),  RCAR_GP_PIN(2, 8),
+       RCAR_GP_PIN(2, 9),  RCAR_GP_PIN(2, 10), RCAR_GP_PIN(2, 11),
+       RCAR_GP_PIN(2, 12), RCAR_GP_PIN(2, 13),
+};
+static const unsigned int vin0_data8_mux[] = {
+       VI0_DATA0_VI0_B0_MARK, VI0_DATA1_VI0_B1_MARK, VI0_DATA2_VI0_B2_MARK,
+       VI0_DATA3_VI0_B3_MARK, VI0_DATA4_VI0_B4_MARK, VI0_DATA5_VI0_B5_MARK,
+       VI0_DATA6_VI0_B6_MARK, VI0_DATA7_VI0_B7_MARK,
+};
+static const unsigned int vin0_clk_pins[] = {
+       /* CLK */
+       RCAR_GP_PIN(2, 1),
+};
+static const unsigned int vin0_clk_mux[] = {
+       VI0_CLK_MARK,
+};
+static const unsigned int vin0_sync_pins[] = {
+       /* HSYNC, VSYNC */
+       RCAR_GP_PIN(2, 4), RCAR_GP_PIN(2, 5),
+};
+static const unsigned int vin0_sync_mux[] = {
+       VI0_HSYNC_MARK, VI0_VSYNC_MARK,
+};
+/* - VIN1 ------------------------------------------------------------------- */
+static const unsigned int vin1_data8_pins[] = {
+       /* D[0:7] */
+       RCAR_GP_PIN(3, 1), RCAR_GP_PIN(3, 2), RCAR_GP_PIN(3, 3),
+       RCAR_GP_PIN(3, 4), RCAR_GP_PIN(3, 5), RCAR_GP_PIN(3, 6),
+       RCAR_GP_PIN(3, 7), RCAR_GP_PIN(3, 8),
+};
+static const unsigned int vin1_data8_mux[] = {
+       VI1_DATA0_VI1_B0_MARK, VI1_DATA1_VI1_B1_MARK, VI1_DATA2_VI1_B2_MARK,
+       VI1_DATA3_VI1_B3_MARK, VI1_DATA4_VI1_B4_MARK, VI1_DATA5_VI1_B5_MARK,
+       VI1_DATA6_VI1_B6_MARK, VI1_DATA7_VI1_B7_MARK,
+};
+static const unsigned int vin1_clk_pins[] = {
+       /* CLK */
+       RCAR_GP_PIN(2, 30),
+};
+static const unsigned int vin1_clk_mux[] = {
+       VI1_CLK_MARK,
+};
+static const unsigned int vin1_sync_pins[] = {
+       /* HSYNC, VSYNC */
+       RCAR_GP_PIN(2, 31), RCAR_GP_PIN(3, 0),
+};
+static const unsigned int vin1_sync_mux[] = {
+       VI1_HSYNC_MARK, VI1_VSYNC_MARK,
+};
+/* - VIN2 ------------------------------------------------------------------- */
+static const unsigned int vin2_data8_pins[] = {
+       /* D[0:7] */
+       RCAR_GP_PIN(1, 2),  RCAR_GP_PIN(1, 3),  RCAR_GP_PIN(1, 10),
+       RCAR_GP_PIN(1, 11), RCAR_GP_PIN(1, 18), RCAR_GP_PIN(1, 19),
+       RCAR_GP_PIN(1, 31), RCAR_GP_PIN(2, 0),
+};
+static const unsigned int vin2_data8_mux[] = {
+       VI2_DATA0_VI2_B0_MARK, VI2_DATA1_VI2_B1_MARK, VI2_DATA2_VI2_B2_MARK,
+       VI2_DATA3_VI2_B3_MARK, VI2_DATA4_VI2_B4_MARK, VI2_DATA5_VI2_B5_MARK,
+       VI2_DATA6_VI2_B6_MARK, VI2_DATA7_VI2_B7_MARK,
+};
+static const unsigned int vin2_clk_pins[] = {
+       /* CLK */
+       RCAR_GP_PIN(1, 30),
+};
+static const unsigned int vin2_clk_mux[] = {
+       VI2_CLK_MARK,
+};
+static const unsigned int vin2_sync_pins[] = {
+       /* HSYNC, VSYNC */
+       RCAR_GP_PIN(1, 28), RCAR_GP_PIN(1, 29),
+};
+static const unsigned int vin2_sync_mux[] = {
+       VI2_HSYNC_MARK, VI2_VSYNC_MARK,
+};
+/* - VIN3 ------------------------------------------------------------------- */
+static const unsigned int vin3_data8_pins[] = {
+       /* D[0:7] */
+       RCAR_GP_PIN(3, 9),  RCAR_GP_PIN(3, 10), RCAR_GP_PIN(3, 11),
+       RCAR_GP_PIN(3, 12), RCAR_GP_PIN(3, 13), RCAR_GP_PIN(3, 14),
+       RCAR_GP_PIN(3, 15), RCAR_GP_PIN(3, 16),
+};
+static const unsigned int vin3_data8_mux[] = {
+       VI3_DATA0_MARK, VI3_DATA1_MARK, VI3_DATA2_MARK,
+       VI3_DATA3_MARK, VI3_DATA4_MARK, VI3_DATA5_MARK,
+       VI3_DATA6_MARK, VI3_DATA7_MARK,
+};
+static const unsigned int vin3_clk_pins[] = {
+       /* CLK */
+       RCAR_GP_PIN(2, 31),
+};
+static const unsigned int vin3_clk_mux[] = {
+       VI3_CLK_MARK,
+};
+static const unsigned int vin3_sync_pins[] = {
+       /* HSYNC, VSYNC */
+       RCAR_GP_PIN(1, 28), RCAR_GP_PIN(1, 29),
+};
+static const unsigned int vin3_sync_mux[] = {
+       VI3_HSYNC_MARK, VI3_VSYNC_MARK,
+};
 
 static const struct sh_pfc_pin_group pinmux_groups[] = {
        SH_PFC_PIN_GROUP(du0_rgb666),
@@ -2419,6 +2590,9 @@ static const struct sh_pfc_pin_group pinmux_groups[] = {
        SH_PFC_PIN_GROUP(du1_sync_1),
        SH_PFC_PIN_GROUP(du1_oddf),
        SH_PFC_PIN_GROUP(du1_cde),
+       SH_PFC_PIN_GROUP(ether_rmii),
+       SH_PFC_PIN_GROUP(ether_link),
+       SH_PFC_PIN_GROUP(ether_magic),
        SH_PFC_PIN_GROUP(hspi0),
        SH_PFC_PIN_GROUP(hspi1),
        SH_PFC_PIN_GROUP(hspi1_b),
@@ -2527,6 +2701,18 @@ static const struct sh_pfc_pin_group pinmux_groups[] = {
        SH_PFC_PIN_GROUP(usb1_ovc),
        SH_PFC_PIN_GROUP(usb2),
        SH_PFC_PIN_GROUP(usb2_ovc),
+       SH_PFC_PIN_GROUP(vin0_data8),
+       SH_PFC_PIN_GROUP(vin0_clk),
+       SH_PFC_PIN_GROUP(vin0_sync),
+       SH_PFC_PIN_GROUP(vin1_data8),
+       SH_PFC_PIN_GROUP(vin1_clk),
+       SH_PFC_PIN_GROUP(vin1_sync),
+       SH_PFC_PIN_GROUP(vin2_data8),
+       SH_PFC_PIN_GROUP(vin2_clk),
+       SH_PFC_PIN_GROUP(vin2_sync),
+       SH_PFC_PIN_GROUP(vin3_data8),
+       SH_PFC_PIN_GROUP(vin3_clk),
+       SH_PFC_PIN_GROUP(vin3_sync),
 };
 
 static const char * const du0_groups[] = {
@@ -2552,6 +2738,12 @@ static const char * const du1_groups[] = {
        "du1_cde",
 };
 
+static const char * const ether_groups[] = {
+       "ether_rmii",
+       "ether_link",
+       "ether_magic",
+};
+
 static const char * const hspi0_groups[] = {
        "hspi0",
 };
@@ -2720,9 +2912,34 @@ static const char * const usb2_groups[] = {
        "usb2_ovc",
 };
 
+static const char * const vin0_groups[] = {
+       "vin0_data8",
+       "vin0_clk",
+       "vin0_sync",
+};
+
+static const char * const vin1_groups[] = {
+       "vin1_data8",
+       "vin1_clk",
+       "vin1_sync",
+};
+
+static const char * const vin2_groups[] = {
+       "vin2_data8",
+       "vin2_clk",
+       "vin2_sync",
+};
+
+static const char * const vin3_groups[] = {
+       "vin3_data8",
+       "vin3_clk",
+       "vin3_sync",
+};
+
 static const struct sh_pfc_function pinmux_functions[] = {
        SH_PFC_FUNCTION(du0),
        SH_PFC_FUNCTION(du1),
+       SH_PFC_FUNCTION(ether),
        SH_PFC_FUNCTION(hspi0),
        SH_PFC_FUNCTION(hspi1),
        SH_PFC_FUNCTION(hspi2),
@@ -2743,6 +2960,10 @@ static const struct sh_pfc_function pinmux_functions[] = {
        SH_PFC_FUNCTION(usb0),
        SH_PFC_FUNCTION(usb1),
        SH_PFC_FUNCTION(usb2),
+       SH_PFC_FUNCTION(vin0),
+       SH_PFC_FUNCTION(vin1),
+       SH_PFC_FUNCTION(vin2),
+       SH_PFC_FUNCTION(vin3),
 };
 
 static const struct pinmux_cfg_reg pinmux_config_regs[] = {
@@ -3547,7 +3768,7 @@ static const struct pinmux_cfg_reg pinmux_config_regs[] = {
            /* SEL_SCIF [2] */
            FN_SEL_SCIF_0, FN_SEL_SCIF_1, FN_SEL_SCIF_2, FN_SEL_SCIF_3,
            /* SEL_CANCLK [2] */
-           FN_SEL_CANCLK_0, FN_SEL_CANCLK_1, FN_SEL_CANCLK_2,
+           FN_SEL_CANCLK_0, FN_SEL_CANCLK_1, FN_SEL_CANCLK_2, 0,
            /* SEL_CAN0 [1] */
            FN_SEL_CAN0_0, FN_SEL_CAN0_1,
            /* SEL_HSCIF1 [1] */
diff --git a/drivers/pinctrl/sh-pfc/pfc-r8a7790.c b/drivers/pinctrl/sh-pfc/pfc-r8a7790.c
new file mode 100644 (file)
index 0000000..85d77a4
--- /dev/null
@@ -0,0 +1,3835 @@
+/*
+ * R8A7790 processor support
+ *
+ * Copyright (C) 2013  Renesas Electronics Corporation
+ * Copyright (C) 2013  Magnus Damm
+ * Copyright (C) 2012  Renesas Solutions Corp.
+ * 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/kernel.h>
+#include <linux/platform_data/gpio-rcar.h>
+
+#include "core.h"
+#include "sh_pfc.h"
+
+#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_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)
+
+#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, \
+                                                         FN_##ipsr, FN_##fn)
+
+enum {
+       PINMUX_RESERVED = 0,
+
+       PINMUX_DATA_BEGIN,
+       GP_ALL(DATA),
+       PINMUX_DATA_END,
+
+       PINMUX_FUNCTION_BEGIN,
+       GP_ALL(FN),
+
+       /* GPSR0 */
+       FN_IP0_2_0, FN_IP0_5_3, FN_IP0_8_6, FN_IP0_11_9, FN_IP0_15_12,
+       FN_IP0_19_16, FN_IP0_22_20, FN_IP0_26_23, FN_IP0_30_27,
+       FN_IP1_3_0, FN_IP1_7_4, FN_IP1_11_8, FN_IP1_14_12,
+       FN_IP1_17_15, FN_IP1_21_18, FN_IP1_25_22, FN_IP1_27_26,
+       FN_IP1_29_28, FN_IP2_2_0, FN_IP2_5_3, FN_IP2_8_6, FN_IP2_11_9,
+       FN_IP2_14_12, FN_IP2_17_15, FN_IP2_21_18, FN_IP2_25_22,
+       FN_IP2_28_26, FN_IP3_3_0, FN_IP3_7_4, FN_IP3_11_8,
+       FN_IP3_14_12, FN_IP3_17_15,
+
+       /* GPSR1 */
+       FN_IP3_19_18, FN_IP3_22_20, FN_IP3_25_23, FN_IP3_28_26,
+       FN_IP3_31_29, FN_IP4_2_0, FN_IP4_5_3, FN_IP4_8_6, FN_IP4_11_9,
+       FN_IP4_14_12, FN_IP4_17_15, FN_IP4_20_18, FN_IP4_23_21,
+       FN_IP4_26_24, FN_IP4_29_27, FN_IP5_2_0, FN_IP5_5_3, FN_IP5_9_6,
+       FN_IP5_12_10, FN_IP5_14_13, FN_IP5_17_15, FN_IP5_20_18,
+       FN_IP5_23_21, FN_IP5_26_24, FN_IP5_29_27, FN_IP6_2_0,
+       FN_IP6_5_3, FN_IP6_8_6, FN_IP6_10_9, FN_IP6_13_11,
+
+       /* GPSR2 */
+       FN_IP7_28_27, FN_IP7_30_29, FN_IP8_1_0, FN_IP8_3_2, FN_IP8_5_4,
+       FN_IP8_7_6, FN_IP8_9_8, FN_IP8_11_10, FN_IP8_13_12, FN_IP8_15_14,
+       FN_IP8_17_16, FN_IP8_19_18, FN_IP8_21_20, FN_IP8_23_22,
+       FN_IP8_25_24, FN_IP8_26, FN_IP8_27, FN_VI1_DATA7_VI1_B7,
+       FN_IP6_16_14, FN_IP6_19_17, FN_IP6_22_20, FN_IP6_25_23,
+       FN_IP6_28_26, FN_IP6_31_29, FN_IP7_2_0, FN_IP7_5_3, FN_IP7_7_6,
+       FN_IP7_9_8, FN_IP7_12_10, FN_IP7_15_13,
+
+       /* GPSR3 */
+       FN_IP8_28, FN_IP8_30_29, FN_IP9_1_0, FN_IP9_3_2, FN_IP9_5_4,
+       FN_IP9_7_6, FN_IP9_11_8, FN_IP9_15_12, FN_IP9_17_16, FN_IP9_19_18,
+       FN_IP9_21_20, FN_IP9_23_22, FN_IP9_25_24, FN_IP9_27_26,
+       FN_IP9_31_28, FN_IP10_3_0, FN_IP10_6_4, FN_IP10_10_7, FN_IP10_14_11,
+       FN_IP10_18_15, FN_IP10_22_19, FN_IP10_25_23, FN_IP10_29_26,
+       FN_IP11_3_0, FN_IP11_4, FN_IP11_6_5, FN_IP11_8_7, FN_IP11_10_9,
+       FN_IP11_12_11, FN_IP11_14_13, FN_IP11_17_15, FN_IP11_21_18,
+
+       /* GPSR4 */
+       FN_IP11_23_22, FN_IP11_26_24, FN_IP11_29_27, FN_IP11_31_30,
+       FN_IP12_1_0, FN_IP12_3_2, FN_IP12_5_4, FN_IP12_7_6, FN_IP12_10_8,
+       FN_IP12_13_11, FN_IP12_16_14, FN_IP12_19_17, FN_IP12_22_20,
+       FN_IP12_24_23, FN_IP12_27_25, FN_IP12_30_28, FN_IP13_2_0,
+       FN_IP13_6_3, FN_IP13_9_7, FN_IP13_12_10, FN_IP13_15_13,
+       FN_IP13_18_16, FN_IP13_22_19, FN_IP13_25_23, FN_IP13_28_26,
+       FN_IP13_30_29, FN_IP14_2_0, FN_IP14_5_3, FN_IP14_8_6, FN_IP14_11_9,
+       FN_IP14_15_12, FN_IP14_18_16,
+
+       /* GPSR5 */
+       FN_IP14_21_19, FN_IP14_24_22, FN_IP14_27_25, FN_IP14_30_28,
+       FN_IP15_2_0, FN_IP15_5_3, FN_IP15_8_6, FN_IP15_11_9, FN_IP15_13_12,
+       FN_IP15_15_14, FN_IP15_17_16, FN_IP15_19_18, FN_IP15_22_20,
+       FN_IP15_25_23, FN_IP15_27_26, FN_IP15_29_28, FN_IP16_2_0,
+       FN_IP16_5_3, FN_USB0_PWEN, FN_USB0_OVC_VBUS, FN_IP16_6, FN_IP16_7,
+       FN_USB2_PWEN, FN_USB2_OVC, FN_AVS1, FN_AVS2, FN_DU_DOTCLKIN0,
+       FN_IP7_26_25, FN_DU_DOTCLKIN2, FN_IP7_18_16, FN_IP7_21_19, FN_IP7_24_22,
+
+       /* IPSR0 */
+       FN_D0, FN_MSIOF3_SCK_B, FN_VI3_DATA0, FN_VI0_G4, FN_VI0_G4_B,
+       FN_D1, FN_MSIOF3_SYNC_B, FN_VI3_DATA1, FN_VI0_G5,
+       FN_VI0_G5_B, FN_D2, FN_MSIOF3_RXD_B, FN_VI3_DATA2,
+       FN_VI0_G6, FN_VI0_G6_B, FN_D3, FN_MSIOF3_TXD_B,
+       FN_VI3_DATA3, FN_VI0_G7, FN_VI0_G7_B, FN_D4,
+       FN_SCIFB1_RXD_F, FN_SCIFB0_RXD_C, FN_VI3_DATA4,
+       FN_VI0_R0, FN_VI0_R0_B, FN_RX0_B, FN_D5,
+       FN_SCIFB1_TXD_F, FN_SCIFB0_TXD_C, FN_VI3_DATA5,
+       FN_VI0_R1, FN_VI0_R1_B, FN_TX0_B, FN_D6,
+       FN_SCL2_C, FN_VI3_DATA6, FN_VI0_R2, FN_VI0_R2_B,
+       FN_SCL2_CIS_C, FN_D7, FN_AD_DI_B, FN_SDA2_C,
+       FN_VI3_DATA7, FN_VI0_R3, FN_VI0_R3_B, FN_SDA2_CIS_C,
+       FN_D8, FN_SCIFA1_SCK_C, FN_AVB_TXD0, FN_MII_TXD0,
+       FN_VI0_G0, FN_VI0_G0_B, FN_VI2_DATA0_VI2_B0,
+
+       /* IPSR1 */
+       FN_D9, FN_SCIFA1_RXD_C, FN_AVB_TXD1, FN_MII_TXD1,
+       FN_VI0_G1, FN_VI0_G1_B, FN_VI2_DATA1_VI2_B1, FN_D10,
+       FN_SCIFA1_TXD_C, FN_AVB_TXD2, FN_MII_TXD2,
+       FN_VI0_G2, FN_VI0_G2_B, FN_VI2_DATA2_VI2_B2, FN_D11,
+       FN_SCIFA1_CTS_N_C, FN_AVB_TXD3, FN_MII_TXD3,
+       FN_VI0_G3, FN_VI0_G3_B, FN_VI2_DATA3_VI2_B3,
+       FN_D12, FN_SCIFA1_RTS_N_C, FN_AVB_TXD4,
+       FN_VI0_HSYNC_N, FN_VI0_HSYNC_N_B, FN_VI2_DATA4_VI2_B4,
+       FN_D13, FN_AVB_TXD5, FN_VI0_VSYNC_N,
+       FN_VI0_VSYNC_N_B, FN_VI2_DATA5_VI2_B5, FN_D14,
+       FN_SCIFB1_RXD_C, FN_AVB_TXD6, FN_RX1_B,
+       FN_VI0_CLKENB, FN_VI0_CLKENB_B, FN_VI2_DATA6_VI2_B6,
+       FN_D15, FN_SCIFB1_TXD_C, FN_AVB_TXD7, FN_TX1_B,
+       FN_VI0_FIELD, FN_VI0_FIELD_B, FN_VI2_DATA7_VI2_B7,
+       FN_A0, FN_PWM3, FN_A1, FN_PWM4,
+
+       /* IPSR2 */
+       FN_A2, FN_PWM5, FN_MSIOF1_SS1_B, FN_A3,
+       FN_PWM6, FN_MSIOF1_SS2_B, FN_A4, FN_MSIOF1_TXD_B,
+       FN_TPU0TO0, FN_A5, FN_SCIFA1_TXD_B, FN_TPU0TO1,
+       FN_A6, FN_SCIFA1_RTS_N_B, FN_TPU0TO2, FN_A7,
+       FN_SCIFA1_SCK_B, FN_AUDIO_CLKOUT_B, FN_TPU0TO3,
+       FN_A8, FN_SCIFA1_RXD_B, FN_SSI_SCK5_B, FN_VI0_R4,
+       FN_VI0_R4_B, FN_SCIFB2_RXD_C, FN_VI2_DATA0_VI2_B0_B,
+       FN_A9, FN_SCIFA1_CTS_N_B, FN_SSI_WS5_B, FN_VI0_R5,
+       FN_VI0_R5_B, FN_SCIFB2_TXD_C, FN_VI2_DATA1_VI2_B1_B,
+       FN_A10, FN_SSI_SDATA5_B, FN_MSIOF2_SYNC, FN_VI0_R6,
+       FN_VI0_R6_B, FN_VI2_DATA2_VI2_B2_B,
+
+       /* IPSR3 */
+       FN_A11, FN_SCIFB2_CTS_N_B, FN_MSIOF2_SCK, FN_VI1_R0,
+       FN_VI1_R0_B, FN_VI2_G0, FN_VI2_DATA3_VI2_B3_B,
+       FN_A12, FN_SCIFB2_RXD_B, FN_MSIOF2_TXD, FN_VI1_R1,
+       FN_VI1_R1_B, FN_VI2_G1, FN_VI2_DATA4_VI2_B4_B,
+       FN_A13, FN_SCIFB2_RTS_N_B, FN_EX_WAIT2,
+       FN_MSIOF2_RXD, FN_VI1_R2, FN_VI1_R2_B, FN_VI2_G2,
+       FN_VI2_DATA5_VI2_B5_B, FN_A14, FN_SCIFB2_TXD_B,
+       FN_ATACS11_N, FN_MSIOF2_SS1, FN_A15, FN_SCIFB2_SCK_B,
+       FN_ATARD1_N, FN_MSIOF2_SS2, FN_A16, FN_ATAWR1_N,
+       FN_A17, FN_AD_DO_B, FN_ATADIR1_N, FN_A18,
+       FN_AD_CLK_B, FN_ATAG1_N, FN_A19, FN_AD_NCS_N_B,
+       FN_ATACS01_N, FN_EX_WAIT0_B, FN_A20, FN_SPCLK,
+       FN_VI1_R3, FN_VI1_R3_B, FN_VI2_G4,
+
+       /* IPSR4 */
+       FN_A21, FN_MOSI_IO0, FN_VI1_R4, FN_VI1_R4_B, FN_VI2_G5,
+       FN_A22, FN_MISO_IO1, FN_VI1_R5, FN_VI1_R5_B,
+       FN_VI2_G6, FN_A23, FN_IO2, FN_VI1_G7,
+       FN_VI1_G7_B, FN_VI2_G7, FN_A24, FN_IO3,
+       FN_VI1_R7, FN_VI1_R7_B, FN_VI2_CLKENB,
+       FN_VI2_CLKENB_B, FN_A25, FN_SSL, FN_VI1_G6,
+       FN_VI1_G6_B, FN_VI2_FIELD, FN_VI2_FIELD_B, FN_CS0_N,
+       FN_VI1_R6, FN_VI1_R6_B, FN_VI2_G3, FN_MSIOF0_SS2_B,
+       FN_CS1_N_A26, FN_SPEEDIN, FN_VI0_R7, FN_VI0_R7_B,
+       FN_VI2_CLK, FN_VI2_CLK_B, FN_EX_CS0_N, FN_HRX1_B,
+       FN_VI1_G5, FN_VI1_G5_B, FN_VI2_R0, FN_HTX0_B,
+       FN_MSIOF0_SS1_B, FN_EX_CS1_N, FN_GPS_CLK,
+       FN_HCTS1_N_B, FN_VI1_FIELD, FN_VI1_FIELD_B,
+       FN_VI2_R1, FN_EX_CS2_N, FN_GPS_SIGN, FN_HRTS1_N_B,
+       FN_VI3_CLKENB, FN_VI1_G0, FN_VI1_G0_B, FN_VI2_R2,
+
+       /* IPSR5 */
+       FN_EX_CS3_N, FN_GPS_MAG, FN_VI3_FIELD, FN_VI1_G1, FN_VI1_G1_B,
+       FN_VI2_R3, FN_EX_CS4_N, FN_MSIOF1_SCK_B, FN_VI3_HSYNC_N,
+       FN_VI2_HSYNC_N, FN_SCL1, FN_VI2_HSYNC_N_B,
+       FN_INTC_EN0_N, FN_SCL1_CIS, FN_EX_CS5_N, FN_CAN0_RX,
+       FN_MSIOF1_RXD_B, FN_VI3_VSYNC_N, FN_VI1_G2,
+       FN_VI1_G2_B, FN_VI2_R4, FN_SDA1, FN_INTC_EN1_N,
+       FN_SDA1_CIS, FN_BS_N, FN_IETX, FN_HTX1_B,
+       FN_CAN1_TX, FN_DRACK0, FN_IETX_C, FN_RD_N,
+       FN_CAN0_TX, FN_SCIFA0_SCK_B, FN_RD_WR_N, FN_VI1_G3,
+       FN_VI1_G3_B, FN_VI2_R5, FN_SCIFA0_RXD_B,
+       FN_INTC_IRQ4_N, FN_WE0_N, FN_IECLK, FN_CAN_CLK,
+       FN_VI2_VSYNC_N, FN_SCIFA0_TXD_B, FN_VI2_VSYNC_N_B,
+       FN_WE1_N, FN_IERX, FN_CAN1_RX, FN_VI1_G4,
+       FN_VI1_G4_B, FN_VI2_R6, FN_SCIFA0_CTS_N_B,
+       FN_IERX_C, FN_EX_WAIT0, FN_IRQ3, FN_INTC_IRQ3_N,
+       FN_VI3_CLK, FN_SCIFA0_RTS_N_B, FN_HRX0_B,
+       FN_MSIOF0_SCK_B, FN_DREQ0_N, FN_VI1_HSYNC_N,
+       FN_VI1_HSYNC_N_B, FN_VI2_R7, FN_SSI_SCK78_C,
+       FN_SSI_WS78_B,
+
+       /* IPSR6 */
+       FN_DACK0, FN_IRQ0, FN_INTC_IRQ0_N, FN_SSI_SCK6_B,
+       FN_VI1_VSYNC_N, FN_VI1_VSYNC_N_B, FN_SSI_WS78_C,
+       FN_DREQ1_N, FN_VI1_CLKENB, FN_VI1_CLKENB_B,
+       FN_SSI_SDATA7_C, FN_SSI_SCK78_B, FN_DACK1, FN_IRQ1,
+       FN_INTC_IRQ1_N, FN_SSI_WS6_B, FN_SSI_SDATA8_C,
+       FN_DREQ2_N, FN_HSCK1_B, FN_HCTS0_N_B,
+       FN_MSIOF0_TXD_B, FN_DACK2, FN_IRQ2, FN_INTC_IRQ2_N,
+       FN_SSI_SDATA6_B, FN_HRTS0_N_B, FN_MSIOF0_RXD_B,
+       FN_ETH_CRS_DV, FN_RMII_CRS_DV, FN_STP_ISCLK_0_B,
+       FN_TS_SDEN0_D, FN_GLO_Q0_C, FN_SCL2_E,
+       FN_SCL2_CIS_E, FN_ETH_RX_ER, FN_RMII_RX_ER,
+       FN_STP_ISD_0_B, FN_TS_SPSYNC0_D, FN_GLO_Q1_C,
+       FN_SDA2_E, FN_SDA2_CIS_E, FN_ETH_RXD0, FN_RMII_RXD0,
+       FN_STP_ISEN_0_B, FN_TS_SDAT0_D, FN_GLO_I0_C,
+       FN_SCIFB1_SCK_G, FN_SCK1_E, FN_ETH_RXD1,
+       FN_RMII_RXD1, FN_HRX0_E, FN_STP_ISSYNC_0_B,
+       FN_TS_SCK0_D, FN_GLO_I1_C, FN_SCIFB1_RXD_G,
+       FN_RX1_E, FN_ETH_LINK, FN_RMII_LINK, FN_HTX0_E,
+       FN_STP_IVCXO27_0_B, FN_SCIFB1_TXD_G, FN_TX1_E,
+       FN_ETH_REF_CLK, FN_RMII_REF_CLK, FN_HCTS0_N_E,
+       FN_STP_IVCXO27_1_B, FN_HRX0_F,
+
+       /* IPSR7 */
+       FN_ETH_MDIO, FN_RMII_MDIO, FN_HRTS0_N_E,
+       FN_SIM0_D_C, FN_HCTS0_N_F, FN_ETH_TXD1,
+       FN_RMII_TXD1, FN_HTX0_F, FN_BPFCLK_G, FN_RDS_CLK_F,
+       FN_ETH_TX_EN, FN_RMII_TX_EN, FN_SIM0_CLK_C,
+       FN_HRTS0_N_F, FN_ETH_MAGIC, FN_RMII_MAGIC,
+       FN_SIM0_RST_C, FN_ETH_TXD0, FN_RMII_TXD0,
+       FN_STP_ISCLK_1_B, FN_TS_SDEN1_C, FN_GLO_SCLK_C,
+       FN_ETH_MDC, FN_RMII_MDC, FN_STP_ISD_1_B,
+       FN_TS_SPSYNC1_C, FN_GLO_SDATA_C, FN_PWM0,
+       FN_SCIFA2_SCK_C, FN_STP_ISEN_1_B, FN_TS_SDAT1_C,
+       FN_GLO_SS_C, FN_PWM1, FN_SCIFA2_TXD_C,
+       FN_STP_ISSYNC_1_B, FN_TS_SCK1_C, FN_GLO_RFON_C,
+       FN_PCMOE_N, FN_PWM2, FN_PWMFSW0, FN_SCIFA2_RXD_C,
+       FN_PCMWE_N, FN_IECLK_C, FN_DU1_DOTCLKIN,
+       FN_AUDIO_CLKC, FN_AUDIO_CLKOUT_C, FN_VI0_CLK,
+       FN_ATACS00_N, FN_AVB_RXD1, FN_MII_RXD1,
+       FN_VI0_DATA0_VI0_B0, FN_ATACS10_N, FN_AVB_RXD2,
+       FN_MII_RXD2,
+
+       /* IPSR8 */
+       FN_VI0_DATA1_VI0_B1, FN_ATARD0_N, FN_AVB_RXD3,
+       FN_MII_RXD3, FN_VI0_DATA2_VI0_B2, FN_ATAWR0_N,
+       FN_AVB_RXD4, FN_VI0_DATA3_VI0_B3, FN_ATADIR0_N,
+       FN_AVB_RXD5, FN_VI0_DATA4_VI0_B4, FN_ATAG0_N,
+       FN_AVB_RXD6, FN_VI0_DATA5_VI0_B5, FN_EX_WAIT1,
+       FN_AVB_RXD7, FN_VI0_DATA6_VI0_B6, FN_AVB_RX_ER,
+       FN_MII_RX_ER, FN_VI0_DATA7_VI0_B7, FN_AVB_RX_CLK,
+       FN_MII_RX_CLK, FN_VI1_CLK, FN_AVB_RX_DV,
+       FN_MII_RX_DV, FN_VI1_DATA0_VI1_B0, FN_SCIFA1_SCK_D,
+       FN_AVB_CRS, FN_MII_CRS, FN_VI1_DATA1_VI1_B1,
+       FN_SCIFA1_RXD_D, FN_AVB_MDC, FN_MII_MDC,
+       FN_VI1_DATA2_VI1_B2, FN_SCIFA1_TXD_D, FN_AVB_MDIO,
+       FN_MII_MDIO, FN_VI1_DATA3_VI1_B3, FN_SCIFA1_CTS_N_D,
+       FN_AVB_GTX_CLK, FN_VI1_DATA4_VI1_B4, FN_SCIFA1_RTS_N_D,
+       FN_AVB_MAGIC, FN_MII_MAGIC, FN_VI1_DATA5_VI1_B5,
+       FN_AVB_PHY_INT, FN_VI1_DATA6_VI1_B6, FN_AVB_GTXREFCLK,
+       FN_SD0_CLK, FN_VI1_DATA0_VI1_B0_B, FN_SD0_CMD,
+       FN_SCIFB1_SCK_B, FN_VI1_DATA1_VI1_B1_B,
+
+       /* IPSR9 */
+       FN_SD0_DAT0, FN_SCIFB1_RXD_B, FN_VI1_DATA2_VI1_B2_B,
+       FN_SD0_DAT1, FN_SCIFB1_TXD_B, FN_VI1_DATA3_VI1_B3_B,
+       FN_SD0_DAT2, FN_SCIFB1_CTS_N_B, FN_VI1_DATA4_VI1_B4_B,
+       FN_SD0_DAT3, FN_SCIFB1_RTS_N_B, FN_VI1_DATA5_VI1_B5_B,
+       FN_SD0_CD, FN_MMC0_D6, FN_TS_SDEN0_B, FN_USB0_EXTP,
+       FN_GLO_SCLK, FN_VI1_DATA6_VI1_B6_B, FN_SCL1_B,
+       FN_SCL1_CIS_B, FN_VI2_DATA6_VI2_B6_B, FN_SD0_WP,
+       FN_MMC0_D7, FN_TS_SPSYNC0_B, FN_USB0_IDIN,
+       FN_GLO_SDATA, FN_VI1_DATA7_VI1_B7_B, FN_SDA1_B,
+       FN_SDA1_CIS_B, FN_VI2_DATA7_VI2_B7_B, FN_SD1_CLK,
+       FN_AVB_TX_EN, FN_MII_TX_EN, FN_SD1_CMD,
+       FN_AVB_TX_ER, FN_MII_TX_ER, FN_SCIFB0_SCK_B,
+       FN_SD1_DAT0, FN_AVB_TX_CLK, FN_MII_TX_CLK,
+       FN_SCIFB0_RXD_B, FN_SD1_DAT1, FN_AVB_LINK,
+       FN_MII_LINK, FN_SCIFB0_TXD_B, FN_SD1_DAT2,
+       FN_AVB_COL, FN_MII_COL, FN_SCIFB0_CTS_N_B,
+       FN_SD1_DAT3, FN_AVB_RXD0, FN_MII_RXD0,
+       FN_SCIFB0_RTS_N_B, FN_SD1_CD, FN_MMC1_D6,
+       FN_TS_SDEN1, FN_USB1_EXTP, FN_GLO_SS, FN_VI0_CLK_B,
+       FN_SCL2_D, FN_SCL2_CIS_D, FN_SIM0_CLK_B,
+       FN_VI3_CLK_B,
+
+       /* IPSR10 */
+       FN_SD1_WP, FN_MMC1_D7, FN_TS_SPSYNC1, FN_USB1_IDIN,
+       FN_GLO_RFON, FN_VI1_CLK_B, FN_SDA2_D, FN_SDA2_CIS_D,
+       FN_SIM0_D_B, FN_SD2_CLK, FN_MMC0_CLK, FN_SIM0_CLK,
+       FN_VI0_DATA0_VI0_B0_B, FN_TS_SDEN0_C, FN_GLO_SCLK_B,
+       FN_VI3_DATA0_B, FN_SD2_CMD, FN_MMC0_CMD, FN_SIM0_D,
+       FN_VI0_DATA1_VI0_B1_B, FN_SCIFB1_SCK_E, FN_SCK1_D,
+       FN_TS_SPSYNC0_C, FN_GLO_SDATA_B, FN_VI3_DATA1_B,
+       FN_SD2_DAT0, FN_MMC0_D0, FN_FMCLK_B,
+       FN_VI0_DATA2_VI0_B2_B, FN_SCIFB1_RXD_E, FN_RX1_D,
+       FN_TS_SDAT0_C, FN_GLO_SS_B, FN_VI3_DATA2_B,
+       FN_SD2_DAT1, FN_MMC0_D1, FN_FMIN_B, FN_RDS_DATA,
+       FN_VI0_DATA3_VI0_B3_B, FN_SCIFB1_TXD_E, FN_TX1_D,
+       FN_TS_SCK0_C, FN_GLO_RFON_B, FN_VI3_DATA3_B,
+       FN_SD2_DAT2, FN_MMC0_D2, FN_BPFCLK_B, FN_RDS_CLK,
+       FN_VI0_DATA4_VI0_B4_B, FN_HRX0_D, FN_TS_SDEN1_B,
+       FN_GLO_Q0_B, FN_VI3_DATA4_B, FN_SD2_DAT3,
+       FN_MMC0_D3, FN_SIM0_RST, FN_VI0_DATA5_VI0_B5_B,
+       FN_HTX0_D, FN_TS_SPSYNC1_B, FN_GLO_Q1_B,
+       FN_VI3_DATA5_B, FN_SD2_CD, FN_MMC0_D4,
+       FN_TS_SDAT0_B, FN_USB2_EXTP, FN_GLO_I0,
+       FN_VI0_DATA6_VI0_B6_B, FN_HCTS0_N_D, FN_TS_SDAT1_B,
+       FN_GLO_I0_B, FN_VI3_DATA6_B,
+
+       /* IPSR11 */
+       FN_SD2_WP, FN_MMC0_D5, FN_TS_SCK0_B, FN_USB2_IDIN,
+       FN_GLO_I1, FN_VI0_DATA7_VI0_B7_B, FN_HRTS0_N_D,
+       FN_TS_SCK1_B, FN_GLO_I1_B, FN_VI3_DATA7_B,
+       FN_SD3_CLK, FN_MMC1_CLK, FN_SD3_CMD, FN_MMC1_CMD,
+       FN_MTS_N, FN_SD3_DAT0, FN_MMC1_D0, FN_STM_N,
+       FN_SD3_DAT1, FN_MMC1_D1, FN_MDATA, FN_SD3_DAT2,
+       FN_MMC1_D2, FN_SDATA, FN_SD3_DAT3, FN_MMC1_D3,
+       FN_SCKZ, FN_SD3_CD, FN_MMC1_D4, FN_TS_SDAT1,
+       FN_VSP, FN_GLO_Q0, FN_SIM0_RST_B, FN_SD3_WP,
+       FN_MMC1_D5, FN_TS_SCK1, FN_GLO_Q1, FN_FMIN_C,
+       FN_RDS_DATA_B, FN_FMIN_E, FN_RDS_DATA_D, FN_FMIN_F,
+       FN_RDS_DATA_E, FN_MLB_CLK, FN_SCL2_B, FN_SCL2_CIS_B,
+       FN_MLB_SIG, FN_SCIFB1_RXD_D, FN_RX1_C, FN_SDA2_B,
+       FN_SDA2_CIS_B, FN_MLB_DAT, FN_SPV_EVEN,
+       FN_SCIFB1_TXD_D, FN_TX1_C, FN_BPFCLK_C,
+       FN_RDS_CLK_B, FN_SSI_SCK0129, FN_CAN_CLK_B,
+       FN_MOUT0,
+
+       /* IPSR12 */
+       FN_SSI_WS0129, FN_CAN0_TX_B, FN_MOUT1,
+       FN_SSI_SDATA0, FN_CAN0_RX_B, FN_MOUT2,
+       FN_SSI_SDATA1, FN_CAN1_TX_B, FN_MOUT5,
+       FN_SSI_SDATA2, FN_CAN1_RX_B, FN_SSI_SCK1, FN_MOUT6,
+       FN_SSI_SCK34, FN_STP_OPWM_0, FN_SCIFB0_SCK,
+       FN_MSIOF1_SCK, FN_CAN_DEBUG_HW_TRIGGER, FN_SSI_WS34,
+       FN_STP_IVCXO27_0, FN_SCIFB0_RXD, FN_MSIOF1_SYNC,
+       FN_CAN_STEP0, FN_SSI_SDATA3, FN_STP_ISCLK_0,
+       FN_SCIFB0_TXD, FN_MSIOF1_SS1, FN_CAN_TXCLK,
+       FN_SSI_SCK4, FN_STP_ISD_0, FN_SCIFB0_CTS_N,
+       FN_MSIOF1_SS2, FN_SSI_SCK5_C, FN_CAN_DEBUGOUT0,
+       FN_SSI_WS4, FN_STP_ISEN_0, FN_SCIFB0_RTS_N,
+       FN_MSIOF1_TXD, FN_SSI_WS5_C, FN_CAN_DEBUGOUT1,
+       FN_SSI_SDATA4, FN_STP_ISSYNC_0, FN_MSIOF1_RXD,
+       FN_CAN_DEBUGOUT2, FN_SSI_SCK5, FN_SCIFB1_SCK,
+       FN_IERX_B, FN_DU2_EXHSYNC_DU2_HSYNC, FN_QSTH_QHS,
+       FN_CAN_DEBUGOUT3, FN_SSI_WS5, FN_SCIFB1_RXD,
+       FN_IECLK_B, FN_DU2_EXVSYNC_DU2_VSYNC, FN_QSTB_QHE,
+       FN_CAN_DEBUGOUT4,
+
+       /* IPSR13 */
+       FN_SSI_SDATA5, FN_SCIFB1_TXD, FN_IETX_B, FN_DU2_DR2,
+       FN_LCDOUT2, FN_CAN_DEBUGOUT5, FN_SSI_SCK6,
+       FN_SCIFB1_CTS_N, FN_BPFCLK_D, FN_RDS_CLK_C,
+       FN_DU2_DR3, FN_LCDOUT3, FN_CAN_DEBUGOUT6,
+       FN_BPFCLK_F, FN_RDS_CLK_E, FN_SSI_WS6,
+       FN_SCIFB1_RTS_N, FN_CAN0_TX_D, FN_DU2_DR4,
+       FN_LCDOUT4, FN_CAN_DEBUGOUT7, FN_SSI_SDATA6,
+       FN_FMIN_D, FN_RDS_DATA_C, FN_DU2_DR5, FN_LCDOUT5,
+       FN_CAN_DEBUGOUT8, FN_SSI_SCK78, FN_STP_IVCXO27_1,
+       FN_SCK1, FN_SCIFA1_SCK, FN_DU2_DR6, FN_LCDOUT6,
+       FN_CAN_DEBUGOUT9, FN_SSI_WS78, FN_STP_ISCLK_1,
+       FN_SCIFB2_SCK, FN_SCIFA2_CTS_N, FN_DU2_DR7,
+       FN_LCDOUT7, FN_CAN_DEBUGOUT10, FN_SSI_SDATA7,
+       FN_STP_ISD_1, FN_SCIFB2_RXD, FN_SCIFA2_RTS_N,
+       FN_TCLK2, FN_QSTVA_QVS, FN_CAN_DEBUGOUT11,
+       FN_BPFCLK_E, FN_RDS_CLK_D, FN_SSI_SDATA7_B,
+       FN_FMIN_G, FN_RDS_DATA_F, FN_SSI_SDATA8,
+       FN_STP_ISEN_1, FN_SCIFB2_TXD, FN_CAN0_TX_C,
+       FN_CAN_DEBUGOUT12, FN_SSI_SDATA8_B, FN_SSI_SDATA9,
+       FN_STP_ISSYNC_1, FN_SCIFB2_CTS_N, FN_SSI_WS1,
+       FN_SSI_SDATA5_C, FN_CAN_DEBUGOUT13, FN_AUDIO_CLKA,
+       FN_SCIFB2_RTS_N, FN_CAN_DEBUGOUT14,
+
+       /* IPSR14 */
+       FN_AUDIO_CLKB, FN_SCIF_CLK, FN_CAN0_RX_D,
+       FN_DVC_MUTE, FN_CAN0_RX_C, FN_CAN_DEBUGOUT15,
+       FN_REMOCON, FN_SCIFA0_SCK, FN_HSCK1, FN_SCK0,
+       FN_MSIOF3_SS2, FN_DU2_DG2, FN_LCDOUT10, FN_SDA1_C,
+       FN_SDA1_CIS_C, FN_SCIFA0_RXD, FN_HRX1, FN_RX0,
+       FN_DU2_DR0, FN_LCDOUT0, FN_SCIFA0_TXD, FN_HTX1,
+       FN_TX0, FN_DU2_DR1, FN_LCDOUT1, FN_SCIFA0_CTS_N,
+       FN_HCTS1_N, FN_CTS0_N, FN_MSIOF3_SYNC, FN_DU2_DG3,
+       FN_LCDOUT11, FN_PWM0_B, FN_SCL1_C, FN_SCL1_CIS_C,
+       FN_SCIFA0_RTS_N, FN_HRTS1_N, FN_RTS0_N_TANS,
+       FN_MSIOF3_SS1, FN_DU2_DG0, FN_LCDOUT8, FN_PWM1_B,
+       FN_SCIFA1_RXD, FN_AD_DI, FN_RX1,
+       FN_DU2_EXODDF_DU2_ODDF_DISP_CDE, FN_QCPV_QDE,
+       FN_SCIFA1_TXD, FN_AD_DO, FN_TX1, FN_DU2_DG1,
+       FN_LCDOUT9, FN_SCIFA1_CTS_N, FN_AD_CLK,
+       FN_CTS1_N, FN_MSIOF3_RXD, FN_DU0_DOTCLKOUT, FN_QCLK,
+       FN_SCIFA1_RTS_N, FN_AD_NCS_N, FN_RTS1_N_TANS,
+       FN_MSIOF3_TXD, FN_DU1_DOTCLKOUT, FN_QSTVB_QVE,
+       FN_HRTS0_N_C,
+
+       /* IPSR15 */
+       FN_SCIFA2_SCK, FN_FMCLK, FN_MSIOF3_SCK, FN_DU2_DG7,
+       FN_LCDOUT15, FN_SCIF_CLK_B, FN_SCIFA2_RXD, FN_FMIN,
+       FN_DU2_DB0, FN_LCDOUT16, FN_SCL2, FN_SCL2_CIS,
+       FN_SCIFA2_TXD, FN_BPFCLK, FN_DU2_DB1, FN_LCDOUT17,
+       FN_SDA2, FN_SDA2_CIS, FN_HSCK0, FN_TS_SDEN0,
+       FN_DU2_DG4, FN_LCDOUT12, FN_HCTS0_N_C, FN_HRX0,
+       FN_DU2_DB2, FN_LCDOUT18, FN_HTX0, FN_DU2_DB3,
+       FN_LCDOUT19, FN_HCTS0_N, FN_SSI_SCK9, FN_DU2_DB4,
+       FN_LCDOUT20, FN_HRTS0_N, FN_SSI_WS9, FN_DU2_DB5,
+       FN_LCDOUT21, FN_MSIOF0_SCK, FN_TS_SDAT0, FN_ADICLK,
+       FN_DU2_DB6, FN_LCDOUT22, FN_MSIOF0_SYNC, FN_TS_SCK0,
+       FN_SSI_SCK2, FN_ADIDATA, FN_DU2_DB7, FN_LCDOUT23,
+       FN_SCIFA2_RXD_B, FN_MSIOF0_SS1, FN_ADICHS0,
+       FN_DU2_DG5, FN_LCDOUT13, FN_MSIOF0_TXD, FN_ADICHS1,
+       FN_DU2_DG6, FN_LCDOUT14,
+
+       /* IPSR16 */
+       FN_MSIOF0_SS2, FN_AUDIO_CLKOUT, FN_ADICHS2,
+       FN_DU2_DISP, FN_QPOLA, FN_HTX0_C, FN_SCIFA2_TXD_B,
+       FN_MSIOF0_RXD, FN_TS_SPSYNC0, FN_SSI_WS2,
+       FN_ADICS_SAMP, FN_DU2_CDE, FN_QPOLB, FN_HRX0_C,
+       FN_USB1_PWEN, FN_AUDIO_CLKOUT_D, FN_USB1_OVC,
+       FN_TCLK1_B,
+
+       FN_SEL_SCIF1_0, FN_SEL_SCIF1_1, FN_SEL_SCIF1_2, FN_SEL_SCIF1_3,
+       FN_SEL_SCIF1_4,
+       FN_SEL_SCIFB_0, FN_SEL_SCIFB_1, FN_SEL_SCIFB_2,
+       FN_SEL_SCIFB2_0, FN_SEL_SCIFB2_1, FN_SEL_SCIFB2_2,
+       FN_SEL_SCIFB1_0, FN_SEL_SCIFB1_1, FN_SEL_SCIFB1_2, FN_SEL_SCIFB1_3,
+       FN_SEL_SCIFB1_4,
+       FN_SEL_SCIFB1_5, FN_SEL_SCIFB1_6,
+       FN_SEL_SCIFA1_0, FN_SEL_SCIFA1_1, FN_SEL_SCIFA1_2, FN_SEL_SCIFA1_3,
+       FN_SEL_SCIF0_0, FN_SEL_SCIF0_1,
+       FN_SEL_SCFA_0, FN_SEL_SCFA_1,
+       FN_SEL_SOF1_0, FN_SEL_SOF1_1,
+       FN_SEL_SSI7_0, FN_SEL_SSI7_1, FN_SEL_SSI7_2,
+       FN_SEL_SSI6_0, FN_SEL_SSI6_1,
+       FN_SEL_SSI5_0, FN_SEL_SSI5_1, FN_SEL_SSI5_2,
+       FN_SEL_VI3_0, FN_SEL_VI3_1,
+       FN_SEL_VI2_0, FN_SEL_VI2_1,
+       FN_SEL_VI1_0, FN_SEL_VI1_1,
+       FN_SEL_VI0_0, FN_SEL_VI0_1,
+       FN_SEL_TSIF1_0, FN_SEL_TSIF1_1, FN_SEL_TSIF1_2,
+       FN_SEL_LBS_0, FN_SEL_LBS_1,
+       FN_SEL_TSIF0_0, FN_SEL_TSIF0_1, FN_SEL_TSIF0_2, FN_SEL_TSIF0_3,
+       FN_SEL_SOF3_0, FN_SEL_SOF3_1,
+       FN_SEL_SOF0_0, FN_SEL_SOF0_1,
+
+       FN_SEL_TMU1_0, FN_SEL_TMU1_1,
+       FN_SEL_HSCIF1_0, FN_SEL_HSCIF1_1,
+       FN_SEL_SCIFCLK_0, FN_SEL_SCIFCLK_1,
+       FN_SEL_CAN0_0, FN_SEL_CAN0_1, FN_SEL_CAN0_2, FN_SEL_CAN0_3,
+       FN_SEL_CANCLK_0, FN_SEL_CANCLK_1,
+       FN_SEL_SCIFA2_0, FN_SEL_SCIFA2_1, FN_SEL_SCIFA2_2,
+       FN_SEL_CAN1_0, FN_SEL_CAN1_1,
+       FN_SEL_ADI_0, FN_SEL_ADI_1,
+       FN_SEL_SSP_0, FN_SEL_SSP_1,
+       FN_SEL_FM_0, FN_SEL_FM_1, FN_SEL_FM_2, FN_SEL_FM_3,
+       FN_SEL_FM_4, FN_SEL_FM_5, FN_SEL_FM_6,
+       FN_SEL_HSCIF0_0, FN_SEL_HSCIF0_1, FN_SEL_HSCIF0_2, FN_SEL_HSCIF0_3,
+       FN_SEL_HSCIF0_4, FN_SEL_HSCIF0_5,
+       FN_SEL_GPS_0, FN_SEL_GPS_1, FN_SEL_GPS_2,
+       FN_SEL_RDS_0, FN_SEL_RDS_1, FN_SEL_RDS_2,
+       FN_SEL_RDS_3, FN_SEL_RDS_4, FN_SEL_RDS_5,
+       FN_SEL_SIM_0, FN_SEL_SIM_1, FN_SEL_SIM_2,
+       FN_SEL_SSI8_0, FN_SEL_SSI8_1, FN_SEL_SSI8_2,
+
+       FN_SEL_IICDVFS_0, FN_SEL_IICDVFS_1,
+       FN_SEL_IIC0_0, FN_SEL_IIC0_1,
+       FN_SEL_IEB_0, FN_SEL_IEB_1, FN_SEL_IEB_2,
+       FN_SEL_IIC2_0, FN_SEL_IIC2_1, FN_SEL_IIC2_2, FN_SEL_IIC2_3,
+       FN_SEL_IIC2_4,
+       FN_SEL_IIC1_0, FN_SEL_IIC1_1, FN_SEL_IIC1_2,
+       FN_SEL_I2C2_0, FN_SEL_I2C2_1, FN_SEL_I2C2_2, FN_SEL_I2C2_3,
+       FN_SEL_I2C2_4,
+       FN_SEL_I2C1_0, FN_SEL_I2C1_1, FN_SEL_I2C1_2,
+       PINMUX_FUNCTION_END,
+
+       PINMUX_MARK_BEGIN,
+
+       VI1_DATA7_VI1_B7_MARK,
+
+       USB0_PWEN_MARK, USB0_OVC_VBUS_MARK,
+       USB2_PWEN_MARK, USB2_OVC_MARK, AVS1_MARK, AVS2_MARK,
+       DU_DOTCLKIN0_MARK, DU_DOTCLKIN2_MARK,
+
+       D0_MARK, MSIOF3_SCK_B_MARK, VI3_DATA0_MARK, VI0_G4_MARK, VI0_G4_B_MARK,
+       D1_MARK, MSIOF3_SYNC_B_MARK, VI3_DATA1_MARK, VI0_G5_MARK,
+       VI0_G5_B_MARK, D2_MARK, MSIOF3_RXD_B_MARK, VI3_DATA2_MARK,
+       VI0_G6_MARK, VI0_G6_B_MARK, D3_MARK, MSIOF3_TXD_B_MARK,
+       VI3_DATA3_MARK, VI0_G7_MARK, VI0_G7_B_MARK, D4_MARK,
+       SCIFB1_RXD_F_MARK, SCIFB0_RXD_C_MARK, VI3_DATA4_MARK,
+       VI0_R0_MARK, VI0_R0_B_MARK, RX0_B_MARK, D5_MARK,
+       SCIFB1_TXD_F_MARK, SCIFB0_TXD_C_MARK, VI3_DATA5_MARK,
+       VI0_R1_MARK, VI0_R1_B_MARK, TX0_B_MARK, D6_MARK,
+       SCL2_C_MARK, VI3_DATA6_MARK, VI0_R2_MARK, VI0_R2_B_MARK,
+       SCL2_CIS_C_MARK, D7_MARK, AD_DI_B_MARK, SDA2_C_MARK,
+       VI3_DATA7_MARK, VI0_R3_MARK, VI0_R3_B_MARK, SDA2_CIS_C_MARK,
+       D8_MARK, SCIFA1_SCK_C_MARK, AVB_TXD0_MARK, MII_TXD0_MARK,
+       VI0_G0_MARK, VI0_G0_B_MARK, VI2_DATA0_VI2_B0_MARK,
+
+       D9_MARK, SCIFA1_RXD_C_MARK, AVB_TXD1_MARK, MII_TXD1_MARK,
+       VI0_G1_MARK, VI0_G1_B_MARK, VI2_DATA1_VI2_B1_MARK, D10_MARK,
+       SCIFA1_TXD_C_MARK, AVB_TXD2_MARK, MII_TXD2_MARK,
+       VI0_G2_MARK, VI0_G2_B_MARK, VI2_DATA2_VI2_B2_MARK, D11_MARK,
+       SCIFA1_CTS_N_C_MARK, AVB_TXD3_MARK, MII_TXD3_MARK,
+       VI0_G3_MARK, VI0_G3_B_MARK, VI2_DATA3_VI2_B3_MARK,
+       D12_MARK, SCIFA1_RTS_N_C_MARK, AVB_TXD4_MARK,
+       VI0_HSYNC_N_MARK, VI0_HSYNC_N_B_MARK, VI2_DATA4_VI2_B4_MARK,
+       D13_MARK, AVB_TXD5_MARK, VI0_VSYNC_N_MARK,
+       VI0_VSYNC_N_B_MARK, VI2_DATA5_VI2_B5_MARK, D14_MARK,
+       SCIFB1_RXD_C_MARK, AVB_TXD6_MARK, RX1_B_MARK,
+       VI0_CLKENB_MARK, VI0_CLKENB_B_MARK, VI2_DATA6_VI2_B6_MARK,
+       D15_MARK, SCIFB1_TXD_C_MARK, AVB_TXD7_MARK, TX1_B_MARK,
+       VI0_FIELD_MARK, VI0_FIELD_B_MARK, VI2_DATA7_VI2_B7_MARK,
+       A0_MARK, PWM3_MARK, A1_MARK, PWM4_MARK,
+
+       A2_MARK, PWM5_MARK, MSIOF1_SS1_B_MARK, A3_MARK,
+       PWM6_MARK, MSIOF1_SS2_B_MARK, A4_MARK, MSIOF1_TXD_B_MARK,
+       TPU0TO0_MARK, A5_MARK, SCIFA1_TXD_B_MARK, TPU0TO1_MARK,
+       A6_MARK, SCIFA1_RTS_N_B_MARK, TPU0TO2_MARK, A7_MARK,
+       SCIFA1_SCK_B_MARK, AUDIO_CLKOUT_B_MARK, TPU0TO3_MARK,
+       A8_MARK, SCIFA1_RXD_B_MARK, SSI_SCK5_B_MARK, VI0_R4_MARK,
+       VI0_R4_B_MARK, SCIFB2_RXD_C_MARK, VI2_DATA0_VI2_B0_B_MARK,
+       A9_MARK, SCIFA1_CTS_N_B_MARK, SSI_WS5_B_MARK, VI0_R5_MARK,
+       VI0_R5_B_MARK, SCIFB2_TXD_C_MARK, VI2_DATA1_VI2_B1_B_MARK,
+       A10_MARK, SSI_SDATA5_B_MARK, MSIOF2_SYNC_MARK, VI0_R6_MARK,
+       VI0_R6_B_MARK, VI2_DATA2_VI2_B2_B_MARK,
+
+       A11_MARK, SCIFB2_CTS_N_B_MARK, MSIOF2_SCK_MARK, VI1_R0_MARK,
+       VI1_R0_B_MARK, VI2_G0_MARK, VI2_DATA3_VI2_B3_B_MARK,
+       A12_MARK, SCIFB2_RXD_B_MARK, MSIOF2_TXD_MARK, VI1_R1_MARK,
+       VI1_R1_B_MARK, VI2_G1_MARK, VI2_DATA4_VI2_B4_B_MARK,
+       A13_MARK, SCIFB2_RTS_N_B_MARK, EX_WAIT2_MARK,
+       MSIOF2_RXD_MARK, VI1_R2_MARK, VI1_R2_B_MARK, VI2_G2_MARK,
+       VI2_DATA5_VI2_B5_B_MARK, A14_MARK, SCIFB2_TXD_B_MARK,
+       ATACS11_N_MARK, MSIOF2_SS1_MARK, A15_MARK, SCIFB2_SCK_B_MARK,
+       ATARD1_N_MARK, MSIOF2_SS2_MARK, A16_MARK, ATAWR1_N_MARK,
+       A17_MARK, AD_DO_B_MARK, ATADIR1_N_MARK, A18_MARK,
+       AD_CLK_B_MARK, ATAG1_N_MARK, A19_MARK, AD_NCS_N_B_MARK,
+       ATACS01_N_MARK, EX_WAIT0_B_MARK, A20_MARK, SPCLK_MARK,
+       VI1_R3_MARK, VI1_R3_B_MARK, VI2_G4_MARK,
+
+       A21_MARK, MOSI_IO0_MARK, VI1_R4_MARK, VI1_R4_B_MARK, VI2_G5_MARK,
+       A22_MARK, MISO_IO1_MARK, VI1_R5_MARK, VI1_R5_B_MARK,
+       VI2_G6_MARK, A23_MARK, IO2_MARK, VI1_G7_MARK,
+       VI1_G7_B_MARK, VI2_G7_MARK, A24_MARK, IO3_MARK,
+       VI1_R7_MARK, VI1_R7_B_MARK, VI2_CLKENB_MARK,
+       VI2_CLKENB_B_MARK, A25_MARK, SSL_MARK, VI1_G6_MARK,
+       VI1_G6_B_MARK, VI2_FIELD_MARK, VI2_FIELD_B_MARK, CS0_N_MARK,
+       VI1_R6_MARK, VI1_R6_B_MARK, VI2_G3_MARK, MSIOF0_SS2_B_MARK,
+       CS1_N_A26_MARK, SPEEDIN_MARK, VI0_R7_MARK, VI0_R7_B_MARK,
+       VI2_CLK_MARK, VI2_CLK_B_MARK, EX_CS0_N_MARK, HRX1_B_MARK,
+       VI1_G5_MARK, VI1_G5_B_MARK, VI2_R0_MARK, HTX0_B_MARK,
+       MSIOF0_SS1_B_MARK, EX_CS1_N_MARK, GPS_CLK_MARK,
+       HCTS1_N_B_MARK, VI1_FIELD_MARK, VI1_FIELD_B_MARK,
+       VI2_R1_MARK, EX_CS2_N_MARK, GPS_SIGN_MARK, HRTS1_N_B_MARK,
+       VI3_CLKENB_MARK, VI1_G0_MARK, VI1_G0_B_MARK, VI2_R2_MARK,
+
+       EX_CS3_N_MARK, GPS_MAG_MARK, VI3_FIELD_MARK,
+       VI1_G1_MARK, VI1_G1_B_MARK, VI2_R3_MARK,
+       EX_CS4_N_MARK, MSIOF1_SCK_B_MARK, VI3_HSYNC_N_MARK,
+       VI2_HSYNC_N_MARK, SCL1_MARK, VI2_HSYNC_N_B_MARK,
+       INTC_EN0_N_MARK, SCL1_CIS_MARK, EX_CS5_N_MARK, CAN0_RX_MARK,
+       MSIOF1_RXD_B_MARK, VI3_VSYNC_N_MARK, VI1_G2_MARK,
+       VI1_G2_B_MARK, VI2_R4_MARK, SDA1_MARK, INTC_EN1_N_MARK,
+       SDA1_CIS_MARK, BS_N_MARK, IETX_MARK, HTX1_B_MARK,
+       CAN1_TX_MARK, DRACK0_MARK, IETX_C_MARK, RD_N_MARK,
+       CAN0_TX_MARK, SCIFA0_SCK_B_MARK, RD_WR_N_MARK, VI1_G3_MARK,
+       VI1_G3_B_MARK, VI2_R5_MARK, SCIFA0_RXD_B_MARK,
+       INTC_IRQ4_N_MARK, WE0_N_MARK, IECLK_MARK, CAN_CLK_MARK,
+       VI2_VSYNC_N_MARK, SCIFA0_TXD_B_MARK, VI2_VSYNC_N_B_MARK,
+       WE1_N_MARK, IERX_MARK, CAN1_RX_MARK, VI1_G4_MARK,
+       VI1_G4_B_MARK, VI2_R6_MARK, SCIFA0_CTS_N_B_MARK,
+       IERX_C_MARK, EX_WAIT0_MARK, IRQ3_MARK, INTC_IRQ3_N_MARK,
+       VI3_CLK_MARK, SCIFA0_RTS_N_B_MARK, HRX0_B_MARK,
+       MSIOF0_SCK_B_MARK, DREQ0_N_MARK, VI1_HSYNC_N_MARK,
+       VI1_HSYNC_N_B_MARK, VI2_R7_MARK, SSI_SCK78_C_MARK,
+       SSI_WS78_B_MARK,
+
+       DACK0_MARK, IRQ0_MARK, INTC_IRQ0_N_MARK, SSI_SCK6_B_MARK,
+       VI1_VSYNC_N_MARK, VI1_VSYNC_N_B_MARK, SSI_WS78_C_MARK,
+       DREQ1_N_MARK, VI1_CLKENB_MARK, VI1_CLKENB_B_MARK,
+       SSI_SDATA7_C_MARK, SSI_SCK78_B_MARK, DACK1_MARK, IRQ1_MARK,
+       INTC_IRQ1_N_MARK, SSI_WS6_B_MARK, SSI_SDATA8_C_MARK,
+       DREQ2_N_MARK, HSCK1_B_MARK, HCTS0_N_B_MARK,
+       MSIOF0_TXD_B_MARK, DACK2_MARK, IRQ2_MARK, INTC_IRQ2_N_MARK,
+       SSI_SDATA6_B_MARK, HRTS0_N_B_MARK, MSIOF0_RXD_B_MARK,
+       ETH_CRS_DV_MARK, RMII_CRS_DV_MARK, STP_ISCLK_0_B_MARK,
+       TS_SDEN0_D_MARK, GLO_Q0_C_MARK, SCL2_E_MARK,
+       SCL2_CIS_E_MARK, ETH_RX_ER_MARK, RMII_RX_ER_MARK,
+       STP_ISD_0_B_MARK, TS_SPSYNC0_D_MARK, GLO_Q1_C_MARK,
+       SDA2_E_MARK, SDA2_CIS_E_MARK, ETH_RXD0_MARK, RMII_RXD0_MARK,
+       STP_ISEN_0_B_MARK, TS_SDAT0_D_MARK, GLO_I0_C_MARK,
+       SCIFB1_SCK_G_MARK, SCK1_E_MARK, ETH_RXD1_MARK,
+       RMII_RXD1_MARK, HRX0_E_MARK, STP_ISSYNC_0_B_MARK,
+       TS_SCK0_D_MARK, GLO_I1_C_MARK, SCIFB1_RXD_G_MARK,
+       RX1_E_MARK, ETH_LINK_MARK, RMII_LINK_MARK, HTX0_E_MARK,
+       STP_IVCXO27_0_B_MARK, SCIFB1_TXD_G_MARK, TX1_E_MARK,
+       ETH_REF_CLK_MARK, RMII_REF_CLK_MARK, HCTS0_N_E_MARK,
+       STP_IVCXO27_1_B_MARK, HRX0_F_MARK,
+
+       ETH_MDIO_MARK, RMII_MDIO_MARK, HRTS0_N_E_MARK,
+       SIM0_D_C_MARK, HCTS0_N_F_MARK, ETH_TXD1_MARK,
+       RMII_TXD1_MARK, HTX0_F_MARK, BPFCLK_G_MARK, RDS_CLK_F_MARK,
+       ETH_TX_EN_MARK, RMII_TX_EN_MARK, SIM0_CLK_C_MARK,
+       HRTS0_N_F_MARK, ETH_MAGIC_MARK, RMII_MAGIC_MARK,
+       SIM0_RST_C_MARK, ETH_TXD0_MARK, RMII_TXD0_MARK,
+       STP_ISCLK_1_B_MARK, TS_SDEN1_C_MARK, GLO_SCLK_C_MARK,
+       ETH_MDC_MARK, RMII_MDC_MARK, STP_ISD_1_B_MARK,
+       TS_SPSYNC1_C_MARK, GLO_SDATA_C_MARK, PWM0_MARK,
+       SCIFA2_SCK_C_MARK, STP_ISEN_1_B_MARK, TS_SDAT1_C_MARK,
+       GLO_SS_C_MARK, PWM1_MARK, SCIFA2_TXD_C_MARK,
+       STP_ISSYNC_1_B_MARK, TS_SCK1_C_MARK, GLO_RFON_C_MARK,
+       PCMOE_N_MARK, PWM2_MARK, PWMFSW0_MARK, SCIFA2_RXD_C_MARK,
+       PCMWE_N_MARK, IECLK_C_MARK, DU1_DOTCLKIN_MARK,
+       AUDIO_CLKC_MARK, AUDIO_CLKOUT_C_MARK, VI0_CLK_MARK,
+       ATACS00_N_MARK, AVB_RXD1_MARK, MII_RXD1_MARK,
+       VI0_DATA0_VI0_B0_MARK, ATACS10_N_MARK, AVB_RXD2_MARK,
+       MII_RXD2_MARK,
+
+       VI0_DATA1_VI0_B1_MARK, ATARD0_N_MARK, AVB_RXD3_MARK,
+       MII_RXD3_MARK, VI0_DATA2_VI0_B2_MARK, ATAWR0_N_MARK,
+       AVB_RXD4_MARK, VI0_DATA3_VI0_B3_MARK, ATADIR0_N_MARK,
+       AVB_RXD5_MARK, VI0_DATA4_VI0_B4_MARK, ATAG0_N_MARK,
+       AVB_RXD6_MARK, VI0_DATA5_VI0_B5_MARK, EX_WAIT1_MARK,
+       AVB_RXD7_MARK, VI0_DATA6_VI0_B6_MARK, AVB_RX_ER_MARK,
+       MII_RX_ER_MARK, VI0_DATA7_VI0_B7_MARK, AVB_RX_CLK_MARK,
+       MII_RX_CLK_MARK, VI1_CLK_MARK, AVB_RX_DV_MARK,
+       MII_RX_DV_MARK, VI1_DATA0_VI1_B0_MARK, SCIFA1_SCK_D_MARK,
+       AVB_CRS_MARK, MII_CRS_MARK, VI1_DATA1_VI1_B1_MARK,
+       SCIFA1_RXD_D_MARK, AVB_MDC_MARK, MII_MDC_MARK,
+       VI1_DATA2_VI1_B2_MARK, SCIFA1_TXD_D_MARK, AVB_MDIO_MARK,
+       MII_MDIO_MARK, VI1_DATA3_VI1_B3_MARK, SCIFA1_CTS_N_D_MARK,
+       AVB_GTX_CLK_MARK, VI1_DATA4_VI1_B4_MARK, SCIFA1_RTS_N_D_MARK,
+       AVB_MAGIC_MARK, MII_MAGIC_MARK, VI1_DATA5_VI1_B5_MARK,
+       AVB_PHY_INT_MARK, VI1_DATA6_VI1_B6_MARK, AVB_GTXREFCLK_MARK,
+       SD0_CLK_MARK, VI1_DATA0_VI1_B0_B_MARK, SD0_CMD_MARK,
+       SCIFB1_SCK_B_MARK, VI1_DATA1_VI1_B1_B_MARK,
+
+       SD0_DAT0_MARK, SCIFB1_RXD_B_MARK, VI1_DATA2_VI1_B2_B_MARK,
+       SD0_DAT1_MARK, SCIFB1_TXD_B_MARK, VI1_DATA3_VI1_B3_B_MARK,
+       SD0_DAT2_MARK, SCIFB1_CTS_N_B_MARK, VI1_DATA4_VI1_B4_B_MARK,
+       SD0_DAT3_MARK, SCIFB1_RTS_N_B_MARK, VI1_DATA5_VI1_B5_B_MARK,
+       SD0_CD_MARK, MMC0_D6_MARK, TS_SDEN0_B_MARK, USB0_EXTP_MARK,
+       GLO_SCLK_MARK, VI1_DATA6_VI1_B6_B_MARK, SCL1_B_MARK,
+       SCL1_CIS_B_MARK, VI2_DATA6_VI2_B6_B_MARK, SD0_WP_MARK,
+       MMC0_D7_MARK, TS_SPSYNC0_B_MARK, USB0_IDIN_MARK,
+       GLO_SDATA_MARK, VI1_DATA7_VI1_B7_B_MARK, SDA1_B_MARK,
+       SDA1_CIS_B_MARK, VI2_DATA7_VI2_B7_B_MARK, SD1_CLK_MARK,
+       AVB_TX_EN_MARK, MII_TX_EN_MARK, SD1_CMD_MARK,
+       AVB_TX_ER_MARK, MII_TX_ER_MARK, SCIFB0_SCK_B_MARK,
+       SD1_DAT0_MARK, AVB_TX_CLK_MARK, MII_TX_CLK_MARK,
+       SCIFB0_RXD_B_MARK, SD1_DAT1_MARK, AVB_LINK_MARK,
+       MII_LINK_MARK, SCIFB0_TXD_B_MARK, SD1_DAT2_MARK,
+       AVB_COL_MARK, MII_COL_MARK, SCIFB0_CTS_N_B_MARK,
+       SD1_DAT3_MARK, AVB_RXD0_MARK, MII_RXD0_MARK,
+       SCIFB0_RTS_N_B_MARK, SD1_CD_MARK, MMC1_D6_MARK,
+       TS_SDEN1_MARK, USB1_EXTP_MARK, GLO_SS_MARK, VI0_CLK_B_MARK,
+       SCL2_D_MARK, SCL2_CIS_D_MARK, SIM0_CLK_B_MARK,
+       VI3_CLK_B_MARK,
+
+       SD1_WP_MARK, MMC1_D7_MARK, TS_SPSYNC1_MARK, USB1_IDIN_MARK,
+       GLO_RFON_MARK, VI1_CLK_B_MARK, SDA2_D_MARK, SDA2_CIS_D_MARK,
+       SIM0_D_B_MARK, SD2_CLK_MARK, MMC0_CLK_MARK, SIM0_CLK_MARK,
+       VI0_DATA0_VI0_B0_B_MARK, TS_SDEN0_C_MARK, GLO_SCLK_B_MARK,
+       VI3_DATA0_B_MARK, SD2_CMD_MARK, MMC0_CMD_MARK, SIM0_D_MARK,
+       VI0_DATA1_VI0_B1_B_MARK, SCIFB1_SCK_E_MARK, SCK1_D_MARK,
+       TS_SPSYNC0_C_MARK, GLO_SDATA_B_MARK, VI3_DATA1_B_MARK,
+       SD2_DAT0_MARK, MMC0_D0_MARK, FMCLK_B_MARK,
+       VI0_DATA2_VI0_B2_B_MARK, SCIFB1_RXD_E_MARK, RX1_D_MARK,
+       TS_SDAT0_C_MARK, GLO_SS_B_MARK, VI3_DATA2_B_MARK,
+       SD2_DAT1_MARK, MMC0_D1_MARK, FMIN_B_MARK, RDS_DATA_MARK,
+       VI0_DATA3_VI0_B3_B_MARK, SCIFB1_TXD_E_MARK, TX1_D_MARK,
+       TS_SCK0_C_MARK, GLO_RFON_B_MARK, VI3_DATA3_B_MARK,
+       SD2_DAT2_MARK, MMC0_D2_MARK, BPFCLK_B_MARK, RDS_CLK_MARK,
+       VI0_DATA4_VI0_B4_B_MARK, HRX0_D_MARK, TS_SDEN1_B_MARK,
+       GLO_Q0_B_MARK, VI3_DATA4_B_MARK, SD2_DAT3_MARK,
+       MMC0_D3_MARK, SIM0_RST_MARK, VI0_DATA5_VI0_B5_B_MARK,
+       HTX0_D_MARK, TS_SPSYNC1_B_MARK, GLO_Q1_B_MARK,
+       VI3_DATA5_B_MARK, SD2_CD_MARK, MMC0_D4_MARK,
+       TS_SDAT0_B_MARK, USB2_EXTP_MARK, GLO_I0_MARK,
+       VI0_DATA6_VI0_B6_B_MARK, HCTS0_N_D_MARK, TS_SDAT1_B_MARK,
+       GLO_I0_B_MARK, VI3_DATA6_B_MARK,
+
+       SD2_WP_MARK, MMC0_D5_MARK, TS_SCK0_B_MARK, USB2_IDIN_MARK,
+       GLO_I1_MARK, VI0_DATA7_VI0_B7_B_MARK, HRTS0_N_D_MARK,
+       TS_SCK1_B_MARK, GLO_I1_B_MARK, VI3_DATA7_B_MARK,
+       SD3_CLK_MARK, MMC1_CLK_MARK, SD3_CMD_MARK, MMC1_CMD_MARK,
+       MTS_N_MARK, SD3_DAT0_MARK, MMC1_D0_MARK, STM_N_MARK,
+       SD3_DAT1_MARK, MMC1_D1_MARK, MDATA_MARK, SD3_DAT2_MARK,
+       MMC1_D2_MARK, SDATA_MARK, SD3_DAT3_MARK, MMC1_D3_MARK,
+       SCKZ_MARK, SD3_CD_MARK, MMC1_D4_MARK, TS_SDAT1_MARK,
+       VSP_MARK, GLO_Q0_MARK, SIM0_RST_B_MARK, SD3_WP_MARK,
+       MMC1_D5_MARK, TS_SCK1_MARK, GLO_Q1_MARK, FMIN_C_MARK,
+       RDS_DATA_B_MARK, FMIN_E_MARK, RDS_DATA_D_MARK, FMIN_F_MARK,
+       RDS_DATA_E_MARK, MLB_CLK_MARK, SCL2_B_MARK, SCL2_CIS_B_MARK,
+       MLB_SIG_MARK, SCIFB1_RXD_D_MARK, RX1_C_MARK, SDA2_B_MARK,
+       SDA2_CIS_B_MARK, MLB_DAT_MARK, SPV_EVEN_MARK,
+       SCIFB1_TXD_D_MARK, TX1_C_MARK, BPFCLK_C_MARK,
+       RDS_CLK_B_MARK, SSI_SCK0129_MARK, CAN_CLK_B_MARK,
+       MOUT0_MARK,
+
+       SSI_WS0129_MARK, CAN0_TX_B_MARK, MOUT1_MARK,
+       SSI_SDATA0_MARK, CAN0_RX_B_MARK, MOUT2_MARK,
+       SSI_SDATA1_MARK, CAN1_TX_B_MARK, MOUT5_MARK,
+       SSI_SDATA2_MARK, CAN1_RX_B_MARK, SSI_SCK1_MARK, MOUT6_MARK,
+       SSI_SCK34_MARK, STP_OPWM_0_MARK, SCIFB0_SCK_MARK,
+       MSIOF1_SCK_MARK, CAN_DEBUG_HW_TRIGGER_MARK, SSI_WS34_MARK,
+       STP_IVCXO27_0_MARK, SCIFB0_RXD_MARK, MSIOF1_SYNC_MARK,
+       CAN_STEP0_MARK, SSI_SDATA3_MARK, STP_ISCLK_0_MARK,
+       SCIFB0_TXD_MARK, MSIOF1_SS1_MARK, CAN_TXCLK_MARK,
+       SSI_SCK4_MARK, STP_ISD_0_MARK, SCIFB0_CTS_N_MARK,
+       MSIOF1_SS2_MARK, SSI_SCK5_C_MARK, CAN_DEBUGOUT0_MARK,
+       SSI_WS4_MARK, STP_ISEN_0_MARK, SCIFB0_RTS_N_MARK,
+       MSIOF1_TXD_MARK, SSI_WS5_C_MARK, CAN_DEBUGOUT1_MARK,
+       SSI_SDATA4_MARK, STP_ISSYNC_0_MARK, MSIOF1_RXD_MARK,
+       CAN_DEBUGOUT2_MARK, SSI_SCK5_MARK, SCIFB1_SCK_MARK,
+       IERX_B_MARK, DU2_EXHSYNC_DU2_HSYNC_MARK, QSTH_QHS_MARK,
+       CAN_DEBUGOUT3_MARK, SSI_WS5_MARK, SCIFB1_RXD_MARK,
+       IECLK_B_MARK, DU2_EXVSYNC_DU2_VSYNC_MARK, QSTB_QHE_MARK,
+       CAN_DEBUGOUT4_MARK,
+
+       SSI_SDATA5_MARK, SCIFB1_TXD_MARK, IETX_B_MARK, DU2_DR2_MARK,
+       LCDOUT2_MARK, CAN_DEBUGOUT5_MARK, SSI_SCK6_MARK,
+       SCIFB1_CTS_N_MARK, BPFCLK_D_MARK, RDS_CLK_C_MARK,
+       DU2_DR3_MARK, LCDOUT3_MARK, CAN_DEBUGOUT6_MARK,
+       BPFCLK_F_MARK, RDS_CLK_E_MARK, SSI_WS6_MARK,
+       SCIFB1_RTS_N_MARK, CAN0_TX_D_MARK, DU2_DR4_MARK,
+       LCDOUT4_MARK, CAN_DEBUGOUT7_MARK, SSI_SDATA6_MARK,
+       FMIN_D_MARK, RDS_DATA_C_MARK, DU2_DR5_MARK, LCDOUT5_MARK,
+       CAN_DEBUGOUT8_MARK, SSI_SCK78_MARK, STP_IVCXO27_1_MARK,
+       SCK1_MARK, SCIFA1_SCK_MARK, DU2_DR6_MARK, LCDOUT6_MARK,
+       CAN_DEBUGOUT9_MARK, SSI_WS78_MARK, STP_ISCLK_1_MARK,
+       SCIFB2_SCK_MARK, SCIFA2_CTS_N_MARK, DU2_DR7_MARK,
+       LCDOUT7_MARK, CAN_DEBUGOUT10_MARK, SSI_SDATA7_MARK,
+       STP_ISD_1_MARK, SCIFB2_RXD_MARK, SCIFA2_RTS_N_MARK,
+       TCLK2_MARK, QSTVA_QVS_MARK, CAN_DEBUGOUT11_MARK,
+       BPFCLK_E_MARK, RDS_CLK_D_MARK, SSI_SDATA7_B_MARK,
+       FMIN_G_MARK, RDS_DATA_F_MARK, SSI_SDATA8_MARK,
+       STP_ISEN_1_MARK, SCIFB2_TXD_MARK, CAN0_TX_C_MARK,
+       CAN_DEBUGOUT12_MARK, SSI_SDATA8_B_MARK, SSI_SDATA9_MARK,
+       STP_ISSYNC_1_MARK, SCIFB2_CTS_N_MARK, SSI_WS1_MARK,
+       SSI_SDATA5_C_MARK, CAN_DEBUGOUT13_MARK, AUDIO_CLKA_MARK,
+       SCIFB2_RTS_N_MARK, CAN_DEBUGOUT14_MARK,
+
+       AUDIO_CLKB_MARK, SCIF_CLK_MARK, CAN0_RX_D_MARK,
+       DVC_MUTE_MARK, CAN0_RX_C_MARK, CAN_DEBUGOUT15_MARK,
+       REMOCON_MARK, SCIFA0_SCK_MARK, HSCK1_MARK, SCK0_MARK,
+       MSIOF3_SS2_MARK, DU2_DG2_MARK, LCDOUT10_MARK, SDA1_C_MARK,
+       SDA1_CIS_C_MARK, SCIFA0_RXD_MARK, HRX1_MARK, RX0_MARK,
+       DU2_DR0_MARK, LCDOUT0_MARK, SCIFA0_TXD_MARK, HTX1_MARK,
+       TX0_MARK, DU2_DR1_MARK, LCDOUT1_MARK, SCIFA0_CTS_N_MARK,
+       HCTS1_N_MARK, CTS0_N_MARK, MSIOF3_SYNC_MARK, DU2_DG3_MARK,
+       LCDOUT11_MARK, PWM0_B_MARK, SCL1_C_MARK, SCL1_CIS_C_MARK,
+       SCIFA0_RTS_N_MARK, HRTS1_N_MARK, RTS0_N_TANS_MARK,
+       MSIOF3_SS1_MARK, DU2_DG0_MARK, LCDOUT8_MARK, PWM1_B_MARK,
+       SCIFA1_RXD_MARK, AD_DI_MARK, RX1_MARK,
+       DU2_EXODDF_DU2_ODDF_DISP_CDE_MARK, QCPV_QDE_MARK,
+       SCIFA1_TXD_MARK, AD_DO_MARK, TX1_MARK, DU2_DG1_MARK,
+       LCDOUT9_MARK, SCIFA1_CTS_N_MARK, AD_CLK_MARK,
+       CTS1_N_MARK, MSIOF3_RXD_MARK, DU0_DOTCLKOUT_MARK, QCLK_MARK,
+       SCIFA1_RTS_N_MARK, AD_NCS_N_MARK, RTS1_N_TANS_MARK,
+       MSIOF3_TXD_MARK, DU1_DOTCLKOUT_MARK, QSTVB_QVE_MARK,
+       HRTS0_N_C_MARK,
+
+       SCIFA2_SCK_MARK, FMCLK_MARK, MSIOF3_SCK_MARK, DU2_DG7_MARK,
+       LCDOUT15_MARK, SCIF_CLK_B_MARK, SCIFA2_RXD_MARK, FMIN_MARK,
+       DU2_DB0_MARK, LCDOUT16_MARK, SCL2_MARK, SCL2_CIS_MARK,
+       SCIFA2_TXD_MARK, BPFCLK_MARK, DU2_DB1_MARK, LCDOUT17_MARK,
+       SDA2_MARK, SDA2_CIS_MARK, HSCK0_MARK, TS_SDEN0_MARK,
+       DU2_DG4_MARK, LCDOUT12_MARK, HCTS0_N_C_MARK, HRX0_MARK,
+       DU2_DB2_MARK, LCDOUT18_MARK, HTX0_MARK, DU2_DB3_MARK,
+       LCDOUT19_MARK, HCTS0_N_MARK, SSI_SCK9_MARK, DU2_DB4_MARK,
+       LCDOUT20_MARK, HRTS0_N_MARK, SSI_WS9_MARK, DU2_DB5_MARK,
+       LCDOUT21_MARK, MSIOF0_SCK_MARK, TS_SDAT0_MARK, ADICLK_MARK,
+       DU2_DB6_MARK, LCDOUT22_MARK, MSIOF0_SYNC_MARK, TS_SCK0_MARK,
+       SSI_SCK2_MARK, ADIDATA_MARK, DU2_DB7_MARK, LCDOUT23_MARK,
+       SCIFA2_RXD_B_MARK, MSIOF0_SS1_MARK, ADICHS0_MARK,
+       DU2_DG5_MARK, LCDOUT13_MARK, MSIOF0_TXD_MARK, ADICHS1_MARK,
+       DU2_DG6_MARK, LCDOUT14_MARK,
+
+       MSIOF0_SS2_MARK, AUDIO_CLKOUT_MARK, ADICHS2_MARK,
+       DU2_DISP_MARK, QPOLA_MARK, HTX0_C_MARK, SCIFA2_TXD_B_MARK,
+       MSIOF0_RXD_MARK, TS_SPSYNC0_MARK, SSI_WS2_MARK,
+       ADICS_SAMP_MARK, DU2_CDE_MARK, QPOLB_MARK, HRX0_C_MARK,
+       USB1_PWEN_MARK, AUDIO_CLKOUT_D_MARK, USB1_OVC_MARK,
+       TCLK1_B_MARK,
+       PINMUX_MARK_END,
+};
+
+static const pinmux_enum_t pinmux_data[] = {
+       PINMUX_DATA_GP_ALL(), /* PINMUX_DATA(GP_M_N_DATA, GP_M_N_FN...), */
+
+       PINMUX_DATA(VI1_DATA7_VI1_B7_MARK, FN_VI1_DATA7_VI1_B7),
+       PINMUX_DATA(USB0_PWEN_MARK, FN_USB0_PWEN),
+       PINMUX_DATA(USB0_OVC_VBUS_MARK, FN_USB0_OVC_VBUS),
+       PINMUX_DATA(USB2_PWEN_MARK, FN_USB2_PWEN),
+       PINMUX_DATA(USB2_OVC_MARK, FN_USB2_OVC),
+       PINMUX_DATA(AVS1_MARK, FN_AVS1),
+       PINMUX_DATA(AVS2_MARK, FN_AVS2),
+       PINMUX_DATA(DU_DOTCLKIN0_MARK, FN_DU_DOTCLKIN0),
+       PINMUX_DATA(DU_DOTCLKIN2_MARK, FN_DU_DOTCLKIN2),
+
+       PINMUX_IPSR_DATA(IP0_2_0, D0),
+       PINMUX_IPSR_MODSEL_DATA(IP0_2_0, MSIOF3_SCK_B, SEL_SOF3_1),
+       PINMUX_IPSR_MODSEL_DATA(IP0_2_0, VI3_DATA0, SEL_VI3_0),
+       PINMUX_IPSR_MODSEL_DATA(IP0_2_0, VI0_G4, SEL_VI0_0),
+       PINMUX_IPSR_MODSEL_DATA(IP0_2_0, VI0_G4_B, SEL_VI0_1),
+       PINMUX_IPSR_DATA(IP0_5_3, D1),
+       PINMUX_IPSR_MODSEL_DATA(IP0_5_3, MSIOF3_SYNC_B, SEL_SOF3_1),
+       PINMUX_IPSR_MODSEL_DATA(IP0_5_3, VI3_DATA1, SEL_VI3_0),
+       PINMUX_IPSR_MODSEL_DATA(IP0_5_3, VI0_G5, SEL_VI0_0),
+       PINMUX_IPSR_MODSEL_DATA(IP0_5_3, VI0_G5_B, SEL_VI0_1),
+       PINMUX_IPSR_DATA(IP0_8_6, D2),
+       PINMUX_IPSR_MODSEL_DATA(IP0_8_6, MSIOF3_RXD_B, SEL_SOF3_1),
+       PINMUX_IPSR_MODSEL_DATA(IP0_8_6, VI3_DATA2, SEL_VI3_0),
+       PINMUX_IPSR_MODSEL_DATA(IP0_8_6, VI0_G6, SEL_VI0_0),
+       PINMUX_IPSR_MODSEL_DATA(IP0_8_6, VI0_G6_B, SEL_VI0_1),
+       PINMUX_IPSR_DATA(IP0_11_9, D3),
+       PINMUX_IPSR_MODSEL_DATA(IP0_11_9, MSIOF3_TXD_B, SEL_SOF3_1),
+       PINMUX_IPSR_MODSEL_DATA(IP0_11_9, VI3_DATA3, SEL_VI3_0),
+       PINMUX_IPSR_MODSEL_DATA(IP0_11_9, VI0_G7, SEL_VI0_0),
+       PINMUX_IPSR_MODSEL_DATA(IP0_11_9, VI0_G7_B, SEL_VI0_1),
+       PINMUX_IPSR_DATA(IP0_15_12, D4),
+       PINMUX_IPSR_MODSEL_DATA(IP0_15_12, SCIFB1_RXD_F, SEL_SCIFB1_5),
+       PINMUX_IPSR_MODSEL_DATA(IP0_15_12, SCIFB0_RXD_C, SEL_SCIFB_2),
+       PINMUX_IPSR_MODSEL_DATA(IP0_15_12, VI3_DATA4, SEL_VI3_0),
+       PINMUX_IPSR_MODSEL_DATA(IP0_15_12, VI0_R0, SEL_VI0_0),
+       PINMUX_IPSR_MODSEL_DATA(IP0_15_12, VI0_R0_B, SEL_VI0_1),
+       PINMUX_IPSR_MODSEL_DATA(IP0_15_12, RX0_B, SEL_SCIF0_1),
+       PINMUX_IPSR_DATA(IP0_19_16, D5),
+       PINMUX_IPSR_MODSEL_DATA(IP0_19_16, SCIFB1_TXD_F, SEL_SCIFB1_5),
+       PINMUX_IPSR_MODSEL_DATA(IP0_19_16, SCIFB0_TXD_C, SEL_SCIFB_2),
+       PINMUX_IPSR_MODSEL_DATA(IP0_19_16, VI3_DATA5, SEL_VI3_0),
+       PINMUX_IPSR_MODSEL_DATA(IP0_19_16, VI0_R1, SEL_VI0_0),
+       PINMUX_IPSR_MODSEL_DATA(IP0_19_16, VI0_R1_B, SEL_VI0_1),
+       PINMUX_IPSR_MODSEL_DATA(IP0_19_16, TX0_B, SEL_SCIF0_1),
+       PINMUX_IPSR_DATA(IP0_22_20, D6),
+       PINMUX_IPSR_MODSEL_DATA(IP0_22_20, SCL2_C, SEL_IIC2_2),
+       PINMUX_IPSR_MODSEL_DATA(IP0_22_20, VI3_DATA6, SEL_VI3_0),
+       PINMUX_IPSR_MODSEL_DATA(IP0_22_20, VI0_R2, SEL_VI0_0),
+       PINMUX_IPSR_MODSEL_DATA(IP0_22_20, VI0_R2_B, SEL_VI0_1),
+       PINMUX_IPSR_MODSEL_DATA(IP0_22_20, SCL2_CIS_C, SEL_I2C2_2),
+       PINMUX_IPSR_DATA(IP0_26_23, D7),
+       PINMUX_IPSR_MODSEL_DATA(IP0_26_23, AD_DI_B, SEL_ADI_1),
+       PINMUX_IPSR_MODSEL_DATA(IP0_26_23, SDA2_C, SEL_IIC2_2),
+       PINMUX_IPSR_MODSEL_DATA(IP0_26_23, VI3_DATA7, SEL_VI3_0),
+       PINMUX_IPSR_MODSEL_DATA(IP0_26_23, VI0_R3, SEL_VI0_0),
+       PINMUX_IPSR_MODSEL_DATA(IP0_26_23, VI0_R3_B, SEL_VI0_1),
+       PINMUX_IPSR_MODSEL_DATA(IP0_26_23, SDA2_CIS_C, SEL_I2C2_2),
+       PINMUX_IPSR_DATA(IP0_30_27, D8),
+       PINMUX_IPSR_MODSEL_DATA(IP0_30_27, SCIFA1_SCK_C, SEL_SCIFA1_2),
+       PINMUX_IPSR_DATA(IP0_30_27, AVB_TXD0),
+       PINMUX_IPSR_DATA(IP0_30_27, MII_TXD0),
+       PINMUX_IPSR_MODSEL_DATA(IP0_30_27, VI0_G0, SEL_VI0_0),
+       PINMUX_IPSR_MODSEL_DATA(IP0_30_27, VI0_G0_B, SEL_VI0_1),
+       PINMUX_IPSR_MODSEL_DATA(IP0_30_27, VI2_DATA0_VI2_B0, SEL_VI2_0),
+
+       PINMUX_IPSR_DATA(IP1_3_0, D9),
+       PINMUX_IPSR_MODSEL_DATA(IP1_3_0, SCIFA1_RXD_C, SEL_SCIFA1_2),
+       PINMUX_IPSR_DATA(IP1_3_0, AVB_TXD1),
+       PINMUX_IPSR_DATA(IP1_3_0, MII_TXD1),
+       PINMUX_IPSR_MODSEL_DATA(IP1_3_0, VI0_G1, SEL_VI0_0),
+       PINMUX_IPSR_MODSEL_DATA(IP1_3_0, VI0_G1_B, SEL_VI0_1),
+       PINMUX_IPSR_MODSEL_DATA(IP1_3_0, VI2_DATA1_VI2_B1, SEL_VI2_0),
+       PINMUX_IPSR_DATA(IP1_7_4, D10),
+       PINMUX_IPSR_MODSEL_DATA(IP1_7_4, SCIFA1_TXD_C, SEL_SCIFA1_2),
+       PINMUX_IPSR_DATA(IP1_7_4, AVB_TXD2),
+       PINMUX_IPSR_DATA(IP1_7_4, MII_TXD2),
+       PINMUX_IPSR_MODSEL_DATA(IP1_7_4, VI0_G2, SEL_VI0_0),
+       PINMUX_IPSR_MODSEL_DATA(IP1_7_4, VI0_G2_B, SEL_VI0_1),
+       PINMUX_IPSR_MODSEL_DATA(IP1_7_4, VI2_DATA2_VI2_B2, SEL_VI2_0),
+       PINMUX_IPSR_DATA(IP1_11_8, D11),
+       PINMUX_IPSR_MODSEL_DATA(IP1_11_8, SCIFA1_CTS_N_C, SEL_SCIFA1_2),
+       PINMUX_IPSR_DATA(IP1_11_8, AVB_TXD3),
+       PINMUX_IPSR_DATA(IP1_11_8, MII_TXD3),
+       PINMUX_IPSR_MODSEL_DATA(IP1_11_8, VI0_G3, SEL_VI0_0),
+       PINMUX_IPSR_MODSEL_DATA(IP1_11_8, VI0_G3_B, SEL_VI0_1),
+       PINMUX_IPSR_MODSEL_DATA(IP1_11_8, VI2_DATA3_VI2_B3, SEL_VI2_0),
+       PINMUX_IPSR_DATA(IP1_14_12, D12),
+       PINMUX_IPSR_MODSEL_DATA(IP1_14_12, SCIFA1_RTS_N_C, SEL_SCIFA1_2),
+       PINMUX_IPSR_DATA(IP1_14_12, AVB_TXD4),
+       PINMUX_IPSR_MODSEL_DATA(IP1_14_12, VI0_HSYNC_N, SEL_VI0_0),
+       PINMUX_IPSR_MODSEL_DATA(IP1_14_12, VI0_HSYNC_N_B, SEL_VI0_1),
+       PINMUX_IPSR_MODSEL_DATA(IP1_14_12, VI2_DATA4_VI2_B4, SEL_VI2_0),
+       PINMUX_IPSR_DATA(IP1_17_15, D13),
+       PINMUX_IPSR_MODSEL_DATA(IP1_17_15, AVB_TXD5, SEL_SCIFA1_2),
+       PINMUX_IPSR_MODSEL_DATA(IP1_17_15, VI0_VSYNC_N, SEL_VI0_0),
+       PINMUX_IPSR_MODSEL_DATA(IP1_17_15, VI0_VSYNC_N_B, SEL_VI0_1),
+       PINMUX_IPSR_MODSEL_DATA(IP1_17_15, VI2_DATA5_VI2_B5, SEL_VI2_0),
+       PINMUX_IPSR_DATA(IP1_21_18, D14),
+       PINMUX_IPSR_MODSEL_DATA(IP1_21_18, SCIFB1_RXD_C, SEL_SCIFB1_2),
+       PINMUX_IPSR_DATA(IP1_21_18, AVB_TXD6),
+       PINMUX_IPSR_MODSEL_DATA(IP1_21_18, RX1_B, SEL_SCIF1_1),
+       PINMUX_IPSR_MODSEL_DATA(IP1_21_18, VI0_CLKENB, SEL_VI0_0),
+       PINMUX_IPSR_MODSEL_DATA(IP1_21_18, VI0_CLKENB_B, SEL_VI0_1),
+       PINMUX_IPSR_MODSEL_DATA(IP1_21_18, VI2_DATA6_VI2_B6, SEL_VI2_0),
+       PINMUX_IPSR_DATA(IP1_25_22, D15),
+       PINMUX_IPSR_MODSEL_DATA(IP1_25_22, SCIFB1_TXD_C, SEL_SCIFB1_2),
+       PINMUX_IPSR_DATA(IP1_25_22, AVB_TXD7),
+       PINMUX_IPSR_MODSEL_DATA(IP1_25_22, TX1_B, SEL_SCIF1_1),
+       PINMUX_IPSR_MODSEL_DATA(IP1_25_22, VI0_FIELD, SEL_VI0_0),
+       PINMUX_IPSR_MODSEL_DATA(IP1_25_22, VI0_FIELD_B, SEL_VI0_1),
+       PINMUX_IPSR_MODSEL_DATA(IP1_25_22, VI2_DATA7_VI2_B7, SEL_VI2_0),
+       PINMUX_IPSR_DATA(IP1_27_26, A0),
+       PINMUX_IPSR_DATA(IP1_27_26, PWM3),
+       PINMUX_IPSR_DATA(IP1_29_28, A1),
+       PINMUX_IPSR_DATA(IP1_29_28, PWM4),
+
+       PINMUX_IPSR_DATA(IP2_2_0, A2),
+       PINMUX_IPSR_DATA(IP2_2_0, PWM5),
+       PINMUX_IPSR_MODSEL_DATA(IP2_2_0, MSIOF1_SS1_B, SEL_SOF1_1),
+       PINMUX_IPSR_DATA(IP2_5_3, A3),
+       PINMUX_IPSR_DATA(IP2_5_3, PWM6),
+       PINMUX_IPSR_MODSEL_DATA(IP2_5_3, MSIOF1_SS2_B, SEL_SOF1_1),
+       PINMUX_IPSR_DATA(IP2_8_6, A4),
+       PINMUX_IPSR_MODSEL_DATA(IP2_8_6, MSIOF1_TXD_B, SEL_SOF1_1),
+       PINMUX_IPSR_DATA(IP2_8_6, TPU0TO0),
+       PINMUX_IPSR_DATA(IP2_11_9, A5),
+       PINMUX_IPSR_MODSEL_DATA(IP2_11_9, SCIFA1_TXD_B, SEL_SCIFA1_1),
+       PINMUX_IPSR_DATA(IP2_11_9, TPU0TO1),
+       PINMUX_IPSR_DATA(IP2_14_12, A6),
+       PINMUX_IPSR_MODSEL_DATA(IP2_14_12, SCIFA1_RTS_N_B, SEL_SCIFA1_1),
+       PINMUX_IPSR_DATA(IP2_14_12, TPU0TO2),
+       PINMUX_IPSR_DATA(IP2_17_15, A7),
+       PINMUX_IPSR_MODSEL_DATA(IP2_17_15, SCIFA1_SCK_B, SEL_SCIFA1_1),
+       PINMUX_IPSR_DATA(IP2_17_15, AUDIO_CLKOUT_B),
+       PINMUX_IPSR_DATA(IP2_17_15, TPU0TO3),
+       PINMUX_IPSR_DATA(IP2_21_18, A8),
+       PINMUX_IPSR_MODSEL_DATA(IP2_21_18, SCIFA1_RXD_B, SEL_SCIFA1_1),
+       PINMUX_IPSR_MODSEL_DATA(IP2_21_18, SSI_SCK5_B, SEL_SSI5_1),
+       PINMUX_IPSR_MODSEL_DATA(IP2_21_18, VI0_R4, SEL_VI0_0),
+       PINMUX_IPSR_MODSEL_DATA(IP2_21_18, VI0_R4_B, SEL_VI0_1),
+       PINMUX_IPSR_MODSEL_DATA(IP2_21_18, SCIFB2_RXD_C, SEL_SCIFB2_2),
+       PINMUX_IPSR_MODSEL_DATA(IP2_21_18, VI2_DATA0_VI2_B0_B, SEL_VI2_1),
+       PINMUX_IPSR_DATA(IP2_25_22, A9),
+       PINMUX_IPSR_MODSEL_DATA(IP2_25_22, SCIFA1_CTS_N_B, SEL_SCIFA1_1),
+       PINMUX_IPSR_MODSEL_DATA(IP2_25_22, SSI_WS5_B, SEL_SSI5_1),
+       PINMUX_IPSR_MODSEL_DATA(IP2_25_22, VI0_R5, SEL_VI0_0),
+       PINMUX_IPSR_MODSEL_DATA(IP2_25_22, VI0_R5_B, SEL_VI0_1),
+       PINMUX_IPSR_MODSEL_DATA(IP2_25_22, SCIFB2_TXD_C, SEL_SCIFB2_2),
+       PINMUX_IPSR_MODSEL_DATA(IP2_25_22, VI2_DATA1_VI2_B1_B, SEL_VI2_1),
+       PINMUX_IPSR_DATA(IP2_28_26, A10),
+       PINMUX_IPSR_MODSEL_DATA(IP2_28_26, SSI_SDATA5_B, SEL_SSI5_1),
+       PINMUX_IPSR_DATA(IP2_28_26, MSIOF2_SYNC),
+       PINMUX_IPSR_MODSEL_DATA(IP2_28_26, VI0_R6, SEL_VI0_0),
+       PINMUX_IPSR_MODSEL_DATA(IP2_28_26, VI0_R6_B, SEL_VI0_1),
+       PINMUX_IPSR_MODSEL_DATA(IP2_28_26, VI2_DATA2_VI2_B2_B, SEL_VI2_1),
+
+       PINMUX_IPSR_DATA(IP3_3_0, A11),
+       PINMUX_IPSR_MODSEL_DATA(IP3_3_0, SCIFB2_CTS_N_B, SEL_SCIFB2_1),
+       PINMUX_IPSR_DATA(IP3_3_0, MSIOF2_SCK),
+       PINMUX_IPSR_MODSEL_DATA(IP3_3_0, VI1_R0, SEL_VI1_0),
+       PINMUX_IPSR_MODSEL_DATA(IP3_3_0, VI1_R0_B, SEL_VI1_1),
+       PINMUX_IPSR_DATA(IP3_3_0, VI2_G0),
+       PINMUX_IPSR_DATA(IP3_3_0, VI2_DATA3_VI2_B3_B),
+       PINMUX_IPSR_DATA(IP3_7_4, A12),
+       PINMUX_IPSR_MODSEL_DATA(IP3_7_4, SCIFB2_RXD_B, SEL_SCIFB2_1),
+       PINMUX_IPSR_DATA(IP3_7_4, MSIOF2_TXD),
+       PINMUX_IPSR_MODSEL_DATA(IP3_7_4, VI1_R1, SEL_VI1_0),
+       PINMUX_IPSR_MODSEL_DATA(IP3_7_4, VI1_R1_B, SEL_VI1_1),
+       PINMUX_IPSR_DATA(IP3_7_4, VI2_G1),
+       PINMUX_IPSR_DATA(IP3_7_4, VI2_DATA4_VI2_B4_B),
+       PINMUX_IPSR_DATA(IP3_11_8, A13),
+       PINMUX_IPSR_MODSEL_DATA(IP3_11_8, SCIFB2_RTS_N_B, SEL_SCIFB2_1),
+       PINMUX_IPSR_DATA(IP3_11_8, EX_WAIT2),
+       PINMUX_IPSR_DATA(IP3_11_8, MSIOF2_RXD),
+       PINMUX_IPSR_MODSEL_DATA(IP3_11_8, VI1_R2, SEL_VI1_0),
+       PINMUX_IPSR_MODSEL_DATA(IP3_11_8, VI1_R2_B, SEL_VI1_1),
+       PINMUX_IPSR_DATA(IP3_11_8, VI2_G2),
+       PINMUX_IPSR_MODSEL_DATA(IP3_11_8, VI2_DATA5_VI2_B5_B, SEL_VI2_0),
+       PINMUX_IPSR_DATA(IP3_14_12, A14),
+       PINMUX_IPSR_MODSEL_DATA(IP3_14_12, SCIFB2_TXD_B, SEL_SCIFB2_1),
+       PINMUX_IPSR_DATA(IP3_14_12, ATACS11_N),
+       PINMUX_IPSR_DATA(IP3_14_12, MSIOF2_SS1),
+       PINMUX_IPSR_DATA(IP3_17_15, A15),
+       PINMUX_IPSR_MODSEL_DATA(IP3_17_15, SCIFB2_SCK_B, SEL_SCIFB2_1),
+       PINMUX_IPSR_DATA(IP3_17_15, ATARD1_N),
+       PINMUX_IPSR_DATA(IP3_17_15, MSIOF2_SS2),
+       PINMUX_IPSR_DATA(IP3_19_18, A16),
+       PINMUX_IPSR_DATA(IP3_19_18, ATAWR1_N),
+       PINMUX_IPSR_DATA(IP3_22_20, A17),
+       PINMUX_IPSR_MODSEL_DATA(IP3_22_20, AD_DO_B, SEL_ADI_1),
+       PINMUX_IPSR_DATA(IP3_22_20, ATADIR1_N),
+       PINMUX_IPSR_DATA(IP3_25_23, A18),
+       PINMUX_IPSR_MODSEL_DATA(IP3_25_23, AD_CLK_B, SEL_ADI_1),
+       PINMUX_IPSR_DATA(IP3_25_23, ATAG1_N),
+       PINMUX_IPSR_DATA(IP3_28_26, A19),
+       PINMUX_IPSR_MODSEL_DATA(IP3_28_26, AD_NCS_N_B, SEL_ADI_1),
+       PINMUX_IPSR_DATA(IP3_28_26, ATACS01_N),
+       PINMUX_IPSR_MODSEL_DATA(IP3_28_26, EX_WAIT0_B, SEL_LBS_1),
+       PINMUX_IPSR_DATA(IP3_31_29, A20),
+       PINMUX_IPSR_DATA(IP3_31_29, SPCLK),
+       PINMUX_IPSR_MODSEL_DATA(IP3_31_29, VI1_R3, SEL_VI1_0),
+       PINMUX_IPSR_MODSEL_DATA(IP3_31_29, VI1_R3_B, SEL_VI1_1),
+       PINMUX_IPSR_DATA(IP3_31_29, VI2_G4),
+
+       PINMUX_IPSR_DATA(IP4_2_0, A21),
+       PINMUX_IPSR_DATA(IP4_2_0, MOSI_IO0),
+       PINMUX_IPSR_MODSEL_DATA(IP4_2_0, VI1_R4, SEL_VI1_0),
+       PINMUX_IPSR_MODSEL_DATA(IP4_2_0, VI1_R4_B, SEL_VI1_1),
+       PINMUX_IPSR_DATA(IP4_2_0, VI2_G5),
+       PINMUX_IPSR_DATA(IP4_5_3, A22),
+       PINMUX_IPSR_DATA(IP4_5_3, MISO_IO1),
+       PINMUX_IPSR_MODSEL_DATA(IP4_5_3, VI1_R5, SEL_VI1_0),
+       PINMUX_IPSR_MODSEL_DATA(IP4_5_3, VI1_R5_B, SEL_VI1_1),
+       PINMUX_IPSR_DATA(IP4_5_3, VI2_G6),
+       PINMUX_IPSR_DATA(IP4_8_6, A23),
+       PINMUX_IPSR_DATA(IP4_8_6, IO2),
+       PINMUX_IPSR_MODSEL_DATA(IP4_8_6, VI1_G7, SEL_VI1_0),
+       PINMUX_IPSR_MODSEL_DATA(IP4_8_6, VI1_G7_B, SEL_VI1_1),
+       PINMUX_IPSR_DATA(IP4_8_6, VI2_G7),
+       PINMUX_IPSR_DATA(IP4_11_9, A24),
+       PINMUX_IPSR_DATA(IP4_11_9, IO3),
+       PINMUX_IPSR_MODSEL_DATA(IP4_11_9, VI1_R7, SEL_VI1_0),
+       PINMUX_IPSR_MODSEL_DATA(IP4_11_9, VI1_R7_B, SEL_VI1_1),
+       PINMUX_IPSR_MODSEL_DATA(IP4_11_9, VI2_CLKENB, SEL_VI2_0),
+       PINMUX_IPSR_MODSEL_DATA(IP4_11_9, VI2_CLKENB_B, SEL_VI2_1),
+       PINMUX_IPSR_DATA(IP4_14_12, A25),
+       PINMUX_IPSR_DATA(IP4_14_12, SSL),
+       PINMUX_IPSR_MODSEL_DATA(IP4_14_12, VI1_G6, SEL_VI1_0),
+       PINMUX_IPSR_MODSEL_DATA(IP4_14_12, VI1_G6_B, SEL_VI1_1),
+       PINMUX_IPSR_MODSEL_DATA(IP4_14_12, VI2_FIELD, SEL_VI2_0),
+       PINMUX_IPSR_MODSEL_DATA(IP4_14_12, VI2_FIELD_B, SEL_VI2_1),
+       PINMUX_IPSR_DATA(IP4_17_15, CS0_N),
+       PINMUX_IPSR_MODSEL_DATA(IP4_17_15, VI1_R6, SEL_VI1_0),
+       PINMUX_IPSR_MODSEL_DATA(IP4_17_15, VI1_R6_B, SEL_VI1_1),
+       PINMUX_IPSR_DATA(IP4_17_15, VI2_G3),
+       PINMUX_IPSR_MODSEL_DATA(IP4_17_15, MSIOF0_SS2_B, SEL_SOF0_1),
+       PINMUX_IPSR_DATA(IP4_20_18, CS1_N_A26),
+       PINMUX_IPSR_DATA(IP4_20_18, SPEEDIN),
+       PINMUX_IPSR_MODSEL_DATA(IP4_20_18, VI0_R7, SEL_VI0_0),
+       PINMUX_IPSR_MODSEL_DATA(IP4_20_18, VI0_R7_B, SEL_VI0_1),
+       PINMUX_IPSR_MODSEL_DATA(IP4_20_18, VI2_CLK, SEL_VI2_0),
+       PINMUX_IPSR_MODSEL_DATA(IP4_20_18, VI2_CLK_B, SEL_VI2_1),
+       PINMUX_IPSR_DATA(IP4_23_21, EX_CS0_N),
+       PINMUX_IPSR_MODSEL_DATA(IP4_23_21, HRX1_B, SEL_HSCIF1_1),
+       PINMUX_IPSR_MODSEL_DATA(IP4_23_21, VI1_G5, SEL_VI1_0),
+       PINMUX_IPSR_MODSEL_DATA(IP4_23_21, VI1_G5_B, SEL_VI1_1),
+       PINMUX_IPSR_DATA(IP4_23_21, VI2_R0),
+       PINMUX_IPSR_MODSEL_DATA(IP4_23_21, HTX0_B, SEL_HSCIF0_1),
+       PINMUX_IPSR_MODSEL_DATA(IP4_23_21, MSIOF0_SS1_B, SEL_SOF0_1),
+       PINMUX_IPSR_DATA(IP4_26_24, EX_CS1_N),
+       PINMUX_IPSR_DATA(IP4_26_24, GPS_CLK),
+       PINMUX_IPSR_MODSEL_DATA(IP4_26_24, HCTS1_N_B, SEL_HSCIF1_1),
+       PINMUX_IPSR_MODSEL_DATA(IP4_26_24, VI1_FIELD, SEL_VI1_0),
+       PINMUX_IPSR_MODSEL_DATA(IP4_26_24, VI1_FIELD_B, SEL_VI1_1),
+       PINMUX_IPSR_DATA(IP4_26_24, VI2_R1),
+       PINMUX_IPSR_DATA(IP4_29_27, EX_CS2_N),
+       PINMUX_IPSR_DATA(IP4_29_27, GPS_SIGN),
+       PINMUX_IPSR_MODSEL_DATA(IP4_29_27, HRTS1_N_B, SEL_HSCIF1_1),
+       PINMUX_IPSR_DATA(IP4_29_27, VI3_CLKENB),
+       PINMUX_IPSR_MODSEL_DATA(IP4_29_27, VI1_G0, SEL_VI1_0),
+       PINMUX_IPSR_MODSEL_DATA(IP4_29_27, VI1_G0_B, SEL_VI1_1),
+       PINMUX_IPSR_DATA(IP4_29_27, VI2_R2),
+
+       PINMUX_IPSR_DATA(IP5_2_0, EX_CS3_N),
+       PINMUX_IPSR_DATA(IP5_2_0, GPS_MAG),
+       PINMUX_IPSR_DATA(IP5_2_0, VI3_FIELD),
+       PINMUX_IPSR_MODSEL_DATA(IP5_2_0, VI1_G1, SEL_VI1_0),
+       PINMUX_IPSR_MODSEL_DATA(IP5_2_0, VI1_G1_B, SEL_VI1_1),
+       PINMUX_IPSR_DATA(IP5_2_0, VI2_R3),
+       PINMUX_IPSR_MODSEL_DATA(IP5_5_3, EX_CS4_N, SEL_I2C1_0),
+       PINMUX_IPSR_MODSEL_DATA(IP5_5_3, MSIOF1_SCK_B, SEL_SOF1_1),
+       PINMUX_IPSR_DATA(IP5_5_3, VI3_HSYNC_N),
+       PINMUX_IPSR_MODSEL_DATA(IP5_5_3, VI2_HSYNC_N, SEL_VI2_0),
+       PINMUX_IPSR_MODSEL_DATA(IP5_5_3, SCL1, SEL_IIC1_0),
+       PINMUX_IPSR_MODSEL_DATA(IP5_5_3, VI2_HSYNC_N_B, SEL_VI2_1),
+       PINMUX_IPSR_DATA(IP5_5_3, INTC_EN0_N),
+       PINMUX_IPSR_MODSEL_DATA(IP5_5_3, SCL1_CIS, SEL_I2C1_0),
+       PINMUX_IPSR_DATA(IP5_9_6, EX_CS5_N),
+       PINMUX_IPSR_MODSEL_DATA(IP5_9_6, CAN0_RX, SEL_CAN0_0),
+       PINMUX_IPSR_MODSEL_DATA(IP5_9_6, MSIOF1_RXD_B, SEL_SOF1_1),
+       PINMUX_IPSR_DATA(IP5_9_6, VI3_VSYNC_N),
+       PINMUX_IPSR_MODSEL_DATA(IP5_9_6, VI1_G2, SEL_VI1_0),
+       PINMUX_IPSR_MODSEL_DATA(IP5_9_6, VI1_G2_B, SEL_VI1_1),
+       PINMUX_IPSR_DATA(IP5_9_6, VI2_R4),
+       PINMUX_IPSR_MODSEL_DATA(IP5_9_6, SDA1, SEL_IIC1_0),
+       PINMUX_IPSR_DATA(IP5_9_6, INTC_EN1_N),
+       PINMUX_IPSR_MODSEL_DATA(IP5_9_6, SDA1_CIS, SEL_I2C1_0),
+       PINMUX_IPSR_DATA(IP5_12_10, BS_N),
+       PINMUX_IPSR_MODSEL_DATA(IP5_12_10, IETX, SEL_IEB_0),
+       PINMUX_IPSR_MODSEL_DATA(IP5_12_10, HTX1_B, SEL_HSCIF1_1),
+       PINMUX_IPSR_MODSEL_DATA(IP5_12_10, CAN1_TX, SEL_CAN1_0),
+       PINMUX_IPSR_DATA(IP5_12_10, DRACK0),
+       PINMUX_IPSR_MODSEL_DATA(IP5_12_10, IETX_C, SEL_IEB_2),
+       PINMUX_IPSR_DATA(IP5_14_13, RD_N),
+       PINMUX_IPSR_MODSEL_DATA(IP5_14_13, CAN0_TX, SEL_CAN0_0),
+       PINMUX_IPSR_MODSEL_DATA(IP5_14_13, SCIFA0_SCK_B, SEL_SCFA_1),
+       PINMUX_IPSR_DATA(IP5_17_15, RD_WR_N),
+       PINMUX_IPSR_MODSEL_DATA(IP5_17_15, VI1_G3, SEL_VI1_0),
+       PINMUX_IPSR_MODSEL_DATA(IP5_17_15, VI1_G3_B, SEL_VI1_1),
+       PINMUX_IPSR_DATA(IP5_17_15, VI2_R5),
+       PINMUX_IPSR_MODSEL_DATA(IP5_17_15, SCIFA0_RXD_B, SEL_SCFA_1),
+       PINMUX_IPSR_DATA(IP5_17_15, INTC_IRQ4_N),
+       PINMUX_IPSR_DATA(IP5_20_18, WE0_N),
+       PINMUX_IPSR_MODSEL_DATA(IP5_20_18, IECLK, SEL_IEB_0),
+       PINMUX_IPSR_MODSEL_DATA(IP5_20_18, CAN_CLK, SEL_CANCLK_0),
+       PINMUX_IPSR_MODSEL_DATA(IP5_20_18, VI2_VSYNC_N, SEL_VI2_0),
+       PINMUX_IPSR_MODSEL_DATA(IP5_20_18, SCIFA0_TXD_B, SEL_SCFA_1),
+       PINMUX_IPSR_MODSEL_DATA(IP5_20_18, VI2_VSYNC_N_B, SEL_VI2_1),
+       PINMUX_IPSR_DATA(IP5_23_21, WE1_N),
+       PINMUX_IPSR_MODSEL_DATA(IP5_23_21, IERX, SEL_IEB_0),
+       PINMUX_IPSR_MODSEL_DATA(IP5_23_21, CAN1_RX, SEL_CAN1_0),
+       PINMUX_IPSR_MODSEL_DATA(IP5_23_21, VI1_G4, SEL_VI1_0),
+       PINMUX_IPSR_MODSEL_DATA(IP5_23_21, VI1_G4_B, SEL_VI1_1),
+       PINMUX_IPSR_DATA(IP5_23_21, VI2_R6),
+       PINMUX_IPSR_MODSEL_DATA(IP5_23_21, SCIFA0_CTS_N_B, SEL_SCFA_1),
+       PINMUX_IPSR_MODSEL_DATA(IP5_23_21, IERX_C, SEL_IEB_2),
+       PINMUX_IPSR_DATA(IP5_26_24, EX_WAIT0),
+       PINMUX_IPSR_DATA(IP5_26_24, IRQ3),
+       PINMUX_IPSR_DATA(IP5_26_24, INTC_IRQ3_N),
+       PINMUX_IPSR_MODSEL_DATA(IP5_26_24, VI3_CLK, SEL_VI3_0),
+       PINMUX_IPSR_MODSEL_DATA(IP5_26_24, SCIFA0_RTS_N_B, SEL_SCFA_1),
+       PINMUX_IPSR_MODSEL_DATA(IP5_26_24, HRX0_B, SEL_HSCIF0_1),
+       PINMUX_IPSR_MODSEL_DATA(IP5_26_24, MSIOF0_SCK_B, SEL_SOF0_1),
+       PINMUX_IPSR_DATA(IP5_29_27, DREQ0_N),
+       PINMUX_IPSR_MODSEL_DATA(IP5_29_27, VI1_HSYNC_N, SEL_VI1_0),
+       PINMUX_IPSR_MODSEL_DATA(IP5_29_27, VI1_HSYNC_N_B, SEL_VI1_1),
+       PINMUX_IPSR_DATA(IP5_29_27, VI2_R7),
+       PINMUX_IPSR_MODSEL_DATA(IP5_29_27, SSI_SCK78_C, SEL_SSI7_2),
+       PINMUX_IPSR_MODSEL_DATA(IP5_29_27, SSI_WS78_B, SEL_SSI7_1),
+
+       PINMUX_IPSR_DATA(IP6_2_0, DACK0),
+       PINMUX_IPSR_DATA(IP6_2_0, IRQ0),
+       PINMUX_IPSR_DATA(IP6_2_0, INTC_IRQ0_N),
+       PINMUX_IPSR_MODSEL_DATA(IP6_2_0, SSI_SCK6_B, SEL_SSI6_1),
+       PINMUX_IPSR_MODSEL_DATA(IP6_2_0, VI1_VSYNC_N, SEL_VI1_0),
+       PINMUX_IPSR_MODSEL_DATA(IP6_2_0, VI1_VSYNC_N_B, SEL_VI1_1),
+       PINMUX_IPSR_MODSEL_DATA(IP6_2_0, SSI_WS78_C, SEL_SSI7_2),
+       PINMUX_IPSR_DATA(IP6_5_3, DREQ1_N),
+       PINMUX_IPSR_MODSEL_DATA(IP6_5_3, VI1_CLKENB, SEL_VI1_0),
+       PINMUX_IPSR_MODSEL_DATA(IP6_5_3, VI1_CLKENB_B, SEL_VI1_1),
+       PINMUX_IPSR_MODSEL_DATA(IP6_5_3, SSI_SDATA7_C, SEL_SSI7_2),
+       PINMUX_IPSR_MODSEL_DATA(IP6_5_3, SSI_SCK78_B, SEL_SSI7_1),
+       PINMUX_IPSR_DATA(IP6_8_6, DACK1),
+       PINMUX_IPSR_DATA(IP6_8_6, IRQ1),
+       PINMUX_IPSR_DATA(IP6_8_6, INTC_IRQ1_N),
+       PINMUX_IPSR_MODSEL_DATA(IP6_8_6, SSI_WS6_B, SEL_SSI6_1),
+       PINMUX_IPSR_MODSEL_DATA(IP6_8_6, SSI_SDATA8_C, SEL_SSI8_2),
+       PINMUX_IPSR_DATA(IP6_10_9, DREQ2_N),
+       PINMUX_IPSR_MODSEL_DATA(IP6_10_9, HSCK1_B, SEL_HSCIF1_1),
+       PINMUX_IPSR_MODSEL_DATA(IP6_10_9, HCTS0_N_B, SEL_HSCIF0_1),
+       PINMUX_IPSR_MODSEL_DATA(IP6_10_9, MSIOF0_TXD_B, SEL_SOF0_1),
+       PINMUX_IPSR_DATA(IP6_13_11, DACK2),
+       PINMUX_IPSR_DATA(IP6_13_11, IRQ2),
+       PINMUX_IPSR_DATA(IP6_13_11, INTC_IRQ2_N),
+       PINMUX_IPSR_MODSEL_DATA(IP6_13_11, SSI_SDATA6_B, SEL_SSI6_1),
+       PINMUX_IPSR_MODSEL_DATA(IP6_13_11, HRTS0_N_B, SEL_HSCIF0_1),
+       PINMUX_IPSR_MODSEL_DATA(IP6_13_11, MSIOF0_RXD_B, SEL_SOF0_1),
+       PINMUX_IPSR_DATA(IP6_16_14, ETH_CRS_DV),
+       PINMUX_IPSR_DATA(IP6_16_14, RMII_CRS_DV),
+       PINMUX_IPSR_MODSEL_DATA(IP6_16_14, STP_ISCLK_0_B, SEL_SSP_1),
+       PINMUX_IPSR_MODSEL_DATA(IP6_16_14, TS_SDEN0_D, SEL_TSIF0_3),
+       PINMUX_IPSR_MODSEL_DATA(IP6_16_14, GLO_Q0_C, SEL_GPS_2),
+       PINMUX_IPSR_MODSEL_DATA(IP6_16_14, SCL2_E, SEL_IIC2_4),
+       PINMUX_IPSR_MODSEL_DATA(IP6_16_14, SCL2_CIS_E, SEL_I2C2_4),
+       PINMUX_IPSR_DATA(IP6_19_17, ETH_RX_ER),
+       PINMUX_IPSR_DATA(IP6_19_17, RMII_RX_ER),
+       PINMUX_IPSR_MODSEL_DATA(IP6_19_17, STP_ISD_0_B, SEL_SSP_1),
+       PINMUX_IPSR_MODSEL_DATA(IP6_19_17, TS_SPSYNC0_D, SEL_TSIF0_3),
+       PINMUX_IPSR_MODSEL_DATA(IP6_19_17, GLO_Q1_C, SEL_GPS_2),
+       PINMUX_IPSR_MODSEL_DATA(IP6_19_17, SDA2_E, SEL_IIC2_4),
+       PINMUX_IPSR_MODSEL_DATA(IP6_19_17, SDA2_CIS_E, SEL_I2C2_4),
+       PINMUX_IPSR_DATA(IP6_22_20, ETH_RXD0),
+       PINMUX_IPSR_DATA(IP6_22_20, RMII_RXD0),
+       PINMUX_IPSR_MODSEL_DATA(IP6_22_20, STP_ISEN_0_B, SEL_SSP_1),
+       PINMUX_IPSR_MODSEL_DATA(IP6_22_20, TS_SDAT0_D, SEL_TSIF0_3),
+       PINMUX_IPSR_MODSEL_DATA(IP6_22_20, GLO_I0_C, SEL_GPS_2),
+       PINMUX_IPSR_MODSEL_DATA(IP6_22_20, SCIFB1_SCK_G, SEL_SCIFB1_6),
+       PINMUX_IPSR_MODSEL_DATA(IP6_22_20, SCK1_E, SEL_SCIF1_4),
+       PINMUX_IPSR_DATA(IP6_25_23, ETH_RXD1),
+       PINMUX_IPSR_DATA(IP6_25_23, RMII_RXD1),
+       PINMUX_IPSR_MODSEL_DATA(IP6_25_23, HRX0_E, SEL_HSCIF0_4),
+       PINMUX_IPSR_MODSEL_DATA(IP6_25_23, STP_ISSYNC_0_B, SEL_SSP_1),
+       PINMUX_IPSR_MODSEL_DATA(IP6_25_23, TS_SCK0_D, SEL_TSIF0_3),
+       PINMUX_IPSR_MODSEL_DATA(IP6_25_23, GLO_I1_C, SEL_GPS_2),
+       PINMUX_IPSR_MODSEL_DATA(IP6_25_23, SCIFB1_RXD_G, SEL_SCIFB1_6),
+       PINMUX_IPSR_MODSEL_DATA(IP6_25_23, RX1_E, SEL_SCIF1_4),
+       PINMUX_IPSR_DATA(IP6_28_26, ETH_LINK),
+       PINMUX_IPSR_DATA(IP6_28_26, RMII_LINK),
+       PINMUX_IPSR_MODSEL_DATA(IP6_28_26, HTX0_E, SEL_HSCIF0_4),
+       PINMUX_IPSR_MODSEL_DATA(IP6_28_26, STP_IVCXO27_0_B, SEL_SSP_1),
+       PINMUX_IPSR_MODSEL_DATA(IP6_28_26, SCIFB1_TXD_G, SEL_SCIFB1_6),
+       PINMUX_IPSR_MODSEL_DATA(IP6_28_26, TX1_E, SEL_SCIF1_4),
+       PINMUX_IPSR_DATA(IP6_31_29, ETH_REF_CLK),
+       PINMUX_IPSR_DATA(IP6_31_29, RMII_REF_CLK),
+       PINMUX_IPSR_MODSEL_DATA(IP6_31_29, HCTS0_N_E, SEL_HSCIF0_4),
+       PINMUX_IPSR_MODSEL_DATA(IP6_31_29, STP_IVCXO27_1_B, SEL_SSP_1),
+       PINMUX_IPSR_MODSEL_DATA(IP6_31_29, HRX0_F, SEL_HSCIF0_5),
+
+       PINMUX_IPSR_DATA(IP7_2_0, ETH_MDIO),
+       PINMUX_IPSR_DATA(IP7_2_0, RMII_MDIO),
+       PINMUX_IPSR_MODSEL_DATA(IP7_2_0, HRTS0_N_E, SEL_HSCIF0_4),
+       PINMUX_IPSR_MODSEL_DATA(IP7_2_0, SIM0_D_C, SEL_SIM_2),
+       PINMUX_IPSR_MODSEL_DATA(IP7_2_0, HCTS0_N_F, SEL_HSCIF0_5),
+       PINMUX_IPSR_DATA(IP7_5_3, ETH_TXD1),
+       PINMUX_IPSR_DATA(IP7_5_3, RMII_TXD1),
+       PINMUX_IPSR_MODSEL_DATA(IP7_5_3, HTX0_F, SEL_HSCIF0_4),
+       PINMUX_IPSR_MODSEL_DATA(IP7_5_3, BPFCLK_G, SEL_SIM_2),
+       PINMUX_IPSR_MODSEL_DATA(IP7_5_3, RDS_CLK_F, SEL_HSCIF0_5),
+       PINMUX_IPSR_DATA(IP7_7_6, ETH_TX_EN),
+       PINMUX_IPSR_DATA(IP7_7_6, RMII_TX_EN),
+       PINMUX_IPSR_MODSEL_DATA(IP7_7_6, SIM0_CLK_C, SEL_SIM_2),
+       PINMUX_IPSR_MODSEL_DATA(IP7_7_6, HRTS0_N_F, SEL_HSCIF0_5),
+       PINMUX_IPSR_DATA(IP7_9_8, ETH_MAGIC),
+       PINMUX_IPSR_DATA(IP7_9_8, RMII_MAGIC),
+       PINMUX_IPSR_MODSEL_DATA(IP7_9_8, SIM0_RST_C, SEL_SIM_2),
+       PINMUX_IPSR_DATA(IP7_12_10, ETH_TXD0),
+       PINMUX_IPSR_DATA(IP7_12_10, RMII_TXD0),
+       PINMUX_IPSR_MODSEL_DATA(IP7_12_10, STP_ISCLK_1_B, SEL_SSP_1),
+       PINMUX_IPSR_MODSEL_DATA(IP7_12_10, TS_SDEN1_C, SEL_TSIF1_2),
+       PINMUX_IPSR_MODSEL_DATA(IP7_12_10, GLO_SCLK_C, SEL_GPS_2),
+       PINMUX_IPSR_DATA(IP7_15_13, ETH_MDC),
+       PINMUX_IPSR_DATA(IP7_15_13, RMII_MDC),
+       PINMUX_IPSR_MODSEL_DATA(IP7_15_13, STP_ISD_1_B, SEL_SSP_1),
+       PINMUX_IPSR_MODSEL_DATA(IP7_15_13, TS_SPSYNC1_C, SEL_TSIF1_2),
+       PINMUX_IPSR_MODSEL_DATA(IP7_15_13, GLO_SDATA_C, SEL_GPS_2),
+       PINMUX_IPSR_DATA(IP7_18_16, PWM0),
+       PINMUX_IPSR_MODSEL_DATA(IP7_18_16, SCIFA2_SCK_C, SEL_SCIFA2_2),
+       PINMUX_IPSR_MODSEL_DATA(IP7_18_16, STP_ISEN_1_B, SEL_SSP_1),
+       PINMUX_IPSR_MODSEL_DATA(IP7_18_16, TS_SDAT1_C, SEL_TSIF1_2),
+       PINMUX_IPSR_MODSEL_DATA(IP7_18_16, GLO_SS_C, SEL_GPS_2),
+       PINMUX_IPSR_DATA(IP7_21_19, PWM1),
+       PINMUX_IPSR_MODSEL_DATA(IP7_21_19, SCIFA2_TXD_C, SEL_SCIFA2_2),
+       PINMUX_IPSR_MODSEL_DATA(IP7_21_19, STP_ISSYNC_1_B, SEL_SSP_1),
+       PINMUX_IPSR_MODSEL_DATA(IP7_21_19, TS_SCK1_C, SEL_TSIF1_2),
+       PINMUX_IPSR_MODSEL_DATA(IP7_21_19, GLO_RFON_C, SEL_GPS_2),
+       PINMUX_IPSR_DATA(IP7_21_19, PCMOE_N),
+       PINMUX_IPSR_DATA(IP7_24_22, PWM2),
+       PINMUX_IPSR_DATA(IP7_24_22, PWMFSW0),
+       PINMUX_IPSR_MODSEL_DATA(IP7_24_22, SCIFA2_RXD_C, SEL_SCIFA2_2),
+       PINMUX_IPSR_DATA(IP7_24_22, PCMWE_N),
+       PINMUX_IPSR_MODSEL_DATA(IP7_24_22, IECLK_C, SEL_IEB_2),
+       PINMUX_IPSR_DATA(IP7_26_25, DU1_DOTCLKIN),
+       PINMUX_IPSR_DATA(IP7_26_25, AUDIO_CLKC),
+       PINMUX_IPSR_DATA(IP7_26_25, AUDIO_CLKOUT_C),
+       PINMUX_IPSR_MODSEL_DATA(IP7_28_27, VI0_CLK, SEL_VI0_0),
+       PINMUX_IPSR_DATA(IP7_28_27, ATACS00_N),
+       PINMUX_IPSR_DATA(IP7_28_27, AVB_RXD1),
+       PINMUX_IPSR_DATA(IP7_28_27, MII_RXD1),
+       PINMUX_IPSR_MODSEL_DATA(IP7_30_29, VI0_DATA0_VI0_B0, SEL_VI0_0),
+       PINMUX_IPSR_DATA(IP7_30_29, ATACS10_N),
+       PINMUX_IPSR_DATA(IP7_30_29, AVB_RXD2),
+       PINMUX_IPSR_DATA(IP7_30_29, MII_RXD2),
+
+       PINMUX_IPSR_MODSEL_DATA(IP8_1_0, VI0_DATA1_VI0_B1, SEL_VI0_0),
+       PINMUX_IPSR_DATA(IP8_1_0, ATARD0_N),
+       PINMUX_IPSR_DATA(IP8_1_0, AVB_RXD3),
+       PINMUX_IPSR_DATA(IP8_1_0, MII_RXD3),
+       PINMUX_IPSR_MODSEL_DATA(IP8_3_2, VI0_DATA2_VI0_B2, SEL_VI0_0),
+       PINMUX_IPSR_DATA(IP8_3_2, ATAWR0_N),
+       PINMUX_IPSR_DATA(IP8_3_2, AVB_RXD4),
+       PINMUX_IPSR_MODSEL_DATA(IP8_5_4, VI0_DATA3_VI0_B3, SEL_VI0_0),
+       PINMUX_IPSR_DATA(IP8_5_4, ATADIR0_N),
+       PINMUX_IPSR_DATA(IP8_5_4, AVB_RXD5),
+       PINMUX_IPSR_MODSEL_DATA(IP8_7_6, VI0_DATA4_VI0_B4, SEL_VI0_0),
+       PINMUX_IPSR_DATA(IP8_7_6, ATAG0_N),
+       PINMUX_IPSR_DATA(IP8_7_6, AVB_RXD6),
+       PINMUX_IPSR_MODSEL_DATA(IP8_9_8, VI0_DATA5_VI0_B5, SEL_VI0_0),
+       PINMUX_IPSR_DATA(IP8_9_8, EX_WAIT1),
+       PINMUX_IPSR_DATA(IP8_9_8, AVB_RXD7),
+       PINMUX_IPSR_MODSEL_DATA(IP8_11_10, VI0_DATA6_VI0_B6, SEL_VI0_0),
+       PINMUX_IPSR_DATA(IP8_11_10, AVB_RX_ER),
+       PINMUX_IPSR_DATA(IP8_11_10, MII_RX_ER),
+       PINMUX_IPSR_MODSEL_DATA(IP8_13_12, VI0_DATA7_VI0_B7, SEL_VI0_0),
+       PINMUX_IPSR_DATA(IP8_13_12, AVB_RX_CLK),
+       PINMUX_IPSR_DATA(IP8_13_12, MII_RX_CLK),
+       PINMUX_IPSR_MODSEL_DATA(IP8_15_14, VI1_CLK, SEL_VI1_0),
+       PINMUX_IPSR_DATA(IP8_15_14, AVB_RX_DV),
+       PINMUX_IPSR_DATA(IP8_15_14, MII_RX_DV),
+       PINMUX_IPSR_MODSEL_DATA(IP8_17_16, VI1_DATA0_VI1_B0, SEL_VI1_0),
+       PINMUX_IPSR_MODSEL_DATA(IP8_17_16, SCIFA1_SCK_D, SEL_SCIFA1_3),
+       PINMUX_IPSR_DATA(IP8_17_16, AVB_CRS),
+       PINMUX_IPSR_DATA(IP8_17_16, MII_CRS),
+       PINMUX_IPSR_MODSEL_DATA(IP8_19_18, VI1_DATA1_VI1_B1, SEL_VI1_0),
+       PINMUX_IPSR_MODSEL_DATA(IP8_19_18, SCIFA1_RXD_D, SEL_SCIFA1_3),
+       PINMUX_IPSR_DATA(IP8_19_18, AVB_MDC),
+       PINMUX_IPSR_DATA(IP8_19_18, MII_MDC),
+       PINMUX_IPSR_MODSEL_DATA(IP8_21_20, VI1_DATA2_VI1_B2, SEL_VI1_0),
+       PINMUX_IPSR_MODSEL_DATA(IP8_21_20, SCIFA1_TXD_D, SEL_SCIFA1_3),
+       PINMUX_IPSR_DATA(IP8_21_20, AVB_MDIO),
+       PINMUX_IPSR_DATA(IP8_21_20, MII_MDIO),
+       PINMUX_IPSR_MODSEL_DATA(IP8_23_22, VI1_DATA3_VI1_B3, SEL_VI1_0),
+       PINMUX_IPSR_MODSEL_DATA(IP8_23_22, SCIFA1_CTS_N_D, SEL_SCIFA1_3),
+       PINMUX_IPSR_DATA(IP8_23_22, AVB_GTX_CLK),
+       PINMUX_IPSR_MODSEL_DATA(IP8_25_24, VI1_DATA4_VI1_B4, SEL_VI1_0),
+       PINMUX_IPSR_MODSEL_DATA(IP8_25_24, SCIFA1_RTS_N_D, SEL_SCIFA1_3),
+       PINMUX_IPSR_DATA(IP8_25_24, AVB_MAGIC),
+       PINMUX_IPSR_DATA(IP8_25_24, MII_MAGIC),
+       PINMUX_IPSR_MODSEL_DATA(IP8_26, VI1_DATA5_VI1_B5, SEL_VI1_0),
+       PINMUX_IPSR_MODSEL_DATA(IP8_26, AVB_PHY_INT, SEL_SCIFA1_3),
+       PINMUX_IPSR_MODSEL_DATA(IP8_27, VI1_DATA6_VI1_B6, SEL_VI1_0),
+       PINMUX_IPSR_DATA(IP8_27, AVB_GTXREFCLK),
+       PINMUX_IPSR_DATA(IP8_28, SD0_CLK),
+       PINMUX_IPSR_MODSEL_DATA(IP8_28, VI1_DATA0_VI1_B0_B, SEL_VI1_1),
+       PINMUX_IPSR_DATA(IP8_30_29, SD0_CMD),
+       PINMUX_IPSR_MODSEL_DATA(IP8_30_29, SCIFB1_SCK_B, SEL_SCIFB1_1),
+       PINMUX_IPSR_MODSEL_DATA(IP8_30_29, VI1_DATA1_VI1_B1_B, SEL_VI1_1),
+
+       PINMUX_IPSR_DATA(IP9_1_0, SD0_DAT0),
+       PINMUX_IPSR_MODSEL_DATA(IP9_1_0, SCIFB1_RXD_B, SEL_SCIFB1_1),
+       PINMUX_IPSR_MODSEL_DATA(IP9_1_0, VI1_DATA2_VI1_B2_B, SEL_VI1_1),
+       PINMUX_IPSR_DATA(IP9_3_2, SD0_DAT1),
+       PINMUX_IPSR_MODSEL_DATA(IP9_3_2, SCIFB1_TXD_B, SEL_SCIFB1_1),
+       PINMUX_IPSR_MODSEL_DATA(IP9_3_2, VI1_DATA3_VI1_B3_B, SEL_VI1_1),
+       PINMUX_IPSR_DATA(IP9_5_4, SD0_DAT2),
+       PINMUX_IPSR_MODSEL_DATA(IP9_5_4, SCIFB1_CTS_N_B, SEL_SCIFB1_1),
+       PINMUX_IPSR_MODSEL_DATA(IP9_5_4, VI1_DATA4_VI1_B4_B, SEL_VI1_1),
+       PINMUX_IPSR_DATA(IP9_7_6, SD0_DAT3),
+       PINMUX_IPSR_MODSEL_DATA(IP9_7_6, SCIFB1_RTS_N_B, SEL_SCIFB1_1),
+       PINMUX_IPSR_MODSEL_DATA(IP9_7_6, VI1_DATA5_VI1_B5_B, SEL_VI1_1),
+       PINMUX_IPSR_DATA(IP9_11_8, SD0_CD),
+       PINMUX_IPSR_DATA(IP9_11_8, MMC0_D6),
+       PINMUX_IPSR_MODSEL_DATA(IP9_11_8, TS_SDEN0_B, SEL_TSIF0_1),
+       PINMUX_IPSR_DATA(IP9_11_8, USB0_EXTP),
+       PINMUX_IPSR_MODSEL_DATA(IP9_11_8, GLO_SCLK, SEL_GPS_0),
+       PINMUX_IPSR_MODSEL_DATA(IP9_11_8, VI1_DATA6_VI1_B6_B, SEL_VI1_1),
+       PINMUX_IPSR_MODSEL_DATA(IP9_11_8, SCL1_B, SEL_IIC1_1),
+       PINMUX_IPSR_MODSEL_DATA(IP9_11_8, SCL1_CIS_B, SEL_I2C1_1),
+       PINMUX_IPSR_MODSEL_DATA(IP9_11_8, VI2_DATA6_VI2_B6_B, SEL_VI2_1),
+       PINMUX_IPSR_DATA(IP9_15_12, SD0_WP),
+       PINMUX_IPSR_DATA(IP9_15_12, MMC0_D7),
+       PINMUX_IPSR_MODSEL_DATA(IP9_15_12, TS_SPSYNC0_B, SEL_TSIF0_1),
+       PINMUX_IPSR_DATA(IP9_15_12, USB0_IDIN),
+       PINMUX_IPSR_MODSEL_DATA(IP9_15_12, GLO_SDATA, SEL_GPS_0),
+       PINMUX_IPSR_MODSEL_DATA(IP9_15_12, VI1_DATA7_VI1_B7_B, SEL_VI1_1),
+       PINMUX_IPSR_MODSEL_DATA(IP9_15_12, SDA1_B, SEL_IIC1_1),
+       PINMUX_IPSR_MODSEL_DATA(IP9_15_12, SDA1_CIS_B, SEL_I2C1_1),
+       PINMUX_IPSR_MODSEL_DATA(IP9_15_12, VI2_DATA7_VI2_B7_B, SEL_VI2_1),
+       PINMUX_IPSR_DATA(IP9_17_16, SD1_CLK),
+       PINMUX_IPSR_DATA(IP9_17_16, AVB_TX_EN),
+       PINMUX_IPSR_DATA(IP9_17_16, MII_TX_EN),
+       PINMUX_IPSR_DATA(IP9_19_18, SD1_CMD),
+       PINMUX_IPSR_DATA(IP9_19_18, AVB_TX_ER),
+       PINMUX_IPSR_DATA(IP9_19_18, MII_TX_ER),
+       PINMUX_IPSR_MODSEL_DATA(IP9_19_18, SCIFB0_SCK_B, SEL_SCIFB_1),
+       PINMUX_IPSR_DATA(IP9_21_20, SD1_DAT0),
+       PINMUX_IPSR_DATA(IP9_21_20, AVB_TX_CLK),
+       PINMUX_IPSR_DATA(IP9_21_20, MII_TX_CLK),
+       PINMUX_IPSR_MODSEL_DATA(IP9_21_20, SCIFB0_RXD_B, SEL_SCIFB_1),
+       PINMUX_IPSR_DATA(IP9_23_22, SD1_DAT1),
+       PINMUX_IPSR_DATA(IP9_23_22, AVB_LINK),
+       PINMUX_IPSR_DATA(IP9_23_22, MII_LINK),
+       PINMUX_IPSR_MODSEL_DATA(IP9_23_22, SCIFB0_TXD_B, SEL_SCIFB_1),
+       PINMUX_IPSR_DATA(IP9_25_24, SD1_DAT2),
+       PINMUX_IPSR_DATA(IP9_25_24, AVB_COL),
+       PINMUX_IPSR_DATA(IP9_25_24, MII_COL),
+       PINMUX_IPSR_MODSEL_DATA(IP9_25_24, SCIFB0_CTS_N_B, SEL_SCIFB_1),
+       PINMUX_IPSR_DATA(IP9_27_26, SD1_DAT3),
+       PINMUX_IPSR_DATA(IP9_27_26, AVB_RXD0),
+       PINMUX_IPSR_DATA(IP9_27_26, MII_RXD0),
+       PINMUX_IPSR_MODSEL_DATA(IP9_27_26, SCIFB0_RTS_N_B, SEL_SCIFB_1),
+       PINMUX_IPSR_DATA(IP9_31_28, SD1_CD),
+       PINMUX_IPSR_DATA(IP9_31_28, MMC1_D6),
+       PINMUX_IPSR_MODSEL_DATA(IP9_31_28, TS_SDEN1, SEL_TSIF1_0),
+       PINMUX_IPSR_DATA(IP9_31_28, USB1_EXTP),
+       PINMUX_IPSR_MODSEL_DATA(IP9_31_28, GLO_SS, SEL_GPS_0),
+       PINMUX_IPSR_MODSEL_DATA(IP9_31_28, VI0_CLK_B, SEL_VI0_1),
+       PINMUX_IPSR_MODSEL_DATA(IP9_31_28, SCL2_D, SEL_IIC2_3),
+       PINMUX_IPSR_MODSEL_DATA(IP9_31_28, SCL2_CIS_D, SEL_I2C2_3),
+       PINMUX_IPSR_MODSEL_DATA(IP9_31_28, SIM0_CLK_B, SEL_SIM_1),
+       PINMUX_IPSR_MODSEL_DATA(IP9_31_28, VI3_CLK_B, SEL_VI3_1),
+
+       PINMUX_IPSR_DATA(IP10_3_0, SD1_WP),
+       PINMUX_IPSR_DATA(IP10_3_0, MMC1_D7),
+       PINMUX_IPSR_MODSEL_DATA(IP10_3_0, TS_SPSYNC1, SEL_TSIF1_0),
+       PINMUX_IPSR_DATA(IP10_3_0, USB1_IDIN),
+       PINMUX_IPSR_MODSEL_DATA(IP10_3_0, GLO_RFON, SEL_GPS_0),
+       PINMUX_IPSR_MODSEL_DATA(IP10_3_0, VI1_CLK_B, SEL_VI1_1),
+       PINMUX_IPSR_MODSEL_DATA(IP10_3_0, SDA2_D, SEL_IIC2_3),
+       PINMUX_IPSR_MODSEL_DATA(IP10_3_0, SDA2_CIS_D, SEL_I2C2_3),
+       PINMUX_IPSR_MODSEL_DATA(IP10_3_0, SIM0_D_B, SEL_SIM_1),
+       PINMUX_IPSR_DATA(IP10_6_4, SD2_CLK),
+       PINMUX_IPSR_DATA(IP10_6_4, MMC0_CLK),
+       PINMUX_IPSR_MODSEL_DATA(IP10_6_4, SIM0_CLK, SEL_SIM_0),
+       PINMUX_IPSR_MODSEL_DATA(IP10_6_4, VI0_DATA0_VI0_B0_B, SEL_VI0_1),
+       PINMUX_IPSR_MODSEL_DATA(IP10_6_4, TS_SDEN0_C, SEL_TSIF0_2),
+       PINMUX_IPSR_MODSEL_DATA(IP10_6_4, GLO_SCLK_B, SEL_GPS_1),
+       PINMUX_IPSR_MODSEL_DATA(IP10_6_4, VI3_DATA0_B, SEL_VI3_1),
+       PINMUX_IPSR_DATA(IP10_10_7, SD2_CMD),
+       PINMUX_IPSR_DATA(IP10_10_7, MMC0_CMD),
+       PINMUX_IPSR_MODSEL_DATA(IP10_10_7, SIM0_D, SEL_SIM_0),
+       PINMUX_IPSR_MODSEL_DATA(IP10_10_7, VI0_DATA1_VI0_B1_B, SEL_VI0_1),
+       PINMUX_IPSR_MODSEL_DATA(IP10_10_7, SCIFB1_SCK_E, SEL_SCIFB1_4),
+       PINMUX_IPSR_MODSEL_DATA(IP10_10_7, SCK1_D, SEL_SCIF1_3),
+       PINMUX_IPSR_MODSEL_DATA(IP10_10_7, TS_SPSYNC0_C, SEL_TSIF0_2),
+       PINMUX_IPSR_MODSEL_DATA(IP10_10_7, GLO_SDATA_B, SEL_GPS_1),
+       PINMUX_IPSR_MODSEL_DATA(IP10_10_7, VI3_DATA1_B, SEL_VI3_1),
+       PINMUX_IPSR_DATA(IP10_14_11, SD2_DAT0),
+       PINMUX_IPSR_DATA(IP10_14_11, MMC0_D0),
+       PINMUX_IPSR_MODSEL_DATA(IP10_14_11, FMCLK_B, SEL_FM_1),
+       PINMUX_IPSR_MODSEL_DATA(IP10_14_11, VI0_DATA2_VI0_B2_B, SEL_VI0_1),
+       PINMUX_IPSR_MODSEL_DATA(IP10_14_11, SCIFB1_RXD_E, SEL_SCIFB1_4),
+       PINMUX_IPSR_MODSEL_DATA(IP10_14_11, RX1_D, SEL_SCIF1_3),
+       PINMUX_IPSR_MODSEL_DATA(IP10_14_11, TS_SDAT0_C, SEL_TSIF0_2),
+       PINMUX_IPSR_MODSEL_DATA(IP10_14_11, GLO_SS_B, SEL_GPS_1),
+       PINMUX_IPSR_MODSEL_DATA(IP10_14_11, VI3_DATA2_B, SEL_VI3_1),
+       PINMUX_IPSR_DATA(IP10_18_15, SD2_DAT1),
+       PINMUX_IPSR_DATA(IP10_18_15, MMC0_D1),
+       PINMUX_IPSR_MODSEL_DATA(IP10_18_15, FMIN_B, SEL_FM_1),
+       PINMUX_IPSR_MODSEL_DATA(IP10_18_15, RDS_DATA, SEL_RDS_0),
+       PINMUX_IPSR_MODSEL_DATA(IP10_18_15, VI0_DATA3_VI0_B3_B, SEL_VI0_1),
+       PINMUX_IPSR_MODSEL_DATA(IP10_18_15, SCIFB1_TXD_E, SEL_SCIFB1_4),
+       PINMUX_IPSR_MODSEL_DATA(IP10_18_15, TX1_D, SEL_SCIF1_3),
+       PINMUX_IPSR_MODSEL_DATA(IP10_18_15, TS_SCK0_C, SEL_TSIF0_2),
+       PINMUX_IPSR_MODSEL_DATA(IP10_18_15, GLO_RFON_B, SEL_GPS_1),
+       PINMUX_IPSR_MODSEL_DATA(IP10_18_15, VI3_DATA3_B, SEL_VI3_1),
+       PINMUX_IPSR_DATA(IP10_22_19, SD2_DAT2),
+       PINMUX_IPSR_DATA(IP10_22_19, MMC0_D2),
+       PINMUX_IPSR_MODSEL_DATA(IP10_22_19, BPFCLK_B, SEL_FM_1),
+       PINMUX_IPSR_MODSEL_DATA(IP10_22_19, RDS_CLK, SEL_RDS_0),
+       PINMUX_IPSR_MODSEL_DATA(IP10_22_19, VI0_DATA4_VI0_B4_B, SEL_VI0_1),
+       PINMUX_IPSR_MODSEL_DATA(IP10_22_19, HRX0_D, SEL_HSCIF0_3),
+       PINMUX_IPSR_MODSEL_DATA(IP10_22_19, TS_SDEN1_B, SEL_TSIF1_1),
+       PINMUX_IPSR_MODSEL_DATA(IP10_22_19, GLO_Q0_B, SEL_GPS_1),
+       PINMUX_IPSR_MODSEL_DATA(IP10_22_19, VI3_DATA4_B, SEL_VI3_1),
+       PINMUX_IPSR_DATA(IP10_25_23, SD2_DAT3),
+       PINMUX_IPSR_DATA(IP10_25_23, MMC0_D3),
+       PINMUX_IPSR_MODSEL_DATA(IP10_25_23, SIM0_RST, SEL_SIM_0),
+       PINMUX_IPSR_MODSEL_DATA(IP10_25_23, VI0_DATA5_VI0_B5_B, SEL_VI0_1),
+       PINMUX_IPSR_MODSEL_DATA(IP10_25_23, HTX0_D, SEL_HSCIF0_3),
+       PINMUX_IPSR_MODSEL_DATA(IP10_25_23, TS_SPSYNC1_B, SEL_TSIF1_1),
+       PINMUX_IPSR_MODSEL_DATA(IP10_25_23, GLO_Q1_B, SEL_GPS_1),
+       PINMUX_IPSR_MODSEL_DATA(IP10_25_23, VI3_DATA5_B, SEL_VI3_1),
+       PINMUX_IPSR_DATA(IP10_29_26, SD2_CD),
+       PINMUX_IPSR_DATA(IP10_29_26, MMC0_D4),
+       PINMUX_IPSR_MODSEL_DATA(IP10_29_26, TS_SDAT0_B, SEL_TSIF0_1),
+       PINMUX_IPSR_DATA(IP10_29_26, USB2_EXTP),
+       PINMUX_IPSR_MODSEL_DATA(IP10_29_26, GLO_I0, SEL_GPS_0),
+       PINMUX_IPSR_MODSEL_DATA(IP10_29_26, VI0_DATA6_VI0_B6_B, SEL_VI0_1),
+       PINMUX_IPSR_MODSEL_DATA(IP10_29_26, HCTS0_N_D, SEL_HSCIF0_3),
+       PINMUX_IPSR_MODSEL_DATA(IP10_29_26, TS_SDAT1_B, SEL_TSIF1_1),
+       PINMUX_IPSR_MODSEL_DATA(IP10_29_26, GLO_I0_B, SEL_GPS_1),
+       PINMUX_IPSR_MODSEL_DATA(IP10_29_26, VI3_DATA6_B, SEL_VI3_1),
+
+       PINMUX_IPSR_DATA(IP11_3_0, SD2_WP),
+       PINMUX_IPSR_DATA(IP11_3_0, MMC0_D5),
+       PINMUX_IPSR_MODSEL_DATA(IP11_3_0, TS_SCK0_B, SEL_TSIF0_1),
+       PINMUX_IPSR_DATA(IP11_3_0, USB2_IDIN),
+       PINMUX_IPSR_MODSEL_DATA(IP11_3_0, GLO_I1, SEL_GPS_0),
+       PINMUX_IPSR_MODSEL_DATA(IP11_3_0, VI0_DATA7_VI0_B7_B, SEL_VI0_1),
+       PINMUX_IPSR_MODSEL_DATA(IP11_3_0, HRTS0_N_D, SEL_HSCIF0_3),
+       PINMUX_IPSR_MODSEL_DATA(IP11_3_0, TS_SCK1_B, SEL_TSIF1_1),
+       PINMUX_IPSR_MODSEL_DATA(IP11_3_0, GLO_I1_B, SEL_GPS_1),
+       PINMUX_IPSR_MODSEL_DATA(IP11_3_0, VI3_DATA7_B, SEL_VI3_1),
+       PINMUX_IPSR_DATA(IP11_4, SD3_CLK),
+       PINMUX_IPSR_DATA(IP11_4, MMC1_CLK),
+       PINMUX_IPSR_DATA(IP11_6_5, SD3_CMD),
+       PINMUX_IPSR_DATA(IP11_6_5, MMC1_CMD),
+       PINMUX_IPSR_DATA(IP11_6_5, MTS_N),
+       PINMUX_IPSR_DATA(IP11_8_7, SD3_DAT0),
+       PINMUX_IPSR_DATA(IP11_8_7, MMC1_D0),
+       PINMUX_IPSR_DATA(IP11_8_7, STM_N),
+       PINMUX_IPSR_DATA(IP11_10_9, SD3_DAT1),
+       PINMUX_IPSR_DATA(IP11_10_9, MMC1_D1),
+       PINMUX_IPSR_DATA(IP11_10_9, MDATA),
+       PINMUX_IPSR_DATA(IP11_12_11, SD3_DAT2),
+       PINMUX_IPSR_DATA(IP11_12_11, MMC1_D2),
+       PINMUX_IPSR_DATA(IP11_12_11, SDATA),
+       PINMUX_IPSR_DATA(IP11_14_13, SD3_DAT3),
+       PINMUX_IPSR_DATA(IP11_14_13, MMC1_D3),
+       PINMUX_IPSR_DATA(IP11_14_13, SCKZ),
+       PINMUX_IPSR_DATA(IP11_17_15, SD3_CD),
+       PINMUX_IPSR_DATA(IP11_17_15, MMC1_D4),
+       PINMUX_IPSR_MODSEL_DATA(IP11_17_15, TS_SDAT1, SEL_TSIF1_0),
+       PINMUX_IPSR_DATA(IP11_17_15, VSP),
+       PINMUX_IPSR_MODSEL_DATA(IP11_17_15, GLO_Q0, SEL_GPS_0),
+       PINMUX_IPSR_MODSEL_DATA(IP11_17_15, SIM0_RST_B, SEL_SIM_1),
+       PINMUX_IPSR_DATA(IP11_21_18, SD3_WP),
+       PINMUX_IPSR_DATA(IP11_21_18, MMC1_D5),
+       PINMUX_IPSR_MODSEL_DATA(IP11_21_18, TS_SCK1, SEL_TSIF1_0),
+       PINMUX_IPSR_MODSEL_DATA(IP11_21_18, GLO_Q1, SEL_GPS_0),
+       PINMUX_IPSR_MODSEL_DATA(IP11_21_18, FMIN_C, SEL_FM_2),
+       PINMUX_IPSR_MODSEL_DATA(IP11_21_18, RDS_DATA_B, SEL_RDS_1),
+       PINMUX_IPSR_MODSEL_DATA(IP11_21_18, FMIN_E, SEL_FM_4),
+       PINMUX_IPSR_MODSEL_DATA(IP11_21_18, RDS_DATA_D, SEL_RDS_3),
+       PINMUX_IPSR_MODSEL_DATA(IP11_21_18, FMIN_F, SEL_FM_5),
+       PINMUX_IPSR_MODSEL_DATA(IP11_21_18, RDS_DATA_E, SEL_RDS_4),
+       PINMUX_IPSR_DATA(IP11_23_22, MLB_CLK),
+       PINMUX_IPSR_MODSEL_DATA(IP11_23_22, SCL2_B, SEL_IIC2_1),
+       PINMUX_IPSR_MODSEL_DATA(IP11_23_22, SCL2_CIS_B, SEL_I2C2_1),
+       PINMUX_IPSR_DATA(IP11_26_24, MLB_SIG),
+       PINMUX_IPSR_MODSEL_DATA(IP11_26_24, SCIFB1_RXD_D, SEL_SCIFB1_3),
+       PINMUX_IPSR_MODSEL_DATA(IP11_26_24, RX1_C, SEL_SCIF1_2),
+       PINMUX_IPSR_MODSEL_DATA(IP11_26_24, SDA2_B, SEL_IIC2_1),
+       PINMUX_IPSR_MODSEL_DATA(IP11_26_24, SDA2_CIS_B, SEL_I2C2_1),
+       PINMUX_IPSR_DATA(IP11_29_27, MLB_DAT),
+       PINMUX_IPSR_DATA(IP11_29_27, SPV_EVEN),
+       PINMUX_IPSR_MODSEL_DATA(IP11_29_27, SCIFB1_TXD_D, SEL_SCIFB1_3),
+       PINMUX_IPSR_MODSEL_DATA(IP11_29_27, TX1_C, SEL_SCIF1_2),
+       PINMUX_IPSR_MODSEL_DATA(IP11_29_27, BPFCLK_C, SEL_FM_2),
+       PINMUX_IPSR_MODSEL_DATA(IP11_29_27, RDS_CLK_B, SEL_RDS_1),
+       PINMUX_IPSR_DATA(IP11_31_30, SSI_SCK0129),
+       PINMUX_IPSR_MODSEL_DATA(IP11_31_30, CAN_CLK_B, SEL_CANCLK_1),
+       PINMUX_IPSR_DATA(IP11_31_30, MOUT0),
+
+       PINMUX_IPSR_DATA(IP12_1_0, SSI_WS0129),
+       PINMUX_IPSR_MODSEL_DATA(IP12_1_0, CAN0_TX_B, SEL_CAN0_1),
+       PINMUX_IPSR_DATA(IP12_1_0, MOUT1),
+       PINMUX_IPSR_DATA(IP12_3_2, SSI_SDATA0),
+       PINMUX_IPSR_MODSEL_DATA(IP12_3_2, CAN0_RX_B, SEL_CAN0_1),
+       PINMUX_IPSR_DATA(IP12_3_2, MOUT2),
+       PINMUX_IPSR_DATA(IP12_5_4, SSI_SDATA1),
+       PINMUX_IPSR_MODSEL_DATA(IP12_5_4, CAN1_TX_B, SEL_CAN1_1),
+       PINMUX_IPSR_DATA(IP12_5_4, MOUT5),
+       PINMUX_IPSR_DATA(IP12_7_6, SSI_SDATA2),
+       PINMUX_IPSR_MODSEL_DATA(IP12_7_6, CAN1_RX_B, SEL_CAN1_1),
+       PINMUX_IPSR_MODSEL_DATA(IP12_7_6, CAN1_TX_B, SEL_CAN1_1),
+       PINMUX_IPSR_DATA(IP12_7_6, MOUT6),
+       PINMUX_IPSR_DATA(IP12_10_8, SSI_SCK34),
+       PINMUX_IPSR_DATA(IP12_10_8, STP_OPWM_0),
+       PINMUX_IPSR_MODSEL_DATA(IP12_10_8, SCIFB0_SCK, SEL_SCIFB_0),
+       PINMUX_IPSR_MODSEL_DATA(IP12_10_8, MSIOF1_SCK, SEL_SOF1_0),
+       PINMUX_IPSR_DATA(IP12_10_8, CAN_DEBUG_HW_TRIGGER),
+       PINMUX_IPSR_DATA(IP12_13_11, SSI_WS34),
+       PINMUX_IPSR_MODSEL_DATA(IP12_13_11, STP_IVCXO27_0, SEL_SSP_0),
+       PINMUX_IPSR_MODSEL_DATA(IP12_13_11, SCIFB0_RXD, SEL_SCIFB_0),
+       PINMUX_IPSR_DATA(IP12_13_11, MSIOF1_SYNC),
+       PINMUX_IPSR_DATA(IP12_13_11, CAN_STEP0),
+       PINMUX_IPSR_DATA(IP12_16_14, SSI_SDATA3),
+       PINMUX_IPSR_MODSEL_DATA(IP12_16_14, STP_ISCLK_0, SEL_SSP_0),
+       PINMUX_IPSR_MODSEL_DATA(IP12_16_14, SCIFB0_TXD, SEL_SCIFB_0),
+       PINMUX_IPSR_MODSEL_DATA(IP12_16_14, MSIOF1_SS1, SEL_SOF1_0),
+       PINMUX_IPSR_DATA(IP12_16_14, CAN_TXCLK),
+       PINMUX_IPSR_DATA(IP12_19_17, SSI_SCK4),
+       PINMUX_IPSR_MODSEL_DATA(IP12_19_17, STP_ISD_0, SEL_SSP_0),
+       PINMUX_IPSR_MODSEL_DATA(IP12_19_17, SCIFB0_CTS_N, SEL_SCIFB_0),
+       PINMUX_IPSR_MODSEL_DATA(IP12_19_17, MSIOF1_SS2, SEL_SOF1_0),
+       PINMUX_IPSR_MODSEL_DATA(IP12_19_17, SSI_SCK5_C, SEL_SSI5_2),
+       PINMUX_IPSR_DATA(IP12_19_17, CAN_DEBUGOUT0),
+       PINMUX_IPSR_DATA(IP12_22_20, SSI_WS4),
+       PINMUX_IPSR_MODSEL_DATA(IP12_22_20, STP_ISEN_0, SEL_SSP_0),
+       PINMUX_IPSR_MODSEL_DATA(IP12_22_20, SCIFB0_RTS_N, SEL_SCIFB_0),
+       PINMUX_IPSR_MODSEL_DATA(IP12_22_20, MSIOF1_TXD, SEL_SOF1_0),
+       PINMUX_IPSR_MODSEL_DATA(IP12_22_20, SSI_WS5_C, SEL_SSI5_2),
+       PINMUX_IPSR_DATA(IP12_22_20, CAN_DEBUGOUT1),
+       PINMUX_IPSR_DATA(IP12_24_23, SSI_SDATA4),
+       PINMUX_IPSR_MODSEL_DATA(IP12_24_23, STP_ISSYNC_0, SEL_SSP_0),
+       PINMUX_IPSR_MODSEL_DATA(IP12_24_23, MSIOF1_RXD, SEL_SOF1_0),
+       PINMUX_IPSR_DATA(IP12_24_23, CAN_DEBUGOUT2),
+       PINMUX_IPSR_MODSEL_DATA(IP12_27_25, SSI_SCK5, SEL_SSI5_0),
+       PINMUX_IPSR_MODSEL_DATA(IP12_27_25, SCIFB1_SCK, SEL_SCIFB1_0),
+       PINMUX_IPSR_MODSEL_DATA(IP12_27_25, IERX_B, SEL_IEB_1),
+       PINMUX_IPSR_DATA(IP12_27_25, DU2_EXHSYNC_DU2_HSYNC),
+       PINMUX_IPSR_DATA(IP12_27_25, QSTH_QHS),
+       PINMUX_IPSR_DATA(IP12_27_25, CAN_DEBUGOUT3),
+       PINMUX_IPSR_MODSEL_DATA(IP12_30_28, SSI_WS5, SEL_SSI5_0),
+       PINMUX_IPSR_MODSEL_DATA(IP12_30_28, SCIFB1_RXD, SEL_SCIFB1_0),
+       PINMUX_IPSR_MODSEL_DATA(IP12_30_28, IECLK_B, SEL_IEB_1),
+       PINMUX_IPSR_DATA(IP12_30_28, DU2_EXVSYNC_DU2_VSYNC),
+       PINMUX_IPSR_DATA(IP12_30_28, QSTB_QHE),
+       PINMUX_IPSR_DATA(IP12_30_28, CAN_DEBUGOUT4),
+
+       PINMUX_IPSR_MODSEL_DATA(IP13_2_0, SSI_SDATA5, SEL_SSI5_0),
+       PINMUX_IPSR_MODSEL_DATA(IP13_2_0, SCIFB1_TXD, SEL_SCIFB1_0),
+       PINMUX_IPSR_MODSEL_DATA(IP13_2_0, IETX_B, SEL_IEB_1),
+       PINMUX_IPSR_DATA(IP13_2_0, DU2_DR2),
+       PINMUX_IPSR_DATA(IP13_2_0, LCDOUT2),
+       PINMUX_IPSR_DATA(IP13_2_0, CAN_DEBUGOUT5),
+       PINMUX_IPSR_MODSEL_DATA(IP13_6_3, SSI_SCK6, SEL_SSI6_0),
+       PINMUX_IPSR_MODSEL_DATA(IP13_6_3, SCIFB1_CTS_N, SEL_SCIFB1_0),
+       PINMUX_IPSR_MODSEL_DATA(IP13_6_3, BPFCLK_D, SEL_FM_3),
+       PINMUX_IPSR_MODSEL_DATA(IP13_6_3, RDS_CLK_C, SEL_RDS_2),
+       PINMUX_IPSR_DATA(IP13_6_3, DU2_DR3),
+       PINMUX_IPSR_DATA(IP13_6_3, LCDOUT3),
+       PINMUX_IPSR_DATA(IP13_6_3, CAN_DEBUGOUT6),
+       PINMUX_IPSR_MODSEL_DATA(IP13_6_3, BPFCLK_F, SEL_FM_5),
+       PINMUX_IPSR_MODSEL_DATA(IP13_6_3, RDS_CLK_E, SEL_RDS_4),
+       PINMUX_IPSR_MODSEL_DATA(IP13_9_7, SSI_WS6, SEL_SSI6_0),
+       PINMUX_IPSR_MODSEL_DATA(IP13_9_7, SCIFB1_RTS_N, SEL_SCIFB1_0),
+       PINMUX_IPSR_MODSEL_DATA(IP13_9_7, CAN0_TX_D, SEL_CAN0_3),
+       PINMUX_IPSR_DATA(IP13_9_7, DU2_DR4),
+       PINMUX_IPSR_DATA(IP13_9_7, LCDOUT4),
+       PINMUX_IPSR_DATA(IP13_9_7, CAN_DEBUGOUT7),
+       PINMUX_IPSR_MODSEL_DATA(IP13_12_10, SSI_SDATA6, SEL_SSI6_0),
+       PINMUX_IPSR_MODSEL_DATA(IP13_12_10, FMIN_D, SEL_FM_3),
+       PINMUX_IPSR_MODSEL_DATA(IP13_12_10, RDS_DATA_C, SEL_RDS_2),
+       PINMUX_IPSR_DATA(IP13_12_10, DU2_DR5),
+       PINMUX_IPSR_DATA(IP13_12_10, LCDOUT5),
+       PINMUX_IPSR_DATA(IP13_12_10, CAN_DEBUGOUT8),
+       PINMUX_IPSR_MODSEL_DATA(IP13_15_13, SSI_SCK78, SEL_SSI7_0),
+       PINMUX_IPSR_MODSEL_DATA(IP13_15_13, STP_IVCXO27_1, SEL_SSP_0),
+       PINMUX_IPSR_MODSEL_DATA(IP13_15_13, SCK1, SEL_SCIF1_0),
+       PINMUX_IPSR_MODSEL_DATA(IP13_15_13, SCIFA1_SCK, SEL_SCIFA1_0),
+       PINMUX_IPSR_DATA(IP13_15_13, DU2_DR6),
+       PINMUX_IPSR_DATA(IP13_15_13, LCDOUT6),
+       PINMUX_IPSR_DATA(IP13_15_13, CAN_DEBUGOUT9),
+       PINMUX_IPSR_MODSEL_DATA(IP13_18_16, SSI_WS78, SEL_SSI7_0),
+       PINMUX_IPSR_MODSEL_DATA(IP13_18_16, STP_ISCLK_1, SEL_SSP_0),
+       PINMUX_IPSR_MODSEL_DATA(IP13_18_16, SCIFB2_SCK, SEL_SCIFB2_0),
+       PINMUX_IPSR_DATA(IP13_18_16, SCIFA2_CTS_N),
+       PINMUX_IPSR_DATA(IP13_18_16, DU2_DR7),
+       PINMUX_IPSR_DATA(IP13_18_16, LCDOUT7),
+       PINMUX_IPSR_DATA(IP13_18_16, CAN_DEBUGOUT10),
+       PINMUX_IPSR_MODSEL_DATA(IP13_22_19, SSI_SDATA7, SEL_SSI7_0),
+       PINMUX_IPSR_MODSEL_DATA(IP13_22_19, STP_ISD_1, SEL_SSP_0),
+       PINMUX_IPSR_MODSEL_DATA(IP13_22_19, SCIFB2_RXD, SEL_SCIFB2_0),
+       PINMUX_IPSR_DATA(IP13_22_19, SCIFA2_RTS_N),
+       PINMUX_IPSR_DATA(IP13_22_19, TCLK2),
+       PINMUX_IPSR_DATA(IP13_22_19, QSTVA_QVS),
+       PINMUX_IPSR_DATA(IP13_22_19, CAN_DEBUGOUT11),
+       PINMUX_IPSR_MODSEL_DATA(IP13_22_19, BPFCLK_E, SEL_FM_4),
+       PINMUX_IPSR_MODSEL_DATA(IP13_22_19, RDS_CLK_D, SEL_RDS_3),
+       PINMUX_IPSR_MODSEL_DATA(IP13_22_19, SSI_SDATA7_B, SEL_SSI7_1),
+       PINMUX_IPSR_MODSEL_DATA(IP13_22_19, FMIN_G, SEL_FM_6),
+       PINMUX_IPSR_MODSEL_DATA(IP13_22_19, RDS_DATA_F, SEL_RDS_5),
+       PINMUX_IPSR_MODSEL_DATA(IP13_25_23, SSI_SDATA8, SEL_SSI8_0),
+       PINMUX_IPSR_MODSEL_DATA(IP13_25_23, STP_ISEN_1, SEL_SSP_0),
+       PINMUX_IPSR_MODSEL_DATA(IP13_25_23, SCIFB2_TXD, SEL_SCIFB2_0),
+       PINMUX_IPSR_MODSEL_DATA(IP13_25_23, CAN0_TX_C, SEL_CAN0_2),
+       PINMUX_IPSR_DATA(IP13_25_23, CAN_DEBUGOUT12),
+       PINMUX_IPSR_MODSEL_DATA(IP13_25_23, SSI_SDATA8_B, SEL_SSI8_1),
+       PINMUX_IPSR_DATA(IP13_28_26, SSI_SDATA9),
+       PINMUX_IPSR_MODSEL_DATA(IP13_28_26, STP_ISSYNC_1, SEL_SSP_0),
+       PINMUX_IPSR_MODSEL_DATA(IP13_28_26, SCIFB2_CTS_N, SEL_SCIFB2_0),
+       PINMUX_IPSR_DATA(IP13_28_26, SSI_WS1),
+       PINMUX_IPSR_MODSEL_DATA(IP13_28_26, SSI_SDATA5_C, SEL_SSI5_2),
+       PINMUX_IPSR_DATA(IP13_28_26, CAN_DEBUGOUT13),
+       PINMUX_IPSR_DATA(IP13_30_29, AUDIO_CLKA),
+       PINMUX_IPSR_MODSEL_DATA(IP13_30_29, SCIFB2_RTS_N, SEL_SCIFB2_0),
+       PINMUX_IPSR_DATA(IP13_30_29, CAN_DEBUGOUT14),
+
+       PINMUX_IPSR_DATA(IP14_2_0, AUDIO_CLKB),
+       PINMUX_IPSR_MODSEL_DATA(IP14_2_0, SCIF_CLK, SEL_SCIFCLK_0),
+       PINMUX_IPSR_MODSEL_DATA(IP14_2_0, CAN0_RX_D, SEL_CAN0_3),
+       PINMUX_IPSR_DATA(IP14_2_0, DVC_MUTE),
+       PINMUX_IPSR_MODSEL_DATA(IP14_2_0, CAN0_RX_C, SEL_CAN0_2),
+       PINMUX_IPSR_DATA(IP14_2_0, CAN_DEBUGOUT15),
+       PINMUX_IPSR_DATA(IP14_2_0, REMOCON),
+       PINMUX_IPSR_MODSEL_DATA(IP14_5_3, SCIFA0_SCK, SEL_SCFA_0),
+       PINMUX_IPSR_MODSEL_DATA(IP14_5_3, HSCK1, SEL_HSCIF1_0),
+       PINMUX_IPSR_DATA(IP14_5_3, SCK0),
+       PINMUX_IPSR_DATA(IP14_5_3, MSIOF3_SS2),
+       PINMUX_IPSR_DATA(IP14_5_3, DU2_DG2),
+       PINMUX_IPSR_DATA(IP14_5_3, LCDOUT10),
+       PINMUX_IPSR_MODSEL_DATA(IP14_5_3, SDA1_C, SEL_IIC1_2),
+       PINMUX_IPSR_MODSEL_DATA(IP14_5_3, SDA1_CIS_C, SEL_I2C1_2),
+       PINMUX_IPSR_MODSEL_DATA(IP14_8_6, SCIFA0_RXD, SEL_SCFA_0),
+       PINMUX_IPSR_MODSEL_DATA(IP14_8_6, HRX1, SEL_HSCIF1_0),
+       PINMUX_IPSR_MODSEL_DATA(IP14_8_6, RX0, SEL_SCIF0_0),
+       PINMUX_IPSR_DATA(IP14_8_6, DU2_DR0),
+       PINMUX_IPSR_DATA(IP14_8_6, LCDOUT0),
+       PINMUX_IPSR_MODSEL_DATA(IP14_11_9, SCIFA0_TXD, SEL_SCFA_0),
+       PINMUX_IPSR_MODSEL_DATA(IP14_11_9, HTX1, SEL_HSCIF1_0),
+       PINMUX_IPSR_MODSEL_DATA(IP14_11_9, TX0, SEL_SCIF0_0),
+       PINMUX_IPSR_DATA(IP14_11_9, DU2_DR1),
+       PINMUX_IPSR_DATA(IP14_11_9, LCDOUT1),
+       PINMUX_IPSR_MODSEL_DATA(IP14_15_12, SCIFA0_CTS_N, SEL_SCFA_0),
+       PINMUX_IPSR_MODSEL_DATA(IP14_15_12, HCTS1_N, SEL_HSCIF1_0),
+       PINMUX_IPSR_MODSEL_DATA(IP14_15_12, CTS0_N, SEL_SCIF0_0),
+       PINMUX_IPSR_MODSEL_DATA(IP14_15_12, MSIOF3_SYNC, SEL_SOF3_0),
+       PINMUX_IPSR_DATA(IP14_15_12, DU2_DG3),
+       PINMUX_IPSR_MODSEL_DATA(IP14_15_12, LCDOUT11, SEL_HSCIF1_0),
+       PINMUX_IPSR_MODSEL_DATA(IP14_15_12, PWM0_B, SEL_SCIF0_0),
+       PINMUX_IPSR_MODSEL_DATA(IP14_15_12, SCL1_C, SEL_IIC1_2),
+       PINMUX_IPSR_MODSEL_DATA(IP14_15_12, SCL1_CIS_C, SEL_I2C1_2),
+       PINMUX_IPSR_MODSEL_DATA(IP14_18_16, SCIFA0_RTS_N, SEL_SCFA_0),
+       PINMUX_IPSR_MODSEL_DATA(IP14_18_16, HRTS1_N, SEL_HSCIF1_0),
+       PINMUX_IPSR_DATA(IP14_18_16, RTS0_N_TANS),
+       PINMUX_IPSR_DATA(IP14_18_16, MSIOF3_SS1),
+       PINMUX_IPSR_DATA(IP14_18_16, DU2_DG0),
+       PINMUX_IPSR_DATA(IP14_18_16, LCDOUT8),
+       PINMUX_IPSR_DATA(IP14_18_16, PWM1_B),
+       PINMUX_IPSR_MODSEL_DATA(IP14_21_19, SCIFA1_RXD, SEL_SCIFA1_0),
+       PINMUX_IPSR_MODSEL_DATA(IP14_21_19, AD_DI, SEL_ADI_0),
+       PINMUX_IPSR_MODSEL_DATA(IP14_21_19, RX1, SEL_SCIF1_0),
+       PINMUX_IPSR_DATA(IP14_21_19, DU2_EXODDF_DU2_ODDF_DISP_CDE),
+       PINMUX_IPSR_DATA(IP14_21_19, QCPV_QDE),
+       PINMUX_IPSR_MODSEL_DATA(IP14_24_22, SCIFA1_TXD, SEL_SCIFA1_0),
+       PINMUX_IPSR_MODSEL_DATA(IP14_24_22, AD_DO, SEL_ADI_0),
+       PINMUX_IPSR_MODSEL_DATA(IP14_24_22, TX1, SEL_SCIF1_0),
+       PINMUX_IPSR_DATA(IP14_24_22, DU2_DG1),
+       PINMUX_IPSR_DATA(IP14_24_22, LCDOUT9),
+       PINMUX_IPSR_MODSEL_DATA(IP14_27_25, SCIFA1_CTS_N, SEL_SCIFA1_0),
+       PINMUX_IPSR_MODSEL_DATA(IP14_27_25, AD_CLK, SEL_ADI_0),
+       PINMUX_IPSR_DATA(IP14_27_25, CTS1_N),
+       PINMUX_IPSR_MODSEL_DATA(IP14_27_25, MSIOF3_RXD, SEL_SOF3_0),
+       PINMUX_IPSR_DATA(IP14_27_25, DU0_DOTCLKOUT),
+       PINMUX_IPSR_DATA(IP14_27_25, QCLK),
+       PINMUX_IPSR_MODSEL_DATA(IP14_30_28, SCIFA1_RTS_N, SEL_SCIFA1_0),
+       PINMUX_IPSR_MODSEL_DATA(IP14_30_28, AD_NCS_N, SEL_ADI_0),
+       PINMUX_IPSR_DATA(IP14_30_28, RTS1_N_TANS),
+       PINMUX_IPSR_MODSEL_DATA(IP14_30_28, MSIOF3_TXD, SEL_SOF3_0),
+       PINMUX_IPSR_DATA(IP14_30_28, DU1_DOTCLKOUT),
+       PINMUX_IPSR_DATA(IP14_30_28, QSTVB_QVE),
+       PINMUX_IPSR_MODSEL_DATA(IP14_30_28, HRTS0_N_C, SEL_HSCIF0_2),
+
+       PINMUX_IPSR_MODSEL_DATA(IP15_2_0, SCIFA2_SCK, SEL_SCIFA2_0),
+       PINMUX_IPSR_MODSEL_DATA(IP15_2_0, FMCLK, SEL_FM_0),
+       PINMUX_IPSR_MODSEL_DATA(IP15_2_0, MSIOF3_SCK, SEL_SOF3_0),
+       PINMUX_IPSR_DATA(IP15_2_0, DU2_DG7),
+       PINMUX_IPSR_DATA(IP15_2_0, LCDOUT15),
+       PINMUX_IPSR_MODSEL_DATA(IP15_2_0, SCIF_CLK_B, SEL_SCIFCLK_0),
+       PINMUX_IPSR_MODSEL_DATA(IP15_5_3, SCIFA2_RXD, SEL_SCIFA2_0),
+       PINMUX_IPSR_MODSEL_DATA(IP15_5_3, FMIN, SEL_FM_0),
+       PINMUX_IPSR_DATA(IP15_5_3, DU2_DB0),
+       PINMUX_IPSR_DATA(IP15_5_3, LCDOUT16),
+       PINMUX_IPSR_MODSEL_DATA(IP15_5_3, SCL2, SEL_IIC2_0),
+       PINMUX_IPSR_MODSEL_DATA(IP15_5_3, SCL2_CIS, SEL_I2C2_0),
+       PINMUX_IPSR_MODSEL_DATA(IP15_8_6, SCIFA2_TXD, SEL_SCIFA2_0),
+       PINMUX_IPSR_MODSEL_DATA(IP15_8_6, BPFCLK, SEL_FM_0),
+       PINMUX_IPSR_DATA(IP15_8_6, DU2_DB1),
+       PINMUX_IPSR_DATA(IP15_8_6, LCDOUT17),
+       PINMUX_IPSR_MODSEL_DATA(IP15_8_6, SDA2, SEL_IIC2_0),
+       PINMUX_IPSR_MODSEL_DATA(IP15_8_6, SDA2_CIS, SEL_I2C2_0),
+       PINMUX_IPSR_DATA(IP15_11_9, HSCK0),
+       PINMUX_IPSR_MODSEL_DATA(IP15_11_9, TS_SDEN0, SEL_TSIF0_0),
+       PINMUX_IPSR_DATA(IP15_11_9, DU2_DG4),
+       PINMUX_IPSR_DATA(IP15_11_9, LCDOUT12),
+       PINMUX_IPSR_MODSEL_DATA(IP15_11_9, HCTS0_N_C, SEL_IIC2_0),
+       PINMUX_IPSR_MODSEL_DATA(IP15_11_9, SDA2_CIS, SEL_I2C2_0),
+       PINMUX_IPSR_MODSEL_DATA(IP15_13_12, HRX0, SEL_HSCIF0_0),
+       PINMUX_IPSR_DATA(IP15_13_12, DU2_DB2),
+       PINMUX_IPSR_DATA(IP15_13_12, LCDOUT18),
+       PINMUX_IPSR_MODSEL_DATA(IP15_15_14, HTX0, SEL_HSCIF0_0),
+       PINMUX_IPSR_DATA(IP15_15_14, DU2_DB3),
+       PINMUX_IPSR_DATA(IP15_15_14, LCDOUT19),
+       PINMUX_IPSR_MODSEL_DATA(IP15_17_16, HCTS0_N, SEL_HSCIF0_0),
+       PINMUX_IPSR_DATA(IP15_17_16, SSI_SCK9),
+       PINMUX_IPSR_DATA(IP15_17_16, DU2_DB4),
+       PINMUX_IPSR_DATA(IP15_17_16, LCDOUT20),
+       PINMUX_IPSR_MODSEL_DATA(IP15_19_18, HRTS0_N, SEL_HSCIF0_0),
+       PINMUX_IPSR_DATA(IP15_19_18, SSI_WS9),
+       PINMUX_IPSR_DATA(IP15_19_18, DU2_DB5),
+       PINMUX_IPSR_DATA(IP15_19_18, LCDOUT21),
+       PINMUX_IPSR_MODSEL_DATA(IP15_22_20, MSIOF0_SCK, SEL_SOF0_0),
+       PINMUX_IPSR_MODSEL_DATA(IP15_22_20, TS_SDAT0, SEL_TSIF0_0),
+       PINMUX_IPSR_DATA(IP15_22_20, ADICLK),
+       PINMUX_IPSR_DATA(IP15_22_20, DU2_DB6),
+       PINMUX_IPSR_DATA(IP15_22_20, LCDOUT22),
+       PINMUX_IPSR_DATA(IP15_25_23, MSIOF0_SYNC),
+       PINMUX_IPSR_MODSEL_DATA(IP15_25_23, TS_SCK0, SEL_TSIF0_0),
+       PINMUX_IPSR_DATA(IP15_25_23, SSI_SCK2),
+       PINMUX_IPSR_DATA(IP15_25_23, ADIDATA),
+       PINMUX_IPSR_DATA(IP15_25_23, DU2_DB7),
+       PINMUX_IPSR_DATA(IP15_25_23, LCDOUT23),
+       PINMUX_IPSR_MODSEL_DATA(IP15_25_23, SCIFA2_RXD_B, SEL_SCIFA2_1),
+       PINMUX_IPSR_MODSEL_DATA(IP15_27_26, MSIOF0_SS1, SEL_SOF0_0),
+       PINMUX_IPSR_DATA(IP15_27_26, ADICHS0),
+       PINMUX_IPSR_DATA(IP15_27_26, DU2_DG5),
+       PINMUX_IPSR_DATA(IP15_27_26, LCDOUT13),
+       PINMUX_IPSR_MODSEL_DATA(IP15_29_28, MSIOF0_TXD, SEL_SOF0_0),
+       PINMUX_IPSR_DATA(IP15_29_28, ADICHS1),
+       PINMUX_IPSR_DATA(IP15_29_28, DU2_DG6),
+       PINMUX_IPSR_DATA(IP15_29_28, LCDOUT14),
+
+       PINMUX_IPSR_MODSEL_DATA(IP16_2_0, MSIOF0_SS2, SEL_SOF0_0),
+       PINMUX_IPSR_DATA(IP16_2_0, AUDIO_CLKOUT),
+       PINMUX_IPSR_DATA(IP16_2_0, ADICHS2),
+       PINMUX_IPSR_DATA(IP16_2_0, DU2_DISP),
+       PINMUX_IPSR_DATA(IP16_2_0, QPOLA),
+       PINMUX_IPSR_MODSEL_DATA(IP16_2_0, HTX0_C, SEL_HSCIF0_2),
+       PINMUX_IPSR_MODSEL_DATA(IP16_2_0, SCIFA2_TXD_B, SEL_SCIFA2_1),
+       PINMUX_IPSR_MODSEL_DATA(IP16_5_3, MSIOF0_RXD, SEL_SOF0_0),
+       PINMUX_IPSR_MODSEL_DATA(IP16_5_3, TS_SPSYNC0, SEL_TSIF0_0),
+       PINMUX_IPSR_DATA(IP16_5_3, SSI_WS2),
+       PINMUX_IPSR_DATA(IP16_5_3, ADICS_SAMP),
+       PINMUX_IPSR_DATA(IP16_5_3, DU2_CDE),
+       PINMUX_IPSR_DATA(IP16_5_3, QPOLB),
+       PINMUX_IPSR_MODSEL_DATA(IP16_5_3, HRX0_C, SEL_HSCIF0_2),
+       PINMUX_IPSR_DATA(IP16_6, USB1_PWEN),
+       PINMUX_IPSR_DATA(IP16_6, AUDIO_CLKOUT_D),
+       PINMUX_IPSR_DATA(IP16_7, USB1_OVC),
+       PINMUX_IPSR_MODSEL_DATA(IP16_7, TCLK1_B, SEL_TMU1_1),
+};
+
+static struct sh_pfc_pin pinmux_pins[] = {
+       PINMUX_GPIO_GP_ALL(),
+};
+
+/* - ETH -------------------------------------------------------------------- */
+static const unsigned int eth_link_pins[] = {
+       /* LINK */
+       RCAR_GP_PIN(2, 22),
+};
+static const unsigned int eth_link_mux[] = {
+       ETH_LINK_MARK,
+};
+static const unsigned int eth_magic_pins[] = {
+       /* MAGIC */
+       RCAR_GP_PIN(2, 27),
+};
+static const unsigned int eth_magic_mux[] = {
+       ETH_MAGIC_MARK,
+};
+static const unsigned int eth_mdio_pins[] = {
+       /* MDC, MDIO */
+       RCAR_GP_PIN(2, 29), RCAR_GP_PIN(2, 24),
+};
+static const unsigned int eth_mdio_mux[] = {
+       ETH_MDC_MARK, ETH_MDIO_MARK,
+};
+static const unsigned int eth_rmii_pins[] = {
+       /* RXD[0:1], RX_ER, CRS_DV, TXD[0:1], TX_EN, REF_CLK */
+       RCAR_GP_PIN(2, 20), RCAR_GP_PIN(2, 21), RCAR_GP_PIN(2, 19),
+       RCAR_GP_PIN(2, 18), RCAR_GP_PIN(2, 28), RCAR_GP_PIN(2, 25),
+       RCAR_GP_PIN(2, 26), RCAR_GP_PIN(2, 23),
+};
+static const unsigned int eth_rmii_mux[] = {
+       ETH_RXD0_MARK, ETH_RXD1_MARK, ETH_RX_ER_MARK, ETH_CRS_DV_MARK,
+       ETH_TXD0_MARK, ETH_TXD1_MARK, ETH_TX_EN_MARK, ETH_REF_CLK_MARK,
+};
+/* - INTC ------------------------------------------------------------------- */
+static const unsigned int intc_irq0_pins[] = {
+       /* IRQ */
+       RCAR_GP_PIN(1, 25),
+};
+static const unsigned int intc_irq0_mux[] = {
+       IRQ0_MARK,
+};
+static const unsigned int intc_irq1_pins[] = {
+       /* IRQ */
+       RCAR_GP_PIN(1, 27),
+};
+static const unsigned int intc_irq1_mux[] = {
+       IRQ1_MARK,
+};
+static const unsigned int intc_irq2_pins[] = {
+       /* IRQ */
+       RCAR_GP_PIN(1, 29),
+};
+static const unsigned int intc_irq2_mux[] = {
+       IRQ2_MARK,
+};
+static const unsigned int intc_irq3_pins[] = {
+       /* IRQ */
+       RCAR_GP_PIN(1, 23),
+};
+static const unsigned int intc_irq3_mux[] = {
+       IRQ3_MARK,
+};
+/* - SCIF0 ----------------------------------------------------------------- */
+static const unsigned int scif0_data_pins[] = {
+       /* RX, TX */
+       RCAR_GP_PIN(4, 28), RCAR_GP_PIN(4, 29),
+};
+static const unsigned int scif0_data_mux[] = {
+       RX0_MARK, TX0_MARK,
+};
+static const unsigned int scif0_clk_pins[] = {
+       /* SCK */
+       RCAR_GP_PIN(4, 27),
+};
+static const unsigned int scif0_clk_mux[] = {
+       SCK0_MARK,
+};
+static const unsigned int scif0_ctrl_pins[] = {
+       /* RTS, CTS */
+       RCAR_GP_PIN(4, 31), RCAR_GP_PIN(4, 30),
+};
+static const unsigned int scif0_ctrl_mux[] = {
+       RTS0_N_TANS_MARK, CTS0_N_MARK,
+};
+static const unsigned int scif0_data_b_pins[] = {
+       /* RX, TX */
+       RCAR_GP_PIN(0, 4), RCAR_GP_PIN(0, 5),
+};
+static const unsigned int scif0_data_b_mux[] = {
+       RX0_B_MARK, TX0_B_MARK,
+};
+/* - SCIF1 ----------------------------------------------------------------- */
+static const unsigned int scif1_data_pins[] = {
+       /* RX, TX */
+       RCAR_GP_PIN(5, 0), RCAR_GP_PIN(5, 1),
+};
+static const unsigned int scif1_data_mux[] = {
+       RX1_MARK, TX1_MARK,
+};
+static const unsigned int scif1_clk_pins[] = {
+       /* SCK */
+       RCAR_GP_PIN(4, 20),
+};
+static const unsigned int scif1_clk_mux[] = {
+       SCK1_MARK,
+};
+static const unsigned int scif1_ctrl_pins[] = {
+       /* RTS, CTS */
+       RCAR_GP_PIN(5, 3), RCAR_GP_PIN(5, 2),
+};
+static const unsigned int scif1_ctrl_mux[] = {
+       RTS1_N_TANS_MARK, CTS1_N_MARK,
+};
+static const unsigned int scif1_data_b_pins[] = {
+       /* RX, TX */
+       RCAR_GP_PIN(0, 14), RCAR_GP_PIN(0, 15),
+};
+static const unsigned int scif1_data_b_mux[] = {
+       RX1_B_MARK, TX1_B_MARK,
+};
+static const unsigned int scif1_data_c_pins[] = {
+       /* RX, TX */
+       RCAR_GP_PIN(4, 1), RCAR_GP_PIN(4, 2),
+};
+static const unsigned int scif1_data_c_mux[] = {
+       RX1_C_MARK, TX1_C_MARK,
+};
+static const unsigned int scif1_data_d_pins[] = {
+       /* RX, TX */
+       RCAR_GP_PIN(3, 18), RCAR_GP_PIN(3, 19),
+};
+static const unsigned int scif1_data_d_mux[] = {
+       RX1_D_MARK, TX1_D_MARK,
+};
+static const unsigned int scif1_clk_d_pins[] = {
+       /* SCK */
+       RCAR_GP_PIN(3, 17),
+};
+static const unsigned int scif1_clk_d_mux[] = {
+       SCK1_D_MARK,
+};
+static const unsigned int scif1_data_e_pins[] = {
+       /* RX, TX */
+       RCAR_GP_PIN(2, 21), RCAR_GP_PIN(2, 22),
+};
+static const unsigned int scif1_data_e_mux[] = {
+       RX1_E_MARK, TX1_E_MARK,
+};
+static const unsigned int scif1_clk_e_pins[] = {
+       /* SCK */
+       RCAR_GP_PIN(2, 20),
+};
+static const unsigned int scif1_clk_e_mux[] = {
+       SCK1_E_MARK,
+};
+/* - SCIFA0 ----------------------------------------------------------------- */
+static const unsigned int scifa0_data_pins[] = {
+       /* RXD, TXD */
+       RCAR_GP_PIN(4, 28), RCAR_GP_PIN(4, 29),
+};
+static const unsigned int scifa0_data_mux[] = {
+       SCIFA0_RXD_MARK, SCIFA0_TXD_MARK,
+};
+static const unsigned int scifa0_clk_pins[] = {
+       /* SCK */
+       RCAR_GP_PIN(4, 27),
+};
+static const unsigned int scifa0_clk_mux[] = {
+       SCIFA0_SCK_MARK,
+};
+static const unsigned int scifa0_ctrl_pins[] = {
+       /* RTS, CTS */
+       RCAR_GP_PIN(4, 31), RCAR_GP_PIN(4, 30),
+};
+static const unsigned int scifa0_ctrl_mux[] = {
+       SCIFA0_RTS_N_MARK, SCIFA0_CTS_N_MARK,
+};
+static const unsigned int scifa0_data_b_pins[] = {
+       /* RXD, TXD */
+       RCAR_GP_PIN(1, 20), RCAR_GP_PIN(1, 21),
+};
+static const unsigned int scifa0_data_b_mux[] = {
+       SCIFA0_RXD_B_MARK, SCIFA0_TXD_B_MARK
+};
+static const unsigned int scifa0_clk_b_pins[] = {
+       /* SCK */
+       RCAR_GP_PIN(1, 19),
+};
+static const unsigned int scifa0_clk_b_mux[] = {
+       SCIFA0_SCK_B_MARK,
+};
+static const unsigned int scifa0_ctrl_b_pins[] = {
+       /* RTS, CTS */
+       RCAR_GP_PIN(1, 23), RCAR_GP_PIN(1, 22),
+};
+static const unsigned int scifa0_ctrl_b_mux[] = {
+       SCIFA0_RTS_N_B_MARK, SCIFA0_CTS_N_B_MARK,
+};
+/* - SCIFA1 ----------------------------------------------------------------- */
+static const unsigned int scifa1_data_pins[] = {
+       /* RXD, TXD */
+       RCAR_GP_PIN(5, 0), RCAR_GP_PIN(5, 1),
+};
+static const unsigned int scifa1_data_mux[] = {
+       SCIFA1_RXD_MARK, SCIFA1_TXD_MARK,
+};
+static const unsigned int scifa1_clk_pins[] = {
+       /* SCK */
+       RCAR_GP_PIN(4, 20),
+};
+static const unsigned int scifa1_clk_mux[] = {
+       SCIFA1_SCK_MARK,
+};
+static const unsigned int scifa1_ctrl_pins[] = {
+       /* RTS, CTS */
+       RCAR_GP_PIN(5, 3), RCAR_GP_PIN(5, 2),
+};
+static const unsigned int scifa1_ctrl_mux[] = {
+       SCIFA1_RTS_N_MARK, SCIFA1_CTS_N_MARK,
+};
+static const unsigned int scifa1_data_b_pins[] = {
+       /* RXD, TXD */
+       RCAR_GP_PIN(0, 24), RCAR_GP_PIN(0, 21),
+};
+static const unsigned int scifa1_data_b_mux[] = {
+       SCIFA1_RXD_B_MARK, SCIFA1_TXD_B_MARK,
+};
+static const unsigned int scifa1_clk_b_pins[] = {
+       /* SCK */
+       RCAR_GP_PIN(0, 23),
+};
+static const unsigned int scifa1_clk_b_mux[] = {
+       SCIFA1_SCK_B_MARK,
+};
+static const unsigned int scifa1_ctrl_b_pins[] = {
+       /* RTS, CTS */
+       RCAR_GP_PIN(0, 22), RCAR_GP_PIN(0, 25),
+};
+static const unsigned int scifa1_ctrl_b_mux[] = {
+       SCIFA1_RTS_N_B_MARK, SCIFA1_CTS_N_B_MARK,
+};
+static const unsigned int scifa1_data_c_pins[] = {
+       /* RXD, TXD */
+       RCAR_GP_PIN(0, 9), RCAR_GP_PIN(0, 10),
+};
+static const unsigned int scifa1_data_c_mux[] = {
+       SCIFA1_RXD_C_MARK, SCIFA1_TXD_C_MARK,
+};
+static const unsigned int scifa1_clk_c_pins[] = {
+       /* SCK */
+       RCAR_GP_PIN(0, 8),
+};
+static const unsigned int scifa1_clk_c_mux[] = {
+       SCIFA1_SCK_C_MARK,
+};
+static const unsigned int scifa1_ctrl_c_pins[] = {
+       /* RTS, CTS */
+       RCAR_GP_PIN(0, 12), RCAR_GP_PIN(0, 11),
+};
+static const unsigned int scifa1_ctrl_c_mux[] = {
+       SCIFA1_RTS_N_C_MARK, SCIFA1_CTS_N_C_MARK,
+};
+static const unsigned int scifa1_data_d_pins[] = {
+       /* RXD, TXD */
+       RCAR_GP_PIN(2, 11), RCAR_GP_PIN(2, 12),
+};
+static const unsigned int scifa1_data_d_mux[] = {
+       SCIFA1_RXD_D_MARK, SCIFA1_TXD_D_MARK,
+};
+static const unsigned int scifa1_clk_d_pins[] = {
+       /* SCK */
+       RCAR_GP_PIN(2, 10),
+};
+static const unsigned int scifa1_clk_d_mux[] = {
+       SCIFA1_SCK_D_MARK,
+};
+static const unsigned int scifa1_ctrl_d_pins[] = {
+       /* RTS, CTS */
+       RCAR_GP_PIN(2, 14), RCAR_GP_PIN(2, 13),
+};
+static const unsigned int scifa1_ctrl_d_mux[] = {
+       SCIFA1_RTS_N_D_MARK, SCIFA1_CTS_N_D_MARK,
+};
+/* - SCIFA2 ----------------------------------------------------------------- */
+static const unsigned int scifa2_data_pins[] = {
+       /* RXD, TXD */
+       RCAR_GP_PIN(5, 5), RCAR_GP_PIN(5, 6),
+};
+static const unsigned int scifa2_data_mux[] = {
+       SCIFA2_RXD_MARK, SCIFA2_TXD_MARK,
+};
+static const unsigned int scifa2_clk_pins[] = {
+       /* SCK */
+       RCAR_GP_PIN(5, 4),
+};
+static const unsigned int scifa2_clk_mux[] = {
+       SCIFA2_SCK_MARK,
+};
+static const unsigned int scifa2_ctrl_pins[] = {
+       /* RTS, CTS */
+       RCAR_GP_PIN(4, 22), RCAR_GP_PIN(4, 21),
+};
+static const unsigned int scifa2_ctrl_mux[] = {
+       SCIFA2_RTS_N_MARK, SCIFA2_CTS_N_MARK,
+};
+static const unsigned int scifa2_data_b_pins[] = {
+       /* RXD, TXD */
+       RCAR_GP_PIN(5, 13), RCAR_GP_PIN(5, 16),
+};
+static const unsigned int scifa2_data_b_mux[] = {
+       SCIFA2_RXD_B_MARK, SCIFA2_TXD_B_MARK,
+};
+static const unsigned int scifa2_data_c_pins[] = {
+       /* RXD, TXD */
+       RCAR_GP_PIN(5, 31), RCAR_GP_PIN(5, 30),
+};
+static const unsigned int scifa2_data_c_mux[] = {
+       SCIFA2_RXD_C_MARK, SCIFA2_TXD_C_MARK,
+};
+static const unsigned int scifa2_clk_c_pins[] = {
+       /* SCK */
+       RCAR_GP_PIN(5, 29),
+};
+static const unsigned int scifa2_clk_c_mux[] = {
+       SCIFA2_SCK_C_MARK,
+};
+/* - SCIFB0 ----------------------------------------------------------------- */
+static const unsigned int scifb0_data_pins[] = {
+       /* RXD, TXD */
+       RCAR_GP_PIN(4, 9), RCAR_GP_PIN(4, 10),
+};
+static const unsigned int scifb0_data_mux[] = {
+       SCIFB0_RXD_MARK, SCIFB0_TXD_MARK,
+};
+static const unsigned int scifb0_clk_pins[] = {
+       /* SCK */
+       RCAR_GP_PIN(4, 8),
+};
+static const unsigned int scifb0_clk_mux[] = {
+       SCIFB0_SCK_MARK,
+};
+static const unsigned int scifb0_ctrl_pins[] = {
+       /* RTS, CTS */
+       RCAR_GP_PIN(4, 12), RCAR_GP_PIN(4, 11),
+};
+static const unsigned int scifb0_ctrl_mux[] = {
+       SCIFB0_RTS_N_MARK, SCIFB0_CTS_N_MARK,
+};
+static const unsigned int scifb0_data_b_pins[] = {
+       /* RXD, TXD */
+       RCAR_GP_PIN(3, 10), RCAR_GP_PIN(3, 11),
+};
+static const unsigned int scifb0_data_b_mux[] = {
+       SCIFB0_RXD_B_MARK, SCIFB0_TXD_B_MARK,
+};
+static const unsigned int scifb0_clk_b_pins[] = {
+       /* SCK */
+       RCAR_GP_PIN(3, 9),
+};
+static const unsigned int scifb0_clk_b_mux[] = {
+       SCIFB0_SCK_B_MARK,
+};
+static const unsigned int scifb0_ctrl_b_pins[] = {
+       /* RTS, CTS */
+       RCAR_GP_PIN(3, 13), RCAR_GP_PIN(3, 12),
+};
+static const unsigned int scifb0_ctrl_b_mux[] = {
+       SCIFB0_RTS_N_B_MARK, SCIFB0_CTS_N_B_MARK,
+};
+static const unsigned int scifb0_data_c_pins[] = {
+       /* RXD, TXD */
+       RCAR_GP_PIN(0, 4), RCAR_GP_PIN(0, 5),
+};
+static const unsigned int scifb0_data_c_mux[] = {
+       SCIFB0_RXD_C_MARK, SCIFB0_TXD_C_MARK,
+};
+/* - SCIFB1 ----------------------------------------------------------------- */
+static const unsigned int scifb1_data_pins[] = {
+       /* RXD, TXD */
+       RCAR_GP_PIN(4, 15), RCAR_GP_PIN(4, 16),
+};
+static const unsigned int scifb1_data_mux[] = {
+       SCIFB1_RXD_MARK, SCIFB1_TXD_MARK,
+};
+static const unsigned int scifb1_clk_pins[] = {
+       /* SCK */
+       RCAR_GP_PIN(4, 14),
+};
+static const unsigned int scifb1_clk_mux[] = {
+       SCIFB1_SCK_MARK,
+};
+static const unsigned int scifb1_ctrl_pins[] = {
+       /* RTS, CTS */
+       RCAR_GP_PIN(4, 18), RCAR_GP_PIN(4, 17),
+};
+static const unsigned int scifb1_ctrl_mux[] = {
+       SCIFB1_RTS_N_MARK, SCIFB1_CTS_N_MARK,
+};
+static const unsigned int scifb1_data_b_pins[] = {
+       /* RXD, TXD */
+       RCAR_GP_PIN(3, 2), RCAR_GP_PIN(3, 3),
+};
+static const unsigned int scifb1_data_b_mux[] = {
+       SCIFB1_RXD_B_MARK, SCIFB1_TXD_B_MARK,
+};
+static const unsigned int scifb1_clk_b_pins[] = {
+       /* SCK */
+       RCAR_GP_PIN(3, 1),
+};
+static const unsigned int scifb1_clk_b_mux[] = {
+       SCIFB1_SCK_B_MARK,
+};
+static const unsigned int scifb1_ctrl_b_pins[] = {
+       /* RTS, CTS */
+       RCAR_GP_PIN(3, 5), RCAR_GP_PIN(3, 4),
+};
+static const unsigned int scifb1_ctrl_b_mux[] = {
+       SCIFB1_RTS_N_B_MARK, SCIFB1_CTS_N_B_MARK,
+};
+static const unsigned int scifb1_data_c_pins[] = {
+       /* RXD, TXD */
+       RCAR_GP_PIN(0, 14), RCAR_GP_PIN(0, 15),
+};
+static const unsigned int scifb1_data_c_mux[] = {
+       SCIFB1_RXD_C_MARK, SCIFB1_TXD_C_MARK,
+};
+static const unsigned int scifb1_data_d_pins[] = {
+       /* RXD, TXD */
+       RCAR_GP_PIN(4, 1), RCAR_GP_PIN(4, 2),
+};
+static const unsigned int scifb1_data_d_mux[] = {
+       SCIFB1_RXD_D_MARK, SCIFB1_TXD_D_MARK,
+};
+static const unsigned int scifb1_data_e_pins[] = {
+       /* RXD, TXD */
+       RCAR_GP_PIN(3, 18), RCAR_GP_PIN(3, 19),
+};
+static const unsigned int scifb1_data_e_mux[] = {
+       SCIFB1_RXD_E_MARK, SCIFB1_TXD_E_MARK,
+};
+static const unsigned int scifb1_clk_e_pins[] = {
+       /* SCK */
+       RCAR_GP_PIN(3, 17),
+};
+static const unsigned int scifb1_clk_e_mux[] = {
+       SCIFB1_SCK_E_MARK,
+};
+static const unsigned int scifb1_data_f_pins[] = {
+       /* RXD, TXD */
+       RCAR_GP_PIN(0, 4), RCAR_GP_PIN(0, 5),
+};
+static const unsigned int scifb1_data_f_mux[] = {
+       SCIFB1_RXD_F_MARK, SCIFB1_TXD_F_MARK,
+};
+static const unsigned int scifb1_data_g_pins[] = {
+       /* RXD, TXD */
+       RCAR_GP_PIN(2, 21), RCAR_GP_PIN(2, 22),
+};
+static const unsigned int scifb1_data_g_mux[] = {
+       SCIFB1_RXD_G_MARK, SCIFB1_TXD_G_MARK,
+};
+static const unsigned int scifb1_clk_g_pins[] = {
+       /* SCK */
+       RCAR_GP_PIN(2, 20),
+};
+static const unsigned int scifb1_clk_g_mux[] = {
+       SCIFB1_SCK_G_MARK,
+};
+/* - SCIFB2 ----------------------------------------------------------------- */
+static const unsigned int scifb2_data_pins[] = {
+       /* RXD, TXD */
+       RCAR_GP_PIN(4, 22), RCAR_GP_PIN(4, 23),
+};
+static const unsigned int scifb2_data_mux[] = {
+       SCIFB2_RXD_MARK, SCIFB2_TXD_MARK,
+};
+static const unsigned int scifb2_clk_pins[] = {
+       /* SCK */
+       RCAR_GP_PIN(4, 21),
+};
+static const unsigned int scifb2_clk_mux[] = {
+       SCIFB2_SCK_MARK,
+};
+static const unsigned int scifb2_ctrl_pins[] = {
+       /* RTS, CTS */
+       RCAR_GP_PIN(4, 25), RCAR_GP_PIN(4, 24),
+};
+static const unsigned int scifb2_ctrl_mux[] = {
+       SCIFB2_RTS_N_MARK, SCIFB2_CTS_N_MARK,
+};
+static const unsigned int scifb2_data_b_pins[] = {
+       /* RXD, TXD */
+       RCAR_GP_PIN(0, 28), RCAR_GP_PIN(0, 30),
+};
+static const unsigned int scifb2_data_b_mux[] = {
+       SCIFB2_RXD_B_MARK, SCIFB2_TXD_B_MARK,
+};
+static const unsigned int scifb2_clk_b_pins[] = {
+       /* SCK */
+       RCAR_GP_PIN(0, 31),
+};
+static const unsigned int scifb2_clk_b_mux[] = {
+       SCIFB2_SCK_B_MARK,
+};
+static const unsigned int scifb2_ctrl_b_pins[] = {
+       /* RTS, CTS */
+       RCAR_GP_PIN(0, 29), RCAR_GP_PIN(0, 27),
+};
+static const unsigned int scifb2_ctrl_b_mux[] = {
+       SCIFB2_RTS_N_B_MARK, SCIFB2_CTS_N_B_MARK,
+};
+static const unsigned int scifb2_data_c_pins[] = {
+       /* RXD, TXD */
+       RCAR_GP_PIN(0, 24), RCAR_GP_PIN(0, 25),
+};
+static const unsigned int scifb2_data_c_mux[] = {
+       SCIFB2_RXD_C_MARK, SCIFB2_TXD_C_MARK,
+};
+/* - TPU0 ------------------------------------------------------------------- */
+static const unsigned int tpu0_to0_pins[] = {
+       /* TO */
+       RCAR_GP_PIN(0, 20),
+};
+static const unsigned int tpu0_to0_mux[] = {
+       TPU0TO0_MARK,
+};
+static const unsigned int tpu0_to1_pins[] = {
+       /* TO */
+       RCAR_GP_PIN(0, 21),
+};
+static const unsigned int tpu0_to1_mux[] = {
+       TPU0TO1_MARK,
+};
+static const unsigned int tpu0_to2_pins[] = {
+       /* TO */
+       RCAR_GP_PIN(0, 22),
+};
+static const unsigned int tpu0_to2_mux[] = {
+       TPU0TO2_MARK,
+};
+static const unsigned int tpu0_to3_pins[] = {
+       /* TO */
+       RCAR_GP_PIN(0, 23),
+};
+static const unsigned int tpu0_to3_mux[] = {
+       TPU0TO3_MARK,
+};
+
+/* - MMCIF ------------------------------------------------------------------ */
+static const unsigned int mmc0_data1_pins[] = {
+       /* D[0] */
+       RCAR_GP_PIN(3, 18),
+};
+static const unsigned int mmc0_data1_mux[] = {
+       MMC0_D0_MARK,
+};
+static const unsigned int mmc0_data4_pins[] = {
+       /* D[0:3] */
+       RCAR_GP_PIN(3, 18), RCAR_GP_PIN(3, 19),
+       RCAR_GP_PIN(3, 20), RCAR_GP_PIN(3, 21),
+};
+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] */
+       RCAR_GP_PIN(3, 18), RCAR_GP_PIN(3, 19),
+       RCAR_GP_PIN(3, 20), RCAR_GP_PIN(3, 21),
+       RCAR_GP_PIN(3, 22), RCAR_GP_PIN(3, 23),
+       RCAR_GP_PIN(3, 6), RCAR_GP_PIN(3, 7),
+};
+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[] = {
+       /* CLK, CMD */
+       RCAR_GP_PIN(3, 16), RCAR_GP_PIN(3, 17),
+};
+static const unsigned int mmc0_ctrl_mux[] = {
+       MMC0_CLK_MARK, MMC0_CMD_MARK,
+};
+
+static const unsigned int mmc1_data1_pins[] = {
+       /* D[0] */
+       RCAR_GP_PIN(3, 26),
+};
+static const unsigned int mmc1_data1_mux[] = {
+       MMC1_D0_MARK,
+};
+static const unsigned int mmc1_data4_pins[] = {
+       /* D[0:3] */
+       RCAR_GP_PIN(3, 26), RCAR_GP_PIN(3, 27),
+       RCAR_GP_PIN(3, 28), RCAR_GP_PIN(3, 29),
+};
+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] */
+       RCAR_GP_PIN(3, 26), RCAR_GP_PIN(3, 27),
+       RCAR_GP_PIN(3, 28), RCAR_GP_PIN(3, 29),
+       RCAR_GP_PIN(3, 30), RCAR_GP_PIN(3, 31),
+       RCAR_GP_PIN(3, 13), RCAR_GP_PIN(3, 14),
+};
+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[] = {
+       /* CLK, CMD */
+       RCAR_GP_PIN(3, 24), RCAR_GP_PIN(3, 25),
+};
+static const unsigned int mmc1_ctrl_mux[] = {
+       MMC1_CLK_MARK, MMC1_CMD_MARK,
+};
+
+/* - SDHI ------------------------------------------------------------------- */
+static const unsigned int sdhi0_data1_pins[] = {
+       /* D0 */
+       RCAR_GP_PIN(3, 2),
+};
+static const unsigned int sdhi0_data1_mux[] = {
+       SD0_DAT0_MARK,
+};
+static const unsigned int sdhi0_data4_pins[] = {
+       /* D[0:3] */
+       RCAR_GP_PIN(3, 2), RCAR_GP_PIN(3, 3), RCAR_GP_PIN(3, 4), RCAR_GP_PIN(3, 5),
+};
+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[] = {
+       /* CLK, CMD */
+       RCAR_GP_PIN(3, 0), RCAR_GP_PIN(3, 1),
+};
+static const unsigned int sdhi0_ctrl_mux[] = {
+       SD0_CLK_MARK, SD0_CMD_MARK,
+};
+static const unsigned int sdhi0_cd_pins[] = {
+       /* CD */
+       RCAR_GP_PIN(3, 6),
+};
+static const unsigned int sdhi0_cd_mux[] = {
+       SD0_CD_MARK,
+};
+static const unsigned int sdhi0_wp_pins[] = {
+       /* WP */
+       RCAR_GP_PIN(3, 7),
+};
+static const unsigned int sdhi0_wp_mux[] = {
+       SD0_WP_MARK,
+};
+
+static const unsigned int sdhi1_data1_pins[] = {
+       /* D0 */
+       RCAR_GP_PIN(3, 10),
+};
+static const unsigned int sdhi1_data1_mux[] = {
+       SD1_DAT0_MARK,
+};
+static const unsigned int sdhi1_data4_pins[] = {
+       /* D[0:3] */
+       RCAR_GP_PIN(3, 10), RCAR_GP_PIN(3, 11), RCAR_GP_PIN(3, 12), RCAR_GP_PIN(3, 13),
+};
+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[] = {
+       /* CLK, CMD */
+       RCAR_GP_PIN(3, 8), RCAR_GP_PIN(3, 9),
+};
+static const unsigned int sdhi1_ctrl_mux[] = {
+       SD1_CLK_MARK, SD1_CMD_MARK,
+};
+static const unsigned int sdhi1_cd_pins[] = {
+       /* CD */
+       RCAR_GP_PIN(3, 14),
+};
+static const unsigned int sdhi1_cd_mux[] = {
+       SD1_CD_MARK,
+};
+static const unsigned int sdhi1_wp_pins[] = {
+       /* WP */
+       RCAR_GP_PIN(3, 15),
+};
+static const unsigned int sdhi1_wp_mux[] = {
+       SD1_WP_MARK,
+};
+
+static const unsigned int sdhi2_data1_pins[] = {
+       /* D0 */
+       RCAR_GP_PIN(3, 18),
+};
+static const unsigned int sdhi2_data1_mux[] = {
+       SD2_DAT0_MARK,
+};
+static const unsigned int sdhi2_data4_pins[] = {
+       /* D[0:3] */
+       RCAR_GP_PIN(3, 18), RCAR_GP_PIN(3, 19), RCAR_GP_PIN(3, 20), RCAR_GP_PIN(3, 21),
+};
+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[] = {
+       /* CLK, CMD */
+       RCAR_GP_PIN(3, 16), RCAR_GP_PIN(3, 17),
+};
+static const unsigned int sdhi2_ctrl_mux[] = {
+       SD2_CLK_MARK, SD2_CMD_MARK,
+};
+static const unsigned int sdhi2_cd_pins[] = {
+       /* CD */
+       RCAR_GP_PIN(3, 22),
+};
+static const unsigned int sdhi2_cd_mux[] = {
+       SD2_CD_MARK,
+};
+static const unsigned int sdhi2_wp_pins[] = {
+       /* WP */
+       RCAR_GP_PIN(3, 23),
+};
+static const unsigned int sdhi2_wp_mux[] = {
+       SD2_WP_MARK,
+};
+
+static const unsigned int sdhi3_data1_pins[] = {
+       /* D0 */
+       RCAR_GP_PIN(3, 26),
+};
+static const unsigned int sdhi3_data1_mux[] = {
+       SD3_DAT0_MARK,
+};
+static const unsigned int sdhi3_data4_pins[] = {
+       /* D[0:3] */
+       RCAR_GP_PIN(3, 26), RCAR_GP_PIN(3, 27), RCAR_GP_PIN(3, 28), RCAR_GP_PIN(3, 29),
+};
+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[] = {
+       /* CLK, CMD */
+       RCAR_GP_PIN(3, 24), RCAR_GP_PIN(3, 25),
+};
+static const unsigned int sdhi3_ctrl_mux[] = {
+       SD3_CLK_MARK, SD3_CMD_MARK,
+};
+static const unsigned int sdhi3_cd_pins[] = {
+       /* CD */
+       RCAR_GP_PIN(3, 30),
+};
+static const unsigned int sdhi3_cd_mux[] = {
+       SD3_CD_MARK,
+};
+static const unsigned int sdhi3_wp_pins[] = {
+       /* WP */
+       RCAR_GP_PIN(3, 31),
+};
+static const unsigned int sdhi3_wp_mux[] = {
+       SD3_WP_MARK,
+};
+
+static const struct sh_pfc_pin_group pinmux_groups[] = {
+       SH_PFC_PIN_GROUP(eth_link),
+       SH_PFC_PIN_GROUP(eth_magic),
+       SH_PFC_PIN_GROUP(eth_mdio),
+       SH_PFC_PIN_GROUP(eth_rmii),
+       SH_PFC_PIN_GROUP(intc_irq0),
+       SH_PFC_PIN_GROUP(intc_irq1),
+       SH_PFC_PIN_GROUP(intc_irq2),
+       SH_PFC_PIN_GROUP(intc_irq3),
+       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(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_data_c),
+       SH_PFC_PIN_GROUP(scif1_data_d),
+       SH_PFC_PIN_GROUP(scif1_clk_d),
+       SH_PFC_PIN_GROUP(scif1_data_e),
+       SH_PFC_PIN_GROUP(scif1_clk_e),
+       SH_PFC_PIN_GROUP(scifa0_data),
+       SH_PFC_PIN_GROUP(scifa0_clk),
+       SH_PFC_PIN_GROUP(scifa0_ctrl),
+       SH_PFC_PIN_GROUP(scifa0_data_b),
+       SH_PFC_PIN_GROUP(scifa0_clk_b),
+       SH_PFC_PIN_GROUP(scifa0_ctrl_b),
+       SH_PFC_PIN_GROUP(scifa1_data),
+       SH_PFC_PIN_GROUP(scifa1_clk),
+       SH_PFC_PIN_GROUP(scifa1_ctrl),
+       SH_PFC_PIN_GROUP(scifa1_data_b),
+       SH_PFC_PIN_GROUP(scifa1_clk_b),
+       SH_PFC_PIN_GROUP(scifa1_ctrl_b),
+       SH_PFC_PIN_GROUP(scifa1_data_c),
+       SH_PFC_PIN_GROUP(scifa1_clk_c),
+       SH_PFC_PIN_GROUP(scifa1_ctrl_c),
+       SH_PFC_PIN_GROUP(scifa1_data_d),
+       SH_PFC_PIN_GROUP(scifa1_clk_d),
+       SH_PFC_PIN_GROUP(scifa1_ctrl_d),
+       SH_PFC_PIN_GROUP(scifa2_data),
+       SH_PFC_PIN_GROUP(scifa2_clk),
+       SH_PFC_PIN_GROUP(scifa2_ctrl),
+       SH_PFC_PIN_GROUP(scifa2_data_b),
+       SH_PFC_PIN_GROUP(scifa2_data_c),
+       SH_PFC_PIN_GROUP(scifa2_clk_c),
+       SH_PFC_PIN_GROUP(scifb0_data),
+       SH_PFC_PIN_GROUP(scifb0_clk),
+       SH_PFC_PIN_GROUP(scifb0_ctrl),
+       SH_PFC_PIN_GROUP(scifb0_data_b),
+       SH_PFC_PIN_GROUP(scifb0_clk_b),
+       SH_PFC_PIN_GROUP(scifb0_ctrl_b),
+       SH_PFC_PIN_GROUP(scifb0_data_c),
+       SH_PFC_PIN_GROUP(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(scifb1_data_c),
+       SH_PFC_PIN_GROUP(scifb1_data_d),
+       SH_PFC_PIN_GROUP(scifb1_data_e),
+       SH_PFC_PIN_GROUP(scifb1_clk_e),
+       SH_PFC_PIN_GROUP(scifb1_data_f),
+       SH_PFC_PIN_GROUP(scifb1_data_g),
+       SH_PFC_PIN_GROUP(scifb1_clk_g),
+       SH_PFC_PIN_GROUP(scifb2_data),
+       SH_PFC_PIN_GROUP(scifb2_clk),
+       SH_PFC_PIN_GROUP(scifb2_ctrl),
+       SH_PFC_PIN_GROUP(scifb2_data_b),
+       SH_PFC_PIN_GROUP(scifb2_clk_b),
+       SH_PFC_PIN_GROUP(scifb2_ctrl_b),
+       SH_PFC_PIN_GROUP(scifb2_data_c),
+       SH_PFC_PIN_GROUP(tpu0_to0),
+       SH_PFC_PIN_GROUP(tpu0_to1),
+       SH_PFC_PIN_GROUP(tpu0_to2),
+       SH_PFC_PIN_GROUP(tpu0_to3),
+       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(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),
+};
+
+static const char * const eth_groups[] = {
+       "eth_link",
+       "eth_magic",
+       "eth_mdio",
+       "eth_rmii",
+};
+
+static const char * const intc_groups[] = {
+       "intc_irq0",
+       "intc_irq1",
+       "intc_irq2",
+       "intc_irq3",
+};
+
+static const char * const scif0_groups[] = {
+       "scif0_data",
+       "scif0_clk",
+       "scif0_ctrl",
+       "scif0_data_b",
+};
+
+static const char * const scif1_groups[] = {
+       "scif1_data",
+       "scif1_clk",
+       "scif1_ctrl",
+       "scif1_data_b",
+       "scif1_data_c",
+       "scif1_data_d",
+       "scif1_clk_d",
+       "scif1_data_e",
+       "scif1_clk_e",
+};
+
+static const char * const scifa0_groups[] = {
+       "scifa0_data",
+       "scifa0_clk",
+       "scifa0_ctrl",
+       "scifa0_data_b",
+       "scifa0_clk_b",
+       "scifa0_ctrl_b",
+};
+
+static const char * const scifa1_groups[] = {
+       "scifa1_data",
+       "scifa1_clk",
+       "scifa1_ctrl",
+       "scifa1_data_b",
+       "scifa1_clk_b",
+       "scifa1_ctrl_b",
+       "scifa1_data_c",
+       "scifa1_clk_c",
+       "scifa1_ctrl_c",
+       "scifa1_data_d",
+       "scifa1_clk_d",
+       "scifa1_ctrl_d",
+};
+
+static const char * const scifa2_groups[] = {
+       "scifa2_data",
+       "scifa2_clk",
+       "scifa2_ctrl",
+       "scifa2_data_b",
+       "scifa2_data_c",
+       "scifa2_clk_c",
+};
+
+static const char * const scifb0_groups[] = {
+       "scifb0_data",
+       "scifb0_clk",
+       "scifb0_ctrl",
+       "scifb0_data_b",
+       "scifb0_clk_b",
+       "scifb0_ctrl_b",
+       "scifb0_data_c",
+};
+
+static const char * const scifb1_groups[] = {
+       "scifb1_data",
+       "scifb1_clk",
+       "scifb1_ctrl",
+       "scifb1_data_b",
+       "scifb1_clk_b",
+       "scifb1_ctrl_b",
+       "scifb1_data_c",
+       "scifb1_data_d",
+       "scifb1_data_e",
+       "scifb1_clk_e",
+       "scifb1_data_f",
+       "scifb1_data_g",
+       "scifb1_clk_g",
+};
+
+static const char * const scifb2_groups[] = {
+       "scifb2_data",
+       "scifb2_clk",
+       "scifb2_ctrl",
+       "scifb2_data_b",
+       "scifb2_clk_b",
+       "scifb2_ctrl_b",
+       "scifb2_data_c",
+};
+
+static const char * const tpu0_groups[] = {
+       "tpu0_to0",
+       "tpu0_to1",
+       "tpu0_to2",
+       "tpu0_to3",
+};
+
+static const char * const mmc0_groups[] = {
+       "mmc0_data1",
+       "mmc0_data4",
+       "mmc0_data8",
+       "mmc0_ctrl",
+};
+
+static const char * const mmc1_groups[] = {
+       "mmc1_data1",
+       "mmc1_data4",
+       "mmc1_data8",
+       "mmc1_ctrl",
+};
+
+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 struct sh_pfc_function pinmux_functions[] = {
+       SH_PFC_FUNCTION(eth),
+       SH_PFC_FUNCTION(intc),
+       SH_PFC_FUNCTION(scif0),
+       SH_PFC_FUNCTION(scif1),
+       SH_PFC_FUNCTION(scifa0),
+       SH_PFC_FUNCTION(scifa1),
+       SH_PFC_FUNCTION(scifa2),
+       SH_PFC_FUNCTION(scifb0),
+       SH_PFC_FUNCTION(scifb1),
+       SH_PFC_FUNCTION(scifb2),
+       SH_PFC_FUNCTION(tpu0),
+       SH_PFC_FUNCTION(mmc0),
+       SH_PFC_FUNCTION(mmc1),
+       SH_PFC_FUNCTION(sdhi0),
+       SH_PFC_FUNCTION(sdhi1),
+       SH_PFC_FUNCTION(sdhi2),
+       SH_PFC_FUNCTION(sdhi3),
+};
+
+static struct pinmux_cfg_reg pinmux_config_regs[] = {
+       { PINMUX_CFG_REG("GPSR0", 0xE6060004, 32, 1) {
+               GP_0_31_FN, FN_IP3_17_15,
+               GP_0_30_FN, FN_IP3_14_12,
+               GP_0_29_FN, FN_IP3_11_8,
+               GP_0_28_FN, FN_IP3_7_4,
+               GP_0_27_FN, FN_IP3_3_0,
+               GP_0_26_FN, FN_IP2_28_26,
+               GP_0_25_FN, FN_IP2_25_22,
+               GP_0_24_FN, FN_IP2_21_18,
+               GP_0_23_FN, FN_IP2_17_15,
+               GP_0_22_FN, FN_IP2_14_12,
+               GP_0_21_FN, FN_IP2_11_9,
+               GP_0_20_FN, FN_IP2_8_6,
+               GP_0_19_FN, FN_IP2_5_3,
+               GP_0_18_FN, FN_IP2_2_0,
+               GP_0_17_FN, FN_IP1_29_28,
+               GP_0_16_FN, FN_IP1_27_26,
+               GP_0_15_FN, FN_IP1_25_22,
+               GP_0_14_FN, FN_IP1_21_18,
+               GP_0_13_FN, FN_IP1_17_15,
+               GP_0_12_FN, FN_IP1_14_12,
+               GP_0_11_FN, FN_IP1_11_8,
+               GP_0_10_FN, FN_IP1_7_4,
+               GP_0_9_FN, FN_IP1_3_0,
+               GP_0_8_FN, FN_IP0_30_27,
+               GP_0_7_FN, FN_IP0_26_23,
+               GP_0_6_FN, FN_IP0_22_20,
+               GP_0_5_FN, FN_IP0_19_16,
+               GP_0_4_FN, FN_IP0_15_12,
+               GP_0_3_FN, FN_IP0_11_9,
+               GP_0_2_FN, FN_IP0_8_6,
+               GP_0_1_FN, FN_IP0_5_3,
+               GP_0_0_FN, FN_IP0_2_0 }
+       },
+       { PINMUX_CFG_REG("GPSR1", 0xE6060008, 32, 1) {
+               0, 0,
+               0, 0,
+               GP_1_29_FN, FN_IP6_13_11,
+               GP_1_28_FN, FN_IP6_10_9,
+               GP_1_27_FN, FN_IP6_8_6,
+               GP_1_26_FN, FN_IP6_5_3,
+               GP_1_25_FN, FN_IP6_2_0,
+               GP_1_24_FN, FN_IP5_29_27,
+               GP_1_23_FN, FN_IP5_26_24,
+               GP_1_22_FN, FN_IP5_23_21,
+               GP_1_21_FN, FN_IP5_20_18,
+               GP_1_20_FN, FN_IP5_17_15,
+               GP_1_19_FN, FN_IP5_14_13,
+               GP_1_18_FN, FN_IP5_12_10,
+               GP_1_17_FN, FN_IP5_9_6,
+               GP_1_16_FN, FN_IP5_5_3,
+               GP_1_15_FN, FN_IP5_2_0,
+               GP_1_14_FN, FN_IP4_29_27,
+               GP_1_13_FN, FN_IP4_26_24,
+               GP_1_12_FN, FN_IP4_23_21,
+               GP_1_11_FN, FN_IP4_20_18,
+               GP_1_10_FN, FN_IP4_17_15,
+               GP_1_9_FN, FN_IP4_14_12,
+               GP_1_8_FN, FN_IP4_11_9,
+               GP_1_7_FN, FN_IP4_8_6,
+               GP_1_6_FN, FN_IP4_5_3,
+               GP_1_5_FN, FN_IP4_2_0,
+               GP_1_4_FN, FN_IP3_31_29,
+               GP_1_3_FN, FN_IP3_28_26,
+               GP_1_2_FN, FN_IP3_25_23,
+               GP_1_1_FN, FN_IP3_22_20,
+               GP_1_0_FN, FN_IP3_19_18, }
+       },
+       { PINMUX_CFG_REG("GPSR2", 0xE606000C, 32, 1) {
+               0, 0,
+               0, 0,
+               GP_2_29_FN, FN_IP7_15_13,
+               GP_2_28_FN, FN_IP7_12_10,
+               GP_2_27_FN, FN_IP7_9_8,
+               GP_2_26_FN, FN_IP7_7_6,
+               GP_2_25_FN, FN_IP7_5_3,
+               GP_2_24_FN, FN_IP7_2_0,
+               GP_2_23_FN, FN_IP6_31_29,
+               GP_2_22_FN, FN_IP6_28_26,
+               GP_2_21_FN, FN_IP6_25_23,
+               GP_2_20_FN, FN_IP6_22_20,
+               GP_2_19_FN, FN_IP6_19_17,
+               GP_2_18_FN, FN_IP6_16_14,
+               GP_2_17_FN, FN_VI1_DATA7_VI1_B7,
+               GP_2_16_FN, FN_IP8_27,
+               GP_2_15_FN, FN_IP8_26,
+               GP_2_14_FN, FN_IP8_25_24,
+               GP_2_13_FN, FN_IP8_23_22,
+               GP_2_12_FN, FN_IP8_21_20,
+               GP_2_11_FN, FN_IP8_19_18,
+               GP_2_10_FN, FN_IP8_17_16,
+               GP_2_9_FN, FN_IP8_15_14,
+               GP_2_8_FN, FN_IP8_13_12,
+               GP_2_7_FN, FN_IP8_11_10,
+               GP_2_6_FN, FN_IP8_9_8,
+               GP_2_5_FN, FN_IP8_7_6,
+               GP_2_4_FN, FN_IP8_5_4,
+               GP_2_3_FN, FN_IP8_3_2,
+               GP_2_2_FN, FN_IP8_1_0,
+               GP_2_1_FN, FN_IP7_30_29,
+               GP_2_0_FN, FN_IP7_28_27 }
+       },
+       { PINMUX_CFG_REG("GPSR3", 0xE6060010, 32, 1) {
+               GP_3_31_FN, FN_IP11_21_18,
+               GP_3_30_FN, FN_IP11_17_15,
+               GP_3_29_FN, FN_IP11_14_13,
+               GP_3_28_FN, FN_IP11_12_11,
+               GP_3_27_FN, FN_IP11_10_9,
+               GP_3_26_FN, FN_IP11_8_7,
+               GP_3_25_FN, FN_IP11_6_5,
+               GP_3_24_FN, FN_IP11_4,
+               GP_3_23_FN, FN_IP11_3_0,
+               GP_3_22_FN, FN_IP10_29_26,
+               GP_3_21_FN, FN_IP10_25_23,
+               GP_3_20_FN, FN_IP10_22_19,
+               GP_3_19_FN, FN_IP10_18_15,
+               GP_3_18_FN, FN_IP10_14_11,
+               GP_3_17_FN, FN_IP10_10_7,
+               GP_3_16_FN, FN_IP10_6_4,
+               GP_3_15_FN, FN_IP10_3_0,
+               GP_3_14_FN, FN_IP9_31_28,
+               GP_3_13_FN, FN_IP9_27_26,
+               GP_3_12_FN, FN_IP9_25_24,
+               GP_3_11_FN, FN_IP9_23_22,
+               GP_3_10_FN, FN_IP9_21_20,
+               GP_3_9_FN, FN_IP9_19_18,
+               GP_3_8_FN, FN_IP9_17_16,
+               GP_3_7_FN, FN_IP9_15_12,
+               GP_3_6_FN, FN_IP9_11_8,
+               GP_3_5_FN, FN_IP9_7_6,
+               GP_3_4_FN, FN_IP9_5_4,
+               GP_3_3_FN, FN_IP9_3_2,
+               GP_3_2_FN, FN_IP9_1_0,
+               GP_3_1_FN, FN_IP8_30_29,
+               GP_3_0_FN, FN_IP8_28 }
+       },
+       { PINMUX_CFG_REG("GPSR4", 0xE6060014, 32, 1) {
+               GP_4_31_FN, FN_IP14_18_16,
+               GP_4_30_FN, FN_IP14_15_12,
+               GP_4_29_FN, FN_IP14_11_9,
+               GP_4_28_FN, FN_IP14_8_6,
+               GP_4_27_FN, FN_IP14_5_3,
+               GP_4_26_FN, FN_IP14_2_0,
+               GP_4_25_FN, FN_IP13_30_29,
+               GP_4_24_FN, FN_IP13_28_26,
+               GP_4_23_FN, FN_IP13_25_23,
+               GP_4_22_FN, FN_IP13_22_19,
+               GP_4_21_FN, FN_IP13_18_16,
+               GP_4_20_FN, FN_IP13_15_13,
+               GP_4_19_FN, FN_IP13_12_10,
+               GP_4_18_FN, FN_IP13_9_7,
+               GP_4_17_FN, FN_IP13_6_3,
+               GP_4_16_FN, FN_IP13_2_0,
+               GP_4_15_FN, FN_IP12_30_28,
+               GP_4_14_FN, FN_IP12_27_25,
+               GP_4_13_FN, FN_IP12_24_23,
+               GP_4_12_FN, FN_IP12_22_20,
+               GP_4_11_FN, FN_IP12_19_17,
+               GP_4_10_FN, FN_IP12_16_14,
+               GP_4_9_FN, FN_IP12_13_11,
+               GP_4_8_FN, FN_IP12_10_8,
+               GP_4_7_FN, FN_IP12_7_6,
+               GP_4_6_FN, FN_IP12_5_4,
+               GP_4_5_FN, FN_IP12_3_2,
+               GP_4_4_FN, FN_IP12_1_0,
+               GP_4_3_FN, FN_IP11_31_30,
+               GP_4_2_FN, FN_IP11_29_27,
+               GP_4_1_FN, FN_IP11_26_24,
+               GP_4_0_FN, FN_IP11_23_22 }
+       },
+       { PINMUX_CFG_REG("GPSR5", 0xE6060018, 32, 1) {
+               GP_5_31_FN, FN_IP7_24_22,
+               GP_5_30_FN, FN_IP7_21_19,
+               GP_5_29_FN, FN_IP7_18_16,
+               GP_5_28_FN, FN_DU_DOTCLKIN2,
+               GP_5_27_FN, FN_IP7_26_25,
+               GP_5_26_FN, FN_DU_DOTCLKIN0,
+               GP_5_25_FN, FN_AVS2,
+               GP_5_24_FN, FN_AVS1,
+               GP_5_23_FN, FN_USB2_OVC,
+               GP_5_22_FN, FN_USB2_PWEN,
+               GP_5_21_FN, FN_IP16_7,
+               GP_5_20_FN, FN_IP16_6,
+               GP_5_19_FN, FN_USB0_OVC_VBUS,
+               GP_5_18_FN, FN_USB0_PWEN,
+               GP_5_17_FN, FN_IP16_5_3,
+               GP_5_16_FN, FN_IP16_2_0,
+               GP_5_15_FN, FN_IP15_29_28,
+               GP_5_14_FN, FN_IP15_27_26,
+               GP_5_13_FN, FN_IP15_25_23,
+               GP_5_12_FN, FN_IP15_22_20,
+               GP_5_11_FN, FN_IP15_19_18,
+               GP_5_10_FN, FN_IP15_17_16,
+               GP_5_9_FN, FN_IP15_15_14,
+               GP_5_8_FN, FN_IP15_13_12,
+               GP_5_7_FN, FN_IP15_11_9,
+               GP_5_6_FN, FN_IP15_8_6,
+               GP_5_5_FN, FN_IP15_5_3,
+               GP_5_4_FN, FN_IP15_2_0,
+               GP_5_3_FN, FN_IP14_30_28,
+               GP_5_2_FN, FN_IP14_27_25,
+               GP_5_1_FN, FN_IP14_24_22,
+               GP_5_0_FN, FN_IP14_21_19 }
+       },
+       { PINMUX_CFG_REG_VAR("IPSR0", 0xE6060020, 32,
+                            1, 4, 4, 3, 4, 4, 3, 3, 3, 3) {
+               /* IP0_31 [1] */
+               0, 0,
+               /* IP0_30_27 [4] */
+               FN_D8, FN_SCIFA1_SCK_C, FN_AVB_TXD0, FN_MII_TXD0,
+               FN_VI0_G0, FN_VI0_G0_B, FN_VI2_DATA0_VI2_B0,
+               0, 0, 0, 0, 0, 0, 0, 0, 0,
+               /* IP0_26_23 [4] */
+               FN_D7, FN_AD_DI_B, FN_SDA2_C,
+               FN_VI3_DATA7, FN_VI0_R3, FN_VI0_R3_B, FN_SDA2_CIS_C,
+               0, 0, 0, 0, 0, 0, 0, 0, 0,
+               /* IP0_22_20 [3] */
+               FN_D6, FN_SCL2_C, FN_VI3_DATA6, FN_VI0_R2, FN_VI0_R2_B,
+               FN_SCL2_CIS_C, 0, 0,
+               /* IP0_19_16 [4] */
+               FN_D5, FN_SCIFB1_TXD_F, FN_SCIFB0_TXD_C, FN_VI3_DATA5,
+               FN_VI0_R1, FN_VI0_R1_B, FN_TX0_B,
+               0, 0, 0, 0, 0, 0, 0, 0, 0,
+               /* IP0_15_12 [4] */
+               FN_D4, FN_SCIFB1_RXD_F, FN_SCIFB0_RXD_C, FN_VI3_DATA4,
+               FN_VI0_R0, FN_VI0_R0_B, FN_RX0_B,
+               0, 0, 0, 0, 0, 0, 0, 0, 0,
+               /* IP0_11_9 [3] */
+               FN_D3, FN_MSIOF3_TXD_B, FN_VI3_DATA3, FN_VI0_G7, FN_VI0_G7_B,
+               0, 0, 0,
+               /* IP0_8_6 [3] */
+               FN_D2, FN_MSIOF3_RXD_B, FN_VI3_DATA2, FN_VI0_G6, FN_VI0_G6_B,
+               0, 0, 0,
+               /* IP0_5_3 [3] */
+               FN_D1, FN_MSIOF3_SYNC_B, FN_VI3_DATA1, FN_VI0_G5, FN_VI0_G5_B,
+               0, 0, 0,
+               /* IP0_2_0 [3] */
+               FN_D0, FN_MSIOF3_SCK_B, FN_VI3_DATA0, FN_VI0_G4, FN_VI0_G4_B,
+               0, 0, 0, }
+       },
+       { PINMUX_CFG_REG_VAR("IPSR1", 0xE6060024, 32,
+                            2, 2, 2, 4, 4, 3, 3, 4, 4, 4) {
+               /* IP1_31_30 [2] */
+               0, 0, 0, 0,
+               /* IP1_29_28 [2] */
+               FN_A1, FN_PWM4, 0, 0,
+               /* IP1_27_26 [2] */
+               FN_A0, FN_PWM3, 0, 0,
+               /* IP1_25_22 [4] */
+               FN_D15, FN_SCIFB1_TXD_C, FN_AVB_TXD7, FN_TX1_B,
+               FN_VI0_FIELD, FN_VI0_FIELD_B, FN_VI2_DATA7_VI2_B7,
+               0, 0, 0, 0, 0, 0, 0, 0, 0,
+               /* IP1_21_18 [4] */
+               FN_D14, FN_SCIFB1_RXD_C, FN_AVB_TXD6, FN_RX1_B,
+               FN_VI0_CLKENB, FN_VI0_CLKENB_B, FN_VI2_DATA6_VI2_B6,
+               0, 0, 0, 0, 0, 0, 0, 0, 0,
+               /* IP1_17_15 [3] */
+               FN_D13, FN_AVB_TXD5, FN_VI0_VSYNC_N,
+               FN_VI0_VSYNC_N_B, FN_VI2_DATA5_VI2_B5,
+               0, 0, 0,
+               /* IP1_14_12 [3] */
+               FN_D12, FN_SCIFA1_RTS_N_C, FN_AVB_TXD4,
+               FN_VI0_HSYNC_N, FN_VI0_HSYNC_N_B, FN_VI2_DATA4_VI2_B4,
+               0, 0,
+               /* IP1_11_8 [4] */
+               FN_D11, FN_SCIFA1_CTS_N_C, FN_AVB_TXD3, FN_MII_TXD3,
+               FN_VI0_G3, FN_VI0_G3_B, FN_VI2_DATA3_VI2_B3,
+               0, 0, 0, 0, 0, 0, 0, 0, 0,
+               /* IP1_7_4 [4] */
+               FN_D10, FN_SCIFA1_TXD_C, FN_AVB_TXD2, FN_MII_TXD2,
+               FN_VI0_G2, FN_VI0_G2_B, FN_VI2_DATA2_VI2_B2,
+               0, 0, 0, 0, 0, 0, 0, 0, 0,
+               /* IP1_3_0 [4] */
+               FN_D9, FN_SCIFA1_RXD_C, FN_AVB_TXD1, FN_MII_TXD1,
+               FN_VI0_G1, FN_VI0_G1_B, FN_VI2_DATA1_VI2_B1,
+               0, 0, 0, 0, 0, 0, 0, 0, 0, }
+       },
+       { PINMUX_CFG_REG_VAR("IPSR2", 0xE6060028, 32,
+                            3, 3, 4, 4, 3, 3, 3, 3, 3, 3) {
+               /* IP2_31_29 [3] */
+               0, 0, 0, 0, 0, 0, 0, 0,
+               /* IP2_28_26 [3] */
+               FN_A10, FN_SSI_SDATA5_B, FN_MSIOF2_SYNC, FN_VI0_R6,
+               FN_VI0_R6_B, FN_VI2_DATA2_VI2_B2_B, 0, 0,
+               /* IP2_25_22 [4] */
+               FN_A9, FN_SCIFA1_CTS_N_B, FN_SSI_WS5_B, FN_VI0_R5,
+               FN_VI0_R5_B, FN_SCIFB2_TXD_C, 0, FN_VI2_DATA1_VI2_B1_B,
+               0, 0, 0, 0, 0, 0, 0, 0,
+               /* IP2_21_18 [4] */
+               FN_A8, FN_SCIFA1_RXD_B, FN_SSI_SCK5_B, FN_VI0_R4,
+               FN_VI0_R4_B, FN_SCIFB2_RXD_C, 0, FN_VI2_DATA0_VI2_B0_B,
+               0, 0, 0, 0, 0, 0, 0, 0,
+               /* IP2_17_15 [3] */
+               FN_A7, FN_SCIFA1_SCK_B, FN_AUDIO_CLKOUT_B, FN_TPU0TO3,
+               0, 0, 0, 0,
+               /* IP2_14_12 [3] */
+               FN_A6, FN_SCIFA1_RTS_N_B, FN_TPU0TO2, 0, 0, 0, 0, 0,
+               /* IP2_11_9 [3] */
+               FN_A5, FN_SCIFA1_TXD_B, FN_TPU0TO1, 0, 0, 0, 0, 0,
+               /* IP2_8_6 [3] */
+               FN_A4, FN_MSIOF1_TXD_B, FN_TPU0TO0, 0, 0, 0, 0, 0,
+               /* IP2_5_3 [3] */
+               FN_A3, FN_PWM6, FN_MSIOF1_SS2_B, 0, 0, 0, 0, 0,
+               /* IP2_2_0 [3] */
+               FN_A2, FN_PWM5, FN_MSIOF1_SS1_B, 0, 0, 0, 0, 0, }
+       },
+       { PINMUX_CFG_REG_VAR("IPSR3", 0xE606002C, 32,
+                            3, 3, 3, 3, 2, 3, 3, 4, 4, 4) {
+               /* IP3_31_29 [3] */
+               FN_A20, FN_SPCLK, FN_VI1_R3, FN_VI1_R3_B, FN_VI2_G4,
+               0, 0, 0,
+               /* IP3_28_26 [3] */
+               FN_A19, FN_AD_NCS_N_B, FN_ATACS01_N, FN_EX_WAIT0_B,
+               0, 0, 0, 0,
+               /* IP3_25_23 [3] */
+               FN_A18, FN_AD_CLK_B, FN_ATAG1_N, 0, 0, 0, 0, 0,
+               /* IP3_22_20 [3] */
+               FN_A17, FN_AD_DO_B, FN_ATADIR1_N, 0, 0, 0, 0, 0,
+               /* IP3_19_18 [2] */
+               FN_A16, FN_ATAWR1_N, 0, 0,
+               /* IP3_17_15 [3] */
+               FN_A15, FN_SCIFB2_SCK_B, FN_ATARD1_N, FN_MSIOF2_SS2,
+               0, 0, 0, 0,
+               /* IP3_14_12 [3] */
+               FN_A14, FN_SCIFB2_TXD_B, FN_ATACS11_N, FN_MSIOF2_SS1,
+               0, 0, 0, 0,
+               /* IP3_11_8 [4] */
+               FN_A13, FN_SCIFB2_RTS_N_B, FN_EX_WAIT2,
+               FN_MSIOF2_RXD, FN_VI1_R2, FN_VI1_R2_B, FN_VI2_G2,
+               FN_VI2_DATA5_VI2_B5_B, 0, 0, 0, 0, 0, 0, 0, 0,
+               /* IP3_7_4 [4] */
+               FN_A12, FN_SCIFB2_RXD_B, FN_MSIOF2_TXD, FN_VI1_R1,
+               FN_VI1_R1_B, FN_VI2_G1, FN_VI2_DATA4_VI2_B4_B,
+               0, 0, 0, 0, 0, 0, 0, 0, 0,
+               /* IP3_3_0 [4] */
+               FN_A11, FN_SCIFB2_CTS_N_B, FN_MSIOF2_SCK, FN_VI1_R0,
+               FN_VI1_R0_B, FN_VI2_G0, FN_VI2_DATA3_VI2_B3_B, 0,
+               0, 0, 0, 0, 0, 0, 0, 0, }
+       },
+       { PINMUX_CFG_REG_VAR("IPSR4", 0xE6060030, 32,
+                            2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3) {
+               /* IP4_31_30 [2] */
+               0, 0, 0, 0,
+               /* IP4_29_27 [3] */
+               FN_EX_CS2_N, FN_GPS_SIGN, FN_HRTS1_N_B,
+               FN_VI3_CLKENB, FN_VI1_G0, FN_VI1_G0_B, FN_VI2_R2, 0,
+               /* IP4_26_24 [3] */
+               FN_EX_CS1_N, FN_GPS_CLK, FN_HCTS1_N_B, FN_VI1_FIELD,
+               FN_VI1_FIELD_B, FN_VI2_R1, 0, 0,
+               /* IP4_23_21 [3] */
+               FN_EX_CS0_N, FN_HRX1_B, FN_VI1_G5, FN_VI1_G5_B, FN_VI2_R0,
+               FN_HTX0_B, FN_MSIOF0_SS1_B, 0,
+               /* IP4_20_18 [3] */
+               FN_CS1_N_A26, FN_SPEEDIN, FN_VI0_R7, FN_VI0_R7_B,
+               FN_VI2_CLK, FN_VI2_CLK_B, 0, 0,
+               /* IP4_17_15 [3] */
+               FN_CS0_N, FN_VI1_R6, FN_VI1_R6_B, FN_VI2_G3, FN_MSIOF0_SS2_B,
+               0, 0, 0,
+               /* IP4_14_12 [3] */
+               FN_A25, FN_SSL, FN_VI1_G6, FN_VI1_G6_B, FN_VI2_FIELD,
+               FN_VI2_FIELD_B, 0, 0,
+               /* IP4_11_9 [3] */
+               FN_A24, FN_IO3, FN_VI1_R7, FN_VI1_R7_B, FN_VI2_CLKENB,
+               FN_VI2_CLKENB_B, 0, 0,
+               /* IP4_8_6 [3] */
+               FN_A23, FN_IO2, FN_VI1_G7, FN_VI1_G7_B, FN_VI2_G7, 0, 0, 0,
+               /* IP4_5_3 [3] */
+               FN_A22, FN_MISO_IO1, FN_VI1_R5, FN_VI1_R5_B, FN_VI2_G6, 0, 0, 0,
+               /* IP4_2_0 [3] */
+               FN_A21, FN_MOSI_IO0, FN_VI1_R4, FN_VI1_R4_B, FN_VI2_G5, 0, 0, 0,
+               }
+       },
+       { PINMUX_CFG_REG_VAR("IPSR5", 0xE6060034, 32,
+                            2, 3, 3, 3, 3, 3, 2, 3, 4, 3, 3) {
+               /* IP5_31_30 [2] */
+               0, 0, 0, 0,
+               /* IP5_29_27 [3] */
+               FN_DREQ0_N, FN_VI1_HSYNC_N, FN_VI1_HSYNC_N_B, FN_VI2_R7,
+               FN_SSI_SCK78_C, FN_SSI_WS78_B, 0, 0,
+               /* IP5_26_24 [3] */
+               FN_EX_WAIT0, FN_IRQ3, FN_INTC_IRQ3_N,
+               FN_VI3_CLK, FN_SCIFA0_RTS_N_B, FN_HRX0_B,
+               FN_MSIOF0_SCK_B, 0,
+               /* IP5_23_21 [3] */
+               FN_WE1_N, FN_IERX, FN_CAN1_RX, FN_VI1_G4,
+               FN_VI1_G4_B, FN_VI2_R6, FN_SCIFA0_CTS_N_B,
+               FN_IERX_C, 0,
+               /* IP5_20_18 [3] */
+               FN_WE0_N, FN_IECLK, FN_CAN_CLK,
+               FN_VI2_VSYNC_N, FN_SCIFA0_TXD_B, FN_VI2_VSYNC_N_B, 0, 0,
+               /* IP5_17_15 [3] */
+               FN_RD_WR_N, FN_VI1_G3, FN_VI1_G3_B, FN_VI2_R5, FN_SCIFA0_RXD_B,
+               FN_INTC_IRQ4_N, 0, 0,
+               /* IP5_14_13 [2] */
+               FN_RD_N, FN_CAN0_TX, FN_SCIFA0_SCK_B, 0,
+               /* IP5_12_10 [3] */
+               FN_BS_N, FN_IETX, FN_HTX1_B, FN_CAN1_TX, FN_DRACK0, FN_IETX_C,
+               0, 0,
+               /* IP5_9_6 [4] */
+               FN_EX_CS5_N, FN_CAN0_RX, FN_MSIOF1_RXD_B, FN_VI3_VSYNC_N,
+               FN_VI1_G2, FN_VI1_G2_B, FN_VI2_R4, FN_SDA1, FN_INTC_EN1_N,
+               FN_SDA1_CIS, 0, 0, 0, 0, 0, 0,
+               /* IP5_5_3 [3] */
+               FN_EX_CS4_N, FN_MSIOF1_SCK_B, FN_VI3_HSYNC_N,
+               FN_VI2_HSYNC_N, FN_SCL1, FN_VI2_HSYNC_N_B,
+               FN_INTC_EN0_N, FN_SCL1_CIS,
+               /* IP5_2_0 [3] */
+               FN_EX_CS3_N, FN_GPS_MAG, FN_VI3_FIELD, FN_VI1_G1, FN_VI1_G1_B,
+               FN_VI2_R3, 0, 0, }
+       },
+       { PINMUX_CFG_REG_VAR("IPSR6", 0xE6060038, 32,
+                            3, 3, 3, 3, 3, 3, 3, 2, 3, 3, 3) {
+               /* IP6_31_29 [3] */
+               FN_ETH_REF_CLK, FN_RMII_REF_CLK, FN_HCTS0_N_E,
+               FN_STP_IVCXO27_1_B, FN_HRX0_F, 0, 0, 0,
+               /* IP6_28_26 [3] */
+               FN_ETH_LINK, FN_RMII_LINK, FN_HTX0_E,
+               FN_STP_IVCXO27_0_B, FN_SCIFB1_TXD_G, FN_TX1_E, 0, 0,
+               /* IP6_25_23 [3] */
+               FN_ETH_RXD1, FN_RMII_RXD1, FN_HRX0_E, FN_STP_ISSYNC_0_B,
+               FN_TS_SCK0_D, FN_GLO_I1_C, FN_SCIFB1_RXD_G, FN_RX1_E,
+               /* IP6_22_20 [3] */
+               FN_ETH_RXD0, FN_RMII_RXD0, FN_STP_ISEN_0_B, FN_TS_SDAT0_D,
+               FN_GLO_I0_C, FN_SCIFB1_SCK_G, FN_SCK1_E, 0,
+               /* IP6_19_17 [3] */
+               FN_ETH_RX_ER, FN_RMII_RX_ER, FN_STP_ISD_0_B,
+               FN_TS_SPSYNC0_D, FN_GLO_Q1_C, FN_SDA2_E, FN_SDA2_CIS_E, 0,
+               /* IP6_16_14 [3] */
+               FN_ETH_CRS_DV, FN_RMII_CRS_DV, FN_STP_ISCLK_0_B,
+               FN_TS_SDEN0_D, FN_GLO_Q0_C, FN_SCL2_E,
+               FN_SCL2_CIS_E, 0,
+               /* IP6_13_11 [3] */
+               FN_DACK2, FN_IRQ2, FN_INTC_IRQ2_N,
+               FN_SSI_SDATA6_B, FN_HRTS0_N_B, FN_MSIOF0_RXD_B, 0, 0,
+               /* IP6_10_9 [2] */
+               FN_DREQ2_N, FN_HSCK1_B, FN_HCTS0_N_B, FN_MSIOF0_TXD_B,
+               /* IP6_8_6 [3] */
+               FN_DACK1, FN_IRQ1, FN_INTC_IRQ1_N, FN_SSI_WS6_B,
+               FN_SSI_SDATA8_C, 0, 0, 0,
+               /* IP6_5_3 [3] */
+               FN_DREQ1_N, FN_VI1_CLKENB, FN_VI1_CLKENB_B,
+               FN_SSI_SDATA7_C, FN_SSI_SCK78_B, 0, 0, 0,
+               /* IP6_2_0 [3] */
+               FN_DACK0, FN_IRQ0, FN_INTC_IRQ0_N, FN_SSI_SCK6_B,
+               FN_VI1_VSYNC_N, FN_VI1_VSYNC_N_B, FN_SSI_WS78_C, 0, }
+       },
+       { PINMUX_CFG_REG_VAR("IPSR7", 0xE606003C, 32,
+                            1, 2, 2, 2, 3, 3, 3, 3, 3, 2, 2, 3, 3) {
+               /* IP7_31 [1] */
+               0, 0,
+               /* IP7_30_29 [2] */
+               FN_VI0_DATA0_VI0_B0, FN_ATACS10_N, FN_AVB_RXD2,
+               FN_MII_RXD2,
+               /* IP7_28_27 [2] */
+               FN_VI0_CLK, FN_ATACS00_N, FN_AVB_RXD1, FN_MII_RXD1,
+               /* IP7_26_25 [2] */
+               FN_DU1_DOTCLKIN, FN_AUDIO_CLKC, FN_AUDIO_CLKOUT_C, 0,
+               /* IP7_24_22 [3] */
+               FN_PWM2, FN_PWMFSW0, FN_SCIFA2_RXD_C, FN_PCMWE_N, FN_IECLK_C,
+               0, 0, 0,
+               /* IP7_21_19 [3] */
+               FN_PWM1, FN_SCIFA2_TXD_C, FN_STP_ISSYNC_1_B, FN_TS_SCK1_C,
+               FN_GLO_RFON_C, FN_PCMOE_N, 0, 0,
+               /* IP7_18_16 [3] */
+               FN_PWM0, FN_SCIFA2_SCK_C, FN_STP_ISEN_1_B, FN_TS_SDAT1_C,
+               FN_GLO_SS_C, 0, 0, 0,
+               /* IP7_15_13 [3] */
+               FN_ETH_MDC, FN_RMII_MDC, FN_STP_ISD_1_B,
+               FN_TS_SPSYNC1_C, FN_GLO_SDATA_C, 0, 0, 0,
+               /* IP7_12_10 [3] */
+               FN_ETH_TXD0, FN_RMII_TXD0, FN_STP_ISCLK_1_B, FN_TS_SDEN1_C,
+               FN_GLO_SCLK_C, 0, 0, 0,
+               /* IP7_9_8 [2] */
+               FN_ETH_MAGIC, FN_RMII_MAGIC, FN_SIM0_RST_C, 0,
+               /* IP7_7_6 [2] */
+               FN_ETH_TX_EN, FN_RMII_TX_EN, FN_SIM0_CLK_C, FN_HRTS0_N_F,
+               /* IP7_5_3 [3] */
+               FN_ETH_TXD1, FN_RMII_TXD1, FN_HTX0_F, FN_BPFCLK_G, FN_RDS_CLK_F,
+               0, 0, 0,
+               /* IP7_2_0 [3] */
+               FN_ETH_MDIO, FN_RMII_MDIO, FN_HRTS0_N_E,
+               FN_SIM0_D_C, FN_HCTS0_N_F, 0, 0, 0, }
+       },
+       { PINMUX_CFG_REG_VAR("IPSR8", 0xE6060040, 32,
+                            1, 2, 1, 1, 1, 2, 2, 2, 2, 2, 2,
+                            2, 2, 2, 2, 2, 2, 2) {
+               /* IP8_31 [1] */
+               0, 0,
+               /* IP8_30_29 [2] */
+               FN_SD0_CMD, FN_SCIFB1_SCK_B, FN_VI1_DATA1_VI1_B1_B, 0,
+               /* IP8_28 [1] */
+               FN_SD0_CLK, FN_VI1_DATA0_VI1_B0_B,
+               /* IP8_27 [1] */
+               FN_VI1_DATA6_VI1_B6, FN_AVB_GTXREFCLK,
+               /* IP8_26 [1] */
+               FN_VI1_DATA5_VI1_B5, FN_AVB_PHY_INT,
+               /* IP8_25_24 [2] */
+               FN_VI1_DATA4_VI1_B4, FN_SCIFA1_RTS_N_D,
+               FN_AVB_MAGIC, FN_MII_MAGIC,
+               /* IP8_23_22 [2] */
+               FN_VI1_DATA3_VI1_B3, FN_SCIFA1_CTS_N_D, FN_AVB_GTX_CLK, 0,
+               /* IP8_21_20 [2] */
+               FN_VI1_DATA2_VI1_B2, FN_SCIFA1_TXD_D, FN_AVB_MDIO,
+               FN_MII_MDIO,
+               /* IP8_19_18 [2] */
+               FN_VI1_DATA1_VI1_B1, FN_SCIFA1_RXD_D, FN_AVB_MDC, FN_MII_MDC,
+               /* IP8_17_16 [2] */
+               FN_VI1_DATA0_VI1_B0, FN_SCIFA1_SCK_D, FN_AVB_CRS, FN_MII_CRS,
+               /* IP8_15_14 [2] */
+               FN_VI1_CLK, FN_AVB_RX_DV, FN_MII_RX_DV, 0,
+               /* IP8_13_12 [2] */
+               FN_VI0_DATA7_VI0_B7, FN_AVB_RX_CLK, FN_MII_RX_CLK, 0,
+               /* IP8_11_10 [2] */
+               FN_VI0_DATA6_VI0_B6, FN_AVB_RX_ER, FN_MII_RX_ER, 0,
+               /* IP8_9_8 [2] */
+               FN_VI0_DATA5_VI0_B5, FN_EX_WAIT1, FN_AVB_RXD7, 0,
+               /* IP8_7_6 [2] */
+               FN_VI0_DATA4_VI0_B4, FN_ATAG0_N, FN_AVB_RXD6, 0,
+               /* IP8_5_4 [2] */
+               FN_VI0_DATA3_VI0_B3, FN_ATADIR0_N, FN_AVB_RXD5, 0,
+               /* IP8_3_2 [2] */
+               FN_VI0_DATA2_VI0_B2, FN_ATAWR0_N, FN_AVB_RXD4, 0,
+               /* IP8_1_0 [2] */
+               FN_VI0_DATA1_VI0_B1, FN_ATARD0_N, FN_AVB_RXD3, FN_MII_RXD3, }
+       },
+       { PINMUX_CFG_REG_VAR("IPSR9", 0xE6060044, 32,
+                            4, 2, 2, 2, 2, 2, 2, 4, 4, 2, 2, 2, 2) {
+               /* IP9_31_28 [4] */
+               FN_SD1_CD, FN_MMC1_D6, FN_TS_SDEN1, FN_USB1_EXTP,
+               FN_GLO_SS, FN_VI0_CLK_B, FN_SCL2_D, FN_SCL2_CIS_D,
+               FN_SIM0_CLK_B, FN_VI3_CLK_B, 0, 0, 0, 0, 0, 0,
+               /* IP9_27_26 [2] */
+               FN_SD1_DAT3, FN_AVB_RXD0, FN_MII_RXD0, FN_SCIFB0_RTS_N_B,
+               /* IP9_25_24 [2] */
+               FN_SD1_DAT2, FN_AVB_COL, FN_MII_COL, FN_SCIFB0_CTS_N_B,
+               /* IP9_23_22 [2] */
+               FN_SD1_DAT1, FN_AVB_LINK, FN_MII_LINK, FN_SCIFB0_TXD_B,
+               /* IP9_21_20 [2] */
+               FN_SD1_DAT0, FN_AVB_TX_CLK, FN_MII_TX_CLK, FN_SCIFB0_RXD_B,
+               /* IP9_19_18 [2] */
+               FN_SD1_CMD, FN_AVB_TX_ER, FN_MII_TX_ER, FN_SCIFB0_SCK_B,
+               /* IP9_17_16 [2] */
+               FN_SD1_CLK, FN_AVB_TX_EN, FN_MII_TX_EN, 0,
+               /* IP9_15_12 [4] */
+               FN_SD0_WP, FN_MMC0_D7, FN_TS_SPSYNC0_B, FN_USB0_IDIN,
+               FN_GLO_SDATA, FN_VI1_DATA7_VI1_B7_B, FN_SDA1_B,
+               FN_SDA1_CIS_B, FN_VI2_DATA7_VI2_B7_B, 0, 0, 0, 0, 0, 0, 0,
+               /* IP9_11_8 [4] */
+               FN_SD0_CD, FN_MMC0_D6, FN_TS_SDEN0_B, FN_USB0_EXTP,
+               FN_GLO_SCLK, FN_VI1_DATA6_VI1_B6_B, FN_SCL1_B,
+               FN_SCL1_CIS_B, FN_VI2_DATA6_VI2_B6_B, 0, 0, 0, 0, 0, 0, 0,
+               /* IP9_7_6 [2] */
+               FN_SD0_DAT3, FN_SCIFB1_RTS_N_B, FN_VI1_DATA5_VI1_B5_B, 0,
+               /* IP9_5_4 [2] */
+               FN_SD0_DAT2, FN_SCIFB1_CTS_N_B, FN_VI1_DATA4_VI1_B4_B, 0,
+               /* IP9_3_2 [2] */
+               FN_SD0_DAT1, FN_SCIFB1_TXD_B, FN_VI1_DATA3_VI1_B3_B, 0,
+               /* IP9_1_0 [2] */
+               FN_SD0_DAT0, FN_SCIFB1_RXD_B, FN_VI1_DATA2_VI1_B2_B, 0, }
+       },
+       { PINMUX_CFG_REG_VAR("IPSR10", 0xE6060048, 32,
+                            2, 4, 3, 4, 4, 4, 4, 3, 4) {
+               /* IP10_31_30 [2] */
+               0, 0, 0, 0,
+               /* IP10_29_26 [4] */
+               FN_SD2_CD, FN_MMC0_D4, FN_TS_SDAT0_B, FN_USB2_EXTP, FN_GLO_I0,
+               FN_VI0_DATA6_VI0_B6_B, FN_HCTS0_N_D, FN_TS_SDAT1_B,
+               FN_GLO_I0_B, FN_VI3_DATA6_B, 0, 0, 0, 0, 0, 0,
+               /* IP10_25_23 [3] */
+               FN_SD2_DAT3, FN_MMC0_D3, FN_SIM0_RST, FN_VI0_DATA5_VI0_B5_B,
+               FN_HTX0_D, FN_TS_SPSYNC1_B, FN_GLO_Q1_B, FN_VI3_DATA5_B,
+               /* IP10_22_19 [4] */
+               FN_SD2_DAT2, FN_MMC0_D2, FN_BPFCLK_B, FN_RDS_CLK,
+               FN_VI0_DATA4_VI0_B4_B, FN_HRX0_D, FN_TS_SDEN1_B,
+               FN_GLO_Q0_B, FN_VI3_DATA4_B, 0, 0, 0, 0, 0, 0, 0,
+               /* IP10_18_15 [4] */
+               FN_SD2_DAT1, FN_MMC0_D1, FN_FMIN_B, FN_RDS_DATA,
+               FN_VI0_DATA3_VI0_B3_B, FN_SCIFB1_TXD_E, FN_TX1_D,
+               FN_TS_SCK0_C, FN_GLO_RFON_B, FN_VI3_DATA3_B,
+               0, 0, 0, 0, 0, 0,
+               /* IP10_14_11 [4] */
+               FN_SD2_DAT0, FN_MMC0_D0, FN_FMCLK_B,
+               FN_VI0_DATA2_VI0_B2_B, FN_SCIFB1_RXD_E, FN_RX1_D,
+               FN_TS_SDAT0_C, FN_GLO_SS_B, FN_VI3_DATA2_B,
+               0, 0, 0, 0, 0, 0, 0,
+               /* IP10_10_7 [4] */
+               FN_SD2_CMD, FN_MMC0_CMD, FN_SIM0_D,
+               FN_VI0_DATA1_VI0_B1_B, FN_SCIFB1_SCK_E, FN_SCK1_D,
+               FN_TS_SPSYNC0_C, FN_GLO_SDATA_B, FN_VI3_DATA1_B,
+               0, 0, 0, 0, 0, 0, 0,
+               /* IP10_6_4 [3] */
+               FN_SD2_CLK, FN_MMC0_CLK, FN_SIM0_CLK,
+               FN_VI0_DATA0_VI0_B0_B, FN_TS_SDEN0_C, FN_GLO_SCLK_B,
+               FN_VI3_DATA0_B, 0,
+               /* IP10_3_0 [4] */
+               FN_SD1_WP, FN_MMC1_D7, FN_TS_SPSYNC1, FN_USB1_IDIN,
+               FN_GLO_RFON, FN_VI1_CLK_B, FN_SDA2_D, FN_SDA2_CIS_D,
+               FN_SIM0_D_B, 0, 0, 0, 0, 0, 0, 0, }
+       },
+       { PINMUX_CFG_REG_VAR("IPSR11", 0xE606004C, 32,
+                            2, 3, 3, 2, 4, 3, 2, 2, 2, 2, 2, 1, 4) {
+               /* IP11_31_30 [2] */
+               FN_SSI_SCK0129, FN_CAN_CLK_B, FN_MOUT0, 0,
+               /* IP11_29_27 [3] */
+               FN_MLB_DAT, FN_SPV_EVEN, FN_SCIFB1_TXD_D, FN_TX1_C, FN_BPFCLK_C,
+               FN_RDS_CLK_B, 0, 0,
+               /* IP11_26_24 [3] */
+               FN_MLB_SIG, FN_SCIFB1_RXD_D, FN_RX1_C, FN_SDA2_B, FN_SDA2_CIS_B,
+               0, 0, 0,
+               /* IP11_23_22 [2] */
+               FN_MLB_CLK, FN_SCL2_B, FN_SCL2_CIS_B, 0,
+               /* IP11_21_18 [4] */
+               FN_SD3_WP, FN_MMC1_D5, FN_TS_SCK1, FN_GLO_Q1, FN_FMIN_C,
+               FN_RDS_DATA_B, FN_FMIN_E, FN_RDS_DATA_D, FN_FMIN_F,
+               FN_RDS_DATA_E, 0, 0, 0, 0, 0, 0,
+               /* IP11_17_15 [3] */
+               FN_SD3_CD, FN_MMC1_D4, FN_TS_SDAT1,
+               FN_VSP, FN_GLO_Q0, FN_SIM0_RST_B, 0, 0,
+               /* IP11_14_13 [2] */
+               FN_SD3_DAT3, FN_MMC1_D3, FN_SCKZ, 0,
+               /* IP11_12_11 [2] */
+               FN_SD3_DAT2, FN_MMC1_D2, FN_SDATA, 0,
+               /* IP11_10_9 [2] */
+               FN_SD3_DAT1, FN_MMC1_D1, FN_MDATA, 0,
+               /* IP11_8_7 [2] */
+               FN_SD3_DAT0, FN_MMC1_D0, FN_STM_N, 0,
+               /* IP11_6_5 [2] */
+               FN_SD3_CMD, FN_MMC1_CMD, FN_MTS_N, 0,
+               /* IP11_4 [1] */
+               FN_SD3_CLK, FN_MMC1_CLK,
+               /* IP11_3_0 [4] */
+               FN_SD2_WP, FN_MMC0_D5, FN_TS_SCK0_B, FN_USB2_IDIN,
+               FN_GLO_I1, FN_VI0_DATA7_VI0_B7_B, FN_HRTS0_N_D,
+               FN_TS_SCK1_B, FN_GLO_I1_B, FN_VI3_DATA7_B, 0, 0, 0, 0, 0, 0, }
+       },
+       { PINMUX_CFG_REG_VAR("IPSR12", 0xE6060050, 32,
+                            1, 3, 3, 2, 3, 3, 3, 3, 3, 2, 2, 2, 2) {
+               /* IP12_31 [1] */
+               0, 0,
+               /* IP12_30_28 [3] */
+               FN_SSI_WS5, FN_SCIFB1_RXD, FN_IECLK_B,
+               FN_DU2_EXVSYNC_DU2_VSYNC, FN_QSTB_QHE,
+               FN_CAN_DEBUGOUT4, 0, 0,
+               /* IP12_27_25 [3] */
+               FN_SSI_SCK5, FN_SCIFB1_SCK,
+               FN_IERX_B, FN_DU2_EXHSYNC_DU2_HSYNC, FN_QSTH_QHS,
+               FN_CAN_DEBUGOUT3, 0, 0,
+               /* IP12_24_23 [2] */
+               FN_SSI_SDATA4, FN_STP_ISSYNC_0, FN_MSIOF1_RXD,
+               FN_CAN_DEBUGOUT2,
+               /* IP12_22_20 [3] */
+               FN_SSI_WS4, FN_STP_ISEN_0, FN_SCIFB0_RTS_N,
+               FN_MSIOF1_TXD, FN_SSI_WS5_C, FN_CAN_DEBUGOUT1, 0, 0,
+               /* IP12_19_17 [3] */
+               FN_SSI_SCK4, FN_STP_ISD_0, FN_SCIFB0_CTS_N,
+               FN_MSIOF1_SS2, FN_SSI_SCK5_C, FN_CAN_DEBUGOUT0, 0, 0,
+               /* IP12_16_14 [3] */
+               FN_SSI_SDATA3, FN_STP_ISCLK_0,
+               FN_SCIFB0_TXD, FN_MSIOF1_SS1, FN_CAN_TXCLK, 0, 0, 0,
+               /* IP12_13_11 [3] */
+               FN_SSI_WS34, FN_STP_IVCXO27_0, FN_SCIFB0_RXD, FN_MSIOF1_SYNC,
+               FN_CAN_STEP0, 0, 0, 0,
+               /* IP12_10_8 [3] */
+               FN_SSI_SCK34, FN_STP_OPWM_0, FN_SCIFB0_SCK,
+               FN_MSIOF1_SCK, FN_CAN_DEBUG_HW_TRIGGER, 0, 0, 0,
+               /* IP12_7_6 [2] */
+               FN_SSI_SDATA2, FN_CAN1_RX_B, FN_SSI_SCK1, FN_MOUT6,
+               /* IP12_5_4 [2] */
+               FN_SSI_SDATA1, FN_CAN1_TX_B, FN_MOUT5, 0,
+               /* IP12_3_2 [2] */
+               FN_SSI_SDATA0, FN_CAN0_RX_B, FN_MOUT2, 0,
+               /* IP12_1_0 [2] */
+               FN_SSI_WS0129, FN_CAN0_TX_B, FN_MOUT1, 0, }
+       },
+       { PINMUX_CFG_REG_VAR("IPSR13", 0xE6060054, 32,
+                            1, 2, 3, 3, 4, 3, 3, 3, 3, 4, 3) {
+               /* IP13_31 [1] */
+               0, 0,
+               /* IP13_30_29 [2] */
+               FN_AUDIO_CLKA, FN_SCIFB2_RTS_N, FN_CAN_DEBUGOUT14, 0,
+               /* IP13_28_26 [3] */
+               FN_SSI_SDATA9, FN_STP_ISSYNC_1, FN_SCIFB2_CTS_N, FN_SSI_WS1,
+               FN_SSI_SDATA5_C, FN_CAN_DEBUGOUT13, 0, 0,
+               /* IP13_25_23 [3] */
+               FN_SSI_SDATA8, FN_STP_ISEN_1, FN_SCIFB2_TXD, FN_CAN0_TX_C,
+               FN_CAN_DEBUGOUT12, FN_SSI_SDATA8_B, 0, 0,
+               /* IP13_22_19 [4] */
+               FN_SSI_SDATA7, FN_STP_ISD_1, FN_SCIFB2_RXD, FN_SCIFA2_RTS_N,
+               FN_TCLK2, FN_QSTVA_QVS, FN_CAN_DEBUGOUT11, FN_BPFCLK_E,
+               FN_RDS_CLK_D, FN_SSI_SDATA7_B, FN_FMIN_G, FN_RDS_DATA_F,
+               0, 0, 0, 0,
+               /* IP13_18_16 [3] */
+               FN_SSI_WS78, FN_STP_ISCLK_1, FN_SCIFB2_SCK, FN_SCIFA2_CTS_N,
+               FN_DU2_DR7, FN_LCDOUT7, FN_CAN_DEBUGOUT10, 0,
+               /* IP13_15_13 [3] */
+               FN_SSI_SCK78, FN_STP_IVCXO27_1, FN_SCK1, FN_SCIFA1_SCK,
+               FN_DU2_DR6, FN_LCDOUT6, FN_CAN_DEBUGOUT9, 0,
+               /* IP13_12_10 [3] */
+               FN_SSI_SDATA6, FN_FMIN_D, FN_RDS_DATA_C, FN_DU2_DR5, FN_LCDOUT5,
+               FN_CAN_DEBUGOUT8, 0, 0,
+               /* IP13_9_7 [3] */
+               FN_SSI_WS6, FN_SCIFB1_RTS_N, FN_CAN0_TX_D, FN_DU2_DR4,
+               FN_LCDOUT4, FN_CAN_DEBUGOUT7, 0, 0,
+               /* IP13_6_3 [4] */
+               FN_SSI_SCK6, FN_SCIFB1_CTS_N, FN_BPFCLK_D, FN_RDS_CLK_C,
+               FN_DU2_DR3, FN_LCDOUT3, FN_CAN_DEBUGOUT6,
+               FN_BPFCLK_F, FN_RDS_CLK_E, 0, 0, 0, 0, 0, 0, 0,
+               /* IP13_2_0 [3] */
+               FN_SSI_SDATA5, FN_SCIFB1_TXD, FN_IETX_B, FN_DU2_DR2,
+               FN_LCDOUT2, FN_CAN_DEBUGOUT5, 0, 0, }
+       },
+       { PINMUX_CFG_REG_VAR("IPSR14", 0xE6060058, 32,
+                            1, 3, 3, 3, 3, 3, 4, 3, 3, 3, 3) {
+               /* IP14_30 [1] */
+               0, 0,
+               /* IP14_30_28 [3] */
+               FN_SCIFA1_RTS_N, FN_AD_NCS_N, FN_RTS1_N_TANS,
+               FN_MSIOF3_TXD, FN_DU1_DOTCLKOUT, FN_QSTVB_QVE,
+               FN_HRTS0_N_C, 0,
+               /* IP14_27_25 [3] */
+               FN_SCIFA1_CTS_N, FN_AD_CLK, FN_CTS1_N, FN_MSIOF3_RXD,
+               FN_DU0_DOTCLKOUT, FN_QCLK, 0, 0,
+               /* IP14_24_22 [3] */
+               FN_SCIFA1_TXD, FN_AD_DO, FN_TX1, FN_DU2_DG1,
+               FN_LCDOUT9, 0, 0, 0,
+               /* IP14_21_19 [3] */
+               FN_SCIFA1_RXD, FN_AD_DI, FN_RX1,
+               FN_DU2_EXODDF_DU2_ODDF_DISP_CDE, FN_QCPV_QDE, 0, 0, 0,
+               /* IP14_18_16 [3] */
+               FN_SCIFA0_RTS_N, FN_HRTS1_N, FN_RTS0_N_TANS,
+               FN_MSIOF3_SS1, FN_DU2_DG0, FN_LCDOUT8, FN_PWM1_B, 0,
+               /* IP14_15_12 [4] */
+               FN_SCIFA0_CTS_N, FN_HCTS1_N, FN_CTS0_N, FN_MSIOF3_SYNC,
+               FN_DU2_DG3, FN_LCDOUT11, FN_PWM0_B, FN_SCL1_C, FN_SCL1_CIS_C,
+               0, 0, 0, 0, 0, 0, 0,
+               /* IP14_11_9 [3] */
+               FN_SCIFA0_TXD, FN_HTX1, FN_TX0, FN_DU2_DR1, FN_LCDOUT1,
+               0, 0, 0,
+               /* IP14_8_6 [3] */
+               FN_SCIFA0_RXD, FN_HRX1, FN_RX0, FN_DU2_DR0, FN_LCDOUT0,
+               0, 0, 0,
+               /* IP14_5_3 [3] */
+               FN_SCIFA0_SCK, FN_HSCK1, FN_SCK0, FN_MSIOF3_SS2, FN_DU2_DG2,
+               FN_LCDOUT10, FN_SDA1_C, FN_SDA1_CIS_C,
+               /* IP14_2_0 [3] */
+               FN_AUDIO_CLKB, FN_SCIF_CLK, FN_CAN0_RX_D,
+               FN_DVC_MUTE, FN_CAN0_RX_C, FN_CAN_DEBUGOUT15,
+               FN_REMOCON, 0, }
+       },
+       { PINMUX_CFG_REG_VAR("IPSR15", 0xE606005C, 32,
+                            2, 2, 2, 3, 3, 2, 2, 2, 2, 3, 3, 3, 3) {
+               /* IP15_31_30 [2] */
+               0, 0, 0, 0,
+               /* IP15_29_28 [2] */
+               FN_MSIOF0_TXD, FN_ADICHS1, FN_DU2_DG6, FN_LCDOUT14,
+               /* IP15_27_26 [2] */
+               FN_MSIOF0_SS1, FN_ADICHS0, FN_DU2_DG5, FN_LCDOUT13,
+               /* IP15_25_23 [3] */
+               FN_MSIOF0_SYNC, FN_TS_SCK0, FN_SSI_SCK2, FN_ADIDATA,
+               FN_DU2_DB7, FN_LCDOUT23, FN_SCIFA2_RXD_B, 0,
+               /* IP15_22_20 [3] */
+               FN_MSIOF0_SCK, FN_TS_SDAT0, FN_ADICLK,
+               FN_DU2_DB6, FN_LCDOUT22, 0, 0, 0,
+               /* IP15_19_18 [2] */
+               FN_HRTS0_N, FN_SSI_WS9, FN_DU2_DB5, FN_LCDOUT21,
+               /* IP15_17_16 [2] */
+               FN_HCTS0_N, FN_SSI_SCK9, FN_DU2_DB4, FN_LCDOUT20,
+               /* IP15_15_14 [2] */
+               FN_HTX0, FN_DU2_DB3, FN_LCDOUT19, 0,
+               /* IP15_13_12 [2] */
+               FN_HRX0, FN_DU2_DB2, FN_LCDOUT18, 0,
+               /* IP15_11_9 [3] */
+               FN_HSCK0, FN_TS_SDEN0, FN_DU2_DG4, FN_LCDOUT12, FN_HCTS0_N_C,
+               0, 0, 0,
+               /* IP15_8_6 [3] */
+               FN_SCIFA2_TXD, FN_BPFCLK, 0, FN_DU2_DB1, FN_LCDOUT17,
+               FN_SDA2, FN_SDA2_CIS, 0,
+               /* IP15_5_3 [3] */
+               FN_SCIFA2_RXD, FN_FMIN, 0, FN_DU2_DB0, FN_LCDOUT16,
+               FN_SCL2, FN_SCL2_CIS, 0,
+               /* IP15_2_0 [3] */
+               FN_SCIFA2_SCK, FN_FMCLK, 0, FN_MSIOF3_SCK, FN_DU2_DG7,
+               FN_LCDOUT15, FN_SCIF_CLK_B, 0, }
+       },
+       { PINMUX_CFG_REG_VAR("IPSR16", 0xE6060160, 32,
+                            4, 4, 4, 4, 4, 4, 1, 1, 3, 3) {
+               /* IP16_31_28 [4] */
+               0, 0, 0, 0, 0, 0, 0, 0,
+               0, 0, 0, 0, 0, 0, 0, 0,
+               /* IP16_27_24 [4] */
+               0, 0, 0, 0, 0, 0, 0, 0,
+               0, 0, 0, 0, 0, 0, 0, 0,
+               /* IP16_23_20 [4] */
+               0, 0, 0, 0, 0, 0, 0, 0,
+               0, 0, 0, 0, 0, 0, 0, 0,
+               /* IP16_19_16 [4] */
+               0, 0, 0, 0, 0, 0, 0, 0,
+               0, 0, 0, 0, 0, 0, 0, 0,
+               /* IP16_15_12 [4] */
+               0, 0, 0, 0, 0, 0, 0, 0,
+               0, 0, 0, 0, 0, 0, 0, 0,
+               /* IP16_11_8 [4] */
+               0, 0, 0, 0, 0, 0, 0, 0,
+               0, 0, 0, 0, 0, 0, 0, 0,
+               /* IP16_7 [1] */
+               FN_USB1_OVC, FN_TCLK1_B,
+               /* IP16_6 [1] */
+               FN_USB1_PWEN, FN_AUDIO_CLKOUT_D,
+               /* IP16_5_3 [3] */
+               FN_MSIOF0_RXD, FN_TS_SPSYNC0, FN_SSI_WS2,
+               FN_ADICS_SAMP, FN_DU2_CDE, FN_QPOLB, FN_HRX0_C, 0,
+               /* IP16_2_0 [3] */
+               FN_MSIOF0_SS2, FN_AUDIO_CLKOUT, FN_ADICHS2,
+               FN_DU2_DISP, FN_QPOLA, FN_HTX0_C, FN_SCIFA2_TXD_B, 0, }
+       },
+       { PINMUX_CFG_REG_VAR("MOD_SEL", 0xE6060090, 32,
+                            3, 2, 2, 3, 2, 1, 1, 1, 2, 1,
+                            2, 1, 1, 1, 1, 2, 1, 1, 2, 1, 1) {
+               /* SEL_SCIF1 [3] */
+               FN_SEL_SCIF1_0, FN_SEL_SCIF1_1, FN_SEL_SCIF1_2, FN_SEL_SCIF1_3,
+               FN_SEL_SCIF1_4, 0, 0, 0,
+               /* SEL_SCIFB [2] */
+               FN_SEL_SCIFB_0, FN_SEL_SCIFB_1, FN_SEL_SCIFB_2, 0,
+               /* SEL_SCIFB2 [2] */
+               FN_SEL_SCIFB2_0, FN_SEL_SCIFB2_1, FN_SEL_SCIFB2_2, 0,
+               /* SEL_SCIFB1 [3] */
+               FN_SEL_SCIFB1_0, FN_SEL_SCIFB1_1, FN_SEL_SCIFB1_2,
+               FN_SEL_SCIFB1_3, FN_SEL_SCIFB1_4, FN_SEL_SCIFB1_5,
+               FN_SEL_SCIFB1_6, 0,
+               /* SEL_SCIFA1 [2] */
+               FN_SEL_SCIFA1_0, FN_SEL_SCIFA1_1, FN_SEL_SCIFA1_2,
+               FN_SEL_SCIFA1_3,
+               /* SEL_SCIF0 [1] */
+               FN_SEL_SCIF0_0, FN_SEL_SCIF0_1,
+               /* SEL_SCIFA [1] */
+               FN_SEL_SCFA_0, FN_SEL_SCFA_1,
+               /* SEL_SOF1 [1] */
+               FN_SEL_SOF1_0, FN_SEL_SOF1_1,
+               /* SEL_SSI7 [2] */
+               FN_SEL_SSI7_0, FN_SEL_SSI7_1, FN_SEL_SSI7_2, 0,
+               /* SEL_SSI6 [1] */
+               FN_SEL_SSI6_0, FN_SEL_SSI6_1,
+               /* SEL_SSI5 [2] */
+               FN_SEL_SSI5_0, FN_SEL_SSI5_1, FN_SEL_SSI5_2, 0,
+               /* SEL_VI3 [1] */
+               FN_SEL_VI3_0, FN_SEL_VI3_1,
+               /* SEL_VI2 [1] */
+               FN_SEL_VI2_0, FN_SEL_VI2_1,
+               /* SEL_VI1 [1] */
+               FN_SEL_VI1_0, FN_SEL_VI1_1,
+               /* SEL_VI0 [1] */
+               FN_SEL_VI0_0, FN_SEL_VI0_1,
+               /* SEL_TSIF1 [2] */
+               FN_SEL_TSIF1_0, FN_SEL_TSIF1_1, FN_SEL_TSIF1_2, 0,
+               /* RESERVED [1] */
+               0, 0,
+               /* SEL_LBS [1] */
+               FN_SEL_LBS_0, FN_SEL_LBS_1,
+               /* SEL_TSIF0 [2] */
+               FN_SEL_TSIF0_0, FN_SEL_TSIF0_1, FN_SEL_TSIF0_2, FN_SEL_TSIF0_3,
+               /* SEL_SOF3 [1] */
+               FN_SEL_SOF3_0, FN_SEL_SOF3_1,
+               /* SEL_SOF0 [1] */
+               FN_SEL_SOF0_0, FN_SEL_SOF0_1, }
+       },
+       { PINMUX_CFG_REG_VAR("MOD_SEL2", 0xE6060094, 32,
+                            3, 1, 1, 1, 2, 1, 2, 1, 2,
+                            1, 1, 1, 3, 3, 2, 3, 2, 2) {
+               /* RESERVED [3] */
+               0, 0, 0, 0, 0, 0, 0, 0,
+               /* SEL_TMU1 [1] */
+               FN_SEL_TMU1_0, FN_SEL_TMU1_1,
+               /* SEL_HSCIF1 [1] */
+               FN_SEL_HSCIF1_0, FN_SEL_HSCIF1_1,
+               /* SEL_SCIFCLK [1] */
+               FN_SEL_SCIFCLK_0, FN_SEL_SCIFCLK_1,
+               /* SEL_CAN0 [2] */
+               FN_SEL_CAN0_0, FN_SEL_CAN0_1, FN_SEL_CAN0_2, FN_SEL_CAN0_3,
+               /* SEL_CANCLK [1] */
+               FN_SEL_CANCLK_0, FN_SEL_CANCLK_1,
+               /* SEL_SCIFA2 [2] */
+               FN_SEL_SCIFA2_0, FN_SEL_SCIFA2_1, FN_SEL_SCIFA2_2, 0,
+               /* SEL_CAN1 [1] */
+               FN_SEL_CAN1_0, FN_SEL_CAN1_1,
+               /* RESERVED [2] */
+               0, 0, 0, 0,
+               /* RESERVED [1] (actually TX2, RX2 vs. TX2_B, RX2_B of SCIF2) */
+               0, 0,
+               /* SEL_ADI [1] */
+               FN_SEL_ADI_0, FN_SEL_ADI_1,
+               /* SEL_SSP [1] */
+               FN_SEL_SSP_0, FN_SEL_SSP_1,
+               /* SEL_FM [3] */
+               FN_SEL_FM_0, FN_SEL_FM_1, FN_SEL_FM_2, FN_SEL_FM_3,
+               FN_SEL_FM_4, FN_SEL_FM_5, FN_SEL_FM_6, 0,
+               /* SEL_HSCIF0 [3] */
+               FN_SEL_HSCIF0_0, FN_SEL_HSCIF0_1, FN_SEL_HSCIF0_2,
+               FN_SEL_HSCIF0_3, FN_SEL_HSCIF0_4, FN_SEL_HSCIF0_5, 0, 0,
+               /* SEL_GPS [2] */
+               FN_SEL_GPS_0, FN_SEL_GPS_1, FN_SEL_GPS_2, 0,
+               /* SEL_RDS [3] */
+               FN_SEL_RDS_0, FN_SEL_RDS_1, FN_SEL_RDS_2,
+               FN_SEL_RDS_3, FN_SEL_RDS_4, FN_SEL_RDS_5, 0, 0,
+               /* SEL_SIM [2] */
+               FN_SEL_SIM_0, FN_SEL_SIM_1, FN_SEL_SIM_2, 0,
+               /* SEL_SSI8 [2] */
+               FN_SEL_SSI8_0, FN_SEL_SSI8_1, FN_SEL_SSI8_2, 0, }
+       },
+       { PINMUX_CFG_REG_VAR("MOD_SEL3", 0xE6060098, 32,
+                            1, 1, 2, 4, 4, 2, 2,
+                            4, 2, 3, 2, 3, 2) {
+               /* SEL_IICDVFS [1] */
+               FN_SEL_IICDVFS_0, FN_SEL_IICDVFS_1,
+               /* SEL_IIC0 [1] */
+               FN_SEL_IIC0_0, FN_SEL_IIC0_1,
+               /* RESERVED [2] */
+               0, 0, 0, 0,
+               /* RESERVED [4] */
+               0, 0, 0, 0, 0, 0, 0, 0,
+               0, 0, 0, 0, 0, 0, 0, 0,
+               /* RESERVED [4] */
+               0, 0, 0, 0, 0, 0, 0, 0,
+               0, 0, 0, 0, 0, 0, 0, 0,
+               /* RESERVED [2] */
+               0, 0, 0, 0,
+               /* SEL_IEB [2] */
+               FN_SEL_IEB_0, FN_SEL_IEB_1, FN_SEL_IEB_2, 0,
+               /* RESERVED [4] */
+               0, 0, 0, 0, 0, 0, 0, 0,
+               0, 0, 0, 0, 0, 0, 0, 0,
+               /* RESERVED [2] */
+               0, 0, 0, 0,
+               /* SEL_IIC2 [3] */
+               FN_SEL_IIC2_0, FN_SEL_IIC2_1, FN_SEL_IIC2_2, FN_SEL_IIC2_3,
+               FN_SEL_IIC2_4, 0, 0, 0,
+               /* SEL_IIC1 [2] */
+               FN_SEL_IIC1_0, FN_SEL_IIC1_1, FN_SEL_IIC1_2, 0,
+               /* SEL_I2C2 [3] */
+               FN_SEL_I2C2_0, FN_SEL_I2C2_1, FN_SEL_I2C2_2, FN_SEL_I2C2_3,
+               FN_SEL_I2C2_4, 0, 0, 0,
+               /* SEL_I2C1 [2] */
+               FN_SEL_I2C1_0, FN_SEL_I2C1_1, FN_SEL_I2C1_2, 0, }
+       },
+       { },
+};
+
+const struct sh_pfc_soc_info r8a7790_pinmux_info = {
+       .name = "r8a77900_pfc",
+       .unlock_reg = 0xe6060000, /* PMMR */
+
+       .function = { PINMUX_FUNCTION_BEGIN, PINMUX_FUNCTION_END },
+
+       .pins = pinmux_pins,
+       .nr_pins = ARRAY_SIZE(pinmux_pins),
+       .groups = pinmux_groups,
+       .nr_groups = ARRAY_SIZE(pinmux_groups),
+       .functions = pinmux_functions,
+       .nr_functions = ARRAY_SIZE(pinmux_functions),
+
+       .cfg_regs = pinmux_config_regs,
+
+       .gpio_data = pinmux_data,
+       .gpio_data_size = ARRAY_SIZE(pinmux_data),
+};
index df0ae21a5ac8f98d428797bff49acabfd4aed3ff..6dfb18772574bba8d7c1da9bc4f5c8ecf950b72e 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/irqs.h>
 #include <mach/sh7372.h>
 
+#include "core.h"
 #include "sh_pfc.h"
 
 #define CPU_ALL_PORT(fn, pfx, sfx) \
        PORT_10(fn, pfx##16, sfx),      PORT_10(fn, pfx##17, sfx), \
        PORT_10(fn, pfx##18, sfx),      PORT_1(fn, pfx##190, sfx)
 
+#undef _GPIO_PORT
+#define _GPIO_PORT(gpio, sfx)                                          \
+       [gpio] = {                                                      \
+               .name = __stringify(PORT##gpio),                        \
+               .enum_id = PORT##gpio##_DATA,                           \
+       }
+
+#define IRQC_PIN_MUX(irq, pin)                                         \
+static const unsigned int intc_irq##irq##_pins[] = {                   \
+       pin,                                                            \
+};                                                                     \
+static const unsigned int intc_irq##irq##_mux[] = {                    \
+       IRQ##irq##_MARK,                                                \
+}
+
+#define IRQC_PINS_MUX(irq, pin0, pin1)                                 \
+static const unsigned int intc_irq##irq##_0_pins[] = {                 \
+       pin0,                                                           \
+};                                                                     \
+static const unsigned int intc_irq##irq##_0_mux[] = {                  \
+       IRQ##irq##_##pin0##_MARK,                                       \
+};                                                                     \
+static const unsigned int intc_irq##irq##_1_pins[] = {                 \
+       pin1,                                                           \
+};                                                                     \
+static const unsigned int intc_irq##irq##_1_mux[] = {                  \
+       IRQ##irq##_##pin1##_MARK,                                       \
+}
+
 enum {
        PINMUX_RESERVED = 0,
 
@@ -47,16 +80,6 @@ enum {
        PORT_ALL(IN),
        PINMUX_INPUT_END,
 
-       /* PORT0_IN_PU -> PORT190_IN_PU */
-       PINMUX_INPUT_PULLUP_BEGIN,
-       PORT_ALL(IN_PU),
-       PINMUX_INPUT_PULLUP_END,
-
-       /* PORT0_IN_PD -> PORT190_IN_PD */
-       PINMUX_INPUT_PULLDOWN_BEGIN,
-       PORT_ALL(IN_PD),
-       PINMUX_INPUT_PULLDOWN_END,
-
        /* PORT0_OUT -> PORT190_OUT */
        PINMUX_OUTPUT_BEGIN,
        PORT_ALL(OUT),
@@ -368,124 +391,11 @@ enum {
        PINMUX_MARK_END,
 };
 
-static const pinmux_enum_t pinmux_data[] = {
+#define _PORT_DATA(pfx, sfx)   PORT_DATA_IO(pfx)
+#define PINMUX_DATA_GP_ALL()   CPU_ALL_PORT(_PORT_DATA, , unused)
 
-       /* specify valid pin states for each pin in GPIO mode */
-       PORT_DATA_IO_PD(0),             PORT_DATA_IO_PD(1),
-       PORT_DATA_O(2),                 PORT_DATA_I_PD(3),
-       PORT_DATA_I_PD(4),              PORT_DATA_I_PD(5),
-       PORT_DATA_IO_PU_PD(6),          PORT_DATA_I_PD(7),
-       PORT_DATA_IO_PD(8),             PORT_DATA_O(9),
-
-       PORT_DATA_O(10),                PORT_DATA_O(11),
-       PORT_DATA_IO_PU_PD(12),         PORT_DATA_IO_PD(13),
-       PORT_DATA_IO_PD(14),            PORT_DATA_O(15),
-       PORT_DATA_IO_PD(16),            PORT_DATA_IO_PD(17),
-       PORT_DATA_I_PD(18),             PORT_DATA_IO(19),
-
-       PORT_DATA_IO(20),               PORT_DATA_IO(21),
-       PORT_DATA_IO(22),               PORT_DATA_IO(23),
-       PORT_DATA_IO(24),               PORT_DATA_IO(25),
-       PORT_DATA_IO(26),               PORT_DATA_IO(27),
-       PORT_DATA_IO(28),               PORT_DATA_IO(29),
-
-       PORT_DATA_IO(30),               PORT_DATA_IO(31),
-       PORT_DATA_IO(32),               PORT_DATA_IO(33),
-       PORT_DATA_IO(34),               PORT_DATA_IO(35),
-       PORT_DATA_IO(36),               PORT_DATA_IO(37),
-       PORT_DATA_IO(38),               PORT_DATA_IO(39),
-
-       PORT_DATA_IO(40),               PORT_DATA_IO(41),
-       PORT_DATA_IO(42),               PORT_DATA_IO(43),
-       PORT_DATA_IO(44),               PORT_DATA_IO(45),
-       PORT_DATA_IO_PU(46),            PORT_DATA_IO_PU(47),
-       PORT_DATA_IO_PU(48),            PORT_DATA_IO_PU(49),
-
-       PORT_DATA_IO_PU(50),            PORT_DATA_IO_PU(51),
-       PORT_DATA_IO_PU(52),            PORT_DATA_IO_PU(53),
-       PORT_DATA_IO_PU(54),            PORT_DATA_IO_PU(55),
-       PORT_DATA_IO_PU(56),            PORT_DATA_IO_PU(57),
-       PORT_DATA_IO_PU(58),            PORT_DATA_IO_PU(59),
-
-       PORT_DATA_IO_PU(60),            PORT_DATA_IO_PU(61),
-       PORT_DATA_IO(62),               PORT_DATA_O(63),
-       PORT_DATA_O(64),                PORT_DATA_IO_PU(65),
-       PORT_DATA_O(66),                PORT_DATA_IO_PU(67),  /*66?*/
-       PORT_DATA_O(68),                PORT_DATA_IO(69),
-
-       PORT_DATA_IO(70),               PORT_DATA_IO(71),
-       PORT_DATA_O(72),                PORT_DATA_I_PU(73),
-       PORT_DATA_I_PU_PD(74),          PORT_DATA_IO_PU_PD(75),
-       PORT_DATA_IO_PU_PD(76),         PORT_DATA_IO_PU_PD(77),
-       PORT_DATA_IO_PU_PD(78),         PORT_DATA_IO_PU_PD(79),
-
-       PORT_DATA_IO_PU_PD(80),         PORT_DATA_IO_PU_PD(81),
-       PORT_DATA_IO_PU_PD(82),         PORT_DATA_IO_PU_PD(83),
-       PORT_DATA_IO_PU_PD(84),         PORT_DATA_IO_PU_PD(85),
-       PORT_DATA_IO_PU_PD(86),         PORT_DATA_IO_PU_PD(87),
-       PORT_DATA_IO_PU_PD(88),         PORT_DATA_IO_PU_PD(89),
-
-       PORT_DATA_IO_PU_PD(90),         PORT_DATA_IO_PU_PD(91),
-       PORT_DATA_IO_PU_PD(92),         PORT_DATA_IO_PU_PD(93),
-       PORT_DATA_IO_PU_PD(94),         PORT_DATA_IO_PU_PD(95),
-       PORT_DATA_IO_PU(96),            PORT_DATA_IO_PU_PD(97),
-       PORT_DATA_IO_PU_PD(98),         PORT_DATA_O(99), /*99?*/
-
-       PORT_DATA_IO_PD(100),           PORT_DATA_IO_PD(101),
-       PORT_DATA_IO_PD(102),           PORT_DATA_IO_PD(103),
-       PORT_DATA_IO_PD(104),           PORT_DATA_IO_PD(105),
-       PORT_DATA_IO_PU(106),           PORT_DATA_IO_PU(107),
-       PORT_DATA_IO_PU(108),           PORT_DATA_IO_PU(109),
-
-       PORT_DATA_IO_PU(110),           PORT_DATA_IO_PU(111),
-       PORT_DATA_IO_PD(112),           PORT_DATA_IO_PD(113),
-       PORT_DATA_IO_PU(114),           PORT_DATA_IO_PU(115),
-       PORT_DATA_IO_PU(116),           PORT_DATA_IO_PU(117),
-       PORT_DATA_IO_PU(118),           PORT_DATA_IO_PU(119),
-
-       PORT_DATA_IO_PU(120),           PORT_DATA_IO_PD(121),
-       PORT_DATA_IO_PD(122),           PORT_DATA_IO_PD(123),
-       PORT_DATA_IO_PD(124),           PORT_DATA_IO_PD(125),
-       PORT_DATA_IO_PD(126),           PORT_DATA_IO_PD(127),
-       PORT_DATA_IO_PD(128),           PORT_DATA_IO_PU_PD(129),
-
-       PORT_DATA_IO_PU_PD(130),        PORT_DATA_IO_PU_PD(131),
-       PORT_DATA_IO_PU_PD(132),        PORT_DATA_IO_PU_PD(133),
-       PORT_DATA_IO_PU_PD(134),        PORT_DATA_IO_PU_PD(135),
-       PORT_DATA_IO_PD(136),           PORT_DATA_IO_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_PU_PD(143),
-       PORT_DATA_IO_PD(144),           PORT_DATA_IO_PD(145),
-       PORT_DATA_IO_PD(146),           PORT_DATA_IO_PD(147),
-       PORT_DATA_IO_PD(148),           PORT_DATA_IO_PD(149),
-
-       PORT_DATA_IO_PD(150),           PORT_DATA_IO_PD(151),
-       PORT_DATA_IO_PU_PD(152),        PORT_DATA_I_PD(153),
-       PORT_DATA_IO_PU_PD(154),        PORT_DATA_I_PD(155),
-       PORT_DATA_IO_PD(156),           PORT_DATA_IO_PD(157),
-       PORT_DATA_I_PD(158),            PORT_DATA_IO_PD(159),
-
-       PORT_DATA_O(160),               PORT_DATA_IO_PD(161),
-       PORT_DATA_IO_PD(162),           PORT_DATA_IO_PD(163),
-       PORT_DATA_I_PD(164),            PORT_DATA_IO_PD(165),
-       PORT_DATA_I_PD(166),            PORT_DATA_I_PD(167),
-       PORT_DATA_I_PD(168),            PORT_DATA_I_PD(169),
-
-       PORT_DATA_I_PD(170),            PORT_DATA_O(171),
-       PORT_DATA_IO_PU_PD(172),        PORT_DATA_IO_PU_PD(173),
-       PORT_DATA_IO_PU_PD(174),        PORT_DATA_IO_PU_PD(175),
-       PORT_DATA_IO_PU_PD(176),        PORT_DATA_IO_PU_PD(177),
-       PORT_DATA_IO_PU_PD(178),        PORT_DATA_O(179),
-
-       PORT_DATA_IO_PU_PD(180),        PORT_DATA_IO_PU_PD(181),
-       PORT_DATA_IO_PU_PD(182),        PORT_DATA_IO_PU_PD(183),
-       PORT_DATA_IO_PU_PD(184),        PORT_DATA_O(185),
-       PORT_DATA_IO_PU_PD(186),        PORT_DATA_IO_PU_PD(187),
-       PORT_DATA_IO_PU_PD(188),        PORT_DATA_IO_PU_PD(189),
-
-       PORT_DATA_IO_PU_PD(190),
+static const pinmux_enum_t pinmux_data[] = {
+       PINMUX_DATA_GP_ALL(),
 
        /* IRQ */
        PINMUX_DATA(IRQ0_6_MARK,        PORT6_FN0,      MSEL1CR_0_0),
@@ -929,10 +839,582 @@ static const pinmux_enum_t pinmux_data[] = {
        PINMUX_DATA(MFIv4_MARK,         MSEL4CR_6_1),
 };
 
+#define SH7372_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 SH7372_PIN_I_PD(pin)           SH7372_PIN(pin, __I | __PD)
+#define SH7372_PIN_I_PU(pin)           SH7372_PIN(pin, __I | __PU)
+#define SH7372_PIN_I_PU_PD(pin)                SH7372_PIN(pin, __I | __PUD)
+#define SH7372_PIN_IO(pin)             SH7372_PIN(pin, __IO)
+#define SH7372_PIN_IO_PD(pin)          SH7372_PIN(pin, __IO | __PD)
+#define SH7372_PIN_IO_PU(pin)          SH7372_PIN(pin, __IO | __PU)
+#define SH7372_PIN_IO_PU_PD(pin)       SH7372_PIN(pin, __IO | __PUD)
+#define SH7372_PIN_O(pin)              SH7372_PIN(pin, __O)
+#define SH7372_PIN_O_PU_PD(pin)                SH7372_PIN(pin, __O | __PUD)
+
 static struct sh_pfc_pin pinmux_pins[] = {
-       GPIO_PORT_ALL(),
+       /* Table 57-1 (I/O and Pull U/D) */
+       SH7372_PIN_IO_PD(0),            SH7372_PIN_IO_PD(1),
+       SH7372_PIN_O(2),                SH7372_PIN_I_PD(3),
+       SH7372_PIN_I_PD(4),             SH7372_PIN_I_PD(5),
+       SH7372_PIN_IO_PU_PD(6),         SH7372_PIN_I_PD(7),
+       SH7372_PIN_IO_PD(8),            SH7372_PIN_O(9),
+       SH7372_PIN_O(10),               SH7372_PIN_O(11),
+       SH7372_PIN_IO_PU_PD(12),        SH7372_PIN_IO_PD(13),
+       SH7372_PIN_IO_PD(14),           SH7372_PIN_O(15),
+       SH7372_PIN_IO_PD(16),           SH7372_PIN_IO_PD(17),
+       SH7372_PIN_I_PD(18),            SH7372_PIN_IO(19),
+       SH7372_PIN_IO(20),              SH7372_PIN_IO(21),
+       SH7372_PIN_IO(22),              SH7372_PIN_IO(23),
+       SH7372_PIN_IO(24),              SH7372_PIN_IO(25),
+       SH7372_PIN_IO(26),              SH7372_PIN_IO(27),
+       SH7372_PIN_IO(28),              SH7372_PIN_IO(29),
+       SH7372_PIN_IO(30),              SH7372_PIN_IO(31),
+       SH7372_PIN_IO(32),              SH7372_PIN_IO(33),
+       SH7372_PIN_IO(34),              SH7372_PIN_IO(35),
+       SH7372_PIN_IO(36),              SH7372_PIN_IO(37),
+       SH7372_PIN_IO(38),              SH7372_PIN_IO(39),
+       SH7372_PIN_IO(40),              SH7372_PIN_IO(41),
+       SH7372_PIN_IO(42),              SH7372_PIN_IO(43),
+       SH7372_PIN_IO(44),              SH7372_PIN_IO(45),
+       SH7372_PIN_IO_PU(46),           SH7372_PIN_IO_PU(47),
+       SH7372_PIN_IO_PU(48),           SH7372_PIN_IO_PU(49),
+       SH7372_PIN_IO_PU(50),           SH7372_PIN_IO_PU(51),
+       SH7372_PIN_IO_PU(52),           SH7372_PIN_IO_PU(53),
+       SH7372_PIN_IO_PU(54),           SH7372_PIN_IO_PU(55),
+       SH7372_PIN_IO_PU(56),           SH7372_PIN_IO_PU(57),
+       SH7372_PIN_IO_PU(58),           SH7372_PIN_IO_PU(59),
+       SH7372_PIN_IO_PU(60),           SH7372_PIN_IO_PU(61),
+       SH7372_PIN_IO(62),              SH7372_PIN_O(63),
+       SH7372_PIN_O(64),               SH7372_PIN_IO_PU(65),
+       SH7372_PIN_O_PU_PD(66),         SH7372_PIN_IO_PU(67),
+       SH7372_PIN_O(68),               SH7372_PIN_IO(69),
+       SH7372_PIN_IO(70),              SH7372_PIN_IO(71),
+       SH7372_PIN_O(72),               SH7372_PIN_I_PU(73),
+       SH7372_PIN_I_PU_PD(74),         SH7372_PIN_IO_PU_PD(75),
+       SH7372_PIN_IO_PU_PD(76),        SH7372_PIN_IO_PU_PD(77),
+       SH7372_PIN_IO_PU_PD(78),        SH7372_PIN_IO_PU_PD(79),
+       SH7372_PIN_IO_PU_PD(80),        SH7372_PIN_IO_PU_PD(81),
+       SH7372_PIN_IO_PU_PD(82),        SH7372_PIN_IO_PU_PD(83),
+       SH7372_PIN_IO_PU_PD(84),        SH7372_PIN_IO_PU_PD(85),
+       SH7372_PIN_IO_PU_PD(86),        SH7372_PIN_IO_PU_PD(87),
+       SH7372_PIN_IO_PU_PD(88),        SH7372_PIN_IO_PU_PD(89),
+       SH7372_PIN_IO_PU_PD(90),        SH7372_PIN_IO_PU_PD(91),
+       SH7372_PIN_IO_PU_PD(92),        SH7372_PIN_IO_PU_PD(93),
+       SH7372_PIN_IO_PU_PD(94),        SH7372_PIN_IO_PU_PD(95),
+       SH7372_PIN_IO_PU(96),           SH7372_PIN_IO_PU_PD(97),
+       SH7372_PIN_IO_PU_PD(98),        SH7372_PIN_O_PU_PD(99),
+       SH7372_PIN_IO_PD(100),          SH7372_PIN_IO_PD(101),
+       SH7372_PIN_IO_PD(102),          SH7372_PIN_IO_PD(103),
+       SH7372_PIN_IO_PD(104),          SH7372_PIN_IO_PD(105),
+       SH7372_PIN_IO_PU(106),          SH7372_PIN_IO_PU(107),
+       SH7372_PIN_IO_PU(108),          SH7372_PIN_IO_PU(109),
+       SH7372_PIN_IO_PU(110),          SH7372_PIN_IO_PU(111),
+       SH7372_PIN_IO_PD(112),          SH7372_PIN_IO_PD(113),
+       SH7372_PIN_IO_PU(114),          SH7372_PIN_IO_PU(115),
+       SH7372_PIN_IO_PU(116),          SH7372_PIN_IO_PU(117),
+       SH7372_PIN_IO_PU(118),          SH7372_PIN_IO_PU(119),
+       SH7372_PIN_IO_PU(120),          SH7372_PIN_IO_PD(121),
+       SH7372_PIN_IO_PD(122),          SH7372_PIN_IO_PD(123),
+       SH7372_PIN_IO_PD(124),          SH7372_PIN_IO_PD(125),
+       SH7372_PIN_IO_PD(126),          SH7372_PIN_IO_PD(127),
+       SH7372_PIN_IO_PD(128),          SH7372_PIN_IO_PU_PD(129),
+       SH7372_PIN_IO_PU_PD(130),       SH7372_PIN_IO_PU_PD(131),
+       SH7372_PIN_IO_PU_PD(132),       SH7372_PIN_IO_PU_PD(133),
+       SH7372_PIN_IO_PU_PD(134),       SH7372_PIN_IO_PU_PD(135),
+       SH7372_PIN_IO_PD(136),          SH7372_PIN_IO_PD(137),
+       SH7372_PIN_IO_PD(138),          SH7372_PIN_IO_PD(139),
+       SH7372_PIN_IO_PD(140),          SH7372_PIN_IO_PD(141),
+       SH7372_PIN_IO_PD(142),          SH7372_PIN_IO_PU_PD(143),
+       SH7372_PIN_IO_PD(144),          SH7372_PIN_IO_PD(145),
+       SH7372_PIN_IO_PD(146),          SH7372_PIN_IO_PD(147),
+       SH7372_PIN_IO_PD(148),          SH7372_PIN_IO_PD(149),
+       SH7372_PIN_IO_PD(150),          SH7372_PIN_IO_PD(151),
+       SH7372_PIN_IO_PU_PD(152),       SH7372_PIN_I_PD(153),
+       SH7372_PIN_IO_PU_PD(154),       SH7372_PIN_I_PD(155),
+       SH7372_PIN_IO_PD(156),          SH7372_PIN_IO_PD(157),
+       SH7372_PIN_I_PD(158),           SH7372_PIN_IO_PD(159),
+       SH7372_PIN_O(160),              SH7372_PIN_IO_PD(161),
+       SH7372_PIN_IO_PD(162),          SH7372_PIN_IO_PD(163),
+       SH7372_PIN_I_PD(164),           SH7372_PIN_IO_PD(165),
+       SH7372_PIN_I_PD(166),           SH7372_PIN_I_PD(167),
+       SH7372_PIN_I_PD(168),           SH7372_PIN_I_PD(169),
+       SH7372_PIN_I_PD(170),           SH7372_PIN_O(171),
+       SH7372_PIN_IO_PU_PD(172),       SH7372_PIN_IO_PU_PD(173),
+       SH7372_PIN_IO_PU_PD(174),       SH7372_PIN_IO_PU_PD(175),
+       SH7372_PIN_IO_PU_PD(176),       SH7372_PIN_IO_PU_PD(177),
+       SH7372_PIN_IO_PU_PD(178),       SH7372_PIN_O(179),
+       SH7372_PIN_IO_PU_PD(180),       SH7372_PIN_IO_PU_PD(181),
+       SH7372_PIN_IO_PU_PD(182),       SH7372_PIN_IO_PU_PD(183),
+       SH7372_PIN_IO_PU_PD(184),       SH7372_PIN_O(185),
+       SH7372_PIN_IO_PU_PD(186),       SH7372_PIN_IO_PU_PD(187),
+       SH7372_PIN_IO_PU_PD(188),       SH7372_PIN_IO_PU_PD(189),
+       SH7372_PIN_IO_PU_PD(190),
 };
 
+/* - BSC -------------------------------------------------------------------- */
+static const unsigned int bsc_data8_pins[] = {
+       /* D[0:7] */
+       46, 47, 48, 49, 50, 51, 52, 53,
+};
+static const unsigned int bsc_data8_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_data16_pins[] = {
+       /* D[0:15] */
+       46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61,
+};
+static const unsigned int bsc_data16_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,
+       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_cs0_pins[] = {
+       /* CS */
+       62,
+};
+static const unsigned int bsc_cs0_mux[] = {
+       CS0_MARK,
+};
+static const unsigned int bsc_cs2_pins[] = {
+       /* CS */
+       63,
+};
+static const unsigned int bsc_cs2_mux[] = {
+       CS2_MARK,
+};
+static const unsigned int bsc_cs4_pins[] = {
+       /* CS */
+       64,
+};
+static const unsigned int bsc_cs4_mux[] = {
+       CS4_MARK,
+};
+static const unsigned int bsc_cs5a_pins[] = {
+       /* CS */
+       65,
+};
+static const unsigned int bsc_cs5a_mux[] = {
+       CS5A_MARK,
+};
+static const unsigned int bsc_cs5b_pins[] = {
+       /* CS */
+       66,
+};
+static const unsigned int bsc_cs5b_mux[] = {
+       CS5B_MARK,
+};
+static const unsigned int bsc_cs6a_pins[] = {
+       /* CS */
+       67,
+};
+static const unsigned int bsc_cs6a_mux[] = {
+       CS6A_MARK,
+};
+static const unsigned int bsc_rd_we8_pins[] = {
+       /* RD, WE[0] */
+       69, 70,
+};
+static const unsigned int bsc_rd_we8_mux[] = {
+       RD_FSC_MARK, WE0_FWE_MARK,
+};
+static const unsigned int bsc_rd_we16_pins[] = {
+       /* RD, WE[0:1] */
+       69, 70, 71,
+};
+static const unsigned int bsc_rd_we16_mux[] = {
+       RD_FSC_MARK, WE0_FWE_MARK, WE1_MARK,
+};
+static const unsigned int bsc_bs_pins[] = {
+       /* BS */
+       19,
+};
+static const unsigned int bsc_bs_mux[] = {
+       BS_MARK,
+};
+static const unsigned int bsc_rdwr_pins[] = {
+       /* RDWR */
+       75,
+};
+static const unsigned int bsc_rdwr_mux[] = {
+       RDWR_MARK,
+};
+static const unsigned int bsc_wait_pins[] = {
+       /* WAIT */
+       74,
+};
+static const unsigned int bsc_wait_mux[] = {
+       WAIT_MARK,
+};
+/* - CEU -------------------------------------------------------------------- */
+static const unsigned int ceu_data_0_7_pins[] = {
+       /* D[0:7] */
+       102, 103, 104, 105, 106, 107, 108, 109,
+};
+static const unsigned int ceu_data_0_7_mux[] = {
+       VIO_D0_MARK, VIO_D1_MARK, VIO_D2_MARK, VIO_D3_MARK,
+       VIO_D4_MARK, VIO_D5_MARK, VIO_D6_MARK, VIO_D7_MARK,
+};
+static const unsigned int ceu_data_8_15_pins[] = {
+       /* D[8:15] */
+       110, 111, 112, 113, 114, 115, 116, 117,
+};
+static const unsigned int ceu_data_8_15_mux[] = {
+       VIO_D8_MARK, VIO_D9_MARK, VIO_D10_MARK, VIO_D11_MARK,
+       VIO_D12_MARK, VIO_D13_MARK, VIO_D14_MARK, VIO_D15_MARK,
+};
+static const unsigned int ceu_clk_0_pins[] = {
+       /* CKO */
+       120,
+};
+static const unsigned int ceu_clk_0_mux[] = {
+       VIO_CKO_MARK,
+};
+static const unsigned int ceu_clk_1_pins[] = {
+       /* CKO */
+       16,
+};
+static const unsigned int ceu_clk_1_mux[] = {
+       VIO_CKO1_MARK,
+};
+static const unsigned int ceu_clk_2_pins[] = {
+       /* CKO */
+       17,
+};
+static const unsigned int ceu_clk_2_mux[] = {
+       VIO_CKO2_MARK,
+};
+static const unsigned int ceu_sync_pins[] = {
+       /* CLK, VD, HD */
+       118, 100, 101,
+};
+static const unsigned int ceu_sync_mux[] = {
+       VIO_CLK_MARK, VIO_VD_MARK, VIO_HD_MARK,
+};
+static const unsigned int ceu_field_pins[] = {
+       /* FIELD */
+       119,
+};
+static const unsigned int ceu_field_mux[] = {
+       VIO_FIELD_MARK,
+};
+/* - FLCTL ------------------------------------------------------------------ */
+static const unsigned int flctl_data_pins[] = {
+       /* NAF[0:15] */
+       46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61,
+};
+static const unsigned int flctl_data_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,
+       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 flctl_ce0_pins[] = {
+       /* CE */
+       68,
+};
+static const unsigned int flctl_ce0_mux[] = {
+       FCE0_MARK,
+};
+static const unsigned int flctl_ce1_pins[] = {
+       /* CE */
+       66,
+};
+static const unsigned int flctl_ce1_mux[] = {
+       FCE1_MARK,
+};
+static const unsigned int flctl_ctrl_pins[] = {
+       /* FCDE, FOE, FSC, FWE, FRB */
+       24, 23, 69, 70, 73,
+};
+static const unsigned int flctl_ctrl_mux[] = {
+       A5_FCDE_MARK, A4_FOE_MARK, RD_FSC_MARK, WE0_FWE_MARK, FRB_MARK,
+};
+/* - FSIA ------------------------------------------------------------------- */
+static const unsigned int fsia_mclk_in_pins[] = {
+       /* CK */
+       4,
+};
+static const unsigned int fsia_mclk_in_mux[] = {
+       FSIACK_MARK,
+};
+static const unsigned int fsia_mclk_out_pins[] = {
+       /* OMC */
+       8,
+};
+static const unsigned int fsia_mclk_out_mux[] = {
+       FSIAOMC_MARK,
+};
+static const unsigned int fsia_sclk_in_pins[] = {
+       /* ILR, IBT */
+       5, 6,
+};
+static const unsigned int fsia_sclk_in_mux[] = {
+       FSIAILR_MARK, FSIAIBT_MARK,
+};
+static const unsigned int fsia_sclk_out_pins[] = {
+       /* OLR, OBT */
+       9, 10,
+};
+static const unsigned int fsia_sclk_out_mux[] = {
+       FSIAOLR_MARK, FSIAOBT_MARK,
+};
+static const unsigned int fsia_data_in_pins[] = {
+       /* ISLD */
+       7,
+};
+static const unsigned int fsia_data_in_mux[] = {
+       FSIAISLD_MARK,
+};
+static const unsigned int fsia_data_out_pins[] = {
+       /* OSLD */
+       11,
+};
+static const unsigned int fsia_data_out_mux[] = {
+       FSIAOSLD_MARK,
+};
+static const unsigned int fsia_spdif_0_pins[] = {
+       /* SPDIF */
+       11,
+};
+static const unsigned int fsia_spdif_0_mux[] = {
+       FSIASPDIF_11_MARK,
+};
+static const unsigned int fsia_spdif_1_pins[] = {
+       /* SPDIF */
+       15,
+};
+static const unsigned int fsia_spdif_1_mux[] = {
+       FSIASPDIF_15_MARK,
+};
+/* - FSIB ------------------------------------------------------------------- */
+static const unsigned int fsib_mclk_in_pins[] = {
+       /* CK */
+       4,
+};
+static const unsigned int fsib_mclk_in_mux[] = {
+       FSIBCK_MARK,
+};
+/* - HDMI ------------------------------------------------------------------- */
+static const unsigned int hdmi_pins[] = {
+       /* HPD, CEC */
+       169, 170,
+};
+static const unsigned int hdmi_mux[] = {
+       HDMI_HPD_MARK, HDMI_CEC_MARK,
+};
+/* - INTC ------------------------------------------------------------------- */
+IRQC_PINS_MUX(0, 6, 162);
+IRQC_PIN_MUX(1, 12);
+IRQC_PINS_MUX(2, 4, 5);
+IRQC_PINS_MUX(3, 8, 16);
+IRQC_PINS_MUX(4, 17, 163);
+IRQC_PIN_MUX(5, 18);
+IRQC_PINS_MUX(6, 39, 164);
+IRQC_PINS_MUX(7, 40, 167);
+IRQC_PINS_MUX(8, 41, 168);
+IRQC_PINS_MUX(9, 42, 169);
+IRQC_PIN_MUX(10, 65);
+IRQC_PIN_MUX(11, 67);
+IRQC_PINS_MUX(12, 80, 137);
+IRQC_PINS_MUX(13, 81, 145);
+IRQC_PINS_MUX(14, 82, 146);
+IRQC_PINS_MUX(15, 83, 147);
+IRQC_PINS_MUX(16, 84, 170);
+IRQC_PIN_MUX(17, 85);
+IRQC_PIN_MUX(18, 86);
+IRQC_PIN_MUX(19, 87);
+IRQC_PIN_MUX(20, 92);
+IRQC_PIN_MUX(21, 93);
+IRQC_PIN_MUX(22, 94);
+IRQC_PIN_MUX(23, 95);
+IRQC_PIN_MUX(24, 112);
+IRQC_PIN_MUX(25, 119);
+IRQC_PINS_MUX(26, 121, 172);
+IRQC_PINS_MUX(27, 122, 180);
+IRQC_PINS_MUX(28, 123, 181);
+IRQC_PINS_MUX(29, 129, 182);
+IRQC_PINS_MUX(30, 130, 183);
+IRQC_PINS_MUX(31, 138, 184);
+/* - KEYSC ------------------------------------------------------------------ */
+static const unsigned int keysc_in04_0_pins[] = {
+       /* KEYIN[0:4] */
+       136, 135, 134, 133, 132,
+};
+static const unsigned int keysc_in04_0_mux[] = {
+       KEYIN0_136_MARK, KEYIN1_135_MARK, KEYIN2_134_MARK, KEYIN3_133_MARK,
+       KEYIN4_MARK,
+};
+static const unsigned int keysc_in04_1_pins[] = {
+       /* KEYIN[0:4] */
+       121, 122, 123, 124, 132,
+};
+static const unsigned int keysc_in04_1_mux[] = {
+       KEYIN0_121_MARK, KEYIN1_122_MARK, KEYIN2_123_MARK, KEYIN3_124_MARK,
+       KEYIN4_MARK,
+};
+static const unsigned int keysc_in5_pins[] = {
+       /* KEYIN5 */
+       131,
+};
+static const unsigned int keysc_in5_mux[] = {
+       KEYIN5_MARK,
+};
+static const unsigned int keysc_in6_pins[] = {
+       /* KEYIN6 */
+       130,
+};
+static const unsigned int keysc_in6_mux[] = {
+       KEYIN6_MARK,
+};
+static const unsigned int keysc_in7_pins[] = {
+       /* KEYIN7 */
+       129,
+};
+static const unsigned int keysc_in7_mux[] = {
+       KEYIN7_MARK,
+};
+static const unsigned int keysc_out4_pins[] = {
+       /* KEYOUT[0:3] */
+       128, 127, 126, 125,
+};
+static const unsigned int keysc_out4_mux[] = {
+       KEYOUT0_MARK, KEYOUT1_MARK, KEYOUT2_MARK, KEYOUT3_MARK,
+};
+static const unsigned int keysc_out5_pins[] = {
+       /* KEYOUT[0:4] */
+       128, 127, 126, 125, 124,
+};
+static const unsigned int keysc_out5_mux[] = {
+       KEYOUT0_MARK, KEYOUT1_MARK, KEYOUT2_MARK, KEYOUT3_MARK,
+       KEYOUT4_MARK,
+};
+static const unsigned int keysc_out6_pins[] = {
+       /* KEYOUT[0:5] */
+       128, 127, 126, 125, 124, 123,
+};
+static const unsigned int keysc_out6_mux[] = {
+       KEYOUT0_MARK, KEYOUT1_MARK, KEYOUT2_MARK, KEYOUT3_MARK,
+       KEYOUT4_MARK, KEYOUT5_MARK,
+};
+static const unsigned int keysc_out8_pins[] = {
+       /* KEYOUT[0:7] */
+       128, 127, 126, 125, 124, 123, 122, 121,
+};
+static const unsigned int keysc_out8_mux[] = {
+       KEYOUT0_MARK, KEYOUT1_MARK, KEYOUT2_MARK, KEYOUT3_MARK,
+       KEYOUT4_MARK, KEYOUT5_MARK, KEYOUT6_MARK, KEYOUT7_MARK,
+};
+/* - LCD -------------------------------------------------------------------- */
+static const unsigned int lcd_data8_pins[] = {
+       /* D[0:7] */
+       121, 122, 123, 124, 125, 126, 127, 128,
+};
+static const unsigned int lcd_data8_mux[] = {
+       /* LCDC */
+       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] */
+       121, 122, 123, 124, 125, 126, 127, 128,
+       129,
+       137, 138, 139, 140, 141, 142, 143, 144,
+};
+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] */
+       121, 122, 123, 124, 125, 126, 127, 128,
+       129, 130, 131, 132,
+};
+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] */
+       121, 122, 123, 124, 125, 126, 127, 128,
+       129, 130, 131, 132, 133, 134, 135, 136,
+};
+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] */
+       121, 122, 123, 124, 125, 126, 127, 128,
+       129, 130, 131, 132, 133, 134, 135, 136,
+       137, 138,
+};
+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] */
+       121, 122, 123, 124, 125, 126, 127, 128,
+       129, 130, 131, 132, 133, 134, 135, 136,
+       137, 138, 139, 140, 141, 142, 143, 144,
+};
+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 */
+       151,
+};
+static const unsigned int lcd_display_mux[] = {
+       LCDDON_MARK,
+};
+static const unsigned int lcd_lclk_pins[] = {
+       /* LCLK */
+       150,
+};
+static const unsigned int lcd_lclk_mux[] = {
+       LCDLCLK_MARK,
+};
+static const unsigned int lcd_sync_pins[] = {
+       /* VSYN, HSYN, DCK, DISP */
+       146, 145, 147, 149,
+};
+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 */
+       145, 147, 148, 149,
+};
+static const unsigned int lcd_sys_mux[] = {
+       LCDCS_MARK, LCDWR_MARK, LCDRD_MARK, LCDRS_MARK,
+};
 /* - MMCIF ------------------------------------------------------------------ */
 static const unsigned int mmc0_data1_0_pins[] = {
        /* D[0] */
@@ -993,6 +1475,139 @@ static const unsigned int mmc0_ctrl_1_pins[] = {
 static const unsigned int mmc0_ctrl_1_mux[] = {
        MMCCMD1_MARK, MMCCLK1_MARK,
 };
+/* - SCIFA0 ----------------------------------------------------------------- */
+static const unsigned int scifa0_data_pins[] = {
+       /* RXD, TXD */
+       153, 152,
+};
+static const unsigned int scifa0_data_mux[] = {
+       SCIFA0_RXD_MARK, SCIFA0_TXD_MARK,
+};
+static const unsigned int scifa0_clk_pins[] = {
+       /* SCK */
+       156,
+};
+static const unsigned int scifa0_clk_mux[] = {
+       SCIFA0_SCK_MARK,
+};
+static const unsigned int scifa0_ctrl_pins[] = {
+       /* RTS, CTS */
+       157, 158,
+};
+static const unsigned int scifa0_ctrl_mux[] = {
+       SCIFA0_RTS_MARK, SCIFA0_CTS_MARK,
+};
+/* - SCIFA1 ----------------------------------------------------------------- */
+static const unsigned int scifa1_data_pins[] = {
+       /* RXD, TXD */
+       155, 154,
+};
+static const unsigned int scifa1_data_mux[] = {
+       SCIFA1_RXD_MARK, SCIFA1_TXD_MARK,
+};
+static const unsigned int scifa1_clk_pins[] = {
+       /* SCK */
+       159,
+};
+static const unsigned int scifa1_clk_mux[] = {
+       SCIFA1_SCK_MARK,
+};
+static const unsigned int scifa1_ctrl_pins[] = {
+       /* RTS, CTS */
+       160, 161,
+};
+static const unsigned int scifa1_ctrl_mux[] = {
+       SCIFA1_RTS_MARK, SCIFA1_CTS_MARK,
+};
+/* - SCIFA2 ----------------------------------------------------------------- */
+static const unsigned int scifa2_data_pins[] = {
+       /* RXD, TXD */
+       97, 96,
+};
+static const unsigned int scifa2_data_mux[] = {
+       SCIFA2_RXD1_MARK, SCIFA2_TXD1_MARK,
+};
+static const unsigned int scifa2_clk_pins[] = {
+       /* SCK */
+       98,
+};
+static const unsigned int scifa2_clk_mux[] = {
+       SCIFA2_SCK1_MARK,
+};
+static const unsigned int scifa2_ctrl_pins[] = {
+       /* RTS, CTS */
+       95, 94,
+};
+static const unsigned int scifa2_ctrl_mux[] = {
+       SCIFA2_RTS1_MARK, SCIFA2_CTS1_MARK,
+};
+/* - SCIFA3 ----------------------------------------------------------------- */
+static const unsigned int scifa3_data_pins[] = {
+       /* RXD, TXD */
+       144, 143,
+};
+static const unsigned int scifa3_data_mux[] = {
+       SCIFA3_RXD_MARK, SCIFA3_TXD_MARK,
+};
+static const unsigned int scifa3_clk_pins[] = {
+       /* SCK */
+       142,
+};
+static const unsigned int scifa3_clk_mux[] = {
+       SCIFA3_SCK_MARK,
+};
+static const unsigned int scifa3_ctrl_0_pins[] = {
+       /* RTS, CTS */
+       44, 43,
+};
+static const unsigned int scifa3_ctrl_0_mux[] = {
+       SCIFA3_RTS_44_MARK, SCIFA3_CTS_43_MARK,
+};
+static const unsigned int scifa3_ctrl_1_pins[] = {
+       /* RTS, CTS */
+       141, 140,
+};
+static const unsigned int scifa3_ctrl_1_mux[] = {
+       SCIFA3_RTS_141_MARK, SCIFA3_CTS_140_MARK,
+};
+/* - SCIFA4 ----------------------------------------------------------------- */
+static const unsigned int scifa4_data_pins[] = {
+       /* RXD, TXD */
+       5, 6,
+};
+static const unsigned int scifa4_data_mux[] = {
+       SCIFA4_RXD_MARK, SCIFA4_TXD_MARK,
+};
+/* - SCIFA5 ----------------------------------------------------------------- */
+static const unsigned int scifa5_data_pins[] = {
+       /* RXD, TXD */
+       8, 12,
+};
+static const unsigned int scifa5_data_mux[] = {
+       SCIFA5_RXD_MARK, SCIFA5_TXD_MARK,
+};
+/* - SCIFB ------------------------------------------------------------------ */
+static const unsigned int scifb_data_pins[] = {
+       /* RXD, TXD */
+       166, 165,
+};
+static const unsigned int scifb_data_mux[] = {
+       SCIFB_RXD_MARK, SCIFB_TXD_MARK,
+};
+static const unsigned int scifb_clk_pins[] = {
+       /* SCK */
+       162,
+};
+static const unsigned int scifb_clk_mux[] = {
+       SCIFB_SCK_MARK,
+};
+static const unsigned int scifb_ctrl_pins[] = {
+       /* RTS, CTS */
+       163, 164,
+};
+static const unsigned int scifb_ctrl_mux[] = {
+       SCIFB_RTS_MARK, SCIFB_CTS_MARK,
+};
 /* - SDHI0 ------------------------------------------------------------------ */
 static const unsigned int sdhi0_data1_pins[] = {
        /* D0 */
@@ -1073,8 +1688,169 @@ static const unsigned int sdhi2_ctrl_pins[] = {
 static const unsigned int sdhi2_ctrl_mux[] = {
        SDHICMD2_MARK, SDHICLK2_MARK,
 };
+/* - USB0 ------------------------------------------------------------------- */
+static const unsigned int usb0_vbus_pins[] = {
+       /* VBUS */
+       167,
+};
+static const unsigned int usb0_vbus_mux[] = {
+       VBUS0_0_MARK,
+};
+static const unsigned int usb0_otg_id_pins[] = {
+       /* IDIN */
+       113,
+};
+static const unsigned int usb0_otg_id_mux[] = {
+       IDIN_0_MARK,
+};
+static const unsigned int usb0_otg_ctrl_pins[] = {
+       /* PWEN, EXTLP, OVCN, OVCN2 */
+       116, 114, 117, 115,
+};
+static const unsigned int usb0_otg_ctrl_mux[] = {
+       PWEN_0_MARK, EXTLP_0_MARK, OVCN_0_MARK, OVCN2_0_MARK,
+};
+/* - USB1 ------------------------------------------------------------------- */
+static const unsigned int usb1_vbus_pins[] = {
+       /* VBUS */
+       168,
+};
+static const unsigned int usb1_vbus_mux[] = {
+       VBUS0_1_MARK,
+};
+static const unsigned int usb1_otg_id_0_pins[] = {
+       /* IDIN */
+       113,
+};
+static const unsigned int usb1_otg_id_0_mux[] = {
+       IDIN_1_113_MARK,
+};
+static const unsigned int usb1_otg_id_1_pins[] = {
+       /* IDIN */
+       18,
+};
+static const unsigned int usb1_otg_id_1_mux[] = {
+       IDIN_1_18_MARK,
+};
+static const unsigned int usb1_otg_ctrl_0_pins[] = {
+       /* PWEN, EXTLP, OVCN, OVCN2 */
+       115, 116, 114, 117, 113,
+};
+static const unsigned int usb1_otg_ctrl_0_mux[] = {
+       PWEN_1_115_MARK, EXTLP_1_MARK, OVCN_1_114_MARK, OVCN2_1_MARK,
+};
+static const unsigned int usb1_otg_ctrl_1_pins[] = {
+       /* PWEN, EXTLP, OVCN, OVCN2 */
+       138, 116, 162, 117, 18,
+};
+static const unsigned int usb1_otg_ctrl_1_mux[] = {
+       PWEN_1_138_MARK, EXTLP_1_MARK, OVCN_1_162_MARK, OVCN2_1_MARK,
+};
 
 static const struct sh_pfc_pin_group pinmux_groups[] = {
+       SH_PFC_PIN_GROUP(bsc_data8),
+       SH_PFC_PIN_GROUP(bsc_data16),
+       SH_PFC_PIN_GROUP(bsc_cs0),
+       SH_PFC_PIN_GROUP(bsc_cs2),
+       SH_PFC_PIN_GROUP(bsc_cs4),
+       SH_PFC_PIN_GROUP(bsc_cs5a),
+       SH_PFC_PIN_GROUP(bsc_cs5b),
+       SH_PFC_PIN_GROUP(bsc_cs6a),
+       SH_PFC_PIN_GROUP(bsc_rd_we8),
+       SH_PFC_PIN_GROUP(bsc_rd_we16),
+       SH_PFC_PIN_GROUP(bsc_bs),
+       SH_PFC_PIN_GROUP(bsc_rdwr),
+       SH_PFC_PIN_GROUP(ceu_data_0_7),
+       SH_PFC_PIN_GROUP(ceu_data_8_15),
+       SH_PFC_PIN_GROUP(ceu_clk_0),
+       SH_PFC_PIN_GROUP(ceu_clk_1),
+       SH_PFC_PIN_GROUP(ceu_clk_2),
+       SH_PFC_PIN_GROUP(ceu_sync),
+       SH_PFC_PIN_GROUP(ceu_field),
+       SH_PFC_PIN_GROUP(flctl_data),
+       SH_PFC_PIN_GROUP(flctl_ce0),
+       SH_PFC_PIN_GROUP(flctl_ce1),
+       SH_PFC_PIN_GROUP(flctl_ctrl),
+       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_0),
+       SH_PFC_PIN_GROUP(fsia_spdif_1),
+       SH_PFC_PIN_GROUP(fsib_mclk_in),
+       SH_PFC_PIN_GROUP(hdmi),
+       SH_PFC_PIN_GROUP(intc_irq0_0),
+       SH_PFC_PIN_GROUP(intc_irq0_1),
+       SH_PFC_PIN_GROUP(intc_irq1),
+       SH_PFC_PIN_GROUP(intc_irq2_0),
+       SH_PFC_PIN_GROUP(intc_irq2_1),
+       SH_PFC_PIN_GROUP(intc_irq3_0),
+       SH_PFC_PIN_GROUP(intc_irq3_1),
+       SH_PFC_PIN_GROUP(intc_irq4_0),
+       SH_PFC_PIN_GROUP(intc_irq4_1),
+       SH_PFC_PIN_GROUP(intc_irq5),
+       SH_PFC_PIN_GROUP(intc_irq6_0),
+       SH_PFC_PIN_GROUP(intc_irq6_1),
+       SH_PFC_PIN_GROUP(intc_irq7_0),
+       SH_PFC_PIN_GROUP(intc_irq7_1),
+       SH_PFC_PIN_GROUP(intc_irq8_0),
+       SH_PFC_PIN_GROUP(intc_irq8_1),
+       SH_PFC_PIN_GROUP(intc_irq9_0),
+       SH_PFC_PIN_GROUP(intc_irq9_1),
+       SH_PFC_PIN_GROUP(intc_irq10),
+       SH_PFC_PIN_GROUP(intc_irq11),
+       SH_PFC_PIN_GROUP(intc_irq12_0),
+       SH_PFC_PIN_GROUP(intc_irq12_1),
+       SH_PFC_PIN_GROUP(intc_irq13_0),
+       SH_PFC_PIN_GROUP(intc_irq13_1),
+       SH_PFC_PIN_GROUP(intc_irq14_0),
+       SH_PFC_PIN_GROUP(intc_irq14_1),
+       SH_PFC_PIN_GROUP(intc_irq15_0),
+       SH_PFC_PIN_GROUP(intc_irq15_1),
+       SH_PFC_PIN_GROUP(intc_irq16_0),
+       SH_PFC_PIN_GROUP(intc_irq16_1),
+       SH_PFC_PIN_GROUP(intc_irq17),
+       SH_PFC_PIN_GROUP(intc_irq18),
+       SH_PFC_PIN_GROUP(intc_irq19),
+       SH_PFC_PIN_GROUP(intc_irq20),
+       SH_PFC_PIN_GROUP(intc_irq21),
+       SH_PFC_PIN_GROUP(intc_irq22),
+       SH_PFC_PIN_GROUP(intc_irq23),
+       SH_PFC_PIN_GROUP(intc_irq24),
+       SH_PFC_PIN_GROUP(intc_irq25),
+       SH_PFC_PIN_GROUP(intc_irq26_0),
+       SH_PFC_PIN_GROUP(intc_irq26_1),
+       SH_PFC_PIN_GROUP(intc_irq27_0),
+       SH_PFC_PIN_GROUP(intc_irq27_1),
+       SH_PFC_PIN_GROUP(intc_irq28_0),
+       SH_PFC_PIN_GROUP(intc_irq28_1),
+       SH_PFC_PIN_GROUP(intc_irq29_0),
+       SH_PFC_PIN_GROUP(intc_irq29_1),
+       SH_PFC_PIN_GROUP(intc_irq30_0),
+       SH_PFC_PIN_GROUP(intc_irq30_1),
+       SH_PFC_PIN_GROUP(intc_irq31_0),
+       SH_PFC_PIN_GROUP(intc_irq31_1),
+       SH_PFC_PIN_GROUP(keysc_in04_0),
+       SH_PFC_PIN_GROUP(keysc_in04_1),
+       SH_PFC_PIN_GROUP(keysc_in5),
+       SH_PFC_PIN_GROUP(keysc_in6),
+       SH_PFC_PIN_GROUP(keysc_in7),
+       SH_PFC_PIN_GROUP(keysc_out4),
+       SH_PFC_PIN_GROUP(keysc_out5),
+       SH_PFC_PIN_GROUP(keysc_out6),
+       SH_PFC_PIN_GROUP(keysc_out8),
+       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(mmc0_data1_0),
        SH_PFC_PIN_GROUP(mmc0_data4_0),
        SH_PFC_PIN_GROUP(mmc0_data8_0),
@@ -1083,6 +1859,24 @@ static const struct sh_pfc_pin_group pinmux_groups[] = {
        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),
+       SH_PFC_PIN_GROUP(scifa2_clk),
+       SH_PFC_PIN_GROUP(scifa2_ctrl),
+       SH_PFC_PIN_GROUP(scifa3_data),
+       SH_PFC_PIN_GROUP(scifa3_clk),
+       SH_PFC_PIN_GROUP(scifa3_ctrl_0),
+       SH_PFC_PIN_GROUP(scifa3_ctrl_1),
+       SH_PFC_PIN_GROUP(scifa4_data),
+       SH_PFC_PIN_GROUP(scifa5_data),
+       SH_PFC_PIN_GROUP(scifb_data),
+       SH_PFC_PIN_GROUP(scifb_clk),
+       SH_PFC_PIN_GROUP(scifb_ctrl),
        SH_PFC_PIN_GROUP(sdhi0_data1),
        SH_PFC_PIN_GROUP(sdhi0_data4),
        SH_PFC_PIN_GROUP(sdhi0_ctrl),
@@ -1094,6 +1888,144 @@ static const struct sh_pfc_pin_group pinmux_groups[] = {
        SH_PFC_PIN_GROUP(sdhi2_data1),
        SH_PFC_PIN_GROUP(sdhi2_data4),
        SH_PFC_PIN_GROUP(sdhi2_ctrl),
+       SH_PFC_PIN_GROUP(usb0_vbus),
+       SH_PFC_PIN_GROUP(usb0_otg_id),
+       SH_PFC_PIN_GROUP(usb0_otg_ctrl),
+       SH_PFC_PIN_GROUP(usb1_vbus),
+       SH_PFC_PIN_GROUP(usb1_otg_id_0),
+       SH_PFC_PIN_GROUP(usb1_otg_id_1),
+       SH_PFC_PIN_GROUP(usb1_otg_ctrl_0),
+       SH_PFC_PIN_GROUP(usb1_otg_ctrl_1),
+};
+
+static const char * const bsc_groups[] = {
+       "bsc_data8",
+       "bsc_data16",
+       "bsc_cs0",
+       "bsc_cs2",
+       "bsc_cs4",
+       "bsc_cs5a",
+       "bsc_cs5b",
+       "bsc_cs6a",
+       "bsc_rd_we8",
+       "bsc_rd_we16",
+       "bsc_bs",
+       "bsc_rdwr",
+};
+
+static const char * const ceu_groups[] = {
+       "ceu_data_0_7",
+       "ceu_data_8_15",
+       "ceu_clk_0",
+       "ceu_clk_1",
+       "ceu_clk_2",
+       "ceu_sync",
+       "ceu_field",
+};
+
+static const char * const flctl_groups[] = {
+       "flctl_data",
+       "flctl_ce0",
+       "flctl_ce1",
+       "flctl_ctrl",
+};
+
+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_0",
+       "fsia_spdif_1",
+};
+
+static const char * const fsib_groups[] = {
+       "fsib_mclk_in",
+};
+
+static const char * const hdmi_groups[] = {
+       "hdmi",
+};
+
+static const char * const intc_groups[] = {
+       "intc_irq0_0",
+       "intc_irq0_1",
+       "intc_irq1",
+       "intc_irq2_0",
+       "intc_irq2_1",
+       "intc_irq3_0",
+       "intc_irq3_1",
+       "intc_irq4_0",
+       "intc_irq4_1",
+       "intc_irq5",
+       "intc_irq6_0",
+       "intc_irq6_1",
+       "intc_irq7_0",
+       "intc_irq7_1",
+       "intc_irq8_0",
+       "intc_irq8_1",
+       "intc_irq9_0",
+       "intc_irq9_1",
+       "intc_irq10",
+       "intc_irq11",
+       "intc_irq12_0",
+       "intc_irq12_1",
+       "intc_irq13_0",
+       "intc_irq13_1",
+       "intc_irq14_0",
+       "intc_irq14_1",
+       "intc_irq15_0",
+       "intc_irq15_1",
+       "intc_irq16_0",
+       "intc_irq16_1",
+       "intc_irq17",
+       "intc_irq18",
+       "intc_irq19",
+       "intc_irq20",
+       "intc_irq21",
+       "intc_irq22",
+       "intc_irq23",
+       "intc_irq24",
+       "intc_irq25",
+       "intc_irq26_0",
+       "intc_irq26_1",
+       "intc_irq27_0",
+       "intc_irq27_1",
+       "intc_irq28_0",
+       "intc_irq28_1",
+       "intc_irq29_0",
+       "intc_irq29_1",
+       "intc_irq30_0",
+       "intc_irq30_1",
+       "intc_irq31_0",
+       "intc_irq31_1",
+};
+
+static const char * const keysc_groups[] = {
+       "keysc_in04_0",
+       "keysc_in04_1",
+       "keysc_in5",
+       "keysc_in6",
+       "keysc_in7",
+       "keysc_out4",
+       "keysc_out5",
+       "keysc_out6",
+       "keysc_out8",
+};
+
+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 mmc0_groups[] = {
@@ -1107,6 +2039,45 @@ static const char * const mmc0_groups[] = {
        "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",
+       "scifa2_clk",
+       "scifa2_ctrl",
+};
+
+static const char * const scifa3_groups[] = {
+       "scifa3_data",
+       "scifa3_clk",
+       "scifa3_ctrl_0",
+       "scifa3_ctrl_1",
+};
+
+static const char * const scifa4_groups[] = {
+       "scifa4_data",
+};
+
+static const char * const scifa5_groups[] = {
+       "scifa5_data",
+};
+
+static const char * const scifb_groups[] = {
+       "scifb_data",
+       "scifb_clk",
+       "scifb_ctrl",
+};
+
 static const char * const sdhi0_groups[] = {
        "sdhi0_data1",
        "sdhi0_data4",
@@ -1127,256 +2098,55 @@ static const char * const sdhi2_groups[] = {
        "sdhi2_ctrl",
 };
 
+static const char * const usb0_groups[] = {
+       "usb0_vbus",
+       "usb0_otg_id",
+       "usb0_otg_ctrl",
+};
+
+static const char * const usb1_groups[] = {
+       "usb1_vbus",
+       "usb1_otg_id_0",
+       "usb1_otg_id_1",
+       "usb1_otg_ctrl_0",
+       "usb1_otg_ctrl_1",
+};
+
 static const struct sh_pfc_function pinmux_functions[] = {
+       SH_PFC_FUNCTION(bsc),
+       SH_PFC_FUNCTION(ceu),
+       SH_PFC_FUNCTION(flctl),
+       SH_PFC_FUNCTION(fsia),
+       SH_PFC_FUNCTION(fsib),
+       SH_PFC_FUNCTION(hdmi),
+       SH_PFC_FUNCTION(intc),
+       SH_PFC_FUNCTION(keysc),
+       SH_PFC_FUNCTION(lcd),
        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(scifb),
        SH_PFC_FUNCTION(sdhi0),
        SH_PFC_FUNCTION(sdhi1),
        SH_PFC_FUNCTION(sdhi2),
+       SH_PFC_FUNCTION(usb0),
+       SH_PFC_FUNCTION(usb1),
 };
 
-#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),
-       GPIO_FN(IRQ3_16),       GPIO_FN(IRQ4_17),       GPIO_FN(IRQ4_163),
-       GPIO_FN(IRQ5),          GPIO_FN(IRQ6_39),       GPIO_FN(IRQ6_164),
-       GPIO_FN(IRQ7_40),       GPIO_FN(IRQ7_167),      GPIO_FN(IRQ8_41),
-       GPIO_FN(IRQ8_168),      GPIO_FN(IRQ9_42),       GPIO_FN(IRQ9_169),
-       GPIO_FN(IRQ10),         GPIO_FN(IRQ11),         GPIO_FN(IRQ12_80),
-       GPIO_FN(IRQ12_137),     GPIO_FN(IRQ13_81),      GPIO_FN(IRQ13_145),
-       GPIO_FN(IRQ14_82),      GPIO_FN(IRQ14_146),     GPIO_FN(IRQ15_83),
-       GPIO_FN(IRQ15_147),     GPIO_FN(IRQ16_84),      GPIO_FN(IRQ16_170),
-       GPIO_FN(IRQ17),         GPIO_FN(IRQ18),         GPIO_FN(IRQ19),
-       GPIO_FN(IRQ20),         GPIO_FN(IRQ21),         GPIO_FN(IRQ22),
-       GPIO_FN(IRQ23),         GPIO_FN(IRQ24),         GPIO_FN(IRQ25),
-       GPIO_FN(IRQ26_121),     GPIO_FN(IRQ26_172),     GPIO_FN(IRQ27_122),
-       GPIO_FN(IRQ27_180),     GPIO_FN(IRQ28_123),     GPIO_FN(IRQ28_181),
-       GPIO_FN(IRQ29_129),     GPIO_FN(IRQ29_182),     GPIO_FN(IRQ30_130),
-       GPIO_FN(IRQ30_183),     GPIO_FN(IRQ31_138),     GPIO_FN(IRQ31_184),
-
-       /* MSIOF0 */
-       GPIO_FN(MSIOF0_TSYNC),  GPIO_FN(MSIOF0_TSCK),   GPIO_FN(MSIOF0_RXD),
-       GPIO_FN(MSIOF0_RSCK),   GPIO_FN(MSIOF0_RSYNC),  GPIO_FN(MSIOF0_MCK0),
-       GPIO_FN(MSIOF0_MCK1),   GPIO_FN(MSIOF0_SS1),    GPIO_FN(MSIOF0_SS2),
-       GPIO_FN(MSIOF0_TXD),
-
-       /* MSIOF1 */
-       GPIO_FN(MSIOF1_TSCK_39),        GPIO_FN(MSIOF1_TSCK_88),
-       GPIO_FN(MSIOF1_TSYNC_40),       GPIO_FN(MSIOF1_TSYNC_89),
-       GPIO_FN(MSIOF1_TXD_41),         GPIO_FN(MSIOF1_TXD_90),
-       GPIO_FN(MSIOF1_RXD_42),         GPIO_FN(MSIOF1_RXD_91),
-       GPIO_FN(MSIOF1_SS1_43),         GPIO_FN(MSIOF1_SS1_92),
-       GPIO_FN(MSIOF1_SS2_44),         GPIO_FN(MSIOF1_SS2_93),
-       GPIO_FN(MSIOF1_RSCK),           GPIO_FN(MSIOF1_RSYNC),
-       GPIO_FN(MSIOF1_MCK0),           GPIO_FN(MSIOF1_MCK1),
-
-       /* MSIOF2 */
-       GPIO_FN(MSIOF2_RSCK),   GPIO_FN(MSIOF2_RSYNC),  GPIO_FN(MSIOF2_MCK0),
-       GPIO_FN(MSIOF2_MCK1),   GPIO_FN(MSIOF2_SS1),    GPIO_FN(MSIOF2_SS2),
-       GPIO_FN(MSIOF2_TSYNC),  GPIO_FN(MSIOF2_TSCK),   GPIO_FN(MSIOF2_RXD),
-       GPIO_FN(MSIOF2_TXD),
-
-       /* BBIF1 */
-       GPIO_FN(BBIF1_RXD),     GPIO_FN(BBIF1_TSYNC),   GPIO_FN(BBIF1_TSCK),
-       GPIO_FN(BBIF1_TXD),     GPIO_FN(BBIF1_RSCK),    GPIO_FN(BBIF1_RSYNC),
-       GPIO_FN(BBIF1_FLOW),    GPIO_FN(BB_RX_FLOW_N),
-
-       /* BBIF2 */
-       GPIO_FN(BBIF2_TSCK1),   GPIO_FN(BBIF2_TSYNC1),
-       GPIO_FN(BBIF2_TXD1),    GPIO_FN(BBIF2_RXD),
-
-       /* FSI */
-       GPIO_FN(FSIACK),        GPIO_FN(FSIBCK),        GPIO_FN(FSIAILR),
-       GPIO_FN(FSIAIBT),       GPIO_FN(FSIAISLD),      GPIO_FN(FSIAOMC),
-       GPIO_FN(FSIAOLR),       GPIO_FN(FSIAOBT),       GPIO_FN(FSIAOSLD),
-       GPIO_FN(FSIASPDIF_11),  GPIO_FN(FSIASPDIF_15),
-
-       /* FMSI */
-       GPIO_FN(FMSOCK),        GPIO_FN(FMSOOLR),       GPIO_FN(FMSIOLR),
-       GPIO_FN(FMSOOBT),       GPIO_FN(FMSIOBT),       GPIO_FN(FMSOSLD),
-       GPIO_FN(FMSOILR),       GPIO_FN(FMSIILR),       GPIO_FN(FMSOIBT),
-       GPIO_FN(FMSIIBT),       GPIO_FN(FMSISLD),       GPIO_FN(FMSICK),
-
-       /* SCIFA0 */
-       GPIO_FN(SCIFA0_TXD),    GPIO_FN(SCIFA0_RXD),    GPIO_FN(SCIFA0_SCK),
-       GPIO_FN(SCIFA0_RTS),    GPIO_FN(SCIFA0_CTS),
-
-       /* SCIFA1 */
-       GPIO_FN(SCIFA1_TXD),    GPIO_FN(SCIFA1_RXD),    GPIO_FN(SCIFA1_SCK),
-       GPIO_FN(SCIFA1_RTS),    GPIO_FN(SCIFA1_CTS),
-
-       /* SCIFA2 */
-       GPIO_FN(SCIFA2_CTS1),   GPIO_FN(SCIFA2_RTS1),   GPIO_FN(SCIFA2_TXD1),
-       GPIO_FN(SCIFA2_RXD1),   GPIO_FN(SCIFA2_SCK1),
-
-       /* SCIFA3 */
-       GPIO_FN(SCIFA3_CTS_43),         GPIO_FN(SCIFA3_CTS_140),
-       GPIO_FN(SCIFA3_RTS_44),         GPIO_FN(SCIFA3_RTS_141),
-       GPIO_FN(SCIFA3_SCK),            GPIO_FN(SCIFA3_TXD),
-       GPIO_FN(SCIFA3_RXD),
-
-       /* SCIFA4 */
-       GPIO_FN(SCIFA4_RXD),    GPIO_FN(SCIFA4_TXD),
-
-       /* SCIFA5 */
-       GPIO_FN(SCIFA5_RXD),    GPIO_FN(SCIFA5_TXD),
-
-       /* SCIFB */
-       GPIO_FN(SCIFB_SCK),     GPIO_FN(SCIFB_RTS),     GPIO_FN(SCIFB_CTS),
-       GPIO_FN(SCIFB_TXD),     GPIO_FN(SCIFB_RXD),
-
-       /* CEU */
-       GPIO_FN(VIO_HD),        GPIO_FN(VIO_CKO1),      GPIO_FN(VIO_CKO2),
-       GPIO_FN(VIO_VD),        GPIO_FN(VIO_CLK),       GPIO_FN(VIO_FIELD),
-       GPIO_FN(VIO_CKO),       GPIO_FN(VIO_D0),        GPIO_FN(VIO_D1),
-       GPIO_FN(VIO_D2),        GPIO_FN(VIO_D3),        GPIO_FN(VIO_D4),
-       GPIO_FN(VIO_D5),        GPIO_FN(VIO_D6),        GPIO_FN(VIO_D7),
-       GPIO_FN(VIO_D8),        GPIO_FN(VIO_D9),        GPIO_FN(VIO_D10),
-       GPIO_FN(VIO_D11),       GPIO_FN(VIO_D12),       GPIO_FN(VIO_D13),
-       GPIO_FN(VIO_D14),       GPIO_FN(VIO_D15),
-
-       /* USB0 */
-       GPIO_FN(IDIN_0),        GPIO_FN(EXTLP_0),       GPIO_FN(OVCN2_0),
-       GPIO_FN(PWEN_0),        GPIO_FN(OVCN_0),        GPIO_FN(VBUS0_0),
-
-       /* USB1 */
-       GPIO_FN(IDIN_1_18),     GPIO_FN(IDIN_1_113),
-       GPIO_FN(OVCN_1_114),    GPIO_FN(OVCN_1_162),
-       GPIO_FN(PWEN_1_115),    GPIO_FN(PWEN_1_138),
-       GPIO_FN(EXTLP_1),       GPIO_FN(OVCN2_1),
-       GPIO_FN(VBUS0_1),
-
-       /* GPIO */
-       GPIO_FN(GPI0),  GPIO_FN(GPI1),  GPIO_FN(GPO0),  GPIO_FN(GPO1),
-
-       /* BSC */
-       GPIO_FN(BS),    GPIO_FN(WE1),   GPIO_FN(CKO),
-       GPIO_FN(WAIT),  GPIO_FN(RDWR),
-
-       GPIO_FN(A0),    GPIO_FN(A1),    GPIO_FN(A2),
-       GPIO_FN(A3),    GPIO_FN(A6),    GPIO_FN(A7),
-       GPIO_FN(A8),    GPIO_FN(A9),    GPIO_FN(A10),
-       GPIO_FN(A11),   GPIO_FN(A12),   GPIO_FN(A13),
-       GPIO_FN(A14),   GPIO_FN(A15),   GPIO_FN(A16),
-       GPIO_FN(A17),   GPIO_FN(A18),   GPIO_FN(A19),
-       GPIO_FN(A20),   GPIO_FN(A21),   GPIO_FN(A22),
-       GPIO_FN(A23),   GPIO_FN(A24),   GPIO_FN(A25),
-       GPIO_FN(A26),
-
-       GPIO_FN(CS0),   GPIO_FN(CS2),   GPIO_FN(CS4),
-       GPIO_FN(CS5A),  GPIO_FN(CS5B),  GPIO_FN(CS6A),
-
-       /* BSC/FLCTL */
-       GPIO_FN(RD_FSC),        GPIO_FN(WE0_FWE),       GPIO_FN(A4_FOE),
-       GPIO_FN(A5_FCDE),       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),
-
-       /* SPU2 */
-       GPIO_FN(VINT_I),
-
-       /* FLCTL */
-       GPIO_FN(FCE1),  GPIO_FN(FCE0),  GPIO_FN(FRB),
-
-       /* HSI */
-       GPIO_FN(GP_RX_FLAG),    GPIO_FN(GP_RX_DATA),    GPIO_FN(GP_TX_READY),
-       GPIO_FN(GP_RX_WAKE),    GPIO_FN(MP_TX_FLAG),    GPIO_FN(MP_TX_DATA),
-       GPIO_FN(MP_RX_READY),   GPIO_FN(MP_TX_WAKE),
-
-       /* MFI */
-       GPIO_FN(MFIv6),
-       GPIO_FN(MFIv4),
-
-       GPIO_FN(MEMC_BUSCLK_MEMC_A0),   GPIO_FN(MEMC_ADV_MEMC_DREQ0),
-       GPIO_FN(MEMC_WAIT_MEMC_DREQ1),  GPIO_FN(MEMC_CS1_MEMC_A1),
-       GPIO_FN(MEMC_CS0),      GPIO_FN(MEMC_NOE),
-       GPIO_FN(MEMC_NWE),      GPIO_FN(MEMC_INT),
-
-       GPIO_FN(MEMC_AD0),      GPIO_FN(MEMC_AD1),      GPIO_FN(MEMC_AD2),
-       GPIO_FN(MEMC_AD3),      GPIO_FN(MEMC_AD4),      GPIO_FN(MEMC_AD5),
-       GPIO_FN(MEMC_AD6),      GPIO_FN(MEMC_AD7),      GPIO_FN(MEMC_AD8),
-       GPIO_FN(MEMC_AD9),      GPIO_FN(MEMC_AD10),     GPIO_FN(MEMC_AD11),
-       GPIO_FN(MEMC_AD12),     GPIO_FN(MEMC_AD13),     GPIO_FN(MEMC_AD14),
-       GPIO_FN(MEMC_AD15),
-
-       /* SIM */
-       GPIO_FN(SIM_RST),       GPIO_FN(SIM_CLK),       GPIO_FN(SIM_D),
-
-       /* TPU */
-       GPIO_FN(TPU0TO0),       GPIO_FN(TPU0TO1),       GPIO_FN(TPU0TO2_93),
-       GPIO_FN(TPU0TO2_99),    GPIO_FN(TPU0TO3),
-
-       /* I2C2 */
-       GPIO_FN(I2C_SCL2),      GPIO_FN(I2C_SDA2),
-
-       /* I2C3(1) */
-       GPIO_FN(I2C_SCL3),      GPIO_FN(I2C_SDA3),
-
-       /* I2C3(2) */
-       GPIO_FN(I2C_SCL3S),     GPIO_FN(I2C_SDA3S),
-
-       /* I2C4(2) */
-       GPIO_FN(I2C_SCL4),      GPIO_FN(I2C_SDA4),
-
-       /* I2C4(2) */
-       GPIO_FN(I2C_SCL4S),     GPIO_FN(I2C_SDA4S),
-
-       /* KEYSC */
-       GPIO_FN(KEYOUT0),       GPIO_FN(KEYIN0_121),    GPIO_FN(KEYIN0_136),
-       GPIO_FN(KEYOUT1),       GPIO_FN(KEYIN1_122),    GPIO_FN(KEYIN1_135),
-       GPIO_FN(KEYOUT2),       GPIO_FN(KEYIN2_123),    GPIO_FN(KEYIN2_134),
-       GPIO_FN(KEYOUT3),       GPIO_FN(KEYIN3_124),    GPIO_FN(KEYIN3_133),
-       GPIO_FN(KEYOUT4),       GPIO_FN(KEYIN4),        GPIO_FN(KEYOUT5),
-       GPIO_FN(KEYIN5),        GPIO_FN(KEYOUT6),       GPIO_FN(KEYIN6),
-       GPIO_FN(KEYOUT7),       GPIO_FN(KEYIN7),
-
-       /* LCDC */
-       GPIO_FN(LCDHSYN),       GPIO_FN(LCDCS), GPIO_FN(LCDVSYN),
-       GPIO_FN(LCDDCK),        GPIO_FN(LCDWR), GPIO_FN(LCDRD),
-       GPIO_FN(LCDDISP),       GPIO_FN(LCDRS), GPIO_FN(LCDLCLK),
-       GPIO_FN(LCDDON),
-
-       GPIO_FN(LCDD0),         GPIO_FN(LCDD1),         GPIO_FN(LCDD2),
-       GPIO_FN(LCDD3),         GPIO_FN(LCDD4),         GPIO_FN(LCDD5),
-       GPIO_FN(LCDD6),         GPIO_FN(LCDD7),         GPIO_FN(LCDD8),
-       GPIO_FN(LCDD9),         GPIO_FN(LCDD10),        GPIO_FN(LCDD11),
-       GPIO_FN(LCDD12),        GPIO_FN(LCDD13),        GPIO_FN(LCDD14),
-       GPIO_FN(LCDD15),        GPIO_FN(LCDD16),        GPIO_FN(LCDD17),
-       GPIO_FN(LCDD18),        GPIO_FN(LCDD19),        GPIO_FN(LCDD20),
-       GPIO_FN(LCDD21),        GPIO_FN(LCDD22),        GPIO_FN(LCDD23),
-
-       GPIO_FN(LCDC0_SELECT),
-       GPIO_FN(LCDC1_SELECT),
-
-       /* IRDA */
-       GPIO_FN(IRDA_OUT),      GPIO_FN(IRDA_IN),       GPIO_FN(IRDA_FIRSEL),
-       GPIO_FN(IROUT_139),     GPIO_FN(IROUT_140),
-
-       /* TSIF1 */
-       GPIO_FN(TS0_1SELECT),
-       GPIO_FN(TS0_2SELECT),
-       GPIO_FN(TS1_1SELECT),
-       GPIO_FN(TS1_2SELECT),
-
-       GPIO_FN(TS_SPSYNC1),    GPIO_FN(TS_SDAT1),
-       GPIO_FN(TS_SDEN1),      GPIO_FN(TS_SCK1),
-
-       /* TSIF2 */
-       GPIO_FN(TS_SPSYNC2),    GPIO_FN(TS_SDAT2),
-       GPIO_FN(TS_SDEN2),      GPIO_FN(TS_SCK2),
-
-       /* HDMI */
-       GPIO_FN(HDMI_HPD),      GPIO_FN(HDMI_CEC),
-
-       /* SDENC */
-       GPIO_FN(SDENC_CPG),
-       GPIO_FN(SDENC_DV_CLKI),
-};
+#undef PORTCR
+#define PORTCR(nr, reg)                                                        \
+       {                                                               \
+               PINMUX_CFG_REG("PORT" nr "CR", reg, 8, 4) {             \
+                       _PCRH(PORT##nr##_IN, 0, 0, PORT##nr##_OUT),     \
+                               PORT##nr##_FN0, PORT##nr##_FN1,         \
+                               PORT##nr##_FN2, PORT##nr##_FN3,         \
+                               PORT##nr##_FN4, PORT##nr##_FN5,         \
+                               PORT##nr##_FN6, PORT##nr##_FN7 }        \
+       }
 
 static const struct pinmux_cfg_reg pinmux_config_regs[] = {
        PORTCR(0,       0xE6051000), /* PORT0CR */
@@ -1776,45 +2546,114 @@ static const 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 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),
+       PINMUX_IRQ(EXT_IRQ16L(0), 6, 162),
+       PINMUX_IRQ(EXT_IRQ16L(1), 12),
+       PINMUX_IRQ(EXT_IRQ16L(2), 4, 5),
+       PINMUX_IRQ(EXT_IRQ16L(3), 8, 16),
+       PINMUX_IRQ(EXT_IRQ16L(4), 17, 163),
+       PINMUX_IRQ(EXT_IRQ16L(5), 18),
+       PINMUX_IRQ(EXT_IRQ16L(6), 39, 164),
+       PINMUX_IRQ(EXT_IRQ16L(7), 40, 167),
+       PINMUX_IRQ(EXT_IRQ16L(8), 41, 168),
+       PINMUX_IRQ(EXT_IRQ16L(9), 42, 169),
+       PINMUX_IRQ(EXT_IRQ16L(10), 65),
+       PINMUX_IRQ(EXT_IRQ16L(11), 67),
+       PINMUX_IRQ(EXT_IRQ16L(12), 80, 137),
+       PINMUX_IRQ(EXT_IRQ16L(13), 81, 145),
+       PINMUX_IRQ(EXT_IRQ16L(14), 82, 146),
+       PINMUX_IRQ(EXT_IRQ16L(15), 83, 147),
+       PINMUX_IRQ(EXT_IRQ16H(16), 84, 170),
+       PINMUX_IRQ(EXT_IRQ16H(17), 85),
+       PINMUX_IRQ(EXT_IRQ16H(18), 86),
+       PINMUX_IRQ(EXT_IRQ16H(19), 87),
+       PINMUX_IRQ(EXT_IRQ16H(20), 92),
+       PINMUX_IRQ(EXT_IRQ16H(21), 93),
+       PINMUX_IRQ(EXT_IRQ16H(22), 94),
+       PINMUX_IRQ(EXT_IRQ16H(23), 95),
+       PINMUX_IRQ(EXT_IRQ16H(24), 112),
+       PINMUX_IRQ(EXT_IRQ16H(25), 119),
+       PINMUX_IRQ(EXT_IRQ16H(26), 121, 172),
+       PINMUX_IRQ(EXT_IRQ16H(27), 122, 180),
+       PINMUX_IRQ(EXT_IRQ16H(28), 123, 181),
+       PINMUX_IRQ(EXT_IRQ16H(29), 129, 182),
+       PINMUX_IRQ(EXT_IRQ16H(30), 130, 183),
+       PINMUX_IRQ(EXT_IRQ16H(31), 138, 184),
+};
+
+#define PORTnCR_PULMD_OFF      (0 << 6)
+#define PORTnCR_PULMD_DOWN     (2 << 6)
+#define PORTnCR_PULMD_UP       (3 << 6)
+#define PORTnCR_PULMD_MASK     (3 << 6)
+
+struct sh7372_portcr_group {
+       unsigned int end_pin;
+       unsigned int offset;
+};
+
+static const struct sh7372_portcr_group sh7372_portcr_offsets[] = {
+       { 45,  0x1000 }, { 75,  0x2000 }, { 99,  0x0000 }, { 120, 0x3000 },
+       { 151, 0x0000 }, { 155, 0x3000 }, { 166, 0x0000 }, { 190, 0x2000 },
+};
+
+static void __iomem *sh7372_pinmux_portcr(struct sh_pfc *pfc, unsigned int pin)
+{
+       unsigned int i;
+
+       for (i = 0; i < ARRAY_SIZE(sh7372_portcr_offsets); ++i) {
+               const struct sh7372_portcr_group *group =
+                       &sh7372_portcr_offsets[i];
+
+               if (i <= group->end_pin)
+                       return pfc->window->virt + group->offset + pin;
+       }
+
+       return NULL;
+}
+
+static unsigned int sh7372_pinmux_get_bias(struct sh_pfc *pfc, unsigned int pin)
+{
+       void __iomem *addr = sh7372_pinmux_portcr(pfc, 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 sh7372_pinmux_set_bias(struct sh_pfc *pfc, unsigned int pin,
+                                  unsigned int bias)
+{
+       void __iomem *addr = sh7372_pinmux_portcr(pfc, 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 sh7372_pinmux_ops = {
+       .get_bias = sh7372_pinmux_get_bias,
+       .set_bias = sh7372_pinmux_set_bias,
 };
 
 const struct sh_pfc_soc_info sh7372_pinmux_info = {
        .name = "sh7372_pfc",
+       .ops = &sh7372_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 },
        .function = { PINMUX_FUNCTION_BEGIN, PINMUX_FUNCTION_END },
 
@@ -1825,9 +2664,6 @@ const struct sh_pfc_soc_info sh7372_pinmux_info = {
        .functions = pinmux_functions,
        .nr_functions = ARRAY_SIZE(pinmux_functions),
 
-       .func_gpios = pinmux_func_gpios,
-       .nr_func_gpios = ARRAY_SIZE(pinmux_func_gpios),
-
        .cfg_regs = pinmux_config_regs,
        .data_regs = pinmux_data_regs,
 
index 587f7772abf2aa46b8608115829aad85d9cb500a..7956df58d751a3231db71b2c4f8c00f0cb231b7d 100644 (file)
  */
 #include <linux/io.h>
 #include <linux/kernel.h>
+#include <linux/module.h>
 #include <linux/pinctrl/pinconf-generic.h>
+#include <linux/regulator/driver.h>
+#include <linux/regulator/machine.h>
+#include <linux/slab.h>
 
-#include <mach/sh73a0.h>
 #include <mach/irqs.h>
 
 #include "core.h"
@@ -2538,6 +2541,157 @@ static const unsigned int sdhi2_ctrl_pins[] = {
 static const unsigned int sdhi2_ctrl_mux[] = {
        SDHICMD2_MARK, SDHICLK2_MARK,
 };
+/* - TPU0 ------------------------------------------------------------------- */
+static const unsigned int tpu0_to0_pins[] = {
+       /* TO */
+       55,
+};
+static const unsigned int tpu0_to0_mux[] = {
+       TPU0TO0_MARK,
+};
+static const unsigned int tpu0_to1_pins[] = {
+       /* TO */
+       59,
+};
+static const unsigned int tpu0_to1_mux[] = {
+       TPU0TO1_MARK,
+};
+static const unsigned int tpu0_to2_pins[] = {
+       /* TO */
+       140,
+};
+static const unsigned int tpu0_to2_mux[] = {
+       TPU0TO2_MARK,
+};
+static const unsigned int tpu0_to3_pins[] = {
+       /* TO */
+       141,
+};
+static const unsigned int tpu0_to3_mux[] = {
+       TPU0TO3_MARK,
+};
+/* - TPU1 ------------------------------------------------------------------- */
+static const unsigned int tpu1_to0_pins[] = {
+       /* TO */
+       246,
+};
+static const unsigned int tpu1_to0_mux[] = {
+       TPU1TO0_MARK,
+};
+static const unsigned int tpu1_to1_0_pins[] = {
+       /* TO */
+       28,
+};
+static const unsigned int tpu1_to1_0_mux[] = {
+       PORT28_TPU1TO1_MARK,
+};
+static const unsigned int tpu1_to1_1_pins[] = {
+       /* TO */
+       29,
+};
+static const unsigned int tpu1_to1_1_mux[] = {
+       PORT29_TPU1TO1_MARK,
+};
+static const unsigned int tpu1_to2_pins[] = {
+       /* TO */
+       153,
+};
+static const unsigned int tpu1_to2_mux[] = {
+       TPU1TO2_MARK,
+};
+static const unsigned int tpu1_to3_pins[] = {
+       /* TO */
+       145,
+};
+static const unsigned int tpu1_to3_mux[] = {
+       TPU1TO3_MARK,
+};
+/* - TPU2 ------------------------------------------------------------------- */
+static const unsigned int tpu2_to0_pins[] = {
+       /* TO */
+       248,
+};
+static const unsigned int tpu2_to0_mux[] = {
+       TPU2TO0_MARK,
+};
+static const unsigned int tpu2_to1_pins[] = {
+       /* TO */
+       197,
+};
+static const unsigned int tpu2_to1_mux[] = {
+       TPU2TO1_MARK,
+};
+static const unsigned int tpu2_to2_pins[] = {
+       /* TO */
+       50,
+};
+static const unsigned int tpu2_to2_mux[] = {
+       TPU2TO2_MARK,
+};
+static const unsigned int tpu2_to3_pins[] = {
+       /* TO */
+       51,
+};
+static const unsigned int tpu2_to3_mux[] = {
+       TPU2TO3_MARK,
+};
+/* - TPU3 ------------------------------------------------------------------- */
+static const unsigned int tpu3_to0_pins[] = {
+       /* TO */
+       163,
+};
+static const unsigned int tpu3_to0_mux[] = {
+       TPU3TO0_MARK,
+};
+static const unsigned int tpu3_to1_pins[] = {
+       /* TO */
+       247,
+};
+static const unsigned int tpu3_to1_mux[] = {
+       TPU3TO1_MARK,
+};
+static const unsigned int tpu3_to2_pins[] = {
+       /* TO */
+       54,
+};
+static const unsigned int tpu3_to2_mux[] = {
+       TPU3TO2_MARK,
+};
+static const unsigned int tpu3_to3_pins[] = {
+       /* TO */
+       53,
+};
+static const unsigned int tpu3_to3_mux[] = {
+       TPU3TO3_MARK,
+};
+/* - TPU4 ------------------------------------------------------------------- */
+static const unsigned int tpu4_to0_pins[] = {
+       /* TO */
+       241,
+};
+static const unsigned int tpu4_to0_mux[] = {
+       TPU4TO0_MARK,
+};
+static const unsigned int tpu4_to1_pins[] = {
+       /* TO */
+       199,
+};
+static const unsigned int tpu4_to1_mux[] = {
+       TPU4TO1_MARK,
+};
+static const unsigned int tpu4_to2_pins[] = {
+       /* TO */
+       58,
+};
+static const unsigned int tpu4_to2_mux[] = {
+       TPU4TO2_MARK,
+};
+static const unsigned int tpu4_to3_pins[] = {
+       /* TO */
+};
+static const unsigned int tpu4_to3_mux[] = {
+       TPU4TO3_MARK,
+};
 /* - USB -------------------------------------------------------------------- */
 static const unsigned int usb_vbus_pins[] = {
        /* VBUS */
@@ -2689,6 +2843,27 @@ static const struct sh_pfc_pin_group pinmux_groups[] = {
        SH_PFC_PIN_GROUP(sdhi2_data1),
        SH_PFC_PIN_GROUP(sdhi2_data4),
        SH_PFC_PIN_GROUP(sdhi2_ctrl),
+       SH_PFC_PIN_GROUP(tpu0_to0),
+       SH_PFC_PIN_GROUP(tpu0_to1),
+       SH_PFC_PIN_GROUP(tpu0_to2),
+       SH_PFC_PIN_GROUP(tpu0_to3),
+       SH_PFC_PIN_GROUP(tpu1_to0),
+       SH_PFC_PIN_GROUP(tpu1_to1_0),
+       SH_PFC_PIN_GROUP(tpu1_to1_1),
+       SH_PFC_PIN_GROUP(tpu1_to2),
+       SH_PFC_PIN_GROUP(tpu1_to3),
+       SH_PFC_PIN_GROUP(tpu2_to0),
+       SH_PFC_PIN_GROUP(tpu2_to1),
+       SH_PFC_PIN_GROUP(tpu2_to2),
+       SH_PFC_PIN_GROUP(tpu2_to3),
+       SH_PFC_PIN_GROUP(tpu3_to0),
+       SH_PFC_PIN_GROUP(tpu3_to1),
+       SH_PFC_PIN_GROUP(tpu3_to2),
+       SH_PFC_PIN_GROUP(tpu3_to3),
+       SH_PFC_PIN_GROUP(tpu4_to0),
+       SH_PFC_PIN_GROUP(tpu4_to1),
+       SH_PFC_PIN_GROUP(tpu4_to2),
+       SH_PFC_PIN_GROUP(tpu4_to3),
        SH_PFC_PIN_GROUP(usb_vbus),
 };
 
@@ -2908,6 +3083,42 @@ static const char * const usb_groups[] = {
        "usb_vbus",
 };
 
+static const char * const tpu0_groups[] = {
+       "tpu0_to0",
+       "tpu0_to1",
+       "tpu0_to2",
+       "tpu0_to3",
+};
+
+static const char * const tpu1_groups[] = {
+       "tpu1_to0",
+       "tpu1_to1_0",
+       "tpu1_to1_1",
+       "tpu1_to2",
+       "tpu1_to3",
+};
+
+static const char * const tpu2_groups[] = {
+       "tpu2_to0",
+       "tpu2_to1",
+       "tpu2_to2",
+       "tpu2_to3",
+};
+
+static const char * const tpu3_groups[] = {
+       "tpu3_to0",
+       "tpu3_to1",
+       "tpu3_to2",
+       "tpu3_to3",
+};
+
+static const char * const tpu4_groups[] = {
+       "tpu4_to0",
+       "tpu4_to1",
+       "tpu4_to2",
+       "tpu4_to3",
+};
+
 static const struct sh_pfc_function pinmux_functions[] = {
        SH_PFC_FUNCTION(bsc),
        SH_PFC_FUNCTION(fsia),
@@ -2933,400 +3144,14 @@ static const struct sh_pfc_function pinmux_functions[] = {
        SH_PFC_FUNCTION(sdhi0),
        SH_PFC_FUNCTION(sdhi1),
        SH_PFC_FUNCTION(sdhi2),
+       SH_PFC_FUNCTION(tpu0),
+       SH_PFC_FUNCTION(tpu1),
+       SH_PFC_FUNCTION(tpu2),
+       SH_PFC_FUNCTION(tpu3),
+       SH_PFC_FUNCTION(tpu4),
        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(GPI0),
-       GPIO_FN(GPI1),
-       GPIO_FN(GPI2),
-       GPIO_FN(GPI3),
-       GPIO_FN(GPI4),
-       GPIO_FN(GPI5),
-       GPIO_FN(GPI6),
-       GPIO_FN(GPI7),
-       GPIO_FN(GPO7), \
-       GPIO_FN(MFG0_OUT2),
-       GPIO_FN(GPO6), \
-       GPIO_FN(MFG1_OUT2),
-       GPIO_FN(GPO5), \
-       GPIO_FN(PORT16_VIO_CKOR),
-       GPIO_FN(PORT19_VIO_CKO2),
-       GPIO_FN(GPO0),
-       GPIO_FN(GPO1),
-       GPIO_FN(GPO2), \
-       GPIO_FN(STATUS0),
-       GPIO_FN(GPO3), \
-       GPIO_FN(STATUS1),
-       GPIO_FN(GPO4), \
-       GPIO_FN(STATUS2),
-       GPIO_FN(VINT),
-       GPIO_FN(TCKON),
-       GPIO_FN(XDVFS1), \
-       GPIO_FN(MFG0_OUT1), \
-       GPIO_FN(PORT27_IROUT),
-       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(XWUP),
-       GPIO_FN(VACK),
-       GPIO_FN(XTAL1L),
-       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(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(FRB),
-       GPIO_FN(CKO),
-       GPIO_FN(NBRSTOUT_),
-       GPIO_FN(NBRST_),
-       GPIO_FN(BBIF2_TXD),
-       GPIO_FN(BBIF2_RXD),
-       GPIO_FN(BBIF2_SYNC),
-       GPIO_FN(BBIF2_SCK),
-       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(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(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(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(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(BBIF2_TSYNC1),
-       GPIO_FN(BBIF2_TSCK1),
-       GPIO_FN(BBIF2_TXD1),
-       GPIO_FN(MFG2_OUT2), \
-       GPIO_FN(TPU2TO1),
-       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(DREQ3), \
-       GPIO_FN(MSIOF0L_TSCK), \
-       GPIO_FN(VIO2_CLK3), \
-       GPIO_FN(DREQ1), \
-       GPIO_FN(PWEN), \
-       GPIO_FN(MSIOF0L_RXD), \
-       GPIO_FN(VIO2_HD3), \
-       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(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(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(MSIOF2R_TSYNC),
-       GPIO_FN(SDHICLK0),
-       GPIO_FN(SDHICD0),
-       GPIO_FN(SDHID0_0),
-       GPIO_FN(SDHID0_1),
-       GPIO_FN(SDHID0_2),
-       GPIO_FN(SDHID0_3),
-       GPIO_FN(SDHICMD0),
-       GPIO_FN(SDHIWP0),
-       GPIO_FN(SDHICLK1),
-       GPIO_FN(SDHID1_0), \
-       GPIO_FN(TS_SPSYNC2),
-       GPIO_FN(SDHID1_1), \
-       GPIO_FN(TS_SDAT2),
-       GPIO_FN(SDHID1_2), \
-       GPIO_FN(TS_SDEN2),
-       GPIO_FN(SDHID1_3), \
-       GPIO_FN(TS_SCK2),
-       GPIO_FN(SDHICMD1),
-       GPIO_FN(SDHICLK2),
-       GPIO_FN(SDHID2_0), \
-       GPIO_FN(TS_SPSYNC4),
-       GPIO_FN(SDHID2_1), \
-       GPIO_FN(TS_SDAT4),
-       GPIO_FN(SDHID2_2), \
-       GPIO_FN(TS_SDEN4),
-       GPIO_FN(SDHID2_3), \
-       GPIO_FN(TS_SCK4),
-       GPIO_FN(SDHICMD2),
-       GPIO_FN(MMCCLK0),
-       GPIO_FN(MMCD0_0),
-       GPIO_FN(MMCD0_1),
-       GPIO_FN(MMCD0_2),
-       GPIO_FN(MMCD0_3),
-       GPIO_FN(MMCD0_4), \
-       GPIO_FN(TS_SPSYNC5),
-       GPIO_FN(MMCD0_5), \
-       GPIO_FN(TS_SDAT5),
-       GPIO_FN(MMCD0_6), \
-       GPIO_FN(TS_SDEN5),
-       GPIO_FN(MMCD0_7), \
-       GPIO_FN(TS_SCK5),
-       GPIO_FN(MMCCMD0),
-       GPIO_FN(RESETOUTS_), \
-       GPIO_FN(EXTAL2OUT),
-       GPIO_FN(MCP_WAIT__MCP_FRB),
-       GPIO_FN(MCP_CKO), \
-       GPIO_FN(MMCCLK1),
-       GPIO_FN(MCP_D15_MCP_NAF15),
-       GPIO_FN(MCP_D14_MCP_NAF14),
-       GPIO_FN(MCP_D13_MCP_NAF13),
-       GPIO_FN(MCP_D12_MCP_NAF12),
-       GPIO_FN(MCP_D11_MCP_NAF11),
-       GPIO_FN(MCP_D10_MCP_NAF10),
-       GPIO_FN(MCP_D9_MCP_NAF9),
-       GPIO_FN(MCP_D8_MCP_NAF8), \
-       GPIO_FN(MMCCMD1),
-       GPIO_FN(MCP_D7_MCP_NAF7), \
-       GPIO_FN(MMCD1_7),
-
-       GPIO_FN(MCP_D6_MCP_NAF6), \
-       GPIO_FN(MMCD1_6),
-       GPIO_FN(MCP_D5_MCP_NAF5), \
-       GPIO_FN(MMCD1_5),
-       GPIO_FN(MCP_D4_MCP_NAF4), \
-       GPIO_FN(MMCD1_4),
-       GPIO_FN(MCP_D3_MCP_NAF3), \
-       GPIO_FN(MMCD1_3),
-       GPIO_FN(MCP_D2_MCP_NAF2), \
-       GPIO_FN(MMCD1_2),
-       GPIO_FN(MCP_D1_MCP_NAF1), \
-       GPIO_FN(MMCD1_1),
-       GPIO_FN(MCP_D0_MCP_NAF0), \
-       GPIO_FN(MMCD1_0),
-       GPIO_FN(MCP_NBRSTOUT_),
-       GPIO_FN(MCP_WE0__MCP_FWE), \
-       GPIO_FN(MCP_RDWR_MCP_FWE),
-
-       /* MSEL2 special cases */
-       GPIO_FN(TSIF2_TS_XX1),
-       GPIO_FN(TSIF2_TS_XX2),
-       GPIO_FN(TSIF2_TS_XX3),
-       GPIO_FN(TSIF2_TS_XX4),
-       GPIO_FN(TSIF2_TS_XX5),
-       GPIO_FN(TSIF1_TS_XX1),
-       GPIO_FN(TSIF1_TS_XX2),
-       GPIO_FN(TSIF1_TS_XX3),
-       GPIO_FN(TSIF1_TS_XX4),
-       GPIO_FN(TSIF1_TS_XX5),
-       GPIO_FN(TSIF0_TS_XX1),
-       GPIO_FN(TSIF0_TS_XX2),
-       GPIO_FN(TSIF0_TS_XX3),
-       GPIO_FN(TSIF0_TS_XX4),
-       GPIO_FN(TSIF0_TS_XX5),
-       GPIO_FN(MST1_TS_XX1),
-       GPIO_FN(MST1_TS_XX2),
-       GPIO_FN(MST1_TS_XX3),
-       GPIO_FN(MST1_TS_XX4),
-       GPIO_FN(MST1_TS_XX5),
-       GPIO_FN(MST0_TS_XX1),
-       GPIO_FN(MST0_TS_XX2),
-       GPIO_FN(MST0_TS_XX3),
-       GPIO_FN(MST0_TS_XX4),
-       GPIO_FN(MST0_TS_XX5),
-
-       /* MSEL3 special cases */
-       GPIO_FN(SDHI0_VCCQ_MC0_ON),
-       GPIO_FN(SDHI0_VCCQ_MC0_OFF),
-       GPIO_FN(DEBUG_MON_VIO),
-       GPIO_FN(DEBUG_MON_LCDD),
-       GPIO_FN(LCDC_LCDC0),
-       GPIO_FN(LCDC_LCDC1),
-
-       /* MSEL4 special cases */
-       GPIO_FN(IRQ9_MEM_INT),
-       GPIO_FN(IRQ9_MCP_INT),
-       GPIO_FN(A11),
-       GPIO_FN(TPU4TO3),
-       GPIO_FN(RESETA_N_PU_ON),
-       GPIO_FN(RESETA_N_PU_OFF),
-       GPIO_FN(EDBGREQ_PD),
-       GPIO_FN(EDBGREQ_PU),
-};
-
 #undef PORTCR
 #define PORTCR(nr, reg)                                                        \
        {                                                               \
@@ -3888,6 +3713,92 @@ static const struct pinmux_irq pinmux_irqs[] = {
        PINMUX_IRQ(EXT_IRQ16L(9), 308),
 };
 
+/* -----------------------------------------------------------------------------
+ * VCCQ MC0 regulator
+ */
+
+static void sh73a0_vccq_mc0_endisable(struct regulator_dev *reg, bool enable)
+{
+       struct sh_pfc *pfc = reg->reg_data;
+       void __iomem *addr = pfc->window[1].virt + 4;
+       unsigned long flags;
+       u32 value;
+
+       spin_lock_irqsave(&pfc->lock, flags);
+
+       value = ioread32(addr);
+
+       if (enable)
+               value |= BIT(28);
+       else
+               value &= ~BIT(28);
+
+       iowrite32(value, addr);
+
+       spin_unlock_irqrestore(&pfc->lock, flags);
+}
+
+static int sh73a0_vccq_mc0_enable(struct regulator_dev *reg)
+{
+       sh73a0_vccq_mc0_endisable(reg, true);
+       return 0;
+}
+
+static int sh73a0_vccq_mc0_disable(struct regulator_dev *reg)
+{
+       sh73a0_vccq_mc0_endisable(reg, false);
+       return 0;
+}
+
+static int sh73a0_vccq_mc0_is_enabled(struct regulator_dev *reg)
+{
+       struct sh_pfc *pfc = reg->reg_data;
+       void __iomem *addr = pfc->window[1].virt + 4;
+       unsigned long flags;
+       u32 value;
+
+       spin_lock_irqsave(&pfc->lock, flags);
+       value = ioread32(addr);
+       spin_unlock_irqrestore(&pfc->lock, flags);
+
+       return !!(value & BIT(28));
+}
+
+static int sh73a0_vccq_mc0_get_voltage(struct regulator_dev *reg)
+{
+       return 3300000;
+}
+
+static struct regulator_ops sh73a0_vccq_mc0_ops = {
+       .enable = sh73a0_vccq_mc0_enable,
+       .disable = sh73a0_vccq_mc0_disable,
+       .is_enabled = sh73a0_vccq_mc0_is_enabled,
+       .get_voltage = sh73a0_vccq_mc0_get_voltage,
+};
+
+static const struct regulator_desc sh73a0_vccq_mc0_desc = {
+       .owner = THIS_MODULE,
+       .name = "vccq_mc0",
+       .type = REGULATOR_VOLTAGE,
+       .ops = &sh73a0_vccq_mc0_ops,
+};
+
+static struct regulator_consumer_supply sh73a0_vccq_mc0_consumers[] = {
+       REGULATOR_SUPPLY("vqmmc", "sh_mobile_sdhi.0"),
+};
+
+static const struct regulator_init_data sh73a0_vccq_mc0_init_data = {
+       .constraints = {
+               .valid_ops_mask = REGULATOR_CHANGE_STATUS,
+       },
+       .num_consumer_supplies = ARRAY_SIZE(sh73a0_vccq_mc0_consumers),
+       .consumer_supplies = sh73a0_vccq_mc0_consumers,
+};
+
+/* -----------------------------------------------------------------------------
+ * Pin bias
+ */
+
 #define PORTnCR_PULMD_OFF      (0 << 6)
 #define PORTnCR_PULMD_DOWN     (2 << 6)
 #define PORTnCR_PULMD_UP       (3 << 6)
@@ -3934,7 +3845,51 @@ static void sh73a0_pinmux_set_bias(struct sh_pfc *pfc, unsigned int pin,
        iowrite8(value, addr);
 }
 
+/* -----------------------------------------------------------------------------
+ * SoC information
+ */
+
+struct sh73a0_pinmux_data {
+       struct regulator_dev *vccq_mc0;
+};
+
+static int sh73a0_pinmux_soc_init(struct sh_pfc *pfc)
+{
+       struct sh73a0_pinmux_data *data;
+       struct regulator_config cfg = { };
+       int ret;
+
+       data = devm_kzalloc(pfc->dev, sizeof(*data), GFP_KERNEL);
+       if (data == NULL)
+               return -ENOMEM;
+
+       cfg.dev = pfc->dev;
+       cfg.init_data = &sh73a0_vccq_mc0_init_data;
+       cfg.driver_data = pfc;
+
+       data->vccq_mc0 = regulator_register(&sh73a0_vccq_mc0_desc, &cfg);
+       if (IS_ERR(data->vccq_mc0)) {
+               ret = PTR_ERR(data->vccq_mc0);
+               dev_err(pfc->dev, "Failed to register VCCQ MC0 regulator: %d\n",
+                       ret);
+               return ret;
+       }
+
+       pfc->soc_data = data;
+
+       return 0;
+}
+
+static void sh73a0_pinmux_soc_exit(struct sh_pfc *pfc)
+{
+       struct sh73a0_pinmux_data *data = pfc->soc_data;
+
+       regulator_unregister(data->vccq_mc0);
+}
+
 static const struct sh_pfc_soc_operations sh73a0_pinmux_ops = {
+       .init = sh73a0_pinmux_soc_init,
+       .exit = sh73a0_pinmux_soc_exit,
        .get_bias = sh73a0_pinmux_get_bias,
        .set_bias = sh73a0_pinmux_set_bias,
 };
@@ -3956,9 +3911,6 @@ const struct sh_pfc_soc_info sh73a0_pinmux_info = {
        .functions = pinmux_functions,
        .nr_functions = ARRAY_SIZE(pinmux_functions),
 
-       .func_gpios = pinmux_func_gpios,
-       .nr_func_gpios = ARRAY_SIZE(pinmux_func_gpios),
-
        .cfg_regs = pinmux_config_regs,
        .data_regs = pinmux_data_regs,
 
index 3b785fc428d5b1c9211c19fbceb0f763a721e385..830ae1ffd0b5e4d46495523415d888e8bbd72315 100644 (file)
@@ -11,8 +11,8 @@
 #ifndef __SH_PFC_H
 #define __SH_PFC_H
 
+#include <linux/bug.h>
 #include <linux/stringify.h>
-#include <asm-generic/gpio.h>
 
 typedef unsigned short pinmux_enum_t;
 
@@ -129,6 +129,8 @@ struct pinmux_range {
 struct sh_pfc;
 
 struct sh_pfc_soc_operations {
+       int (*init)(struct sh_pfc *pfc);
+       void (*exit)(struct sh_pfc *pfc);
        unsigned int (*get_bias)(struct sh_pfc *pfc, unsigned int pin);
        void (*set_bias)(struct sh_pfc *pfc, unsigned int pin,
                         unsigned int bias);
index 93c06588ddca58a18ec85025e0ef26f4e1945b3a..ad6863a76af9bd5201796d73591cf17bb127cd76 100644 (file)
@@ -274,11 +274,17 @@ static void coh901331_shutdown(struct platform_device *pdev)
        clk_disable_unprepare(rtap->clk);
 }
 
+static const struct of_device_id coh901331_dt_match[] = {
+       { .compatible = "stericsson,coh901331" },
+       {},
+};
+
 static struct platform_driver coh901331_driver = {
        .driver = {
                .name = "rtc-coh901331",
                .owner = THIS_MODULE,
                .pm = &coh901331_pm_ops,
+               .of_match_table = coh901331_dt_match,
        },
        .remove = __exit_p(coh901331_remove),
        .shutdown = coh901331_shutdown,
index 371cc66f1a0e9d4abfce97b8ee5fe3466cb28ad3..3b246543282f50a21a04397458097135c52693a3 100644 (file)
@@ -2083,6 +2083,7 @@ pl022_platform_data_dt_get(struct device *dev)
        }
 
        pd->bus_id = -1;
+       pd->enable_dma = 1;
        of_property_read_u32(np, "num-cs", &tmp);
        pd->num_chipselect = tmp;
        of_property_read_u32(np, "pl022,autosuspend-delay",
index 4e5c77834c50fc6586848f9b292b81456b481da6..a4a3028103e3441c533517da3cdc9ac62ad6eed9 100644 (file)
@@ -14,6 +14,7 @@
 #include <linux/platform_device.h>
 #include <linux/serial.h>
 #include <linux/serial_core.h>
+#include <linux/slab.h>
 #include <linux/tty.h>
 #include <linux/tty_flip.h>
 #include <linux/console.h>
 #define XUARTPS_SR_TXFULL      0x00000010 /* TX FIFO full */
 #define XUARTPS_SR_RXTRIG      0x00000001 /* Rx Trigger */
 
+/**
+ * struct xuartps - device data
+ * @refclk     Reference clock
+ * @aperclk    APB clock
+ */
+struct xuartps {
+       struct clk              *refclk;
+       struct clk              *aperclk;
+};
+
 /**
  * xuartps_isr - Interrupt handler
  * @irq: Irq number
@@ -936,34 +947,55 @@ static int xuartps_probe(struct platform_device *pdev)
        int rc;
        struct uart_port *port;
        struct resource *res, *res2;
-       struct clk *clk;
+       struct xuartps *xuartps_data;
 
-       clk = of_clk_get(pdev->dev.of_node, 0);
-       if (IS_ERR(clk)) {
-               dev_err(&pdev->dev, "no clock specified\n");
-               return PTR_ERR(clk);
+       xuartps_data = kzalloc(sizeof(*xuartps_data), GFP_KERNEL);
+       if (!xuartps_data)
+               return -ENOMEM;
+
+       xuartps_data->aperclk = clk_get(&pdev->dev, "aper_clk");
+       if (IS_ERR(xuartps_data->aperclk)) {
+               dev_err(&pdev->dev, "aper_clk clock not found.\n");
+               rc = PTR_ERR(xuartps_data->aperclk);
+               goto err_out_free;
+       }
+       xuartps_data->refclk = clk_get(&pdev->dev, "ref_clk");
+       if (IS_ERR(xuartps_data->refclk)) {
+               dev_err(&pdev->dev, "ref_clk clock not found.\n");
+               rc = PTR_ERR(xuartps_data->refclk);
+               goto err_out_clk_put_aper;
        }
 
-       rc = clk_prepare_enable(clk);
+       rc = clk_prepare_enable(xuartps_data->aperclk);
+       if (rc) {
+               dev_err(&pdev->dev, "Unable to enable APER clock.\n");
+               goto err_out_clk_put;
+       }
+       rc = clk_prepare_enable(xuartps_data->refclk);
        if (rc) {
-               dev_err(&pdev->dev, "could not enable clock\n");
-               return -EBUSY;
+               dev_err(&pdev->dev, "Unable to enable device clock.\n");
+               goto err_out_clk_dis_aper;
        }
 
        res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       if (!res)
-               return -ENODEV;
+       if (!res) {
+               rc = -ENODEV;
+               goto err_out_clk_disable;
+       }
 
        res2 = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
-       if (!res2)
-               return -ENODEV;
+       if (!res2) {
+               rc = -ENODEV;
+               goto err_out_clk_disable;
+       }
 
        /* Initialize the port structure */
        port = xuartps_get_port();
 
        if (!port) {
                dev_err(&pdev->dev, "Cannot get uart_port structure\n");
-               return -ENODEV;
+               rc = -ENODEV;
+               goto err_out_clk_disable;
        } else {
                /* Register the port.
                 * This function also registers this device with the tty layer
@@ -972,18 +1004,31 @@ static int xuartps_probe(struct platform_device *pdev)
                port->mapbase = res->start;
                port->irq = res2->start;
                port->dev = &pdev->dev;
-               port->uartclk = clk_get_rate(clk);
-               port->private_data = clk;
+               port->uartclk = clk_get_rate(xuartps_data->refclk);
+               port->private_data = xuartps_data;
                dev_set_drvdata(&pdev->dev, port);
                rc = uart_add_one_port(&xuartps_uart_driver, port);
                if (rc) {
                        dev_err(&pdev->dev,
                                "uart_add_one_port() failed; err=%i\n", rc);
                        dev_set_drvdata(&pdev->dev, NULL);
-                       return rc;
+                       goto err_out_clk_disable;
                }
                return 0;
        }
+
+err_out_clk_disable:
+       clk_disable_unprepare(xuartps_data->refclk);
+err_out_clk_dis_aper:
+       clk_disable_unprepare(xuartps_data->aperclk);
+err_out_clk_put:
+       clk_put(xuartps_data->refclk);
+err_out_clk_put_aper:
+       clk_put(xuartps_data->aperclk);
+err_out_free:
+       kfree(xuartps_data);
+
+       return rc;
 }
 
 /**
@@ -995,14 +1040,18 @@ static int xuartps_probe(struct platform_device *pdev)
 static int xuartps_remove(struct platform_device *pdev)
 {
        struct uart_port *port = dev_get_drvdata(&pdev->dev);
-       struct clk *clk = port->private_data;
+       struct xuartps *xuartps_data = port->private_data;
        int rc;
 
        /* Remove the xuartps port from the serial core */
        rc = uart_remove_one_port(&xuartps_uart_driver, port);
        dev_set_drvdata(&pdev->dev, NULL);
        port->mapbase = 0;
-       clk_disable_unprepare(clk);
+       clk_disable_unprepare(xuartps_data->refclk);
+       clk_disable_unprepare(xuartps_data->aperclk);
+       clk_put(xuartps_data->refclk);
+       clk_put(xuartps_data->aperclk);
+       kfree(xuartps_data);
        return rc;
 }
 
index f47f2594c9d43f337719daaaf771c2ad7e5fd9d8..d1f5cea435aac59574558220383c79fa1f797beb 100644 (file)
@@ -48,6 +48,12 @@ static int ehci_platform_reset(struct usb_hcd *hcd)
        ehci->big_endian_desc = pdata->big_endian_desc;
        ehci->big_endian_mmio = pdata->big_endian_mmio;
 
+       if (pdata->pre_setup) {
+               retval = pdata->pre_setup(hcd);
+               if (retval < 0)
+                       return retval;
+       }
+
        ehci->caps = hcd->regs + pdata->caps_offset;
        retval = ehci_setup(hcd);
        if (retval)
index 7ef3eb8617a6c7adc7775bc76a5fb0fd3d699ef8..13c09c299f159747a691662e000ca5b8855b441a 100644 (file)
@@ -180,15 +180,15 @@ config USB_MXS_PHY
          MXS Phy is used by some of the i.MX SoCs, for example imx23/28/6x.
 
 config USB_RCAR_PHY
-       tristate "Renesas R-Car USB phy support"
+       tristate "Renesas R-Car USB PHY support"
        depends on USB || USB_GADGET
        help
-         Say Y here to add support for the Renesas R-Car USB phy driver.
-         This chip is typically used as USB phy for USB host, gadget.
-         This driver supports: R8A7779
+         Say Y here to add support for the Renesas R-Car USB common PHY driver.
+         This chip is typically used as USB PHY for USB host, gadget.
+         This driver supports R8A7778 and R8A7779.
 
          To compile this driver as a module, choose M here: the
-         module will be called rcar-phy.
+         module will be called phy-rcar-usb.
 
 config USB_ULPI
        bool "Generic ULPI Transceiver Driver"
index a35681b0c5014fdbaa44cbbf97facb2f2ec74117..ae909408958dcb8a9b0efcc2866d19d0cff7571b 100644 (file)
@@ -1,8 +1,9 @@
 /*
  * Renesas R-Car USB phy driver
  *
- * Copyright (C) 2012 Renesas Solutions Corp.
+ * Copyright (C) 2012-2013 Renesas Solutions Corp.
  * 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 version 2 as
 #include <linux/platform_device.h>
 #include <linux/spinlock.h>
 #include <linux/module.h>
-
-/* USBH common register */
-#define USBPCTRL0      0x0800
-#define USBPCTRL1      0x0804
-#define USBST          0x0808
-#define USBEH0         0x080C
-#define USBOH0         0x081C
-#define USBCTL0                0x0858
-#define EIIBC1         0x0094
-#define EIIBC2         0x009C
-
+#include <linux/platform_data/usb-rcar-phy.h>
+
+/* REGS block */
+#define USBPCTRL0      0x00
+#define USBPCTRL1      0x04
+#define USBST          0x08
+#define USBEH0         0x0C
+#define USBOH0         0x1C
+#define USBCTL0                0x58
+
+/* High-speed signal quality characteristic control registers (R8A7778 only) */
+#define HSQCTL1                0x24
+#define HSQCTL2                0x28
+
+/* USBPCTRL0 */
+#define OVC2           (1 << 10) /* (R8A7779 only)                     */
+                               /* Switches the OVC input pin for port 2: */
+                               /* 1: USB_OVC2, 0: OVC2                 */
+#define OVC1_VBUS1     (1 << 9) /* Switches the OVC input pin for port 1: */
+                               /* 1: USB_OVC1, 0: OVC1/VBUS1           */
+                               /* Function mode: set to 0              */
+#define OVC0           (1 << 8) /* Switches the OVC input pin for port 0: */
+                               /* 1: USB_OVC0 pin, 0: OVC0             */
+#define OVC2_ACT       (1 << 6) /* (R8A7779 only)                      */
+                               /* Host mode: OVC2 polarity:            */
+                               /* 1: active-high, 0: active-low        */
+#define PENC           (1 << 4) /* Function mode: output level of PENC1 pin: */
+                               /* 1: high, 0: low                      */
+#define OVC0_ACT       (1 << 3) /* Host mode: OVC0 polarity:           */
+                               /* 1: active-high, 0: active-low        */
+#define OVC1_ACT       (1 << 1) /* Host mode: OVC1 polarity:           */
+                               /* 1: active-high, 0: active-low        */
+                               /* Function mode: be sure to set to 1   */
+#define PORT1          (1 << 0) /* Selects port 1 mode:                */
+                               /* 1: function, 0: host                 */
 /* USBPCTRL1 */
 #define PHY_RST                (1 << 2)
 #define PLL_ENB                (1 << 1)
@@ -58,8 +83,10 @@ static int rcar_usb_phy_init(struct usb_phy *phy)
 {
        struct rcar_usb_phy_priv *priv = usb_phy_to_priv(phy);
        struct device *dev = phy->dev;
+       struct rcar_phy_platform_data *pdata = dev->platform_data;
        void __iomem *reg0 = priv->reg0;
        void __iomem *reg1 = priv->reg1;
+       static const u8 ovcn_act[] = { OVC0_ACT, OVC1_ACT, OVC2_ACT };
        int i;
        u32 val;
        unsigned long flags;
@@ -77,7 +104,16 @@ static int rcar_usb_phy_init(struct usb_phy *phy)
                /* (2) start USB-PHY internal PLL */
                iowrite32(PHY_ENB | PLL_ENB, (reg0 + USBPCTRL1));
 
-               /* (3) USB module status check */
+               /* (3) set USB-PHY in accord with the conditions of usage */
+               if (reg1) {
+                       u32 hsqctl1 = pdata->ferrite_bead ? 0x41 : 0;
+                       u32 hsqctl2 = pdata->ferrite_bead ? 0x0d : 7;
+
+                       iowrite32(hsqctl1, reg1 + HSQCTL1);
+                       iowrite32(hsqctl2, reg1 + HSQCTL2);
+               }
+
+               /* (4) USB module status check */
                for (i = 0; i < 1024; i++) {
                        udelay(10);
                        val = ioread32(reg0 + USBST);
@@ -90,24 +126,24 @@ static int rcar_usb_phy_init(struct usb_phy *phy)
                        goto phy_init_end;
                }
 
-               /* (4) USB-PHY reset clear */
+               /* (5) USB-PHY reset clear */
                iowrite32(PHY_ENB | PLL_ENB | PHY_RST, (reg0 + USBPCTRL1));
 
-               /* set platform specific port settings */
-               iowrite32(0x00000000, (reg0 + USBPCTRL0));
-
-               /*
-                * EHCI IP internal buffer setting
-                * EHCI IP internal buffer enable
-                *
-                * These are recommended value of a datasheet
-                * see [USB :: EHCI internal buffer setting]
-                */
-               iowrite32(0x00ff0040, (reg0 + EIIBC1));
-               iowrite32(0x00ff0040, (reg1 + EIIBC1));
-
-               iowrite32(0x00000001, (reg0 + EIIBC2));
-               iowrite32(0x00000001, (reg1 + EIIBC2));
+               /* Board specific port settings */
+               val = 0;
+               if (pdata->port1_func)
+                       val |= PORT1;
+               if (pdata->penc1)
+                       val |= PENC;
+               for (i = 0; i < 3; i++) {
+                       /* OVCn bits follow each other in the right order */
+                       if (pdata->ovc_pin[i].select_3_3v)
+                               val |= OVC0 << i;
+                       /* OVCn_ACT bits are spaced by irregular intervals */
+                       if (pdata->ovc_pin[i].active_high)
+                               val |= ovcn_act[i];
+               }
+               iowrite32(val, (reg0 + USBPCTRL0));
 
                /*
                 * Bus alignment settings
@@ -134,10 +170,8 @@ static void rcar_usb_phy_shutdown(struct usb_phy *phy)
 
        spin_lock_irqsave(&priv->lock, flags);
 
-       if (priv->counter-- == 1) { /* last user */
-               iowrite32(0x00000000, (reg0 + USBPCTRL0));
+       if (priv->counter-- == 1)       /* last user */
                iowrite32(0x00000000, (reg0 + USBPCTRL1));
-       }
 
        spin_unlock_irqrestore(&priv->lock, flags);
 }
@@ -147,27 +181,29 @@ static int rcar_usb_phy_probe(struct platform_device *pdev)
        struct rcar_usb_phy_priv *priv;
        struct resource *res0, *res1;
        struct device *dev = &pdev->dev;
-       void __iomem *reg0, *reg1;
+       void __iomem *reg0, *reg1 = NULL;
        int ret;
 
+       if (!pdev->dev.platform_data) {
+               dev_err(dev, "No platform data\n");
+               return -EINVAL;
+       }
+
        res0 = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       res1 = platform_get_resource(pdev, IORESOURCE_MEM, 1);
-       if (!res0 || !res1) {
+       if (!res0) {
                dev_err(dev, "Not enough platform resources\n");
                return -EINVAL;
        }
 
-       /*
-        * CAUTION
-        *
-        * Because this phy address is also mapped under OHCI/EHCI address area,
-        * this driver can't use devm_request_and_ioremap(dev, res) here
-        */
-       reg0 = devm_ioremap_nocache(dev, res0->start, resource_size(res0));
-       reg1 = devm_ioremap_nocache(dev, res1->start, resource_size(res1));
-       if (!reg0 || !reg1) {
-               dev_err(dev, "ioremap error\n");
-               return -ENOMEM;
+       reg0 = devm_ioremap_resource(dev, res0);
+       if (IS_ERR(reg0))
+               return PTR_ERR(reg0);
+
+       res1 = platform_get_resource(pdev, IORESOURCE_MEM, 1);
+       if (res1) {
+               reg1 = devm_ioremap_resource(dev, res1);
+               if (IS_ERR(reg1))
+                       return PTR_ERR(reg1);
        }
 
        priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
index b9b8a8be6f125740e1ea70eaaf0f9e249559b845..4bd070f524e5b9ee17a0c064422358585cb86e3b 100644 (file)
@@ -354,9 +354,9 @@ static int __init coh901327_probe(struct platform_device *pdev)
 
        clk_disable(clk);
 
-       if (margin < 1 || margin > 327)
-               margin = 60;
-       coh901327_wdt.timeout = margin;
+       ret = watchdog_init_timeout(&coh901327_wdt, margin, &pdev->dev);
+       if (ret < 0)
+               coh901327_wdt.timeout = 60;
 
        ret = watchdog_register_device(&coh901327_wdt);
        if (ret == 0)
@@ -441,10 +441,16 @@ void coh901327_watchdog_reset(void)
        /* Return and await doom */
 }
 
+static const struct of_device_id coh901327_dt_match[] = {
+       { .compatible = "stericsson,coh901327" },
+       {},
+};
+
 static struct platform_driver coh901327_driver = {
        .driver = {
                .owner  = THIS_MODULE,
                .name   = "coh901327_wdog",
+               .of_match_table = coh901327_dt_match,
        },
        .remove         = __exit_p(coh901327_remove),
        .suspend        = coh901327_suspend,
diff --git a/include/dt-bindings/clock/imx6sl-clock.h b/include/dt-bindings/clock/imx6sl-clock.h
new file mode 100644 (file)
index 0000000..7fcdf90
--- /dev/null
@@ -0,0 +1,148 @@
+/*
+ * Copyright 2013 Freescale Semiconductor, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ */
+
+#ifndef __DT_BINDINGS_CLOCK_IMX6SL_H
+#define __DT_BINDINGS_CLOCK_IMX6SL_H
+
+#define IMX6SL_CLK_DUMMY               0
+#define IMX6SL_CLK_CKIL                        1
+#define IMX6SL_CLK_OSC                 2
+#define IMX6SL_CLK_PLL1_SYS            3
+#define IMX6SL_CLK_PLL2_BUS            4
+#define IMX6SL_CLK_PLL3_USB_OTG                5
+#define IMX6SL_CLK_PLL4_AUDIO          6
+#define IMX6SL_CLK_PLL5_VIDEO          7
+#define IMX6SL_CLK_PLL6_ENET           8
+#define IMX6SL_CLK_PLL7_USB_HOST       9
+#define IMX6SL_CLK_USBPHY1             10
+#define IMX6SL_CLK_USBPHY2             11
+#define IMX6SL_CLK_USBPHY1_GATE                12
+#define IMX6SL_CLK_USBPHY2_GATE                13
+#define IMX6SL_CLK_PLL4_POST_DIV       14
+#define IMX6SL_CLK_PLL5_POST_DIV       15
+#define IMX6SL_CLK_PLL5_VIDEO_DIV      16
+#define IMX6SL_CLK_ENET_REF            17
+#define IMX6SL_CLK_PLL2_PFD0           18
+#define IMX6SL_CLK_PLL2_PFD1           19
+#define IMX6SL_CLK_PLL2_PFD2           20
+#define IMX6SL_CLK_PLL3_PFD0           21
+#define IMX6SL_CLK_PLL3_PFD1           22
+#define IMX6SL_CLK_PLL3_PFD2           23
+#define IMX6SL_CLK_PLL3_PFD3           24
+#define IMX6SL_CLK_PLL2_198M           25
+#define IMX6SL_CLK_PLL3_120M           26
+#define IMX6SL_CLK_PLL3_80M            27
+#define IMX6SL_CLK_PLL3_60M            28
+#define IMX6SL_CLK_STEP                        29
+#define IMX6SL_CLK_PLL1_SW             30
+#define IMX6SL_CLK_OCRAM_ALT_SEL       31
+#define IMX6SL_CLK_OCRAM_SEL           32
+#define IMX6SL_CLK_PRE_PERIPH2_SEL     33
+#define IMX6SL_CLK_PRE_PERIPH_SEL      34
+#define IMX6SL_CLK_PERIPH2_CLK2_SEL    35
+#define IMX6SL_CLK_PERIPH_CLK2_SEL     36
+#define IMX6SL_CLK_CSI_SEL             37
+#define IMX6SL_CLK_LCDIF_AXI_SEL       38
+#define IMX6SL_CLK_USDHC1_SEL          39
+#define IMX6SL_CLK_USDHC2_SEL          40
+#define IMX6SL_CLK_USDHC3_SEL          41
+#define IMX6SL_CLK_USDHC4_SEL          42
+#define IMX6SL_CLK_SSI1_SEL            43
+#define IMX6SL_CLK_SSI2_SEL            44
+#define IMX6SL_CLK_SSI3_SEL            45
+#define IMX6SL_CLK_PERCLK_SEL          46
+#define IMX6SL_CLK_PXP_AXI_SEL         47
+#define IMX6SL_CLK_EPDC_AXI_SEL                48
+#define IMX6SL_CLK_GPU2D_OVG_SEL       49
+#define IMX6SL_CLK_GPU2D_SEL           50
+#define IMX6SL_CLK_LCDIF_PIX_SEL       51
+#define IMX6SL_CLK_EPDC_PIX_SEL                52
+#define IMX6SL_CLK_SPDIF0_SEL          53
+#define IMX6SL_CLK_SPDIF1_SEL          54
+#define IMX6SL_CLK_EXTERN_AUDIO_SEL    55
+#define IMX6SL_CLK_ECSPI_SEL           56
+#define IMX6SL_CLK_UART_SEL            57
+#define IMX6SL_CLK_PERIPH              58
+#define IMX6SL_CLK_PERIPH2             59
+#define IMX6SL_CLK_OCRAM_PODF          60
+#define IMX6SL_CLK_PERIPH_CLK2_PODF    61
+#define IMX6SL_CLK_PERIPH2_CLK2_PODF   62
+#define IMX6SL_CLK_IPG                 63
+#define IMX6SL_CLK_CSI_PODF            64
+#define IMX6SL_CLK_LCDIF_AXI_PODF      65
+#define IMX6SL_CLK_USDHC1_PODF         66
+#define IMX6SL_CLK_USDHC2_PODF         67
+#define IMX6SL_CLK_USDHC3_PODF         68
+#define IMX6SL_CLK_USDHC4_PODF         69
+#define IMX6SL_CLK_SSI1_PRED           70
+#define IMX6SL_CLK_SSI1_PODF           71
+#define IMX6SL_CLK_SSI2_PRED           72
+#define IMX6SL_CLK_SSI2_PODF           73
+#define IMX6SL_CLK_SSI3_PRED           74
+#define IMX6SL_CLK_SSI3_PODF           75
+#define IMX6SL_CLK_PERCLK              76
+#define IMX6SL_CLK_PXP_AXI_PODF                77
+#define IMX6SL_CLK_EPDC_AXI_PODF       78
+#define IMX6SL_CLK_GPU2D_OVG_PODF      79
+#define IMX6SL_CLK_GPU2D_PODF          80
+#define IMX6SL_CLK_LCDIF_PIX_PRED      81
+#define IMX6SL_CLK_EPDC_PIX_PRED       82
+#define IMX6SL_CLK_LCDIF_PIX_PODF      83
+#define IMX6SL_CLK_EPDC_PIX_PODF       84
+#define IMX6SL_CLK_SPDIF0_PRED         85
+#define IMX6SL_CLK_SPDIF0_PODF         86
+#define IMX6SL_CLK_SPDIF1_PRED         87
+#define IMX6SL_CLK_SPDIF1_PODF         88
+#define IMX6SL_CLK_EXTERN_AUDIO_PRED   89
+#define IMX6SL_CLK_EXTERN_AUDIO_PODF   90
+#define IMX6SL_CLK_ECSPI_ROOT          91
+#define IMX6SL_CLK_UART_ROOT           92
+#define IMX6SL_CLK_AHB                 93
+#define IMX6SL_CLK_MMDC_ROOT           94
+#define IMX6SL_CLK_ARM                 95
+#define IMX6SL_CLK_ECSPI1              96
+#define IMX6SL_CLK_ECSPI2              97
+#define IMX6SL_CLK_ECSPI3              98
+#define IMX6SL_CLK_ECSPI4              99
+#define IMX6SL_CLK_EPIT1               100
+#define IMX6SL_CLK_EPIT2               101
+#define IMX6SL_CLK_EXTERN_AUDIO                102
+#define IMX6SL_CLK_GPT                 103
+#define IMX6SL_CLK_GPT_SERIAL          104
+#define IMX6SL_CLK_GPU2D_OVG           105
+#define IMX6SL_CLK_I2C1                        106
+#define IMX6SL_CLK_I2C2                        107
+#define IMX6SL_CLK_I2C3                        108
+#define IMX6SL_CLK_OCOTP               109
+#define IMX6SL_CLK_CSI                 110
+#define IMX6SL_CLK_PXP_AXI             111
+#define IMX6SL_CLK_EPDC_AXI            112
+#define IMX6SL_CLK_LCDIF_AXI           113
+#define IMX6SL_CLK_LCDIF_PIX           114
+#define IMX6SL_CLK_EPDC_PIX            115
+#define IMX6SL_CLK_OCRAM               116
+#define IMX6SL_CLK_PWM1                        117
+#define IMX6SL_CLK_PWM2                        118
+#define IMX6SL_CLK_PWM3                        119
+#define IMX6SL_CLK_PWM4                        120
+#define IMX6SL_CLK_SDMA                        121
+#define IMX6SL_CLK_SPDIF               122
+#define IMX6SL_CLK_SSI1                        123
+#define IMX6SL_CLK_SSI2                        124
+#define IMX6SL_CLK_SSI3                        125
+#define IMX6SL_CLK_UART                        126
+#define IMX6SL_CLK_UART_SERIAL         127
+#define IMX6SL_CLK_USBOH3              128
+#define IMX6SL_CLK_USDHC1              129
+#define IMX6SL_CLK_USDHC2              130
+#define IMX6SL_CLK_USDHC3              131
+#define IMX6SL_CLK_USDHC4              132
+#define IMX6SL_CLK_CLK_END             133
+
+#endif /* __DT_BINDINGS_CLOCK_IMX6SL_H */
diff --git a/include/dt-bindings/clock/vf610-clock.h b/include/dt-bindings/clock/vf610-clock.h
new file mode 100644 (file)
index 0000000..15e997f
--- /dev/null
@@ -0,0 +1,163 @@
+/*
+ * Copyright 2013 Freescale Semiconductor, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ */
+
+#ifndef __DT_BINDINGS_CLOCK_VF610_H
+#define __DT_BINDINGS_CLOCK_VF610_H
+
+#define VF610_CLK_DUMMY                        0
+#define VF610_CLK_SIRC_128K            1
+#define VF610_CLK_SIRC_32K             2
+#define VF610_CLK_FIRC                 3
+#define VF610_CLK_SXOSC                        4
+#define VF610_CLK_FXOSC                        5
+#define VF610_CLK_FXOSC_HALF           6
+#define VF610_CLK_SLOW_CLK_SEL         7
+#define VF610_CLK_FASK_CLK_SEL         8
+#define VF610_CLK_AUDIO_EXT            9
+#define VF610_CLK_ENET_EXT             10
+#define VF610_CLK_PLL1_MAIN            11
+#define VF610_CLK_PLL1_PFD1            12
+#define VF610_CLK_PLL1_PFD2            13
+#define VF610_CLK_PLL1_PFD3            14
+#define VF610_CLK_PLL1_PFD4            15
+#define VF610_CLK_PLL2_MAIN            16
+#define VF610_CLK_PLL2_PFD1            17
+#define VF610_CLK_PLL2_PFD2            18
+#define VF610_CLK_PLL2_PFD3            19
+#define VF610_CLK_PLL2_PFD4            20
+#define VF610_CLK_PLL3_MAIN            21
+#define VF610_CLK_PLL3_PFD1            22
+#define VF610_CLK_PLL3_PFD2            23
+#define VF610_CLK_PLL3_PFD3            24
+#define VF610_CLK_PLL3_PFD4            25
+#define VF610_CLK_PLL4_MAIN            26
+#define VF610_CLK_PLL5_MAIN            27
+#define VF610_CLK_PLL6_MAIN            28
+#define VF610_CLK_PLL3_MAIN_DIV                29
+#define VF610_CLK_PLL4_MAIN_DIV                30
+#define VF610_CLK_PLL6_MAIN_DIV                31
+#define VF610_CLK_PLL1_PFD_SEL         32
+#define VF610_CLK_PLL2_PFD_SEL         33
+#define VF610_CLK_SYS_SEL              34
+#define VF610_CLK_DDR_SEL              35
+#define VF610_CLK_SYS_BUS              36
+#define VF610_CLK_PLATFORM_BUS         37
+#define VF610_CLK_IPG_BUS              38
+#define VF610_CLK_UART0                        39
+#define VF610_CLK_UART1                        40
+#define VF610_CLK_UART2                        41
+#define VF610_CLK_UART3                        42
+#define VF610_CLK_UART4                        43
+#define VF610_CLK_UART5                        44
+#define VF610_CLK_PIT                  45
+#define VF610_CLK_I2C0                 46
+#define VF610_CLK_I2C1                 47
+#define VF610_CLK_I2C2                 48
+#define VF610_CLK_I2C3                 49
+#define VF610_CLK_FTM0_EXT_SEL         50
+#define VF610_CLK_FTM0_FIX_SEL         51
+#define VF610_CLK_FTM0_EXT_FIX_EN      52
+#define VF610_CLK_FTM1_EXT_SEL         53
+#define VF610_CLK_FTM1_FIX_SEL         54
+#define VF610_CLK_FTM1_EXT_FIX_EN      55
+#define VF610_CLK_FTM2_EXT_SEL         56
+#define VF610_CLK_FTM2_FIX_SEL         57
+#define VF610_CLK_FTM2_EXT_FIX_EN      58
+#define VF610_CLK_FTM3_EXT_SEL         59
+#define VF610_CLK_FTM3_FIX_SEL         60
+#define VF610_CLK_FTM3_EXT_FIX_EN      61
+#define VF610_CLK_FTM0                 62
+#define VF610_CLK_FTM1                 63
+#define VF610_CLK_FTM2                 64
+#define VF610_CLK_FTM3                 65
+#define VF610_CLK_ENET_50M             66
+#define VF610_CLK_ENET_25M             67
+#define VF610_CLK_ENET_SEL             68
+#define VF610_CLK_ENET                 69
+#define VF610_CLK_ENET_TS_SEL          70
+#define VF610_CLK_ENET_TS              71
+#define VF610_CLK_DSPI0                        72
+#define VF610_CLK_DSPI1                        73
+#define VF610_CLK_DSPI2                        74
+#define VF610_CLK_DSPI3                        75
+#define VF610_CLK_WDT                  76
+#define VF610_CLK_ESDHC0_SEL           77
+#define VF610_CLK_ESDHC0_EN            78
+#define VF610_CLK_ESDHC0_DIV           79
+#define VF610_CLK_ESDHC0               80
+#define VF610_CLK_ESDHC1_SEL           81
+#define VF610_CLK_ESDHC1_EN            82
+#define VF610_CLK_ESDHC1_DIV           83
+#define VF610_CLK_ESDHC1               84
+#define VF610_CLK_DCU0_SEL             85
+#define VF610_CLK_DCU0_EN              86
+#define VF610_CLK_DCU0_DIV             87
+#define VF610_CLK_DCU0                 88
+#define VF610_CLK_DCU1_SEL             89
+#define VF610_CLK_DCU1_EN              90
+#define VF610_CLK_DCU1_DIV             91
+#define VF610_CLK_DCU1                 92
+#define VF610_CLK_ESAI_SEL             93
+#define VF610_CLK_ESAI_EN              94
+#define VF610_CLK_ESAI_DIV             95
+#define VF610_CLK_ESAI                 96
+#define VF610_CLK_SAI0_SEL             97
+#define VF610_CLK_SAI0_EN              98
+#define VF610_CLK_SAI0_DIV             99
+#define VF610_CLK_SAI0                 100
+#define VF610_CLK_SAI1_SEL             101
+#define VF610_CLK_SAI1_EN              102
+#define VF610_CLK_SAI1_DIV             103
+#define VF610_CLK_SAI1                 104
+#define VF610_CLK_SAI2_SEL             105
+#define VF610_CLK_SAI2_EN              106
+#define VF610_CLK_SAI2_DIV             107
+#define VF610_CLK_SAI2                 108
+#define VF610_CLK_SAI3_SEL             109
+#define VF610_CLK_SAI3_EN              110
+#define VF610_CLK_SAI3_DIV             111
+#define VF610_CLK_SAI3                 112
+#define VF610_CLK_USBC0                        113
+#define VF610_CLK_USBC1                        114
+#define VF610_CLK_QSPI0_SEL            115
+#define VF610_CLK_QSPI0_EN             116
+#define VF610_CLK_QSPI0_X4_DIV         117
+#define VF610_CLK_QSPI0_X2_DIV         118
+#define VF610_CLK_QSPI0_X1_DIV         119
+#define VF610_CLK_QSPI1_SEL            120
+#define VF610_CLK_QSPI1_EN             121
+#define VF610_CLK_QSPI1_X4_DIV         122
+#define VF610_CLK_QSPI1_X2_DIV         123
+#define VF610_CLK_QSPI1_X1_DIV         124
+#define VF610_CLK_QSPI0                        125
+#define VF610_CLK_QSPI1                        126
+#define VF610_CLK_NFC_SEL              127
+#define VF610_CLK_NFC_EN               128
+#define VF610_CLK_NFC_PRE_DIV          129
+#define VF610_CLK_NFC_FRAC_DIV         130
+#define VF610_CLK_NFC_INV              131
+#define VF610_CLK_NFC                  132
+#define VF610_CLK_VADC_SEL             133
+#define VF610_CLK_VADC_EN              134
+#define VF610_CLK_VADC_DIV             135
+#define VF610_CLK_VADC_DIV_HALF                136
+#define VF610_CLK_VADC                 137
+#define VF610_CLK_ADC0                 138
+#define VF610_CLK_ADC1                 139
+#define VF610_CLK_DAC0                 140
+#define VF610_CLK_DAC1                 141
+#define VF610_CLK_FLEXCAN0             142
+#define VF610_CLK_FLEXCAN1             143
+#define VF610_CLK_ASRC                 144
+#define VF610_CLK_GPU_SEL              145
+#define VF610_CLK_GPU_EN               146
+#define VF610_CLK_GPU2D                        147
+#define VF610_CLK_END                  148
+
+#endif /* __DT_BINDINGS_CLOCK_VF610_H */
diff --git a/include/linux/arm-cci.h b/include/linux/arm-cci.h
new file mode 100644 (file)
index 0000000..79d6edf
--- /dev/null
@@ -0,0 +1,61 @@
+/*
+ * CCI cache coherent interconnect support
+ *
+ * Copyright (C) 2013 ARM Ltd.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * 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 __LINUX_ARM_CCI_H
+#define __LINUX_ARM_CCI_H
+
+#include <linux/errno.h>
+#include <linux/types.h>
+
+struct device_node;
+
+#ifdef CONFIG_ARM_CCI
+extern bool cci_probed(void);
+extern int cci_ace_get_port(struct device_node *dn);
+extern int cci_disable_port_by_cpu(u64 mpidr);
+extern int __cci_control_port_by_device(struct device_node *dn, bool enable);
+extern int __cci_control_port_by_index(u32 port, bool enable);
+#else
+static inline bool cci_probed(void) { return false; }
+static inline int cci_ace_get_port(struct device_node *dn)
+{
+       return -ENODEV;
+}
+static inline int cci_disable_port_by_cpu(u64 mpidr) { return -ENODEV; }
+static inline int __cci_control_port_by_device(struct device_node *dn,
+                                              bool enable)
+{
+       return -ENODEV;
+}
+static inline int __cci_control_port_by_index(u32 port, bool enable)
+{
+       return -ENODEV;
+}
+#endif
+#define cci_disable_port_by_device(dev) \
+       __cci_control_port_by_device(dev, false)
+#define cci_enable_port_by_device(dev) \
+       __cci_control_port_by_device(dev, true)
+#define cci_disable_port_by_index(dev) \
+       __cci_control_port_by_index(dev, false)
+#define cci_enable_port_by_index(dev) \
+       __cci_control_port_by_index(dev, true)
+
+#endif
diff --git a/include/linux/clk/mvebu.h b/include/linux/clk/mvebu.h
deleted file mode 100644 (file)
index 8c4ae71..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This 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 __CLK_MVEBU_H_
-#define __CLK_MVEBU_H_
-
-void __init mvebu_clocks_init(void);
-
-#endif
index 56be7cd9aa8be535b8bca9a604e1a96444f69867..e062d317cccea96d5e6f6c236fc2cec8ef3108a1 100644 (file)
@@ -1,4 +1,5 @@
 /*
+ * Copyright (C) 2013 Xilinx Inc.
  * Copyright (C) 2012 National Instruments
  *
  * This program is free software; you can redistribute it and/or modify
 #ifndef __LINUX_CLK_ZYNQ_H_
 #define __LINUX_CLK_ZYNQ_H_
 
-void __init xilinx_zynq_clocks_init(void __iomem *slcr);
+#include <linux/spinlock.h>
 
+void zynq_clock_init(void __iomem *slcr);
+
+struct clk *clk_register_zynq_pll(const char *name, const char *parent,
+               void __iomem *pll_ctrl, void __iomem *pll_status, u8 lock_index,
+               spinlock_t *lock);
 #endif
index 0ab61320ffa8e2a239019b6169a0b2c2c3807a1c..7dd6524d2aac9becefa0103c69b60bb241a94bdf 100644 (file)
@@ -26,8 +26,7 @@
 #include <linux/kernel.h>
 #include <linux/platform_device.h>
 #include <linux/mfd/core.h>
-
-#include <mach/edma.h>
+#include <linux/platform_data/edma.h>
 
 /*
  * Register values.
diff --git a/include/linux/mfd/syscon/clps711x.h b/include/linux/mfd/syscon/clps711x.h
new file mode 100644 (file)
index 0000000..26355ab
--- /dev/null
@@ -0,0 +1,94 @@
+/*
+ *  CLPS711X system register bits definitions
+ *
+ *  Copyright (C) 2013 Alexander Shiyan <shc_work@mail.ru>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ */
+
+#ifndef _LINUX_MFD_SYSCON_CLPS711X_H_
+#define _LINUX_MFD_SYSCON_CLPS711X_H_
+
+#define SYSCON_OFFSET          (0x00)
+#define SYSFLG_OFFSET          (0x40)
+
+#define SYSCON1_KBDSCAN(x)     ((x) & 15)
+#define SYSCON1_KBDSCAN_MASK   (15)
+#define SYSCON1_TC1M           (1 << 4)
+#define SYSCON1_TC1S           (1 << 5)
+#define SYSCON1_TC2M           (1 << 6)
+#define SYSCON1_TC2S           (1 << 7)
+#define SYSCON1_BZTOG          (1 << 9)
+#define SYSCON1_BZMOD          (1 << 10)
+#define SYSCON1_DBGEN          (1 << 11)
+#define SYSCON1_LCDEN          (1 << 12)
+#define SYSCON1_CDENTX         (1 << 13)
+#define SYSCON1_CDENRX         (1 << 14)
+#define SYSCON1_SIREN          (1 << 15)
+#define SYSCON1_ADCKSEL(x)     (((x) & 3) << 16)
+#define SYSCON1_ADCKSEL_MASK   (3 << 16)
+#define SYSCON1_EXCKEN         (1 << 18)
+#define SYSCON1_WAKEDIS                (1 << 19)
+#define SYSCON1_IRTXM          (1 << 20)
+
+#define SYSCON2_SERSEL         (1 << 0)
+#define SYSCON2_KBD6           (1 << 1)
+#define SYSCON2_DRAMZ          (1 << 2)
+#define SYSCON2_KBWEN          (1 << 3)
+#define SYSCON2_SS2TXEN                (1 << 4)
+#define SYSCON2_PCCARD1                (1 << 5)
+#define SYSCON2_PCCARD2                (1 << 6)
+#define SYSCON2_SS2RXEN                (1 << 7)
+#define SYSCON2_SS2MAEN                (1 << 9)
+#define SYSCON2_OSTB           (1 << 12)
+#define SYSCON2_CLKENSL                (1 << 13)
+#define SYSCON2_BUZFREQ                (1 << 14)
+
+#define SYSCON3_ADCCON         (1 << 0)
+#define SYSCON3_CLKCTL0                (1 << 1)
+#define SYSCON3_CLKCTL1                (1 << 2)
+#define SYSCON3_DAISEL         (1 << 3)
+#define SYSCON3_ADCCKNSEN      (1 << 4)
+#define SYSCON3_VERSN(x)       (((x) >> 5) & 7)
+#define SYSCON3_VERSN_MASK     (7 << 5)
+#define SYSCON3_FASTWAKE       (1 << 8)
+#define SYSCON3_DAIEN          (1 << 9)
+#define SYSCON3_128FS          SYSCON3_DAIEN
+#define SYSCON3_ENPD67         (1 << 10)
+
+#define SYSCON_UARTEN          (1 << 8)
+
+#define SYSFLG1_MCDR           (1 << 0)
+#define SYSFLG1_DCDET          (1 << 1)
+#define SYSFLG1_WUDR           (1 << 2)
+#define SYSFLG1_WUON           (1 << 3)
+#define SYSFLG1_CTS            (1 << 8)
+#define SYSFLG1_DSR            (1 << 9)
+#define SYSFLG1_DCD            (1 << 10)
+#define SYSFLG1_NBFLG          (1 << 12)
+#define SYSFLG1_RSTFLG         (1 << 13)
+#define SYSFLG1_PFFLG          (1 << 14)
+#define SYSFLG1_CLDFLG         (1 << 15)
+#define SYSFLG1_CRXFE          (1 << 24)
+#define SYSFLG1_CTXFF          (1 << 25)
+#define SYSFLG1_SSIBUSY                (1 << 26)
+#define SYSFLG1_ID             (1 << 29)
+#define SYSFLG1_VERID(x)       (((x) >> 30) & 3)
+#define SYSFLG1_VERID_MASK     (3 << 30)
+
+#define SYSFLG2_SSRXOF         (1 << 0)
+#define SYSFLG2_RESVAL         (1 << 1)
+#define SYSFLG2_RESFRM         (1 << 2)
+#define SYSFLG2_SS2RXFE                (1 << 3)
+#define SYSFLG2_SS2TXFF                (1 << 4)
+#define SYSFLG2_SS2TXUF                (1 << 5)
+#define SYSFLG2_CKMODE         (1 << 6)
+
+#define SYSFLG_UBUSY           (1 << 11)
+#define SYSFLG_URXFE           (1 << 22)
+#define SYSFLG_UTXFF           (1 << 23)
+
+#endif
index 0506eb53519b635286be2b2c54b8a4c7e524a3d7..4c2e6f26432cfe5b0260fecb0caa5a15601482e8 100644 (file)
@@ -4,6 +4,36 @@
 #include <linux/errno.h>
 #include <linux/of.h>
 
+struct of_pci_range_parser {
+       struct device_node *node;
+       const __be32 *range;
+       const __be32 *end;
+       int np;
+       int pna;
+};
+
+struct of_pci_range {
+       u32 pci_space;
+       u64 pci_addr;
+       u64 cpu_addr;
+       u64 size;
+       u32 flags;
+};
+
+#define for_each_of_pci_range(parser, range) \
+       for (; of_pci_range_parser_one(parser, range);)
+
+static inline void of_pci_range_to_resource(struct of_pci_range *range,
+                                           struct device_node *np,
+                                           struct resource *res)
+{
+       res->flags = range->flags;
+       res->start = range->cpu_addr;
+       res->end = range->cpu_addr + range->size - 1;
+       res->parent = res->child = res->sibling = NULL;
+       res->name = np->full_name;
+}
+
 #ifdef CONFIG_OF_ADDRESS
 extern u64 of_translate_address(struct device_node *np, const __be32 *addr);
 extern bool of_can_translate_address(struct device_node *dev);
@@ -27,6 +57,11 @@ static inline unsigned long pci_address_to_pio(phys_addr_t addr) { return -1; }
 #define pci_address_to_pio pci_address_to_pio
 #endif
 
+extern int of_pci_range_parser_init(struct of_pci_range_parser *parser,
+                       struct device_node *node);
+extern struct of_pci_range *of_pci_range_parser_one(
+                                       struct of_pci_range_parser *parser,
+                                       struct of_pci_range *range);
 #else /* CONFIG_OF_ADDRESS */
 #ifndef of_address_to_resource
 static inline int of_address_to_resource(struct device_node *dev, int index,
@@ -53,6 +88,19 @@ static inline const __be32 *of_get_address(struct device_node *dev, int index,
 {
        return NULL;
 }
+
+static inline int of_pci_range_parser_init(struct of_pci_range_parser *parser,
+                       struct device_node *node)
+{
+       return -1;
+}
+
+static inline struct of_pci_range *of_pci_range_parser_one(
+                                       struct of_pci_range_parser *parser,
+                                       struct of_pci_range *range)
+{
+       return NULL;
+}
 #endif /* CONFIG_OF_ADDRESS */
 
 
index bb115deb7612815d016aa2ec99c0bbe7c1cab212..7a04826018c063fca8464deeab3f26c39f363fe0 100644 (file)
@@ -10,5 +10,7 @@ int of_irq_map_pci(const struct pci_dev *pdev, struct of_irq *out_irq);
 struct device_node;
 struct device_node *of_pci_find_child_device(struct device_node *parent,
                                             unsigned int devfn);
+int of_pci_get_devfn(struct device_node *np);
+int of_pci_parse_bus_range(struct device_node *node, struct resource *res);
 
 #endif
similarity index 59%
rename from arch/arm/mach-davinci/include/mach/edma.h
rename to include/linux/platform_data/edma.h
index 7e84c906ceff4046aef96e484d9bc0b5dd895711..2344ea2675adef3efa02f4b94fc912a159576ec5 100644 (file)
@@ -1,28 +1,12 @@
 /*
- *  TI DAVINCI dma definitions
+ *  TI EDMA definitions
  *
- *  Copyright (C) 2006-2009 Texas Instruments.
+ *  Copyright (C) 2006-2013 Texas Instruments.
  *
  *  This program is free software; you can redistribute  it and/or modify it
  *  under  the terms of  the GNU General  Public License as published by the
  *  Free Software Foundation;  either version 2 of the  License, or (at your
  *  option) any later version.
- *
- *  THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
- *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
- *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
- *  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
- *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
- *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
- *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- *  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.
- *
  */
 
 /*
@@ -69,11 +53,6 @@ struct edmacc_param {
        unsigned int ccnt;
 };
 
-#define CCINT0_INTERRUPT     16
-#define CCERRINT_INTERRUPT   17
-#define TCERRINT0_INTERRUPT   18
-#define TCERRINT1_INTERRUPT   19
-
 /* fields in edmacc_param.opt */
 #define SAM            BIT(0)
 #define DAM            BIT(1)
@@ -87,70 +66,6 @@ struct edmacc_param {
 #define TCCHEN         BIT(22)
 #define ITCCHEN                BIT(23)
 
-#define TRWORD (0x7<<2)
-#define PAENTRY (0x1ff<<5)
-
-/* Drivers should avoid using these symbolic names for dm644x
- * channels, and use platform_device IORESOURCE_DMA resources
- * instead.  (Other DaVinci chips have different peripherals
- * and thus have different DMA channel mappings.)
- */
-#define DAVINCI_DMA_MCBSP_TX              2
-#define DAVINCI_DMA_MCBSP_RX              3
-#define DAVINCI_DMA_VPSS_HIST             4
-#define DAVINCI_DMA_VPSS_H3A              5
-#define DAVINCI_DMA_VPSS_PRVU             6
-#define DAVINCI_DMA_VPSS_RSZ              7
-#define DAVINCI_DMA_IMCOP_IMXINT          8
-#define DAVINCI_DMA_IMCOP_VLCDINT         9
-#define DAVINCI_DMA_IMCO_PASQINT         10
-#define DAVINCI_DMA_IMCOP_DSQINT         11
-#define DAVINCI_DMA_SPI_SPIX             16
-#define DAVINCI_DMA_SPI_SPIR             17
-#define DAVINCI_DMA_UART0_URXEVT0        18
-#define DAVINCI_DMA_UART0_UTXEVT0        19
-#define DAVINCI_DMA_UART1_URXEVT1        20
-#define DAVINCI_DMA_UART1_UTXEVT1        21
-#define DAVINCI_DMA_UART2_URXEVT2        22
-#define DAVINCI_DMA_UART2_UTXEVT2        23
-#define DAVINCI_DMA_MEMSTK_MSEVT         24
-#define DAVINCI_DMA_MMCRXEVT             26
-#define DAVINCI_DMA_MMCTXEVT             27
-#define DAVINCI_DMA_I2C_ICREVT           28
-#define DAVINCI_DMA_I2C_ICXEVT           29
-#define DAVINCI_DMA_GPIO_GPINT0          32
-#define DAVINCI_DMA_GPIO_GPINT1          33
-#define DAVINCI_DMA_GPIO_GPINT2          34
-#define DAVINCI_DMA_GPIO_GPINT3          35
-#define DAVINCI_DMA_GPIO_GPINT4          36
-#define DAVINCI_DMA_GPIO_GPINT5          37
-#define DAVINCI_DMA_GPIO_GPINT6          38
-#define DAVINCI_DMA_GPIO_GPINT7          39
-#define DAVINCI_DMA_GPIO_GPBNKINT0       40
-#define DAVINCI_DMA_GPIO_GPBNKINT1       41
-#define DAVINCI_DMA_GPIO_GPBNKINT2       42
-#define DAVINCI_DMA_GPIO_GPBNKINT3       43
-#define DAVINCI_DMA_GPIO_GPBNKINT4       44
-#define DAVINCI_DMA_TIMER0_TINT0         48
-#define DAVINCI_DMA_TIMER1_TINT1         49
-#define DAVINCI_DMA_TIMER2_TINT2         50
-#define DAVINCI_DMA_TIMER3_TINT3         51
-#define DAVINCI_DMA_PWM0                 52
-#define DAVINCI_DMA_PWM1                 53
-#define DAVINCI_DMA_PWM2                 54
-
-/* DA830 specific EDMA3 information */
-#define EDMA_DA830_NUM_DMACH           32
-#define EDMA_DA830_NUM_TCC             32
-#define EDMA_DA830_NUM_PARAMENTRY      128
-#define EDMA_DA830_NUM_EVQUE           2
-#define EDMA_DA830_NUM_TC              2
-#define EDMA_DA830_CHMAP_EXIST         0
-#define EDMA_DA830_NUM_REGIONS         4
-#define DA830_DMACH2EVENT_MAP0         0x000FC03Fu
-#define DA830_DMACH2EVENT_MAP1         0x00000000u
-#define DA830_EDMA_ARM_OWN             0x30FFCCFFu
-
 /*ch_status paramater of callback function possible values*/
 #define DMA_COMPLETE 1
 #define DMA_CC_ERROR 2
index b253f77a7ddf6ba4db532cdbeeae43cf7b1e16df..2d8d6943281376a72195f5363cc1126560764e43 100644 (file)
 #define __GPIO_RCAR_H__
 
 struct gpio_rcar_config {
-       unsigned int gpio_base;
+       int gpio_base;
        unsigned int irq_base;
        unsigned int number_of_pins;
        const char *pctl_name;
+       unsigned has_both_edge_trigger:1;
 };
 
+#define RCAR_GP_PIN(bank, pin)         (((bank) * 32) + (pin))
+
 #endif /* __GPIO_RCAR_H__ */
diff --git a/include/linux/platform_data/pinctrl-coh901.h b/include/linux/platform_data/pinctrl-coh901.h
deleted file mode 100644 (file)
index dfbc65d..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Copyright (C) 2007-2012 ST-Ericsson AB
- * License terms: GNU General Public License (GPL) version 2
- * GPIO block resgister definitions and inline macros for
- * U300 GPIO COH 901 335 or COH 901 571/3
- * Author: Linus Walleij <linus.walleij@stericsson.com>
- */
-
-#ifndef __MACH_U300_GPIO_U300_H
-#define __MACH_U300_GPIO_U300_H
-
-/**
- * struct u300_gpio_platform - U300 GPIO platform data
- * @ports: number of GPIO block ports
- * @gpio_base: first GPIO number for this block (use a free range)
- */
-struct u300_gpio_platform {
-       u8 ports;
-       int gpio_base;
-};
-
-#endif /* __MACH_U300_GPIO_U300_H */
index 7af305b3786886ff5059fdccac2a45a92bc42fa4..8dc2fa47a2aa3c095f66f234d2975c5e18e10f53 100644 (file)
@@ -19,7 +19,7 @@
 #ifndef __ARCH_ARM_DAVINCI_SPI_H
 #define __ARCH_ARM_DAVINCI_SPI_H
 
-#include <mach/edma.h>
+#include <linux/platform_data/edma.h>
 
 #define SPI_INTERN_CS  0xFF
 
diff --git a/include/linux/platform_data/usb-rcar-phy.h b/include/linux/platform_data/usb-rcar-phy.h
new file mode 100644 (file)
index 0000000..8ec6964
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2013 Renesas Solutions Corp.
+ * 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 version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#ifndef __USB_RCAR_PHY_H
+#define __USB_RCAR_PHY_H
+
+#include <linux/types.h>
+
+struct rcar_phy_platform_data {
+       bool ferrite_bead:1;    /* (R8A7778 only)                       */
+
+       bool port1_func:1;      /* true: port 1 used by function, false: host */
+       unsigned penc1:1;       /* Output of the PENC1 pin in function mode */
+       struct {                /* Overcurrent pin control for ports 0..2 */
+               bool select_3_3v:1; /* true: USB_OVCn pin, false: OVCn pin */
+                               /* Set to false on port 1 in function mode */
+               bool active_high:1; /* true: active  high, false: active low */
+                               /* Set to true  on port 1 in function mode */
+       } ovc_pin[3];           /* (R8A7778 only has 2 ports)           */
+};
+
+#endif /* __USB_RCAR_PHY_H */
index 99238b096f7e5ae4647ec49b14d828263853a4b2..7eb4dcd0d38663ab434919bd4d4e867788a4a6a0 100644 (file)
@@ -19,6 +19,9 @@
 #ifndef __USB_CORE_EHCI_PDRIVER_H
 #define __USB_CORE_EHCI_PDRIVER_H
 
+struct platform_device;
+struct usb_hcd;
+
 /**
  * struct usb_ehci_pdata - platform_data for generic ehci driver
  *
@@ -50,6 +53,7 @@ struct usb_ehci_pdata {
        /* Turn on only VBUS suspend power and hotplug detection,
         * turn off everything else */
        void (*power_suspend)(struct platform_device *pdev);
+       int (*pre_setup)(struct usb_hcd *hcd);
 };
 
 #endif /* __USB_CORE_EHCI_PDRIVER_H */
index 484b22c5df5df80a5a69d3a8745bb37f91eb49b8..fd7c45b9ed5a3836323a4d54af31df6f2929d050 100644 (file)
@@ -14,6 +14,7 @@
 #include <linux/timer.h>
 #include <linux/interrupt.h>
 #include <linux/platform_device.h>
+#include <linux/platform_data/edma.h>
 #include <linux/i2c.h>
 #include <sound/core.h>
 #include <sound/pcm.h>
index b2f27c2e5fdcedd91bae3e21447fec946fece8a2..8460edce1c3b6b5cc90dff481e5588c75e2285ad 100644 (file)
@@ -17,6 +17,7 @@
 #include <linux/dma-mapping.h>
 #include <linux/kernel.h>
 #include <linux/genalloc.h>
+#include <linux/platform_data/edma.h>
 
 #include <sound/core.h>
 #include <sound/pcm.h>
index b6ef7039dd097b4ac99c6e9b14a0c35ed59fd203..fbb710c76c083ef90b9c442e1776ec00fcb8aa08 100644 (file)
@@ -14,7 +14,7 @@
 
 #include <linux/genalloc.h>
 #include <linux/platform_data/davinci_asp.h>
-#include <mach/edma.h>
+#include <linux/platform_data/edma.h>
 
 struct davinci_pcm_dma_params {
        int channel;                    /* sync dma channel ID */