Merge tag 'soc-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc
authorLinus Torvalds <torvalds@linux-foundation.org>
Wed, 8 Oct 2014 21:13:04 +0000 (17:13 -0400)
committerLinus Torvalds <torvalds@linux-foundation.org>
Wed, 8 Oct 2014 21:13:04 +0000 (17:13 -0400)
Pull ARM SoC platform changes from Arnd Bergmann:
 "New and updated SoC support.  Among the things new for this release
  are:

   - at91: Added support for the new SAMA5D4 SoC, following the earlier
     SAMA5D3
   - bcm: Added support for BCM63XX family of DSL SoCs
   - hisi: Added support for HiP04 server-class SoC
   - meson: Initial support for the Amlogic Meson6 (aka 8726MX) platform
   - shmobile: added support for new r8a7794 (R-Car E2) automotive SoC

  Noteworthy changes to existing SoC support are:

   - imx: convert i.MX1 to device tree
   - omap: lots of power management work
   - omap: base support to enable moving to standard UART driver
   - shmobile: lots of progress for multiplatform support, still
     ongoing"

* tag 'soc-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc: (171 commits)
  ARM: hisi: depend on ARCH_MULTI_V7
  CNS3xxx: Fix debug UART.
  ARM: at91: fix nommu build regression
  ARM: meson: add basic support for MesonX SoCs
  ARM: meson: debug: add debug UART for earlyprintk support
  irq: Export handle_fasteoi_irq
  ARM: mediatek: Add earlyprintk support for mt6589
  ARM: hisi: Fix platmcpm compilation when ARMv6 is selected
  ARM: debug: fix alphanumerical order on debug uarts
  ARM: at91: document Atmel SMART compatibles
  ARM: at91: add sama5d4 support to sama5_defconfig
  ARM: at91: dt: add device tree file for SAMA5D4ek board
  ARM: at91: dt: add device tree file for SAMA5D4 SoC
  ARM: at91: SAMA5D4 SoC detection code and low level routines
  ARM: at91: introduce basic SAMA5D4 support
  clk: at91: add a driver for the h32mx clock
  ARM: pxa3xx: provide specific platform_devices for all ssp ports
  ARM: pxa: ssp: provide platform_device_id for PXA3xx
  ARM: OMAP4+: Remove static iotable mappings for SRAM
  ARM: OMAP4+: Move SRAM data to DT
  ...

181 files changed:
Documentation/devicetree/bindings/arm/atmel-at91.txt
Documentation/devicetree/bindings/arm/bcm/bcm63138.txt [new file with mode: 0644]
Documentation/devicetree/bindings/arm/hisilicon/hisilicon.txt
Documentation/devicetree/bindings/arm/omap/mpu.txt
Documentation/devicetree/bindings/arm/tegra/nvidia,tegra20-flowctrl.txt [new file with mode: 0644]
Documentation/devicetree/bindings/clock/at91-clock.txt
Documentation/devicetree/bindings/clock/renesas,cpg-mstp-clocks.txt
Documentation/devicetree/bindings/memory-controllers/synopsys.txt [new file with mode: 0644]
MAINTAINERS
arch/arm/Kconfig
arch/arm/Kconfig.debug
arch/arm/Makefile
arch/arm/boot/dts/Makefile
arch/arm/boot/dts/am33xx.dtsi
arch/arm/boot/dts/am4372.dtsi
arch/arm/boot/dts/at91-sama5d4ek.dts [new file with mode: 0644]
arch/arm/boot/dts/bcm63138.dtsi [new file with mode: 0644]
arch/arm/boot/dts/bcm963138dvt.dts [new file with mode: 0644]
arch/arm/boot/dts/dra7.dtsi
arch/arm/boot/dts/hip04-d01.dts [new file with mode: 0644]
arch/arm/boot/dts/hip04.dtsi [new file with mode: 0644]
arch/arm/boot/dts/omap3.dtsi
arch/arm/boot/dts/omap4.dtsi
arch/arm/boot/dts/omap5.dtsi
arch/arm/boot/dts/r7s72100-genmai.dts
arch/arm/boot/dts/r7s72100.dtsi
arch/arm/boot/dts/r8a7740-armadillo800eva-reference.dts [deleted file]
arch/arm/boot/dts/r8a7740-armadillo800eva.dts
arch/arm/boot/dts/r8a7740.dtsi
arch/arm/boot/dts/r8a7778.dtsi
arch/arm/boot/dts/r8a7779-marzen.dts
arch/arm/boot/dts/r8a7779.dtsi
arch/arm/boot/dts/r8a7790-lager.dts
arch/arm/boot/dts/r8a7790.dtsi
arch/arm/boot/dts/r8a7791-koelsch.dts
arch/arm/boot/dts/r8a7791.dtsi
arch/arm/boot/dts/sama5d4.dtsi [new file with mode: 0644]
arch/arm/boot/dts/sh7372.dtsi
arch/arm/boot/dts/sh73a0-kzm9g-reference.dts
arch/arm/boot/dts/sh73a0.dtsi
arch/arm/boot/dts/zynq-7000.dtsi
arch/arm/configs/clps711x_defconfig
arch/arm/configs/hisi_defconfig [moved from arch/arm/configs/hi3xxx_defconfig with 77% similarity]
arch/arm/configs/imx_v4_v5_defconfig
arch/arm/configs/imx_v6_v7_defconfig
arch/arm/configs/multi_v7_defconfig
arch/arm/configs/omap2plus_defconfig
arch/arm/configs/sama5_defconfig
arch/arm/include/asm/mcpm.h
arch/arm/include/debug/bcm63xx.S [new file with mode: 0644]
arch/arm/include/debug/meson.S [new file with mode: 0644]
arch/arm/mach-at91/Kconfig
arch/arm/mach-at91/Makefile
arch/arm/mach-at91/board-dt-sama5.c
arch/arm/mach-at91/generic.h
arch/arm/mach-at91/include/mach/cpu.h
arch/arm/mach-at91/include/mach/debug-macro.S
arch/arm/mach-at91/include/mach/hardware.h
arch/arm/mach-at91/include/mach/sama5d4.h [new file with mode: 0644]
arch/arm/mach-at91/include/mach/uncompress.h
arch/arm/mach-at91/sama5d4.c [new file with mode: 0644]
arch/arm/mach-at91/setup.c
arch/arm/mach-at91/soc.h
arch/arm/mach-bcm/Kconfig
arch/arm/mach-bcm/Makefile
arch/arm/mach-bcm/bcm63xx.c [new file with mode: 0644]
arch/arm/mach-clps711x/board-edb7211.c
arch/arm/mach-clps711x/devices.c
arch/arm/mach-hisi/Kconfig
arch/arm/mach-hisi/Makefile
arch/arm/mach-hisi/hisilicon.c
arch/arm/mach-hisi/platmcpm.c [new file with mode: 0644]
arch/arm/mach-imx/Kconfig
arch/arm/mach-imx/Makefile
arch/arm/mach-imx/anatop.c
arch/arm/mach-imx/clk-gate-exclusive.c [new file with mode: 0644]
arch/arm/mach-imx/clk-imx6q.c
arch/arm/mach-imx/clk-imx6sl.c
arch/arm/mach-imx/clk-imx6sx.c
arch/arm/mach-imx/clk-pllv3.c
arch/arm/mach-imx/clk-vf610.c
arch/arm/mach-imx/clk.h
arch/arm/mach-imx/imx1-dt.c [new file with mode: 0644]
arch/arm/mach-imx/mach-armadillo5x0.c
arch/arm/mach-imx/mach-imx6sx.c
arch/arm/mach-imx/mach-mx31_3ds.c
arch/arm/mach-imx/mach-mx31lite.c
arch/arm/mach-imx/mach-pcm037.c
arch/arm/mach-imx/mxc.h
arch/arm/mach-imx/time.c
arch/arm/mach-integrator/impd1.c
arch/arm/mach-meson/Kconfig [new file with mode: 0644]
arch/arm/mach-meson/Makefile [new file with mode: 0644]
arch/arm/mach-meson/meson.c [new file with mode: 0644]
arch/arm/mach-omap2/Kconfig
arch/arm/mach-omap2/Makefile
arch/arm/mach-omap2/common.h
arch/arm/mach-omap2/io.c
arch/arm/mach-omap2/omap-mpuss-lowpower.c
arch/arm/mach-omap2/omap-secure.h
arch/arm/mach-omap2/omap-wakeupgen.c
arch/arm/mach-omap2/omap-wakeupgen.h
arch/arm/mach-omap2/omap4-common.c
arch/arm/mach-omap2/omap_hwmod.c
arch/arm/mach-omap2/omap_hwmod.h
arch/arm/mach-omap2/omap_hwmod_3xxx_data.c
arch/arm/mach-omap2/pdata-quirks.c
arch/arm/mach-omap2/pm.h
arch/arm/mach-omap2/pm44xx.c
arch/arm/mach-omap2/prm3xxx.c
arch/arm/mach-omap2/prm44xx.c
arch/arm/mach-omap2/prminst44xx.c
arch/arm/mach-omap2/prminst44xx.h
arch/arm/mach-omap2/sram.c
arch/arm/mach-omap2/sram.h
arch/arm/mach-pxa/devices.c
arch/arm/mach-pxa/devices.h
arch/arm/mach-pxa/pxa3xx.c
arch/arm/mach-shmobile/Kconfig
arch/arm/mach-shmobile/Makefile
arch/arm/mach-shmobile/Makefile.boot
arch/arm/mach-shmobile/board-ape6evm-reference.c
arch/arm/mach-shmobile/board-ape6evm.c
arch/arm/mach-shmobile/board-armadillo800eva-reference.c [deleted file]
arch/arm/mach-shmobile/board-bockw-reference.c
arch/arm/mach-shmobile/board-bockw.c
arch/arm/mach-shmobile/board-genmai-reference.c [deleted file]
arch/arm/mach-shmobile/board-genmai.c [deleted file]
arch/arm/mach-shmobile/board-koelsch-reference.c
arch/arm/mach-shmobile/board-kzm9g-reference.c
arch/arm/mach-shmobile/board-kzm9g.c
arch/arm/mach-shmobile/board-lager-reference.c
arch/arm/mach-shmobile/board-mackerel.c
arch/arm/mach-shmobile/board-marzen-reference.c
arch/arm/mach-shmobile/clock-r7s72100.c [deleted file]
arch/arm/mach-shmobile/common.h
arch/arm/mach-shmobile/dma-register.h
arch/arm/mach-shmobile/intc.h
arch/arm/mach-shmobile/irqs.h
arch/arm/mach-shmobile/pm-r8a7740.c
arch/arm/mach-shmobile/r7s72100.h [deleted file]
arch/arm/mach-shmobile/r8a73a4.h
arch/arm/mach-shmobile/r8a7740.h
arch/arm/mach-shmobile/r8a7779.h
arch/arm/mach-shmobile/r8a7790.h
arch/arm/mach-shmobile/r8a7791.h
arch/arm/mach-shmobile/setup-r7s72100.c
arch/arm/mach-shmobile/setup-r8a73a4.c
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-r8a7791.c
arch/arm/mach-shmobile/setup-r8a7794.c [new file with mode: 0644]
arch/arm/mach-shmobile/setup-sh7372.c
arch/arm/mach-shmobile/setup-sh73a0.c
arch/arm/mach-shmobile/timer.c
arch/arm/mach-tegra/flowctrl.c
arch/arm/mach-tegra/flowctrl.h
arch/arm/mach-tegra/tegra.c
arch/arm/mach-zynq/Makefile
arch/arm/mach-zynq/common.c
arch/arm/mach-zynq/common.h
arch/arm/mach-zynq/hotplug.c
arch/arm/mach-zynq/platsmp.c
arch/arm/mach-zynq/pm.c [new file with mode: 0644]
arch/arm/mach-zynq/slcr.c
arch/arm/plat-pxa/ssp.c
drivers/clk/at91/Makefile
drivers/clk/at91/clk-h32mx.c [new file with mode: 0644]
drivers/clk/at91/pmc.c
drivers/clk/at91/pmc.h
drivers/clk/shmobile/Makefile
drivers/cpuidle/cpuidle-zynq.c
include/dt-bindings/clock/imx6qdl-clock.h
include/dt-bindings/clock/imx6sl-clock.h
include/dt-bindings/clock/imx6sx-clock.h
include/dt-bindings/clock/r8a7740-clock.h [new file with mode: 0644]
include/dt-bindings/clock/vf610-clock.h
include/linux/clk/at91_pmc.h
include/linux/platform_data/tegra_emc.h [deleted file]

index 16f60b41c14722893584faf3e60148e2edb56f39..4949e805f7fc0ee970e6c2fcf407321a6a86810d 100644 (file)
@@ -1,6 +1,43 @@
 Atmel AT91 device tree bindings.
 ================================
 
+Boards with a SoC of the Atmel AT91 or SMART family shall have the following
+properties:
+
+Required root node properties:
+compatible: must be one of:
+ * "atmel,at91rm9200"
+
+ * "atmel,at91sam9" for SoCs using an ARM926EJ-S core, shall be extended with
+   the specific SoC family or compatible:
+    o "atmel,at91sam9260"
+    o "atmel,at91sam9261"
+    o "atmel,at91sam9263"
+    o "atmel,at91sam9x5" for the 5 series, shall be extended with the specific
+      SoC compatible:
+       - "atmel,at91sam9g15"
+       - "atmel,at91sam9g25"
+       - "atmel,at91sam9g35"
+       - "atmel,at91sam9x25"
+       - "atmel,at91sam9x35"
+    o "atmel,at91sam9g20"
+    o "atmel,at91sam9g45"
+    o "atmel,at91sam9n12"
+    o "atmel,at91sam9rl"
+ * "atmel,sama5" for SoCs using a Cortex-A5, shall be extended with the specific
+   SoC family:
+    o "atmel,sama5d3" shall be extended with the specific SoC compatible:
+       - "atmel,sama5d31"
+       - "atmel,sama5d33"
+       - "atmel,sama5d34"
+       - "atmel,sama5d35"
+       - "atmel,sama5d36"
+    o "atmel,sama5d4" shall be extended with the specific SoC compatible:
+       - "atmel,sama5d41"
+       - "atmel,sama5d42"
+       - "atmel,sama5d43"
+       - "atmel,sama5d44"
+
 PIT Timer required properties:
 - compatible: Should be "atmel,at91sam9260-pit"
 - reg: Should contain registers location and length
diff --git a/Documentation/devicetree/bindings/arm/bcm/bcm63138.txt b/Documentation/devicetree/bindings/arm/bcm/bcm63138.txt
new file mode 100644 (file)
index 0000000..bd49987
--- /dev/null
@@ -0,0 +1,9 @@
+Broadcom BCM63138 DSL System-on-a-Chip device tree bindings
+-----------------------------------------------------------
+
+Boards compatible with the BCM63138 DSL System-on-a-Chip should have the
+following properties:
+
+Required root node property:
+
+compatible: should be "brcm,bcm63138"
index 934f00025cc4cad127340b485f3eaeb411964802..f717c7b48603686a96f3c849b429259ba85d4feb 100644 (file)
@@ -5,6 +5,11 @@ Hi4511 Board
 Required root node properties:
        - compatible = "hisilicon,hi3620-hi4511";
 
+HiP04 D01 Board
+Required root node properties:
+       - compatible = "hisilicon,hip04-d01";
+
+
 Hisilicon system controller
 
 Required properties:
@@ -55,3 +60,21 @@ Example:
                compatible = "hisilicon,pctrl";
                reg = <0xfca09000 0x1000>;
        };
+
+-----------------------------------------------------------------------
+Fabric:
+
+Required Properties:
+- compatible: "hisilicon,hip04-fabric";
+- reg: Address and size of Fabric
+
+-----------------------------------------------------------------------
+Bootwrapper boot method (software protocol on SMP):
+
+Required Properties:
+- compatible: "hisilicon,hip04-bootwrapper";
+- boot-method: Address and size of boot method.
+  [0]: bootwrapper physical address
+  [1]: bootwrapper size
+  [2]: relocation physical address
+  [3]: relocation size
index 83f405bde138a35f824f19ad27873982f8bc0325..763695db2bd957a6a2c25835f8d984bc7c4e7955 100644 (file)
@@ -10,6 +10,9 @@ Required properties:
               Should be "ti,omap5-mpu" for OMAP5
 - ti,hwmods: "mpu"
 
+Optional properties:
+- sram:        Phandle to the ocmcram node
+
 Examples:
 
 - For an OMAP5 SMP system:
diff --git a/Documentation/devicetree/bindings/arm/tegra/nvidia,tegra20-flowctrl.txt b/Documentation/devicetree/bindings/arm/tegra/nvidia,tegra20-flowctrl.txt
new file mode 100644 (file)
index 0000000..ccf0add
--- /dev/null
@@ -0,0 +1,12 @@
+NVIDIA Tegra Flow Controller
+
+Required properties:
+- compatible: Should be "nvidia,tegra<chip>-flowctrl"
+- reg: Should contain one register range (address and length)
+
+Example:
+
+       flow-controller@60007000 {
+               compatible = "nvidia,tegra20-flowctrl";
+               reg = <0x60007000 0x1000>;
+       };
index b3d544ca522a5465755846f6f59e19c2f8cc7e40..7a4d4926f44e47b9a80077192ae9dacbd1089e7e 100644 (file)
@@ -74,6 +74,9 @@ Required properties:
        "atmel,at91sam9x5-clk-utmi":
                at91 utmi clock
 
+       "atmel,sama5d4-clk-h32mx":
+               at91 h32mx clock
+
 Required properties for SCKC node:
 - reg : defines the IO memory reserved for the SCKC.
 - #size-cells : shall be 0 (reg is used to encode clk id).
@@ -447,3 +450,14 @@ For example:
                #clock-cells = <0>;
                clocks = <&main>;
        };
+
+Required properties for 32 bits bus Matrix clock (h32mx clock):
+- #clock-cells : from common clock binding; shall be set to 0.
+- clocks : shall be the master clock source phandle.
+
+For example:
+       h32ck: h32mxck {
+               #clock-cells = <0>;
+               compatible = "atmel,sama5d4-clk-h32mx";
+               clocks = <&mck>;
+       };
index 8a92b5fb3540f33a2d55806b948c3e4c7e269374..8f1424f0fa439cdfac3e16e0e6e90ef039218ab0 100644 (file)
@@ -11,9 +11,11 @@ Required Properties:
 
   - compatible: Must be one of the following
     - "renesas,r7s72100-mstp-clocks" for R7S72100 (RZ) MSTP gate clocks
+    - "renesas,r8a7740-mstp-clocks" for R8A7740 (R-Mobile A1) MSTP gate clocks
     - "renesas,r8a7779-mstp-clocks" for R8A7779 (R-Car H1) MSTP gate clocks
     - "renesas,r8a7790-mstp-clocks" for R8A7790 (R-Car H2) MSTP gate clocks
     - "renesas,r8a7791-mstp-clocks" for R8A7791 (R-Car M2) MSTP gate clocks
+    - "renesas,sh73a0-mstp-clocks" for SH73A0 (SH-MobileAG5) MSTP gate clocks
     - "renesas,cpg-mstp-clock" for generic MSTP gate clocks
   - reg: Base address and length of the I/O mapped registers used by the MSTP
     clocks. The first register is the clock control register and is mandatory.
diff --git a/Documentation/devicetree/bindings/memory-controllers/synopsys.txt b/Documentation/devicetree/bindings/memory-controllers/synopsys.txt
new file mode 100644 (file)
index 0000000..f9c6454
--- /dev/null
@@ -0,0 +1,11 @@
+Binding for Synopsys IntelliDDR Multi Protocol Memory Controller
+
+Required properties:
+ - compatible: Should be 'xlnx,zynq-ddrc-a05'
+ - reg: Base address and size of the controllers memory area
+
+Example:
+       memory-controller@f8006000 {
+               compatible = "xlnx,zynq-ddrc-a05";
+               reg = <0xf8006000 0x1000>;
+       };
index efc5d4bffac6fa61348ccc36374dc53b0ff6926c..7c4a2037f7ff340a2408a872541d6d6826dfe788 100644 (file)
@@ -2065,6 +2065,14 @@ F:       arch/arm/mach-bcm/bcm_5301x.c
 F:     arch/arm/boot/dts/bcm5301x.dtsi
 F:     arch/arm/boot/dts/bcm470*
 
+BROADCOM BCM63XX ARM ARCHITECTURE
+M:     Florian Fainelli <f.fainelli@gmail.com>
+L:     linux-arm-kernel@lists.infradead.org
+T:     git git://git.github.com/brcm/linux.git
+S:     Maintained
+F:     arch/arm/mach-bcm/bcm63xx.c
+F:     arch/arm/include/debug/bcm63xx.S
+
 BROADCOM BCM7XXX ARM ARCHITECTURE
 M:     Marc Carino <marc.ceeeee@gmail.com>
 M:     Brian Norris <computersforpeace@gmail.com>
index 314bdf1163f972699e6210e0a0e9b4e5202a5c6b..82dfdeac3595e100a07a001c9e98356420938fe6 100644 (file)
@@ -387,6 +387,7 @@ config ARCH_CLPS711X
        select CPU_ARM720T
        select GENERIC_CLOCKEVENTS
        select MFD_SYSCON
+       select SOC_BUS
        help
          Support for Cirrus Logic 711x/721x/731x based boards.
 
@@ -890,6 +891,8 @@ source "arch/arm/mach-keystone/Kconfig"
 
 source "arch/arm/mach-ks8695/Kconfig"
 
+source "arch/arm/mach-meson/Kconfig"
+
 source "arch/arm/mach-msm/Kconfig"
 
 source "arch/arm/mach-moxart/Kconfig"
@@ -1407,6 +1410,15 @@ config MCPM
          for (multi-)cluster based systems, such as big.LITTLE based
          systems.
 
+config MCPM_QUAD_CLUSTER
+       bool
+       depends on MCPM
+       help
+         To avoid wasting resources unnecessarily, MCPM only supports up
+         to 2 clusters by default.
+         Platforms with 3 or 4 clusters that use MCPM must select this
+         option to allow the additional clusters to be managed.
+
 config BIG_LITTLE
        bool "big.LITTLE support (Experimental)"
        depends on CPU_V7 && SMP
index 6a5b4968b46e169a232fc36056cdd1802d2316d0..03dc4c1a8736e78e5878298b9ff0c797e67f57fb 100644 (file)
@@ -101,6 +101,10 @@ choice
                bool "Kernel low-level debugging on 9263 and 9g45"
                depends on HAVE_AT91_DBGU1
 
+       config AT91_DEBUG_LL_DBGU2
+               bool "Kernel low-level debugging on sama5d4"
+               depends on HAVE_AT91_DBGU2
+
        config DEBUG_BCM2835
                bool "Kernel low-level debugging on BCM2835 PL011 UART"
                depends on ARCH_BCM2835
@@ -122,6 +126,11 @@ choice
                  mobile SoCs in the Kona family of chips (e.g. bcm28155,
                  bcm11351, etc...)
 
+       config DEBUG_BCM63XX
+               bool "Kernel low-level debugging on BCM63XX UART"
+               depends on ARCH_BCM_63XX
+               select DEBUG_UART_BCM63XX
+
        config DEBUG_BERLIN_UART
                bool "Marvell Berlin SoC Debug UART"
                depends on ARCH_BERLIN
@@ -223,14 +232,6 @@ choice
                  Say Y here if you want kernel low-level debugging support
                  on HI3716 UART.
 
-       config DEBUG_HIX5HD2_UART
-               bool "Hisilicon Hix5hd2 Debug UART"
-               depends on ARCH_HIX5HD2
-               select DEBUG_UART_PL01X
-               help
-                 Say Y here if you want kernel low-level debugging support
-                 on Hix5hd2 UART.
-
        config DEBUG_HIGHBANK_UART
                bool "Kernel low-level debugging messages via Highbank UART"
                depends on ARCH_HIGHBANK
@@ -239,6 +240,22 @@ choice
                  Say Y here if you want the debug print routines to direct
                  their output to the UART on Highbank based devices.
 
+       config DEBUG_HIP04_UART
+               bool "Hisilicon HiP04 Debug UART"
+               depends on ARCH_HIP04
+               select DEBUG_UART_8250
+               help
+                 Say Y here if you want kernel low-level debugging support
+                 on HIP04 UART.
+
+       config DEBUG_HIX5HD2_UART
+               bool "Hisilicon Hix5hd2 Debug UART"
+               depends on ARCH_HIX5HD2
+               select DEBUG_UART_PL01X
+               help
+                 Say Y here if you want kernel low-level debugging support
+                 on Hix5hd2 UART.
+
        config DEBUG_IMX1_UART
                bool "i.MX1 Debug UART"
                depends on SOC_IMX1
@@ -348,6 +365,13 @@ choice
                  Say Y here if you want the debug print routines to direct
                  their output to UART1 serial port on KEYSTONE2 devices.
 
+       config DEBUG_MESON_UARTAO
+               bool "Kernel low-level debugging via Meson6 UARTAO"
+               depends on ARCH_MESON
+               help
+                 Say Y here if you want kernel low-lever debugging support
+                 on Amlogic Meson6 based platforms on the UARTAO.
+
        config DEBUG_MMP_UART2
                bool "Kernel low-level debugging message via MMP UART2"
                depends on ARCH_MMP
@@ -834,6 +858,14 @@ choice
                  Say Y here if you want kernel low-level debugging support
                  on Ux500 based platforms.
 
+       config DEBUG_MT6589_UART0
+               bool "Mediatek mt6589 UART0"
+               depends on ARCH_MEDIATEK
+               select DEBUG_UART_8250
+               help
+                 Say Y here if you want kernel low-level debugging support
+                 for Mediatek mt6589 based platforms on UART0.
+
        config DEBUG_VEXPRESS_UART0_DETECT
                bool "Autodetect UART0 on Versatile Express Cortex-A core tiles"
                depends on ARCH_VEXPRESS && CPU_CP15_MMU
@@ -1011,6 +1043,7 @@ config DEBUG_LL_INCLUDE
        string
        default "debug/8250.S" if DEBUG_LL_UART_8250 || DEBUG_UART_8250
        default "debug/clps711x.S" if DEBUG_CLPS711X_UART1 || DEBUG_CLPS711X_UART2
+       default "debug/meson.S" if DEBUG_MESON_UARTAO
        default "debug/pl01x.S" if DEBUG_LL_UART_PL01X || DEBUG_UART_PL01X
        default "debug/exynos.S" if DEBUG_EXYNOS_UART
        default "debug/efm32.S" if DEBUG_LL_UART_EFM32
@@ -1038,6 +1071,7 @@ config DEBUG_LL_INCLUDE
        default "debug/vf.S" if DEBUG_VF_UART
        default "debug/vt8500.S" if DEBUG_VT8500_UART0
        default "debug/zynq.S" if DEBUG_ZYNQ_UART0 || DEBUG_ZYNQ_UART1
+       default "debug/bcm63xx.S" if DEBUG_UART_BCM63XX
        default "mach/debug-macro.S"
 
 # Compatibility options for PL01x
@@ -1057,6 +1091,10 @@ config DEBUG_UART_8250
                ARCH_IOP33X || ARCH_IXP4XX || \
                ARCH_LPC32XX || ARCH_MV78XX0 || ARCH_ORION5X || ARCH_RPC
 
+# Compatibility options for BCM63xx
+config DEBUG_UART_BCM63XX
+       def_bool ARCH_BCM_63XX
+
 config DEBUG_UART_PHYS
        hex "Physical base address of debug UART"
        default 0x01c20000 if DEBUG_DAVINCI_DMx_UART0
@@ -1075,6 +1113,7 @@ config DEBUG_UART_PHYS
        default 0x10126000 if DEBUG_RK3X_UART1
        default 0x101f1000 if ARCH_VERSATILE
        default 0x101fb000 if DEBUG_NOMADIK_UART
+       default 0x11006000 if DEBUG_MT6589_UART0
        default 0x16000000 if ARCH_INTEGRATOR
        default 0x18000300 if DEBUG_BCM_5301X
        default 0x1c090000 if DEBUG_VEXPRESS_UART0_RS1
@@ -1093,6 +1132,7 @@ config DEBUG_UART_PHYS
                                DEBUG_S3C2410_UART1)
        default 0x50008000 if DEBUG_S3C24XX_UART && (DEBUG_S3C_UART2 || \
                                DEBUG_S3C2410_UART2)
+       default 0x78000000 if DEBUG_CNS3XXX
        default 0x7c0003f8 if FOOTBRIDGE
        default 0x78000000 if DEBUG_CNS3XXX
        default 0x80070000 if DEBUG_IMX23_UART
@@ -1107,9 +1147,11 @@ config DEBUG_UART_PHYS
        default 0xc8000003 if ARCH_IXP4XX && CPU_BIG_ENDIAN
        default 0xd0000000 if ARCH_SPEAR3XX || ARCH_SPEAR6XX
        default 0xd0012000 if DEBUG_MVEBU_UART
+       default 0xc81004c0 if DEBUG_MESON_UARTAO
        default 0xd4017000 if DEBUG_MMP_UART2
        default 0xd4018000 if DEBUG_MMP_UART3
        default 0xe0000000 if ARCH_SPEAR13XX
+       default 0xe4007000 if DEBUG_HIP04_UART
        default 0xf0000be0 if ARCH_EBSA110
        default 0xf1012000 if DEBUG_MVEBU_UART_ALTERNATE
        default 0xf1012000 if ARCH_DOVE || ARCH_MV78XX0 || \
@@ -1123,11 +1165,13 @@ config DEBUG_UART_PHYS
        default 0xffc02000 if DEBUG_SOCFPGA_UART
        default 0xffd82340 if ARCH_IOP13XX
        default 0xfff36000 if DEBUG_HIGHBANK_UART
+       default 0xfffe8600 if DEBUG_UART_BCM63XX
        default 0xfffff700 if ARCH_IOP33X
        depends on DEBUG_LL_UART_8250 || DEBUG_LL_UART_PL01X || \
                DEBUG_LL_UART_EFM32 || \
-               DEBUG_UART_8250 || DEBUG_UART_PL01X || \
-               DEBUG_MSM_UART || DEBUG_QCOM_UARTDM || DEBUG_S3C24XX_UART
+               DEBUG_UART_8250 || DEBUG_UART_PL01X || DEBUG_MESON_UARTAO || \
+               DEBUG_MSM_UART || DEBUG_QCOM_UARTDM || DEBUG_S3C24XX_UART || \
+               DEBUG_UART_BCM63XX
 
 config DEBUG_UART_VIRT
        hex "Virtual base address of debug UART"
@@ -1137,6 +1181,7 @@ config DEBUG_UART_VIRT
        default 0xf01fb000 if DEBUG_NOMADIK_UART
        default 0xf0201000 if DEBUG_BCM2835
        default 0xf1000300 if DEBUG_BCM_5301X
+       default 0xf1006000 if DEBUG_MT6589_UART0
        default 0xf11f1000 if ARCH_VERSATILE
        default 0xf1600000 if ARCH_INTEGRATOR
        default 0xf1c28000 if DEBUG_SUNXI_UART0
@@ -1152,17 +1197,20 @@ config DEBUG_UART_VIRT
        default 0xf7008000 if DEBUG_S3C24XX_UART && (DEBUG_S3C_UART2 || \
                                DEBUG_S3C2410_UART2)
        default 0xf7fc9000 if DEBUG_BERLIN_UART
+       default 0xf8007000 if DEBUG_HIP04_UART
        default 0xf8009000 if DEBUG_VEXPRESS_UART0_CA9
        default 0xf8090000 if DEBUG_VEXPRESS_UART0_RS1
        default 0xfa71e000 if DEBUG_QCOM_UARTDM
        default 0xfb002000 if DEBUG_CNS3XXX
        default 0xfb009000 if DEBUG_REALVIEW_STD_PORT
        default 0xfb10c000 if DEBUG_REALVIEW_PB1176_PORT
+       default 0xfcfe8600 if DEBUG_UART_BCM63XX
        default 0xfd000000 if ARCH_SPEAR3XX || ARCH_SPEAR6XX
        default 0xfd000000 if ARCH_SPEAR13XX
        default 0xfd012000 if ARCH_MV78XX0
        default 0xfde12000 if ARCH_DOVE
        default 0xfe012000 if ARCH_ORION5X
+       default 0xf31004c0 if DEBUG_MESON_UARTAO
        default 0xfe017000 if DEBUG_MMP_UART2
        default 0xfe018000 if DEBUG_MMP_UART3
        default 0xfe100000 if DEBUG_IMX23_UART || DEBUG_IMX28_UART
@@ -1194,8 +1242,9 @@ config DEBUG_UART_VIRT
        default 0xff003000 if DEBUG_U300_UART
        default DEBUG_UART_PHYS if !MMU
        depends on DEBUG_LL_UART_8250 || DEBUG_LL_UART_PL01X || \
-               DEBUG_UART_8250 || DEBUG_UART_PL01X || \
-               DEBUG_MSM_UART || DEBUG_QCOM_UARTDM || DEBUG_S3C24XX_UART
+               DEBUG_UART_8250 || DEBUG_UART_PL01X || DEBUG_MESON_UARTAO || \
+               DEBUG_MSM_UART || DEBUG_QCOM_UARTDM || DEBUG_S3C24XX_UART || \
+               DEBUG_UART_BCM63XX
 
 config DEBUG_UART_8250_SHIFT
        int "Register offset shift for the 8250 debug UART"
index 12bfc1fa51f009f3a59536545f38b560b5b3f48e..dceb0441b1a6de111eb5cc3e9b96e1bbb5e69f34 100644 (file)
@@ -169,6 +169,7 @@ machine-$(CONFIG_ARCH_IXP4XX)               += ixp4xx
 machine-$(CONFIG_ARCH_KEYSTONE)                += keystone
 machine-$(CONFIG_ARCH_KS8695)          += ks8695
 machine-$(CONFIG_ARCH_LPC32XX)         += lpc32xx
+machine-$(CONFIG_ARCH_MESON)           += meson
 machine-$(CONFIG_ARCH_MMP)             += mmp
 machine-$(CONFIG_ARCH_MOXART)          += moxart
 machine-$(CONFIG_ARCH_MSM)             += msm
index e6aa6e77a3ecbf6cf473cb76ea7d5d55548e4bd4..d3e687ecfc9564a5f3ff4069c769c3648d2a78e4 100644 (file)
@@ -48,11 +48,14 @@ dtb-$(CONFIG_ARCH_AT91)     += sama5d33ek.dtb
 dtb-$(CONFIG_ARCH_AT91)        += sama5d34ek.dtb
 dtb-$(CONFIG_ARCH_AT91)        += sama5d35ek.dtb
 dtb-$(CONFIG_ARCH_AT91)        += sama5d36ek.dtb
+# sama5d4
+dtb-$(CONFIG_ARCH_AT91)        += at91-sama5d4ek.dtb
 
 dtb-$(CONFIG_ARCH_ATLAS6) += atlas6-evb.dtb
 dtb-$(CONFIG_ARCH_AXXIA) += axm5516-amarillo.dtb
 dtb-$(CONFIG_ARCH_BCM2835) += bcm2835-rpi-b.dtb
 dtb-$(CONFIG_ARCH_BCM_5301X) += bcm4708-netgear-r6250.dtb
+dtb-$(CONFIG_ARCH_BCM_63XX) += bcm963138dvt.dtb
 dtb-$(CONFIG_ARCH_BCM_MOBILE) += bcm28155-ap.dtb \
        bcm21664-garnet.dtb
 dtb-$(CONFIG_ARCH_BERLIN) += \
@@ -90,6 +93,7 @@ dtb-$(CONFIG_ARCH_HI3xxx) += hi3620-hi4511.dtb
 dtb-$(CONFIG_ARCH_HIX5HD2) += hisi-x5hd2-dkb.dtb
 dtb-$(CONFIG_ARCH_HIGHBANK) += highbank.dtb \
        ecx-2000.dtb
+dtb-$(CONFIG_ARCH_HIP04) += hip04-d01.dtb
 dtb-$(CONFIG_ARCH_INTEGRATOR) += integratorap.dtb \
        integratorcp.dtb
 dtb-$(CONFIG_ARCH_KEYSTONE) += k2hk-evm.dtb \
@@ -361,7 +365,6 @@ dtb-$(CONFIG_ARCH_SHMOBILE_LEGACY) += r7s72100-genmai.dtb \
        r8a7740-armadillo800eva.dtb \
        r8a7778-bockw.dtb \
        r8a7778-bockw-reference.dtb \
-       r8a7740-armadillo800eva-reference.dtb \
        r8a7779-marzen.dtb \
        r8a7791-koelsch.dtb \
        r8a7790-lager.dtb \
@@ -372,6 +375,7 @@ dtb-$(CONFIG_ARCH_SHMOBILE_LEGACY) += r7s72100-genmai.dtb \
        sh7372-mackerel.dtb
 dtb-$(CONFIG_ARCH_SHMOBILE_MULTI) += emev2-kzm9d.dtb \
        r7s72100-genmai.dtb \
+       r8a7740-armadillo800eva.dtb \
        r8a7791-henninger.dtb \
        r8a7791-koelsch.dtb \
        r8a7790-lager.dtb \
index 3a0a161342bafb7299b08ca9a80391f0edb47382..c8238c467acfc10ab344311900ad0423b6af0669 100644 (file)
                };
 
                ocmcram: ocmcram@40300000 {
-                       compatible = "ti,am3352-ocmcram";
-                       reg = <0x40300000 0x10000>;
-                       ti,hwmods = "ocmcram";
+                       compatible = "mmio-sram";
+                       reg = <0x40300000 0x10000>; /* 64k */
                };
 
                wkup_m3: wkup_m3@44d00000 {
index 8689949bdba3f7fad944beaf77ce9b5efa6dbe59..24531de979f2701cbdf437298c8b7fcde3e5feac 100644 (file)
                                clock-names = "fck";
                        };
                };
+
+               ocmcram: ocmcram@40300000 {
+                       compatible = "mmio-sram";
+                       reg = <0x40300000 0x40000>; /* 256k */
+               };
        };
 };
 
diff --git a/arch/arm/boot/dts/at91-sama5d4ek.dts b/arch/arm/boot/dts/at91-sama5d4ek.dts
new file mode 100644 (file)
index 0000000..b5b8400
--- /dev/null
@@ -0,0 +1,260 @@
+/*
+ * at91-sama5d4ek.dts - Device Tree file for SAMA5D4 Evaluation Kit
+ *
+ *  Copyright (C) 2014 Atmel,
+ *                2014 Nicolas Ferre <nicolas.ferre@atmel.com>
+ *
+ * This file is dual-licensed: you can use it either under the terms
+ * of the GPL or the X11 license, at your option. Note that this dual
+ * licensing only applies to this file, and not this project as a
+ * whole.
+ *
+ *  a) This library 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 library 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.
+ *
+ * Or, alternatively,
+ *
+ *  b) Permission is hereby granted, free of charge, to any person
+ *     obtaining a copy of this software and associated documentation
+ *     files (the "Software"), to deal in the Software without
+ *     restriction, including without limitation the rights to use,
+ *     copy, modify, merge, publish, distribute, sublicense, and/or
+ *     sell copies of the Software, and to permit persons to whom the
+ *     Software is furnished to do so, subject to the following
+ *     conditions:
+ *
+ *     The above copyright notice and this permission notice shall be
+ *     included in all copies or substantial portions of the Software.
+ *
+ *     THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ *     EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+ *     OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ *     NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ *     HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ *     WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *     FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ *     OTHER DEALINGS IN THE SOFTWARE.
+ */
+/dts-v1/;
+#include "sama5d4.dtsi"
+
+/ {
+       model = "Atmel SAMA5D4-EK";
+       compatible = "atmel,sama5d4ek", "atmel,sama5d4", "atmel,sama5";
+
+       chosen {
+               bootargs = "console=ttyS0,115200 ignore_loglevel earlyprintk";
+       };
+
+       memory {
+               reg = <0x20000000 0x20000000>;
+       };
+
+       clocks {
+               #address-cells = <1>;
+               #size-cells = <1>;
+               ranges;
+
+               main_clock: clock@0 {
+                       compatible = "atmel,osc", "fixed-clock";
+                       clock-frequency = <12000000>;
+               };
+
+               slow_xtal {
+                       clock-frequency = <32768>;
+               };
+
+               main_xtal {
+                       clock-frequency = <12000000>;
+               };
+       };
+
+       ahb {
+               apb {
+                       lcd_bus@f0000000 {
+                               status = "okay";
+
+                               lcd@f0000000 {
+                                       status = "okay";
+                               };
+
+                               lcdovl1@f0000140 {
+                                       status = "okay";
+                               };
+
+                               lcdovl2@f0000240 {
+                                       status = "okay";
+                               };
+
+                               lcdheo1@f0000340 {
+                                       status = "okay";
+                               };
+                       };
+
+                       adc0: adc@fc034000 {
+                               /* The vref depends on JP22 of EK. If connect 1-2 then use 3.3V. connect 2-3 use 3.0V */
+                               atmel,adc-vref = <3300>;
+                               /*atmel,adc-ts-wires = <4>;*/   /* Set up ADC touch screen */
+                               status = "okay";                /* Enable ADC IIO support */
+                       };
+
+                       mmc0: mmc@f8000000 {
+                               pinctrl-names = "default";
+                               pinctrl-0 = <&pinctrl_mmc0_clk_cmd_dat0 &pinctrl_mmc0_dat1_3 &pinctrl_mmc0_cd>;
+                               slot@1 {
+                                       reg = <1>;
+                                       bus-width = <4>;
+                                       cd-gpios = <&pioE 5 0>;
+                               };
+                       };
+
+                       spi0: spi@f8010000 {
+                               cs-gpios = <&pioC 3 0>, <0>, <0>, <0>;
+                               status = "okay";
+                               m25p80@0 {
+                                       compatible = "atmel,at25df321a";
+                                       spi-max-frequency = <50000000>;
+                                       reg = <0>;
+                               };
+                       };
+
+                       i2c0: i2c@f8014000 {
+                               status = "okay";
+                       };
+
+                       macb0: ethernet@f8020000 {
+                               phy-mode = "rmii";
+                               status = "okay";
+                       };
+
+                       mmc1: mmc@fc000000 {
+                               pinctrl-names = "default";
+                               pinctrl-0 = <&pinctrl_mmc1_clk_cmd_dat0 &pinctrl_mmc1_dat1_3 &pinctrl_mmc1_cd>;
+                               status = "okay";
+                               slot@0 {
+                                       reg = <0>;
+                                       bus-width = <4>;
+                                       cd-gpios = <&pioE 6 0>;
+                               };
+                       };
+
+                       usart2: serial@fc008000 {
+                               status = "okay";
+                       };
+
+                       usart3: serial@fc00c000 {
+                               status = "okay";
+                       };
+
+                       usart4: serial@fc010000 {
+                               status = "okay";
+                       };
+
+                       watchdog@fc068640 {
+                               status = "okay";
+                       };
+
+                       pinctrl@fc06a000 {
+                               board {
+                                       pinctrl_mmc0_cd: mmc0_cd {
+                                               atmel,pins =
+                                                       <AT91_PIOE 5 AT91_PERIPH_GPIO AT91_PINCTRL_PULL_UP_DEGLITCH>;
+                                       };
+                                       pinctrl_mmc1_cd: mmc1_cd {
+                                               atmel,pins =
+                                                       <AT91_PIOE 6 AT91_PERIPH_GPIO AT91_PINCTRL_PULL_UP_DEGLITCH>;
+                                       };
+                                       pinctrl_usba_vbus: usba_vbus {
+                                               atmel,pins =
+                                                       <AT91_PIOE 31 AT91_PERIPH_GPIO AT91_PINCTRL_DEGLITCH>;
+                                       };
+                                       pinctrl_key_gpio: key_gpio_0 {
+                                               atmel,pins =
+                                                       <AT91_PIOE 13 AT91_PERIPH_GPIO AT91_PINCTRL_PULL_UP_DEGLITCH>; /* PE13 gpio */
+                                       };
+                               };
+                       };
+               };
+
+               usb0: gadget@00400000 {
+                       atmel,vbus-gpio = <&pioE 31 GPIO_ACTIVE_HIGH>;
+                       pinctrl-names = "default";
+                       pinctrl-0 = <&pinctrl_usba_vbus>;
+                       status = "okay";
+               };
+
+               usb1: ohci@00500000 {
+                       num-ports = <3>;
+                       atmel,vbus-gpio = <0 /* &pioE 10 GPIO_ACTIVE_LOW */
+                                          &pioE 11 GPIO_ACTIVE_LOW
+                                          &pioE 12 GPIO_ACTIVE_LOW
+                                         >;
+                       status = "okay";
+               };
+
+               usb2: ehci@00600000 {
+                       status = "okay";
+               };
+
+               nand0: nand@80000000 {
+                       nand-bus-width = <8>;
+                       nand-ecc-mode = "hw";
+                       nand-on-flash-bbt;
+                       atmel,has-pmecc;
+                       status = "okay";
+
+                       at91bootstrap@0 {
+                               label = "at91bootstrap";
+                               reg = <0x0 0x40000>;
+                       };
+
+                       bootloader@40000 {
+                               label = "bootloader";
+                               reg = <0x40000 0x80000>;
+                       };
+
+                       bootloaderenv@c0000 {
+                               label = "bootloader env";
+                               reg = <0xc0000 0xc0000>;
+                       };
+
+                       dtb@180000 {
+                               label = "device tree";
+                               reg = <0x180000 0x80000>;
+                       };
+
+                       kernel@200000 {
+                               label = "kernel";
+                               reg = <0x200000 0x600000>;
+                       };
+
+                       rootfs@800000 {
+                               label = "rootfs";
+                               reg = <0x800000 0x0f800000>;
+                       };
+               };
+       };
+
+       gpio_keys {
+               compatible = "gpio-keys";
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               pinctrl-names = "default";
+               pinctrl-0 = <&pinctrl_key_gpio>;
+
+               pb_user1 {
+                       label = "pb_user1";
+                       gpios = <&pioE 13 GPIO_ACTIVE_HIGH>;
+                       linux,code = <0x100>;
+                       gpio-key,wakeup;
+               };
+       };
+};
diff --git a/arch/arm/boot/dts/bcm63138.dtsi b/arch/arm/boot/dts/bcm63138.dtsi
new file mode 100644 (file)
index 0000000..f3bb2dd
--- /dev/null
@@ -0,0 +1,134 @@
+/*
+ * Broadcom BCM63138 DSL SoCs Device Tree
+ */
+
+#include <dt-bindings/interrupt-controller/arm-gic.h>
+#include <dt-bindings/interrupt-controller/irq.h>
+
+#include "skeleton.dtsi"
+
+/ {
+       compatible = "brcm,bcm63138";
+       model = "Broadcom BCM63138 DSL SoC";
+       interrupt-parent = <&gic>;
+
+       aliases {
+               uart0 = &serial0;
+               uart1 = &serial1;
+       };
+
+       cpus {
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               cpu@0 {
+                       device_type = "cpu";
+                       compatible = "arm,cortex-a9";
+                       next-level-cache = <&L2>;
+                       reg = <0>;
+               };
+
+               cpu@1 {
+                       device_type = "cpu";
+                       compatible = "arm,cortex-a9";
+                       next-level-cache = <&L2>;
+                       reg = <1>;
+               };
+       };
+
+       clocks {
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               arm_timer_clk: arm_timer_clk {
+                       #clock-cells = <0>;
+                       compatible = "fixed-clock";
+                       clock-frequency = <500000000>;
+               };
+
+               periph_clk: periph_clk {
+                       #clock-cells = <0>;
+                       compatible = "fixed-clock";
+                       clock-frequency = <50000000>;
+                       clock-output-names = "periph";
+               };
+       };
+
+       /* ARM bus */
+       axi@80000000 {
+               compatible = "simple-bus";
+               ranges = <0 0x80000000 0x784000>;
+               #address-cells = <1>;
+               #size-cells = <1>;
+
+               L2: cache-controller@1d000 {
+                       compatible = "arm,pl310-cache";
+                       reg = <0x1d000 0x1000>;
+                       cache-unified;
+                       cache-level = <2>;
+                       cache-sets = <16>;
+                       cache-size = <0x80000>;
+                       interrupts = <GIC_PPI 0 IRQ_TYPE_LEVEL_HIGH>;
+               };
+
+               scu: scu@1e000 {
+                       compatible = "arm,cortex-a9-scu";
+                       reg = <0x1e000 0x100>;
+               };
+
+               gic: interrupt-controller@1e100 {
+                       compatible = "arm,cortex-a9-gic";
+                       reg = <0x1f000 0x1000
+                               0x1e100 0x100>;
+                       #interrupt-cells = <3>;
+                       #address-cells = <0>;
+                       interrupt-controller;
+               };
+
+               global_timer: timer@1e200 {
+                       compatible = "arm,cortex-a9-global-timer";
+                       reg = <0x1e200 0x20>;
+                       interrupts = <GIC_PPI 11 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&arm_timer_clk>;
+               };
+
+               local_timer: local-timer@1e600 {
+                       compatible = "arm,cortex-a9-twd-timer";
+                       reg = <0x1e600 0x20>;
+                       interrupts = <GIC_PPI 13 IRQ_TYPE_LEVEL_HIGH>;
+                       clocks = <&arm_timer_clk>;
+               };
+
+               twd_watchdog: watchdog@1e620 {
+                       compatible = "arm,cortex-a9-twd-wdt";
+                       reg = <0x1e620 0x20>;
+                       interupts = <GIC_PPI 14 IRQ_TYPE_LEVEL_HIGH>;
+               };
+       };
+
+       /* Legacy UBUS base */
+       ubus@fffe8000 {
+               compatible = "simple-bus";
+               #address-cells = <1>;
+               #size-cells = <1>;
+               ranges = <0 0xfffe8000 0x8100>;
+
+               serial0: serial@600 {
+                       compatible = "brcm,bcm6345-uart";
+                       reg = <0x600 0x1b>;
+                       interrupts = <GIC_SPI 32 0>;
+                       clocks = <&periph_clk>;
+                       clock-names = "periph";
+                       status = "disabled";
+               };
+
+               serial1: serial@620 {
+                       compatible = "brcm,bcm6345-uart";
+                       reg = <0x620 0x1b>;
+                       interrupts = <GIC_SPI 33 0>;
+                       clocks = <&periph_clk>;
+                       clock-names = "periph";
+                       status = "disabled";
+               };
+       };
+};
diff --git a/arch/arm/boot/dts/bcm963138dvt.dts b/arch/arm/boot/dts/bcm963138dvt.dts
new file mode 100644 (file)
index 0000000..69c9339
--- /dev/null
@@ -0,0 +1,30 @@
+/*
+ * Broadcom BCM63138 Reference Board DTS
+ */
+
+/dts-v1/;
+
+#include "bcm63138.dtsi"
+
+/ {
+       compatible = "brcm,BCM963138DVT", "brcm,bcm63138";
+       model = "Broadcom BCM963138DVT";
+
+       chosen {
+               bootargs = "console=ttyS0,115200";
+               stdout-path = &serial0;
+       };
+
+       memory {
+               reg = <0x0 0x08000000>;
+       };
+
+};
+
+&serial0 {
+       status = "okay";
+};
+
+&serial1 {
+       status = "okay";
+};
index d678152db4cb39036f7e05a6494737006714e81b..e09b1afdaef20f9b2f4574c4e7363b0dcb3e496e 100644 (file)
@@ -89,6 +89,7 @@
                prm: prm@4ae06000 {
                        compatible = "ti,dra7-prm";
                        reg = <0x4ae06000 0x3000>;
+                       interrupts = <GIC_SPI 6 IRQ_TYPE_LEVEL_HIGH>;
 
                        prm_clocks: clocks {
                                #address-cells = <1>;
diff --git a/arch/arm/boot/dts/hip04-d01.dts b/arch/arm/boot/dts/hip04-d01.dts
new file mode 100644 (file)
index 0000000..40a9e33
--- /dev/null
@@ -0,0 +1,32 @@
+/*
+ *  Copyright (C) 2013-2014 Linaro Ltd.
+ *  Author: Haojian Zhuang <haojian.zhuang@linaro.org>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License version 2 as
+ *  publishhed by the Free Software Foundation.
+ */
+
+/dts-v1/;
+
+#include "hip04.dtsi"
+
+/ {
+       /* memory bus is 64-bit */
+       #address-cells = <2>;
+       #size-cells = <2>;
+       model = "Hisilicon D01 Development Board";
+       compatible = "hisilicon,hip04-d01";
+
+       memory@00000000,10000000 {
+               device_type = "memory";
+               reg = <0x00000000 0x10000000 0x00000000 0xc0000000>,
+                     <0x00000004 0xc0000000 0x00000003 0x40000000>;
+       };
+
+       soc {
+               uart0: uart@4007000 {
+                       status = "ok";
+               };
+       };
+};
diff --git a/arch/arm/boot/dts/hip04.dtsi b/arch/arm/boot/dts/hip04.dtsi
new file mode 100644 (file)
index 0000000..93b6c90
--- /dev/null
@@ -0,0 +1,267 @@
+/*
+ * Hisilicon Ltd. HiP04 SoC
+ *
+ * Copyright (C) 2013-2014 Hisilicon Ltd.
+ * Copyright (C) 2013-2014 Linaro Ltd.
+ *
+ * Author: Haojian Zhuang <haojian.zhuang@linaro.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+/ {
+       /* memory bus is 64-bit */
+       #address-cells = <2>;
+       #size-cells = <2>;
+
+       aliases {
+               serial0 = &uart0;
+       };
+
+       bootwrapper {
+               compatible = "hisilicon,hip04-bootwrapper";
+               boot-method = <0x10c00000 0x10000>, <0xe0000100 0x1000>;
+       };
+
+       cpus {
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               cpu-map {
+                       cluster0 {
+                               core0 {
+                                       cpu = <&CPU0>;
+                               };
+                               core1 {
+                                       cpu = <&CPU1>;
+                               };
+                               core2 {
+                                       cpu = <&CPU2>;
+                               };
+                               core3 {
+                                       cpu = <&CPU3>;
+                               };
+                       };
+                       cluster1 {
+                               core0 {
+                                       cpu = <&CPU4>;
+                               };
+                               core1 {
+                                       cpu = <&CPU5>;
+                               };
+                               core2 {
+                                       cpu = <&CPU6>;
+                               };
+                               core3 {
+                                       cpu = <&CPU7>;
+                               };
+                       };
+                       cluster2 {
+                               core0 {
+                                       cpu = <&CPU8>;
+                               };
+                               core1 {
+                                       cpu = <&CPU9>;
+                               };
+                               core2 {
+                                       cpu = <&CPU10>;
+                               };
+                               core3 {
+                                       cpu = <&CPU11>;
+                               };
+                       };
+                       cluster3 {
+                               core0 {
+                                       cpu = <&CPU12>;
+                               };
+                               core1 {
+                                       cpu = <&CPU13>;
+                               };
+                               core2 {
+                                       cpu = <&CPU14>;
+                               };
+                               core3 {
+                                       cpu = <&CPU15>;
+                               };
+                       };
+               };
+               CPU0: cpu@0 {
+                       device_type = "cpu";
+                       compatible = "arm,cortex-a15";
+                       reg = <0>;
+               };
+               CPU1: cpu@1 {
+                       device_type = "cpu";
+                       compatible = "arm,cortex-a15";
+                       reg = <1>;
+               };
+               CPU2: cpu@2 {
+                       device_type = "cpu";
+                       compatible = "arm,cortex-a15";
+                       reg = <2>;
+               };
+               CPU3: cpu@3 {
+                       device_type = "cpu";
+                       compatible = "arm,cortex-a15";
+                       reg = <3>;
+               };
+               CPU4: cpu@100 {
+                       device_type = "cpu";
+                       compatible = "arm,cortex-a15";
+                       reg = <0x100>;
+               };
+               CPU5: cpu@101 {
+                       device_type = "cpu";
+                       compatible = "arm,cortex-a15";
+                       reg = <0x101>;
+               };
+               CPU6: cpu@102 {
+                       device_type = "cpu";
+                       compatible = "arm,cortex-a15";
+                       reg = <0x102>;
+               };
+               CPU7: cpu@103 {
+                       device_type = "cpu";
+                       compatible = "arm,cortex-a15";
+                       reg = <0x103>;
+               };
+               CPU8: cpu@200 {
+                       device_type = "cpu";
+                       compatible = "arm,cortex-a15";
+                       reg = <0x200>;
+               };
+               CPU9: cpu@201 {
+                       device_type = "cpu";
+                       compatible = "arm,cortex-a15";
+                       reg = <0x201>;
+               };
+               CPU10: cpu@202 {
+                       device_type = "cpu";
+                       compatible = "arm,cortex-a15";
+                       reg = <0x202>;
+               };
+               CPU11: cpu@203 {
+                       device_type = "cpu";
+                       compatible = "arm,cortex-a15";
+                       reg = <0x203>;
+               };
+               CPU12: cpu@300 {
+                       device_type = "cpu";
+                       compatible = "arm,cortex-a15";
+                       reg = <0x300>;
+               };
+               CPU13: cpu@301 {
+                       device_type = "cpu";
+                       compatible = "arm,cortex-a15";
+                       reg = <0x301>;
+               };
+               CPU14: cpu@302 {
+                       device_type = "cpu";
+                       compatible = "arm,cortex-a15";
+                       reg = <0x302>;
+               };
+               CPU15: cpu@303 {
+                       device_type = "cpu";
+                       compatible = "arm,cortex-a15";
+                       reg = <0x303>;
+               };
+       };
+
+       timer {
+               compatible = "arm,armv7-timer";
+               interrupt-parent = <&gic>;
+               interrupts = <1 13 0xf08>,
+                            <1 14 0xf08>,
+                            <1 11 0xf08>,
+                            <1 10 0xf08>;
+       };
+
+       clk_50m: clk_50m {
+               #clock-cells = <0>;
+               compatible = "fixed-clock";
+               clock-frequency = <50000000>;
+       };
+
+       clk_168m: clk_168m {
+               #clock-cells = <0>;
+               compatible = "fixed-clock";
+               clock-frequency = <168000000>;
+       };
+
+       soc {
+               /* It's a 32-bit SoC. */
+               #address-cells = <1>;
+               #size-cells = <1>;
+               compatible = "simple-bus";
+               interrupt-parent = <&gic>;
+               ranges = <0 0 0xe0000000 0x10000000>;
+
+               gic: interrupt-controller@c01000 {
+                       compatible = "hisilicon,hip04-intc";
+                       #interrupt-cells = <3>;
+                       #address-cells = <0>;
+                       interrupt-controller;
+                       interrupts = <1 9 0xf04>;
+
+                       reg = <0xc01000 0x1000>, <0xc02000 0x1000>,
+                             <0xc04000 0x2000>, <0xc06000 0x2000>;
+               };
+
+               sysctrl: sysctrl {
+                       compatible = "hisilicon,sysctrl";
+                       reg = <0x3e00000 0x00100000>;
+               };
+
+               fabric: fabric {
+                       compatible = "hisilicon,hip04-fabric";
+                       reg = <0x302a000 0x1000>;
+               };
+
+               dual_timer0: dual_timer@3000000 {
+                       compatible = "arm,sp804", "arm,primecell";
+                       reg = <0x3000000 0x1000>;
+                       interrupts = <0 224 4>;
+                       clocks = <&clk_50m>, <&clk_50m>;
+                       clock-names = "apb_pclk";
+               };
+
+               arm-pmu {
+                       compatible = "arm,cortex-a15-pmu";
+                       interrupts = <0 64 4>,
+                                    <0 65 4>,
+                                    <0 66 4>,
+                                    <0 67 4>,
+                                    <0 68 4>,
+                                    <0 69 4>,
+                                    <0 70 4>,
+                                    <0 71 4>,
+                                    <0 72 4>,
+                                    <0 73 4>,
+                                    <0 74 4>,
+                                    <0 75 4>,
+                                    <0 76 4>,
+                                    <0 77 4>,
+                                    <0 78 4>,
+                                    <0 79 4>;
+               };
+
+               uart0: uart@4007000 {
+                       compatible = "snps,dw-apb-uart";
+                       reg = <0x4007000 0x1000>;
+                       interrupts = <0 381 4>;
+                       clocks = <&clk_168m>;
+                       clock-names = "uartclk";
+                       reg-shift = <2>;
+                       status = "disabled";
+               };
+
+               sata0: sata@a000000 {
+                       compatible = "hisilicon,hisi-ahci";
+                       reg = <0xa000000 0x1000000>;
+                       interrupts = <0 372 4>;
+               };
+
+       };
+};
index 575a49bf968d8c4be70abafa0009d1a7c3563661..3136ed1a04ba6f98667205e67c8730ec7f7594eb 100644 (file)
@@ -97,6 +97,7 @@
                prm: prm@48306000 {
                        compatible = "ti,omap3-prm";
                        reg = <0x48306000 0x4000>;
+                       interrupts = <11>;
 
                        prm_clocks: clocks {
                                #address-cells = <1>;
index 69408b53200d5aa88a603962452190ea43e02858..8a944974d72e5b7184636ec516bcb6752d9d9af2 100644 (file)
@@ -81,6 +81,7 @@
                mpu {
                        compatible = "ti,omap4-mpu";
                        ti,hwmods = "mpu";
+                       sram = <&ocmcram>;
                };
 
                dsp {
                prm: prm@4a306000 {
                        compatible = "ti,omap4-prm";
                        reg = <0x4a306000 0x3000>;
+                       interrupts = <GIC_SPI 11 IRQ_TYPE_LEVEL_HIGH>;
 
                        prm_clocks: clocks {
                                #address-cells = <1>;
                        };
                };
 
+               ocmcram: ocmcram@40304000 {
+                       compatible = "mmio-sram";
+                       reg = <0x40304000 0xa000>; /* 40k */
+               };
+
                sdma: dma-controller@4a056000 {
                        compatible = "ti,omap4430-sdma";
                        reg = <0x4a056000 0x1000>;
index fc8df1739f393657e9040e67e486e08a47e04648..4a6091d717b50fd01cee762c808b292c38e927f1 100644 (file)
        soc {
                compatible = "ti,omap-infra";
                mpu {
-                       compatible = "ti,omap5-mpu";
+                       compatible = "ti,omap4-mpu";
                        ti,hwmods = "mpu";
+                       sram = <&ocmcram>;
                };
        };
 
                prm: prm@4ae06000 {
                        compatible = "ti,omap5-prm";
                        reg = <0x4ae06000 0x3000>;
+                       interrupts = <GIC_SPI 11 IRQ_TYPE_LEVEL_HIGH>;
 
                        prm_clocks: clocks {
                                #address-cells = <1>;
                        };
                };
 
+               ocmcram: ocmcram@40300000 {
+                       compatible = "mmio-sram";
+                       reg = <0x40300000 0x20000>; /* 128k */
+               };
+
                sdma: dma-controller@4a056000 {
                        compatible = "ti,omap4430-sdma";
                        reg = <0x4a056000 0x1000>;
index 20705467f4c9a0e63f85cdc465aeaf151e3592d0..a3ed23c0a8f58abd3e2d035042dceb658b528bee 100644 (file)
        clock-frequency = <48000000>;
 };
 
+&mtu2 {
+       status = "ok";
+};
+
 &i2c2 {
        status = "okay";
        clock-frequency = <400000>;
index bdee225411895f75b7e8477527496ff696074cf3..801a556e264bcc950eb6eb3db55a61c9e92c1c0f 100644 (file)
                status = "disabled";
        };
 
+       mtu2: timer@fcff0000 {
+               compatible = "renesas,mtu2-r7s72100", "renesas,mtu2";
+               reg = <0xfcff0000 0x400>;
+               interrupts = <0 107 IRQ_TYPE_LEVEL_HIGH>;
+               interrupt-names = "tgi0a";
+               clocks = <&mstp3_clks R7S72100_CLK_MTU2>;
+               clock-names = "fck";
+               status = "disabled";
+       };
+
        scif0: serial@e8007000 {
                compatible = "renesas,scif-r7s72100", "renesas,scif";
                reg = <0xe8007000 64>;
diff --git a/arch/arm/boot/dts/r8a7740-armadillo800eva-reference.dts b/arch/arm/boot/dts/r8a7740-armadillo800eva-reference.dts
deleted file mode 100644 (file)
index ee9e7d5..0000000
+++ /dev/null
@@ -1,283 +0,0 @@
-/*
- * Reference Device Tree Source for the armadillo 800 eva board
- *
- * Copyright (C) 2012 Renesas Solutions Corp.
- *
- * This file is licensed under the terms of the GNU General Public License
- * version 2.  This program is licensed "as is" without any warranty of any
- * kind, whether express or implied.
- */
-
-/dts-v1/;
-#include "r8a7740.dtsi"
-#include <dt-bindings/gpio/gpio.h>
-#include <dt-bindings/input/input.h>
-#include <dt-bindings/interrupt-controller/irq.h>
-#include <dt-bindings/pwm/pwm.h>
-
-/ {
-       model = "armadillo 800 eva reference";
-       compatible = "renesas,armadillo800eva-reference", "renesas,r8a7740";
-
-       aliases {
-               serial1 = &scifa1;
-       };
-
-       chosen {
-               bootargs = "console=tty0 console=ttySC1,115200 ignore_loglevel root=/dev/nfs ip=dhcp rw";
-       };
-
-       memory {
-               device_type = "memory";
-               reg = <0x40000000 0x20000000>;
-       };
-
-       reg_3p3v: regulator@0 {
-               compatible = "regulator-fixed";
-               regulator-name = "fixed-3.3V";
-               regulator-min-microvolt = <3300000>;
-               regulator-max-microvolt = <3300000>;
-               regulator-always-on;
-               regulator-boot-on;
-       };
-
-       vcc_sdhi0: regulator@1 {
-               compatible = "regulator-fixed";
-
-               regulator-name = "SDHI0 Vcc";
-               regulator-min-microvolt = <3300000>;
-               regulator-max-microvolt = <3300000>;
-
-               gpio = <&pfc 75 GPIO_ACTIVE_HIGH>;
-               enable-active-high;
-       };
-
-       vccq_sdhi0: regulator@2 {
-               compatible = "regulator-gpio";
-
-               regulator-name = "SDHI0 VccQ";
-               regulator-min-microvolt = <1800000>;
-               regulator-max-microvolt = <3300000>;
-               vin-supply = <&vcc_sdhi0>;
-
-               enable-gpio = <&pfc 74 GPIO_ACTIVE_HIGH>;
-               gpios = <&pfc 17 GPIO_ACTIVE_HIGH>;
-               states = <3300000 0
-                         1800000 1>;
-
-               enable-active-high;
-       };
-
-       reg_5p0v: regulator@3 {
-               compatible = "regulator-fixed";
-               regulator-name = "fixed-5.0V";
-               regulator-min-microvolt = <5000000>;
-               regulator-max-microvolt = <5000000>;
-               regulator-always-on;
-               regulator-boot-on;
-       };
-
-       gpio-keys {
-               compatible = "gpio-keys";
-
-               power-key {
-                       gpios = <&pfc 99 GPIO_ACTIVE_LOW>;
-                       linux,code = <KEY_POWER>;
-                       label = "SW3";
-                       gpio-key,wakeup;
-               };
-
-               back-key {
-                       gpios = <&pfc 100 GPIO_ACTIVE_LOW>;
-                       linux,code = <KEY_BACK>;
-                       label = "SW4";
-               };
-
-               menu-key {
-                       gpios = <&pfc 97 GPIO_ACTIVE_LOW>;
-                       linux,code = <KEY_MENU>;
-                       label = "SW5";
-               };
-
-               home-key {
-                       gpios = <&pfc 98 GPIO_ACTIVE_LOW>;
-                       linux,code = <KEY_HOME>;
-                       label = "SW6";
-               };
-       };
-
-       leds {
-               compatible = "gpio-leds";
-               led3 {
-                       gpios = <&pfc 102 GPIO_ACTIVE_HIGH>;
-                       label = "LED3";
-               };
-               led4 {
-                       gpios = <&pfc 111 GPIO_ACTIVE_HIGH>;
-                       label = "LED4";
-               };
-               led5 {
-                       gpios = <&pfc 110 GPIO_ACTIVE_HIGH>;
-                       label = "LED5";
-               };
-               led6 {
-                       gpios = <&pfc 177 GPIO_ACTIVE_HIGH>;
-                       label = "LED6";
-               };
-       };
-
-       i2c2: i2c@2 {
-               #address-cells = <1>;
-               #size-cells = <0>;
-               compatible = "i2c-gpio";
-               gpios = <&pfc 208 GPIO_ACTIVE_HIGH /* sda */
-                        &pfc 91 GPIO_ACTIVE_HIGH /* scl */
-                       >;
-               i2c-gpio,delay-us = <5>;
-       };
-
-       backlight {
-               compatible = "pwm-backlight";
-               pwms = <&tpu 2 33333 PWM_POLARITY_INVERTED>;
-               brightness-levels = <0 1 2 4 8 16 32 64 128 255>;
-               default-brightness-level = <9>;
-               pinctrl-0 = <&backlight_pins>;
-               pinctrl-names = "default";
-               power-supply = <&reg_5p0v>;
-               enable-gpios = <&pfc 61 GPIO_ACTIVE_HIGH>;
-       };
-
-       sound {
-               compatible = "simple-audio-card";
-
-               simple-audio-card,format = "i2s";
-
-               simple-audio-card,cpu {
-                       sound-dai = <&sh_fsi2 0>;
-                       bitclock-inversion;
-               };
-
-               simple-audio-card,codec {
-                       sound-dai = <&wm8978>;
-                       bitclock-master;
-                       frame-master;
-                       system-clock-frequency = <12288000>;
-               };
-       };
-};
-
-&ether {
-       pinctrl-0 = <&ether_pins>;
-       pinctrl-names = "default";
-
-       phy-handle = <&phy0>;
-       status = "ok";
-
-       phy0: ethernet-phy@0 {
-               reg = <0>;
-       };
-};
-
-&i2c0 {
-       status = "okay";
-       touchscreen@55 {
-               compatible = "sitronix,st1232";
-               reg = <0x55>;
-               interrupt-parent = <&irqpin1>;
-               interrupts = <2 IRQ_TYPE_LEVEL_LOW>;
-               pinctrl-0 = <&st1232_pins>;
-               pinctrl-names = "default";
-               gpios = <&pfc 166 GPIO_ACTIVE_LOW>;
-       };
-
-       wm8978: wm8978@1a {
-               #sound-dai-cells = <0>;
-               compatible = "wlf,wm8978";
-               reg = <0x1a>;
-       };
-};
-
-&i2c2 {
-       status = "okay";
-       rtc@30 {
-               compatible = "sii,s35390a";
-               reg = <0x30>;
-       };
-};
-
-&pfc {
-       ether_pins: ether {
-               renesas,groups = "gether_mii", "gether_int";
-               renesas,function = "gether";
-       };
-
-       scifa1_pins: serial1 {
-               renesas,groups = "scifa1_data";
-               renesas,function = "scifa1";
-       };
-
-       st1232_pins: touchscreen {
-               renesas,groups = "intc_irq10";
-               renesas,function = "intc";
-       };
-
-       backlight_pins: backlight {
-               renesas,groups = "tpu0_to2_1";
-               renesas,function = "tpu0";
-       };
-
-       mmc0_pins: mmc0 {
-               renesas,groups = "mmc0_data8_1", "mmc0_ctrl_1";
-               renesas,function = "mmc0";
-       };
-
-       sdhi0_pins: sd0 {
-               renesas,groups = "sdhi0_data4", "sdhi0_ctrl", "sdhi0_wp";
-               renesas,function = "sdhi0";
-       };
-
-       fsia_pins: sounda {
-               renesas,groups = "fsia_sclk_in", "fsia_mclk_out",
-                                "fsia_data_in_1", "fsia_data_out_0";
-               renesas,function = "fsia";
-       };
-};
-
-&tpu {
-       status = "okay";
-};
-
-&mmcif0 {
-       pinctrl-0 = <&mmc0_pins>;
-       pinctrl-names = "default";
-
-       vmmc-supply = <&reg_3p3v>;
-       bus-width = <8>;
-       non-removable;
-       status = "okay";
-};
-
-&scifa1 {
-       pinctrl-0 = <&scifa1_pins>;
-       pinctrl-names = "default";
-
-       status = "okay";
-};
-
-&sdhi0 {
-       pinctrl-0 = <&sdhi0_pins>;
-       pinctrl-names = "default";
-
-       vmmc-supply = <&vcc_sdhi0>;
-       vqmmc-supply = <&vccq_sdhi0>;
-       bus-width = <4>;
-       cd-gpios = <&pfc 167 GPIO_ACTIVE_LOW>;
-       status = "okay";
-};
-
-&sh_fsi2 {
-       pinctrl-0 = <&fsia_pins>;
-       pinctrl-names = "default";
-
-       status = "okay";
-};
index a06a11e1a84026efaf0cc39914e7629c1fde72a1..effb7b46f13172d5cb30180caa283a05fd9a5a72 100644 (file)
 
 /dts-v1/;
 #include "r8a7740.dtsi"
+#include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/input/input.h>
+#include <dt-bindings/interrupt-controller/irq.h>
+#include <dt-bindings/pwm/pwm.h>
 
 / {
        model = "armadillo 800 eva";
-       compatible = "renesas,armadillo800eva";
+       compatible = "renesas,armadillo800eva", "renesas,r8a7740";
+
+       aliases {
+               serial1 = &scifa1;
+       };
 
        chosen {
                bootargs = "console=tty0 console=ttySC1,115200 earlyprintk=sh-sci.1,115200 ignore_loglevel root=/dev/nfs ip=dhcp rw";
                device_type = "memory";
                reg = <0x40000000 0x20000000>;
        };
+
+       reg_3p3v: regulator@0 {
+               compatible = "regulator-fixed";
+               regulator-name = "fixed-3.3V";
+               regulator-min-microvolt = <3300000>;
+               regulator-max-microvolt = <3300000>;
+               regulator-always-on;
+               regulator-boot-on;
+       };
+
+       vcc_sdhi0: regulator@1 {
+               compatible = "regulator-fixed";
+
+               regulator-name = "SDHI0 Vcc";
+               regulator-min-microvolt = <3300000>;
+               regulator-max-microvolt = <3300000>;
+
+               gpio = <&pfc 75 GPIO_ACTIVE_HIGH>;
+               enable-active-high;
+       };
+
+       vccq_sdhi0: regulator@2 {
+               compatible = "regulator-gpio";
+
+               regulator-name = "SDHI0 VccQ";
+               regulator-min-microvolt = <1800000>;
+               regulator-max-microvolt = <3300000>;
+               vin-supply = <&vcc_sdhi0>;
+
+               enable-gpio = <&pfc 74 GPIO_ACTIVE_HIGH>;
+               gpios = <&pfc 17 GPIO_ACTIVE_HIGH>;
+               states = <3300000 0
+                         1800000 1>;
+
+               enable-active-high;
+       };
+
+       reg_5p0v: regulator@3 {
+               compatible = "regulator-fixed";
+               regulator-name = "fixed-5.0V";
+               regulator-min-microvolt = <5000000>;
+               regulator-max-microvolt = <5000000>;
+               regulator-always-on;
+               regulator-boot-on;
+       };
+
+       gpio-keys {
+               compatible = "gpio-keys";
+
+               power-key {
+                       gpios = <&pfc 99 GPIO_ACTIVE_LOW>;
+                       linux,code = <KEY_POWER>;
+                       label = "SW3";
+                       gpio-key,wakeup;
+               };
+
+               back-key {
+                       gpios = <&pfc 100 GPIO_ACTIVE_LOW>;
+                       linux,code = <KEY_BACK>;
+                       label = "SW4";
+               };
+
+               menu-key {
+                       gpios = <&pfc 97 GPIO_ACTIVE_LOW>;
+                       linux,code = <KEY_MENU>;
+                       label = "SW5";
+               };
+
+               home-key {
+                       gpios = <&pfc 98 GPIO_ACTIVE_LOW>;
+                       linux,code = <KEY_HOME>;
+                       label = "SW6";
+               };
+       };
+
+       leds {
+               compatible = "gpio-leds";
+               led3 {
+                       gpios = <&pfc 102 GPIO_ACTIVE_HIGH>;
+                       label = "LED3";
+               };
+               led4 {
+                       gpios = <&pfc 111 GPIO_ACTIVE_HIGH>;
+                       label = "LED4";
+               };
+               led5 {
+                       gpios = <&pfc 110 GPIO_ACTIVE_HIGH>;
+                       label = "LED5";
+               };
+               led6 {
+                       gpios = <&pfc 177 GPIO_ACTIVE_HIGH>;
+                       label = "LED6";
+               };
+       };
+
+       i2c2: i2c@2 {
+               #address-cells = <1>;
+               #size-cells = <0>;
+               compatible = "i2c-gpio";
+               gpios = <&pfc 208 GPIO_ACTIVE_HIGH /* sda */
+                        &pfc 91 GPIO_ACTIVE_HIGH /* scl */
+                       >;
+               i2c-gpio,delay-us = <5>;
+       };
+
+       backlight {
+               compatible = "pwm-backlight";
+               pwms = <&tpu 2 33333 PWM_POLARITY_INVERTED>;
+               brightness-levels = <0 1 2 4 8 16 32 64 128 255>;
+               default-brightness-level = <9>;
+               pinctrl-0 = <&backlight_pins>;
+               pinctrl-names = "default";
+               power-supply = <&reg_5p0v>;
+               enable-gpios = <&pfc 61 GPIO_ACTIVE_HIGH>;
+       };
+
+       sound {
+               compatible = "simple-audio-card";
+
+               simple-audio-card,format = "i2s";
+
+               simple-audio-card,cpu {
+                       sound-dai = <&sh_fsi2 0>;
+                       bitclock-inversion;
+               };
+
+               simple-audio-card,codec {
+                       sound-dai = <&wm8978>;
+                       bitclock-master;
+                       frame-master;
+                       system-clock-frequency = <12288000>;
+               };
+       };
+};
+
+&ether {
+       pinctrl-0 = <&ether_pins>;
+       pinctrl-names = "default";
+
+       phy-handle = <&phy0>;
+       status = "ok";
+
+       phy0: ethernet-phy@0 {
+               reg = <0>;
+       };
+};
+
+&extal1_clk {
+       clock-frequency = <25000000>;
+};
+&extal2_clk {
+       clock-frequency = <48000000>;
+};
+&fsibck_clk {
+       clock-frequency = <12288000>;
+};
+&cpg_clocks {
+       renesas,mode = <0x05>; /* MD_CK0 | MD_CK2 */
+};
+
+&cmt1 {
+       status = "ok";
+};
+
+&i2c0 {
+       status = "okay";
+       touchscreen@55 {
+               compatible = "sitronix,st1232";
+               reg = <0x55>;
+               interrupt-parent = <&irqpin1>;
+               interrupts = <2 IRQ_TYPE_LEVEL_LOW>;
+               pinctrl-0 = <&st1232_pins>;
+               pinctrl-names = "default";
+               gpios = <&pfc 166 GPIO_ACTIVE_LOW>;
+       };
+
+       wm8978: wm8978@1a {
+               #sound-dai-cells = <0>;
+               compatible = "wlf,wm8978";
+               reg = <0x1a>;
+       };
+};
+
+&i2c2 {
+       status = "okay";
+       rtc@30 {
+               compatible = "sii,s35390a";
+               reg = <0x30>;
+       };
+};
+
+&pfc {
+       ether_pins: ether {
+               renesas,groups = "gether_mii", "gether_int";
+               renesas,function = "gether";
+       };
+
+       scifa1_pins: serial1 {
+               renesas,groups = "scifa1_data";
+               renesas,function = "scifa1";
+       };
+
+       st1232_pins: touchscreen {
+               renesas,groups = "intc_irq10";
+               renesas,function = "intc";
+       };
+
+       backlight_pins: backlight {
+               renesas,groups = "tpu0_to2_1";
+               renesas,function = "tpu0";
+       };
+
+       mmc0_pins: mmc0 {
+               renesas,groups = "mmc0_data8_1", "mmc0_ctrl_1";
+               renesas,function = "mmc0";
+       };
+
+       sdhi0_pins: sd0 {
+               renesas,groups = "sdhi0_data4", "sdhi0_ctrl", "sdhi0_wp";
+               renesas,function = "sdhi0";
+       };
+
+       fsia_pins: sounda {
+               renesas,groups = "fsia_sclk_in", "fsia_mclk_out",
+                                "fsia_data_in_1", "fsia_data_out_0";
+               renesas,function = "fsia";
+       };
+};
+
+&tpu {
+       status = "okay";
+};
+
+&mmcif0 {
+       pinctrl-0 = <&mmc0_pins>;
+       pinctrl-names = "default";
+
+       vmmc-supply = <&reg_3p3v>;
+       bus-width = <8>;
+       non-removable;
+       status = "okay";
+};
+
+&scifa1 {
+       pinctrl-0 = <&scifa1_pins>;
+       pinctrl-names = "default";
+
+       status = "okay";
+};
+
+&sdhi0 {
+       pinctrl-0 = <&sdhi0_pins>;
+       pinctrl-names = "default";
+
+       vmmc-supply = <&vcc_sdhi0>;
+       vqmmc-supply = <&vccq_sdhi0>;
+       bus-width = <4>;
+       cd-gpios = <&pfc 167 GPIO_ACTIVE_LOW>;
+       status = "okay";
+};
+
+&sh_fsi2 {
+       pinctrl-0 = <&fsia_pins>;
+       pinctrl-names = "default";
+
+       status = "okay";
 };
index bda18fb3d9e5cad7fa61bb5419eea0db07a59785..d46c213a17ad5de43972fd4f7b28beda61b53347 100644 (file)
@@ -10,6 +10,7 @@
 
 /include/ "skeleton.dtsi"
 
+#include <dt-bindings/clock/r8a7740-clock.h>
 #include <dt-bindings/interrupt-controller/irq.h>
 
 / {
                interrupts = <0 83 IRQ_TYPE_LEVEL_HIGH>;
        };
 
+       cmt1: timer@e6138000 {
+               compatible = "renesas,cmt-48-r8a7740", "renesas,cmt-48";
+               reg = <0xe6138000 0x170>;
+               interrupts = <0 58 IRQ_TYPE_LEVEL_HIGH>;
+               clocks = <&mstp3_clks R8A7740_CLK_CMT1>;
+               clock-names = "fck";
+
+               renesas,channels-mask = <0x3f>;
+
+               status = "disabled";
+       };
+
        /* irqpin0: IRQ0 - IRQ7 */
        irqpin0: irqpin@e6900000 {
                compatible = "renesas,intc-irqpin-r8a7740", "renesas,intc-irqpin";
                reg = <0xe9a00000 0x800>,
                      <0xe9a01800 0x800>;
                interrupts = <0 110 IRQ_TYPE_LEVEL_HIGH>;
-               /* clocks = <&mstp3_clks R8A7740_CLK_GETHER>; */
+               clocks = <&mstp3_clks R8A7740_CLK_GETHER>;
                phy-mode = "mii";
                #address-cells = <1>;
                #size-cells = <0>;
                              0 202 IRQ_TYPE_LEVEL_HIGH
                              0 203 IRQ_TYPE_LEVEL_HIGH
                              0 204 IRQ_TYPE_LEVEL_HIGH>;
+               clocks = <&mstp1_clks R8A7740_CLK_IIC0>;
                status = "disabled";
        };
 
                              0 71 IRQ_TYPE_LEVEL_HIGH
                              0 72 IRQ_TYPE_LEVEL_HIGH
                              0 73 IRQ_TYPE_LEVEL_HIGH>;
+               clocks = <&mstp3_clks R8A7740_CLK_IIC1>;
                status = "disabled";
        };
 
                compatible = "renesas,scifa-r8a7740", "renesas,scifa";
                reg = <0xe6c40000 0x100>;
                interrupts = <0 100 IRQ_TYPE_LEVEL_HIGH>;
+               clocks = <&mstp2_clks R8A7740_CLK_SCIFA0>;
+               clock-names = "sci_ick";
                status = "disabled";
        };
 
                compatible = "renesas,scifa-r8a7740", "renesas,scifa";
                reg = <0xe6c50000 0x100>;
                interrupts = <0 101 IRQ_TYPE_LEVEL_HIGH>;
+               clocks = <&mstp2_clks R8A7740_CLK_SCIFA1>;
+               clock-names = "sci_ick";
                status = "disabled";
        };
 
                compatible = "renesas,scifa-r8a7740", "renesas,scifa";
                reg = <0xe6c60000 0x100>;
                interrupts = <0 102 IRQ_TYPE_LEVEL_HIGH>;
+               clocks = <&mstp2_clks R8A7740_CLK_SCIFA0>;
+               clock-names = "sci_ick";
                status = "disabled";
        };
 
                compatible = "renesas,scifa-r8a7740", "renesas,scifa";
                reg = <0xe6c70000 0x100>;
                interrupts = <0 103 IRQ_TYPE_LEVEL_HIGH>;
+               clocks = <&mstp2_clks R8A7740_CLK_SCIFA3>;
+               clock-names = "sci_ick";
                status = "disabled";
        };
 
                compatible = "renesas,scifa-r8a7740", "renesas,scifa";
                reg = <0xe6c80000 0x100>;
                interrupts = <0 104 IRQ_TYPE_LEVEL_HIGH>;
+               clocks = <&mstp2_clks R8A7740_CLK_SCIFA4>;
+               clock-names = "sci_ick";
                status = "disabled";
        };
 
                compatible = "renesas,scifa-r8a7740", "renesas,scifa";
                reg = <0xe6cb0000 0x100>;
                interrupts = <0 105 IRQ_TYPE_LEVEL_HIGH>;
+               clocks = <&mstp2_clks R8A7740_CLK_SCIFA5>;
+               clock-names = "sci_ick";
                status = "disabled";
        };
 
                compatible = "renesas,scifa-r8a7740", "renesas,scifa";
                reg = <0xe6cc0000 0x100>;
                interrupts = <0 106 IRQ_TYPE_LEVEL_HIGH>;
+               clocks = <&mstp2_clks R8A7740_CLK_SCIFA6>;
+               clock-names = "sci_ick";
                status = "disabled";
        };
 
                compatible = "renesas,scifa-r8a7740", "renesas,scifa";
                reg = <0xe6cd0000 0x100>;
                interrupts = <0 107 IRQ_TYPE_LEVEL_HIGH>;
+               clocks = <&mstp2_clks R8A7740_CLK_SCIFA7>;
+               clock-names = "sci_ick";
                status = "disabled";
        };
 
                compatible = "renesas,scifb-r8a7740", "renesas,scifb";
                reg = <0xe6c30000 0x100>;
                interrupts = <0 108 IRQ_TYPE_LEVEL_HIGH>;
+               clocks = <&mstp2_clks R8A7740_CLK_SCIFB>;
+               clock-names = "sci_ick";
                status = "disabled";
        };
 
        tpu: pwm@e6600000 {
                compatible = "renesas,tpu-r8a7740", "renesas,tpu";
                reg = <0xe6600000 0x100>;
+               clocks = <&mstp3_clks R8A7740_CLK_TPU0>;
                status = "disabled";
                #pwm-cells = <3>;
        };
                reg = <0xe6bd0000 0x100>;
                interrupts = <0 56 IRQ_TYPE_LEVEL_HIGH
                              0 57 IRQ_TYPE_LEVEL_HIGH>;
+               clocks = <&mstp3_clks R8A7740_CLK_MMC>;
                status = "disabled";
        };
 
                interrupts = <0 117 IRQ_TYPE_LEVEL_HIGH
                              0 118 IRQ_TYPE_LEVEL_HIGH
                              0 119 IRQ_TYPE_LEVEL_HIGH>;
+               clocks = <&mstp3_clks R8A7740_CLK_SDHI0>;
                cap-sd-highspeed;
                cap-sdio-irq;
                status = "disabled";
                interrupts = <0 121 IRQ_TYPE_LEVEL_HIGH
                              0 122 IRQ_TYPE_LEVEL_HIGH
                              0 123 IRQ_TYPE_LEVEL_HIGH>;
+               clocks = <&mstp3_clks R8A7740_CLK_SDHI1>;
                cap-sd-highspeed;
                cap-sdio-irq;
                status = "disabled";
                interrupts = <0 125 IRQ_TYPE_LEVEL_HIGH
                              0 126 IRQ_TYPE_LEVEL_HIGH
                              0 127 IRQ_TYPE_LEVEL_HIGH>;
+               clocks = <&mstp4_clks R8A7740_CLK_SDHI2>;
                cap-sd-highspeed;
                cap-sdio-irq;
                status = "disabled";
                compatible = "renesas,fsi2-r8a7740", "renesas,sh_fsi2";
                reg = <0xfe1f0000 0x400>;
                interrupts = <0 9 0x4>;
+               clocks = <&mstp3_clks R8A7740_CLK_FSI>;
                status = "disabled";
        };
+
+       clocks {
+               #address-cells = <1>;
+               #size-cells = <1>;
+               ranges;
+
+               /* External root clock */
+               extalr_clk: extalr_clk {
+                       compatible = "fixed-clock";
+                       #clock-cells = <0>;
+                       clock-frequency = <32768>;
+                       clock-output-names = "extalr";
+               };
+               extal1_clk: extal1_clk {
+                       compatible = "fixed-clock";
+                       #clock-cells = <0>;
+                       clock-frequency = <0>;
+                       clock-output-names = "extal1";
+               };
+               extal2_clk: extal2_clk {
+                       compatible = "fixed-clock";
+                       #clock-cells = <0>;
+                       clock-frequency = <0>;
+                       clock-output-names = "extal2";
+               };
+               dv_clk: dv_clk {
+                       compatible = "fixed-clock";
+                       #clock-cells = <0>;
+                       clock-frequency = <27000000>;
+                       clock-output-names = "dv";
+               };
+               fsiack_clk: fsiack_clk {
+                       compatible = "fixed-clock";
+                       #clock-cells = <0>;
+                       clock-frequency = <0>;
+                       clock-output-names = "fsiack";
+               };
+               fsibck_clk: fsibck_clk {
+                       compatible = "fixed-clock";
+                       #clock-cells = <0>;
+                       clock-frequency = <0>;
+                       clock-output-names = "fsibck";
+               };
+
+               /* Special CPG clocks */
+               cpg_clocks: cpg_clocks@e6150000 {
+                       compatible = "renesas,r8a7740-cpg-clocks";
+                       reg = <0xe6150000 0x10000>;
+                       clocks = <&extal1_clk>, <&extalr_clk>;
+                       #clock-cells = <1>;
+                       clock-output-names = "system", "pllc0", "pllc1",
+                                            "pllc2", "r",
+                                            "usb24s",
+                                            "i", "zg", "b", "m1", "hp",
+                                            "hpp", "usbp", "s", "zb", "m3",
+                                            "cp";
+               };
+
+               /* Variable factor clocks (DIV6) */
+               sub_clk: sub_clk@e6150080 {
+                       compatible = "renesas,r8a7740-div6-clock", "renesas,cpg-div6-clock";
+                       reg = <0xe6150080 4>;
+                       clocks = <&pllc1_div2_clk>;
+                       #clock-cells = <0>;
+                       clock-output-names = "sub";
+               };
+
+               /* Fixed factor clocks */
+               pllc1_div2_clk: pllc1_div2_clk {
+                       compatible = "fixed-factor-clock";
+                       clocks = <&cpg_clocks R8A7740_CLK_PLLC1>;
+                       #clock-cells = <0>;
+                       clock-div = <2>;
+                       clock-mult = <1>;
+                       clock-output-names = "pllc1_div2";
+               };
+               extal1_div2_clk: extal1_div2_clk {
+                       compatible = "fixed-factor-clock";
+                       clocks = <&extal1_clk>;
+                       #clock-cells = <0>;
+                       clock-div = <2>;
+                       clock-mult = <1>;
+                       clock-output-names = "extal1_div2";
+               };
+
+               /* Gate clocks */
+               subck_clks: subck_clks@e6150080 {
+                       compatible = "renesas,r8a7740-mstp-clocks", "renesas,cpg-mstp-clocks";
+                       reg = <0xe6150080 4>;
+                       clocks = <&sub_clk>, <&sub_clk>;
+                       #clock-cells = <1>;
+                       renesas,clock-indices = <
+                               R8A7740_CLK_SUBCK R8A7740_CLK_SUBCK2
+                       >;
+                       clock-output-names =
+                               "subck", "subck2";
+               };
+               mstp1_clks: mstp1_clks@e6150134 {
+                       compatible = "renesas,r8a7740-mstp-clocks", "renesas,cpg-mstp-clocks";
+                       reg = <0xe6150134 4>, <0xe6150038 4>;
+                       clocks = <&cpg_clocks R8A7740_CLK_S>,
+                                <&cpg_clocks R8A7740_CLK_S>, <&sub_clk>,
+                                <&cpg_clocks R8A7740_CLK_B>,
+                                <&sub_clk>, <&sub_clk>,
+                                <&cpg_clocks R8A7740_CLK_B>;
+                       #clock-cells = <1>;
+                       renesas,clock-indices = <
+                               R8A7740_CLK_CEU21 R8A7740_CLK_CEU20 R8A7740_CLK_TMU0
+                               R8A7740_CLK_LCDC1 R8A7740_CLK_IIC0 R8A7740_CLK_TMU1
+                               R8A7740_CLK_LCDC0
+                       >;
+                       clock-output-names =
+                               "ceu21", "ceu20", "tmu0", "lcdc1", "iic0",
+                               "tmu1", "lcdc0";
+               };
+               mstp2_clks: mstp2_clks@e6150138 {
+                       compatible = "renesas,r8a7740-mstp-clocks", "renesas,cpg-mstp-clocks";
+                       reg = <0xe6150138 4>, <0xe6150040 4>;
+                       clocks = <&sub_clk>, <&sub_clk>,
+                                <&cpg_clocks R8A7740_CLK_HP>,
+                                <&cpg_clocks R8A7740_CLK_HP>,
+                                <&cpg_clocks R8A7740_CLK_HP>,
+                                <&cpg_clocks R8A7740_CLK_HP>,
+                                <&sub_clk>, <&sub_clk>, <&sub_clk>,
+                                <&sub_clk>, <&sub_clk>, <&sub_clk>,
+                                <&sub_clk>;
+                       #clock-cells = <1>;
+                       renesas,clock-indices = <
+                               R8A7740_CLK_SCIFA6 R8A7740_CLK_SCIFA7
+                               R8A7740_CLK_DMAC1 R8A7740_CLK_DMAC2
+                               R8A7740_CLK_DMAC3 R8A7740_CLK_USBDMAC
+                               R8A7740_CLK_SCIFA5 R8A7740_CLK_SCIFB
+                               R8A7740_CLK_SCIFA0 R8A7740_CLK_SCIFA1
+                               R8A7740_CLK_SCIFA2 R8A7740_CLK_SCIFA3
+                               R8A7740_CLK_SCIFA4
+                       >;
+                       clock-output-names =
+                               "scifa6", "scifa7", "dmac1", "dmac2", "dmac3",
+                               "usbdmac", "scifa5", "scifb", "scifa0", "scifa1",
+                               "scifa2", "scifa3", "scifa4";
+               };
+               mstp3_clks: mstp3_clks@e615013c {
+                       compatible = "renesas,r8a7740-mstp-clocks", "renesas,cpg-mstp-clocks";
+                       reg = <0xe615013c 4>, <0xe6150048 4>;
+                       clocks = <&cpg_clocks R8A7740_CLK_R>,
+                                <&cpg_clocks R8A7740_CLK_HP>,
+                                <&sub_clk>,
+                                <&cpg_clocks R8A7740_CLK_HP>,
+                                <&cpg_clocks R8A7740_CLK_HP>,
+                                <&cpg_clocks R8A7740_CLK_HP>,
+                                <&cpg_clocks R8A7740_CLK_HP>,
+                                <&cpg_clocks R8A7740_CLK_HP>,
+                                <&cpg_clocks R8A7740_CLK_HP>;
+                       #clock-cells = <1>;
+                       renesas,clock-indices = <
+                               R8A7740_CLK_CMT1 R8A7740_CLK_FSI R8A7740_CLK_IIC1
+                               R8A7740_CLK_USBF R8A7740_CLK_SDHI0 R8A7740_CLK_SDHI1
+                               R8A7740_CLK_MMC R8A7740_CLK_GETHER R8A7740_CLK_TPU0
+                       >;
+                       clock-output-names =
+                               "cmt1", "fsi", "iic1", "usbf", "sdhi0", "sdhi1",
+                               "mmc", "gether", "tpu0";
+               };
+               mstp4_clks: mstp4_clks@e6150140 {
+                       compatible = "renesas,r8a7740-mstp-clocks", "renesas,cpg-mstp-clocks";
+                       reg = <0xe6150140 4>, <0xe615004c 4>;
+                       clocks = <&cpg_clocks R8A7740_CLK_HP>,
+                                <&cpg_clocks R8A7740_CLK_HP>,
+                                <&cpg_clocks R8A7740_CLK_HP>,
+                                <&cpg_clocks R8A7740_CLK_HP>;
+                       #clock-cells = <1>;
+                       renesas,clock-indices = <
+                               R8A7740_CLK_USBH R8A7740_CLK_SDHI2
+                               R8A7740_CLK_USBFUNC R8A7740_CLK_USBPHY
+                       >;
+                       clock-output-names =
+                               "usbhost", "sdhi2", "usbfunc", "usphy";
+               };
+       };
 };
index ecfdf4b01b5a6efd93da66181688be009ae7f808..315ec62cb96b9ab5a9aed287ae2edd76a8c40608 100644 (file)
        interrupt-parent = <&gic>;
 
        cpus {
+               #address-cells = <1>;
+               #size-cells = <0>;
+
                cpu@0 {
+                       device_type = "cpu";
                        compatible = "arm,cortex-a9";
+                       reg = <0>;
+                       clock-frequency = <800000000>;
                };
        };
 
index 5745555df9433fb4573aebba1f8ec3578b6f45d1..c160404e4d405eb2acedc5affd96781ee8bca162 100644 (file)
        clock-frequency = <31250000>;
 };
 
+&tmu0 {
+       status = "okay";
+};
+
 &pfc {
        lan0_pins: lan0 {
                intc {
index 58d0d952d60e511b235fae39ab5afce807434592..72891e5f0f1bf958e70d7b12aa0a920b0faa917f 100644 (file)
                reg = <0xffc48000 0x38>;
        };
 
+       tmu0: timer@ffd80000 {
+               compatible = "renesas,tmu-r8a7779", "renesas,tmu";
+               reg = <0xffd80000 0x30>;
+               interrupts = <0 32 IRQ_TYPE_LEVEL_HIGH>,
+                            <0 33 IRQ_TYPE_LEVEL_HIGH>,
+                            <0 34 IRQ_TYPE_LEVEL_HIGH>;
+               clocks = <&mstp0_clks R8A7779_CLK_TMU0>;
+               clock-names = "fck";
+
+               #renesas,channels = <3>;
+
+               status = "disabled";
+       };
+
+       tmu1: timer@ffd81000 {
+               compatible = "renesas,tmu-r8a7779", "renesas,tmu";
+               reg = <0xffd81000 0x30>;
+               interrupts = <0 36 IRQ_TYPE_LEVEL_HIGH>,
+                            <0 37 IRQ_TYPE_LEVEL_HIGH>,
+                            <0 38 IRQ_TYPE_LEVEL_HIGH>;
+               clocks = <&mstp0_clks R8A7779_CLK_TMU1>;
+               clock-names = "fck";
+
+               #renesas,channels = <3>;
+
+               status = "disabled";
+       };
+
+       tmu2: timer@ffd82000 {
+               compatible = "renesas,tmu-r8a7779", "renesas,tmu";
+               reg = <0xffd82000 0x30>;
+               interrupts = <0 40 IRQ_TYPE_LEVEL_HIGH>,
+                            <0 41 IRQ_TYPE_LEVEL_HIGH>,
+                            <0 42 IRQ_TYPE_LEVEL_HIGH>;
+               clocks = <&mstp0_clks R8A7779_CLK_TMU2>;
+               clock-names = "fck";
+
+               #renesas,channels = <3>;
+
+               status = "disabled";
+       };
+
        sata: sata@fc600000 {
                compatible = "renesas,rcar-sata";
                reg = <0xfc600000 0x2000>;
index 856b4236b67470a6a484116f71cad2ccf58ebb98..7853c2c15ce67e852b2e79bb7c546973ea23c2bc 100644 (file)
        };
 };
 
+&cmt0 {
+       status = "ok";
+};
+
 &mmcif1 {
        pinctrl-0 = <&mmc1_pins>;
        pinctrl-names = "default";
index d9ddecbb859c122e022204d60f5dc350694fd5ff..aa146d2d10227a6d3ef469abac6029cd0eaf7f15 100644 (file)
                             <1 10 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_LOW)>;
        };
 
+       cmt0: timer@ffca0000 {
+               compatible = "renesas,cmt-48-r8a7790", "renesas,cmt-48-gen2";
+               reg = <0 0xffca0000 0 0x1004>;
+               interrupts = <0 142 IRQ_TYPE_LEVEL_HIGH>,
+                            <0 143 IRQ_TYPE_LEVEL_HIGH>;
+               clocks = <&mstp1_clks R8A7790_CLK_CMT0>;
+               clock-names = "fck";
+
+               renesas,channels-mask = <0x60>;
+
+               status = "disabled";
+       };
+
+       cmt1: timer@e6130000 {
+               compatible = "renesas,cmt-48-r8a7790", "renesas,cmt-48-gen2";
+               reg = <0 0xe6130000 0 0x1004>;
+               interrupts = <0 120 IRQ_TYPE_LEVEL_HIGH>,
+                            <0 121 IRQ_TYPE_LEVEL_HIGH>,
+                            <0 122 IRQ_TYPE_LEVEL_HIGH>,
+                            <0 123 IRQ_TYPE_LEVEL_HIGH>,
+                            <0 124 IRQ_TYPE_LEVEL_HIGH>,
+                            <0 125 IRQ_TYPE_LEVEL_HIGH>,
+                            <0 126 IRQ_TYPE_LEVEL_HIGH>,
+                            <0 127 IRQ_TYPE_LEVEL_HIGH>;
+               clocks = <&mstp3_clks R8A7790_CLK_CMT1>;
+               clock-names = "fck";
+
+               renesas,channels-mask = <0xff>;
+
+               status = "disabled";
+       };
+
        irqc0: interrupt-controller@e61c0000 {
                compatible = "renesas,irqc-r8a7790", "renesas,irqc";
                #interrupt-cells = <2>;
index be59014474b20114b77ff0d7043b05635b4d9013..740308e09457dbe139f50e81b30a5185b8550d4d 100644 (file)
        };
 };
 
+&cmt0 {
+       status = "ok";
+};
+
 &sata0 {
        status = "okay";
 };
index 0d82a4b3c650cf197c107a88a7d962378cf94e16..e270f38d827fd53b124cc889b2fcda542898066e 100644 (file)
                             <1 10 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_LOW)>;
        };
 
+       cmt0: timer@ffca0000 {
+               compatible = "renesas,cmt-48-r8a7791", "renesas,cmt-48-gen2";
+               reg = <0 0xffca0000 0 0x1004>;
+               interrupts = <0 142 IRQ_TYPE_LEVEL_HIGH>,
+                            <0 143 IRQ_TYPE_LEVEL_HIGH>;
+               clocks = <&mstp1_clks R8A7791_CLK_CMT0>;
+               clock-names = "fck";
+
+               renesas,channels-mask = <0x60>;
+
+               status = "disabled";
+       };
+
+       cmt1: timer@e6130000 {
+               compatible = "renesas,cmt-48-r8a7791", "renesas,cmt-48-gen2";
+               reg = <0 0xe6130000 0 0x1004>;
+               interrupts = <0 120 IRQ_TYPE_LEVEL_HIGH>,
+                            <0 121 IRQ_TYPE_LEVEL_HIGH>,
+                            <0 122 IRQ_TYPE_LEVEL_HIGH>,
+                            <0 123 IRQ_TYPE_LEVEL_HIGH>,
+                            <0 124 IRQ_TYPE_LEVEL_HIGH>,
+                            <0 125 IRQ_TYPE_LEVEL_HIGH>,
+                            <0 126 IRQ_TYPE_LEVEL_HIGH>,
+                            <0 127 IRQ_TYPE_LEVEL_HIGH>;
+               clocks = <&mstp3_clks R8A7791_CLK_CMT1>;
+               clock-names = "fck";
+
+               renesas,channels-mask = <0xff>;
+
+               status = "disabled";
+       };
+
        irqc0: interrupt-controller@e61c0000 {
                compatible = "renesas,irqc-r8a7791", "renesas,irqc";
                #interrupt-cells = <2>;
diff --git a/arch/arm/boot/dts/sama5d4.dtsi b/arch/arm/boot/dts/sama5d4.dtsi
new file mode 100644 (file)
index 0000000..e0157b0
--- /dev/null
@@ -0,0 +1,1240 @@
+/*
+ * sama5d4.dtsi - Device Tree Include file for SAMA5D4 family SoC
+ *
+ *  Copyright (C) 2014 Atmel,
+ *                2014 Nicolas Ferre <nicolas.ferre@atmel.com>
+ *
+ * This file is dual-licensed: you can use it either under the terms
+ * of the GPL or the X11 license, at your option. Note that this dual
+ * licensing only applies to this file, and not this project as a
+ * whole.
+ *
+ *  a) This library 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 library 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.
+ *
+ * Or, alternatively,
+ *
+ *  b) Permission is hereby granted, free of charge, to any person
+ *     obtaining a copy of this software and associated documentation
+ *     files (the "Software"), to deal in the Software without
+ *     restriction, including without limitation the rights to use,
+ *     copy, modify, merge, publish, distribute, sublicense, and/or
+ *     sell copies of the Software, and to permit persons to whom the
+ *     Software is furnished to do so, subject to the following
+ *     conditions:
+ *
+ *     The above copyright notice and this permission notice shall be
+ *     included in all copies or substantial portions of the Software.
+ *
+ *     THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ *     EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+ *     OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ *     NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ *     HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ *     WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ *     FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ *     OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#include "skeleton.dtsi"
+#include <dt-bindings/clock/at91.h>
+#include <dt-bindings/pinctrl/at91.h>
+#include <dt-bindings/interrupt-controller/irq.h>
+#include <dt-bindings/gpio/gpio.h>
+
+/ {
+       model = "Atmel SAMA5D4 family SoC";
+       compatible = "atmel,sama5d4";
+       interrupt-parent = <&aic>;
+
+       aliases {
+               serial0 = &usart3;
+               serial1 = &usart4;
+               serial2 = &usart2;
+               gpio0 = &pioA;
+               gpio1 = &pioB;
+               gpio2 = &pioC;
+               gpio4 = &pioE;
+               tcb0 = &tcb0;
+               tcb1 = &tcb1;
+               i2c2 = &i2c2;
+       };
+       cpus {
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               cpu@0 {
+                       device_type = "cpu";
+                       compatible = "arm,cortex-a5";
+                       reg = <0>;
+                       next-level-cache = <&L2>;
+               };
+       };
+
+       memory {
+               reg = <0x20000000 0x20000000>;
+       };
+
+       clocks {
+               slow_xtal: slow_xtal {
+                       compatible = "fixed-clock";
+                       #clock-cells = <0>;
+                       clock-frequency = <0>;
+               };
+
+               main_xtal: main_xtal {
+                       compatible = "fixed-clock";
+                       #clock-cells = <0>;
+                       clock-frequency = <0>;
+               };
+
+               adc_op_clk: adc_op_clk{
+                       compatible = "fixed-clock";
+                       #clock-cells = <0>;
+                       clock-frequency = <1000000>;
+               };
+       };
+
+       ahb {
+               compatible = "simple-bus";
+               #address-cells = <1>;
+               #size-cells = <1>;
+               ranges;
+
+               usb0: gadget@00400000 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       compatible = "atmel,at91sam9rl-udc";
+                       reg = <0x00400000 0x100000
+                              0xfc02c000 0x4000>;
+                       interrupts = <47 IRQ_TYPE_LEVEL_HIGH 2>;
+                       clocks = <&udphs_clk>, <&utmi>;
+                       clock-names = "pclk", "hclk";
+                       status = "disabled";
+
+                       ep0 {
+                               reg = <0>;
+                               atmel,fifo-size = <64>;
+                               atmel,nb-banks = <1>;
+                       };
+
+                       ep1 {
+                               reg = <1>;
+                               atmel,fifo-size = <1024>;
+                               atmel,nb-banks = <3>;
+                               atmel,can-dma;
+                               atmel,can-isoc;
+                       };
+
+                       ep2 {
+                               reg = <2>;
+                               atmel,fifo-size = <1024>;
+                               atmel,nb-banks = <3>;
+                               atmel,can-dma;
+                               atmel,can-isoc;
+                       };
+
+                       ep3 {
+                               reg = <3>;
+                               atmel,fifo-size = <1024>;
+                               atmel,nb-banks = <2>;
+                               atmel,can-dma;
+                               atmel,can-isoc;
+                       };
+
+                       ep4 {
+                               reg = <4>;
+                               atmel,fifo-size = <1024>;
+                               atmel,nb-banks = <2>;
+                               atmel,can-dma;
+                               atmel,can-isoc;
+                       };
+
+                       ep5 {
+                               reg = <5>;
+                               atmel,fifo-size = <1024>;
+                               atmel,nb-banks = <2>;
+                               atmel,can-dma;
+                               atmel,can-isoc;
+                       };
+
+                       ep6 {
+                               reg = <6>;
+                               atmel,fifo-size = <1024>;
+                               atmel,nb-banks = <2>;
+                               atmel,can-dma;
+                               atmel,can-isoc;
+                       };
+
+                       ep7 {
+                               reg = <7>;
+                               atmel,fifo-size = <1024>;
+                               atmel,nb-banks = <2>;
+                               atmel,can-dma;
+                               atmel,can-isoc;
+                       };
+
+                       ep8 {
+                               reg = <8>;
+                               atmel,fifo-size = <1024>;
+                               atmel,nb-banks = <2>;
+                               atmel,can-isoc;
+                       };
+
+                       ep9 {
+                               reg = <9>;
+                               atmel,fifo-size = <1024>;
+                               atmel,nb-banks = <2>;
+                               atmel,can-isoc;
+                       };
+
+                       ep10 {
+                               reg = <10>;
+                               atmel,fifo-size = <1024>;
+                               atmel,nb-banks = <2>;
+                               atmel,can-isoc;
+                       };
+
+                       ep11 {
+                               reg = <11>;
+                               atmel,fifo-size = <1024>;
+                               atmel,nb-banks = <2>;
+                               atmel,can-isoc;
+                       };
+
+                       ep12 {
+                               reg = <12>;
+                               atmel,fifo-size = <1024>;
+                               atmel,nb-banks = <2>;
+                               atmel,can-isoc;
+                       };
+
+                       ep13 {
+                               reg = <13>;
+                               atmel,fifo-size = <1024>;
+                               atmel,nb-banks = <2>;
+                               atmel,can-isoc;
+                       };
+
+                       ep14 {
+                               reg = <14>;
+                               atmel,fifo-size = <1024>;
+                               atmel,nb-banks = <2>;
+                               atmel,can-isoc;
+                       };
+
+                       ep15 {
+                               reg = <15>;
+                               atmel,fifo-size = <1024>;
+                               atmel,nb-banks = <2>;
+                               atmel,can-isoc;
+                       };
+               };
+
+               usb1: ohci@00500000 {
+                       compatible = "atmel,at91rm9200-ohci", "usb-ohci";
+                       reg = <0x00500000 0x100000>;
+                       interrupts = <46 IRQ_TYPE_LEVEL_HIGH 2>;
+                       clocks = <&usb>, <&uhphs_clk>, <&uhphs_clk>,
+                                <&uhpck>;
+                       clock-names = "usb_clk", "ohci_clk", "hclk", "uhpck";
+                       status = "disabled";
+               };
+
+               usb2: ehci@00600000 {
+                       compatible = "atmel,at91sam9g45-ehci", "usb-ehci";
+                       reg = <0x00600000 0x100000>;
+                       interrupts = <46 IRQ_TYPE_LEVEL_HIGH 2>;
+                       clocks = <&usb>, <&uhphs_clk>, <&uhpck>;
+                       clock-names = "usb_clk", "ehci_clk", "uhpck";
+                       status = "disabled";
+               };
+
+               L2: cache-controller@00a00000 {
+                       compatible = "arm,pl310-cache";
+                       reg = <0x00a00000 0x1000>;
+                       interrupts = <67 IRQ_TYPE_LEVEL_HIGH 4>;
+                       cache-unified;
+                       cache-level = <2>;
+               };
+
+               nand0: nand@80000000 {
+                       compatible = "atmel,at91rm9200-nand";
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       ranges;
+                       reg = < 0x80000000 0x08000000   /* EBI CS3 */
+                               0xfc05c070 0x00000490   /* SMC PMECC regs */
+                               0xfc05c500 0x00000100   /* SMC PMECC Error Location regs */
+                               >;
+                       interrupts = <22 IRQ_TYPE_LEVEL_HIGH 6>;
+                       atmel,nand-addr-offset = <21>;
+                       atmel,nand-cmd-offset = <22>;
+                       atmel,nand-has-dma;
+                       pinctrl-names = "default";
+                       pinctrl-0 = <&pinctrl_nand>;
+                       status = "disabled";
+
+                       nfc@90000000 {
+                               compatible = "atmel,sama5d3-nfc";
+                               #address-cells = <1>;
+                               #size-cells = <1>;
+                               reg = <
+                                       0x90000000 0x10000000   /* NFC Command Registers */
+                                       0xfc05c000 0x00000070   /* NFC HSMC regs */
+                                       0x00100000 0x00100000   /* NFC SRAM banks */
+                                         >;
+                               clocks = <&hsmc_clk>;
+                               atmel,write-by-sram;
+                       };
+               };
+
+               apb {
+                       compatible = "simple-bus";
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       ranges;
+
+                       ramc0: ramc@f0010000 {
+                               compatible = "atmel,sama5d3-ddramc";
+                               reg = <0xf0010000 0x200>;
+                               clocks = <&ddrck>, <&mpddr_clk>;
+                               clock-names = "ddrck", "mpddr";
+                       };
+
+                       pmc: pmc@f0018000 {
+                               compatible = "atmel,sama5d3-pmc";
+                               reg = <0xf0018000 0x120>;
+                               interrupts = <1 IRQ_TYPE_LEVEL_HIGH 7>;
+                               interrupt-controller;
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+                               #interrupt-cells = <1>;
+
+                               main_rc_osc: main_rc_osc {
+                                       compatible = "atmel,at91sam9x5-clk-main-rc-osc";
+                                       #clock-cells = <0>;
+                                       interrupt-parent = <&pmc>;
+                                       interrupts = <AT91_PMC_MOSCRCS>;
+                                       clock-frequency = <12000000>;
+                                       clock-accuracy = <100000000>;
+                               };
+
+                               main_osc: main_osc {
+                                       compatible = "atmel,at91rm9200-clk-main-osc";
+                                       #clock-cells = <0>;
+                                       interrupt-parent = <&pmc>;
+                                       interrupts = <AT91_PMC_MOSCS>;
+                                       clocks = <&main_xtal>;
+                               };
+
+                               main: mainck {
+                                       compatible = "atmel,at91sam9x5-clk-main";
+                                       #clock-cells = <0>;
+                                       interrupt-parent = <&pmc>;
+                                       interrupts = <AT91_PMC_MOSCSELS>;
+                                       clocks = <&main_rc_osc &main_osc>;
+                               };
+
+                               plla: pllack {
+                                       compatible = "atmel,sama5d3-clk-pll";
+                                       #clock-cells = <0>;
+                                       interrupt-parent = <&pmc>;
+                                       interrupts = <AT91_PMC_LOCKA>;
+                                       clocks = <&main>;
+                                       reg = <0>;
+                                       atmel,clk-input-range = <12000000 12000000>;
+                                       #atmel,pll-clk-output-range-cells = <4>;
+                                       atmel,pll-clk-output-ranges = <600000000 1200000000 0 0>;
+                               };
+
+                               plladiv: plladivck {
+                                       compatible = "atmel,at91sam9x5-clk-plldiv";
+                                       #clock-cells = <0>;
+                                       clocks = <&plla>;
+                               };
+
+                               utmi: utmick {
+                                       compatible = "atmel,at91sam9x5-clk-utmi";
+                                       #clock-cells = <0>;
+                                       interrupt-parent = <&pmc>;
+                                       interrupts = <AT91_PMC_LOCKU>;
+                                       clocks = <&main>;
+                               };
+
+                               mck: masterck {
+                                       compatible = "atmel,at91sam9x5-clk-master";
+                                       #clock-cells = <0>;
+                                       interrupt-parent = <&pmc>;
+                                       interrupts = <AT91_PMC_MCKRDY>;
+                                       clocks = <&clk32k>, <&main>, <&plladiv>, <&utmi>;
+                                       atmel,clk-output-range = <125000000 177000000>;
+                                       atmel,clk-divisors = <1 2 4 3>;
+                               };
+
+                               h32ck: h32mxck {
+                                       #clock-cells = <0>;
+                                       compatible = "atmel,sama5d4-clk-h32mx";
+                                       clocks = <&mck>;
+                               };
+
+                               usb: usbck {
+                                       compatible = "atmel,at91sam9x5-clk-usb";
+                                       #clock-cells = <0>;
+                                       clocks = <&plladiv>, <&utmi>;
+                               };
+
+                               prog: progck {
+                                       compatible = "atmel,at91sam9x5-clk-programmable";
+                                       #address-cells = <1>;
+                                       #size-cells = <0>;
+                                       interrupt-parent = <&pmc>;
+                                       clocks = <&clk32k>, <&main>, <&plladiv>, <&utmi>, <&mck>;
+
+                                       prog0: prog0 {
+                                               #clock-cells = <0>;
+                                               reg = <0>;
+                                               interrupts = <AT91_PMC_PCKRDY(0)>;
+                                       };
+
+                                       prog1: prog1 {
+                                               #clock-cells = <0>;
+                                               reg = <1>;
+                                               interrupts = <AT91_PMC_PCKRDY(1)>;
+                                       };
+
+                                       prog2: prog2 {
+                                               #clock-cells = <0>;
+                                               reg = <2>;
+                                               interrupts = <AT91_PMC_PCKRDY(2)>;
+                                       };
+                               };
+
+                               smd: smdclk {
+                                       compatible = "atmel,at91sam9x5-clk-smd";
+                                       #clock-cells = <0>;
+                                       clocks = <&plladiv>, <&utmi>;
+                               };
+
+                               systemck {
+                                       compatible = "atmel,at91rm9200-clk-system";
+                                       #address-cells = <1>;
+                                       #size-cells = <0>;
+
+                                       ddrck: ddrck {
+                                               #clock-cells = <0>;
+                                               reg = <2>;
+                                               clocks = <&mck>;
+                                       };
+
+                                       lcdck: lcdck {
+                                               #clock-cells = <0>;
+                                               reg = <4>;
+                                               clocks = <&smd>;
+                                       };
+
+                                       smdck: smdck {
+                                               #clock-cells = <0>;
+                                               reg = <4>;
+                                               clocks = <&smd>;
+                                       };
+
+                                       uhpck: uhpck {
+                                               #clock-cells = <0>;
+                                               reg = <6>;
+                                               clocks = <&usb>;
+                                       };
+
+                                       udpck: udpck {
+                                               #clock-cells = <0>;
+                                               reg = <7>;
+                                               clocks = <&usb>;
+                                       };
+
+                                       pck0: pck0 {
+                                               #clock-cells = <0>;
+                                               reg = <8>;
+                                               clocks = <&prog0>;
+                                       };
+
+                                       pck1: pck1 {
+                                               #clock-cells = <0>;
+                                               reg = <9>;
+                                               clocks = <&prog1>;
+                                       };
+
+                                       pck2: pck2 {
+                                               #clock-cells = <0>;
+                                               reg = <10>;
+                                               clocks = <&prog2>;
+                                       };
+                               };
+
+                               periph32ck {
+                                       compatible = "atmel,at91sam9x5-clk-peripheral";
+                                       #address-cells = <1>;
+                                       #size-cells = <0>;
+                                       clocks = <&h32ck>;
+
+                                       pioD_clk: pioD_clk {
+                                               #clock-cells = <0>;
+                                               reg = <5>;
+                                       };
+
+                                       usart0_clk: usart0_clk {
+                                               #clock-cells = <0>;
+                                               reg = <6>;
+                                       };
+
+                                       usart1_clk: usart1_clk {
+                                               #clock-cells = <0>;
+                                               reg = <7>;
+                                       };
+
+                                       icm_clk: icm_clk {
+                                               #clock-cells = <0>;
+                                               reg = <9>;
+                                       };
+
+                                       aes_clk: aes_clk {
+                                               #clock-cells = <0>;
+                                               reg = <12>;
+                                       };
+
+                                       tdes_clk: tdes_clk {
+                                               #clock-cells = <0>;
+                                               reg = <14>;
+                                       };
+
+                                       sha_clk: sha_clk {
+                                               #clock-cells = <0>;
+                                               reg = <15>;
+                                       };
+
+                                       matrix1_clk: matrix1_clk {
+                                               #clock-cells = <0>;
+                                               reg = <17>;
+                                       };
+
+                                       hsmc_clk: hsmc_clk {
+                                               #clock-cells = <0>;
+                                               reg = <22>;
+                                       };
+
+                                       pioA_clk: pioA_clk {
+                                               #clock-cells = <0>;
+                                               reg = <23>;
+                                       };
+
+                                       pioB_clk: pioB_clk {
+                                               #clock-cells = <0>;
+                                               reg = <24>;
+                                       };
+
+                                       pioC_clk: pioC_clk {
+                                               #clock-cells = <0>;
+                                               reg = <25>;
+                                       };
+
+                                       pioE_clk: pioE_clk {
+                                               #clock-cells = <0>;
+                                               reg = <26>;
+                                       };
+
+                                       uart0_clk: uart0_clk {
+                                               #clock-cells = <0>;
+                                               reg = <27>;
+                                       };
+
+                                       uart1_clk: uart1_clk {
+                                               #clock-cells = <0>;
+                                               reg = <28>;
+                                       };
+
+                                       usart2_clk: usart2_clk {
+                                               #clock-cells = <0>;
+                                               reg = <29>;
+                                       };
+
+                                       usart3_clk: usart3_clk {
+                                               #clock-cells = <0>;
+                                               reg = <30>;
+                                       };
+
+                                       usart4_clk: usart4_clk {
+                                               #clock-cells = <0>;
+                                               reg = <31>;
+                                       };
+
+                                       twi0_clk: twi0_clk {
+                                               reg = <32>;
+                                               #clock-cells = <0>;
+                                       };
+
+                                       twi1_clk: twi1_clk {
+                                               #clock-cells = <0>;
+                                               reg = <33>;
+                                       };
+
+                                       twi2_clk: twi2_clk {
+                                               #clock-cells = <0>;
+                                               reg = <34>;
+                                       };
+
+                                       mci0_clk: mci0_clk {
+                                               #clock-cells = <0>;
+                                               reg = <35>;
+                                       };
+
+                                       mci1_clk: mci1_clk {
+                                               #clock-cells = <0>;
+                                               reg = <36>;
+                                       };
+
+                                       spi0_clk: spi0_clk {
+                                               #clock-cells = <0>;
+                                               reg = <37>;
+                                       };
+
+                                       spi1_clk: spi1_clk {
+                                               #clock-cells = <0>;
+                                               reg = <38>;
+                                       };
+
+                                       spi2_clk: spi2_clk {
+                                               #clock-cells = <0>;
+                                               reg = <39>;
+                                       };
+
+                                       tcb0_clk: tcb0_clk {
+                                               #clock-cells = <0>;
+                                               reg = <40>;
+                                       };
+
+                                       tcb1_clk: tcb1_clk {
+                                               #clock-cells = <0>;
+                                               reg = <41>;
+                                       };
+
+                                       tcb2_clk: tcb2_clk {
+                                               #clock-cells = <0>;
+                                               reg = <42>;
+                                       };
+
+                                       pwm_clk: pwm_clk {
+                                               #clock-cells = <0>;
+                                               reg = <43>;
+                                       };
+
+                                       adc_clk: adc_clk {
+                                               #clock-cells = <0>;
+                                               reg = <44>;
+                                       };
+
+                                       dbgu_clk: dbgu_clk {
+                                               #clock-cells = <0>;
+                                               reg = <45>;
+                                       };
+
+                                       uhphs_clk: uhphs_clk {
+                                               #clock-cells = <0>;
+                                               reg = <46>;
+                                       };
+
+                                       udphs_clk: udphs_clk {
+                                               #clock-cells = <0>;
+                                               reg = <47>;
+                                       };
+
+                                       ssc0_clk: ssc0_clk {
+                                               #clock-cells = <0>;
+                                               reg = <48>;
+                                       };
+
+                                       ssc1_clk: ssc1_clk {
+                                               #clock-cells = <0>;
+                                               reg = <49>;
+                                       };
+
+                                       trng_clk: trng_clk {
+                                               #clock-cells = <0>;
+                                               reg = <53>;
+                                       };
+
+                                       macb0_clk: macb0_clk {
+                                               #clock-cells = <0>;
+                                               reg = <54>;
+                                       };
+
+                                       macb1_clk: macb1_clk {
+                                               #clock-cells = <0>;
+                                               reg = <55>;
+                                       };
+
+                                       fuse_clk: fuse_clk {
+                                               #clock-cells = <0>;
+                                               reg = <57>;
+                                       };
+
+                                       securam_clk: securam_clk {
+                                               #clock-cells = <0>;
+                                               reg = <59>;
+                                       };
+
+                                       smd_clk: smd_clk {
+                                               #clock-cells = <0>;
+                                               reg = <61>;
+                                       };
+
+                                       twi3_clk: twi3_clk {
+                                               #clock-cells = <0>;
+                                               reg = <62>;
+                                       };
+
+                                       catb_clk: catb_clk {
+                                               #clock-cells = <0>;
+                                               reg = <63>;
+                                       };
+                               };
+
+                               periph64ck {
+                                       compatible = "atmel,at91sam9x5-clk-peripheral";
+                                       #address-cells = <1>;
+                                       #size-cells = <0>;
+                                       clocks = <&mck>;
+
+                                       dma0_clk: dma0_clk {
+                                               #clock-cells = <0>;
+                                               reg = <8>;
+                                       };
+
+                                       cpkcc_clk: cpkcc_clk {
+                                               #clock-cells = <0>;
+                                               reg = <10>;
+                                       };
+
+                                       aesb_clk: aesb_clk {
+                                               #clock-cells = <0>;
+                                               reg = <13>;
+                                       };
+
+                                       mpddr_clk: mpddr_clk {
+                                               #clock-cells = <0>;
+                                               reg = <16>;
+                                       };
+
+                                       matrix0_clk: matrix0_clk {
+                                               #clock-cells = <0>;
+                                               reg = <18>;
+                                       };
+
+                                       vdec_clk: vdec_clk {
+                                               #clock-cells = <0>;
+                                               reg = <19>;
+                                       };
+
+                                       dma1_clk: dma1_clk {
+                                               #clock-cells = <0>;
+                                               reg = <50>;
+                                       };
+
+                                       lcd_clk: lcd_clk {
+                                               #clock-cells = <0>;
+                                               reg = <51>;
+                                       };
+
+                                       isi_clk: isi_clk {
+                                               #clock-cells = <0>;
+                                               reg = <52>;
+                                       };
+                               };
+                       };
+
+                       mmc0: mmc@f8000000 {
+                               compatible = "atmel,hsmci";
+                               reg = <0xf8000000 0x600>;
+                               interrupts = <35 IRQ_TYPE_LEVEL_HIGH 0>;
+                               pinctrl-names = "default";
+                               pinctrl-0 = <&pinctrl_mmc0_clk_cmd_dat0 &pinctrl_mmc0_dat1_3>;
+                               status = "disabled";
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+                               clocks = <&mci0_clk>;
+                               clock-names = "mci_clk";
+                       };
+
+                       spi0: spi@f8010000 {
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+                               compatible = "atmel,at91rm9200-spi";
+                               reg = <0xf8010000 0x100>;
+                               interrupts = <37 IRQ_TYPE_LEVEL_HIGH 3>;
+                               pinctrl-names = "default";
+                               pinctrl-0 = <&pinctrl_spi0>;
+                               clocks = <&spi0_clk>;
+                               clock-names = "spi_clk";
+                               status = "disabled";
+                       };
+
+                       i2c0: i2c@f8014000 {
+                               compatible = "atmel,at91sam9x5-i2c";
+                               reg = <0xf8014000 0x4000>;
+                               interrupts = <32 IRQ_TYPE_LEVEL_HIGH 6>;
+                               pinctrl-names = "default";
+                               pinctrl-0 = <&pinctrl_i2c0>;
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+                               clocks = <&twi0_clk>;
+                               status = "disabled";
+                       };
+
+                       tcb0: timer@f801c000 {
+                               compatible = "atmel,at91sam9x5-tcb";
+                               reg = <0xf801c000 0x100>;
+                               interrupts = <40 IRQ_TYPE_LEVEL_HIGH 0>;
+                               clocks = <&tcb0_clk>;
+                               clock-names = "t0_clk";
+                       };
+
+                       macb0: ethernet@f8020000 {
+                               compatible = "atmel,sama5d4-gem";
+                               reg = <0xf8020000 0x100>;
+                               interrupts = <54 IRQ_TYPE_LEVEL_HIGH 3>;
+                               pinctrl-names = "default";
+                               pinctrl-0 = <&pinctrl_macb0_rmii>;
+                               clocks = <&macb0_clk>, <&macb0_clk>;
+                               clock-names = "hclk", "pclk";
+                               status = "disabled";
+                       };
+
+                       i2c2: i2c@f8024000 {
+                               compatible = "atmel,at91sam9x5-i2c";
+                               reg = <0xf8024000 0x4000>;
+                               interrupts = <34 4 6>;
+                               pinctrl-names = "default";
+                               pinctrl-0 = <&pinctrl_i2c2>;
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+                               clocks = <&twi2_clk>;
+                               status = "disabled";
+                       };
+
+                       mmc1: mmc@fc000000 {
+                               compatible = "atmel,hsmci";
+                               reg = <0xfc000000 0x600>;
+                               interrupts = <36 IRQ_TYPE_LEVEL_HIGH 0>;
+                               pinctrl-names = "default";
+                               pinctrl-0 = <&pinctrl_mmc1_clk_cmd_dat0 &pinctrl_mmc1_dat1_3>;
+                               status = "disabled";
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+                               clocks = <&mci1_clk>;
+                               clock-names = "mci_clk";
+                       };
+
+                       usart2: serial@fc008000 {
+                               compatible = "atmel,at91sam9260-usart";
+                               reg = <0xfc008000 0x100>;
+                               interrupts = <29 IRQ_TYPE_LEVEL_HIGH 5>;
+                               pinctrl-names = "default";
+                               pinctrl-0 = <&pinctrl_usart2 &pinctrl_usart2_rts &pinctrl_usart2_cts>;
+                               clocks = <&usart2_clk>;
+                               clock-names = "usart";
+                               status = "disabled";
+                       };
+
+                       usart3: serial@fc00c000 {
+                               compatible = "atmel,at91sam9260-usart";
+                               reg = <0xfc00c000 0x100>;
+                               interrupts = <30 IRQ_TYPE_LEVEL_HIGH 5>;
+                               pinctrl-names = "default";
+                               pinctrl-0 = <&pinctrl_usart3>;
+                               clocks = <&usart3_clk>;
+                               clock-names = "usart";
+                               status = "disabled";
+                       };
+
+                       usart4: serial@fc010000 {
+                               compatible = "atmel,at91sam9260-usart";
+                               reg = <0xfc010000 0x100>;
+                               interrupts = <31 IRQ_TYPE_LEVEL_HIGH 5>;
+                               pinctrl-names = "default";
+                               pinctrl-0 = <&pinctrl_usart4>;
+                               clocks = <&usart4_clk>;
+                               clock-names = "usart";
+                               status = "disabled";
+                       };
+
+                       tcb1: timer@fc020000 {
+                               compatible = "atmel,at91sam9x5-tcb";
+                               reg = <0xfc020000 0x100>;
+                               interrupts = <41 IRQ_TYPE_LEVEL_HIGH 0>;
+                               clocks = <&tcb1_clk>;
+                               clock-names = "t0_clk";
+                       };
+
+                       adc0: adc@fc034000 {
+                               compatible = "atmel,at91sam9x5-adc";
+                               reg = <0xfc034000 0x100>;
+                               interrupts = <44 IRQ_TYPE_LEVEL_HIGH 5>;
+                               pinctrl-names = "default";
+                               pinctrl-0 = <
+                                       /* external trigger is conflict with USBA_VBUS */
+                                       &pinctrl_adc0_ad0
+                                       &pinctrl_adc0_ad1
+                                       &pinctrl_adc0_ad2
+                                       &pinctrl_adc0_ad3
+                                       &pinctrl_adc0_ad4
+                                       >;
+                               clocks = <&adc_clk>,
+                                        <&adc_op_clk>;
+                               clock-names = "adc_clk", "adc_op_clk";
+                               atmel,adc-channels-used = <0x01f>;
+                               atmel,adc-startup-time = <40>;
+                               atmel,adc-use-external;
+                               atmel,adc-vref = <3000>;
+                               atmel,adc-res = <8 10>;
+                               atmel,adc-sample-hold-time = <11>;
+                               atmel,adc-res-names = "lowres", "highres";
+                               atmel,adc-ts-pressure-threshold = <10000>;
+                               status = "disabled";
+
+                               trigger@0 {
+                                       trigger-name = "external-rising";
+                                       trigger-value = <0x1>;
+                                       trigger-external;
+                               };
+                               trigger@1 {
+                                       trigger-name = "external-falling";
+                                       trigger-value = <0x2>;
+                                       trigger-external;
+                               };
+                               trigger@2 {
+                                       trigger-name = "external-any";
+                                       trigger-value = <0x3>;
+                                       trigger-external;
+                               };
+                               trigger@3 {
+                                       trigger-name = "continuous";
+                                       trigger-value = <0x6>;
+                               };
+                       };
+
+                       rstc@fc068600 {
+                               compatible = "atmel,at91sam9g45-rstc";
+                               reg = <0xfc068600 0x10>;
+                       };
+
+                       shdwc@fc068610 {
+                               compatible = "atmel,at91sam9x5-shdwc";
+                               reg = <0xfc068610 0x10>;
+                       };
+
+                       pit: timer@fc068630 {
+                               compatible = "atmel,at91sam9260-pit";
+                               reg = <0xfc068630 0xf>;
+                               interrupts = <3 IRQ_TYPE_LEVEL_HIGH 5>;
+                               clocks = <&h32ck>;
+                       };
+
+                       watchdog@fc068640 {
+                               compatible = "atmel,at91sam9260-wdt";
+                               reg = <0xfc068640 0x10>;
+                               status = "disabled";
+                       };
+
+                       sckc@fc068650 {
+                               compatible = "atmel,at91sam9x5-sckc";
+                               reg = <0xfc068650 0x4>;
+
+                               slow_rc_osc: slow_rc_osc {
+                                       compatible = "atmel,at91sam9x5-clk-slow-rc-osc";
+                                       #clock-cells = <0>;
+                                       clock-frequency = <32768>;
+                                       clock-accuracy = <250000000>;
+                                       atmel,startup-time-usec = <75>;
+                               };
+
+                               slow_osc: slow_osc {
+                                       compatible = "atmel,at91sam9x5-clk-slow-osc";
+                                       #clock-cells = <0>;
+                                       clocks = <&slow_xtal>;
+                                       atmel,startup-time-usec = <1200000>;
+                               };
+
+                               clk32k: slowck {
+                                       compatible = "atmel,at91sam9x5-clk-slow";
+                                       #clock-cells = <0>;
+                                       clocks = <&slow_rc_osc &slow_osc>;
+                               };
+                       };
+
+                       rtc@fc0686b0 {
+                               compatible = "atmel,at91rm9200-rtc";
+                               reg = <0xfc0686b0 0x30>;
+                               interrupts = <1 IRQ_TYPE_LEVEL_HIGH 7>;
+                       };
+
+                       dbgu: serial@fc069000 {
+                               compatible = "atmel,at91sam9260-usart";
+                               reg = <0xfc069000 0x200>;
+                               interrupts = <2 IRQ_TYPE_LEVEL_HIGH 7>;
+                               pinctrl-names = "default";
+                               pinctrl-0 = <&pinctrl_dbgu>;
+                               clocks = <&dbgu_clk>;
+                               clock-names = "usart";
+                               status = "disabled";
+                       };
+
+
+                       pinctrl@fc06a000 {
+                               #address-cells = <1>;
+                               #size-cells = <1>;
+                               compatible = "atmel,at91sam9x5-pinctrl", "atmel,at91rm9200-pinctrl", "simple-bus";
+                               ranges = <0xfc06a000 0xfc06a000 0x4000>;
+                               /* WARNING: revisit as pin spec has changed */
+                               atmel,mux-mask = <
+                                       /*   A          B          C  */
+                                       0xffffffff 0x3ffcfe7c 0x1c010101        /* pioA */
+                                       0x7fffffff 0xfffccc3a 0x3f00cc3a        /* pioB */
+                                       0xffffffff 0x3ff83fff 0xff00ffff        /* pioC */
+                                       0x00000000 0x00000000 0x00000000        /* pioD */
+                                       0xffffffff 0x7fffffff 0x76fff1bf        /* pioE */
+                                       >;
+
+                               pioA: gpio@fc06a000 {
+                                       compatible = "atmel,at91sam9x5-gpio", "atmel,at91rm9200-gpio";
+                                       reg = <0xfc06a000 0x100>;
+                                       interrupts = <23 IRQ_TYPE_LEVEL_HIGH 1>;
+                                       #gpio-cells = <2>;
+                                       gpio-controller;
+                                       interrupt-controller;
+                                       #interrupt-cells = <2>;
+                                       clocks = <&pioA_clk>;
+                               };
+
+                               pioB: gpio@fc06b000 {
+                                       compatible = "atmel,at91sam9x5-gpio", "atmel,at91rm9200-gpio";
+                                       reg = <0xfc06b000 0x100>;
+                                       interrupts = <24 IRQ_TYPE_LEVEL_HIGH 1>;
+                                       #gpio-cells = <2>;
+                                       gpio-controller;
+                                       interrupt-controller;
+                                       #interrupt-cells = <2>;
+                                       clocks = <&pioB_clk>;
+                               };
+
+                               pioC: gpio@fc06c000 {
+                                       compatible = "atmel,at91sam9x5-gpio", "atmel,at91rm9200-gpio";
+                                       reg = <0xfc06c000 0x100>;
+                                       interrupts = <25 IRQ_TYPE_LEVEL_HIGH 1>;
+                                       #gpio-cells = <2>;
+                                       gpio-controller;
+                                       interrupt-controller;
+                                       #interrupt-cells = <2>;
+                                       clocks = <&pioC_clk>;
+                               };
+
+                               pioE: gpio@fc06d000 {
+                                       compatible = "atmel,at91sam9x5-gpio", "atmel,at91rm9200-gpio";
+                                       reg = <0xfc06d000 0x100>;
+                                       interrupts = <26 IRQ_TYPE_LEVEL_HIGH 1>;
+                                       #gpio-cells = <2>;
+                                       gpio-controller;
+                                       interrupt-controller;
+                                       #interrupt-cells = <2>;
+                                       clocks = <&pioE_clk>;
+                               };
+
+                               /* pinctrl pin settings */
+                               adc0 {
+                                       pinctrl_adc0_adtrg: adc0_adtrg {
+                                               atmel,pins =
+                                                       <AT91_PIOE 31 AT91_PERIPH_A AT91_PINCTRL_NONE>; /* conflicts with USBA_VBUS */
+                                       };
+                                       pinctrl_adc0_ad0: adc0_ad0 {
+                                               atmel,pins =
+                                                       <AT91_PIOC 27 AT91_PERIPH_A AT91_PINCTRL_NONE>;
+                                       };
+                                       pinctrl_adc0_ad1: adc0_ad1 {
+                                               atmel,pins =
+                                                       <AT91_PIOC 28 AT91_PERIPH_A AT91_PINCTRL_NONE>;
+                                       };
+                                       pinctrl_adc0_ad2: adc0_ad2 {
+                                               atmel,pins =
+                                                       <AT91_PIOC 29 AT91_PERIPH_A AT91_PINCTRL_NONE>;
+                                       };
+                                       pinctrl_adc0_ad3: adc0_ad3 {
+                                               atmel,pins =
+                                                       <AT91_PIOC 30 AT91_PERIPH_A AT91_PINCTRL_NONE>;
+                                       };
+                                       pinctrl_adc0_ad4: adc0_ad4 {
+                                               atmel,pins =
+                                                       <AT91_PIOC 31 AT91_PERIPH_A AT91_PINCTRL_NONE>;
+                                       };
+                               };
+
+                               dbgu {
+                                       pinctrl_dbgu: dbgu-0 {
+                                               atmel,pins =
+                                                       <AT91_PIOB 24 AT91_PERIPH_A AT91_PINCTRL_NONE>,     /* conflicts with D14 and TDI */
+                                                       <AT91_PIOB 25 AT91_PERIPH_A AT91_PINCTRL_PULL_UP>;  /* conflicts with D15 and TDO */
+                                       };
+                               };
+
+                               i2c0 {
+                                       pinctrl_i2c0: i2c0-0 {
+                                               atmel,pins =
+                                                       <AT91_PIOA 30 AT91_PERIPH_A AT91_PINCTRL_NONE
+                                                        AT91_PIOA 31 AT91_PERIPH_A AT91_PINCTRL_NONE>;
+                                       };
+                               };
+
+                               i2c2 {
+                                       pinctrl_i2c2: i2c2-0 {
+                                               atmel,pins =
+                                                       <AT91_PIOB 29 AT91_PERIPH_A AT91_PINCTRL_NONE   /* TWD2, conflicts with RD0 and PWML1 */
+                                                        AT91_PIOB 30 AT91_PERIPH_A AT91_PINCTRL_NONE>; /* TWCK2, conflicts with RF0 */
+                                       };
+                               };
+
+                               macb0 {
+                                       pinctrl_macb0_rmii: macb0_rmii-0 {
+                                               atmel,pins =
+                                                       <AT91_PIOB 12 AT91_PERIPH_A AT91_PINCTRL_NONE   /* G0_TX0 */
+                                                        AT91_PIOB 13 AT91_PERIPH_A AT91_PINCTRL_NONE   /* G0_TX1 */
+                                                        AT91_PIOB  8 AT91_PERIPH_A AT91_PINCTRL_NONE   /* G0_RX0 */
+                                                        AT91_PIOB  9 AT91_PERIPH_A AT91_PINCTRL_NONE   /* G0_RX1 */
+                                                        AT91_PIOB  6 AT91_PERIPH_A AT91_PINCTRL_NONE   /* G0_RXDV */
+                                                        AT91_PIOB  7 AT91_PERIPH_A AT91_PINCTRL_NONE   /* G0_RXER */
+                                                        AT91_PIOB  2 AT91_PERIPH_A AT91_PINCTRL_NONE   /* G0_TXEN */
+                                                        AT91_PIOB  0 AT91_PERIPH_A AT91_PINCTRL_NONE   /* G0_TXCK */
+                                                        AT91_PIOB 16 AT91_PERIPH_A AT91_PINCTRL_NONE   /* G0_MDC */
+                                                        AT91_PIOB 17 AT91_PERIPH_A AT91_PINCTRL_NONE   /* G0_MDIO */
+                                                       >;
+                                       };
+                               };
+
+                               mmc0 {
+                                       pinctrl_mmc0_clk_cmd_dat0: mmc0_clk_cmd_dat0 {
+                                               atmel,pins =
+                                                       <AT91_PIOC 4 AT91_PERIPH_B AT91_PINCTRL_NONE    /* MCI0_CK, conflict with PCK1(ISI_MCK) */
+                                                        AT91_PIOC 5 AT91_PERIPH_B AT91_PINCTRL_PULL_UP /* MCI0_CDB, conflict with NAND_D0 */
+                                                        AT91_PIOC 6 AT91_PERIPH_B AT91_PINCTRL_PULL_UP /* MCI0_DB0, conflict with NAND_D1 */
+                                                       >;
+                                       };
+                                       pinctrl_mmc0_dat1_3: mmc0_dat1_3 {
+                                               atmel,pins =
+                                                       <AT91_PIOC 7 AT91_PERIPH_B AT91_PINCTRL_PULL_UP /* MCI0_DB1, conflict with NAND_D2 */
+                                                        AT91_PIOC 8 AT91_PERIPH_B AT91_PINCTRL_PULL_UP /* MCI0_DB2, conflict with NAND_D3 */
+                                                        AT91_PIOC 9 AT91_PERIPH_B AT91_PINCTRL_PULL_UP /* MCI0_DB3, conflict with NAND_D4 */
+                                                       >;
+                                       };
+                               };
+
+                               mmc1 {
+                                       pinctrl_mmc1_clk_cmd_dat0: mmc1_clk_cmd_dat0 {
+                                               atmel,pins =
+                                                       <AT91_PIOE 18 AT91_PERIPH_C AT91_PINCTRL_NONE           /* MCI1_CK */
+                                                        AT91_PIOE 19 AT91_PERIPH_C AT91_PINCTRL_PULL_UP        /* MCI1_CDA */
+                                                        AT91_PIOE 20 AT91_PERIPH_C AT91_PINCTRL_PULL_UP        /* MCI1_DA0 */
+                                                       >;
+                                       };
+                                       pinctrl_mmc1_dat1_3: mmc1_dat1_3 {
+                                               atmel,pins =
+                                                       <AT91_PIOE 21 AT91_PERIPH_C AT91_PINCTRL_PULL_UP        /* MCI1_DA1 */
+                                                        AT91_PIOE 22 AT91_PERIPH_C AT91_PINCTRL_PULL_UP        /* MCI1_DA2 */
+                                                        AT91_PIOE 23 AT91_PERIPH_C AT91_PINCTRL_PULL_UP        /* MCI1_DA3 */
+                                                       >;
+                                       };
+                               };
+
+                               nand0 {
+                                       pinctrl_nand: nand-0 {
+                                               atmel,pins =
+                                                       <AT91_PIOC 13 AT91_PERIPH_A AT91_PINCTRL_NONE   /* PC13 periph A Read Enable */
+                                                        AT91_PIOC 14 AT91_PERIPH_A AT91_PINCTRL_NONE   /* PC14 periph A Write Enable */
+
+                                                        AT91_PIOC 17 AT91_PERIPH_A AT91_PINCTRL_PULL_UP        /* PC17 ALE */
+                                                        AT91_PIOC 18 AT91_PERIPH_A AT91_PINCTRL_PULL_UP        /* PC18 CLE */
+
+                                                        AT91_PIOC 15 AT91_PERIPH_A AT91_PINCTRL_PULL_UP        /* PC15 NCS3/Chip Enable */
+                                                        AT91_PIOC 16 AT91_PERIPH_A AT91_PINCTRL_PULL_UP        /* PC16 NANDRDY */
+                                                        AT91_PIOC 5 AT91_PERIPH_A AT91_PINCTRL_NONE    /* PC5 Data bit 0 */
+                                                        AT91_PIOC 6 AT91_PERIPH_A AT91_PINCTRL_NONE    /* PC6 Data bit 1 */
+                                                        AT91_PIOC 7 AT91_PERIPH_A AT91_PINCTRL_NONE    /* PC7 Data bit 2 */
+                                                        AT91_PIOC 8 AT91_PERIPH_A AT91_PINCTRL_NONE    /* PC8 Data bit 3 */
+                                                        AT91_PIOC 9 AT91_PERIPH_A AT91_PINCTRL_NONE    /* PC9 Data bit 4 */
+                                                        AT91_PIOC 10 AT91_PERIPH_A AT91_PINCTRL_NONE   /* PC10 Data bit 5 */
+                                                        AT91_PIOC 11 AT91_PERIPH_A AT91_PINCTRL_NONE   /* PC11 periph A Data bit 6 */
+                                                        AT91_PIOC 12 AT91_PERIPH_A AT91_PINCTRL_NONE>; /* PC12 periph A Data bit 7 */
+                                       };
+                               };
+
+                               spi0 {
+                                       pinctrl_spi0: spi0-0 {
+                                               atmel,pins =
+                                                       <AT91_PIOC 0 AT91_PERIPH_A AT91_PINCTRL_NONE    /* SPI0_MISO */
+                                                        AT91_PIOC 1 AT91_PERIPH_A AT91_PINCTRL_NONE    /* SPI0_MOSI */
+                                                        AT91_PIOC 2 AT91_PERIPH_A AT91_PINCTRL_NONE    /* SPI0_SPCK */
+                                                       >;
+                                       };
+                               };
+
+                               usart2 {
+                                       pinctrl_usart2: usart2-0 {
+                                               atmel,pins =
+                                                       <AT91_PIOB 4 AT91_PERIPH_B AT91_PINCTRL_NONE            /* RXD - conflicts with G0_CRS, ISI_HSYNC */
+                                                        AT91_PIOB 5 AT91_PERIPH_B AT91_PINCTRL_PULL_UP         /* TXD - conflicts with G0_COL, PCK2 */
+                                                       >;
+                                       };
+                                       pinctrl_usart2_rts: usart2_rts-0 {
+                                               atmel,pins = <AT91_PIOB 11 AT91_PERIPH_B AT91_PINCTRL_NONE>;    /* conflicts with G0_RX3, PWMH1 */
+                                       };
+                                       pinctrl_usart2_cts: usart2_cts-0 {
+                                               atmel,pins = <AT91_PIOB 3 AT91_PERIPH_B AT91_PINCTRL_NONE>;     /* conflicts with G0_TXER, ISI_VSYNC */
+                                       };
+                               };
+
+                               usart3 {
+                                       pinctrl_usart3: usart3-0 {
+                                               atmel,pins =
+                                                       <AT91_PIOE 16 AT91_PERIPH_B AT91_PINCTRL_NONE           /* RXD */
+                                                        AT91_PIOE 17 AT91_PERIPH_B AT91_PINCTRL_PULL_UP        /* TXD */
+                                                       >;
+                                       };
+                               };
+
+                               usart4 {
+                                       pinctrl_usart4: usart4-0 {
+                                               atmel,pins =
+                                                       <AT91_PIOE 26 AT91_PERIPH_B AT91_PINCTRL_NONE           /* RXD */
+                                                        AT91_PIOE 27 AT91_PERIPH_B AT91_PINCTRL_PULL_UP        /* TXD */
+                                                       >;
+                                       };
+                                       pinctrl_usart4_rts: usart4_rts-0 {
+                                               atmel,pins = <AT91_PIOE 28 AT91_PERIPH_B AT91_PINCTRL_NONE>;    /* conflicts with NWAIT, A19 */
+                                       };
+                                       pinctrl_usart4_cts: usart4_cts-0 {
+                                               atmel,pins = <AT91_PIOE 0 AT91_PERIPH_C AT91_PINCTRL_NONE>;     /* conflicts with A0/NBS0, MCI0_CDB */
+                                       };
+                               };
+                       };
+
+                       aic: interrupt-controller@fc06e000 {
+                               #interrupt-cells = <3>;
+                               compatible = "atmel,sama5d4-aic";
+                               interrupt-controller;
+                               reg = <0xfc06e000 0x200>;
+                               atmel,external-irqs = <56>;
+                       };
+               };
+       };
+};
index 249f65be2a5070ca38e2112537160d20265dc47a..f863a10cb1b2d4b7050a942af90478d432b85ecd 100644 (file)
@@ -21,6 +21,7 @@
                        compatible = "arm,cortex-a8";
                        device_type = "cpu";
                        reg = <0x0>;
+                       clock-frequency = <800000000>;
                };
        };
 
index 18662aec2ec48fb246818744216bda44f760a935..99659db97e8941aa1b1b57e63958adfb262fab56 100644 (file)
        };
 };
 
+&cmt1 {
+       status = "ok";
+};
+
 &i2c0 {
        status = "okay";
        as3711@40 {
index 910b79079d5a26d2740296df0a2ebae264962794..d7f52cf313500c084de91eb0ba34a15aff23acbf 100644 (file)
                        device_type = "cpu";
                        compatible = "arm,cortex-a9";
                        reg = <0>;
+                       clock-frequency = <1196000000>;
                };
                cpu@1 {
                        device_type = "cpu";
                        compatible = "arm,cortex-a9";
                        reg = <1>;
+                       clock-frequency = <1196000000>;
                };
        };
 
                             <0 56 IRQ_TYPE_LEVEL_HIGH>;
        };
 
+       cmt1: timer@e6138000 {
+               compatible = "renesas,cmt-48-sh73a0", "renesas,cmt-48";
+               reg = <0xe6138000 0x200>;
+               interrupts = <0 65 IRQ_TYPE_LEVEL_HIGH>;
+
+               renesas,channels-mask = <0x3f>;
+
+               status = "disabled";
+       };
+
        irqpin0: irqpin@e6900000 {
                compatible = "renesas,intc-irqpin-sh73a0", "renesas,intc-irqpin";
                #interrupt-cells = <2>;
index 6cc83d4c6c76100ebdc2863a28ae69d89f96fef9..587cadcf7001ad7854fd3e9a07c5c5da0c8937e6 100644 (file)
                        cache-level = <2>;
                };
 
+               memory-controller@f8006000 {
+                       compatible = "xlnx,zynq-ddrc-a05";
+                       reg = <0xf8006000 0x1000>;
+               } ;
+
                uart0: serial@e0000000 {
                        compatible = "xlnx,xuartps", "cdns,uart-r1p8";
                        status = "disabled";
index 0facf9da047c2787a4dd7a85a6108964b9a4776f..fc105c9178ccb9ba266a23c33a4adf65864c80b2 100644 (file)
@@ -68,8 +68,8 @@ CONFIG_GPIO_GENERIC_PLATFORM=y
 # CONFIG_HWMON is not set
 CONFIG_FB=y
 CONFIG_FB_CLPS711X=y
-CONFIG_BACKLIGHT_LCD_SUPPORT=y
 CONFIG_LCD_PLATFORM=y
+CONFIG_BACKLIGHT_PWM=y
 # CONFIG_USB_SUPPORT is not set
 CONFIG_NEW_LEDS=y
 CONFIG_LEDS_CLASS=y
@@ -77,6 +77,8 @@ CONFIG_LEDS_GPIO=y
 CONFIG_LEDS_TRIGGERS=y
 CONFIG_LEDS_TRIGGER_HEARTBEAT=y
 # CONFIG_IOMMU_SUPPORT is not set
+CONFIG_PWM=y
+CONFIG_PWM_CLPS711X=y
 CONFIG_EXT2_FS=y
 CONFIG_CRAMFS=y
 CONFIG_MINIX_FS=y
similarity index 77%
rename from arch/arm/configs/hi3xxx_defconfig
rename to arch/arm/configs/hisi_defconfig
index 9630687e7d07e2d1628f5c86e9ab3cb28c8e85c6..1772505caeba52b0a6efb5eb739e8538a69acf5f 100644 (file)
@@ -6,10 +6,15 @@ CONFIG_RD_LZMA=y
 CONFIG_ARCH_HISI=y
 CONFIG_ARCH_HI3xxx=y
 CONFIG_ARCH_HIX5HD2=y
+CONFIG_ARCH_HIP04=y
 CONFIG_SMP=y
+CONFIG_NR_CPUS=16
 CONFIG_PREEMPT=y
 CONFIG_AEABI=y
+CONFIG_HIGHMEM=y
 CONFIG_ARM_APPENDED_DTB=y
+CONFIG_ARM_ATAG_DTB_COMPAT=y
+CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_FROM_BOOTLOADER=y
 CONFIG_NET=y
 CONFIG_UNIX=y
 CONFIG_INET=y
@@ -21,6 +26,12 @@ CONFIG_BLK_DEV_SD=y
 CONFIG_ATA=y
 CONFIG_SATA_AHCI_PLATFORM=y
 CONFIG_NETDEVICES=y
+CONFIG_SERIAL_8250=y
+CONFIG_SERIAL_8250_DEPRECATED_OPTIONS=y
+CONFIG_SERIAL_8250_CONSOLE=y
+CONFIG_SERIAL_8250_NR_UARTS=2
+CONFIG_SERIAL_8250_RUNTIME_UARTS=2
+CONFIG_SERIAL_8250_DW=y
 CONFIG_SERIAL_AMBA_PL011=y
 CONFIG_SERIAL_AMBA_PL011_CONSOLE=y
 CONFIG_SERIAL_OF_PLATFORM=y
@@ -56,3 +67,5 @@ CONFIG_PRINTK_TIME=y
 CONFIG_DEBUG_FS=y
 CONFIG_DEBUG_KERNEL=y
 CONFIG_LOCKUP_DETECTOR=y
+CONFIG_VFP=y
+CONFIG_VFPv3=y
index a3fb8662ff6c1c7f7bb9318fbc209c5a8df8c0bc..e688741c89aae2d24ec42b6e95120bf78e32b317 100644 (file)
@@ -21,7 +21,6 @@ CONFIG_ARCH_MULTI_V4T=y
 CONFIG_ARCH_MULTI_V5=y
 # CONFIG_ARCH_MULTI_V7 is not set
 CONFIG_ARCH_MXC=y
-CONFIG_MXC_IRQ_PRIOR=y
 CONFIG_MACH_SCB9328=y
 CONFIG_MACH_APF9328=y
 CONFIG_MACH_MX21ADS=y
@@ -38,8 +37,6 @@ CONFIG_PREEMPT=y
 CONFIG_AEABI=y
 CONFIG_ZBOOT_ROM_TEXT=0x0
 CONFIG_ZBOOT_ROM_BSS=0x0
-CONFIG_FPE_NWFPE=y
-CONFIG_FPE_NWFPE_XP=y
 CONFIG_PM_DEBUG=y
 CONFIG_NET=y
 CONFIG_PACKET=y
@@ -58,6 +55,7 @@ CONFIG_NETFILTER=y
 CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
 CONFIG_DEVTMPFS=y
 CONFIG_DEVTMPFS_MOUNT=y
+CONFIG_IMX_WEIM=y
 CONFIG_MTD=y
 CONFIG_MTD_CMDLINE_PARTS=y
 CONFIG_MTD_BLOCK=y
@@ -73,8 +71,8 @@ CONFIG_MTD_NAND_MXC=y
 CONFIG_MTD_UBI=y
 CONFIG_EEPROM_AT24=y
 CONFIG_EEPROM_AT25=y
-CONFIG_ATA=y
 CONFIG_BLK_DEV_SD=y
+CONFIG_ATA=y
 CONFIG_PATA_IMX=y
 CONFIG_NETDEVICES=y
 CONFIG_CS89x0=y
@@ -97,10 +95,8 @@ CONFIG_SERIAL_8250=m
 CONFIG_SERIAL_IMX=y
 CONFIG_SERIAL_IMX_CONSOLE=y
 # CONFIG_HW_RANDOM is not set
-CONFIG_I2C=y
 CONFIG_I2C_CHARDEV=y
 CONFIG_I2C_IMX=y
-CONFIG_SPI=y
 CONFIG_SPI_IMX=y
 CONFIG_SPI_SPIDEV=y
 CONFIG_GPIO_SYSFS=y
@@ -127,10 +123,7 @@ CONFIG_VIDEO_CODA=y
 CONFIG_SOC_CAMERA_OV2640=y
 CONFIG_FB=y
 CONFIG_FB_IMX=y
-CONFIG_BACKLIGHT_LCD_SUPPORT=y
-CONFIG_LCD_CLASS_DEVICE=y
 CONFIG_LCD_L4F00242T03=y
-CONFIG_BACKLIGHT_CLASS_DEVICE=y
 CONFIG_FRAMEBUFFER_CONSOLE=y
 CONFIG_LOGO=y
 CONFIG_SOUND=y
index 16cfec4385c8215796b9090b69fc7fd1b8fa98ba..8fca6e276b6949e73e036aac03a1d84f9a2b2760 100644 (file)
@@ -32,8 +32,8 @@ CONFIG_MACH_IMX35_DT=y
 CONFIG_MACH_PCM043=y
 CONFIG_MACH_MX35_3DS=y
 CONFIG_MACH_VPR200=y
-CONFIG_SOC_IMX51=y
 CONFIG_SOC_IMX50=y
+CONFIG_SOC_IMX51=y
 CONFIG_SOC_IMX53=y
 CONFIG_SOC_IMX6Q=y
 CONFIG_SOC_IMX6SL=y
@@ -105,7 +105,6 @@ CONFIG_EEPROM_AT24=y
 CONFIG_EEPROM_AT25=y
 # CONFIG_SCSI_PROC_FS is not set
 CONFIG_BLK_DEV_SD=y
-CONFIG_SCSI_MULTI_LUN=y
 CONFIG_SCSI_CONSTANTS=y
 CONFIG_SCSI_LOGGING=y
 CONFIG_SCSI_SCAN_ASYNC=y
@@ -153,14 +152,12 @@ CONFIG_SERIAL_IMX_CONSOLE=y
 CONFIG_SERIAL_FSL_LPUART=y
 CONFIG_SERIAL_FSL_LPUART_CONSOLE=y
 CONFIG_HW_RANDOM=y
-CONFIG_HW_RANDOM_MXC_RNGA=y
 # CONFIG_I2C_COMPAT is not set
 CONFIG_I2C_CHARDEV=y
 # CONFIG_I2C_HELPER_AUTO is not set
 CONFIG_I2C_ALGOPCF=m
 CONFIG_I2C_ALGOPCA=m
 CONFIG_I2C_IMX=y
-CONFIG_SPI=y
 CONFIG_SPI_IMX=y
 CONFIG_GPIO_SYSFS=y
 CONFIG_GPIO_MC9S08DZ60=y
@@ -198,7 +195,6 @@ CONFIG_BACKLIGHT_LCD_SUPPORT=y
 CONFIG_LCD_CLASS_DEVICE=y
 CONFIG_LCD_L4F00242T03=y
 CONFIG_LCD_PLATFORM=y
-CONFIG_BACKLIGHT_CLASS_DEVICE=y
 CONFIG_BACKLIGHT_PWM=y
 CONFIG_BACKLIGHT_GPIO=y
 CONFIG_FRAMEBUFFER_CONSOLE=y
@@ -206,6 +202,7 @@ CONFIG_LOGO=y
 CONFIG_SOUND=y
 CONFIG_SND=y
 CONFIG_SND_SOC=y
+CONFIG_SND_SOC_FSL_SAI=y
 CONFIG_SND_IMX_SOC=y
 CONFIG_SND_SOC_PHYCORE_AC97=y
 CONFIG_SND_SOC_EUKREA_TLV320=y
@@ -213,6 +210,7 @@ CONFIG_SND_SOC_IMX_WM8962=y
 CONFIG_SND_SOC_IMX_SGTL5000=y
 CONFIG_SND_SOC_IMX_SPDIF=y
 CONFIG_SND_SOC_IMX_MC13783=y
+CONFIG_SND_SIMPLE_CARD=y
 CONFIG_USB=y
 CONFIG_USB_EHCI_HCD=y
 CONFIG_USB_EHCI_MXC=y
@@ -240,6 +238,7 @@ CONFIG_LEDS_TRIGGER_BACKLIGHT=y
 CONFIG_LEDS_TRIGGER_GPIO=y
 CONFIG_RTC_CLASS=y
 CONFIG_RTC_INTF_DEV_UIE_EMUL=y
+CONFIG_RTC_DRV_ISL1208=y
 CONFIG_RTC_DRV_PCF8563=y
 CONFIG_RTC_DRV_MC13XXX=y
 CONFIG_RTC_DRV_MXC=y
@@ -254,7 +253,6 @@ CONFIG_DRM_IMX_FB_HELPER=y
 CONFIG_DRM_IMX_PARALLEL_DISPLAY=y
 CONFIG_DRM_IMX_TVE=y
 CONFIG_DRM_IMX_LDB=y
-CONFIG_DRM_IMX_IPUV3_CORE=y
 CONFIG_DRM_IMX_IPUV3=y
 CONFIG_DRM_IMX_HDMI=y
 # CONFIG_IOMMU_SUPPORT is not set
index 5fb95fb758d9a43ae6ef5ccfd25ee2ff304f5006..691117bc7e2bff9b84c76a8c068f1c3745c523f7 100644 (file)
@@ -28,6 +28,7 @@ CONFIG_ARCH_HIGHBANK=y
 CONFIG_ARCH_HISI=y
 CONFIG_ARCH_HI3xxx=y
 CONFIG_ARCH_HIX5HD2=y
+CONFIG_ARCH_HIP04=y
 CONFIG_ARCH_KEYSTONE=y
 CONFIG_ARCH_MXC=y
 CONFIG_SOC_IMX51=y
index f650f00e8cee19f8d517753f542fb899cb99b94f..69c7bed3c634dd3ec2881e3b478340fbe3d4dffd 100644 (file)
@@ -1,11 +1,28 @@
 CONFIG_SYSVIPC=y
 CONFIG_POSIX_MQUEUE=y
+CONFIG_FHANDLE=y
+CONFIG_AUDIT=y
 CONFIG_NO_HZ=y
 CONFIG_HIGH_RES_TIMERS=y
 CONFIG_BSD_PROCESS_ACCT=y
 CONFIG_IKCONFIG=y
 CONFIG_IKCONFIG_PROC=y
 CONFIG_LOG_BUF_SHIFT=16
+CONFIG_CGROUPS=y
+CONFIG_CGROUP_FREEZER=y
+CONFIG_CGROUP_DEVICE=y
+CONFIG_CPUSETS=y
+CONFIG_CGROUP_CPUACCT=y
+CONFIG_RESOURCE_COUNTERS=y
+CONFIG_MEMCG=y
+CONFIG_MEMCG_SWAP=y
+CONFIG_MEMCG_KMEM=y
+CONFIG_CGROUP_PERF=y
+CONFIG_CGROUP_SCHED=y
+CONFIG_CFS_BANDWIDTH=y
+CONFIG_RT_GROUP_SCHED=y
+CONFIG_BLK_CGROUP=y
+CONFIG_NAMESPACES=y
 CONFIG_BLK_DEV_INITRD=y
 CONFIG_EXPERT=y
 CONFIG_SLAB=y
@@ -32,19 +49,26 @@ CONFIG_SOC_OMAP5=y
 CONFIG_SOC_AM33XX=y
 CONFIG_SOC_AM43XX=y
 CONFIG_SOC_DRA7XX=y
-CONFIG_CACHE_L2X0=y
 CONFIG_ARM_THUMBEE=y
 CONFIG_ARM_ERRATA_411920=y
 CONFIG_SMP=y
 CONFIG_NR_CPUS=2
 CONFIG_CMA=y
+CONFIG_SECCOMP=y
 CONFIG_ZBOOT_ROM_TEXT=0x0
 CONFIG_ZBOOT_ROM_BSS=0x0
 CONFIG_ARM_APPENDED_DTB=y
 CONFIG_ARM_ATAG_DTB_COMPAT=y
 CONFIG_CMDLINE="root=/dev/mmcblk0p2 rootwait console=ttyO2,115200"
 CONFIG_KEXEC=y
-CONFIG_FPE_NWFPE=y
+CONFIG_CPU_FREQ=y
+CONFIG_CPU_FREQ_STAT_DETAILS=y
+CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y
+CONFIG_CPU_FREQ_GOV_POWERSAVE=y
+CONFIG_CPU_FREQ_GOV_USERSPACE=y
+CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y
+CONFIG_GENERIC_CPUFREQ_CPU0=y
+# CONFIG_ARM_OMAP2PLUS_CPUFREQ is not set
 CONFIG_CPU_IDLE=y
 CONFIG_BINFMT_MISC=y
 CONFIG_PM_DEBUG=y
@@ -61,7 +85,7 @@ CONFIG_IP_PNP_DHCP=y
 CONFIG_IP_PNP_BOOTP=y
 CONFIG_IP_PNP_RARP=y
 # CONFIG_INET_LRO is not set
-# CONFIG_IPV6 is not set
+CONFIG_IPV6=y
 CONFIG_NETFILTER=y
 CONFIG_CAN=m
 CONFIG_CAN_C_CAN=m
@@ -75,9 +99,6 @@ CONFIG_BT_HCIBCM203X=m
 CONFIG_BT_HCIBPA10X=m
 CONFIG_CFG80211=m
 CONFIG_MAC80211=m
-CONFIG_MAC80211_RC_PID=y
-CONFIG_MAC80211_RC_DEFAULT_PID=y
-CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
 CONFIG_DEVTMPFS=y
 CONFIG_DEVTMPFS_MOUNT=y
 CONFIG_DMA_CMA=y
@@ -101,9 +122,9 @@ CONFIG_BLK_DEV_RAM_SIZE=16384
 CONFIG_SENSORS_TSL2550=m
 CONFIG_BMP085_I2C=m
 CONFIG_SENSORS_LIS3_I2C=m
+CONFIG_SRAM=y
 CONFIG_SCSI=y
 CONFIG_BLK_DEV_SD=y
-CONFIG_SCSI_MULTI_LUN=y
 CONFIG_SCSI_SCAN_ASYNC=y
 CONFIG_MD=y
 CONFIG_NETDEVICES=y
@@ -138,7 +159,9 @@ CONFIG_KEYBOARD_GPIO=y
 CONFIG_KEYBOARD_MATRIX=m
 CONFIG_KEYBOARD_TWL4030=y
 CONFIG_INPUT_TOUCHSCREEN=y
-CONFIG_TOUCHSCREEN_ADS7846=y
+CONFIG_TOUCHSCREEN_ADS7846=m
+CONFIG_TOUCHSCREEN_TSC2005=m
+CONFIG_TOUCHSCREEN_TSC2007=m
 CONFIG_INPUT_MISC=y
 CONFIG_INPUT_TWL4030_PWRBUTTON=y
 # CONFIG_LEGACY_PTYS is not set
@@ -162,7 +185,13 @@ CONFIG_DEBUG_GPIO=y
 CONFIG_GPIO_SYSFS=y
 CONFIG_GPIO_TWL4030=y
 CONFIG_W1=y
-CONFIG_POWER_SUPPLY=y
+CONFIG_BATTERY_BQ27x00=m
+CONFIG_CHARGER_ISP1704=m
+CONFIG_CHARGER_TWL4030=m
+CONFIG_CHARGER_BQ2415X=m
+CONFIG_CHARGER_BQ24190=m
+CONFIG_CHARGER_BQ24735=m
+CONFIG_POWER_RESET=y
 CONFIG_POWER_AVS=y
 CONFIG_SENSORS_LM75=m
 CONFIG_THERMAL=y
@@ -183,8 +212,8 @@ CONFIG_MFD_TPS65217=y
 CONFIG_MFD_TPS65218=y
 CONFIG_MFD_TPS65910=y
 CONFIG_TWL6040_CORE=y
-CONFIG_REGULATOR_FIXED_VOLTAGE=y
 CONFIG_REGULATOR_PALMAS=y
+CONFIG_REGULATOR_PBIAS=y
 CONFIG_REGULATOR_TI_ABB=y
 CONFIG_REGULATOR_TPS65023=y
 CONFIG_REGULATOR_TPS6507X=y
@@ -192,12 +221,12 @@ CONFIG_REGULATOR_TPS65217=y
 CONFIG_REGULATOR_TPS65218=y
 CONFIG_REGULATOR_TPS65910=y
 CONFIG_REGULATOR_TWL4030=y
-CONFIG_REGULATOR_PBIAS=y
 CONFIG_FB=y
 CONFIG_FIRMWARE_EDID=y
 CONFIG_FB_MODE_HELPERS=y
 CONFIG_FB_TILEBLITTING=y
 CONFIG_OMAP2_DSS=m
+CONFIG_OMAP5_DSS_HDMI=y
 CONFIG_OMAP2_DSS_SDI=y
 CONFIG_OMAP2_DSS_DSI=y
 CONFIG_FB_OMAP2=m
@@ -205,11 +234,25 @@ CONFIG_DISPLAY_ENCODER_TFP410=m
 CONFIG_DISPLAY_ENCODER_TPD12S015=m
 CONFIG_DISPLAY_CONNECTOR_DVI=m
 CONFIG_DISPLAY_CONNECTOR_HDMI=m
+CONFIG_DISPLAY_CONNECTOR_ANALOG_TV=m
 CONFIG_DISPLAY_PANEL_DPI=m
+CONFIG_DISPLAY_PANEL_DSI_CM=m
+CONFIG_DISPLAY_PANEL_SONY_ACX565AKM=m
+CONFIG_DISPLAY_PANEL_LGPHILIPS_LB035Q02=m
+CONFIG_DISPLAY_PANEL_SHARP_LS037V7DW01=m
+CONFIG_DISPLAY_PANEL_TPO_TD028TTEC1=m
+CONFIG_DISPLAY_PANEL_TPO_TD043MTEA1=m
+CONFIG_DISPLAY_PANEL_NEC_NL8048HL11=m
 CONFIG_BACKLIGHT_LCD_SUPPORT=y
 CONFIG_LCD_CLASS_DEVICE=y
 CONFIG_LCD_PLATFORM=y
+CONFIG_BACKLIGHT_CLASS_DEVICE=y
+CONFIG_BACKLIGHT_GENERIC=m
+CONFIG_BACKLIGHT_PWM=m
+CONFIG_BACKLIGHT_PANDORA=m
+CONFIG_BACKLIGHT_GPIO=m
 CONFIG_FRAMEBUFFER_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y
 CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y
 CONFIG_LOGO=y
 CONFIG_SOUND=m
@@ -221,8 +264,6 @@ CONFIG_SND_DEBUG=y
 CONFIG_SND_USB_AUDIO=m
 CONFIG_SND_SOC=m
 CONFIG_SND_OMAP_SOC=m
-CONFIG_SND_AM33XX_SOC_EVM=m
-CONFIG_SND_DAVINCI_SOC=m
 CONFIG_SND_OMAP_SOC_OMAP_TWL4030=m
 CONFIG_SND_OMAP_SOC_OMAP_ABE_TWL6040=m
 CONFIG_SND_OMAP_SOC_OMAP3_PANDORA=m
@@ -233,9 +274,6 @@ CONFIG_USB_WDM=y
 CONFIG_USB_STORAGE=y
 CONFIG_USB_DWC3=m
 CONFIG_USB_TEST=y
-CONFIG_NOP_USB_XCEIV=y
-CONFIG_OMAP_USB2=y
-CONFIG_TI_PIPE3=y
 CONFIG_AM335X_PHY_USB=y
 CONFIG_USB_GADGET=y
 CONFIG_USB_GADGET_DEBUG=y
@@ -243,7 +281,6 @@ CONFIG_USB_GADGET_DEBUG_FILES=y
 CONFIG_USB_GADGET_DEBUG_FS=y
 CONFIG_USB_ZERO=m
 CONFIG_MMC=y
-CONFIG_MMC_UNSAFE_RESUME=y
 CONFIG_SDIO_UART=y
 CONFIG_MMC_OMAP=y
 CONFIG_MMC_OMAP_HS=y
@@ -267,15 +304,23 @@ CONFIG_TI_EDMA=y
 CONFIG_DMA_OMAP=y
 CONFIG_EXTCON=y
 CONFIG_EXTCON_PALMAS=y
+CONFIG_PWM=y
+CONFIG_PWM_TWL=y
+CONFIG_PWM_TWL_LED=y
+CONFIG_OMAP_USB2=y
+CONFIG_TI_PIPE3=y
 CONFIG_EXT2_FS=y
 CONFIG_EXT3_FS=y
 # CONFIG_EXT3_FS_XATTR is not set
 CONFIG_EXT4_FS=y
+CONFIG_FANOTIFY=y
 CONFIG_QUOTA=y
 CONFIG_QFMT_V2=y
+CONFIG_AUTOFS4_FS=y
 CONFIG_MSDOS_FS=y
 CONFIG_VFAT_FS=y
 CONFIG_TMPFS=y
+CONFIG_TMPFS_POSIX_ACL=y
 CONFIG_JFFS2_FS=y
 CONFIG_JFFS2_SUMMARY=y
 CONFIG_JFFS2_FS_XATTR=y
index 4414990521d31e3144da57133127a7663674313e..12007282b557fa2e8834c0c91f89969a34bf6b7a 100644 (file)
@@ -19,6 +19,7 @@ CONFIG_MODULE_FORCE_UNLOAD=y
 CONFIG_ARCH_AT91=y
 CONFIG_SOC_SAM_V7=y
 CONFIG_SOC_SAMA5D3=y
+CONFIG_SOC_SAMA5D4=y
 CONFIG_MACH_SAMA5_DT=y
 CONFIG_AEABI=y
 # CONFIG_OABI_COMPAT is not set
index 57ff7f2a30844ab464361178103df9e8d03a9c53..d428e386c88ece8192b0dd336231b651d58957b3 100644 (file)
  * to consider dynamic allocation.
  */
 #define MAX_CPUS_PER_CLUSTER   4
+
+#ifdef CONFIG_MCPM_QUAD_CLUSTER
+#define MAX_NR_CLUSTERS                4
+#else
 #define MAX_NR_CLUSTERS                2
+#endif
 
 #ifndef __ASSEMBLY__
 
diff --git a/arch/arm/include/debug/bcm63xx.S b/arch/arm/include/debug/bcm63xx.S
new file mode 100644 (file)
index 0000000..e7164d5
--- /dev/null
@@ -0,0 +1,33 @@
+/*
+ * Broadcom BCM63xx low-level UART debug
+ *
+ * Copyright (C) 2014 Broadcom Corporation
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include <linux/serial_bcm63xx.h>
+
+       .macro  addruart, rp, rv, tmp
+       ldr     \rp, =CONFIG_DEBUG_UART_PHYS
+       ldr     \rv, =CONFIG_DEBUG_UART_VIRT
+       .endm
+
+       .macro  senduart, rd, rx
+       /* word access do not work */
+       strb    \rd, [\rx, #UART_FIFO_REG]
+       .endm
+
+       .macro  waituart, rd, rx
+1001:  ldr     \rd, [\rx, #UART_IR_REG]
+       tst     \rd, #(1 << UART_IR_TXEMPTY)
+       beq     1001b
+       .endm
+
+       .macro  busyuart, rd, rx
+1002:  ldr     \rd, [\rx, #UART_IR_REG]
+       tst     \rd, #(1 << UART_IR_TXTRESH)
+       beq     1002b
+       .endm
diff --git a/arch/arm/include/debug/meson.S b/arch/arm/include/debug/meson.S
new file mode 100644 (file)
index 0000000..1bae99b
--- /dev/null
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2014 Carlo Caione
+ * Carlo Caione <carlo@caione.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#define MESON_AO_UART_WFIFO            0x0
+#define MESON_AO_UART_STATUS           0xc
+
+#define MESON_AO_UART_TX_FIFO_EMPTY    (1 << 22)
+#define MESON_AO_UART_TX_FIFO_FULL     (1 << 21)
+
+       .macro  addruart, rp, rv, tmp
+       ldr     \rp, =(CONFIG_DEBUG_UART_PHYS)          @ physical
+       ldr     \rv, =(CONFIG_DEBUG_UART_VIRT)          @ virtual
+       .endm
+
+       .macro  senduart,rd,rx
+       str     \rd, [\rx, #MESON_AO_UART_WFIFO]
+       .endm
+
+       .macro  busyuart,rd,rx
+1002:  ldr     \rd, [\rx, #MESON_AO_UART_STATUS]
+       tst     \rd, #MESON_AO_UART_TX_FIFO_EMPTY
+       beq     1002b
+       .endm
+
+       .macro  waituart,rd,rx
+1001:  ldr     \rd, [\rx, #MESON_AO_UART_STATUS]
+       tst     \rd, #MESON_AO_UART_TX_FIFO_FULL
+       bne     1001b
+       .endm
index dd28e1fedbdce67ac24269cedbb6e6558b67f6a2..1947a09e5a3f04f4170d82a46a29a12b80bf81a1 100644 (file)
@@ -12,6 +12,9 @@ config HAVE_AT91_DBGU0
 config HAVE_AT91_DBGU1
        bool
 
+config HAVE_AT91_DBGU2
+       bool
+
 config AT91_USE_OLD_CLK
        bool
 
@@ -47,6 +50,9 @@ config AT91_SAM9_TIME
 config HAVE_AT91_SMD
        bool
 
+config HAVE_AT91_H32MX
+       bool
+
 config SOC_AT91SAM9
        bool
        select AT91_SAM9_TIME
@@ -105,6 +111,21 @@ config SOC_SAMA5D3
        help
          Select this if you are using one of Atmel's SAMA5D3 family SoC.
          This support covers SAMA5D31, SAMA5D33, SAMA5D34, SAMA5D35, SAMA5D36.
+
+config SOC_SAMA5D4
+       bool "SAMA5D4 family"
+       select SOC_SAMA5
+       select HAVE_AT91_DBGU2
+       select CLKSRC_MMIO
+       select CACHE_L2X0
+       select CACHE_PL310
+       select HAVE_FB_ATMEL
+       select HAVE_AT91_UTMI
+       select HAVE_AT91_SMD
+       select HAVE_AT91_USB_CLK
+       select HAVE_AT91_H32MX
+       help
+         Select this if you are using one of Atmel's SAMA5D4 family SoC.
 endif
 
 if SOC_SAM_V4_V5
index 40946f4e8921be361dbe866be5c2280083b18e96..603365e44ed57adaf21ee8d54e4aa1321f42dd73 100644 (file)
@@ -24,6 +24,7 @@ obj-$(CONFIG_SOC_AT91SAM9N12) += at91sam9n12.o
 obj-$(CONFIG_SOC_AT91SAM9X5)   += at91sam9x5.o
 obj-$(CONFIG_SOC_AT91SAM9RL)   += at91sam9rl.o
 obj-$(CONFIG_SOC_SAMA5D3)      += sama5d3.o
+obj-$(CONFIG_SOC_SAMA5D4)      += sama5d4.o
 
 obj-$(CONFIG_ARCH_AT91RM9200)  += at91rm9200_devices.o
 obj-$(CONFIG_ARCH_AT91SAM9260) += at91sam9260_devices.o
index d6fe04bcaabd3ba5a688955b86ea1b270a8a25ab..4cc84e8a32899dad46be92f22f997bd31a20e856 100644 (file)
@@ -62,7 +62,7 @@ static void __init sama5_dt_device_init(void)
        of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
 }
 
-static const char *sama5_dt_board_compat[] __initdata = {
+static const char *sama5_dt_board_compat[] __initconst = {
        "atmel,sama5",
        NULL
 };
@@ -75,3 +75,17 @@ DT_MACHINE_START(sama5_dt, "Atmel SAMA5 (Device Tree)")
        .init_machine   = sama5_dt_device_init,
        .dt_compat      = sama5_dt_board_compat,
 MACHINE_END
+
+static const char *sama5_alt_dt_board_compat[] __initconst = {
+       "atmel,sama5d4",
+       NULL
+};
+
+DT_MACHINE_START(sama5_alt_dt, "Atmel SAMA5 (Device Tree)")
+       /* Maintainer: Atmel */
+       .map_io         = at91_alt_map_io,
+       .init_early     = at91_dt_initialize,
+       .init_machine   = sama5_dt_device_init,
+       .dt_compat      = sama5_alt_dt_board_compat,
+       .l2c_aux_mask   = ~0UL,
+MACHINE_END
index 631fa3b8c16d77be9832f7aa89345e9e7259e94d..cddf1e51c50eb0518e33f59f5d6cf07f17917583 100644 (file)
@@ -14,6 +14,7 @@
 
  /* Map io */
 extern void __init at91_map_io(void);
+extern void __init at91_alt_map_io(void);
 extern void __init at91_init_sram(int bank, unsigned long base,
                                  unsigned int length);
 
index 86c71debab5b617f11e50f701f7c1d768a232913..b27e9ca656538e5d623adf7941ba8839a9ae3394 100644 (file)
@@ -36,7 +36,7 @@
 #define ARCH_ID_AT91M40807     0x14080745
 #define ARCH_ID_AT91R40008     0x44000840
 
-#define ARCH_ID_SAMA5D3                0x8A5C07C0
+#define ARCH_ID_SAMA5          0x8A5C07C0
 
 #define ARCH_EXID_AT91SAM9M11  0x00000001
 #define ARCH_EXID_AT91SAM9M10  0x00000002
 #define ARCH_EXID_AT91SAM9G25  0x00000003
 #define ARCH_EXID_AT91SAM9X25  0x00000004
 
+#define ARCH_EXID_SAMA5D3      0x00004300
 #define ARCH_EXID_SAMA5D31     0x00444300
 #define ARCH_EXID_SAMA5D33     0x00414300
 #define ARCH_EXID_SAMA5D34     0x00414301
 #define ARCH_EXID_SAMA5D35     0x00584300
 #define ARCH_EXID_SAMA5D36     0x00004301
 
+#define ARCH_EXID_SAMA5D4      0x00000007
+#define ARCH_EXID_SAMA5D41     0x00000001
+#define ARCH_EXID_SAMA5D42     0x00000002
+#define ARCH_EXID_SAMA5D43     0x00000003
+#define ARCH_EXID_SAMA5D44     0x00000004
+
 #define ARCH_FAMILY_AT91X92    0x09200000
 #define ARCH_FAMILY_AT91SAM9   0x01900000
 #define ARCH_FAMILY_AT91SAM9XE 0x02900000
@@ -86,6 +93,9 @@ enum at91_soc_type {
        /* SAMA5D3 */
        AT91_SOC_SAMA5D3,
 
+       /* SAMA5D4 */
+       AT91_SOC_SAMA5D4,
+
        /* Unknown type */
        AT91_SOC_UNKNOWN,
 };
@@ -108,6 +118,10 @@ enum at91_soc_subtype {
        AT91_SOC_SAMA5D31, AT91_SOC_SAMA5D33, AT91_SOC_SAMA5D34,
        AT91_SOC_SAMA5D35, AT91_SOC_SAMA5D36,
 
+       /* SAMA5D4 */
+       AT91_SOC_SAMA5D41, AT91_SOC_SAMA5D42, AT91_SOC_SAMA5D43,
+       AT91_SOC_SAMA5D44,
+
        /* No subtype for this SoC */
        AT91_SOC_SUBTYPE_NONE,
 
@@ -211,6 +225,12 @@ static inline int at91_soc_is_detected(void)
 #define cpu_is_sama5d3()       (0)
 #endif
 
+#ifdef CONFIG_SOC_SAMA5D4
+#define cpu_is_sama5d4()       (at91_soc_initdata.type == AT91_SOC_SAMA5D4)
+#else
+#define cpu_is_sama5d4()       (0)
+#endif
+
 /*
  * Since this is ARM, we will never run on any AVR32 CPU. But these
  * definitions may reduce clutter in common drivers.
index c6bb9e2d9baa5c3d24f84b0f96584b66de35f4ca..2103a90f2261a7024f7afe2773d41d013a9d9d53 100644 (file)
 
 #if defined(CONFIG_AT91_DEBUG_LL_DBGU0)
 #define AT91_DBGU AT91_BASE_DBGU0
-#else
+#elif defined(CONFIG_AT91_DEBUG_LL_DBGU1)
 #define AT91_DBGU AT91_BASE_DBGU1
+#else
+/* On sama5d4, use USART3 as low level serial console */
+#define AT91_DBGU SAMA5D4_BASE_USART3
 #endif
 
        .macro  addruart, rp, rv, tmp
index 56338245653aea10f094ec765f0d9afdb99ae580..c13797352688de22f63f9a0cef94fdaaf409af46 100644 (file)
 /* DBGU base */
 /* rm9200, 9260/9g20, 9261/9g10, 9rl */
 #define AT91_BASE_DBGU0        0xfffff200
-/* 9263, 9g45 */
+/* 9263, 9g45, sama5d3 */
 #define AT91_BASE_DBGU1        0xffffee00
+/* sama5d4 */
+#define AT91_BASE_DBGU2        0xfc069000
 
 #if defined(CONFIG_ARCH_AT91X40)
 #include <mach/at91x40.h>
@@ -34,6 +36,7 @@
 #include <mach/at91sam9x5.h>
 #include <mach/at91sam9n12.h>
 #include <mach/sama5d3.h>
+#include <mach/sama5d4.h>
 
 /*
  * On all at91 except rm9200 and x40 have the System Controller starts
  * and map the same memory space
  */
 #define AT91_BASE_SYS  0xffffc000
+
 #endif
 
+/*
+ * On sama5d4 there is no system controller, we map some needed peripherals
+ */
+#define AT91_ALT_BASE_SYS      0xfc069000
+
 /*
  * On all at91 have the Advanced Interrupt Controller starts at address
  * 0xfffff000 and the Power Management Controller starts at 0xfffffc00
  */
 #define AT91_IO_PHYS_BASE      0xFFF78000
 #define AT91_IO_VIRT_BASE      IOMEM(0xFF000000 - AT91_IO_SIZE)
+
+/*
+ * On sama5d4, remap the peripherals from address 0xFC069000 .. 0xFC06F000
+ * to 0xFB069000 .. 0xFB06F000.  (24Kb)
+ */
+#define AT91_ALT_IO_PHYS_BASE  AT91_ALT_BASE_SYS
+#define AT91_ALT_IO_VIRT_BASE  IOMEM(0xFB069000)
 #else
 /*
  * Identity mapping for the non MMU case.
  */
 #define AT91_IO_PHYS_BASE      AT91_BASE_SYS
 #define AT91_IO_VIRT_BASE      IOMEM(AT91_IO_PHYS_BASE)
+
+#define AT91_ALT_IO_PHYS_BASE  AT91_ALT_BASE_SYS
+#define AT91_ALT_IO_VIRT_BASE  IOMEM(AT91_ALT_BASE_SYS)
 #endif
 
 #define AT91_IO_SIZE           (0xFFFFFFFF - AT91_IO_PHYS_BASE + 1)
 
  /* Convert a physical IO address to virtual IO address */
 #define AT91_IO_P2V(x)         ((x) - AT91_IO_PHYS_BASE + AT91_IO_VIRT_BASE)
+#define AT91_ALT_IO_P2V(x)     ((x) - AT91_ALT_IO_PHYS_BASE + AT91_ALT_IO_VIRT_BASE)
 
 /*
  * Virtual to Physical Address mapping for IO devices.
  */
 #define AT91_VA_BASE_SYS       AT91_IO_P2V(AT91_BASE_SYS)
+#define AT91_ALT_VA_BASE_SYS   AT91_ALT_IO_P2V(AT91_ALT_BASE_SYS)
 
  /* Internal SRAM is mapped below the IO devices */
 #define AT91_SRAM_MAX          SZ_1M
diff --git a/arch/arm/mach-at91/include/mach/sama5d4.h b/arch/arm/mach-at91/include/mach/sama5d4.h
new file mode 100644 (file)
index 0000000..f256a45
--- /dev/null
@@ -0,0 +1,33 @@
+/*
+ * Chip-specific header file for the SAMA5D4 family
+ *
+ *  Copyright (C) 2013 Atmel Corporation,
+ *                     Nicolas Ferre <nicolas.ferre@atmel.com>
+ *
+ * Common definitions.
+ * Based on SAMA5D4 datasheet.
+ *
+ * Licensed under GPLv2 or later.
+ */
+
+#ifndef SAMA5D4_H
+#define SAMA5D4_H
+
+/*
+ * User Peripheral physical base addresses.
+ */
+#define SAMA5D4_BASE_USART3    0xfc00c000 /* (USART3 non-secure) Base Address */
+#define SAMA5D4_BASE_PMC       0xf0018000 /* (PMC) Base Address */
+#define SAMA5D4_BASE_MPDDRC    0xf0010000 /* (MPDDRC) Base Address */
+#define SAMA5D4_BASE_PIOD      0xfc068000 /* (PIOD) Base Address */
+
+/* Some other peripherals */
+#define SAMA5D4_BASE_SYS2      SAMA5D4_BASE_PIOD
+
+/*
+ * Internal Memory.
+ */
+#define SAMA5D4_NS_SRAM_BASE     0x00210000      /* Internal SRAM base address Non-Secure */
+#define SAMA5D4_NS_SRAM_SIZE     (64 * SZ_1K)   /* Internal SRAM size Non-Secure part (64Kb) */
+
+#endif
index 4bb644f8e87c08a9119688968893b8cda217f927..acb2d890ad7e1ec58d79caaa1db576a8681a947f 100644 (file)
@@ -94,7 +94,7 @@ static const u32 uarts_sam9x5[] = {
        0,
 };
 
-static const u32 uarts_sama5[] = {
+static const u32 uarts_sama5d3[] = {
        AT91_BASE_DBGU1,
        SAMA5D3_BASE_USART0,
        SAMA5D3_BASE_USART1,
@@ -103,6 +103,12 @@ static const u32 uarts_sama5[] = {
        0,
 };
 
+static const u32 uarts_sama5d4[] = {
+       AT91_BASE_DBGU2,
+       SAMA5D4_BASE_USART3,
+       0,
+};
+
 static inline const u32* decomp_soc_detect(void __iomem *dbgu_base)
 {
        u32 cidr, socid;
@@ -134,8 +140,14 @@ static inline const u32* decomp_soc_detect(void __iomem *dbgu_base)
        case ARCH_ID_AT91SAM9X5:
                return uarts_sam9x5;
 
-       case ARCH_ID_SAMA5D3:
-               return uarts_sama5;
+       case ARCH_ID_SAMA5:
+               cidr = __raw_readl(dbgu_base + AT91_DBGU_EXID);
+               if (cidr & ARCH_EXID_SAMA5D3)
+                       return uarts_sama5d3;
+               else if (cidr & ARCH_EXID_SAMA5D4)
+                       return uarts_sama5d4;
+
+               break;
        }
 
        /* at91sam9g10 */
@@ -156,9 +168,10 @@ static inline void arch_decomp_setup(void)
        const u32* usarts;
 
        usarts = decomp_soc_detect((void __iomem *)AT91_BASE_DBGU0);
-
        if (!usarts)
                usarts = decomp_soc_detect((void __iomem *)AT91_BASE_DBGU1);
+       if (!usarts)
+               usarts = decomp_soc_detect((void __iomem *)AT91_BASE_DBGU2);
        if (!usarts) {
                at91_uart = NULL;
                return;
diff --git a/arch/arm/mach-at91/sama5d4.c b/arch/arm/mach-at91/sama5d4.c
new file mode 100644 (file)
index 0000000..7638509
--- /dev/null
@@ -0,0 +1,64 @@
+/*
+ *  Chip-specific setup code for the SAMA5D4 family
+ *
+ *  Copyright (C) 2013 Atmel Corporation,
+ *                     Nicolas Ferre <nicolas.ferre@atmel.com>
+ *
+ * Licensed under GPLv2 or later.
+ */
+
+#include <linux/module.h>
+#include <linux/dma-mapping.h>
+#include <linux/clk/at91_pmc.h>
+
+#include <asm/irq.h>
+#include <asm/mach/arch.h>
+#include <asm/mach/map.h>
+#include <mach/sama5d4.h>
+#include <mach/cpu.h>
+#include <mach/hardware.h>
+
+#include "soc.h"
+#include "generic.h"
+#include "sam9_smc.h"
+
+/* --------------------------------------------------------------------
+ *  Processor initialization
+ * -------------------------------------------------------------------- */
+static struct map_desc at91_io_desc[] __initdata = {
+       {
+       .virtual        = (unsigned long)AT91_ALT_IO_P2V(SAMA5D4_BASE_MPDDRC),
+       .pfn            = __phys_to_pfn(SAMA5D4_BASE_MPDDRC),
+       .length         = SZ_512,
+       .type           = MT_DEVICE,
+       },
+       {
+       .virtual        = (unsigned long)AT91_ALT_IO_P2V(SAMA5D4_BASE_PMC),
+       .pfn            = __phys_to_pfn(SAMA5D4_BASE_PMC),
+       .length         = SZ_512,
+       .type           = MT_DEVICE,
+       },
+       { /* On sama5d4, we use USART3 as serial console */
+       .virtual        = (unsigned long)AT91_ALT_IO_P2V(SAMA5D4_BASE_USART3),
+       .pfn            = __phys_to_pfn(SAMA5D4_BASE_USART3),
+       .length         = SZ_256,
+       .type           = MT_DEVICE,
+       },
+       { /* A bunch of peripheral with fine grained IO space */
+       .virtual        = (unsigned long)AT91_ALT_IO_P2V(SAMA5D4_BASE_SYS2),
+       .pfn            = __phys_to_pfn(SAMA5D4_BASE_SYS2),
+       .length         = SZ_2K,
+       .type           = MT_DEVICE,
+       },
+};
+
+
+static void __init sama5d4_map_io(void)
+{
+       iotable_init(at91_io_desc, ARRAY_SIZE(at91_io_desc));
+       at91_init_sram(0, SAMA5D4_NS_SRAM_BASE, SAMA5D4_NS_SRAM_SIZE);
+}
+
+AT91_SOC_START(sama5d4)
+       .map_io = sama5d4_map_io,
+AT91_SOC_END
index 0bf893a574f984ec7844eb0626e9ed90dee389ce..ebe7fdca9e83fb6b5eb6f1d72eaa1b801139a3fa 100644 (file)
@@ -97,6 +97,13 @@ static struct map_desc at91_io_desc __initdata __maybe_unused = {
        .type           = MT_DEVICE,
 };
 
+static struct map_desc at91_alt_io_desc __initdata __maybe_unused = {
+       .virtual        = (unsigned long)AT91_ALT_VA_BASE_SYS,
+       .pfn            = __phys_to_pfn(AT91_ALT_BASE_SYS),
+       .length         = 24 * SZ_1K,
+       .type           = MT_DEVICE,
+};
+
 static void __init soc_detect(u32 dbgu_base)
 {
        u32 cidr, socid;
@@ -159,9 +166,12 @@ static void __init soc_detect(u32 dbgu_base)
                at91_boot_soc = at91sam9n12_soc;
                break;
 
-       case ARCH_ID_SAMA5D3:
-               at91_soc_initdata.type = AT91_SOC_SAMA5D3;
-               at91_boot_soc = sama5d3_soc;
+       case ARCH_ID_SAMA5:
+               at91_soc_initdata.exid = __raw_readl(AT91_IO_P2V(dbgu_base) + AT91_DBGU_EXID);
+               if (at91_soc_initdata.exid & ARCH_EXID_SAMA5D3) {
+                       at91_soc_initdata.type = AT91_SOC_SAMA5D3;
+                       at91_boot_soc = sama5d3_soc;
+               }
                break;
        }
 
@@ -184,7 +194,8 @@ static void __init soc_detect(u32 dbgu_base)
        at91_soc_initdata.cidr = cidr;
 
        /* sub version of soc */
-       at91_soc_initdata.exid = __raw_readl(AT91_IO_P2V(dbgu_base) + AT91_DBGU_EXID);
+       if (!at91_soc_initdata.exid)
+               at91_soc_initdata.exid = __raw_readl(AT91_IO_P2V(dbgu_base) + AT91_DBGU_EXID);
 
        if (at91_soc_initdata.type == AT91_SOC_SAM9G45) {
                switch (at91_soc_initdata.exid) {
@@ -241,6 +252,54 @@ static void __init soc_detect(u32 dbgu_base)
        }
 }
 
+static void __init alt_soc_detect(u32 dbgu_base)
+{
+       u32 cidr, socid;
+
+       /* SoC ID */
+       cidr = __raw_readl(AT91_ALT_IO_P2V(dbgu_base) + AT91_DBGU_CIDR);
+       socid = cidr & ~AT91_CIDR_VERSION;
+
+       switch (socid) {
+       case ARCH_ID_SAMA5:
+               at91_soc_initdata.exid = __raw_readl(AT91_ALT_IO_P2V(dbgu_base) + AT91_DBGU_EXID);
+               if (at91_soc_initdata.exid & ARCH_EXID_SAMA5D3) {
+                       at91_soc_initdata.type = AT91_SOC_SAMA5D3;
+                       at91_boot_soc = sama5d3_soc;
+               } else if (at91_soc_initdata.exid & ARCH_EXID_SAMA5D4) {
+                       at91_soc_initdata.type = AT91_SOC_SAMA5D4;
+                       at91_boot_soc = sama5d4_soc;
+               }
+               break;
+       }
+
+       if (!at91_soc_is_detected())
+               return;
+
+       at91_soc_initdata.cidr = cidr;
+
+       /* sub version of soc */
+       if (!at91_soc_initdata.exid)
+               at91_soc_initdata.exid = __raw_readl(AT91_ALT_IO_P2V(dbgu_base) + AT91_DBGU_EXID);
+
+       if (at91_soc_initdata.type == AT91_SOC_SAMA5D4) {
+               switch (at91_soc_initdata.exid) {
+               case ARCH_EXID_SAMA5D41:
+                       at91_soc_initdata.subtype = AT91_SOC_SAMA5D41;
+                       break;
+               case ARCH_EXID_SAMA5D42:
+                       at91_soc_initdata.subtype = AT91_SOC_SAMA5D42;
+                       break;
+               case ARCH_EXID_SAMA5D43:
+                       at91_soc_initdata.subtype = AT91_SOC_SAMA5D43;
+                       break;
+               case ARCH_EXID_SAMA5D44:
+                       at91_soc_initdata.subtype = AT91_SOC_SAMA5D44;
+                       break;
+               }
+       }
+}
+
 static const char *soc_name[] = {
        [AT91_SOC_RM9200]       = "at91rm9200",
        [AT91_SOC_SAM9260]      = "at91sam9260",
@@ -253,6 +312,7 @@ static const char *soc_name[] = {
        [AT91_SOC_SAM9X5]       = "at91sam9x5",
        [AT91_SOC_SAM9N12]      = "at91sam9n12",
        [AT91_SOC_SAMA5D3]      = "sama5d3",
+       [AT91_SOC_SAMA5D4]      = "sama5d4",
        [AT91_SOC_UNKNOWN]      = "Unknown",
 };
 
@@ -280,6 +340,10 @@ static const char *soc_subtype_name[] = {
        [AT91_SOC_SAMA5D34]     = "sama5d34",
        [AT91_SOC_SAMA5D35]     = "sama5d35",
        [AT91_SOC_SAMA5D36]     = "sama5d36",
+       [AT91_SOC_SAMA5D41]     = "sama5d41",
+       [AT91_SOC_SAMA5D42]     = "sama5d42",
+       [AT91_SOC_SAMA5D43]     = "sama5d43",
+       [AT91_SOC_SAMA5D44]     = "sama5d44",
        [AT91_SOC_SUBTYPE_NONE] = "None",
        [AT91_SOC_SUBTYPE_UNKNOWN] = "Unknown",
 };
@@ -342,6 +406,31 @@ void __init at91_ioremap_rstc(u32 base_addr)
                panic("Impossible to ioremap at91_rstc_base\n");
 }
 
+void __init at91_alt_map_io(void)
+{
+       /* Map peripherals */
+       iotable_init(&at91_alt_io_desc, 1);
+
+       at91_soc_initdata.type = AT91_SOC_UNKNOWN;
+       at91_soc_initdata.subtype = AT91_SOC_SUBTYPE_UNKNOWN;
+
+       alt_soc_detect(AT91_BASE_DBGU2);
+       if (!at91_soc_is_detected())
+               panic("AT91: Impossible to detect the SOC type");
+
+       pr_info("AT91: Detected soc type: %s\n",
+               at91_get_soc_type(&at91_soc_initdata));
+       if (at91_soc_initdata.subtype != AT91_SOC_SUBTYPE_NONE)
+               pr_info("AT91: Detected soc subtype: %s\n",
+                       at91_get_soc_subtype(&at91_soc_initdata));
+
+       if (!at91_soc_is_enabled())
+               panic("AT91: Soc not enabled");
+
+       if (at91_boot_soc.map_io)
+               at91_boot_soc.map_io();
+}
+
 void __iomem *at91_matrix_base;
 EXPORT_SYMBOL_GPL(at91_matrix_base);
 
index a1e1482c6da860536e3e44980a501274527990d9..8ecaee67f9533fb85720747b404776bf9c87be0d 100644 (file)
@@ -24,6 +24,7 @@ extern struct at91_init_soc at91sam9rl_soc;
 extern struct at91_init_soc at91sam9x5_soc;
 extern struct at91_init_soc at91sam9n12_soc;
 extern struct at91_init_soc sama5d3_soc;
+extern struct at91_init_soc sama5d4_soc;
 
 #define AT91_SOC_START(_name)                          \
 struct at91_init_soc __initdata _name##_soc            \
@@ -74,3 +75,7 @@ static inline int at91_soc_is_enabled(void)
 #if !defined(CONFIG_SOC_SAMA5D3)
 #define sama5d3_soc    at91_boot_soc
 #endif
+
+#if !defined(CONFIG_SOC_SAMA5D4)
+#define sama5d4_soc    at91_boot_soc
+#endif
index fc938005ad3997d8d0e9ab28e03f4d5b01772303..2abad742516df753e487721b42e6d9cfdb50d91c 100644 (file)
@@ -99,6 +99,23 @@ config ARCH_BCM_5301X
          different SoC or with the older BCM47XX and BCM53XX based
          network SoC using a MIPS CPU, they are supported by arch/mips/bcm47xx
 
+config ARCH_BCM_63XX
+       bool "Broadcom BCM63xx DSL SoC" if ARCH_MULTI_V7
+       depends on MMU
+       select ARM_ERRATA_754322
+       select ARM_ERRATA_764369 if SMP
+       select ARM_GIC
+       select ARM_GLOBAL_TIMER
+       select CACHE_L2X0
+       select HAVE_ARM_ARCH_TIMER
+       select HAVE_ARM_TWD if SMP
+       select HAVE_ARM_SCU if SMP
+       select HAVE_SMP
+       help
+         This enables support for systems based on Broadcom DSL SoCs.
+         It currently supports the 'BCM63XX' ARM-based family, which includes
+         the BCM63138 variant.
+
 config ARCH_BRCMSTB
        bool "Broadcom BCM7XXX based boards" if ARCH_MULTI_V7
        depends on MMU
index b19a39652545daf3ca46243e29c7e7780fb27a91..300ae4b79ae6343eeb17ca2abf899fb699b92b2b 100644 (file)
@@ -34,6 +34,9 @@ obj-$(CONFIG_ARCH_BCM2835)    += board_bcm2835.o
 # BCM5301X
 obj-$(CONFIG_ARCH_BCM_5301X)   += bcm_5301x.o
 
+# BCM63XXx
+obj-$(CONFIG_ARCH_BCM_63XX)    := bcm63xx.o
+
 ifeq ($(CONFIG_ARCH_BRCMSTB),y)
 obj-y                          += brcmstb.o
 endif
diff --git a/arch/arm/mach-bcm/bcm63xx.c b/arch/arm/mach-bcm/bcm63xx.c
new file mode 100644 (file)
index 0000000..c4c66ae
--- /dev/null
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2014 Broadcom Corporation
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation version 2.
+ *
+ * This program is distributed "as is" WITHOUT ANY WARRANTY of any
+ * kind, whether express or implied; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
+
+#include <linux/of_platform.h>
+
+#include <asm/mach/arch.h>
+
+static const char * const bcm63xx_dt_compat[] = {
+       "brcm,bcm63138",
+       NULL
+};
+
+DT_MACHINE_START(BCM63XXX_DT, "BCM63xx DSL SoC")
+       .dt_compat      = bcm63xx_dt_compat,
+       .l2c_aux_val    = 0,
+       .l2c_aux_mask   = ~0,
+MACHINE_END
index fdf54d40909a9ec371558db2c5b0b943b9531d9a..f33979784f382161d2565258914f26164ba65e1b 100644 (file)
@@ -14,8 +14,9 @@
 #include <linux/types.h>
 #include <linux/i2c-gpio.h>
 #include <linux/interrupt.h>
-#include <linux/backlight.h>
 #include <linux/platform_device.h>
+#include <linux/pwm.h>
+#include <linux/pwm_backlight.h>
 #include <linux/memblock.h>
 
 #include <linux/mtd/physmap.h>
@@ -108,23 +109,23 @@ static struct plat_lcd_data edb7211_lcd_power_pdata = {
        .set_power      = edb7211_lcd_power_set,
 };
 
-static void edb7211_lcd_backlight_set_intensity(int intensity)
-{
-       gpio_set_value(EDB7211_LCDBL, !!intensity);
-       clps_writel((clps_readl(PMPCON) & 0xf0ff) | (intensity << 8), PMPCON);
-}
+static struct pwm_lookup edb7211_pwm_lookup[] = {
+       PWM_LOOKUP("clps711x-pwm", 0, "pwm-backlight.0", NULL,
+                  0, PWM_POLARITY_NORMAL),
+};
 
-static struct generic_bl_info edb7211_lcd_backlight_pdata = {
-       .name                   = "lcd-backlight.0",
-       .default_intensity      = 0x01,
-       .max_intensity          = 0x0f,
-       .set_bl_intensity       = edb7211_lcd_backlight_set_intensity,
+static struct platform_pwm_backlight_data pwm_bl_pdata = {
+       .dft_brightness = 0x01,
+       .max_brightness = 0x0f,
+       .enable_gpio    = EDB7211_LCDBL,
 };
 
+static struct resource clps711x_pwm_res =
+       DEFINE_RES_MEM(CLPS711X_PHYS_BASE + PMPCON, SZ_4);
+
 static struct gpio edb7211_gpios[] __initconst = {
        { EDB7211_LCD_DC_DC_EN, GPIOF_OUT_INIT_LOW,     "LCD DC-DC" },
        { EDB7211_LCDEN,        GPIOF_OUT_INIT_LOW,     "LCD POWER" },
-       { EDB7211_LCDBL,        GPIOF_OUT_INIT_LOW,     "LCD BACKLIGHT" },
 };
 
 /* Reserve screen memory region at the start of main system memory. */
@@ -153,12 +154,18 @@ static void __init edb7211_init_late(void)
        gpio_request_array(edb7211_gpios, ARRAY_SIZE(edb7211_gpios));
 
        platform_device_register(&edb7211_flash_pdev);
+
        platform_device_register_data(NULL, "platform-lcd", 0,
                                      &edb7211_lcd_power_pdata,
                                      sizeof(edb7211_lcd_power_pdata));
-       platform_device_register_data(NULL, "generic-bl", 0,
-                                     &edb7211_lcd_backlight_pdata,
-                                     sizeof(edb7211_lcd_backlight_pdata));
+
+       platform_device_register_simple("clps711x-pwm", PLATFORM_DEVID_NONE,
+                                       &clps711x_pwm_res, 1);
+       pwm_add_table(edb7211_pwm_lookup, ARRAY_SIZE(edb7211_pwm_lookup));
+
+       platform_device_register_data(&platform_bus, "pwm-backlight", 0,
+                                     &pwm_bl_pdata, sizeof(pwm_bl_pdata));
+
        platform_device_register_simple("video-clps711x", 0, NULL, 0);
        platform_device_register_simple("cs89x0", 0, edb7211_cs8900_resource,
                                        ARRAY_SIZE(edb7211_cs8900_resource));
index 0c689d3a6710a28de506957727d95dde71a41c04..77a9617c216d50d8c5746fd5429d066c7f1d74ce 100644 (file)
@@ -1,7 +1,7 @@
 /*
  *  CLPS711X common devices definitions
  *
- *  Author: Alexander Shiyan <shc_work@mail.ru>, 2013
+ *  Author: Alexander Shiyan <shc_work@mail.ru>, 2013-2014
  *
  * 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
@@ -9,8 +9,15 @@
  * (at your option) any later version.
  */
 
+#include <linux/io.h>
+#include <linux/of_fdt.h>
 #include <linux/platform_device.h>
+#include <linux/random.h>
 #include <linux/sizes.h>
+#include <linux/slab.h>
+#include <linux/sys_soc.h>
+
+#include <asm/system_info.h>
 
 #include <mach/hardware.h>
 
@@ -90,10 +97,53 @@ static void __init clps711x_add_uart(void)
                                        ARRAY_SIZE(clps711x_uart2_res));
 };
 
+static void __init clps711x_soc_init(void)
+{
+       struct soc_device_attribute *soc_dev_attr;
+       struct soc_device *soc_dev;
+       void __iomem *base;
+       u32 id[5];
+
+       base = ioremap(CLPS711X_PHYS_BASE, SZ_32K);
+       if (!base)
+               return;
+
+       id[0] = readl(base + UNIQID);
+       id[1] = readl(base + RANDID0);
+       id[2] = readl(base + RANDID1);
+       id[3] = readl(base + RANDID2);
+       id[4] = readl(base + RANDID3);
+       system_rev = SYSFLG1_VERID(readl(base + SYSFLG1));
+
+       add_device_randomness(id, sizeof(id));
+
+       system_serial_low = id[0];
+
+       soc_dev_attr = kzalloc(sizeof(*soc_dev_attr), GFP_KERNEL);
+       if (!soc_dev_attr)
+               goto out_unmap;
+
+       soc_dev_attr->machine = of_flat_dt_get_machine_name();
+       soc_dev_attr->family = "Cirrus Logic CLPS711X";
+       soc_dev_attr->revision = kasprintf(GFP_KERNEL, "%u", system_rev);
+       soc_dev_attr->soc_id = kasprintf(GFP_KERNEL, "%08x", id[0]);
+
+       soc_dev = soc_device_register(soc_dev_attr);
+       if (IS_ERR(soc_dev)) {
+               kfree(soc_dev_attr->revision);
+               kfree(soc_dev_attr->soc_id);
+               kfree(soc_dev_attr);
+       }
+
+out_unmap:
+       iounmap(base);
+}
+
 void __init clps711x_devices_init(void)
 {
        clps711x_add_cpuidle();
        clps711x_add_gpio();
        clps711x_add_syscon();
        clps711x_add_uart();
+       clps711x_soc_init();
 }
index 984882943f777540d7f0938e754a325194c79b76..cd19433f76d3de7f862d8e8d1c1d312f2155d7c0 100644 (file)
@@ -1,6 +1,6 @@
 config ARCH_HISI
        bool "Hisilicon SoC Support"
-       depends on ARCH_MULTIPLATFORM
+       depends on ARCH_MULTI_V7
        select ARM_AMBA
        select ARM_GIC
        select ARM_TIMER_SP804
@@ -22,6 +22,15 @@ config ARCH_HI3xxx
        help
          Support for Hisilicon Hi36xx SoC family
 
+config ARCH_HIP04
+       bool "Hisilicon HiP04 Cortex A15 family" if ARCH_MULTI_V7
+       select ARM_ERRATA_798181 if SMP
+       select HAVE_ARM_ARCH_TIMER
+       select MCPM if SMP
+       select MCPM_QUAD_CLUSTER if SMP
+       help
+         Support for Hisilicon HiP04 SoC family
+
 config ARCH_HIX5HD2
        bool "Hisilicon X5HD2 family" if ARCH_MULTI_V7
        select CACHE_L2X0
index ee2506b9cde3c3bd660cbf49b4f0f146b2130f81..6b7b3033de0bcfa0d22b4b5be681953354fa83d1 100644 (file)
@@ -2,5 +2,8 @@
 # Makefile for Hisilicon processors family
 #
 
+CFLAGS_platmcpm.o      := -march=armv7-a
+
 obj-y  += hisilicon.o
+obj-$(CONFIG_MCPM)             += platmcpm.o
 obj-$(CONFIG_SMP)              += platsmp.o hotplug.o headsmp.o
index 7cda6dda3cd000a2c89bab157ff83d03ad6d9bdb..7744c351bbfd6d7f4efdf631c0050159779f96e0 100644 (file)
@@ -63,3 +63,12 @@ static const char *hix5hd2_compat[] __initconst = {
 DT_MACHINE_START(HIX5HD2_DT, "Hisilicon HIX5HD2 (Flattened Device Tree)")
        .dt_compat      = hix5hd2_compat,
 MACHINE_END
+
+static const char *hip04_compat[] __initconst = {
+       "hisilicon,hip04-d01",
+       NULL,
+};
+
+DT_MACHINE_START(HIP04, "Hisilicon HiP04 (Flattened Device Tree)")
+       .dt_compat      = hip04_compat,
+MACHINE_END
diff --git a/arch/arm/mach-hisi/platmcpm.c b/arch/arm/mach-hisi/platmcpm.c
new file mode 100644 (file)
index 0000000..280f3f1
--- /dev/null
@@ -0,0 +1,386 @@
+/*
+ * Copyright (c) 2013-2014 Linaro Ltd.
+ * Copyright (c) 2013-2014 Hisilicon Limited.
+ *
+ * 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/delay.h>
+#include <linux/io.h>
+#include <linux/memblock.h>
+#include <linux/of_address.h>
+
+#include <asm/cputype.h>
+#include <asm/cp15.h>
+#include <asm/mcpm.h>
+
+#include "core.h"
+
+/* bits definition in SC_CPU_RESET_REQ[x]/SC_CPU_RESET_DREQ[x]
+ * 1 -- unreset; 0 -- reset
+ */
+#define CORE_RESET_BIT(x)              (1 << x)
+#define NEON_RESET_BIT(x)              (1 << (x + 4))
+#define CORE_DEBUG_RESET_BIT(x)                (1 << (x + 9))
+#define CLUSTER_L2_RESET_BIT           (1 << 8)
+#define CLUSTER_DEBUG_RESET_BIT                (1 << 13)
+
+/*
+ * bits definition in SC_CPU_RESET_STATUS[x]
+ * 1 -- reset status; 0 -- unreset status
+ */
+#define CORE_RESET_STATUS(x)           (1 << x)
+#define NEON_RESET_STATUS(x)           (1 << (x + 4))
+#define CORE_DEBUG_RESET_STATUS(x)     (1 << (x + 9))
+#define CLUSTER_L2_RESET_STATUS                (1 << 8)
+#define CLUSTER_DEBUG_RESET_STATUS     (1 << 13)
+#define CORE_WFI_STATUS(x)             (1 << (x + 16))
+#define CORE_WFE_STATUS(x)             (1 << (x + 20))
+#define CORE_DEBUG_ACK(x)              (1 << (x + 24))
+
+#define SC_CPU_RESET_REQ(x)            (0x520 + (x << 3))      /* reset */
+#define SC_CPU_RESET_DREQ(x)           (0x524 + (x << 3))      /* unreset */
+#define SC_CPU_RESET_STATUS(x)         (0x1520 + (x << 3))
+
+#define FAB_SF_MODE                    0x0c
+#define FAB_SF_INVLD                   0x10
+
+/* bits definition in FB_SF_INVLD */
+#define FB_SF_INVLD_START              (1 << 8)
+
+#define HIP04_MAX_CLUSTERS             4
+#define HIP04_MAX_CPUS_PER_CLUSTER     4
+
+#define POLL_MSEC      10
+#define TIMEOUT_MSEC   1000
+
+static void __iomem *sysctrl, *fabric;
+static int hip04_cpu_table[HIP04_MAX_CLUSTERS][HIP04_MAX_CPUS_PER_CLUSTER];
+static DEFINE_SPINLOCK(boot_lock);
+static u32 fabric_phys_addr;
+/*
+ * [0]: bootwrapper physical address
+ * [1]: bootwrapper size
+ * [2]: relocation address
+ * [3]: relocation size
+ */
+static u32 hip04_boot_method[4];
+
+static bool hip04_cluster_is_down(unsigned int cluster)
+{
+       int i;
+
+       for (i = 0; i < HIP04_MAX_CPUS_PER_CLUSTER; i++)
+               if (hip04_cpu_table[cluster][i])
+                       return false;
+       return true;
+}
+
+static void hip04_set_snoop_filter(unsigned int cluster, unsigned int on)
+{
+       unsigned long data;
+
+       if (!fabric)
+               BUG();
+       data = readl_relaxed(fabric + FAB_SF_MODE);
+       if (on)
+               data |= 1 << cluster;
+       else
+               data &= ~(1 << cluster);
+       writel_relaxed(data, fabric + FAB_SF_MODE);
+       do {
+               cpu_relax();
+       } while (data != readl_relaxed(fabric + FAB_SF_MODE));
+}
+
+static int hip04_mcpm_power_up(unsigned int cpu, unsigned int cluster)
+{
+       unsigned long data;
+       void __iomem *sys_dreq, *sys_status;
+
+       if (!sysctrl)
+               return -ENODEV;
+       if (cluster >= HIP04_MAX_CLUSTERS || cpu >= HIP04_MAX_CPUS_PER_CLUSTER)
+               return -EINVAL;
+
+       spin_lock_irq(&boot_lock);
+
+       if (hip04_cpu_table[cluster][cpu])
+               goto out;
+
+       sys_dreq = sysctrl + SC_CPU_RESET_DREQ(cluster);
+       sys_status = sysctrl + SC_CPU_RESET_STATUS(cluster);
+       if (hip04_cluster_is_down(cluster)) {
+               data = CLUSTER_DEBUG_RESET_BIT;
+               writel_relaxed(data, sys_dreq);
+               do {
+                       cpu_relax();
+                       data = readl_relaxed(sys_status);
+               } while (data & CLUSTER_DEBUG_RESET_STATUS);
+       }
+
+       data = CORE_RESET_BIT(cpu) | NEON_RESET_BIT(cpu) | \
+              CORE_DEBUG_RESET_BIT(cpu);
+       writel_relaxed(data, sys_dreq);
+       do {
+               cpu_relax();
+       } while (data == readl_relaxed(sys_status));
+       /*
+        * We may fail to power up core again without this delay.
+        * It's not mentioned in document. It's found by test.
+        */
+       udelay(20);
+out:
+       hip04_cpu_table[cluster][cpu]++;
+       spin_unlock_irq(&boot_lock);
+
+       return 0;
+}
+
+static void hip04_mcpm_power_down(void)
+{
+       unsigned int mpidr, cpu, cluster;
+       bool skip_wfi = false, last_man = false;
+
+       mpidr = read_cpuid_mpidr();
+       cpu = MPIDR_AFFINITY_LEVEL(mpidr, 0);
+       cluster = MPIDR_AFFINITY_LEVEL(mpidr, 1);
+
+       __mcpm_cpu_going_down(cpu, cluster);
+
+       spin_lock(&boot_lock);
+       BUG_ON(__mcpm_cluster_state(cluster) != CLUSTER_UP);
+       hip04_cpu_table[cluster][cpu]--;
+       if (hip04_cpu_table[cluster][cpu] == 1) {
+               /* A power_up request went ahead of us. */
+               skip_wfi = true;
+       } else if (hip04_cpu_table[cluster][cpu] > 1) {
+               pr_err("Cluster %d CPU%d boots multiple times\n", cluster, cpu);
+               BUG();
+       }
+
+       last_man = hip04_cluster_is_down(cluster);
+       if (last_man && __mcpm_outbound_enter_critical(cpu, cluster)) {
+               spin_unlock(&boot_lock);
+               /* Since it's Cortex A15, disable L2 prefetching. */
+               asm volatile(
+               "mcr    p15, 1, %0, c15, c0, 3 \n\t"
+               "isb    \n\t"
+               "dsb    "
+               : : "r" (0x400) );
+               v7_exit_coherency_flush(all);
+               hip04_set_snoop_filter(cluster, 0);
+               __mcpm_outbound_leave_critical(cluster, CLUSTER_DOWN);
+       } else {
+               spin_unlock(&boot_lock);
+               v7_exit_coherency_flush(louis);
+       }
+
+       __mcpm_cpu_down(cpu, cluster);
+
+       if (!skip_wfi)
+               wfi();
+}
+
+static int hip04_mcpm_wait_for_powerdown(unsigned int cpu, unsigned int cluster)
+{
+       unsigned int data, tries, count;
+       int ret = -ETIMEDOUT;
+
+       BUG_ON(cluster >= HIP04_MAX_CLUSTERS ||
+              cpu >= HIP04_MAX_CPUS_PER_CLUSTER);
+
+       count = TIMEOUT_MSEC / POLL_MSEC;
+       spin_lock_irq(&boot_lock);
+       for (tries = 0; tries < count; tries++) {
+               if (hip04_cpu_table[cluster][cpu]) {
+                       ret = -EBUSY;
+                       goto err;
+               }
+               cpu_relax();
+               data = readl_relaxed(sysctrl + SC_CPU_RESET_STATUS(cluster));
+               if (data & CORE_WFI_STATUS(cpu))
+                       break;
+               spin_unlock_irq(&boot_lock);
+               /* Wait for clean L2 when the whole cluster is down. */
+               msleep(POLL_MSEC);
+               spin_lock_irq(&boot_lock);
+       }
+       if (tries >= count)
+               goto err;
+       data = CORE_RESET_BIT(cpu) | NEON_RESET_BIT(cpu) | \
+              CORE_DEBUG_RESET_BIT(cpu);
+       writel_relaxed(data, sysctrl + SC_CPU_RESET_REQ(cluster));
+       for (tries = 0; tries < count; tries++) {
+               cpu_relax();
+               data = readl_relaxed(sysctrl + SC_CPU_RESET_STATUS(cluster));
+               if (data & CORE_RESET_STATUS(cpu))
+                       break;
+       }
+       if (tries >= count)
+               goto err;
+       spin_unlock_irq(&boot_lock);
+       return 0;
+err:
+       spin_unlock_irq(&boot_lock);
+       return ret;
+}
+
+static void hip04_mcpm_powered_up(void)
+{
+       unsigned int mpidr, cpu, cluster;
+
+       mpidr = read_cpuid_mpidr();
+       cpu = MPIDR_AFFINITY_LEVEL(mpidr, 0);
+       cluster = MPIDR_AFFINITY_LEVEL(mpidr, 1);
+
+       spin_lock(&boot_lock);
+       if (!hip04_cpu_table[cluster][cpu])
+               hip04_cpu_table[cluster][cpu] = 1;
+       spin_unlock(&boot_lock);
+}
+
+static void __naked hip04_mcpm_power_up_setup(unsigned int affinity_level)
+{
+       asm volatile ("                 \n"
+"      cmp     r0, #0                  \n"
+"      bxeq    lr                      \n"
+       /* calculate fabric phys address */
+"      adr     r2, 2f                  \n"
+"      ldmia   r2, {r1, r3}            \n"
+"      sub     r0, r2, r1              \n"
+"      ldr     r2, [r0, r3]            \n"
+       /* get cluster id from MPIDR */
+"      mrc     p15, 0, r0, c0, c0, 5   \n"
+"      ubfx    r1, r0, #8, #8          \n"
+       /* 1 << cluster id */
+"      mov     r0, #1                  \n"
+"      mov     r3, r0, lsl r1          \n"
+"      ldr     r0, [r2, #"__stringify(FAB_SF_MODE)"]   \n"
+"      tst     r0, r3                  \n"
+"      bxne    lr                      \n"
+"      orr     r1, r0, r3              \n"
+"      str     r1, [r2, #"__stringify(FAB_SF_MODE)"]   \n"
+"1:    ldr     r0, [r2, #"__stringify(FAB_SF_MODE)"]   \n"
+"      tst     r0, r3                  \n"
+"      beq     1b                      \n"
+"      bx      lr                      \n"
+
+"      .align  2                       \n"
+"2:    .word   .                       \n"
+"      .word   fabric_phys_addr        \n"
+       );
+}
+
+static const struct mcpm_platform_ops hip04_mcpm_ops = {
+       .power_up               = hip04_mcpm_power_up,
+       .power_down             = hip04_mcpm_power_down,
+       .wait_for_powerdown     = hip04_mcpm_wait_for_powerdown,
+       .powered_up             = hip04_mcpm_powered_up,
+};
+
+static bool __init hip04_cpu_table_init(void)
+{
+       unsigned int mpidr, cpu, cluster;
+
+       mpidr = read_cpuid_mpidr();
+       cpu = MPIDR_AFFINITY_LEVEL(mpidr, 0);
+       cluster = MPIDR_AFFINITY_LEVEL(mpidr, 1);
+
+       if (cluster >= HIP04_MAX_CLUSTERS ||
+           cpu >= HIP04_MAX_CPUS_PER_CLUSTER) {
+               pr_err("%s: boot CPU is out of bound!\n", __func__);
+               return false;
+       }
+       hip04_set_snoop_filter(cluster, 1);
+       hip04_cpu_table[cluster][cpu] = 1;
+       return true;
+}
+
+static int __init hip04_mcpm_init(void)
+{
+       struct device_node *np, *np_sctl, *np_fab;
+       struct resource fab_res;
+       void __iomem *relocation;
+       int ret = -ENODEV;
+
+       np = of_find_compatible_node(NULL, NULL, "hisilicon,hip04-bootwrapper");
+       if (!np)
+               goto err;
+       ret = of_property_read_u32_array(np, "boot-method",
+                                        &hip04_boot_method[0], 4);
+       if (ret)
+               goto err;
+       np_sctl = of_find_compatible_node(NULL, NULL, "hisilicon,sysctrl");
+       if (!np_sctl)
+               goto err;
+       np_fab = of_find_compatible_node(NULL, NULL, "hisilicon,hip04-fabric");
+       if (!np_fab)
+               goto err;
+
+       ret = memblock_reserve(hip04_boot_method[0], hip04_boot_method[1]);
+       if (ret)
+               goto err;
+
+       relocation = ioremap(hip04_boot_method[2], hip04_boot_method[3]);
+       if (!relocation) {
+               pr_err("failed to map relocation space\n");
+               ret = -ENOMEM;
+               goto err_reloc;
+       }
+       sysctrl = of_iomap(np_sctl, 0);
+       if (!sysctrl) {
+               pr_err("failed to get sysctrl base\n");
+               ret = -ENOMEM;
+               goto err_sysctrl;
+       }
+       ret = of_address_to_resource(np_fab, 0, &fab_res);
+       if (ret) {
+               pr_err("failed to get fabric base phys\n");
+               goto err_fabric;
+       }
+       fabric_phys_addr = fab_res.start;
+       sync_cache_w(&fabric_phys_addr);
+       fabric = of_iomap(np_fab, 0);
+       if (!fabric) {
+               pr_err("failed to get fabric base\n");
+               ret = -ENOMEM;
+               goto err_fabric;
+       }
+
+       if (!hip04_cpu_table_init()) {
+               ret = -EINVAL;
+               goto err_table;
+       }
+       ret = mcpm_platform_register(&hip04_mcpm_ops);
+       if (ret) {
+               goto err_table;
+       }
+
+       /*
+        * Fill the instruction address that is used after secondary core
+        * out of reset.
+        */
+       writel_relaxed(hip04_boot_method[0], relocation);
+       writel_relaxed(0xa5a5a5a5, relocation + 4);     /* magic number */
+       writel_relaxed(virt_to_phys(mcpm_entry_point), relocation + 8);
+       writel_relaxed(0, relocation + 12);
+       iounmap(relocation);
+
+       mcpm_sync_init(hip04_mcpm_power_up_setup);
+       mcpm_smp_set_ops();
+       pr_info("HiP04 MCPM initialized\n");
+       return ret;
+err_table:
+       iounmap(fabric);
+err_fabric:
+       iounmap(sysctrl);
+err_sysctrl:
+       iounmap(relocation);
+err_reloc:
+       memblock_free(hip04_boot_method[0], hip04_boot_method[1]);
+err:
+       return ret;
+}
+early_initcall(hip04_mcpm_init);
index 4e9b4f63d42b275daf245b26ac752623684a8d8a..11b2957f792ba63211dccb975b1d66eacd472e0a 100644 (file)
@@ -69,6 +69,7 @@ config SOC_IMX1
        select CPU_ARM920T
        select IMX_HAVE_IOMUX_V1
        select MXC_AVIC
+       select PINCTRL_IMX1
 
 config SOC_IMX21
        bool
@@ -124,6 +125,13 @@ config MACH_APF9328
        help
          Say Yes here if you are using the Armadeus APF9328 development board
 
+config MACH_IMX1_DT
+       bool "Support i.MX1 platforms from device tree"
+       select SOC_IMX1
+       help
+         Include support for Freescale i.MX1 based platforms
+         using the device tree for discovery.
+
 endif
 
 if ARCH_MULTI_V5
index 4147729775d23ff4fa986a4f8db7f8cabeab51bf..6e4fcd8339cdbe24297724ffb631a68517efb491 100644 (file)
@@ -16,7 +16,8 @@ obj-$(CONFIG_SOC_IMX5) += cpu-imx5.o clk-imx51-imx53.o $(imx5-pm-y)
 
 obj-$(CONFIG_COMMON_CLK) += clk-pllv1.o clk-pllv2.o clk-pllv3.o clk-gate2.o \
                            clk-pfd.o clk-busy.o clk.o \
-                           clk-fixup-div.o clk-fixup-mux.o
+                           clk-fixup-div.o clk-fixup-mux.o \
+                           clk-gate-exclusive.o
 
 obj-$(CONFIG_IMX_HAVE_IOMUX_V1) += iomux-v1.o
 obj-$(CONFIG_ARCH_MXC_IOMUX_V3) += iomux-v3.o
@@ -43,6 +44,7 @@ endif
 # i.MX1 based machines
 obj-$(CONFIG_MACH_SCB9328) += mach-scb9328.o
 obj-$(CONFIG_MACH_APF9328) += mach-apf9328.o
+obj-$(CONFIG_MACH_IMX1_DT) += imx1-dt.o
 
 # i.MX21 based machines
 obj-$(CONFIG_MACH_MX21ADS) += mach-mx21ads.o
index 4a40bbb46183a850af387151c58b73569f55182a..8259a625a920ba3fca9cf567893b2be03e7892c7 100644 (file)
@@ -104,6 +104,19 @@ void __init imx_init_revision_from_anatop(void)
        case 2:
                revision = IMX_CHIP_REVISION_1_2;
                break;
+       case 3:
+               revision = IMX_CHIP_REVISION_1_3;
+               break;
+       case 4:
+               revision = IMX_CHIP_REVISION_1_4;
+               break;
+       case 5:
+               /*
+                * i.MX6DQ TO1.5 is defined as Rev 1.3 in Data Sheet, marked
+                * as 'D' in Part Number last character.
+                */
+               revision = IMX_CHIP_REVISION_1_5;
+               break;
        default:
                revision = IMX_CHIP_REVISION_UNKNOWN;
        }
diff --git a/arch/arm/mach-imx/clk-gate-exclusive.c b/arch/arm/mach-imx/clk-gate-exclusive.c
new file mode 100644 (file)
index 0000000..c12f5f2
--- /dev/null
@@ -0,0 +1,94 @@
+/*
+ * Copyright 2014 Freescale Semiconductor, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include <linux/clk-provider.h>
+#include <linux/err.h>
+#include <linux/io.h>
+#include <linux/slab.h>
+#include "clk.h"
+
+/**
+ * struct clk_gate_exclusive - i.MX specific gate clock which is mutually
+ * exclusive with other gate clocks
+ *
+ * @gate: the parent class
+ * @exclusive_mask: mask of gate bits which are mutually exclusive to this
+ *     gate clock
+ *
+ * The imx exclusive gate clock is a subclass of basic clk_gate
+ * with an addtional mask to indicate which other gate bits in the same
+ * register is mutually exclusive to this gate clock.
+ */
+struct clk_gate_exclusive {
+       struct clk_gate gate;
+       u32 exclusive_mask;
+};
+
+static int clk_gate_exclusive_enable(struct clk_hw *hw)
+{
+       struct clk_gate *gate = container_of(hw, struct clk_gate, hw);
+       struct clk_gate_exclusive *exgate = container_of(gate,
+                                       struct clk_gate_exclusive, gate);
+       u32 val = readl(gate->reg);
+
+       if (val & exgate->exclusive_mask)
+               return -EBUSY;
+
+       return clk_gate_ops.enable(hw);
+}
+
+static void clk_gate_exclusive_disable(struct clk_hw *hw)
+{
+       clk_gate_ops.disable(hw);
+}
+
+static int clk_gate_exclusive_is_enabled(struct clk_hw *hw)
+{
+       return clk_gate_ops.is_enabled(hw);
+}
+
+static const struct clk_ops clk_gate_exclusive_ops = {
+       .enable = clk_gate_exclusive_enable,
+       .disable = clk_gate_exclusive_disable,
+       .is_enabled = clk_gate_exclusive_is_enabled,
+};
+
+struct clk *imx_clk_gate_exclusive(const char *name, const char *parent,
+        void __iomem *reg, u8 shift, u32 exclusive_mask)
+{
+       struct clk_gate_exclusive *exgate;
+       struct clk_gate *gate;
+       struct clk *clk;
+       struct clk_init_data init;
+
+       if (exclusive_mask == 0)
+               return ERR_PTR(-EINVAL);
+
+       exgate = kzalloc(sizeof(*exgate), GFP_KERNEL);
+       if (!exgate)
+               return ERR_PTR(-ENOMEM);
+       gate = &exgate->gate;
+
+       init.name = name;
+       init.ops = &clk_gate_exclusive_ops;
+       init.flags = CLK_SET_RATE_PARENT;
+       init.parent_names = parent ? &parent : NULL;
+       init.num_parents = parent ? 1 : 0;
+
+       gate->reg = reg;
+       gate->bit_idx = shift;
+       gate->lock = &imx_ccm_lock;
+       gate->hw.init = &init;
+       exgate->exclusive_mask = exclusive_mask;
+
+       clk = clk_register(NULL, &gate->hw);
+       if (IS_ERR(clk))
+               kfree(exgate);
+
+       return clk;
+}
index 29d412975affce9b4141fb7b3e99716b6b49b2f0..1412daf4a7145c2464420faabad509a1d11dc4ae 100644 (file)
@@ -64,7 +64,7 @@ static const char *cko2_sels[] = {
        "ipu2", "vdo_axi", "osc", "gpu2d_core",
        "gpu3d_core", "usdhc2", "ssi1", "ssi2",
        "ssi3", "gpu3d_shader", "vpu_axi", "can_root",
-       "ldb_di0", "ldb_di1", "esai", "eim_slow",
+       "ldb_di0", "ldb_di1", "esai_extal", "eim_slow",
        "uart_serial", "spdif", "asrc", "hsi_tx",
 };
 static const char *cko_sels[] = { "cko1", "cko2", };
@@ -73,6 +73,14 @@ static const char *lvds_sels[] = {
        "pll4_audio", "pll5_video", "pll8_mlb", "enet_ref",
        "pcie_ref_125m", "sata_ref_100m",
 };
+static const char *pll_bypass_src_sels[] = { "osc", "lvds1_in", "lvds2_in", "dummy", };
+static const char *pll1_bypass_sels[] = { "pll1", "pll1_bypass_src", };
+static const char *pll2_bypass_sels[] = { "pll2", "pll2_bypass_src", };
+static const char *pll3_bypass_sels[] = { "pll3", "pll3_bypass_src", };
+static const char *pll4_bypass_sels[] = { "pll4", "pll4_bypass_src", };
+static const char *pll5_bypass_sels[] = { "pll5", "pll5_bypass_src", };
+static const char *pll6_bypass_sels[] = { "pll6", "pll6_bypass_src", };
+static const char *pll7_bypass_sels[] = { "pll7", "pll7_bypass_src", };
 
 static struct clk *clk[IMX6QDL_CLK_END];
 static struct clk_onecell_data clk_data;
@@ -107,6 +115,10 @@ static struct clk_div_table video_div_table[] = {
 };
 
 static unsigned int share_count_esai;
+static unsigned int share_count_asrc;
+static unsigned int share_count_ssi1;
+static unsigned int share_count_ssi2;
+static unsigned int share_count_ssi3;
 
 static void __init imx6q_clocks_init(struct device_node *ccm_node)
 {
@@ -119,6 +131,9 @@ static void __init imx6q_clocks_init(struct device_node *ccm_node)
        clk[IMX6QDL_CLK_CKIL] = imx_obtain_fixed_clock("ckil", 0);
        clk[IMX6QDL_CLK_CKIH] = imx_obtain_fixed_clock("ckih1", 0);
        clk[IMX6QDL_CLK_OSC] = imx_obtain_fixed_clock("osc", 0);
+       /* Clock source from external clock via CLK1/2 PADs */
+       clk[IMX6QDL_CLK_ANACLK1] = imx_obtain_fixed_clock("anaclk1", 0);
+       clk[IMX6QDL_CLK_ANACLK2] = imx_obtain_fixed_clock("anaclk2", 0);
 
        np = of_find_compatible_node(NULL, NULL, "fsl,imx6q-anatop");
        base = of_iomap(np, 0);
@@ -132,14 +147,47 @@ static void __init imx6q_clocks_init(struct device_node *ccm_node)
                video_div_table[2].div = 1;
        };
 
-       /*                                             type             name         parent_name  base     div_mask */
-       clk[IMX6QDL_CLK_PLL1_SYS]      = imx_clk_pllv3(IMX_PLLV3_SYS,   "pll1_sys",     "osc", base,        0x7f);
-       clk[IMX6QDL_CLK_PLL2_BUS]      = imx_clk_pllv3(IMX_PLLV3_GENERIC,       "pll2_bus",     "osc", base + 0x30, 0x1);
-       clk[IMX6QDL_CLK_PLL3_USB_OTG]  = imx_clk_pllv3(IMX_PLLV3_USB,   "pll3_usb_otg", "osc", base + 0x10, 0x3);
-       clk[IMX6QDL_CLK_PLL4_AUDIO]    = imx_clk_pllv3(IMX_PLLV3_AV,    "pll4_audio",   "osc", base + 0x70, 0x7f);
-       clk[IMX6QDL_CLK_PLL5_VIDEO]    = imx_clk_pllv3(IMX_PLLV3_AV,    "pll5_video",   "osc", base + 0xa0, 0x7f);
-       clk[IMX6QDL_CLK_PLL6_ENET]     = imx_clk_pllv3(IMX_PLLV3_ENET,  "pll6_enet",    "osc", base + 0xe0, 0x3);
-       clk[IMX6QDL_CLK_PLL7_USB_HOST] = imx_clk_pllv3(IMX_PLLV3_USB,   "pll7_usb_host","osc", base + 0x20, 0x3);
+       clk[IMX6QDL_PLL1_BYPASS_SRC] = imx_clk_mux("pll1_bypass_src", base + 0x00, 14, 2, pll_bypass_src_sels, ARRAY_SIZE(pll_bypass_src_sels));
+       clk[IMX6QDL_PLL2_BYPASS_SRC] = imx_clk_mux("pll2_bypass_src", base + 0x30, 14, 2, pll_bypass_src_sels, ARRAY_SIZE(pll_bypass_src_sels));
+       clk[IMX6QDL_PLL3_BYPASS_SRC] = imx_clk_mux("pll3_bypass_src", base + 0x10, 14, 2, pll_bypass_src_sels, ARRAY_SIZE(pll_bypass_src_sels));
+       clk[IMX6QDL_PLL4_BYPASS_SRC] = imx_clk_mux("pll4_bypass_src", base + 0x70, 14, 2, pll_bypass_src_sels, ARRAY_SIZE(pll_bypass_src_sels));
+       clk[IMX6QDL_PLL5_BYPASS_SRC] = imx_clk_mux("pll5_bypass_src", base + 0xa0, 14, 2, pll_bypass_src_sels, ARRAY_SIZE(pll_bypass_src_sels));
+       clk[IMX6QDL_PLL6_BYPASS_SRC] = imx_clk_mux("pll6_bypass_src", base + 0xe0, 14, 2, pll_bypass_src_sels, ARRAY_SIZE(pll_bypass_src_sels));
+       clk[IMX6QDL_PLL7_BYPASS_SRC] = imx_clk_mux("pll7_bypass_src", base + 0x20, 14, 2, pll_bypass_src_sels, ARRAY_SIZE(pll_bypass_src_sels));
+
+       /*                                    type               name    parent_name        base         div_mask */
+       clk[IMX6QDL_CLK_PLL1] = imx_clk_pllv3(IMX_PLLV3_SYS,     "pll1", "pll1_bypass_src", base + 0x00, 0x7f);
+       clk[IMX6QDL_CLK_PLL2] = imx_clk_pllv3(IMX_PLLV3_GENERIC, "pll2", "pll2_bypass_src", base + 0x30, 0x1);
+       clk[IMX6QDL_CLK_PLL3] = imx_clk_pllv3(IMX_PLLV3_USB,     "pll3", "pll3_bypass_src", base + 0x10, 0x3);
+       clk[IMX6QDL_CLK_PLL4] = imx_clk_pllv3(IMX_PLLV3_AV,      "pll4", "pll4_bypass_src", base + 0x70, 0x7f);
+       clk[IMX6QDL_CLK_PLL5] = imx_clk_pllv3(IMX_PLLV3_AV,      "pll5", "pll5_bypass_src", base + 0xa0, 0x7f);
+       clk[IMX6QDL_CLK_PLL6] = imx_clk_pllv3(IMX_PLLV3_ENET,    "pll6", "pll6_bypass_src", base + 0xe0, 0x3);
+       clk[IMX6QDL_CLK_PLL7] = imx_clk_pllv3(IMX_PLLV3_USB,     "pll7", "pll7_bypass_src", base + 0x20, 0x3);
+
+       clk[IMX6QDL_PLL1_BYPASS] = imx_clk_mux_flags("pll1_bypass", base + 0x00, 16, 1, pll1_bypass_sels, ARRAY_SIZE(pll1_bypass_sels), CLK_SET_RATE_PARENT);
+       clk[IMX6QDL_PLL2_BYPASS] = imx_clk_mux_flags("pll2_bypass", base + 0x30, 16, 1, pll2_bypass_sels, ARRAY_SIZE(pll2_bypass_sels), CLK_SET_RATE_PARENT);
+       clk[IMX6QDL_PLL3_BYPASS] = imx_clk_mux_flags("pll3_bypass", base + 0x10, 16, 1, pll3_bypass_sels, ARRAY_SIZE(pll3_bypass_sels), CLK_SET_RATE_PARENT);
+       clk[IMX6QDL_PLL4_BYPASS] = imx_clk_mux_flags("pll4_bypass", base + 0x70, 16, 1, pll4_bypass_sels, ARRAY_SIZE(pll4_bypass_sels), CLK_SET_RATE_PARENT);
+       clk[IMX6QDL_PLL5_BYPASS] = imx_clk_mux_flags("pll5_bypass", base + 0xa0, 16, 1, pll5_bypass_sels, ARRAY_SIZE(pll5_bypass_sels), CLK_SET_RATE_PARENT);
+       clk[IMX6QDL_PLL6_BYPASS] = imx_clk_mux_flags("pll6_bypass", base + 0xe0, 16, 1, pll6_bypass_sels, ARRAY_SIZE(pll6_bypass_sels), CLK_SET_RATE_PARENT);
+       clk[IMX6QDL_PLL7_BYPASS] = imx_clk_mux_flags("pll7_bypass", base + 0x20, 16, 1, pll7_bypass_sels, ARRAY_SIZE(pll7_bypass_sels), CLK_SET_RATE_PARENT);
+
+       /* Do not bypass PLLs initially */
+       clk_set_parent(clk[IMX6QDL_PLL1_BYPASS], clk[IMX6QDL_CLK_PLL1]);
+       clk_set_parent(clk[IMX6QDL_PLL2_BYPASS], clk[IMX6QDL_CLK_PLL2]);
+       clk_set_parent(clk[IMX6QDL_PLL3_BYPASS], clk[IMX6QDL_CLK_PLL3]);
+       clk_set_parent(clk[IMX6QDL_PLL4_BYPASS], clk[IMX6QDL_CLK_PLL4]);
+       clk_set_parent(clk[IMX6QDL_PLL5_BYPASS], clk[IMX6QDL_CLK_PLL5]);
+       clk_set_parent(clk[IMX6QDL_PLL6_BYPASS], clk[IMX6QDL_CLK_PLL6]);
+       clk_set_parent(clk[IMX6QDL_PLL7_BYPASS], clk[IMX6QDL_CLK_PLL7]);
+
+       clk[IMX6QDL_CLK_PLL1_SYS]      = imx_clk_gate("pll1_sys",      "pll1_bypass", base + 0x00, 13);
+       clk[IMX6QDL_CLK_PLL2_BUS]      = imx_clk_gate("pll2_bus",      "pll2_bypass", base + 0x30, 13);
+       clk[IMX6QDL_CLK_PLL3_USB_OTG]  = imx_clk_gate("pll3_usb_otg",  "pll3_bypass", base + 0x10, 13);
+       clk[IMX6QDL_CLK_PLL4_AUDIO]    = imx_clk_gate("pll4_audio",    "pll4_bypass", base + 0x70, 13);
+       clk[IMX6QDL_CLK_PLL5_VIDEO]    = imx_clk_gate("pll5_video",    "pll5_bypass", base + 0xa0, 13);
+       clk[IMX6QDL_CLK_PLL6_ENET]     = imx_clk_gate("pll6_enet",     "pll6_bypass", base + 0xe0, 13);
+       clk[IMX6QDL_CLK_PLL7_USB_HOST] = imx_clk_gate("pll7_usb_host", "pll7_bypass", base + 0x20, 13);
 
        /*
         * Bit 20 is the reserved and read-only bit, we do this only for:
@@ -176,8 +224,11 @@ static void __init imx6q_clocks_init(struct device_node *ccm_node)
         * the "output_enable" bit as a gate, even though it's really just
         * enabling clock output.
         */
-       clk[IMX6QDL_CLK_LVDS1_GATE] = imx_clk_gate("lvds1_gate", "lvds1_sel", base + 0x160, 10);
-       clk[IMX6QDL_CLK_LVDS2_GATE] = imx_clk_gate("lvds2_gate", "lvds2_sel", base + 0x160, 11);
+       clk[IMX6QDL_CLK_LVDS1_GATE] = imx_clk_gate_exclusive("lvds1_gate", "lvds1_sel", base + 0x160, 10, BIT(12));
+       clk[IMX6QDL_CLK_LVDS2_GATE] = imx_clk_gate_exclusive("lvds2_gate", "lvds2_sel", base + 0x160, 11, BIT(13));
+
+       clk[IMX6QDL_CLK_LVDS1_IN] = imx_clk_gate_exclusive("lvds1_in", "anaclk1", base + 0x160, 12, BIT(10));
+       clk[IMX6QDL_CLK_LVDS2_IN] = imx_clk_gate_exclusive("lvds2_in", "anaclk2", base + 0x160, 13, BIT(11));
 
        /*                                            name              parent_name        reg       idx */
        clk[IMX6QDL_CLK_PLL2_PFD0_352M] = imx_clk_pfd("pll2_pfd0_352m", "pll2_bus",     base + 0x100, 0);
@@ -194,6 +245,7 @@ static void __init imx6q_clocks_init(struct device_node *ccm_node)
        clk[IMX6QDL_CLK_PLL3_80M]  = imx_clk_fixed_factor("pll3_80m",  "pll3_usb_otg",   1, 6);
        clk[IMX6QDL_CLK_PLL3_60M]  = imx_clk_fixed_factor("pll3_60m",  "pll3_usb_otg",   1, 8);
        clk[IMX6QDL_CLK_TWD]       = imx_clk_fixed_factor("twd",       "arm",            1, 2);
+       clk[IMX6QDL_CLK_GPT_3M]    = imx_clk_fixed_factor("gpt_3m",    "osc",            1, 8);
        if (cpu_is_imx6dl()) {
                clk[IMX6QDL_CLK_GPU2D_AXI] = imx_clk_fixed_factor("gpu2d_axi", "mmdc_ch0_axi_podf", 1, 1);
                clk[IMX6QDL_CLK_GPU3D_AXI] = imx_clk_fixed_factor("gpu3d_axi", "mmdc_ch0_axi_podf", 1, 1);
@@ -317,7 +369,9 @@ static void __init imx6q_clocks_init(struct device_node *ccm_node)
 
        /*                                            name             parent_name          reg         shift */
        clk[IMX6QDL_CLK_APBH_DMA]     = imx_clk_gate2("apbh_dma",      "usdhc3",            base + 0x68, 4);
-       clk[IMX6QDL_CLK_ASRC]         = imx_clk_gate2("asrc",          "asrc_podf",         base + 0x68, 6);
+       clk[IMX6QDL_CLK_ASRC]         = imx_clk_gate2_shared("asrc",         "asrc_podf",   base + 0x68, 6, &share_count_asrc);
+       clk[IMX6QDL_CLK_ASRC_IPG]     = imx_clk_gate2_shared("asrc_ipg",     "ahb",         base + 0x68, 6, &share_count_asrc);
+       clk[IMX6QDL_CLK_ASRC_MEM]     = imx_clk_gate2_shared("asrc_mem",     "ahb",         base + 0x68, 6, &share_count_asrc);
        clk[IMX6QDL_CLK_CAN1_IPG]     = imx_clk_gate2("can1_ipg",      "ipg",               base + 0x68, 14);
        clk[IMX6QDL_CLK_CAN1_SERIAL]  = imx_clk_gate2("can1_serial",   "can_root",          base + 0x68, 16);
        clk[IMX6QDL_CLK_CAN2_IPG]     = imx_clk_gate2("can2_ipg",      "ipg",               base + 0x68, 18);
@@ -331,8 +385,9 @@ static void __init imx6q_clocks_init(struct device_node *ccm_node)
        else
                clk[IMX6Q_CLK_ECSPI5] = imx_clk_gate2("ecspi5",        "ecspi_root",        base + 0x6c, 8);
        clk[IMX6QDL_CLK_ENET]         = imx_clk_gate2("enet",          "ipg",               base + 0x6c, 10);
-       clk[IMX6QDL_CLK_ESAI]         = imx_clk_gate2_shared("esai",   "esai_podf",         base + 0x6c, 16, &share_count_esai);
-       clk[IMX6QDL_CLK_ESAI_AHB]     = imx_clk_gate2_shared("esai_ahb", "ahb",             base + 0x6c, 16, &share_count_esai);
+       clk[IMX6QDL_CLK_ESAI_EXTAL]   = imx_clk_gate2_shared("esai_extal",   "esai_podf",   base + 0x6c, 16, &share_count_esai);
+       clk[IMX6QDL_CLK_ESAI_IPG]     = imx_clk_gate2_shared("esai_ipg",   "ipg",           base + 0x6c, 16, &share_count_esai);
+       clk[IMX6QDL_CLK_ESAI_MEM]     = imx_clk_gate2_shared("esai_mem", "ahb",             base + 0x6c, 16, &share_count_esai);
        clk[IMX6QDL_CLK_GPT_IPG]      = imx_clk_gate2("gpt_ipg",       "ipg",               base + 0x6c, 20);
        clk[IMX6QDL_CLK_GPT_IPG_PER]  = imx_clk_gate2("gpt_ipg_per",   "ipg_per",           base + 0x6c, 22);
        if (cpu_is_imx6dl())
@@ -388,9 +443,12 @@ static void __init imx6q_clocks_init(struct device_node *ccm_node)
        clk[IMX6QDL_CLK_SDMA]         = imx_clk_gate2("sdma",          "ahb",               base + 0x7c, 6);
        clk[IMX6QDL_CLK_SPBA]         = imx_clk_gate2("spba",          "ipg",               base + 0x7c, 12);
        clk[IMX6QDL_CLK_SPDIF]        = imx_clk_gate2("spdif",         "spdif_podf",        base + 0x7c, 14);
-       clk[IMX6QDL_CLK_SSI1_IPG]     = imx_clk_gate2("ssi1_ipg",      "ipg",               base + 0x7c, 18);
-       clk[IMX6QDL_CLK_SSI2_IPG]     = imx_clk_gate2("ssi2_ipg",      "ipg",               base + 0x7c, 20);
-       clk[IMX6QDL_CLK_SSI3_IPG]     = imx_clk_gate2("ssi3_ipg",      "ipg",               base + 0x7c, 22);
+       clk[IMX6QDL_CLK_SSI1_IPG]     = imx_clk_gate2_shared("ssi1_ipg",      "ipg",        base + 0x7c, 18, &share_count_ssi1);
+       clk[IMX6QDL_CLK_SSI2_IPG]     = imx_clk_gate2_shared("ssi2_ipg",      "ipg",        base + 0x7c, 20, &share_count_ssi2);
+       clk[IMX6QDL_CLK_SSI3_IPG]     = imx_clk_gate2_shared("ssi3_ipg",      "ipg",        base + 0x7c, 22, &share_count_ssi3);
+       clk[IMX6QDL_CLK_SSI1]         = imx_clk_gate2_shared("ssi1",          "ssi1_podf",  base + 0x7c, 18, &share_count_ssi1);
+       clk[IMX6QDL_CLK_SSI2]         = imx_clk_gate2_shared("ssi2",          "ssi2_podf",  base + 0x7c, 20, &share_count_ssi2);
+       clk[IMX6QDL_CLK_SSI3]         = imx_clk_gate2_shared("ssi3",          "ssi3_podf",  base + 0x7c, 22, &share_count_ssi3);
        clk[IMX6QDL_CLK_UART_IPG]     = imx_clk_gate2("uart_ipg",      "ipg",               base + 0x7c, 24);
        clk[IMX6QDL_CLK_UART_SERIAL]  = imx_clk_gate2("uart_serial",   "uart_serial_podf",  base + 0x7c, 26);
        clk[IMX6QDL_CLK_USBOH3]       = imx_clk_gate2("usboh3",        "ipg",               base + 0x80, 0);
@@ -404,6 +462,13 @@ static void __init imx6q_clocks_init(struct device_node *ccm_node)
        clk[IMX6QDL_CLK_CKO1]         = imx_clk_gate("cko1",           "cko1_podf",         base + 0x60, 7);
        clk[IMX6QDL_CLK_CKO2]         = imx_clk_gate("cko2",           "cko2_podf",         base + 0x60, 24);
 
+       /*
+        * The gpt_3m clock is not available on i.MX6Q TO1.0.  Let's point it
+        * to clock gpt_ipg_per to ease the gpt driver code.
+        */
+       if (cpu_is_imx6q() && imx_get_soc_revision() == IMX_CHIP_REVISION_1_0)
+               clk[IMX6QDL_CLK_GPT_3M] = clk[IMX6QDL_CLK_GPT_IPG_PER];
+
        imx_check_clocks(clk, ARRAY_SIZE(clk));
 
        clk_data.clks = clk;
index fef46faf692f042eae4f1d45a9ce86534a0e3810..e982ebe1081410037824999565264044bab9e281 100644 (file)
@@ -43,11 +43,13 @@ static const char *periph_clk2_sels[]       = { "pll3_usb_otg", "osc", "osc", "dummy",
 static const char *periph2_clk2_sels[] = { "pll3_usb_otg", "pll2_bus", };
 static const char *periph_sels[]       = { "pre_periph_sel", "periph_clk2_podf", };
 static const char *periph2_sels[]      = { "pre_periph2_sel", "periph2_clk2_podf", };
-static const char *csi_lcdif_sels[]    = { "mmdc", "pll2_pfd2", "pll3_120m", "pll3_pfd1", };
+static const char *csi_sels[]          = { "osc", "pll2_pfd2", "pll3_120m", "pll3_pfd1", };
+static const char *lcdif_axi_sels[]    = { "pll2_bus", "pll2_pfd2", "pll3_usb_otg", "pll3_pfd1", };
 static const char *usdhc_sels[]                = { "pll2_pfd2", "pll2_pfd0", };
 static const char *ssi_sels[]          = { "pll3_pfd2", "pll3_pfd3", "pll4_audio_div", "dummy", };
 static const char *perclk_sels[]       = { "ipg", "osc", };
-static const char *epdc_pxp_sels[]     = { "mmdc", "pll3_usb_otg", "pll5_video_div", "pll2_pfd0", "pll2_pfd2", "pll3_pfd1", };
+static const char *pxp_axi_sels[]      = { "pll2_bus", "pll3_usb_otg", "pll5_video_div", "pll2_pfd0", "pll2_pfd2", "pll3_pfd3", };
+static const char *epdc_axi_sels[]     = { "pll2_bus", "pll3_usb_otg", "pll5_video_div", "pll2_pfd0", "pll2_pfd2", "pll3_pfd2", };
 static const char *gpu2d_ovg_sels[]    = { "pll3_pfd1", "pll3_usb_otg", "pll2_bus", "pll2_pfd2", };
 static const char *gpu2d_sels[]                = { "pll2_pfd2", "pll3_usb_otg", "pll3_pfd1", "pll2_bus", };
 static const char *lcdif_pix_sels[]    = { "pll2_bus", "pll3_usb_otg", "pll5_video_div", "pll2_pfd0", "pll3_pfd0", "pll3_pfd1", };
@@ -55,6 +57,20 @@ static const char *epdc_pix_sels[]   = { "pll2_bus", "pll3_usb_otg", "pll5_video_d
 static const char *audio_sels[]                = { "pll4_audio_div", "pll3_pfd2", "pll3_pfd3", "pll3_usb_otg", };
 static const char *ecspi_sels[]                = { "pll3_60m", "osc", };
 static const char *uart_sels[]         = { "pll3_80m", "osc", };
+static const char *lvds_sels[]         = {
+       "pll1_sys", "pll2_bus", "pll2_pfd0", "pll2_pfd1", "pll2_pfd2", "dummy", "pll4_audio", "pll5_video",
+       "dummy", "enet_ref", "dummy", "dummy", "pll3_usb_otg", "pll7_usb_host", "pll3_pfd0", "pll3_pfd1",
+       "pll3_pfd2", "pll3_pfd3", "osc", "dummy", "dummy", "dummy", "dummy", "dummy",
+        "dummy", "dummy", "dummy", "dummy", "dummy", "dummy", "dummy", "dummy",
+};
+static const char *pll_bypass_src_sels[] = { "osc", "lvds1_in", };
+static const char *pll1_bypass_sels[]  = { "pll1", "pll1_bypass_src", };
+static const char *pll2_bypass_sels[]  = { "pll2", "pll2_bypass_src", };
+static const char *pll3_bypass_sels[]  = { "pll3", "pll3_bypass_src", };
+static const char *pll4_bypass_sels[]  = { "pll4", "pll4_bypass_src", };
+static const char *pll5_bypass_sels[]  = { "pll5", "pll5_bypass_src", };
+static const char *pll6_bypass_sels[]  = { "pll6", "pll6_bypass_src", };
+static const char *pll7_bypass_sels[]  = { "pll7", "pll7_bypass_src", };
 
 static struct clk_div_table clk_enet_ref_table[] = {
        { .val = 0, .div = 20, },
@@ -79,6 +95,10 @@ static struct clk_div_table video_div_table[] = {
        { }
 };
 
+static unsigned int share_count_ssi1;
+static unsigned int share_count_ssi2;
+static unsigned int share_count_ssi3;
+
 static struct clk *clks[IMX6SL_CLK_END];
 static struct clk_onecell_data clk_data;
 static void __iomem *ccm_base;
@@ -175,20 +195,59 @@ static void __init imx6sl_clocks_init(struct device_node *ccm_node)
        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);
+       /* Clock source from external clock via CLK1 PAD */
+       clks[IMX6SL_CLK_ANACLK1] = imx_obtain_fixed_clock("anaclk1", 0);
 
        np = of_find_compatible_node(NULL, NULL, "fsl,imx6sl-anatop");
        base = of_iomap(np, 0);
        WARN_ON(!base);
        anatop_base = 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);
+       clks[IMX6SL_PLL1_BYPASS_SRC] = imx_clk_mux("pll1_bypass_src", base + 0x00, 14, 1, pll_bypass_src_sels, ARRAY_SIZE(pll_bypass_src_sels));
+       clks[IMX6SL_PLL2_BYPASS_SRC] = imx_clk_mux("pll2_bypass_src", base + 0x30, 14, 1, pll_bypass_src_sels, ARRAY_SIZE(pll_bypass_src_sels));
+       clks[IMX6SL_PLL3_BYPASS_SRC] = imx_clk_mux("pll3_bypass_src", base + 0x10, 14, 1, pll_bypass_src_sels, ARRAY_SIZE(pll_bypass_src_sels));
+       clks[IMX6SL_PLL4_BYPASS_SRC] = imx_clk_mux("pll4_bypass_src", base + 0x70, 14, 1, pll_bypass_src_sels, ARRAY_SIZE(pll_bypass_src_sels));
+       clks[IMX6SL_PLL5_BYPASS_SRC] = imx_clk_mux("pll5_bypass_src", base + 0xa0, 14, 1, pll_bypass_src_sels, ARRAY_SIZE(pll_bypass_src_sels));
+       clks[IMX6SL_PLL6_BYPASS_SRC] = imx_clk_mux("pll6_bypass_src", base + 0xe0, 14, 1, pll_bypass_src_sels, ARRAY_SIZE(pll_bypass_src_sels));
+       clks[IMX6SL_PLL7_BYPASS_SRC] = imx_clk_mux("pll7_bypass_src", base + 0x20, 14, 1, pll_bypass_src_sels, ARRAY_SIZE(pll_bypass_src_sels));
+
+       /*                                    type               name    parent_name        base         div_mask */
+       clks[IMX6SL_CLK_PLL1] = imx_clk_pllv3(IMX_PLLV3_SYS,     "pll1", "pll1_bypass_src", base + 0x00, 0x7f);
+       clks[IMX6SL_CLK_PLL2] = imx_clk_pllv3(IMX_PLLV3_GENERIC, "pll2", "pll2_bypass_src", base + 0x30, 0x1);
+       clks[IMX6SL_CLK_PLL3] = imx_clk_pllv3(IMX_PLLV3_USB,     "pll3", "pll3_bypass_src", base + 0x10, 0x3);
+       clks[IMX6SL_CLK_PLL4] = imx_clk_pllv3(IMX_PLLV3_AV,      "pll4", "pll4_bypass_src", base + 0x70, 0x7f);
+       clks[IMX6SL_CLK_PLL5] = imx_clk_pllv3(IMX_PLLV3_AV,      "pll5", "pll5_bypass_src", base + 0xa0, 0x7f);
+       clks[IMX6SL_CLK_PLL6] = imx_clk_pllv3(IMX_PLLV3_ENET,    "pll6", "pll6_bypass_src", base + 0xe0, 0x3);
+       clks[IMX6SL_CLK_PLL7] = imx_clk_pllv3(IMX_PLLV3_USB,     "pll7", "pll7_bypass_src", base + 0x20, 0x3);
+
+       clks[IMX6SL_PLL1_BYPASS] = imx_clk_mux_flags("pll1_bypass", base + 0x00, 16, 1, pll1_bypass_sels, ARRAY_SIZE(pll1_bypass_sels), CLK_SET_RATE_PARENT);
+       clks[IMX6SL_PLL2_BYPASS] = imx_clk_mux_flags("pll2_bypass", base + 0x30, 16, 1, pll2_bypass_sels, ARRAY_SIZE(pll2_bypass_sels), CLK_SET_RATE_PARENT);
+       clks[IMX6SL_PLL3_BYPASS] = imx_clk_mux_flags("pll3_bypass", base + 0x10, 16, 1, pll3_bypass_sels, ARRAY_SIZE(pll3_bypass_sels), CLK_SET_RATE_PARENT);
+       clks[IMX6SL_PLL4_BYPASS] = imx_clk_mux_flags("pll4_bypass", base + 0x70, 16, 1, pll4_bypass_sels, ARRAY_SIZE(pll4_bypass_sels), CLK_SET_RATE_PARENT);
+       clks[IMX6SL_PLL5_BYPASS] = imx_clk_mux_flags("pll5_bypass", base + 0xa0, 16, 1, pll5_bypass_sels, ARRAY_SIZE(pll5_bypass_sels), CLK_SET_RATE_PARENT);
+       clks[IMX6SL_PLL6_BYPASS] = imx_clk_mux_flags("pll6_bypass", base + 0xe0, 16, 1, pll6_bypass_sels, ARRAY_SIZE(pll6_bypass_sels), CLK_SET_RATE_PARENT);
+       clks[IMX6SL_PLL7_BYPASS] = imx_clk_mux_flags("pll7_bypass", base + 0x20, 16, 1, pll7_bypass_sels, ARRAY_SIZE(pll7_bypass_sels), CLK_SET_RATE_PARENT);
+
+       /* Do not bypass PLLs initially */
+       clk_set_parent(clks[IMX6SL_PLL1_BYPASS], clks[IMX6SL_CLK_PLL1]);
+       clk_set_parent(clks[IMX6SL_PLL2_BYPASS], clks[IMX6SL_CLK_PLL2]);
+       clk_set_parent(clks[IMX6SL_PLL3_BYPASS], clks[IMX6SL_CLK_PLL3]);
+       clk_set_parent(clks[IMX6SL_PLL4_BYPASS], clks[IMX6SL_CLK_PLL4]);
+       clk_set_parent(clks[IMX6SL_PLL5_BYPASS], clks[IMX6SL_CLK_PLL5]);
+       clk_set_parent(clks[IMX6SL_PLL6_BYPASS], clks[IMX6SL_CLK_PLL6]);
+       clk_set_parent(clks[IMX6SL_PLL7_BYPASS], clks[IMX6SL_CLK_PLL7]);
+
+       clks[IMX6SL_CLK_PLL1_SYS]      = imx_clk_gate("pll1_sys",      "pll1_bypass", base + 0x00, 13);
+       clks[IMX6SL_CLK_PLL2_BUS]      = imx_clk_gate("pll2_bus",      "pll2_bypass", base + 0x30, 13);
+       clks[IMX6SL_CLK_PLL3_USB_OTG]  = imx_clk_gate("pll3_usb_otg",  "pll3_bypass", base + 0x10, 13);
+       clks[IMX6SL_CLK_PLL4_AUDIO]    = imx_clk_gate("pll4_audio",    "pll4_bypass", base + 0x70, 13);
+       clks[IMX6SL_CLK_PLL5_VIDEO]    = imx_clk_gate("pll5_video",    "pll5_bypass", base + 0xa0, 13);
+       clks[IMX6SL_CLK_PLL6_ENET]     = imx_clk_gate("pll6_enet",     "pll6_bypass", base + 0xe0, 13);
+       clks[IMX6SL_CLK_PLL7_USB_HOST] = imx_clk_gate("pll7_usb_host", "pll7_bypass", base + 0x20, 13);
+
+       clks[IMX6SL_CLK_LVDS1_SEL] = imx_clk_mux("lvds1_sel", base + 0x160, 0, 5, lvds_sels, ARRAY_SIZE(lvds_sels));
+       clks[IMX6SL_CLK_LVDS1_OUT] = imx_clk_gate_exclusive("lvds1_out", "lvds1_sel", base + 0x160, 10, BIT(12));
+       clks[IMX6SL_CLK_LVDS1_IN] = imx_clk_gate_exclusive("lvds1_in", "anaclk1", base + 0x160, 12, BIT(10));
 
        /*
         * usbphy1 and usbphy2 are implemented as dummy gates using reserve
@@ -241,8 +300,8 @@ static void __init imx6sl_clocks_init(struct device_node *ccm_node)
        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_CSI_SEL]          = imx_clk_mux("csi_sel",          base + 0x3c, 9,  2, csi_sels,          ARRAY_SIZE(csi_sels));
+       clks[IMX6SL_CLK_LCDIF_AXI_SEL]    = imx_clk_mux("lcdif_axi_sel",    base + 0x3c, 14, 2, lcdif_axi_sels,    ARRAY_SIZE(lcdif_axi_sels));
        clks[IMX6SL_CLK_USDHC1_SEL]       = imx_clk_fixup_mux("usdhc1_sel", base + 0x1c, 16, 1, usdhc_sels,        ARRAY_SIZE(usdhc_sels),  imx_cscmr1_fixup);
        clks[IMX6SL_CLK_USDHC2_SEL]       = imx_clk_fixup_mux("usdhc2_sel", base + 0x1c, 17, 1, usdhc_sels,        ARRAY_SIZE(usdhc_sels),  imx_cscmr1_fixup);
        clks[IMX6SL_CLK_USDHC3_SEL]       = imx_clk_fixup_mux("usdhc3_sel", base + 0x1c, 18, 1, usdhc_sels,        ARRAY_SIZE(usdhc_sels),  imx_cscmr1_fixup);
@@ -251,8 +310,8 @@ static void __init imx6sl_clocks_init(struct device_node *ccm_node)
        clks[IMX6SL_CLK_SSI2_SEL]         = imx_clk_fixup_mux("ssi2_sel",   base + 0x1c, 12, 2, ssi_sels,          ARRAY_SIZE(ssi_sels),    imx_cscmr1_fixup);
        clks[IMX6SL_CLK_SSI3_SEL]         = imx_clk_fixup_mux("ssi3_sel",   base + 0x1c, 14, 2, ssi_sels,          ARRAY_SIZE(ssi_sels),    imx_cscmr1_fixup);
        clks[IMX6SL_CLK_PERCLK_SEL]       = imx_clk_fixup_mux("perclk_sel", base + 0x1c, 6,  1, perclk_sels,       ARRAY_SIZE(perclk_sels), imx_cscmr1_fixup);
-       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_PXP_AXI_SEL]      = imx_clk_mux("pxp_axi_sel",      base + 0x34, 6,  3, pxp_axi_sels,      ARRAY_SIZE(pxp_axi_sels));
+       clks[IMX6SL_CLK_EPDC_AXI_SEL]     = imx_clk_mux("epdc_axi_sel",     base + 0x34, 15, 3, epdc_axi_sels,     ARRAY_SIZE(epdc_axi_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));
@@ -337,9 +396,12 @@ static void __init imx6sl_clocks_init(struct device_node *ccm_node)
        clks[IMX6SL_CLK_SDMA]         = imx_clk_gate2("sdma",         "ipg",               base + 0x7c, 6);
        clks[IMX6SL_CLK_SPBA]         = imx_clk_gate2("spba",         "ipg",               base + 0x7c, 12);
        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_SSI1_IPG]     = imx_clk_gate2_shared("ssi1_ipg",     "ipg",        base + 0x7c, 18, &share_count_ssi1);
+       clks[IMX6SL_CLK_SSI2_IPG]     = imx_clk_gate2_shared("ssi2_ipg",     "ipg",        base + 0x7c, 20, &share_count_ssi2);
+       clks[IMX6SL_CLK_SSI3_IPG]     = imx_clk_gate2_shared("ssi3_ipg",     "ipg",        base + 0x7c, 22, &share_count_ssi3);
+       clks[IMX6SL_CLK_SSI1]         = imx_clk_gate2_shared("ssi1",         "ssi1_podf",  base + 0x7c, 18, &share_count_ssi1);
+       clks[IMX6SL_CLK_SSI2]         = imx_clk_gate2_shared("ssi2",         "ssi2_podf",  base + 0x7c, 20, &share_count_ssi2);
+       clks[IMX6SL_CLK_SSI3]         = imx_clk_gate2_shared("ssi3",         "ssi3_podf",  base + 0x7c, 22, &share_count_ssi3);
        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);
@@ -375,6 +437,13 @@ static void __init imx6sl_clocks_init(struct device_node *ccm_node)
        /* Audio-related clocks configuration */
        clk_set_parent(clks[IMX6SL_CLK_SPDIF0_SEL], clks[IMX6SL_CLK_PLL3_PFD3]);
 
+       /* set PLL5 video as lcdif pix parent clock */
+       clk_set_parent(clks[IMX6SL_CLK_LCDIF_PIX_SEL],
+                       clks[IMX6SL_CLK_PLL5_VIDEO_DIV]);
+
+       clk_set_parent(clks[IMX6SL_CLK_LCDIF_AXI_SEL],
+                      clks[IMX6SL_CLK_PLL2_PFD2]);
+
        /* Set initial power mode */
        imx6q_set_lpm(WAIT_CLOCKED);
 }
index ecde72bdfe888b72d401147a23f60f71d0d01652..17354a11356fbd0291ca5629db26446370c951d2 100644 (file)
@@ -81,6 +81,14 @@ static const char *lvds_sels[]       = {
        "arm", "pll1_sys", "dummy", "dummy", "dummy", "dummy", "dummy", "pll5_video_div",
        "dummy", "dummy", "pcie_ref_125m", "dummy", "usbphy1", "usbphy2",
 };
+static const char *pll_bypass_src_sels[] = { "osc", "lvds1_in", };
+static const char *pll1_bypass_sels[] = { "pll1", "pll1_bypass_src", };
+static const char *pll2_bypass_sels[] = { "pll2", "pll2_bypass_src", };
+static const char *pll3_bypass_sels[] = { "pll3", "pll3_bypass_src", };
+static const char *pll4_bypass_sels[] = { "pll4", "pll4_bypass_src", };
+static const char *pll5_bypass_sels[] = { "pll5", "pll5_bypass_src", };
+static const char *pll6_bypass_sels[] = { "pll6", "pll6_bypass_src", };
+static const char *pll7_bypass_sels[] = { "pll7", "pll7_bypass_src", };
 
 static struct clk *clks[IMX6SX_CLK_CLK_END];
 static struct clk_onecell_data clk_data;
@@ -143,18 +151,54 @@ static void __init imx6sx_clocks_init(struct device_node *ccm_node)
        clks[IMX6SX_CLK_IPP_DI0] = of_clk_get_by_name(ccm_node, "ipp_di0");
        clks[IMX6SX_CLK_IPP_DI1] = of_clk_get_by_name(ccm_node, "ipp_di1");
 
+       /* Clock source from external clock via CLK1 PAD */
+       clks[IMX6SX_CLK_ANACLK1] = imx_obtain_fixed_clock("anaclk1", 0);
+
        np = of_find_compatible_node(NULL, NULL, "fsl,imx6sx-anatop");
        base = of_iomap(np, 0);
        WARN_ON(!base);
 
-       /*                                              type               name             parent_name   base         div_mask */
-       clks[IMX6SX_CLK_PLL1_SYS]       = imx_clk_pllv3(IMX_PLLV3_SYS,     "pll1_sys",      "osc",        base,        0x7f);
-       clks[IMX6SX_CLK_PLL2_BUS]       = imx_clk_pllv3(IMX_PLLV3_GENERIC, "pll2_bus",      "osc",        base + 0x30, 0x1);
-       clks[IMX6SX_CLK_PLL3_USB_OTG]   = imx_clk_pllv3(IMX_PLLV3_USB,     "pll3_usb_otg",  "osc",        base + 0x10, 0x3);
-       clks[IMX6SX_CLK_PLL4_AUDIO]     = imx_clk_pllv3(IMX_PLLV3_AV,      "pll4_audio",    "osc",        base + 0x70, 0x7f);
-       clks[IMX6SX_CLK_PLL5_VIDEO]     = imx_clk_pllv3(IMX_PLLV3_AV,      "pll5_video",    "osc",        base + 0xa0, 0x7f);
-       clks[IMX6SX_CLK_PLL6_ENET]      = imx_clk_pllv3(IMX_PLLV3_ENET,    "pll6_enet",     "osc",        base + 0xe0, 0x3);
-       clks[IMX6SX_CLK_PLL7_USB_HOST]  = imx_clk_pllv3(IMX_PLLV3_USB,     "pll7_usb_host", "osc",        base + 0x20, 0x3);
+       clks[IMX6SX_PLL1_BYPASS_SRC] = imx_clk_mux("pll1_bypass_src", base + 0x00, 14, 1, pll_bypass_src_sels, ARRAY_SIZE(pll_bypass_src_sels));
+       clks[IMX6SX_PLL2_BYPASS_SRC] = imx_clk_mux("pll2_bypass_src", base + 0x30, 14, 1, pll_bypass_src_sels, ARRAY_SIZE(pll_bypass_src_sels));
+       clks[IMX6SX_PLL3_BYPASS_SRC] = imx_clk_mux("pll3_bypass_src", base + 0x10, 14, 1, pll_bypass_src_sels, ARRAY_SIZE(pll_bypass_src_sels));
+       clks[IMX6SX_PLL4_BYPASS_SRC] = imx_clk_mux("pll4_bypass_src", base + 0x70, 14, 1, pll_bypass_src_sels, ARRAY_SIZE(pll_bypass_src_sels));
+       clks[IMX6SX_PLL5_BYPASS_SRC] = imx_clk_mux("pll5_bypass_src", base + 0xa0, 14, 1, pll_bypass_src_sels, ARRAY_SIZE(pll_bypass_src_sels));
+       clks[IMX6SX_PLL6_BYPASS_SRC] = imx_clk_mux("pll6_bypass_src", base + 0xe0, 14, 1, pll_bypass_src_sels, ARRAY_SIZE(pll_bypass_src_sels));
+       clks[IMX6SX_PLL7_BYPASS_SRC] = imx_clk_mux("pll7_bypass_src", base + 0x20, 14, 1, pll_bypass_src_sels, ARRAY_SIZE(pll_bypass_src_sels));
+
+       /*                                    type               name    parent_name        base         div_mask */
+       clks[IMX6SX_CLK_PLL1] = imx_clk_pllv3(IMX_PLLV3_SYS,     "pll1", "pll1_bypass_src", base + 0x00, 0x7f);
+       clks[IMX6SX_CLK_PLL2] = imx_clk_pllv3(IMX_PLLV3_GENERIC, "pll2", "pll2_bypass_src", base + 0x30, 0x1);
+       clks[IMX6SX_CLK_PLL3] = imx_clk_pllv3(IMX_PLLV3_USB,     "pll3", "pll3_bypass_src", base + 0x10, 0x3);
+       clks[IMX6SX_CLK_PLL4] = imx_clk_pllv3(IMX_PLLV3_AV,      "pll4", "pll4_bypass_src", base + 0x70, 0x7f);
+       clks[IMX6SX_CLK_PLL5] = imx_clk_pllv3(IMX_PLLV3_AV,      "pll5", "pll5_bypass_src", base + 0xa0, 0x7f);
+       clks[IMX6SX_CLK_PLL6] = imx_clk_pllv3(IMX_PLLV3_ENET,    "pll6", "pll6_bypass_src", base + 0xe0, 0x3);
+       clks[IMX6SX_CLK_PLL7] = imx_clk_pllv3(IMX_PLLV3_USB,     "pll7", "pll7_bypass_src", base + 0x20, 0x3);
+
+       clks[IMX6SX_PLL1_BYPASS] = imx_clk_mux_flags("pll1_bypass", base + 0x00, 16, 1, pll1_bypass_sels, ARRAY_SIZE(pll1_bypass_sels), CLK_SET_RATE_PARENT);
+       clks[IMX6SX_PLL2_BYPASS] = imx_clk_mux_flags("pll2_bypass", base + 0x30, 16, 1, pll2_bypass_sels, ARRAY_SIZE(pll2_bypass_sels), CLK_SET_RATE_PARENT);
+       clks[IMX6SX_PLL3_BYPASS] = imx_clk_mux_flags("pll3_bypass", base + 0x10, 16, 1, pll3_bypass_sels, ARRAY_SIZE(pll3_bypass_sels), CLK_SET_RATE_PARENT);
+       clks[IMX6SX_PLL4_BYPASS] = imx_clk_mux_flags("pll4_bypass", base + 0x70, 16, 1, pll4_bypass_sels, ARRAY_SIZE(pll4_bypass_sels), CLK_SET_RATE_PARENT);
+       clks[IMX6SX_PLL5_BYPASS] = imx_clk_mux_flags("pll5_bypass", base + 0xa0, 16, 1, pll5_bypass_sels, ARRAY_SIZE(pll5_bypass_sels), CLK_SET_RATE_PARENT);
+       clks[IMX6SX_PLL6_BYPASS] = imx_clk_mux_flags("pll6_bypass", base + 0xe0, 16, 1, pll6_bypass_sels, ARRAY_SIZE(pll6_bypass_sels), CLK_SET_RATE_PARENT);
+       clks[IMX6SX_PLL7_BYPASS] = imx_clk_mux_flags("pll7_bypass", base + 0x20, 16, 1, pll7_bypass_sels, ARRAY_SIZE(pll7_bypass_sels), CLK_SET_RATE_PARENT);
+
+       /* Do not bypass PLLs initially */
+       clk_set_parent(clks[IMX6SX_PLL1_BYPASS], clks[IMX6SX_CLK_PLL1]);
+       clk_set_parent(clks[IMX6SX_PLL2_BYPASS], clks[IMX6SX_CLK_PLL2]);
+       clk_set_parent(clks[IMX6SX_PLL3_BYPASS], clks[IMX6SX_CLK_PLL3]);
+       clk_set_parent(clks[IMX6SX_PLL4_BYPASS], clks[IMX6SX_CLK_PLL4]);
+       clk_set_parent(clks[IMX6SX_PLL5_BYPASS], clks[IMX6SX_CLK_PLL5]);
+       clk_set_parent(clks[IMX6SX_PLL6_BYPASS], clks[IMX6SX_CLK_PLL6]);
+       clk_set_parent(clks[IMX6SX_PLL7_BYPASS], clks[IMX6SX_CLK_PLL7]);
+
+       clks[IMX6SX_CLK_PLL1_SYS]      = imx_clk_gate("pll1_sys",      "pll1_bypass", base + 0x00, 13);
+       clks[IMX6SX_CLK_PLL2_BUS]      = imx_clk_gate("pll2_bus",      "pll2_bypass", base + 0x30, 13);
+       clks[IMX6SX_CLK_PLL3_USB_OTG]  = imx_clk_gate("pll3_usb_otg",  "pll3_bypass", base + 0x10, 13);
+       clks[IMX6SX_CLK_PLL4_AUDIO]    = imx_clk_gate("pll4_audio",    "pll4_bypass", base + 0x70, 13);
+       clks[IMX6SX_CLK_PLL5_VIDEO]    = imx_clk_gate("pll5_video",    "pll5_bypass", base + 0xa0, 13);
+       clks[IMX6SX_CLK_PLL6_ENET]     = imx_clk_gate("pll6_enet",     "pll6_bypass", base + 0xe0, 13);
+       clks[IMX6SX_CLK_PLL7_USB_HOST] = imx_clk_gate("pll7_usb_host", "pll7_bypass", base + 0x20, 13);
 
        /*
         * Bit 20 is the reserved and read-only bit, we do this only for:
@@ -176,7 +220,8 @@ static void __init imx6sx_clocks_init(struct device_node *ccm_node)
        clks[IMX6SX_CLK_PCIE_REF] = imx_clk_fixed_factor("pcie_ref", "pll6_enet", 1, 5);
        clks[IMX6SX_CLK_PCIE_REF_125M] = imx_clk_gate("pcie_ref_125m", "pcie_ref", base + 0xe0, 19);
 
-       clks[IMX6SX_CLK_LVDS1_OUT] = imx_clk_gate("lvds1_out", "lvds1_sel", base + 0x160, 10);
+       clks[IMX6SX_CLK_LVDS1_OUT] = imx_clk_gate_exclusive("lvds1_out", "lvds1_sel", base + 0x160, 10, BIT(12));
+       clks[IMX6SX_CLK_LVDS1_IN]  = imx_clk_gate_exclusive("lvds1_in",  "anaclk1",   base + 0x160, 12, BIT(10));
 
        clks[IMX6SX_CLK_ENET_REF] = clk_register_divider_table(NULL, "enet_ref", "pll6_enet", 0,
                        base + 0xe0, 0, 2, 0, clk_enet_ref_table,
index 61364050fccdce42b477f2a7a4aaafddf136f41a..57de74da0acfe1aac907e1aa1d5424fffd48530d 100644 (file)
@@ -23,8 +23,6 @@
 #define PLL_DENOM_OFFSET       0x20
 
 #define BM_PLL_POWER           (0x1 << 12)
-#define BM_PLL_ENABLE          (0x1 << 13)
-#define BM_PLL_BYPASS          (0x1 << 16)
 #define BM_PLL_LOCK            (0x1 << 31)
 
 /**
@@ -84,10 +82,6 @@ static int clk_pllv3_prepare(struct clk_hw *hw)
        if (ret)
                return ret;
 
-       val = readl_relaxed(pll->base);
-       val &= ~BM_PLL_BYPASS;
-       writel_relaxed(val, pll->base);
-
        return 0;
 }
 
@@ -97,7 +91,6 @@ static void clk_pllv3_unprepare(struct clk_hw *hw)
        u32 val;
 
        val = readl_relaxed(pll->base);
-       val |= BM_PLL_BYPASS;
        if (pll->powerup_set)
                val &= ~BM_PLL_POWER;
        else
@@ -105,28 +98,6 @@ static void clk_pllv3_unprepare(struct clk_hw *hw)
        writel_relaxed(val, pll->base);
 }
 
-static int clk_pllv3_enable(struct clk_hw *hw)
-{
-       struct clk_pllv3 *pll = to_clk_pllv3(hw);
-       u32 val;
-
-       val = readl_relaxed(pll->base);
-       val |= BM_PLL_ENABLE;
-       writel_relaxed(val, pll->base);
-
-       return 0;
-}
-
-static void clk_pllv3_disable(struct clk_hw *hw)
-{
-       struct clk_pllv3 *pll = to_clk_pllv3(hw);
-       u32 val;
-
-       val = readl_relaxed(pll->base);
-       val &= ~BM_PLL_ENABLE;
-       writel_relaxed(val, pll->base);
-}
-
 static unsigned long clk_pllv3_recalc_rate(struct clk_hw *hw,
                                           unsigned long parent_rate)
 {
@@ -169,8 +140,6 @@ static int clk_pllv3_set_rate(struct clk_hw *hw, unsigned long rate,
 static const struct clk_ops clk_pllv3_ops = {
        .prepare        = clk_pllv3_prepare,
        .unprepare      = clk_pllv3_unprepare,
-       .enable         = clk_pllv3_enable,
-       .disable        = clk_pllv3_disable,
        .recalc_rate    = clk_pllv3_recalc_rate,
        .round_rate     = clk_pllv3_round_rate,
        .set_rate       = clk_pllv3_set_rate,
@@ -225,8 +194,6 @@ static int clk_pllv3_sys_set_rate(struct clk_hw *hw, unsigned long rate,
 static const struct clk_ops clk_pllv3_sys_ops = {
        .prepare        = clk_pllv3_prepare,
        .unprepare      = clk_pllv3_unprepare,
-       .enable         = clk_pllv3_enable,
-       .disable        = clk_pllv3_disable,
        .recalc_rate    = clk_pllv3_sys_recalc_rate,
        .round_rate     = clk_pllv3_sys_round_rate,
        .set_rate       = clk_pllv3_sys_set_rate,
@@ -299,8 +266,6 @@ static int clk_pllv3_av_set_rate(struct clk_hw *hw, unsigned long rate,
 static const struct clk_ops clk_pllv3_av_ops = {
        .prepare        = clk_pllv3_prepare,
        .unprepare      = clk_pllv3_unprepare,
-       .enable         = clk_pllv3_enable,
-       .disable        = clk_pllv3_disable,
        .recalc_rate    = clk_pllv3_av_recalc_rate,
        .round_rate     = clk_pllv3_av_round_rate,
        .set_rate       = clk_pllv3_av_set_rate,
@@ -315,8 +280,6 @@ static unsigned long clk_pllv3_enet_recalc_rate(struct clk_hw *hw,
 static const struct clk_ops clk_pllv3_enet_ops = {
        .prepare        = clk_pllv3_prepare,
        .unprepare      = clk_pllv3_unprepare,
-       .enable         = clk_pllv3_enable,
-       .disable        = clk_pllv3_disable,
        .recalc_rate    = clk_pllv3_enet_recalc_rate,
 };
 
index f60d6d569ce3b004e268f7bff29926470a1cd34d..a1781847505075c48b3b91fb206bc74441c88cc6 100644 (file)
@@ -58,6 +58,8 @@
 #define PFD_PLL1_BASE          (anatop_base + 0x2b0)
 #define PFD_PLL2_BASE          (anatop_base + 0x100)
 #define PFD_PLL3_BASE          (anatop_base + 0xf0)
+#define PLL3_CTRL              (anatop_base + 0x10)
+#define PLL7_CTRL              (anatop_base + 0x20)
 
 static void __iomem *anatop_base;
 static void __iomem *ccm_base;
@@ -98,9 +100,15 @@ static struct clk_div_table pll4_main_div_table[] = {
 static struct clk *clk[VF610_CLK_END];
 static struct clk_onecell_data clk_data;
 
+static unsigned int const clks_init_on[] __initconst = {
+       VF610_CLK_SYS_BUS,
+       VF610_CLK_DDR_SEL,
+};
+
 static void __init vf610_clocks_init(struct device_node *ccm_node)
 {
        struct device_node *np;
+       int i;
 
        clk[VF610_CLK_DUMMY] = imx_clk_fixed("dummy", 0);
        clk[VF610_CLK_SIRC_128K] = imx_clk_fixed("sirc_128k", 128000);
@@ -148,6 +156,9 @@ static void __init vf610_clocks_init(struct device_node *ccm_node)
        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);
+       /* pll7: USB1 PLL at 480MHz */
+       clk[VF610_CLK_PLL7_MAIN] = imx_clk_pllv3(IMX_PLLV3_USB, "pll7_main", "fast_clk_sel", PLL7_CTRL, 0x2);
+
        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));
@@ -160,8 +171,11 @@ static void __init vf610_clocks_init(struct device_node *ccm_node)
        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_USBPHY0] = imx_clk_gate("usbphy0", "pll3_main", PLL3_CTRL, 6);
+       clk[VF610_CLK_USBPHY1] = imx_clk_gate("usbphy1", "pll7_main", PLL7_CTRL, 6);
+
+       clk[VF610_CLK_USBC0] = imx_clk_gate2("usbc0", "ipg_bus", CCM_CCGR1, CCM_CCGRx_CGn(4));
+       clk[VF610_CLK_USBC1] = imx_clk_gate2("usbc1", "ipg_bus", 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);
@@ -322,6 +336,9 @@ static void __init vf610_clocks_init(struct device_node *ccm_node)
        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]);
 
+       for (i = 0; i < ARRAY_SIZE(clks_init_on); i++)
+               clk_prepare_enable(clk[clks_init_on[i]]);
+
        /* Add the clocks to provider list */
        clk_data.clks = clk;
        clk_data.clk_num = ARRAY_SIZE(clk);
index d5ba76fee1154ef70e1a47fa304d32db4aa916c0..4cdf8b6a74e8e7d8616400aa2a2c971a5d2d133a 100644 (file)
@@ -36,6 +36,9 @@ struct clk *clk_register_gate2(struct device *dev, const char *name,
 struct clk * imx_obtain_fixed_clock(
                        const char *name, unsigned long rate);
 
+struct clk *imx_clk_gate_exclusive(const char *name, const char *parent,
+        void __iomem *reg, u8 shift, u32 exclusive_mask);
+
 static inline struct clk *imx_clk_gate2(const char *name, const char *parent,
                void __iomem *reg, u8 shift)
 {
diff --git a/arch/arm/mach-imx/imx1-dt.c b/arch/arm/mach-imx/imx1-dt.c
new file mode 100644 (file)
index 0000000..6f915b0
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ *  Copyright (C) 2014 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.
+ */
+
+#include <linux/of_platform.h>
+#include <asm/mach/arch.h>
+
+#include "common.h"
+
+static const char * const imx1_dt_board_compat[] __initconst = {
+       "fsl,imx1",
+       NULL
+};
+
+DT_MACHINE_START(IMX1_DT, "Freescale i.MX1 (Device Tree Support)")
+       .map_io         = mx1_map_io,
+       .init_early     = imx1_init_early,
+       .init_irq       = mx1_init_irq,
+       .dt_compat      = imx1_dt_board_compat,
+       .restart        = mxc_restart,
+MACHINE_END
index a7e9bd26a5521991e324aee0e9571c4c9d82774d..f2060523ba489c3feca3c2083fdd28a7594a4412 100644 (file)
@@ -537,7 +537,7 @@ static void __init armadillo5x0_init(void)
                        gpio_free(ARMADILLO5X0_RTC_GPIO);
        }
        if (armadillo5x0_i2c_rtc.irq == 0)
-               pr_warning("armadillo5x0_init: failed to get RTC IRQ\n");
+               pr_warn("armadillo5x0_init: failed to get RTC IRQ\n");
        i2c_register_board_info(1, &armadillo5x0_i2c_rtc, 1);
 
        /* USB */
index 673a734165bab93699bff75936ab9b1511bb2a31..3de3b7369aef10ca59968ce9d7a9d89b2d47bec3 100644 (file)
@@ -42,6 +42,9 @@ static void __init imx6sx_init_irq(void)
 static void __init imx6sx_init_late(void)
 {
        imx6q_cpuidle_init();
+
+       if (IS_ENABLED(CONFIG_ARM_IMX6Q_CPUFREQ))
+               platform_device_register_simple("imx6q-cpufreq", -1, NULL, 0);
 }
 
 static const char * const imx6sx_dt_compat[] __initconst = {
index 453f41a2c5a97b5ee7e08d566dcd9e71f887c647..65a0dc06a97ccc3a7b613d85fdd738616ea4b97f 100644 (file)
@@ -307,7 +307,7 @@ static int mx31_3ds_sdhc1_init(struct device *dev,
        ret = gpio_request_array(mx31_3ds_sdhc1_gpios,
                                 ARRAY_SIZE(mx31_3ds_sdhc1_gpios));
        if (ret) {
-               pr_warning("Unable to request the SD/MMC GPIOs.\n");
+               pr_warn("Unable to request the SD/MMC GPIOs.\n");
                return ret;
        }
 
@@ -316,7 +316,7 @@ static int mx31_3ds_sdhc1_init(struct device *dev,
                          IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING,
                          "sdhc1-detect", data);
        if (ret) {
-               pr_warning("Unable to request the SD/MMC card-detect IRQ.\n");
+               pr_warn("Unable to request the SD/MMC card-detect IRQ.\n");
                goto gpio_free;
        }
 
index 57eac6f45fab015021830fdd07f7a791b7c90cc2..4822a1738de491e420b1150c6683e7673200610f 100644 (file)
@@ -270,7 +270,7 @@ static void __init mx31lite_init(void)
        /* SMSC9117 IRQ pin */
        ret = gpio_request(IOMUX_TO_GPIO(MX31_PIN_SFS6), "sms9117-irq");
        if (ret)
-               pr_warning("could not get LAN irq gpio\n");
+               pr_warn("could not get LAN irq gpio\n");
        else {
                gpio_direction_input(IOMUX_TO_GPIO(MX31_PIN_SFS6));
                smsc911x_resources[1].start =
index 8eb1570f7851f1452c5d6dee41ae226e1d335c4a..6d879417db4947daa1a77713b4e7c283cf6c6a5f 100644 (file)
@@ -58,7 +58,7 @@ static int __init pcm037_variant_setup(char *str)
        if (!strcmp("eet", str))
                pcm037_instance = PCM037_EET;
        else if (strcmp("pcm970", str))
-               pr_warning("Unknown pcm037 baseboard variant %s\n", str);
+               pr_warn("Unknown pcm037 baseboard variant %s\n", str);
 
        return 1;
 }
@@ -624,7 +624,7 @@ static void __init pcm037_init(void)
        /* LAN9217 IRQ pin */
        ret = gpio_request(IOMUX_TO_GPIO(MX31_PIN_GPIO3_1), "lan9217-irq");
        if (ret)
-               pr_warning("could not get LAN irq gpio\n");
+               pr_warn("could not get LAN irq gpio\n");
        else {
                gpio_direction_input(IOMUX_TO_GPIO(MX31_PIN_GPIO3_1));
                smsc911x_resources[1].start =
index a39b69ef43019ff0460aaa7012c63d466d48f39a..17a41ca65acf89154daecfe55eb0152744110932 100644 (file)
@@ -43,6 +43,8 @@
 #define IMX_CHIP_REVISION_1_1          0x11
 #define IMX_CHIP_REVISION_1_2          0x12
 #define IMX_CHIP_REVISION_1_3          0x13
+#define IMX_CHIP_REVISION_1_4          0x14
+#define IMX_CHIP_REVISION_1_5          0x15
 #define IMX_CHIP_REVISION_2_0          0x20
 #define IMX_CHIP_REVISION_2_1          0x21
 #define IMX_CHIP_REVISION_2_2          0x22
index bf92e5a351c05e384136f206b1651e56b9e6e46f..15d18e198303f16ae6a77bf476c46acd066a6886 100644 (file)
 #define MX2_TSTAT_CAPT         (1 << 1)
 #define MX2_TSTAT_COMP         (1 << 0)
 
-/* MX31, MX35, MX25, MX5 */
+/* MX31, MX35, MX25, MX5, MX6 */
 #define V2_TCTL_WAITEN         (1 << 3) /* Wait enable mode */
 #define V2_TCTL_CLK_IPG                (1 << 6)
 #define V2_TCTL_CLK_PER                (2 << 6)
+#define V2_TCTL_CLK_OSC_DIV8   (5 << 6)
 #define V2_TCTL_FRR            (1 << 9)
+#define V2_TCTL_24MEN          (1 << 10)
+#define V2_TPRER_PRE24M                12
 #define V2_IR                  0x0c
 #define V2_TSTAT               0x08
 #define V2_TSTAT_OF1           (1 << 0)
 #define V2_TCN                 0x24
 #define V2_TCMP                        0x10
 
+#define V2_TIMER_RATE_OSC_DIV8 3000000
+
 #define timer_is_v1()  (cpu_is_mx1() || cpu_is_mx21() || cpu_is_mx27())
 #define timer_is_v2()  (!timer_is_v1())
 
@@ -312,10 +317,22 @@ static void __init _mxc_timer_init(int irq,
        __raw_writel(0, timer_base + MXC_TCTL);
        __raw_writel(0, timer_base + MXC_TPRER); /* see datasheet note */
 
-       if (timer_is_v2())
-               tctl_val = V2_TCTL_CLK_PER | V2_TCTL_FRR | V2_TCTL_WAITEN | MXC_TCTL_TEN;
-       else
+       if (timer_is_v2()) {
+               tctl_val = V2_TCTL_FRR | V2_TCTL_WAITEN | MXC_TCTL_TEN;
+               if (clk_get_rate(clk_per) == V2_TIMER_RATE_OSC_DIV8) {
+                       tctl_val |= V2_TCTL_CLK_OSC_DIV8;
+                       if (cpu_is_imx6dl() || cpu_is_imx6sx()) {
+                               /* 24 / 8 = 3 MHz */
+                               __raw_writel(7 << V2_TPRER_PRE24M,
+                                       timer_base + MXC_TPRER);
+                               tctl_val |= V2_TCTL_24MEN;
+                       }
+               } else {
+                       tctl_val |= V2_TCTL_CLK_PER;
+               }
+       } else {
                tctl_val = MX1_2_TCTL_FRR | MX1_2_TCTL_CLK_PCLK1 | MXC_TCTL_TEN;
+       }
 
        __raw_writel(tctl_val, timer_base + MXC_TCTL);
 
@@ -349,9 +366,13 @@ static void __init mxc_timer_init_dt(struct device_node *np)
        WARN_ON(!timer_base);
        irq = irq_of_parse_and_map(np, 0);
 
-       clk_per = of_clk_get_by_name(np, "per");
        clk_ipg = of_clk_get_by_name(np, "ipg");
 
+       /* Try osc_per first, and fall back to per otherwise */
+       clk_per = of_clk_get_by_name(np, "osc_per");
+       if (IS_ERR(clk_per))
+               clk_per = of_clk_get_by_name(np, "per");
+
        _mxc_timer_init(irq, clk_per, clk_ipg);
 }
 CLOCKSOURCE_OF_DECLARE(mx1_timer, "fsl,imx1-gpt", mxc_timer_init_dt);
index 3ce880729cff838e15ded4a29c88e67abccf79b5..38b0da300dd547744a54eca9fe8a21c04177998b 100644 (file)
 #include <linux/mm.h>
 #include <linux/amba/bus.h>
 #include <linux/amba/clcd.h>
+#include <linux/amba/mmci.h>
+#include <linux/amba/pl061.h>
 #include <linux/io.h>
 #include <linux/platform_data/clk-integrator.h>
 #include <linux/slab.h>
 #include <linux/irqchip/arm-vic.h>
+#include <linux/gpio/machine.h>
 
 #include <asm/sizes.h>
 #include "lm.h"
@@ -51,6 +54,13 @@ void impd1_tweak_control(struct device *dev, u32 mask, u32 val)
 
 EXPORT_SYMBOL(impd1_tweak_control);
 
+/*
+ * MMC support
+ */
+static struct mmci_platform_data mmc_data = {
+       .ocr_mask       = MMC_VDD_32_33|MMC_VDD_33_34,
+};
+
 /*
  * CLCD support
  */
@@ -291,6 +301,7 @@ static struct impd1_device impd1_devs[] = {
                .offset = 0x00700000,
                .irq    = { 7, 8 },
                .id     = 0x00041181,
+               .platform_data = &mmc_data,
        }, {
                .offset = 0x00800000,
                .irq    = { 9 },
@@ -372,6 +383,43 @@ static int __init_refok impd1_probe(struct lm_device *dev)
 
                pc_base = dev->resource.start + idev->offset;
                snprintf(devname, 32, "lm%x:%5.5lx", dev->id, idev->offset >> 12);
+
+               /* Add GPIO descriptor lookup table for the PL061 block */
+               if (idev->offset == 0x00400000) {
+                       struct gpiod_lookup_table *lookup;
+                       char *chipname;
+                       char *mmciname;
+
+                       lookup = devm_kzalloc(&dev->dev,
+                                             sizeof(*lookup) + 3 * sizeof(struct gpiod_lookup),
+                                             GFP_KERNEL);
+                       chipname = devm_kstrdup(&dev->dev, devname, GFP_KERNEL);
+                       mmciname = kasprintf(GFP_KERNEL, "lm%x:00700", dev->id);
+                       lookup->dev_id = mmciname;
+                       /*
+                        * Offsets on GPIO block 1:
+                        * 3 = MMC WP (write protect)
+                        * 4 = MMC CD (card detect)
+                        *
+                        * Offsets on GPIO block 2:
+                        * 0 = Up key
+                        * 1 = Down key
+                        * 2 = Left key
+                        * 3 = Right key
+                        * 4 = Key lower left
+                        * 5 = Key lower right
+                        */
+                       /* We need the two MMCI GPIO entries */
+                       lookup->table[0].chip_label = chipname;
+                       lookup->table[0].chip_hwnum = 3;
+                       lookup->table[0].con_id = "wp";
+                       lookup->table[1].chip_label = chipname;
+                       lookup->table[1].chip_hwnum = 4;
+                       lookup->table[1].con_id = "cd";
+                       lookup->table[1].flags = GPIO_ACTIVE_LOW;
+                       gpiod_add_lookup_table(lookup);
+               }
+
                d = amba_ahb_device_add_res(&dev->dev, devname, pc_base, SZ_4K,
                                            irq1, irq2,
                                            idev->platform_data, idev->id,
diff --git a/arch/arm/mach-meson/Kconfig b/arch/arm/mach-meson/Kconfig
new file mode 100644 (file)
index 0000000..2c1154e
--- /dev/null
@@ -0,0 +1,13 @@
+menuconfig ARCH_MESON
+       bool "Amlogic Meson SoCs" if ARCH_MULTI_V7
+       select GENERIC_IRQ_CHIP
+       select ARM_GIC
+
+if ARCH_MESON
+
+config MACH_MESON6
+       bool "Amlogic Meson6 (8726MX) SoCs support"
+       default ARCH_MESON
+       select MESON6_TIMER
+
+endif
diff --git a/arch/arm/mach-meson/Makefile b/arch/arm/mach-meson/Makefile
new file mode 100644 (file)
index 0000000..9d7380e
--- /dev/null
@@ -0,0 +1 @@
+obj-$(CONFIG_ARCH_MESON) += meson.o
diff --git a/arch/arm/mach-meson/meson.c b/arch/arm/mach-meson/meson.c
new file mode 100644 (file)
index 0000000..5ee064f
--- /dev/null
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2014 Carlo Caione <carlo@caione.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This 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/of_platform.h>
+#include <asm/mach/arch.h>
+
+static const char * const m6_common_board_compat[] = {
+       "amlogic,meson6",
+       NULL,
+};
+
+DT_MACHINE_START(AML8726_MX, "Amlogic Meson6 platform")
+       .dt_compat      = m6_common_board_compat,
+MACHINE_END
+
index 08d4167cc7c55751ddb71516b0a125e00afd9279..75212c064b31ccab93106c7b8af9db062efa5674 100644 (file)
@@ -22,7 +22,6 @@ config ARCH_OMAP4
        bool "TI OMAP4"
        depends on ARCH_MULTI_V7
        select ARCH_OMAP2PLUS
-       select ARCH_HAS_OPP
        select ARCH_NEEDS_CPU_IDLE_COUPLED if SMP
        select ARM_CPU_SUSPEND if PM
        select ARM_ERRATA_720789
@@ -41,7 +40,6 @@ config SOC_OMAP5
        bool "TI OMAP5"
        depends on ARCH_MULTI_V7
        select ARCH_OMAP2PLUS
-       select ARCH_HAS_OPP
        select ARM_CPU_SUSPEND if PM
        select ARM_GIC
        select HAVE_ARM_SCU if SMP
@@ -53,14 +51,12 @@ config SOC_AM33XX
        bool "TI AM33XX"
        depends on ARCH_MULTI_V7
        select ARCH_OMAP2PLUS
-       select ARCH_HAS_OPP
        select ARM_CPU_SUSPEND if PM
 
 config SOC_AM43XX
        bool "TI AM43x"
        depends on ARCH_MULTI_V7
        select ARCH_OMAP2PLUS
-       select ARCH_HAS_OPP
        select ARM_GIC
        select MACH_OMAP_GENERIC
        select MIGHT_HAVE_CACHE_L2X0
@@ -69,7 +65,6 @@ config SOC_DRA7XX
        bool "TI DRA7XX"
        depends on ARCH_MULTI_V7
        select ARCH_OMAP2PLUS
-       select ARCH_HAS_OPP
        select ARM_CPU_SUSPEND if PM
        select ARM_GIC
        select HAVE_ARM_ARCH_TIMER
index 69bbcba8842f7316013e2ca1c0a3ee554c959d4d..d9dd99c6aa2813f3e67ec2744f9f918a0070a452 100644 (file)
@@ -87,9 +87,10 @@ ifeq ($(CONFIG_PM),y)
 obj-$(CONFIG_ARCH_OMAP2)               += pm24xx.o
 obj-$(CONFIG_ARCH_OMAP2)               += sleep24xx.o
 obj-$(CONFIG_ARCH_OMAP3)               += pm34xx.o sleep34xx.o
-obj-$(CONFIG_ARCH_OMAP4)               += pm44xx.o omap-mpuss-lowpower.o
-obj-$(CONFIG_SOC_OMAP5)                        += omap-mpuss-lowpower.o
-obj-$(CONFIG_SOC_DRA7XX)               += omap-mpuss-lowpower.o
+omap-4-5-pm-common                     =  pm44xx.o omap-mpuss-lowpower.o
+obj-$(CONFIG_ARCH_OMAP4)               += $(omap-4-5-pm-common)
+obj-$(CONFIG_SOC_OMAP5)                        += $(omap-4-5-pm-common)
+obj-$(CONFIG_SOC_DRA7XX)               += $(omap-4-5-pm-common)
 obj-$(CONFIG_PM_DEBUG)                 += pm-debug.o
 
 obj-$(CONFIG_POWER_AVS_OMAP)           += sr_device.o
@@ -102,7 +103,10 @@ endif
 
 ifeq ($(CONFIG_CPU_IDLE),y)
 obj-$(CONFIG_ARCH_OMAP3)                += cpuidle34xx.o
-obj-$(CONFIG_ARCH_OMAP4)                += cpuidle44xx.o
+omap-4-5-idle-common                   =  cpuidle44xx.o
+obj-$(CONFIG_ARCH_OMAP4)               += $(omap-4-5-idle-common)
+obj-$(CONFIG_SOC_OMAP5)                        += $(omap-4-5-idle-common)
+obj-$(CONFIG_SOC_DRA7XX)               += $(omap-4-5-idle-common)
 endif
 
 # PRCM
index 79664411e7948a4e79df09fe673c964966eb106b..98fe235f6670a94c3d07cb1ce6b0885017e2e004 100644 (file)
@@ -60,7 +60,7 @@ static inline int omap3_pm_init(void)
 }
 #endif
 
-#if defined(CONFIG_PM) && defined(CONFIG_ARCH_OMAP4)
+#if defined(CONFIG_PM) && (defined(CONFIG_ARCH_OMAP4) || defined(CONFIG_SOC_OMAP5) || defined(CONFIG_SOC_DRA7XX))
 int omap4_pm_init(void);
 int omap4_pm_init_early(void);
 #else
index 5d0667c119f6e6866e23d25d344eb47ddb34472a..b8ad045bcb8dfbe528a40b93657e0bf373e1832d 100644 (file)
@@ -231,15 +231,6 @@ static struct map_desc omap44xx_io_desc[] __initdata = {
                .length         = L4_PER_44XX_SIZE,
                .type           = MT_DEVICE,
        },
-#ifdef CONFIG_OMAP4_ERRATA_I688
-       {
-               .virtual        = OMAP4_SRAM_VA,
-               .pfn            = __phys_to_pfn(OMAP4_SRAM_PA),
-               .length         = PAGE_SIZE,
-               .type           = MT_MEMORY_RW_SO,
-       },
-#endif
-
 };
 #endif
 
@@ -269,14 +260,6 @@ static struct map_desc omap54xx_io_desc[] __initdata = {
                .length         = L4_PER_54XX_SIZE,
                .type           = MT_DEVICE,
        },
-#ifdef CONFIG_OMAP4_ERRATA_I688
-       {
-               .virtual        = OMAP4_SRAM_VA,
-               .pfn            = __phys_to_pfn(OMAP4_SRAM_PA),
-               .length         = PAGE_SIZE,
-               .type           = MT_MEMORY_RW_SO,
-       },
-#endif
 };
 #endif
 
@@ -667,6 +650,7 @@ void __init omap5_init_early(void)
        omap2_set_globals_cm(OMAP2_L4_IO_ADDRESS(OMAP54XX_CM_CORE_AON_BASE),
                             OMAP2_L4_IO_ADDRESS(OMAP54XX_CM_CORE_BASE));
        omap2_set_globals_prcm_mpu(OMAP2_L4_IO_ADDRESS(OMAP54XX_PRCM_MPU_BASE));
+       omap4_pm_init_early();
        omap_prm_base_init();
        omap_cm_base_init();
        omap44xx_prm_init();
@@ -682,6 +666,8 @@ void __init omap5_init_early(void)
 void __init omap5_init_late(void)
 {
        omap_common_late_init();
+       omap4_pm_init();
+       omap2_clk_enable_autoidle_all();
 }
 #endif
 
@@ -695,6 +681,7 @@ void __init dra7xx_init_early(void)
        omap2_set_globals_cm(OMAP2_L4_IO_ADDRESS(DRA7XX_CM_CORE_AON_BASE),
                             OMAP2_L4_IO_ADDRESS(OMAP54XX_CM_CORE_BASE));
        omap2_set_globals_prcm_mpu(OMAP2_L4_IO_ADDRESS(OMAP54XX_PRCM_MPU_BASE));
+       omap4_pm_init_early();
        omap_prm_base_init();
        omap_cm_base_init();
        omap44xx_prm_init();
@@ -709,6 +696,8 @@ void __init dra7xx_init_early(void)
 void __init dra7xx_init_late(void)
 {
        omap_common_late_init();
+       omap4_pm_init();
+       omap2_clk_enable_autoidle_all();
 }
 #endif
 
index e9cdacfe19235dc30caeb7845bfdada5eebaf3b0..6944ae3674e85d624d9bba85808125c3c56a0dfb 100644 (file)
@@ -56,6 +56,7 @@
 #include "omap4-sar-layout.h"
 #include "pm.h"
 #include "prcm_mpu44xx.h"
+#include "prcm_mpu54xx.h"
 #include "prminst44xx.h"
 #include "prcm44xx.h"
 #include "prm44xx.h"
@@ -68,7 +69,6 @@ struct omap4_cpu_pm_info {
        void __iomem *scu_sar_addr;
        void __iomem *wkup_sar_addr;
        void __iomem *l2x0_sar_addr;
-       void (*secondary_startup)(void);
 };
 
 /**
@@ -76,6 +76,7 @@ struct omap4_cpu_pm_info {
  * @finish_suspend:    CPU suspend finisher function pointer
  * @resume:            CPU resume function pointer
  * @scu_prepare:       CPU Snoop Control program function pointer
+ * @hotplug_restart:   CPU restart function pointer
  *
  * Structure holds functions pointer for CPU low power operations like
  * suspend, resume and scu programming.
@@ -84,11 +85,13 @@ 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);
+       void (*hotplug_restart)(void);
 };
 
 static DEFINE_PER_CPU(struct omap4_cpu_pm_info, omap4_pm_info);
 static struct powerdomain *mpuss_pd;
 static void __iomem *sar_base;
+static u32 cpu_context_offset;
 
 static int default_finish_suspend(unsigned long cpu_state)
 {
@@ -106,6 +109,7 @@ struct cpu_pm_ops omap_pm_ops = {
        .finish_suspend         = default_finish_suspend,
        .resume                 = dummy_cpu_resume,
        .scu_prepare            = dummy_scu_prepare,
+       .hotplug_restart        = dummy_cpu_resume,
 };
 
 /*
@@ -116,7 +120,8 @@ static inline void set_cpu_wakeup_addr(unsigned int cpu_id, u32 addr)
 {
        struct omap4_cpu_pm_info *pm_info = &per_cpu(omap4_pm_info, cpu_id);
 
-       writel_relaxed(addr, pm_info->wkup_sar_addr);
+       if (pm_info->wkup_sar_addr)
+               writel_relaxed(addr, pm_info->wkup_sar_addr);
 }
 
 /*
@@ -141,7 +146,8 @@ static void scu_pwrst_prepare(unsigned int cpu_id, unsigned int cpu_state)
                break;
        }
 
-       writel_relaxed(scu_pwr_st, pm_info->scu_sar_addr);
+       if (pm_info->scu_sar_addr)
+               writel_relaxed(scu_pwr_st, pm_info->scu_sar_addr);
 }
 
 /* Helper functions for MPUSS OSWR */
@@ -161,14 +167,14 @@ static inline void cpu_clear_prev_logic_pwrst(unsigned int cpu_id)
 
        if (cpu_id) {
                reg = omap4_prcm_mpu_read_inst_reg(OMAP4430_PRCM_MPU_CPU1_INST,
-                                       OMAP4_RM_CPU1_CPU1_CONTEXT_OFFSET);
+                                       cpu_context_offset);
                omap4_prcm_mpu_write_inst_reg(reg, OMAP4430_PRCM_MPU_CPU1_INST,
-                                       OMAP4_RM_CPU1_CPU1_CONTEXT_OFFSET);
+                                       cpu_context_offset);
        } else {
                reg = omap4_prcm_mpu_read_inst_reg(OMAP4430_PRCM_MPU_CPU0_INST,
-                                       OMAP4_RM_CPU0_CPU0_CONTEXT_OFFSET);
+                                       cpu_context_offset);
                omap4_prcm_mpu_write_inst_reg(reg, OMAP4430_PRCM_MPU_CPU0_INST,
-                                       OMAP4_RM_CPU0_CPU0_CONTEXT_OFFSET);
+                                       cpu_context_offset);
        }
 }
 
@@ -179,7 +185,8 @@ static void l2x0_pwrst_prepare(unsigned int cpu_id, unsigned int save_state)
 {
        struct omap4_cpu_pm_info *pm_info = &per_cpu(omap4_pm_info, cpu_id);
 
-       writel_relaxed(save_state, pm_info->l2x0_sar_addr);
+       if (pm_info->l2x0_sar_addr)
+               writel_relaxed(save_state, pm_info->l2x0_sar_addr);
 }
 
 /*
@@ -189,10 +196,14 @@ static void l2x0_pwrst_prepare(unsigned int cpu_id, unsigned int save_state)
 #ifdef CONFIG_CACHE_L2X0
 static void __init save_l2x0_context(void)
 {
-       writel_relaxed(l2x0_saved_regs.aux_ctrl,
-                    sar_base + L2X0_AUXCTRL_OFFSET);
-       writel_relaxed(l2x0_saved_regs.prefetch_ctrl,
-                    sar_base + L2X0_PREFETCH_CTRL_OFFSET);
+       void __iomem *l2x0_base = omap4_get_l2cache_base();
+
+       if (l2x0_base && sar_base) {
+               writel_relaxed(l2x0_saved_regs.aux_ctrl,
+                              sar_base + L2X0_AUXCTRL_OFFSET);
+               writel_relaxed(l2x0_saved_regs.prefetch_ctrl,
+                              sar_base + L2X0_PREFETCH_CTRL_OFFSET);
+       }
 }
 #else
 static void __init save_l2x0_context(void)
@@ -231,6 +242,10 @@ int omap4_enter_lowpower(unsigned int cpu, unsigned int power_state)
                save_state = 1;
                break;
        case PWRDM_POWER_RET:
+               if (IS_PM44XX_ERRATUM(PM_OMAP4_CPU_OSWR_DISABLE)) {
+                       save_state = 0;
+                       break;
+               }
        default:
                /*
                 * CPUx CSWR is invalid hardware state. Also CPUx OSWR
@@ -307,7 +322,7 @@ int 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));
+       set_cpu_wakeup_addr(cpu, virt_to_phys(omap_pm_ops.hotplug_restart));
        omap_pm_ops.scu_prepare(cpu, power_state);
 
        /*
@@ -322,6 +337,21 @@ int omap4_hotplug_cpu(unsigned int cpu, unsigned int power_state)
 }
 
 
+/*
+ * Enable Mercury Fast HG retention mode by default.
+ */
+static void enable_mercury_retention_mode(void)
+{
+       u32 reg;
+
+       reg = omap4_prcm_mpu_read_inst_reg(OMAP54XX_PRCM_MPU_DEVICE_INST,
+                                 OMAP54XX_PRCM_MPU_PRM_PSCON_COUNT_OFFSET);
+       /* Enable HG_EN, HG_RAMPUP = fast mode */
+       reg |= BIT(24) | BIT(25);
+       omap4_prcm_mpu_write_inst_reg(reg, OMAP54XX_PRCM_MPU_DEVICE_INST,
+                                     OMAP54XX_PRCM_MPU_PRM_PSCON_COUNT_OFFSET);
+}
+
 /*
  * Initialise OMAP4 MPUSS
  */
@@ -334,13 +364,17 @@ int __init omap4_mpuss_init(void)
                return -ENODEV;
        }
 
-       sar_base = omap4_get_sar_ram_base();
+       if (cpu_is_omap44xx())
+               sar_base = omap4_get_sar_ram_base();
 
        /* Initilaise per CPU PM information */
        pm_info = &per_cpu(omap4_pm_info, 0x0);
-       pm_info->scu_sar_addr = sar_base + SCU_OFFSET0;
-       pm_info->wkup_sar_addr = sar_base + CPU0_WAKEUP_NS_PA_ADDR_OFFSET;
-       pm_info->l2x0_sar_addr = sar_base + L2X0_SAVE_OFFSET0;
+       if (sar_base) {
+               pm_info->scu_sar_addr = sar_base + SCU_OFFSET0;
+               pm_info->wkup_sar_addr = sar_base +
+                                       CPU0_WAKEUP_NS_PA_ADDR_OFFSET;
+               pm_info->l2x0_sar_addr = sar_base + L2X0_SAVE_OFFSET0;
+       }
        pm_info->pwrdm = pwrdm_lookup("cpu0_pwrdm");
        if (!pm_info->pwrdm) {
                pr_err("Lookup failed for CPU0 pwrdm\n");
@@ -355,13 +389,12 @@ int __init omap4_mpuss_init(void)
        pwrdm_set_next_pwrst(pm_info->pwrdm, PWRDM_POWER_ON);
 
        pm_info = &per_cpu(omap4_pm_info, 0x1);
-       pm_info->scu_sar_addr = sar_base + SCU_OFFSET1;
-       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 = omap4460_secondary_startup;
-       else
-               pm_info->secondary_startup = omap4_secondary_startup;
+       if (sar_base) {
+               pm_info->scu_sar_addr = sar_base + SCU_OFFSET1;
+               pm_info->wkup_sar_addr = sar_base +
+                                       CPU1_WAKEUP_NS_PA_ADDR_OFFSET;
+               pm_info->l2x0_sar_addr = sar_base + L2X0_SAVE_OFFSET1;
+       }
 
        pm_info->pwrdm = pwrdm_lookup("cpu1_pwrdm");
        if (!pm_info->pwrdm) {
@@ -384,20 +417,27 @@ int __init omap4_mpuss_init(void)
        pwrdm_clear_all_prev_pwrst(mpuss_pd);
        mpuss_clear_prev_logic_pwrst();
 
-       /* Save device type on scratchpad for low level code to use */
-       if (omap_type() != OMAP2_DEVICE_TYPE_GP)
-               writel_relaxed(1, sar_base + OMAP_TYPE_OFFSET);
-       else
-               writel_relaxed(0, sar_base + OMAP_TYPE_OFFSET);
-
-       save_l2x0_context();
+       if (sar_base) {
+               /* Save device type on scratchpad for low level code to use */
+               writel_relaxed((omap_type() != OMAP2_DEVICE_TYPE_GP) ? 1 : 0,
+                              sar_base + OMAP_TYPE_OFFSET);
+               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;
+               omap_pm_ops.hotplug_restart = omap4_secondary_startup;
+               cpu_context_offset = OMAP4_RM_CPU0_CPU0_CONTEXT_OFFSET;
+       } else if (soc_is_omap54xx() || soc_is_dra7xx()) {
+               cpu_context_offset = OMAP54XX_RM_CPU0_CPU0_CONTEXT_OFFSET;
+               enable_mercury_retention_mode();
        }
 
+       if (cpu_is_omap446x())
+               omap_pm_ops.hotplug_restart = omap4460_secondary_startup;
+
        return 0;
 }
 
index 3e97c6c8ecf139781c7f0d03a68583d5ff81ea2b..dec2b05d184bd329cf990fef3477bfe36f1bb7cb 100644 (file)
@@ -45,6 +45,7 @@
 #define OMAP4_MON_L2X0_PREFETCH_INDEX  0x113
 
 #define OMAP5_DRA7_MON_SET_CNTFRQ_INDEX        0x109
+#define OMAP5_MON_AMBA_IF_INDEX                0x108
 
 /* Secure PPA(Primary Protected Application) APIs */
 #define OMAP4_PPA_L2_POR_INDEX         0x23
index 37843a7d3639fcc5188eff429fdfaffe729b82b5..f961c46453b97c3ba7aa636af837e4cc66801260 100644 (file)
@@ -32,6 +32,7 @@
 #include "soc.h"
 #include "omap4-sar-layout.h"
 #include "common.h"
+#include "pm.h"
 
 #define AM43XX_NR_REG_BANKS    7
 #define AM43XX_IRQS            224
@@ -381,7 +382,7 @@ static struct notifier_block irq_notifier_block = {
 static void __init irq_pm_init(void)
 {
        /* FIXME: Remove this when MPU OSWR support is added */
-       if (!soc_is_omap54xx())
+       if (!IS_PM44XX_ERRATUM(PM_OMAP4_CPU_OSWR_DISABLE))
                cpu_pm_register_notifier(&irq_notifier_block);
 }
 #else
@@ -406,6 +407,7 @@ int __init omap_wakeupgen_init(void)
 {
        int i;
        unsigned int boot_cpu = smp_processor_id();
+       u32 val;
 
        /* Not supported on OMAP4 ES1.0 silicon */
        if (omap_rev() == OMAP4430_REV_ES1_0) {
@@ -451,6 +453,22 @@ int __init omap_wakeupgen_init(void)
        for (i = 0; i < max_irqs; i++)
                irq_target_cpu[i] = boot_cpu;
 
+       /*
+        * Enables OMAP5 ES2 PM Mode using ES2_PM_MODE in AMBA_IF_MODE
+        * 0x0: ES1 behavior, CPU cores would enter and exit OFF mode together.
+        * 0x1: ES2 behavior, CPU cores are allowed to enter/exit OFF mode
+        * independently.
+        * This needs to be set one time thanks to always ON domain.
+        *
+        * We do not support ES1 behavior anymore. OMAP5 is assumed to be
+        * ES2.0, and the same is applicable for DRA7.
+        */
+       if (soc_is_omap54xx() || soc_is_dra7xx()) {
+               val = __raw_readl(wakeupgen_base + OMAP_AMBA_IF_MODE);
+               val |= BIT(5);
+               omap_smc1(OMAP5_MON_AMBA_IF_INDEX, val);
+       }
+
        irq_hotplug_init();
        irq_pm_init();
 
index b0fd16f5c3912a8ed9addba17f58d73a52b338bb..b3c8eccfae790de050f853d7528662a3a5c33aa2 100644 (file)
@@ -27,6 +27,7 @@
 #define OMAP_WKG_ENB_E_1                       0x420
 #define OMAP_AUX_CORE_BOOT_0                   0x800
 #define OMAP_AUX_CORE_BOOT_1                   0x804
+#define OMAP_AMBA_IF_MODE                      0x80c
 #define OMAP_PTMSYNCREQ_MASK                   0xc00
 #define OMAP_PTMSYNCREQ_EN                     0xc04
 #define OMAP_TIMESTAMPCYCLELO                  0xc08
index a0fe747634c1ff56d280159dafc78b9f2cd687ce..16b20cedc38dd434c085de0e8963eb80e74916d2 100644 (file)
@@ -25,6 +25,7 @@
 #include <linux/irqchip/irq-crossbar.h>
 #include <linux/of_address.h>
 #include <linux/reboot.h>
+#include <linux/genalloc.h>
 
 #include <asm/hardware/cache-l2x0.h>
 #include <asm/mach/map.h>
@@ -71,6 +72,26 @@ void omap_bus_sync(void)
 }
 EXPORT_SYMBOL(omap_bus_sync);
 
+static int __init omap4_sram_init(void)
+{
+       struct device_node *np;
+       struct gen_pool *sram_pool;
+
+       np = of_find_compatible_node(NULL, NULL, "ti,omap4-mpu");
+       if (!np)
+               pr_warn("%s:Unable to allocate sram needed to handle errata I688\n",
+                       __func__);
+       sram_pool = of_get_named_gen_pool(np, "sram", 0);
+       if (!sram_pool)
+               pr_warn("%s:Unable to get sram pool needed to handle errata I688\n",
+                       __func__);
+       else
+               sram_sync = (void *)gen_pool_alloc(sram_pool, PAGE_SIZE);
+
+       return 0;
+}
+omap_arch_initcall(omap4_sram_init);
+
 /* Steal one page physical memory for barrier implementation */
 int __init omap_barrier_reserve_memblock(void)
 {
@@ -91,7 +112,6 @@ void __init omap_barriers_init(void)
        dram_io_desc[0].type = MT_MEMORY_RW_SO;
        iotable_init(dram_io_desc, ARRAY_SIZE(dram_io_desc));
        dram_sync = (void __iomem *) dram_io_desc[0].virtual;
-       sram_sync = (void __iomem *) OMAP4_SRAM_VA;
 
        pr_info("OMAP4: Map 0x%08llx to 0x%08lx for dram barrier\n",
                (long long) paddr, dram_io_desc[0].virtual);
index faa65833a0d44c08197f0b699c51766dacb19745..716247ed9e0c3a9b419f84332b97ee83aab28371 100644 (file)
@@ -2185,7 +2185,7 @@ static int _enable(struct omap_hwmod *oh)
                         oh->mux->pads_dynamic))) {
                omap_hwmod_mux(oh->mux, _HWMOD_STATE_ENABLED);
                _reconfigure_io_chain();
-       } else if (oh->flags & HWMOD_FORCE_MSTANDBY) {
+       } else if (oh->flags & HWMOD_RECONFIG_IO_CHAIN) {
                _reconfigure_io_chain();
        }
 
@@ -2293,7 +2293,7 @@ static int _idle(struct omap_hwmod *oh)
        if (oh->mux && oh->mux->pads_dynamic) {
                omap_hwmod_mux(oh->mux, _HWMOD_STATE_IDLE);
                _reconfigure_io_chain();
-       } else if (oh->flags & HWMOD_FORCE_MSTANDBY) {
+       } else if (oh->flags & HWMOD_RECONFIG_IO_CHAIN) {
                _reconfigure_io_chain();
        }
 
index 0f97d635ff90db413b27168fefeecf039a934159..512f809a3f4d1324c2f8a0a6661ac183d256240b 100644 (file)
@@ -514,6 +514,9 @@ struct omap_hwmod_omap4_prcm {
  * HWMOD_SWSUP_SIDLE_ACT: omap_hwmod code should manually bring the module
  *     out of idle, but rely on smart-idle to the put it back in idle,
  *     so the wakeups are still functional (Only known case for now is UART)
+ * HWMOD_RECONFIG_IO_CHAIN: omap_hwmod code needs to reconfigure wake-up 
+ *     events by calling _reconfigure_io_chain() when a device is enabled
+ *     or idled.
  */
 #define HWMOD_SWSUP_SIDLE                      (1 << 0)
 #define HWMOD_SWSUP_MSTANDBY                   (1 << 1)
@@ -528,6 +531,7 @@ struct omap_hwmod_omap4_prcm {
 #define HWMOD_BLOCK_WFI                                (1 << 10)
 #define HWMOD_FORCE_MSTANDBY                   (1 << 11)
 #define HWMOD_SWSUP_SIDLE_ACT                  (1 << 12)
+#define HWMOD_RECONFIG_IO_CHAIN                        (1 << 13)
 
 /*
  * omap_hwmod._int_flags definitions
index e9516b454e76c52c73910b21bfda7f7a2f973d1c..2a78b093c0ce9f23df8cc44025f276eb93832a2c 100644 (file)
@@ -490,7 +490,7 @@ static struct omap_hwmod omap3xxx_uart1_hwmod = {
        .mpu_irqs       = omap2_uart1_mpu_irqs,
        .sdma_reqs      = omap2_uart1_sdma_reqs,
        .main_clk       = "uart1_fck",
-       .flags          = DEBUG_TI81XXUART1_FLAGS | HWMOD_SWSUP_SIDLE_ACT,
+       .flags          = DEBUG_TI81XXUART1_FLAGS | HWMOD_SWSUP_SIDLE,
        .prcm           = {
                .omap2 = {
                        .module_offs = CORE_MOD,
@@ -509,7 +509,7 @@ static struct omap_hwmod omap3xxx_uart2_hwmod = {
        .mpu_irqs       = omap2_uart2_mpu_irqs,
        .sdma_reqs      = omap2_uart2_sdma_reqs,
        .main_clk       = "uart2_fck",
-       .flags          = DEBUG_TI81XXUART2_FLAGS | HWMOD_SWSUP_SIDLE_ACT,
+       .flags          = DEBUG_TI81XXUART2_FLAGS | HWMOD_SWSUP_SIDLE,
        .prcm           = {
                .omap2 = {
                        .module_offs = CORE_MOD,
@@ -529,7 +529,7 @@ static struct omap_hwmod omap3xxx_uart3_hwmod = {
        .sdma_reqs      = omap2_uart3_sdma_reqs,
        .main_clk       = "uart3_fck",
        .flags          = DEBUG_OMAP3UART3_FLAGS | DEBUG_TI81XXUART3_FLAGS |
-                               HWMOD_SWSUP_SIDLE_ACT,
+                               HWMOD_SWSUP_SIDLE,
        .prcm           = {
                .omap2 = {
                        .module_offs = OMAP3430_PER_MOD,
@@ -559,7 +559,7 @@ static struct omap_hwmod omap36xx_uart4_hwmod = {
        .mpu_irqs       = uart4_mpu_irqs,
        .sdma_reqs      = uart4_sdma_reqs,
        .main_clk       = "uart4_fck",
-       .flags          = DEBUG_OMAP3UART4_FLAGS | HWMOD_SWSUP_SIDLE_ACT,
+       .flags          = DEBUG_OMAP3UART4_FLAGS | HWMOD_SWSUP_SIDLE,
        .prcm           = {
                .omap2 = {
                        .module_offs = OMAP3430_PER_MOD,
@@ -1730,8 +1730,8 @@ static struct omap_hwmod omap3xxx_usbhsotg_hwmod = {
         * Note that musb has OTG_FORCESTDBY register that controls MSTANDBY
         * signal when MIDLEMODE is set to force-idle.
         */
-       .flags          = HWMOD_NO_OCP_AUTOIDLE | HWMOD_SWSUP_SIDLE
-                               | HWMOD_FORCE_MSTANDBY,
+       .flags          = HWMOD_NO_OCP_AUTOIDLE | HWMOD_SWSUP_SIDLE |
+                         HWMOD_FORCE_MSTANDBY | HWMOD_RECONFIG_IO_CHAIN,
 };
 
 /* usb_otg_hs */
index b3d3d30ffba0901b77b1cd027c8bc6b056edb93f..0a5e6e053b8c1fbd3b9f072fb77f2d1f9dada3ad 100644 (file)
@@ -352,6 +352,16 @@ struct of_dev_auxdata omap_auxdata_lookup[] __initdata = {
        OF_DEV_AUXDATA("ti,omap4-padconf", 0x4a100040, "4a100040.pinmux", &pcs_pdata),
        OF_DEV_AUXDATA("ti,omap4-padconf", 0x4a31e040, "4a31e040.pinmux", &pcs_pdata),
 #endif
+#ifdef CONFIG_SOC_OMAP5
+       OF_DEV_AUXDATA("ti,omap5-padconf", 0x4a002840, "4a002840.pinmux", &pcs_pdata),
+       OF_DEV_AUXDATA("ti,omap5-padconf", 0x4ae0c840, "4ae0c840.pinmux", &pcs_pdata),
+#endif
+#ifdef CONFIG_SOC_DRA7XX
+       OF_DEV_AUXDATA("ti,dra7-padconf", 0x4a003400, "4a003400.pinmux", &pcs_pdata),
+#endif
+#ifdef CONFIG_SOC_AM43XX
+       OF_DEV_AUXDATA("ti,am437-padconf", 0x44e10800, "44e10800.pinmux", &pcs_pdata),
+#endif
 #if defined(CONFIG_ARCH_OMAP4) || defined(CONFIG_SOC_OMAP5)
        OF_DEV_AUXDATA("ti,omap4-iommu", 0x4a066000, "4a066000.mmu",
                       &omap4_iommu_pdata),
index e150102d6c06be0d13f8110ced831ce5338e6a24..425bfcd67db62e48ec03a83e941fc858301b01f4 100644 (file)
@@ -101,6 +101,7 @@ static inline void enable_omap3630_toggle_l2_on_restore(void) { }
 #endif         /* defined(CONFIG_PM) && defined(CONFIG_ARCH_OMAP3) */
 
 #define PM_OMAP4_ROM_SMP_BOOT_ERRATUM_GICD     (1 << 0)
+#define PM_OMAP4_CPU_OSWR_DISABLE              (1 << 1)
 
 #if defined(CONFIG_PM) && defined(CONFIG_ARCH_OMAP4)
 extern u16 pm44xx_errata;
index 0bfce38a744a14f35ec6b30c456e0cff1b3e9dda..503097c72b826d0f6ddf96547be2d165156271c2 100644 (file)
@@ -37,6 +37,8 @@ struct power_state {
        struct list_head node;
 };
 
+static u32 cpu_suspend_state = PWRDM_POWER_OFF;
+
 static LIST_HEAD(pwrst_list);
 
 #ifdef CONFIG_SUSPEND
@@ -67,7 +69,7 @@ static int omap4_pm_suspend(void)
         * domain CSWR is not supported by hardware.
         * More details can be found in OMAP4430 TRM section 4.3.4.2.
         */
-       omap4_enter_lowpower(cpu_id, PWRDM_POWER_OFF);
+       omap4_enter_lowpower(cpu_id, cpu_suspend_state);
 
        /* Restore next powerdomain state */
        list_for_each_entry(pwrst, &pwrst_list, node) {
@@ -113,8 +115,11 @@ static int __init pwrdms_setup(struct powerdomain *pwrdm, void *unused)
         * through hotplug path and CPU0 explicitly programmed
         * further down in the code path
         */
-       if (!strncmp(pwrdm->name, "cpu", 3))
+       if (!strncmp(pwrdm->name, "cpu", 3)) {
+               if (IS_PM44XX_ERRATUM(PM_OMAP4_CPU_OSWR_DISABLE))
+                       cpu_suspend_state = PWRDM_POWER_RET;
                return 0;
+       }
 
        pwrst = kmalloc(sizeof(struct power_state), GFP_ATOMIC);
        if (!pwrst)
@@ -207,6 +212,32 @@ static inline int omap4_init_static_deps(void)
        return ret;
 }
 
+/**
+ * omap5_dra7_init_static_deps - Init static clkdm dependencies on OMAP5 and
+ *                              DRA7
+ *
+ * The dynamic dependency between MPUSS -> EMIF is broken and has
+ * not worked as expected. The hardware recommendation is to
+ * enable static dependencies for these to avoid system
+ * lock ups or random crashes.
+ */
+static inline int omap5_dra7_init_static_deps(void)
+{
+       struct clockdomain *mpuss_clkdm, *emif_clkdm;
+       int ret;
+
+       mpuss_clkdm = clkdm_lookup("mpu_clkdm");
+       emif_clkdm = clkdm_lookup("emif_clkdm");
+       if (!mpuss_clkdm || !emif_clkdm)
+               return -EINVAL;
+
+       ret = clkdm_add_wkdep(mpuss_clkdm, emif_clkdm);
+       if (ret)
+               pr_err("Failed to add MPUSS -> EMIF wakeup dependency\n");
+
+       return ret;
+}
+
 /**
  * omap4_pm_init_early - Does early initialization necessary for OMAP4+ devices
  *
@@ -217,6 +248,9 @@ int __init omap4_pm_init_early(void)
        if (cpu_is_omap446x())
                pm44xx_errata |= PM_OMAP4_ROM_SMP_BOOT_ERRATUM_GICD;
 
+       if (soc_is_omap54xx() || soc_is_dra7xx())
+               pm44xx_errata |= PM_OMAP4_CPU_OSWR_DISABLE;
+
        return 0;
 }
 
@@ -244,10 +278,14 @@ int __init omap4_pm_init(void)
                goto err2;
        }
 
-       if (cpu_is_omap44xx()) {
+       if (cpu_is_omap44xx())
                ret = omap4_init_static_deps();
-               if (ret)
-                       goto err2;
+       else if (soc_is_omap54xx() || soc_is_dra7xx())
+               ret = omap5_dra7_init_static_deps();
+
+       if (ret) {
+               pr_err("Failed to initialise static dependencies.\n");
+               goto err2;
        }
 
        ret = omap4_mpuss_init();
index 372de3edf4a582f24957beceb5764e6b1247b527..ff08da385a2dd2facc58784957a55e09571fd33b 100644 (file)
@@ -17,6 +17,7 @@
 #include <linux/err.h>
 #include <linux/io.h>
 #include <linux/irq.h>
+#include <linux/of_irq.h>
 
 #include "soc.h"
 #include "common.h"
@@ -673,6 +674,11 @@ int __init omap3xxx_prm_init(void)
        return prm_register(&omap3xxx_prm_ll_data);
 }
 
+static struct of_device_id omap3_prm_dt_match_table[] = {
+       { .compatible = "ti,omap3-prm" },
+       { }
+};
+
 static int omap3xxx_prm_late_init(void)
 {
        int ret;
@@ -687,6 +693,18 @@ static int omap3xxx_prm_late_init(void)
                omap3_prcm_irq_setup.reconfigure_io_chain =
                        omap3430_pre_es3_1_reconfigure_io_chain;
 
+       if (of_have_populated_dt()) {
+               struct device_node *np;
+               int irq_num;
+
+               np = of_find_matching_node(NULL, omap3_prm_dt_match_table);
+               if (np) {
+                       irq_num = of_irq_get(np, 0);
+                       if (irq_num >= 0)
+                               omap3_prcm_irq_setup.irq = irq_num;
+               }
+       }
+
        omap3xxx_prm_enable_io_wakeup();
        ret = omap_prcm_register_chain_handler(&omap3_prcm_irq_setup);
        if (!ret)
index a7f6ea27180ae9fc96c5f40d442c4f89a42c410e..0958d070d3db66661a3493b1a14286858f19d8f6 100644 (file)
@@ -17,6 +17,7 @@
 #include <linux/errno.h>
 #include <linux/err.h>
 #include <linux/io.h>
+#include <linux/of_irq.h>
 
 
 #include "soc.h"
@@ -32,7 +33,6 @@
 /* Static data */
 
 static const struct omap_prcm_irq omap4_prcm_irqs[] = {
-       OMAP_PRCM_IRQ("wkup",   0,      0),
        OMAP_PRCM_IRQ("io",     9,      1),
 };
 
@@ -154,21 +154,36 @@ void omap4_prm_vp_clear_txdone(u8 vp_id)
 
 u32 omap4_prm_vcvp_read(u8 offset)
 {
+       s32 inst = omap4_prmst_get_prm_dev_inst();
+
+       if (inst == PRM_INSTANCE_UNKNOWN)
+               return 0;
+
        return omap4_prminst_read_inst_reg(OMAP4430_PRM_PARTITION,
-                                          OMAP4430_PRM_DEVICE_INST, offset);
+                                          inst, offset);
 }
 
 void omap4_prm_vcvp_write(u32 val, u8 offset)
 {
+       s32 inst = omap4_prmst_get_prm_dev_inst();
+
+       if (inst == PRM_INSTANCE_UNKNOWN)
+               return;
+
        omap4_prminst_write_inst_reg(val, OMAP4430_PRM_PARTITION,
-                                    OMAP4430_PRM_DEVICE_INST, offset);
+                                    inst, offset);
 }
 
 u32 omap4_prm_vcvp_rmw(u32 mask, u32 bits, u8 offset)
 {
+       s32 inst = omap4_prmst_get_prm_dev_inst();
+
+       if (inst == PRM_INSTANCE_UNKNOWN)
+               return 0;
+
        return omap4_prminst_rmw_inst_reg_bits(mask, bits,
                                               OMAP4430_PRM_PARTITION,
-                                              OMAP4430_PRM_DEVICE_INST,
+                                              inst,
                                               offset);
 }
 
@@ -275,14 +290,18 @@ void omap44xx_prm_restore_irqen(u32 *saved_mask)
 void omap44xx_prm_reconfigure_io_chain(void)
 {
        int i = 0;
+       s32 inst = omap4_prmst_get_prm_dev_inst();
+
+       if (inst == PRM_INSTANCE_UNKNOWN)
+               return;
 
        /* Trigger WUCLKIN enable */
        omap4_prm_rmw_inst_reg_bits(OMAP4430_WUCLK_CTRL_MASK,
                                    OMAP4430_WUCLK_CTRL_MASK,
-                                   OMAP4430_PRM_DEVICE_INST,
+                                   inst,
                                    OMAP4_PRM_IO_PMCTRL_OFFSET);
        omap_test_timeout(
-               (((omap4_prm_read_inst_reg(OMAP4430_PRM_DEVICE_INST,
+               (((omap4_prm_read_inst_reg(inst,
                                           OMAP4_PRM_IO_PMCTRL_OFFSET) &
                   OMAP4430_WUCLK_STATUS_MASK) >>
                  OMAP4430_WUCLK_STATUS_SHIFT) == 1),
@@ -292,10 +311,10 @@ void omap44xx_prm_reconfigure_io_chain(void)
 
        /* Trigger WUCLKIN disable */
        omap4_prm_rmw_inst_reg_bits(OMAP4430_WUCLK_CTRL_MASK, 0x0,
-                                   OMAP4430_PRM_DEVICE_INST,
+                                   inst,
                                    OMAP4_PRM_IO_PMCTRL_OFFSET);
        omap_test_timeout(
-               (((omap4_prm_read_inst_reg(OMAP4430_PRM_DEVICE_INST,
+               (((omap4_prm_read_inst_reg(inst,
                                           OMAP4_PRM_IO_PMCTRL_OFFSET) &
                   OMAP4430_WUCLK_STATUS_MASK) >>
                  OMAP4430_WUCLK_STATUS_SHIFT) == 0),
@@ -316,9 +335,14 @@ void omap44xx_prm_reconfigure_io_chain(void)
  */
 static void __init omap44xx_prm_enable_io_wakeup(void)
 {
+       s32 inst = omap4_prmst_get_prm_dev_inst();
+
+       if (inst == PRM_INSTANCE_UNKNOWN)
+               return;
+
        omap4_prm_rmw_inst_reg_bits(OMAP4430_GLOBAL_WUEN_MASK,
                                    OMAP4430_GLOBAL_WUEN_MASK,
-                                   OMAP4430_PRM_DEVICE_INST,
+                                   inst,
                                    OMAP4_PRM_IO_PMCTRL_OFFSET);
 }
 
@@ -333,8 +357,13 @@ static u32 omap44xx_prm_read_reset_sources(void)
        struct prm_reset_src_map *p;
        u32 r = 0;
        u32 v;
+       s32 inst = omap4_prmst_get_prm_dev_inst();
 
-       v = omap4_prm_read_inst_reg(OMAP4430_PRM_DEVICE_INST,
+       if (inst == PRM_INSTANCE_UNKNOWN)
+               return 0;
+
+
+       v = omap4_prm_read_inst_reg(inst,
                                    OMAP4_RM_RSTST);
 
        p = omap44xx_prm_reset_src_map;
@@ -664,17 +693,56 @@ static struct prm_ll_data omap44xx_prm_ll_data = {
 
 int __init omap44xx_prm_init(void)
 {
-       if (cpu_is_omap44xx())
+       if (cpu_is_omap44xx() || soc_is_omap54xx() || soc_is_dra7xx())
                prm_features |= PRM_HAS_IO_WAKEUP;
 
        return prm_register(&omap44xx_prm_ll_data);
 }
 
+static struct of_device_id omap_prm_dt_match_table[] = {
+       { .compatible = "ti,omap4-prm" },
+       { .compatible = "ti,omap5-prm" },
+       { .compatible = "ti,dra7-prm" },
+       { }
+};
+
 static int omap44xx_prm_late_init(void)
 {
+       struct device_node *np;
+       int irq_num;
+
        if (!(prm_features & PRM_HAS_IO_WAKEUP))
                return 0;
 
+       /* OMAP4+ is DT only now */
+       if (!of_have_populated_dt())
+               return 0;
+
+       np = of_find_matching_node(NULL, omap_prm_dt_match_table);
+
+       if (!np) {
+               /* Default loaded up with OMAP4 values */
+               if (!cpu_is_omap44xx())
+                       return 0;
+       } else {
+               irq_num = of_irq_get(np, 0);
+               /*
+                * Already have OMAP4 IRQ num. For all other platforms, we need
+                * IRQ numbers from DT
+                */
+               if (irq_num < 0 && !cpu_is_omap44xx()) {
+                       if (irq_num == -EPROBE_DEFER)
+                               return irq_num;
+
+                       /* Have nothing to do */
+                       return 0;
+               }
+
+               /* Once OMAP4 DT is filled as well */
+               if (irq_num >= 0)
+                       omap4_prcm_irq_setup.irq = irq_num;
+       }
+
        omap44xx_prm_enable_io_wakeup();
 
        return omap_prcm_register_chain_handler(&omap4_prcm_irq_setup);
index 69f0dd08629cb1bdbeaeb2d9c3c87e00e0bf8afb..225e0258d76d4e02e49ea6d63f8c1da1e6187479 100644 (file)
@@ -31,6 +31,8 @@
 
 static void __iomem *_prm_bases[OMAP4_MAX_PRCM_PARTITIONS];
 
+static s32 prm_dev_inst = PRM_INSTANCE_UNKNOWN;
+
 /**
  * omap_prm_base_init - Populates the prm partitions
  *
@@ -43,6 +45,24 @@ void omap_prm_base_init(void)
        _prm_bases[OMAP4430_PRCM_MPU_PARTITION] = prcm_mpu_base;
 }
 
+s32 omap4_prmst_get_prm_dev_inst(void)
+{
+       if (prm_dev_inst != PRM_INSTANCE_UNKNOWN)
+               return prm_dev_inst;
+
+       /* This cannot be done way early at boot.. as things are not setup */
+       if (cpu_is_omap44xx())
+               prm_dev_inst = OMAP4430_PRM_DEVICE_INST;
+       else if (soc_is_omap54xx())
+               prm_dev_inst = OMAP54XX_PRM_DEVICE_INST;
+       else if (soc_is_dra7xx())
+               prm_dev_inst = DRA7XX_PRM_DEVICE_INST;
+       else if (soc_is_am43xx())
+               prm_dev_inst = AM43XX_PRM_DEVICE_INST;
+
+       return prm_dev_inst;
+}
+
 /* Read a register in a PRM instance */
 u32 omap4_prminst_read_inst_reg(u8 part, s16 inst, u16 idx)
 {
@@ -169,28 +189,18 @@ int omap4_prminst_deassert_hardreset(u8 shift, u8 part, s16 inst,
 void omap4_prminst_global_warm_sw_reset(void)
 {
        u32 v;
-       s16 dev_inst;
+       s32 inst = omap4_prmst_get_prm_dev_inst();
 
-       if (cpu_is_omap44xx())
-               dev_inst = OMAP4430_PRM_DEVICE_INST;
-       else if (soc_is_omap54xx())
-               dev_inst = OMAP54XX_PRM_DEVICE_INST;
-       else if (soc_is_dra7xx())
-               dev_inst = DRA7XX_PRM_DEVICE_INST;
-       else if (soc_is_am43xx())
-               dev_inst = AM43XX_PRM_DEVICE_INST;
-       else
+       if (inst == PRM_INSTANCE_UNKNOWN)
                return;
 
-       v = omap4_prminst_read_inst_reg(OMAP4430_PRM_PARTITION, dev_inst,
+       v = omap4_prminst_read_inst_reg(OMAP4430_PRM_PARTITION, inst,
                                        OMAP4_PRM_RSTCTRL_OFFSET);
        v |= OMAP4430_RST_GLOBAL_WARM_SW_MASK;
        omap4_prminst_write_inst_reg(v, OMAP4430_PRM_PARTITION,
-                                dev_inst,
-                                OMAP4_PRM_RSTCTRL_OFFSET);
+                                inst, OMAP4_PRM_RSTCTRL_OFFSET);
 
        /* OCP barrier */
        v = omap4_prminst_read_inst_reg(OMAP4430_PRM_PARTITION,
-                                   dev_inst,
-                                   OMAP4_PRM_RSTCTRL_OFFSET);
+                                   inst, OMAP4_PRM_RSTCTRL_OFFSET);
 }
index a2ede2d65481580e7399cc36bf964e57eee0fea5..583aa3774571391bda936e075fc9051b209624b4 100644 (file)
@@ -12,6 +12,9 @@
 #ifndef __ARCH_ASM_MACH_OMAP2_PRMINST44XX_H
 #define __ARCH_ASM_MACH_OMAP2_PRMINST44XX_H
 
+#define PRM_INSTANCE_UNKNOWN   -1
+extern s32 omap4_prmst_get_prm_dev_inst(void);
+
 /*
  * In an ideal world, we would not export these low-level functions,
  * but this will probably take some time to fix properly
index ddf1818af228791ee4c1edba550320e74b9a19e8..cd488b80ba36ed621e69828ab4d847e26259498c 100644 (file)
 
 #define OMAP2_SRAM_PUB_PA      (OMAP2_SRAM_PA + 0xf800)
 #define OMAP3_SRAM_PUB_PA       (OMAP3_SRAM_PA + 0x8000)
-#ifdef CONFIG_OMAP4_ERRATA_I688
-#define OMAP4_SRAM_PUB_PA      OMAP4_SRAM_PA
-#else
-#define OMAP4_SRAM_PUB_PA      (OMAP4_SRAM_PA + 0x4000)
-#endif
-#define OMAP5_SRAM_PA          0x40300000
 
 #define SRAM_BOOTLOADER_SZ     0x00
 
@@ -105,32 +99,14 @@ static void __init omap_detect_sram(void)
                        } else {
                                omap_sram_size = 0x8000; /* 32K */
                        }
-               } else if (cpu_is_omap44xx()) {
-                       omap_sram_start = OMAP4_SRAM_PUB_PA;
-                       omap_sram_size = 0xa000; /* 40K */
-               } else if (soc_is_omap54xx()) {
-                       omap_sram_start = OMAP5_SRAM_PA;
-                       omap_sram_size = SZ_128K; /* 128KB */
                } else {
                        omap_sram_start = OMAP2_SRAM_PUB_PA;
                        omap_sram_size = 0x800; /* 2K */
                }
        } else {
-               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()) {
+               if (cpu_is_omap34xx()) {
                        omap_sram_start = OMAP3_SRAM_PA;
                        omap_sram_size = 0x10000; /* 64K */
-               } else if (cpu_is_omap44xx()) {
-                       omap_sram_start = OMAP4_SRAM_PA;
-                       omap_sram_size = 0xe000; /* 56K */
-               } else if (soc_is_omap54xx()) {
-                       omap_sram_start = OMAP5_SRAM_PA;
-                       omap_sram_size = SZ_128K; /* 128KB */
                } else {
                        omap_sram_start = OMAP2_SRAM_PA;
                        if (cpu_is_omap242x())
@@ -148,12 +124,6 @@ static void __init omap2_map_sram(void)
 {
        int cached = 1;
 
-#ifdef CONFIG_OMAP4_ERRATA_I688
-       if (cpu_is_omap44xx()) {
-               omap_sram_start += PAGE_SIZE;
-               omap_sram_size -= SZ_16K;
-       }
-#endif
        if (cpu_is_omap34xx()) {
                /*
                 * SRAM must be marked as non-cached on OMAP3 since the
@@ -285,11 +255,6 @@ static inline int omap34xx_sram_init(void)
 }
 #endif /* CONFIG_ARCH_OMAP3 */
 
-static inline int am33xx_sram_init(void)
-{
-       return 0;
-}
-
 int __init omap_sram_init(void)
 {
        omap_detect_sram();
@@ -299,8 +264,6 @@ int __init omap_sram_init(void)
                omap242x_sram_init();
        else if (cpu_is_omap2430())
                omap243x_sram_init();
-       else if (soc_is_am33xx())
-               am33xx_sram_init();
        else if (cpu_is_omap34xx())
                omap34xx_sram_init();
 
index ca7277c2a9ee74541c7ed249662c438f740838c6..948d3edefc3865504bd87ea328b55b9b3713ef6f 100644 (file)
@@ -74,10 +74,3 @@ static inline void omap_push_sram_idle(void) {}
  */
 #define OMAP2_SRAM_PA          0x40200000
 #define OMAP3_SRAM_PA           0x40200000
-#ifdef CONFIG_OMAP4_ERRATA_I688
-#define OMAP4_SRAM_PA          0x40304000
-#define OMAP4_SRAM_VA          0xfe404000
-#else
-#define OMAP4_SRAM_PA          0x40300000
-#endif
-#define AM33XX_SRAM_PA         0x40300000
index 666094315ab1a4a8a11b2ca00987afd687aa6c10..ac7b3eabbd858e88adfd098da6b9d60db696feda 100644 (file)
@@ -1071,9 +1071,47 @@ static struct resource pxa3xx_resource_ssp4[] = {
        },
 };
 
+/*
+ * PXA3xx SSP is basically equivalent to PXA27x.
+ * However, we need to register the device by the correct name in order to
+ * make the driver set the correct internal type, hence we provide specific
+ * platform_devices for each of them.
+ */
+struct platform_device pxa3xx_device_ssp1 = {
+       .name           = "pxa3xx-ssp",
+       .id             = 0,
+       .dev            = {
+               .dma_mask = &pxa27x_ssp1_dma_mask,
+               .coherent_dma_mask = DMA_BIT_MASK(32),
+       },
+       .resource       = pxa27x_resource_ssp1,
+       .num_resources  = ARRAY_SIZE(pxa27x_resource_ssp1),
+};
+
+struct platform_device pxa3xx_device_ssp2 = {
+       .name           = "pxa3xx-ssp",
+       .id             = 1,
+       .dev            = {
+               .dma_mask = &pxa27x_ssp2_dma_mask,
+               .coherent_dma_mask = DMA_BIT_MASK(32),
+       },
+       .resource       = pxa27x_resource_ssp2,
+       .num_resources  = ARRAY_SIZE(pxa27x_resource_ssp2),
+};
+
+struct platform_device pxa3xx_device_ssp3 = {
+       .name           = "pxa3xx-ssp",
+       .id             = 2,
+       .dev            = {
+               .dma_mask = &pxa27x_ssp3_dma_mask,
+               .coherent_dma_mask = DMA_BIT_MASK(32),
+       },
+       .resource       = pxa27x_resource_ssp3,
+       .num_resources  = ARRAY_SIZE(pxa27x_resource_ssp3),
+};
+
 struct platform_device pxa3xx_device_ssp4 = {
-       /* PXA3xx SSP is basically equivalent to PXA27x */
-       .name           = "pxa27x-ssp",
+       .name           = "pxa3xx-ssp",
        .id             = 3,
        .dev            = {
                .dma_mask = &pxa3xx_ssp4_dma_mask,
index 0f3fd0d65b12a8cad7f29dc63ff43be6de374f22..4a13c32fb705c4e7e4418a72886ea75e31972ab0 100644 (file)
@@ -27,6 +27,9 @@ extern struct platform_device pxa25x_device_assp;
 extern struct platform_device pxa27x_device_ssp1;
 extern struct platform_device pxa27x_device_ssp2;
 extern struct platform_device pxa27x_device_ssp3;
+extern struct platform_device pxa3xx_device_ssp1;
+extern struct platform_device pxa3xx_device_ssp2;
+extern struct platform_device pxa3xx_device_ssp3;
 extern struct platform_device pxa3xx_device_ssp4;
 
 extern struct platform_device pxa25x_device_pwm0;
index 593ccd35ca9780696824fb1c5056ec0df1bc9527..edcbd9c0bcb2edf1f6ace9805c4b3a04f7671601 100644 (file)
@@ -84,10 +84,10 @@ static struct clk_lookup pxa3xx_clkregs[] = {
        INIT_CLKREG(&clk_pxa3xx_usbh, "pxa27x-ohci", NULL),
        INIT_CLKREG(&clk_pxa3xx_u2d, "pxa3xx-u2d", NULL),
        INIT_CLKREG(&clk_pxa3xx_keypad, "pxa27x-keypad", NULL),
-       INIT_CLKREG(&clk_pxa3xx_ssp1, "pxa27x-ssp.0", NULL),
-       INIT_CLKREG(&clk_pxa3xx_ssp2, "pxa27x-ssp.1", NULL),
-       INIT_CLKREG(&clk_pxa3xx_ssp3, "pxa27x-ssp.2", NULL),
-       INIT_CLKREG(&clk_pxa3xx_ssp4, "pxa27x-ssp.3", NULL),
+       INIT_CLKREG(&clk_pxa3xx_ssp1, "pxa3xx-ssp.0", NULL),
+       INIT_CLKREG(&clk_pxa3xx_ssp2, "pxa3xx-ssp.1", NULL),
+       INIT_CLKREG(&clk_pxa3xx_ssp3, "pxa3xx-ssp.2", NULL),
+       INIT_CLKREG(&clk_pxa3xx_ssp4, "pxa3xx-ssp.3", NULL),
        INIT_CLKREG(&clk_pxa3xx_pwm0, "pxa27x-pwm.0", NULL),
        INIT_CLKREG(&clk_pxa3xx_pwm1, "pxa27x-pwm.1", NULL),
        INIT_CLKREG(&clk_pxa3xx_mmc1, "pxa2xx-mci.0", NULL),
@@ -452,9 +452,9 @@ static struct platform_device *devices[] __initdata = {
        &pxa_device_asoc_platform,
        &sa1100_device_rtc,
        &pxa_device_rtc,
-       &pxa27x_device_ssp1,
-       &pxa27x_device_ssp2,
-       &pxa27x_device_ssp3,
+       &pxa3xx_device_ssp1,
+       &pxa3xx_device_ssp2,
+       &pxa3xx_device_ssp3,
        &pxa3xx_device_ssp4,
        &pxa27x_device_pwm0,
        &pxa27x_device_pwm1,
index efc49dabbf2fc7f4d4da053fd0121363c13e2cc2..21f457b56c016a7c67b4a2e73b42048af197e9ca 100644 (file)
@@ -50,6 +50,11 @@ config ARCH_R7S72100
        bool "RZ/A1H (R7S72100)"
        select SYS_SUPPORTS_SH_MTU2
 
+config ARCH_R8A7740
+       bool "R-Mobile A1 (R8A77400)"
+       select ARCH_RMOBILE
+       select RENESAS_INTC_IRQPIN
+
 config ARCH_R8A7779
        bool "R-Car H1 (R8A77790)"
        select ARCH_RCAR_GEN1
@@ -62,11 +67,11 @@ config ARCH_R8A7791
        bool "R-Car M2-W (R8A77910)"
        select ARCH_RCAR_GEN2
 
-comment "Renesas ARM SoCs Board Type"
+config ARCH_R8A7794
+       bool "R-Car E2 (R8A77940)"
+       select ARCH_RCAR_GEN2
 
-config MACH_GENMAI
-       bool "Genmai board"
-       depends on ARCH_R7S72100
+comment "Renesas ARM SoCs Board Type"
 
 config MACH_KOELSCH
        bool "Koelsch board"
@@ -148,14 +153,6 @@ config ARCH_R8A7791
        select MIGHT_HAVE_PCI
        select ARCH_DMA_ADDR_T_64BIT if ARM_LPAE
 
-config ARCH_R7S72100
-       bool "RZ/A1H (R7S72100)"
-       select ARCH_WANT_OPTIONAL_GPIOLIB
-       select ARM_GIC
-       select CPU_V7
-       select SH_CLK_CPG
-       select SYS_SUPPORTS_SH_MTU2
-
 comment "Renesas ARM SoCs Board Type"
 
 config MACH_APE6EVM
@@ -194,21 +191,6 @@ config MACH_ARMADILLO800EVA
        select SND_SOC_WM8978 if SND_SIMPLE_CARD
        select USE_OF
 
-config MACH_ARMADILLO800EVA_REFERENCE
-       bool "Armadillo-800 EVA board - Reference Device Tree Implementation"
-       depends on ARCH_R8A7740
-       select ARCH_REQUIRE_GPIOLIB
-       select REGULATOR_FIXED_VOLTAGE if REGULATOR
-       select SMSC_PHY if SH_ETH
-       select SND_SOC_WM8978 if SND_SIMPLE_CARD
-       select USE_OF
-       ---help---
-          Use reference implementation of Armadillo800 EVA board support
-          which makes greater use of device tree at the expense
-          of not supporting a number of devices.
-
-          This is intended to aid developers
-
 config MACH_BOCKW
        bool "BOCK-W platform"
        depends on ARCH_R8A7778
@@ -231,11 +213,6 @@ config MACH_BOCKW_REFERENCE
 
           This is intended to aid developers
 
-config MACH_GENMAI
-       bool "Genmai board"
-       depends on ARCH_R7S72100
-       select USE_OF
-
 config MACH_MARZEN
        bool "MARZEN board"
        depends on ARCH_R8A7779
index 7b259ce60bebbbdc912f6f6c937ca48d9c127863..e20f2786ec72a23056e306c4ad8df1e560579288 100644 (file)
@@ -2,8 +2,6 @@
 # Makefile for the linux kernel.
 #
 
-ccflags-$(CONFIG_ARCH_MULTIPLATFORM) := -I$(srctree)/arch/arm/mach-shmobile/include
-
 # Common objects
 obj-y                          := timer.o console.o
 
@@ -16,6 +14,7 @@ obj-$(CONFIG_ARCH_R8A7778)    += setup-r8a7778.o
 obj-$(CONFIG_ARCH_R8A7779)     += setup-r8a7779.o pm-r8a7779.o
 obj-$(CONFIG_ARCH_R8A7790)     += setup-r8a7790.o pm-r8a7790.o
 obj-$(CONFIG_ARCH_R8A7791)     += setup-r8a7791.o pm-r8a7791.o
+obj-$(CONFIG_ARCH_R8A7794)     += setup-r8a7794.o
 obj-$(CONFIG_ARCH_EMEV2)       += setup-emev2.o
 obj-$(CONFIG_ARCH_R7S72100)    += setup-r7s72100.o
 
@@ -30,7 +29,6 @@ obj-$(CONFIG_ARCH_R8A7778)    += clock-r8a7778.o
 obj-$(CONFIG_ARCH_R8A7779)     += clock-r8a7779.o
 obj-$(CONFIG_ARCH_R8A7790)     += clock-r8a7790.o
 obj-$(CONFIG_ARCH_R8A7791)     += clock-r8a7791.o
-obj-$(CONFIG_ARCH_R7S72100)    += clock-r7s72100.o
 endif
 
 # CPU reset vector handling objects
@@ -59,7 +57,6 @@ obj-$(CONFIG_ARCH_SH7372)     += entry-intc.o sleep-sh7372.o
 
 # Board objects
 ifdef CONFIG_ARCH_SHMOBILE_MULTI
-obj-$(CONFIG_MACH_GENMAI)      += board-genmai-reference.o
 obj-$(CONFIG_MACH_KOELSCH)     += board-koelsch-reference.o
 obj-$(CONFIG_MACH_LAGER)       += board-lager-reference.o
 obj-$(CONFIG_MACH_MARZEN)      += board-marzen-reference.o
@@ -69,11 +66,9 @@ obj-$(CONFIG_MACH_APE6EVM_REFERENCE) += board-ape6evm-reference.o
 obj-$(CONFIG_MACH_MACKEREL)    += board-mackerel.o
 obj-$(CONFIG_MACH_BOCKW)       += board-bockw.o
 obj-$(CONFIG_MACH_BOCKW_REFERENCE)     += board-bockw-reference.o
-obj-$(CONFIG_MACH_GENMAI)      += board-genmai.o
 obj-$(CONFIG_MACH_MARZEN)      += board-marzen.o
 obj-$(CONFIG_MACH_LAGER)       += board-lager.o
 obj-$(CONFIG_MACH_ARMADILLO800EVA)     += board-armadillo800eva.o
-obj-$(CONFIG_MACH_ARMADILLO800EVA_REFERENCE)   += board-armadillo800eva-reference.o
 obj-$(CONFIG_MACH_KOELSCH)     += board-koelsch.o
 obj-$(CONFIG_MACH_KZM9G)       += board-kzm9g.o
 obj-$(CONFIG_MACH_KZM9G_REFERENCE)     += board-kzm9g-reference.o
index ebf97d4bcfd88b6931ca25e8e24f8adfc5904ffb..de9a23852fc8caeb8a1173c44339f856deee04e7 100644 (file)
@@ -3,10 +3,8 @@ loadaddr-y     :=
 loadaddr-$(CONFIG_MACH_APE6EVM) += 0x40008000
 loadaddr-$(CONFIG_MACH_APE6EVM_REFERENCE) += 0x40008000
 loadaddr-$(CONFIG_MACH_ARMADILLO800EVA) += 0x40008000
-loadaddr-$(CONFIG_MACH_ARMADILLO800EVA_REFERENCE) += 0x40008000
 loadaddr-$(CONFIG_MACH_BOCKW) += 0x60008000
 loadaddr-$(CONFIG_MACH_BOCKW_REFERENCE) += 0x60008000
-loadaddr-$(CONFIG_MACH_GENMAI) += 0x08008000
 loadaddr-$(CONFIG_MACH_KOELSCH) += 0x40008000
 loadaddr-$(CONFIG_MACH_KZM9G) += 0x41008000
 loadaddr-$(CONFIG_MACH_KZM9G_REFERENCE) += 0x41008000
index 2f7723e5fe91ba1f7adb5e10d38e342277a9fd10..a6503d8c77de07c76288de39d6c4ede94db91090 100644 (file)
@@ -50,7 +50,6 @@ static void __init ape6evm_add_standard_devices(void)
 
        r8a73a4_add_dt_devices();
        of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
-       platform_device_register_simple("cpufreq-cpu0", -1, NULL, 0);
 }
 
 static const char *ape6evm_boards_compat_dt[] __initdata = {
@@ -59,7 +58,8 @@ static const char *ape6evm_boards_compat_dt[] __initdata = {
 };
 
 DT_MACHINE_START(APE6EVM_DT, "ape6evm")
-       .init_early     = r8a73a4_init_early,
+       .init_early     = shmobile_init_delay,
        .init_machine   = ape6evm_add_standard_devices,
+       .init_late      = shmobile_init_late,
        .dt_compat      = ape6evm_boards_compat_dt,
 MACHINE_END
index 1585b8830b13b79a0908050e9a90fbb6489df674..b222f68d55b7251ef2d8da0e2fcd50005fdfdef4 100644 (file)
@@ -283,7 +283,8 @@ static const char *ape6evm_boards_compat_dt[] __initdata = {
 };
 
 DT_MACHINE_START(APE6EVM_DT, "ape6evm")
-       .init_early     = r8a73a4_init_early,
+       .init_early     = shmobile_init_delay,
        .init_machine   = ape6evm_add_standard_devices,
+       .init_late      = shmobile_init_late,
        .dt_compat      = ape6evm_boards_compat_dt,
 MACHINE_END
diff --git a/arch/arm/mach-shmobile/board-armadillo800eva-reference.c b/arch/arm/mach-shmobile/board-armadillo800eva-reference.c
deleted file mode 100644 (file)
index 84bc6cb..0000000
+++ /dev/null
@@ -1,198 +0,0 @@
-/*
- * armadillo 800 eva board support
- *
- * 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/clk.h>
-#include <linux/err.h>
-#include <linux/kernel.h>
-#include <linux/gpio.h>
-#include <linux/io.h>
-
-#include <asm/mach/arch.h>
-#include <asm/hardware/cache-l2x0.h>
-
-#include "common.h"
-#include "r8a7740.h"
-
-/*
- * CON1                Camera Module
- * CON2                Extension Bus
- * CON3                HDMI Output
- * CON4                Composite Video Output
- * CON5                H-UDI JTAG
- * CON6                ARM JTAG
- * CON7                SD1
- * CON8                SD2
- * CON9                RTC BackUp
- * CON10       Monaural Mic Input
- * CON11       Stereo Headphone Output
- * CON12       Audio Line Output(L)
- * CON13       Audio Line Output(R)
- * CON14       AWL13 Module
- * CON15       Extension
- * CON16       LCD1
- * CON17       LCD2
- * CON19       Power Input
- * CON20       USB1
- * CON21       USB2
- * CON22       Serial
- * CON23       LAN
- * CON24       USB3
- * LED1                Camera LED (Yellow)
- * LED2                Power LED (Green)
- * LED3-LED6   User LED (Yellow)
- * LED7                LAN link LED (Green)
- * LED8                LAN activity LED (Yellow)
- */
-
-/*
- * DipSwitch
- *
- *                    SW1
- *
- * -12345678-+---------------+----------------------------
- *  1        | boot          | hermit
- *  0        | boot          | OS auto boot
- * -12345678-+---------------+----------------------------
- *   00      | boot device   | eMMC
- *   10      | boot device   | SDHI0 (CON7)
- *   01      | boot device   | -
- *   11      | boot device   | Extension Buss (CS0)
- * -12345678-+---------------+----------------------------
- *     0     | Extension Bus | D8-D15 disable, eMMC enable
- *     1     | Extension Bus | D8-D15 enable,  eMMC disable
- * -12345678-+---------------+----------------------------
- *      0    | SDHI1         | COM8 disable, COM14 enable
- *      1    | SDHI1         | COM8 enable,  COM14 disable
- * -12345678-+---------------+----------------------------
- *       0   | USB0          | COM20 enable,  COM24 disable
- *       1   | USB0          | COM20 disable, COM24 enable
- * -12345678-+---------------+----------------------------
- *        00 | JTAG          | SH-X2
- *        10 | JTAG          | ARM
- *        01 | JTAG          | -
- *        11 | JTAG          | Boundary Scan
- *-----------+---------------+----------------------------
- */
-
-/*
- * FSI-WM8978
- *
- * this command is required when playback.
- *
- * # amixer set "Headphone" 50
- *
- * this command is required when capture.
- *
- * # amixer set "Input PGA" 15
- * # amixer set "Left Input Mixer MicP" on
- * # amixer set "Left Input Mixer MicN" on
- * # amixer set "Right Input Mixer MicN" on
- * # amixer set "Right Input Mixer MicP" on
- */
-
-/*
- * USB function
- *
- * When you use USB Function,
- * set SW1.6 ON, and connect cable to CN24.
- *
- * USBF needs workaround on R8A7740 chip.
- * These are a little bit complex.
- * see
- *     usbhsf_power_ctrl()
- */
-
-static void __init eva_clock_init(void)
-{
-       struct clk *system      = clk_get(NULL, "system_clk");
-       struct clk *xtal1       = clk_get(NULL, "extal1");
-       struct clk *usb24s      = clk_get(NULL, "usb24s");
-       struct clk *fsibck      = clk_get(NULL, "fsibck");
-
-       if (IS_ERR(system)      ||
-           IS_ERR(xtal1)       ||
-           IS_ERR(usb24s)      ||
-           IS_ERR(fsibck)) {
-               pr_err("armadillo800eva board clock init failed\n");
-               goto clock_error;
-       }
-
-       /* armadillo 800 eva extal1 is 24MHz */
-       clk_set_rate(xtal1, 24000000);
-
-       /* usb24s use extal1 (= system) clock (= 24MHz) */
-       clk_set_parent(usb24s, system);
-
-       /* FSIBCK is 12.288MHz, and it is parent of FSI-B */
-       clk_set_rate(fsibck, 12288000);
-
-clock_error:
-       if (!IS_ERR(system))
-               clk_put(system);
-       if (!IS_ERR(xtal1))
-               clk_put(xtal1);
-       if (!IS_ERR(usb24s))
-               clk_put(usb24s);
-       if (!IS_ERR(fsibck))
-               clk_put(fsibck);
-}
-
-/*
- * board init
- */
-static void __init eva_init(void)
-{
-       r8a7740_clock_init(MD_CK0 | MD_CK2);
-       eva_clock_init();
-
-       r8a7740_meram_workaround();
-
-#ifdef CONFIG_CACHE_L2X0
-       /* Shared attribute override enable, 32K*8way */
-       l2x0_init(IOMEM(0xf0002000), 0x00400000, 0xc20f0fff);
-#endif
-
-       r8a7740_add_standard_devices_dt();
-
-       r8a7740_pm_init();
-}
-
-#define RESCNT2 IOMEM(0xe6188020)
-static void eva_restart(enum reboot_mode mode, const char *cmd)
-{
-       /* Do soft power on reset */
-       writel(1 << 31, RESCNT2);
-}
-
-static const char *eva_boards_compat_dt[] __initdata = {
-       "renesas,armadillo800eva-reference",
-       NULL,
-};
-
-DT_MACHINE_START(ARMADILLO800EVA_DT, "armadillo800eva-reference")
-       .map_io         = r8a7740_map_io,
-       .init_early     = shmobile_init_delay,
-       .init_irq       = r8a7740_init_irq_of,
-       .init_machine   = eva_init,
-       .init_late      = shmobile_init_late,
-       .dt_compat      = eva_boards_compat_dt,
-       .restart        = eva_restart,
-MACHINE_END
index ba840cd333b9d2dd25fbfeff9a723bb3aa14f980..79c47847f2004d5921d3061ff7a73f120a1b4ce3 100644 (file)
@@ -80,8 +80,9 @@ static const char *bockw_boards_compat_dt[] __initdata = {
 };
 
 DT_MACHINE_START(BOCKW_DT, "bockw")
-       .init_early     = r8a7778_init_delay,
+       .init_early     = shmobile_init_delay,
        .init_irq       = r8a7778_init_irq_dt,
        .init_machine   = bockw_init,
+       .init_late      = shmobile_init_late,
        .dt_compat      = bockw_boards_compat_dt,
 MACHINE_END
index 8a83eb39d3f1548ce85bcf3c2dfcea13b5c4e73c..1cf2c75dacfb49b94c5a26c03d6edb15c064baf1 100644 (file)
@@ -733,7 +733,7 @@ static const char *bockw_boards_compat_dt[] __initdata = {
 };
 
 DT_MACHINE_START(BOCKW_DT, "bockw")
-       .init_early     = r8a7778_init_delay,
+       .init_early     = shmobile_init_delay,
        .init_irq       = r8a7778_init_irq_dt,
        .init_machine   = bockw_init,
        .dt_compat      = bockw_boards_compat_dt,
diff --git a/arch/arm/mach-shmobile/board-genmai-reference.c b/arch/arm/mach-shmobile/board-genmai-reference.c
deleted file mode 100644 (file)
index e5448f7..0000000
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Genmai board support
- *
- * Copyright (C) 2013  Renesas Solutions Corp.
- * Copyright (C) 2013  Magnus Damm
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
- */
-
-#include <linux/kernel.h>
-#include <linux/of_platform.h>
-
-#include <asm/mach-types.h>
-#include <asm/mach/arch.h>
-
-#include "clock.h"
-#include "common.h"
-#include "r7s72100.h"
-
-/*
- * This is a really crude hack to provide clkdev support to platform
- * devices until they get moved to DT.
- */
-static const struct clk_name clk_names[] = {
-       { "mtu2", "fck", "sh-mtu2" },
-};
-
-static void __init genmai_add_standard_devices(void)
-{
-       shmobile_clk_workaround(clk_names, ARRAY_SIZE(clk_names), true);
-       r7s72100_add_dt_devices();
-       of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
-}
-
-static const char * const genmai_boards_compat_dt[] __initconst = {
-       "renesas,genmai",
-       NULL,
-};
-
-DT_MACHINE_START(GENMAI_DT, "genmai")
-       .init_early     = shmobile_init_delay,
-       .init_machine   = genmai_add_standard_devices,
-       .dt_compat      = genmai_boards_compat_dt,
-MACHINE_END
diff --git a/arch/arm/mach-shmobile/board-genmai.c b/arch/arm/mach-shmobile/board-genmai.c
deleted file mode 100644 (file)
index 7bf2d80..0000000
+++ /dev/null
@@ -1,161 +0,0 @@
-/*
- * Genmai board support
- *
- * Copyright (C) 2013-2014  Renesas Solutions Corp.
- * Copyright (C) 2013  Magnus Damm
- * Copyright (C) 2014  Cogent Embedded, Inc.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
- */
-
-#include <linux/kernel.h>
-#include <linux/platform_device.h>
-#include <linux/serial_sci.h>
-#include <linux/sh_eth.h>
-#include <linux/spi/rspi.h>
-#include <linux/spi/spi.h>
-
-#include <asm/mach-types.h>
-#include <asm/mach/arch.h>
-
-#include "common.h"
-#include "irqs.h"
-#include "r7s72100.h"
-
-/* Ether */
-static const struct sh_eth_plat_data ether_pdata __initconst = {
-       .phy                    = 0x00, /* PD60610 */
-       .edmac_endian           = EDMAC_LITTLE_ENDIAN,
-       .phy_interface          = PHY_INTERFACE_MODE_MII,
-       .no_ether_link          = 1
-};
-
-static const struct resource ether_resources[] __initconst = {
-       DEFINE_RES_MEM(0xe8203000, 0x800),
-       DEFINE_RES_MEM(0xe8204800, 0x200),
-       DEFINE_RES_IRQ(gic_iid(359)),
-};
-
-static const struct platform_device_info ether_info __initconst = {
-       .name           = "r7s72100-ether",
-       .id             = -1,
-       .res            = ether_resources,
-       .num_res        = ARRAY_SIZE(ether_resources),
-       .data           = &ether_pdata,
-       .size_data      = sizeof(ether_pdata),
-       .dma_mask       = DMA_BIT_MASK(32),
-};
-
-/* RSPI */
-#define RSPI_RESOURCE(idx, baseaddr, irq)                              \
-static const struct resource rspi##idx##_resources[] __initconst = {   \
-       DEFINE_RES_MEM(baseaddr, 0x24),                                 \
-       DEFINE_RES_IRQ_NAMED(irq, "error"),                             \
-       DEFINE_RES_IRQ_NAMED(irq + 1, "rx"),                            \
-       DEFINE_RES_IRQ_NAMED(irq + 2, "tx"),                            \
-}
-
-RSPI_RESOURCE(0, 0xe800c800, gic_iid(270));
-RSPI_RESOURCE(1, 0xe800d000, gic_iid(273));
-RSPI_RESOURCE(2, 0xe800d800, gic_iid(276));
-RSPI_RESOURCE(3, 0xe800e000, gic_iid(279));
-RSPI_RESOURCE(4, 0xe800e800, gic_iid(282));
-
-static const struct rspi_plat_data rspi_pdata __initconst = {
-       .num_chipselect = 1,
-};
-
-#define r7s72100_register_rspi(idx)                                       \
-       platform_device_register_resndata(NULL, "rspi-rz", idx,            \
-                                       rspi##idx##_resources,             \
-                                       ARRAY_SIZE(rspi##idx##_resources), \
-                                       &rspi_pdata, sizeof(rspi_pdata))
-
-static const struct spi_board_info spi_info[] __initconst = {
-       {
-               .modalias               = "wm8978",
-               .max_speed_hz           = 5000000,
-               .bus_num                = 4,
-               .chip_select            = 0,
-       },
-};
-
-/* SCIF */
-#define R7S72100_SCIF(index, baseaddr, irq)                            \
-static const struct plat_sci_port scif##index##_platform_data = {      \
-       .type           = PORT_SCIF,                                    \
-       .regtype        = SCIx_SH2_SCIF_FIFODATA_REGTYPE,               \
-       .flags          = UPF_BOOT_AUTOCONF | UPF_IOREMAP,              \
-       .scscr          = SCSCR_RIE | SCSCR_TIE | SCSCR_RE | SCSCR_TE | \
-                         SCSCR_REIE,                                   \
-};                                                                     \
-                                                                       \
-static struct resource scif##index##_resources[] = {                   \
-       DEFINE_RES_MEM(baseaddr, 0x100),                                \
-       DEFINE_RES_IRQ(irq + 1),                                        \
-       DEFINE_RES_IRQ(irq + 2),                                        \
-       DEFINE_RES_IRQ(irq + 3),                                        \
-       DEFINE_RES_IRQ(irq),                                            \
-}                                                                      \
-
-R7S72100_SCIF(0, 0xe8007000, gic_iid(221));
-R7S72100_SCIF(1, 0xe8007800, gic_iid(225));
-R7S72100_SCIF(2, 0xe8008000, gic_iid(229));
-R7S72100_SCIF(3, 0xe8008800, gic_iid(233));
-R7S72100_SCIF(4, 0xe8009000, gic_iid(237));
-R7S72100_SCIF(5, 0xe8009800, gic_iid(241));
-R7S72100_SCIF(6, 0xe800a000, gic_iid(245));
-R7S72100_SCIF(7, 0xe800a800, gic_iid(249));
-
-#define r7s72100_register_scif(index)                                         \
-       platform_device_register_resndata(NULL, "sh-sci", index,               \
-                                         scif##index##_resources,             \
-                                         ARRAY_SIZE(scif##index##_resources), \
-                                         &scif##index##_platform_data,        \
-                                         sizeof(scif##index##_platform_data))
-
-static void __init genmai_add_standard_devices(void)
-{
-       r7s72100_clock_init();
-       r7s72100_add_dt_devices();
-
-       platform_device_register_full(&ether_info);
-
-       r7s72100_register_rspi(0);
-       r7s72100_register_rspi(1);
-       r7s72100_register_rspi(2);
-       r7s72100_register_rspi(3);
-       r7s72100_register_rspi(4);
-       spi_register_board_info(spi_info, ARRAY_SIZE(spi_info));
-
-       r7s72100_register_scif(0);
-       r7s72100_register_scif(1);
-       r7s72100_register_scif(2);
-       r7s72100_register_scif(3);
-       r7s72100_register_scif(4);
-       r7s72100_register_scif(5);
-       r7s72100_register_scif(6);
-       r7s72100_register_scif(7);
-}
-
-static const char * const genmai_boards_compat_dt[] __initconst = {
-       "renesas,genmai",
-       NULL,
-};
-
-DT_MACHINE_START(GENMAI_DT, "genmai")
-       .init_early     = shmobile_init_delay,
-       .init_machine   = genmai_add_standard_devices,
-       .dt_compat      = genmai_boards_compat_dt,
-MACHINE_END
index 3ff88c138896ad996652df6aec110355ac7f30cf..9db5e6774fb75753d3a8199301d75887132f5640 100644 (file)
@@ -88,7 +88,6 @@ static void __init koelsch_add_du_device(void)
  * devices until they get moved to DT.
  */
 static const struct clk_name clk_names[] __initconst = {
-       { "cmt0", "fck", "sh-cmt-48-gen2.0" },
        { "du0", "du.0", "rcar-du-r8a7791" },
        { "du1", "du.1", "rcar-du-r8a7791" },
        { "lvds0", "lvds.0", "rcar-du-r8a7791" },
@@ -97,7 +96,6 @@ static const struct clk_name clk_names[] __initconst = {
 static void __init koelsch_add_standard_devices(void)
 {
        shmobile_clk_workaround(clk_names, ARRAY_SIZE(clk_names), false);
-       r8a7791_add_dt_devices();
        of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
 
        koelsch_add_du_device();
index 5d2621f202d1b483a6ed530f8adc22a487a6db1a..d9cdf9a97e2390b4f63cb4b22b11246b2088bea6 100644 (file)
@@ -51,8 +51,8 @@ static const char *kzm9g_boards_compat_dt[] __initdata = {
 DT_MACHINE_START(KZM9G_DT, "kzm9g-reference")
        .smp            = smp_ops(sh73a0_smp_ops),
        .map_io         = sh73a0_map_io,
-       .init_early     = sh73a0_init_delay,
-       .nr_irqs        = NR_IRQS_LEGACY,
+       .init_early     = shmobile_init_delay,
        .init_machine   = kzm_init,
+       .init_late      = shmobile_init_late,
        .dt_compat      = kzm9g_boards_compat_dt,
 MACHINE_END
index f8bc7f8f86ad262ab8229eb7a246fb2126b5f3f2..77e36fa0b14216bb644149b2969267961ae43367 100644 (file)
@@ -50,6 +50,7 @@
 #include <video/sh_mobile_lcdc.h>
 
 #include "common.h"
+#include "intc.h"
 #include "irqs.h"
 #include "sh73a0.h"
 
@@ -910,7 +911,6 @@ DT_MACHINE_START(KZM9G_DT, "kzm9g")
        .smp            = smp_ops(sh73a0_smp_ops),
        .map_io         = sh73a0_map_io,
        .init_early     = sh73a0_add_early_devices,
-       .nr_irqs        = NR_IRQS_LEGACY,
        .init_irq       = sh73a0_init_irq,
        .init_machine   = kzm_init,
        .init_late      = shmobile_init_late,
index 41c808e5600563570bd35f87a54bea990934279d..2a05c02bec3965f4f1dc4493b5d7fdaea40af275 100644 (file)
@@ -92,7 +92,6 @@ static void __init lager_add_du_device(void)
  * devices until they get moved to DT.
  */
 static const struct clk_name clk_names[] __initconst = {
-       { "cmt0", "fck", "sh-cmt-48-gen2.0" },
        { "du0", "du.0", "rcar-du-r8a7790" },
        { "du1", "du.1", "rcar-du-r8a7790" },
        { "du2", "du.2", "rcar-du-r8a7790" },
@@ -103,7 +102,6 @@ static const struct clk_name clk_names[] __initconst = {
 static void __init lager_add_standard_devices(void)
 {
        shmobile_clk_workaround(clk_names, ARRAY_SIZE(clk_names), false);
-       r8a7790_add_dt_devices();
        of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
 
        lager_add_du_device();
index d47b2623267b971d55726b1e97fc7e85f9b0f79f..ca5d34b92aa7fc8e70d55cf4e6c2cf31aa103e13 100644 (file)
@@ -63,6 +63,7 @@
 #include <asm/mach-types.h>
 
 #include "common.h"
+#include "intc.h"
 #include "irqs.h"
 #include "pm-rmobile.h"
 #include "sh-gpio.h"
index 21b3e1ca226159e7a87e5ddd71565a7278dd2db6..38d9cdd26587ebf3c843ea25d09d26674b9430c4 100644 (file)
@@ -37,18 +37,8 @@ static void __init marzen_init_timer(void)
        clocksource_of_init();
 }
 
-/*
- * This is a really crude hack to provide clkdev support to platform
- * devices until they get moved to DT.
- */
-static const struct clk_name clk_names[] __initconst = {
-       { "tmu0", "fck", "sh-tmu.0" },
-};
-
 static void __init marzen_init(void)
 {
-       shmobile_clk_workaround(clk_names, ARRAY_SIZE(clk_names), false);
-       r8a7779_add_standard_devices_dt();
        of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
        r8a7779_init_irq_extpin_dt(1); /* IRQ1 as individual interrupt */
 }
@@ -64,8 +54,8 @@ DT_MACHINE_START(MARZEN, "marzen")
        .map_io         = r8a7779_map_io,
        .init_early     = shmobile_init_delay,
        .init_time      = marzen_init_timer,
-       .nr_irqs        = NR_IRQS_LEGACY,
        .init_irq       = r8a7779_init_irq_dt,
        .init_machine   = marzen_init,
+       .init_late      = shmobile_init_late,
        .dt_compat      = marzen_boards_compat_dt,
 MACHINE_END
diff --git a/arch/arm/mach-shmobile/clock-r7s72100.c b/arch/arm/mach-shmobile/clock-r7s72100.c
deleted file mode 100644 (file)
index 3eb2ec4..0000000
+++ /dev/null
@@ -1,231 +0,0 @@
-/*
- * r7a72100 clock framework support
- *
- * Copyright (C) 2013  Renesas Solutions Corp.
- * Copyright (C) 2012  Phil Edworthy
- * 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/init.h>
-#include <linux/kernel.h>
-#include <linux/io.h>
-#include <linux/sh_clk.h>
-#include <linux/clkdev.h>
-
-#include "common.h"
-#include "r7s72100.h"
-
-/* Frequency Control Registers */
-#define FRQCR          0xfcfe0010
-#define FRQCR2         0xfcfe0014
-/* Standby Control Registers */
-#define STBCR3         0xfcfe0420
-#define STBCR4         0xfcfe0424
-#define STBCR7         0xfcfe0430
-#define STBCR9         0xfcfe0438
-#define STBCR10                0xfcfe043c
-
-#define PLL_RATE 30
-
-static struct clk_mapping cpg_mapping = {
-       .phys   = 0xfcfe0000,
-       .len    = 0x1000,
-};
-
-/* Fixed 32 KHz root clock for RTC */
-static struct clk r_clk = {
-       .rate           = 32768,
-};
-
-/*
- * Default rate for the root input clock, reset this with clk_set_rate()
- * from the platform code.
- */
-static struct clk extal_clk = {
-       .rate           = 13330000,
-       .mapping        = &cpg_mapping,
-};
-
-static unsigned long pll_recalc(struct clk *clk)
-{
-       return clk->parent->rate * PLL_RATE;
-}
-
-static struct sh_clk_ops pll_clk_ops = {
-       .recalc         = pll_recalc,
-};
-
-static struct clk pll_clk = {
-       .ops            = &pll_clk_ops,
-       .parent         = &extal_clk,
-       .flags          = CLK_ENABLE_ON_INIT,
-};
-
-static unsigned long bus_recalc(struct clk *clk)
-{
-       return clk->parent->rate / 3;
-}
-
-static struct sh_clk_ops bus_clk_ops = {
-       .recalc         = bus_recalc,
-};
-
-static struct clk bus_clk = {
-       .ops            = &bus_clk_ops,
-       .parent         = &pll_clk,
-       .flags          = CLK_ENABLE_ON_INIT,
-};
-
-static unsigned long peripheral0_recalc(struct clk *clk)
-{
-       return clk->parent->rate / 12;
-}
-
-static struct sh_clk_ops peripheral0_clk_ops = {
-       .recalc         = peripheral0_recalc,
-};
-
-static struct clk peripheral0_clk = {
-       .ops            = &peripheral0_clk_ops,
-       .parent         = &pll_clk,
-       .flags          = CLK_ENABLE_ON_INIT,
-};
-
-static unsigned long peripheral1_recalc(struct clk *clk)
-{
-       return clk->parent->rate / 6;
-}
-
-static struct sh_clk_ops peripheral1_clk_ops = {
-       .recalc         = peripheral1_recalc,
-};
-
-static struct clk peripheral1_clk = {
-       .ops            = &peripheral1_clk_ops,
-       .parent         = &pll_clk,
-       .flags          = CLK_ENABLE_ON_INIT,
-};
-
-struct clk *main_clks[] = {
-       &r_clk,
-       &extal_clk,
-       &pll_clk,
-       &bus_clk,
-       &peripheral0_clk,
-       &peripheral1_clk,
-};
-
-static int div2[] = { 1, 3, 0, 3 }; /* 1, 2/3, reserve, 1/3 */
-static int multipliers[] = { 1, 2, 1, 1 };
-
-static struct clk_div_mult_table div4_div_mult_table = {
-       .divisors = div2,
-       .nr_divisors = ARRAY_SIZE(div2),
-       .multipliers = multipliers,
-       .nr_multipliers = ARRAY_SIZE(multipliers),
-};
-
-static struct clk_div4_table div4_table = {
-       .div_mult_table = &div4_div_mult_table,
-};
-
-enum { DIV4_I,
-       DIV4_NR };
-
-#define DIV4(_reg, _bit, _mask, _flags) \
-       SH_CLK_DIV4(&pll_clk, _reg, _bit, _mask, _flags)
-
-/* The mask field specifies the div2 entries that are valid */
-struct clk div4_clks[DIV4_NR] = {
-       [DIV4_I]  = DIV4(FRQCR, 8, 0xB, CLK_ENABLE_REG_16BIT
-                                       | CLK_ENABLE_ON_INIT),
-};
-
-enum {
-       MSTP107, MSTP106, MSTP105, MSTP104, MSTP103,
-       MSTP97, MSTP96, MSTP95, MSTP94,
-       MSTP74,
-       MSTP47, MSTP46, MSTP45, MSTP44, MSTP43, MSTP42, MSTP41, MSTP40,
-       MSTP33, MSTP_NR
-};
-
-static struct clk mstp_clks[MSTP_NR] = {
-       [MSTP107] = SH_CLK_MSTP8(&peripheral1_clk, STBCR10, 7, 0), /* RSPI0 */
-       [MSTP106] = SH_CLK_MSTP8(&peripheral1_clk, STBCR10, 6, 0), /* RSPI1 */
-       [MSTP105] = SH_CLK_MSTP8(&peripheral1_clk, STBCR10, 5, 0), /* RSPI2 */
-       [MSTP104] = SH_CLK_MSTP8(&peripheral1_clk, STBCR10, 4, 0), /* RSPI3 */
-       [MSTP103] = SH_CLK_MSTP8(&peripheral1_clk, STBCR10, 3, 0), /* RSPI4 */
-       [MSTP97] = SH_CLK_MSTP8(&peripheral0_clk, STBCR9, 7, 0), /* RIIC0 */
-       [MSTP96] = SH_CLK_MSTP8(&peripheral0_clk, STBCR9, 6, 0), /* RIIC1 */
-       [MSTP95] = SH_CLK_MSTP8(&peripheral0_clk, STBCR9, 5, 0), /* RIIC2 */
-       [MSTP94] = SH_CLK_MSTP8(&peripheral0_clk, STBCR9, 4, 0), /* RIIC3 */
-       [MSTP74] = SH_CLK_MSTP8(&peripheral1_clk, STBCR7, 4, 0), /* Ether */
-       [MSTP47] = SH_CLK_MSTP8(&peripheral1_clk, STBCR4, 7, 0), /* SCIF0 */
-       [MSTP46] = SH_CLK_MSTP8(&peripheral1_clk, STBCR4, 6, 0), /* SCIF1 */
-       [MSTP45] = SH_CLK_MSTP8(&peripheral1_clk, STBCR4, 5, 0), /* SCIF2 */
-       [MSTP44] = SH_CLK_MSTP8(&peripheral1_clk, STBCR4, 4, 0), /* SCIF3 */
-       [MSTP43] = SH_CLK_MSTP8(&peripheral1_clk, STBCR4, 3, 0), /* SCIF4 */
-       [MSTP42] = SH_CLK_MSTP8(&peripheral1_clk, STBCR4, 2, 0), /* SCIF5 */
-       [MSTP41] = SH_CLK_MSTP8(&peripheral1_clk, STBCR4, 1, 0), /* SCIF6 */
-       [MSTP40] = SH_CLK_MSTP8(&peripheral1_clk, STBCR4, 0, 0), /* SCIF7 */
-       [MSTP33] = SH_CLK_MSTP8(&peripheral0_clk, STBCR3, 3, 0), /* MTU2 */
-};
-
-static struct clk_lookup lookups[] = {
-       /* main clocks */
-       CLKDEV_CON_ID("rclk", &r_clk),
-       CLKDEV_CON_ID("extal", &extal_clk),
-       CLKDEV_CON_ID("pll_clk", &pll_clk),
-       CLKDEV_CON_ID("peripheral_clk", &peripheral1_clk),
-
-       /* DIV4 clocks */
-       CLKDEV_CON_ID("cpu_clk", &div4_clks[DIV4_I]),
-
-       /* MSTP clocks */
-       CLKDEV_DEV_ID("rspi-rz.0", &mstp_clks[MSTP107]),
-       CLKDEV_DEV_ID("rspi-rz.1", &mstp_clks[MSTP106]),
-       CLKDEV_DEV_ID("rspi-rz.2", &mstp_clks[MSTP105]),
-       CLKDEV_DEV_ID("rspi-rz.3", &mstp_clks[MSTP104]),
-       CLKDEV_DEV_ID("rspi-rz.4", &mstp_clks[MSTP103]),
-       CLKDEV_DEV_ID("r7s72100-ether", &mstp_clks[MSTP74]),
-
-       /* ICK */
-       CLKDEV_ICK_ID("sci_fck", "sh-sci.0", &mstp_clks[MSTP47]),
-       CLKDEV_ICK_ID("sci_fck", "sh-sci.1", &mstp_clks[MSTP46]),
-       CLKDEV_ICK_ID("sci_fck", "sh-sci.2", &mstp_clks[MSTP45]),
-       CLKDEV_ICK_ID("sci_fck", "sh-sci.3", &mstp_clks[MSTP44]),
-       CLKDEV_ICK_ID("sci_fck", "sh-sci.4", &mstp_clks[MSTP43]),
-       CLKDEV_ICK_ID("sci_fck", "sh-sci.5", &mstp_clks[MSTP42]),
-       CLKDEV_ICK_ID("sci_fck", "sh-sci.6", &mstp_clks[MSTP41]),
-       CLKDEV_ICK_ID("sci_fck", "sh-sci.7", &mstp_clks[MSTP40]),
-       CLKDEV_ICK_ID("fck", "sh-mtu2", &mstp_clks[MSTP33]),
-};
-
-void __init r7s72100_clock_init(void)
-{
-       int k, ret = 0;
-
-       for (k = 0; !ret && (k < ARRAY_SIZE(main_clks)); k++)
-               ret = clk_register(main_clks[k]);
-
-       clkdev_add_table(lookups, ARRAY_SIZE(lookups));
-
-       if (!ret)
-               ret = sh_clk_div4_register(div4_clks, DIV4_NR, &div4_table);
-
-       if (!ret)
-               ret = sh_clk_mstp_register(mstp_clks, MSTP_NR);
-
-       if (!ret)
-               shmobile_clk_init();
-       else
-               panic("failed to setup rza1 clocks\n");
-}
index 98056081f0da574e00aaf51a033c167f75509273..72087c79ad7b9087b99acbc6c188ba107ab2a5d1 100644 (file)
@@ -2,8 +2,6 @@
 #define __ARCH_MACH_COMMON_H
 
 extern void shmobile_earlytimer_init(void);
-extern void shmobile_setup_delay(unsigned int max_cpu_core_mhz,
-                        unsigned int mult, unsigned int div);
 extern void shmobile_init_delay(void);
 struct twd_local_timer;
 extern void shmobile_setup_console(void);
index 97c40bd9b94fabb5f4635586a70d50e6f22369bd..52a2f66e600f29953e3486bbe985c0e01d322d96 100644 (file)
@@ -52,8 +52,8 @@ static const unsigned int dma_ts_shift[] = {
        ((((i) & TS_LOW_BIT) << TS_LOW_SHIFT) |\
         (((i) & TS_HI_BIT)  << TS_HI_SHIFT))
 
-#define CHCR_TX(xmit_sz) (DM_FIX | SM_INC | 0x800 | TS_INDEX2VAL((xmit_sz)))
-#define CHCR_RX(xmit_sz) (DM_INC | SM_FIX | 0x800 | TS_INDEX2VAL((xmit_sz)))
+#define CHCR_TX(xmit_sz) (DM_FIX | SM_INC | RS_ERS | TS_INDEX2VAL((xmit_sz)))
+#define CHCR_RX(xmit_sz) (DM_INC | SM_FIX | RS_ERS | TS_INDEX2VAL((xmit_sz)))
 
 
 /*
index a5603c76cfe0bcc99a502ad3c5ab4e5ab2b951d8..40b2ad4ca5b4f1bbb912ad977caea31912bfdc7b 100644 (file)
@@ -287,4 +287,9 @@ static struct intc_desc p ## _desc __initdata = {                   \
                             p ## _sense_registers, NULL),              \
 }
 
+/* INTCS */
+#define INTCS_VECT_BASE                0x3400
+#define INTCS_VECT(n, vect)    INTC_VECT((n), INTCS_VECT_BASE + (vect))
+#define intcs_evt2irq(evt)     evt2irq(INTCS_VECT_BASE + (evt))
+
 #endif  /* __ASM_MACH_INTC_H */
index 4ff2d2aa94f0919cca87ae5fe9671faa23761815..3070f6d887ebdf52b3cd7d7162fc1f53947b1b66 100644 (file)
@@ -1,18 +1,12 @@
 #ifndef __SHMOBILE_IRQS_H
 #define __SHMOBILE_IRQS_H
 
-#include <linux/sh_intc.h>
-#include <mach/irqs.h>
+#include "include/mach/irqs.h"
 
 /* GIC */
 #define gic_spi(nr)            ((nr) + 32)
 #define gic_iid(nr)            (nr) /* ICCIAR / interrupt ID */
 
-/* INTCS */
-#define INTCS_VECT_BASE                0x3400
-#define INTCS_VECT(n, vect)    INTC_VECT((n), INTCS_VECT_BASE + (vect))
-#define intcs_evt2irq(evt)     evt2irq(INTCS_VECT_BASE + (evt))
-
 /* GPIO IRQ */
 #define _GPIO_IRQ_BASE         2500
 #define GPIO_IRQ_BASE(x)       (_GPIO_IRQ_BASE + (32 * x))
index 3d507149a6c423bc588c129d70f21610b9d2f4ae..e3f1464482371bb4dd2c07e7b40ab8f8724eeccc 100644 (file)
 #include "common.h"
 #include "pm-rmobile.h"
 
-#ifdef CONFIG_PM
+#if defined(CONFIG_PM) && !defined(CONFIG_ARCH_MULTIPLATFORM)
 static int r8a7740_pd_a4s_suspend(void)
 {
        /*
         * The A4S domain contains the CPU core and therefore it should
-        * only be turned off if the CPU is in use.
+        * only be turned off if the CPU is not in use.
         */
        return -EBUSY;
 }
@@ -56,8 +56,7 @@ void __init r8a7740_init_pm_domains(void)
        rmobile_init_domains(r8a7740_pm_domains, ARRAY_SIZE(r8a7740_pm_domains));
        pm_genpd_add_subdomain_names("A4S", "A3SP");
 }
-
-#endif /* CONFIG_PM */
+#endif /* CONFIG_PM && !CONFIG_ARCH_MULTIPLATFORM */
 
 #ifdef CONFIG_SUSPEND
 static int r8a7740_enter_suspend(suspend_state_t suspend_state)
diff --git a/arch/arm/mach-shmobile/r7s72100.h b/arch/arm/mach-shmobile/r7s72100.h
deleted file mode 100644 (file)
index efb723c..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-#ifndef __ASM_R7S72100_H__
-#define __ASM_R7S72100_H__
-
-void r7s72100_add_dt_devices(void);
-void r7s72100_clock_init(void);
-
-#endif /* __ASM_R7S72100_H__ */
index ce8bdd1d8a8a029616bb4b5929c55ba1f8726f8f..5fafd6fcedf790c45564b0c731f4b317a5dba659 100644 (file)
@@ -14,6 +14,5 @@ void r8a73a4_add_standard_devices(void);
 void r8a73a4_add_dt_devices(void);
 void r8a73a4_clock_init(void);
 void r8a73a4_pinmux_init(void);
-void r8a73a4_init_early(void);
 
 #endif /* __ASM_R8A73A4_H__ */
index 1d1a5fd78b6bc68b1f063d051fcdbebe3c3fc5e4..f369b4b0863d0bb38a2705e7c2fc12e83438c340 100644 (file)
@@ -49,15 +49,14 @@ extern void r8a7740_init_irq_of(void);
 extern void r8a7740_map_io(void);
 extern void r8a7740_add_early_devices(void);
 extern void r8a7740_add_standard_devices(void);
-extern void r8a7740_add_standard_devices_dt(void);
 extern void r8a7740_clock_init(u8 md_ck);
 extern void r8a7740_pinmux_init(void);
 extern void r8a7740_pm_init(void);
 
-#ifdef CONFIG_PM
+#if defined(CONFIG_PM) && !defined(CONFIG_ARCH_MULTIPLATFORM)
 extern void __init r8a7740_init_pm_domains(void);
 #else
 static inline void r8a7740_init_pm_domains(void) {}
-#endif /* CONFIG_PM */
+#endif /* CONFIG_PM && !CONFIG_ARCH_MULTIPLATFORM */
 
 #endif /* __ASM_R8A7740_H__ */
index 5415c719dc193cc5ae8b5ae6ce666f9024216c2a..19f97046dd708b2491b5d351cb372167ed5c93b6 100644 (file)
@@ -17,7 +17,6 @@ extern void r8a7779_map_io(void);
 extern void r8a7779_earlytimer_init(void);
 extern void r8a7779_add_early_devices(void);
 extern void r8a7779_add_standard_devices(void);
-extern void r8a7779_add_standard_devices_dt(void);
 extern void r8a7779_init_late(void);
 extern u32 r8a7779_read_mode_pins(void);
 extern void r8a7779_clock_init(void);
index 459827f1369ba180c2b919b085e59ac5979e2e0c..388f0514d931f97378cb15ac40ea88231fe95105 100644 (file)
@@ -27,7 +27,6 @@ enum {
 };
 
 void r8a7790_add_standard_devices(void);
-void r8a7790_add_dt_devices(void);
 void r8a7790_clock_init(void);
 void r8a7790_pinmux_init(void);
 void r8a7790_pm_init(void);
index 86eae7bceb6fcdfb4b5b4b419d784647ceebba47..c1bf7abefa5a6b0b2a0bdb72999e501afbc42f7e 100644 (file)
@@ -2,7 +2,6 @@
 #define __ASM_R8A7791_H__
 
 void r8a7791_add_standard_devices(void);
-void r8a7791_add_dt_devices(void);
 void r8a7791_clock_init(void);
 void r8a7791_pinmux_init(void);
 void r8a7791_pm_init(void);
index f3b3b14ba9726ffe7a0a45cc4c0c6208a318878a..4122104359f98d909ae03a923256b479972ff3e0 100644 (file)
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  */
 
-#include <linux/irq.h>
 #include <linux/kernel.h>
-#include <linux/of_platform.h>
-#include <linux/sh_timer.h>
 
 #include <asm/mach/arch.h>
 
 #include "common.h"
-#include "irqs.h"
-#include "r7s72100.h"
 
-static struct resource mtu2_resources[] __initdata = {
-       DEFINE_RES_MEM(0xfcff0000, 0x400),
-       DEFINE_RES_IRQ_NAMED(gic_iid(139), "tgi0a"),
-};
-
-#define r7s72100_register_mtu2()                                       \
-       platform_device_register_resndata(NULL, "sh-mtu2",              \
-                                         -1, mtu2_resources,           \
-                                         ARRAY_SIZE(mtu2_resources),   \
-                                         NULL, 0)
-
-void __init r7s72100_add_dt_devices(void)
-{
-       r7s72100_register_mtu2();
-}
-
-#ifdef CONFIG_USE_OF
 static const char *r7s72100_boards_compat_dt[] __initdata = {
        "renesas,r7s72100",
        NULL,
@@ -53,6 +31,6 @@ static const char *r7s72100_boards_compat_dt[] __initdata = {
 
 DT_MACHINE_START(R7S72100_DT, "Generic R7S72100 (Flattened Device Tree)")
        .init_early     = shmobile_init_delay,
+       .init_late      = shmobile_init_late,
        .dt_compat      = r7s72100_boards_compat_dt,
 MACHINE_END
-#endif /* CONFIG_USE_OF */
index 6683072a9d982777e0ae2b439e57dfdd177d8671..53f40b70680de9087fa90c0e61ae2711ac8a0fc7 100644 (file)
@@ -295,13 +295,6 @@ void __init r8a73a4_add_standard_devices(void)
        r8a73a4_register_dmac();
 }
 
-void __init r8a73a4_init_early(void)
-{
-#ifndef CONFIG_ARM_ARCH_TIMER
-       shmobile_setup_delay(1500, 2, 4); /* Cortex-A15 @ 1500MHz */
-#endif
-}
-
 #ifdef CONFIG_USE_OF
 
 static const char *r8a73a4_boards_compat_dt[] __initdata = {
@@ -310,7 +303,8 @@ static const char *r8a73a4_boards_compat_dt[] __initdata = {
 };
 
 DT_MACHINE_START(R8A73A4_DT, "Generic R8A73A4 (Flattened Device Tree)")
-       .init_early     = r8a73a4_init_early,
+       .init_early     = shmobile_init_delay,
+       .init_late      = shmobile_init_late,
        .dt_compat      = r8a73a4_boards_compat_dt,
 MACHINE_END
 #endif /* CONFIG_USE_OF */
index 30df532fcaa02b2be8b455423e08828f8db5a2d6..8894e1b7ab0e65bbf66975ac36ca9b2b5917604f 100644 (file)
@@ -36,6 +36,7 @@
 #include <asm/mach/map.h>
 #include <asm/mach/arch.h>
 #include <asm/mach/time.h>
+#include <asm/hardware/cache-l2x0.h>
 
 #include "common.h"
 #include "dma-register.h"
@@ -311,10 +312,6 @@ static struct platform_device ipmmu_device = {
        .num_resources  = ARRAY_SIZE(ipmmu_resources),
 };
 
-static struct platform_device *r8a7740_devices_dt[] __initdata = {
-       &cmt1_device,
-};
-
 static struct platform_device *r8a7740_early_devices[] __initdata = {
        &scif0_device,
        &scif1_device,
@@ -331,6 +328,7 @@ static struct platform_device *r8a7740_early_devices[] __initdata = {
        &irqpin3_device,
        &tmu0_device,
        &ipmmu_device,
+       &cmt1_device,
 };
 
 /* DMA */
@@ -769,8 +767,6 @@ void __init r8a7740_add_standard_devices(void)
        /* add devices */
        platform_add_devices(r8a7740_early_devices,
                            ARRAY_SIZE(r8a7740_early_devices));
-       platform_add_devices(r8a7740_devices_dt,
-                           ARRAY_SIZE(r8a7740_devices_dt));
        platform_add_devices(r8a7740_late_devices,
                             ARRAY_SIZE(r8a7740_late_devices));
 
@@ -783,8 +779,6 @@ void __init r8a7740_add_early_devices(void)
 {
        early_platform_add_devices(r8a7740_early_devices,
                                   ARRAY_SIZE(r8a7740_early_devices));
-       early_platform_add_devices(r8a7740_devices_dt,
-                                  ARRAY_SIZE(r8a7740_devices_dt));
 
        /* setup early console here as well */
        shmobile_setup_console();
@@ -792,13 +786,6 @@ void __init r8a7740_add_early_devices(void)
 
 #ifdef CONFIG_USE_OF
 
-void __init r8a7740_add_standard_devices_dt(void)
-{
-       platform_add_devices(r8a7740_devices_dt,
-                           ARRAY_SIZE(r8a7740_devices_dt));
-       of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
-}
-
 void __init r8a7740_init_irq_of(void)
 {
        void __iomem *intc_prio_base = ioremap_nocache(0xe6900010, 0x10);
@@ -831,8 +818,20 @@ void __init r8a7740_init_irq_of(void)
 
 static void __init r8a7740_generic_init(void)
 {
-       r8a7740_clock_init(0);
-       r8a7740_add_standard_devices_dt();
+       r8a7740_meram_workaround();
+
+#ifdef CONFIG_CACHE_L2X0
+       /* Shared attribute override enable, 32K*8way */
+       l2x0_init(IOMEM(0xf0002000), 0x00400000, 0xc20f0fff);
+#endif
+       of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
+}
+
+#define RESCNT2 IOMEM(0xe6188020)
+static void r8a7740_restart(enum reboot_mode mode, const char *cmd)
+{
+       /* Do soft power on reset */
+       writel(1 << 31, RESCNT2);
 }
 
 static const char *r8a7740_boards_compat_dt[] __initdata = {
@@ -847,6 +846,7 @@ DT_MACHINE_START(R8A7740_DT, "Generic R8A7740 (Flattened Device Tree)")
        .init_machine   = r8a7740_generic_init,
        .init_late      = shmobile_init_late,
        .dt_compat      = r8a7740_boards_compat_dt,
+       .restart        = r8a7740_restart,
 MACHINE_END
 
 #endif /* CONFIG_USE_OF */
index f00a488dcf4385345331ff54efd332dce29354cf..85fe016d6a872a6233effacc6118f2195d8cdbc8 100644 (file)
@@ -520,6 +520,7 @@ void __init r8a7778_add_standard_devices(void)
 
 void __init r8a7778_init_late(void)
 {
+       shmobile_init_late();
        platform_device_register_full(&ehci_info);
        platform_device_register_full(&ohci_info);
 }
@@ -573,7 +574,7 @@ void __init r8a7778_init_irq_extpin(int irlm)
 
 void __init r8a7778_init_delay(void)
 {
-       shmobile_setup_delay(800, 1, 3); /* Cortex-A9 @ 800MHz */
+       shmobile_init_delay();
 }
 
 #ifdef CONFIG_USE_OF
@@ -609,8 +610,8 @@ static const char *r8a7778_compat_dt[] __initdata = {
 DT_MACHINE_START(R8A7778_DT, "Generic R8A7778 (Flattened Device Tree)")
        .init_early     = r8a7778_init_delay,
        .init_irq       = r8a7778_init_irq_dt,
+       .init_late      = shmobile_init_late,
        .dt_compat      = r8a7778_compat_dt,
-       .init_late      = r8a7778_init_late,
 MACHINE_END
 
 #endif /* CONFIG_USE_OF */
index 236c1befb9e3740a91842b834e96eb0dcee9fcd7..136078ab9407cc2d2f31b43b213c105e6bbaaa4e 100644 (file)
@@ -641,7 +641,7 @@ static void __init r8a7779_register_hpb_dmae(void)
                                          sizeof(dma_platform_data));
 }
 
-static struct platform_device *r8a7779_devices_dt[] __initdata = {
+static struct platform_device *r8a7779_early_devices[] __initdata = {
        &tmu0_device,
 };
 
@@ -669,8 +669,8 @@ void __init r8a7779_add_standard_devices(void)
 
        r8a7779_init_pm_domains();
 
-       platform_add_devices(r8a7779_devices_dt,
-                           ARRAY_SIZE(r8a7779_devices_dt));
+       platform_add_devices(r8a7779_early_devices,
+                           ARRAY_SIZE(r8a7779_early_devices));
        platform_add_devices(r8a7779_standard_devices,
                            ARRAY_SIZE(r8a7779_standard_devices));
        r8a7779_register_hpb_dmae();
@@ -678,8 +678,8 @@ void __init r8a7779_add_standard_devices(void)
 
 void __init r8a7779_add_early_devices(void)
 {
-       early_platform_add_devices(r8a7779_devices_dt,
-                                  ARRAY_SIZE(r8a7779_devices_dt));
+       early_platform_add_devices(r8a7779_early_devices,
+                                  ARRAY_SIZE(r8a7779_early_devices));
 
        /* Early serial console setup is not included here due to
         * memory map collisions. The SCIF serial ports in r8a7779
@@ -739,12 +739,6 @@ void __init r8a7779_init_irq_dt(void)
        __raw_writel(0x003fee3f, INT2SMSKCR4);
 }
 
-void __init r8a7779_add_standard_devices_dt(void)
-{
-       platform_add_devices(r8a7779_devices_dt,
-                            ARRAY_SIZE(r8a7779_devices_dt));
-}
-
 #define MODEMR         0xffcc0020
 
 u32 __init r8a7779_read_mode_pins(void)
@@ -771,10 +765,8 @@ static const char *r8a7779_compat_dt[] __initdata = {
 DT_MACHINE_START(R8A7779_DT, "Generic R8A7779 (Flattened Device Tree)")
        .map_io         = r8a7779_map_io,
        .init_early     = shmobile_init_delay,
-       .nr_irqs        = NR_IRQS_LEGACY,
        .init_irq       = r8a7779_init_irq_dt,
-       .init_machine   = r8a7779_add_standard_devices_dt,
-       .init_late      = r8a7779_init_late,
+       .init_late      = shmobile_init_late,
        .dt_compat      = r8a7779_compat_dt,
 MACHINE_END
 #endif /* CONFIG_USE_OF */
index 0c12b01bb9e33c387c959b2f61cb371360d6470c..877fdeb985d0c240e52eea158eeb16edd1b2ef68 100644 (file)
@@ -282,11 +282,6 @@ static struct resource cmt0_resources[] = {
                                          &cmt##idx##_platform_data,    \
                                          sizeof(struct sh_timer_config))
 
-void __init r8a7790_add_dt_devices(void)
-{
-       r8a7790_register_cmt(0);
-}
-
 void __init r8a7790_add_standard_devices(void)
 {
        r8a7790_register_scif(0);
@@ -299,7 +294,7 @@ void __init r8a7790_add_standard_devices(void)
        r8a7790_register_scif(7);
        r8a7790_register_scif(8);
        r8a7790_register_scif(9);
-       r8a7790_add_dt_devices();
+       r8a7790_register_cmt(0);
        r8a7790_register_irqc(0);
        r8a7790_register_thermal();
        r8a7790_register_i2c(0);
index d47d8b16a43f6606ae07dc0291582539ba805fe9..35d78639244fd805d08d2f44954a5f889379ff6c 100644 (file)
@@ -182,11 +182,6 @@ static const struct resource thermal_resources[] __initconst = {
                                        thermal_resources,              \
                                        ARRAY_SIZE(thermal_resources))
 
-void __init r8a7791_add_dt_devices(void)
-{
-       r8a7791_register_cmt(0);
-}
-
 void __init r8a7791_add_standard_devices(void)
 {
        r8a7791_register_scif(0);
@@ -204,7 +199,7 @@ void __init r8a7791_add_standard_devices(void)
        r8a7791_register_scif(12);
        r8a7791_register_scif(13);
        r8a7791_register_scif(14);
-       r8a7791_add_dt_devices();
+       r8a7791_register_cmt(0);
        r8a7791_register_irqc(0);
        r8a7791_register_thermal();
 }
diff --git a/arch/arm/mach-shmobile/setup-r8a7794.c b/arch/arm/mach-shmobile/setup-r8a7794.c
new file mode 100644 (file)
index 0000000..d2b0930
--- /dev/null
@@ -0,0 +1,33 @@
+/*
+ * r8a7794 processor support
+ *
+ * Copyright (C) 2014  Renesas Electronics Corporation
+ * Copyright (C) 2014  Ulrich Hecht
+ *
+ * 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/of_platform.h>
+#include "common.h"
+#include "rcar-gen2.h"
+#include <asm/mach/arch.h>
+
+static const char * const r8a7794_boards_compat_dt[] __initconst = {
+       "renesas,r8a7794",
+       NULL,
+};
+
+DT_MACHINE_START(R8A7794_DT, "Generic R8A7794 (Flattened Device Tree)")
+       .init_early     = shmobile_init_delay,
+       .init_late      = shmobile_init_late,
+       .init_time      = rcar_gen2_timer_init,
+       .reserve        = rcar_gen2_reserve,
+       .dt_compat      = r8a7794_boards_compat_dt,
+MACHINE_END
index a04fa5fd00fd430d5ab1dba67dad94cba6e6224f..d646c8d12423a600332f5e5876f75445426fdca3 100644 (file)
@@ -41,6 +41,7 @@
 
 #include "common.h"
 #include "dma-register.h"
+#include "intc.h"
 #include "irqs.h"
 #include "pm-rmobile.h"
 #include "sh7372.h"
@@ -984,7 +985,7 @@ void __init sh7372_add_early_devices(void)
 
 void __init sh7372_add_early_devices_dt(void)
 {
-       shmobile_setup_delay(800, 1, 3); /* Cortex-A8 @ 800MHz */
+       shmobile_init_delay();
 
        sh7372_add_early_devices();
 }
@@ -1008,7 +1009,6 @@ static const char *sh7372_boards_compat_dt[] __initdata = {
 DT_MACHINE_START(SH7372_DT, "Generic SH7372 (Flattened Device Tree)")
        .map_io         = sh7372_map_io,
        .init_early     = sh7372_add_early_devices_dt,
-       .nr_irqs        = NR_IRQS_LEGACY,
        .init_irq       = sh7372_init_irq,
        .handle_irq     = shmobile_handle_irq_intc,
        .init_machine   = sh7372_add_standard_devices_dt,
index 2c802ae9b241332f11d120b2dd188e6c21fc1e92..b7bd8e50966879608cde0e5c152cefb12185d9f1 100644 (file)
@@ -40,6 +40,7 @@
 
 #include "common.h"
 #include "dma-register.h"
+#include "intc.h"
 #include "irqs.h"
 #include "sh73a0.h"
 
@@ -696,10 +697,6 @@ static struct platform_device irqpin3_device = {
        },
 };
 
-static struct platform_device *sh73a0_devices_dt[] __initdata = {
-       &cmt1_device,
-};
-
 static struct platform_device *sh73a0_early_devices[] __initdata = {
        &scif0_device,
        &scif1_device,
@@ -712,6 +709,7 @@ static struct platform_device *sh73a0_early_devices[] __initdata = {
        &scif8_device,
        &tmu0_device,
        &ipmmu_device,
+       &cmt1_device,
 };
 
 static struct platform_device *sh73a0_late_devices[] __initdata = {
@@ -736,8 +734,6 @@ void __init sh73a0_add_standard_devices(void)
        /* Clear software reset bit on SY-DMAC module */
        __raw_writel(__raw_readl(SRCR2) & ~(1 << 18), SRCR2);
 
-       platform_add_devices(sh73a0_devices_dt,
-                           ARRAY_SIZE(sh73a0_devices_dt));
        platform_add_devices(sh73a0_early_devices,
                            ARRAY_SIZE(sh73a0_early_devices));
        platform_add_devices(sh73a0_late_devices,
@@ -746,7 +742,7 @@ void __init sh73a0_add_standard_devices(void)
 
 void __init sh73a0_init_delay(void)
 {
-       shmobile_setup_delay(1196, 44, 46); /* Cortex-A9 @ 1196MHz */
+       shmobile_init_delay();
 }
 
 /* do nothing for !CONFIG_SMP or !CONFIG_HAVE_TWD */
@@ -762,8 +758,6 @@ void __init sh73a0_earlytimer_init(void)
 
 void __init sh73a0_add_early_devices(void)
 {
-       early_platform_add_devices(sh73a0_devices_dt,
-                                  ARRAY_SIZE(sh73a0_devices_dt));
        early_platform_add_devices(sh73a0_early_devices,
                                   ARRAY_SIZE(sh73a0_early_devices));
 
@@ -775,17 +769,10 @@ void __init sh73a0_add_early_devices(void)
 
 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();
 
-       platform_add_devices(sh73a0_devices_dt,
-                            ARRAY_SIZE(sh73a0_devices_dt));
        of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
-
-       /* Instantiate cpufreq-cpu0 */
-       platform_device_register_full(&devinfo);
 }
 
 static const char *sh73a0_boards_compat_dt[] __initdata = {
@@ -797,8 +784,8 @@ DT_MACHINE_START(SH73A0_DT, "Generic SH73A0 (Flattened Device Tree)")
        .smp            = smp_ops(sh73a0_smp_ops),
        .map_io         = sh73a0_map_io,
        .init_early     = sh73a0_init_delay,
-       .nr_irqs        = NR_IRQS_LEGACY,
        .init_machine   = sh73a0_add_standard_devices_dt,
+       .init_late      = shmobile_init_late,
        .dt_compat      = sh73a0_boards_compat_dt,
 MACHINE_END
 #endif /* CONFIG_USE_OF */
index 942efdc82a620e72f93046c7c61ca0f0713d5e55..87c6be1e79bd989d24c64ccfc4a95342be5ddc4d 100644 (file)
@@ -23,8 +23,8 @@
 #include <linux/delay.h>
 #include <linux/of_address.h>
 
-void __init shmobile_setup_delay_hz(unsigned int max_cpu_core_hz,
-                                   unsigned int mult, unsigned int div)
+static void __init shmobile_setup_delay_hz(unsigned int max_cpu_core_hz,
+                                          unsigned int mult, unsigned int div)
 {
        /* calculate a worst-case loops-per-jiffy value
         * based on maximum cpu core hz setting and the
@@ -40,27 +40,10 @@ void __init shmobile_setup_delay_hz(unsigned int max_cpu_core_hz,
                preset_lpj = max_cpu_core_hz / value;
 }
 
-void __init shmobile_setup_delay(unsigned int max_cpu_core_mhz,
-                                unsigned int mult, unsigned int div)
-{
-       /* calculate a worst-case loops-per-jiffy value
-        * based on maximum cpu core mhz setting and the
-        * __delay() implementation in arch/arm/lib/delay.S
-        *
-        * this will result in a longer delay than expected
-        * when the cpu core runs on lower frequencies.
-        */
-
-       unsigned int value = (1000000 * mult) / (HZ * div);
-
-       if (!preset_lpj)
-               preset_lpj = max_cpu_core_mhz * value;
-}
-
 void __init shmobile_init_delay(void)
 {
        struct device_node *np, *cpus;
-       bool is_a8_a9 = false;
+       bool is_a7_a8_a9 = false;
        bool is_a15 = false;
        u32 max_freq = 0;
 
@@ -74,9 +57,10 @@ void __init shmobile_init_delay(void)
                if (!of_property_read_u32(np, "clock-frequency", &freq))
                        max_freq = max(max_freq, freq);
 
-               if (of_device_is_compatible(np, "arm,cortex-a8") ||
+               if (of_device_is_compatible(np, "arm,cortex-a7") ||
+                   of_device_is_compatible(np, "arm,cortex-a8") ||
                    of_device_is_compatible(np, "arm,cortex-a9"))
-                       is_a8_a9 = true;
+                       is_a7_a8_a9 = true;
                else if (of_device_is_compatible(np, "arm,cortex-a15"))
                        is_a15 = true;
        }
@@ -86,7 +70,7 @@ void __init shmobile_init_delay(void)
        if (!max_freq)
                return;
 
-       if (is_a8_a9)
+       if (is_a7_a8_a9)
                shmobile_setup_delay_hz(max_freq, 1, 3);
        else if (is_a15 && !IS_ENABLED(CONFIG_ARM_ARCH_TIMER))
                shmobile_setup_delay_hz(max_freq, 2, 4);
index ec55d1de1b55ec061490838658a8b87d603a86d0..475e783992fd284dbeb613ba8928262811c1809a 100644 (file)
 #include <linux/init.h>
 #include <linux/io.h>
 #include <linux/kernel.h>
+#include <linux/of.h>
+#include <linux/of_address.h>
 
 #include <soc/tegra/fuse.h>
 
 #include "flowctrl.h"
-#include "iomap.h"
 
 static u8 flowctrl_offset_halt_cpu[] = {
        FLOW_CTRL_HALT_CPU0_EVENTS,
@@ -42,23 +43,22 @@ static u8 flowctrl_offset_cpu_csr[] = {
        FLOW_CTRL_CPU1_CSR + 16,
 };
 
+static void __iomem *tegra_flowctrl_base;
+
 static void flowctrl_update(u8 offset, u32 value)
 {
-       void __iomem *addr = IO_ADDRESS(TEGRA_FLOW_CTRL_BASE) + offset;
-
-       writel(value, addr);
+       writel(value, tegra_flowctrl_base + offset);
 
        /* ensure the update has reached the flow controller */
        wmb();
-       readl_relaxed(addr);
+       readl_relaxed(tegra_flowctrl_base + offset);
 }
 
 u32 flowctrl_read_cpu_csr(unsigned int cpuid)
 {
        u8 offset = flowctrl_offset_cpu_csr[cpuid];
-       void __iomem *addr = IO_ADDRESS(TEGRA_FLOW_CTRL_BASE) + offset;
 
-       return readl(addr);
+       return readl(tegra_flowctrl_base + offset);
 }
 
 void flowctrl_write_cpu_csr(unsigned int cpuid, u32 value)
@@ -139,3 +139,33 @@ void flowctrl_cpu_suspend_exit(unsigned int cpuid)
        reg |= FLOW_CTRL_CSR_EVENT_FLAG;                /* clear event */
        flowctrl_write_cpu_csr(cpuid, reg);
 }
+
+static const struct of_device_id matches[] __initconst = {
+       { .compatible = "nvidia,tegra124-flowctrl" },
+       { .compatible = "nvidia,tegra114-flowctrl" },
+       { .compatible = "nvidia,tegra30-flowctrl" },
+       { .compatible = "nvidia,tegra20-flowctrl" },
+       { }
+};
+
+void __init tegra_flowctrl_init(void)
+{
+       /* hardcoded fallback if device tree node is missing */
+       unsigned long base = 0x60007000;
+       unsigned long size = SZ_4K;
+       struct device_node *np;
+
+       np = of_find_matching_node(NULL, matches);
+       if (np) {
+               struct resource res;
+
+               if (of_address_to_resource(np, 0, &res) == 0) {
+                       size = resource_size(&res);
+                       base = res.start;
+               }
+
+               of_node_put(np);
+       }
+
+       tegra_flowctrl_base = ioremap_nocache(base, size);
+}
index c89aac60a14335c79c9e3b1b6630308e51ba2922..73a9c5016c1ab1ae9414887eb3fdfa16a1b32293 100644 (file)
@@ -59,6 +59,8 @@ void flowctrl_write_cpu_halt(unsigned int cpuid, u32 value);
 
 void flowctrl_cpu_suspend_enter(unsigned int cpuid);
 void flowctrl_cpu_suspend_exit(unsigned int cpuid);
+
+void tegra_flowctrl_init(void);
 #endif
 
 #endif
index 5ef5173dec83bf32b68ea0c5931a9aa03547ad84..ef016af1c9e769176378e2930f24dc2f060adc09 100644 (file)
@@ -48,6 +48,7 @@
 #include "board.h"
 #include "common.h"
 #include "cpuidle.h"
+#include "flowctrl.h"
 #include "iomap.h"
 #include "irq.h"
 #include "pm.h"
@@ -74,6 +75,7 @@ static void __init tegra_init_early(void)
 {
        of_register_trusted_foundations();
        tegra_cpu_reset_handler_init();
+       tegra_flowctrl_init();
 }
 
 static void __init tegra_dt_init_irq(void)
index 1b25d92ebf22c9d9bb513344138816568aef8212..c85fb3f7d5cdf55d683eea83ca7a4a0e15125fb5 100644 (file)
@@ -3,8 +3,7 @@
 #
 
 # Common support
-obj-y                          := common.o slcr.o
+obj-y                          := common.o slcr.o pm.o
 CFLAGS_REMOVE_hotplug.o                =-march=armv6k
 CFLAGS_hotplug.o               =-Wa,-march=armv7-a -mcpu=cortex-a9
-obj-$(CONFIG_HOTPLUG_CPU)      += hotplug.o
 obj-$(CONFIG_SMP)              += headsmp.o platsmp.o
index 31a6fa40ba37ef0b37da4d9439258ba3e2b8726b..613c476872eb06c5d6ba76c249ae2df888bf5e92 100644 (file)
@@ -98,6 +98,12 @@ static int __init zynq_get_revision(void)
        return revision;
 }
 
+static void __init zynq_init_late(void)
+{
+       zynq_core_pm_init();
+       zynq_pm_late_init();
+}
+
 /**
  * zynq_init_machine - System specific initialization, intended to be
  *                    called from board specific initialization.
@@ -198,12 +204,13 @@ static const char * const zynq_dt_match[] = {
 
 DT_MACHINE_START(XILINX_EP107, "Xilinx Zynq Platform")
        /* 64KB way size, 8-way associativity, parity disabled */
-       .l2c_aux_val    = 0x02000000,
-       .l2c_aux_mask   = 0xf0ffffff,
+       .l2c_aux_val    = 0x00000000,
+       .l2c_aux_mask   = 0xffffffff,
        .smp            = smp_ops(zynq_smp_ops),
        .map_io         = zynq_map_io,
        .init_irq       = zynq_irq_init,
        .init_machine   = zynq_init_machine,
+       .init_late      = zynq_init_late,
        .init_time      = zynq_timer_init,
        .dt_compat      = zynq_dt_match,
        .reserve        = zynq_memory_init,
index f652f0a884a67d34da78bfd27966540b97a12312..2bc71273c73c6c324b4c8d869389d8bd535a3a64 100644 (file)
@@ -24,6 +24,8 @@ extern int zynq_early_slcr_init(void);
 extern void zynq_slcr_system_reset(void);
 extern void zynq_slcr_cpu_stop(int cpu);
 extern void zynq_slcr_cpu_start(int cpu);
+extern bool zynq_slcr_cpu_state_read(int cpu);
+extern void zynq_slcr_cpu_state_write(int cpu, bool die);
 extern u32 zynq_slcr_get_device_id(void);
 
 #ifdef CONFIG_SMP
@@ -37,7 +39,17 @@ extern struct smp_operations zynq_smp_ops __initdata;
 
 extern void __iomem *zynq_scu_base;
 
-/* Hotplug */
-extern void zynq_platform_cpu_die(unsigned int cpu);
+void zynq_pm_late_init(void);
+
+static inline void zynq_core_pm_init(void)
+{
+       /* A9 clock gating */
+       asm volatile ("mrc  p15, 0, r12, c15, c0, 0\n"
+                     "orr  r12, r12, #1\n"
+                     "mcr  p15, 0, r12, c15, c0, 0\n"
+                     : /* no outputs */
+                     : /* no inputs */
+                     : "r12");
+}
 
 #endif
index 5052c70326e49ef5790e65d519c620e615d442ce..b685c89f11e48871e7cc803b2d749d0fb114001a 100644 (file)
  * it under the terms of the GNU General Public License version 2 as
  * published by the Free Software Foundation.
  */
-#include <linux/kernel.h>
-#include <linux/errno.h>
-#include <linux/smp.h>
+#include <asm/proc-fns.h>
 
-#include <asm/cacheflush.h>
-#include <asm/cp15.h>
-#include "common.h"
-
-static inline void zynq_cpu_enter_lowpower(void)
-{
-       unsigned int v;
-
-       flush_cache_all();
-       asm volatile(
-       "       mcr     p15, 0, %1, c7, c5, 0\n"
-       "       dsb\n"
-       /*
-        * Turn off coherency
-        */
-       "       mrc     p15, 0, %0, c1, c0, 1\n"
-       "       bic     %0, %0, #0x40\n"
-       "       mcr     p15, 0, %0, c1, c0, 1\n"
-       "       mrc     p15, 0, %0, c1, c0, 0\n"
-       "       bic     %0, %0, %2\n"
-       "       mcr     p15, 0, %0, c1, c0, 0\n"
-         : "=&r" (v)
-         : "r" (0), "Ir" (CR_C)
-         : "cc");
-}
-
-/*
- * platform-specific code to shutdown a CPU
- *
- * Called with IRQs disabled
- */
-void zynq_platform_cpu_die(unsigned int cpu)
-{
-       zynq_cpu_enter_lowpower();
-
-       /*
-        * there is no power-control hardware on this platform, so all
-        * we can do is put the core into WFI; this is safe as the calling
-        * code will have already disabled interrupts
-        */
-       for (;;)
-               cpu_do_idle();
-}
index abc82ef085c1617011fa3174bfaea2b7d8cb6244..52d768ff785711a1d9d2fc384400e754ae8ddbef 100644 (file)
@@ -112,20 +112,59 @@ static void __init zynq_smp_prepare_cpus(unsigned int max_cpus)
        scu_enable(zynq_scu_base);
 }
 
+/**
+ * zynq_secondary_init - Initialize secondary CPU cores
+ * @cpu:       CPU that is initialized
+ *
+ * This function is in the hotplug path. Don't move it into the
+ * init section!!
+ */
+static void zynq_secondary_init(unsigned int cpu)
+{
+       zynq_core_pm_init();
+}
+
 #ifdef CONFIG_HOTPLUG_CPU
 static int zynq_cpu_kill(unsigned cpu)
 {
+       unsigned long timeout = jiffies + msecs_to_jiffies(50);
+
+       while (zynq_slcr_cpu_state_read(cpu))
+               if (time_after(jiffies, timeout))
+                       return 0;
+
        zynq_slcr_cpu_stop(cpu);
        return 1;
 }
+
+/**
+ * zynq_cpu_die - Let a CPU core die
+ * @cpu:       Dying CPU
+ *
+ * Platform-specific code to shutdown a CPU.
+ * Called with IRQs disabled on the dying CPU.
+ */
+static void zynq_cpu_die(unsigned int cpu)
+{
+       zynq_slcr_cpu_state_write(cpu, true);
+
+       /*
+        * there is no power-control hardware on this platform, so all
+        * we can do is put the core into WFI; this is safe as the calling
+        * code will have already disabled interrupts
+        */
+       for (;;)
+               cpu_do_idle();
+}
 #endif
 
 struct smp_operations zynq_smp_ops __initdata = {
        .smp_init_cpus          = zynq_smp_init_cpus,
        .smp_prepare_cpus       = zynq_smp_prepare_cpus,
        .smp_boot_secondary     = zynq_boot_secondary,
+       .smp_secondary_init     = zynq_secondary_init,
 #ifdef CONFIG_HOTPLUG_CPU
-       .cpu_die                = zynq_platform_cpu_die,
+       .cpu_die                = zynq_cpu_die,
        .cpu_kill               = zynq_cpu_kill,
 #endif
 };
diff --git a/arch/arm/mach-zynq/pm.c b/arch/arm/mach-zynq/pm.c
new file mode 100644 (file)
index 0000000..911fcf8
--- /dev/null
@@ -0,0 +1,83 @@
+/*
+ * Zynq power management
+ *
+ *  Copyright (C) 2012 - 2014 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 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, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <linux/io.h>
+#include <linux/of_address.h>
+#include <linux/of_device.h>
+#include "common.h"
+
+/* register offsets */
+#define DDRC_CTRL_REG1_OFFS            0x60
+#define DDRC_DRAM_PARAM_REG3_OFFS      0x20
+
+/* bitfields */
+#define DDRC_CLOCKSTOP_MASK    BIT(23)
+#define DDRC_SELFREFRESH_MASK  BIT(12)
+
+static void __iomem *ddrc_base;
+
+/**
+ * zynq_pm_ioremap() - Create IO mappings
+ * @comp:      DT compatible string
+ * Return: Pointer to the mapped memory or NULL.
+ *
+ * Remap the memory region for a compatible DT node.
+ */
+static void __iomem *zynq_pm_ioremap(const char *comp)
+{
+       struct device_node *np;
+       void __iomem *base = NULL;
+
+       np = of_find_compatible_node(NULL, NULL, comp);
+       if (np) {
+               base = of_iomap(np, 0);
+               of_node_put(np);
+       } else {
+               pr_warn("%s: no compatible node found for '%s'\n", __func__,
+                               comp);
+       }
+
+       return base;
+}
+
+/**
+ * zynq_pm_late_init() - Power management init
+ *
+ * Initialization of power management related featurs and infrastructure.
+ */
+void __init zynq_pm_late_init(void)
+{
+       u32 reg;
+
+       ddrc_base = zynq_pm_ioremap("xlnx,zynq-ddrc-a05");
+       if (!ddrc_base) {
+               pr_warn("%s: Unable to map DDRC IO memory.\n", __func__);
+       } else {
+               /*
+                * Enable DDRC clock stop feature. The HW takes care of
+                * entering/exiting the correct mode depending
+                * on activity state.
+                */
+               reg = readl(ddrc_base + DDRC_DRAM_PARAM_REG3_OFFS);
+               reg |= DDRC_CLOCKSTOP_MASK;
+               writel(reg, ddrc_base + DDRC_DRAM_PARAM_REG3_OFFS);
+       }
+}
index c43a2d16e223bcfd74eca29eb6200c3bc93ff94d..d4cb50cf97c027dd5aed93b7900ae9bc96a7eed8 100644 (file)
@@ -138,6 +138,8 @@ void zynq_slcr_cpu_start(int cpu)
        zynq_slcr_write(reg, SLCR_A9_CPU_RST_CTRL_OFFSET);
        reg &= ~(SLCR_A9_CPU_CLKSTOP << cpu);
        zynq_slcr_write(reg, SLCR_A9_CPU_RST_CTRL_OFFSET);
+
+       zynq_slcr_cpu_state_write(cpu, false);
 }
 
 /**
@@ -154,8 +156,47 @@ void zynq_slcr_cpu_stop(int cpu)
 }
 
 /**
- * zynq_slcr_init - Regular slcr driver init
+ * zynq_slcr_cpu_state - Read/write cpu state
+ * @cpu:       cpu number
  *
+ * SLCR_REBOOT_STATUS save upper 2 bits (31/30 cpu states for cpu0 and cpu1)
+ * 0 means cpu is running, 1 cpu is going to die.
+ *
+ * Return: true if cpu is running, false if cpu is going to die
+ */
+bool zynq_slcr_cpu_state_read(int cpu)
+{
+       u32 state;
+
+       state = readl(zynq_slcr_base + SLCR_REBOOT_STATUS_OFFSET);
+       state &= 1 << (31 - cpu);
+
+       return !state;
+}
+
+/**
+ * zynq_slcr_cpu_state - Read/write cpu state
+ * @cpu:       cpu number
+ * @die:       cpu state - true if cpu is going to die
+ *
+ * SLCR_REBOOT_STATUS save upper 2 bits (31/30 cpu states for cpu0 and cpu1)
+ * 0 means cpu is running, 1 cpu is going to die.
+ */
+void zynq_slcr_cpu_state_write(int cpu, bool die)
+{
+       u32 state, mask;
+
+       state = readl(zynq_slcr_base + SLCR_REBOOT_STATUS_OFFSET);
+       mask = 1 << (31 - cpu);
+       if (die)
+               state |= mask;
+       else
+               state &= ~mask;
+       writel(state, zynq_slcr_base + SLCR_REBOOT_STATUS_OFFSET);
+}
+
+/**
+ * zynq_slcr_init - Regular slcr driver init
  * Return:     0 on success, negative errno otherwise.
  *
  * Called early during boot from platform code to remap SLCR area.
index 3ea02903d75af6a86cfda0abbc7d7532139f3e9e..1f5ee17a10e8e10054a33c3981e7851377600a8f 100644 (file)
@@ -258,6 +258,7 @@ static const struct platform_device_id ssp_id_table[] = {
        { "pxa25x-ssp",         PXA25x_SSP },
        { "pxa25x-nssp",        PXA25x_NSSP },
        { "pxa27x-ssp",         PXA27x_SSP },
+       { "pxa3xx-ssp",         PXA3xx_SSP },
        { "pxa168-ssp",         PXA168_SSP },
        { "pxa910-ssp",         PXA910_SSP },
        { },
index 4998aee59267de45e83b2b53efd5867586ebb5c5..89a48a7bd5df452b7ba9157249a2f18fc37ceb57 100644 (file)
@@ -9,3 +9,4 @@ obj-y += clk-system.o clk-peripheral.o clk-programmable.o
 obj-$(CONFIG_HAVE_AT91_UTMI)           += clk-utmi.o
 obj-$(CONFIG_HAVE_AT91_USB_CLK)                += clk-usb.o
 obj-$(CONFIG_HAVE_AT91_SMD)            += clk-smd.o
+obj-$(CONFIG_HAVE_AT91_H32MX)          += clk-h32mx.o
diff --git a/drivers/clk/at91/clk-h32mx.c b/drivers/clk/at91/clk-h32mx.c
new file mode 100644 (file)
index 0000000..152dcb3
--- /dev/null
@@ -0,0 +1,123 @@
+/*
+ * clk-h32mx.c
+ *
+ *  Copyright (C) 2014 Atmel
+ *
+ * Alexandre Belloni <alexandre.belloni@free-electrons.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ */
+
+#include <linux/clk-provider.h>
+#include <linux/clkdev.h>
+#include <linux/clk/at91_pmc.h>
+#include <linux/delay.h>
+#include <linux/of.h>
+#include <linux/of_address.h>
+#include <linux/of_irq.h>
+#include <linux/io.h>
+#include <linux/interrupt.h>
+#include <linux/irq.h>
+#include <linux/sched.h>
+#include <linux/wait.h>
+
+#include "pmc.h"
+
+#define H32MX_MAX_FREQ 90000000
+
+struct clk_sama5d4_h32mx {
+       struct clk_hw hw;
+       struct at91_pmc *pmc;
+};
+
+#define to_clk_sama5d4_h32mx(hw) container_of(hw, struct clk_sama5d4_h32mx, hw)
+
+static unsigned long clk_sama5d4_h32mx_recalc_rate(struct clk_hw *hw,
+                                                unsigned long parent_rate)
+{
+       struct clk_sama5d4_h32mx *h32mxclk = to_clk_sama5d4_h32mx(hw);
+
+       if (pmc_read(h32mxclk->pmc, AT91_PMC_MCKR) & AT91_PMC_H32MXDIV)
+               return parent_rate / 2;
+
+       if (parent_rate > H32MX_MAX_FREQ)
+               pr_warn("H32MX clock is too fast\n");
+       return parent_rate;
+}
+
+static long clk_sama5d4_h32mx_round_rate(struct clk_hw *hw, unsigned long rate,
+                                      unsigned long *parent_rate)
+{
+       unsigned long div;
+
+       if (rate > *parent_rate)
+               return *parent_rate;
+       div = *parent_rate / 2;
+       if (rate < div)
+               return div;
+
+       if (rate - div < *parent_rate - rate)
+               return div;
+
+       return *parent_rate;
+}
+
+static int clk_sama5d4_h32mx_set_rate(struct clk_hw *hw, unsigned long rate,
+                                   unsigned long parent_rate)
+{
+       struct clk_sama5d4_h32mx *h32mxclk = to_clk_sama5d4_h32mx(hw);
+       struct at91_pmc *pmc = h32mxclk->pmc;
+       u32 tmp;
+
+       if (parent_rate != rate && (parent_rate / 2) != rate)
+               return -EINVAL;
+
+       pmc_lock(pmc);
+       tmp = pmc_read(pmc, AT91_PMC_MCKR) & ~AT91_PMC_H32MXDIV;
+       if ((parent_rate / 2) == rate)
+               tmp |= AT91_PMC_H32MXDIV;
+       pmc_write(pmc, AT91_PMC_MCKR, tmp);
+       pmc_unlock(pmc);
+
+       return 0;
+}
+
+static const struct clk_ops h32mx_ops = {
+       .recalc_rate = clk_sama5d4_h32mx_recalc_rate,
+       .round_rate = clk_sama5d4_h32mx_round_rate,
+       .set_rate = clk_sama5d4_h32mx_set_rate,
+};
+
+void __init of_sama5d4_clk_h32mx_setup(struct device_node *np,
+                                    struct at91_pmc *pmc)
+{
+       struct clk_sama5d4_h32mx *h32mxclk;
+       struct clk_init_data init;
+       const char *parent_name;
+       struct clk *clk;
+
+       h32mxclk = kzalloc(sizeof(*h32mxclk), GFP_KERNEL);
+       if (!h32mxclk)
+               return;
+
+       parent_name = of_clk_get_parent_name(np, 0);
+
+       init.name = np->name;
+       init.ops = &h32mx_ops;
+       init.parent_names = parent_name ? &parent_name : NULL;
+       init.num_parents = parent_name ? 1 : 0;
+       init.flags = CLK_SET_RATE_GATE;
+
+       h32mxclk->hw.init = &init;
+       h32mxclk->pmc = pmc;
+
+       clk = clk_register(NULL, &h32mxclk->hw);
+       if (!clk)
+               return;
+
+       of_clk_add_provider(np, of_clk_src_simple_get, clk);
+}
index 524196bb35a54d3565117e0e5a047300be7e30c3..386999b4f8eb2d20b3af4195a6beac8c7221efe3 100644 (file)
@@ -336,6 +336,12 @@ static const struct of_device_id pmc_clk_ids[] __initconst = {
                .compatible = "atmel,at91sam9x5-clk-smd",
                .data = of_at91sam9x5_clk_smd_setup,
        },
+#endif
+#if defined(CONFIG_HAVE_AT91_H32MX)
+       {
+               .compatible = "atmel,sama5d4-clk-h32mx",
+               .data = of_sama5d4_clk_h32mx_setup,
+       },
 #endif
        { /*sentinel*/ }
 };
index 6c7625976113390e33200ed2c62765c29347350b..52d2041fa3f6354a4abfdc8f45ee147a75a370ef 100644 (file)
@@ -120,4 +120,9 @@ extern void __init of_at91sam9x5_clk_smd_setup(struct device_node *np,
                                               struct at91_pmc *pmc);
 #endif
 
+#if defined(CONFIG_HAVE_AT91_SMD)
+extern void __init of_sama5d4_clk_h32mx_setup(struct device_node *np,
+                                             struct at91_pmc *pmc);
+#endif
+
 #endif /* __PMC_H_ */
index e0029237827a3ee6e2e5f6f8d68100a17702f982..531d4f6c70501e12aa19a1e6c4118a4a4fa1c615 100644 (file)
@@ -4,6 +4,7 @@ obj-$(CONFIG_ARCH_R8A7740)              += clk-r8a7740.o
 obj-$(CONFIG_ARCH_R8A7779)             += clk-r8a7779.o
 obj-$(CONFIG_ARCH_R8A7790)             += clk-rcar-gen2.o
 obj-$(CONFIG_ARCH_R8A7791)             += clk-rcar-gen2.o
+obj-$(CONFIG_ARCH_R8A7794)             += clk-rcar-gen2.o
 obj-$(CONFIG_ARCH_SHMOBILE_MULTI)      += clk-div6.o
 obj-$(CONFIG_ARCH_SHMOBILE_MULTI)      += clk-mstp.o
 # for emply built-in.o
index aded759280282b08e7fb3e9025f130240b9f6074..c61b8b2a7c77e1696f5856a0d4ddf30143f6c07d 100644 (file)
@@ -26,7 +26,6 @@
  */
 
 #include <linux/init.h>
-#include <linux/cpu_pm.h>
 #include <linux/cpuidle.h>
 #include <linux/platform_device.h>
 #include <asm/proc-fns.h>
 static int zynq_enter_idle(struct cpuidle_device *dev,
                           struct cpuidle_driver *drv, int index)
 {
-       /* Devices must be stopped here */
-       cpu_pm_enter();
-
        /* Add code for DDR self refresh start */
        cpu_do_idle();
 
-       /* Add code for DDR self refresh stop */
-       cpu_pm_exit();
-
        return index;
 }
 
@@ -59,8 +52,7 @@ static struct cpuidle_driver zynq_idle_driver = {
                        .enter                  = zynq_enter_idle,
                        .exit_latency           = 10,
                        .target_residency       = 10000,
-                       .flags                  = CPUIDLE_FLAG_TIME_VALID |
-                                                 CPUIDLE_FLAG_TIMER_STOP,
+                       .flags                  = CPUIDLE_FLAG_TIME_VALID,
                        .name                   = "RAM_SR",
                        .desc                   = "WFI and RAM Self Refresh",
                },
index 654151e24288353c88c1dafa0de594ab2eb55e63..ddaef8620b2c2b72bbceb19e1068e302b8711ff4 100644 (file)
 #define IMX6Q_CLK_ECSPI5                       116
 #define IMX6DL_CLK_I2C4                                116
 #define IMX6QDL_CLK_ENET                       117
-#define IMX6QDL_CLK_ESAI                       118
+#define IMX6QDL_CLK_ESAI_EXTAL                 118
 #define IMX6QDL_CLK_GPT_IPG                    119
 #define IMX6QDL_CLK_GPT_IPG_PER                        120
 #define IMX6QDL_CLK_GPU2D_CORE                 121
 #define IMX6QDL_CLK_LVDS2_SEL                  205
 #define IMX6QDL_CLK_LVDS1_GATE                 206
 #define IMX6QDL_CLK_LVDS2_GATE                 207
-#define IMX6QDL_CLK_ESAI_AHB                   208
-#define IMX6QDL_CLK_END                                209
+#define IMX6QDL_CLK_ESAI_IPG                   208
+#define IMX6QDL_CLK_ESAI_MEM                   209
+#define IMX6QDL_CLK_ASRC_IPG                   210
+#define IMX6QDL_CLK_ASRC_MEM                   211
+#define IMX6QDL_CLK_LVDS1_IN                   212
+#define IMX6QDL_CLK_LVDS2_IN                   213
+#define IMX6QDL_CLK_ANACLK1                    214
+#define IMX6QDL_CLK_ANACLK2                    215
+#define IMX6QDL_PLL1_BYPASS_SRC                        216
+#define IMX6QDL_PLL2_BYPASS_SRC                        217
+#define IMX6QDL_PLL3_BYPASS_SRC                        218
+#define IMX6QDL_PLL4_BYPASS_SRC                        219
+#define IMX6QDL_PLL5_BYPASS_SRC                        220
+#define IMX6QDL_PLL6_BYPASS_SRC                        221
+#define IMX6QDL_PLL7_BYPASS_SRC                        222
+#define IMX6QDL_CLK_PLL1                       223
+#define IMX6QDL_CLK_PLL2                       224
+#define IMX6QDL_CLK_PLL3                       225
+#define IMX6QDL_CLK_PLL4                       226
+#define IMX6QDL_CLK_PLL5                       227
+#define IMX6QDL_CLK_PLL6                       228
+#define IMX6QDL_CLK_PLL7                       229
+#define IMX6QDL_PLL1_BYPASS                    230
+#define IMX6QDL_PLL2_BYPASS                    231
+#define IMX6QDL_PLL3_BYPASS                    232
+#define IMX6QDL_PLL4_BYPASS                    233
+#define IMX6QDL_PLL5_BYPASS                    234
+#define IMX6QDL_PLL6_BYPASS                    235
+#define IMX6QDL_PLL7_BYPASS                    236
+#define IMX6QDL_CLK_GPT_3M                     237
+#define IMX6QDL_CLK_END                                238
 
 #endif /* __DT_BINDINGS_CLOCK_IMX6QDL_H */
index b91dd462ba85802b8bf037bfd55930aea5577686..9ce4e421096faa84e42c8724992341959a61260e 100644 (file)
 #define IMX6SL_CLK_PLL4_AUDIO_DIV      133
 #define IMX6SL_CLK_SPBA                        134
 #define IMX6SL_CLK_ENET                        135
-#define IMX6SL_CLK_END                 136
+#define IMX6SL_CLK_LVDS1_SEL           136
+#define IMX6SL_CLK_LVDS1_OUT           137
+#define IMX6SL_CLK_LVDS1_IN            138
+#define IMX6SL_CLK_ANACLK1             139
+#define IMX6SL_PLL1_BYPASS_SRC         140
+#define IMX6SL_PLL2_BYPASS_SRC         141
+#define IMX6SL_PLL3_BYPASS_SRC         142
+#define IMX6SL_PLL4_BYPASS_SRC         143
+#define IMX6SL_PLL5_BYPASS_SRC         144
+#define IMX6SL_PLL6_BYPASS_SRC         145
+#define IMX6SL_PLL7_BYPASS_SRC         146
+#define IMX6SL_CLK_PLL1                        147
+#define IMX6SL_CLK_PLL2                        148
+#define IMX6SL_CLK_PLL3                        149
+#define IMX6SL_CLK_PLL4                        150
+#define IMX6SL_CLK_PLL5                        151
+#define IMX6SL_CLK_PLL6                        152
+#define IMX6SL_CLK_PLL7                        153
+#define IMX6SL_PLL1_BYPASS             154
+#define IMX6SL_PLL2_BYPASS             155
+#define IMX6SL_PLL3_BYPASS             156
+#define IMX6SL_PLL4_BYPASS             157
+#define IMX6SL_PLL5_BYPASS             158
+#define IMX6SL_PLL6_BYPASS             159
+#define IMX6SL_PLL7_BYPASS             160
+#define IMX6SL_CLK_SSI1_IPG            161
+#define IMX6SL_CLK_SSI2_IPG            162
+#define IMX6SL_CLK_SSI3_IPG            163
+#define IMX6SL_CLK_END                 164
 
 #endif /* __DT_BINDINGS_CLOCK_IMX6SL_H */
index 421d8bb76f2fdb3fc116cb474abd20ee7b922b44..995709119ec526a2e84942f56cb940b5f6cddb49 100644 (file)
 #define IMX6SX_CLK_SAI2_IPG            238
 #define IMX6SX_CLK_ESAI_IPG            239
 #define IMX6SX_CLK_ESAI_MEM            240
-#define IMX6SX_CLK_CLK_END             241
+#define IMX6SX_CLK_LVDS1_IN            241
+#define IMX6SX_CLK_ANACLK1             242
+#define IMX6SX_PLL1_BYPASS_SRC         243
+#define IMX6SX_PLL2_BYPASS_SRC         244
+#define IMX6SX_PLL3_BYPASS_SRC         245
+#define IMX6SX_PLL4_BYPASS_SRC         246
+#define IMX6SX_PLL5_BYPASS_SRC         247
+#define IMX6SX_PLL6_BYPASS_SRC         248
+#define IMX6SX_PLL7_BYPASS_SRC         249
+#define IMX6SX_CLK_PLL1                        250
+#define IMX6SX_CLK_PLL2                        251
+#define IMX6SX_CLK_PLL3                        252
+#define IMX6SX_CLK_PLL4                        253
+#define IMX6SX_CLK_PLL5                        254
+#define IMX6SX_CLK_PLL6                        255
+#define IMX6SX_CLK_PLL7                        256
+#define IMX6SX_PLL1_BYPASS             257
+#define IMX6SX_PLL2_BYPASS             258
+#define IMX6SX_PLL3_BYPASS             259
+#define IMX6SX_PLL4_BYPASS             260
+#define IMX6SX_PLL5_BYPASS             261
+#define IMX6SX_PLL6_BYPASS             262
+#define IMX6SX_PLL7_BYPASS             263
+#define IMX6SX_CLK_CLK_END             264
 
 #endif /* __DT_BINDINGS_CLOCK_IMX6SX_H */
diff --git a/include/dt-bindings/clock/r8a7740-clock.h b/include/dt-bindings/clock/r8a7740-clock.h
new file mode 100644 (file)
index 0000000..f6b4b0f
--- /dev/null
@@ -0,0 +1,77 @@
+/*
+ * Copyright 2014 Ulrich Hecht
+ *
+ * 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_R8A7740_H__
+#define __DT_BINDINGS_CLOCK_R8A7740_H__
+
+/* CPG */
+#define R8A7740_CLK_SYSTEM     0
+#define R8A7740_CLK_PLLC0      1
+#define R8A7740_CLK_PLLC1      2
+#define R8A7740_CLK_PLLC2      3
+#define R8A7740_CLK_R          4
+#define R8A7740_CLK_USB24S     5
+#define R8A7740_CLK_I          6
+#define R8A7740_CLK_ZG         7
+#define R8A7740_CLK_B          8
+#define R8A7740_CLK_M1         9
+#define R8A7740_CLK_HP         10
+#define R8A7740_CLK_HPP                11
+#define R8A7740_CLK_USBP       12
+#define R8A7740_CLK_S          13
+#define R8A7740_CLK_ZB         14
+#define R8A7740_CLK_M3         15
+#define R8A7740_CLK_CP         16
+
+/* MSTP1 */
+#define R8A7740_CLK_CEU21      28
+#define R8A7740_CLK_CEU20      27
+#define R8A7740_CLK_TMU0       25
+#define R8A7740_CLK_LCDC1      17
+#define R8A7740_CLK_IIC0       16
+#define R8A7740_CLK_TMU1       11
+#define R8A7740_CLK_LCDC0      0
+
+/* MSTP2 */
+#define R8A7740_CLK_SCIFA6     30
+#define R8A7740_CLK_SCIFA7     22
+#define R8A7740_CLK_DMAC1      18
+#define R8A7740_CLK_DMAC2      17
+#define R8A7740_CLK_DMAC3      16
+#define R8A7740_CLK_USBDMAC    14
+#define R8A7740_CLK_SCIFA5     7
+#define R8A7740_CLK_SCIFB      6
+#define R8A7740_CLK_SCIFA0     4
+#define R8A7740_CLK_SCIFA1     3
+#define R8A7740_CLK_SCIFA2     2
+#define R8A7740_CLK_SCIFA3     1
+#define R8A7740_CLK_SCIFA4     0
+
+/* MSTP3 */
+#define R8A7740_CLK_CMT1       29
+#define R8A7740_CLK_FSI                28
+#define R8A7740_CLK_IIC1       23
+#define R8A7740_CLK_USBF       20
+#define R8A7740_CLK_SDHI0      14
+#define R8A7740_CLK_SDHI1      13
+#define R8A7740_CLK_MMC                12
+#define R8A7740_CLK_GETHER     9
+#define R8A7740_CLK_TPU0       4
+
+/* MSTP4 */
+#define R8A7740_CLK_USBH       16
+#define R8A7740_CLK_SDHI2      15
+#define R8A7740_CLK_USBFUNC    7
+#define R8A7740_CLK_USBPHY     6
+
+/* SUBCK* */
+#define R8A7740_CLK_SUBCK      9
+#define R8A7740_CLK_SUBCK2     10
+
+#endif /* __DT_BINDINGS_CLOCK_R8A7740_H__ */
index 00953d9484cb5985f5dd6d2314c90acf8e4b8b7e..d6b56b21539b7e4e73bb80d927fc906d4d811e5c 100644 (file)
 #define VF610_CLK_DMAMUX3              153
 #define VF610_CLK_FLEXCAN0_EN          154
 #define VF610_CLK_FLEXCAN1_EN          155
-#define VF610_CLK_END                  156
+#define VF610_CLK_PLL7_MAIN            156
+#define VF610_CLK_USBPHY0              157
+#define VF610_CLK_USBPHY1              158
+#define VF610_CLK_END                  159
 
 #endif /* __DT_BINDINGS_CLOCK_VF610_H */
index de4268d4987acb9ec2c6a4f985845c209d6c5c9c..c8e3b3d1ededbdf5b3a21e98b45eab03cb51b761 100644 (file)
@@ -125,6 +125,7 @@ extern void __iomem *at91_pmc_base;
 #define                AT91_PMC_PLLADIV2       (1 << 12)               /* PLLA divisor by 2 [some SAM9 only] */
 #define                        AT91_PMC_PLLADIV2_OFF           (0 << 12)
 #define                        AT91_PMC_PLLADIV2_ON            (1 << 12)
+#define                AT91_PMC_H32MXDIV       BIT(24)
 
 #define        AT91_PMC_USB            0x38                    /* USB Clock Register [some SAM9 only] */
 #define                AT91_PMC_USBS           (0x1 <<  0)             /* USB OHCI Input clock selection */
diff --git a/include/linux/platform_data/tegra_emc.h b/include/linux/platform_data/tegra_emc.h
deleted file mode 100644 (file)
index df67505..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright (C) 2011 Google, Inc.
- *
- * Author:
- *     Colin Cross <ccross@android.com>
- *     Olof Johansson <olof@lixom.net>
- *
- * This software is licensed under the terms of the GNU General Public
- * License version 2, as published by the Free Software Foundation, and
- * may be copied, distributed, and modified under those terms.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- */
-
-#ifndef __TEGRA_EMC_H_
-#define __TEGRA_EMC_H_
-
-#define TEGRA_EMC_NUM_REGS 46
-
-struct tegra_emc_table {
-       unsigned long rate;
-       u32 regs[TEGRA_EMC_NUM_REGS];
-};
-
-struct tegra_emc_pdata {
-       int num_tables;
-       struct tegra_emc_table *tables;
-};
-
-#endif