Merge branch 'devel-stable' into devel
authorRussell King <rmk+kernel@arm.linux.org.uk>
Mon, 17 May 2010 16:24:04 +0000 (17:24 +0100)
committerRussell King <rmk+kernel@arm.linux.org.uk>
Mon, 17 May 2010 16:24:04 +0000 (17:24 +0100)
Conflicts:
arch/arm/Kconfig
arch/arm/include/asm/system.h
arch/arm/mm/Kconfig

275 files changed:
Documentation/arm/00-INDEX
Documentation/arm/SPEAr/overview.txt [new file with mode: 0644]
MAINTAINERS
arch/arm/Kconfig
arch/arm/Makefile
arch/arm/boot/compressed/Makefile
arch/arm/boot/compressed/decompress.c
arch/arm/boot/compressed/piggy.lzma.S [new file with mode: 0644]
arch/arm/common/Kconfig
arch/arm/common/Makefile
arch/arm/common/clkdev.c
arch/arm/common/icst.c [new file with mode: 0644]
arch/arm/common/icst307.c [deleted file]
arch/arm/common/icst525.c [deleted file]
arch/arm/common/pl330.c [new file with mode: 0644]
arch/arm/common/vic.c
arch/arm/configs/spear300_defconfig [new file with mode: 0644]
arch/arm/configs/spear310_defconfig [new file with mode: 0644]
arch/arm/configs/spear320_defconfig [new file with mode: 0644]
arch/arm/configs/spear600_defconfig [new file with mode: 0644]
arch/arm/configs/stamp9g20_defconfig [new file with mode: 0644]
arch/arm/include/asm/hardware/arm_timer.h
arch/arm/include/asm/hardware/cache-l2x0.h
arch/arm/include/asm/hardware/icst.h [new file with mode: 0644]
arch/arm/include/asm/hardware/icst307.h [deleted file]
arch/arm/include/asm/hardware/icst525.h [deleted file]
arch/arm/include/asm/hardware/pl330.h [new file with mode: 0644]
arch/arm/include/asm/hardware/sp810.h [new file with mode: 0644]
arch/arm/include/asm/ioctls.h
arch/arm/include/asm/mach/pci.h
arch/arm/include/asm/mach/time.h
arch/arm/include/asm/pci.h
arch/arm/include/asm/perf_event.h
arch/arm/include/asm/pgtable.h
arch/arm/include/asm/pmu.h
arch/arm/include/asm/scatterlist.h
arch/arm/include/asm/smp.h
arch/arm/include/asm/system.h
arch/arm/kernel/bios32.c
arch/arm/kernel/dma.c
arch/arm/kernel/perf_event.c
arch/arm/kernel/pmu.c
arch/arm/kernel/smp.c
arch/arm/kernel/time.c
arch/arm/mach-at91/Kconfig
arch/arm/mach-at91/Makefile
arch/arm/mach-at91/board-stamp9g20.c [new file with mode: 0644]
arch/arm/mach-at91/include/mach/board.h
arch/arm/mach-at91/include/mach/cpu.h
arch/arm/mach-at91/include/mach/system.h
arch/arm/mach-bcmring/arch.c
arch/arm/mach-clps711x/mm.c
arch/arm/mach-ep93xx/adssphere.c
arch/arm/mach-ep93xx/clock.c
arch/arm/mach-ep93xx/core.c
arch/arm/mach-ep93xx/edb93xx.c
arch/arm/mach-ep93xx/gesbc9312.c
arch/arm/mach-ep93xx/include/mach/ep93xx-regs.h
arch/arm/mach-ep93xx/include/mach/platform.h
arch/arm/mach-ep93xx/micro9.c
arch/arm/mach-ep93xx/simone.c
arch/arm/mach-ep93xx/snappercl15.c
arch/arm/mach-ep93xx/ts72xx.c
arch/arm/mach-integrator/Kconfig
arch/arm/mach-integrator/Makefile
arch/arm/mach-integrator/common.h [deleted file]
arch/arm/mach-integrator/core.c
arch/arm/mach-integrator/cpu.c
arch/arm/mach-integrator/impd1.c
arch/arm/mach-integrator/include/mach/clkdev.h
arch/arm/mach-integrator/include/mach/entry-macro.S
arch/arm/mach-integrator/include/mach/hardware.h
arch/arm/mach-integrator/include/mach/platform.h
arch/arm/mach-integrator/integrator_ap.c
arch/arm/mach-integrator/integrator_cp.c
arch/arm/mach-integrator/leds.c
arch/arm/mach-integrator/pci_v3.c
arch/arm/mach-iop32x/n2100.c
arch/arm/mach-ixp4xx/common.c
arch/arm/mach-nomadik/Kconfig
arch/arm/mach-nomadik/Makefile
arch/arm/mach-nomadik/board-nhk8815.c
arch/arm/mach-nomadik/clock.c
arch/arm/mach-nomadik/clock.h
arch/arm/mach-nomadik/cpu-8815.c
arch/arm/mach-nomadik/include/mach/gpio.h
arch/arm/mach-omap1/board-htcherald.c
arch/arm/mach-omap2/devices.c
arch/arm/mach-omap2/omap_hwmod.c
arch/arm/mach-realview/Makefile
arch/arm/mach-realview/clock.c [deleted file]
arch/arm/mach-realview/clock.h [deleted file]
arch/arm/mach-realview/core.c
arch/arm/mach-realview/hotplug.c
arch/arm/mach-realview/include/mach/clkdev.h
arch/arm/mach-realview/include/mach/irqs-pb1176.h
arch/arm/mach-realview/include/mach/irqs-pba8.h
arch/arm/mach-realview/include/mach/irqs-pbx.h
arch/arm/mach-realview/include/mach/platform.h
arch/arm/mach-realview/realview_eb.c
arch/arm/mach-realview/realview_pb1176.c
arch/arm/mach-realview/realview_pb11mp.c
arch/arm/mach-realview/realview_pba8.c
arch/arm/mach-realview/realview_pbx.c
arch/arm/mach-spear3xx/Kconfig [new file with mode: 0644]
arch/arm/mach-spear3xx/Kconfig300 [new file with mode: 0644]
arch/arm/mach-spear3xx/Kconfig310 [new file with mode: 0644]
arch/arm/mach-spear3xx/Kconfig320 [new file with mode: 0644]
arch/arm/mach-spear3xx/Makefile [new file with mode: 0644]
arch/arm/mach-spear3xx/Makefile.boot [new file with mode: 0644]
arch/arm/mach-spear3xx/clock.c [new file with mode: 0644]
arch/arm/mach-spear3xx/include/mach/clkdev.h [new file with mode: 0644]
arch/arm/mach-spear3xx/include/mach/debug-macro.S [new file with mode: 0644]
arch/arm/mach-spear3xx/include/mach/entry-macro.S [new file with mode: 0644]
arch/arm/mach-spear3xx/include/mach/generic.h [new file with mode: 0644]
arch/arm/mach-spear3xx/include/mach/gpio.h [new file with mode: 0644]
arch/arm/mach-spear3xx/include/mach/hardware.h [new file with mode: 0644]
arch/arm/mach-spear3xx/include/mach/io.h [new file with mode: 0644]
arch/arm/mach-spear3xx/include/mach/irqs.h [new file with mode: 0644]
arch/arm/mach-spear3xx/include/mach/memory.h [new file with mode: 0644]
arch/arm/mach-spear3xx/include/mach/misc_regs.h [new file with mode: 0644]
arch/arm/mach-spear3xx/include/mach/spear.h [new file with mode: 0644]
arch/arm/mach-spear3xx/include/mach/spear300.h [new file with mode: 0644]
arch/arm/mach-spear3xx/include/mach/spear310.h [new file with mode: 0644]
arch/arm/mach-spear3xx/include/mach/spear320.h [new file with mode: 0644]
arch/arm/mach-spear3xx/include/mach/system.h [new file with mode: 0644]
arch/arm/mach-spear3xx/include/mach/timex.h [new file with mode: 0644]
arch/arm/mach-spear3xx/include/mach/uncompress.h [new file with mode: 0644]
arch/arm/mach-spear3xx/include/mach/vmalloc.h [new file with mode: 0644]
arch/arm/mach-spear3xx/spear300.c [new file with mode: 0644]
arch/arm/mach-spear3xx/spear300_evb.c [new file with mode: 0644]
arch/arm/mach-spear3xx/spear310.c [new file with mode: 0644]
arch/arm/mach-spear3xx/spear310_evb.c [new file with mode: 0644]
arch/arm/mach-spear3xx/spear320.c [new file with mode: 0644]
arch/arm/mach-spear3xx/spear320_evb.c [new file with mode: 0644]
arch/arm/mach-spear3xx/spear3xx.c [new file with mode: 0644]
arch/arm/mach-spear6xx/Kconfig [new file with mode: 0644]
arch/arm/mach-spear6xx/Kconfig600 [new file with mode: 0644]
arch/arm/mach-spear6xx/Makefile [new file with mode: 0644]
arch/arm/mach-spear6xx/Makefile.boot [new file with mode: 0644]
arch/arm/mach-spear6xx/clock.c [new file with mode: 0644]
arch/arm/mach-spear6xx/include/mach/clkdev.h [new file with mode: 0644]
arch/arm/mach-spear6xx/include/mach/debug-macro.S [new file with mode: 0644]
arch/arm/mach-spear6xx/include/mach/entry-macro.S [new file with mode: 0644]
arch/arm/mach-spear6xx/include/mach/generic.h [new file with mode: 0644]
arch/arm/mach-spear6xx/include/mach/gpio.h [new file with mode: 0644]
arch/arm/mach-spear6xx/include/mach/hardware.h [new file with mode: 0644]
arch/arm/mach-spear6xx/include/mach/io.h [new file with mode: 0644]
arch/arm/mach-spear6xx/include/mach/irqs.h [new file with mode: 0644]
arch/arm/mach-spear6xx/include/mach/memory.h [new file with mode: 0644]
arch/arm/mach-spear6xx/include/mach/misc_regs.h [new file with mode: 0644]
arch/arm/mach-spear6xx/include/mach/spear.h [new file with mode: 0644]
arch/arm/mach-spear6xx/include/mach/spear600.h [new file with mode: 0644]
arch/arm/mach-spear6xx/include/mach/system.h [new file with mode: 0644]
arch/arm/mach-spear6xx/include/mach/timex.h [new file with mode: 0644]
arch/arm/mach-spear6xx/include/mach/uncompress.h [new file with mode: 0644]
arch/arm/mach-spear6xx/include/mach/vmalloc.h [new file with mode: 0644]
arch/arm/mach-spear6xx/spear600.c [new file with mode: 0644]
arch/arm/mach-spear6xx/spear600_evb.c [new file with mode: 0644]
arch/arm/mach-spear6xx/spear6xx.c [new file with mode: 0644]
arch/arm/mach-u300/mmc.c
arch/arm/mach-ux500/Kconfig
arch/arm/mach-ux500/Makefile
arch/arm/mach-ux500/board-mop500.c
arch/arm/mach-ux500/board-u5500.c [new file with mode: 0644]
arch/arm/mach-ux500/clock.c
arch/arm/mach-ux500/clock.h [new file with mode: 0644]
arch/arm/mach-ux500/cpu-db5500.c [new file with mode: 0644]
arch/arm/mach-ux500/cpu-db8500.c [moved from arch/arm/mach-ux500/cpu-u8500.c with 53% similarity]
arch/arm/mach-ux500/cpu.c [new file with mode: 0644]
arch/arm/mach-ux500/devices-db5500.c [new file with mode: 0644]
arch/arm/mach-ux500/devices-db8500.c [new file with mode: 0644]
arch/arm/mach-ux500/devices.c [new file with mode: 0644]
arch/arm/mach-ux500/include/mach/db5500-regs.h [new file with mode: 0644]
arch/arm/mach-ux500/include/mach/db8500-regs.h [new file with mode: 0644]
arch/arm/mach-ux500/include/mach/debug-macro.S
arch/arm/mach-ux500/include/mach/devices.h [new file with mode: 0644]
arch/arm/mach-ux500/include/mach/entry-macro.S
arch/arm/mach-ux500/include/mach/gpio.h [new file with mode: 0644]
arch/arm/mach-ux500/include/mach/hardware.h
arch/arm/mach-ux500/include/mach/irqs.h
arch/arm/mach-ux500/include/mach/setup.h
arch/arm/mach-ux500/platsmp.c
arch/arm/mach-versatile/Makefile
arch/arm/mach-versatile/clock.c [deleted file]
arch/arm/mach-versatile/clock.h [deleted file]
arch/arm/mach-versatile/core.c
arch/arm/mach-versatile/include/mach/clkdev.h
arch/arm/mach-versatile/include/mach/entry-macro.S
arch/arm/mach-versatile/include/mach/hardware.h
arch/arm/mach-versatile/include/mach/platform.h
arch/arm/mach-vexpress/Kconfig [new file with mode: 0644]
arch/arm/mach-vexpress/Makefile [new file with mode: 0644]
arch/arm/mach-vexpress/Makefile.boot [new file with mode: 0644]
arch/arm/mach-vexpress/core.h [new file with mode: 0644]
arch/arm/mach-vexpress/ct-ca9x4.c [new file with mode: 0644]
arch/arm/mach-vexpress/headsmp.S [new file with mode: 0644]
arch/arm/mach-vexpress/include/mach/clkdev.h [new file with mode: 0644]
arch/arm/mach-vexpress/include/mach/ct-ca9x4.h [new file with mode: 0644]
arch/arm/mach-vexpress/include/mach/debug-macro.S [new file with mode: 0644]
arch/arm/mach-vexpress/include/mach/entry-macro.S [new file with mode: 0644]
arch/arm/mach-vexpress/include/mach/hardware.h [new file with mode: 0644]
arch/arm/mach-vexpress/include/mach/io.h [new file with mode: 0644]
arch/arm/mach-vexpress/include/mach/irqs.h [new file with mode: 0644]
arch/arm/mach-vexpress/include/mach/memory.h [new file with mode: 0644]
arch/arm/mach-vexpress/include/mach/motherboard.h [new file with mode: 0644]
arch/arm/mach-vexpress/include/mach/smp.h [new file with mode: 0644]
arch/arm/mach-vexpress/include/mach/system.h [new file with mode: 0644]
arch/arm/mach-vexpress/include/mach/timex.h [new file with mode: 0644]
arch/arm/mach-vexpress/include/mach/uncompress.h [new file with mode: 0644]
arch/arm/mach-vexpress/include/mach/vmalloc.h [new file with mode: 0644]
arch/arm/mach-vexpress/localtimer.c [new file with mode: 0644]
arch/arm/mach-vexpress/platsmp.c [new file with mode: 0644]
arch/arm/mach-vexpress/v2m.c [new file with mode: 0644]
arch/arm/mm/Kconfig
arch/arm/mm/alignment.c
arch/arm/mm/cache-l2x0.c
arch/arm/mm/fault-armv.c
arch/arm/mm/fault.c
arch/arm/mm/init.c
arch/arm/mm/mm.h
arch/arm/mm/mmu.c
arch/arm/nwfpe/fpmodule.c
arch/arm/oprofile/Makefile
arch/arm/oprofile/backtrace.c [deleted file]
arch/arm/oprofile/common.c
arch/arm/oprofile/op_arm_model.h [deleted file]
arch/arm/oprofile/op_counter.h [deleted file]
arch/arm/oprofile/op_model_arm11_core.c [deleted file]
arch/arm/oprofile/op_model_arm11_core.h [deleted file]
arch/arm/oprofile/op_model_mpcore.c [deleted file]
arch/arm/oprofile/op_model_mpcore.h [deleted file]
arch/arm/oprofile/op_model_v6.c [deleted file]
arch/arm/oprofile/op_model_v7.c [deleted file]
arch/arm/oprofile/op_model_v7.h [deleted file]
arch/arm/oprofile/op_model_xscale.c [deleted file]
arch/arm/plat-iop/Makefile
arch/arm/plat-iop/pmu.c [new file with mode: 0644]
arch/arm/plat-nomadik/Kconfig
arch/arm/plat-nomadik/Makefile
arch/arm/plat-nomadik/gpio.c [moved from arch/arm/mach-nomadik/gpio.c with 74% similarity]
arch/arm/plat-nomadik/include/plat/gpio.h [new file with mode: 0644]
arch/arm/plat-nomadik/timer.c
arch/arm/plat-pxa/Makefile
arch/arm/plat-pxa/pmu.c [new file with mode: 0644]
arch/arm/plat-spear/Kconfig [new file with mode: 0644]
arch/arm/plat-spear/Makefile [new file with mode: 0644]
arch/arm/plat-spear/clock.c [new file with mode: 0644]
arch/arm/plat-spear/include/plat/clkdev.h [new file with mode: 0644]
arch/arm/plat-spear/include/plat/clock.h [new file with mode: 0644]
arch/arm/plat-spear/include/plat/debug-macro.S [new file with mode: 0644]
arch/arm/plat-spear/include/plat/gpio.h [new file with mode: 0644]
arch/arm/plat-spear/include/plat/io.h [new file with mode: 0644]
arch/arm/plat-spear/include/plat/memory.h [new file with mode: 0644]
arch/arm/plat-spear/include/plat/padmux.h [new file with mode: 0644]
arch/arm/plat-spear/include/plat/shirq.h [new file with mode: 0644]
arch/arm/plat-spear/include/plat/system.h [new file with mode: 0644]
arch/arm/plat-spear/include/plat/timex.h [new file with mode: 0644]
arch/arm/plat-spear/include/plat/uncompress.h [new file with mode: 0644]
arch/arm/plat-spear/include/plat/vmalloc.h [new file with mode: 0644]
arch/arm/plat-spear/padmux.c [new file with mode: 0644]
arch/arm/plat-spear/shirq.c [new file with mode: 0644]
arch/arm/plat-spear/time.c [new file with mode: 0644]
arch/arm/plat-versatile/Makefile [new file with mode: 0644]
arch/arm/plat-versatile/clock.c [moved from arch/arm/mach-integrator/clock.c with 59% similarity]
arch/arm/plat-versatile/include/plat/clock.h [new file with mode: 0644]
arch/arm/plat-versatile/include/plat/timer-sp.h [new file with mode: 0644]
arch/arm/plat-versatile/sched-clock.c [new file with mode: 0644]
arch/arm/plat-versatile/timer-sp.c [new file with mode: 0644]
drivers/i2c/busses/Kconfig
drivers/mmc/host/mmci.c
drivers/mmc/host/mmci.h
drivers/serial/atmel_serial.c
drivers/usb/gadget/at91_udc.c
include/linux/amba/mmci.h

index 82e418d..7f5fc3b 100644 (file)
@@ -20,6 +20,8 @@ Samsung-S3C24XX
        - S3C24XX ARM Linux Overview
 Sharp-LH
        - Linux on Sharp LH79524 and LH7A40X System On a Chip (SOC)
+SPEAr
+       - ST SPEAr platform Linux Overview
 VFP/
        - Release notes for Linux Kernel Vector Floating Point support code
 empeg/
diff --git a/Documentation/arm/SPEAr/overview.txt b/Documentation/arm/SPEAr/overview.txt
new file mode 100644 (file)
index 0000000..253a35c
--- /dev/null
@@ -0,0 +1,60 @@
+                       SPEAr ARM Linux Overview
+                       ==========================
+
+Introduction
+------------
+
+  SPEAr (Structured Processor Enhanced Architecture).
+  weblink : http://www.st.com/spear
+
+  The ST Microelectronics SPEAr range of ARM9/CortexA9 System-on-Chip CPUs are
+  supported by the 'spear' platform of ARM Linux. Currently SPEAr300,
+  SPEAr310, SPEAr320 and SPEAr600 SOCs are supported. Support for the SPEAr13XX
+  series is in progress.
+
+  Hierarchy in SPEAr is as follows:
+
+  SPEAr (Platform)
+       - SPEAr3XX (3XX SOC series, based on ARM9)
+               - SPEAr300 (SOC)
+                       - SPEAr300_EVB (Evaluation Board)
+               - SPEAr310 (SOC)
+                       - SPEAr310_EVB (Evaluation Board)
+               - SPEAr320 (SOC)
+                       - SPEAr320_EVB (Evaluation Board)
+       - SPEAr6XX (6XX SOC series, based on ARM9)
+               - SPEAr600 (SOC)
+                       - SPEAr600_EVB (Evaluation Board)
+       - SPEAr13XX (13XX SOC series, based on ARM CORTEXA9)
+               - SPEAr1300 (SOC)
+
+  Configuration
+  -------------
+
+  A generic configuration is provided for each machine, and can be used as the
+  default by
+       make spear600_defconfig
+       make spear300_defconfig
+       make spear310_defconfig
+       make spear320_defconfig
+
+  Layout
+  ------
+
+  The common files for multiple machine families (SPEAr3XX, SPEAr6XX and
+  SPEAr13XX) are located in the platform code contained in arch/arm/plat-spear
+  with headers in plat/.
+
+  Each machine series have a directory with name arch/arm/mach-spear followed by
+  series name. Like mach-spear3xx, mach-spear6xx and mach-spear13xx.
+
+  Common file for machines of spear3xx family is mach-spear3xx/spear3xx.c and for
+  spear6xx is mach-spear6xx/spear6xx.c. mach-spear* also contain soc/machine
+  specific files, like spear300.c, spear310.c, spear320.c and spear600.c.
+  mach-spear* also contains board specific files for each machine type.
+
+
+  Document Author
+  ---------------
+
+  Viresh Kumar, (c) 2010 ST Microelectronics
index a67112f..c84f003 100644 (file)
@@ -5272,6 +5272,46 @@ F:       drivers/serial/sunsu.c
 F:     drivers/serial/sunzilog.c
 F:     drivers/serial/sunzilog.h
 
+SPEAR PLATFORM SUPPORT
+M:     Viresh Kumar <viresh.kumar@st.com>
+W:     http://www.st.com/spear
+S:     Maintained
+F:     arch/arm/plat-spear/
+
+SPEAR3XX MACHINE SUPPORT
+M:     Viresh Kumar <viresh.kumar@st.com>
+W:     http://www.st.com/spear
+S:     Maintained
+F:     arch/arm/mach-spear3xx/
+
+SPEAR6XX MACHINE SUPPORT
+M:     Rajeev Kumar <rajeev-dlh.kumar@st.com>
+W:     http://www.st.com/spear
+S:     Maintained
+F:     arch/arm/mach-spear6xx/
+
+SPEAR CLOCK FRAMEWORK SUPPORT
+M:     Viresh Kumar <viresh.kumar@st.com>
+W:     http://www.st.com/spear
+S:     Maintained
+F:     arch/arm/mach-spear*/clock.c
+F:     arch/arm/mach-spear*/include/mach/clkdev.h
+F:     arch/arm/plat-spear/clock.c
+F:     arch/arm/plat-spear/include/plat/clock.h and clkdev.h
+
+SPEAR PAD MULTIPLEXING SUPPORT
+M:     Viresh Kumar <viresh.kumar@st.com>
+W:     http://www.st.com/spear
+S:     Maintained
+F:     arch/arm/plat-spear/include/plat/padmux.h
+F:     arch/arm/plat-spear/padmux.c
+F:     arch/arm/mach-spear*/spear*xx.c
+F:     arch/arm/mach-spear*/include/mach/generic.h
+F:     arch/arm/mach-spear3xx/spear3*0.c
+F:     arch/arm/mach-spear3xx/spear3*0_evb.c
+F:     arch/arm/mach-spear6xx/spear600.c
+F:     arch/arm/mach-spear6xx/spear600_evb.c
+
 SPECIALIX IO8+ MULTIPORT SERIAL CARD DRIVER
 M:     Roger Wolff <R.E.Wolff@BitWizard.nl>
 S:     Supported
index ae0ecda..492f813 100644 (file)
@@ -13,7 +13,7 @@ config ARM
        select RTC_LIB
        select SYS_SUPPORTS_APM_EMULATION
        select GENERIC_ATOMIC64 if (!CPU_32v6K)
-       select HAVE_OPROFILE
+       select HAVE_OPROFILE if (HAVE_PERF_EVENTS)
        select HAVE_ARCH_KGDB
        select HAVE_KPROBES if (!XIP_KERNEL)
        select HAVE_KRETPROBES if (HAVE_KPROBES)
@@ -21,6 +21,7 @@ config ARM
        select HAVE_GENERIC_DMA_COHERENT
        select HAVE_KERNEL_GZIP
        select HAVE_KERNEL_LZO
+       select HAVE_KERNEL_LZMA
        select HAVE_PERF_EVENTS
        select PERF_USE_VMALLOC
        help
@@ -42,6 +43,11 @@ config GENERIC_GPIO
 
 config GENERIC_TIME
        bool
+       default y
+
+config ARCH_USES_GETTIMEOFFSET
+       bool
+       default n
 
 config GENERIC_CLOCKEVENTS
        bool
@@ -175,28 +181,6 @@ config ARM_L1_CACHE_SHIFT_6
        help
          Setting ARM L1 cache line size to 64 Bytes.
 
-if OPROFILE
-
-config OPROFILE_ARMV6
-       def_bool y
-       depends on CPU_V6 && !SMP
-       select OPROFILE_ARM11_CORE
-
-config OPROFILE_MPCORE
-       def_bool y
-       depends on CPU_V6 && SMP
-       select OPROFILE_ARM11_CORE
-
-config OPROFILE_ARM11_CORE
-       bool
-
-config OPROFILE_ARMV7
-       def_bool y
-       depends on CPU_V7 && !SMP
-       bool
-
-endif
-
 config VECTORS_BASE
        hex
        default 0xffff0000 if MMU || CPU_HIGH_VECTOR
@@ -231,6 +215,7 @@ config ARCH_AAEC2000
        select CPU_ARM920T
        select ARM_AMBA
        select HAVE_CLK
+       select ARCH_USES_GETTIMEOFFSET
        help
          This enables support for systems based on the Agilent AAEC-2000
 
@@ -238,21 +223,24 @@ config ARCH_INTEGRATOR
        bool "ARM Ltd. Integrator family"
        select ARM_AMBA
        select ARCH_HAS_CPUFREQ
-       select HAVE_CLK
        select COMMON_CLKDEV
-       select ICST525
+       select ICST
+       select GENERIC_TIME
+       select GENERIC_CLOCKEVENTS
+       select PLAT_VERSATILE
        help
          Support for ARM's Integrator platform.
 
 config ARCH_REALVIEW
        bool "ARM Ltd. RealView family"
        select ARM_AMBA
-       select HAVE_CLK
        select COMMON_CLKDEV
-       select ICST307
+       select ICST
        select GENERIC_TIME
        select GENERIC_CLOCKEVENTS
        select ARCH_WANT_OPTIONAL_GPIOLIB
+       select PLAT_VERSATILE
+       select ARM_TIMER_SP804
        select GPIO_PL061 if GPIOLIB
        help
          This enables support for ARM Ltd RealView boards.
@@ -261,20 +249,35 @@ config ARCH_VERSATILE
        bool "ARM Ltd. Versatile family"
        select ARM_AMBA
        select ARM_VIC
-       select HAVE_CLK
        select COMMON_CLKDEV
-       select ICST307
+       select ICST
        select GENERIC_TIME
        select GENERIC_CLOCKEVENTS
        select ARCH_WANT_OPTIONAL_GPIOLIB
+       select PLAT_VERSATILE
+       select ARM_TIMER_SP804
        help
          This enables support for ARM Ltd Versatile board.
 
+config ARCH_VEXPRESS
+       bool "ARM Ltd. Versatile Express family"
+       select ARCH_WANT_OPTIONAL_GPIOLIB
+       select ARM_AMBA
+       select ARM_TIMER_SP804
+       select COMMON_CLKDEV
+       select GENERIC_CLOCKEVENTS
+       select GENERIC_TIME
+       select HAVE_CLK
+       select ICST
+       select PLAT_VERSATILE
+       help
+         This enables support for the ARM Ltd Versatile Express boards.
+
 config ARCH_AT91
        bool "Atmel AT91"
-       select GENERIC_GPIO
        select ARCH_REQUIRE_GPIOLIB
        select HAVE_CLK
+       select ARCH_USES_GETTIMEOFFSET
        help
          This enables support for systems based on the Atmel AT91RM9200,
          AT91SAM9 and AT91CAP9 processors.
@@ -294,6 +297,7 @@ config ARCH_BCMRING
 config ARCH_CLPS711X
        bool "Cirrus Logic CLPS711x/EP721x-based"
        select CPU_ARM720T
+       select ARCH_USES_GETTIMEOFFSET
        help
          Support for Cirrus Logic 711x/721x based boards.
 
@@ -309,8 +313,8 @@ config ARCH_CNS3XXX
 config ARCH_GEMINI
        bool "Cortina Systems Gemini"
        select CPU_FA526
-       select GENERIC_GPIO
        select ARCH_REQUIRE_GPIOLIB
+       select ARCH_USES_GETTIMEOFFSET
        help
          Support for the Cortina Systems Gemini family SoCs
 
@@ -319,6 +323,7 @@ config ARCH_EBSA110
        select CPU_SA110
        select ISA
        select NO_IOPORT
+       select ARCH_USES_GETTIMEOFFSET
        help
          This is an evaluation board for the StrongARM processor available
          from Digital. It has limited hardware on-board, including an
@@ -330,11 +335,10 @@ config ARCH_EP93XX
        select CPU_ARM920T
        select ARM_AMBA
        select ARM_VIC
-       select GENERIC_GPIO
-       select HAVE_CLK
        select COMMON_CLKDEV
        select ARCH_REQUIRE_GPIOLIB
        select ARCH_HAS_HOLES_MEMORYMODEL
+       select ARCH_USES_GETTIMEOFFSET
        help
          This enables support for the Cirrus EP93xx series of CPUs.
 
@@ -342,6 +346,7 @@ config ARCH_FOOTBRIDGE
        bool "FootBridge"
        select CPU_SA110
        select FOOTBRIDGE
+       select ARCH_USES_GETTIMEOFFSET
        help
          Support for systems based on the DC21285 companion chip
          ("FootBridge"), such as the Simtec CATS and the Rebel NetWinder.
@@ -351,7 +356,6 @@ config ARCH_MXC
        select GENERIC_TIME
        select GENERIC_CLOCKEVENTS
        select ARCH_REQUIRE_GPIOLIB
-       select HAVE_CLK
        select COMMON_CLKDEV
        help
          Support for Freescale MXC/iMX-based family of processors
@@ -359,12 +363,10 @@ config ARCH_MXC
 config ARCH_STMP3XXX
        bool "Freescale STMP3xxx"
        select CPU_ARM926T
-       select HAVE_CLK
        select COMMON_CLKDEV
        select ARCH_REQUIRE_GPIOLIB
        select GENERIC_TIME
        select GENERIC_CLOCKEVENTS
-       select GENERIC_GPIO
        select USB_ARCH_HAS_EHCI
        help
          Support for systems based on the Freescale 3xxx CPUs.
@@ -382,6 +384,7 @@ config ARCH_H720X
        bool "Hynix HMS720x-based"
        select CPU_ARM720T
        select ISA_DMA_API
+       select ARCH_USES_GETTIMEOFFSET
        help
          This enables support for systems based on the Hynix HMS720x
 
@@ -402,7 +405,6 @@ config ARCH_IOP32X
        select CPU_XSCALE
        select PLAT_IOP
        select PCI
-       select GENERIC_GPIO
        select ARCH_REQUIRE_GPIOLIB
        help
          Support for Intel's 80219 and IOP32X (XScale) family of
@@ -414,7 +416,6 @@ config ARCH_IOP33X
        select CPU_XSCALE
        select PLAT_IOP
        select PCI
-       select GENERIC_GPIO
        select ARCH_REQUIRE_GPIOLIB
        help
          Support for Intel's IOP33X (XScale) family of processors.
@@ -424,6 +425,7 @@ config ARCH_IXP23XX
        depends on MMU
        select CPU_XSC3
        select PCI
+       select ARCH_USES_GETTIMEOFFSET
        help
          Support for Intel's IXP23xx (XScale) family of processors.
 
@@ -432,6 +434,7 @@ config ARCH_IXP2000
        depends on MMU
        select CPU_XSCALE
        select PCI
+       select ARCH_USES_GETTIMEOFFSET
        help
          Support for Intel's IXP2400/2800 (XScale) family of processors.
 
@@ -450,6 +453,7 @@ config ARCH_L7200
        bool "LinkUp-L7200"
        select CPU_ARM720T
        select FIQ
+       select ARCH_USES_GETTIMEOFFSET
        help
          Say Y here if you intend to run this kernel on a LinkUp Systems
          L7200 Software Development Board which uses an ARM720T processor.
@@ -463,7 +467,6 @@ config ARCH_L7200
 config ARCH_DOVE
        bool "Marvell Dove"
        select PCI
-       select GENERIC_GPIO
        select ARCH_REQUIRE_GPIOLIB
        select GENERIC_TIME
        select GENERIC_CLOCKEVENTS
@@ -475,7 +478,6 @@ config ARCH_KIRKWOOD
        bool "Marvell Kirkwood"
        select CPU_FEROCEON
        select PCI
-       select GENERIC_GPIO
        select ARCH_REQUIRE_GPIOLIB
        select GENERIC_TIME
        select GENERIC_CLOCKEVENTS
@@ -497,7 +499,6 @@ config ARCH_MV78XX0
        bool "Marvell MV78xx0"
        select CPU_FEROCEON
        select PCI
-       select GENERIC_GPIO
        select ARCH_REQUIRE_GPIOLIB
        select GENERIC_TIME
        select GENERIC_CLOCKEVENTS
@@ -511,7 +512,6 @@ config ARCH_ORION5X
        depends on MMU
        select CPU_FEROCEON
        select PCI
-       select GENERIC_GPIO
        select ARCH_REQUIRE_GPIOLIB
        select GENERIC_TIME
        select GENERIC_CLOCKEVENTS
@@ -524,9 +524,7 @@ config ARCH_ORION5X
 config ARCH_MMP
        bool "Marvell PXA168/910/MMP2"
        depends on MMU
-       select GENERIC_GPIO
        select ARCH_REQUIRE_GPIOLIB
-       select HAVE_CLK
        select COMMON_CLKDEV
        select GENERIC_TIME
        select GENERIC_CLOCKEVENTS
@@ -538,8 +536,8 @@ config ARCH_MMP
 config ARCH_KS8695
        bool "Micrel/Kendin KS8695"
        select CPU_ARM922T
-       select GENERIC_GPIO
-        select ARCH_REQUIRE_GPIOLIB
+       select ARCH_REQUIRE_GPIOLIB
+       select ARCH_USES_GETTIMEOFFSET
        help
          Support for Micrel/Kendin KS8695 "Centaur" (ARM922T) based
          System-on-Chip devices.
@@ -561,8 +559,6 @@ config ARCH_W90X900
        bool "Nuvoton W90X900 CPU"
        select CPU_ARM926T
        select ARCH_REQUIRE_GPIOLIB
-       select GENERIC_GPIO
-       select HAVE_CLK
        select COMMON_CLKDEV
        select GENERIC_TIME
        select GENERIC_CLOCKEVENTS
@@ -578,7 +574,6 @@ config ARCH_W90X900
 config ARCH_NUC93X
        bool "Nuvoton NUC93X CPU"
        select CPU_ARM926T
-       select HAVE_CLK
        select COMMON_CLKDEV
        help
          Support for Nuvoton (Winbond logic dept.) NUC93X MCU,The NUC93X is a
@@ -587,8 +582,8 @@ config ARCH_NUC93X
 config ARCH_PNX4008
        bool "Philips Nexperia PNX4008 Mobile"
        select CPU_ARM926T
-       select HAVE_CLK
        select COMMON_CLKDEV
+       select ARCH_USES_GETTIMEOFFSET
        help
          This enables support for Philips PNX4008 mobile platform.
 
@@ -597,8 +592,6 @@ config ARCH_PXA
        depends on MMU
        select ARCH_MTD_XIP
        select ARCH_HAS_CPUFREQ
-       select GENERIC_GPIO
-       select HAVE_CLK
        select COMMON_CLKDEV
        select ARCH_REQUIRE_GPIOLIB
        select GENERIC_TIME
@@ -635,6 +628,7 @@ config ARCH_RPC
        select ISA_DMA_API
        select NO_IOPORT
        select ARCH_SPARSEMEM_ENABLE
+       select ARCH_USES_GETTIMEOFFSET
        help
          On the Acorn Risc-PC, Linux can support the internal IDE disk and
          CD-ROM interface, serial and parallel port, and the floppy drive.
@@ -647,7 +641,6 @@ config ARCH_SA1100
        select ARCH_MTD_XIP
        select ARCH_HAS_CPUFREQ
        select CPU_FREQ
-       select GENERIC_GPIO
        select GENERIC_TIME
        select GENERIC_CLOCKEVENTS
        select HAVE_CLK
@@ -661,6 +654,7 @@ config ARCH_S3C2410
        select GENERIC_GPIO
        select ARCH_HAS_CPUFREQ
        select HAVE_CLK
+       select ARCH_USES_GETTIMEOFFSET
        help
          Samsung S3C2410X CPU based systems, such as the Simtec Electronics
          BAST (<http://www.simtec.co.uk/products/EB110ITX/>), the IPAQ 1940 or
@@ -674,10 +668,10 @@ config ARCH_S3C64XX
        bool "Samsung S3C64XX"
        select PLAT_SAMSUNG
        select CPU_V6
-       select GENERIC_GPIO
        select ARM_VIC
        select HAVE_CLK
        select NO_IOPORT
+       select ARCH_USES_GETTIMEOFFSET
        select ARCH_HAS_CPUFREQ
        select ARCH_REQUIRE_GPIOLIB
        select SAMSUNG_CLKSRC
@@ -734,6 +728,7 @@ config ARCH_SHARK
        select ISA_DMA
        select ZONE_DMA
        select PCI
+       select ARCH_USES_GETTIMEOFFSET
        help
          Support for the StrongARM based Digital DNARD machine, also known
          as "Shark" (<http://www.shark-linux.de/shark.html>).
@@ -743,6 +738,7 @@ config ARCH_LH7A40X
        select CPU_ARM922T
        select ARCH_DISCONTIGMEM_ENABLE if !LH7A40X_CONTIGMEM
        select ARCH_SPARSEMEM_ENABLE if !LH7A40X_CONTIGMEM
+       select ARCH_USES_GETTIMEOFFSET
        help
          Say Y here for systems based on one of the Sharp LH7A40X
          System on a Chip processors.  These CPUs include an ARM922T
@@ -758,7 +754,6 @@ config ARCH_U300
        select ARM_VIC
        select GENERIC_TIME
        select GENERIC_CLOCKEVENTS
-       select HAVE_CLK
        select COMMON_CLKDEV
        select GENERIC_GPIO
        help
@@ -771,6 +766,7 @@ config ARCH_U8500
        select GENERIC_TIME
        select GENERIC_CLOCKEVENTS
        select COMMON_CLKDEV
+       select ARCH_REQUIRE_GPIOLIB
        help
          Support for ST-Ericsson's Ux500 architecture
 
@@ -779,11 +775,9 @@ config ARCH_NOMADIK
        select ARM_AMBA
        select ARM_VIC
        select CPU_ARM926T
-       select HAVE_CLK
        select COMMON_CLKDEV
        select GENERIC_TIME
        select GENERIC_CLOCKEVENTS
-       select GENERIC_GPIO
        select ARCH_REQUIRE_GPIOLIB
        help
          Support for the Nomadik platform by ST-Ericsson
@@ -793,9 +787,7 @@ config ARCH_DAVINCI
        select CPU_ARM926T
        select GENERIC_TIME
        select GENERIC_CLOCKEVENTS
-       select GENERIC_GPIO
        select ARCH_REQUIRE_GPIOLIB
-       select HAVE_CLK
        select ZONE_DMA
        select HAVE_IDE
        select COMMON_CLKDEV
@@ -806,7 +798,6 @@ config ARCH_DAVINCI
 
 config ARCH_OMAP
        bool "TI OMAP"
-       select GENERIC_GPIO
        select HAVE_CLK
        select ARCH_REQUIRE_GPIOLIB
        select ARCH_HAS_CPUFREQ
@@ -816,6 +807,17 @@ config ARCH_OMAP
        help
          Support for TI's OMAP platform (OMAP1 and OMAP2).
 
+config PLAT_SPEAR
+       bool "ST SPEAr"
+       select ARM_AMBA
+       select ARCH_REQUIRE_GPIOLIB
+       select COMMON_CLKDEV
+       select GENERIC_CLOCKEVENTS
+       select GENERIC_TIME
+       select HAVE_CLK
+       help
+         Support for ST's SPEAr platform (SPEAr3xx, SPEAr6xx and SPEAr13xx).
+
 endchoice
 
 #
@@ -903,6 +905,7 @@ source "arch/arm/plat-samsung/Kconfig"
 source "arch/arm/plat-s3c24xx/Kconfig"
 source "arch/arm/plat-s5p/Kconfig"
 source "arch/arm/plat-s5pc1xx/Kconfig"
+source "arch/arm/plat-spear/Kconfig"
 
 if ARCH_S3C2410
 source "arch/arm/mach-s3c2400/Kconfig"
@@ -937,6 +940,8 @@ source "arch/arm/mach-ux500/Kconfig"
 
 source "arch/arm/mach-versatile/Kconfig"
 
+source "arch/arm/mach-vexpress/Kconfig"
+
 source "arch/arm/mach-w90x900/Kconfig"
 
 # Definitions to make life easier
@@ -954,6 +959,12 @@ config PLAT_ORION
 config PLAT_PXA
        bool
 
+config PLAT_VERSATILE
+       bool
+
+config ARM_TIMER_SP804
+       bool
+
 source arch/arm/mm/Kconfig
 
 config IWMMXT
@@ -1082,6 +1093,10 @@ config PCI
          your box. Other bus systems are ISA, EISA, MicroChannel (MCA) or
          VESA. If you have PCI, say Y, otherwise N.
 
+config PCI_DOMAINS
+       bool
+       depends on PCI
+
 config PCI_SYSCALL
        def_bool PCI
 
@@ -1110,10 +1125,11 @@ source "kernel/time/Kconfig"
 config SMP
        bool "Symmetric Multi-Processing (EXPERIMENTAL)"
        depends on EXPERIMENTAL && (REALVIEW_EB_ARM11MP || REALVIEW_EB_A9MP ||\
-                MACH_REALVIEW_PB11MP || MACH_REALVIEW_PBX || ARCH_OMAP4 || ARCH_U8500)
+                MACH_REALVIEW_PB11MP || MACH_REALVIEW_PBX || ARCH_OMAP4 ||\
+                ARCH_U8500 || ARCH_VEXPRESS_CA9X4)
        depends on GENERIC_CLOCKEVENTS
        select USE_GENERIC_SMP_HELPERS
-       select HAVE_ARM_SCU if (ARCH_REALVIEW || ARCH_OMAP4 || ARCH_U8500)
+       select HAVE_ARM_SCU if (ARCH_REALVIEW || ARCH_OMAP4 || ARCH_U8500 || ARCH_VEXPRESS_CA9X4)
        help
          This enables support for systems with more than one CPU. If you have
          a system with only one CPU, like most personal computers, say N. If
@@ -1294,7 +1310,7 @@ config HIGHPTE
 
 config HW_PERF_EVENTS
        bool "Enable hardware performance counter support for perf events"
-       depends on PERF_EVENTS && CPU_HAS_PMU && (CPU_V6 || CPU_V7)
+       depends on PERF_EVENTS && CPU_HAS_PMU
        default y
        help
          Enable hardware performance counter support for perf events. If
index 7cdaf5a..d5af3b0 100644 (file)
@@ -176,9 +176,14 @@ machine-$(CONFIG_ARCH_STMP37XX)            := stmp37xx
 machine-$(CONFIG_ARCH_U300)            := u300
 machine-$(CONFIG_ARCH_U8500)           := ux500
 machine-$(CONFIG_ARCH_VERSATILE)       := versatile
+machine-$(CONFIG_ARCH_VEXPRESS)                := vexpress
 machine-$(CONFIG_ARCH_W90X900)         := w90x900
 machine-$(CONFIG_ARCH_NUC93X)          := nuc93x
 machine-$(CONFIG_FOOTBRIDGE)           := footbridge
+machine-$(CONFIG_MACH_SPEAR300)                := spear3xx
+machine-$(CONFIG_MACH_SPEAR310)                := spear3xx
+machine-$(CONFIG_MACH_SPEAR320)                := spear3xx
+machine-$(CONFIG_MACH_SPEAR600)                := spear6xx
 
 # Platform directory name.  This list is sorted alphanumerically
 # by CONFIG_* macro name.
@@ -193,6 +198,8 @@ plat-$(CONFIG_PLAT_PXA)             := pxa
 plat-$(CONFIG_PLAT_S3C24XX)    := s3c24xx samsung
 plat-$(CONFIG_PLAT_S5PC1XX)    := s5pc1xx samsung
 plat-$(CONFIG_PLAT_S5P)                := s5p samsung
+plat-$(CONFIG_PLAT_SPEAR)      := spear
+plat-$(CONFIG_PLAT_VERSATILE)  := versatile
 
 ifeq ($(CONFIG_ARCH_EBSA110),y)
 # This is what happens if you forget the IOCS16 line.
index 97c89e7..53faa90 100644 (file)
@@ -65,6 +65,7 @@ SEDFLAGS      = s/TEXT_START/$(ZTEXTADDR)/;s/BSS_START/$(ZBSSADDR)/
 
 suffix_$(CONFIG_KERNEL_GZIP) = gzip
 suffix_$(CONFIG_KERNEL_LZO)  = lzo
+suffix_$(CONFIG_KERNEL_LZMA) = lzma
 
 targets       := vmlinux vmlinux.lds \
                 piggy.$(suffix_y) piggy.$(suffix_y).o \
index 9c09707..4c72a97 100644 (file)
@@ -40,6 +40,10 @@ extern void error(char *);
 #include "../../../../lib/decompress_unlzo.c"
 #endif
 
+#ifdef CONFIG_KERNEL_LZMA
+#include "../../../../lib/decompress_unlzma.c"
+#endif
+
 void do_decompress(u8 *input, int len, u8 *output, void (*error)(char *x))
 {
        decompress(input, len, NULL, NULL, output, NULL, error);
diff --git a/arch/arm/boot/compressed/piggy.lzma.S b/arch/arm/boot/compressed/piggy.lzma.S
new file mode 100644 (file)
index 0000000..d7e69cf
--- /dev/null
@@ -0,0 +1,6 @@
+       .section .piggydata,#alloc
+       .globl  input_data
+input_data:
+       .incbin "arch/arm/boot/compressed/piggy.lzma"
+       .globl  input_data_end
+input_data_end:
index 4efbb9d..0a34c81 100644 (file)
@@ -12,10 +12,10 @@ config ARM_VIC_NR
          The maximum number of VICs available in the system, for
          power management.
 
-config ICST525
+config ICST
        bool
 
-config ICST307
+config PL330
        bool
 
 config SA1111
@@ -40,3 +40,4 @@ config SHARP_SCOOP
 
 config COMMON_CLKDEV
        bool
+       select HAVE_CLK
index 76be7ff..e6e8664 100644 (file)
@@ -4,8 +4,8 @@
 
 obj-$(CONFIG_ARM_GIC)          += gic.o
 obj-$(CONFIG_ARM_VIC)          += vic.o
-obj-$(CONFIG_ICST525)          += icst525.o
-obj-$(CONFIG_ICST307)          += icst307.o
+obj-$(CONFIG_ICST)             += icst.o
+obj-$(CONFIG_PL330)            += pl330.o
 obj-$(CONFIG_SA1111)           += sa1111.o
 obj-$(CONFIG_PCI_HOST_VIA82C505) += via82c505.o
 obj-$(CONFIG_DMABOUNCE)                += dmabounce.o
index dba4c1d..e2b2bb6 100644 (file)
@@ -53,12 +53,13 @@ static struct clk *clk_find(const char *dev_id, const char *con_id)
                                continue;
                        match += 1;
                }
-               if (match == 0)
-                       continue;
 
                if (match > best) {
                        clk = p->clk;
-                       best = match;
+                       if (match != 3)
+                               best = match;
+                       else
+                               break;
                }
        }
        return clk;
diff --git a/arch/arm/common/icst.c b/arch/arm/common/icst.c
new file mode 100644 (file)
index 0000000..9a7f09c
--- /dev/null
@@ -0,0 +1,100 @@
+/*
+ *  linux/arch/arm/common/icst307.c
+ *
+ *  Copyright (C) 2003 Deep Blue Solutions, Ltd, All Rights Reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ *  Support functions for calculating clocks/divisors for the ICST307
+ *  clock generators.  See http://www.icst.com/ for more information
+ *  on these devices.
+ *
+ *  This is an almost identical implementation to the ICST525 clock generator.
+ *  The s2div and idx2s files are different
+ */
+#include <linux/module.h>
+#include <linux/kernel.h>
+
+#include <asm/hardware/icst.h>
+
+/*
+ * Divisors for each OD setting.
+ */
+const unsigned char icst307_s2div[8] = { 10, 2, 8, 4, 5, 7, 3, 6 };
+const unsigned char icst525_s2div[8] = { 10, 2, 8, 4, 5, 7, 9, 6 };
+EXPORT_SYMBOL(icst307_s2div);
+EXPORT_SYMBOL(icst525_s2div);
+
+unsigned long icst_hz(const struct icst_params *p, struct icst_vco vco)
+{
+       return p->ref * 2 * (vco.v + 8) / ((vco.r + 2) * p->s2div[vco.s]);
+}
+
+EXPORT_SYMBOL(icst_hz);
+
+/*
+ * Ascending divisor S values.
+ */
+const unsigned char icst307_idx2s[8] = { 1, 6, 3, 4, 7, 5, 2, 0 };
+const unsigned char icst525_idx2s[8] = { 1, 3, 4, 7, 5, 2, 6, 0 };
+EXPORT_SYMBOL(icst307_idx2s);
+EXPORT_SYMBOL(icst525_idx2s);
+
+struct icst_vco
+icst_hz_to_vco(const struct icst_params *p, unsigned long freq)
+{
+       struct icst_vco vco = { .s = 1, .v = p->vd_max, .r = p->rd_max };
+       unsigned long f;
+       unsigned int i = 0, rd, best = (unsigned int)-1;
+
+       /*
+        * First, find the PLL output divisor such
+        * that the PLL output is within spec.
+        */
+       do {
+               f = freq * p->s2div[p->idx2s[i]];
+
+               if (f > p->vco_min && f <= p->vco_max)
+                       break;
+       } while (i < 8);
+
+       if (i >= 8)
+               return vco;
+
+       vco.s = p->idx2s[i];
+
+       /*
+        * Now find the closest divisor combination
+        * which gives a PLL output of 'f'.
+        */
+       for (rd = p->rd_min; rd <= p->rd_max; rd++) {
+               unsigned long fref_div, f_pll;
+               unsigned int vd;
+               int f_diff;
+
+               fref_div = (2 * p->ref) / rd;
+
+               vd = (f + fref_div / 2) / fref_div;
+               if (vd < p->vd_min || vd > p->vd_max)
+                       continue;
+
+               f_pll = fref_div * vd;
+               f_diff = f_pll - f;
+               if (f_diff < 0)
+                       f_diff = -f_diff;
+
+               if ((unsigned)f_diff < best) {
+                       vco.v = vd - 8;
+                       vco.r = rd - 2;
+                       if (f_diff == 0)
+                               break;
+                       best = f_diff;
+               }
+       }
+
+       return vco;
+}
+
+EXPORT_SYMBOL(icst_hz_to_vco);
diff --git a/arch/arm/common/icst307.c b/arch/arm/common/icst307.c
deleted file mode 100644 (file)
index 6d094c1..0000000
+++ /dev/null
@@ -1,161 +0,0 @@
-/*
- *  linux/arch/arm/common/icst307.c
- *
- *  Copyright (C) 2003 Deep Blue Solutions, Ltd, All Rights Reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- *  Support functions for calculating clocks/divisors for the ICST307
- *  clock generators.  See http://www.icst.com/ for more information
- *  on these devices.
- *
- *  This is an almost identical implementation to the ICST525 clock generator.
- *  The s2div and idx2s files are different
- */
-#include <linux/module.h>
-#include <linux/kernel.h>
-
-#include <asm/hardware/icst307.h>
-
-/*
- * Divisors for each OD setting.
- */
-static unsigned char s2div[8] = { 10, 2, 8, 4, 5, 7, 3, 6 };
-
-unsigned long icst307_khz(const struct icst307_params *p, struct icst307_vco vco)
-{
-       return p->ref * 2 * (vco.v + 8) / ((vco.r + 2) * s2div[vco.s]);
-}
-
-EXPORT_SYMBOL(icst307_khz);
-
-/*
- * Ascending divisor S values.
- */
-static unsigned char idx2s[8] = { 1, 6, 3, 4, 7, 5, 2, 0 };
-
-struct icst307_vco
-icst307_khz_to_vco(const struct icst307_params *p, unsigned long freq)
-{
-       struct icst307_vco vco = { .s = 1, .v = p->vd_max, .r = p->rd_max };
-       unsigned long f;
-       unsigned int i = 0, rd, best = (unsigned int)-1;
-
-       /*
-        * First, find the PLL output divisor such
-        * that the PLL output is within spec.
-        */
-       do {
-               f = freq * s2div[idx2s[i]];
-
-               /*
-                * f must be between 6MHz and 200MHz (3.3 or 5V)
-                */
-               if (f > 6000 && f <= p->vco_max)
-                       break;
-       } while (i < ARRAY_SIZE(idx2s));
-
-       if (i >= ARRAY_SIZE(idx2s))
-               return vco;
-
-       vco.s = idx2s[i];
-
-       /*
-        * Now find the closest divisor combination
-        * which gives a PLL output of 'f'.
-        */
-       for (rd = p->rd_min; rd <= p->rd_max; rd++) {
-               unsigned long fref_div, f_pll;
-               unsigned int vd;
-               int f_diff;
-
-               fref_div = (2 * p->ref) / rd;
-
-               vd = (f + fref_div / 2) / fref_div;
-               if (vd < p->vd_min || vd > p->vd_max)
-                       continue;
-
-               f_pll = fref_div * vd;
-               f_diff = f_pll - f;
-               if (f_diff < 0)
-                       f_diff = -f_diff;
-
-               if ((unsigned)f_diff < best) {
-                       vco.v = vd - 8;
-                       vco.r = rd - 2;
-                       if (f_diff == 0)
-                               break;
-                       best = f_diff;
-               }
-       }
-
-       return vco;
-}
-
-EXPORT_SYMBOL(icst307_khz_to_vco);
-
-struct icst307_vco
-icst307_ps_to_vco(const struct icst307_params *p, unsigned long period)
-{
-       struct icst307_vco vco = { .s = 1, .v = p->vd_max, .r = p->rd_max };
-       unsigned long f, ps;
-       unsigned int i = 0, rd, best = (unsigned int)-1;
-
-       ps = 1000000000UL / p->vco_max;
-
-       /*
-        * First, find the PLL output divisor such
-        * that the PLL output is within spec.
-        */
-       do {
-               f = period / s2div[idx2s[i]];
-
-               /*
-                * f must be between 6MHz and 200MHz (3.3 or 5V)
-                */
-               if (f >= ps && f < 1000000000UL / 6000 + 1)
-                       break;
-       } while (i < ARRAY_SIZE(idx2s));
-
-       if (i >= ARRAY_SIZE(idx2s))
-               return vco;
-
-       vco.s = idx2s[i];
-
-       ps = 500000000UL / p->ref;
-
-       /*
-        * Now find the closest divisor combination
-        * which gives a PLL output of 'f'.
-        */
-       for (rd = p->rd_min; rd <= p->rd_max; rd++) {
-               unsigned long f_in_div, f_pll;
-               unsigned int vd;
-               int f_diff;
-
-               f_in_div = ps * rd;
-
-               vd = (f_in_div + f / 2) / f;
-               if (vd < p->vd_min || vd > p->vd_max)
-                       continue;
-
-               f_pll = (f_in_div + vd / 2) / vd;
-               f_diff = f_pll - f;
-               if (f_diff < 0)
-                       f_diff = -f_diff;
-
-               if ((unsigned)f_diff < best) {
-                       vco.v = vd - 8;
-                       vco.r = rd - 2;
-                       if (f_diff == 0)
-                               break;
-                       best = f_diff;
-               }
-       }
-
-       return vco;
-}
-
-EXPORT_SYMBOL(icst307_ps_to_vco);
diff --git a/arch/arm/common/icst525.c b/arch/arm/common/icst525.c
deleted file mode 100644 (file)
index 3d377c5..0000000
+++ /dev/null
@@ -1,160 +0,0 @@
-/*
- *  linux/arch/arm/common/icst525.c
- *
- *  Copyright (C) 2003 Deep Blue Solutions, Ltd, All Rights Reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- *  Support functions for calculating clocks/divisors for the ICST525
- *  clock generators.  See http://www.icst.com/ for more information
- *  on these devices.
- */
-#include <linux/module.h>
-#include <linux/kernel.h>
-
-#include <asm/hardware/icst525.h>
-
-/*
- * Divisors for each OD setting.
- */
-static unsigned char s2div[8] = { 10, 2, 8, 4, 5, 7, 9, 6 };
-
-unsigned long icst525_khz(const struct icst525_params *p, struct icst525_vco vco)
-{
-       return p->ref * 2 * (vco.v + 8) / ((vco.r + 2) * s2div[vco.s]);
-}
-
-EXPORT_SYMBOL(icst525_khz);
-
-/*
- * Ascending divisor S values.
- */
-static unsigned char idx2s[] = { 1, 3, 4, 7, 5, 2, 6, 0 };
-
-struct icst525_vco
-icst525_khz_to_vco(const struct icst525_params *p, unsigned long freq)
-{
-       struct icst525_vco vco = { .s = 1, .v = p->vd_max, .r = p->rd_max };
-       unsigned long f;
-       unsigned int i = 0, rd, best = (unsigned int)-1;
-
-       /*
-        * First, find the PLL output divisor such
-        * that the PLL output is within spec.
-        */
-       do {
-               f = freq * s2div[idx2s[i]];
-
-               /*
-                * f must be between 10MHz and
-                *  320MHz (5V) or 200MHz (3V)
-                */
-               if (f > 10000 && f <= p->vco_max)
-                       break;
-       } while (i < ARRAY_SIZE(idx2s));
-
-       if (i >= ARRAY_SIZE(idx2s))
-               return vco;
-
-       vco.s = idx2s[i];
-
-       /*
-        * Now find the closest divisor combination
-        * which gives a PLL output of 'f'.
-        */
-       for (rd = p->rd_min; rd <= p->rd_max; rd++) {
-               unsigned long fref_div, f_pll;
-               unsigned int vd;
-               int f_diff;
-
-               fref_div = (2 * p->ref) / rd;
-
-               vd = (f + fref_div / 2) / fref_div;
-               if (vd < p->vd_min || vd > p->vd_max)
-                       continue;
-
-               f_pll = fref_div * vd;
-               f_diff = f_pll - f;
-               if (f_diff < 0)
-                       f_diff = -f_diff;
-
-               if ((unsigned)f_diff < best) {
-                       vco.v = vd - 8;
-                       vco.r = rd - 2;
-                       if (f_diff == 0)
-                               break;
-                       best = f_diff;
-               }
-       }
-
-       return vco;
-}
-
-EXPORT_SYMBOL(icst525_khz_to_vco);
-
-struct icst525_vco
-icst525_ps_to_vco(const struct icst525_params *p, unsigned long period)
-{
-       struct icst525_vco vco = { .s = 1, .v = p->vd_max, .r = p->rd_max };
-       unsigned long f, ps;
-       unsigned int i = 0, rd, best = (unsigned int)-1;
-
-       ps = 1000000000UL / p->vco_max;
-
-       /*
-        * First, find the PLL output divisor such
-        * that the PLL output is within spec.
-        */
-       do {
-               f = period / s2div[idx2s[i]];
-
-               /*
-                * f must be between 10MHz and
-                *  320MHz (5V) or 200MHz (3V)
-                */
-               if (f >= ps && f < 100000)
-                       break;
-       } while (i < ARRAY_SIZE(idx2s));
-
-       if (i >= ARRAY_SIZE(idx2s))
-               return vco;
-
-       vco.s = idx2s[i];
-
-       ps = 500000000UL / p->ref;
-
-       /*
-        * Now find the closest divisor combination
-        * which gives a PLL output of 'f'.
-        */
-       for (rd = p->rd_min; rd <= p->rd_max; rd++) {
-               unsigned long f_in_div, f_pll;
-               unsigned int vd;
-               int f_diff;
-
-               f_in_div = ps * rd;
-
-               vd = (f_in_div + f / 2) / f;
-               if (vd < p->vd_min || vd > p->vd_max)
-                       continue;
-
-               f_pll = (f_in_div + vd / 2) / vd;
-               f_diff = f_pll - f;
-               if (f_diff < 0)
-                       f_diff = -f_diff;
-
-               if ((unsigned)f_diff < best) {
-                       vco.v = vd - 8;
-                       vco.r = rd - 2;
-                       if (f_diff == 0)
-                               break;
-                       best = f_diff;
-               }
-       }
-
-       return vco;
-}
-
-EXPORT_SYMBOL(icst525_ps_to_vco);
diff --git a/arch/arm/common/pl330.c b/arch/arm/common/pl330.c
new file mode 100644 (file)
index 0000000..5ebbab6
--- /dev/null
@@ -0,0 +1,1966 @@
+/* linux/arch/arm/common/pl330.c
+ *
+ * Copyright (C) 2010 Samsung Electronics Co Ltd.
+ *     Jaswinder Singh <jassi.brar@samsung.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <linux/kernel.h>
+#include <linux/init.h>
+#include <linux/slab.h>
+#include <linux/module.h>
+#include <linux/string.h>
+#include <linux/io.h>
+#include <linux/delay.h>
+#include <linux/interrupt.h>
+#include <linux/dma-mapping.h>
+
+#include <asm/hardware/pl330.h>
+
+/* Register and Bit field Definitions */
+#define DS             0x0
+#define DS_ST_STOP     0x0
+#define DS_ST_EXEC     0x1
+#define DS_ST_CMISS    0x2
+#define DS_ST_UPDTPC   0x3
+#define DS_ST_WFE      0x4
+#define DS_ST_ATBRR    0x5
+#define DS_ST_QBUSY    0x6
+#define DS_ST_WFP      0x7
+#define DS_ST_KILL     0x8
+#define DS_ST_CMPLT    0x9
+#define DS_ST_FLTCMP   0xe
+#define DS_ST_FAULT    0xf
+
+#define DPC            0x4
+#define INTEN          0x20
+#define ES             0x24
+#define INTSTATUS      0x28
+#define INTCLR         0x2c
+#define FSM            0x30
+#define FSC            0x34
+#define FTM            0x38
+
+#define _FTC           0x40
+#define FTC(n)         (_FTC + (n)*0x4)
+
+#define _CS            0x100
+#define CS(n)          (_CS + (n)*0x8)
+#define CS_CNS         (1 << 21)
+
+#define _CPC           0x104
+#define CPC(n)         (_CPC + (n)*0x8)
+
+#define _SA            0x400
+#define SA(n)          (_SA + (n)*0x20)
+
+#define _DA            0x404
+#define DA(n)          (_DA + (n)*0x20)
+
+#define _CC            0x408
+#define CC(n)          (_CC + (n)*0x20)
+
+#define CC_SRCINC      (1 << 0)
+#define CC_DSTINC      (1 << 14)
+#define CC_SRCPRI      (1 << 8)
+#define CC_DSTPRI      (1 << 22)
+#define CC_SRCNS       (1 << 9)
+#define CC_DSTNS       (1 << 23)
+#define CC_SRCIA       (1 << 10)
+#define CC_DSTIA       (1 << 24)
+#define CC_SRCBRSTLEN_SHFT     4
+#define CC_DSTBRSTLEN_SHFT     18
+#define CC_SRCBRSTSIZE_SHFT    1
+#define CC_DSTBRSTSIZE_SHFT    15
+#define CC_SRCCCTRL_SHFT       11
+#define CC_SRCCCTRL_MASK       0x7
+#define CC_DSTCCTRL_SHFT       25
+#define CC_DRCCCTRL_MASK       0x7
+#define CC_SWAP_SHFT   28
+
+#define _LC0           0x40c
+#define LC0(n)         (_LC0 + (n)*0x20)
+
+#define _LC1           0x410
+#define LC1(n)         (_LC1 + (n)*0x20)
+
+#define DBGSTATUS      0xd00
+#define DBG_BUSY       (1 << 0)
+
+#define DBGCMD         0xd04
+#define DBGINST0       0xd08
+#define DBGINST1       0xd0c
+
+#define CR0            0xe00
+#define CR1            0xe04
+#define CR2            0xe08
+#define CR3            0xe0c
+#define CR4            0xe10
+#define CRD            0xe14
+
+#define PERIPH_ID      0xfe0
+#define PCELL_ID       0xff0
+
+#define CR0_PERIPH_REQ_SET     (1 << 0)
+#define CR0_BOOT_EN_SET                (1 << 1)
+#define CR0_BOOT_MAN_NS                (1 << 2)
+#define CR0_NUM_CHANS_SHIFT    4
+#define CR0_NUM_CHANS_MASK     0x7
+#define CR0_NUM_PERIPH_SHIFT   12
+#define CR0_NUM_PERIPH_MASK    0x1f
+#define CR0_NUM_EVENTS_SHIFT   17
+#define CR0_NUM_EVENTS_MASK    0x1f
+
+#define CR1_ICACHE_LEN_SHIFT   0
+#define CR1_ICACHE_LEN_MASK    0x7
+#define CR1_NUM_ICACHELINES_SHIFT      4
+#define CR1_NUM_ICACHELINES_MASK       0xf
+
+#define CRD_DATA_WIDTH_SHIFT   0
+#define CRD_DATA_WIDTH_MASK    0x7
+#define CRD_WR_CAP_SHIFT       4
+#define CRD_WR_CAP_MASK                0x7
+#define CRD_WR_Q_DEP_SHIFT     8
+#define CRD_WR_Q_DEP_MASK      0xf
+#define CRD_RD_CAP_SHIFT       12
+#define CRD_RD_CAP_MASK                0x7
+#define CRD_RD_Q_DEP_SHIFT     16
+#define CRD_RD_Q_DEP_MASK      0xf
+#define CRD_DATA_BUFF_SHIFT    20
+#define CRD_DATA_BUFF_MASK     0x3ff
+
+#define        PART            0x330
+#define DESIGNER       0x41
+#define REVISION       0x0
+#define INTEG_CFG      0x0
+#define PERIPH_ID_VAL  ((PART << 0) | (DESIGNER << 12) \
+                         | (REVISION << 20) | (INTEG_CFG << 24))
+
+#define PCELL_ID_VAL   0xb105f00d
+
+#define PL330_STATE_STOPPED            (1 << 0)
+#define PL330_STATE_EXECUTING          (1 << 1)
+#define PL330_STATE_WFE                        (1 << 2)
+#define PL330_STATE_FAULTING           (1 << 3)
+#define PL330_STATE_COMPLETING         (1 << 4)
+#define PL330_STATE_WFP                        (1 << 5)
+#define PL330_STATE_KILLING            (1 << 6)
+#define PL330_STATE_FAULT_COMPLETING   (1 << 7)
+#define PL330_STATE_CACHEMISS          (1 << 8)
+#define PL330_STATE_UPDTPC             (1 << 9)
+#define PL330_STATE_ATBARRIER          (1 << 10)
+#define PL330_STATE_QUEUEBUSY          (1 << 11)
+#define PL330_STATE_INVALID            (1 << 15)
+
+#define PL330_STABLE_STATES (PL330_STATE_STOPPED | PL330_STATE_EXECUTING \
+                               | PL330_STATE_WFE | PL330_STATE_FAULTING)
+
+#define CMD_DMAADDH    0x54
+#define CMD_DMAEND     0x00
+#define CMD_DMAFLUSHP  0x35
+#define CMD_DMAGO      0xa0
+#define CMD_DMALD      0x04
+#define CMD_DMALDP     0x25
+#define CMD_DMALP      0x20
+#define CMD_DMALPEND   0x28
+#define CMD_DMAKILL    0x01
+#define CMD_DMAMOV     0xbc
+#define CMD_DMANOP     0x18
+#define CMD_DMARMB     0x12
+#define CMD_DMASEV     0x34
+#define CMD_DMAST      0x08
+#define CMD_DMASTP     0x29
+#define CMD_DMASTZ     0x0c
+#define CMD_DMAWFE     0x36
+#define CMD_DMAWFP     0x30
+#define CMD_DMAWMB     0x13
+
+#define SZ_DMAADDH     3
+#define SZ_DMAEND      1
+#define SZ_DMAFLUSHP   2
+#define SZ_DMALD       1
+#define SZ_DMALDP      2
+#define SZ_DMALP       2
+#define SZ_DMALPEND    2
+#define SZ_DMAKILL     1
+#define SZ_DMAMOV      6
+#define SZ_DMANOP      1
+#define SZ_DMARMB      1
+#define SZ_DMASEV      2
+#define SZ_DMAST       1
+#define SZ_DMASTP      2
+#define SZ_DMASTZ      1
+#define SZ_DMAWFE      2
+#define SZ_DMAWFP      2
+#define SZ_DMAWMB      1
+#define SZ_DMAGO       6
+
+#define BRST_LEN(ccr)  ((((ccr) >> CC_SRCBRSTLEN_SHFT) & 0xf) + 1)
+#define BRST_SIZE(ccr) (1 << (((ccr) >> CC_SRCBRSTSIZE_SHFT) & 0x7))
+
+#define BYTE_TO_BURST(b, ccr)  ((b) / BRST_SIZE(ccr) / BRST_LEN(ccr))
+#define BURST_TO_BYTE(c, ccr)  ((c) * BRST_SIZE(ccr) * BRST_LEN(ccr))
+
+/*
+ * With 256 bytes, we can do more than 2.5MB and 5MB xfers per req
+ * at 1byte/burst for P<->M and M<->M respectively.
+ * For typical scenario, at 1word/burst, 10MB and 20MB xfers per req
+ * should be enough for P<->M and M<->M respectively.
+ */
+#define MCODE_BUFF_PER_REQ     256
+
+/*
+ * Mark a _pl330_req as free.
+ * We do it by writing DMAEND as the first instruction
+ * because no valid request is going to have DMAEND as
+ * its first instruction to execute.
+ */
+#define MARK_FREE(req) do { \
+                               _emit_END(0, (req)->mc_cpu); \
+                               (req)->mc_len = 0; \
+                       } while (0)
+
+/* If the _pl330_req is available to the client */
+#define IS_FREE(req)   (*((u8 *)((req)->mc_cpu)) == CMD_DMAEND)
+
+/* Use this _only_ to wait on transient states */
+#define UNTIL(t, s)    while (!(_state(t) & (s))) cpu_relax();
+
+#ifdef PL330_DEBUG_MCGEN
+static unsigned cmd_line;
+#define PL330_DBGCMD_DUMP(off, x...)   do { \
+                                               printk("%x:", cmd_line); \
+                                               printk(x); \
+                                               cmd_line += off; \
+                                       } while (0)
+#define PL330_DBGMC_START(addr)                (cmd_line = addr)
+#else
+#define PL330_DBGCMD_DUMP(off, x...)   do {} while (0)
+#define PL330_DBGMC_START(addr)                do {} while (0)
+#endif
+
+struct _xfer_spec {
+       u32 ccr;
+       struct pl330_req *r;
+       struct pl330_xfer *x;
+};
+
+enum dmamov_dst {
+       SAR = 0,
+       CCR,
+       DAR,
+};
+
+enum pl330_dst {
+       SRC = 0,
+       DST,
+};
+
+enum pl330_cond {
+       SINGLE,
+       BURST,
+       ALWAYS,
+};
+
+struct _pl330_req {
+       u32 mc_bus;
+       void *mc_cpu;
+       /* Number of bytes taken to setup MC for the req */
+       u32 mc_len;
+       struct pl330_req *r;
+       /* Hook to attach to DMAC's list of reqs with due callback */
+       struct list_head rqd;
+};
+
+/* ToBeDone for tasklet */
+struct _pl330_tbd {
+       bool reset_dmac;
+       bool reset_mngr;
+       u8 reset_chan;
+};
+
+/* A DMAC Thread */
+struct pl330_thread {
+       u8 id;
+       int ev;
+       /* If the channel is not yet acquired by any client */
+       bool free;
+       /* Parent DMAC */
+       struct pl330_dmac *dmac;
+       /* Only two at a time */
+       struct _pl330_req req[2];
+       /* Index of the last submitted request */
+       unsigned lstenq;
+};
+
+enum pl330_dmac_state {
+       UNINIT,
+       INIT,
+       DYING,
+};
+
+/* A DMAC */
+struct pl330_dmac {
+       spinlock_t              lock;
+       /* Holds list of reqs with due callbacks */
+       struct list_head        req_done;
+       /* Pointer to platform specific stuff */
+       struct pl330_info       *pinfo;
+       /* Maximum possible events/irqs */
+       int                     events[32];
+       /* BUS address of MicroCode buffer */
+       u32                     mcode_bus;
+       /* CPU address of MicroCode buffer */
+       void                    *mcode_cpu;
+       /* List of all Channel threads */
+       struct pl330_thread     *channels;
+       /* Pointer to the MANAGER thread */
+       struct pl330_thread     *manager;
+       /* To handle bad news in interrupt */
+       struct tasklet_struct   tasks;
+       struct _pl330_tbd       dmac_tbd;
+       /* State of DMAC operation */
+       enum pl330_dmac_state   state;
+};
+
+static inline void _callback(struct pl330_req *r, enum pl330_op_err err)
+{
+       if (r && r->xfer_cb)
+               r->xfer_cb(r->token, err);
+}
+
+static inline bool _queue_empty(struct pl330_thread *thrd)
+{
+       return (IS_FREE(&thrd->req[0]) && IS_FREE(&thrd->req[1]))
+               ? true : false;
+}
+
+static inline bool _queue_full(struct pl330_thread *thrd)
+{
+       return (IS_FREE(&thrd->req[0]) || IS_FREE(&thrd->req[1]))
+               ? false : true;
+}
+
+static inline bool is_manager(struct pl330_thread *thrd)
+{
+       struct pl330_dmac *pl330 = thrd->dmac;
+
+       /* MANAGER is indexed at the end */
+       if (thrd->id == pl330->pinfo->pcfg.num_chan)
+               return true;
+       else
+               return false;
+}
+
+/* If manager of the thread is in Non-Secure mode */
+static inline bool _manager_ns(struct pl330_thread *thrd)
+{
+       struct pl330_dmac *pl330 = thrd->dmac;
+
+       return (pl330->pinfo->pcfg.mode & DMAC_MODE_NS) ? true : false;
+}
+
+static inline u32 get_id(struct pl330_info *pi, u32 off)
+{
+       void __iomem *regs = pi->base;
+       u32 id = 0;
+
+       id |= (readb(regs + off + 0x0) << 0);
+       id |= (readb(regs + off + 0x4) << 8);
+       id |= (readb(regs + off + 0x8) << 16);
+       id |= (readb(regs + off + 0xc) << 24);
+
+       return id;
+}
+
+static inline u32 _emit_ADDH(unsigned dry_run, u8 buf[],
+               enum pl330_dst da, u16 val)
+{
+       if (dry_run)
+               return SZ_DMAADDH;
+
+       buf[0] = CMD_DMAADDH;
+       buf[0] |= (da << 1);
+       *((u16 *)&buf[1]) = val;
+
+       PL330_DBGCMD_DUMP(SZ_DMAADDH, "\tDMAADDH %s %u\n",
+               da == 1 ? "DA" : "SA", val);
+
+       return SZ_DMAADDH;
+}
+
+static inline u32 _emit_END(unsigned dry_run, u8 buf[])
+{
+       if (dry_run)
+               return SZ_DMAEND;
+
+       buf[0] = CMD_DMAEND;
+
+       PL330_DBGCMD_DUMP(SZ_DMAEND, "\tDMAEND\n");
+
+       return SZ_DMAEND;
+}
+
+static inline u32 _emit_FLUSHP(unsigned dry_run, u8 buf[], u8 peri)
+{
+       if (dry_run)
+               return SZ_DMAFLUSHP;
+
+       buf[0] = CMD_DMAFLUSHP;
+
+       peri &= 0x1f;
+       peri <<= 3;
+       buf[1] = peri;
+
+       PL330_DBGCMD_DUMP(SZ_DMAFLUSHP, "\tDMAFLUSHP %u\n", peri >> 3);
+
+       return SZ_DMAFLUSHP;
+}
+
+static inline u32 _emit_LD(unsigned dry_run, u8 buf[], enum pl330_cond cond)
+{
+       if (dry_run)
+               return SZ_DMALD;
+
+       buf[0] = CMD_DMALD;
+
+       if (cond == SINGLE)
+               buf[0] |= (0 << 1) | (1 << 0);
+       else if (cond == BURST)
+               buf[0] |= (1 << 1) | (1 << 0);
+
+       PL330_DBGCMD_DUMP(SZ_DMALD, "\tDMALD%c\n",
+               cond == SINGLE ? 'S' : (cond == BURST ? 'B' : 'A'));
+
+       return SZ_DMALD;
+}
+
+static inline u32 _emit_LDP(unsigned dry_run, u8 buf[],
+               enum pl330_cond cond, u8 peri)
+{
+       if (dry_run)
+               return SZ_DMALDP;
+
+       buf[0] = CMD_DMALDP;
+
+       if (cond == BURST)
+               buf[0] |= (1 << 1);
+
+       peri &= 0x1f;
+       peri <<= 3;
+       buf[1] = peri;
+
+       PL330_DBGCMD_DUMP(SZ_DMALDP, "\tDMALDP%c %u\n",
+               cond == SINGLE ? 'S' : 'B', peri >> 3);
+
+       return SZ_DMALDP;
+}
+
+static inline u32 _emit_LP(unsigned dry_run, u8 buf[],
+               unsigned loop, u8 cnt)
+{
+       if (dry_run)
+               return SZ_DMALP;
+
+       buf[0] = CMD_DMALP;
+
+       if (loop)
+               buf[0] |= (1 << 1);
+
+       cnt--; /* DMAC increments by 1 internally */
+       buf[1] = cnt;
+
+       PL330_DBGCMD_DUMP(SZ_DMALP, "\tDMALP_%c %u\n", loop ? '1' : '0', cnt);
+
+       return SZ_DMALP;
+}
+
+struct _arg_LPEND {
+       enum pl330_cond cond;
+       bool forever;
+       unsigned loop;
+       u8 bjump;
+};
+
+static inline u32 _emit_LPEND(unsigned dry_run, u8 buf[],
+               const struct _arg_LPEND *arg)
+{
+       enum pl330_cond cond = arg->cond;
+       bool forever = arg->forever;
+       unsigned loop = arg->loop;
+       u8 bjump = arg->bjump;
+
+       if (dry_run)
+               return SZ_DMALPEND;
+
+       buf[0] = CMD_DMALPEND;
+
+       if (loop)
+               buf[0] |= (1 << 2);
+
+       if (!forever)
+               buf[0] |= (1 << 4);
+
+       if (cond == SINGLE)
+               buf[0] |= (0 << 1) | (1 << 0);
+       else if (cond == BURST)
+               buf[0] |= (1 << 1) | (1 << 0);
+
+       buf[1] = bjump;
+
+       PL330_DBGCMD_DUMP(SZ_DMALPEND, "\tDMALP%s%c_%c bjmpto_%x\n",
+                       forever ? "FE" : "END",
+                       cond == SINGLE ? 'S' : (cond == BURST ? 'B' : 'A'),
+                       loop ? '1' : '0',
+                       bjump);
+
+       return SZ_DMALPEND;
+}
+
+static inline u32 _emit_KILL(unsigned dry_run, u8 buf[])
+{
+       if (dry_run)
+               return SZ_DMAKILL;
+
+       buf[0] = CMD_DMAKILL;
+
+       return SZ_DMAKILL;
+}
+
+static inline u32 _emit_MOV(unsigned dry_run, u8 buf[],
+               enum dmamov_dst dst, u32 val)
+{
+       if (dry_run)
+               return SZ_DMAMOV;
+
+       buf[0] = CMD_DMAMOV;
+       buf[1] = dst;
+       *((u32 *)&buf[2]) = val;
+
+       PL330_DBGCMD_DUMP(SZ_DMAMOV, "\tDMAMOV %s 0x%x\n",
+               dst == SAR ? "SAR" : (dst == DAR ? "DAR" : "CCR"), val);
+
+       return SZ_DMAMOV;
+}
+
+static inline u32 _emit_NOP(unsigned dry_run, u8 buf[])
+{
+       if (dry_run)
+               return SZ_DMANOP;
+
+       buf[0] = CMD_DMANOP;
+
+       PL330_DBGCMD_DUMP(SZ_DMANOP, "\tDMANOP\n");
+
+       return SZ_DMANOP;
+}
+
+static inline u32 _emit_RMB(unsigned dry_run, u8 buf[])
+{
+       if (dry_run)
+               return SZ_DMARMB;
+
+       buf[0] = CMD_DMARMB;
+
+       PL330_DBGCMD_DUMP(SZ_DMARMB, "\tDMARMB\n");
+
+       return SZ_DMARMB;
+}
+
+static inline u32 _emit_SEV(unsigned dry_run, u8 buf[], u8 ev)
+{
+       if (dry_run)
+               return SZ_DMASEV;
+
+       buf[0] = CMD_DMASEV;
+
+       ev &= 0x1f;
+       ev <<= 3;
+       buf[1] = ev;
+
+       PL330_DBGCMD_DUMP(SZ_DMASEV, "\tDMASEV %u\n", ev >> 3);
+
+       return SZ_DMASEV;
+}
+
+static inline u32 _emit_ST(unsigned dry_run, u8 buf[], enum pl330_cond cond)
+{
+       if (dry_run)
+               return SZ_DMAST;
+
+       buf[0] = CMD_DMAST;
+
+       if (cond == SINGLE)
+               buf[0] |= (0 << 1) | (1 << 0);
+       else if (cond == BURST)
+               buf[0] |= (1 << 1) | (1 << 0);
+
+       PL330_DBGCMD_DUMP(SZ_DMAST, "\tDMAST%c\n",
+               cond == SINGLE ? 'S' : (cond == BURST ? 'B' : 'A'));
+
+       return SZ_DMAST;
+}
+
+static inline u32 _emit_STP(unsigned dry_run, u8 buf[],
+               enum pl330_cond cond, u8 peri)
+{
+       if (dry_run)
+               return SZ_DMASTP;
+
+       buf[0] = CMD_DMASTP;
+
+       if (cond == BURST)
+               buf[0] |= (1 << 1);
+
+       peri &= 0x1f;
+       peri <<= 3;
+       buf[1] = peri;
+
+       PL330_DBGCMD_DUMP(SZ_DMASTP, "\tDMASTP%c %u\n",
+               cond == SINGLE ? 'S' : 'B', peri >> 3);
+
+       return SZ_DMASTP;
+}
+
+static inline u32 _emit_STZ(unsigned dry_run, u8 buf[])
+{
+       if (dry_run)
+               return SZ_DMASTZ;
+
+       buf[0] = CMD_DMASTZ;
+
+       PL330_DBGCMD_DUMP(SZ_DMASTZ, "\tDMASTZ\n");
+
+       return SZ_DMASTZ;
+}
+
+static inline u32 _emit_WFE(unsigned dry_run, u8 buf[], u8 ev,
+               unsigned invalidate)
+{
+       if (dry_run)
+               return SZ_DMAWFE;
+
+       buf[0] = CMD_DMAWFE;
+
+       ev &= 0x1f;
+       ev <<= 3;
+       buf[1] = ev;
+
+       if (invalidate)
+               buf[1] |= (1 << 1);
+
+       PL330_DBGCMD_DUMP(SZ_DMAWFE, "\tDMAWFE %u%s\n",
+               ev >> 3, invalidate ? ", I" : "");
+
+       return SZ_DMAWFE;
+}
+
+static inline u32 _emit_WFP(unsigned dry_run, u8 buf[],
+               enum pl330_cond cond, u8 peri)
+{
+       if (dry_run)
+               return SZ_DMAWFP;
+
+       buf[0] = CMD_DMAWFP;
+
+       if (cond == SINGLE)
+               buf[0] |= (0 << 1) | (0 << 0);
+       else if (cond == BURST)
+               buf[0] |= (1 << 1) | (0 << 0);
+       else
+               buf[0] |= (0 << 1) | (1 << 0);
+
+       peri &= 0x1f;
+       peri <<= 3;
+       buf[1] = peri;
+
+       PL330_DBGCMD_DUMP(SZ_DMAWFP, "\tDMAWFP%c %u\n",
+               cond == SINGLE ? 'S' : (cond == BURST ? 'B' : 'P'), peri >> 3);
+
+       return SZ_DMAWFP;
+}
+
+static inline u32 _emit_WMB(unsigned dry_run, u8 buf[])
+{
+       if (dry_run)
+               return SZ_DMAWMB;
+
+       buf[0] = CMD_DMAWMB;
+
+       PL330_DBGCMD_DUMP(SZ_DMAWMB, "\tDMAWMB\n");
+
+       return SZ_DMAWMB;
+}
+
+struct _arg_GO {
+       u8 chan;
+       u32 addr;
+       unsigned ns;
+};
+
+static inline u32 _emit_GO(unsigned dry_run, u8 buf[],
+               const struct _arg_GO *arg)
+{
+       u8 chan = arg->chan;
+       u32 addr = arg->addr;
+       unsigned ns = arg->ns;
+
+       if (dry_run)
+               return SZ_DMAGO;
+
+       buf[0] = CMD_DMAGO;
+       buf[0] |= (ns << 1);
+
+       buf[1] = chan & 0x7;
+
+       *((u32 *)&buf[2]) = addr;
+
+       return SZ_DMAGO;
+}
+
+#define msecs_to_loops(t) (loops_per_jiffy / 1000 * HZ * t)
+
+/* Returns Time-Out */
+static bool _until_dmac_idle(struct pl330_thread *thrd)
+{
+       void __iomem *regs = thrd->dmac->pinfo->base;
+       unsigned long loops = msecs_to_loops(5);
+
+       do {
+               /* Until Manager is Idle */
+               if (!(readl(regs + DBGSTATUS) & DBG_BUSY))
+                       break;
+
+               cpu_relax();
+       } while (--loops);
+
+       if (!loops)
+               return true;
+
+       return false;
+}
+
+static inline void _execute_DBGINSN(struct pl330_thread *thrd,
+               u8 insn[], bool as_manager)
+{
+       void __iomem *regs = thrd->dmac->pinfo->base;
+       u32 val;
+
+       val = (insn[0] << 16) | (insn[1] << 24);
+       if (!as_manager) {
+               val |= (1 << 0);
+               val |= (thrd->id << 8); /* Channel Number */
+       }
+       writel(val, regs + DBGINST0);
+
+       val = *((u32 *)&insn[2]);
+       writel(val, regs + DBGINST1);
+
+       /* If timed out due to halted state-machine */
+       if (_until_dmac_idle(thrd)) {
+               dev_err(thrd->dmac->pinfo->dev, "DMAC halted!\n");
+               return;
+       }
+
+       /* Get going */
+       writel(0, regs + DBGCMD);
+}
+
+static inline u32 _state(struct pl330_thread *thrd)
+{
+       void __iomem *regs = thrd->dmac->pinfo->base;
+       u32 val;
+
+       if (is_manager(thrd))
+               val = readl(regs + DS) & 0xf;
+       else
+               val = readl(regs + CS(thrd->id)) & 0xf;
+
+       switch (val) {
+       case DS_ST_STOP:
+               return PL330_STATE_STOPPED;
+       case DS_ST_EXEC:
+               return PL330_STATE_EXECUTING;
+       case DS_ST_CMISS:
+               return PL330_STATE_CACHEMISS;
+       case DS_ST_UPDTPC:
+               return PL330_STATE_UPDTPC;
+       case DS_ST_WFE:
+               return PL330_STATE_WFE;
+       case DS_ST_FAULT:
+               return PL330_STATE_FAULTING;
+       case DS_ST_ATBRR:
+               if (is_manager(thrd))
+                       return PL330_STATE_INVALID;
+               else
+                       return PL330_STATE_ATBARRIER;
+       case DS_ST_QBUSY:
+               if (is_manager(thrd))
+                       return PL330_STATE_INVALID;
+               else
+                       return PL330_STATE_QUEUEBUSY;
+       case DS_ST_WFP:
+               if (is_manager(thrd))
+                       return PL330_STATE_INVALID;
+               else
+                       return PL330_STATE_WFP;
+       case DS_ST_KILL:
+               if (is_manager(thrd))
+                       return PL330_STATE_INVALID;
+               else
+                       return PL330_STATE_KILLING;
+       case DS_ST_CMPLT:
+               if (is_manager(thrd))
+                       return PL330_STATE_INVALID;
+               else
+                       return PL330_STATE_COMPLETING;
+       case DS_ST_FLTCMP:
+               if (is_manager(thrd))
+                       return PL330_STATE_INVALID;
+               else
+                       return PL330_STATE_FAULT_COMPLETING;
+       default:
+               return PL330_STATE_INVALID;
+       }
+}
+
+/* If the request 'req' of thread 'thrd' is currently active */
+static inline bool _req_active(struct pl330_thread *thrd,
+               struct _pl330_req *req)
+{
+       void __iomem *regs = thrd->dmac->pinfo->base;
+       u32 buf = req->mc_bus, pc = readl(regs + CPC(thrd->id));
+
+       if (IS_FREE(req))
+               return false;
+
+       return (pc >= buf && pc <= buf + req->mc_len) ? true : false;
+}
+
+/* Returns 0 if the thread is inactive, ID of active req + 1 otherwise */
+static inline unsigned _thrd_active(struct pl330_thread *thrd)
+{
+       if (_req_active(thrd, &thrd->req[0]))
+               return 1; /* First req active */
+
+       if (_req_active(thrd, &thrd->req[1]))
+               return 2; /* Second req active */
+
+       return 0;
+}
+
+static void _stop(struct pl330_thread *thrd)
+{
+       void __iomem *regs = thrd->dmac->pinfo->base;
+       u8 insn[6] = {0, 0, 0, 0, 0, 0};
+
+       if (_state(thrd) == PL330_STATE_FAULT_COMPLETING)
+               UNTIL(thrd, PL330_STATE_FAULTING | PL330_STATE_KILLING);
+
+       /* Return if nothing needs to be done */
+       if (_state(thrd) == PL330_STATE_COMPLETING
+                 || _state(thrd) == PL330_STATE_KILLING
+                 || _state(thrd) == PL330_STATE_STOPPED)
+               return;
+
+       _emit_KILL(0, insn);
+
+       /* Stop generating interrupts for SEV */
+       writel(readl(regs + INTEN) & ~(1 << thrd->ev), regs + INTEN);
+
+       _execute_DBGINSN(thrd, insn, is_manager(thrd));
+}
+
+/* Start doing req 'idx' of thread 'thrd' */
+static bool _trigger(struct pl330_thread *thrd)
+{
+       void __iomem *regs = thrd->dmac->pinfo->base;
+       struct _pl330_req *req;
+       struct pl330_req *r;
+       struct _arg_GO go;
+       unsigned ns;
+       u8 insn[6] = {0, 0, 0, 0, 0, 0};
+
+       /* Return if already ACTIVE */
+       if (_state(thrd) != PL330_STATE_STOPPED)
+               return true;
+
+       if (!IS_FREE(&thrd->req[1 - thrd->lstenq]))
+               req = &thrd->req[1 - thrd->lstenq];
+       else if (!IS_FREE(&thrd->req[thrd->lstenq]))
+               req = &thrd->req[thrd->lstenq];
+       else
+               req = NULL;
+
+       /* Return if no request */
+       if (!req || !req->r)
+               return true;
+
+       r = req->r;
+
+       if (r->cfg)
+               ns = r->cfg->nonsecure ? 1 : 0;
+       else if (readl(regs + CS(thrd->id)) & CS_CNS)
+               ns = 1;
+       else
+               ns = 0;
+
+       /* See 'Abort Sources' point-4 at Page 2-25 */
+       if (_manager_ns(thrd) && !ns)
+               dev_info(thrd->dmac->pinfo->dev, "%s:%d Recipe for ABORT!\n",
+                       __func__, __LINE__);
+
+       go.chan = thrd->id;
+       go.addr = req->mc_bus;
+       go.ns = ns;
+       _emit_GO(0, insn, &go);
+
+       /* Set to generate interrupts for SEV */
+       writel(readl(regs + INTEN) | (1 << thrd->ev), regs + INTEN);
+
+       /* Only manager can execute GO */
+       _execute_DBGINSN(thrd, insn, true);
+
+       return true;
+}
+
+static bool _start(struct pl330_thread *thrd)
+{
+       switch (_state(thrd)) {
+       case PL330_STATE_FAULT_COMPLETING:
+               UNTIL(thrd, PL330_STATE_FAULTING | PL330_STATE_KILLING);
+
+               if (_state(thrd) == PL330_STATE_KILLING)
+                       UNTIL(thrd, PL330_STATE_STOPPED)
+
+       case PL330_STATE_FAULTING:
+               _stop(thrd);
+
+       case PL330_STATE_KILLING:
+       case PL330_STATE_COMPLETING:
+               UNTIL(thrd, PL330_STATE_STOPPED)
+
+       case PL330_STATE_STOPPED:
+               return _trigger(thrd);
+
+       case PL330_STATE_WFP:
+       case PL330_STATE_QUEUEBUSY:
+       case PL330_STATE_ATBARRIER:
+       case PL330_STATE_UPDTPC:
+       case PL330_STATE_CACHEMISS:
+       case PL330_STATE_EXECUTING:
+               return true;
+
+       case PL330_STATE_WFE: /* For RESUME, nothing yet */
+       default:
+               return false;
+       }
+}
+
+static inline int _ldst_memtomem(unsigned dry_run, u8 buf[],
+               const struct _xfer_spec *pxs, int cyc)
+{
+       int off = 0;
+
+       while (cyc--) {
+               off += _emit_LD(dry_run, &buf[off], ALWAYS);
+               off += _emit_RMB(dry_run, &buf[off]);
+               off += _emit_ST(dry_run, &buf[off], ALWAYS);
+               off += _emit_WMB(dry_run, &buf[off]);
+       }
+
+       return off;
+}
+
+static inline int _ldst_devtomem(unsigned dry_run, u8 buf[],
+               const struct _xfer_spec *pxs, int cyc)
+{
+       int off = 0;
+
+       while (cyc--) {
+               off += _emit_WFP(dry_run, &buf[off], SINGLE, pxs->r->peri);
+               off += _emit_LDP(dry_run, &buf[off], SINGLE, pxs->r->peri);
+               off += _emit_ST(dry_run, &buf[off], ALWAYS);
+               off += _emit_FLUSHP(dry_run, &buf[off], pxs->r->peri);
+       }
+
+       return off;
+}
+
+static inline int _ldst_memtodev(unsigned dry_run, u8 buf[],
+               const struct _xfer_spec *pxs, int cyc)
+{
+       int off = 0;
+
+       while (cyc--) {
+               off += _emit_WFP(dry_run, &buf[off], SINGLE, pxs->r->peri);
+               off += _emit_LD(dry_run, &buf[off], ALWAYS);
+               off += _emit_STP(dry_run, &buf[off], SINGLE, pxs->r->peri);
+               off += _emit_FLUSHP(dry_run, &buf[off], pxs->r->peri);
+       }
+
+       return off;
+}
+
+static int _bursts(unsigned dry_run, u8 buf[],
+               const struct _xfer_spec *pxs, int cyc)
+{
+       int off = 0;
+
+       switch (pxs->r->rqtype) {
+       case MEMTODEV:
+               off += _ldst_memtodev(dry_run, &buf[off], pxs, cyc);
+               break;
+       case DEVTOMEM:
+               off += _ldst_devtomem(dry_run, &buf[off], pxs, cyc);
+               break;
+       case MEMTOMEM:
+               off += _ldst_memtomem(dry_run, &buf[off], pxs, cyc);
+               break;
+       default:
+               off += 0x40000000; /* Scare off the Client */
+               break;
+       }
+
+       return off;
+}
+
+/* Returns bytes consumed and updates bursts */
+static inline int _loop(unsigned dry_run, u8 buf[],
+               unsigned long *bursts, const struct _xfer_spec *pxs)
+{
+       int cyc, cycmax, szlp, szlpend, szbrst, off;
+       unsigned lcnt0, lcnt1, ljmp0, ljmp1;
+       struct _arg_LPEND lpend;
+
+       /* Max iterations possibile in DMALP is 256 */
+       if (*bursts >= 256*256) {
+               lcnt1 = 256;
+               lcnt0 = 256;
+               cyc = *bursts / lcnt1 / lcnt0;
+       } else if (*bursts > 256) {
+               lcnt1 = 256;
+               lcnt0 = *bursts / lcnt1;
+               cyc = 1;
+       } else {
+               lcnt1 = *bursts;
+               lcnt0 = 0;
+               cyc = 1;
+       }
+
+       szlp = _emit_LP(1, buf, 0, 0);
+       szbrst = _bursts(1, buf, pxs, 1);
+
+       lpend.cond = ALWAYS;
+       lpend.forever = false;
+       lpend.loop = 0;
+       lpend.bjump = 0;
+       szlpend = _emit_LPEND(1, buf, &lpend);
+
+       if (lcnt0) {
+               szlp *= 2;
+               szlpend *= 2;
+       }
+
+       /*
+        * Max bursts that we can unroll due to limit on the
+        * size of backward jump that can be encoded in DMALPEND
+        * which is 8-bits and hence 255
+        */
+       cycmax = (255 - (szlp + szlpend)) / szbrst;
+
+       cyc = (cycmax < cyc) ? cycmax : cyc;
+
+       off = 0;
+
+       if (lcnt0) {
+               off += _emit_LP(dry_run, &buf[off], 0, lcnt0);
+               ljmp0 = off;
+       }
+
+       off += _emit_LP(dry_run, &buf[off], 1, lcnt1);
+       ljmp1 = off;
+
+       off += _bursts(dry_run, &buf[off], pxs, cyc);
+
+       lpend.cond = ALWAYS;
+       lpend.forever = false;
+       lpend.loop = 1;
+       lpend.bjump = off - ljmp1;
+       off += _emit_LPEND(dry_run, &buf[off], &lpend);
+
+       if (lcnt0) {
+               lpend.cond = ALWAYS;
+               lpend.forever = false;
+               lpend.loop = 0;
+               lpend.bjump = off - ljmp0;
+               off += _emit_LPEND(dry_run, &buf[off], &lpend);
+       }
+
+       *bursts = lcnt1 * cyc;
+       if (lcnt0)
+               *bursts *= lcnt0;
+
+       return off;
+}
+
+static inline int _setup_loops(unsigned dry_run, u8 buf[],
+               const struct _xfer_spec *pxs)
+{
+       struct pl330_xfer *x = pxs->x;
+       u32 ccr = pxs->ccr;
+       unsigned long c, bursts = BYTE_TO_BURST(x->bytes, ccr);
+       int off = 0;
+
+       while (bursts) {
+               c = bursts;
+               off += _loop(dry_run, &buf[off], &c, pxs);
+               bursts -= c;
+       }
+
+       return off;
+}
+
+static inline int _setup_xfer(unsigned dry_run, u8 buf[],
+               const struct _xfer_spec *pxs)
+{
+       struct pl330_xfer *x = pxs->x;
+       int off = 0;
+
+       /* DMAMOV SAR, x->src_addr */
+       off += _emit_MOV(dry_run, &buf[off], SAR, x->src_addr);
+       /* DMAMOV DAR, x->dst_addr */
+       off += _emit_MOV(dry_run, &buf[off], DAR, x->dst_addr);
+
+       /* Setup Loop(s) */
+       off += _setup_loops(dry_run, &buf[off], pxs);
+
+       return off;
+}
+
+/*
+ * A req is a sequence of one or more xfer units.
+ * Returns the number of bytes taken to setup the MC for the req.
+ */
+static int _setup_req(unsigned dry_run, struct pl330_thread *thrd,
+               unsigned index, struct _xfer_spec *pxs)
+{
+       struct _pl330_req *req = &thrd->req[index];
+       struct pl330_xfer *x;
+       u8 *buf = req->mc_cpu;
+       int off = 0;
+
+       PL330_DBGMC_START(req->mc_bus);
+
+       /* DMAMOV CCR, ccr */
+       off += _emit_MOV(dry_run, &buf[off], CCR, pxs->ccr);
+
+       x = pxs->r->x;
+       do {
+               /* Error if xfer length is not aligned at burst size */
+               if (x->bytes % (BRST_SIZE(pxs->ccr) * BRST_LEN(pxs->ccr)))
+                       return -EINVAL;
+
+               pxs->x = x;
+               off += _setup_xfer(dry_run, &buf[off], pxs);
+
+               x = x->next;
+       } while (x);
+
+       /* DMASEV peripheral/event */
+       off += _emit_SEV(dry_run, &buf[off], thrd->ev);
+       /* DMAEND */
+       off += _emit_END(dry_run, &buf[off]);
+
+       return off;
+}
+
+static inline u32 _prepare_ccr(const struct pl330_reqcfg *rqc)
+{
+       u32 ccr = 0;
+
+       if (rqc->src_inc)
+               ccr |= CC_SRCINC;
+
+       if (rqc->dst_inc)
+               ccr |= CC_DSTINC;
+
+       /* We set same protection levels for Src and DST for now */
+       if (rqc->privileged)
+               ccr |= CC_SRCPRI | CC_DSTPRI;
+       if (rqc->nonsecure)
+               ccr |= CC_SRCNS | CC_DSTNS;
+       if (rqc->insnaccess)
+               ccr |= CC_SRCIA | CC_DSTIA;
+
+       ccr |= (((rqc->brst_len - 1) & 0xf) << CC_SRCBRSTLEN_SHFT);
+       ccr |= (((rqc->brst_len - 1) & 0xf) << CC_DSTBRSTLEN_SHFT);
+
+       ccr |= (rqc->brst_size << CC_SRCBRSTSIZE_SHFT);
+       ccr |= (rqc->brst_size << CC_DSTBRSTSIZE_SHFT);
+
+       ccr |= (rqc->dcctl << CC_SRCCCTRL_SHFT);
+       ccr |= (rqc->scctl << CC_DSTCCTRL_SHFT);
+
+       ccr |= (rqc->swap << CC_SWAP_SHFT);
+
+       return ccr;
+}
+
+static inline bool _is_valid(u32 ccr)
+{
+       enum pl330_dstcachectrl dcctl;
+       enum pl330_srccachectrl scctl;
+
+       dcctl = (ccr >> CC_DSTCCTRL_SHFT) & CC_DRCCCTRL_MASK;
+       scctl = (ccr >> CC_SRCCCTRL_SHFT) & CC_SRCCCTRL_MASK;
+
+       if (dcctl == DINVALID1 || dcctl == DINVALID2
+                       || scctl == SINVALID1 || scctl == SINVALID2)
+               return false;
+       else
+               return true;
+}
+
+/*
+ * Submit a list of xfers after which the client wants notification.
+ * Client is not notified after each xfer unit, just once after all
+ * xfer units are done or some error occurs.
+ */
+int pl330_submit_req(void *ch_id, struct pl330_req *r)
+{
+       struct pl330_thread *thrd = ch_id;
+       struct pl330_dmac *pl330;
+       struct pl330_info *pi;
+       struct _xfer_spec xs;
+       unsigned long flags;
+       void __iomem *regs;
+       unsigned idx;
+       u32 ccr;
+       int ret = 0;
+
+       /* No Req or Unacquired Channel or DMAC */
+       if (!r || !thrd || thrd->free)
+               return -EINVAL;
+
+       pl330 = thrd->dmac;
+       pi = pl330->pinfo;
+       regs = pi->base;
+
+       if (pl330->state == DYING
+               || pl330->dmac_tbd.reset_chan & (1 << thrd->id)) {
+               dev_info(thrd->dmac->pinfo->dev, "%s:%d\n",
+                       __func__, __LINE__);
+               return -EAGAIN;
+       }
+
+       /* If request for non-existing peripheral */
+       if (r->rqtype != MEMTOMEM && r->peri >= pi->pcfg.num_peri) {
+               dev_info(thrd->dmac->pinfo->dev,
+                               "%s:%d Invalid peripheral(%u)!\n",
+                               __func__, __LINE__, r->peri);
+               return -EINVAL;
+       }
+
+       spin_lock_irqsave(&pl330->lock, flags);
+
+       if (_queue_full(thrd)) {
+               ret = -EAGAIN;
+               goto xfer_exit;
+       }
+
+       /* Prefer Secure Channel */
+       if (!_manager_ns(thrd))
+               r->cfg->nonsecure = 0;
+       else
+               r->cfg->nonsecure = 1;
+
+       /* Use last settings, if not provided */
+       if (r->cfg)
+               ccr = _prepare_ccr(r->cfg);
+       else
+               ccr = readl(regs + CC(thrd->id));
+
+       /* If this req doesn't have valid xfer settings */
+       if (!_is_valid(ccr)) {
+               ret = -EINVAL;
+               dev_info(thrd->dmac->pinfo->dev, "%s:%d Invalid CCR(%x)!\n",
+                       __func__, __LINE__, ccr);
+               goto xfer_exit;
+       }
+
+       idx = IS_FREE(&thrd->req[0]) ? 0 : 1;
+
+       xs.ccr = ccr;
+       xs.r = r;
+
+       /* First dry run to check if req is acceptable */
+       ret = _setup_req(1, thrd, idx, &xs);
+       if (ret < 0)
+               goto xfer_exit;
+
+       if (ret > pi->mcbufsz / 2) {
+               dev_info(thrd->dmac->pinfo->dev,
+                       "%s:%d Trying increasing mcbufsz\n",
+                               __func__, __LINE__);
+               ret = -ENOMEM;
+               goto xfer_exit;
+       }
+
+       /* Hook the request */
+       thrd->lstenq = idx;
+       thrd->req[idx].mc_len = _setup_req(0, thrd, idx, &xs);
+       thrd->req[idx].r = r;
+
+       ret = 0;
+
+xfer_exit:
+       spin_unlock_irqrestore(&pl330->lock, flags);
+
+       return ret;
+}
+EXPORT_SYMBOL(pl330_submit_req);
+
+static void pl330_dotask(unsigned long data)
+{
+       struct pl330_dmac *pl330 = (struct pl330_dmac *) data;
+       struct pl330_info *pi = pl330->pinfo;
+       unsigned long flags;
+       int i;
+
+       spin_lock_irqsave(&pl330->lock, flags);
+
+       /* The DMAC itself gone nuts */
+       if (pl330->dmac_tbd.reset_dmac) {
+               pl330->state = DYING;
+               /* Reset the manager too */
+               pl330->dmac_tbd.reset_mngr = true;
+               /* Clear the reset flag */
+               pl330->dmac_tbd.reset_dmac = false;
+       }
+
+       if (pl330->dmac_tbd.reset_mngr) {
+               _stop(pl330->manager);
+               /* Reset all channels */
+               pl330->dmac_tbd.reset_chan = (1 << pi->pcfg.num_chan) - 1;
+               /* Clear the reset flag */
+               pl330->dmac_tbd.reset_mngr = false;
+       }
+
+       for (i = 0; i < pi->pcfg.num_chan; i++) {
+
+               if (pl330->dmac_tbd.reset_chan & (1 << i)) {
+                       struct pl330_thread *thrd = &pl330->channels[i];
+                       void __iomem *regs = pi->base;
+                       enum pl330_op_err err;
+
+                       _stop(thrd);
+
+                       if (readl(regs + FSC) & (1 << thrd->id))
+                               err = PL330_ERR_FAIL;
+                       else
+                               err = PL330_ERR_ABORT;
+
+                       spin_unlock_irqrestore(&pl330->lock, flags);
+
+                       _callback(thrd->req[1 - thrd->lstenq].r, err);
+                       _callback(thrd->req[thrd->lstenq].r, err);
+
+                       spin_lock_irqsave(&pl330->lock, flags);
+
+                       thrd->req[0].r = NULL;
+                       thrd->req[1].r = NULL;
+                       MARK_FREE(&thrd->req[0]);
+                       MARK_FREE(&thrd->req[1]);
+
+                       /* Clear the reset flag */
+                       pl330->dmac_tbd.reset_chan &= ~(1 << i);
+               }
+       }
+
+       spin_unlock_irqrestore(&pl330->lock, flags);
+
+       return;
+}
+
+/* Returns 1 if state was updated, 0 otherwise */
+int pl330_update(const struct pl330_info *pi)
+{
+       struct _pl330_req *rqdone;
+       struct pl330_dmac *pl330;
+       unsigned long flags;
+       void __iomem *regs;
+       u32 val;
+       int id, ev, ret = 0;
+
+       if (!pi || !pi->pl330_data)
+               return 0;
+
+       regs = pi->base;
+       pl330 = pi->pl330_data;
+
+       spin_lock_irqsave(&pl330->lock, flags);
+
+       val = readl(regs + FSM) & 0x1;
+       if (val)
+               pl330->dmac_tbd.reset_mngr = true;
+       else
+               pl330->dmac_tbd.reset_mngr = false;
+
+       val = readl(regs + FSC) & ((1 << pi->pcfg.num_chan) - 1);
+       pl330->dmac_tbd.reset_chan |= val;
+       if (val) {
+               int i = 0;
+               while (i < pi->pcfg.num_chan) {
+                       if (val & (1 << i)) {
+                               dev_info(pi->dev,
+                                       "Reset Channel-%d\t CS-%x FTC-%x\n",
+                                               i, readl(regs + CS(i)),
+                                               readl(regs + FTC(i)));
+                               _stop(&pl330->channels[i]);
+                       }
+                       i++;
+               }
+       }
+
+       /* Check which event happened i.e, thread notified */
+       val = readl(regs + ES);
+       if (pi->pcfg.num_events < 32
+                       && val & ~((1 << pi->pcfg.num_events) - 1)) {
+               pl330->dmac_tbd.reset_dmac = true;
+               dev_err(pi->dev, "%s:%d Unexpected!\n", __func__, __LINE__);
+               ret = 1;
+               goto updt_exit;
+       }
+
+       for (ev = 0; ev < pi->pcfg.num_events; ev++) {
+               if (val & (1 << ev)) { /* Event occured */
+                       struct pl330_thread *thrd;
+                       u32 inten = readl(regs + INTEN);
+                       int active;
+
+                       /* Clear the event */
+                       if (inten & (1 << ev))
+                               writel(1 << ev, regs + INTCLR);
+
+                       ret = 1;
+
+                       id = pl330->events[ev];
+
+                       thrd = &pl330->channels[id];
+
+                       active = _thrd_active(thrd);
+                       if (!active) /* Aborted */
+                               continue;
+
+                       active -= 1;
+
+                       rqdone = &thrd->req[active];
+                       MARK_FREE(rqdone);
+
+                       /* Get going again ASAP */
+                       _start(thrd);
+
+                       /* For now, just make a list of callbacks to be done */
+                       list_add_tail(&rqdone->rqd, &pl330->req_done);
+               }
+       }
+
+       /* Now that we are in no hurry, do the callbacks */
+       while (!list_empty(&pl330->req_done)) {
+               rqdone = container_of(pl330->req_done.next,
+                                       struct _pl330_req, rqd);
+
+               list_del_init(&rqdone->rqd);
+
+               spin_unlock_irqrestore(&pl330->lock, flags);
+               _callback(rqdone->r, PL330_ERR_NONE);
+               spin_lock_irqsave(&pl330->lock, flags);
+       }
+
+updt_exit:
+       spin_unlock_irqrestore(&pl330->lock, flags);
+
+       if (pl330->dmac_tbd.reset_dmac
+                       || pl330->dmac_tbd.reset_mngr
+                       || pl330->dmac_tbd.reset_chan) {
+               ret = 1;
+               tasklet_schedule(&pl330->tasks);
+       }
+
+       return ret;
+}
+EXPORT_SYMBOL(pl330_update);
+
+int pl330_chan_ctrl(void *ch_id, enum pl330_chan_op op)
+{
+       struct pl330_thread *thrd = ch_id;
+       struct pl330_dmac *pl330;
+       unsigned long flags;
+       int ret = 0, active;
+
+       if (!thrd || thrd->free || thrd->dmac->state == DYING)
+               return -EINVAL;
+
+       pl330 = thrd->dmac;
+
+       spin_lock_irqsave(&pl330->lock, flags);
+
+       switch (op) {
+       case PL330_OP_FLUSH:
+               /* Make sure the channel is stopped */
+               _stop(thrd);
+
+               thrd->req[0].r = NULL;
+               thrd->req[1].r = NULL;
+               MARK_FREE(&thrd->req[0]);
+               MARK_FREE(&thrd->req[1]);
+               break;
+
+       case PL330_OP_ABORT:
+               active = _thrd_active(thrd);
+
+               /* Make sure the channel is stopped */
+               _stop(thrd);
+
+               /* ABORT is only for the active req */
+               if (!active)
+                       break;
+
+               active--;
+
+               thrd->req[active].r = NULL;
+               MARK_FREE(&thrd->req[active]);
+
+               /* Start the next */
+       case PL330_OP_START:
+               if (!_start(thrd))
+                       ret = -EIO;
+               break;
+
+       default:
+               ret = -EINVAL;
+       }
+
+       spin_unlock_irqrestore(&pl330->lock, flags);
+       return ret;
+}
+EXPORT_SYMBOL(pl330_chan_ctrl);
+
+int pl330_chan_status(void *ch_id, struct pl330_chanstatus *pstatus)
+{
+       struct pl330_thread *thrd = ch_id;
+       struct pl330_dmac *pl330;
+       struct pl330_info *pi;
+       void __iomem *regs;
+       int active;
+       u32 val;
+
+       if (!pstatus || !thrd || thrd->free)
+               return -EINVAL;
+
+       pl330 = thrd->dmac;
+       pi = pl330->pinfo;
+       regs = pi->base;
+
+       /* The client should remove the DMAC and add again */
+       if (pl330->state == DYING)
+               pstatus->dmac_halted = true;
+       else
+               pstatus->dmac_halted = false;
+
+       val = readl(regs + FSC);
+       if (val & (1 << thrd->id))
+               pstatus->faulting = true;
+       else
+               pstatus->faulting = false;
+
+       active = _thrd_active(thrd);
+
+       if (!active) {
+               /* Indicate that the thread is not running */
+               pstatus->top_req = NULL;
+               pstatus->wait_req = NULL;
+       } else {
+               active--;
+               pstatus->top_req = thrd->req[active].r;
+               pstatus->wait_req = !IS_FREE(&thrd->req[1 - active])
+                                       ? thrd->req[1 - active].r : NULL;
+       }
+
+       pstatus->src_addr = readl(regs + SA(thrd->id));
+       pstatus->dst_addr = readl(regs + DA(thrd->id));
+
+       return 0;
+}
+EXPORT_SYMBOL(pl330_chan_status);
+
+/* Reserve an event */
+static inline int _alloc_event(struct pl330_thread *thrd)
+{
+       struct pl330_dmac *pl330 = thrd->dmac;
+       struct pl330_info *pi = pl330->pinfo;
+       int ev;
+
+       for (ev = 0; ev < pi->pcfg.num_events; ev++)
+               if (pl330->events[ev] == -1) {
+                       pl330->events[ev] = thrd->id;
+                       return ev;
+               }
+
+       return -1;
+}
+
+/* Upon success, returns IdentityToken for the
+ * allocated channel, NULL otherwise.
+ */
+void *pl330_request_channel(const struct pl330_info *pi)
+{
+       struct pl330_thread *thrd = NULL;
+       struct pl330_dmac *pl330;
+       unsigned long flags;
+       int chans, i;
+
+       if (!pi || !pi->pl330_data)
+               return NULL;
+
+       pl330 = pi->pl330_data;
+
+       if (pl330->state == DYING)
+               return NULL;
+
+       chans = pi->pcfg.num_chan;
+
+       spin_lock_irqsave(&pl330->lock, flags);
+
+       for (i = 0; i < chans; i++) {
+               thrd = &pl330->channels[i];
+               if (thrd->free) {
+                       thrd->ev = _alloc_event(thrd);
+                       if (thrd->ev >= 0) {
+                               thrd->free = false;
+                               thrd->lstenq = 1;
+                               thrd->req[0].r = NULL;
+                               MARK_FREE(&thrd->req[0]);
+                               thrd->req[1].r = NULL;
+                               MARK_FREE(&thrd->req[1]);
+                               break;
+                       }
+               }
+               thrd = NULL;
+       }
+
+       spin_unlock_irqrestore(&pl330->lock, flags);
+
+       return thrd;
+}
+EXPORT_SYMBOL(pl330_request_channel);
+
+/* Release an event */
+static inline void _free_event(struct pl330_thread *thrd, int ev)
+{
+       struct pl330_dmac *pl330 = thrd->dmac;
+       struct pl330_info *pi = pl330->pinfo;
+
+       /* If the event is valid and was held by the thread */
+       if (ev >= 0 && ev < pi->pcfg.num_events
+                       && pl330->events[ev] == thrd->id)
+               pl330->events[ev] = -1;
+}
+
+void pl330_release_channel(void *ch_id)
+{
+       struct pl330_thread *thrd = ch_id;
+       struct pl330_dmac *pl330;
+       unsigned long flags;
+
+       if (!thrd || thrd->free)
+               return;
+
+       _stop(thrd);
+
+       _callback(thrd->req[1 - thrd->lstenq].r, PL330_ERR_ABORT);
+       _callback(thrd->req[thrd->lstenq].r, PL330_ERR_ABORT);
+
+       pl330 = thrd->dmac;
+
+       spin_lock_irqsave(&pl330->lock, flags);
+       _free_event(thrd, thrd->ev);
+       thrd->free = true;
+       spin_unlock_irqrestore(&pl330->lock, flags);
+}
+EXPORT_SYMBOL(pl330_release_channel);
+
+/* Initialize the structure for PL330 configuration, that can be used
+ * by the client driver the make best use of the DMAC
+ */
+static void read_dmac_config(struct pl330_info *pi)
+{
+       void __iomem *regs = pi->base;
+       u32 val;
+
+       val = readl(regs + CRD) >> CRD_DATA_WIDTH_SHIFT;
+       val &= CRD_DATA_WIDTH_MASK;
+       pi->pcfg.data_bus_width = 8 * (1 << val);
+
+       val = readl(regs + CRD) >> CRD_DATA_BUFF_SHIFT;
+       val &= CRD_DATA_BUFF_MASK;
+       pi->pcfg.data_buf_dep = val + 1;
+
+       val = readl(regs + CR0) >> CR0_NUM_CHANS_SHIFT;
+       val &= CR0_NUM_CHANS_MASK;
+       val += 1;
+       pi->pcfg.num_chan = val;
+
+       val = readl(regs + CR0);
+       if (val & CR0_PERIPH_REQ_SET) {
+               val = (val >> CR0_NUM_PERIPH_SHIFT) & CR0_NUM_PERIPH_MASK;
+               val += 1;
+               pi->pcfg.num_peri = val;
+               pi->pcfg.peri_ns = readl(regs + CR4);
+       } else {
+               pi->pcfg.num_peri = 0;
+       }
+
+       val = readl(regs + CR0);
+       if (val & CR0_BOOT_MAN_NS)
+               pi->pcfg.mode |= DMAC_MODE_NS;
+       else
+               pi->pcfg.mode &= ~DMAC_MODE_NS;
+
+       val = readl(regs + CR0) >> CR0_NUM_EVENTS_SHIFT;
+       val &= CR0_NUM_EVENTS_MASK;
+       val += 1;
+       pi->pcfg.num_events = val;
+
+       pi->pcfg.irq_ns = readl(regs + CR3);
+
+       pi->pcfg.periph_id = get_id(pi, PERIPH_ID);
+       pi->pcfg.pcell_id = get_id(pi, PCELL_ID);
+}
+
+static inline void _reset_thread(struct pl330_thread *thrd)
+{
+       struct pl330_dmac *pl330 = thrd->dmac;
+       struct pl330_info *pi = pl330->pinfo;
+
+       thrd->req[0].mc_cpu = pl330->mcode_cpu
+                               + (thrd->id * pi->mcbufsz);
+       thrd->req[0].mc_bus = pl330->mcode_bus
+                               + (thrd->id * pi->mcbufsz);
+       thrd->req[0].r = NULL;
+       MARK_FREE(&thrd->req[0]);
+
+       thrd->req[1].mc_cpu = thrd->req[0].mc_cpu
+                               + pi->mcbufsz / 2;
+       thrd->req[1].mc_bus = thrd->req[0].mc_bus
+                               + pi->mcbufsz / 2;
+       thrd->req[1].r = NULL;
+       MARK_FREE(&thrd->req[1]);
+}
+
+static int dmac_alloc_threads(struct pl330_dmac *pl330)
+{
+       struct pl330_info *pi = pl330->pinfo;
+       int chans = pi->pcfg.num_chan;
+       struct pl330_thread *thrd;
+       int i;
+
+       /* Allocate 1 Manager and 'chans' Channel threads */
+       pl330->channels = kzalloc((1 + chans) * sizeof(*thrd),
+                                       GFP_KERNEL);
+       if (!pl330->channels)
+               return -ENOMEM;
+
+       /* Init Channel threads */
+       for (i = 0; i < chans; i++) {
+               thrd = &pl330->channels[i];
+               thrd->id = i;
+               thrd->dmac = pl330;
+               _reset_thread(thrd);
+               thrd->free = true;
+       }
+
+       /* MANAGER is indexed at the end */
+       thrd = &pl330->channels[chans];
+       thrd->id = chans;
+       thrd->dmac = pl330;
+       thrd->free = false;
+       pl330->manager = thrd;
+
+       return 0;
+}
+
+static int dmac_alloc_resources(struct pl330_dmac *pl330)
+{
+       struct pl330_info *pi = pl330->pinfo;
+       int chans = pi->pcfg.num_chan;
+       int ret;
+
+       /*
+        * Alloc MicroCode buffer for 'chans' Channel threads.
+        * A channel's buffer offset is (Channel_Id * MCODE_BUFF_PERCHAN)
+        */
+       pl330->mcode_cpu = dma_alloc_coherent(pi->dev,
+                               chans * pi->mcbufsz,
+                               &pl330->mcode_bus, GFP_KERNEL);
+       if (!pl330->mcode_cpu) {
+               dev_err(pi->dev, "%s:%d Can't allocate memory!\n",
+                       __func__, __LINE__);
+               return -ENOMEM;
+       }
+
+       ret = dmac_alloc_threads(pl330);
+       if (ret) {
+               dev_err(pi->dev, "%s:%d Can't to create channels for DMAC!\n",
+                       __func__, __LINE__);
+               dma_free_coherent(pi->dev,
+                               chans * pi->mcbufsz,
+                               pl330->mcode_cpu, pl330->mcode_bus);
+               return ret;
+       }
+
+       return 0;
+}
+
+int pl330_add(struct pl330_info *pi)
+{
+       struct pl330_dmac *pl330;
+       void __iomem *regs;
+       int i, ret;
+
+       if (!pi || !pi->dev)
+               return -EINVAL;
+
+       /* If already added */
+       if (pi->pl330_data)
+               return -EINVAL;
+
+       /*
+        * If the SoC can perform reset on the DMAC, then do it
+        * before reading its configuration.
+        */
+       if (pi->dmac_reset)
+               pi->dmac_reset(pi);
+
+       regs = pi->base;
+
+       /* Check if we can handle this DMAC */
+       if (get_id(pi, PERIPH_ID) != PERIPH_ID_VAL
+          || get_id(pi, PCELL_ID) != PCELL_ID_VAL) {
+               dev_err(pi->dev, "PERIPH_ID 0x%x, PCELL_ID 0x%x !\n",
+                       readl(regs + PERIPH_ID), readl(regs + PCELL_ID));
+               return -EINVAL;
+       }
+
+       /* Read the configuration of the DMAC */
+       read_dmac_config(pi);
+
+       if (pi->pcfg.num_events == 0) {
+               dev_err(pi->dev, "%s:%d Can't work without events!\n",
+                       __func__, __LINE__);
+               return -EINVAL;
+       }
+
+       pl330 = kzalloc(sizeof(*pl330), GFP_KERNEL);
+       if (!pl330) {
+               dev_err(pi->dev, "%s:%d Can't allocate memory!\n",
+                       __func__, __LINE__);
+               return -ENOMEM;
+       }
+
+       /* Assign the info structure and private data */
+       pl330->pinfo = pi;
+       pi->pl330_data = pl330;
+
+       spin_lock_init(&pl330->lock);
+
+       INIT_LIST_HEAD(&pl330->req_done);
+
+       /* Use default MC buffer size if not provided */
+       if (!pi->mcbufsz)
+               pi->mcbufsz = MCODE_BUFF_PER_REQ * 2;
+
+       /* Mark all events as free */
+       for (i = 0; i < pi->pcfg.num_events; i++)
+               pl330->events[i] = -1;
+
+       /* Allocate resources needed by the DMAC */
+       ret = dmac_alloc_resources(pl330);
+       if (ret) {
+               dev_err(pi->dev, "Unable to create channels for DMAC\n");
+               kfree(pl330);
+               return ret;
+       }
+
+       tasklet_init(&pl330->tasks, pl330_dotask, (unsigned long) pl330);
+
+       pl330->state = INIT;
+
+       return 0;
+}
+EXPORT_SYMBOL(pl330_add);
+
+static int dmac_free_threads(struct pl330_dmac *pl330)
+{
+       struct pl330_info *pi = pl330->pinfo;
+       int chans = pi->pcfg.num_chan;
+       struct pl330_thread *thrd;
+       int i;
+
+       /* Release Channel threads */
+       for (i = 0; i < chans; i++) {
+               thrd = &pl330->channels[i];
+               pl330_release_channel((void *)thrd);
+       }
+
+       /* Free memory */
+       kfree(pl330->channels);
+
+       return 0;
+}
+
+static void dmac_free_resources(struct pl330_dmac *pl330)
+{
+       struct pl330_info *pi = pl330->pinfo;
+       int chans = pi->pcfg.num_chan;
+
+       dmac_free_threads(pl330);
+
+       dma_free_coherent(pi->dev, chans * pi->mcbufsz,
+                               pl330->mcode_cpu, pl330->mcode_bus);
+}
+
+void pl330_del(struct pl330_info *pi)
+{
+       struct pl330_dmac *pl330;
+
+       if (!pi || !pi->pl330_data)
+               return;
+
+       pl330 = pi->pl330_data;
+
+       pl330->state = UNINIT;
+
+       tasklet_kill(&pl330->tasks);
+
+       /* Free DMAC resources */
+       dmac_free_resources(pl330);
+
+       kfree(pl330);
+       pi->pl330_data = NULL;
+}
+EXPORT_SYMBOL(pl330_del);
index 1cf999a..ba65f6e 100644 (file)
@@ -266,13 +266,53 @@ static int vic_set_wake(unsigned int irq, unsigned int on)
 #endif /* CONFIG_PM */
 
 static struct irq_chip vic_chip = {
-       .name   = "VIC",
-       .ack    = vic_ack_irq,
-       .mask   = vic_mask_irq,
-       .unmask = vic_unmask_irq,
-       .set_wake = vic_set_wake,
+       .name           = "VIC",
+       .ack            = vic_ack_irq,
+       .mask           = vic_mask_irq,
+       .unmask         = vic_unmask_irq,
+       .set_wake       = vic_set_wake,
 };
 
+static void __init vic_disable(void __iomem *base)
+{
+       writel(0, base + VIC_INT_SELECT);
+       writel(0, base + VIC_INT_ENABLE);
+       writel(~0, base + VIC_INT_ENABLE_CLEAR);
+       writel(0, base + VIC_IRQ_STATUS);
+       writel(0, base + VIC_ITCR);
+       writel(~0, base + VIC_INT_SOFT_CLEAR);
+}
+
+static void __init vic_clear_interrupts(void __iomem *base)
+{
+       unsigned int i;
+
+       writel(0, base + VIC_PL190_VECT_ADDR);
+       for (i = 0; i < 19; i++) {
+               unsigned int value;
+
+               value = readl(base + VIC_PL190_VECT_ADDR);
+               writel(value, base + VIC_PL190_VECT_ADDR);
+       }
+}
+
+static void __init vic_set_irq_sources(void __iomem *base,
+                               unsigned int irq_start, u32 vic_sources)
+{
+       unsigned int i;
+
+       for (i = 0; i < 32; i++) {
+               if (vic_sources & (1 << i)) {
+                       unsigned int irq = irq_start + i;
+
+                       set_irq_chip(irq, &vic_chip);
+                       set_irq_chip_data(irq, base);
+                       set_irq_handler(irq, handle_level_irq);
+                       set_irq_flags(irq, IRQF_VALID | IRQF_PROBE);
+               }
+       }
+}
+
 /*
  * The PL190 cell from ARM has been modified by ST to handle 64 interrupts.
  * The original cell has 32 interrupts, while the modified one has 64,
@@ -287,13 +327,7 @@ static void __init vic_init_st(void __iomem *base, unsigned int irq_start,
        int vic_2nd_block = ((unsigned long)base & ~PAGE_MASK) != 0;
 
        /* Disable all interrupts initially. */
-
-       writel(0, base + VIC_INT_SELECT);
-       writel(0, base + VIC_INT_ENABLE);
-       writel(~0, base + VIC_INT_ENABLE_CLEAR);
-       writel(0, base + VIC_IRQ_STATUS);
-       writel(0, base + VIC_ITCR);
-       writel(~0, base + VIC_INT_SOFT_CLEAR);
+       vic_disable(base);
 
        /*
         * Make sure we clear all existing interrupts. The vector registers
@@ -302,13 +336,8 @@ static void __init vic_init_st(void __iomem *base, unsigned int irq_start,
         * the second base address, which is 0x20 in the page
         */
        if (vic_2nd_block) {
-               writel(0, base + VIC_PL190_VECT_ADDR);
-               for (i = 0; i < 19; i++) {
-                       unsigned int value;
+               vic_clear_interrupts(base);
 
-                       value = readl(base + VIC_PL190_VECT_ADDR);
-                       writel(value, base + VIC_PL190_VECT_ADDR);
-               }
                /* ST has 16 vectors as well, but we don't enable them by now */
                for (i = 0; i < 16; i++) {
                        void __iomem *reg = base + VIC_VECT_CNTL0 + (i * 4);
@@ -318,16 +347,7 @@ static void __init vic_init_st(void __iomem *base, unsigned int irq_start,
                writel(32, base + VIC_PL190_DEF_VECT_ADDR);
        }
 
-       for (i = 0; i < 32; i++) {
-               if (vic_sources & (1 << i)) {
-                       unsigned int irq = irq_start + i;
-
-                       set_irq_chip(irq, &vic_chip);
-                       set_irq_chip_data(irq, base);
-                       set_irq_handler(irq, handle_level_irq);
-                       set_irq_flags(irq, IRQF_VALID | IRQF_PROBE);
-               }
-       }
+       vic_set_irq_sources(base, irq_start, vic_sources);
 }
 
 /**
@@ -365,37 +385,14 @@ void __init vic_init(void __iomem *base, unsigned int irq_start,
        }
 
        /* Disable all interrupts initially. */
+       vic_disable(base);
 
-       writel(0, base + VIC_INT_SELECT);
-       writel(0, base + VIC_INT_ENABLE);
-       writel(~0, base + VIC_INT_ENABLE_CLEAR);
-       writel(0, base + VIC_IRQ_STATUS);
-       writel(0, base + VIC_ITCR);
-       writel(~0, base + VIC_INT_SOFT_CLEAR);
-
-       /*
-        * Make sure we clear all existing interrupts
-        */
-       writel(0, base + VIC_PL190_VECT_ADDR);
-       for (i = 0; i < 19; i++) {
-               unsigned int value;
-
-               value = readl(base + VIC_PL190_VECT_ADDR);
-               writel(value, base + VIC_PL190_VECT_ADDR);
-       }
+       /* Make sure we clear all existing interrupts */
+       vic_clear_interrupts(base);
 
        vic_init2(base);
 
-       for (i = 0; i < 32; i++) {
-               if (vic_sources & (1 << i)) {
-                       unsigned int irq = irq_start + i;
-
-                       set_irq_chip(irq, &vic_chip);
-                       set_irq_chip_data(irq, base);
-                       set_irq_handler(irq, handle_level_irq);
-                       set_irq_flags(irq, IRQF_VALID | IRQF_PROBE);
-               }
-       }
+       vic_set_irq_sources(base, irq_start, vic_sources);
 
        vic_pm_register(base, irq_start, resume_sources);
 }
diff --git a/arch/arm/configs/spear300_defconfig b/arch/arm/configs/spear300_defconfig
new file mode 100644 (file)
index 0000000..35e64d1
--- /dev/null
@@ -0,0 +1,773 @@
+#
+# Automatically generated make config: don't edit
+# Linux kernel version: 2.6.32
+# Tue Mar 23 14:36:23 2010
+#
+CONFIG_ARM=y
+CONFIG_SYS_SUPPORTS_APM_EMULATION=y
+CONFIG_GENERIC_GPIO=y
+CONFIG_GENERIC_TIME=y
+CONFIG_GENERIC_CLOCKEVENTS=y
+CONFIG_GENERIC_HARDIRQS=y
+CONFIG_STACKTRACE_SUPPORT=y
+CONFIG_HAVE_LATENCYTOP_SUPPORT=y
+CONFIG_LOCKDEP_SUPPORT=y
+CONFIG_TRACE_IRQFLAGS_SUPPORT=y
+CONFIG_HARDIRQS_SW_RESEND=y
+CONFIG_GENERIC_IRQ_PROBE=y
+CONFIG_RWSEM_GENERIC_SPINLOCK=y
+CONFIG_GENERIC_HWEIGHT=y
+CONFIG_GENERIC_CALIBRATE_DELAY=y
+CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y
+CONFIG_VECTORS_BASE=0xffff0000
+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
+CONFIG_CONSTRUCTORS=y
+
+#
+# General setup
+#
+CONFIG_EXPERIMENTAL=y
+CONFIG_BROKEN_ON_SMP=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
+CONFIG_LOCALVERSION=""
+CONFIG_LOCALVERSION_AUTO=y
+CONFIG_SWAP=y
+CONFIG_SYSVIPC=y
+CONFIG_SYSVIPC_SYSCTL=y
+CONFIG_BSD_PROCESS_ACCT=y
+# CONFIG_BSD_PROCESS_ACCT_V3 is not set
+
+#
+# RCU Subsystem
+#
+CONFIG_TREE_RCU=y
+# CONFIG_TREE_PREEMPT_RCU is not set
+# CONFIG_RCU_TRACE is not set
+CONFIG_RCU_FANOUT=32
+# CONFIG_RCU_FANOUT_EXACT is not set
+# CONFIG_TREE_RCU_TRACE is not set
+# CONFIG_IKCONFIG is not set
+CONFIG_LOG_BUF_SHIFT=17
+# CONFIG_GROUP_SCHED is not set
+# CONFIG_CGROUPS is not set
+# CONFIG_SYSFS_DEPRECATED_V2 is not set
+# CONFIG_RELAY is not set
+CONFIG_NAMESPACES=y
+# CONFIG_UTS_NS is not set
+# CONFIG_IPC_NS is not set
+# CONFIG_USER_NS is not set
+# CONFIG_PID_NS is not set
+CONFIG_BLK_DEV_INITRD=y
+CONFIG_INITRAMFS_SOURCE=""
+CONFIG_RD_GZIP=y
+CONFIG_RD_BZIP2=y
+CONFIG_RD_LZMA=y
+CONFIG_CC_OPTIMIZE_FOR_SIZE=y
+CONFIG_SYSCTL=y
+CONFIG_ANON_INODES=y
+# CONFIG_EMBEDDED is not set
+CONFIG_UID16=y
+CONFIG_SYSCTL_SYSCALL=y
+CONFIG_KALLSYMS=y
+# CONFIG_KALLSYMS_ALL is not set
+CONFIG_KALLSYMS_EXTRA_PASS=y
+CONFIG_HOTPLUG=y
+CONFIG_PRINTK=y
+CONFIG_BUG=y
+CONFIG_ELF_CORE=y
+CONFIG_BASE_FULL=y
+CONFIG_FUTEX=y
+CONFIG_EPOLL=y
+CONFIG_SIGNALFD=y
+CONFIG_TIMERFD=y
+CONFIG_EVENTFD=y
+CONFIG_SHMEM=y
+CONFIG_AIO=y
+
+#
+# Kernel Performance Events And Counters
+#
+CONFIG_VM_EVENT_COUNTERS=y
+CONFIG_SLUB_DEBUG=y
+CONFIG_COMPAT_BRK=y
+# CONFIG_SLAB is not set
+CONFIG_SLUB=y
+# CONFIG_SLOB is not set
+# CONFIG_PROFILING is not set
+CONFIG_HAVE_OPROFILE=y
+# CONFIG_KPROBES is not set
+CONFIG_HAVE_KPROBES=y
+CONFIG_HAVE_KRETPROBES=y
+CONFIG_HAVE_CLK=y
+
+#
+# GCOV-based kernel profiling
+#
+# CONFIG_GCOV_KERNEL is not set
+# CONFIG_SLOW_WORK is not set
+CONFIG_HAVE_GENERIC_DMA_COHERENT=y
+CONFIG_SLABINFO=y
+CONFIG_RT_MUTEXES=y
+CONFIG_BASE_SMALL=0
+CONFIG_MODULES=y
+# CONFIG_MODULE_FORCE_LOAD is not set
+CONFIG_MODULE_UNLOAD=y
+# CONFIG_MODULE_FORCE_UNLOAD is not set
+CONFIG_MODVERSIONS=y
+# CONFIG_MODULE_SRCVERSION_ALL is not set
+CONFIG_BLOCK=y
+CONFIG_LBDAF=y
+CONFIG_BLK_DEV_BSG=y
+# CONFIG_BLK_DEV_INTEGRITY is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+# CONFIG_DEFAULT_AS is not set
+# CONFIG_DEFAULT_DEADLINE is not set
+CONFIG_DEFAULT_CFQ=y
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="cfq"
+# CONFIG_FREEZER is not set
+
+#
+# System Type
+#
+CONFIG_MMU=y
+# CONFIG_ARCH_AAEC2000 is not set
+# CONFIG_ARCH_INTEGRATOR is not set
+# CONFIG_ARCH_REALVIEW is not set
+# CONFIG_ARCH_VERSATILE is not set
+# CONFIG_ARCH_AT91 is not set
+# CONFIG_ARCH_CLPS711X is not set
+# CONFIG_ARCH_GEMINI is not set
+# CONFIG_ARCH_EBSA110 is not set
+# CONFIG_ARCH_EP93XX is not set
+# CONFIG_ARCH_FOOTBRIDGE is not set
+# CONFIG_ARCH_MXC is not set
+# CONFIG_ARCH_STMP3XXX is not set
+# CONFIG_ARCH_NETX is not set
+# CONFIG_ARCH_H720X is not set
+# CONFIG_ARCH_NOMADIK is not set
+# CONFIG_ARCH_IOP13XX is not set
+# CONFIG_ARCH_IOP32X is not set
+# CONFIG_ARCH_IOP33X is not set
+# CONFIG_ARCH_IXP23XX is not set
+# CONFIG_ARCH_IXP2000 is not set
+# CONFIG_ARCH_IXP4XX is not set
+# CONFIG_ARCH_L7200 is not set
+# CONFIG_ARCH_KIRKWOOD is not set
+# CONFIG_ARCH_LOKI is not set
+# CONFIG_ARCH_MV78XX0 is not set
+# CONFIG_ARCH_ORION5X is not set
+# CONFIG_ARCH_MMP is not set
+# CONFIG_ARCH_KS8695 is not set
+# CONFIG_ARCH_NS9XXX is not set
+# CONFIG_ARCH_W90X900 is not set
+# CONFIG_ARCH_PNX4008 is not set
+# CONFIG_ARCH_PXA is not set
+# CONFIG_ARCH_MSM is not set
+# CONFIG_ARCH_RPC is not set
+# CONFIG_ARCH_SA1100 is not set
+# CONFIG_ARCH_S3C2410 is not set
+# CONFIG_ARCH_S3C64XX is not set
+# CONFIG_ARCH_S5PC1XX is not set
+# CONFIG_ARCH_SHARK is not set
+# CONFIG_ARCH_LH7A40X is not set
+# CONFIG_ARCH_U300 is not set
+# CONFIG_ARCH_DAVINCI is not set
+# CONFIG_ARCH_OMAP is not set
+# CONFIG_ARCH_BCMRING is not set
+CONFIG_PLAT_SPEAR=y
+CONFIG_ARCH_SPEAR3XX=y
+# CONFIG_ARCH_SPEAR6XX is not set
+CONFIG_MACH_SPEAR300=y
+# CONFIG_MACH_SPEAR310 is not set
+# CONFIG_MACH_SPEAR320 is not set
+CONFIG_BOARD_SPEAR300_EVB=y
+
+#
+# Processor Type
+#
+CONFIG_CPU_32=y
+CONFIG_CPU_ARM926T=y
+CONFIG_CPU_32v5=y
+CONFIG_CPU_ABRT_EV5TJ=y
+CONFIG_CPU_PABRT_LEGACY=y
+CONFIG_CPU_CACHE_VIVT=y
+CONFIG_CPU_COPY_V4WB=y
+CONFIG_CPU_TLB_V4WBI=y
+CONFIG_CPU_CP15=y
+CONFIG_CPU_CP15_MMU=y
+
+#
+# Processor Features
+#
+CONFIG_ARM_THUMB=y
+# CONFIG_CPU_ICACHE_DISABLE is not set
+# CONFIG_CPU_DCACHE_DISABLE is not set
+# CONFIG_CPU_DCACHE_WRITETHROUGH is not set
+# CONFIG_CPU_CACHE_ROUND_ROBIN is not set
+CONFIG_ARM_L1_CACHE_SHIFT=5
+CONFIG_ARM_VIC=y
+CONFIG_ARM_VIC_NR=2
+CONFIG_COMMON_CLKDEV=y
+
+#
+# Bus support
+#
+CONFIG_ARM_AMBA=y
+# CONFIG_PCI_SYSCALL is not set
+# CONFIG_ARCH_SUPPORTS_MSI is not set
+# CONFIG_PCCARD is not set
+
+#
+# Kernel Features
+#
+# CONFIG_NO_HZ is not set
+# CONFIG_HIGH_RES_TIMERS is not set
+CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
+CONFIG_VMSPLIT_3G=y
+# CONFIG_VMSPLIT_2G is not set
+# CONFIG_VMSPLIT_1G is not set
+CONFIG_PAGE_OFFSET=0xC0000000
+CONFIG_PREEMPT_NONE=y
+# CONFIG_PREEMPT_VOLUNTARY is not set
+# CONFIG_PREEMPT is not set
+CONFIG_HZ=100
+# CONFIG_AEABI is not set
+# CONFIG_ARCH_SPARSEMEM_DEFAULT is not set
+# CONFIG_ARCH_SELECT_MEMORY_MODEL is not set
+# CONFIG_HIGHMEM is not set
+CONFIG_SELECT_MEMORY_MODEL=y
+CONFIG_FLATMEM_MANUAL=y
+# CONFIG_DISCONTIGMEM_MANUAL is not set
+# CONFIG_SPARSEMEM_MANUAL is not set
+CONFIG_FLATMEM=y
+CONFIG_FLAT_NODE_MEM_MAP=y
+CONFIG_PAGEFLAGS_EXTENDED=y
+CONFIG_SPLIT_PTLOCK_CPUS=4096
+# CONFIG_PHYS_ADDR_T_64BIT is not set
+CONFIG_ZONE_DMA_FLAG=0
+CONFIG_VIRT_TO_BUS=y
+CONFIG_HAVE_MLOCK=y
+CONFIG_HAVE_MLOCKED_PAGE_BIT=y
+# CONFIG_KSM is not set
+CONFIG_DEFAULT_MMAP_MIN_ADDR=4096
+CONFIG_ALIGNMENT_TRAP=y
+# CONFIG_UACCESS_WITH_MEMCPY is not set
+
+#
+# Boot options
+#
+CONFIG_ZBOOT_ROM_TEXT=0
+CONFIG_ZBOOT_ROM_BSS=0
+CONFIG_CMDLINE=""
+# CONFIG_XIP_KERNEL is not set
+# CONFIG_KEXEC is not set
+
+#
+# CPU Power Management
+#
+# CONFIG_CPU_IDLE is not set
+
+#
+# Floating point emulation
+#
+
+#
+# At least one emulation must be selected
+#
+# CONFIG_FPE_NWFPE is not set
+# CONFIG_FPE_FASTFPE is not set
+# CONFIG_VFP is not set
+
+#
+# Userspace binary formats
+#
+CONFIG_BINFMT_ELF=y
+# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
+CONFIG_HAVE_AOUT=y
+# CONFIG_BINFMT_AOUT is not set
+CONFIG_BINFMT_MISC=y
+
+#
+# Power management options
+#
+# CONFIG_PM is not set
+CONFIG_ARCH_SUSPEND_POSSIBLE=y
+# CONFIG_NET is not set
+
+#
+# Device Drivers
+#
+
+#
+# Generic Driver Options
+#
+CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
+# CONFIG_DEVTMPFS is not set
+CONFIG_STANDALONE=y
+CONFIG_PREVENT_FIRMWARE_BUILD=y
+CONFIG_FW_LOADER=y
+CONFIG_FIRMWARE_IN_KERNEL=y
+CONFIG_EXTRA_FIRMWARE=""
+# CONFIG_DEBUG_DRIVER is not set
+# CONFIG_DEBUG_DEVRES is not set
+# CONFIG_SYS_HYPERVISOR is not set
+# CONFIG_MTD is not set
+# CONFIG_PARPORT is not set
+CONFIG_BLK_DEV=y
+# CONFIG_BLK_DEV_COW_COMMON is not set
+# CONFIG_BLK_DEV_LOOP is not set
+CONFIG_BLK_DEV_RAM=y
+CONFIG_BLK_DEV_RAM_COUNT=16
+CONFIG_BLK_DEV_RAM_SIZE=16384
+# CONFIG_BLK_DEV_XIP is not set
+# CONFIG_CDROM_PKTCDVD is not set
+CONFIG_MISC_DEVICES=y
+# CONFIG_ENCLOSURE_SERVICES is not set
+# CONFIG_C2PORT is not set
+
+#
+# EEPROM support
+#
+# CONFIG_EEPROM_93CX6 is not set
+CONFIG_HAVE_IDE=y
+# CONFIG_IDE is not set
+
+#
+# SCSI device support
+#
+# CONFIG_RAID_ATTRS is not set
+# CONFIG_SCSI is not set
+# CONFIG_SCSI_DMA is not set
+# CONFIG_SCSI_NETLINK is not set
+# CONFIG_ATA is not set
+# CONFIG_MD is not set
+# CONFIG_PHONE is not set
+
+#
+# Input device support
+#
+CONFIG_INPUT=y
+CONFIG_INPUT_FF_MEMLESS=y
+# CONFIG_INPUT_POLLDEV is not set
+
+#
+# Userland interfaces
+#
+CONFIG_INPUT_MOUSEDEV=y
+# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
+CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
+# CONFIG_INPUT_JOYDEV is not set
+# CONFIG_INPUT_EVDEV is not set
+# CONFIG_INPUT_EVBUG is not set
+
+#
+# Input Device Drivers
+#
+# CONFIG_INPUT_KEYBOARD is not set
+# CONFIG_INPUT_MOUSE is not set
+# CONFIG_INPUT_JOYSTICK is not set
+# CONFIG_INPUT_TABLET is not set
+# CONFIG_INPUT_TOUCHSCREEN is not set
+# CONFIG_INPUT_MISC is not set
+
+#
+# Hardware I/O ports
+#
+CONFIG_SERIO=y
+CONFIG_SERIO_SERPORT=y
+# CONFIG_SERIO_AMBAKMI is not set
+# CONFIG_SERIO_RAW is not set
+# CONFIG_GAMEPORT is not set
+
+#
+# Character devices
+#
+CONFIG_VT=y
+CONFIG_CONSOLE_TRANSLATIONS=y
+CONFIG_VT_CONSOLE=y
+CONFIG_HW_CONSOLE=y
+# CONFIG_VT_HW_CONSOLE_BINDING is not set
+CONFIG_DEVKMEM=y
+# CONFIG_SERIAL_NONSTANDARD is not set
+
+#
+# Serial drivers
+#
+# CONFIG_SERIAL_8250 is not set
+
+#
+# Non-8250 serial port support
+#
+# CONFIG_SERIAL_AMBA_PL010 is not set
+CONFIG_SERIAL_AMBA_PL011=y
+CONFIG_SERIAL_AMBA_PL011_CONSOLE=y
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+CONFIG_UNIX98_PTYS=y
+# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set
+# CONFIG_LEGACY_PTYS is not set
+# CONFIG_IPMI_HANDLER is not set
+# CONFIG_HW_RANDOM is not set
+# CONFIG_R3964 is not set
+CONFIG_RAW_DRIVER=y
+CONFIG_MAX_RAW_DEVS=8192
+# CONFIG_TCG_TPM is not set
+# CONFIG_I2C is not set
+# CONFIG_SPI is not set
+
+#
+# PPS support
+#
+# CONFIG_PPS is not set
+CONFIG_ARCH_REQUIRE_GPIOLIB=y
+CONFIG_GPIOLIB=y
+# CONFIG_DEBUG_GPIO is not set
+CONFIG_GPIO_SYSFS=y
+
+#
+# Memory mapped GPIO expanders:
+#
+CONFIG_GPIO_PL061=y
+
+#
+# I2C GPIO expanders:
+#
+
+#
+# PCI GPIO expanders:
+#
+
+#
+# SPI GPIO expanders:
+#
+
+#
+# AC97 GPIO expanders:
+#
+# CONFIG_W1 is not set
+# CONFIG_POWER_SUPPLY is not set
+# CONFIG_HWMON is not set
+# CONFIG_THERMAL is not set
+# CONFIG_WATCHDOG is not set
+CONFIG_SSB_POSSIBLE=y
+
+#
+# Sonics Silicon Backplane
+#
+# CONFIG_SSB is not set
+
+#
+# Multifunction device drivers
+#
+# CONFIG_MFD_CORE is not set
+# CONFIG_MFD_SM501 is not set
+# CONFIG_MFD_ASIC3 is not set
+# CONFIG_HTC_EGPIO is not set
+# CONFIG_HTC_PASIC3 is not set
+# CONFIG_MFD_TMIO is not set
+# CONFIG_MFD_T7L66XB is not set
+# CONFIG_MFD_TC6387XB is not set
+# CONFIG_MFD_TC6393XB is not set
+# CONFIG_REGULATOR is not set
+# CONFIG_MEDIA_SUPPORT is not set
+
+#
+# Graphics support
+#
+# CONFIG_VGASTATE is not set
+# CONFIG_VIDEO_OUTPUT_CONTROL is not set
+# CONFIG_FB is not set
+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
+
+#
+# Display device support
+#
+# CONFIG_DISPLAY_SUPPORT is not set
+
+#
+# Console display driver support
+#
+# CONFIG_VGA_CONSOLE is not set
+CONFIG_DUMMY_CONSOLE=y
+# CONFIG_SOUND is not set
+# CONFIG_HID_SUPPORT is not set
+# CONFIG_USB_SUPPORT is not set
+# CONFIG_MMC is not set
+# CONFIG_MEMSTICK is not set
+# CONFIG_NEW_LEDS is not set
+# CONFIG_ACCESSIBILITY is not set
+CONFIG_RTC_LIB=y
+# CONFIG_RTC_CLASS is not set
+# CONFIG_DMADEVICES is not set
+# CONFIG_AUXDISPLAY is not set
+# CONFIG_UIO is not set
+
+#
+# TI VLYNQ
+#
+# CONFIG_STAGING is not set
+
+#
+# File systems
+#
+CONFIG_EXT2_FS=y
+CONFIG_EXT2_FS_XATTR=y
+# CONFIG_EXT2_FS_POSIX_ACL is not set
+CONFIG_EXT2_FS_SECURITY=y
+# CONFIG_EXT2_FS_XIP is not set
+CONFIG_EXT3_FS=y
+# CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set
+CONFIG_EXT3_FS_XATTR=y
+# CONFIG_EXT3_FS_POSIX_ACL is not set
+CONFIG_EXT3_FS_SECURITY=y
+# CONFIG_EXT4_FS is not set
+CONFIG_JBD=y
+# CONFIG_JBD_DEBUG is not set
+CONFIG_FS_MBCACHE=y
+# CONFIG_REISERFS_FS is not set
+# CONFIG_JFS_FS is not set
+# CONFIG_FS_POSIX_ACL is not set
+# CONFIG_XFS_FS is not set
+# CONFIG_GFS2_FS is not set
+# CONFIG_BTRFS_FS is not set
+# CONFIG_NILFS2_FS is not set
+CONFIG_FILE_LOCKING=y
+CONFIG_FSNOTIFY=y
+CONFIG_DNOTIFY=y
+# CONFIG_INOTIFY is not set
+CONFIG_INOTIFY_USER=y
+# CONFIG_QUOTA is not set
+# CONFIG_AUTOFS_FS is not set
+CONFIG_AUTOFS4_FS=m
+# CONFIG_FUSE_FS is not set
+
+#
+# Caches
+#
+# CONFIG_FSCACHE is not set
+
+#
+# CD-ROM/DVD Filesystems
+#
+# CONFIG_ISO9660_FS is not set
+# CONFIG_UDF_FS is not set
+
+#
+# DOS/FAT/NT Filesystems
+#
+CONFIG_FAT_FS=m
+CONFIG_MSDOS_FS=m
+CONFIG_VFAT_FS=m
+CONFIG_FAT_DEFAULT_CODEPAGE=437
+CONFIG_FAT_DEFAULT_IOCHARSET="ascii"
+# CONFIG_NTFS_FS is not set
+
+#
+# Pseudo filesystems
+#
+CONFIG_PROC_FS=y
+CONFIG_PROC_SYSCTL=y
+CONFIG_PROC_PAGE_MONITOR=y
+CONFIG_SYSFS=y
+CONFIG_TMPFS=y
+# CONFIG_TMPFS_POSIX_ACL is not set
+# CONFIG_HUGETLB_PAGE is not set
+# CONFIG_CONFIGFS_FS is not set
+CONFIG_MISC_FILESYSTEMS=y
+# CONFIG_ADFS_FS is not set
+# CONFIG_AFFS_FS is not set
+# CONFIG_HFS_FS is not set
+# CONFIG_HFSPLUS_FS is not set
+# CONFIG_BEFS_FS is not set
+# CONFIG_BFS_FS is not set
+# CONFIG_EFS_FS is not set
+# CONFIG_SQUASHFS is not set
+# CONFIG_VXFS_FS is not set
+# CONFIG_MINIX_FS is not set
+# CONFIG_OMFS_FS is not set
+# CONFIG_HPFS_FS is not set
+# CONFIG_QNX4FS_FS is not set
+# CONFIG_ROMFS_FS is not set
+# CONFIG_SYSV_FS is not set
+# CONFIG_UFS_FS is not set
+
+#
+# Partition Types
+#
+CONFIG_PARTITION_ADVANCED=y
+# CONFIG_ACORN_PARTITION is not set
+# CONFIG_OSF_PARTITION is not set
+# CONFIG_AMIGA_PARTITION is not set
+# CONFIG_ATARI_PARTITION is not set
+# CONFIG_MAC_PARTITION is not set
+CONFIG_MSDOS_PARTITION=y
+# CONFIG_BSD_DISKLABEL is not set
+# CONFIG_MINIX_SUBPARTITION is not set
+# CONFIG_SOLARIS_X86_PARTITION is not set
+# CONFIG_UNIXWARE_DISKLABEL is not set
+# CONFIG_LDM_PARTITION is not set
+# CONFIG_SGI_PARTITION is not set
+# CONFIG_ULTRIX_PARTITION is not set
+# CONFIG_SUN_PARTITION is not set
+# CONFIG_KARMA_PARTITION is not set
+# CONFIG_EFI_PARTITION is not set
+# CONFIG_SYSV68_PARTITION is not set
+CONFIG_NLS=y
+CONFIG_NLS_DEFAULT="utf8"
+CONFIG_NLS_CODEPAGE_437=y
+# CONFIG_NLS_CODEPAGE_737 is not set
+# CONFIG_NLS_CODEPAGE_775 is not set
+# CONFIG_NLS_CODEPAGE_850 is not set
+# CONFIG_NLS_CODEPAGE_852 is not set
+# CONFIG_NLS_CODEPAGE_855 is not set
+# CONFIG_NLS_CODEPAGE_857 is not set
+# CONFIG_NLS_CODEPAGE_860 is not set
+# CONFIG_NLS_CODEPAGE_861 is not set
+# CONFIG_NLS_CODEPAGE_862 is not set
+# CONFIG_NLS_CODEPAGE_863 is not set
+# CONFIG_NLS_CODEPAGE_864 is not set
+# CONFIG_NLS_CODEPAGE_865 is not set
+# CONFIG_NLS_CODEPAGE_866 is not set
+# CONFIG_NLS_CODEPAGE_869 is not set
+# CONFIG_NLS_CODEPAGE_936 is not set
+# CONFIG_NLS_CODEPAGE_950 is not set
+# CONFIG_NLS_CODEPAGE_932 is not set
+# CONFIG_NLS_CODEPAGE_949 is not set
+# CONFIG_NLS_CODEPAGE_874 is not set
+# CONFIG_NLS_ISO8859_8 is not set
+# CONFIG_NLS_CODEPAGE_1250 is not set
+# CONFIG_NLS_CODEPAGE_1251 is not set
+CONFIG_NLS_ASCII=m
+# CONFIG_NLS_ISO8859_1 is not set
+# CONFIG_NLS_ISO8859_2 is not set
+# CONFIG_NLS_ISO8859_3 is not set
+# CONFIG_NLS_ISO8859_4 is not set
+# CONFIG_NLS_ISO8859_5 is not set
+# CONFIG_NLS_ISO8859_6 is not set
+# CONFIG_NLS_ISO8859_7 is not set
+# CONFIG_NLS_ISO8859_9 is not set
+# CONFIG_NLS_ISO8859_13 is not set
+# CONFIG_NLS_ISO8859_14 is not set
+# CONFIG_NLS_ISO8859_15 is not set
+# CONFIG_NLS_KOI8_R is not set
+# CONFIG_NLS_KOI8_U is not set
+# CONFIG_NLS_UTF8 is not set
+
+#
+# Kernel hacking
+#
+# CONFIG_PRINTK_TIME is not set
+CONFIG_ENABLE_WARN_DEPRECATED=y
+CONFIG_ENABLE_MUST_CHECK=y
+CONFIG_FRAME_WARN=1024
+CONFIG_MAGIC_SYSRQ=y
+# CONFIG_STRIP_ASM_SYMS is not set
+# CONFIG_UNUSED_SYMBOLS is not set
+CONFIG_DEBUG_FS=y
+# CONFIG_HEADERS_CHECK is not set
+CONFIG_DEBUG_KERNEL=y
+# CONFIG_DEBUG_SHIRQ is not set
+CONFIG_DETECT_SOFTLOCKUP=y
+# CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set
+CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=0
+CONFIG_DETECT_HUNG_TASK=y
+# CONFIG_BOOTPARAM_HUNG_TASK_PANIC is not set
+CONFIG_BOOTPARAM_HUNG_TASK_PANIC_VALUE=0
+CONFIG_SCHED_DEBUG=y
+# CONFIG_SCHEDSTATS is not set
+# CONFIG_TIMER_STATS is not set
+# CONFIG_DEBUG_OBJECTS is not set
+# CONFIG_SLUB_DEBUG_ON is not set
+# CONFIG_SLUB_STATS is not set
+# CONFIG_DEBUG_KMEMLEAK is not set
+# CONFIG_DEBUG_RT_MUTEXES is not set
+# CONFIG_RT_MUTEX_TESTER is not set
+CONFIG_DEBUG_SPINLOCK=y
+# CONFIG_DEBUG_MUTEXES is not set
+# CONFIG_DEBUG_LOCK_ALLOC is not set
+# CONFIG_PROVE_LOCKING is not set
+# CONFIG_LOCK_STAT is not set
+CONFIG_DEBUG_SPINLOCK_SLEEP=y
+# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
+# CONFIG_DEBUG_KOBJECT is not set
+CONFIG_DEBUG_BUGVERBOSE=y
+CONFIG_DEBUG_INFO=y
+# CONFIG_DEBUG_VM is not set
+# CONFIG_DEBUG_WRITECOUNT is not set
+CONFIG_DEBUG_MEMORY_INIT=y
+# CONFIG_DEBUG_LIST is not set
+# CONFIG_DEBUG_SG is not set
+# CONFIG_DEBUG_NOTIFIERS is not set
+# CONFIG_DEBUG_CREDENTIALS is not set
+CONFIG_FRAME_POINTER=y
+# CONFIG_BOOT_PRINTK_DELAY is not set
+# CONFIG_RCU_TORTURE_TEST is not set
+CONFIG_RCU_CPU_STALL_DETECTOR=y
+# CONFIG_BACKTRACE_SELF_TEST is not set
+# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set
+# CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set
+# CONFIG_FAULT_INJECTION is not set
+# CONFIG_LATENCYTOP is not set
+# CONFIG_SYSCTL_SYSCALL_CHECK is not set
+# CONFIG_PAGE_POISONING is not set
+CONFIG_HAVE_FUNCTION_TRACER=y
+CONFIG_TRACING_SUPPORT=y
+CONFIG_FTRACE=y
+# CONFIG_FUNCTION_TRACER is not set
+# CONFIG_IRQSOFF_TRACER is not set
+# CONFIG_SCHED_TRACER is not set
+# CONFIG_ENABLE_DEFAULT_TRACERS is not set
+# CONFIG_BOOT_TRACER is not set
+CONFIG_BRANCH_PROFILE_NONE=y
+# CONFIG_PROFILE_ANNOTATED_BRANCHES is not set
+# CONFIG_PROFILE_ALL_BRANCHES is not set
+# CONFIG_STACK_TRACER is not set
+# CONFIG_KMEMTRACE is not set
+# CONFIG_WORKQUEUE_TRACER is not set
+# CONFIG_BLK_DEV_IO_TRACE is not set
+# CONFIG_DYNAMIC_DEBUG is not set
+# CONFIG_SAMPLES is not set
+CONFIG_HAVE_ARCH_KGDB=y
+# CONFIG_KGDB is not set
+# CONFIG_DEBUG_USER is not set
+# CONFIG_DEBUG_ERRORS is not set
+# CONFIG_DEBUG_STACK_USAGE is not set
+# CONFIG_DEBUG_LL is not set
+
+#
+# Security options
+#
+# CONFIG_KEYS is not set
+# CONFIG_SECURITY is not set
+# CONFIG_SECURITYFS is not set
+# CONFIG_SECURITY_FILE_CAPABILITIES is not set
+# CONFIG_CRYPTO is not set
+# CONFIG_BINARY_PRINTF is not set
+
+#
+# Library routines
+#
+CONFIG_GENERIC_FIND_LAST_BIT=y
+# CONFIG_CRC_CCITT is not set
+# CONFIG_CRC16 is not set
+# CONFIG_CRC_T10DIF is not set
+# CONFIG_CRC_ITU_T is not set
+# CONFIG_CRC32 is not set
+# CONFIG_CRC7 is not set
+# CONFIG_LIBCRC32C is not set
+CONFIG_ZLIB_INFLATE=y
+CONFIG_DECOMPRESS_GZIP=y
+CONFIG_DECOMPRESS_BZIP2=y
+CONFIG_DECOMPRESS_LZMA=y
+CONFIG_HAS_IOMEM=y
+CONFIG_HAS_IOPORT=y
+CONFIG_HAS_DMA=y
diff --git a/arch/arm/configs/spear310_defconfig b/arch/arm/configs/spear310_defconfig
new file mode 100644 (file)
index 0000000..cbbfd29
--- /dev/null
@@ -0,0 +1,775 @@
+#
+# Automatically generated make config: don't edit
+# Linux kernel version: 2.6.32
+# Tue Mar 23 14:37:01 2010
+#
+CONFIG_ARM=y
+CONFIG_SYS_SUPPORTS_APM_EMULATION=y
+CONFIG_GENERIC_GPIO=y
+CONFIG_GENERIC_TIME=y
+CONFIG_GENERIC_CLOCKEVENTS=y
+CONFIG_GENERIC_HARDIRQS=y
+CONFIG_STACKTRACE_SUPPORT=y
+CONFIG_HAVE_LATENCYTOP_SUPPORT=y
+CONFIG_LOCKDEP_SUPPORT=y
+CONFIG_TRACE_IRQFLAGS_SUPPORT=y
+CONFIG_HARDIRQS_SW_RESEND=y
+CONFIG_GENERIC_IRQ_PROBE=y
+CONFIG_RWSEM_GENERIC_SPINLOCK=y
+CONFIG_GENERIC_HWEIGHT=y
+CONFIG_GENERIC_CALIBRATE_DELAY=y
+CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y
+CONFIG_VECTORS_BASE=0xffff0000
+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
+CONFIG_CONSTRUCTORS=y
+
+#
+# General setup
+#
+CONFIG_EXPERIMENTAL=y
+CONFIG_BROKEN_ON_SMP=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
+CONFIG_LOCALVERSION=""
+CONFIG_LOCALVERSION_AUTO=y
+CONFIG_SWAP=y
+CONFIG_SYSVIPC=y
+CONFIG_SYSVIPC_SYSCTL=y
+CONFIG_BSD_PROCESS_ACCT=y
+# CONFIG_BSD_PROCESS_ACCT_V3 is not set
+
+#
+# RCU Subsystem
+#
+CONFIG_TREE_RCU=y
+# CONFIG_TREE_PREEMPT_RCU is not set
+# CONFIG_RCU_TRACE is not set
+CONFIG_RCU_FANOUT=32
+# CONFIG_RCU_FANOUT_EXACT is not set
+# CONFIG_TREE_RCU_TRACE is not set
+# CONFIG_IKCONFIG is not set
+CONFIG_LOG_BUF_SHIFT=17
+# CONFIG_GROUP_SCHED is not set
+# CONFIG_CGROUPS is not set
+# CONFIG_SYSFS_DEPRECATED_V2 is not set
+# CONFIG_RELAY is not set
+CONFIG_NAMESPACES=y
+# CONFIG_UTS_NS is not set
+# CONFIG_IPC_NS is not set
+# CONFIG_USER_NS is not set
+# CONFIG_PID_NS is not set
+CONFIG_BLK_DEV_INITRD=y
+CONFIG_INITRAMFS_SOURCE=""
+CONFIG_RD_GZIP=y
+CONFIG_RD_BZIP2=y
+CONFIG_RD_LZMA=y
+CONFIG_CC_OPTIMIZE_FOR_SIZE=y
+CONFIG_SYSCTL=y
+CONFIG_ANON_INODES=y
+# CONFIG_EMBEDDED is not set
+CONFIG_UID16=y
+CONFIG_SYSCTL_SYSCALL=y
+CONFIG_KALLSYMS=y
+# CONFIG_KALLSYMS_ALL is not set
+CONFIG_KALLSYMS_EXTRA_PASS=y
+CONFIG_HOTPLUG=y
+CONFIG_PRINTK=y
+CONFIG_BUG=y
+CONFIG_ELF_CORE=y
+CONFIG_BASE_FULL=y
+CONFIG_FUTEX=y
+CONFIG_EPOLL=y
+CONFIG_SIGNALFD=y
+CONFIG_TIMERFD=y
+CONFIG_EVENTFD=y
+CONFIG_SHMEM=y
+CONFIG_AIO=y
+
+#
+# Kernel Performance Events And Counters
+#
+CONFIG_VM_EVENT_COUNTERS=y
+CONFIG_SLUB_DEBUG=y
+CONFIG_COMPAT_BRK=y
+# CONFIG_SLAB is not set
+CONFIG_SLUB=y
+# CONFIG_SLOB is not set
+# CONFIG_PROFILING is not set
+CONFIG_HAVE_OPROFILE=y
+# CONFIG_KPROBES is not set
+CONFIG_HAVE_KPROBES=y
+CONFIG_HAVE_KRETPROBES=y
+CONFIG_HAVE_CLK=y
+
+#
+# GCOV-based kernel profiling
+#
+# CONFIG_GCOV_KERNEL is not set
+# CONFIG_SLOW_WORK is not set
+CONFIG_HAVE_GENERIC_DMA_COHERENT=y
+CONFIG_SLABINFO=y
+CONFIG_RT_MUTEXES=y
+CONFIG_BASE_SMALL=0
+CONFIG_MODULES=y
+# CONFIG_MODULE_FORCE_LOAD is not set
+CONFIG_MODULE_UNLOAD=y
+# CONFIG_MODULE_FORCE_UNLOAD is not set
+CONFIG_MODVERSIONS=y
+# CONFIG_MODULE_SRCVERSION_ALL is not set
+CONFIG_BLOCK=y
+CONFIG_LBDAF=y
+CONFIG_BLK_DEV_BSG=y
+# CONFIG_BLK_DEV_INTEGRITY is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+# CONFIG_DEFAULT_AS is not set
+# CONFIG_DEFAULT_DEADLINE is not set
+CONFIG_DEFAULT_CFQ=y
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="cfq"
+# CONFIG_FREEZER is not set
+
+#
+# System Type
+#
+CONFIG_MMU=y
+# CONFIG_ARCH_AAEC2000 is not set
+# CONFIG_ARCH_INTEGRATOR is not set
+# CONFIG_ARCH_REALVIEW is not set
+# CONFIG_ARCH_VERSATILE is not set
+# CONFIG_ARCH_AT91 is not set
+# CONFIG_ARCH_CLPS711X is not set
+# CONFIG_ARCH_GEMINI is not set
+# CONFIG_ARCH_EBSA110 is not set
+# CONFIG_ARCH_EP93XX is not set
+# CONFIG_ARCH_FOOTBRIDGE is not set
+# CONFIG_ARCH_MXC is not set
+# CONFIG_ARCH_STMP3XXX is not set
+# CONFIG_ARCH_NETX is not set
+# CONFIG_ARCH_H720X is not set
+# CONFIG_ARCH_NOMADIK is not set
+# CONFIG_ARCH_IOP13XX is not set
+# CONFIG_ARCH_IOP32X is not set
+# CONFIG_ARCH_IOP33X is not set
+# CONFIG_ARCH_IXP23XX is not set
+# CONFIG_ARCH_IXP2000 is not set
+# CONFIG_ARCH_IXP4XX is not set
+# CONFIG_ARCH_L7200 is not set
+# CONFIG_ARCH_KIRKWOOD is not set
+# CONFIG_ARCH_LOKI is not set
+# CONFIG_ARCH_MV78XX0 is not set
+# CONFIG_ARCH_ORION5X is not set
+# CONFIG_ARCH_MMP is not set
+# CONFIG_ARCH_KS8695 is not set
+# CONFIG_ARCH_NS9XXX is not set
+# CONFIG_ARCH_W90X900 is not set
+# CONFIG_ARCH_PNX4008 is not set
+# CONFIG_ARCH_PXA is not set
+# CONFIG_ARCH_MSM is not set
+# CONFIG_ARCH_RPC is not set
+# CONFIG_ARCH_SA1100 is not set
+# CONFIG_ARCH_S3C2410 is not set
+# CONFIG_ARCH_S3C64XX is not set
+# CONFIG_ARCH_S5PC1XX is not set
+# CONFIG_ARCH_SHARK is not set
+# CONFIG_ARCH_LH7A40X is not set
+# CONFIG_ARCH_U300 is not set
+# CONFIG_ARCH_DAVINCI is not set
+# CONFIG_ARCH_OMAP is not set
+# CONFIG_ARCH_BCMRING is not set
+CONFIG_PLAT_SPEAR=y
+CONFIG_ARCH_SPEAR3XX=y
+# CONFIG_ARCH_SPEAR6XX is not set
+# CONFIG_MACH_SPEAR300 is not set
+CONFIG_MACH_SPEAR310=y
+# CONFIG_MACH_SPEAR320 is not set
+# CONFIG_BOARD_SPEAR300_EVB is not set
+CONFIG_BOARD_SPEAR310_EVB=y
+
+#
+# Processor Type
+#
+CONFIG_CPU_32=y
+CONFIG_CPU_ARM926T=y
+CONFIG_CPU_32v5=y
+CONFIG_CPU_ABRT_EV5TJ=y
+CONFIG_CPU_PABRT_LEGACY=y
+CONFIG_CPU_CACHE_VIVT=y
+CONFIG_CPU_COPY_V4WB=y
+CONFIG_CPU_TLB_V4WBI=y
+CONFIG_CPU_CP15=y
+CONFIG_CPU_CP15_MMU=y
+
+#
+# Processor Features
+#
+CONFIG_ARM_THUMB=y
+# CONFIG_CPU_ICACHE_DISABLE is not set
+# CONFIG_CPU_DCACHE_DISABLE is not set
+# CONFIG_CPU_DCACHE_WRITETHROUGH is not set
+# CONFIG_CPU_CACHE_ROUND_ROBIN is not set
+CONFIG_ARM_L1_CACHE_SHIFT=5
+CONFIG_ARM_VIC=y
+CONFIG_ARM_VIC_NR=2
+CONFIG_COMMON_CLKDEV=y
+
+#
+# Bus support
+#
+CONFIG_ARM_AMBA=y
+# CONFIG_PCI_SYSCALL is not set
+# CONFIG_ARCH_SUPPORTS_MSI is not set
+# CONFIG_PCCARD is not set
+
+#
+# Kernel Features
+#
+# CONFIG_NO_HZ is not set
+# CONFIG_HIGH_RES_TIMERS is not set
+CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
+CONFIG_VMSPLIT_3G=y
+# CONFIG_VMSPLIT_2G is not set
+# CONFIG_VMSPLIT_1G is not set
+CONFIG_PAGE_OFFSET=0xC0000000
+CONFIG_PREEMPT_NONE=y
+# CONFIG_PREEMPT_VOLUNTARY is not set
+# CONFIG_PREEMPT is not set
+CONFIG_HZ=100
+# CONFIG_AEABI is not set
+# CONFIG_ARCH_SPARSEMEM_DEFAULT is not set
+# CONFIG_ARCH_SELECT_MEMORY_MODEL is not set
+# CONFIG_HIGHMEM is not set
+CONFIG_SELECT_MEMORY_MODEL=y
+CONFIG_FLATMEM_MANUAL=y
+# CONFIG_DISCONTIGMEM_MANUAL is not set
+# CONFIG_SPARSEMEM_MANUAL is not set
+CONFIG_FLATMEM=y
+CONFIG_FLAT_NODE_MEM_MAP=y
+CONFIG_PAGEFLAGS_EXTENDED=y
+CONFIG_SPLIT_PTLOCK_CPUS=4096
+# CONFIG_PHYS_ADDR_T_64BIT is not set
+CONFIG_ZONE_DMA_FLAG=0
+CONFIG_VIRT_TO_BUS=y
+CONFIG_HAVE_MLOCK=y
+CONFIG_HAVE_MLOCKED_PAGE_BIT=y
+# CONFIG_KSM is not set
+CONFIG_DEFAULT_MMAP_MIN_ADDR=4096
+CONFIG_ALIGNMENT_TRAP=y
+# CONFIG_UACCESS_WITH_MEMCPY is not set
+
+#
+# Boot options
+#
+CONFIG_ZBOOT_ROM_TEXT=0
+CONFIG_ZBOOT_ROM_BSS=0
+CONFIG_CMDLINE=""
+# CONFIG_XIP_KERNEL is not set
+# CONFIG_KEXEC is not set
+
+#
+# CPU Power Management
+#
+# CONFIG_CPU_IDLE is not set
+
+#
+# Floating point emulation
+#
+
+#
+# At least one emulation must be selected
+#
+# CONFIG_FPE_NWFPE is not set
+# CONFIG_FPE_FASTFPE is not set
+# CONFIG_VFP is not set
+
+#
+# Userspace binary formats
+#
+CONFIG_BINFMT_ELF=y
+# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
+CONFIG_HAVE_AOUT=y
+# CONFIG_BINFMT_AOUT is not set
+CONFIG_BINFMT_MISC=y
+
+#
+# Power management options
+#
+# CONFIG_PM is not set
+CONFIG_ARCH_SUSPEND_POSSIBLE=y
+# CONFIG_NET is not set
+
+#
+# Device Drivers
+#
+
+#
+# Generic Driver Options
+#
+CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
+# CONFIG_DEVTMPFS is not set
+CONFIG_STANDALONE=y
+CONFIG_PREVENT_FIRMWARE_BUILD=y
+CONFIG_FW_LOADER=y
+CONFIG_FIRMWARE_IN_KERNEL=y
+CONFIG_EXTRA_FIRMWARE=""
+# CONFIG_DEBUG_DRIVER is not set
+# CONFIG_DEBUG_DEVRES is not set
+# CONFIG_SYS_HYPERVISOR is not set
+# CONFIG_MTD is not set
+# CONFIG_PARPORT is not set
+CONFIG_BLK_DEV=y
+# CONFIG_BLK_DEV_COW_COMMON is not set
+# CONFIG_BLK_DEV_LOOP is not set
+CONFIG_BLK_DEV_RAM=y
+CONFIG_BLK_DEV_RAM_COUNT=16
+CONFIG_BLK_DEV_RAM_SIZE=16384
+# CONFIG_BLK_DEV_XIP is not set
+# CONFIG_CDROM_PKTCDVD is not set
+# CONFIG_MG_DISK is not set
+CONFIG_MISC_DEVICES=y
+# CONFIG_ENCLOSURE_SERVICES is not set
+# CONFIG_C2PORT is not set
+
+#
+# EEPROM support
+#
+# CONFIG_EEPROM_93CX6 is not set
+CONFIG_HAVE_IDE=y
+# CONFIG_IDE is not set
+
+#
+# SCSI device support
+#
+# CONFIG_RAID_ATTRS is not set
+# CONFIG_SCSI is not set
+# CONFIG_SCSI_DMA is not set
+# CONFIG_SCSI_NETLINK is not set
+# CONFIG_ATA is not set
+# CONFIG_MD is not set
+# CONFIG_PHONE is not set
+
+#
+# Input device support
+#
+CONFIG_INPUT=y
+CONFIG_INPUT_FF_MEMLESS=y
+# CONFIG_INPUT_POLLDEV is not set
+
+#
+# Userland interfaces
+#
+CONFIG_INPUT_MOUSEDEV=y
+# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
+CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
+# CONFIG_INPUT_JOYDEV is not set
+# CONFIG_INPUT_EVDEV is not set
+# CONFIG_INPUT_EVBUG is not set
+
+#
+# Input Device Drivers
+#
+# CONFIG_INPUT_KEYBOARD is not set
+# CONFIG_INPUT_MOUSE is not set
+# CONFIG_INPUT_JOYSTICK is not set
+# CONFIG_INPUT_TABLET is not set
+# CONFIG_INPUT_TOUCHSCREEN is not set
+# CONFIG_INPUT_MISC is not set
+
+#
+# Hardware I/O ports
+#
+CONFIG_SERIO=y
+CONFIG_SERIO_SERPORT=y
+# CONFIG_SERIO_AMBAKMI is not set
+# CONFIG_SERIO_RAW is not set
+# CONFIG_GAMEPORT is not set
+
+#
+# Character devices
+#
+CONFIG_VT=y
+CONFIG_CONSOLE_TRANSLATIONS=y
+CONFIG_VT_CONSOLE=y
+CONFIG_HW_CONSOLE=y
+# CONFIG_VT_HW_CONSOLE_BINDING is not set
+CONFIG_DEVKMEM=y
+# CONFIG_SERIAL_NONSTANDARD is not set
+
+#
+# Serial drivers
+#
+# CONFIG_SERIAL_8250 is not set
+
+#
+# Non-8250 serial port support
+#
+# CONFIG_SERIAL_AMBA_PL010 is not set
+CONFIG_SERIAL_AMBA_PL011=y
+CONFIG_SERIAL_AMBA_PL011_CONSOLE=y
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+CONFIG_UNIX98_PTYS=y
+# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set
+# CONFIG_LEGACY_PTYS is not set
+# CONFIG_IPMI_HANDLER is not set
+# CONFIG_HW_RANDOM is not set
+# CONFIG_R3964 is not set
+CONFIG_RAW_DRIVER=y
+CONFIG_MAX_RAW_DEVS=8192
+# CONFIG_TCG_TPM is not set
+# CONFIG_I2C is not set
+# CONFIG_SPI is not set
+
+#
+# PPS support
+#
+# CONFIG_PPS is not set
+CONFIG_ARCH_REQUIRE_GPIOLIB=y
+CONFIG_GPIOLIB=y
+# CONFIG_DEBUG_GPIO is not set
+CONFIG_GPIO_SYSFS=y
+
+#
+# Memory mapped GPIO expanders:
+#
+CONFIG_GPIO_PL061=y
+
+#
+# I2C GPIO expanders:
+#
+
+#
+# PCI GPIO expanders:
+#
+
+#
+# SPI GPIO expanders:
+#
+
+#
+# AC97 GPIO expanders:
+#
+# CONFIG_W1 is not set
+# CONFIG_POWER_SUPPLY is not set
+# CONFIG_HWMON is not set
+# CONFIG_THERMAL is not set
+# CONFIG_WATCHDOG is not set
+CONFIG_SSB_POSSIBLE=y
+
+#
+# Sonics Silicon Backplane
+#
+# CONFIG_SSB is not set
+
+#
+# Multifunction device drivers
+#
+# CONFIG_MFD_CORE is not set
+# CONFIG_MFD_SM501 is not set
+# CONFIG_MFD_ASIC3 is not set
+# CONFIG_HTC_EGPIO is not set
+# CONFIG_HTC_PASIC3 is not set
+# CONFIG_MFD_TMIO is not set
+# CONFIG_MFD_T7L66XB is not set
+# CONFIG_MFD_TC6387XB is not set
+# CONFIG_MFD_TC6393XB is not set
+# CONFIG_REGULATOR is not set
+# CONFIG_MEDIA_SUPPORT is not set
+
+#
+# Graphics support
+#
+# CONFIG_VGASTATE is not set
+# CONFIG_VIDEO_OUTPUT_CONTROL is not set
+# CONFIG_FB is not set
+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
+
+#
+# Display device support
+#
+# CONFIG_DISPLAY_SUPPORT is not set
+
+#
+# Console display driver support
+#
+# CONFIG_VGA_CONSOLE is not set
+CONFIG_DUMMY_CONSOLE=y
+# CONFIG_SOUND is not set
+# CONFIG_HID_SUPPORT is not set
+# CONFIG_USB_SUPPORT is not set
+# CONFIG_MMC is not set
+# CONFIG_MEMSTICK is not set
+# CONFIG_NEW_LEDS is not set
+# CONFIG_ACCESSIBILITY is not set
+CONFIG_RTC_LIB=y
+# CONFIG_RTC_CLASS is not set
+# CONFIG_DMADEVICES is not set
+# CONFIG_AUXDISPLAY is not set
+# CONFIG_UIO is not set
+
+#
+# TI VLYNQ
+#
+# CONFIG_STAGING is not set
+
+#
+# File systems
+#
+CONFIG_EXT2_FS=y
+CONFIG_EXT2_FS_XATTR=y
+# CONFIG_EXT2_FS_POSIX_ACL is not set
+CONFIG_EXT2_FS_SECURITY=y
+# CONFIG_EXT2_FS_XIP is not set
+CONFIG_EXT3_FS=y
+# CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set
+CONFIG_EXT3_FS_XATTR=y
+# CONFIG_EXT3_FS_POSIX_ACL is not set
+CONFIG_EXT3_FS_SECURITY=y
+# CONFIG_EXT4_FS is not set
+CONFIG_JBD=y
+# CONFIG_JBD_DEBUG is not set
+CONFIG_FS_MBCACHE=y
+# CONFIG_REISERFS_FS is not set
+# CONFIG_JFS_FS is not set
+# CONFIG_FS_POSIX_ACL is not set
+# CONFIG_XFS_FS is not set
+# CONFIG_GFS2_FS is not set
+# CONFIG_BTRFS_FS is not set
+# CONFIG_NILFS2_FS is not set
+CONFIG_FILE_LOCKING=y
+CONFIG_FSNOTIFY=y
+CONFIG_DNOTIFY=y
+# CONFIG_INOTIFY is not set
+CONFIG_INOTIFY_USER=y
+# CONFIG_QUOTA is not set
+# CONFIG_AUTOFS_FS is not set
+CONFIG_AUTOFS4_FS=m
+# CONFIG_FUSE_FS is not set
+
+#
+# Caches
+#
+# CONFIG_FSCACHE is not set
+
+#
+# CD-ROM/DVD Filesystems
+#
+# CONFIG_ISO9660_FS is not set
+# CONFIG_UDF_FS is not set
+
+#
+# DOS/FAT/NT Filesystems
+#
+CONFIG_FAT_FS=m
+CONFIG_MSDOS_FS=m
+CONFIG_VFAT_FS=m
+CONFIG_FAT_DEFAULT_CODEPAGE=437
+CONFIG_FAT_DEFAULT_IOCHARSET="ascii"
+# CONFIG_NTFS_FS is not set
+
+#
+# Pseudo filesystems
+#
+CONFIG_PROC_FS=y
+CONFIG_PROC_SYSCTL=y
+CONFIG_PROC_PAGE_MONITOR=y
+CONFIG_SYSFS=y
+CONFIG_TMPFS=y
+# CONFIG_TMPFS_POSIX_ACL is not set
+# CONFIG_HUGETLB_PAGE is not set
+# CONFIG_CONFIGFS_FS is not set
+CONFIG_MISC_FILESYSTEMS=y
+# CONFIG_ADFS_FS is not set
+# CONFIG_AFFS_FS is not set
+# CONFIG_HFS_FS is not set
+# CONFIG_HFSPLUS_FS is not set
+# CONFIG_BEFS_FS is not set
+# CONFIG_BFS_FS is not set
+# CONFIG_EFS_FS is not set
+# CONFIG_SQUASHFS is not set
+# CONFIG_VXFS_FS is not set
+# CONFIG_MINIX_FS is not set
+# CONFIG_OMFS_FS is not set
+# CONFIG_HPFS_FS is not set
+# CONFIG_QNX4FS_FS is not set
+# CONFIG_ROMFS_FS is not set
+# CONFIG_SYSV_FS is not set
+# CONFIG_UFS_FS is not set
+
+#
+# Partition Types
+#
+CONFIG_PARTITION_ADVANCED=y
+# CONFIG_ACORN_PARTITION is not set
+# CONFIG_OSF_PARTITION is not set
+# CONFIG_AMIGA_PARTITION is not set
+# CONFIG_ATARI_PARTITION is not set
+# CONFIG_MAC_PARTITION is not set
+CONFIG_MSDOS_PARTITION=y
+# CONFIG_BSD_DISKLABEL is not set
+# CONFIG_MINIX_SUBPARTITION is not set
+# CONFIG_SOLARIS_X86_PARTITION is not set
+# CONFIG_UNIXWARE_DISKLABEL is not set
+# CONFIG_LDM_PARTITION is not set
+# CONFIG_SGI_PARTITION is not set
+# CONFIG_ULTRIX_PARTITION is not set
+# CONFIG_SUN_PARTITION is not set
+# CONFIG_KARMA_PARTITION is not set
+# CONFIG_EFI_PARTITION is not set
+# CONFIG_SYSV68_PARTITION is not set
+CONFIG_NLS=y
+CONFIG_NLS_DEFAULT="utf8"
+CONFIG_NLS_CODEPAGE_437=y
+# CONFIG_NLS_CODEPAGE_737 is not set
+# CONFIG_NLS_CODEPAGE_775 is not set
+# CONFIG_NLS_CODEPAGE_850 is not set
+# CONFIG_NLS_CODEPAGE_852 is not set
+# CONFIG_NLS_CODEPAGE_855 is not set
+# CONFIG_NLS_CODEPAGE_857 is not set
+# CONFIG_NLS_CODEPAGE_860 is not set
+# CONFIG_NLS_CODEPAGE_861 is not set
+# CONFIG_NLS_CODEPAGE_862 is not set
+# CONFIG_NLS_CODEPAGE_863 is not set
+# CONFIG_NLS_CODEPAGE_864 is not set
+# CONFIG_NLS_CODEPAGE_865 is not set
+# CONFIG_NLS_CODEPAGE_866 is not set
+# CONFIG_NLS_CODEPAGE_869 is not set
+# CONFIG_NLS_CODEPAGE_936 is not set
+# CONFIG_NLS_CODEPAGE_950 is not set
+# CONFIG_NLS_CODEPAGE_932 is not set
+# CONFIG_NLS_CODEPAGE_949 is not set
+# CONFIG_NLS_CODEPAGE_874 is not set
+# CONFIG_NLS_ISO8859_8 is not set
+# CONFIG_NLS_CODEPAGE_1250 is not set
+# CONFIG_NLS_CODEPAGE_1251 is not set
+CONFIG_NLS_ASCII=m
+# CONFIG_NLS_ISO8859_1 is not set
+# CONFIG_NLS_ISO8859_2 is not set
+# CONFIG_NLS_ISO8859_3 is not set
+# CONFIG_NLS_ISO8859_4 is not set
+# CONFIG_NLS_ISO8859_5 is not set
+# CONFIG_NLS_ISO8859_6 is not set
+# CONFIG_NLS_ISO8859_7 is not set
+# CONFIG_NLS_ISO8859_9 is not set
+# CONFIG_NLS_ISO8859_13 is not set
+# CONFIG_NLS_ISO8859_14 is not set
+# CONFIG_NLS_ISO8859_15 is not set
+# CONFIG_NLS_KOI8_R is not set
+# CONFIG_NLS_KOI8_U is not set
+# CONFIG_NLS_UTF8 is not set
+
+#
+# Kernel hacking
+#
+# CONFIG_PRINTK_TIME is not set
+CONFIG_ENABLE_WARN_DEPRECATED=y
+CONFIG_ENABLE_MUST_CHECK=y
+CONFIG_FRAME_WARN=1024
+CONFIG_MAGIC_SYSRQ=y
+# CONFIG_STRIP_ASM_SYMS is not set
+# CONFIG_UNUSED_SYMBOLS is not set
+CONFIG_DEBUG_FS=y
+# CONFIG_HEADERS_CHECK is not set
+CONFIG_DEBUG_KERNEL=y
+# CONFIG_DEBUG_SHIRQ is not set
+CONFIG_DETECT_SOFTLOCKUP=y
+# CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set
+CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=0
+CONFIG_DETECT_HUNG_TASK=y
+# CONFIG_BOOTPARAM_HUNG_TASK_PANIC is not set
+CONFIG_BOOTPARAM_HUNG_TASK_PANIC_VALUE=0
+CONFIG_SCHED_DEBUG=y
+# CONFIG_SCHEDSTATS is not set
+# CONFIG_TIMER_STATS is not set
+# CONFIG_DEBUG_OBJECTS is not set
+# CONFIG_SLUB_DEBUG_ON is not set
+# CONFIG_SLUB_STATS is not set
+# CONFIG_DEBUG_KMEMLEAK is not set
+# CONFIG_DEBUG_RT_MUTEXES is not set
+# CONFIG_RT_MUTEX_TESTER is not set
+CONFIG_DEBUG_SPINLOCK=y
+# CONFIG_DEBUG_MUTEXES is not set
+# CONFIG_DEBUG_LOCK_ALLOC is not set
+# CONFIG_PROVE_LOCKING is not set
+# CONFIG_LOCK_STAT is not set
+CONFIG_DEBUG_SPINLOCK_SLEEP=y
+# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
+# CONFIG_DEBUG_KOBJECT is not set
+CONFIG_DEBUG_BUGVERBOSE=y
+CONFIG_DEBUG_INFO=y
+# CONFIG_DEBUG_VM is not set
+# CONFIG_DEBUG_WRITECOUNT is not set
+CONFIG_DEBUG_MEMORY_INIT=y
+# CONFIG_DEBUG_LIST is not set
+# CONFIG_DEBUG_SG is not set
+# CONFIG_DEBUG_NOTIFIERS is not set
+# CONFIG_DEBUG_CREDENTIALS is not set
+CONFIG_FRAME_POINTER=y
+# CONFIG_BOOT_PRINTK_DELAY is not set
+# CONFIG_RCU_TORTURE_TEST is not set
+CONFIG_RCU_CPU_STALL_DETECTOR=y
+# CONFIG_BACKTRACE_SELF_TEST is not set
+# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set
+# CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set
+# CONFIG_FAULT_INJECTION is not set
+# CONFIG_LATENCYTOP is not set
+# CONFIG_SYSCTL_SYSCALL_CHECK is not set
+# CONFIG_PAGE_POISONING is not set
+CONFIG_HAVE_FUNCTION_TRACER=y
+CONFIG_TRACING_SUPPORT=y
+CONFIG_FTRACE=y
+# CONFIG_FUNCTION_TRACER is not set
+# CONFIG_IRQSOFF_TRACER is not set
+# CONFIG_SCHED_TRACER is not set
+# CONFIG_ENABLE_DEFAULT_TRACERS is not set
+# CONFIG_BOOT_TRACER is not set
+CONFIG_BRANCH_PROFILE_NONE=y
+# CONFIG_PROFILE_ANNOTATED_BRANCHES is not set
+# CONFIG_PROFILE_ALL_BRANCHES is not set
+# CONFIG_STACK_TRACER is not set
+# CONFIG_KMEMTRACE is not set
+# CONFIG_WORKQUEUE_TRACER is not set
+# CONFIG_BLK_DEV_IO_TRACE is not set
+# CONFIG_DYNAMIC_DEBUG is not set
+# CONFIG_SAMPLES is not set
+CONFIG_HAVE_ARCH_KGDB=y
+# CONFIG_KGDB is not set
+# CONFIG_DEBUG_USER is not set
+# CONFIG_DEBUG_ERRORS is not set
+# CONFIG_DEBUG_STACK_USAGE is not set
+# CONFIG_DEBUG_LL is not set
+
+#
+# Security options
+#
+# CONFIG_KEYS is not set
+# CONFIG_SECURITY is not set
+# CONFIG_SECURITYFS is not set
+# CONFIG_SECURITY_FILE_CAPABILITIES is not set
+# CONFIG_CRYPTO is not set
+# CONFIG_BINARY_PRINTF is not set
+
+#
+# Library routines
+#
+CONFIG_GENERIC_FIND_LAST_BIT=y
+# CONFIG_CRC_CCITT is not set
+# CONFIG_CRC16 is not set
+# CONFIG_CRC_T10DIF is not set
+# CONFIG_CRC_ITU_T is not set
+# CONFIG_CRC32 is not set
+# CONFIG_CRC7 is not set
+# CONFIG_LIBCRC32C is not set
+CONFIG_ZLIB_INFLATE=y
+CONFIG_DECOMPRESS_GZIP=y
+CONFIG_DECOMPRESS_BZIP2=y
+CONFIG_DECOMPRESS_LZMA=y
+CONFIG_HAS_IOMEM=y
+CONFIG_HAS_IOPORT=y
+CONFIG_HAS_DMA=y
diff --git a/arch/arm/configs/spear320_defconfig b/arch/arm/configs/spear320_defconfig
new file mode 100644 (file)
index 0000000..2ae3c11
--- /dev/null
@@ -0,0 +1,775 @@
+#
+# Automatically generated make config: don't edit
+# Linux kernel version: 2.6.32
+# Tue Mar 23 14:37:12 2010
+#
+CONFIG_ARM=y
+CONFIG_SYS_SUPPORTS_APM_EMULATION=y
+CONFIG_GENERIC_GPIO=y
+CONFIG_GENERIC_TIME=y
+CONFIG_GENERIC_CLOCKEVENTS=y
+CONFIG_GENERIC_HARDIRQS=y
+CONFIG_STACKTRACE_SUPPORT=y
+CONFIG_HAVE_LATENCYTOP_SUPPORT=y
+CONFIG_LOCKDEP_SUPPORT=y
+CONFIG_TRACE_IRQFLAGS_SUPPORT=y
+CONFIG_HARDIRQS_SW_RESEND=y
+CONFIG_GENERIC_IRQ_PROBE=y
+CONFIG_RWSEM_GENERIC_SPINLOCK=y
+CONFIG_GENERIC_HWEIGHT=y
+CONFIG_GENERIC_CALIBRATE_DELAY=y
+CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y
+CONFIG_VECTORS_BASE=0xffff0000
+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
+CONFIG_CONSTRUCTORS=y
+
+#
+# General setup
+#
+CONFIG_EXPERIMENTAL=y
+CONFIG_BROKEN_ON_SMP=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
+CONFIG_LOCALVERSION=""
+CONFIG_LOCALVERSION_AUTO=y
+CONFIG_SWAP=y
+CONFIG_SYSVIPC=y
+CONFIG_SYSVIPC_SYSCTL=y
+CONFIG_BSD_PROCESS_ACCT=y
+# CONFIG_BSD_PROCESS_ACCT_V3 is not set
+
+#
+# RCU Subsystem
+#
+CONFIG_TREE_RCU=y
+# CONFIG_TREE_PREEMPT_RCU is not set
+# CONFIG_RCU_TRACE is not set
+CONFIG_RCU_FANOUT=32
+# CONFIG_RCU_FANOUT_EXACT is not set
+# CONFIG_TREE_RCU_TRACE is not set
+# CONFIG_IKCONFIG is not set
+CONFIG_LOG_BUF_SHIFT=17
+# CONFIG_GROUP_SCHED is not set
+# CONFIG_CGROUPS is not set
+# CONFIG_SYSFS_DEPRECATED_V2 is not set
+# CONFIG_RELAY is not set
+CONFIG_NAMESPACES=y
+# CONFIG_UTS_NS is not set
+# CONFIG_IPC_NS is not set
+# CONFIG_USER_NS is not set
+# CONFIG_PID_NS is not set
+CONFIG_BLK_DEV_INITRD=y
+CONFIG_INITRAMFS_SOURCE=""
+CONFIG_RD_GZIP=y
+CONFIG_RD_BZIP2=y
+CONFIG_RD_LZMA=y
+CONFIG_CC_OPTIMIZE_FOR_SIZE=y
+CONFIG_SYSCTL=y
+CONFIG_ANON_INODES=y
+# CONFIG_EMBEDDED is not set
+CONFIG_UID16=y
+CONFIG_SYSCTL_SYSCALL=y
+CONFIG_KALLSYMS=y
+# CONFIG_KALLSYMS_ALL is not set
+CONFIG_KALLSYMS_EXTRA_PASS=y
+CONFIG_HOTPLUG=y
+CONFIG_PRINTK=y
+CONFIG_BUG=y
+CONFIG_ELF_CORE=y
+CONFIG_BASE_FULL=y
+CONFIG_FUTEX=y
+CONFIG_EPOLL=y
+CONFIG_SIGNALFD=y
+CONFIG_TIMERFD=y
+CONFIG_EVENTFD=y
+CONFIG_SHMEM=y
+CONFIG_AIO=y
+
+#
+# Kernel Performance Events And Counters
+#
+CONFIG_VM_EVENT_COUNTERS=y
+CONFIG_SLUB_DEBUG=y
+CONFIG_COMPAT_BRK=y
+# CONFIG_SLAB is not set
+CONFIG_SLUB=y
+# CONFIG_SLOB is not set
+# CONFIG_PROFILING is not set
+CONFIG_HAVE_OPROFILE=y
+# CONFIG_KPROBES is not set
+CONFIG_HAVE_KPROBES=y
+CONFIG_HAVE_KRETPROBES=y
+CONFIG_HAVE_CLK=y
+
+#
+# GCOV-based kernel profiling
+#
+# CONFIG_GCOV_KERNEL is not set
+# CONFIG_SLOW_WORK is not set
+CONFIG_HAVE_GENERIC_DMA_COHERENT=y
+CONFIG_SLABINFO=y
+CONFIG_RT_MUTEXES=y
+CONFIG_BASE_SMALL=0
+CONFIG_MODULES=y
+# CONFIG_MODULE_FORCE_LOAD is not set
+CONFIG_MODULE_UNLOAD=y
+# CONFIG_MODULE_FORCE_UNLOAD is not set
+CONFIG_MODVERSIONS=y
+# CONFIG_MODULE_SRCVERSION_ALL is not set
+CONFIG_BLOCK=y
+CONFIG_LBDAF=y
+CONFIG_BLK_DEV_BSG=y
+# CONFIG_BLK_DEV_INTEGRITY is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+# CONFIG_DEFAULT_AS is not set
+# CONFIG_DEFAULT_DEADLINE is not set
+CONFIG_DEFAULT_CFQ=y
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="cfq"
+# CONFIG_FREEZER is not set
+
+#
+# System Type
+#
+CONFIG_MMU=y
+# CONFIG_ARCH_AAEC2000 is not set
+# CONFIG_ARCH_INTEGRATOR is not set
+# CONFIG_ARCH_REALVIEW is not set
+# CONFIG_ARCH_VERSATILE is not set
+# CONFIG_ARCH_AT91 is not set
+# CONFIG_ARCH_CLPS711X is not set
+# CONFIG_ARCH_GEMINI is not set
+# CONFIG_ARCH_EBSA110 is not set
+# CONFIG_ARCH_EP93XX is not set
+# CONFIG_ARCH_FOOTBRIDGE is not set
+# CONFIG_ARCH_MXC is not set
+# CONFIG_ARCH_STMP3XXX is not set
+# CONFIG_ARCH_NETX is not set
+# CONFIG_ARCH_H720X is not set
+# CONFIG_ARCH_NOMADIK is not set
+# CONFIG_ARCH_IOP13XX is not set
+# CONFIG_ARCH_IOP32X is not set
+# CONFIG_ARCH_IOP33X is not set
+# CONFIG_ARCH_IXP23XX is not set
+# CONFIG_ARCH_IXP2000 is not set
+# CONFIG_ARCH_IXP4XX is not set
+# CONFIG_ARCH_L7200 is not set
+# CONFIG_ARCH_KIRKWOOD is not set
+# CONFIG_ARCH_LOKI is not set
+# CONFIG_ARCH_MV78XX0 is not set
+# CONFIG_ARCH_ORION5X is not set
+# CONFIG_ARCH_MMP is not set
+# CONFIG_ARCH_KS8695 is not set
+# CONFIG_ARCH_NS9XXX is not set
+# CONFIG_ARCH_W90X900 is not set
+# CONFIG_ARCH_PNX4008 is not set
+# CONFIG_ARCH_PXA is not set
+# CONFIG_ARCH_MSM is not set
+# CONFIG_ARCH_RPC is not set
+# CONFIG_ARCH_SA1100 is not set
+# CONFIG_ARCH_S3C2410 is not set
+# CONFIG_ARCH_S3C64XX is not set
+# CONFIG_ARCH_S5PC1XX is not set
+# CONFIG_ARCH_SHARK is not set
+# CONFIG_ARCH_LH7A40X is not set
+# CONFIG_ARCH_U300 is not set
+# CONFIG_ARCH_DAVINCI is not set
+# CONFIG_ARCH_OMAP is not set
+# CONFIG_ARCH_BCMRING is not set
+CONFIG_PLAT_SPEAR=y
+CONFIG_ARCH_SPEAR3XX=y
+# CONFIG_ARCH_SPEAR6XX is not set
+# CONFIG_MACH_SPEAR300 is not set
+# CONFIG_MACH_SPEAR310 is not set
+CONFIG_MACH_SPEAR320=y
+# CONFIG_BOARD_SPEAR300_EVB is not set
+CONFIG_BOARD_SPEAR320_EVB=y
+
+#
+# Processor Type
+#
+CONFIG_CPU_32=y
+CONFIG_CPU_ARM926T=y
+CONFIG_CPU_32v5=y
+CONFIG_CPU_ABRT_EV5TJ=y
+CONFIG_CPU_PABRT_LEGACY=y
+CONFIG_CPU_CACHE_VIVT=y
+CONFIG_CPU_COPY_V4WB=y
+CONFIG_CPU_TLB_V4WBI=y
+CONFIG_CPU_CP15=y
+CONFIG_CPU_CP15_MMU=y
+
+#
+# Processor Features
+#
+CONFIG_ARM_THUMB=y
+# CONFIG_CPU_ICACHE_DISABLE is not set
+# CONFIG_CPU_DCACHE_DISABLE is not set
+# CONFIG_CPU_DCACHE_WRITETHROUGH is not set
+# CONFIG_CPU_CACHE_ROUND_ROBIN is not set
+CONFIG_ARM_L1_CACHE_SHIFT=5
+CONFIG_ARM_VIC=y
+CONFIG_ARM_VIC_NR=2
+CONFIG_COMMON_CLKDEV=y
+
+#
+# Bus support
+#
+CONFIG_ARM_AMBA=y
+# CONFIG_PCI_SYSCALL is not set
+# CONFIG_ARCH_SUPPORTS_MSI is not set
+# CONFIG_PCCARD is not set
+
+#
+# Kernel Features
+#
+# CONFIG_NO_HZ is not set
+# CONFIG_HIGH_RES_TIMERS is not set
+CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
+CONFIG_VMSPLIT_3G=y
+# CONFIG_VMSPLIT_2G is not set
+# CONFIG_VMSPLIT_1G is not set
+CONFIG_PAGE_OFFSET=0xC0000000
+CONFIG_PREEMPT_NONE=y
+# CONFIG_PREEMPT_VOLUNTARY is not set
+# CONFIG_PREEMPT is not set
+CONFIG_HZ=100
+# CONFIG_AEABI is not set
+# CONFIG_ARCH_SPARSEMEM_DEFAULT is not set
+# CONFIG_ARCH_SELECT_MEMORY_MODEL is not set
+# CONFIG_HIGHMEM is not set
+CONFIG_SELECT_MEMORY_MODEL=y
+CONFIG_FLATMEM_MANUAL=y
+# CONFIG_DISCONTIGMEM_MANUAL is not set
+# CONFIG_SPARSEMEM_MANUAL is not set
+CONFIG_FLATMEM=y
+CONFIG_FLAT_NODE_MEM_MAP=y
+CONFIG_PAGEFLAGS_EXTENDED=y
+CONFIG_SPLIT_PTLOCK_CPUS=4096
+# CONFIG_PHYS_ADDR_T_64BIT is not set
+CONFIG_ZONE_DMA_FLAG=0
+CONFIG_VIRT_TO_BUS=y
+CONFIG_HAVE_MLOCK=y
+CONFIG_HAVE_MLOCKED_PAGE_BIT=y
+# CONFIG_KSM is not set
+CONFIG_DEFAULT_MMAP_MIN_ADDR=4096
+CONFIG_ALIGNMENT_TRAP=y
+# CONFIG_UACCESS_WITH_MEMCPY is not set
+
+#
+# Boot options
+#
+CONFIG_ZBOOT_ROM_TEXT=0
+CONFIG_ZBOOT_ROM_BSS=0
+CONFIG_CMDLINE=""
+# CONFIG_XIP_KERNEL is not set
+# CONFIG_KEXEC is not set
+
+#
+# CPU Power Management
+#
+# CONFIG_CPU_IDLE is not set
+
+#
+# Floating point emulation
+#
+
+#
+# At least one emulation must be selected
+#
+# CONFIG_FPE_NWFPE is not set
+# CONFIG_FPE_FASTFPE is not set
+# CONFIG_VFP is not set
+
+#
+# Userspace binary formats
+#
+CONFIG_BINFMT_ELF=y
+# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
+CONFIG_HAVE_AOUT=y
+# CONFIG_BINFMT_AOUT is not set
+CONFIG_BINFMT_MISC=y
+
+#
+# Power management options
+#
+# CONFIG_PM is not set
+CONFIG_ARCH_SUSPEND_POSSIBLE=y
+# CONFIG_NET is not set
+
+#
+# Device Drivers
+#
+
+#
+# Generic Driver Options
+#
+CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
+# CONFIG_DEVTMPFS is not set
+CONFIG_STANDALONE=y
+CONFIG_PREVENT_FIRMWARE_BUILD=y
+CONFIG_FW_LOADER=y
+CONFIG_FIRMWARE_IN_KERNEL=y
+CONFIG_EXTRA_FIRMWARE=""
+# CONFIG_DEBUG_DRIVER is not set
+# CONFIG_DEBUG_DEVRES is not set
+# CONFIG_SYS_HYPERVISOR is not set
+# CONFIG_MTD is not set
+# CONFIG_PARPORT is not set
+CONFIG_BLK_DEV=y
+# CONFIG_BLK_DEV_COW_COMMON is not set
+# CONFIG_BLK_DEV_LOOP is not set
+CONFIG_BLK_DEV_RAM=y
+CONFIG_BLK_DEV_RAM_COUNT=16
+CONFIG_BLK_DEV_RAM_SIZE=16384
+# CONFIG_BLK_DEV_XIP is not set
+# CONFIG_CDROM_PKTCDVD is not set
+# CONFIG_MG_DISK is not set
+CONFIG_MISC_DEVICES=y
+# CONFIG_ENCLOSURE_SERVICES is not set
+# CONFIG_C2PORT is not set
+
+#
+# EEPROM support
+#
+# CONFIG_EEPROM_93CX6 is not set
+CONFIG_HAVE_IDE=y
+# CONFIG_IDE is not set
+
+#
+# SCSI device support
+#
+# CONFIG_RAID_ATTRS is not set
+# CONFIG_SCSI is not set
+# CONFIG_SCSI_DMA is not set
+# CONFIG_SCSI_NETLINK is not set
+# CONFIG_ATA is not set
+# CONFIG_MD is not set
+# CONFIG_PHONE is not set
+
+#
+# Input device support
+#
+CONFIG_INPUT=y
+CONFIG_INPUT_FF_MEMLESS=y
+# CONFIG_INPUT_POLLDEV is not set
+
+#
+# Userland interfaces
+#
+CONFIG_INPUT_MOUSEDEV=y
+# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
+CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
+# CONFIG_INPUT_JOYDEV is not set
+# CONFIG_INPUT_EVDEV is not set
+# CONFIG_INPUT_EVBUG is not set
+
+#
+# Input Device Drivers
+#
+# CONFIG_INPUT_KEYBOARD is not set
+# CONFIG_INPUT_MOUSE is not set
+# CONFIG_INPUT_JOYSTICK is not set
+# CONFIG_INPUT_TABLET is not set
+# CONFIG_INPUT_TOUCHSCREEN is not set
+# CONFIG_INPUT_MISC is not set
+
+#
+# Hardware I/O ports
+#
+CONFIG_SERIO=y
+CONFIG_SERIO_SERPORT=y
+# CONFIG_SERIO_AMBAKMI is not set
+# CONFIG_SERIO_RAW is not set
+# CONFIG_GAMEPORT is not set
+
+#
+# Character devices
+#
+CONFIG_VT=y
+CONFIG_CONSOLE_TRANSLATIONS=y
+CONFIG_VT_CONSOLE=y
+CONFIG_HW_CONSOLE=y
+# CONFIG_VT_HW_CONSOLE_BINDING is not set
+CONFIG_DEVKMEM=y
+# CONFIG_SERIAL_NONSTANDARD is not set
+
+#
+# Serial drivers
+#
+# CONFIG_SERIAL_8250 is not set
+
+#
+# Non-8250 serial port support
+#
+# CONFIG_SERIAL_AMBA_PL010 is not set
+CONFIG_SERIAL_AMBA_PL011=y
+CONFIG_SERIAL_AMBA_PL011_CONSOLE=y
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+CONFIG_UNIX98_PTYS=y
+# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set
+# CONFIG_LEGACY_PTYS is not set
+# CONFIG_IPMI_HANDLER is not set
+# CONFIG_HW_RANDOM is not set
+# CONFIG_R3964 is not set
+CONFIG_RAW_DRIVER=y
+CONFIG_MAX_RAW_DEVS=8192
+# CONFIG_TCG_TPM is not set
+# CONFIG_I2C is not set
+# CONFIG_SPI is not set
+
+#
+# PPS support
+#
+# CONFIG_PPS is not set
+CONFIG_ARCH_REQUIRE_GPIOLIB=y
+CONFIG_GPIOLIB=y
+# CONFIG_DEBUG_GPIO is not set
+CONFIG_GPIO_SYSFS=y
+
+#
+# Memory mapped GPIO expanders:
+#
+CONFIG_GPIO_PL061=y
+
+#
+# I2C GPIO expanders:
+#
+
+#
+# PCI GPIO expanders:
+#
+
+#
+# SPI GPIO expanders:
+#
+
+#
+# AC97 GPIO expanders:
+#
+# CONFIG_W1 is not set
+# CONFIG_POWER_SUPPLY is not set
+# CONFIG_HWMON is not set
+# CONFIG_THERMAL is not set
+# CONFIG_WATCHDOG is not set
+CONFIG_SSB_POSSIBLE=y
+
+#
+# Sonics Silicon Backplane
+#
+# CONFIG_SSB is not set
+
+#
+# Multifunction device drivers
+#
+# CONFIG_MFD_CORE is not set
+# CONFIG_MFD_SM501 is not set
+# CONFIG_MFD_ASIC3 is not set
+# CONFIG_HTC_EGPIO is not set
+# CONFIG_HTC_PASIC3 is not set
+# CONFIG_MFD_TMIO is not set
+# CONFIG_MFD_T7L66XB is not set
+# CONFIG_MFD_TC6387XB is not set
+# CONFIG_MFD_TC6393XB is not set
+# CONFIG_REGULATOR is not set
+# CONFIG_MEDIA_SUPPORT is not set
+
+#
+# Graphics support
+#
+# CONFIG_VGASTATE is not set
+# CONFIG_VIDEO_OUTPUT_CONTROL is not set
+# CONFIG_FB is not set
+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
+
+#
+# Display device support
+#
+# CONFIG_DISPLAY_SUPPORT is not set
+
+#
+# Console display driver support
+#
+# CONFIG_VGA_CONSOLE is not set
+CONFIG_DUMMY_CONSOLE=y
+# CONFIG_SOUND is not set
+# CONFIG_HID_SUPPORT is not set
+# CONFIG_USB_SUPPORT is not set
+# CONFIG_MMC is not set
+# CONFIG_MEMSTICK is not set
+# CONFIG_NEW_LEDS is not set
+# CONFIG_ACCESSIBILITY is not set
+CONFIG_RTC_LIB=y
+# CONFIG_RTC_CLASS is not set
+# CONFIG_DMADEVICES is not set
+# CONFIG_AUXDISPLAY is not set
+# CONFIG_UIO is not set
+
+#
+# TI VLYNQ
+#
+# CONFIG_STAGING is not set
+
+#
+# File systems
+#
+CONFIG_EXT2_FS=y
+CONFIG_EXT2_FS_XATTR=y
+# CONFIG_EXT2_FS_POSIX_ACL is not set
+CONFIG_EXT2_FS_SECURITY=y
+# CONFIG_EXT2_FS_XIP is not set
+CONFIG_EXT3_FS=y
+# CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set
+CONFIG_EXT3_FS_XATTR=y
+# CONFIG_EXT3_FS_POSIX_ACL is not set
+CONFIG_EXT3_FS_SECURITY=y
+# CONFIG_EXT4_FS is not set
+CONFIG_JBD=y
+# CONFIG_JBD_DEBUG is not set
+CONFIG_FS_MBCACHE=y
+# CONFIG_REISERFS_FS is not set
+# CONFIG_JFS_FS is not set
+# CONFIG_FS_POSIX_ACL is not set
+# CONFIG_XFS_FS is not set
+# CONFIG_GFS2_FS is not set
+# CONFIG_BTRFS_FS is not set
+# CONFIG_NILFS2_FS is not set
+CONFIG_FILE_LOCKING=y
+CONFIG_FSNOTIFY=y
+CONFIG_DNOTIFY=y
+# CONFIG_INOTIFY is not set
+CONFIG_INOTIFY_USER=y
+# CONFIG_QUOTA is not set
+# CONFIG_AUTOFS_FS is not set
+CONFIG_AUTOFS4_FS=m
+# CONFIG_FUSE_FS is not set
+
+#
+# Caches
+#
+# CONFIG_FSCACHE is not set
+
+#
+# CD-ROM/DVD Filesystems
+#
+# CONFIG_ISO9660_FS is not set
+# CONFIG_UDF_FS is not set
+
+#
+# DOS/FAT/NT Filesystems
+#
+CONFIG_FAT_FS=m
+CONFIG_MSDOS_FS=m
+CONFIG_VFAT_FS=m
+CONFIG_FAT_DEFAULT_CODEPAGE=437
+CONFIG_FAT_DEFAULT_IOCHARSET="ascii"
+# CONFIG_NTFS_FS is not set
+
+#
+# Pseudo filesystems
+#
+CONFIG_PROC_FS=y
+CONFIG_PROC_SYSCTL=y
+CONFIG_PROC_PAGE_MONITOR=y
+CONFIG_SYSFS=y
+CONFIG_TMPFS=y
+# CONFIG_TMPFS_POSIX_ACL is not set
+# CONFIG_HUGETLB_PAGE is not set
+# CONFIG_CONFIGFS_FS is not set
+CONFIG_MISC_FILESYSTEMS=y
+# CONFIG_ADFS_FS is not set
+# CONFIG_AFFS_FS is not set
+# CONFIG_HFS_FS is not set
+# CONFIG_HFSPLUS_FS is not set
+# CONFIG_BEFS_FS is not set
+# CONFIG_BFS_FS is not set
+# CONFIG_EFS_FS is not set
+# CONFIG_SQUASHFS is not set
+# CONFIG_VXFS_FS is not set
+# CONFIG_MINIX_FS is not set
+# CONFIG_OMFS_FS is not set
+# CONFIG_HPFS_FS is not set
+# CONFIG_QNX4FS_FS is not set
+# CONFIG_ROMFS_FS is not set
+# CONFIG_SYSV_FS is not set
+# CONFIG_UFS_FS is not set
+
+#
+# Partition Types
+#
+CONFIG_PARTITION_ADVANCED=y
+# CONFIG_ACORN_PARTITION is not set
+# CONFIG_OSF_PARTITION is not set
+# CONFIG_AMIGA_PARTITION is not set
+# CONFIG_ATARI_PARTITION is not set
+# CONFIG_MAC_PARTITION is not set
+CONFIG_MSDOS_PARTITION=y
+# CONFIG_BSD_DISKLABEL is not set
+# CONFIG_MINIX_SUBPARTITION is not set
+# CONFIG_SOLARIS_X86_PARTITION is not set
+# CONFIG_UNIXWARE_DISKLABEL is not set
+# CONFIG_LDM_PARTITION is not set
+# CONFIG_SGI_PARTITION is not set
+# CONFIG_ULTRIX_PARTITION is not set
+# CONFIG_SUN_PARTITION is not set
+# CONFIG_KARMA_PARTITION is not set
+# CONFIG_EFI_PARTITION is not set
+# CONFIG_SYSV68_PARTITION is not set
+CONFIG_NLS=y
+CONFIG_NLS_DEFAULT="utf8"
+CONFIG_NLS_CODEPAGE_437=y
+# CONFIG_NLS_CODEPAGE_737 is not set
+# CONFIG_NLS_CODEPAGE_775 is not set
+# CONFIG_NLS_CODEPAGE_850 is not set
+# CONFIG_NLS_CODEPAGE_852 is not set
+# CONFIG_NLS_CODEPAGE_855 is not set
+# CONFIG_NLS_CODEPAGE_857 is not set
+# CONFIG_NLS_CODEPAGE_860 is not set
+# CONFIG_NLS_CODEPAGE_861 is not set
+# CONFIG_NLS_CODEPAGE_862 is not set
+# CONFIG_NLS_CODEPAGE_863 is not set
+# CONFIG_NLS_CODEPAGE_864 is not set
+# CONFIG_NLS_CODEPAGE_865 is not set
+# CONFIG_NLS_CODEPAGE_866 is not set
+# CONFIG_NLS_CODEPAGE_869 is not set
+# CONFIG_NLS_CODEPAGE_936 is not set
+# CONFIG_NLS_CODEPAGE_950 is not set
+# CONFIG_NLS_CODEPAGE_932 is not set
+# CONFIG_NLS_CODEPAGE_949 is not set
+# CONFIG_NLS_CODEPAGE_874 is not set
+# CONFIG_NLS_ISO8859_8 is not set
+# CONFIG_NLS_CODEPAGE_1250 is not set
+# CONFIG_NLS_CODEPAGE_1251 is not set
+CONFIG_NLS_ASCII=m
+# CONFIG_NLS_ISO8859_1 is not set
+# CONFIG_NLS_ISO8859_2 is not set
+# CONFIG_NLS_ISO8859_3 is not set
+# CONFIG_NLS_ISO8859_4 is not set
+# CONFIG_NLS_ISO8859_5 is not set
+# CONFIG_NLS_ISO8859_6 is not set
+# CONFIG_NLS_ISO8859_7 is not set
+# CONFIG_NLS_ISO8859_9 is not set
+# CONFIG_NLS_ISO8859_13 is not set
+# CONFIG_NLS_ISO8859_14 is not set
+# CONFIG_NLS_ISO8859_15 is not set
+# CONFIG_NLS_KOI8_R is not set
+# CONFIG_NLS_KOI8_U is not set
+# CONFIG_NLS_UTF8 is not set
+
+#
+# Kernel hacking
+#
+# CONFIG_PRINTK_TIME is not set
+CONFIG_ENABLE_WARN_DEPRECATED=y
+CONFIG_ENABLE_MUST_CHECK=y
+CONFIG_FRAME_WARN=1024
+CONFIG_MAGIC_SYSRQ=y
+# CONFIG_STRIP_ASM_SYMS is not set
+# CONFIG_UNUSED_SYMBOLS is not set
+CONFIG_DEBUG_FS=y
+# CONFIG_HEADERS_CHECK is not set
+CONFIG_DEBUG_KERNEL=y
+# CONFIG_DEBUG_SHIRQ is not set
+CONFIG_DETECT_SOFTLOCKUP=y
+# CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set
+CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=0
+CONFIG_DETECT_HUNG_TASK=y
+# CONFIG_BOOTPARAM_HUNG_TASK_PANIC is not set
+CONFIG_BOOTPARAM_HUNG_TASK_PANIC_VALUE=0
+CONFIG_SCHED_DEBUG=y
+# CONFIG_SCHEDSTATS is not set
+# CONFIG_TIMER_STATS is not set
+# CONFIG_DEBUG_OBJECTS is not set
+# CONFIG_SLUB_DEBUG_ON is not set
+# CONFIG_SLUB_STATS is not set
+# CONFIG_DEBUG_KMEMLEAK is not set
+# CONFIG_DEBUG_RT_MUTEXES is not set
+# CONFIG_RT_MUTEX_TESTER is not set
+CONFIG_DEBUG_SPINLOCK=y
+# CONFIG_DEBUG_MUTEXES is not set
+# CONFIG_DEBUG_LOCK_ALLOC is not set
+# CONFIG_PROVE_LOCKING is not set
+# CONFIG_LOCK_STAT is not set
+CONFIG_DEBUG_SPINLOCK_SLEEP=y
+# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
+# CONFIG_DEBUG_KOBJECT is not set
+CONFIG_DEBUG_BUGVERBOSE=y
+CONFIG_DEBUG_INFO=y
+# CONFIG_DEBUG_VM is not set
+# CONFIG_DEBUG_WRITECOUNT is not set
+CONFIG_DEBUG_MEMORY_INIT=y
+# CONFIG_DEBUG_LIST is not set
+# CONFIG_DEBUG_SG is not set
+# CONFIG_DEBUG_NOTIFIERS is not set
+# CONFIG_DEBUG_CREDENTIALS is not set
+CONFIG_FRAME_POINTER=y
+# CONFIG_BOOT_PRINTK_DELAY is not set
+# CONFIG_RCU_TORTURE_TEST is not set
+CONFIG_RCU_CPU_STALL_DETECTOR=y
+# CONFIG_BACKTRACE_SELF_TEST is not set
+# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set
+# CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set
+# CONFIG_FAULT_INJECTION is not set
+# CONFIG_LATENCYTOP is not set
+# CONFIG_SYSCTL_SYSCALL_CHECK is not set
+# CONFIG_PAGE_POISONING is not set
+CONFIG_HAVE_FUNCTION_TRACER=y
+CONFIG_TRACING_SUPPORT=y
+CONFIG_FTRACE=y
+# CONFIG_FUNCTION_TRACER is not set
+# CONFIG_IRQSOFF_TRACER is not set
+# CONFIG_SCHED_TRACER is not set
+# CONFIG_ENABLE_DEFAULT_TRACERS is not set
+# CONFIG_BOOT_TRACER is not set
+CONFIG_BRANCH_PROFILE_NONE=y
+# CONFIG_PROFILE_ANNOTATED_BRANCHES is not set
+# CONFIG_PROFILE_ALL_BRANCHES is not set
+# CONFIG_STACK_TRACER is not set
+# CONFIG_KMEMTRACE is not set
+# CONFIG_WORKQUEUE_TRACER is not set
+# CONFIG_BLK_DEV_IO_TRACE is not set
+# CONFIG_DYNAMIC_DEBUG is not set
+# CONFIG_SAMPLES is not set
+CONFIG_HAVE_ARCH_KGDB=y
+# CONFIG_KGDB is not set
+# CONFIG_DEBUG_USER is not set
+# CONFIG_DEBUG_ERRORS is not set
+# CONFIG_DEBUG_STACK_USAGE is not set
+# CONFIG_DEBUG_LL is not set
+
+#
+# Security options
+#
+# CONFIG_KEYS is not set
+# CONFIG_SECURITY is not set
+# CONFIG_SECURITYFS is not set
+# CONFIG_SECURITY_FILE_CAPABILITIES is not set
+# CONFIG_CRYPTO is not set
+# CONFIG_BINARY_PRINTF is not set
+
+#
+# Library routines
+#
+CONFIG_GENERIC_FIND_LAST_BIT=y
+# CONFIG_CRC_CCITT is not set
+# CONFIG_CRC16 is not set
+# CONFIG_CRC_T10DIF is not set
+# CONFIG_CRC_ITU_T is not set
+# CONFIG_CRC32 is not set
+# CONFIG_CRC7 is not set
+# CONFIG_LIBCRC32C is not set
+CONFIG_ZLIB_INFLATE=y
+CONFIG_DECOMPRESS_GZIP=y
+CONFIG_DECOMPRESS_BZIP2=y
+CONFIG_DECOMPRESS_LZMA=y
+CONFIG_HAS_IOMEM=y
+CONFIG_HAS_IOPORT=y
+CONFIG_HAS_DMA=y
diff --git a/arch/arm/configs/spear600_defconfig b/arch/arm/configs/spear600_defconfig
new file mode 100644 (file)
index 0000000..c85a029
--- /dev/null
@@ -0,0 +1,760 @@
+#
+# Automatically generated make config: don't edit
+# Linux kernel version: 2.6.32
+# Tue Mar 23 14:37:26 2010
+#
+CONFIG_ARM=y
+CONFIG_SYS_SUPPORTS_APM_EMULATION=y
+CONFIG_GENERIC_GPIO=y
+CONFIG_GENERIC_TIME=y
+CONFIG_GENERIC_CLOCKEVENTS=y
+CONFIG_GENERIC_HARDIRQS=y
+CONFIG_STACKTRACE_SUPPORT=y
+CONFIG_HAVE_LATENCYTOP_SUPPORT=y
+CONFIG_LOCKDEP_SUPPORT=y
+CONFIG_TRACE_IRQFLAGS_SUPPORT=y
+CONFIG_HARDIRQS_SW_RESEND=y
+CONFIG_GENERIC_IRQ_PROBE=y
+CONFIG_RWSEM_GENERIC_SPINLOCK=y
+CONFIG_GENERIC_HWEIGHT=y
+CONFIG_GENERIC_CALIBRATE_DELAY=y
+CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y
+CONFIG_VECTORS_BASE=0xffff0000
+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
+CONFIG_CONSTRUCTORS=y
+
+#
+# General setup
+#
+CONFIG_EXPERIMENTAL=y
+CONFIG_BROKEN_ON_SMP=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
+CONFIG_LOCALVERSION=""
+CONFIG_LOCALVERSION_AUTO=y
+CONFIG_SWAP=y
+CONFIG_SYSVIPC=y
+CONFIG_SYSVIPC_SYSCTL=y
+CONFIG_BSD_PROCESS_ACCT=y
+# CONFIG_BSD_PROCESS_ACCT_V3 is not set
+
+#
+# RCU Subsystem
+#
+CONFIG_TREE_RCU=y
+# CONFIG_TREE_PREEMPT_RCU is not set
+# CONFIG_RCU_TRACE is not set
+CONFIG_RCU_FANOUT=32
+# CONFIG_RCU_FANOUT_EXACT is not set
+# CONFIG_TREE_RCU_TRACE is not set
+# CONFIG_IKCONFIG is not set
+CONFIG_LOG_BUF_SHIFT=17
+# CONFIG_GROUP_SCHED is not set
+# CONFIG_CGROUPS is not set
+# CONFIG_SYSFS_DEPRECATED_V2 is not set
+# CONFIG_RELAY is not set
+CONFIG_NAMESPACES=y
+# CONFIG_UTS_NS is not set
+# CONFIG_IPC_NS is not set
+# CONFIG_USER_NS is not set
+# CONFIG_PID_NS is not set
+CONFIG_BLK_DEV_INITRD=y
+CONFIG_INITRAMFS_SOURCE=""
+CONFIG_RD_GZIP=y
+CONFIG_RD_BZIP2=y
+CONFIG_RD_LZMA=y
+CONFIG_CC_OPTIMIZE_FOR_SIZE=y
+CONFIG_SYSCTL=y
+CONFIG_ANON_INODES=y
+# CONFIG_EMBEDDED is not set
+CONFIG_UID16=y
+CONFIG_SYSCTL_SYSCALL=y
+CONFIG_KALLSYMS=y
+# CONFIG_KALLSYMS_ALL is not set
+CONFIG_KALLSYMS_EXTRA_PASS=y
+CONFIG_HOTPLUG=y
+CONFIG_PRINTK=y
+CONFIG_BUG=y
+CONFIG_ELF_CORE=y
+CONFIG_BASE_FULL=y
+CONFIG_FUTEX=y
+CONFIG_EPOLL=y
+CONFIG_SIGNALFD=y
+CONFIG_TIMERFD=y
+CONFIG_EVENTFD=y
+CONFIG_SHMEM=y
+CONFIG_AIO=y
+
+#
+# Kernel Performance Events And Counters
+#
+CONFIG_VM_EVENT_COUNTERS=y
+CONFIG_SLUB_DEBUG=y
+CONFIG_COMPAT_BRK=y
+# CONFIG_SLAB is not set
+CONFIG_SLUB=y
+# CONFIG_SLOB is not set
+# CONFIG_PROFILING is not set
+CONFIG_HAVE_OPROFILE=y
+# CONFIG_KPROBES is not set
+CONFIG_HAVE_KPROBES=y
+CONFIG_HAVE_KRETPROBES=y
+CONFIG_HAVE_CLK=y
+
+#
+# GCOV-based kernel profiling
+#
+# CONFIG_GCOV_KERNEL is not set
+# CONFIG_SLOW_WORK is not set
+CONFIG_HAVE_GENERIC_DMA_COHERENT=y
+CONFIG_SLABINFO=y
+CONFIG_RT_MUTEXES=y
+CONFIG_BASE_SMALL=0
+CONFIG_MODULES=y
+# CONFIG_MODULE_FORCE_LOAD is not set
+CONFIG_MODULE_UNLOAD=y
+# CONFIG_MODULE_FORCE_UNLOAD is not set
+CONFIG_MODVERSIONS=y
+# CONFIG_MODULE_SRCVERSION_ALL is not set
+CONFIG_BLOCK=y
+CONFIG_LBDAF=y
+CONFIG_BLK_DEV_BSG=y
+# CONFIG_BLK_DEV_INTEGRITY is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+# CONFIG_DEFAULT_AS is not set
+# CONFIG_DEFAULT_DEADLINE is not set
+CONFIG_DEFAULT_CFQ=y
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="cfq"
+# CONFIG_FREEZER is not set
+
+#
+# System Type
+#
+CONFIG_MMU=y
+# CONFIG_ARCH_AAEC2000 is not set
+# CONFIG_ARCH_INTEGRATOR is not set
+# CONFIG_ARCH_REALVIEW is not set
+# CONFIG_ARCH_VERSATILE is not set
+# CONFIG_ARCH_AT91 is not set
+# CONFIG_ARCH_CLPS711X is not set
+# CONFIG_ARCH_GEMINI is not set
+# CONFIG_ARCH_EBSA110 is not set
+# CONFIG_ARCH_EP93XX is not set
+# CONFIG_ARCH_FOOTBRIDGE is not set
+# CONFIG_ARCH_MXC is not set
+# CONFIG_ARCH_STMP3XXX is not set
+# CONFIG_ARCH_NETX is not set
+# CONFIG_ARCH_H720X is not set
+# CONFIG_ARCH_NOMADIK is not set
+# CONFIG_ARCH_IOP13XX is not set
+# CONFIG_ARCH_IOP32X is not set
+# CONFIG_ARCH_IOP33X is not set
+# CONFIG_ARCH_IXP23XX is not set
+# CONFIG_ARCH_IXP2000 is not set
+# CONFIG_ARCH_IXP4XX is not set
+# CONFIG_ARCH_L7200 is not set
+# CONFIG_ARCH_KIRKWOOD is not set
+# CONFIG_ARCH_LOKI is not set
+# CONFIG_ARCH_MV78XX0 is not set
+# CONFIG_ARCH_ORION5X is not set
+# CONFIG_ARCH_MMP is not set
+# CONFIG_ARCH_KS8695 is not set
+# CONFIG_ARCH_NS9XXX is not set
+# CONFIG_ARCH_W90X900 is not set
+# CONFIG_ARCH_PNX4008 is not set
+# CONFIG_ARCH_PXA is not set
+# CONFIG_ARCH_MSM is not set
+# CONFIG_ARCH_RPC is not set
+# CONFIG_ARCH_SA1100 is not set
+# CONFIG_ARCH_S3C2410 is not set
+# CONFIG_ARCH_S3C64XX is not set
+# CONFIG_ARCH_S5PC1XX is not set
+# CONFIG_ARCH_SHARK is not set
+# CONFIG_ARCH_LH7A40X is not set
+# CONFIG_ARCH_U300 is not set
+# CONFIG_ARCH_DAVINCI is not set
+# CONFIG_ARCH_OMAP is not set
+# CONFIG_ARCH_BCMRING is not set
+CONFIG_PLAT_SPEAR=y
+# CONFIG_ARCH_SPEAR3XX is not set
+CONFIG_ARCH_SPEAR6XX=y
+# CONFIG_MACH_SPEAR300 is not set
+# CONFIG_MACH_SPEAR310 is not set
+# CONFIG_MACH_SPEAR320 is not set
+# CONFIG_BOARD_SPEAR300_EVB is not set
+CONFIG_MACH_SPEAR600=y
+CONFIG_BOARD_SPEAR600_EVB=y
+
+#
+# Processor Type
+#
+CONFIG_CPU_32=y
+CONFIG_CPU_ARM926T=y
+CONFIG_CPU_32v5=y
+CONFIG_CPU_ABRT_EV5TJ=y
+CONFIG_CPU_PABRT_LEGACY=y
+CONFIG_CPU_CACHE_VIVT=y
+CONFIG_CPU_COPY_V4WB=y
+CONFIG_CPU_TLB_V4WBI=y
+CONFIG_CPU_CP15=y
+CONFIG_CPU_CP15_MMU=y
+
+#
+# Processor Features
+#
+CONFIG_ARM_THUMB=y
+# CONFIG_CPU_ICACHE_DISABLE is not set
+# CONFIG_CPU_DCACHE_DISABLE is not set
+# CONFIG_CPU_DCACHE_WRITETHROUGH is not set
+# CONFIG_CPU_CACHE_ROUND_ROBIN is not set
+CONFIG_ARM_L1_CACHE_SHIFT=5
+CONFIG_ARM_VIC=y
+CONFIG_ARM_VIC_NR=2
+CONFIG_COMMON_CLKDEV=y
+
+#
+# Bus support
+#
+CONFIG_ARM_AMBA=y
+# CONFIG_PCI_SYSCALL is not set
+# CONFIG_ARCH_SUPPORTS_MSI is not set
+# CONFIG_PCCARD is not set
+
+#
+# Kernel Features
+#
+# CONFIG_NO_HZ is not set
+# CONFIG_HIGH_RES_TIMERS is not set
+CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
+CONFIG_VMSPLIT_3G=y
+# CONFIG_VMSPLIT_2G is not set
+# CONFIG_VMSPLIT_1G is not set
+CONFIG_PAGE_OFFSET=0xC0000000
+CONFIG_PREEMPT_NONE=y
+# CONFIG_PREEMPT_VOLUNTARY is not set
+# CONFIG_PREEMPT is not set
+CONFIG_HZ=100
+# CONFIG_AEABI is not set
+# CONFIG_ARCH_SPARSEMEM_DEFAULT is not set
+# CONFIG_ARCH_SELECT_MEMORY_MODEL is not set
+# CONFIG_HIGHMEM is not set
+CONFIG_SELECT_MEMORY_MODEL=y
+CONFIG_FLATMEM_MANUAL=y
+# CONFIG_DISCONTIGMEM_MANUAL is not set
+# CONFIG_SPARSEMEM_MANUAL is not set
+CONFIG_FLATMEM=y
+CONFIG_FLAT_NODE_MEM_MAP=y
+CONFIG_PAGEFLAGS_EXTENDED=y
+CONFIG_SPLIT_PTLOCK_CPUS=4096
+# CONFIG_PHYS_ADDR_T_64BIT is not set
+CONFIG_ZONE_DMA_FLAG=0
+CONFIG_VIRT_TO_BUS=y
+CONFIG_HAVE_MLOCK=y
+CONFIG_HAVE_MLOCKED_PAGE_BIT=y
+# CONFIG_KSM is not set
+CONFIG_DEFAULT_MMAP_MIN_ADDR=4096
+CONFIG_ALIGNMENT_TRAP=y
+# CONFIG_UACCESS_WITH_MEMCPY is not set
+
+#
+# Boot options
+#
+CONFIG_ZBOOT_ROM_TEXT=0
+CONFIG_ZBOOT_ROM_BSS=0
+CONFIG_CMDLINE=""
+# CONFIG_XIP_KERNEL is not set
+# CONFIG_KEXEC is not set
+
+#
+# CPU Power Management
+#
+# CONFIG_CPU_IDLE is not set
+
+#
+# Floating point emulation
+#
+
+#
+# At least one emulation must be selected
+#
+# CONFIG_FPE_NWFPE is not set
+# CONFIG_FPE_FASTFPE is not set
+# CONFIG_VFP is not set
+
+#
+# Userspace binary formats
+#
+CONFIG_BINFMT_ELF=y
+# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
+CONFIG_HAVE_AOUT=y
+# CONFIG_BINFMT_AOUT is not set
+CONFIG_BINFMT_MISC=y
+# CONFIG_ARTHUR is not set
+
+#
+# Power management options
+#
+# CONFIG_PM is not set
+CONFIG_ARCH_SUSPEND_POSSIBLE=y
+# CONFIG_NET is not set
+
+#
+# Device Drivers
+#
+
+#
+# Generic Driver Options
+#
+CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
+# CONFIG_DEVTMPFS is not set
+CONFIG_STANDALONE=y
+CONFIG_PREVENT_FIRMWARE_BUILD=y
+CONFIG_FW_LOADER=y
+CONFIG_FIRMWARE_IN_KERNEL=y
+CONFIG_EXTRA_FIRMWARE=""
+# CONFIG_DEBUG_DRIVER is not set
+# CONFIG_DEBUG_DEVRES is not set
+# CONFIG_SYS_HYPERVISOR is not set
+# CONFIG_MTD is not set
+# CONFIG_PARPORT is not set
+CONFIG_BLK_DEV=y
+# CONFIG_BLK_DEV_COW_COMMON is not set
+# CONFIG_BLK_DEV_LOOP is not set
+CONFIG_BLK_DEV_RAM=y
+CONFIG_BLK_DEV_RAM_COUNT=16
+CONFIG_BLK_DEV_RAM_SIZE=16384
+# CONFIG_BLK_DEV_XIP is not set
+# CONFIG_CDROM_PKTCDVD is not set
+CONFIG_MISC_DEVICES=y
+# CONFIG_ENCLOSURE_SERVICES is not set
+# CONFIG_C2PORT is not set
+
+#
+# EEPROM support
+#
+# CONFIG_EEPROM_93CX6 is not set
+CONFIG_HAVE_IDE=y
+# CONFIG_IDE is not set
+
+#
+# SCSI device support
+#
+# CONFIG_RAID_ATTRS is not set
+# CONFIG_SCSI is not set
+# CONFIG_SCSI_DMA is not set
+# CONFIG_SCSI_NETLINK is not set
+# CONFIG_ATA is not set
+# CONFIG_MD is not set
+# CONFIG_PHONE is not set
+
+#
+# Input device support
+#
+CONFIG_INPUT=y
+CONFIG_INPUT_FF_MEMLESS=y
+# CONFIG_INPUT_POLLDEV is not set
+
+#
+# Userland interfaces
+#
+CONFIG_INPUT_MOUSEDEV=y
+# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
+CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
+# CONFIG_INPUT_JOYDEV is not set
+# CONFIG_INPUT_EVDEV is not set
+# CONFIG_INPUT_EVBUG is not set
+
+#
+# Hardware I/O ports
+#
+CONFIG_SERIO=y
+CONFIG_SERIO_SERPORT=y
+# CONFIG_SERIO_AMBAKMI is not set
+# CONFIG_SERIO_RAW is not set
+# CONFIG_GAMEPORT is not set
+
+#
+# Character devices
+#
+CONFIG_VT=y
+CONFIG_CONSOLE_TRANSLATIONS=y
+CONFIG_VT_CONSOLE=y
+CONFIG_HW_CONSOLE=y
+# CONFIG_VT_HW_CONSOLE_BINDING is not set
+CONFIG_DEVKMEM=y
+# CONFIG_SERIAL_NONSTANDARD is not set
+
+#
+# Serial drivers
+#
+# CONFIG_SERIAL_8250 is not set
+
+#
+# Non-8250 serial port support
+#
+# CONFIG_SERIAL_AMBA_PL010 is not set
+CONFIG_SERIAL_AMBA_PL011=y
+CONFIG_SERIAL_AMBA_PL011_CONSOLE=y
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+CONFIG_UNIX98_PTYS=y
+# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set
+# CONFIG_LEGACY_PTYS is not set
+# CONFIG_R3964 is not set
+CONFIG_RAW_DRIVER=y
+CONFIG_MAX_RAW_DEVS=8192
+# CONFIG_TCG_TPM is not set
+# CONFIG_I2C is not set
+# CONFIG_SPI is not set
+
+#
+# PPS support
+#
+# CONFIG_PPS is not set
+CONFIG_ARCH_REQUIRE_GPIOLIB=y
+CONFIG_GPIOLIB=y
+# CONFIG_DEBUG_GPIO is not set
+CONFIG_GPIO_SYSFS=y
+
+#
+# Memory mapped GPIO expanders:
+#
+CONFIG_GPIO_PL061=y
+
+#
+# I2C GPIO expanders:
+#
+
+#
+# PCI GPIO expanders:
+#
+
+#
+# SPI GPIO expanders:
+#
+
+#
+# AC97 GPIO expanders:
+#
+# CONFIG_W1 is not set
+# CONFIG_POWER_SUPPLY is not set
+# CONFIG_HWMON is not set
+# CONFIG_THERMAL is not set
+# CONFIG_WATCHDOG is not set
+CONFIG_SSB_POSSIBLE=y
+
+#
+# Sonics Silicon Backplane
+#
+# CONFIG_SSB is not set
+
+#
+# Multifunction device drivers
+#
+# CONFIG_MFD_CORE is not set
+# CONFIG_MFD_SM501 is not set
+# CONFIG_HTC_PASIC3 is not set
+# CONFIG_MFD_TMIO is not set
+# CONFIG_MFD_T7L66XB is not set
+# CONFIG_MFD_TC6387XB is not set
+# CONFIG_REGULATOR is not set
+# CONFIG_MEDIA_SUPPORT is not set
+
+#
+# Graphics support
+#
+# CONFIG_VGASTATE is not set
+# CONFIG_VIDEO_OUTPUT_CONTROL is not set
+# CONFIG_FB is not set
+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
+
+#
+# Display device support
+#
+# CONFIG_DISPLAY_SUPPORT is not set
+
+#
+# Console display driver support
+#
+# CONFIG_VGA_CONSOLE is not set
+CONFIG_DUMMY_CONSOLE=y
+# CONFIG_HID_SUPPORT is not set
+# CONFIG_USB_SUPPORT is not set
+# CONFIG_MMC is not set
+# CONFIG_MEMSTICK is not set
+# CONFIG_NEW_LEDS is not set
+# CONFIG_ACCESSIBILITY is not set
+CONFIG_RTC_LIB=y
+# CONFIG_RTC_CLASS is not set
+# CONFIG_DMADEVICES is not set
+# CONFIG_AUXDISPLAY is not set
+# CONFIG_UIO is not set
+
+#
+# TI VLYNQ
+#
+# CONFIG_STAGING is not set
+
+#
+# File systems
+#
+CONFIG_EXT2_FS=y
+CONFIG_EXT2_FS_XATTR=y
+# CONFIG_EXT2_FS_POSIX_ACL is not set
+CONFIG_EXT2_FS_SECURITY=y
+# CONFIG_EXT2_FS_XIP is not set
+CONFIG_EXT3_FS=y
+# CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set
+CONFIG_EXT3_FS_XATTR=y
+# CONFIG_EXT3_FS_POSIX_ACL is not set
+CONFIG_EXT3_FS_SECURITY=y
+# CONFIG_EXT4_FS is not set
+CONFIG_JBD=y
+# CONFIG_JBD_DEBUG is not set
+CONFIG_FS_MBCACHE=y
+# CONFIG_REISERFS_FS is not set
+# CONFIG_JFS_FS is not set
+# CONFIG_FS_POSIX_ACL is not set
+# CONFIG_XFS_FS is not set
+# CONFIG_GFS2_FS is not set
+# CONFIG_BTRFS_FS is not set
+# CONFIG_NILFS2_FS is not set
+CONFIG_FILE_LOCKING=y
+CONFIG_FSNOTIFY=y
+CONFIG_DNOTIFY=y
+# CONFIG_INOTIFY is not set
+CONFIG_INOTIFY_USER=y
+# CONFIG_QUOTA is not set
+# CONFIG_AUTOFS_FS is not set
+CONFIG_AUTOFS4_FS=m
+# CONFIG_FUSE_FS is not set
+
+#
+# Caches
+#
+# CONFIG_FSCACHE is not set
+
+#
+# CD-ROM/DVD Filesystems
+#
+# CONFIG_ISO9660_FS is not set
+# CONFIG_UDF_FS is not set
+
+#
+# DOS/FAT/NT Filesystems
+#
+CONFIG_FAT_FS=m
+CONFIG_MSDOS_FS=m
+CONFIG_VFAT_FS=m
+CONFIG_FAT_DEFAULT_CODEPAGE=437
+CONFIG_FAT_DEFAULT_IOCHARSET="ascii"
+# CONFIG_NTFS_FS is not set
+
+#
+# Pseudo filesystems
+#
+CONFIG_PROC_FS=y
+CONFIG_PROC_SYSCTL=y
+CONFIG_PROC_PAGE_MONITOR=y
+CONFIG_SYSFS=y
+CONFIG_TMPFS=y
+# CONFIG_TMPFS_POSIX_ACL is not set
+# CONFIG_HUGETLB_PAGE is not set
+# CONFIG_CONFIGFS_FS is not set
+CONFIG_MISC_FILESYSTEMS=y
+# CONFIG_ADFS_FS is not set
+# CONFIG_AFFS_FS is not set
+# CONFIG_HFS_FS is not set
+# CONFIG_HFSPLUS_FS is not set
+# CONFIG_BEFS_FS is not set
+# CONFIG_BFS_FS is not set
+# CONFIG_EFS_FS is not set
+# CONFIG_SQUASHFS is not set
+# CONFIG_VXFS_FS is not set
+# CONFIG_MINIX_FS is not set
+# CONFIG_OMFS_FS is not set
+# CONFIG_HPFS_FS is not set
+# CONFIG_QNX4FS_FS is not set
+# CONFIG_ROMFS_FS is not set
+# CONFIG_SYSV_FS is not set
+# CONFIG_UFS_FS is not set
+
+#
+# Partition Types
+#
+CONFIG_PARTITION_ADVANCED=y
+# CONFIG_ACORN_PARTITION is not set
+# CONFIG_OSF_PARTITION is not set
+# CONFIG_AMIGA_PARTITION is not set
+# CONFIG_ATARI_PARTITION is not set
+# CONFIG_MAC_PARTITION is not set
+CONFIG_MSDOS_PARTITION=y
+# CONFIG_BSD_DISKLABEL is not set
+# CONFIG_MINIX_SUBPARTITION is not set
+# CONFIG_SOLARIS_X86_PARTITION is not set
+# CONFIG_UNIXWARE_DISKLABEL is not set
+# CONFIG_LDM_PARTITION is not set
+# CONFIG_SGI_PARTITION is not set
+# CONFIG_ULTRIX_PARTITION is not set
+# CONFIG_SUN_PARTITION is not set
+# CONFIG_KARMA_PARTITION is not set
+# CONFIG_EFI_PARTITION is not set
+# CONFIG_SYSV68_PARTITION is not set
+CONFIG_NLS=y
+CONFIG_NLS_DEFAULT="utf8"
+CONFIG_NLS_CODEPAGE_437=y
+# CONFIG_NLS_CODEPAGE_737 is not set
+# CONFIG_NLS_CODEPAGE_775 is not set
+# CONFIG_NLS_CODEPAGE_850 is not set
+# CONFIG_NLS_CODEPAGE_852 is not set
+# CONFIG_NLS_CODEPAGE_855 is not set
+# CONFIG_NLS_CODEPAGE_857 is not set
+# CONFIG_NLS_CODEPAGE_860 is not set
+# CONFIG_NLS_CODEPAGE_861 is not set
+# CONFIG_NLS_CODEPAGE_862 is not set
+# CONFIG_NLS_CODEPAGE_863 is not set
+# CONFIG_NLS_CODEPAGE_864 is not set
+# CONFIG_NLS_CODEPAGE_865 is not set
+# CONFIG_NLS_CODEPAGE_866 is not set
+# CONFIG_NLS_CODEPAGE_869 is not set
+# CONFIG_NLS_CODEPAGE_936 is not set
+# CONFIG_NLS_CODEPAGE_950 is not set
+# CONFIG_NLS_CODEPAGE_932 is not set
+# CONFIG_NLS_CODEPAGE_949 is not set
+# CONFIG_NLS_CODEPAGE_874 is not set
+# CONFIG_NLS_ISO8859_8 is not set
+# CONFIG_NLS_CODEPAGE_1250 is not set
+# CONFIG_NLS_CODEPAGE_1251 is not set
+CONFIG_NLS_ASCII=m
+# CONFIG_NLS_ISO8859_1 is not set
+# CONFIG_NLS_ISO8859_2 is not set
+# CONFIG_NLS_ISO8859_3 is not set
+# CONFIG_NLS_ISO8859_4 is not set
+# CONFIG_NLS_ISO8859_5 is not set
+# CONFIG_NLS_ISO8859_6 is not set
+# CONFIG_NLS_ISO8859_7 is not set
+# CONFIG_NLS_ISO8859_9 is not set
+# CONFIG_NLS_ISO8859_13 is not set
+# CONFIG_NLS_ISO8859_14 is not set
+# CONFIG_NLS_ISO8859_15 is not set
+# CONFIG_NLS_KOI8_R is not set
+# CONFIG_NLS_KOI8_U is not set
+# CONFIG_NLS_UTF8 is not set
+
+#
+# Kernel hacking
+#
+# CONFIG_PRINTK_TIME is not set
+CONFIG_ENABLE_WARN_DEPRECATED=y
+CONFIG_ENABLE_MUST_CHECK=y
+CONFIG_FRAME_WARN=1024
+CONFIG_MAGIC_SYSRQ=y
+# CONFIG_STRIP_ASM_SYMS is not set
+# CONFIG_UNUSED_SYMBOLS is not set
+CONFIG_DEBUG_FS=y
+# CONFIG_HEADERS_CHECK is not set
+CONFIG_DEBUG_KERNEL=y
+# CONFIG_DEBUG_SHIRQ is not set
+CONFIG_DETECT_SOFTLOCKUP=y
+# CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set
+CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=0
+CONFIG_DETECT_HUNG_TASK=y
+# CONFIG_BOOTPARAM_HUNG_TASK_PANIC is not set
+CONFIG_BOOTPARAM_HUNG_TASK_PANIC_VALUE=0
+CONFIG_SCHED_DEBUG=y
+# CONFIG_SCHEDSTATS is not set
+# CONFIG_TIMER_STATS is not set
+# CONFIG_DEBUG_OBJECTS is not set
+# CONFIG_SLUB_DEBUG_ON is not set
+# CONFIG_SLUB_STATS is not set
+# CONFIG_DEBUG_KMEMLEAK is not set
+# CONFIG_DEBUG_RT_MUTEXES is not set
+# CONFIG_RT_MUTEX_TESTER is not set
+CONFIG_DEBUG_SPINLOCK=y
+# CONFIG_DEBUG_MUTEXES is not set
+# CONFIG_DEBUG_LOCK_ALLOC is not set
+# CONFIG_PROVE_LOCKING is not set
+# CONFIG_LOCK_STAT is not set
+CONFIG_DEBUG_SPINLOCK_SLEEP=y
+# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
+# CONFIG_DEBUG_KOBJECT is not set
+CONFIG_DEBUG_BUGVERBOSE=y
+CONFIG_DEBUG_INFO=y
+# CONFIG_DEBUG_VM is not set
+# CONFIG_DEBUG_WRITECOUNT is not set
+CONFIG_DEBUG_MEMORY_INIT=y
+# CONFIG_DEBUG_LIST is not set
+# CONFIG_DEBUG_SG is not set
+# CONFIG_DEBUG_NOTIFIERS is not set
+# CONFIG_DEBUG_CREDENTIALS is not set
+CONFIG_FRAME_POINTER=y
+# CONFIG_BOOT_PRINTK_DELAY is not set
+# CONFIG_RCU_TORTURE_TEST is not set
+CONFIG_RCU_CPU_STALL_DETECTOR=y
+# CONFIG_BACKTRACE_SELF_TEST is not set
+# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set
+# CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set
+# CONFIG_FAULT_INJECTION is not set
+# CONFIG_LATENCYTOP is not set
+# CONFIG_SYSCTL_SYSCALL_CHECK is not set
+# CONFIG_PAGE_POISONING is not set
+CONFIG_HAVE_FUNCTION_TRACER=y
+CONFIG_TRACING_SUPPORT=y
+CONFIG_FTRACE=y
+# CONFIG_FUNCTION_TRACER is not set
+# CONFIG_IRQSOFF_TRACER is not set
+# CONFIG_SCHED_TRACER is not set
+# CONFIG_ENABLE_DEFAULT_TRACERS is not set
+# CONFIG_BOOT_TRACER is not set
+CONFIG_BRANCH_PROFILE_NONE=y
+# CONFIG_PROFILE_ANNOTATED_BRANCHES is not set
+# CONFIG_PROFILE_ALL_BRANCHES is not set
+# CONFIG_STACK_TRACER is not set
+# CONFIG_KMEMTRACE is not set
+# CONFIG_WORKQUEUE_TRACER is not set
+# CONFIG_BLK_DEV_IO_TRACE is not set
+# CONFIG_DYNAMIC_DEBUG is not set
+# CONFIG_SAMPLES is not set
+CONFIG_HAVE_ARCH_KGDB=y
+# CONFIG_KGDB is not set
+# CONFIG_DEBUG_USER is not set
+# CONFIG_DEBUG_ERRORS is not set
+# CONFIG_DEBUG_STACK_USAGE is not set
+# CONFIG_DEBUG_LL is not set
+
+#
+# Security options
+#
+# CONFIG_KEYS is not set
+# CONFIG_SECURITY is not set
+# CONFIG_SECURITYFS is not set
+# CONFIG_SECURITY_FILE_CAPABILITIES is not set
+# CONFIG_CRYPTO is not set
+# CONFIG_BINARY_PRINTF is not set
+
+#
+# Library routines
+#
+CONFIG_GENERIC_FIND_LAST_BIT=y
+# CONFIG_CRC_CCITT is not set
+# CONFIG_CRC16 is not set
+# CONFIG_CRC_T10DIF is not set
+# CONFIG_CRC_ITU_T is not set
+# CONFIG_CRC32 is not set
+# CONFIG_CRC7 is not set
+# CONFIG_LIBCRC32C is not set
+CONFIG_ZLIB_INFLATE=y
+CONFIG_DECOMPRESS_GZIP=y
+CONFIG_DECOMPRESS_BZIP2=y
+CONFIG_DECOMPRESS_LZMA=y
+CONFIG_HAS_IOMEM=y
+CONFIG_HAS_IOPORT=y
+CONFIG_HAS_DMA=y
diff --git a/arch/arm/configs/stamp9g20_defconfig b/arch/arm/configs/stamp9g20_defconfig
new file mode 100644 (file)
index 0000000..06a8293
--- /dev/null
@@ -0,0 +1,1456 @@
+#
+# Automatically generated make config: don't edit
+# Linux kernel version: 2.6.34-rc1
+# Wed Mar 17 16:38:03 2010
+#
+CONFIG_ARM=y
+CONFIG_SYS_SUPPORTS_APM_EMULATION=y
+CONFIG_GENERIC_GPIO=y
+CONFIG_GENERIC_TIME=y
+CONFIG_GENERIC_CLOCKEVENTS=y
+CONFIG_HAVE_PROC_CPU=y
+CONFIG_GENERIC_HARDIRQS=y
+CONFIG_STACKTRACE_SUPPORT=y
+CONFIG_HAVE_LATENCYTOP_SUPPORT=y
+CONFIG_LOCKDEP_SUPPORT=y
+CONFIG_TRACE_IRQFLAGS_SUPPORT=y
+CONFIG_HARDIRQS_SW_RESEND=y
+CONFIG_GENERIC_IRQ_PROBE=y
+CONFIG_RWSEM_GENERIC_SPINLOCK=y
+CONFIG_GENERIC_HWEIGHT=y
+CONFIG_GENERIC_CALIBRATE_DELAY=y
+CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y
+CONFIG_VECTORS_BASE=0xffff0000
+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
+CONFIG_CONSTRUCTORS=y
+
+#
+# General setup
+#
+CONFIG_EXPERIMENTAL=y
+CONFIG_BROKEN_ON_SMP=y
+CONFIG_LOCK_KERNEL=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
+CONFIG_LOCALVERSION=""
+# CONFIG_LOCALVERSION_AUTO is not set
+CONFIG_HAVE_KERNEL_GZIP=y
+CONFIG_HAVE_KERNEL_LZO=y
+CONFIG_KERNEL_GZIP=y
+# CONFIG_KERNEL_BZIP2 is not set
+# CONFIG_KERNEL_LZMA is not set
+# CONFIG_KERNEL_LZO is not set
+# CONFIG_SWAP is not set
+CONFIG_SYSVIPC=y
+CONFIG_SYSVIPC_SYSCTL=y
+# CONFIG_POSIX_MQUEUE is not set
+# CONFIG_BSD_PROCESS_ACCT is not set
+# CONFIG_TASKSTATS is not set
+# CONFIG_AUDIT is not set
+
+#
+# RCU Subsystem
+#
+# CONFIG_TREE_RCU is not set
+CONFIG_TREE_PREEMPT_RCU=y
+# CONFIG_TINY_RCU is not set
+# CONFIG_RCU_TRACE is not set
+CONFIG_RCU_FANOUT=32
+# CONFIG_RCU_FANOUT_EXACT is not set
+# CONFIG_TREE_RCU_TRACE is not set
+# CONFIG_IKCONFIG is not set
+CONFIG_LOG_BUF_SHIFT=14
+# CONFIG_CGROUPS is not set
+# CONFIG_SYSFS_DEPRECATED_V2 is not set
+# CONFIG_RELAY is not set
+CONFIG_NAMESPACES=y
+# CONFIG_UTS_NS is not set
+# CONFIG_IPC_NS is not set
+# CONFIG_USER_NS is not set
+# CONFIG_PID_NS is not set
+# CONFIG_NET_NS is not set
+CONFIG_BLK_DEV_INITRD=y
+CONFIG_INITRAMFS_SOURCE=""
+CONFIG_RD_GZIP=y
+CONFIG_RD_BZIP2=y
+CONFIG_RD_LZMA=y
+CONFIG_RD_LZO=y
+CONFIG_CC_OPTIMIZE_FOR_SIZE=y
+CONFIG_SYSCTL=y
+CONFIG_ANON_INODES=y
+# CONFIG_EMBEDDED is not set
+CONFIG_UID16=y
+CONFIG_SYSCTL_SYSCALL=y
+CONFIG_KALLSYMS=y
+# CONFIG_KALLSYMS_EXTRA_PASS is not set
+CONFIG_HOTPLUG=y
+CONFIG_PRINTK=y
+CONFIG_BUG=y
+CONFIG_ELF_CORE=y
+CONFIG_BASE_FULL=y
+CONFIG_FUTEX=y
+CONFIG_EPOLL=y
+CONFIG_SIGNALFD=y
+CONFIG_TIMERFD=y
+CONFIG_EVENTFD=y
+CONFIG_SHMEM=y
+CONFIG_AIO=y
+CONFIG_HAVE_PERF_EVENTS=y
+CONFIG_PERF_USE_VMALLOC=y
+
+#
+# Kernel Performance Events And Counters
+#
+# CONFIG_PERF_EVENTS is not set
+# CONFIG_PERF_COUNTERS is not set
+CONFIG_VM_EVENT_COUNTERS=y
+CONFIG_COMPAT_BRK=y
+CONFIG_SLAB=y
+# CONFIG_SLUB is not set
+# CONFIG_SLOB is not set
+# CONFIG_PROFILING is not set
+CONFIG_HAVE_OPROFILE=y
+# CONFIG_KPROBES is not set
+CONFIG_HAVE_KPROBES=y
+CONFIG_HAVE_KRETPROBES=y
+CONFIG_HAVE_CLK=y
+
+#
+# GCOV-based kernel profiling
+#
+# CONFIG_SLOW_WORK is not set
+CONFIG_HAVE_GENERIC_DMA_COHERENT=y
+CONFIG_SLABINFO=y
+CONFIG_RT_MUTEXES=y
+CONFIG_BASE_SMALL=0
+CONFIG_MODULES=y
+# CONFIG_MODULE_FORCE_LOAD is not set
+CONFIG_MODULE_UNLOAD=y
+# CONFIG_MODULE_FORCE_UNLOAD is not set
+# CONFIG_MODVERSIONS is not set
+# CONFIG_MODULE_SRCVERSION_ALL is not set
+CONFIG_BLOCK=y
+# CONFIG_LBDAF is not set
+# CONFIG_BLK_DEV_BSG is not set
+# CONFIG_BLK_DEV_INTEGRITY is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+# CONFIG_IOSCHED_DEADLINE is not set
+CONFIG_IOSCHED_CFQ=y
+# CONFIG_DEFAULT_DEADLINE is not set
+CONFIG_DEFAULT_CFQ=y
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="cfq"
+# CONFIG_INLINE_SPIN_TRYLOCK is not set
+# CONFIG_INLINE_SPIN_TRYLOCK_BH is not set
+# CONFIG_INLINE_SPIN_LOCK is not set
+# CONFIG_INLINE_SPIN_LOCK_BH is not set
+# CONFIG_INLINE_SPIN_LOCK_IRQ is not set
+# CONFIG_INLINE_SPIN_LOCK_IRQSAVE is not set
+# CONFIG_INLINE_SPIN_UNLOCK is not set
+# CONFIG_INLINE_SPIN_UNLOCK_BH is not set
+# CONFIG_INLINE_SPIN_UNLOCK_IRQ is not set
+# CONFIG_INLINE_SPIN_UNLOCK_IRQRESTORE is not set
+# CONFIG_INLINE_READ_TRYLOCK is not set
+# CONFIG_INLINE_READ_LOCK is not set
+# CONFIG_INLINE_READ_LOCK_BH is not set
+# CONFIG_INLINE_READ_LOCK_IRQ is not set
+# CONFIG_INLINE_READ_LOCK_IRQSAVE is not set
+# CONFIG_INLINE_READ_UNLOCK is not set
+# CONFIG_INLINE_READ_UNLOCK_BH is not set
+# CONFIG_INLINE_READ_UNLOCK_IRQ is not set
+# CONFIG_INLINE_READ_UNLOCK_IRQRESTORE is not set
+# CONFIG_INLINE_WRITE_TRYLOCK is not set
+# CONFIG_INLINE_WRITE_LOCK is not set
+# CONFIG_INLINE_WRITE_LOCK_BH is not set
+# CONFIG_INLINE_WRITE_LOCK_IRQ is not set
+# CONFIG_INLINE_WRITE_LOCK_IRQSAVE is not set
+# CONFIG_INLINE_WRITE_UNLOCK is not set
+# CONFIG_INLINE_WRITE_UNLOCK_BH is not set
+# CONFIG_INLINE_WRITE_UNLOCK_IRQ is not set
+# CONFIG_INLINE_WRITE_UNLOCK_IRQRESTORE is not set
+# CONFIG_MUTEX_SPIN_ON_OWNER is not set
+CONFIG_FREEZER=y
+
+#
+# System Type
+#
+CONFIG_MMU=y
+# CONFIG_ARCH_AAEC2000 is not set
+# CONFIG_ARCH_INTEGRATOR is not set
+# CONFIG_ARCH_REALVIEW is not set
+# CONFIG_ARCH_VERSATILE is not set
+CONFIG_ARCH_AT91=y
+# CONFIG_ARCH_CLPS711X is not set
+# CONFIG_ARCH_GEMINI is not set
+# CONFIG_ARCH_EBSA110 is not set
+# CONFIG_ARCH_EP93XX is not set
+# CONFIG_ARCH_FOOTBRIDGE is not set
+# CONFIG_ARCH_MXC is not set
+# CONFIG_ARCH_STMP3XXX is not set
+# CONFIG_ARCH_NETX is not set
+# CONFIG_ARCH_H720X is not set
+# CONFIG_ARCH_NOMADIK is not set
+# CONFIG_ARCH_IOP13XX is not set
+# CONFIG_ARCH_IOP32X is not set
+# CONFIG_ARCH_IOP33X is not set
+# CONFIG_ARCH_IXP23XX is not set
+# CONFIG_ARCH_IXP2000 is not set
+# CONFIG_ARCH_IXP4XX is not set
+# CONFIG_ARCH_L7200 is not set
+# CONFIG_ARCH_DOVE is not set
+# CONFIG_ARCH_KIRKWOOD is not set
+# CONFIG_ARCH_LOKI is not set
+# CONFIG_ARCH_MV78XX0 is not set
+# CONFIG_ARCH_ORION5X is not set
+# CONFIG_ARCH_MMP is not set
+# CONFIG_ARCH_KS8695 is not set
+# CONFIG_ARCH_NS9XXX is not set
+# CONFIG_ARCH_W90X900 is not set
+# CONFIG_ARCH_NUC93X is not set
+# CONFIG_ARCH_PNX4008 is not set
+# CONFIG_ARCH_PXA is not set
+# CONFIG_ARCH_MSM is not set
+# CONFIG_ARCH_RPC is not set
+# CONFIG_ARCH_SA1100 is not set
+# CONFIG_ARCH_S3C2410 is not set
+# CONFIG_ARCH_S3C64XX is not set
+# CONFIG_ARCH_S5PC1XX is not set
+# CONFIG_ARCH_SHARK is not set
+# CONFIG_ARCH_LH7A40X is not set
+# CONFIG_ARCH_U300 is not set
+# CONFIG_ARCH_DAVINCI is not set
+# CONFIG_ARCH_OMAP is not set
+# CONFIG_ARCH_BCMRING is not set
+# CONFIG_ARCH_U8500 is not set
+CONFIG_HAVE_AT91_USART3=y
+CONFIG_HAVE_AT91_USART4=y
+CONFIG_HAVE_AT91_USART5=y
+
+#
+# Atmel AT91 System-on-Chip
+#
+# CONFIG_ARCH_AT91RM9200 is not set
+# CONFIG_ARCH_AT91SAM9260 is not set
+# CONFIG_ARCH_AT91SAM9261 is not set
+# CONFIG_ARCH_AT91SAM9G10 is not set
+# CONFIG_ARCH_AT91SAM9263 is not set
+# CONFIG_ARCH_AT91SAM9RL is not set
+CONFIG_ARCH_AT91SAM9G20=y
+# CONFIG_ARCH_AT91SAM9G45 is not set
+# CONFIG_ARCH_AT91CAP9 is not set
+# CONFIG_ARCH_AT572D940HF is not set
+# CONFIG_ARCH_AT91X40 is not set
+CONFIG_AT91_PMC_UNIT=y
+
+#
+# AT91SAM9G20 Board Type
+#
+# CONFIG_MACH_AT91SAM9G20EK is not set
+# CONFIG_MACH_AT91SAM9G20EK_2MMC is not set
+# CONFIG_MACH_CPU9G20 is not set
+CONFIG_MACH_PORTUXG20=y
+CONFIG_MACH_STAMP9G20=y
+
+#
+# AT91 Board Options
+#
+
+#
+# AT91 Feature Selections
+#
+CONFIG_AT91_PROGRAMMABLE_CLOCKS=y
+CONFIG_AT91_SLOW_CLOCK=y
+CONFIG_AT91_TIMER_HZ=100
+CONFIG_AT91_EARLY_DBGU=y
+# CONFIG_AT91_EARLY_USART0 is not set
+# CONFIG_AT91_EARLY_USART1 is not set
+# CONFIG_AT91_EARLY_USART2 is not set
+# CONFIG_AT91_EARLY_USART3 is not set
+# CONFIG_AT91_EARLY_USART4 is not set
+# CONFIG_AT91_EARLY_USART5 is not set
+
+#
+# Processor Type
+#
+CONFIG_CPU_ARM926T=y
+CONFIG_CPU_32v5=y
+CONFIG_CPU_ABRT_EV5TJ=y
+CONFIG_CPU_PABRT_LEGACY=y
+CONFIG_CPU_CACHE_VIVT=y
+CONFIG_CPU_COPY_V4WB=y
+CONFIG_CPU_TLB_V4WBI=y
+CONFIG_CPU_CP15=y
+CONFIG_CPU_CP15_MMU=y
+
+#
+# Processor Features
+#
+CONFIG_ARM_THUMB=y
+# CONFIG_CPU_ICACHE_DISABLE is not set
+# CONFIG_CPU_DCACHE_DISABLE is not set
+# CONFIG_CPU_DCACHE_WRITETHROUGH is not set
+# CONFIG_CPU_CACHE_ROUND_ROBIN is not set
+CONFIG_ARM_L1_CACHE_SHIFT=5
+
+#
+# Bus support
+#
+# CONFIG_PCI_SYSCALL is not set
+# CONFIG_ARCH_SUPPORTS_MSI is not set
+# CONFIG_PCCARD is not set
+
+#
+# Kernel Features
+#
+CONFIG_TICK_ONESHOT=y
+CONFIG_NO_HZ=y
+CONFIG_HIGH_RES_TIMERS=y
+CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
+CONFIG_VMSPLIT_3G=y
+# CONFIG_VMSPLIT_2G is not set
+# CONFIG_VMSPLIT_1G is not set
+CONFIG_PAGE_OFFSET=0xC0000000
+# CONFIG_PREEMPT_NONE is not set
+# CONFIG_PREEMPT_VOLUNTARY is not set
+CONFIG_PREEMPT=y
+CONFIG_HZ=100
+CONFIG_AEABI=y
+# CONFIG_OABI_COMPAT is not set
+# CONFIG_ARCH_SPARSEMEM_DEFAULT is not set
+# CONFIG_ARCH_SELECT_MEMORY_MODEL is not set
+# CONFIG_HIGHMEM is not set
+CONFIG_SELECT_MEMORY_MODEL=y
+CONFIG_FLATMEM_MANUAL=y
+# CONFIG_DISCONTIGMEM_MANUAL is not set
+# CONFIG_SPARSEMEM_MANUAL is not set
+CONFIG_FLATMEM=y
+CONFIG_FLAT_NODE_MEM_MAP=y
+CONFIG_PAGEFLAGS_EXTENDED=y
+CONFIG_SPLIT_PTLOCK_CPUS=999999
+# CONFIG_PHYS_ADDR_T_64BIT is not set
+CONFIG_ZONE_DMA_FLAG=0
+CONFIG_VIRT_TO_BUS=y
+# CONFIG_KSM is not set
+CONFIG_DEFAULT_MMAP_MIN_ADDR=4096
+# CONFIG_LEDS is not set
+CONFIG_ALIGNMENT_TRAP=y
+# CONFIG_UACCESS_WITH_MEMCPY is not set
+
+#
+# Boot options
+#
+CONFIG_ZBOOT_ROM_TEXT=0x0
+CONFIG_ZBOOT_ROM_BSS=0x0
+CONFIG_CMDLINE="mem=64M console=ttyS0,115200 initrd=0x21100000,3145728 root=/dev/ram0 rw"
+# CONFIG_XIP_KERNEL is not set
+CONFIG_KEXEC=y
+CONFIG_ATAGS_PROC=y
+
+#
+# CPU Power Management
+#
+CONFIG_CPU_IDLE=y
+CONFIG_CPU_IDLE_GOV_LADDER=y
+CONFIG_CPU_IDLE_GOV_MENU=y
+
+#
+# Floating point emulation
+#
+
+#
+# At least one emulation must be selected
+#
+# CONFIG_VFP is not set
+
+#
+# Userspace binary formats
+#
+CONFIG_BINFMT_ELF=y
+# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
+CONFIG_HAVE_AOUT=y
+# CONFIG_BINFMT_AOUT is not set
+# CONFIG_BINFMT_MISC is not set
+
+#
+# Power management options
+#
+CONFIG_PM=y
+# CONFIG_PM_DEBUG is not set
+CONFIG_PM_SLEEP=y
+CONFIG_SUSPEND=y
+CONFIG_SUSPEND_FREEZER=y
+# CONFIG_APM_EMULATION is not set
+# CONFIG_PM_RUNTIME is not set
+CONFIG_PM_OPS=y
+CONFIG_ARCH_SUSPEND_POSSIBLE=y
+CONFIG_NET=y
+
+#
+# Networking options
+#
+CONFIG_PACKET=y
+CONFIG_UNIX=y
+# CONFIG_NET_KEY is not set
+CONFIG_INET=y
+# CONFIG_IP_MULTICAST is not set
+# CONFIG_IP_ADVANCED_ROUTER is not set
+CONFIG_IP_FIB_HASH=y
+# CONFIG_IP_PNP is not set
+# CONFIG_NET_IPIP is not set
+# CONFIG_NET_IPGRE is not set
+# CONFIG_ARPD is not set
+# CONFIG_SYN_COOKIES is not set
+# CONFIG_INET_AH is not set
+# CONFIG_INET_ESP is not set
+# CONFIG_INET_IPCOMP is not set
+# CONFIG_INET_XFRM_TUNNEL is not set
+# CONFIG_INET_TUNNEL is not set
+# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
+# CONFIG_INET_XFRM_MODE_TUNNEL is not set
+# CONFIG_INET_XFRM_MODE_BEET is not set
+# CONFIG_INET_LRO is not set
+CONFIG_INET_DIAG=y
+CONFIG_INET_TCP_DIAG=y
+# CONFIG_TCP_CONG_ADVANCED is not set
+CONFIG_TCP_CONG_CUBIC=y
+CONFIG_DEFAULT_TCP_CONG="cubic"
+# CONFIG_TCP_MD5SIG is not set
+# CONFIG_IPV6 is not set
+# CONFIG_NETWORK_SECMARK is not set
+# CONFIG_NETFILTER is not set
+# CONFIG_IP_DCCP is not set
+# CONFIG_IP_SCTP is not set
+# CONFIG_RDS is not set
+# CONFIG_TIPC is not set
+# CONFIG_ATM is not set
+# CONFIG_BRIDGE is not set
+# CONFIG_NET_DSA is not set
+# CONFIG_VLAN_8021Q is not set
+# CONFIG_DECNET is not set
+# CONFIG_LLC2 is not set
+# CONFIG_IPX is not set
+# CONFIG_ATALK is not set
+# CONFIG_X25 is not set
+# CONFIG_LAPB is not set
+# CONFIG_ECONET is not set
+# CONFIG_WAN_ROUTER is not set
+# CONFIG_PHONET is not set
+# CONFIG_IEEE802154 is not set
+# CONFIG_NET_SCHED is not set
+# CONFIG_DCB is not set
+
+#
+# Network testing
+#
+# CONFIG_NET_PKTGEN is not set
+# CONFIG_HAMRADIO is not set
+# CONFIG_CAN is not set
+# CONFIG_IRDA is not set
+# CONFIG_BT is not set
+# CONFIG_AF_RXRPC is not set
+# CONFIG_WIRELESS is not set
+# CONFIG_WIMAX is not set
+# CONFIG_RFKILL is not set
+# CONFIG_NET_9P is not set
+
+#
+# Device Drivers
+#
+
+#
+# Generic Driver Options
+#
+CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
+# CONFIG_DEVTMPFS is not set
+CONFIG_STANDALONE=y
+CONFIG_PREVENT_FIRMWARE_BUILD=y
+CONFIG_FW_LOADER=y
+CONFIG_FIRMWARE_IN_KERNEL=y
+CONFIG_EXTRA_FIRMWARE=""
+# CONFIG_SYS_HYPERVISOR is not set
+# CONFIG_CONNECTOR is not set
+CONFIG_MTD=y
+# CONFIG_MTD_DEBUG is not set
+# CONFIG_MTD_TESTS is not set
+CONFIG_MTD_CONCAT=y
+CONFIG_MTD_PARTITIONS=y
+# CONFIG_MTD_REDBOOT_PARTS is not set
+CONFIG_MTD_CMDLINE_PARTS=y
+# CONFIG_MTD_AFS_PARTS is not set
+# CONFIG_MTD_AR7_PARTS is not set
+
+#
+# User Modules And Translation Layers
+#
+CONFIG_MTD_CHAR=y
+CONFIG_MTD_BLKDEVS=y
+CONFIG_MTD_BLOCK=y
+# CONFIG_FTL is not set
+# CONFIG_NFTL is not set
+# CONFIG_INFTL is not set
+# CONFIG_RFD_FTL is not set
+# CONFIG_SSFDC is not set
+# CONFIG_MTD_OOPS is not set
+
+#
+# RAM/ROM/Flash chip drivers
+#
+# CONFIG_MTD_CFI is not set
+# CONFIG_MTD_JEDECPROBE is not set
+CONFIG_MTD_MAP_BANK_WIDTH_1=y
+CONFIG_MTD_MAP_BANK_WIDTH_2=y
+CONFIG_MTD_MAP_BANK_WIDTH_4=y
+# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
+# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
+# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
+CONFIG_MTD_CFI_I1=y
+CONFIG_MTD_CFI_I2=y
+# CONFIG_MTD_CFI_I4 is not set
+# CONFIG_MTD_CFI_I8 is not set
+# CONFIG_MTD_RAM is not set
+# CONFIG_MTD_ROM is not set
+# CONFIG_MTD_ABSENT is not set
+
+#
+# Mapping drivers for chip access
+#
+# CONFIG_MTD_COMPLEX_MAPPINGS is not set
+# CONFIG_MTD_PLATRAM is not set
+
+#
+# Self-contained MTD device drivers
+#
+CONFIG_MTD_DATAFLASH=y
+# CONFIG_MTD_DATAFLASH_WRITE_VERIFY is not set
+# CONFIG_MTD_DATAFLASH_OTP is not set
+# CONFIG_MTD_M25P80 is not set
+# CONFIG_MTD_SST25L is not set
+# CONFIG_MTD_SLRAM is not set
+# CONFIG_MTD_PHRAM is not set
+# CONFIG_MTD_MTDRAM is not set
+# CONFIG_MTD_BLOCK2MTD is not set
+
+#
+# Disk-On-Chip Device Drivers
+#
+# CONFIG_MTD_DOC2000 is not set
+# CONFIG_MTD_DOC2001 is not set
+# CONFIG_MTD_DOC2001PLUS is not set
+CONFIG_MTD_NAND=y
+# CONFIG_MTD_NAND_VERIFY_WRITE is not set
+# CONFIG_MTD_NAND_ECC_SMC is not set
+# CONFIG_MTD_NAND_MUSEUM_IDS is not set
+# CONFIG_MTD_NAND_GPIO is not set
+CONFIG_MTD_NAND_IDS=y
+# CONFIG_MTD_NAND_DISKONCHIP is not set
+CONFIG_MTD_NAND_ATMEL=y
+# CONFIG_MTD_NAND_ATMEL_ECC_HW is not set
+CONFIG_MTD_NAND_ATMEL_ECC_SOFT=y
+# CONFIG_MTD_NAND_ATMEL_ECC_NONE is not set
+# CONFIG_MTD_NAND_NANDSIM is not set
+# CONFIG_MTD_NAND_PLATFORM is not set
+# CONFIG_MTD_ALAUDA is not set
+# CONFIG_MTD_ONENAND is not set
+
+#
+# LPDDR flash memory drivers
+#
+# CONFIG_MTD_LPDDR is not set
+
+#
+# UBI - Unsorted block images
+#
+# CONFIG_MTD_UBI is not set
+# CONFIG_PARPORT is not set
+CONFIG_BLK_DEV=y
+# CONFIG_BLK_DEV_COW_COMMON is not set
+CONFIG_BLK_DEV_LOOP=y
+# CONFIG_BLK_DEV_CRYPTOLOOP is not set
+
+#
+# DRBD disabled because PROC_FS, INET or CONNECTOR not selected
+#
+# CONFIG_BLK_DEV_NBD is not set
+# CONFIG_BLK_DEV_UB is not set
+CONFIG_BLK_DEV_RAM=y
+CONFIG_BLK_DEV_RAM_COUNT=16
+CONFIG_BLK_DEV_RAM_SIZE=8192
+# CONFIG_BLK_DEV_XIP is not set
+# CONFIG_CDROM_PKTCDVD is not set
+# CONFIG_ATA_OVER_ETH is not set
+# CONFIG_MG_DISK is not set
+# CONFIG_MISC_DEVICES is not set
+CONFIG_HAVE_IDE=y
+# CONFIG_IDE is not set
+
+#
+# SCSI device support
+#
+# CONFIG_RAID_ATTRS is not set
+CONFIG_SCSI=y
+CONFIG_SCSI_DMA=y
+# CONFIG_SCSI_TGT is not set
+# CONFIG_SCSI_NETLINK is not set
+CONFIG_SCSI_PROC_FS=y
+
+#
+# SCSI support type (disk, tape, CD-ROM)
+#
+CONFIG_BLK_DEV_SD=y
+# CONFIG_CHR_DEV_ST is not set
+# CONFIG_CHR_DEV_OSST is not set
+# CONFIG_BLK_DEV_SR is not set
+# CONFIG_CHR_DEV_SG is not set
+# CONFIG_CHR_DEV_SCH is not set
+CONFIG_SCSI_MULTI_LUN=y
+# CONFIG_SCSI_CONSTANTS is not set
+# CONFIG_SCSI_LOGGING is not set
+# CONFIG_SCSI_SCAN_ASYNC is not set
+CONFIG_SCSI_WAIT_SCAN=m
+
+#
+# SCSI Transports
+#
+# CONFIG_SCSI_SPI_ATTRS is not set
+# CONFIG_SCSI_FC_ATTRS is not set
+# CONFIG_SCSI_ISCSI_ATTRS is not set
+# CONFIG_SCSI_SAS_LIBSAS is not set
+# CONFIG_SCSI_SRP_ATTRS is not set
+# CONFIG_SCSI_LOWLEVEL is not set
+# CONFIG_SCSI_DH is not set
+# CONFIG_SCSI_OSD_INITIATOR is not set
+# CONFIG_ATA is not set
+# CONFIG_MD is not set
+CONFIG_NETDEVICES=y
+# CONFIG_DUMMY is not set
+# CONFIG_BONDING is not set
+# CONFIG_MACVLAN is not set
+# CONFIG_EQUALIZER is not set
+# CONFIG_TUN is not set
+# CONFIG_VETH is not set
+CONFIG_PHYLIB=y
+
+#
+# MII PHY device drivers
+#
+# CONFIG_MARVELL_PHY is not set
+# CONFIG_DAVICOM_PHY is not set
+# CONFIG_QSEMI_PHY is not set
+# CONFIG_LXT_PHY is not set
+# CONFIG_CICADA_PHY is not set
+# CONFIG_VITESSE_PHY is not set
+# CONFIG_SMSC_PHY is not set
+# CONFIG_BROADCOM_PHY is not set
+# CONFIG_ICPLUS_PHY is not set
+# CONFIG_REALTEK_PHY is not set
+# CONFIG_NATIONAL_PHY is not set
+# CONFIG_STE10XP is not set
+# CONFIG_LSI_ET1011C_PHY is not set
+# CONFIG_FIXED_PHY is not set
+# CONFIG_MDIO_BITBANG is not set
+CONFIG_NET_ETHERNET=y
+# CONFIG_MII is not set
+CONFIG_MACB=y
+# CONFIG_AX88796 is not set
+# CONFIG_SMC91X is not set
+# CONFIG_DM9000 is not set
+# CONFIG_ENC28J60 is not set
+# CONFIG_ETHOC is not set
+# CONFIG_SMC911X is not set
+# CONFIG_SMSC911X is not set
+# CONFIG_DNET is not set
+# CONFIG_IBM_NEW_EMAC_ZMII is not set
+# CONFIG_IBM_NEW_EMAC_RGMII is not set
+# CONFIG_IBM_NEW_EMAC_TAH is not set
+# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
+# CONFIG_IBM_NEW_EMAC_NO_FLOW_CTRL is not set
+# CONFIG_IBM_NEW_EMAC_MAL_CLR_ICINTSTAT is not set
+# CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set
+# CONFIG_B44 is not set
+# CONFIG_KS8842 is not set
+# CONFIG_KS8851 is not set
+# CONFIG_KS8851_MLL is not set
+# CONFIG_NETDEV_1000 is not set
+# CONFIG_NETDEV_10000 is not set
+# CONFIG_WLAN is not set
+
+#
+# Enable WiMAX (Networking options) to see the WiMAX drivers
+#
+
+#
+# USB Network Adapters
+#
+# CONFIG_USB_CATC is not set
+# CONFIG_USB_KAWETH is not set
+# CONFIG_USB_PEGASUS is not set
+# CONFIG_USB_RTL8150 is not set
+# CONFIG_USB_USBNET is not set
+# CONFIG_WAN is not set
+# CONFIG_PPP is not set
+# CONFIG_SLIP is not set
+# CONFIG_NETCONSOLE is not set
+# CONFIG_NETPOLL is not set
+# CONFIG_NET_POLL_CONTROLLER is not set
+# CONFIG_ISDN is not set
+# CONFIG_PHONE is not set
+
+#
+# Input device support
+#
+CONFIG_INPUT=y
+# CONFIG_INPUT_FF_MEMLESS is not set
+# CONFIG_INPUT_POLLDEV is not set
+# CONFIG_INPUT_SPARSEKMAP is not set
+
+#
+# Userland interfaces
+#
+CONFIG_INPUT_MOUSEDEV=y
+# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
+CONFIG_INPUT_MOUSEDEV_SCREEN_X=320
+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=240
+# CONFIG_INPUT_JOYDEV is not set
+# CONFIG_INPUT_EVDEV is not set
+# CONFIG_INPUT_EVBUG is not set
+
+#
+# Input Device Drivers
+#
+# CONFIG_INPUT_KEYBOARD is not set
+# CONFIG_INPUT_MOUSE is not set
+# CONFIG_INPUT_JOYSTICK is not set
+# CONFIG_INPUT_TABLET is not set
+# CONFIG_INPUT_TOUCHSCREEN is not set
+# CONFIG_INPUT_MISC is not set
+
+#
+# Hardware I/O ports
+#
+# CONFIG_SERIO is not set
+# CONFIG_GAMEPORT is not set
+
+#
+# Character devices
+#
+CONFIG_VT=y
+CONFIG_CONSOLE_TRANSLATIONS=y
+CONFIG_VT_CONSOLE=y
+CONFIG_HW_CONSOLE=y
+# CONFIG_VT_HW_CONSOLE_BINDING is not set
+CONFIG_DEVKMEM=y
+# CONFIG_SERIAL_NONSTANDARD is not set
+
+#
+# Serial drivers
+#
+# CONFIG_SERIAL_8250 is not set
+
+#
+# Non-8250 serial port support
+#
+CONFIG_SERIAL_ATMEL=y
+CONFIG_SERIAL_ATMEL_CONSOLE=y
+CONFIG_SERIAL_ATMEL_PDC=y
+# CONFIG_SERIAL_ATMEL_TTYAT is not set
+# CONFIG_SERIAL_MAX3100 is not set
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+# CONFIG_SERIAL_TIMBERDALE is not set
+CONFIG_UNIX98_PTYS=y
+# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set
+# CONFIG_LEGACY_PTYS is not set
+# CONFIG_IPMI_HANDLER is not set
+# CONFIG_HW_RANDOM is not set
+# CONFIG_R3964 is not set
+# CONFIG_RAW_DRIVER is not set
+# CONFIG_TCG_TPM is not set
+CONFIG_I2C=y
+CONFIG_I2C_BOARDINFO=y
+CONFIG_I2C_COMPAT=y
+CONFIG_I2C_CHARDEV=y
+CONFIG_I2C_HELPER_AUTO=y
+CONFIG_I2C_ALGOBIT=y
+
+#
+# I2C Hardware Bus support
+#
+
+#
+# I2C system bus drivers (mostly embedded / system-on-chip)
+#
+# CONFIG_I2C_DESIGNWARE is not set
+CONFIG_I2C_GPIO=y
+# CONFIG_I2C_OCORES is not set
+# CONFIG_I2C_SIMTEC is not set
+# CONFIG_I2C_XILINX is not set
+
+#
+# External I2C/SMBus adapter drivers
+#
+# CONFIG_I2C_PARPORT_LIGHT is not set
+# CONFIG_I2C_TAOS_EVM is not set
+# CONFIG_I2C_TINY_USB is not set
+
+#
+# Other I2C/SMBus bus drivers
+#
+# CONFIG_I2C_PCA_PLATFORM is not set
+# CONFIG_I2C_STUB is not set
+
+#
+# Miscellaneous I2C Chip support
+#
+# CONFIG_SENSORS_TSL2550 is not set
+# CONFIG_I2C_DEBUG_CORE is not set
+# CONFIG_I2C_DEBUG_ALGO is not set
+# CONFIG_I2C_DEBUG_BUS is not set
+# CONFIG_I2C_DEBUG_CHIP is not set
+CONFIG_SPI=y
+CONFIG_SPI_MASTER=y
+
+#
+# SPI Master Controller Drivers
+#
+CONFIG_SPI_ATMEL=y
+# CONFIG_SPI_BITBANG is not set
+# CONFIG_SPI_GPIO is not set
+# CONFIG_SPI_XILINX is not set
+# CONFIG_SPI_DESIGNWARE is not set
+
+#
+# SPI Protocol Masters
+#
+CONFIG_SPI_SPIDEV=y
+# CONFIG_SPI_TLE62X0 is not set
+
+#
+# PPS support
+#
+# CONFIG_PPS is not set
+CONFIG_ARCH_REQUIRE_GPIOLIB=y
+CONFIG_GPIOLIB=y
+CONFIG_GPIO_SYSFS=y
+
+#
+# Memory mapped GPIO expanders:
+#
+# CONFIG_GPIO_IT8761E is not set
+
+#
+# I2C GPIO expanders:
+#
+# CONFIG_GPIO_MAX7300 is not set
+# CONFIG_GPIO_MAX732X is not set
+# CONFIG_GPIO_PCA953X is not set
+# CONFIG_GPIO_PCF857X is not set
+# CONFIG_GPIO_ADP5588 is not set
+
+#
+# PCI GPIO expanders:
+#
+
+#
+# SPI GPIO expanders:
+#
+# CONFIG_GPIO_MAX7301 is not set
+# CONFIG_GPIO_MCP23S08 is not set
+# CONFIG_GPIO_MC33880 is not set
+
+#
+# AC97 GPIO expanders:
+#
+CONFIG_W1=y
+
+#
+# 1-wire Bus Masters
+#
+# CONFIG_W1_MASTER_DS2490 is not set
+# CONFIG_W1_MASTER_DS2482 is not set
+# CONFIG_W1_MASTER_DS1WM is not set
+CONFIG_W1_MASTER_GPIO=y
+
+#
+# 1-wire Slaves
+#
+CONFIG_W1_SLAVE_THERM=y
+# CONFIG_W1_SLAVE_SMEM is not set
+CONFIG_W1_SLAVE_DS2431=y
+# CONFIG_W1_SLAVE_DS2433 is not set
+# CONFIG_W1_SLAVE_DS2760 is not set
+# CONFIG_W1_SLAVE_BQ27000 is not set
+# CONFIG_POWER_SUPPLY is not set
+# CONFIG_HWMON is not set
+# CONFIG_THERMAL is not set
+CONFIG_WATCHDOG=y
+# CONFIG_WATCHDOG_NOWAYOUT is not set
+
+#
+# Watchdog Device Drivers
+#
+# CONFIG_SOFT_WATCHDOG is not set
+# CONFIG_MAX63XX_WATCHDOG is not set
+CONFIG_AT91SAM9X_WATCHDOG=y
+
+#
+# USB-based Watchdog Cards
+#
+# CONFIG_USBPCWATCHDOG is not set
+CONFIG_SSB_POSSIBLE=y
+
+#
+# Sonics Silicon Backplane
+#
+# CONFIG_SSB is not set
+
+#
+# Multifunction device drivers
+#
+# CONFIG_MFD_CORE is not set
+# CONFIG_MFD_88PM860X is not set
+# CONFIG_MFD_SM501 is not set
+# CONFIG_MFD_ASIC3 is not set
+# CONFIG_HTC_EGPIO is not set
+# CONFIG_HTC_PASIC3 is not set
+# CONFIG_HTC_I2CPLD is not set
+# CONFIG_TPS65010 is not set
+# CONFIG_TWL4030_CORE is not set
+# CONFIG_MFD_TMIO is not set
+# CONFIG_MFD_T7L66XB is not set
+# CONFIG_MFD_TC6387XB is not set
+# CONFIG_MFD_TC6393XB is not set
+# CONFIG_PMIC_DA903X is not set
+# CONFIG_PMIC_ADP5520 is not set
+# CONFIG_MFD_MAX8925 is not set
+# CONFIG_MFD_WM8400 is not set
+# CONFIG_MFD_WM831X is not set
+# CONFIG_MFD_WM8350_I2C is not set
+# CONFIG_MFD_WM8994 is not set
+# CONFIG_MFD_PCF50633 is not set
+# CONFIG_MFD_MC13783 is not set
+# CONFIG_AB3100_CORE is not set
+# CONFIG_EZX_PCAP is not set
+# CONFIG_AB4500_CORE is not set
+# CONFIG_REGULATOR is not set
+# CONFIG_MEDIA_SUPPORT is not set
+
+#
+# Graphics support
+#
+# CONFIG_VGASTATE is not set
+# CONFIG_VIDEO_OUTPUT_CONTROL is not set
+# CONFIG_FB is not set
+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
+
+#
+# Display device support
+#
+# CONFIG_DISPLAY_SUPPORT is not set
+
+#
+# Console display driver support
+#
+# CONFIG_VGA_CONSOLE is not set
+CONFIG_DUMMY_CONSOLE=y
+# CONFIG_SOUND is not set
+# CONFIG_HID_SUPPORT is not set
+CONFIG_USB_SUPPORT=y
+CONFIG_USB_ARCH_HAS_HCD=y
+CONFIG_USB_ARCH_HAS_OHCI=y
+# CONFIG_USB_ARCH_HAS_EHCI is not set
+CONFIG_USB=y
+# CONFIG_USB_DEBUG is not set
+# CONFIG_USB_ANNOUNCE_NEW_DEVICES is not set
+
+#
+# Miscellaneous USB options
+#
+CONFIG_USB_DEVICEFS=y
+# CONFIG_USB_DEVICE_CLASS is not set
+# CONFIG_USB_DYNAMIC_MINORS is not set
+# CONFIG_USB_OTG is not set
+CONFIG_USB_MON=y
+# CONFIG_USB_WUSB is not set
+# CONFIG_USB_WUSB_CBAF is not set
+
+#
+# USB Host Controller Drivers
+#
+# CONFIG_USB_C67X00_HCD is not set
+# CONFIG_USB_OXU210HP_HCD is not set
+# CONFIG_USB_ISP116X_HCD is not set
+# CONFIG_USB_ISP1760_HCD is not set
+# CONFIG_USB_ISP1362_HCD is not set
+CONFIG_USB_OHCI_HCD=y
+# CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set
+# CONFIG_USB_OHCI_BIG_ENDIAN_MMIO is not set
+CONFIG_USB_OHCI_LITTLE_ENDIAN=y
+# CONFIG_USB_SL811_HCD is not set
+# CONFIG_USB_R8A66597_HCD is not set
+# CONFIG_USB_HWA_HCD is not set
+# CONFIG_USB_MUSB_HDRC is not set
+# CONFIG_USB_GADGET_MUSB_HDRC is not set
+
+#
+# USB Device Class drivers
+#
+# CONFIG_USB_ACM is not set
+# CONFIG_USB_PRINTER is not set
+# CONFIG_USB_WDM is not set
+# CONFIG_USB_TMC is not set
+
+#
+# NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may
+#
+
+#
+# also be needed; see USB_STORAGE Help for more info
+#
+CONFIG_USB_STORAGE=y
+# CONFIG_USB_STORAGE_DEBUG is not set
+# CONFIG_USB_STORAGE_DATAFAB is not set
+# CONFIG_USB_STORAGE_FREECOM is not set
+# CONFIG_USB_STORAGE_ISD200 is not set
+# CONFIG_USB_STORAGE_USBAT is not set
+# CONFIG_USB_STORAGE_SDDR09 is not set
+# CONFIG_USB_STORAGE_SDDR55 is not set
+# CONFIG_USB_STORAGE_JUMPSHOT is not set
+# CONFIG_USB_STORAGE_ALAUDA is not set
+# CONFIG_USB_STORAGE_ONETOUCH is not set
+# CONFIG_USB_STORAGE_KARMA is not set
+# CONFIG_USB_STORAGE_CYPRESS_ATACB is not set
+# CONFIG_USB_LIBUSUAL is not set
+
+#
+# USB Imaging devices
+#
+# CONFIG_USB_MDC800 is not set
+# CONFIG_USB_MICROTEK is not set
+
+#
+# USB port drivers
+#
+# CONFIG_USB_SERIAL is not set
+
+#
+# USB Miscellaneous drivers
+#
+# CONFIG_USB_EMI62 is not set
+# CONFIG_USB_EMI26 is not set
+# CONFIG_USB_ADUTUX is not set
+# CONFIG_USB_SEVSEG is not set
+# CONFIG_USB_RIO500 is not set
+# CONFIG_USB_LEGOTOWER is not set
+# CONFIG_USB_LCD is not set
+# CONFIG_USB_LED is not set
+# CONFIG_USB_CYPRESS_CY7C63 is not set
+# CONFIG_USB_CYTHERM is not set
+# CONFIG_USB_IDMOUSE is not set
+# CONFIG_USB_FTDI_ELAN is not set
+# CONFIG_USB_APPLEDISPLAY is not set
+# CONFIG_USB_LD is not set
+# CONFIG_USB_TRANCEVIBRATOR is not set
+# CONFIG_USB_IOWARRIOR is not set
+# CONFIG_USB_TEST is not set
+# CONFIG_USB_ISIGHTFW is not set
+CONFIG_USB_GADGET=m
+# CONFIG_USB_GADGET_DEBUG_FILES is not set
+CONFIG_USB_GADGET_VBUS_DRAW=2
+CONFIG_USB_GADGET_SELECTED=y
+CONFIG_USB_GADGET_AT91=y
+CONFIG_USB_AT91=m
+# CONFIG_USB_GADGET_ATMEL_USBA is not set
+# CONFIG_USB_GADGET_FSL_USB2 is not set
+# CONFIG_USB_GADGET_LH7A40X is not set
+# CONFIG_USB_GADGET_OMAP is not set
+# CONFIG_USB_GADGET_PXA25X is not set
+# CONFIG_USB_GADGET_R8A66597 is not set
+# CONFIG_USB_GADGET_PXA27X is not set
+# CONFIG_USB_GADGET_S3C_HSOTG is not set
+# CONFIG_USB_GADGET_IMX is not set
+# CONFIG_USB_GADGET_S3C2410 is not set
+# CONFIG_USB_GADGET_M66592 is not set
+# CONFIG_USB_GADGET_AMD5536UDC is not set
+# CONFIG_USB_GADGET_FSL_QE is not set
+# CONFIG_USB_GADGET_CI13XXX is not set
+# CONFIG_USB_GADGET_NET2280 is not set
+# CONFIG_USB_GADGET_GOKU is not set
+# CONFIG_USB_GADGET_LANGWELL is not set
+# CONFIG_USB_GADGET_DUMMY_HCD is not set
+# CONFIG_USB_GADGET_DUALSPEED is not set
+CONFIG_USB_ZERO=m
+# CONFIG_USB_AUDIO is not set
+CONFIG_USB_ETH=m
+CONFIG_USB_ETH_RNDIS=y
+# CONFIG_USB_ETH_EEM is not set
+# CONFIG_USB_GADGETFS is not set
+CONFIG_USB_FILE_STORAGE=m
+# CONFIG_USB_FILE_STORAGE_TEST is not set
+# CONFIG_USB_MASS_STORAGE is not set
+CONFIG_USB_G_SERIAL=m
+# CONFIG_USB_MIDI_GADGET is not set
+# CONFIG_USB_G_PRINTER is not set
+# CONFIG_USB_CDC_COMPOSITE is not set
+# CONFIG_USB_G_NOKIA is not set
+# CONFIG_USB_G_MULTI is not set
+
+#
+# OTG and related infrastructure
+#
+# CONFIG_USB_GPIO_VBUS is not set
+# CONFIG_USB_ULPI is not set
+# CONFIG_NOP_USB_XCEIV is not set
+CONFIG_MMC=y
+# CONFIG_MMC_DEBUG is not set
+# CONFIG_MMC_UNSAFE_RESUME is not set
+
+#
+# MMC/SD/SDIO Card Drivers
+#
+CONFIG_MMC_BLOCK=y
+CONFIG_MMC_BLOCK_BOUNCE=y
+# CONFIG_SDIO_UART is not set
+# CONFIG_MMC_TEST is not set
+
+#
+# MMC/SD/SDIO Host Controller Drivers
+#
+# CONFIG_MMC_SDHCI is not set
+# CONFIG_MMC_AT91 is not set
+CONFIG_MMC_ATMELMCI=y
+# CONFIG_MMC_SPI is not set
+# CONFIG_MEMSTICK is not set
+CONFIG_NEW_LEDS=y
+CONFIG_LEDS_CLASS=y
+
+#
+# LED drivers
+#
+# CONFIG_LEDS_PCA9532 is not set
+CONFIG_LEDS_GPIO=y
+CONFIG_LEDS_GPIO_PLATFORM=y
+# CONFIG_LEDS_LP3944 is not set
+# CONFIG_LEDS_PCA955X is not set
+# CONFIG_LEDS_DAC124S085 is not set
+# CONFIG_LEDS_BD2802 is not set
+# CONFIG_LEDS_LT3593 is not set
+
+#
+# LED Triggers
+#
+CONFIG_LEDS_TRIGGERS=y
+CONFIG_LEDS_TRIGGER_TIMER=y
+CONFIG_LEDS_TRIGGER_HEARTBEAT=y
+# CONFIG_LEDS_TRIGGER_BACKLIGHT is not set
+# CONFIG_LEDS_TRIGGER_GPIO is not set
+CONFIG_LEDS_TRIGGER_DEFAULT_ON=y
+
+#
+# iptables trigger is under Netfilter config (LED target)
+#
+# CONFIG_ACCESSIBILITY is not set
+CONFIG_RTC_LIB=y
+CONFIG_RTC_CLASS=y
+CONFIG_RTC_HCTOSYS=y
+CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
+# CONFIG_RTC_DEBUG is not set
+
+#
+# RTC interfaces
+#
+CONFIG_RTC_INTF_SYSFS=y
+CONFIG_RTC_INTF_PROC=y
+CONFIG_RTC_INTF_DEV=y
+# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set
+# CONFIG_RTC_DRV_TEST is not set
+
+#
+# I2C RTC drivers
+#
+# CONFIG_RTC_DRV_DS1307 is not set
+# CONFIG_RTC_DRV_DS1374 is not set
+# CONFIG_RTC_DRV_DS1672 is not set
+# CONFIG_RTC_DRV_MAX6900 is not set
+# CONFIG_RTC_DRV_RS5C372 is not set
+# CONFIG_RTC_DRV_ISL1208 is not set
+# CONFIG_RTC_DRV_X1205 is not set
+# CONFIG_RTC_DRV_PCF8563 is not set
+# CONFIG_RTC_DRV_PCF8583 is not set
+# CONFIG_RTC_DRV_M41T80 is not set
+# CONFIG_RTC_DRV_BQ32K is not set
+# CONFIG_RTC_DRV_S35390A is not set
+# CONFIG_RTC_DRV_FM3130 is not set
+# CONFIG_RTC_DRV_RX8581 is not set
+# CONFIG_RTC_DRV_RX8025 is not set
+
+#
+# SPI RTC drivers
+#
+# CONFIG_RTC_DRV_M41T94 is not set
+# CONFIG_RTC_DRV_DS1305 is not set
+# CONFIG_RTC_DRV_DS1390 is not set
+# CONFIG_RTC_DRV_MAX6902 is not set
+# CONFIG_RTC_DRV_R9701 is not set
+# CONFIG_RTC_DRV_RS5C348 is not set
+# CONFIG_RTC_DRV_DS3234 is not set
+# CONFIG_RTC_DRV_PCF2123 is not set
+
+#
+# Platform RTC drivers
+#
+# CONFIG_RTC_DRV_CMOS is not set
+# CONFIG_RTC_DRV_DS1286 is not set
+# CONFIG_RTC_DRV_DS1511 is not set
+# CONFIG_RTC_DRV_DS1553 is not set
+# CONFIG_RTC_DRV_DS1742 is not set
+# CONFIG_RTC_DRV_STK17TA8 is not set
+# CONFIG_RTC_DRV_M48T86 is not set
+# CONFIG_RTC_DRV_M48T35 is not set
+# CONFIG_RTC_DRV_M48T59 is not set
+# CONFIG_RTC_DRV_MSM6242 is not set
+# CONFIG_RTC_DRV_BQ4802 is not set
+# CONFIG_RTC_DRV_RP5C01 is not set
+# CONFIG_RTC_DRV_V3020 is not set
+
+#
+# on-CPU RTC drivers
+#
+CONFIG_RTC_DRV_AT91SAM9=y
+CONFIG_RTC_DRV_AT91SAM9_RTT=0
+CONFIG_RTC_DRV_AT91SAM9_GPBR=0
+# CONFIG_DMADEVICES is not set
+# CONFIG_AUXDISPLAY is not set
+# CONFIG_UIO is not set
+
+#
+# TI VLYNQ
+#
+# CONFIG_STAGING is not set
+
+#
+# File systems
+#
+CONFIG_EXT2_FS=y
+# CONFIG_EXT2_FS_XATTR is not set
+# CONFIG_EXT2_FS_XIP is not set
+CONFIG_EXT3_FS=y
+# CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set
+CONFIG_EXT3_FS_XATTR=y
+# CONFIG_EXT3_FS_POSIX_ACL is not set
+# CONFIG_EXT3_FS_SECURITY is not set
+# CONFIG_EXT4_FS is not set
+CONFIG_JBD=y
+CONFIG_FS_MBCACHE=y
+# CONFIG_REISERFS_FS is not set
+# CONFIG_JFS_FS is not set
+# CONFIG_FS_POSIX_ACL is not set
+# CONFIG_XFS_FS is not set
+# CONFIG_OCFS2_FS is not set
+# CONFIG_BTRFS_FS is not set
+# CONFIG_NILFS2_FS is not set
+CONFIG_FILE_LOCKING=y
+CONFIG_FSNOTIFY=y
+CONFIG_DNOTIFY=y
+CONFIG_INOTIFY=y
+CONFIG_INOTIFY_USER=y
+# CONFIG_QUOTA is not set
+# CONFIG_AUTOFS_FS is not set
+# CONFIG_AUTOFS4_FS is not set
+# CONFIG_FUSE_FS is not set
+
+#
+# Caches
+#
+# CONFIG_FSCACHE is not set
+
+#
+# CD-ROM/DVD Filesystems
+#
+# CONFIG_ISO9660_FS is not set
+# CONFIG_UDF_FS is not set
+
+#
+# DOS/FAT/NT Filesystems
+#
+CONFIG_FAT_FS=y
+# CONFIG_MSDOS_FS is not set
+CONFIG_VFAT_FS=y
+CONFIG_FAT_DEFAULT_CODEPAGE=437
+CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
+# CONFIG_NTFS_FS is not set
+
+#
+# Pseudo filesystems
+#
+CONFIG_PROC_FS=y
+CONFIG_PROC_SYSCTL=y
+CONFIG_PROC_PAGE_MONITOR=y
+CONFIG_SYSFS=y
+CONFIG_TMPFS=y
+# CONFIG_TMPFS_POSIX_ACL is not set
+# CONFIG_HUGETLB_PAGE is not set
+# CONFIG_CONFIGFS_FS is not set
+CONFIG_MISC_FILESYSTEMS=y
+# CONFIG_ADFS_FS is not set
+# CONFIG_AFFS_FS is not set
+# CONFIG_HFS_FS is not set
+# CONFIG_HFSPLUS_FS is not set
+# CONFIG_BEFS_FS is not set
+# CONFIG_BFS_FS is not set
+# CONFIG_EFS_FS is not set
+CONFIG_JFFS2_FS=y
+CONFIG_JFFS2_FS_DEBUG=0
+CONFIG_JFFS2_FS_WRITEBUFFER=y
+# CONFIG_JFFS2_FS_WBUF_VERIFY is not set
+CONFIG_JFFS2_SUMMARY=y
+# CONFIG_JFFS2_FS_XATTR is not set
+# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
+CONFIG_JFFS2_ZLIB=y
+# CONFIG_JFFS2_LZO is not set
+CONFIG_JFFS2_RTIME=y
+# CONFIG_JFFS2_RUBIN is not set
+# CONFIG_LOGFS is not set
+# CONFIG_CRAMFS is not set
+# CONFIG_SQUASHFS is not set
+# CONFIG_VXFS_FS is not set
+# CONFIG_MINIX_FS is not set
+# CONFIG_OMFS_FS is not set
+# CONFIG_HPFS_FS is not set
+# CONFIG_QNX4FS_FS is not set
+# CONFIG_ROMFS_FS is not set
+# CONFIG_SYSV_FS is not set
+# CONFIG_UFS_FS is not set
+CONFIG_NETWORK_FILESYSTEMS=y
+CONFIG_NFS_FS=y
+CONFIG_NFS_V3=y
+# CONFIG_NFS_V3_ACL is not set
+# CONFIG_NFS_V4 is not set
+# CONFIG_NFSD is not set
+CONFIG_LOCKD=y
+CONFIG_LOCKD_V4=y
+CONFIG_NFS_COMMON=y
+CONFIG_SUNRPC=y
+# CONFIG_RPCSEC_GSS_KRB5 is not set
+# CONFIG_RPCSEC_GSS_SPKM3 is not set
+# CONFIG_SMB_FS is not set
+# CONFIG_CIFS is not set
+# CONFIG_NCP_FS is not set
+# CONFIG_CODA_FS is not set
+# CONFIG_AFS_FS is not set
+
+#
+# Partition Types
+#
+# CONFIG_PARTITION_ADVANCED is not set
+CONFIG_MSDOS_PARTITION=y
+CONFIG_NLS=y
+CONFIG_NLS_DEFAULT="iso8859-1"
+CONFIG_NLS_CODEPAGE_437=y
+# CONFIG_NLS_CODEPAGE_737 is not set
+# CONFIG_NLS_CODEPAGE_775 is not set
+CONFIG_NLS_CODEPAGE_850=y
+# CONFIG_NLS_CODEPAGE_852 is not set
+# CONFIG_NLS_CODEPAGE_855 is not set
+# CONFIG_NLS_CODEPAGE_857 is not set
+# CONFIG_NLS_CODEPAGE_860 is not set
+# CONFIG_NLS_CODEPAGE_861 is not set
+# CONFIG_NLS_CODEPAGE_862 is not set
+# CONFIG_NLS_CODEPAGE_863 is not set
+# CONFIG_NLS_CODEPAGE_864 is not set
+# CONFIG_NLS_CODEPAGE_865 is not set
+# CONFIG_NLS_CODEPAGE_866 is not set
+# CONFIG_NLS_CODEPAGE_869 is not set
+# CONFIG_NLS_CODEPAGE_936 is not set
+# CONFIG_NLS_CODEPAGE_950 is not set
+# CONFIG_NLS_CODEPAGE_932 is not set
+# CONFIG_NLS_CODEPAGE_949 is not set
+# CONFIG_NLS_CODEPAGE_874 is not set
+# CONFIG_NLS_ISO8859_8 is not set
+# CONFIG_NLS_CODEPAGE_1250 is not set
+# CONFIG_NLS_CODEPAGE_1251 is not set
+# CONFIG_NLS_ASCII is not set
+CONFIG_NLS_ISO8859_1=y
+# CONFIG_NLS_ISO8859_2 is not set
+# CONFIG_NLS_ISO8859_3 is not set
+# CONFIG_NLS_ISO8859_4 is not set
+# CONFIG_NLS_ISO8859_5 is not set
+# CONFIG_NLS_ISO8859_6 is not set
+# CONFIG_NLS_ISO8859_7 is not set
+# CONFIG_NLS_ISO8859_9 is not set
+# CONFIG_NLS_ISO8859_13 is not set
+# CONFIG_NLS_ISO8859_14 is not set
+CONFIG_NLS_ISO8859_15=y
+# CONFIG_NLS_KOI8_R is not set
+# CONFIG_NLS_KOI8_U is not set
+CONFIG_NLS_UTF8=y
+# CONFIG_DLM is not set
+
+#
+# Kernel hacking
+#
+# CONFIG_PRINTK_TIME is not set
+CONFIG_ENABLE_WARN_DEPRECATED=y
+CONFIG_ENABLE_MUST_CHECK=y
+CONFIG_FRAME_WARN=1024
+# CONFIG_MAGIC_SYSRQ is not set
+# CONFIG_STRIP_ASM_SYMS is not set
+# CONFIG_UNUSED_SYMBOLS is not set
+# CONFIG_DEBUG_FS is not set
+# CONFIG_HEADERS_CHECK is not set
+# CONFIG_DEBUG_KERNEL is not set
+CONFIG_DEBUG_BUGVERBOSE=y
+CONFIG_DEBUG_MEMORY_INIT=y
+CONFIG_FRAME_POINTER=y
+# CONFIG_RCU_CPU_STALL_DETECTOR is not set
+# CONFIG_LATENCYTOP is not set
+# CONFIG_SYSCTL_SYSCALL_CHECK is not set
+CONFIG_HAVE_FUNCTION_TRACER=y
+CONFIG_TRACING_SUPPORT=y
+# CONFIG_FTRACE is not set
+# CONFIG_SAMPLES is not set
+CONFIG_HAVE_ARCH_KGDB=y
+# CONFIG_ARM_UNWIND is not set
+# CONFIG_DEBUG_USER is not set
+# CONFIG_OC_ETM is not set
+
+#
+# Security options
+#
+# CONFIG_KEYS is not set
+# CONFIG_SECURITY is not set
+# CONFIG_SECURITYFS is not set
+# CONFIG_DEFAULT_SECURITY_SELINUX is not set
+# CONFIG_DEFAULT_SECURITY_SMACK is not set
+# CONFIG_DEFAULT_SECURITY_TOMOYO is not set
+CONFIG_DEFAULT_SECURITY_DAC=y
+CONFIG_DEFAULT_SECURITY=""
+# CONFIG_CRYPTO is not set
+# CONFIG_BINARY_PRINTF is not set
+
+#
+# Library routines
+#
+CONFIG_BITREVERSE=y
+CONFIG_GENERIC_FIND_LAST_BIT=y
+# CONFIG_CRC_CCITT is not set
+# CONFIG_CRC16 is not set
+# CONFIG_CRC_T10DIF is not set
+# CONFIG_CRC_ITU_T is not set
+CONFIG_CRC32=y
+# CONFIG_CRC7 is not set
+# CONFIG_LIBCRC32C is not set
+CONFIG_ZLIB_INFLATE=y
+CONFIG_ZLIB_DEFLATE=y
+CONFIG_LZO_DECOMPRESS=y
+CONFIG_DECOMPRESS_GZIP=y
+CONFIG_DECOMPRESS_BZIP2=y
+CONFIG_DECOMPRESS_LZMA=y
+CONFIG_DECOMPRESS_LZO=y
+CONFIG_HAS_IOMEM=y
+CONFIG_HAS_IOPORT=y
+CONFIG_HAS_DMA=y
+CONFIG_NLATTR=y
+CONFIG_GENERIC_ATOMIC64=y
index 04be3bd..c0f4e7b 100644 (file)
@@ -1,21 +1,30 @@
 #ifndef __ASM_ARM_HARDWARE_ARM_TIMER_H
 #define __ASM_ARM_HARDWARE_ARM_TIMER_H
 
-#define TIMER_LOAD     0x00
-#define TIMER_VALUE    0x04
-#define TIMER_CTRL     0x08
-#define TIMER_CTRL_ONESHOT     (1 << 0)
-#define TIMER_CTRL_32BIT       (1 << 1)
-#define TIMER_CTRL_DIV1                (0 << 2)
-#define TIMER_CTRL_DIV16       (1 << 2)
-#define TIMER_CTRL_DIV256      (2 << 2)
-#define TIMER_CTRL_IE          (1 << 5)        /* Interrupt Enable (versatile only) */
-#define TIMER_CTRL_PERIODIC    (1 << 6)
-#define TIMER_CTRL_ENABLE      (1 << 7)
+/*
+ * ARM timer implementation, found in Integrator, Versatile and Realview
+ * platforms.  Not all platforms support all registers and bits in these
+ * registers, so we mark them with A for Integrator AP, C for Integrator
+ * CP, V for Versatile and R for Realview.
+ *
+ * Integrator AP has 16-bit timers, Integrator CP, Versatile and Realview
+ * can have 16-bit or 32-bit selectable via a bit in the control register.
+ */
+#define TIMER_LOAD     0x00                    /* ACVR rw */
+#define TIMER_VALUE    0x04                    /* ACVR ro */
+#define TIMER_CTRL     0x08                    /* ACVR rw */
+#define TIMER_CTRL_ONESHOT     (1 << 0)        /*  CVR */
+#define TIMER_CTRL_32BIT       (1 << 1)        /*  CVR */
+#define TIMER_CTRL_DIV1                (0 << 2)        /* ACVR */
+#define TIMER_CTRL_DIV16       (1 << 2)        /* ACVR */
+#define TIMER_CTRL_DIV256      (2 << 2)        /* ACVR */
+#define TIMER_CTRL_IE          (1 << 5)        /*   VR */
+#define TIMER_CTRL_PERIODIC    (1 << 6)        /* ACVR */
+#define TIMER_CTRL_ENABLE      (1 << 7)        /* ACVR */
 
-#define TIMER_INTCLR   0x0c
-#define TIMER_RIS      0x10
-#define TIMER_MIS      0x14
-#define TIMER_BGLOAD   0x18
+#define TIMER_INTCLR   0x0c                    /* ACVR wo */
+#define TIMER_RIS      0x10                    /*  CVR ro */
+#define TIMER_MIS      0x14                    /*  CVR ro */
+#define TIMER_BGLOAD   0x18                    /*  CVR rw */
 
 #endif
index cdb9022..6bcba48 100644 (file)
@@ -21,6 +21,9 @@
 #define __ASM_ARM_HARDWARE_L2X0_H
 
 #define L2X0_CACHE_ID                  0x000
+#define   L2X0_CACHE_ID_PART_MASK      (0xf << 6)
+#define   L2X0_CACHE_ID_PART_L210      (1 << 6)
+#define   L2X0_CACHE_ID_PART_L310      (3 << 6)
 #define L2X0_CACHE_TYPE                        0x004
 #define L2X0_CTRL                      0x100
 #define L2X0_AUX_CTRL                  0x104
diff --git a/arch/arm/include/asm/hardware/icst.h b/arch/arm/include/asm/hardware/icst.h
new file mode 100644 (file)
index 0000000..10382a3
--- /dev/null
@@ -0,0 +1,59 @@
+/*
+ *  arch/arm/include/asm/hardware/icst.h
+ *
+ *  Copyright (C) 2003 Deep Blue Solutions, Ltd, All Rights Reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ *  Support functions for calculating clocks/divisors for the ICST
+ *  clock generators.  See http://www.icst.com/ for more information
+ *  on these devices.
+ */
+#ifndef ASMARM_HARDWARE_ICST_H
+#define ASMARM_HARDWARE_ICST_H
+
+struct icst_params {
+       unsigned long   ref;
+       unsigned long   vco_max;        /* inclusive */
+       unsigned long   vco_min;        /* exclusive */
+       unsigned short  vd_min;         /* inclusive */
+       unsigned short  vd_max;         /* inclusive */
+       unsigned char   rd_min;         /* inclusive */
+       unsigned char   rd_max;         /* inclusive */
+       const unsigned char *s2div;     /* chip specific s2div array */
+       const unsigned char *idx2s;     /* chip specific idx2s array */
+};
+
+struct icst_vco {
+       unsigned short  v;
+       unsigned char   r;
+       unsigned char   s;
+};
+
+unsigned long icst_hz(const struct icst_params *p, struct icst_vco vco);
+struct icst_vco icst_hz_to_vco(const struct icst_params *p, unsigned long freq);
+
+/*
+ * ICST307 VCO frequency must be between 6MHz and 200MHz (3.3 or 5V).
+ * This frequency is pre-output divider.
+ */
+#define ICST307_VCO_MIN        6000000
+#define ICST307_VCO_MAX        200000000
+
+extern const unsigned char icst307_s2div[];
+extern const unsigned char icst307_idx2s[];
+
+/*
+ * ICST525 VCO frequency must be between 10MHz and 200MHz (3V) or 320MHz (5V).
+ * This frequency is pre-output divider.
+ */
+#define ICST525_VCO_MIN                10000000
+#define ICST525_VCO_MAX_3V     200000000
+#define ICST525_VCO_MAX_5V     320000000
+
+extern const unsigned char icst525_s2div[];
+extern const unsigned char icst525_idx2s[];
+
+#endif
diff --git a/arch/arm/include/asm/hardware/icst307.h b/arch/arm/include/asm/hardware/icst307.h
deleted file mode 100644 (file)
index 554f128..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- *  arch/arm/include/asm/hardware/icst307.h
- *
- *  Copyright (C) 2003 Deep Blue Solutions, Ltd, All Rights Reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- *  Support functions for calculating clocks/divisors for the ICS307
- *  clock generators.  See http://www.icst.com/ for more information
- *  on these devices.
- *
- *  This file is similar to the icst525.h file
- */
-#ifndef ASMARM_HARDWARE_ICST307_H
-#define ASMARM_HARDWARE_ICST307_H
-
-struct icst307_params {
-       unsigned long   ref;
-       unsigned long   vco_max;        /* inclusive */
-       unsigned short  vd_min;         /* inclusive */
-       unsigned short  vd_max;         /* inclusive */
-       unsigned char   rd_min;         /* inclusive */
-       unsigned char   rd_max;         /* inclusive */
-};
-
-struct icst307_vco {
-       unsigned short  v;
-       unsigned char   r;
-       unsigned char   s;
-};
-
-unsigned long icst307_khz(const struct icst307_params *p, struct icst307_vco vco);
-struct icst307_vco icst307_khz_to_vco(const struct icst307_params *p, unsigned long freq);
-struct icst307_vco icst307_ps_to_vco(const struct icst307_params *p, unsigned long period);
-
-#endif
diff --git a/arch/arm/include/asm/hardware/icst525.h b/arch/arm/include/asm/hardware/icst525.h
deleted file mode 100644 (file)
index 58f0dc4..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- *  arch/arm/include/asm/hardware/icst525.h
- *
- *  Copyright (C) 2003 Deep Blue Solutions, Ltd, All Rights Reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- *  Support functions for calculating clocks/divisors for the ICST525
- *  clock generators.  See http://www.icst.com/ for more information
- *  on these devices.
- */
-#ifndef ASMARM_HARDWARE_ICST525_H
-#define ASMARM_HARDWARE_ICST525_H
-
-struct icst525_params {
-       unsigned long   ref;
-       unsigned long   vco_max;        /* inclusive */
-       unsigned short  vd_min;         /* inclusive */
-       unsigned short  vd_max;         /* inclusive */
-       unsigned char   rd_min;         /* inclusive */
-       unsigned char   rd_max;         /* inclusive */
-};
-
-struct icst525_vco {
-       unsigned short  v;
-       unsigned char   r;
-       unsigned char   s;
-};
-
-unsigned long icst525_khz(const struct icst525_params *p, struct icst525_vco vco);
-struct icst525_vco icst525_khz_to_vco(const struct icst525_params *p, unsigned long freq);
-struct icst525_vco icst525_ps_to_vco(const struct icst525_params *p, unsigned long period);
-
-#endif
diff --git a/arch/arm/include/asm/hardware/pl330.h b/arch/arm/include/asm/hardware/pl330.h
new file mode 100644 (file)
index 0000000..575fa81
--- /dev/null
@@ -0,0 +1,217 @@
+/* linux/include/asm/hardware/pl330.h
+ *
+ * Copyright (C) 2010 Samsung Electronics Co. Ltd.
+ *     Jaswinder Singh <jassi.brar@samsung.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#ifndef __PL330_CORE_H
+#define __PL330_CORE_H
+
+#define PL330_MAX_CHAN         8
+#define PL330_MAX_IRQS         32
+#define PL330_MAX_PERI         32
+
+enum pl330_srccachectrl {
+       SCCTRL0 = 0, /* Noncacheable and nonbufferable */
+       SCCTRL1, /* Bufferable only */
+       SCCTRL2, /* Cacheable, but do not allocate */
+       SCCTRL3, /* Cacheable and bufferable, but do not allocate */
+       SINVALID1,
+       SINVALID2,
+       SCCTRL6, /* Cacheable write-through, allocate on reads only */
+       SCCTRL7, /* Cacheable write-back, allocate on reads only */
+};
+
+enum pl330_dstcachectrl {
+       DCCTRL0 = 0, /* Noncacheable and nonbufferable */
+       DCCTRL1, /* Bufferable only */
+       DCCTRL2, /* Cacheable, but do not allocate */
+       DCCTRL3, /* Cacheable and bufferable, but do not allocate */
+       DINVALID1 = 8,
+       DINVALID2,
+       DCCTRL6, /* Cacheable write-through, allocate on writes only */
+       DCCTRL7, /* Cacheable write-back, allocate on writes only */
+};
+
+/* Populated by the PL330 core driver for DMA API driver's info */
+struct pl330_config {
+       u32     periph_id;
+       u32     pcell_id;
+#define DMAC_MODE_NS   (1 << 0)
+       unsigned int    mode;
+       unsigned int    data_bus_width:10; /* In number of bits */
+       unsigned int    data_buf_dep:10;
+       unsigned int    num_chan:4;
+       unsigned int    num_peri:6;
+       u32             peri_ns;
+       unsigned int    num_events:6;
+       u32             irq_ns;
+};
+
+/* Handle to the DMAC provided to the PL330 core */
+struct pl330_info {
+       /* Owning device */
+       struct device *dev;
+       /* Size of MicroCode buffers for each channel. */
+       unsigned mcbufsz;
+       /* ioremap'ed address of PL330 registers. */
+       void __iomem    *base;
+       /* Client can freely use it. */
+       void    *client_data;
+       /* PL330 core data, Client must not touch it. */
+       void    *pl330_data;
+       /* Populated by the PL330 core driver during pl330_add */
+       struct pl330_config     pcfg;
+       /*
+        * If the DMAC has some reset mechanism, then the
+        * client may want to provide pointer to the method.
+        */
+       void (*dmac_reset)(struct pl330_info *pi);
+};
+
+enum pl330_byteswap {
+       SWAP_NO = 0,
+       SWAP_2,
+       SWAP_4,
+       SWAP_8,
+       SWAP_16,
+};
+
+/**
+ * Request Configuration.
+ * The PL330 core does not modify this and uses the last
+ * working configuration if the request doesn't provide any.
+ *
+ * The Client may want to provide this info only for the
+ * first request and a request with new settings.
+ */
+struct pl330_reqcfg {
+       /* Address Incrementing */
+       unsigned dst_inc:1;
+       unsigned src_inc:1;
+
+       /*
+        * For now, the SRC & DST protection levels
+        * and burst size/length are assumed same.
+        */
+       bool nonsecure;
+       bool privileged;
+       bool insnaccess;
+       unsigned brst_len:5;
+       unsigned brst_size:3; /* in power of 2 */
+
+       enum pl330_dstcachectrl dcctl;
+       enum pl330_srccachectrl scctl;
+       enum pl330_byteswap swap;
+};
+
+/*
+ * One cycle of DMAC operation.
+ * There may be more than one xfer in a request.
+ */
+struct pl330_xfer {
+       u32 src_addr;
+       u32 dst_addr;
+       /* Size to xfer */
+       u32 bytes;
+       /*
+        * Pointer to next xfer in the list.
+        * The last xfer in the req must point to NULL.
+        */
+       struct pl330_xfer *next;
+};
+
+/* The xfer callbacks are made with one of these arguments. */
+enum pl330_op_err {
+       /* The all xfers in the request were success. */
+       PL330_ERR_NONE,
+       /* If req aborted due to global error. */
+       PL330_ERR_ABORT,
+       /* If req failed due to problem with Channel. */
+       PL330_ERR_FAIL,
+};
+
+enum pl330_reqtype {
+       MEMTOMEM,
+       MEMTODEV,
+       DEVTOMEM,
+       DEVTODEV,
+};
+
+/* A request defining Scatter-Gather List ending with NULL xfer. */
+struct pl330_req {
+       enum pl330_reqtype rqtype;
+       /* Index of peripheral for the xfer. */
+       unsigned peri:5;
+       /* Unique token for this xfer, set by the client. */
+       void *token;
+       /* Callback to be called after xfer. */
+       void (*xfer_cb)(void *token, enum pl330_op_err err);
+       /* If NULL, req will be done at last set parameters. */
+       struct pl330_reqcfg *cfg;
+       /* Pointer to first xfer in the request. */
+       struct pl330_xfer *x;
+};
+
+/*
+ * To know the status of the channel and DMAC, the client
+ * provides a pointer to this structure. The PL330 core
+ * fills it with current information.
+ */
+struct pl330_chanstatus {
+       /*
+        * If the DMAC engine halted due to some error,
+        * the client should remove-add DMAC.
+        */
+       bool dmac_halted;
+       /*
+        * If channel is halted due to some error,
+        * the client should ABORT/FLUSH and START the channel.
+        */
+       bool faulting;
+       /* Location of last load */
+       u32 src_addr;
+       /* Location of last store */
+       u32 dst_addr;
+       /*
+        * Pointer to the currently active req, NULL if channel is
+        * inactive, even though the requests may be present.
+        */
+       struct pl330_req *top_req;
+       /* Pointer to req waiting second in the queue if any. */
+       struct pl330_req *wait_req;
+};
+
+enum pl330_chan_op {
+       /* Start the channel */
+       PL330_OP_START,
+       /* Abort the active xfer */
+       PL330_OP_ABORT,
+       /* Stop xfer and flush queue */
+       PL330_OP_FLUSH,
+};
+
+extern int pl330_add(struct pl330_info *);
+extern void pl330_del(struct pl330_info *pi);
+extern int pl330_update(const struct pl330_info *pi);
+extern void pl330_release_channel(void *ch_id);
+extern void *pl330_request_channel(const struct pl330_info *pi);
+extern int pl330_chan_status(void *ch_id, struct pl330_chanstatus *pstatus);
+extern int pl330_chan_ctrl(void *ch_id, enum pl330_chan_op op);
+extern int pl330_submit_req(void *ch_id, struct pl330_req *r);
+
+#endif /* __PL330_CORE_H */
diff --git a/arch/arm/include/asm/hardware/sp810.h b/arch/arm/include/asm/hardware/sp810.h
new file mode 100644 (file)
index 0000000..a101f10
--- /dev/null
@@ -0,0 +1,59 @@
+/*
+ * arch/arm/include/asm/hardware/sp810.h
+ *
+ * ARM PrimeXsys System Controller SP810 header file
+ *
+ * Copyright (C) 2009 ST Microelectronics
+ * Viresh Kumar<viresh.kumar@st.com>
+ *
+ * This file is licensed under the terms of the GNU General Public
+ * License version 2. This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+ */
+
+#ifndef __ASM_ARM_SP810_H
+#define __ASM_ARM_SP810_H
+
+#include <linux/io.h>
+
+/* sysctl registers offset */
+#define SCCTRL                 0x000
+#define SCSYSSTAT              0x004
+#define SCIMCTRL               0x008
+#define SCIMSTAT               0x00C
+#define SCXTALCTRL             0x010
+#define SCPLLCTRL              0x014
+#define SCPLLFCTRL             0x018
+#define SCPERCTRL0             0x01C
+#define SCPERCTRL1             0x020
+#define SCPEREN                        0x024
+#define SCPERDIS               0x028
+#define SCPERCLKEN             0x02C
+#define SCPERSTAT              0x030
+#define SCSYSID0               0xEE0
+#define SCSYSID1               0xEE4
+#define SCSYSID2               0xEE8
+#define SCSYSID3               0xEEC
+#define SCITCR                 0xF00
+#define SCITIR0                        0xF04
+#define SCITIR1                        0xF08
+#define SCITOR                 0xF0C
+#define SCCNTCTRL              0xF10
+#define SCCNTDATA              0xF14
+#define SCCNTSTEP              0xF18
+#define SCPERIPHID0            0xFE0
+#define SCPERIPHID1            0xFE4
+#define SCPERIPHID2            0xFE8
+#define SCPERIPHID3            0xFEC
+#define SCPCELLID0             0xFF0
+#define SCPCELLID1             0xFF4
+#define SCPCELLID2             0xFF8
+#define SCPCELLID3             0xFFC
+
+static inline void sysctl_soft_reset(void __iomem *base)
+{
+       /* writing any value to SCSYSSTAT reg will reset system */
+       writel(0, base + SCSYSSTAT);
+}
+
+#endif /* __ASM_ARM_SP810_H */
index a91d8a1..7f0b6d1 100644 (file)
@@ -53,6 +53,9 @@
 #define TIOCGPTN       _IOR('T',0x30, unsigned int) /* Get Pty Number (of pty-mux device) */
 #define TIOCSPTLCK     _IOW('T',0x31, int)  /* Lock/unlock Pty */
 
+#define TIOCGRS485      0x542E
+#define TIOCSRS485      0x542F
+
 #define FIONCLEX       0x5450  /* these numbers need to be adjusted. */
 #define FIOCLEX                0x5451
 #define FIOASYNC       0x5452
index a38bdc7..52f0da1 100644 (file)
@@ -8,10 +8,16 @@
  * published by the Free Software Foundation.
  */
 
+#ifndef __ASM_MACH_PCI_H
+#define __ASM_MACH_PCI_H
+
 struct pci_sys_data;
 struct pci_bus;
 
 struct hw_pci {
+#ifdef CONFIG_PCI_DOMAINS
+       int             domain;
+#endif
        struct list_head buses;
        int             nr_controllers;
        int             (*setup)(int nr, struct pci_sys_data *);
@@ -26,6 +32,9 @@ struct hw_pci {
  * Per-controller structure
  */
 struct pci_sys_data {
+#ifdef CONFIG_PCI_DOMAINS
+       int             domain;
+#endif
        struct list_head node;
        int             busnr;          /* primary bus number                   */
        u64             mem_offset;     /* bus->cpu memory mapping offset       */
@@ -70,3 +79,5 @@ extern int pci_v3_setup(int nr, struct pci_sys_data *);
 extern struct pci_bus *pci_v3_scan_bus(int nr, struct pci_sys_data *);
 extern void pci_v3_preinit(void);
 extern void pci_v3_postinit(void);
+
+#endif /* __ASM_MACH_PCI_H */
index 8bffc3f..35d408f 100644 (file)
@@ -38,7 +38,7 @@ struct sys_timer {
        void                    (*init)(void);
        void                    (*suspend)(void);
        void                    (*resume)(void);
-#ifndef CONFIG_GENERIC_TIME
+#ifdef CONFIG_ARCH_USES_GETTIMEOFFSET
        unsigned long           (*offset)(void);
 #endif
 };
index 4798011..92e2a83 100644 (file)
@@ -4,8 +4,23 @@
 #ifdef __KERNEL__
 #include <asm-generic/pci-dma-compat.h>
 
+#include <asm/mach/pci.h> /* for pci_sys_data */
 #include <mach/hardware.h> /* for PCIBIOS_MIN_* */
 
+#ifdef CONFIG_PCI_DOMAINS
+static inline int pci_domain_nr(struct pci_bus *bus)
+{
+       struct pci_sys_data *root = bus->sysdata;
+
+       return root->domain;
+}
+
+static inline int pci_proc_domain(struct pci_bus *bus)
+{
+       return pci_domain_nr(bus);
+}
+#endif /* CONFIG_PCI_DOMAINS */
+
 #ifdef CONFIG_PCI_HOST_ITE8152
 /* ITE bridge requires setting latency timer to avoid early bus access
    termination by PIC bus mater devices
index 49e3049..48837e6 100644 (file)
@@ -28,4 +28,21 @@ set_perf_event_pending(void)
  * same indexes here for consistency. */
 #define PERF_EVENT_INDEX_OFFSET 1
 
+/* ARM perf PMU IDs for use by internal perf clients. */
+enum arm_perf_pmu_ids {
+       ARM_PERF_PMU_ID_XSCALE1 = 0,
+       ARM_PERF_PMU_ID_XSCALE2,
+       ARM_PERF_PMU_ID_V6,
+       ARM_PERF_PMU_ID_V6MP,
+       ARM_PERF_PMU_ID_CA8,
+       ARM_PERF_PMU_ID_CA9,
+       ARM_NUM_PMU_IDS,
+};
+
+extern enum arm_perf_pmu_ids
+armpmu_get_pmu_id(void);
+
+extern int
+armpmu_get_max_events(void);
+
 #endif /* __ARM_PERF_EVENT_H__ */
index 1139768..ab68cf1 100644 (file)
@@ -314,7 +314,7 @@ static inline pte_t pte_mkspecial(pte_t pte) { return pte; }
        __pgprot_modify(prot, L_PTE_MT_MASK, L_PTE_MT_UNCACHED)
 #define pgprot_writecombine(prot) \
        __pgprot_modify(prot, L_PTE_MT_MASK, L_PTE_MT_BUFFERABLE)
-#if __LINUX_ARM_ARCH__ >= 7
+#ifdef CONFIG_ARM_DMA_MEM_BUFFERABLE
 #define pgprot_dmacoherent(prot) \
        __pgprot_modify(prot, L_PTE_MT_MASK|L_PTE_EXEC, L_PTE_MT_BUFFERABLE)
 #else
index 2829b9f..8ccea01 100644 (file)
 #ifndef __ARM_PMU_H__
 #define __ARM_PMU_H__
 
-#ifdef CONFIG_CPU_HAS_PMU
-
-struct pmu_irqs {
-       const int   *irqs;
-       int         num_irqs;
+enum arm_pmu_type {
+       ARM_PMU_DEVICE_CPU      = 0,
+       ARM_NUM_PMU_DEVICES,
 };
 
+#ifdef CONFIG_CPU_HAS_PMU
+
 /**
  * reserve_pmu() - reserve the hardware performance counters
  *
  * Reserve the hardware performance counters in the system for exclusive use.
- * The 'struct pmu_irqs' for the system is returned on success, ERR_PTR()
+ * The platform_device for the system is returned on success, ERR_PTR()
  * encoded error on failure.
  */
-extern const struct pmu_irqs *
-reserve_pmu(void);
+extern struct platform_device *
+reserve_pmu(enum arm_pmu_type device);
 
 /**
  * release_pmu() - Relinquish control of the performance counters
  *
  * Release the performance counters and allow someone else to use them.
  * Callers must have disabled the counters and released IRQs before calling
- * this. The 'struct pmu_irqs' returned from reserve_pmu() must be passed as
+ * this. The platform_device returned from reserve_pmu() must be passed as
  * a cookie.
  */
 extern int
-release_pmu(const struct pmu_irqs *irqs);
+release_pmu(struct platform_device *pdev);
 
 /**
  * init_pmu() - Initialise the PMU.
@@ -48,24 +48,26 @@ release_pmu(const struct pmu_irqs *irqs);
  * the actual hardware initialisation.
  */
 extern int
-init_pmu(void);
+init_pmu(enum arm_pmu_type device);
 
 #else /* CONFIG_CPU_HAS_PMU */
 
-static inline const struct pmu_irqs *
-reserve_pmu(void)
+#include <linux/err.h>
+
+static inline struct platform_device *
+reserve_pmu(enum arm_pmu_type device)
 {
        return ERR_PTR(-ENODEV);
 }
 
 static inline int
-release_pmu(const struct pmu_irqs *irqs)
+release_pmu(struct platform_device *pdev)
 {
        return -ENODEV;
 }
 
 static inline int
-init_pmu(void)
+init_pmu(enum arm_pmu_type device)
 {
        return -ENODEV;
 }
index ca0a37d..bcda59f 100644 (file)
@@ -4,24 +4,8 @@
 #include <asm/memory.h>
 #include <asm/types.h>
 
-struct scatterlist {
-#ifdef CONFIG_DEBUG_SG
-       unsigned long   sg_magic;
-#endif
-       unsigned long   page_link;
-       unsigned int    offset;         /* buffer offset                 */
-       dma_addr_t      dma_address;    /* dma address                   */
-       unsigned int    length;         /* length                        */
-};
+#include <asm-generic/scatterlist.h>
 
-/*
- * These macros should be used after a pci_map_sg call has been done
- * to get bus addresses of each of the SG entries and their lengths.
- * You should only work with the number of sg entries pci_map_sg
- * returns, or alternatively stop on the first sg_dma_len(sg) which
- * is 0.
- */
-#define sg_dma_address(sg)      ((sg)->dma_address)
-#define sg_dma_len(sg)          ((sg)->length)
+#undef ARCH_HAS_SG_CHAIN
 
 #endif /* _ASMARM_SCATTERLIST_H */
index e0d763b..3d05190 100644 (file)
@@ -82,7 +82,7 @@ struct secondary_data {
 extern struct secondary_data secondary_data;
 
 extern int __cpu_disable(void);
-extern int mach_cpu_disable(unsigned int cpu);
+extern int platform_cpu_disable(unsigned int cpu);
 
 extern void __cpu_die(unsigned int cpu);
 extern void cpu_die(void);
index 4ace45e..5f4f480 100644 (file)
@@ -141,7 +141,7 @@ extern unsigned int user_debug;
 
 #ifdef CONFIG_ARCH_HAS_BARRIERS
 #include <mach/barriers.h>
-#elif __LINUX_ARM_ARCH__ >= 7 || defined(CONFIG_SMP)
+#elif defined(CONFIG_ARM_DMA_MEM_BUFFERABLE) || defined(CONFIG_SMP)
 #define mb()           do { dsb(); outer_sync(); } while (0)
 #define rmb()          dmb()
 #define wmb()          mb()
index bd397e0..c6273a3 100644 (file)
@@ -527,6 +527,9 @@ static void __init pcibios_init_hw(struct hw_pci *hw)
                if (!sys)
                        panic("PCI: unable to allocate sys data!");
 
+#ifdef CONFIG_PCI_DOMAINS
+               sys->domain  = hw->domain;
+#endif
                sys->hw      = hw;
                sys->busnr   = busnr;
                sys->swizzle = hw->swizzle;
index 7d5b9fb..2c4a185 100644 (file)
@@ -16,6 +16,8 @@
 #include <linux/spinlock.h>
 #include <linux/errno.h>
 #include <linux/scatterlist.h>
+#include <linux/seq_file.h>
+#include <linux/proc_fs.h>
 
 #include <asm/dma.h>
 
@@ -264,3 +266,37 @@ int get_dma_residue(unsigned int chan)
        return ret;
 }
 EXPORT_SYMBOL(get_dma_residue);
+
+#ifdef CONFIG_PROC_FS
+static int proc_dma_show(struct seq_file *m, void *v)
+{
+       int i;
+
+       for (i = 0 ; i < MAX_DMA_CHANNELS ; i++) {
+               dma_t *dma = dma_channel(i);
+               if (dma && dma->lock)
+                       seq_printf(m, "%2d: %s\n", i, dma->device_id);
+       }
+       return 0;
+}
+
+static int proc_dma_open(struct inode *inode, struct file *file)
+{
+       return single_open(file, proc_dma_show, NULL);
+}
+
+static const struct file_operations proc_dma_operations = {
+       .open           = proc_dma_open,
+       .read           = seq_read,
+       .llseek         = seq_lseek,
+       .release        = single_release,
+};
+
+static int __init proc_dma_init(void)
+{
+       proc_create("dma", 0, NULL, &proc_dma_operations);
+       return 0;
+}
+
+__initcall(proc_dma_init);
+#endif
index 9e70f20..c457686 100644 (file)
@@ -16,7 +16,9 @@
 
 #include <linux/interrupt.h>
 #include <linux/kernel.h>
+#include <linux/module.h>
 #include <linux/perf_event.h>
+#include <linux/platform_device.h>
 #include <linux/spinlock.h>
 #include <linux/uaccess.h>
 
@@ -26,7 +28,7 @@
 #include <asm/pmu.h>
 #include <asm/stacktrace.h>
 
-static const struct pmu_irqs *pmu_irqs;
+static struct platform_device *pmu_device;
 
 /*
  * Hardware lock to serialize accesses to PMU registers. Needed for the
@@ -67,8 +69,18 @@ struct cpu_hw_events {
 };
 DEFINE_PER_CPU(struct cpu_hw_events, cpu_hw_events);
 
+/* PMU names. */
+static const char *arm_pmu_names[] = {
+       [ARM_PERF_PMU_ID_XSCALE1] = "xscale1",
+       [ARM_PERF_PMU_ID_XSCALE2] = "xscale2",
+       [ARM_PERF_PMU_ID_V6]      = "v6",
+       [ARM_PERF_PMU_ID_V6MP]    = "v6mpcore",
+       [ARM_PERF_PMU_ID_CA8]     = "ARMv7 Cortex-A8",
+       [ARM_PERF_PMU_ID_CA9]     = "ARMv7 Cortex-A9",
+};
+
 struct arm_pmu {
-       char            *name;
+       enum arm_perf_pmu_ids id;
        irqreturn_t     (*handle_irq)(int irq_num, void *dev);
        void            (*enable)(struct hw_perf_event *evt, int idx);
        void            (*disable)(struct hw_perf_event *evt, int idx);
@@ -87,6 +99,30 @@ struct arm_pmu {
 /* Set at runtime when we know what CPU type we are. */
 static const struct arm_pmu *armpmu;
 
+enum arm_perf_pmu_ids
+armpmu_get_pmu_id(void)
+{
+       int id = -ENODEV;
+
+       if (armpmu != NULL)
+               id = armpmu->id;
+
+       return id;
+}
+EXPORT_SYMBOL_GPL(armpmu_get_pmu_id);
+
+int
+armpmu_get_max_events(void)
+{
+       int max_events = 0;
+
+       if (armpmu != NULL)
+               max_events = armpmu->num_events;
+
+       return max_events;
+}
+EXPORT_SYMBOL_GPL(armpmu_get_max_events);
+
 #define HW_OP_UNSUPPORTED              0xFFFF
 
 #define C(_x) \
@@ -314,38 +350,44 @@ validate_group(struct perf_event *event)
 static int
 armpmu_reserve_hardware(void)
 {
-       int i;
-       int err;
+       int i, err = -ENODEV, irq;
 
-       pmu_irqs = reserve_pmu();
-       if (IS_ERR(pmu_irqs)) {
+       pmu_device = reserve_pmu(ARM_PMU_DEVICE_CPU);
+       if (IS_ERR(pmu_device)) {
                pr_warning("unable to reserve pmu\n");
-               return PTR_ERR(pmu_irqs);
+               return PTR_ERR(pmu_device);
        }
 
-       init_pmu();
+       init_pmu(ARM_PMU_DEVICE_CPU);
 
-       if (pmu_irqs->num_irqs < 1) {
+       if (pmu_device->num_resources < 1) {
                pr_err("no irqs for PMUs defined\n");
                return -ENODEV;
        }
 
-       for (i = 0; i < pmu_irqs->num_irqs; ++i) {
-               err = request_irq(pmu_irqs->irqs[i], armpmu->handle_irq,
+       for (i = 0; i < pmu_device->num_resources; ++i) {
+               irq = platform_get_irq(pmu_device, i);
+               if (irq < 0)
+                       continue;
+
+               err = request_irq(irq, armpmu->handle_irq,
                                  IRQF_DISABLED | IRQF_NOBALANCING,
                                  "armpmu", NULL);
                if (err) {
-                       pr_warning("unable to request IRQ%d for ARM "
-                                  "perf counters\n", pmu_irqs->irqs[i]);
+                       pr_warning("unable to request IRQ%d for ARM perf "
+                               "counters\n", irq);
                        break;
                }
        }
 
        if (err) {
-               for (i = i - 1; i >= 0; --i)
-                       free_irq(pmu_irqs->irqs[i], NULL);
-               release_pmu(pmu_irqs);
-               pmu_irqs = NULL;
+               for (i = i - 1; i >= 0; --i) {
+                       irq = platform_get_irq(pmu_device, i);
+                       if (irq >= 0)
+                               free_irq(irq, NULL);
+               }
+               release_pmu(pmu_device);
+               pmu_device = NULL;
        }
 
        return err;
@@ -354,14 +396,17 @@ armpmu_reserve_hardware(void)
 static void
 armpmu_release_hardware(void)
 {
-       int i;
+       int i, irq;
 
-       for (i = pmu_irqs->num_irqs - 1; i >= 0; --i)
-               free_irq(pmu_irqs->irqs[i], NULL);
+       for (i = pmu_device->num_resources - 1; i >= 0; --i) {
+               irq = platform_get_irq(pmu_device, i);
+               if (irq >= 0)
+                       free_irq(irq, NULL);
+       }
        armpmu->stop();
 
-       release_pmu(pmu_irqs);
-       pmu_irqs = NULL;
+       release_pmu(pmu_device);
+       pmu_device = NULL;
 }
 
 static atomic_t active_events = ATOMIC_INIT(0);
@@ -1144,7 +1189,7 @@ armv6mpcore_pmu_disable_event(struct hw_perf_event *hwc,
 }
 
 static const struct arm_pmu armv6pmu = {
-       .name                   = "v6",
+       .id                     = ARM_PERF_PMU_ID_V6,
        .handle_irq             = armv6pmu_handle_irq,
        .enable                 = armv6pmu_enable_event,
        .disable                = armv6pmu_disable_event,
@@ -1167,7 +1212,7 @@ static const struct arm_pmu armv6pmu = {
  * reset the period and enable the interrupt reporting.
  */
 static const struct arm_pmu armv6mpcore_pmu = {
-       .name                   = "v6mpcore",
+       .id                     = ARM_PERF_PMU_ID_V6MP,
        .handle_irq             = armv6pmu_handle_irq,
        .enable                 = armv6pmu_enable_event,
        .disable                = armv6mpcore_pmu_disable_event,
@@ -1197,10 +1242,6 @@ static const struct arm_pmu armv6mpcore_pmu = {
  *  counter and all 4 performance counters together can be reset separately.
  */
 
-#define ARMV7_PMU_CORTEX_A8_NAME               "ARMv7 Cortex-A8"
-
-#define ARMV7_PMU_CORTEX_A9_NAME               "ARMv7 Cortex-A9"
-
 /* Common ARMv7 event types */
 enum armv7_perf_types {
        ARMV7_PERFCTR_PMNC_SW_INCR              = 0x00,
@@ -2079,6 +2120,803 @@ static u32 __init armv7_reset_read_pmnc(void)
        return nb_cnt + 1;
 }
 
+/*
+ * ARMv5 [xscale] Performance counter handling code.
+ *
+ * Based on xscale OProfile code.
+ *
+ * There are two variants of the xscale PMU that we support:
+ *     - xscale1pmu: 2 event counters and a cycle counter
+ *     - xscale2pmu: 4 event counters and a cycle counter
+ * The two variants share event definitions, but have different
+ * PMU structures.
+ */
+
+enum xscale_perf_types {
+       XSCALE_PERFCTR_ICACHE_MISS              = 0x00,
+       XSCALE_PERFCTR_ICACHE_NO_DELIVER        = 0x01,
+       XSCALE_PERFCTR_DATA_STALL               = 0x02,
+       XSCALE_PERFCTR_ITLB_MISS                = 0x03,
+       XSCALE_PERFCTR_DTLB_MISS                = 0x04,
+       XSCALE_PERFCTR_BRANCH                   = 0x05,
+       XSCALE_PERFCTR_BRANCH_MISS              = 0x06,
+       XSCALE_PERFCTR_INSTRUCTION              = 0x07,
+       XSCALE_PERFCTR_DCACHE_FULL_STALL        = 0x08,
+       XSCALE_PERFCTR_DCACHE_FULL_STALL_CONTIG = 0x09,
+       XSCALE_PERFCTR_DCACHE_ACCESS            = 0x0A,
+       XSCALE_PERFCTR_DCACHE_MISS              = 0x0B,
+       XSCALE_PERFCTR_DCACHE_WRITE_BACK        = 0x0C,
+       XSCALE_PERFCTR_PC_CHANGED               = 0x0D,
+       XSCALE_PERFCTR_BCU_REQUEST              = 0x10,
+       XSCALE_PERFCTR_BCU_FULL                 = 0x11,
+       XSCALE_PERFCTR_BCU_DRAIN                = 0x12,
+       XSCALE_PERFCTR_BCU_ECC_NO_ELOG          = 0x14,
+       XSCALE_PERFCTR_BCU_1_BIT_ERR            = 0x15,
+       XSCALE_PERFCTR_RMW                      = 0x16,
+       /* XSCALE_PERFCTR_CCNT is not hardware defined */
+       XSCALE_PERFCTR_CCNT                     = 0xFE,
+       XSCALE_PERFCTR_UNUSED                   = 0xFF,
+};
+
+enum xscale_counters {
+       XSCALE_CYCLE_COUNTER    = 1,
+       XSCALE_COUNTER0,
+       XSCALE_COUNTER1,
+       XSCALE_COUNTER2,
+       XSCALE_COUNTER3,
+};
+
+static const unsigned xscale_perf_map[PERF_COUNT_HW_MAX] = {
+       [PERF_COUNT_HW_CPU_CYCLES]          = XSCALE_PERFCTR_CCNT,
+       [PERF_COUNT_HW_INSTRUCTIONS]        = XSCALE_PERFCTR_INSTRUCTION,
+       [PERF_COUNT_HW_CACHE_REFERENCES]    = HW_OP_UNSUPPORTED,
+       [PERF_COUNT_HW_CACHE_MISSES]        = HW_OP_UNSUPPORTED,
+       [PERF_COUNT_HW_BRANCH_INSTRUCTIONS] = XSCALE_PERFCTR_BRANCH,
+       [PERF_COUNT_HW_BRANCH_MISSES]       = XSCALE_PERFCTR_BRANCH_MISS,
+       [PERF_COUNT_HW_BUS_CYCLES]          = HW_OP_UNSUPPORTED,
+};
+
+static const unsigned xscale_perf_cache_map[PERF_COUNT_HW_CACHE_MAX]
+                                          [PERF_COUNT_HW_CACHE_OP_MAX]
+                                          [PERF_COUNT_HW_CACHE_RESULT_MAX] = {
+       [C(L1D)] = {
+               [C(OP_READ)] = {
+                       [C(RESULT_ACCESS)]      = XSCALE_PERFCTR_DCACHE_ACCESS,
+                       [C(RESULT_MISS)]        = XSCALE_PERFCTR_DCACHE_MISS,
+               },
+               [C(OP_WRITE)] = {
+                       [C(RESULT_ACCESS)]      = XSCALE_PERFCTR_DCACHE_ACCESS,
+                       [C(RESULT_MISS)]        = XSCALE_PERFCTR_DCACHE_MISS,
+               },
+               [C(OP_PREFETCH)] = {
+                       [C(RESULT_ACCESS)]      = CACHE_OP_UNSUPPORTED,
+                       [C(RESULT_MISS)]        = CACHE_OP_UNSUPPORTED,
+               },
+       },
+       [C(L1I)] = {
+               [C(OP_READ)] = {
+                       [C(RESULT_ACCESS)]      = CACHE_OP_UNSUPPORTED,
+                       [C(RESULT_MISS)]        = XSCALE_PERFCTR_ICACHE_MISS,
+               },
+               [C(OP_WRITE)] = {
+                       [C(RESULT_ACCESS)]      = CACHE_OP_UNSUPPORTED,
+                       [C(RESULT_MISS)]        = XSCALE_PERFCTR_ICACHE_MISS,
+               },
+               [C(OP_PREFETCH)] = {
+                       [C(RESULT_ACCESS)]      = CACHE_OP_UNSUPPORTED,
+                       [C(RESULT_MISS)]        = CACHE_OP_UNSUPPORTED,
+               },
+       },
+       [C(LL)] = {
+               [C(OP_READ)] = {
+                       [C(RESULT_ACCESS)]      = CACHE_OP_UNSUPPORTED,
+                       [C(RESULT_MISS)]        = CACHE_OP_UNSUPPORTED,
+               },
+               [C(OP_WRITE)] = {
+                       [C(RESULT_ACCESS)]      = CACHE_OP_UNSUPPORTED,
+                       [C(RESULT_MISS)]        = CACHE_OP_UNSUPPORTED,
+               },
+               [C(OP_PREFETCH)] = {
+                       [C(RESULT_ACCESS)]      = CACHE_OP_UNSUPPORTED,
+                       [C(RESULT_MISS)]        = CACHE_OP_UNSUPPORTED,
+               },
+       },
+       [C(DTLB)] = {
+               [C(OP_READ)] = {
+                       [C(RESULT_ACCESS)]      = CACHE_OP_UNSUPPORTED,
+                       [C(RESULT_MISS)]        = XSCALE_PERFCTR_DTLB_MISS,
+               },
+               [C(OP_WRITE)] = {
+                       [C(RESULT_ACCESS)]      = CACHE_OP_UNSUPPORTED,
+                       [C(RESULT_MISS)]        = XSCALE_PERFCTR_DTLB_MISS,
+               },
+               [C(OP_PREFETCH)] = {
+                       [C(RESULT_ACCESS)]      = CACHE_OP_UNSUPPORTED,
+                       [C(RESULT_MISS)]        = CACHE_OP_UNSUPPORTED,
+               },
+       },
+       [C(ITLB)] = {
+               [C(OP_READ)] = {
+                       [C(RESULT_ACCESS)]      = CACHE_OP_UNSUPPORTED,
+                       [C(RESULT_MISS)]        = XSCALE_PERFCTR_ITLB_MISS,
+               },
+               [C(OP_WRITE)] = {
+                       [C(RESULT_ACCESS)]      = CACHE_OP_UNSUPPORTED,
+                       [C(RESULT_MISS)]        = XSCALE_PERFCTR_ITLB_MISS,
+               },
+               [C(OP_PREFETCH)] = {
+                       [C(RESULT_ACCESS)]      = CACHE_OP_UNSUPPORTED,
+                       [C(RESULT_MISS)]        = CACHE_OP_UNSUPPORTED,
+               },
+       },
+       [C(BPU)] = {
+               [C(OP_READ)] = {
+                       [C(RESULT_ACCESS)]      = CACHE_OP_UNSUPPORTED,
+                       [C(RESULT_MISS)]        = CACHE_OP_UNSUPPORTED,
+               },
+               [C(OP_WRITE)] = {
+                       [C(RESULT_ACCESS)]      = CACHE_OP_UNSUPPORTED,
+                       [C(RESULT_MISS)]        = CACHE_OP_UNSUPPORTED,
+               },
+               [C(OP_PREFETCH)] = {
+                       [C(RESULT_ACCESS)]      = CACHE_OP_UNSUPPORTED,
+                       [C(RESULT_MISS)]        = CACHE_OP_UNSUPPORTED,
+               },
+       },
+};
+
+#define        XSCALE_PMU_ENABLE       0x001
+#define XSCALE_PMN_RESET       0x002
+#define        XSCALE_CCNT_RESET       0x004
+#define        XSCALE_PMU_RESET        (CCNT_RESET | PMN_RESET)
+#define XSCALE_PMU_CNT64       0x008
+
+static inline int
+xscalepmu_event_map(int config)
+{
+       int mapping = xscale_perf_map[config];
+       if (HW_OP_UNSUPPORTED == mapping)
+               mapping = -EOPNOTSUPP;
+       return mapping;
+}
+
+static u64
+xscalepmu_raw_event(u64 config)
+{
+       return config & 0xff;
+}
+
+#define XSCALE1_OVERFLOWED_MASK        0x700
+#define XSCALE1_CCOUNT_OVERFLOW        0x400
+#define XSCALE1_COUNT0_OVERFLOW        0x100
+#define XSCALE1_COUNT1_OVERFLOW        0x200
+#define XSCALE1_CCOUNT_INT_EN  0x040
+#define XSCALE1_COUNT0_INT_EN  0x010
+#define XSCALE1_COUNT1_INT_EN  0x020
+#define XSCALE1_COUNT0_EVT_SHFT        12
+#define XSCALE1_COUNT0_EVT_MASK        (0xff << XSCALE1_COUNT0_EVT_SHFT)
+#define XSCALE1_COUNT1_EVT_SHFT        20
+#define XSCALE1_COUNT1_EVT_MASK        (0xff << XSCALE1_COUNT1_EVT_SHFT)
+
+static inline u32
+xscale1pmu_read_pmnc(void)
+{
+       u32 val;
+       asm volatile("mrc p14, 0, %0, c0, c0, 0" : "=r" (val));
+       return val;
+}
+
+static inline void
+xscale1pmu_write_pmnc(u32 val)
+{
+       /* upper 4bits and 7, 11 are write-as-0 */
+       val &= 0xffff77f;
+       asm volatile("mcr p14, 0, %0, c0, c0, 0" : : "r" (val));
+}
+
+static inline int
+xscale1_pmnc_counter_has_overflowed(unsigned long pmnc,
+                                       enum xscale_counters counter)
+{
+       int ret = 0;
+
+       switch (counter) {
+       case XSCALE_CYCLE_COUNTER:
+               ret = pmnc & XSCALE1_CCOUNT_OVERFLOW;
+               break;
+       case XSCALE_COUNTER0:
+               ret = pmnc & XSCALE1_COUNT0_OVERFLOW;
+               break;
+       case XSCALE_COUNTER1:
+               ret = pmnc & XSCALE1_COUNT1_OVERFLOW;
+               break;
+       default:
+               WARN_ONCE(1, "invalid counter number (%d)\n", counter);
+       }
+
+       return ret;
+}
+
+static irqreturn_t
+xscale1pmu_handle_irq(int irq_num, void *dev)
+{
+       unsigned long pmnc;
+       struct perf_sample_data data;
+       struct cpu_hw_events *cpuc;
+       struct pt_regs *regs;
+       int idx;
+
+       /*
+        * NOTE: there's an A stepping erratum that states if an overflow
+        *       bit already exists and another occurs, the previous
+        *       Overflow bit gets cleared. There's no workaround.
+        *       Fixed in B stepping or later.
+        */
+       pmnc = xscale1pmu_read_pmnc();
+
+       /*
+        * Write the value back to clear the overflow flags. Overflow
+        * flags remain in pmnc for use below. We also disable the PMU
+        * while we process the interrupt.
+        */
+       xscale1pmu_write_pmnc(pmnc & ~XSCALE_PMU_ENABLE);
+
+       if (!(pmnc & XSCALE1_OVERFLOWED_MASK))
+               return IRQ_NONE;
+
+       regs = get_irq_regs();
+
+       perf_sample_data_init(&data, 0);
+
+       cpuc = &__get_cpu_var(cpu_hw_events);
+       for (idx = 0; idx <= armpmu->num_events; ++idx) {
+               struct perf_event *event = cpuc->events[idx];
+               struct hw_perf_event *hwc;
+
+               if (!test_bit(idx, cpuc->active_mask))
+                       continue;
+
+               if (!xscale1_pmnc_counter_has_overflowed(pmnc, idx))
+                       continue;
+
+               hwc = &event->hw;
+               armpmu_event_update(event, hwc, idx);
+               data.period = event->hw.last_period;
+               if (!armpmu_event_set_period(event, hwc, idx))
+                       continue;
+
+               if (perf_event_overflow(event, 0, &data, regs))
+                       armpmu->disable(hwc, idx);
+       }
+
+       perf_event_do_pending();
+
+       /*
+        * Re-enable the PMU.
+        */
+       pmnc = xscale1pmu_read_pmnc() | XSCALE_PMU_ENABLE;
+       xscale1pmu_write_pmnc(pmnc);
+
+       return IRQ_HANDLED;
+}
+
+static void
+xscale1pmu_enable_event(struct hw_perf_event *hwc, int idx)
+{
+       unsigned long val, mask, evt, flags;
+
+       switch (idx) {
+       case XSCALE_CYCLE_COUNTER:
+               mask = 0;
+               evt = XSCALE1_CCOUNT_INT_EN;
+               break;
+       case XSCALE_COUNTER0:
+               mask = XSCALE1_COUNT0_EVT_MASK;
+               evt = (hwc->config_base << XSCALE1_COUNT0_EVT_SHFT) |
+                       XSCALE1_COUNT0_INT_EN;
+               break;
+       case XSCALE_COUNTER1:
+               mask = XSCALE1_COUNT1_EVT_MASK;
+               evt = (hwc->config_base << XSCALE1_COUNT1_EVT_SHFT) |
+                       XSCALE1_COUNT1_INT_EN;
+               break;
+       default:
+               WARN_ONCE(1, "invalid counter number (%d)\n", idx);
+               return;
+       }
+
+       spin_lock_irqsave(&pmu_lock, flags);
+       val = xscale1pmu_read_pmnc();
+       val &= ~mask;
+       val |= evt;
+       xscale1pmu_write_pmnc(val);
+       spin_unlock_irqrestore(&pmu_lock, flags);
+}
+
+static void
+xscale1pmu_disable_event(struct hw_perf_event *hwc, int idx)
+{
+       unsigned long val, mask, evt, flags;
+
+       switch (idx) {
+       case XSCALE_CYCLE_COUNTER:
+               mask = XSCALE1_CCOUNT_INT_EN;
+               evt = 0;
+               break;
+       case XSCALE_COUNTER0:
+               mask = XSCALE1_COUNT0_INT_EN | XSCALE1_COUNT0_EVT_MASK;
+               evt = XSCALE_PERFCTR_UNUSED << XSCALE1_COUNT0_EVT_SHFT;
+               break;
+       case XSCALE_COUNTER1:
+               mask = XSCALE1_COUNT1_INT_EN | XSCALE1_COUNT1_EVT_MASK;
+               evt = XSCALE_PERFCTR_UNUSED << XSCALE1_COUNT1_EVT_SHFT;
+               break;
+       default:
+               WARN_ONCE(1, "invalid counter number (%d)\n", idx);
+               return;
+       }
+
+       spin_lock_irqsave(&pmu_lock, flags);
+       val = xscale1pmu_read_pmnc();
+       val &= ~mask;
+       val |= evt;
+       xscale1pmu_write_pmnc(val);
+       spin_unlock_irqrestore(&pmu_lock, flags);
+}
+
+static int
+xscale1pmu_get_event_idx(struct cpu_hw_events *cpuc,
+                       struct hw_perf_event *event)
+{
+       if (XSCALE_PERFCTR_CCNT == event->config_base) {
+               if (test_and_set_bit(XSCALE_CYCLE_COUNTER, cpuc->used_mask))
+                       return -EAGAIN;
+
+               return XSCALE_CYCLE_COUNTER;
+       } else {
+               if (!test_and_set_bit(XSCALE_COUNTER1, cpuc->used_mask)) {
+                       return XSCALE_COUNTER1;
+               }
+
+               if (!test_and_set_bit(XSCALE_COUNTER0, cpuc->used_mask)) {
+                       return XSCALE_COUNTER0;
+               }
+
+               return -EAGAIN;
+       }
+}
+
+static void
+xscale1pmu_start(void)
+{
+       unsigned long flags, val;
+
+       spin_lock_irqsave(&pmu_lock, flags);
+       val = xscale1pmu_read_pmnc();
+       val |= XSCALE_PMU_ENABLE;
+       xscale1pmu_write_pmnc(val);
+       spin_unlock_irqrestore(&pmu_lock, flags);
+}
+
+static void
+xscale1pmu_stop(void)
+{
+       unsigned long flags, val;
+
+       spin_lock_irqsave(&pmu_lock, flags);
+       val = xscale1pmu_read_pmnc();
+       val &= ~XSCALE_PMU_ENABLE;
+       xscale1pmu_write_pmnc(val);
+       spin_unlock_irqrestore(&pmu_lock, flags);
+}
+
+static inline u32
+xscale1pmu_read_counter(int counter)
+{
+       u32 val = 0;
+
+       switch (counter) {
+       case XSCALE_CYCLE_COUNTER:
+               asm volatile("mrc p14, 0, %0, c1, c0, 0" : "=r" (val));
+               break;
+       case XSCALE_COUNTER0:
+               asm volatile("mrc p14, 0, %0, c2, c0, 0" : "=r" (val));
+               break;
+       case XSCALE_COUNTER1:
+               asm volatile("mrc p14, 0, %0, c3, c0, 0" : "=r" (val));
+               break;
+       }
+
+       return val;
+}
+
+static inline void
+xscale1pmu_write_counter(int counter, u32 val)
+{
+       switch (counter) {
+       case XSCALE_CYCLE_COUNTER:
+               asm volatile("mcr p14, 0, %0, c1, c0, 0" : : "r" (val));
+               break;
+       case XSCALE_COUNTER0:
+               asm volatile("mcr p14, 0, %0, c2, c0, 0" : : "r" (val));
+               break;
+       case XSCALE_COUNTER1:
+               asm volatile("mcr p14, 0, %0, c3, c0, 0" : : "r" (val));
+               break;
+       }
+}
+
+static const struct arm_pmu xscale1pmu = {
+       .id             = ARM_PERF_PMU_ID_XSCALE1,
+       .handle_irq     = xscale1pmu_handle_irq,
+       .enable         = xscale1pmu_enable_event,
+       .disable        = xscale1pmu_disable_event,
+       .event_map      = xscalepmu_event_map,
+       .raw_event      = xscalepmu_raw_event,
+       .read_counter   = xscale1pmu_read_counter,
+       .write_counter  = xscale1pmu_write_counter,
+       .get_event_idx  = xscale1pmu_get_event_idx,
+       .start          = xscale1pmu_start,
+       .stop           = xscale1pmu_stop,
+       .num_events     = 3,
+       .max_period     = (1LLU << 32) - 1,
+};
+
+#define XSCALE2_OVERFLOWED_MASK        0x01f
+#define XSCALE2_CCOUNT_OVERFLOW        0x001
+#define XSCALE2_COUNT0_OVERFLOW        0x002
+#define XSCALE2_COUNT1_OVERFLOW        0x004
+#define XSCALE2_COUNT2_OVERFLOW        0x008
+#define XSCALE2_COUNT3_OVERFLOW        0x010
+#define XSCALE2_CCOUNT_INT_EN  0x001
+#define XSCALE2_COUNT0_INT_EN  0x002
+#define XSCALE2_COUNT1_INT_EN  0x004
+#define XSCALE2_COUNT2_INT_EN  0x008
+#define XSCALE2_COUNT3_INT_EN  0x010
+#define XSCALE2_COUNT0_EVT_SHFT        0
+#define XSCALE2_COUNT0_EVT_MASK        (0xff << XSCALE2_COUNT0_EVT_SHFT)
+#define XSCALE2_COUNT1_EVT_SHFT        8
+#define XSCALE2_COUNT1_EVT_MASK        (0xff << XSCALE2_COUNT1_EVT_SHFT)
+#define XSCALE2_COUNT2_EVT_SHFT        16
+#define XSCALE2_COUNT2_EVT_MASK        (0xff << XSCALE2_COUNT2_EVT_SHFT)
+#define XSCALE2_COUNT3_EVT_SHFT        24
+#define XSCALE2_COUNT3_EVT_MASK        (0xff << XSCALE2_COUNT3_EVT_SHFT)
+
+static inline u32
+xscale2pmu_read_pmnc(void)
+{
+       u32 val;
+       asm volatile("mrc p14, 0, %0, c0, c1, 0" : "=r" (val));
+       /* bits 1-2 and 4-23 are read-unpredictable */
+       return val & 0xff000009;
+}
+
+static inline void
+xscale2pmu_write_pmnc(u32 val)
+{
+       /* bits 4-23 are write-as-0, 24-31 are write ignored */
+       val &= 0xf;
+       asm volatile("mcr p14, 0, %0, c0, c1, 0" : : "r" (val));
+}
+
+static inline u32
+xscale2pmu_read_overflow_flags(void)
+{
+       u32 val;
+       asm volatile("mrc p14, 0, %0, c5, c1, 0" : "=r" (val));
+       return val;
+}
+
+static inline void
+xscale2pmu_write_overflow_flags(u32 val)
+{
+       asm volatile("mcr p14, 0, %0, c5, c1, 0" : : "r" (val));
+}
+
+static inline u32
+xscale2pmu_read_event_select(void)
+{
+       u32 val;
+       asm volatile("mrc p14, 0, %0, c8, c1, 0" : "=r" (val));
+       return val;
+}
+
+static inline void
+xscale2pmu_write_event_select(u32 val)
+{
+       asm volatile("mcr p14, 0, %0, c8, c1, 0" : : "r"(val));
+}
+
+static inline u32
+xscale2pmu_read_int_enable(void)
+{
+       u32 val;
+       asm volatile("mrc p14, 0, %0, c4, c1, 0" : "=r" (val));
+       return val;
+}
+
+static void
+xscale2pmu_write_int_enable(u32 val)
+{
+       asm volatile("mcr p14, 0, %0, c4, c1, 0" : : "r" (val));
+}
+
+static inline int
+xscale2_pmnc_counter_has_overflowed(unsigned long of_flags,
+                                       enum xscale_counters counter)
+{
+       int ret = 0;
+
+       switch (counter) {
+       case XSCALE_CYCLE_COUNTER:
+               ret = of_flags & XSCALE2_CCOUNT_OVERFLOW;
+               break;
+       case XSCALE_COUNTER0:
+               ret = of_flags & XSCALE2_COUNT0_OVERFLOW;
+               break;
+       case XSCALE_COUNTER1:
+               ret = of_flags & XSCALE2_COUNT1_OVERFLOW;
+               break;
+       case XSCALE_COUNTER2:
+               ret = of_flags & XSCALE2_COUNT2_OVERFLOW;
+               break;
+       case XSCALE_COUNTER3:
+               ret = of_flags & XSCALE2_COUNT3_OVERFLOW;
+               break;
+       default:
+               WARN_ONCE(1, "invalid counter number (%d)\n", counter);
+       }
+
+       return ret;
+}
+
+static irqreturn_t
+xscale2pmu_handle_irq(int irq_num, void *dev)
+{
+       unsigned long pmnc, of_flags;
+       struct perf_sample_data data;
+       struct cpu_hw_events *cpuc;
+       struct pt_regs *regs;
+       int idx;
+
+       /* Disable the PMU. */
+       pmnc = xscale2pmu_read_pmnc();
+       xscale2pmu_write_pmnc(pmnc & ~XSCALE_PMU_ENABLE);
+
+       /* Check the overflow flag register. */
+       of_flags = xscale2pmu_read_overflow_flags();
+       if (!(of_flags & XSCALE2_OVERFLOWED_MASK))
+               return IRQ_NONE;
+
+       /* Clear the overflow bits. */
+       xscale2pmu_write_overflow_flags(of_flags);
+
+       regs = get_irq_regs();
+
+       perf_sample_data_init(&data, 0);
+
+       cpuc = &__get_cpu_var(cpu_hw_events);
+       for (idx = 0; idx <= armpmu->num_events; ++idx) {
+               struct perf_event *event = cpuc->events[idx];
+               struct hw_perf_event *hwc;
+
+               if (!test_bit(idx, cpuc->active_mask))
+                       continue;
+
+               if (!xscale2_pmnc_counter_has_overflowed(pmnc, idx))
+                       continue;
+
+               hwc = &event->hw;
+               armpmu_event_update(event, hwc, idx);
+               data.period = event->hw.last_period;
+               if (!armpmu_event_set_period(event, hwc, idx))
+                       continue;
+
+               if (perf_event_overflow(event, 0, &data, regs))
+                       armpmu->disable(hwc, idx);
+       }
+
+       perf_event_do_pending();
+
+       /*
+        * Re-enable the PMU.
+        */
+       pmnc = xscale2pmu_read_pmnc() | XSCALE_PMU_ENABLE;
+       xscale2pmu_write_pmnc(pmnc);
+
+       return IRQ_HANDLED;
+}
+
+static void
+xscale2pmu_enable_event(struct hw_perf_event *hwc, int idx)
+{
+       unsigned long flags, ien, evtsel;
+
+       ien = xscale2pmu_read_int_enable();
+       evtsel = xscale2pmu_read_event_select();
+
+       switch (idx) {
+       case XSCALE_CYCLE_COUNTER:
+               ien |= XSCALE2_CCOUNT_INT_EN;
+               break;
+       case XSCALE_COUNTER0:
+               ien |= XSCALE2_COUNT0_INT_EN;
+               evtsel &= ~XSCALE2_COUNT0_EVT_MASK;
+               evtsel |= hwc->config_base << XSCALE2_COUNT0_EVT_SHFT;
+               break;
+       case XSCALE_COUNTER1:
+               ien |= XSCALE2_COUNT1_INT_EN;
+               evtsel &= ~XSCALE2_COUNT1_EVT_MASK;
+               evtsel |= hwc->config_base << XSCALE2_COUNT1_EVT_SHFT;
+               break;
+       case XSCALE_COUNTER2:
+               ien |= XSCALE2_COUNT2_INT_EN;
+               evtsel &= ~XSCALE2_COUNT2_EVT_MASK;
+               evtsel |= hwc->config_base << XSCALE2_COUNT2_EVT_SHFT;
+               break;
+       case XSCALE_COUNTER3:
+               ien |= XSCALE2_COUNT3_INT_EN;
+               evtsel &= ~XSCALE2_COUNT3_EVT_MASK;
+               evtsel |= hwc->config_base << XSCALE2_COUNT3_EVT_SHFT;
+               break;
+       default:
+               WARN_ONCE(1, "invalid counter number (%d)\n", idx);
+               return;
+       }
+
+       spin_lock_irqsave(&pmu_lock, flags);
+       xscale2pmu_write_event_select(evtsel);
+       xscale2pmu_write_int_enable(ien);
+       spin_unlock_irqrestore(&pmu_lock, flags);
+}
+
+static void
+xscale2pmu_disable_event(struct hw_perf_event *hwc, int idx)
+{
+       unsigned long flags, ien, evtsel;
+
+       ien = xscale2pmu_read_int_enable();
+       evtsel = xscale2pmu_read_event_select();
+
+       switch (idx) {
+       case XSCALE_CYCLE_COUNTER:
+               ien &= ~XSCALE2_CCOUNT_INT_EN;
+               break;
+       case XSCALE_COUNTER0:
+               ien &= ~XSCALE2_COUNT0_INT_EN;
+               evtsel &= ~XSCALE2_COUNT0_EVT_MASK;
+               evtsel |= XSCALE_PERFCTR_UNUSED << XSCALE2_COUNT0_EVT_SHFT;
+               break;
+       case XSCALE_COUNTER1:
+               ien &= ~XSCALE2_COUNT1_INT_EN;
+               evtsel &= ~XSCALE2_COUNT1_EVT_MASK;
+               evtsel |= XSCALE_PERFCTR_UNUSED << XSCALE2_COUNT1_EVT_SHFT;
+               break;
+       case XSCALE_COUNTER2:
+               ien &= ~XSCALE2_COUNT2_INT_EN;
+               evtsel &= ~XSCALE2_COUNT2_EVT_MASK;
+               evtsel |= XSCALE_PERFCTR_UNUSED << XSCALE2_COUNT2_EVT_SHFT;
+               break;
+       case XSCALE_COUNTER3:
+               ien &= ~XSCALE2_COUNT3_INT_EN;
+               evtsel &= ~XSCALE2_COUNT3_EVT_MASK;
+               evtsel |= XSCALE_PERFCTR_UNUSED << XSCALE2_COUNT3_EVT_SHFT;
+               break;
+       default:
+               WARN_ONCE(1, "invalid counter number (%d)\n", idx);
+               return;
+       }
+
+       spin_lock_irqsave(&pmu_lock, flags);
+       xscale2pmu_write_event_select(evtsel);
+       xscale2pmu_write_int_enable(ien);
+       spin_unlock_irqrestore(&pmu_lock, flags);
+}
+
+static int
+xscale2pmu_get_event_idx(struct cpu_hw_events *cpuc,
+                       struct hw_perf_event *event)
+{
+       int idx = xscale1pmu_get_event_idx(cpuc, event);
+       if (idx >= 0)
+               goto out;
+
+       if (!test_and_set_bit(XSCALE_COUNTER3, cpuc->used_mask))
+               idx = XSCALE_COUNTER3;
+       else if (!test_and_set_bit(XSCALE_COUNTER2, cpuc->used_mask))
+               idx = XSCALE_COUNTER2;
+out:
+       return idx;
+}
+
+static void
+xscale2pmu_start(void)
+{
+       unsigned long flags, val;
+
+       spin_lock_irqsave(&pmu_lock, flags);
+       val = xscale2pmu_read_pmnc() & ~XSCALE_PMU_CNT64;
+       val |= XSCALE_PMU_ENABLE;
+       xscale2pmu_write_pmnc(val);
+       spin_unlock_irqrestore(&pmu_lock, flags);
+}
+
+static void
+xscale2pmu_stop(void)
+{
+       unsigned long flags, val;
+
+       spin_lock_irqsave(&pmu_lock, flags);
+       val = xscale2pmu_read_pmnc();
+       val &= ~XSCALE_PMU_ENABLE;
+       xscale2pmu_write_pmnc(val);
+       spin_unlock_irqrestore(&pmu_lock, flags);
+}
+
+static inline u32
+xscale2pmu_read_counter(int counter)
+{
+       u32 val = 0;
+
+       switch (counter) {
+       case XSCALE_CYCLE_COUNTER:
+               asm volatile("mrc p14, 0, %0, c1, c1, 0" : "=r" (val));
+               break;
+       case XSCALE_COUNTER0:
+               asm volatile("mrc p14, 0, %0, c0, c2, 0" : "=r" (val));
+               break;
+       case XSCALE_COUNTER1:
+               asm volatile("mrc p14, 0, %0, c1, c2, 0" : "=r" (val));
+               break;
+       case XSCALE_COUNTER2:
+               asm volatile("mrc p14, 0, %0, c2, c2, 0" : "=r" (val));
+               break;
+       case XSCALE_COUNTER3:
+               asm volatile("mrc p14, 0, %0, c3, c2, 0" : "=r" (val));
+               break;
+       }
+
+       return val;
+}
+
+static inline void
+xscale2pmu_write_counter(int counter, u32 val)
+{
+       switch (counter) {
+       case XSCALE_CYCLE_COUNTER:
+               asm volatile("mcr p14, 0, %0, c1, c1, 0" : : "r" (val));
+               break;
+       case XSCALE_COUNTER0:
+               asm volatile("mcr p14, 0, %0, c0, c2, 0" : : "r" (val));
+               break;
+       case XSCALE_COUNTER1:
+               asm volatile("mcr p14, 0, %0, c1, c2, 0" : : "r" (val));
+               break;
+       case XSCALE_COUNTER2:
+               asm volatile("mcr p14, 0, %0, c2, c2, 0" : : "r" (val));
+               break;
+       case XSCALE_COUNTER3:
+               asm volatile("mcr p14, 0, %0, c3, c2, 0" : : "r" (val));
+               break;
+       }
+}
+
+static const struct arm_pmu xscale2pmu = {
+       .id             = ARM_PERF_PMU_ID_XSCALE2,
+       .handle_irq     = xscale2pmu_handle_irq,
+       .enable         = xscale2pmu_enable_event,
+       .disable        = xscale2pmu_disable_event,
+       .event_map      = xscalepmu_event_map,
+       .raw_event      = xscalepmu_raw_event,
+       .read_counter   = xscale2pmu_read_counter,
+       .write_counter  = xscale2pmu_write_counter,
+       .get_event_idx  = xscale2pmu_get_event_idx,
+       .start          = xscale2pmu_start,
+       .stop           = xscale2pmu_stop,
+       .num_events     = 5,
+       .max_period     = (1LLU << 32) - 1,
+};
+
 static int __init
 init_hw_perf_events(void)
 {
@@ -2086,7 +2924,7 @@ init_hw_perf_events(void)
        unsigned long implementor = (cpuid & 0xFF000000) >> 24;
        unsigned long part_number = (cpuid & 0xFFF0);
 
-       /* We only support ARM CPUs implemented by ARM at the moment. */
+       /* ARM Ltd CPUs. */
        if (0x41 == implementor) {
                switch (part_number) {
                case 0xB360:    /* ARM1136 */
@@ -2105,7 +2943,7 @@ init_hw_perf_events(void)
                        perf_max_events = armv6mpcore_pmu.num_events;
                        break;
                case 0xC080:    /* Cortex-A8 */
-                       armv7pmu.name = ARMV7_PMU_CORTEX_A8_NAME;
+                       armv7pmu.id = ARM_PERF_PMU_ID_CA8;
                        memcpy(armpmu_perf_cache_map, armv7_a8_perf_cache_map,
                                sizeof(armv7_a8_perf_cache_map));
                        armv7pmu.event_map = armv7_a8_pmu_event_map;
@@ -2117,7 +2955,7 @@ init_hw_perf_events(void)
                        perf_max_events = armv7pmu.num_events;
                        break;
                case 0xC090:    /* Cortex-A9 */
-                       armv7pmu.name = ARMV7_PMU_CORTEX_A9_NAME;
+                       armv7pmu.id = ARM_PERF_PMU_ID_CA9;
                        memcpy(armpmu_perf_cache_map, armv7_a9_perf_cache_map,
                                sizeof(armv7_a9_perf_cache_map));
                        armv7pmu.event_map = armv7_a9_pmu_event_map;
@@ -2128,15 +2966,33 @@ init_hw_perf_events(void)
                        armv7pmu.num_events = armv7_reset_read_pmnc();
                        perf_max_events = armv7pmu.num_events;
                        break;
-               default:
-                       pr_info("no hardware support available\n");
-                       perf_max_events = -1;
+               }
+       /* Intel CPUs [xscale]. */
+       } else if (0x69 == implementor) {
+               part_number = (cpuid >> 13) & 0x7;
+               switch (part_number) {
+               case 1:
+                       armpmu = &xscale1pmu;
+                       memcpy(armpmu_perf_cache_map, xscale_perf_cache_map,
+                                       sizeof(xscale_perf_cache_map));
+                       perf_max_events = xscale1pmu.num_events;
+                       break;
+               case 2:
+                       armpmu = &xscale2pmu;
+                       memcpy(armpmu_perf_cache_map, xscale_perf_cache_map,
+                                       sizeof(xscale_perf_cache_map));
+                       perf_max_events = xscale2pmu.num_events;
+                       break;
                }
        }
 
-       if (armpmu)
+       if (armpmu) {
                pr_info("enabled with %s PMU driver, %d counters available\n",
-                       armpmu->name, armpmu->num_events);
+                               arm_pmu_names[armpmu->id], armpmu->num_events);
+       } else {
+               pr_info("no hardware support available\n");
+               perf_max_events = -1;
+       }
 
        return 0;
 }
index a124312..b8af96e 100644 (file)
@@ -2,6 +2,7 @@
  *  linux/arch/arm/kernel/pmu.c
  *
  *  Copyright (C) 2009 picoChip Designs Ltd, Jamie Iles
+ *  Copyright (C) 2010 ARM Ltd, Will Deacon
  *
  * 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
  *
  */
 
+#define pr_fmt(fmt) "PMU: " fmt
+
 #include <linux/cpumask.h>
 #include <linux/err.h>
 #include <linux/interrupt.h>
 #include <linux/kernel.h>
 #include <linux/module.h>
+#include <linux/platform_device.h>
 
 #include <asm/pmu.h>
 
-/*
- * Define the IRQs for the system. We could use something like a platform
- * device but that seems fairly heavyweight for this. Also, the performance
- * counters can't be removed or hotplugged.
- *
- * Ordering is important: init_pmu() will use the ordering to set the affinity
- * to the corresponding core. e.g. the first interrupt will go to cpu 0, the
- * second goes to cpu 1 etc.
- */
-static const int irqs[] = {
-#if defined(CONFIG_ARCH_OMAP2)
-       3,
-#elif defined(CONFIG_ARCH_BCMRING)
-       IRQ_PMUIRQ,
-#elif defined(CONFIG_MACH_REALVIEW_EB)
-       IRQ_EB11MP_PMU_CPU0,
-       IRQ_EB11MP_PMU_CPU1,
-       IRQ_EB11MP_PMU_CPU2,
-       IRQ_EB11MP_PMU_CPU3,
-#elif defined(CONFIG_ARCH_OMAP3)
-       INT_34XX_BENCH_MPU_EMUL,
-#elif defined(CONFIG_ARCH_IOP32X)
-       IRQ_IOP32X_CORE_PMU,
-#elif defined(CONFIG_ARCH_IOP33X)
-       IRQ_IOP33X_CORE_PMU,
-#elif defined(CONFIG_ARCH_PXA)
-       IRQ_PMU,
-#endif
-};
+static volatile long pmu_lock;
+
+static struct platform_device *pmu_devices[ARM_NUM_PMU_DEVICES];
+
+static int __devinit pmu_device_probe(struct platform_device *pdev)
+{
+
+       if (pdev->id < 0 || pdev->id >= ARM_NUM_PMU_DEVICES) {
+               pr_warning("received registration request for unknown "
+                               "device %d\n", pdev->id);
+               return -EINVAL;
+       }
+
+       if (pmu_devices[pdev->id])
+               pr_warning("registering new PMU device type %d overwrites "
+                               "previous registration!\n", pdev->id);
+       else
+               pr_info("registered new PMU device of type %d\n",
+                               pdev->id);
 
-static const struct pmu_irqs pmu_irqs = {
-       .irqs       = irqs,
-       .num_irqs   = ARRAY_SIZE(irqs),
+       pmu_devices[pdev->id] = pdev;
+       return 0;
+}
+
+static struct platform_driver pmu_driver = {
+       .driver         = {
+               .name   = "arm-pmu",
+       },
+       .probe          = pmu_device_probe,
 };
 
-static volatile long pmu_lock;
+static int __init register_pmu_driver(void)
+{
+       return platform_driver_register(&pmu_driver);
+}
+device_initcall(register_pmu_driver);
 
-const struct pmu_irqs *
-reserve_pmu(void)
+struct platform_device *
+reserve_pmu(enum arm_pmu_type device)
 {
-       return test_and_set_bit_lock(0, &pmu_lock) ? ERR_PTR(-EBUSY) :
-               &pmu_irqs;
+       struct platform_device *pdev;
+
+       if (test_and_set_bit_lock(device, &pmu_lock)) {
+               pdev = ERR_PTR(-EBUSY);
+       } else if (pmu_devices[device] == NULL) {
+               clear_bit_unlock(device, &pmu_lock);
+               pdev = ERR_PTR(-ENODEV);
+       } else {
+               pdev = pmu_devices[device];
+       }
+
+       return pdev;
 }
 EXPORT_SYMBOL_GPL(reserve_pmu);
 
 int
-release_pmu(const struct pmu_irqs *irqs)
+release_pmu(struct platform_device *pdev)
 {
-       if (WARN_ON(irqs != &pmu_irqs))
+       if (WARN_ON(pdev != pmu_devices[pdev->id]))
                return -EINVAL;
-       clear_bit_unlock(0, &pmu_lock);
+       clear_bit_unlock(pdev->id, &pmu_lock);
        return 0;
 }
 EXPORT_SYMBOL_GPL(release_pmu);
@@ -87,17 +101,42 @@ set_irq_affinity(int irq,
 #endif
 }
 
-int
-init_pmu(void)
+static int
+init_cpu_pmu(void)
 {
        int i, err = 0;
+       struct platform_device *pdev = pmu_devices[ARM_PMU_DEVICE_CPU];
+
+       if (!pdev) {
+               err = -ENODEV;
+               goto out;
+       }
 
-       for (i = 0; i < pmu_irqs.num_irqs; ++i) {
-               err = set_irq_affinity(pmu_irqs.irqs[i], i);
+       for (i = 0; i < pdev->num_resources; ++i) {
+               err = set_irq_affinity(platform_get_irq(pdev, i), i);
                if (err)
                        break;
        }
 
+out:
+       return err;
+}
+
+int
+init_pmu(enum arm_pmu_type device)
+{
+       int err = 0;
+
+       switch (device) {
+       case ARM_PMU_DEVICE_CPU:
+               err = init_cpu_pmu();
+               break;
+       default:
+               pr_warning("attempt to initialise unknown device %d\n",
+                               device);
+               err = -EINVAL;
+       }
+
        return err;
 }
 EXPORT_SYMBOL_GPL(init_pmu);
index a01194e..b8c3d0f 100644 (file)
@@ -168,7 +168,7 @@ int __cpu_disable(void)
        struct task_struct *p;
        int ret;
 
-       ret = mach_cpu_disable(cpu);
+       ret = platform_cpu_disable(cpu);
        if (ret)
                return ret;
 
index 2875380..38c261f 100644 (file)
@@ -72,12 +72,15 @@ unsigned long profile_pc(struct pt_regs *regs)
 EXPORT_SYMBOL(profile_pc);
 #endif
 
-#ifndef CONFIG_GENERIC_TIME
-static unsigned long dummy_gettimeoffset(void)
+#ifdef CONFIG_ARCH_USES_GETTIMEOFFSET
+u32 arch_gettimeoffset(void)
 {
+       if (system_timer->offset != NULL)
+               return system_timer->offset() * 1000;
+
        return 0;
 }
-#endif
+#endif /* CONFIG_ARCH_USES_GETTIMEOFFSET */
 
 #ifdef CONFIG_LEDS_TIMER
 static inline void do_leds(void)
@@ -93,63 +96,6 @@ static inline void do_leds(void)
 #define        do_leds()
 #endif
 
-#ifndef CONFIG_GENERIC_TIME
-void do_gettimeofday(struct timeval *tv)
-{
-       unsigned long flags;
-       unsigned long seq;
-       unsigned long usec, sec;
-
-       do {
-               seq = read_seqbegin_irqsave(&xtime_lock, flags);
-               usec = system_timer->offset();
-               sec = xtime.tv_sec;
-               usec += xtime.tv_nsec / 1000;
-       } while (read_seqretry_irqrestore(&xtime_lock, seq, flags));
-
-       /* usec may have gone up a lot: be safe */
-       while (usec >= 1000000) {
-               usec -= 1000000;
-               sec++;
-       }
-
-       tv->tv_sec = sec;
-       tv->tv_usec = usec;
-}
-
-EXPORT_SYMBOL(do_gettimeofday);
-
-int do_settimeofday(struct timespec *tv)
-{
-       time_t wtm_sec, sec = tv->tv_sec;
-       long wtm_nsec, nsec = tv->tv_nsec;
-
-       if ((unsigned long)tv->tv_nsec >= NSEC_PER_SEC)
-               return -EINVAL;
-
-       write_seqlock_irq(&xtime_lock);
-       /*
-        * This is revolting. We need to set "xtime" correctly. However, the
-        * value in this location is the value at the most recent update of
-        * wall time.  Discover what correction gettimeofday() would have
-        * done, and then undo it!
-        */
-       nsec -= system_timer->offset() * NSEC_PER_USEC;
-
-       wtm_sec  = wall_to_monotonic.tv_sec + (xtime.tv_sec - sec);
-       wtm_nsec = wall_to_monotonic.tv_nsec + (xtime.tv_nsec - nsec);
-
-       set_normalized_timespec(&xtime, sec, nsec);
-       set_normalized_timespec(&wall_to_monotonic, wtm_sec, wtm_nsec);
-
-       ntp_clear();
-       write_sequnlock_irq(&xtime_lock);
-       clock_was_set();
-       return 0;
-}
-
-EXPORT_SYMBOL(do_settimeofday);
-#endif /* !CONFIG_GENERIC_TIME */
 
 #ifndef CONFIG_GENERIC_CLOCKEVENTS
 /*
@@ -214,10 +160,6 @@ device_initcall(timer_init_sysfs);
 
 void __init time_init(void)
 {
-#ifndef CONFIG_GENERIC_TIME
-       if (system_timer->offset == NULL)
-               system_timer->offset = dummy_gettimeoffset;
-#endif
        system_timer->init();
 }
 
index 2db43a5..1039764 100644 (file)
@@ -97,6 +97,7 @@ config ARCH_AT572D940HF
 
 config ARCH_AT91X40
        bool "AT91x40"
+       select ARCH_USES_GETTIMEOFFSET
 
 endchoice
 
@@ -360,6 +361,19 @@ config MACH_CPU9G20
          Select this if you are using a Eukrea Electromatique's
          CPU9G20 Board <http://www.eukrea.com/>
 
+config MACH_PORTUXG20
+       bool "taskit PortuxG20"
+       help
+         Select this if you are using taskit's PortuxG20.
+         <http://www.taskit.de/en/>
+
+config MACH_STAMP9G20
+       bool "taskit Stamp9G20 CPU module"
+       help
+         Select this if you are using taskit's Stamp9G20 CPU module on its
+         evaluation board.
+         <http://www.taskit.de/en/>
+
 endif
 
 # ----------------------------------------------------------
index d400455..c1f821e 100644 (file)
@@ -63,6 +63,8 @@ obj-$(CONFIG_MACH_AT91SAM9RLEK)       += board-sam9rlek.o
 obj-$(CONFIG_MACH_AT91SAM9G20EK) += board-sam9g20ek.o
 obj-$(CONFIG_MACH_AT91SAM9G20EK_2MMC) += board-sam9g20ek-2slot-mmc.o
 obj-$(CONFIG_MACH_CPU9G20)     += board-cpu9krea.o
+obj-$(CONFIG_MACH_STAMP9G20)   += board-stamp9g20.o
+obj-$(CONFIG_MACH_PORTUXG20)   += board-stamp9g20.o
 
 # AT91SAM9G45 board-specific support
 obj-$(CONFIG_MACH_AT91SAM9G45EKES) += board-sam9m10g45ek.o
diff --git a/arch/arm/mach-at91/board-stamp9g20.c b/arch/arm/mach-at91/board-stamp9g20.c
new file mode 100644 (file)
index 0000000..8795827
--- /dev/null
@@ -0,0 +1,315 @@
+/*
+ *  Copyright (C) 2010 Christian Glindkamp <christian.glindkamp@taskit.de>
+ *                     taskit GmbH
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+#include <linux/mm.h>
+#include <linux/platform_device.h>
+#include <linux/gpio.h>
+#include <linux/w1-gpio.h>
+
+#include <asm/mach-types.h>
+#include <asm/mach/arch.h>
+
+#include <mach/board.h>
+#include <mach/at91sam9_smc.h>
+
+#include "sam9_smc.h"
+#include "generic.h"
+
+
+static void __init portuxg20_map_io(void)
+{
+       /* Initialize processor: 18.432 MHz crystal */
+       at91sam9260_initialize(18432000);
+
+       /* DGBU on ttyS0. (Rx & Tx only) */
+       at91_register_uart(0, 0, 0);
+
+       /* USART0 on ttyS1. (Rx, Tx, CTS, RTS, DTR, DSR, DCD, RI) */
+       at91_register_uart(AT91SAM9260_ID_US0, 1, ATMEL_UART_CTS | ATMEL_UART_RTS
+                                               | ATMEL_UART_DTR | ATMEL_UART_DSR
+                                               | ATMEL_UART_DCD | ATMEL_UART_RI);
+
+       /* USART1 on ttyS2. (Rx, Tx, CTS, RTS) */
+       at91_register_uart(AT91SAM9260_ID_US1, 2, ATMEL_UART_CTS | ATMEL_UART_RTS);
+
+       /* USART2 on ttyS3. (Rx, Tx, CTS, RTS) */
+       at91_register_uart(AT91SAM9260_ID_US2, 3, ATMEL_UART_CTS | ATMEL_UART_RTS);
+
+       /* USART4 on ttyS5. (Rx, Tx only) */
+       at91_register_uart(AT91SAM9260_ID_US4, 5, 0);
+
+       /* USART5 on ttyS6. (Rx, Tx only) */
+       at91_register_uart(AT91SAM9260_ID_US5, 6, 0);
+
+       /* set serial console to ttyS0 (ie, DBGU) */
+       at91_set_serial_console(0);
+}
+
+static void __init stamp9g20_map_io(void)
+{
+       /* Initialize processor: 18.432 MHz crystal */
+       at91sam9260_initialize(18432000);
+
+       /* DGBU on ttyS0. (Rx & Tx only) */
+       at91_register_uart(0, 0, 0);
+
+       /* USART0 on ttyS1. (Rx, Tx, CTS, RTS, DTR, DSR, DCD, RI) */
+       at91_register_uart(AT91SAM9260_ID_US0, 1, ATMEL_UART_CTS | ATMEL_UART_RTS
+                                               | ATMEL_UART_DTR | ATMEL_UART_DSR
+                                               | ATMEL_UART_DCD | ATMEL_UART_RI);
+
+       /* set serial console to ttyS0 (ie, DBGU) */
+       at91_set_serial_console(0);
+}
+
+static void __init init_irq(void)
+{
+       at91sam9260_init_interrupts(NULL);
+}
+
+
+/*
+ * NAND flash
+ */
+static struct atmel_nand_data __initdata nand_data = {
+       .ale            = 21,
+       .cle            = 22,
+       .rdy_pin        = AT91_PIN_PC13,
+       .enable_pin     = AT91_PIN_PC14,
+       .bus_width_16   = 0,
+};
+
+static struct sam9_smc_config __initdata nand_smc_config = {
+       .ncs_read_setup         = 0,
+       .nrd_setup              = 2,
+       .ncs_write_setup        = 0,
+       .nwe_setup              = 2,
+
+       .ncs_read_pulse         = 4,
+       .nrd_pulse              = 4,
+       .ncs_write_pulse        = 4,
+       .nwe_pulse              = 4,
+
+       .read_cycle             = 7,
+       .write_cycle            = 7,
+
+       .mode                   = AT91_SMC_READMODE | AT91_SMC_WRITEMODE | AT91_SMC_EXNWMODE_DISABLE | AT91_SMC_DBW_8,
+       .tdf_cycles             = 3,
+};
+
+static void __init add_device_nand(void)
+{
+       /* configure chip-select 3 (NAND) */
+       sam9_smc_configure(3, &nand_smc_config);
+
+       at91_add_device_nand(&nand_data);
+}
+
+
+/*
+ * MCI (SD/MMC)
+ * det_pin, wp_pin and vcc_pin are not connected
+ */
+#if defined(CONFIG_MMC_ATMELMCI) || defined(CONFIG_MMC_ATMELMCI_MODULE)
+static struct mci_platform_data __initdata mmc_data = {
+       .slot[0] = {
+               .bus_width      = 4,
+       },
+};
+#else
+static struct at91_mmc_data __initdata mmc_data = {
+       .slot_b         = 0,
+       .wire4          = 1,
+};
+#endif
+
+
+/*
+ * USB Host port
+ */
+static struct at91_usbh_data __initdata usbh_data = {
+       .ports          = 2,
+};
+
+
+/*
+ * USB Device port
+ */
+static struct at91_udc_data __initdata portuxg20_udc_data = {
+       .vbus_pin       = AT91_PIN_PC7,
+       .pullup_pin     = 0,            /* pull-up driven by UDC */
+};
+
+static struct at91_udc_data __initdata stamp9g20_udc_data = {
+       .vbus_pin       = AT91_PIN_PA22,
+       .pullup_pin     = 0,            /* pull-up driven by UDC */
+};
+
+
+/*
+ * MACB Ethernet device
+ */
+static struct at91_eth_data __initdata macb_data = {
+       .phy_irq_pin    = AT91_PIN_PA28,
+       .is_rmii        = 1,
+};
+
+
+/*
+ * LEDs
+ */
+static struct gpio_led portuxg20_leds[] = {
+       {
+               .name                   = "LED2",
+               .gpio                   = AT91_PIN_PC5,
+               .default_trigger        = "none",
+       }, {
+               .name                   = "LED3",
+               .gpio                   = AT91_PIN_PC4,
+               .default_trigger        = "none",
+       }, {
+               .name                   = "LED4",
+               .gpio                   = AT91_PIN_PC10,
+               .default_trigger        = "heartbeat",
+       }
+};
+
+static struct gpio_led stamp9g20_leds[] = {
+       {
+               .name                   = "D8",
+               .gpio                   = AT91_PIN_PB18,
+               .active_low             = 1,
+               .default_trigger        = "none",
+       }, {
+               .name                   = "D9",
+               .gpio                   = AT91_PIN_PB19,
+               .active_low             = 1,
+               .default_trigger        = "none",
+       }, {
+               .name                   = "D10",
+               .gpio                   = AT91_PIN_PB20,
+               .active_low             = 1,
+               .default_trigger        = "heartbeat",
+       }
+};
+
+
+/*
+ * SPI devices
+ */
+static struct spi_board_info portuxg20_spi_devices[] = {
+       {
+               .modalias       = "spidev",
+               .chip_select    = 0,
+               .max_speed_hz   = 1 * 1000 * 1000,
+               .bus_num        = 0,
+       }, {
+               .modalias       = "spidev",
+               .chip_select    = 0,
+               .max_speed_hz   = 1 * 1000 * 1000,
+               .bus_num        = 1,
+       },
+};
+
+
+/*
+ * Dallas 1-Wire
+ */
+static struct w1_gpio_platform_data w1_gpio_pdata = {
+       .pin            = AT91_PIN_PA29,
+       .is_open_drain  = 1,
+};
+
+static struct platform_device w1_device = {
+       .name                   = "w1-gpio",
+       .id                     = -1,
+       .dev.platform_data      = &w1_gpio_pdata,
+};
+
+void add_w1(void)
+{
+       at91_set_GPIO_periph(w1_gpio_pdata.pin, 1);
+       at91_set_multi_drive(w1_gpio_pdata.pin, 1);
+       platform_device_register(&w1_device);
+}
+
+
+static void __init generic_board_init(void)
+{
+       /* Serial */
+       at91_add_device_serial();
+       /* NAND */
+       add_device_nand();
+       /* MMC */
+#if defined(CONFIG_MMC_ATMELMCI) || defined(CONFIG_MMC_ATMELMCI_MODULE)
+       at91_add_device_mci(0, &mmc_data);
+#else
+       at91_add_device_mmc(0, &mmc_data);
+#endif
+       /* USB Host */
+       at91_add_device_usbh(&usbh_data);
+       /* Ethernet */
+       at91_add_device_eth(&macb_data);
+       /* I2C */
+       at91_add_device_i2c(NULL, 0);
+       /* W1 */
+       add_w1();
+}
+
+static void __init portuxg20_board_init(void)
+{
+       generic_board_init();
+       /* SPI */
+       at91_add_device_spi(portuxg20_spi_devices, ARRAY_SIZE(portuxg20_spi_devices));
+       /* USB Device */
+       at91_add_device_udc(&portuxg20_udc_data);
+       /* LEDs */
+       at91_gpio_leds(portuxg20_leds, ARRAY_SIZE(portuxg20_leds));
+}
+
+static void __init stamp9g20_board_init(void)
+{
+       generic_board_init();
+       /* USB Device */
+       at91_add_device_udc(&stamp9g20_udc_data);
+       /* LEDs */
+       at91_gpio_leds(stamp9g20_leds, ARRAY_SIZE(stamp9g20_leds));
+}
+
+MACHINE_START(PORTUXG20, "taskit PortuxG20")
+       /* Maintainer: taskit GmbH */
+       .phys_io        = AT91_BASE_SYS,
+       .io_pg_offst    = (AT91_VA_BASE_SYS >> 18) & 0xfffc,
+       .boot_params    = AT91_SDRAM_BASE + 0x100,
+       .timer          = &at91sam926x_timer,
+       .map_io         = portuxg20_map_io,
+       .init_irq       = init_irq,
+       .init_machine   = portuxg20_board_init,
+MACHINE_END
+
+MACHINE_START(STAMP9G20, "taskit Stamp9G20")
+       /* Maintainer: taskit GmbH */
+       .phys_io        = AT91_BASE_SYS,
+       .io_pg_offst    = (AT91_VA_BASE_SYS >> 18) & 0xfffc,
+       .boot_params    = AT91_SDRAM_BASE + 0x100,
+       .timer          = &at91sam926x_timer,
+       .map_io         = stamp9g20_map_io,
+       .init_irq       = init_irq,
+       .init_machine   = stamp9g20_board_init,
+MACHINE_END
index ceaec6c..df2ed84 100644 (file)
@@ -39,6 +39,7 @@
 #include <linux/usb/atmel_usba_udc.h>
 #include <linux/atmel-mci.h>
 #include <sound/atmel-ac97c.h>
+#include <linux/serial.h>
 
  /* USB Device */
 struct at91_udc_data {
@@ -143,9 +144,10 @@ extern struct platform_device *atmel_default_console_device;
 extern void __init __deprecated at91_init_serial(struct at91_uart_config *config);
 
 struct atmel_uart_data {
-       short           use_dma_tx;     /* use transmit DMA? */
-       short           use_dma_rx;     /* use receive DMA? */
-       void __iomem    *regs;          /* virtual base address, if any */
+       short                   use_dma_tx;     /* use transmit DMA? */
+       short                   use_dma_rx;     /* use receive DMA? */
+       void __iomem            *regs;          /* virt. base address, if any */
+       struct serial_rs485     rs485;          /* rs485 settings */
 };
 extern void __init at91_add_device_serial(void);
 
index 5a06501..833659d 100644 (file)
@@ -21,7 +21,7 @@
 #define ARCH_ID_AT91SAM9260    0x019803a0
 #define ARCH_ID_AT91SAM9261    0x019703a0
 #define ARCH_ID_AT91SAM9263    0x019607a0
-#define ARCH_ID_AT91SAM9G10    0x819903a0
+#define ARCH_ID_AT91SAM9G10    0x019903a0
 #define ARCH_ID_AT91SAM9G20    0x019905a0
 #define ARCH_ID_AT91SAM9RL64   0x019b03a0
 #define ARCH_ID_AT91SAM9G45    0x819b05a0
@@ -108,7 +108,7 @@ static inline unsigned long at91cap9_rev_identify(void)
 #endif
 
 #ifdef CONFIG_ARCH_AT91SAM9G10
-#define cpu_is_at91sam9g10()   (at91_cpu_identify() == ARCH_ID_AT91SAM9G10)
+#define cpu_is_at91sam9g10()   ((at91_cpu_identify() & ~AT91_CIDR_EXT) == ARCH_ID_AT91SAM9G10)
 #else
 #define cpu_is_at91sam9g10()   (0)
 #endif
index 5268af3..c80e090 100644 (file)
 #include <mach/hardware.h>
 #include <mach/at91_st.h>
 #include <mach/at91_dbgu.h>
+#include <mach/at91_pmc.h>
 
 static inline void arch_idle(void)
 {
+#ifndef CONFIG_DEBUG_KERNEL
        /*
         * Disable the processor clock.  The processor will be automatically
         * re-enabled by an interrupt or by a reset.
         */
-//     at91_sys_write(AT91_PMC_SCDR, AT91_PMC_PCK);
-
+       at91_sys_write(AT91_PMC_SCDR, AT91_PMC_PCK);
+#else
        /*
         * Set the processor (CP15) into 'Wait for Interrupt' mode.
         * Unlike disabling the processor clock via the PMC (above)
         *  this allows the processor to be woken via JTAG.
         */
        cpu_do_idle();
+#endif
 }
 
 void (*at91_arch_reset)(void);
index 53dd2a9..2f13919 100644 (file)
@@ -29,6 +29,7 @@
 #include <asm/setup.h>
 #include <asm/mach-types.h>
 #include <asm/mach/time.h>
+#include <asm/pmu.h>
 
 #include <asm/mach/arch.h>
 #include <mach/dma.h>
@@ -85,8 +86,23 @@ static struct platform_device nand_device = {
        .num_resources  = ARRAY_SIZE(nand_resource),
 };
 
+static struct resource pmu_resource = {
+       .start  = IRQ_PMUIRQ,
+       .end    = IRQ_PMUIRQ,
+       .flags  = IORESOURCE_IRQ,
+};
+
+static struct platform_device pmu_device = {
+       .name           = "arm-pmu",
+       .id             = ARM_PMU_DEVICE_CPU,
+       .resource       = &pmu_resource,
+       .num_resources  = 1,
+};
+
+
 static struct platform_device *devices[] __initdata = {
        &nand_device,
+       &pmu_device,
 };
 
 /****************************************************************************
index a7b4591..9865921 100644 (file)
@@ -22,7 +22,6 @@
 #include <linux/kernel.h>
 #include <linux/mm.h>
 #include <linux/init.h>
-#include <linux/bootmem.h>
 
 #include <asm/sizes.h>
 #include <mach/hardware.h>
index caf6d51..3a1a855 100644 (file)
@@ -41,7 +41,7 @@ static struct platform_device adssphere_flash = {
        .resource       = &adssphere_flash_resource,
 };
 
-static struct ep93xx_eth_data adssphere_eth_data = {
+static struct ep93xx_eth_data __initdata adssphere_eth_data = {
        .phy_id         = 1,
 };
 
index 5f80092..e29bdef 100644 (file)
@@ -96,6 +96,10 @@ static struct clk clk_keypad = {
        .enable_mask    = EP93XX_SYSCON_KEYTCHCLKDIV_KEN,
        .set_rate       = set_keytchclk_rate,
 };
+static struct clk clk_spi = {
+       .parent         = &clk_xtali,
+       .rate           = EP93XX_EXT_CLK_RATE,
+};
 static struct clk clk_pwm = {
        .parent         = &clk_xtali,
        .rate           = EP93XX_EXT_CLK_RATE,
@@ -186,6 +190,7 @@ static struct clk_lookup clocks[] = {
        INIT_CK("ep93xx-ohci",          NULL,           &clk_usb_host),
        INIT_CK("ep93xx-keypad",        NULL,           &clk_keypad),
        INIT_CK("ep93xx-fb",            NULL,           &clk_video),
+       INIT_CK("ep93xx-spi.0",         NULL,           &clk_spi),
        INIT_CK(NULL,                   "pwm_clk",      &clk_pwm),
        INIT_CK(NULL,                   "m2p0",         &clk_m2p0),
        INIT_CK(NULL,                   "m2p1",         &clk_m2p1),
@@ -473,6 +478,14 @@ static int __init ep93xx_clock_init(void)
        /* Initialize the pll2 derived clocks */
        clk_usb_host.rate = clk_pll2.rate / (((value >> 28) & 0xf) + 1);
 
+       /*
+        * EP93xx SSP clock rate was doubled in version E2. For more information
+        * see:
+        *     http://www.cirrus.com/en/pubs/appNote/AN273REV4.pdf
+        */
+       if (ep93xx_chip_revision() < EP93XX_CHIP_REV_E2)
+               clk_spi.rate /= 2;
+
        pr_info("PLL1 running at %ld MHz, PLL2 at %ld MHz\n",
                clk_pll1.rate / 1000000, clk_pll2.rate / 1000000);
        pr_info("FCLK %ld MHz, HCLK %ld MHz, PCLK %ld MHz\n",
index 90fb591..9092677 100644 (file)
 #include <linux/amba/serial.h>
 #include <linux/i2c.h>
 #include <linux/i2c-gpio.h>
+#include <linux/spi/spi.h>
 
 #include <mach/hardware.h>
 #include <mach/fb.h>
 #include <mach/ep93xx_keypad.h>
+#include <mach/ep93xx_spi.h>
 
 #include <asm/mach/map.h>
 #include <asm/mach/time.h>
@@ -222,6 +224,20 @@ void ep93xx_devcfg_set_clear(unsigned int set_bits, unsigned int clear_bits)
 }
 EXPORT_SYMBOL(ep93xx_devcfg_set_clear);
 
+/**
+ * ep93xx_chip_revision() - returns the EP93xx chip revision
+ *
+ * See <mach/platform.h> for more information.
+ */
+unsigned int ep93xx_chip_revision(void)
+{
+       unsigned int v;
+
+       v = __raw_readl(EP93XX_SYSCON_SYSCFG);
+       v &= EP93XX_SYSCON_SYSCFG_REV_MASK;
+       v >>= EP93XX_SYSCON_SYSCFG_REV_SHIFT;
+       return v;
+}
 
 /*************************************************************************
  * EP93xx peripheral handling
@@ -330,6 +346,10 @@ static struct platform_device ep93xx_ohci_device = {
        .resource       = ep93xx_ohci_resources,
 };
 
+
+/*************************************************************************
+ * EP93xx ethernet peripheral handling
+ *************************************************************************/
 static struct ep93xx_eth_data ep93xx_eth_data;
 
 static struct resource ep93xx_eth_resource[] = {
@@ -354,6 +374,12 @@ static struct platform_device ep93xx_eth_device = {
        .resource       = ep93xx_eth_resource,
 };
 
+/**
+ * ep93xx_register_eth - Register the built-in ethernet platform device.
+ * @data:      platform specific ethernet configuration (__initdata)
+ * @copy_addr: flag indicating that the MAC address should be copied
+ *             from the IndAd registers (as programmed by the bootloader)
+ */
 void __init ep93xx_register_eth(struct ep93xx_eth_data *data, int copy_addr)
 {
        if (copy_addr)
@@ -370,11 +396,19 @@ void __init ep93xx_register_eth(struct ep93xx_eth_data *data, int copy_addr)
 static struct i2c_gpio_platform_data ep93xx_i2c_data;
 
 static struct platform_device ep93xx_i2c_device = {
-       .name                   = "i2c-gpio",
-       .id                     = 0,
-       .dev.platform_data      = &ep93xx_i2c_data,
+       .name           = "i2c-gpio",
+       .id             = 0,
+       .dev            = {
+               .platform_data  = &ep93xx_i2c_data,
+       },
 };
 
+/**
+ * ep93xx_register_i2c - Register the i2c platform device.
+ * @data:      platform specific i2c-gpio configuration (__initdata)
+ * @devices:   platform specific i2c bus device information (__initdata)
+ * @num:       the number of devices on the i2c bus
+ */
 void __init ep93xx_register_i2c(struct i2c_gpio_platform_data *data,
                                struct i2c_board_info *devices, int num)
 {
@@ -398,17 +432,67 @@ void __init ep93xx_register_i2c(struct i2c_gpio_platform_data *data,
        platform_device_register(&ep93xx_i2c_device);
 }
 
+/*************************************************************************
+ * EP93xx SPI peripheral handling
+ *************************************************************************/
+static struct ep93xx_spi_info ep93xx_spi_master_data;
+
+static struct resource ep93xx_spi_resources[] = {
+       {
+               .start  = EP93XX_SPI_PHYS_BASE,
+               .end    = EP93XX_SPI_PHYS_BASE + 0x18 - 1,
+               .flags  = IORESOURCE_MEM,
+       },
+       {
+               .start  = IRQ_EP93XX_SSP,
+               .end    = IRQ_EP93XX_SSP,
+               .flags  = IORESOURCE_IRQ,
+       },
+};
+
+static struct platform_device ep93xx_spi_device = {
+       .name           = "ep93xx-spi",
+       .id             = 0,
+       .dev            = {
+               .platform_data = &ep93xx_spi_master_data,
+       },
+       .num_resources  = ARRAY_SIZE(ep93xx_spi_resources),
+       .resource       = ep93xx_spi_resources,
+};
+
+/**
+ * ep93xx_register_spi() - registers spi platform device
+ * @info: ep93xx board specific spi master info (__initdata)
+ * @devices: SPI devices to register (__initdata)
+ * @num: number of SPI devices to register
+ *
+ * This function registers platform device for the EP93xx SPI controller and
+ * also makes sure that SPI pins are muxed so that I2S is not using those pins.
+ */
+void __init ep93xx_register_spi(struct ep93xx_spi_info *info,
+                               struct spi_board_info *devices, int num)
+{
+       /*
+        * When SPI is used, we need to make sure that I2S is muxed off from
+        * SPI pins.
+        */
+       ep93xx_devcfg_clear_bits(EP93XX_SYSCON_DEVCFG_I2SONSSP);
+
+       ep93xx_spi_master_data = *info;
+       spi_register_board_info(devices, num);
+       platform_device_register(&ep93xx_spi_device);
+}
 
 /*************************************************************************
  * EP93xx LEDs
  *************************************************************************/
 static struct gpio_led ep93xx_led_pins[] = {
        {
-               .name                   = "platform:grled",
-               .gpio                   = EP93XX_GPIO_LINE_GRLED,
+               .name   = "platform:grled",
+               .gpio   = EP93XX_GPIO_LINE_GRLED,
        }, {
-               .name                   = "platform:rdled",
-               .gpio                   = EP93XX_GPIO_LINE_RDLED,
+               .name   = "platform:rdled",
+               .gpio   = EP93XX_GPIO_LINE_RDLED,
        },
 };
 
@@ -528,7 +612,7 @@ static struct platform_device ep93xx_fb_device = {
        .name                   = "ep93xx-fb",
        .id                     = -1,
        .dev                    = {
-               .platform_data  = &ep93xxfb_data,
+               .platform_data          = &ep93xxfb_data,
                .coherent_dma_mask      = DMA_BIT_MASK(32),
                .dma_mask               = &ep93xx_fb_device.dev.coherent_dma_mask,
        },
@@ -536,6 +620,10 @@ static struct platform_device ep93xx_fb_device = {
        .resource               = ep93xx_fb_resource,
 };
 
+/**
+ * ep93xx_register_fb - Register the framebuffer platform device.
+ * @data:      platform specific framebuffer configuration (__initdata)
+ */
 void __init ep93xx_register_fb(struct ep93xxfb_mach_info *data)
 {
        ep93xxfb_data = *data;
@@ -546,6 +634,8 @@ void __init ep93xx_register_fb(struct ep93xxfb_mach_info *data)
 /*************************************************************************
  * EP93xx matrix keypad peripheral handling
  *************************************************************************/
+static struct ep93xx_keypad_platform_data ep93xx_keypad_data;
+
 static struct resource ep93xx_keypad_resource[] = {
        {
                .start  = EP93XX_KEY_MATRIX_PHYS_BASE,
@@ -559,15 +649,22 @@ static struct resource ep93xx_keypad_resource[] = {
 };
 
 static struct platform_device ep93xx_keypad_device = {
-       .name                   = "ep93xx-keypad",
-       .id                     = -1,
-       .num_resources          = ARRAY_SIZE(ep93xx_keypad_resource),
-       .resource               = ep93xx_keypad_resource,
+       .name           = "ep93xx-keypad",
+       .id             = -1,
+       .dev            = {
+               .platform_data  = &ep93xx_keypad_data,
+       },
+       .num_resources  = ARRAY_SIZE(ep93xx_keypad_resource),
+       .resource       = ep93xx_keypad_resource,
 };
 
+/**
+ * ep93xx_register_keypad - Register the keypad platform device.
+ * @data:      platform specific keypad configuration (__initdata)
+ */
 void __init ep93xx_register_keypad(struct ep93xx_keypad_platform_data *data)
 {
-       ep93xx_keypad_device.dev.platform_data = data;
+       ep93xx_keypad_data = *data;
        platform_device_register(&ep93xx_keypad_device);
 }
 
index d22d67a..3884182 100644 (file)
@@ -74,7 +74,7 @@ static void __init edb93xx_register_flash(void)
        }
 }
 
-static struct ep93xx_eth_data edb93xx_eth_data = {
+static struct ep93xx_eth_data __initdata edb93xx_eth_data = {
        .phy_id         = 1,
 };
 
@@ -82,7 +82,7 @@ static struct ep93xx_eth_data edb93xx_eth_data = {
 /*************************************************************************
  * EDB93xx i2c peripheral handling
  *************************************************************************/
-static struct i2c_gpio_platform_data edb93xx_i2c_gpio_data = {
+static struct i2c_gpio_platform_data __initdata edb93xx_i2c_gpio_data = {
        .sda_pin                = EP93XX_GPIO_LINE_EEDAT,
        .sda_is_open_drain      = 0,
        .scl_pin                = EP93XX_GPIO_LINE_EECLK,
index 3da7ca8..a809618 100644 (file)
@@ -41,7 +41,7 @@ static struct platform_device gesbc9312_flash = {
        .resource       = &gesbc9312_flash_resource,
 };
 
-static struct ep93xx_eth_data gesbc9312_eth_data = {
+static struct ep93xx_eth_data __initdata gesbc9312_eth_data = {
        .phy_id         = 1,
 };
 
index 93e2ecc..b1e096f 100644 (file)
 
 #define EP93XX_AAC_BASE                        EP93XX_APB_IOMEM(0x00080000)
 
+#define EP93XX_SPI_PHYS_BASE           EP93XX_APB_PHYS(0x000a0000)
 #define EP93XX_SPI_BASE                        EP93XX_APB_IOMEM(0x000a0000)
 
 #define EP93XX_IRDA_BASE               EP93XX_APB_IOMEM(0x000b0000)
index c6dc14d..9a4413d 100644 (file)
@@ -6,9 +6,11 @@
 
 struct i2c_gpio_platform_data;
 struct i2c_board_info;
+struct spi_board_info;
 struct platform_device;
 struct ep93xxfb_mach_info;
 struct ep93xx_keypad_platform_data;
+struct ep93xx_spi_info;
 
 struct ep93xx_eth_data
 {
@@ -33,9 +35,19 @@ static inline void ep93xx_devcfg_clear_bits(unsigned int bits)
        ep93xx_devcfg_set_clear(0x00, bits);
 }
 
+#define EP93XX_CHIP_REV_D0     3
+#define EP93XX_CHIP_REV_D1     4
+#define EP93XX_CHIP_REV_E0     5
+#define EP93XX_CHIP_REV_E1     6
+#define EP93XX_CHIP_REV_E2     7
+
+unsigned int ep93xx_chip_revision(void);
+
 void ep93xx_register_eth(struct ep93xx_eth_data *data, int copy_addr);
 void ep93xx_register_i2c(struct i2c_gpio_platform_data *data,
                         struct i2c_board_info *devices, int num);
+void ep93xx_register_spi(struct ep93xx_spi_info *info,
+                        struct spi_board_info *devices, int num);
 void ep93xx_register_fb(struct ep93xxfb_mach_info *data);
 void ep93xx_register_pwm(int pwm0, int pwm1);
 int ep93xx_pwm_acquire_gpio(struct platform_device *pdev);
index c33360e..1cc911b 100644 (file)
@@ -80,7 +80,7 @@ static void __init micro9_register_flash(void)
 /*************************************************************************
  * Micro9 Ethernet
  *************************************************************************/
-static struct ep93xx_eth_data micro9_eth_data = {
+static struct ep93xx_eth_data __initdata micro9_eth_data = {
        .phy_id         = 0x1f,
 };
 
index cd93990..388aec9 100644 (file)
@@ -49,17 +49,17 @@ static struct platform_device simone_flash = {
        },
 };
 
-static struct ep93xx_eth_data simone_eth_data = {
+static struct ep93xx_eth_data __initdata simone_eth_data = {
        .phy_id         = 1,
 };
 
-static struct ep93xxfb_mach_info simone_fb_info = {
+static struct ep93xxfb_mach_info __initdata simone_fb_info = {
        .num_modes      = EP93XXFB_USE_MODEDB,
        .bpp            = 16,
        .flags          = EP93XXFB_USE_SDCSN0 | EP93XXFB_PCLK_FALLING,
 };
 
-static struct i2c_gpio_platform_data simone_i2c_gpio_data = {
+static struct i2c_gpio_platform_data __initdata simone_i2c_gpio_data = {
        .sda_pin                = EP93XX_GPIO_LINE_EEDAT,
        .sda_is_open_drain      = 0,
        .scl_pin                = EP93XX_GPIO_LINE_EECLK,
index 51134b0..38deaee 100644 (file)
@@ -125,11 +125,11 @@ static struct platform_device snappercl15_nand_device = {
        .num_resources          = ARRAY_SIZE(snappercl15_nand_resource),
 };
 
-static struct ep93xx_eth_data snappercl15_eth_data = {
+static struct ep93xx_eth_data __initdata snappercl15_eth_data = {
        .phy_id                 = 1,
 };
 
-static struct i2c_gpio_platform_data snappercl15_i2c_gpio_data = {
+static struct i2c_gpio_platform_data __initdata snappercl15_i2c_gpio_data = {
        .sda_pin                = EP93XX_GPIO_LINE_EEDAT,
        .sda_is_open_drain      = 0,
        .scl_pin                = EP93XX_GPIO_LINE_EECLK,
@@ -145,7 +145,7 @@ static struct i2c_board_info __initdata snappercl15_i2c_data[] = {
        },
 };
 
-static struct ep93xxfb_mach_info snappercl15_fb_info = {
+static struct ep93xxfb_mach_info __initdata snappercl15_fb_info = {
        .num_modes              = EP93XXFB_USE_MODEDB,
        .bpp                    = 16,
 };
index fac1ec7..9553031 100644 (file)
@@ -186,7 +186,7 @@ static struct platform_device ts72xx_wdt_device = {
        .resource       = ts72xx_wdt_resources,
 };
 
-static struct ep93xx_eth_data ts72xx_eth_data = {
+static struct ep93xx_eth_data __initdata ts72xx_eth_data = {
        .phy_id         = 1,
 };
 
index df97d16..27db275 100644 (file)
@@ -11,6 +11,7 @@ config ARCH_INTEGRATOR_AP
 config ARCH_INTEGRATOR_CP
        bool "Support Integrator/CP platform"
        select ARCH_CINTEGRATOR
+       select ARM_TIMER_SP804
        help
          Include support for the ARM(R) Integrator CP platform.
 
index 6a5ef8d..ebeef96 100644 (file)
@@ -4,7 +4,7 @@
 
 # Object file lists.
 
-obj-y                                  := clock.o core.o lm.o
+obj-y                                  := core.o lm.o
 obj-$(CONFIG_ARCH_INTEGRATOR_AP)       += integrator_ap.o
 obj-$(CONFIG_ARCH_INTEGRATOR_CP)       += integrator_cp.o
 
diff --git a/arch/arm/mach-integrator/common.h b/arch/arm/mach-integrator/common.h
deleted file mode 100644 (file)
index 609c49d..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-extern void integrator_time_init(unsigned long, unsigned int);
-extern unsigned long integrator_gettimeoffset(void);
index 8b390e3..b02cfc0 100644 (file)
 #include <asm/clkdev.h>
 #include <mach/clkdev.h>
 #include <mach/hardware.h>
+#include <mach/platform.h>
 #include <asm/irq.h>
-#include <asm/hardware/arm_timer.h>
 #include <mach/cm.h>
 #include <asm/system.h>
 #include <asm/leds.h>
 #include <asm/mach/time.h>
 
-#include "common.h"
-
 static struct amba_pl010_data integrator_uart_data;
 
 static struct amba_device rtc_device = {
@@ -163,8 +161,8 @@ arch_initcall(integrator_init);
  *  UART0  7    6
  *  UART1  5    4
  */
-#define SC_CTRLC       (IO_ADDRESS(INTEGRATOR_SC_BASE) + INTEGRATOR_SC_CTRLC_OFFSET)
-#define SC_CTRLS       (IO_ADDRESS(INTEGRATOR_SC_BASE) + INTEGRATOR_SC_CTRLS_OFFSET)
+#define SC_CTRLC       IO_ADDRESS(INTEGRATOR_SC_CTRLC)
+#define SC_CTRLS       IO_ADDRESS(INTEGRATOR_SC_CTRLS)
 
 static void integrator_uart_set_mctrl(struct amba_device *dev, void __iomem *base, unsigned int mctrl)
 {
@@ -196,7 +194,7 @@ static struct amba_pl010_data integrator_uart_data = {
        .set_mctrl = integrator_uart_set_mctrl,
 };
 
-#define CM_CTRL        IO_ADDRESS(INTEGRATOR_HDR_BASE) + INTEGRATOR_HDR_CTRL_OFFSET
+#define CM_CTRL        IO_ADDRESS(INTEGRATOR_HDR_CTRL)
 
 static DEFINE_SPINLOCK(cm_lock);
 
@@ -217,120 +215,3 @@ void cm_control(u32 mask, u32 set)
 }
 
 EXPORT_SYMBOL(cm_control);
-
-/*
- * Where is the timer (VA)?
- */
-#define TIMER0_VA_BASE (IO_ADDRESS(INTEGRATOR_CT_BASE)+0x00000000)
-#define TIMER1_VA_BASE (IO_ADDRESS(INTEGRATOR_CT_BASE)+0x00000100)
-#define TIMER2_VA_BASE (IO_ADDRESS(INTEGRATOR_CT_BASE)+0x00000200)
-#define VA_IC_BASE     IO_ADDRESS(INTEGRATOR_IC_BASE) 
-
-/*
- * How long is the timer interval?
- */
-#define TIMER_INTERVAL (TICKS_PER_uSEC * mSEC_10)
-#if TIMER_INTERVAL >= 0x100000
-#define TICKS2USECS(x) (256 * (x) / TICKS_PER_uSEC)
-#elif TIMER_INTERVAL >= 0x10000
-#define TICKS2USECS(x) (16 * (x) / TICKS_PER_uSEC)
-#else
-#define TICKS2USECS(x) ((x) / TICKS_PER_uSEC)
-#endif
-
-static unsigned long timer_reload;
-
-/*
- * Returns number of ms since last clock interrupt.  Note that interrupts
- * will have been disabled by do_gettimeoffset()
- */
-unsigned long integrator_gettimeoffset(void)
-{
-       unsigned long ticks1, ticks2, status;
-
-       /*
-        * Get the current number of ticks.  Note that there is a race
-        * condition between us reading the timer and checking for
-        * an interrupt.  We get around this by ensuring that the
-        * counter has not reloaded between our two reads.
-        */
-       ticks2 = readl(TIMER1_VA_BASE + TIMER_VALUE) & 0xffff;
-       do {
-               ticks1 = ticks2;
-               status = __raw_readl(VA_IC_BASE + IRQ_RAW_STATUS);
-               ticks2 = readl(TIMER1_VA_BASE + TIMER_VALUE) & 0xffff;
-       } while (ticks2 > ticks1);
-
-       /*
-        * Number of ticks since last interrupt.
-        */
-       ticks1 = timer_reload - ticks2;
-
-       /*
-        * Interrupt pending?  If so, we've reloaded once already.
-        */
-       if (status & (1 << IRQ_TIMERINT1))
-               ticks1 += timer_reload;
-
-       /*
-        * Convert the ticks to usecs
-        */
-       return TICKS2USECS(ticks1);
-}
-
-/*
- * IRQ handler for the timer
- */
-static irqreturn_t
-integrator_timer_interrupt(int irq, void *dev_id)
-{
-       /*
-        * clear the interrupt
-        */
-       writel(1, TIMER1_VA_BASE + TIMER_INTCLR);
-
-       timer_tick();
-
-       return IRQ_HANDLED;
-}
-
-static struct irqaction integrator_timer_irq = {
-       .name           = "Integrator Timer Tick",
-       .flags          = IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL,
-       .handler        = integrator_timer_interrupt,
-};
-
-/*
- * Set up timer interrupt, and return the current time in seconds.
- */
-void __init integrator_time_init(unsigned long reload, unsigned int ctrl)
-{
-       unsigned int timer_ctrl = TIMER_CTRL_ENABLE | TIMER_CTRL_PERIODIC;
-
-       timer_reload = reload;
-       timer_ctrl |= ctrl;
-
-       if (timer_reload > 0x100000) {
-               timer_reload >>= 8;
-               timer_ctrl |= TIMER_CTRL_DIV256;
-       } else if (timer_reload > 0x010000) {
-               timer_reload >>= 4;
-               timer_ctrl |= TIMER_CTRL_DIV16;
-       }
-
-       /*
-        * Initialise to a known state (all timers off)
-        */
-       writel(0, TIMER0_VA_BASE + TIMER_CTRL);
-       writel(0, TIMER1_VA_BASE + TIMER_CTRL);
-       writel(0, TIMER2_VA_BASE + TIMER_CTRL);
-
-       writel(timer_reload, TIMER1_VA_BASE + TIMER_LOAD);
-       writel(timer_reload, TIMER1_VA_BASE + TIMER_VALUE);
-       writel(timer_ctrl, TIMER1_VA_BASE + TIMER_CTRL);
-
-       /*
-        * Make irqs happen for the system timer
-        */
-       setup_irq(IRQ_TIMERINT1, &integrator_timer_irq);
-}
index f77f202..a3fbcb3 100644 (file)
 #include <linux/io.h>
 
 #include <mach/hardware.h>
+#include <mach/platform.h>
 #include <asm/mach-types.h>
-#include <asm/hardware/icst525.h>
+#include <asm/hardware/icst.h>
 
 static struct cpufreq_driver integrator_driver;
 
-#define CM_ID          (IO_ADDRESS(INTEGRATOR_HDR_BASE)+INTEGRATOR_HDR_ID_OFFSET)
-#define CM_OSC (IO_ADDRESS(INTEGRATOR_HDR_BASE)+INTEGRATOR_HDR_OSC_OFFSET)
-#define CM_STAT (IO_ADDRESS(INTEGRATOR_HDR_BASE)+INTEGRATOR_HDR_STAT_OFFSET)
-#define CM_LOCK (IO_ADDRESS(INTEGRATOR_HDR_BASE)+INTEGRATOR_HDR_LOCK_OFFSET)
+#define CM_ID          IO_ADDRESS(INTEGRATOR_HDR_ID)
+#define CM_OSC IO_ADDRESS(INTEGRATOR_HDR_OSC)
+#define CM_STAT IO_ADDRESS(INTEGRATOR_HDR_STAT)
+#define CM_LOCK IO_ADDRESS(INTEGRATOR_HDR_LOCK)
 
-static const struct icst525_params lclk_params = {
-       .ref            = 24000,
-       .vco_max        = 320000,
+static const struct icst_params lclk_params = {
+       .ref            = 24000000,
+       .vco_max        = ICST525_VCO_MAX_5V,
+       .vco_min        = ICST525_VCO_MIN,
        .vd_min         = 8,
        .vd_max         = 132,
        .rd_min         = 24,
        .rd_max         = 24,
+       .s2div          = icst525_s2div,
+       .idx2s          = icst525_idx2s,
 };
 
-static const struct icst525_params cclk_params = {
-       .ref            = 24000,
-       .vco_max        = 320000,
+static const struct icst_params cclk_params = {
+       .ref            = 24000000,
+       .vco_max        = ICST525_VCO_MAX_5V,
+       .vco_min        = ICST525_VCO_MIN,
        .vd_min         = 12,
        .vd_max         = 160,
        .rd_min         = 24,
        .rd_max         = 24,
+       .s2div          = icst525_s2div,
+       .idx2s          = icst525_idx2s,
 };
 
 /*
@@ -52,17 +59,17 @@ static const struct icst525_params cclk_params = {
  */
 static int integrator_verify_policy(struct cpufreq_policy *policy)
 {
-       struct icst525_vco vco;
+       struct icst_vco vco;
 
        cpufreq_verify_within_limits(policy, 
                                     policy->cpuinfo.min_freq, 
                                     policy->cpuinfo.max_freq);
 
-       vco = icst525_khz_to_vco(&cclk_params, policy->max);
-       policy->max = icst525_khz(&cclk_params, vco);
+       vco = icst_hz_to_vco(&cclk_params, policy->max * 1000);
+       policy->max = icst_hz(&cclk_params, vco) / 1000;
 
-       vco = icst525_khz_to_vco(&cclk_params, policy->min);
-       policy->min = icst525_khz(&cclk_params, vco);
+       vco = icst_hz_to_vco(&cclk_params, policy->min * 1000);
+       policy->min = icst_hz(&cclk_params, vco) / 1000;
 
        cpufreq_verify_within_limits(policy, 
                                     policy->cpuinfo.min_freq, 
@@ -78,7 +85,7 @@ static int integrator_set_target(struct cpufreq_policy *policy,
 {
        cpumask_t cpus_allowed;
        int cpu = policy->cpu;
-       struct icst525_vco vco;
+       struct icst_vco vco;
        struct cpufreq_freqs freqs;
        u_int cm_osc;
 
@@ -104,17 +111,17 @@ static int integrator_set_target(struct cpufreq_policy *policy,
        }
        vco.v = cm_osc & 255;
        vco.r = 22;
-       freqs.old = icst525_khz(&cclk_params, vco);
+       freqs.old = icst_hz(&cclk_params, vco) / 1000;
 
-       /* icst525_khz_to_vco rounds down -- so we need the next
+       /* icst_hz_to_vco rounds down -- so we need the next
         * larger freq in case of CPUFREQ_RELATION_L.
         */
        if (relation == CPUFREQ_RELATION_L)
                target_freq += 999;
        if (target_freq > policy->max)
                target_freq = policy->max;
-       vco = icst525_khz_to_vco(&cclk_params, target_freq);
-       freqs.new = icst525_khz(&cclk_params, vco);
+       vco = icst_hz_to_vco(&cclk_params, target_freq * 1000);
+       freqs.new = icst_hz(&cclk_params, vco) / 1000;
 
        freqs.cpu = policy->cpu;
 
@@ -154,7 +161,7 @@ static unsigned int integrator_get(unsigned int cpu)
        cpumask_t cpus_allowed;
        unsigned int current_freq;
        u_int cm_osc;
-       struct icst525_vco vco;
+       struct icst_vco vco;
 
        cpus_allowed = current->cpus_allowed;
 
@@ -172,7 +179,7 @@ static unsigned int integrator_get(unsigned int cpu)
        vco.v = cm_osc & 255;
        vco.r = 22;
 
-       current_freq = icst525_khz(&cclk_params, vco); /* current freq */
+       current_freq = icst_hz(&cclk_params, vco) / 1000; /* current freq */
 
        set_cpus_allowed(current, cpus_allowed);
 
index 41b1072..fd684bf 100644 (file)
@@ -25,7 +25,7 @@
 
 #include <asm/clkdev.h>
 #include <mach/clkdev.h>
-#include <asm/hardware/icst525.h>
+#include <asm/hardware/icst.h>
 #include <mach/lm.h>
 #include <mach/impd1.h>
 #include <asm/sizes.h>
@@ -41,32 +41,25 @@ struct impd1_module {
        struct clk_lookup *clks[3];
 };
 
-static const struct icst525_params impd1_vco_params = {
-       .ref            = 24000,        /* 24 MHz */
-       .vco_max        = 200000,       /* 200 MHz */
+static const struct icst_params impd1_vco_params = {
+       .ref            = 24000000,     /* 24 MHz */
+       .vco_max        = ICST525_VCO_MAX_3V,
+       .vco_min        = ICST525_VCO_MIN,
        .vd_min         = 12,
        .vd_max         = 519,
        .rd_min         = 3,
        .rd_max         = 120,
+       .s2div          = icst525_s2div,
+       .idx2s          = icst525_idx2s,
 };
 
-static void impd1_setvco(struct clk *clk, struct icst525_vco vco)
+static void impd1_setvco(struct clk *clk, struct icst_vco vco)
 {
        struct impd1_module *impd1 = clk->data;
-       int vconr = clk - impd1->vcos;
-       u32 val;
-
-       val = vco.v | (vco.r << 9) | (vco.s << 16);
+       u32 val = vco.v | (vco.r << 9) | (vco.s << 16);
 
        writel(0xa05f, impd1->base + IMPD1_LOCK);
-       switch (vconr) {
-       case 0:
-               writel(val, impd1->base + IMPD1_OSC1);
-               break;
-       case 1:
-               writel(val, impd1->base + IMPD1_OSC2);
-               break;
-       }
+       writel(val, clk->vcoreg);
        writel(0, impd1->base + IMPD1_LOCK);
 
 #ifdef DEBUG
@@ -74,11 +67,17 @@ static void impd1_setvco(struct clk *clk, struct icst525_vco vco)
        vco.r = (val >> 9) & 0x7f;
        vco.s = (val >> 16) & 7;
 
-       pr_debug("IM-PD1: VCO%d clock is %ld kHz\n",
-                vconr, icst525_khz(&impd1_vco_params, vco));
+       pr_debug("IM-PD1: VCO%d clock is %ld Hz\n",
+                vconr, icst525_hz(&impd1_vco_params, vco));
 #endif
 }
 
+static const struct clk_ops impd1_clk_ops = {
+       .round  = icst_clk_round,
+       .set    = icst_clk_set,
+       .setvco = impd1_setvco,
+};
+
 void impd1_tweak_control(struct device *dev, u32 mask, u32 val)
 {
        struct impd1_module *impd1 = dev_get_drvdata(dev);
@@ -374,11 +373,13 @@ static int impd1_probe(struct lm_device *dev)
                (unsigned long)dev->resource.start);
 
        for (i = 0; i < ARRAY_SIZE(impd1->vcos); i++) {
+               impd1->vcos[i].ops = &impd1_clk_ops,
                impd1->vcos[i].owner = THIS_MODULE,
                impd1->vcos[i].params = &impd1_vco_params,
-               impd1->vcos[i].data = impd1,
-               impd1->vcos[i].setvco = impd1_setvco;
+               impd1->vcos[i].data = impd1;
        }
+       impd1->vcos[0].vcoreg = impd1->base + IMPD1_OSC1;
+       impd1->vcos[1].vcoreg = impd1->base + IMPD1_OSC2;
 
        impd1->clks[0] = clkdev_alloc(&impd1->vcos[0], NULL, "lm%x:01000",
                                        dev->id);
index 9293e41..bfe0767 100644 (file)
@@ -2,14 +2,15 @@
 #define __ASM_MACH_CLKDEV_H
 
 #include <linux/module.h>
-#include <asm/hardware/icst525.h>
+#include <plat/clock.h>
 
 struct clk {
        unsigned long           rate;
+       const struct clk_ops    *ops;
        struct module           *owner;
-       const struct icst525_params *params;
+       const struct icst_params *params;
+       void __iomem            *vcoreg;
        void                    *data;
-       void                    (*setvco)(struct clk *, struct icst525_vco vco);
 };
 
 static inline int __clk_get(struct clk *clk)
index 7649c57..3d029c9 100644 (file)
@@ -8,6 +8,7 @@
  * warranty of any kind, whether express or implied.
  */
 #include <mach/hardware.h>
+#include <mach/platform.h>
 #include <mach/irqs.h>
 
                .macro  disable_fiq
index d795642..8e26360 100644 (file)
@@ -23,7 +23,6 @@
 #define __ASM_ARCH_HARDWARE_H
 
 #include <asm/sizes.h>
-#include <mach/platform.h>
 
 /*
  * Where in virtual memory the IO devices (timers, system controllers
 #define PCIO_BASE              PCI_IO_VADDR
 #define PCIMEM_BASE            PCI_MEMORY_VADDR
 
-#ifdef CONFIG_MMU
-/* macro to get at IO space when running virtually */
-#define IO_ADDRESS(x) (((x) >> 4) + IO_BASE) 
-#else
-#define IO_ADDRESS(x) (x)
-#endif
-
 #define pcibios_assign_all_busses()    1
 
 #define PCIBIOS_MIN_IO         0x6000
 #define PCIBIOS_MIN_MEM        0x00100000
 
+/* macro to get at IO space when running virtually */
+#ifdef CONFIG_MMU
+#define IO_ADDRESS(x)  (((x) & 0x000fffff) | (((x) >> 4) & 0x0ff00000) | IO_BASE)
+#else
+#define IO_ADDRESS(x)  (x)
+#endif
+
+#define __io_address(n)                ((void __iomem *)IO_ADDRESS(n))
+
 #endif
 
index e00a262..5e6ea5c 100644 (file)
@@ -23,9 +23,6 @@
  *
  *   Integrator address map
  *
- *     NOTE: This is a multi-hosted header file for use with uHAL and
- *           supported debuggers.
- *
  * ***********************************************************************/
 
 #ifndef __address_h
 #define INTEGRATOR_DBG_LEDS             (INTEGRATOR_DBG_BASE + INTEGRATOR_DBG_LEDS_OFFSET)
 #define INTEGRATOR_DBG_SWITCH           (INTEGRATOR_DBG_BASE + INTEGRATOR_DBG_SWITCH_OFFSET)
 
+#define INTEGRATOR_AP_GPIO_BASE                0x1B000000      /* GPIO */
 
-#if defined(CONFIG_ARCH_INTEGRATOR_AP)
-#define INTEGRATOR_GPIO_BASE            0x1B000000      /*  GPIO */
-#elif defined(CONFIG_ARCH_INTEGRATOR_CP)
-#define INTEGRATOR_GPIO_BASE            0xC9000000      /*  GPIO */
-#endif
+#define INTEGRATOR_CP_MMC_BASE         0x1C000000      /* MMC */
+#define INTEGRATOR_CP_AACI_BASE                0x1D000000      /* AACI */
+#define INTEGRATOR_CP_ETH_BASE         0xC8000000      /* Ethernet */
+#define INTEGRATOR_CP_GPIO_BASE                0xC9000000      /* GPIO */
+#define INTEGRATOR_CP_SIC_BASE         0xCA000000      /* SIC */
+#define INTEGRATOR_CP_CTL_BASE         0xCB000000      /* CP system control */
 
 /* ------------------------------------------------------------------------
  *  KMI keyboard/mouse definitions
  */
 #define PHYS_PCI_V3_BASE                0x62000000
 
-#define PCI_DRAMSIZE                    INTEGRATOR_SSRAM_SIZE
-
-/* 'export' these to UHAL */
-#define UHAL_PCI_IO                     PCI_IO_BASE
-#define UHAL_PCI_MEM                    PCI_MEM_BASE
-#define UHAL_PCI_ALLOC_IO_BASE          0x00004000
-#define UHAL_PCI_ALLOC_MEM_BASE         PCI_MEM_BASE
-#define UHAL_PCI_MAX_SLOT               20
-
-/* ========================================================================
- *  Start of uHAL definitions
- * ========================================================================
- */
-
 /* ------------------------------------------------------------------------
  *  Integrator Interrupt Controllers
  * ------------------------------------------------------------------------
  */
 
 /* ------------------------------------------------------------------------
- *  LED's - The header LED is not accessible via the uHAL API
+ *  LED's
  * ------------------------------------------------------------------------
  *
  */
 
 #define LED_BANK                        INTEGRATOR_DBG_LEDS
 
-/*
- *  Memory definitions - run uHAL out of SSRAM.
- *
- */
-#define uHAL_MEMORY_SIZE                INTEGRATOR_SSRAM_SIZE
-
-/*
- *  Clean base - dummy
- *
- */
-#define CLEAN_BASE                      INTEGRATOR_BOOT_ROM_HI
-
 /*
  *  Timer definitions
  *
  *  Only use timer 1 & 2
  *  (both run at 24MHz and will need the clock divider set to 16).
  *
- *  Timer 0 runs at bus frequency and therefore could vary and currently
- *  uHAL can't handle that.
- *
+ *  Timer 0 runs at bus frequency
  */
 
 #define INTEGRATOR_TIMER0_BASE          INTEGRATOR_CT_BASE
 #define INTEGRATOR_TIMER1_BASE          (INTEGRATOR_CT_BASE + 0x100)
 #define INTEGRATOR_TIMER2_BASE          (INTEGRATOR_CT_BASE + 0x200)
 
-#define MAX_TIMER                       2
-#define MAX_PERIOD                      699050
 #define TICKS_PER_uSEC                  24
 
 /*
  *
  */
 #define mSEC_1                          1000
-#define mSEC_5                          (mSEC_1 * 5)
 #define mSEC_10                         (mSEC_1 * 10)
-#define mSEC_25                         (mSEC_1 * 25)
-#define SEC_1                           (mSEC_1 * 1000)
 
 #define INTEGRATOR_CSR_BASE             0x10000000
 #define INTEGRATOR_CSR_SIZE             0x10000000
 
 #endif
-
-/*     END */
index 8138a7e..227cf4d 100644 (file)
 #include <linux/sysdev.h>
 #include <linux/amba/bus.h>
 #include <linux/amba/kmi.h>
+#include <linux/clocksource.h>
+#include <linux/clockchips.h>
+#include <linux/interrupt.h>
 #include <linux/io.h>
 
 #include <mach/hardware.h>
+#include <mach/platform.h>
+#include <asm/hardware/arm_timer.h>
 #include <asm/irq.h>
 #include <asm/setup.h>
 #include <asm/param.h>         /* HZ */
@@ -43,8 +48,6 @@
 #include <asm/mach/map.h>
 #include <asm/mach/time.h>
 
-#include "common.h"
-
 /* 
  * All IO addresses are mapped onto VA 0xFFFx.xxxx, where x.xxxx
  * is the (PA >> 12).
@@ -55,7 +58,7 @@
 #define VA_IC_BASE     IO_ADDRESS(INTEGRATOR_IC_BASE) 
 #define VA_SC_BASE     IO_ADDRESS(INTEGRATOR_SC_BASE)
 #define VA_EBI_BASE    IO_ADDRESS(INTEGRATOR_EBI_BASE)
-#define VA_CMIC_BASE   IO_ADDRESS(INTEGRATOR_HDR_BASE) + INTEGRATOR_HDR_IC_OFFSET
+#define VA_CMIC_BASE   IO_ADDRESS(INTEGRATOR_HDR_IC)
 
 /*
  * Logical      Physical
@@ -117,8 +120,8 @@ static struct map_desc ap_io_desc[] __initdata = {
                .length         = SZ_4K,
                .type           = MT_DEVICE
        }, {
-               .virtual        = IO_ADDRESS(INTEGRATOR_GPIO_BASE),
-               .pfn            = __phys_to_pfn(INTEGRATOR_GPIO_BASE),
+               .virtual        = IO_ADDRESS(INTEGRATOR_AP_GPIO_BASE),
+               .pfn            = __phys_to_pfn(INTEGRATOR_AP_GPIO_BASE),
                .length         = SZ_4K,
                .type           = MT_DEVICE
        }, {
@@ -334,14 +337,163 @@ static void __init ap_init(void)
        }
 }
 
+/*
+ * Where is the timer (VA)?
+ */
+#define TIMER0_VA_BASE IO_ADDRESS(INTEGRATOR_TIMER0_BASE)
+#define TIMER1_VA_BASE IO_ADDRESS(INTEGRATOR_TIMER1_BASE)
+#define TIMER2_VA_BASE IO_ADDRESS(INTEGRATOR_TIMER2_BASE)
+
+/*
+ * How long is the timer interval?
+ */
+#define TIMER_INTERVAL (TICKS_PER_uSEC * mSEC_10)
+#if TIMER_INTERVAL >= 0x100000
+#define TICKS2USECS(x) (256 * (x) / TICKS_PER_uSEC)
+#elif TIMER_INTERVAL >= 0x10000
+#define TICKS2USECS(x) (16 * (x) / TICKS_PER_uSEC)
+#else
+#define TICKS2USECS(x) ((x) / TICKS_PER_uSEC)
+#endif
+
+static unsigned long timer_reload;
+
+static void __iomem * const clksrc_base = (void __iomem *)TIMER2_VA_BASE;
+
+static cycle_t timersp_read(struct clocksource *cs)
+{
+       return ~(readl(clksrc_base + TIMER_VALUE) & 0xffff);
+}
+
+static struct clocksource clocksource_timersp = {
+       .name           = "timer2",
+       .rating         = 200,
+       .read           = timersp_read,
+       .mask           = CLOCKSOURCE_MASK(16),
+       .shift          = 16,
+       .flags          = CLOCK_SOURCE_IS_CONTINUOUS,
+};
+
+static void integrator_clocksource_init(u32 khz)
+{
+       struct clocksource *cs = &clocksource_timersp;
+       void __iomem *base = clksrc_base;
+       u32 ctrl = TIMER_CTRL_ENABLE;
+
+       if (khz >= 1500) {
+               khz /= 16;
+               ctrl = TIMER_CTRL_DIV16;
+       }
+
+       writel(ctrl, base + TIMER_CTRL);
+       writel(0xffff, base + TIMER_LOAD);
+
+       cs->mult = clocksource_khz2mult(khz, cs->shift);
+       clocksource_register(cs);
+}
+
+static void __iomem * const clkevt_base = (void __iomem *)TIMER1_VA_BASE;
+
+/*
+ * IRQ handler for the timer
+ */
+static irqreturn_t integrator_timer_interrupt(int irq, void *dev_id)
+{
+       struct clock_event_device *evt = dev_id;
+
+       /* clear the interrupt */
+       writel(1, clkevt_base + TIMER_INTCLR);
+
+       evt->event_handler(evt);
+
+       return IRQ_HANDLED;
+}
+
+static void clkevt_set_mode(enum clock_event_mode mode, struct clock_event_device *evt)
+{
+       u32 ctrl = readl(clkevt_base + TIMER_CTRL) & ~TIMER_CTRL_ENABLE;
+
+       BUG_ON(mode == CLOCK_EVT_MODE_ONESHOT);
+
+       if (mode == CLOCK_EVT_MODE_PERIODIC) {
+               writel(ctrl, clkevt_base + TIMER_CTRL);
+               writel(timer_reload, clkevt_base + TIMER_LOAD);
+               ctrl |= TIMER_CTRL_PERIODIC | TIMER_CTRL_ENABLE;
+       }
+
+       writel(ctrl, clkevt_base + TIMER_CTRL);
+}
+
+static int clkevt_set_next_event(unsigned long next, struct clock_event_device *evt)
+{
+       unsigned long ctrl = readl(clkevt_base + TIMER_CTRL);
+
+       writel(ctrl & ~TIMER_CTRL_ENABLE, clkevt_base + TIMER_CTRL);
+       writel(next, clkevt_base + TIMER_LOAD);
+       writel(ctrl | TIMER_CTRL_ENABLE, clkevt_base + TIMER_CTRL);
+
+       return 0;
+}
+
+static struct clock_event_device integrator_clockevent = {
+       .name           = "timer1",
+       .shift          = 34,
+       .features       = CLOCK_EVT_FEAT_PERIODIC,
+       .set_mode       = clkevt_set_mode,
+       .set_next_event = clkevt_set_next_event,
+       .rating         = 300,
+       .cpumask        = cpu_all_mask,
+};
+
+static struct irqaction integrator_timer_irq = {
+       .name           = "timer",
+       .flags          = IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL,
+       .handler        = integrator_timer_interrupt,
+       .dev_id         = &integrator_clockevent,
+};
+
+static void integrator_clockevent_init(u32 khz)
+{
+       struct clock_event_device *evt = &integrator_clockevent;
+       unsigned int ctrl = 0;
+
+       if (khz * 1000 > 0x100000 * HZ) {
+               khz /= 256;
+               ctrl |= TIMER_CTRL_DIV256;
+       } else if (khz * 1000 > 0x10000 * HZ) {
+               khz /= 16;
+               ctrl |= TIMER_CTRL_DIV16;
+       }
+
+       timer_reload = khz * 1000 / HZ;
+       writel(ctrl, clkevt_base + TIMER_CTRL);
+
+       evt->irq = IRQ_TIMERINT1;
+       evt->mult = div_sc(khz, NSEC_PER_MSEC, evt->shift);
+       evt->max_delta_ns = clockevent_delta2ns(0xffff, evt);
+       evt->min_delta_ns = clockevent_delta2ns(0xf, evt);
+
+       setup_irq(IRQ_TIMERINT1, &integrator_timer_irq);
+       clockevents_register_device(evt);
+}
+
+/*
+ * Set up timer(s).
+ */
 static void __init ap_init_timer(void)
 {
-       integrator_time_init(1000000 * TICKS_PER_uSEC / HZ, 0);
+       u32 khz = TICKS_PER_uSEC * 1000;
+
+       writel(0, TIMER0_VA_BASE + TIMER_CTRL);
+       writel(0, TIMER1_VA_BASE + TIMER_CTRL);
+       writel(0, TIMER2_VA_BASE + TIMER_CTRL);
+
+       integrator_clocksource_init(khz);
+       integrator_clockevent_init(khz);
 }
 
 static struct sys_timer ap_timer = {
        .init           = ap_init_timer,
-       .offset         = integrator_gettimeoffset,
 };
 
 MACHINE_START(INTEGRATOR, "ARM-Integrator")
index 15e6cc5..cde57b2 100644 (file)
 #include <asm/clkdev.h>
 #include <mach/clkdev.h>
 #include <mach/hardware.h>
+#include <mach/platform.h>
 #include <asm/irq.h>
 #include <asm/setup.h>
 #include <asm/mach-types.h>
-#include <asm/hardware/icst525.h>
+#include <asm/hardware/arm_timer.h>
+#include <asm/hardware/icst.h>
 
 #include <mach/cm.h>
 #include <mach/lm.h>
 #include <asm/mach/map.h>
 #include <asm/mach/time.h>
 
-#include "common.h"
-
-#define INTCP_PA_MMC_BASE              0x1c000000
-#define INTCP_PA_AACI_BASE             0x1d000000
+#include <plat/timer-sp.h>
 
 #define INTCP_PA_FLASH_BASE            0x24000000
 #define INTCP_FLASH_SIZE               SZ_32M
 
 #define INTCP_PA_CLCD_BASE             0xc0000000
 
-#define INTCP_VA_CIC_BASE              IO_ADDRESS(INTEGRATOR_HDR_BASE) + 0x40
+#define INTCP_VA_CIC_BASE              IO_ADDRESS(INTEGRATOR_HDR_BASE + 0x40)
 #define INTCP_VA_PIC_BASE              IO_ADDRESS(INTEGRATOR_IC_BASE)
-#define INTCP_VA_SIC_BASE              IO_ADDRESS(0xca000000)
+#define INTCP_VA_SIC_BASE              IO_ADDRESS(INTEGRATOR_CP_SIC_BASE)
 
-#define INTCP_PA_ETH_BASE              0xc8000000
 #define INTCP_ETH_SIZE                 0x10
 
-#define INTCP_VA_CTRL_BASE             IO_ADDRESS(0xcb000000)
+#define INTCP_VA_CTRL_BASE             IO_ADDRESS(INTEGRATOR_CP_CTL_BASE)
 #define INTCP_FLASHPROG                        0x04
 #define CINTEGRATOR_FLASHPROG_FLVPPEN  (1 << 0)
 #define CINTEGRATOR_FLASHPROG_FLWREN   (1 << 1)
@@ -71,7 +69,9 @@
  * f1600000    16000000        UART 0
  * f1700000    17000000        UART 1
  * f1a00000    1a000000        Debug LEDs
- * f1b00000    1b000000        GPIO
+ * fc900000    c9000000        GPIO
+ * fca00000    ca000000        SIC
+ * fcb00000    cb000000        CP system control
  */
 
 static struct map_desc intcp_io_desc[] __initdata = {
@@ -116,18 +116,18 @@ static struct map_desc intcp_io_desc[] __initdata = {
                .length         = SZ_4K,
                .type           = MT_DEVICE
        }, {
-               .virtual        = IO_ADDRESS(INTEGRATOR_GPIO_BASE),
-               .pfn            = __phys_to_pfn(INTEGRATOR_GPIO_BASE),
+               .virtual        = IO_ADDRESS(INTEGRATOR_CP_GPIO_BASE),
+               .pfn            = __phys_to_pfn(INTEGRATOR_CP_GPIO_BASE),
                .length         = SZ_4K,
                .type           = MT_DEVICE
        }, {
-               .virtual        = IO_ADDRESS(0xca000000),
-               .pfn            = __phys_to_pfn(0xca000000),
+               .virtual        = IO_ADDRESS(INTEGRATOR_CP_SIC_BASE),
+               .pfn            = __phys_to_pfn(INTEGRATOR_CP_SIC_BASE),
                .length         = SZ_4K,
                .type           = MT_DEVICE
        }, {
-               .virtual        = IO_ADDRESS(0xcb000000),
-               .pfn            = __phys_to_pfn(0xcb000000),
+               .virtual        = IO_ADDRESS(INTEGRATOR_CP_CTL_BASE),
+               .pfn            = __phys_to_pfn(INTEGRATOR_CP_CTL_BASE),
                .length         = SZ_4K,
                .type           = MT_DEVICE
        }
@@ -266,33 +266,43 @@ static void __init intcp_init_irq(void)
 /*
  * Clock handling
  */
-#define CM_LOCK (IO_ADDRESS(INTEGRATOR_HDR_BASE)+INTEGRATOR_HDR_LOCK_OFFSET)
-#define CM_AUXOSC (IO_ADDRESS(INTEGRATOR_HDR_BASE)+0x1c)
+#define CM_LOCK                (__io_address(INTEGRATOR_HDR_BASE)+INTEGRATOR_HDR_LOCK_OFFSET)
+#define CM_AUXOSC      (__io_address(INTEGRATOR_HDR_BASE)+0x1c)
 
-static const struct icst525_params cp_auxvco_params = {
-       .ref            = 24000,
-       .vco_max        = 320000,
+static const struct icst_params cp_auxvco_params = {
+       .ref            = 24000000,
+       .vco_max        = ICST525_VCO_MAX_5V,
+       .vco_min        = ICST525_VCO_MIN,
        .vd_min         = 8,
        .vd_max         = 263,
        .rd_min         = 3,
        .rd_max         = 65,
+       .s2div          = icst525_s2div,
+       .idx2s          = icst525_idx2s,
 };
 
-static void cp_auxvco_set(struct clk *clk, struct icst525_vco vco)
+static void cp_auxvco_set(struct clk *clk, struct icst_vco vco)
 {
        u32 val;
 
-       val = readl(CM_AUXOSC) & ~0x7ffff;
+       val = readl(clk->vcoreg) & ~0x7ffff;
        val |= vco.v | (vco.r << 9) | (vco.s << 16);
 
        writel(0xa05f, CM_LOCK);
-       writel(val, CM_AUXOSC);
+       writel(val, clk->vcoreg);
        writel(0, CM_LOCK);
 }
 
+static const struct clk_ops cp_auxclk_ops = {
+       .round  = icst_clk_round,
+       .set    = icst_clk_set,
+       .setvco = cp_auxvco_set,
+};
+
 static struct clk cp_auxclk = {
+       .ops    = &cp_auxclk_ops,
        .params = &cp_auxvco_params,
-       .setvco = cp_auxvco_set,
+       .vcoreg = CM_AUXOSC,
 };
 
 static struct clk_lookup cp_lookups[] = {
@@ -363,8 +373,8 @@ static struct platform_device intcp_flash_device = {
 
 static struct resource smc91x_resources[] = {
        [0] = {
-               .start  = INTCP_PA_ETH_BASE,
-               .end    = INTCP_PA_ETH_BASE + INTCP_ETH_SIZE - 1,
+               .start  = INTEGRATOR_CP_ETH_BASE,
+               .end    = INTEGRATOR_CP_ETH_BASE + INTCP_ETH_SIZE - 1,
                .flags  = IORESOURCE_MEM,
        },
        [1] = {
@@ -394,8 +404,8 @@ static struct platform_device *intcp_devs[] __initdata = {
  */
 static unsigned int mmc_status(struct device *dev)
 {
-       unsigned int status = readl(IO_ADDRESS(0xca000000) + 4);
-       writel(8, IO_ADDRESS(0xcb000000) + 8);
+       unsigned int status = readl(IO_ADDRESS(0xca000000 + 4));
+       writel(8, IO_ADDRESS(INTEGRATOR_CP_CTL_BASE + 8));
 
        return status & 8;
 }
@@ -413,8 +423,8 @@ static struct amba_device mmc_device = {
                .platform_data = &mmc_data,
        },
        .res            = {
-               .start  = INTCP_PA_MMC_BASE,
-               .end    = INTCP_PA_MMC_BASE + SZ_4K - 1,
+               .start  = INTEGRATOR_CP_MMC_BASE,
+               .end    = INTEGRATOR_CP_MMC_BASE + SZ_4K - 1,
                .flags  = IORESOURCE_MEM,
        },
        .irq            = { IRQ_CP_MMCIINT0, IRQ_CP_MMCIINT1 },
@@ -426,8 +436,8 @@ static struct amba_device aaci_device = {
                .init_name = "mb:1d",
        },
        .res            = {
-               .start  = INTCP_PA_AACI_BASE,
-               .end    = INTCP_PA_AACI_BASE + SZ_4K - 1,
+               .start  = INTEGRATOR_CP_AACI_BASE,
+               .end    = INTEGRATOR_CP_AACI_BASE + SZ_4K - 1,
                .flags  = IORESOURCE_MEM,
        },
        .irq            = { IRQ_CP_AACIINT, NO_IRQ },
@@ -567,16 +577,22 @@ static void __init intcp_init(void)
        }
 }
 
-#define TIMER_CTRL_IE  (1 << 5)                        /* Interrupt Enable */
+#define TIMER0_VA_BASE __io_address(INTEGRATOR_TIMER0_BASE)
+#define TIMER1_VA_BASE __io_address(INTEGRATOR_TIMER1_BASE)
+#define TIMER2_VA_BASE __io_address(INTEGRATOR_TIMER2_BASE)
 
 static void __init intcp_timer_init(void)
 {
-       integrator_time_init(1000000 / HZ, TIMER_CTRL_IE);
+       writel(0, TIMER0_VA_BASE + TIMER_CTRL);
+       writel(0, TIMER1_VA_BASE + TIMER_CTRL);
+       writel(0, TIMER2_VA_BASE + TIMER_CTRL);
+
+       sp804_clocksource_init(TIMER2_VA_BASE);
+       sp804_clockevents_init(TIMER1_VA_BASE, IRQ_TIMERINT1);
 }
 
 static struct sys_timer cp_timer = {
        .init           = intcp_timer_init,
-       .offset         = integrator_gettimeoffset,
 };
 
 MACHINE_START(CINTEGRATOR, "ARM-IntegratorCP")
index 8dcc823..28be186 100644 (file)
@@ -27,6 +27,7 @@
 #include <linux/io.h>
 
 #include <mach/hardware.h>
+#include <mach/platform.h>
 #include <asm/leds.h>
 #include <asm/system.h>
 #include <asm/mach-types.h>
index ffbd349..9cef059 100644 (file)
@@ -29,6 +29,7 @@
 #include <linux/io.h>
 
 #include <mach/hardware.h>
+#include <mach/platform.h>
 #include <asm/irq.h>
 #include <asm/signal.h>
 #include <asm/system.h>
@@ -389,9 +390,9 @@ static int __init pci_v3_setup_resources(struct resource **resource)
  * means I can't get additional information on the reason for the pm2fb
  * problems.  I suppose I'll just have to mind-meld with the machine. ;)
  */
-#define SC_PCI     (IO_ADDRESS(INTEGRATOR_SC_BASE) + INTEGRATOR_SC_PCIENABLE_OFFSET)
-#define SC_LBFADDR (IO_ADDRESS(INTEGRATOR_SC_BASE) + 0x20)
-#define SC_LBFCODE (IO_ADDRESS(INTEGRATOR_SC_BASE) + 0x24)
+#define SC_PCI     IO_ADDRESS(INTEGRATOR_SC_PCIENABLE)
+#define SC_LBFADDR IO_ADDRESS(INTEGRATOR_SC_BASE + 0x20)
+#define SC_LBFCODE IO_ADDRESS(INTEGRATOR_SC_BASE + 0x24)
 
 static int
 v3_pci_fault(unsigned long addr, unsigned int fsr, struct pt_regs *regs)
index 5d99039..f108a31 100644 (file)
@@ -176,7 +176,7 @@ static struct plat_serial8250_port n2100_serial_port[] = {
                .mapbase        = N2100_UART,
                .membase        = (char *)N2100_UART,
                .irq            = 0,
-               .flags          = UPF_SKIP_TEST,
+               .flags          = UPF_SKIP_TEST | UPF_AUTO_IRQ | UPF_SHARE_IRQ,
                .iotype         = UPIO_MEM,
                .regshift       = 0,
                .uartclk        = 1843200,
index 71728d3..0bce097 100644 (file)
@@ -21,7 +21,6 @@
 #include <linux/tty.h>
 #include <linux/platform_device.h>
 #include <linux/serial_core.h>
-#include <linux/bootmem.h>
 #include <linux/interrupt.h>
 #include <linux/bitops.h>
 #include <linux/time.h>
index 3c5e0f5..71f3ea6 100644 (file)
@@ -6,6 +6,7 @@ config MACH_NOMADIK_8815NHK
        bool "ST 8815 Nomadik Hardware Kit (evaluation board)"
        select NOMADIK_8815
        select HAS_MTU
+       select NOMADIK_GPIO
 
 endmenu
 
index 36f67fb..a6bbd1a 100644 (file)
@@ -7,7 +7,7 @@
 
 # Object file lists.
 
-obj-y                  += clock.o gpio.o
+obj-y                  += clock.o
 
 # Cpu revision
 obj-$(CONFIG_NOMADIK_8815) += cpu-8815.o
index ab3712c..841d459 100644 (file)
@@ -32,7 +32,6 @@
 #include <mach/setup.h>
 #include <mach/nand.h>
 #include <mach/fsmc.h>
-#include "clock.h"
 
 /* Initial value for SRC control register: all timers use MXTAL/8 source */
 #define SRC_CR_INIT_MASK       0x00007fff
@@ -202,11 +201,6 @@ static struct amba_device *amba_devs[] __initdata = {
        &uart1_device,
 };
 
-/* We have a fixed clock alone, by now */
-static struct clk nhk8815_clk_48 = {
-       .rate = 48*1000*1000,
-};
-
 static struct resource nhk8815_eth_resources[] = {
        {
                .name = "smc91x-regs",
@@ -276,10 +270,8 @@ static void __init nhk8815_platform_init(void)
        platform_add_devices(nhk8815_platform_devices,
                             ARRAY_SIZE(nhk8815_platform_devices));
 
-       for (i = 0; i < ARRAY_SIZE(amba_devs); i++) {
-               nmdk_clk_create(&nhk8815_clk_48, amba_devs[i]->dev.init_name);
+       for (i = 0; i < ARRAY_SIZE(amba_devs); i++)
                amba_device_register(amba_devs[i], &iomem_resource);
-       }
 }
 
 MACHINE_START(NOMADIK, "NHK8815")
index 9f92502..60f5bee 100644 (file)
@@ -32,14 +32,36 @@ void clk_disable(struct clk *clk)
 }
 EXPORT_SYMBOL(clk_disable);
 
-/* Create a clock structure with the given name */
-int nmdk_clk_create(struct clk *clk, const char *dev_id)
-{
-       struct clk_lookup *clkdev;
+/* We have a fixed clock alone, for now */
+static struct clk clk_48 = {
+       .rate = 48 * 1000 * 1000,
+};
+
+/*
+ * Catch-all default clock to satisfy drivers using the clk API.  We don't
+ * model the actual hardware clocks yet.
+ */
+static struct clk clk_default;
 
-       clkdev = clkdev_alloc(clk, NULL, dev_id);
-       if (!clkdev)
-               return -ENOMEM;
-       clkdev_add(clkdev);
+#define CLK(_clk, dev)                         \
+       {                                       \
+               .clk            = _clk,         \
+               .dev_id         = dev,          \
+       }
+
+static struct clk_lookup lookups[] = {
+       CLK(&clk_48, "uart0"),
+       CLK(&clk_48, "uart1"),
+       CLK(&clk_default, "gpio.0"),
+       CLK(&clk_default, "gpio.1"),
+       CLK(&clk_default, "gpio.2"),
+       CLK(&clk_default, "gpio.3"),
+};
+
+static int __init clk_init(void)
+{
+       clkdev_add_table(lookups, ARRAY_SIZE(lookups));
        return 0;
 }
+
+arch_initcall(clk_init);
index 235faec..5563985 100644 (file)
@@ -11,4 +11,3 @@
 struct clk {
        unsigned long           rate;
 };
-extern int nmdk_clk_create(struct clk *clk, const char *dev_id);
index 9bf33b3..91c3c90 100644 (file)
@@ -20,6 +20,7 @@
 #include <linux/init.h>
 #include <linux/device.h>
 #include <linux/amba/bus.h>
+#include <linux/platform_device.h>
 #include <linux/gpio.h>
 
 #include <mach/hardware.h>
 #include <asm/cacheflush.h>
 #include <asm/hardware/cache-l2x0.h>
 
+#define __MEM_4K_RESOURCE(x) \
+       .res = {.start = (x), .end = (x) + SZ_4K - 1, .flags = IORESOURCE_MEM}
+
 /* The 8815 has 4 GPIO blocks, let's register them immediately */
+
+#define GPIO_RESOURCE(block)                                           \
+       {                                                               \
+               .start  = NOMADIK_GPIO##block##_BASE,                   \
+               .end    = NOMADIK_GPIO##block##_BASE + SZ_4K - 1,       \
+               .flags  = IORESOURCE_MEM,                               \
+       },                                                              \
+       {                                                               \
+               .start  = IRQ_GPIO##block,                              \
+               .end    = IRQ_GPIO##block,                              \
+               .flags  = IORESOURCE_IRQ,                               \
+       }
+
+#define GPIO_DEVICE(block)                                             \
+       {                                                               \
+               .name           = "gpio",                               \
+               .id             = block,                                \
+               .num_resources  = 2,                                    \
+               .resource       = &cpu8815_gpio_resources[block * 2],   \
+               .dev = {                                                \
+                       .platform_data = &cpu8815_gpio[block],          \
+               },                                                      \
+       }
+
 static struct nmk_gpio_platform_data cpu8815_gpio[] = {
        {
                .name = "GPIO-0-31",
                .first_gpio = 0,
                .first_irq = NOMADIK_GPIO_TO_IRQ(0),
-               .parent_irq = IRQ_GPIO0,
        }, {
                .name = "GPIO-32-63",
                .first_gpio = 32,
                .first_irq = NOMADIK_GPIO_TO_IRQ(32),
-               .parent_irq = IRQ_GPIO1,
        }, {
                .name = "GPIO-64-95",
                .first_gpio = 64,
                .first_irq = NOMADIK_GPIO_TO_IRQ(64),
-               .parent_irq = IRQ_GPIO2,
        }, {
                .name = "GPIO-96-127", /* 124..127 not routed to pin */
                .first_gpio = 96,
                .first_irq = NOMADIK_GPIO_TO_IRQ(96),
-               .parent_irq = IRQ_GPIO3,
        }
 };
 
-#define __MEM_4K_RESOURCE(x) \
-       .res = {.start = (x), .end = (x) + SZ_4K - 1, .flags = IORESOURCE_MEM}
+static struct resource cpu8815_gpio_resources[] = {
+       GPIO_RESOURCE(0),
+       GPIO_RESOURCE(1),
+       GPIO_RESOURCE(2),
+       GPIO_RESOURCE(3),
+};
 
-static struct amba_device cpu8815_amba_gpio[] = {
-       {
-               .dev = {
-                       .init_name = "gpio0",
-                       .platform_data = cpu8815_gpio + 0,
-               },
-               __MEM_4K_RESOURCE(NOMADIK_GPIO0_BASE),
-       }, {
-               .dev = {
-                       .init_name = "gpio1",
-                       .platform_data = cpu8815_gpio + 1,
-               },
-               __MEM_4K_RESOURCE(NOMADIK_GPIO1_BASE),
-       }, {
-               .dev = {
-                       .init_name = "gpio2",
-                       .platform_data = cpu8815_gpio + 2,
-               },
-               __MEM_4K_RESOURCE(NOMADIK_GPIO2_BASE),
-       }, {
-               .dev = {
-                       .init_name = "gpio3",
-                       .platform_data = cpu8815_gpio + 3,
-               },
-               __MEM_4K_RESOURCE(NOMADIK_GPIO3_BASE),
-       },
+static struct platform_device cpu8815_platform_gpio[] = {
+       GPIO_DEVICE(0),
+       GPIO_DEVICE(1),
+       GPIO_DEVICE(2),
+       GPIO_DEVICE(3),
 };
 
 static struct amba_device cpu8815_amba_rng = {
@@ -93,11 +100,14 @@ static struct amba_device cpu8815_amba_rng = {
        __MEM_4K_RESOURCE(NOMADIK_RNG_BASE),
 };
 
+static struct platform_device *platform_devs[] __initdata = {
+       cpu8815_platform_gpio + 0,
+       cpu8815_platform_gpio + 1,
+       cpu8815_platform_gpio + 2,
+       cpu8815_platform_gpio + 3,
+};
+
 static struct amba_device *amba_devs[] __initdata = {
-       cpu8815_amba_gpio + 0,
-       cpu8815_amba_gpio + 1,
-       cpu8815_amba_gpio + 2,
-       cpu8815_amba_gpio + 3,
        &cpu8815_amba_rng
 };
 
@@ -105,6 +115,7 @@ static int __init cpu8815_init(void)
 {
        int i;
 
+       platform_add_devices(platform_devs, ARRAY_SIZE(platform_devs));
        for (i = 0; i < ARRAY_SIZE(amba_devs); i++)
                amba_device_register(amba_devs[i], &iomem_resource);
        return 0;
index 61577c9..7a81a04 100644 (file)
@@ -1,71 +1,6 @@
-/*
- * Structures and registers for GPIO access in the Nomadik SoC
- *
- * Copyright (C) 2008 STMicroelectronics
- *     Author: Prafulla WADASKAR <prafulla.wadaskar@st.com>
- * Copyright (C) 2009 Alessandro Rubini <rubini@unipv.it>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- */
 #ifndef __ASM_ARCH_GPIO_H
 #define __ASM_ARCH_GPIO_H
 
-#include <asm-generic/gpio.h>
-
-/*
- * These currently cause a function call to happen, they may be optimized
- * if needed by adding cpu-specific defines to identify blocks
- * (see mach-pxa/include/mach/gpio.h as an example using GPLR etc)
- */
-#define gpio_get_value  __gpio_get_value
-#define gpio_set_value  __gpio_set_value
-#define gpio_cansleep   __gpio_cansleep
-#define gpio_to_irq     __gpio_to_irq
-
-/*
- * "nmk_gpio" and "NMK_GPIO" stand for "Nomadik GPIO", leaving
- * the "gpio" namespace for generic and cross-machine functions
- */
-
-/* Register in the logic block */
-#define NMK_GPIO_DAT   0x00
-#define NMK_GPIO_DATS  0x04
-#define NMK_GPIO_DATC  0x08
-#define NMK_GPIO_PDIS  0x0c
-#define NMK_GPIO_DIR   0x10
-#define NMK_GPIO_DIRS  0x14
-#define NMK_GPIO_DIRC  0x18
-#define NMK_GPIO_SLPC  0x1c
-#define NMK_GPIO_AFSLA 0x20
-#define NMK_GPIO_AFSLB 0x24
-
-#define NMK_GPIO_RIMSC 0x40
-#define NMK_GPIO_FIMSC 0x44
-#define NMK_GPIO_IS    0x48
-#define NMK_GPIO_IC    0x4c
-#define NMK_GPIO_RWIMSC        0x50
-#define NMK_GPIO_FWIMSC        0x54
-#define NMK_GPIO_WKS   0x58
-
-/* Alternate functions: function C is set in hw by setting both A and B */
-#define NMK_GPIO_ALT_GPIO      0
-#define NMK_GPIO_ALT_A 1
-#define NMK_GPIO_ALT_B 2
-#define NMK_GPIO_ALT_C (NMK_GPIO_ALT_A | NMK_GPIO_ALT_B)
-
-extern int nmk_gpio_set_mode(int gpio, int gpio_mode);
-extern int nmk_gpio_get_mode(int gpio);
-
-/*
- * Platform data to register a block: only the initial gpio/irq number.
- */
-struct nmk_gpio_platform_data {
-       char *name;
-       int first_gpio;
-       int first_irq;
-       int parent_irq;
-};
+#include <plat/gpio.h>
 
 #endif /* __ASM_ARCH_GPIO_H */
index e36639f..8e313b4 100644 (file)
@@ -28,7 +28,6 @@
 #include <linux/init.h>
 #include <linux/platform_device.h>
 #include <linux/input.h>
-#include <linux/bootmem.h>
 #include <linux/io.h>
 #include <linux/gpio.h>
 
index 2271b9b..12154d1 100644 (file)
 #include <linux/clk.h>
 
 #include <mach/hardware.h>
+#include <mach/irqs.h>
 #include <asm/mach-types.h>
 #include <asm/mach/map.h>
+#include <asm/pmu.h>
 
 #include <plat/control.h>
 #include <plat/tc.h>
@@ -453,6 +455,37 @@ static void omap_init_mcspi(void)
 static inline void omap_init_mcspi(void) {}
 #endif
 
+static struct resource omap2_pmu_resource = {
+       .start  = 3,
+       .end    = 3,
+       .flags  = IORESOURCE_IRQ,
+};
+
+static struct resource omap3_pmu_resource = {
+       .start  = INT_34XX_BENCH_MPU_EMUL,
+       .end    = INT_34XX_BENCH_MPU_EMUL,
+       .flags  = IORESOURCE_IRQ,
+};
+
+static struct platform_device omap_pmu_device = {
+       .name           = "arm-pmu",
+       .id             = ARM_PMU_DEVICE_CPU,
+       .num_resources  = 1,
+};
+
+static void omap_init_pmu(void)
+{
+       if (cpu_is_omap24xx())
+               omap_pmu_device.resource = &omap2_pmu_resource;
+       else if (cpu_is_omap34xx())
+               omap_pmu_device.resource = &omap3_pmu_resource;
+       else
+               return;
+
+       platform_device_register(&omap_pmu_device);
+}
+
+
 #ifdef CONFIG_OMAP_SHA1_MD5
 static struct resource sha1_md5_resources[] = {
        {
@@ -797,6 +830,7 @@ static int __init omap2_init_devices(void)
        omap_init_camera();
        omap_init_mbox();
        omap_init_mcspi();
+       omap_init_pmu();
        omap_hdq_init();
        omap_init_sti();
        omap_init_sha1_md5();
index e436dcb..2c12e8c 100644 (file)
@@ -43,7 +43,6 @@
 #include <linux/err.h>
 #include <linux/list.h>
 #include <linux/mutex.h>
-#include <linux/bootmem.h>
 
 #include <plat/common.h>
 #include <plat/cpu.h>
index e704edb..a01b76b 100644 (file)
@@ -2,7 +2,7 @@
 # Makefile for the linux kernel.
 #
 
-obj-y                                  := core.o clock.o
+obj-y                                  := core.o
 obj-$(CONFIG_MACH_REALVIEW_EB)         += realview_eb.o
 obj-$(CONFIG_MACH_REALVIEW_PB11MP)     += realview_pb11mp.o
 obj-$(CONFIG_MACH_REALVIEW_PB1176)     += realview_pb1176.o
diff --git a/arch/arm/mach-realview/clock.c b/arch/arm/mach-realview/clock.c
deleted file mode 100644 (file)
index a704311..0000000
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- *  linux/arch/arm/mach-realview/clock.c
- *
- *  Copyright (C) 2004 ARM Limited.
- *  Written by Deep Blue Solutions Limited.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- */
-#include <linux/module.h>
-#include <linux/kernel.h>
-#include <linux/device.h>
-#include <linux/list.h>
-#include <linux/errno.h>
-#include <linux/err.h>
-#include <linux/string.h>
-#include <linux/clk.h>
-#include <linux/mutex.h>
-
-#include <asm/hardware/icst307.h>
-
-#include "clock.h"
-
-int clk_enable(struct clk *clk)
-{
-       return 0;
-}
-EXPORT_SYMBOL(clk_enable);
-
-void clk_disable(struct clk *clk)
-{
-}
-EXPORT_SYMBOL(clk_disable);
-
-unsigned long clk_get_rate(struct clk *clk)
-{
-       return clk->rate;
-}
-EXPORT_SYMBOL(clk_get_rate);
-
-long clk_round_rate(struct clk *clk, unsigned long rate)
-{
-       struct icst307_vco vco;
-       vco = icst307_khz_to_vco(clk->params, rate / 1000);
-       return icst307_khz(clk->params, vco) * 1000;
-}
-EXPORT_SYMBOL(clk_round_rate);
-
-int clk_set_rate(struct clk *clk, unsigned long rate)
-{
-       int ret = -EIO;
-
-       if (clk->setvco) {
-               struct icst307_vco vco;
-
-               vco = icst307_khz_to_vco(clk->params, rate / 1000);
-               clk->rate = icst307_khz(clk->params, vco) * 1000;
-               clk->setvco(clk, vco);
-               ret = 0;
-       }
-       return ret;
-}
-EXPORT_SYMBOL(clk_set_rate);
diff --git a/arch/arm/mach-realview/clock.h b/arch/arm/mach-realview/clock.h
deleted file mode 100644 (file)
index ebbb0f0..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- *  linux/arch/arm/mach-realview/clock.h
- *
- *  Copyright (C) 2004 ARM Limited.
- *  Written by Deep Blue Solutions Limited.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- */
-struct module;
-struct icst307_params;
-
-struct clk {
-       unsigned long           rate;
-       const struct icst307_params *params;
-       void                    *data;
-       void                    (*setvco)(struct clk *, struct icst307_vco vco);
-};
index d5a9573..595be19 100644 (file)
@@ -25,8 +25,6 @@
 #include <linux/interrupt.h>
 #include <linux/amba/bus.h>
 #include <linux/amba/clcd.h>
-#include <linux/clocksource.h>
-#include <linux/clockchips.h>
 #include <linux/io.h>
 #include <linux/smsc911x.h>
 #include <linux/ata_platform.h>
@@ -40,7 +38,7 @@
 #include <asm/leds.h>
 #include <asm/mach-types.h>
 #include <asm/hardware/arm_timer.h>
-#include <asm/hardware/icst307.h>
+#include <asm/hardware/icst.h>
 
 #include <asm/mach/arch.h>
 #include <asm/mach/flash.h>
 
 #include <asm/hardware/gic.h>
 
+#include <mach/clkdev.h>
 #include <mach/platform.h>
 #include <mach/irqs.h>
+#include <plat/timer-sp.h>
 
 #include "core.h"
-#include "clock.h"
-
-#define REALVIEW_REFCOUNTER    (__io_address(REALVIEW_SYS_BASE) + REALVIEW_SYS_24MHz_OFFSET)
 
 /* used by entry-macro.S and platsmp.c */
 void __iomem *gic_cpu_base_addr;
@@ -79,20 +76,6 @@ void __init realview_adjust_zones(int node, unsigned long *size,
 }
 #endif
 
-/*
- * This is the RealView sched_clock implementation.  This has
- * a resolution of 41.7ns, and a maximum value of about 179s.
- */
-unsigned long long sched_clock(void)
-{
-       unsigned long long v;
-
-       v = (unsigned long long)readl(REALVIEW_REFCOUNTER) * 125;
-       do_div(v, 3);
-
-       return v;
-}
-
 
 #define REALVIEW_FLASHCTRL    (__io_address(REALVIEW_SYS_BASE) + REALVIEW_SYS_FLASH_OFFSET)
 
@@ -274,37 +257,40 @@ struct mmci_platform_data realview_mmc1_plat_data = {
 /*
  * Clock handling
  */
-static const struct icst307_params realview_oscvco_params = {
-       .ref            = 24000,
-       .vco_max        = 200000,
+static const struct icst_params realview_oscvco_params = {
+       .ref            = 24000000,
+       .vco_max        = ICST307_VCO_MAX,
+       .vco_min        = ICST307_VCO_MIN,
        .vd_min         = 4 + 8,
        .vd_max         = 511 + 8,
        .rd_min         = 1 + 2,
        .rd_max         = 127 + 2,
+       .s2div          = icst307_s2div,
+       .idx2s          = icst307_idx2s,
 };
 
-static void realview_oscvco_set(struct clk *clk, struct icst307_vco vco)
+static void realview_oscvco_set(struct clk *clk, struct icst_vco vco)
 {
        void __iomem *sys_lock = __io_address(REALVIEW_SYS_BASE) + REALVIEW_SYS_LOCK_OFFSET;
-       void __iomem *sys_osc;
        u32 val;
 
-       if (machine_is_realview_pb1176())
-               sys_osc = __io_address(REALVIEW_SYS_BASE) + REALVIEW_SYS_OSC0_OFFSET;
-       else
-               sys_osc = __io_address(REALVIEW_SYS_BASE) + REALVIEW_SYS_OSC4_OFFSET;
-
-       val = readl(sys_osc) & ~0x7ffff;
+       val = readl(clk->vcoreg) & ~0x7ffff;
        val |= vco.v | (vco.r << 9) | (vco.s << 16);
 
        writel(0xa05f, sys_lock);
-       writel(val, sys_osc);
+       writel(val, clk->vcoreg);
        writel(0, sys_lock);
 }
 
+static const struct clk_ops oscvco_clk_ops = {
+       .round  = icst_clk_round,
+       .set    = icst_clk_set,
+       .setvco = realview_oscvco_set,
+};
+
 static struct clk oscvco_clk = {
+       .ops    = &oscvco_clk_ops,
        .params = &realview_oscvco_params,
-       .setvco = realview_oscvco_set,
 };
 
 /*
@@ -347,7 +333,13 @@ static struct clk_lookup lookups[] = {
 
 static int __init clk_init(void)
 {
+       if (machine_is_realview_pb1176())
+               oscvco_clk.vcoreg = __io_address(REALVIEW_SYS_BASE) + REALVIEW_SYS_OSC0_OFFSET;
+       else
+               oscvco_clk.vcoreg = __io_address(REALVIEW_SYS_BASE) + REALVIEW_SYS_OSC4_OFFSET;
+
        clkdev_add_table(lookups, ARRAY_SIZE(lookups));
+
        return 0;
 }
 arch_initcall(clk_init);
@@ -643,133 +635,6 @@ void __iomem *timer1_va_base;
 void __iomem *timer2_va_base;
 void __iomem *timer3_va_base;
 
-/*
- * How long is the timer interval?
- */
-#define TIMER_INTERVAL (TICKS_PER_uSEC * mSEC_10)
-#if TIMER_INTERVAL >= 0x100000
-#define TIMER_RELOAD   (TIMER_INTERVAL >> 8)
-#define TIMER_DIVISOR  (TIMER_CTRL_DIV256)
-#define TICKS2USECS(x) (256 * (x) / TICKS_PER_uSEC)
-#elif TIMER_INTERVAL >= 0x10000
-#define TIMER_RELOAD   (TIMER_INTERVAL >> 4)           /* Divide by 16 */
-#define TIMER_DIVISOR  (TIMER_CTRL_DIV16)
-#define TICKS2USECS(x) (16 * (x) / TICKS_PER_uSEC)
-#else
-#define TIMER_RELOAD   (TIMER_INTERVAL)
-#define TIMER_DIVISOR  (TIMER_CTRL_DIV1)
-#define TICKS2USECS(x) ((x) / TICKS_PER_uSEC)
-#endif
-
-static void timer_set_mode(enum clock_event_mode mode,
-                          struct clock_event_device *clk)
-{
-       unsigned long ctrl;
-
-       switch(mode) {
-       case CLOCK_EVT_MODE_PERIODIC:
-               writel(TIMER_RELOAD, timer0_va_base + TIMER_LOAD);
-
-               ctrl = TIMER_CTRL_PERIODIC;
-               ctrl |= TIMER_CTRL_32BIT | TIMER_CTRL_IE | TIMER_CTRL_ENABLE;
-               break;
-       case CLOCK_EVT_MODE_ONESHOT:
-               /* period set, and timer enabled in 'next_event' hook */
-               ctrl = TIMER_CTRL_ONESHOT;
-               ctrl |= TIMER_CTRL_32BIT | TIMER_CTRL_IE;
-               break;
-       case CLOCK_EVT_MODE_UNUSED:
-       case CLOCK_EVT_MODE_SHUTDOWN:
-       default:
-               ctrl = 0;
-       }
-
-       writel(ctrl, timer0_va_base + TIMER_CTRL);
-}
-
-static int timer_set_next_event(unsigned long evt,
-                               struct clock_event_device *unused)
-{
-       unsigned long ctrl = readl(timer0_va_base + TIMER_CTRL);
-
-       writel(evt, timer0_va_base + TIMER_LOAD);
-       writel(ctrl | TIMER_CTRL_ENABLE, timer0_va_base + TIMER_CTRL);
-
-       return 0;
-}
-
-static struct clock_event_device timer0_clockevent =    {
-       .name           = "timer0",
-       .shift          = 32,
-       .features       = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT,
-       .set_mode       = timer_set_mode,
-       .set_next_event = timer_set_next_event,
-       .rating         = 300,
-       .cpumask        = cpu_all_mask,
-};
-
-static void __init realview_clockevents_init(unsigned int timer_irq)
-{
-       timer0_clockevent.irq = timer_irq;
-       timer0_clockevent.mult =
-               div_sc(1000000, NSEC_PER_SEC, timer0_clockevent.shift);
-       timer0_clockevent.max_delta_ns =
-               clockevent_delta2ns(0xffffffff, &timer0_clockevent);
-       timer0_clockevent.min_delta_ns =
-               clockevent_delta2ns(0xf, &timer0_clockevent);
-
-       clockevents_register_device(&timer0_clockevent);
-}
-
-/*
- * IRQ handler for the timer
- */
-static irqreturn_t realview_timer_interrupt(int irq, void *dev_id)
-{
-       struct clock_event_device *evt = &timer0_clockevent;
-
-       /* clear the interrupt */
-       writel(1, timer0_va_base + TIMER_INTCLR);
-
-       evt->event_handler(evt);
-
-       return IRQ_HANDLED;
-}
-
-static struct irqaction realview_timer_irq = {
-       .name           = "RealView Timer Tick",
-       .flags          = IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL,
-       .handler        = realview_timer_interrupt,
-};
-
-static cycle_t realview_get_cycles(struct clocksource *cs)
-{
-       return ~readl(timer3_va_base + TIMER_VALUE);
-}
-
-static struct clocksource clocksource_realview = {
-       .name   = "timer3",
-       .rating = 200,
-       .read   = realview_get_cycles,
-       .mask   = CLOCKSOURCE_MASK(32),
-       .shift  = 20,
-       .flags  = CLOCK_SOURCE_IS_CONTINUOUS,
-};
-
-static void __init realview_clocksource_init(void)
-{
-       /* setup timer 0 as free-running clocksource */
-       writel(0, timer3_va_base + TIMER_CTRL);
-       writel(0xffffffff, timer3_va_base + TIMER_LOAD);
-       writel(0xffffffff, timer3_va_base + TIMER_VALUE);
-       writel(TIMER_CTRL_32BIT | TIMER_CTRL_ENABLE | TIMER_CTRL_PERIODIC,
-               timer3_va_base + TIMER_CTRL);
-
-       clocksource_realview.mult =
-               clocksource_khz2mult(1000, clocksource_realview.shift);
-       clocksource_register(&clocksource_realview);
-}
-
 /*
  * Set up the clock source and clock events devices
  */
@@ -797,13 +662,8 @@ void __init realview_timer_init(unsigned int timer_irq)
        writel(0, timer2_va_base + TIMER_CTRL);
        writel(0, timer3_va_base + TIMER_CTRL);
 
-       /* 
-        * Make irqs happen for the system timer
-        */
-       setup_irq(timer_irq, &realview_timer_irq);
-
-       realview_clocksource_init();
-       realview_clockevents_init(timer_irq);
+       sp804_clocksource_init(timer3_va_base);
+       sp804_clockevents_init(timer0_va_base, timer_irq);
 }
 
 /*
index be048e3..f95521a 100644 (file)
@@ -131,7 +131,7 @@ void platform_cpu_die(unsigned int cpu)
        cpu_leave_lowpower();
 }
 
-int mach_cpu_disable(unsigned int cpu)
+int platform_cpu_disable(unsigned int cpu)
 {
        /*
         * we don't allow CPU 0 to be shutdown (it is still too special
index 04b37a8..e58d077 100644 (file)
@@ -1,6 +1,15 @@
 #ifndef __ASM_MACH_CLKDEV_H
 #define __ASM_MACH_CLKDEV_H
 
+#include <plat/clock.h>
+
+struct clk {
+       unsigned long           rate;
+       const struct clk_ops    *ops;
+       const struct icst_params *params;
+       void __iomem            *vcoreg;
+};
+
 #define __clk_get(clk) ({ 1; })
 #define __clk_put(clk) do { } while (0)
 
index 2410d4f..830055b 100644 (file)
@@ -31,6 +31,7 @@
 #define IRQ_DC1176_SOFTINT     (IRQ_DC1176_GIC_START + 1)      /* Software interrupt */
 #define IRQ_DC1176_COMMRx      (IRQ_DC1176_GIC_START + 2)      /* Debug Comm Rx interrupt */
 #define IRQ_DC1176_COMMTx      (IRQ_DC1176_GIC_START + 3)      /* Debug Comm Tx interrupt */
+#define IRQ_DC1176_CORE_PMU    (IRQ_DC1176_GIC_START + 7)      /* Core PMU interrupt */
 #define IRQ_DC1176_TIMER0      (IRQ_DC1176_GIC_START + 8)      /* Timer 0 */
 #define IRQ_DC1176_TIMER1      (IRQ_DC1176_GIC_START + 9)      /* Timer 1 */
 #define IRQ_DC1176_TIMER2      (IRQ_DC1176_GIC_START + 10)     /* Timer 2 */
index 86792a9..4a88a4e 100644 (file)
 
 #define IRQ_PBA8_GIC_START                     32
 
-/* L220
-#define IRQ_PBA8_L220_EVENT    (IRQ_PBA8_GIC_START + 29)
-#define IRQ_PBA8_L220_SLAVE    (IRQ_PBA8_GIC_START + 30)
-#define IRQ_PBA8_L220_DECODE   (IRQ_PBA8_GIC_START + 31)
-*/
-
 /*
  * PB-A8 on-board gic irq sources
  */
@@ -65,6 +59,8 @@
 #define IRQ_PBA8_TSPEN         (IRQ_PBA8_GIC_START + 30)       /* Touchscreen pen */
 #define IRQ_PBA8_TSKPAD                (IRQ_PBA8_GIC_START + 31)       /* Touchscreen keypad */
 
+#define IRQ_PBA8_PMU           (IRQ_PBA8_GIC_START + 47)       /* Cortex-A8 PMU */
+
 /* ... */
 #define IRQ_PBA8_PCI0          (IRQ_PBA8_GIC_START + 50)
 #define IRQ_PBA8_PCI1          (IRQ_PBA8_GIC_START + 51)
index deaad43..206a300 100644 (file)
 
 #define IRQ_PBX_GIC_START                      32
 
-/* L220
-#define IRQ_PBX_L220_EVENT     (IRQ_PBX_GIC_START + 29)
-#define IRQ_PBX_L220_SLAVE     (IRQ_PBX_GIC_START + 30)
-#define IRQ_PBX_L220_DECODE    (IRQ_PBX_GIC_START + 31)
-*/
-
 /*
  * PBX on-board gic irq sources
  */
 #define IRQ_PBX_TIMER4_5        (IRQ_PBX_GIC_START + 41)        /* Timer 0/1 (default timer) */
 #define IRQ_PBX_TIMER6_7        (IRQ_PBX_GIC_START + 42)        /* Timer 2/3 */
 /* ... */
-#define IRQ_PBX_PMU_CPU3        (IRQ_PBX_GIC_START + 44)        /* CPU PMU Interrupts */
-#define IRQ_PBX_PMU_CPU2        (IRQ_PBX_GIC_START + 45)
-#define IRQ_PBX_PMU_CPU1        (IRQ_PBX_GIC_START + 46)
-#define IRQ_PBX_PMU_CPU0        (IRQ_PBX_GIC_START + 47)
+#define IRQ_PBX_PMU_CPU0        (IRQ_PBX_GIC_START + 44)        /* CPU PMU Interrupts */
+#define IRQ_PBX_PMU_CPU1        (IRQ_PBX_GIC_START + 45)
+#define IRQ_PBX_PMU_CPU2        (IRQ_PBX_GIC_START + 46)
+#define IRQ_PBX_PMU_CPU3        (IRQ_PBX_GIC_START + 47)
 
 /* ... */
 #define IRQ_PBX_PCI0           (IRQ_PBX_GIC_START + 50)
index 86c0c44..1b77a27 100644 (file)
 #define REALVIEW_INTREG_OFFSET         0x8     /* Interrupt control */
 #define REALVIEW_DECODE_OFFSET         0xC     /* Fitted logic modules */
 
-/* 
- *  Clean base - dummy
- * 
- */
-#define CLEAN_BASE                      REALVIEW_BOOT_ROM_HI
-
 /*
  * System controller bit assignment
  */
 #define REALVIEW_TIMER4_EnSel  21
 
 
-#define MAX_TIMER                       2
-#define MAX_PERIOD                      699050
-#define TICKS_PER_uSEC                  1
-
-/* 
- *  These are useconds NOT ticks.  
- * 
- */
-#define mSEC_1                          1000
-#define mSEC_5                          (mSEC_1 * 5)
-#define mSEC_10                         (mSEC_1 * 10)
-#define mSEC_25                         (mSEC_1 * 25)
-#define SEC_1                           (mSEC_1 * 1000)
-
 #define REALVIEW_CSR_BASE             0x10000000
 #define REALVIEW_CSR_SIZE             0x10000000
 
index 7d857d3..422ccd7 100644 (file)
@@ -31,8 +31,8 @@
 #include <asm/irq.h>
 #include <asm/leds.h>
 #include <asm/mach-types.h>
+#include <asm/pmu.h>
 #include <asm/hardware/gic.h>
-#include <asm/hardware/icst307.h>
 #include <asm/hardware/cache-l2x0.h>
 #include <asm/localtimer.h>
 
@@ -44,7 +44,6 @@
 #include <mach/irqs.h>
 
 #include "core.h"
-#include "clock.h"
 
 static struct map_desc realview_eb_io_desc[] __initdata = {
        {
@@ -294,6 +293,36 @@ static struct resource realview_eb_isp1761_resources[] = {
        },
 };
 
+static struct resource pmu_resources[] = {
+       [0] = {
+               .start          = IRQ_EB11MP_PMU_CPU0,
+               .end            = IRQ_EB11MP_PMU_CPU0,
+               .flags          = IORESOURCE_IRQ,
+       },
+       [1] = {
+               .start          = IRQ_EB11MP_PMU_CPU1,
+               .end            = IRQ_EB11MP_PMU_CPU1,
+               .flags          = IORESOURCE_IRQ,
+       },
+       [2] = {
+               .start          = IRQ_EB11MP_PMU_CPU2,
+               .end            = IRQ_EB11MP_PMU_CPU2,
+               .flags          = IORESOURCE_IRQ,
+       },
+       [3] = {
+               .start          = IRQ_EB11MP_PMU_CPU3,
+               .end            = IRQ_EB11MP_PMU_CPU3,
+               .flags          = IORESOURCE_IRQ,
+       },
+};
+
+static struct platform_device pmu_device = {
+       .name                   = "arm-pmu",
+       .id                     = ARM_PMU_DEVICE_CPU,
+       .num_resources          = ARRAY_SIZE(pmu_resources),
+       .resource               = pmu_resources,
+};
+
 static void __init gic_init_irq(void)
 {
        if (core_tile_eb11mp() || core_tile_a9mp()) {
@@ -407,6 +436,7 @@ static void __init realview_eb_init(void)
                 * Bits:  .... ...0 0111 1001 0000 .... .... .... */
                l2x0_init(__io_address(REALVIEW_EB11MP_L220_BASE), 0x00790000, 0xfe000fff);
 #endif
+               platform_device_register(&pmu_device);
        }
 
        realview_flash_register(&realview_eb_flash_resource, 1);
index 44392e5..96568eb 100644 (file)
@@ -31,8 +31,8 @@
 #include <asm/irq.h>
 #include <asm/leds.h>
 #include <asm/mach-types.h>
+#include <asm/pmu.h>
 #include <asm/hardware/gic.h>
-#include <asm/hardware/icst307.h>
 #include <asm/hardware/cache-l2x0.h>
 
 #include <asm/mach/arch.h>
@@ -44,7 +44,6 @@
 #include <mach/irqs.h>
 
 #include "core.h"
-#include "clock.h"
 
 static struct map_desc realview_pb1176_io_desc[] __initdata = {
        {
@@ -263,6 +262,19 @@ static struct resource realview_pb1176_isp1761_resources[] = {
        },
 };
 
+static struct resource pmu_resource = {
+       .start          = IRQ_DC1176_CORE_PMU,
+       .end            = IRQ_DC1176_CORE_PMU,
+       .flags          = IORESOURCE_IRQ,
+};
+
+static struct platform_device pmu_device = {
+       .name                   = "arm-pmu",
+       .id                     = ARM_PMU_DEVICE_CPU,
+       .num_resources          = 1,
+       .resource               = &pmu_resource,
+};
+
 static void __init gic_init_irq(void)
 {
        /* ARM1176 DevChip GIC, primary */
@@ -324,6 +336,7 @@ static void __init realview_pb1176_init(void)
        realview_eth_register(NULL, realview_pb1176_smsc911x_resources);
        platform_device_register(&realview_i2c_device);
        realview_usb_register(realview_pb1176_isp1761_resources);
+       platform_device_register(&pmu_device);
 
        for (i = 0; i < ARRAY_SIZE(amba_devs); i++) {
                struct amba_device *d = amba_devs[i];
index 3e02731..7fbefbb 100644 (file)
@@ -31,8 +31,8 @@
 #include <asm/irq.h>
 #include <asm/leds.h>
 #include <asm/mach-types.h>
+#include <asm/pmu.h>
 #include <asm/hardware/gic.h>
-#include <asm/hardware/icst307.h>
 #include <asm/hardware/cache-l2x0.h>
 #include <asm/localtimer.h>
 
@@ -45,7 +45,6 @@
 #include <mach/irqs.h>
 
 #include "core.h"
-#include "clock.h"
 
 static struct map_desc realview_pb11mp_io_desc[] __initdata = {
        {
@@ -260,6 +259,36 @@ static struct resource realview_pb11mp_isp1761_resources[] = {
        },
 };
 
+static struct resource pmu_resources[] = {
+       [0] = {
+               .start          = IRQ_TC11MP_PMU_CPU0,
+               .end            = IRQ_TC11MP_PMU_CPU0,
+               .flags          = IORESOURCE_IRQ,
+       },
+       [1] = {
+               .start          = IRQ_TC11MP_PMU_CPU1,
+               .end            = IRQ_TC11MP_PMU_CPU1,
+               .flags          = IORESOURCE_IRQ,
+       },
+       [2] = {
+               .start          = IRQ_TC11MP_PMU_CPU2,
+               .end            = IRQ_TC11MP_PMU_CPU2,
+               .flags          = IORESOURCE_IRQ,
+       },
+       [3] = {
+               .start          = IRQ_TC11MP_PMU_CPU3,
+               .end            = IRQ_TC11MP_PMU_CPU3,
+               .flags          = IORESOURCE_IRQ,
+       },
+};
+
+static struct platform_device pmu_device = {
+       .name                   = "arm-pmu",
+       .id                     = ARM_PMU_DEVICE_CPU,
+       .num_resources          = ARRAY_SIZE(pmu_resources),
+       .resource               = pmu_resources,
+};
+
 static void __init gic_init_irq(void)
 {
        unsigned int pldctrl;
@@ -329,6 +358,7 @@ static void __init realview_pb11mp_init(void)
        platform_device_register(&realview_i2c_device);
        platform_device_register(&realview_cf_device);
        realview_usb_register(realview_pb11mp_isp1761_resources);
+       platform_device_register(&pmu_device);
 
        for (i = 0; i < ARRAY_SIZE(amba_devs); i++) {
                struct amba_device *d = amba_devs[i];
index fe4e25c..d3c113b 100644 (file)
@@ -30,8 +30,8 @@
 #include <asm/irq.h>
 #include <asm/leds.h>
 #include <asm/mach-types.h>
+#include <asm/pmu.h>
 #include <asm/hardware/gic.h>
-#include <asm/hardware/icst307.h>
 
 #include <asm/mach/arch.h>
 #include <asm/mach/map.h>
@@ -42,7 +42,6 @@
 #include <mach/irqs.h>
 
 #include "core.h"
-#include "clock.h"
 
 static struct map_desc realview_pba8_io_desc[] __initdata = {
        {
@@ -250,6 +249,19 @@ static struct resource realview_pba8_isp1761_resources[] = {
        },
 };
 
+static struct resource pmu_resource = {
+       .start          = IRQ_PBA8_PMU,
+       .end            = IRQ_PBA8_PMU,
+       .flags          = IORESOURCE_IRQ,
+};
+
+static struct platform_device pmu_device = {
+       .name                   = "arm-pmu",
+       .id                     = ARM_PMU_DEVICE_CPU,
+       .num_resources          = 1,
+       .resource               = &pmu_resource,
+};
+
 static void __init gic_init_irq(void)
 {
        /* ARM PB-A8 on-board GIC */
@@ -296,6 +308,7 @@ static void __init realview_pba8_init(void)
        platform_device_register(&realview_i2c_device);
        platform_device_register(&realview_cf_device);
        realview_usb_register(realview_pba8_isp1761_resources);
+       platform_device_register(&pmu_device);
 
        for (i = 0; i < ARRAY_SIZE(amba_devs); i++) {
                struct amba_device *d = amba_devs[i];
index d94857e..a235ba3 100644 (file)
@@ -29,6 +29,7 @@
 #include <asm/irq.h>
 #include <asm/leds.h>
 #include <asm/mach-types.h>
+#include <asm/pmu.h>
 #include <asm/smp_twd.h>
 #include <asm/hardware/gic.h>
 #include <asm/hardware/cache-l2x0.h>
@@ -270,6 +271,36 @@ static struct resource realview_pbx_isp1761_resources[] = {
        },
 };
 
+static struct resource pmu_resources[] = {
+       [0] = {
+               .start          = IRQ_PBX_PMU_CPU0,
+               .end            = IRQ_PBX_PMU_CPU0,
+               .flags          = IORESOURCE_IRQ,
+       },
+       [1] = {
+               .start          = IRQ_PBX_PMU_CPU1,
+               .end            = IRQ_PBX_PMU_CPU1,
+               .flags          = IORESOURCE_IRQ,
+       },
+       [2] = {
+               .start          = IRQ_PBX_PMU_CPU2,
+               .end            = IRQ_PBX_PMU_CPU2,
+               .flags          = IORESOURCE_IRQ,
+       },
+       [3] = {
+               .start          = IRQ_PBX_PMU_CPU3,
+               .end            = IRQ_PBX_PMU_CPU3,
+               .flags          = IORESOURCE_IRQ,
+       },
+};
+
+static struct platform_device pmu_device = {
+       .name                   = "arm-pmu",
+       .id                     = ARM_PMU_DEVICE_CPU,
+       .num_resources          = ARRAY_SIZE(pmu_resources),
+       .resource               = pmu_resources,
+};
+
 static void __init gic_init_irq(void)
 {
        /* ARM PBX on-board GIC */
@@ -354,6 +385,7 @@ static void __init realview_pbx_init(void)
                /* 16KB way size, 8-way associativity, parity disabled
                 * Bits:  .. 0 0 0 0 1 00 1 0 1 001 0 000 0 .... .... .... */
                l2x0_init(l2x0_base, 0x02520000, 0xc0000fff);
+               platform_device_register(&pmu_device);
        }
 #endif
 
diff --git a/arch/arm/mach-spear3xx/Kconfig b/arch/arm/mach-spear3xx/Kconfig
new file mode 100644 (file)
index 0000000..20d1317
--- /dev/null
@@ -0,0 +1,33 @@
+#
+# SPEAr3XX Machine configuration file
+#
+
+if ARCH_SPEAR3XX
+
+choice
+       prompt "SPEAr3XX Family"
+       default MACH_SPEAR300
+
+config MACH_SPEAR300
+       bool "SPEAr300"
+       help
+         Supports ST SPEAr300 Machine
+
+config MACH_SPEAR310
+       bool "SPEAr310"
+       help
+         Supports ST SPEAr310 Machine
+
+config MACH_SPEAR320
+       bool "SPEAr320"
+       help
+         Supports ST SPEAr320 Machine
+
+endchoice
+
+# Adding SPEAr3XX machine specific configuration files
+source "arch/arm/mach-spear3xx/Kconfig300"
+source "arch/arm/mach-spear3xx/Kconfig310"
+source "arch/arm/mach-spear3xx/Kconfig320"
+
+endif #ARCH_SPEAR3XX
diff --git a/arch/arm/mach-spear3xx/Kconfig300 b/arch/arm/mach-spear3xx/Kconfig300
new file mode 100644 (file)
index 0000000..c519a05
--- /dev/null
@@ -0,0 +1,17 @@
+#
+# SPEAr300 machine configuration file
+#
+
+if MACH_SPEAR300
+
+choice
+       prompt "SPEAr300 Boards"
+       default BOARD_SPEAR300_EVB
+
+config BOARD_SPEAR300_EVB
+       bool "SPEAr300 Evaluation Board"
+       help
+         Supports ST SPEAr300 Evaluation Board
+endchoice
+
+endif  #MACH_SPEAR300
diff --git a/arch/arm/mach-spear3xx/Kconfig310 b/arch/arm/mach-spear3xx/Kconfig310
new file mode 100644 (file)
index 0000000..60e7442
--- /dev/null
@@ -0,0 +1,17 @@
+#
+# SPEAr310 machine configuration file
+#
+
+if MACH_SPEAR310
+
+choice
+       prompt "SPEAr310 Boards"
+       default BOARD_SPEAR310_EVB
+
+config BOARD_SPEAR310_EVB
+       bool "SPEAr310 Evaluation Board"
+       help
+         Supports ST SPEAr310 Evaluation Board
+endchoice
+
+endif  #MACH_SPEAR310
diff --git a/arch/arm/mach-spear3xx/Kconfig320 b/arch/arm/mach-spear3xx/Kconfig320
new file mode 100644 (file)
index 0000000..1c1d438
--- /dev/null
@@ -0,0 +1,17 @@
+#
+# SPEAr320 machine configuration file
+#
+
+if MACH_SPEAR320
+
+choice
+       prompt "SPEAr320 Boards"
+       default BOARD_SPEAR320_EVB
+
+config BOARD_SPEAR320_EVB
+       bool "SPEAr320 Evaluation Board"
+       help
+         Supports ST SPEAr320 Evaluation Board
+endchoice
+
+endif  #MACH_SPEAR320
diff --git a/arch/arm/mach-spear3xx/Makefile b/arch/arm/mach-spear3xx/Makefile
new file mode 100644 (file)
index 0000000..b248624
--- /dev/null
@@ -0,0 +1,26 @@
+#
+# Makefile for SPEAr3XX machine series
+#
+
+# common files
+obj-y  += spear3xx.o clock.o
+
+# spear300 specific files
+obj-$(CONFIG_MACH_SPEAR300) += spear300.o
+
+# spear300 boards files
+obj-$(CONFIG_BOARD_SPEAR300_EVB) += spear300_evb.o
+
+
+# spear310 specific files
+obj-$(CONFIG_MACH_SPEAR310) += spear310.o
+
+# spear310 boards files
+obj-$(CONFIG_BOARD_SPEAR310_EVB) += spear310_evb.o
+
+
+# spear320 specific files
+obj-$(CONFIG_MACH_SPEAR320) += spear320.o
+
+# spear320 boards files
+obj-$(CONFIG_BOARD_SPEAR320_EVB) += spear320_evb.o
diff --git a/arch/arm/mach-spear3xx/Makefile.boot b/arch/arm/mach-spear3xx/Makefile.boot
new file mode 100644 (file)
index 0000000..7a1f3c0
--- /dev/null
@@ -0,0 +1,3 @@
+zreladdr-y     := 0x00008000
+params_phys-y  := 0x00000100
+initrd_phys-y  := 0x00800000
diff --git a/arch/arm/mach-spear3xx/clock.c b/arch/arm/mach-spear3xx/clock.c
new file mode 100644 (file)
index 0000000..39f6ccf
--- /dev/null
@@ -0,0 +1,389 @@
+/*
+ * arch/arm/mach-spear3xx/clock.c
+ *
+ * SPEAr3xx machines clock framework source file
+ *
+ * Copyright (C) 2009 ST Microelectronics
+ * Viresh Kumar<viresh.kumar@st.com>
+ *
+ * This file is licensed under the terms of the GNU General Public
+ * License version 2. This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+ */
+
+#include <linux/init.h>
+#include <linux/kernel.h>
+#include <mach/misc_regs.h>
+#include <plat/clock.h>
+
+/* root clks */
+/* 32 KHz oscillator clock */
+static struct clk osc_32k_clk = {
+       .flags = ALWAYS_ENABLED,
+       .rate = 32000,
+};
+
+/* 24 MHz oscillator clock */
+static struct clk osc_24m_clk = {
+       .flags = ALWAYS_ENABLED,
+       .rate = 24000000,
+};
+
+/* clock derived from 32 KHz osc clk */
+/* rtc clock */
+static struct clk rtc_clk = {
+       .pclk = &osc_32k_clk,
+       .en_reg = PERIP1_CLK_ENB,
+       .en_reg_bit = RTC_CLK_ENB,
+       .recalc = &follow_parent,
+};
+
+/* clock derived from 24 MHz osc clk */
+/* pll1 configuration structure */
+static struct pll_clk_config pll1_config = {
+       .mode_reg = PLL1_CTR,
+       .cfg_reg = PLL1_FRQ,
+};
+
+/* PLL1 clock */
+static struct clk pll1_clk = {
+       .pclk = &osc_24m_clk,
+       .en_reg = PLL1_CTR,
+       .en_reg_bit = PLL_ENABLE,
+       .recalc = &pll1_clk_recalc,
+       .private_data = &pll1_config,
+};
+
+/* PLL3 48 MHz clock */
+static struct clk pll3_48m_clk = {
+       .flags = ALWAYS_ENABLED,
+       .pclk = &osc_24m_clk,
+       .rate = 48000000,
+};
+
+/* watch dog timer clock */
+static struct clk wdt_clk = {
+       .flags = ALWAYS_ENABLED,
+       .pclk = &osc_24m_clk,
+       .recalc = &follow_parent,
+};
+
+/* clock derived from pll1 clk */
+/* cpu clock */
+static struct clk cpu_clk = {
+       .flags = ALWAYS_ENABLED,
+       .pclk = &pll1_clk,
+       .recalc = &follow_parent,
+};
+
+/* ahb configuration structure */
+static struct bus_clk_config ahb_config = {
+       .reg = CORE_CLK_CFG,
+       .mask = PLL_HCLK_RATIO_MASK,
+       .shift = PLL_HCLK_RATIO_SHIFT,
+};
+
+/* ahb clock */
+static struct clk ahb_clk = {
+       .flags = ALWAYS_ENABLED,
+       .pclk = &pll1_clk,
+       .recalc = &bus_clk_recalc,
+       .private_data = &ahb_config,
+};
+
+/* uart configurations */
+static struct aux_clk_config uart_config = {
+       .synth_reg = UART_CLK_SYNT,
+};
+
+/* uart parents */
+static struct pclk_info uart_pclk_info[] = {
+       {
+               .pclk = &pll1_clk,
+               .pclk_mask = AUX_CLK_PLL1_MASK,
+               .scalable = 1,
+       }, {
+               .pclk = &pll3_48m_clk,
+               .pclk_mask = AUX_CLK_PLL3_MASK,
+               .scalable = 0,
+       },
+};
+
+/* uart parent select structure */
+static struct pclk_sel uart_pclk_sel = {
+       .pclk_info = uart_pclk_info,
+       .pclk_count = ARRAY_SIZE(uart_pclk_info),
+       .pclk_sel_reg = PERIP_CLK_CFG,
+       .pclk_sel_mask = UART_CLK_MASK,
+};
+
+/* uart clock */
+static struct clk uart_clk = {
+       .en_reg = PERIP1_CLK_ENB,
+       .en_reg_bit = UART_CLK_ENB,
+       .pclk_sel = &uart_pclk_sel,
+       .pclk_sel_shift = UART_CLK_SHIFT,
+       .recalc = &aux_clk_recalc,
+       .private_data = &uart_config,
+};
+
+/* firda configurations */
+static struct aux_clk_config firda_config = {
+       .synth_reg = FIRDA_CLK_SYNT,
+};
+
+/* firda parents */
+static struct pclk_info firda_pclk_info[] = {
+       {
+               .pclk = &pll1_clk,
+               .pclk_mask = AUX_CLK_PLL1_MASK,
+               .scalable = 1,
+       }, {
+               .pclk = &pll3_48m_clk,
+               .pclk_mask = AUX_CLK_PLL3_MASK,
+               .scalable = 0,
+       },
+};
+
+/* firda parent select structure */
+static struct pclk_sel firda_pclk_sel = {
+       .pclk_info = firda_pclk_info,
+       .pclk_count = ARRAY_SIZE(firda_pclk_info),
+       .pclk_sel_reg = PERIP_CLK_CFG,
+       .pclk_sel_mask = FIRDA_CLK_MASK,
+};
+
+/* firda clock */
+static struct clk firda_clk = {
+       .en_reg = PERIP1_CLK_ENB,
+       .en_reg_bit = FIRDA_CLK_ENB,
+       .pclk_sel = &firda_pclk_sel,
+       .pclk_sel_shift = FIRDA_CLK_SHIFT,
+       .recalc = &aux_clk_recalc,
+       .private_data = &firda_config,
+};
+
+/* gpt parents */
+static struct pclk_info gpt_pclk_info[] = {
+       {
+               .pclk = &pll1_clk,
+               .pclk_mask = AUX_CLK_PLL1_MASK,
+               .scalable = 1,
+       }, {
+               .pclk = &pll3_48m_clk,
+               .pclk_mask = AUX_CLK_PLL3_MASK,
+               .scalable = 0,
+       },
+};
+
+/* gpt parent select structure */
+static struct pclk_sel gpt_pclk_sel = {
+       .pclk_info = gpt_pclk_info,
+       .pclk_count = ARRAY_SIZE(gpt_pclk_info),
+       .pclk_sel_reg = PERIP_CLK_CFG,
+       .pclk_sel_mask = GPT_CLK_MASK,
+};
+
+/* gpt0 configurations */
+static struct aux_clk_config gpt0_config = {
+       .synth_reg = PRSC1_CLK_CFG,
+};
+
+/* gpt0 timer clock */
+static struct clk gpt0_clk = {
+       .flags = ALWAYS_ENABLED,
+       .pclk_sel = &gpt_pclk_sel,
+       .pclk_sel_shift = GPT0_CLK_SHIFT,
+       .recalc = &gpt_clk_recalc,
+       .private_data = &gpt0_config,
+};
+
+/* gpt1 configurations */
+static struct aux_clk_config gpt1_config = {
+       .synth_reg = PRSC2_CLK_CFG,
+};
+
+/* gpt1 timer clock */
+static struct clk gpt1_clk = {
+       .en_reg = PERIP1_CLK_ENB,
+       .en_reg_bit = GPT1_CLK_ENB,
+       .pclk_sel = &gpt_pclk_sel,
+       .pclk_sel_shift = GPT1_CLK_SHIFT,
+       .recalc = &gpt_clk_recalc,
+       .private_data = &gpt1_config,
+};
+
+/* gpt2 configurations */
+static struct aux_clk_config gpt2_config = {
+       .synth_reg = PRSC3_CLK_CFG,
+};
+
+/* gpt2 timer clock */
+static struct clk gpt2_clk = {
+       .en_reg = PERIP1_CLK_ENB,
+       .en_reg_bit = GPT2_CLK_ENB,
+       .pclk_sel = &gpt_pclk_sel,
+       .pclk_sel_shift = GPT2_CLK_SHIFT,
+       .recalc = &gpt_clk_recalc,
+       .private_data = &gpt2_config,
+};
+
+/* clock derived from pll3 clk */
+/* usbh clock */
+static struct clk usbh_clk = {
+       .pclk = &pll3_48m_clk,
+       .en_reg = PERIP1_CLK_ENB,
+       .en_reg_bit = USBH_CLK_ENB,
+       .recalc = &follow_parent,
+};
+
+/* usbd clock */
+static struct clk usbd_clk = {
+       .pclk = &pll3_48m_clk,
+       .en_reg = PERIP1_CLK_ENB,
+       .en_reg_bit = USBD_CLK_ENB,
+       .recalc = &follow_parent,
+};
+
+/* clcd clock */
+static struct clk clcd_clk = {
+       .flags = ALWAYS_ENABLED,
+       .pclk = &pll3_48m_clk,
+       .recalc = &follow_parent,
+};
+
+/* clock derived from ahb clk */
+/* apb configuration structure */
+static struct bus_clk_config apb_config = {
+       .reg = CORE_CLK_CFG,
+       .mask = HCLK_PCLK_RATIO_MASK,
+       .shift = HCLK_PCLK_RATIO_SHIFT,
+};
+
+/* apb clock */
+static struct clk apb_clk = {
+       .flags = ALWAYS_ENABLED,
+       .pclk = &ahb_clk,
+       .recalc = &bus_clk_recalc,
+       .private_data = &apb_config,
+};
+
+/* i2c clock */
+static struct clk i2c_clk = {
+       .pclk = &ahb_clk,
+       .en_reg = PERIP1_CLK_ENB,
+       .en_reg_bit = I2C_CLK_ENB,
+       .recalc = &follow_parent,
+};
+
+/* dma clock */
+static struct clk dma_clk = {
+       .pclk = &ahb_clk,
+       .en_reg = PERIP1_CLK_ENB,
+       .en_reg_bit = DMA_CLK_ENB,
+       .recalc = &follow_parent,
+};
+
+/* jpeg clock */
+static struct clk jpeg_clk = {
+       .pclk = &ahb_clk,
+       .en_reg = PERIP1_CLK_ENB,
+       .en_reg_bit = JPEG_CLK_ENB,
+       .recalc = &follow_parent,
+};
+
+/* gmac clock */
+static struct clk gmac_clk = {
+       .pclk = &ahb_clk,
+       .en_reg = PERIP1_CLK_ENB,
+       .en_reg_bit = GMAC_CLK_ENB,
+       .recalc = &follow_parent,
+};
+
+/* smi clock */
+static struct clk smi_clk = {
+       .pclk = &ahb_clk,
+       .en_reg = PERIP1_CLK_ENB,
+       .en_reg_bit = SMI_CLK_ENB,
+       .recalc = &follow_parent,
+};
+
+/* c3 clock */
+static struct clk c3_clk = {
+       .pclk = &ahb_clk,
+       .en_reg = PERIP1_CLK_ENB,
+       .en_reg_bit = C3_CLK_ENB,
+       .recalc = &follow_parent,
+};
+
+/* clock derived from apb clk */
+/* adc clock */
+static struct clk adc_clk = {
+       .pclk = &apb_clk,
+       .en_reg = PERIP1_CLK_ENB,
+       .en_reg_bit = ADC_CLK_ENB,
+       .recalc = &follow_parent,
+};
+
+/* ssp clock */
+static struct clk ssp_clk = {
+       .pclk = &apb_clk,
+       .en_reg = PERIP1_CLK_ENB,
+       .en_reg_bit = SSP_CLK_ENB,
+       .recalc = &follow_parent,
+};
+
+/* gpio clock */
+static struct clk gpio_clk = {
+       .pclk = &apb_clk,
+       .en_reg = PERIP1_CLK_ENB,
+       .en_reg_bit = GPIO_CLK_ENB,
+       .recalc = &follow_parent,
+};
+
+/* array of all spear 3xx clock lookups */
+static struct clk_lookup spear_clk_lookups[] = {
+       /* root clks */
+       { .con_id = "osc_32k_clk",      .clk = &osc_32k_clk},
+       { .con_id = "osc_24m_clk",      .clk = &osc_24m_clk},
+       /* clock derived from 32 KHz osc clk */
+       { .dev_id = "rtc",              .clk = &rtc_clk},
+       /* clock derived from 24 MHz osc clk */
+       { .con_id = "pll1_clk",         .clk = &pll1_clk},
+       { .con_id = "pll3_48m_clk",     .clk = &pll3_48m_clk},
+       { .dev_id = "wdt",              .clk = &wdt_clk},
+       /* clock derived from pll1 clk */
+       { .con_id = "cpu_clk",          .clk = &cpu_clk},
+       { .con_id = "ahb_clk",          .clk = &ahb_clk},
+       { .dev_id = "uart",             .clk = &uart_clk},
+       { .dev_id = "firda",            .clk = &firda_clk},
+       { .dev_id = "gpt0",             .clk = &gpt0_clk},
+       { .dev_id = "gpt1",             .clk = &gpt1_clk},
+       { .dev_id = "gpt2",             .clk = &gpt2_clk},
+       /* clock derived from pll3 clk */
+       { .dev_id = "usbh",             .clk = &usbh_clk},
+       { .dev_id = "usbd",             .clk = &usbd_clk},
+       { .dev_id = "clcd",             .clk = &clcd_clk},
+       /* clock derived from ahb clk */
+       { .con_id = "apb_clk",          .clk = &apb_clk},
+       { .dev_id = "i2c",              .clk = &i2c_clk},
+       { .dev_id = "dma",              .clk = &dma_clk},
+       { .dev_id = "jpeg",             .clk = &jpeg_clk},
+       { .dev_id = "gmac",             .clk = &gmac_clk},
+       { .dev_id = "smi",              .clk = &smi_clk},
+       { .dev_id = "c3",               .clk = &c3_clk},
+       /* clock derived from apb clk */
+       { .dev_id = "adc",              .clk = &adc_clk},
+       { .dev_id = "ssp",              .clk = &ssp_clk},
+       { .dev_id = "gpio",             .clk = &gpio_clk},
+};
+
+void __init clk_init(void)
+{
+       int i;
+
+       for (i = 0; i < ARRAY_SIZE(spear_clk_lookups); i++)
+               clk_register(&spear_clk_lookups[i]);
+
+       recalc_root_clocks();
+}
diff --git a/arch/arm/mach-spear3xx/include/mach/clkdev.h b/arch/arm/mach-spear3xx/include/mach/clkdev.h
new file mode 100644 (file)
index 0000000..a3d0733
--- /dev/null
@@ -0,0 +1,19 @@
+/*
+ * arch/arm/mach-spear3xx/include/mach/clkdev.h
+ *
+ * Clock Dev framework definitions for SPEAr3xx machine family
+ *
+ * Copyright (C) 2009 ST Microelectronics
+ * Viresh Kumar<viresh.kumar@st.com>
+ *
+ * This file is licensed under the terms of the GNU General Public
+ * License version 2. This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+ */
+
+#ifndef __MACH_CLKDEV_H
+#define __MACH_CLKDEV_H
+
+#include <plat/clkdev.h>
+
+#endif /* __MACH_CLKDEV_H */
diff --git a/arch/arm/mach-spear3xx/include/mach/debug-macro.S b/arch/arm/mach-spear3xx/include/mach/debug-macro.S
new file mode 100644 (file)
index 0000000..590519f
--- /dev/null
@@ -0,0 +1,14 @@
+/*
+ * arch/arm/mach-spear3xx/include/mach/debug-macro.S
+ *
+ * Debugging macro include header spear3xx machine family
+ *
+ * Copyright (C) 2009 ST Microelectronics
+ * Viresh Kumar<viresh.kumar@st.com>
+ *
+ * This file is licensed under the terms of the GNU General Public
+ * License version 2. This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+ */
+
+#include <plat/debug-macro.S>
diff --git a/arch/arm/mach-spear3xx/include/mach/entry-macro.S b/arch/arm/mach-spear3xx/include/mach/entry-macro.S
new file mode 100644 (file)
index 0000000..947625d
--- /dev/null
@@ -0,0 +1,46 @@
+/*
+ * arch/arm/mach-spear3xx/include/mach/entry-macro.S
+ *
+ * Low-level IRQ helper macros for SPEAr3xx machine family
+ *
+ * Copyright (C) 2009 ST Microelectronics
+ * Viresh Kumar<viresh.kumar@st.com>
+ *
+ * This file is licensed under the terms of the GNU General Public
+ * License version 2. This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+ */
+
+#include <mach/hardware.h>
+#include <mach/spear.h>
+#include <asm/hardware/vic.h>
+
+               .macro  disable_fiq
+               .endm
+
+               .macro  get_irqnr_preamble, base, tmp
+               .endm
+
+               .macro  arch_ret_to_user, tmp1, tmp2
+               .endm
+
+               .macro  get_irqnr_and_base, irqnr, irqstat, base, tmp
+               ldr     \base, =VA_SPEAR3XX_ML1_VIC_BASE
+               ldr     \irqstat, [\base, #VIC_IRQ_STATUS]      @ get status
+               teq     \irqstat, #0
+               beq     1001f                           @ this will set/reset
+                                                       @ zero register
+               /*
+                * Following code will find bit position of least significang
+                * bit set in irqstat, using following equation
+                * least significant bit set in n = (n & ~(n-1))
+                */
+               sub     \tmp, \irqstat, #1              @ tmp = irqstat - 1
+               mvn     \tmp, \tmp                      @ tmp = ~tmp
+               and     \irqstat, \irqstat, \tmp        @ irqstat &= tmp
+               /* Now, irqstat is = bit no. of 1st bit set in vic irq status */
+               clz     \tmp, \irqstat                  @ tmp = leading zeros
+               rsb     \irqnr, \tmp, #0x1F             @ irqnr = 32 - tmp - 1
+
+1001:          /* EQ will be set if no irqs pending */
+               .endm
diff --git a/arch/arm/mach-spear3xx/include/mach/generic.h b/arch/arm/mach-spear3xx/include/mach/generic.h
new file mode 100644 (file)
index 0000000..af7e02c
--- /dev/null
@@ -0,0 +1,205 @@
+/*
+ * arch/arm/mach-spear3xx/generic.h
+ *
+ * SPEAr3XX machine family generic header file
+ *
+ * Copyright (C) 2009 ST Microelectronics
+ * Viresh Kumar<viresh.kumar@st.com>
+ *
+ * This file is licensed under the terms of the GNU General Public
+ * License version 2. This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+ */
+
+#ifndef __MACH_GENERIC_H
+#define __MACH_GENERIC_H
+
+#include <asm/mach/time.h>
+#include <asm/mach/map.h>
+#include <linux/init.h>
+#include <linux/platform_device.h>
+#include <linux/amba/bus.h>
+#include <plat/padmux.h>
+
+/* spear3xx declarations */
+/*
+ * Each GPT has 2 timer channels
+ * Following GPT channels will be used as clock source and clockevent
+ */
+#define SPEAR_GPT0_BASE                SPEAR3XX_ML1_TMR_BASE
+#define SPEAR_GPT0_CHAN0_IRQ   IRQ_CPU_GPT1_1
+#define SPEAR_GPT0_CHAN1_IRQ   IRQ_CPU_GPT1_2
+
+/* Add spear3xx family device structure declarations here */
+extern struct amba_device gpio_device;
+extern struct amba_device uart_device;
+extern struct sys_timer spear_sys_timer;
+
+/* Add spear3xx family function declarations here */
+void __init clk_init(void);
+void __init spear3xx_map_io(void);
+void __init spear3xx_init_irq(void);
+void __init spear3xx_init(void);
+void spear_pmx_init(struct pmx_driver *pmx_driver, uint base, uint size);
+
+/* pad mux declarations */
+#define PMX_FIRDA_MASK         (1 << 14)
+#define PMX_I2C_MASK           (1 << 13)
+#define PMX_SSP_CS_MASK                (1 << 12)
+#define PMX_SSP_MASK           (1 << 11)
+#define PMX_MII_MASK           (1 << 10)
+#define PMX_GPIO_PIN0_MASK     (1 << 9)
+#define PMX_GPIO_PIN1_MASK     (1 << 8)
+#define PMX_GPIO_PIN2_MASK     (1 << 7)
+#define PMX_GPIO_PIN3_MASK     (1 << 6)
+#define PMX_GPIO_PIN4_MASK     (1 << 5)
+#define PMX_GPIO_PIN5_MASK     (1 << 4)
+#define PMX_UART0_MODEM_MASK   (1 << 3)
+#define PMX_UART0_MASK         (1 << 2)
+#define PMX_TIMER_3_4_MASK     (1 << 1)
+#define PMX_TIMER_1_2_MASK     (1 << 0)
+
+/* pad mux devices */
+extern struct pmx_dev pmx_firda;
+extern struct pmx_dev pmx_i2c;
+extern struct pmx_dev pmx_ssp_cs;
+extern struct pmx_dev pmx_ssp;
+extern struct pmx_dev pmx_mii;
+extern struct pmx_dev pmx_gpio_pin0;
+extern struct pmx_dev pmx_gpio_pin1;
+extern struct pmx_dev pmx_gpio_pin2;
+extern struct pmx_dev pmx_gpio_pin3;
+extern struct pmx_dev pmx_gpio_pin4;
+extern struct pmx_dev pmx_gpio_pin5;
+extern struct pmx_dev pmx_uart0_modem;
+extern struct pmx_dev pmx_uart0;
+extern struct pmx_dev pmx_timer_3_4;
+extern struct pmx_dev pmx_timer_1_2;
+
+#if defined(CONFIG_MACH_SPEAR310) || defined(CONFIG_MACH_SPEAR320)
+/* padmux plgpio devices */
+extern struct pmx_dev pmx_plgpio_0_1;
+extern struct pmx_dev pmx_plgpio_2_3;
+extern struct pmx_dev pmx_plgpio_4_5;
+extern struct pmx_dev pmx_plgpio_6_9;
+extern struct pmx_dev pmx_plgpio_10_27;
+extern struct pmx_dev pmx_plgpio_28;
+extern struct pmx_dev pmx_plgpio_29;
+extern struct pmx_dev pmx_plgpio_30;
+extern struct pmx_dev pmx_plgpio_31;
+extern struct pmx_dev pmx_plgpio_32;
+extern struct pmx_dev pmx_plgpio_33;
+extern struct pmx_dev pmx_plgpio_34_36;
+extern struct pmx_dev pmx_plgpio_37_42;
+extern struct pmx_dev pmx_plgpio_43_44_47_48;
+extern struct pmx_dev pmx_plgpio_45_46_49_50;
+#endif
+
+extern struct pmx_driver pmx_driver;
+
+/* spear300 declarations */
+#ifdef CONFIG_MACH_SPEAR300
+/* Add spear300 machine device structure declarations here */
+extern struct amba_device gpio1_device;
+
+/* pad mux modes */
+extern struct pmx_mode nand_mode;
+extern struct pmx_mode nor_mode;
+extern struct pmx_mode photo_frame_mode;
+extern struct pmx_mode lend_ip_phone_mode;
+extern struct pmx_mode hend_ip_phone_mode;
+extern struct pmx_mode lend_wifi_phone_mode;
+extern struct pmx_mode hend_wifi_phone_mode;
+extern struct pmx_mode ata_pabx_wi2s_mode;
+extern struct pmx_mode ata_pabx_i2s_mode;
+extern struct pmx_mode caml_lcdw_mode;
+extern struct pmx_mode camu_lcd_mode;
+extern struct pmx_mode camu_wlcd_mode;
+extern struct pmx_mode caml_lcd_mode;
+
+/* pad mux devices */
+extern struct pmx_dev pmx_fsmc_2_chips;
+extern struct pmx_dev pmx_fsmc_4_chips;
+extern struct pmx_dev pmx_keyboard;
+extern struct pmx_dev pmx_clcd;
+extern struct pmx_dev pmx_telecom_gpio;
+extern struct pmx_dev pmx_telecom_tdm;
+extern struct pmx_dev pmx_telecom_spi_cs_i2c_clk;
+extern struct pmx_dev pmx_telecom_camera;
+extern struct pmx_dev pmx_telecom_dac;
+extern struct pmx_dev pmx_telecom_i2s;
+extern struct pmx_dev pmx_telecom_boot_pins;
+extern struct pmx_dev pmx_telecom_sdio_4bit;
+extern struct pmx_dev pmx_telecom_sdio_8bit;
+extern struct pmx_dev pmx_gpio1;
+
+void spear300_pmx_init(void);
+
+/* Add spear300 machine function declarations here */
+void __init spear300_init(void);
+
+#endif /* CONFIG_MACH_SPEAR300 */
+
+/* spear310 declarations */
+#ifdef CONFIG_MACH_SPEAR310
+/* Add spear310 machine device structure declarations here */
+
+/* pad mux devices */
+extern struct pmx_dev pmx_emi_cs_0_1_4_5;
+extern struct pmx_dev pmx_emi_cs_2_3;
+extern struct pmx_dev pmx_uart1;
+extern struct pmx_dev pmx_uart2;
+extern struct pmx_dev pmx_uart3_4_5;
+extern struct pmx_dev pmx_fsmc;
+extern struct pmx_dev pmx_rs485_0_1;
+extern struct pmx_dev pmx_tdm0;
+
+void spear310_pmx_init(void);
+
+/* Add spear310 machine function declarations here */
+void __init spear310_init(void);
+
+#endif /* CONFIG_MACH_SPEAR310 */
+
+/* spear320 declarations */
+#ifdef CONFIG_MACH_SPEAR320
+/* Add spear320 machine device structure declarations here */
+
+/* pad mux modes */
+extern struct pmx_mode auto_net_smii_mode;
+extern struct pmx_mode auto_net_mii_mode;
+extern struct pmx_mode auto_exp_mode;
+extern struct pmx_mode small_printers_mode;
+
+/* pad mux devices */
+extern struct pmx_dev pmx_clcd;
+extern struct pmx_dev pmx_emi;
+extern struct pmx_dev pmx_fsmc;
+extern struct pmx_dev pmx_spp;
+extern struct pmx_dev pmx_sdio;
+extern struct pmx_dev pmx_i2s;
+extern struct pmx_dev pmx_uart1;
+extern struct pmx_dev pmx_uart1_modem;
+extern struct pmx_dev pmx_uart2;
+extern struct pmx_dev pmx_touchscreen;
+extern struct pmx_dev pmx_can;
+extern struct pmx_dev pmx_sdio_led;
+extern struct pmx_dev pmx_pwm0;
+extern struct pmx_dev pmx_pwm1;
+extern struct pmx_dev pmx_pwm2;
+extern struct pmx_dev pmx_pwm3;
+extern struct pmx_dev pmx_ssp1;
+extern struct pmx_dev pmx_ssp2;
+extern struct pmx_dev pmx_mii1;
+extern struct pmx_dev pmx_smii0;
+extern struct pmx_dev pmx_smii1;
+extern struct pmx_dev pmx_i2c1;
+
+void spear320_pmx_init(void);
+
+/* Add spear320 machine function declarations here */
+void __init spear320_init(void);
+
+#endif /* CONFIG_MACH_SPEAR320 */
+
+#endif /* __MACH_GENERIC_H */
diff --git a/arch/arm/mach-spear3xx/include/mach/gpio.h b/arch/arm/mach-spear3xx/include/mach/gpio.h
new file mode 100644 (file)
index 0000000..451b208
--- /dev/null
@@ -0,0 +1,19 @@
+/*
+ * arch/arm/mach-spear3xx/include/mach/gpio.h
+ *
+ * GPIO macros for SPEAr3xx machine family
+ *
+ * Copyright (C) 2009 ST Microelectronics
+ * Viresh Kumar<viresh.kumar@st.com>
+ *
+ * This file is licensed under the terms of the GNU General Public
+ * License version 2. This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+ */
+
+#ifndef __MACH_GPIO_H
+#define __MACH_GPIO_H
+
+#include <plat/gpio.h>
+
+#endif /* __MACH_GPIO_H */
diff --git a/arch/arm/mach-spear3xx/include/mach/hardware.h b/arch/arm/mach-spear3xx/include/mach/hardware.h
new file mode 100644 (file)
index 0000000..4a86e6a
--- /dev/null
@@ -0,0 +1,20 @@
+/*
+ * arch/arm/mach-spear3xx/include/mach/hardware.h
+ *
+ * Hardware definitions for SPEAr3xx machine family
+ *
+ * Copyright (C) 2009 ST Microelectronics
+ * Viresh Kumar<viresh.kumar@st.com>
+ *
+ * This file is licensed under the terms of the GNU General Public
+ * License version 2. This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+ */
+
+#ifndef __MACH_HARDWARE_H
+#define __MACH_HARDWARE_H
+
+/* Vitual to physical translation of statically mapped space */
+#define IO_ADDRESS(x)          (x | 0xF0000000)
+
+#endif /* __MACH_HARDWARE_H */
diff --git a/arch/arm/mach-spear3xx/include/mach/io.h b/arch/arm/mach-spear3xx/include/mach/io.h
new file mode 100644 (file)
index 0000000..30cff8a
--- /dev/null
@@ -0,0 +1,19 @@
+/*
+ * arch/arm/mach-spear3xx/include/mach/io.h
+ *
+ * IO definitions for SPEAr3xx machine family
+ *
+ * Copyright (C) 2009 ST Microelectronics
+ * Viresh Kumar<viresh.kumar@st.com>
+ *
+ * This file is licensed under the terms of the GNU General Public
+ * License version 2. This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+ */
+
+#ifndef __MACH_IO_H
+#define __MACH_IO_H
+
+#include <plat/io.h>
+
+#endif /* __MACH_IO_H */
diff --git a/arch/arm/mach-spear3xx/include/mach/irqs.h b/arch/arm/mach-spear3xx/include/mach/irqs.h
new file mode 100644 (file)
index 0000000..7f940b8
--- /dev/null
@@ -0,0 +1,152 @@
+/*
+ * arch/arm/mach-spear3xx/include/mach/irqs.h
+ *
+ * IRQ helper macros for SPEAr3xx machine family
+ *
+ * Copyright (C) 2009 ST Microelectronics
+ * Viresh Kumar<viresh.kumar@st.com>
+ *
+ * This file is licensed under the terms of the GNU General Public
+ * License version 2. This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+ */
+
+#ifndef __MACH_IRQS_H
+#define __MACH_IRQS_H
+
+/* SPEAr3xx IRQ definitions */
+#define IRQ_HW_ACCEL_MOD_0                     0
+#define IRQ_INTRCOMM_RAS_ARM                   1
+#define IRQ_CPU_GPT1_1                         2
+#define IRQ_CPU_GPT1_2                         3
+#define IRQ_BASIC_GPT1_1                       4
+#define IRQ_BASIC_GPT1_2                       5
+#define IRQ_BASIC_GPT2_1                       6
+#define IRQ_BASIC_GPT2_2                       7
+#define IRQ_BASIC_DMA                          8
+#define IRQ_BASIC_SMI                          9
+#define IRQ_BASIC_RTC                          10
+#define IRQ_BASIC_GPIO                         11
+#define IRQ_BASIC_WDT                          12
+#define IRQ_DDR_CONTROLLER                     13
+#define IRQ_SYS_ERROR                          14
+#define IRQ_WAKEUP_RCV                         15
+#define IRQ_JPEG                               16
+#define IRQ_IRDA                               17
+#define IRQ_ADC                                        18
+#define IRQ_UART                               19
+#define IRQ_SSP                                        20
+#define IRQ_I2C                                        21
+#define IRQ_MAC_1                              22
+#define IRQ_MAC_2                              23
+#define IRQ_USB_DEV                            24
+#define IRQ_USB_H_OHCI_0                       25
+#define IRQ_USB_H_EHCI_0                       26
+#define IRQ_USB_H_EHCI_1                       IRQ_USB_H_EHCI_0
+#define IRQ_USB_H_OHCI_1                       27
+#define IRQ_GEN_RAS_1                          28
+#define IRQ_GEN_RAS_2                          29
+#define IRQ_GEN_RAS_3                          30
+#define IRQ_HW_ACCEL_MOD_1                     31
+#define IRQ_VIC_END                            32
+
+#define VIRQ_START                             IRQ_VIC_END
+
+/* SPEAr300 Virtual irq definitions */
+#ifdef CONFIG_MACH_SPEAR300
+/* IRQs sharing IRQ_GEN_RAS_1 */
+#define VIRQ_IT_PERS_S                         (VIRQ_START + 0)
+#define VIRQ_IT_CHANGE_S                       (VIRQ_START + 1)
+#define VIRQ_I2S                               (VIRQ_START + 2)
+#define VIRQ_TDM                               (VIRQ_START + 3)
+#define VIRQ_CAMERA_L                          (VIRQ_START + 4)
+#define VIRQ_CAMERA_F                          (VIRQ_START + 5)
+#define VIRQ_CAMERA_V                          (VIRQ_START + 6)
+#define VIRQ_KEYBOARD                          (VIRQ_START + 7)
+#define VIRQ_GPIO1                             (VIRQ_START + 8)
+
+/* IRQs sharing IRQ_GEN_RAS_3 */
+#define IRQ_CLCD                               IRQ_GEN_RAS_3
+
+/* IRQs sharing IRQ_INTRCOMM_RAS_ARM */
+#define IRQ_SDIO                               IRQ_INTRCOMM_RAS_ARM
+
+/* GPIO pins virtual irqs */
+#define SPEAR_GPIO_INT_BASE                    (VIRQ_START + 9)
+#define SPEAR_GPIO1_INT_BASE                   (SPEAR_GPIO_INT_BASE + 8)
+#define SPEAR_GPIO_INT_END                     (SPEAR_GPIO1_INT_BASE + 8)
+
+/* SPEAr310 Virtual irq definitions */
+#elif defined(CONFIG_MACH_SPEAR310)
+/* IRQs sharing IRQ_GEN_RAS_1 */
+#define VIRQ_SMII0                             (VIRQ_START + 0)
+#define VIRQ_SMII1                             (VIRQ_START + 1)
+#define VIRQ_SMII2                             (VIRQ_START + 2)
+#define VIRQ_SMII3                             (VIRQ_START + 3)
+#define VIRQ_WAKEUP_SMII0                      (VIRQ_START + 4)
+#define VIRQ_WAKEUP_SMII1                      (VIRQ_START + 5)
+#define VIRQ_WAKEUP_SMII2                      (VIRQ_START + 6)
+#define VIRQ_WAKEUP_SMII3                      (VIRQ_START + 7)
+
+/* IRQs sharing IRQ_GEN_RAS_2 */
+#define VIRQ_UART1                             (VIRQ_START + 8)
+#define VIRQ_UART2                             (VIRQ_START + 9)
+#define VIRQ_UART3                             (VIRQ_START + 10)
+#define VIRQ_UART4                             (VIRQ_START + 11)
+#define VIRQ_UART5                             (VIRQ_START + 12)
+
+/* IRQs sharing IRQ_GEN_RAS_3 */
+#define VIRQ_EMI                               (VIRQ_START + 13)
+#define VIRQ_PLGPIO                            (VIRQ_START + 14)
+
+/* IRQs sharing IRQ_INTRCOMM_RAS_ARM */
+#define VIRQ_TDM_HDLC                          (VIRQ_START + 15)
+#define VIRQ_RS485_0                           (VIRQ_START + 16)
+#define VIRQ_RS485_1                           (VIRQ_START + 17)
+
+/* GPIO pins virtual irqs */
+#define SPEAR_GPIO_INT_BASE                    (VIRQ_START + 18)
+
+/* SPEAr320 Virtual irq definitions */
+#else
+/* IRQs sharing IRQ_GEN_RAS_1 */
+#define VIRQ_EMI                               (VIRQ_START + 0)
+#define VIRQ_CLCD                              (VIRQ_START + 1)
+#define VIRQ_SPP                               (VIRQ_START + 2)
+
+/* IRQs sharing IRQ_GEN_RAS_2 */
+#define IRQ_SDIO                               IRQ_GEN_RAS_2
+
+/* IRQs sharing IRQ_GEN_RAS_3 */
+#define VIRQ_PLGPIO                            (VIRQ_START + 3)
+#define VIRQ_I2S_PLAY                          (VIRQ_START + 4)
+#define VIRQ_I2S_REC                           (VIRQ_START + 5)
+
+/* IRQs sharing IRQ_INTRCOMM_RAS_ARM */
+#define VIRQ_CANU                              (VIRQ_START + 6)
+#define VIRQ_CANL                              (VIRQ_START + 7)
+#define VIRQ_UART1                             (VIRQ_START + 8)
+#define VIRQ_UART2                             (VIRQ_START + 9)
+#define VIRQ_SSP1                              (VIRQ_START + 10)
+#define VIRQ_SSP2                              (VIRQ_START + 11)
+#define VIRQ_SMII0                             (VIRQ_START + 12)
+#define VIRQ_MII1_SMII1                                (VIRQ_START + 13)
+#define VIRQ_WAKEUP_SMII0                      (VIRQ_START + 14)
+#define VIRQ_WAKEUP_MII1_SMII1                 (VIRQ_START + 15)
+#define VIRQ_I2C                               (VIRQ_START + 16)
+
+/* GPIO pins virtual irqs */
+#define SPEAR_GPIO_INT_BASE                    (VIRQ_START + 17)
+
+#endif
+
+/* PLGPIO Virtual IRQs */
+#if defined(CONFIG_MACH_SPEAR310) || defined(CONFIG_MACH_SPEAR320)
+#define SPEAR_PLGPIO_INT_BASE                  (SPEAR_GPIO_INT_BASE + 8)
+#define SPEAR_GPIO_INT_END                     (SPEAR_PLGPIO_INT_BASE + 102)
+#endif
+
+#define VIRQ_END                               SPEAR_GPIO_INT_END
+#define NR_IRQS                                        VIRQ_END
+
+#endif /* __MACH_IRQS_H */
diff --git a/arch/arm/mach-spear3xx/include/mach/memory.h b/arch/arm/mach-spear3xx/include/mach/memory.h
new file mode 100644 (file)
index 0000000..5173522
--- /dev/null
@@ -0,0 +1,19 @@
+/*
+ * arch/arm/mach-spear3xx/include/mach/memory.h
+ *
+ * Memory map for SPEAr3xx machine family
+ *
+ * Copyright (C) 2009 ST Microelectronics
+ * Viresh Kumar<viresh.kumar@st.com>
+ *
+ * This file is licensed under the terms of the GNU General Public
+ * License version 2. This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+ */
+
+#ifndef __MACH_MEMORY_H
+#define __MACH_MEMORY_H
+
+#include <plat/memory.h>
+
+#endif /* __MACH_MEMORY_H */
diff --git a/arch/arm/mach-spear3xx/include/mach/misc_regs.h b/arch/arm/mach-spear3xx/include/mach/misc_regs.h
new file mode 100644 (file)
index 0000000..38d767a
--- /dev/null
@@ -0,0 +1,163 @@
+/*
+ * arch/arm/mach-spear3xx/include/mach/misc_regs.h
+ *
+ * Miscellaneous registers definitions for SPEAr3xx machine family
+ *
+ * Copyright (C) 2009 ST Microelectronics
+ * Viresh Kumar<viresh.kumar@st.com>
+ *
+ * This file is licensed under the terms of the GNU General Public
+ * License version 2. This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+ */
+
+#ifndef __MACH_MISC_REGS_H
+#define __MACH_MISC_REGS_H
+
+#include <mach/spear.h>
+
+#define MISC_BASE              VA_SPEAR3XX_ICM3_MISC_REG_BASE
+
+#define SOC_CFG_CTR            ((unsigned int *)(MISC_BASE + 0x000))
+#define DIAG_CFG_CTR           ((unsigned int *)(MISC_BASE + 0x004))
+#define PLL1_CTR               ((unsigned int *)(MISC_BASE + 0x008))
+#define PLL1_FRQ               ((unsigned int *)(MISC_BASE + 0x00C))
+#define PLL1_MOD               ((unsigned int *)(MISC_BASE + 0x010))
+#define PLL2_CTR               ((unsigned int *)(MISC_BASE + 0x014))
+/* PLL_CTR register masks */
+#define PLL_ENABLE             2
+#define PLL_MODE_SHIFT         4
+#define PLL_MODE_MASK          0x3
+#define PLL_MODE_NORMAL                0
+#define PLL_MODE_FRACTION      1
+#define PLL_MODE_DITH_DSB      2
+#define PLL_MODE_DITH_SSB      3
+
+#define PLL2_FRQ               ((unsigned int *)(MISC_BASE + 0x018))
+/* PLL FRQ register masks */
+#define PLL_DIV_N_SHIFT                0
+#define PLL_DIV_N_MASK         0xFF
+#define PLL_DIV_P_SHIFT                8
+#define PLL_DIV_P_MASK         0x7
+#define PLL_NORM_FDBK_M_SHIFT  24
+#define PLL_NORM_FDBK_M_MASK   0xFF
+#define PLL_DITH_FDBK_M_SHIFT  16
+#define PLL_DITH_FDBK_M_MASK   0xFFFF
+
+#define PLL2_MOD               ((unsigned int *)(MISC_BASE + 0x01C))
+#define PLL_CLK_CFG            ((unsigned int *)(MISC_BASE + 0x020))
+#define CORE_CLK_CFG           ((unsigned int *)(MISC_BASE + 0x024))
+/* CORE CLK CFG register masks */
+#define PLL_HCLK_RATIO_SHIFT   10
+#define PLL_HCLK_RATIO_MASK    0x3
+#define HCLK_PCLK_RATIO_SHIFT  8
+#define HCLK_PCLK_RATIO_MASK   0x3
+
+#define PERIP_CLK_CFG          ((unsigned int *)(MISC_BASE + 0x028))
+/* PERIP_CLK_CFG register masks */
+#define UART_CLK_SHIFT         4
+#define UART_CLK_MASK          0x1
+#define FIRDA_CLK_SHIFT                5
+#define FIRDA_CLK_MASK         0x3
+#define GPT0_CLK_SHIFT         8
+#define GPT1_CLK_SHIFT         11
+#define GPT2_CLK_SHIFT         12
+#define GPT_CLK_MASK           0x1
+#define AUX_CLK_PLL3_MASK      0
+#define AUX_CLK_PLL1_MASK      1
+
+#define PERIP1_CLK_ENB         ((unsigned int *)(MISC_BASE + 0x02C))
+/* PERIP1_CLK_ENB register masks */
+#define UART_CLK_ENB           3
+#define SSP_CLK_ENB            5
+#define I2C_CLK_ENB            7
+#define JPEG_CLK_ENB           8
+#define FIRDA_CLK_ENB          10
+#define GPT1_CLK_ENB           11
+#define GPT2_CLK_ENB           12
+#define ADC_CLK_ENB            15
+#define RTC_CLK_ENB            17
+#define GPIO_CLK_ENB           18
+#define DMA_CLK_ENB            19
+#define SMI_CLK_ENB            21
+#define GMAC_CLK_ENB           23
+#define USBD_CLK_ENB           24
+#define USBH_CLK_ENB           25
+#define C3_CLK_ENB             31
+
+#define SOC_CORE_ID            ((unsigned int *)(MISC_BASE + 0x030))
+#define RAS_CLK_ENB            ((unsigned int *)(MISC_BASE + 0x034))
+#define PERIP1_SOF_RST         ((unsigned int *)(MISC_BASE + 0x038))
+/* PERIP1_SOF_RST register masks */
+#define JPEG_SOF_RST           8
+
+#define SOC_USER_ID            ((unsigned int *)(MISC_BASE + 0x03C))
+#define RAS_SOF_RST            ((unsigned int *)(MISC_BASE + 0x040))
+#define PRSC1_CLK_CFG          ((unsigned int *)(MISC_BASE + 0x044))
+#define PRSC2_CLK_CFG          ((unsigned int *)(MISC_BASE + 0x048))
+#define PRSC3_CLK_CFG          ((unsigned int *)(MISC_BASE + 0x04C))
+/* gpt synthesizer register masks */
+#define GPT_MSCALE_SHIFT       0
+#define GPT_MSCALE_MASK                0xFFF
+#define GPT_NSCALE_SHIFT       12
+#define GPT_NSCALE_MASK                0xF
+
+#define AMEM_CLK_CFG           ((unsigned int *)(MISC_BASE + 0x050))
+#define EXPI_CLK_CFG           ((unsigned int *)(MISC_BASE + 0x054))
+#define CLCD_CLK_SYNT          ((unsigned int *)(MISC_BASE + 0x05C))
+#define FIRDA_CLK_SYNT         ((unsigned int *)(MISC_BASE + 0x060))
+#define UART_CLK_SYNT          ((unsigned int *)(MISC_BASE + 0x064))
+#define GMAC_CLK_SYNT          ((unsigned int *)(MISC_BASE + 0x068))
+#define RAS1_CLK_SYNT          ((unsigned int *)(MISC_BASE + 0x06C))
+#define RAS2_CLK_SYNT          ((unsigned int *)(MISC_BASE + 0x070))
+#define RAS3_CLK_SYNT          ((unsigned int *)(MISC_BASE + 0x074))
+#define RAS4_CLK_SYNT          ((unsigned int *)(MISC_BASE + 0x078))
+/* aux clk synthesiser register masks for irda to ras4 */
+#define AUX_EQ_SEL_SHIFT       30
+#define AUX_EQ_SEL_MASK                1
+#define AUX_EQ1_SEL            0
+#define AUX_EQ2_SEL            1
+#define AUX_XSCALE_SHIFT       16
+#define AUX_XSCALE_MASK                0xFFF
+#define AUX_YSCALE_SHIFT       0
+#define AUX_YSCALE_MASK                0xFFF
+
+#define ICM1_ARB_CFG           ((unsigned int *)(MISC_BASE + 0x07C))
+#define ICM2_ARB_CFG           ((unsigned int *)(MISC_BASE + 0x080))
+#define ICM3_ARB_CFG           ((unsigned int *)(MISC_BASE + 0x084))
+#define ICM4_ARB_CFG           ((unsigned int *)(MISC_BASE + 0x088))
+#define ICM5_ARB_CFG           ((unsigned int *)(MISC_BASE + 0x08C))
+#define ICM6_ARB_CFG           ((unsigned int *)(MISC_BASE + 0x090))
+#define ICM7_ARB_CFG           ((unsigned int *)(MISC_BASE + 0x094))
+#define ICM8_ARB_CFG           ((unsigned int *)(MISC_BASE + 0x098))
+#define ICM9_ARB_CFG           ((unsigned int *)(MISC_BASE + 0x09C))
+#define DMA_CHN_CFG            ((unsigned int *)(MISC_BASE + 0x0A0))
+#define USB2_PHY_CFG           ((unsigned int *)(MISC_BASE + 0x0A4))
+#define GMAC_CFG_CTR           ((unsigned int *)(MISC_BASE + 0x0A8))
+#define EXPI_CFG_CTR           ((unsigned int *)(MISC_BASE + 0x0AC))
+#define PRC1_LOCK_CTR          ((unsigned int *)(MISC_BASE + 0x0C0))
+#define PRC2_LOCK_CTR          ((unsigned int *)(MISC_BASE + 0x0C4))
+#define PRC3_LOCK_CTR          ((unsigned int *)(MISC_BASE + 0x0C8))
+#define PRC4_LOCK_CTR          ((unsigned int *)(MISC_BASE + 0x0CC))
+#define PRC1_IRQ_CTR           ((unsigned int *)(MISC_BASE + 0x0D0))
+#define PRC2_IRQ_CTR           ((unsigned int *)(MISC_BASE + 0x0D4))
+#define PRC3_IRQ_CTR           ((unsigned int *)(MISC_BASE + 0x0D8))
+#define PRC4_IRQ_CTR           ((unsigned int *)(MISC_BASE + 0x0DC))
+#define PWRDOWN_CFG_CTR                ((unsigned int *)(MISC_BASE + 0x0E0))
+#define COMPSSTL_1V8_CFG       ((unsigned int *)(MISC_BASE + 0x0E4))
+#define COMPSSTL_2V5_CFG       ((unsigned int *)(MISC_BASE + 0x0E8))
+#define COMPCOR_3V3_CFG                ((unsigned int *)(MISC_BASE + 0x0EC))
+#define SSTLPAD_CFG_CTR                ((unsigned int *)(MISC_BASE + 0x0F0))
+#define BIST1_CFG_CTR          ((unsigned int *)(MISC_BASE + 0x0F4))
+#define BIST2_CFG_CTR          ((unsigned int *)(MISC_BASE + 0x0F8))
+#define BIST3_CFG_CTR          ((unsigned int *)(MISC_BASE + 0x0FC))
+#define BIST4_CFG_CTR          ((unsigned int *)(MISC_BASE + 0x100))
+#define BIST5_CFG_CTR          ((unsigned int *)(MISC_BASE + 0x104))
+#define BIST1_STS_RES          ((unsigned int *)(MISC_BASE + 0x108))
+#define BIST2_STS_RES          ((unsigned int *)(MISC_BASE + 0x10C))
+#define BIST3_STS_RES          ((unsigned int *)(MISC_BASE + 0x110))
+#define BIST4_STS_RES          ((unsigned int *)(MISC_BASE + 0x114))
+#define BIST5_STS_RES          ((unsigned int *)(MISC_BASE + 0x118))
+#define SYSERR_CFG_CTR         ((unsigned int *)(MISC_BASE + 0x11C))
+
+#endif /* __MACH_MISC_REGS_H */
diff --git a/arch/arm/mach-spear3xx/include/mach/spear.h b/arch/arm/mach-spear3xx/include/mach/spear.h
new file mode 100644 (file)
index 0000000..dcca856
--- /dev/null
@@ -0,0 +1,144 @@
+/*
+ * arch/arm/mach-spear3xx/include/mach/spear.h
+ *
+ * SPEAr3xx Machine family specific definition
+ *
+ * Copyright (C) 2009 ST Microelectronics
+ * Viresh Kumar<viresh.kumar@st.com>
+ *
+ * This file is licensed under the terms of the GNU General Public
+ * License version 2. This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+ */
+
+#ifndef __MACH_SPEAR3XX_H
+#define __MACH_SPEAR3XX_H
+
+#include <mach/hardware.h>
+#include <mach/spear300.h>
+#include <mach/spear310.h>
+#include <mach/spear320.h>
+
+#define SPEAR3XX_ML_SDRAM_BASE         0x00000000
+#define SPEAR3XX_ML_SDRAM_SIZE         0x40000000
+
+#define SPEAR3XX_ICM9_BASE             0xC0000000
+#define SPEAR3XX_ICM9_SIZE             0x10000000
+
+/* ICM1 - Low speed connection */
+#define SPEAR3XX_ICM1_2_BASE           0xD0000000
+#define SPEAR3XX_ICM1_2_SIZE           0x10000000
+
+#define SPEAR3XX_ICM1_UART_BASE                0xD0000000
+#define VA_SPEAR3XX_ICM1_UART_BASE     IO_ADDRESS(SPEAR3XX_ICM1_UART_BASE)
+#define SPEAR3XX_ICM1_UART_SIZE                0x00080000
+
+#define SPEAR3XX_ICM1_ADC_BASE         0xD0080000
+#define SPEAR3XX_ICM1_ADC_SIZE         0x00080000
+
+#define SPEAR3XX_ICM1_SSP_BASE         0xD0100000
+#define SPEAR3XX_ICM1_SSP_SIZE         0x00080000
+
+#define SPEAR3XX_ICM1_I2C_BASE         0xD0180000
+#define SPEAR3XX_ICM1_I2C_SIZE         0x00080000
+
+#define SPEAR3XX_ICM1_JPEG_BASE                0xD0800000
+#define SPEAR3XX_ICM1_JPEG_SIZE                0x00800000
+
+#define SPEAR3XX_ICM1_IRDA_BASE                0xD1000000
+#define SPEAR3XX_ICM1_IRDA_SIZE                0x00080000
+
+#define SPEAR3XX_ICM1_SRAM_BASE                0xD2800000
+#define SPEAR3XX_ICM1_SRAM_SIZE                0x05800000
+
+/* ICM2 - Application Subsystem */
+#define SPEAR3XX_ICM2_HWACCEL0_BASE    0xD8800000
+#define SPEAR3XX_ICM2_HWACCEL0_SIZE    0x00800000
+
+#define SPEAR3XX_ICM2_HWACCEL1_BASE    0xD9000000
+#define SPEAR3XX_ICM2_HWACCEL1_SIZE    0x00800000
+
+/* ICM4 - High Speed Connection */
+#define SPEAR3XX_ICM4_BASE             0xE0000000
+#define SPEAR3XX_ICM4_SIZE             0x08000000
+
+#define SPEAR3XX_ICM4_MII_BASE         0xE0800000
+#define SPEAR3XX_ICM4_MII_SIZE         0x00800000
+
+#define SPEAR3XX_ICM4_USBD_FIFO_BASE   0xE1000000
+#define SPEAR3XX_ICM4_USBD_FIFO_SIZE   0x00100000
+
+#define SPEAR3XX_ICM4_USBD_CSR_BASE    0xE1100000
+#define SPEAR3XX_ICM4_USBD_CSR_SIZE    0x00100000
+
+#define SPEAR3XX_ICM4_USBD_PLDT_BASE   0xE1200000
+#define SPEAR3XX_ICM4_USBD_PLDT_SIZE   0x00100000
+
+#define SPEAR3XX_ICM4_USB_EHCI0_1_BASE 0xE1800000
+#define SPEAR3XX_ICM4_USB_EHCI0_1_SIZE 0x00100000
+
+#define SPEAR3XX_ICM4_USB_OHCI0_BASE   0xE1900000
+#define SPEAR3XX_ICM4_USB_OHCI0_SIZE   0x00100000
+
+#define SPEAR3XX_ICM4_USB_OHCI1_BASE   0xE2100000
+#define SPEAR3XX_ICM4_USB_OHCI1_SIZE   0x00100000
+
+#define SPEAR3XX_ICM4_USB_ARB_BASE     0xE2800000
+#define SPEAR3XX_ICM4_USB_ARB_SIZE     0x00010000
+
+/* ML1 - Multi Layer CPU Subsystem */
+#define SPEAR3XX_ICM3_ML1_2_BASE       0xF0000000
+#define SPEAR3XX_ICM3_ML1_2_SIZE       0x0F000000
+
+#define SPEAR3XX_ML1_TMR_BASE          0xF0000000
+#define SPEAR3XX_ML1_TMR_SIZE          0x00100000
+
+#define SPEAR3XX_ML1_VIC_BASE          0xF1100000
+#define VA_SPEAR3XX_ML1_VIC_BASE       IO_ADDRESS(SPEAR3XX_ML1_VIC_BASE)
+#define SPEAR3XX_ML1_VIC_SIZE          0x00100000
+
+/* ICM3 - Basic Subsystem */
+#define SPEAR3XX_ICM3_SMEM_BASE                0xF8000000
+#define SPEAR3XX_ICM3_SMEM_SIZE                0x04000000
+
+#define SPEAR3XX_ICM3_SMI_CTRL_BASE    0xFC000000
+#define SPEAR3XX_ICM3_SMI_CTRL_SIZE    0x00200000
+
+#define SPEAR3XX_ICM3_DMA_BASE         0xFC400000
+#define SPEAR3XX_ICM3_DMA_SIZE         0x00200000
+
+#define SPEAR3XX_ICM3_SDRAM_CTRL_BASE  0xFC600000
+#define SPEAR3XX_ICM3_SDRAM_CTRL_SIZE  0x00200000
+
+#define SPEAR3XX_ICM3_TMR0_BASE                0xFC800000
+#define SPEAR3XX_ICM3_TMR0_SIZE                0x00080000
+
+#define SPEAR3XX_ICM3_WDT_BASE         0xFC880000
+#define SPEAR3XX_ICM3_WDT_SIZE         0x00080000
+
+#define SPEAR3XX_ICM3_RTC_BASE         0xFC900000
+#define SPEAR3XX_ICM3_RTC_SIZE         0x00080000
+
+#define SPEAR3XX_ICM3_GPIO_BASE                0xFC980000
+#define SPEAR3XX_ICM3_GPIO_SIZE                0x00080000
+
+#define SPEAR3XX_ICM3_SYS_CTRL_BASE    0xFCA00000
+#define VA_SPEAR3XX_ICM3_SYS_CTRL_BASE IO_ADDRESS(SPEAR3XX_ICM3_SYS_CTRL_BASE)
+#define SPEAR3XX_ICM3_SYS_CTRL_SIZE    0x00080000
+
+#define SPEAR3XX_ICM3_MISC_REG_BASE    0xFCA80000
+#define VA_SPEAR3XX_ICM3_MISC_REG_BASE IO_ADDRESS(SPEAR3XX_ICM3_MISC_REG_BASE)
+#define SPEAR3XX_ICM3_MISC_REG_SIZE    0x00080000
+
+#define SPEAR3XX_ICM3_TMR1_BASE                0xFCB00000
+#define SPEAR3XX_ICM3_TMR1_SIZE                0x00080000
+
+/* Debug uart for linux, will be used for debug and uncompress messages */
+#define SPEAR_DBG_UART_BASE            SPEAR3XX_ICM1_UART_BASE
+#define VA_SPEAR_DBG_UART_BASE         VA_SPEAR3XX_ICM1_UART_BASE
+
+/* Sysctl base for spear platform */
+#define SPEAR_SYS_CTRL_BASE            SPEAR3XX_ICM3_SYS_CTRL_BASE
+#define VA_SPEAR_SYS_CTRL_BASE         VA_SPEAR3XX_ICM3_SYS_CTRL_BASE
+
+#endif /* __MACH_SPEAR3XX_H */
diff --git a/arch/arm/mach-spear3xx/include/mach/spear300.h b/arch/arm/mach-spear3xx/include/mach/spear300.h
new file mode 100644 (file)
index 0000000..ccaa765
--- /dev/null
@@ -0,0 +1,83 @@
+/*
+ * arch/arm/mach-spear3xx/include/mach/spear300.h
+ *
+ * SPEAr300 Machine specific definition
+ *
+ * Copyright (C) 2009 ST Microelectronics
+ * Viresh Kumar<viresh.kumar@st.com>
+ *
+ * This file is licensed under the terms of the GNU General Public
+ * License version 2. This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+ */
+
+#ifdef CONFIG_MACH_SPEAR300
+
+#ifndef __MACH_SPEAR300_H
+#define __MACH_SPEAR300_H
+
+/* Base address of various IPs */
+#define SPEAR300_TELECOM_BASE          0x50000000
+#define SPEAR300_TELECOM_SIZE          0x10000000
+
+/* Interrupt registers offsets and masks */
+#define SPEAR300_TELECOM_REG_SIZE      0x00010000
+#define INT_ENB_MASK_REG               0x54
+#define INT_STS_MASK_REG               0x58
+#define IT_PERS_S_IRQ_MASK             (1 << 0)
+#define IT_CHANGE_S_IRQ_MASK           (1 << 1)
+#define I2S_IRQ_MASK                   (1 << 2)
+#define TDM_IRQ_MASK                   (1 << 3)
+#define CAMERA_L_IRQ_MASK              (1 << 4)
+#define CAMERA_F_IRQ_MASK              (1 << 5)
+#define CAMERA_V_IRQ_MASK              (1 << 6)
+#define KEYBOARD_IRQ_MASK              (1 << 7)
+#define GPIO1_IRQ_MASK                 (1 << 8)
+
+#define SHIRQ_RAS1_MASK                        0x1FF
+
+#define SPEAR300_CLCD_BASE             0x60000000
+#define SPEAR300_CLCD_SIZE             0x10000000
+
+#define SPEAR300_SDIO_BASE             0x70000000
+#define SPEAR300_SDIO_SIZE             0x10000000
+
+#define SPEAR300_NAND_0_BASE           0x80000000
+#define SPEAR300_NAND_0_SIZE           0x04000000
+
+#define SPEAR300_NAND_1_BASE           0x84000000
+#define SPEAR300_NAND_1_SIZE           0x04000000
+
+#define SPEAR300_NAND_2_BASE           0x88000000
+#define SPEAR300_NAND_2_SIZE           0x04000000
+
+#define SPEAR300_NAND_3_BASE           0x8c000000
+#define SPEAR300_NAND_3_SIZE           0x04000000
+
+#define SPEAR300_NOR_0_BASE            0x90000000
+#define SPEAR300_NOR_0_SIZE            0x01000000
+
+#define SPEAR300_NOR_1_BASE            0x91000000
+#define SPEAR300_NOR_1_SIZE            0x01000000
+
+#define SPEAR300_NOR_2_BASE            0x92000000
+#define SPEAR300_NOR_2_SIZE            0x01000000
+
+#define SPEAR300_NOR_3_BASE            0x93000000
+#define SPEAR300_NOR_3_SIZE            0x01000000
+
+#define SPEAR300_FSMC_BASE             0x94000000
+#define SPEAR300_FSMC_SIZE             0x05000000
+
+#define SPEAR300_SOC_CONFIG_BASE       0x99000000
+#define SPEAR300_SOC_CONFIG_SIZE       0x00000008
+
+#define SPEAR300_KEYBOARD_BASE         0xA0000000
+#define SPEAR300_KEYBOARD_SIZE         0x09000000
+
+#define SPEAR300_GPIO_BASE             0xA9000000
+#define SPEAR300_GPIO_SIZE             0x07000000
+
+#endif /* __MACH_SPEAR300_H */
+
+#endif /* CONFIG_MACH_SPEAR300 */
diff --git a/arch/arm/mach-spear3xx/include/mach/spear310.h b/arch/arm/mach-spear3xx/include/mach/spear310.h
new file mode 100644 (file)
index 0000000..b27bb8a
--- /dev/null
@@ -0,0 +1,70 @@
+/*
+ * arch/arm/mach-spear3xx/include/mach/spear310.h
+ *
+ * SPEAr310 Machine specific definition
+ *
+ * Copyright (C) 2009 ST Microelectronics
+ * Viresh Kumar<viresh.kumar@st.com>
+ *
+ * This file is licensed under the terms of the GNU General Public
+ * License version 2. This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+ */
+
+#ifdef CONFIG_MACH_SPEAR310
+
+#ifndef __MACH_SPEAR310_H
+#define __MACH_SPEAR310_H
+
+#define SPEAR310_NAND_BASE             0x40000000
+#define SPEAR310_NAND_SIZE             0x04000000
+
+#define SPEAR310_FSMC_BASE             0x44000000
+#define SPEAR310_FSMC_SIZE             0x01000000
+
+#define SPEAR310_UART1_BASE            0xB2000000
+#define SPEAR310_UART2_BASE            0xB2080000
+#define SPEAR310_UART3_BASE            0xB2100000
+#define SPEAR310_UART4_BASE            0xB2180000
+#define SPEAR310_UART5_BASE            0xB2200000
+#define SPEAR310_UART_SIZE             0x00080000
+
+#define SPEAR310_HDLC_BASE             0xB2800000
+#define SPEAR310_HDLC_SIZE             0x00800000
+
+#define SPEAR310_RS485_0_BASE          0xB3000000
+#define SPEAR310_RS485_0_SIZE          0x00800000
+
+#define SPEAR310_RS485_1_BASE          0xB3800000
+#define SPEAR310_RS485_1_SIZE          0x00800000
+
+#define SPEAR310_SOC_CONFIG_BASE       0xB4000000
+#define SPEAR310_SOC_CONFIG_SIZE       0x00000070
+/* Interrupt registers offsets and masks */
+#define INT_STS_MASK_REG               0x04
+#define SMII0_IRQ_MASK                 (1 << 0)
+#define SMII1_IRQ_MASK                 (1 << 1)
+#define SMII2_IRQ_MASK                 (1 << 2)
+#define SMII3_IRQ_MASK                 (1 << 3)
+#define WAKEUP_SMII0_IRQ_MASK          (1 << 4)
+#define WAKEUP_SMII1_IRQ_MASK          (1 << 5)
+#define WAKEUP_SMII2_IRQ_MASK          (1 << 6)
+#define WAKEUP_SMII3_IRQ_MASK          (1 << 7)
+#define UART1_IRQ_MASK                 (1 << 8)
+#define UART2_IRQ_MASK                 (1 << 9)
+#define UART3_IRQ_MASK                 (1 << 10)
+#define UART4_IRQ_MASK                 (1 << 11)
+#define UART5_IRQ_MASK                 (1 << 12)
+#define EMI_IRQ_MASK                   (1 << 13)
+#define TDM_HDLC_IRQ_MASK              (1 << 14)
+#define RS485_0_IRQ_MASK               (1 << 15)
+#define RS485_1_IRQ_MASK               (1 << 16)
+
+#define SHIRQ_RAS1_MASK                        0x000FF
+#define SHIRQ_RAS2_MASK                        0x01F00
+#define SHIRQ_RAS3_MASK                        0x02000
+#define SHIRQ_INTRCOMM_RAS_MASK                0x1C000
+
+#endif /* __MACH_SPEAR310_H */
+
+#endif /* CONFIG_MACH_SPEAR310 */
diff --git a/arch/arm/mach-spear3xx/include/mach/spear320.h b/arch/arm/mach-spear3xx/include/mach/spear320.h
new file mode 100644 (file)
index 0000000..cacf17a
--- /dev/null
@@ -0,0 +1,96 @@
+/*
+ * arch/arm/mach-spear3xx/include/mach/spear320.h
+ *
+ * SPEAr320 Machine specific definition
+ *
+ * Copyright (C) 2009 ST Microelectronics
+ * Viresh Kumar<viresh.kumar@st.com>
+ *
+ * This file is licensed under the terms of the GNU General Public
+ * License version 2. This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+ */
+
+#ifdef CONFIG_MACH_SPEAR320
+
+#ifndef __MACH_SPEAR320_H
+#define __MACH_SPEAR320_H
+
+#define SPEAR320_EMI_CTRL_BASE         0x40000000
+#define SPEAR320_EMI_CTRL_SIZE         0x08000000
+
+#define SPEAR320_FSMC_BASE             0x4C000000
+#define SPEAR320_FSMC_SIZE             0x01000000
+
+#define SPEAR320_I2S_BASE              0x60000000
+#define SPEAR320_I2S_SIZE              0x10000000
+
+#define SPEAR320_SDIO_BASE             0x70000000
+#define SPEAR320_SDIO_SIZE             0x10000000
+
+#define SPEAR320_CLCD_BASE             0x90000000
+#define SPEAR320_CLCD_SIZE             0x10000000
+
+#define SPEAR320_PAR_PORT_BASE         0xA0000000
+#define SPEAR320_PAR_PORT_SIZE         0x01000000
+
+#define SPEAR320_CAN0_BASE             0xA1000000
+#define SPEAR320_CAN0_SIZE             0x01000000
+
+#define SPEAR320_CAN1_BASE             0xA2000000
+#define SPEAR320_CAN1_SIZE             0x01000000
+
+#define SPEAR320_UART1_BASE            0xA3000000
+#define SPEAR320_UART2_BASE            0xA4000000
+#define SPEAR320_UART_SIZE             0x01000000
+
+#define SPEAR320_SSP0_BASE             0xA5000000
+#define SPEAR320_SSP0_SIZE             0x01000000
+
+#define SPEAR320_SSP1_BASE             0xA6000000
+#define SPEAR320_SSP1_SIZE             0x01000000
+
+#define SPEAR320_I2C_BASE              0xA7000000
+#define SPEAR320_I2C_SIZE              0x01000000
+
+#define SPEAR320_PWM_BASE              0xA8000000
+#define SPEAR320_PWM_SIZE              0x01000000
+
+#define SPEAR320_SMII0_BASE            0xAA000000
+#define SPEAR320_SMII0_SIZE            0x01000000
+
+#define SPEAR320_SMII1_BASE            0xAB000000
+#define SPEAR320_SMII1_SIZE            0x01000000
+
+#define SPEAR320_SOC_CONFIG_BASE       0xB4000000
+#define SPEAR320_SOC_CONFIG_SIZE       0x00000070
+/* Interrupt registers offsets and masks */
+#define INT_STS_MASK_REG               0x04
+#define INT_CLR_MASK_REG               0x04
+#define INT_ENB_MASK_REG               0x08
+#define GPIO_IRQ_MASK                  (1 << 0)
+#define I2S_PLAY_IRQ_MASK              (1 << 1)
+#define I2S_REC_IRQ_MASK               (1 << 2)
+#define EMI_IRQ_MASK                   (1 << 7)
+#define CLCD_IRQ_MASK                  (1 << 8)
+#define SPP_IRQ_MASK                   (1 << 9)
+#define SDIO_IRQ_MASK                  (1 << 10)
+#define CAN_U_IRQ_MASK                 (1 << 11)
+#define CAN_L_IRQ_MASK                 (1 << 12)
+#define UART1_IRQ_MASK                 (1 << 13)
+#define UART2_IRQ_MASK                 (1 << 14)
+#define SSP1_IRQ_MASK                  (1 << 15)
+#define SSP2_IRQ_MASK                  (1 << 16)
+#define SMII0_IRQ_MASK                 (1 << 17)
+#define MII1_SMII1_IRQ_MASK            (1 << 18)
+#define WAKEUP_SMII0_IRQ_MASK          (1 << 19)
+#define WAKEUP_MII1_SMII1_IRQ_MASK     (1 << 20)
+#define I2C1_IRQ_MASK                  (1 << 21)
+
+#define SHIRQ_RAS1_MASK                        0x000380
+#define SHIRQ_RAS3_MASK                        0x000007
+#define SHIRQ_INTRCOMM_RAS_MASK                0x3FF800
+
+#endif /* __MACH_SPEAR320_H */
+
+#endif /* CONFIG_MACH_SPEAR320 */
diff --git a/arch/arm/mach-spear3xx/include/mach/system.h b/arch/arm/mach-spear3xx/include/mach/system.h
new file mode 100644 (file)
index 0000000..92cee63
--- /dev/null
@@ -0,0 +1,19 @@
+/*
+ * arch/arm/mach-spear3xx/include/mach/system.h
+ *
+ * SPEAr3xx Machine family specific architecture functions
+ *
+ * Copyright (C) 2009 ST Microelectronics
+ * Viresh Kumar<viresh.kumar@st.com>
+ *
+ * This file is licensed under the terms of the GNU General Public
+ * License version 2. This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+ */
+
+#ifndef __MACH_SYSTEM_H
+#define __MACH_SYSTEM_H
+
+#include <plat/system.h>
+
+#endif /* __MACH_SYSTEM_H */
diff --git a/arch/arm/mach-spear3xx/include/mach/timex.h b/arch/arm/mach-spear3xx/include/mach/timex.h
new file mode 100644 (file)
index 0000000..a38cc9d
--- /dev/null
@@ -0,0 +1,19 @@
+/*
+ * arch/arm/mach-spear3xx/include/mach/timex.h
+ *
+ * SPEAr3XX machine family specific timex definitions
+ *
+ * Copyright (C) 2009 ST Microelectronics
+ * Viresh Kumar<viresh.kumar@st.com>
+ *
+ * This file is licensed under the terms of the GNU General Public
+ * License version 2. This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+ */
+
+#ifndef __MACH_TIMEX_H
+#define __MACH_TIMEX_H
+
+#include <plat/timex.h>
+
+#endif /* __MACH_TIMEX_H */
diff --git a/arch/arm/mach-spear3xx/include/mach/uncompress.h b/arch/arm/mach-spear3xx/include/mach/uncompress.h
new file mode 100644 (file)
index 0000000..53ba8bb
--- /dev/null
@@ -0,0 +1,19 @@
+/*
+ * arch/arm/mach-spear3xx/include/mach/uncompress.h
+ *
+ * Serial port stubs for kernel decompress status messages
+ *
+ * Copyright (C) 2009 ST Microelectronics
+ * Viresh Kumar<viresh.kumar@st.com>
+ *
+ * This file is licensed under the terms of the GNU General Public
+ * License version 2. This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+ */
+
+#ifndef __MACH_UNCOMPRESS_H
+#define __MACH_UNCOMPRESS_H
+
+#include <plat/uncompress.h>
+
+#endif /* __MACH_UNCOMPRESS_H */
diff --git a/arch/arm/mach-spear3xx/include/mach/vmalloc.h b/arch/arm/mach-spear3xx/include/mach/vmalloc.h
new file mode 100644 (file)
index 0000000..df977b3
--- /dev/null
@@ -0,0 +1,19 @@
+/*
+ * arch/arm/mach-spear3xx/include/mach/vmalloc.h
+ *
+ * Defining Vmalloc area for SPEAr3xx machine family
+ *
+ * Copyright (C) 2009 ST Microelectronics
+ * Viresh Kumar<viresh.kumar@st.com>
+ *
+ * This file is licensed under the terms of the GNU General Public
+ * License version 2. This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+ */
+
+#ifndef __MACH_VMALLOC_H
+#define __MACH_VMALLOC_H
+
+#include <plat/vmalloc.h>
+
+#endif /* __MACH_VMALLOC_H */
diff --git a/arch/arm/mach-spear3xx/spear300.c b/arch/arm/mach-spear3xx/spear300.c
new file mode 100644 (file)
index 0000000..3560f8c
--- /dev/null
@@ -0,0 +1,468 @@
+/*
+ * arch/arm/mach-spear3xx/spear300.c
+ *
+ * SPEAr300 machine source file
+ *
+ * Copyright (C) 2009 ST Microelectronics
+ * Viresh Kumar<viresh.kumar@st.com>
+ *
+ * This file is licensed under the terms of the GNU General Public
+ * License version 2. This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+ */
+
+#include <linux/types.h>
+#include <linux/amba/pl061.h>
+#include <linux/ptrace.h>
+#include <asm/irq.h>
+#include <mach/generic.h>
+#include <mach/spear.h>
+#include <plat/shirq.h>
+
+/* pad multiplexing support */
+/* muxing registers */
+#define PAD_MUX_CONFIG_REG     0x00
+#define MODE_CONFIG_REG                0x04
+
+/* modes */
+#define NAND_MODE                      (1 << 0)
+#define NOR_MODE                       (1 << 1)
+#define PHOTO_FRAME_MODE               (1 << 2)
+#define LEND_IP_PHONE_MODE             (1 << 3)
+#define HEND_IP_PHONE_MODE             (1 << 4)
+#define LEND_WIFI_PHONE_MODE           (1 << 5)
+#define HEND_WIFI_PHONE_MODE           (1 << 6)
+#define ATA_PABX_WI2S_MODE             (1 << 7)
+#define ATA_PABX_I2S_MODE              (1 << 8)
+#define CAML_LCDW_MODE                 (1 << 9)
+#define CAMU_LCD_MODE                  (1 << 10)
+#define CAMU_WLCD_MODE                 (1 << 11)
+#define CAML_LCD_MODE                  (1 << 12)
+#define ALL_MODES                      0x1FFF
+
+struct pmx_mode nand_mode = {
+       .id = NAND_MODE,
+       .name = "nand mode",
+       .mask = 0x00,
+};
+
+struct pmx_mode nor_mode = {
+       .id = NOR_MODE,
+       .name = "nor mode",
+       .mask = 0x01,
+};
+
+struct pmx_mode photo_frame_mode = {
+       .id = PHOTO_FRAME_MODE,
+       .name = "photo frame mode",
+       .mask = 0x02,
+};
+
+struct pmx_mode lend_ip_phone_mode = {
+       .id = LEND_IP_PHONE_MODE,
+       .name = "lend ip phone mode",
+       .mask = 0x03,
+};
+
+struct pmx_mode hend_ip_phone_mode = {
+       .id = HEND_IP_PHONE_MODE,
+       .name = "hend ip phone mode",
+       .mask = 0x04,
+};
+
+struct pmx_mode lend_wifi_phone_mode = {
+       .id = LEND_WIFI_PHONE_MODE,
+       .name = "lend wifi phone mode",
+       .mask = 0x05,
+};
+
+struct pmx_mode hend_wifi_phone_mode = {
+       .id = HEND_WIFI_PHONE_MODE,
+       .name = "hend wifi phone mode",
+       .mask = 0x06,
+};
+
+struct pmx_mode ata_pabx_wi2s_mode = {
+       .id = ATA_PABX_WI2S_MODE,
+       .name = "ata pabx wi2s mode",
+       .mask = 0x07,
+};
+
+struct pmx_mode ata_pabx_i2s_mode = {
+       .id = ATA_PABX_I2S_MODE,
+       .name = "ata pabx i2s mode",
+       .mask = 0x08,
+};
+
+struct pmx_mode caml_lcdw_mode = {
+       .id = CAML_LCDW_MODE,
+       .name = "caml lcdw mode",
+       .mask = 0x0C,
+};
+
+struct pmx_mode camu_lcd_mode = {
+       .id = CAMU_LCD_MODE,
+       .name = "camu lcd mode",
+       .mask = 0x0D,
+};
+
+struct pmx_mode camu_wlcd_mode = {
+       .id = CAMU_WLCD_MODE,
+       .name = "camu wlcd mode",
+       .mask = 0x0E,
+};
+
+struct pmx_mode caml_lcd_mode = {
+       .id = CAML_LCD_MODE,
+       .name = "caml lcd mode",
+       .mask = 0x0F,
+};
+
+/* devices */
+struct pmx_dev_mode pmx_fsmc_2_chips_modes[] = {
+       {
+               .ids = NAND_MODE | NOR_MODE | PHOTO_FRAME_MODE |
+                       ATA_PABX_WI2S_MODE | ATA_PABX_I2S_MODE,
+               .mask = PMX_FIRDA_MASK,
+       },
+};
+
+struct pmx_dev pmx_fsmc_2_chips = {
+       .name = "fsmc_2_chips",
+       .modes = pmx_fsmc_2_chips_modes,
+       .mode_count = ARRAY_SIZE(pmx_fsmc_2_chips_modes),
+       .enb_on_reset = 1,
+};
+
+struct pmx_dev_mode pmx_fsmc_4_chips_modes[] = {
+       {
+               .ids = NAND_MODE | NOR_MODE | PHOTO_FRAME_MODE |
+                       ATA_PABX_WI2S_MODE | ATA_PABX_I2S_MODE,
+               .mask = PMX_FIRDA_MASK | PMX_UART0_MASK,
+       },
+};
+
+struct pmx_dev pmx_fsmc_4_chips = {
+       .name = "fsmc_4_chips",
+       .modes = pmx_fsmc_4_chips_modes,
+       .mode_count = ARRAY_SIZE(pmx_fsmc_4_chips_modes),
+       .enb_on_reset = 1,
+};
+
+struct pmx_dev_mode pmx_keyboard_modes[] = {
+       {
+               .ids = LEND_IP_PHONE_MODE | HEND_IP_PHONE_MODE |
+                       LEND_WIFI_PHONE_MODE | HEND_WIFI_PHONE_MODE |
+                       CAML_LCDW_MODE | CAMU_LCD_MODE | CAMU_WLCD_MODE |
+                       CAML_LCD_MODE,
+               .mask = 0x0,
+       },
+};
+
+struct pmx_dev pmx_keyboard = {
+       .name = "keyboard",
+       .modes = pmx_keyboard_modes,
+       .mode_count = ARRAY_SIZE(pmx_keyboard_modes),
+       .enb_on_reset = 1,
+};
+
+struct pmx_dev_mode pmx_clcd_modes[] = {
+       {
+               .ids = PHOTO_FRAME_MODE,
+               .mask = PMX_TIMER_1_2_MASK | PMX_TIMER_3_4_MASK ,
+       }, {
+               .ids = HEND_IP_PHONE_MODE | HEND_WIFI_PHONE_MODE |
+                       CAMU_LCD_MODE | CAML_LCD_MODE,
+               .mask = PMX_TIMER_3_4_MASK,
+       },
+};
+
+struct pmx_dev pmx_clcd = {
+       .name = "clcd",
+       .modes = pmx_clcd_modes,
+       .mode_count = ARRAY_SIZE(pmx_clcd_modes),
+       .enb_on_reset = 1,
+};
+
+struct pmx_dev_mode pmx_telecom_gpio_modes[] = {
+       {
+               .ids = PHOTO_FRAME_MODE | CAMU_LCD_MODE | CAML_LCD_MODE,
+               .mask = PMX_MII_MASK,
+       }, {
+               .ids = LEND_IP_PHONE_MODE | LEND_WIFI_PHONE_MODE,
+               .mask = PMX_MII_MASK | PMX_TIMER_1_2_MASK | PMX_TIMER_3_4_MASK,
+       }, {
+               .ids = ATA_PABX_I2S_MODE | CAML_LCDW_MODE | CAMU_WLCD_MODE,
+               .mask = PMX_MII_MASK | PMX_TIMER_3_4_MASK,
+       }, {
+               .ids = HEND_IP_PHONE_MODE | HEND_WIFI_PHONE_MODE,
+               .mask = PMX_MII_MASK | PMX_TIMER_1_2_MASK,
+       }, {
+               .ids = ATA_PABX_WI2S_MODE,
+               .mask = PMX_MII_MASK | PMX_TIMER_1_2_MASK | PMX_TIMER_3_4_MASK
+                       | PMX_UART0_MODEM_MASK,
+       },
+};
+
+struct pmx_dev pmx_telecom_gpio = {
+       .name = "telecom_gpio",
+       .modes = pmx_telecom_gpio_modes,
+       .mode_count = ARRAY_SIZE(pmx_telecom_gpio_modes),
+       .enb_on_reset = 1,
+};
+
+struct pmx_dev_mode pmx_telecom_tdm_modes[] = {
+       {
+               .ids = PHOTO_FRAME_MODE | LEND_IP_PHONE_MODE |
+                       HEND_IP_PHONE_MODE | LEND_WIFI_PHONE_MODE
+                       | HEND_WIFI_PHONE_MODE | ATA_PABX_WI2S_MODE
+                       | ATA_PABX_I2S_MODE | CAML_LCDW_MODE | CAMU_LCD_MODE
+                       | CAMU_WLCD_MODE | CAML_LCD_MODE,
+               .mask = PMX_UART0_MODEM_MASK | PMX_SSP_CS_MASK,
+       },
+};
+
+struct pmx_dev pmx_telecom_tdm = {
+       .name = "telecom_tdm",
+       .modes = pmx_telecom_tdm_modes,
+       .mode_count = ARRAY_SIZE(pmx_telecom_tdm_modes),
+       .enb_on_reset = 1,
+};
+
+struct pmx_dev_mode pmx_telecom_spi_cs_i2c_clk_modes[] = {
+       {
+               .ids = LEND_IP_PHONE_MODE | HEND_IP_PHONE_MODE |
+                       LEND_WIFI_PHONE_MODE | HEND_WIFI_PHONE_MODE
+                       | ATA_PABX_WI2S_MODE | ATA_PABX_I2S_MODE |
+                       CAML_LCDW_MODE | CAML_LCD_MODE,
+               .mask = PMX_TIMER_1_2_MASK | PMX_TIMER_3_4_MASK,
+       },
+};
+
+struct pmx_dev pmx_telecom_spi_cs_i2c_clk = {
+       .name = "telecom_spi_cs_i2c_clk",
+       .modes = pmx_telecom_spi_cs_i2c_clk_modes,
+       .mode_count = ARRAY_SIZE(pmx_telecom_spi_cs_i2c_clk_modes),
+       .enb_on_reset = 1,
+};
+
+struct pmx_dev_mode pmx_telecom_camera_modes[] = {
+       {
+               .ids = CAML_LCDW_MODE | CAML_LCD_MODE,
+               .mask = PMX_MII_MASK,
+       }, {
+               .ids = CAMU_LCD_MODE | CAMU_WLCD_MODE,
+               .mask = PMX_TIMER_1_2_MASK | PMX_TIMER_3_4_MASK | PMX_MII_MASK,
+       },
+};
+
+struct pmx_dev pmx_telecom_camera = {
+       .name = "telecom_camera",
+       .modes = pmx_telecom_camera_modes,
+       .mode_count = ARRAY_SIZE(pmx_telecom_camera_modes),
+       .enb_on_reset = 1,
+};
+
+struct pmx_dev_mode pmx_telecom_dac_modes[] = {
+       {
+               .ids = ATA_PABX_I2S_MODE | CAML_LCDW_MODE | CAMU_LCD_MODE
+                       | CAMU_WLCD_MODE | CAML_LCD_MODE,
+               .mask = PMX_TIMER_1_2_MASK,
+       },
+};
+
+struct pmx_dev pmx_telecom_dac = {
+       .name = "telecom_dac",
+       .modes = pmx_telecom_dac_modes,
+       .mode_count = ARRAY_SIZE(pmx_telecom_dac_modes),
+       .enb_on_reset = 1,
+};
+
+struct pmx_dev_mode pmx_telecom_i2s_modes[] = {
+       {
+               .ids = LEND_IP_PHONE_MODE | HEND_IP_PHONE_MODE
+                       | LEND_WIFI_PHONE_MODE | HEND_WIFI_PHONE_MODE |
+                       ATA_PABX_I2S_MODE | CAML_LCDW_MODE | CAMU_LCD_MODE
+                       | CAMU_WLCD_MODE | CAML_LCD_MODE,
+               .mask = PMX_UART0_MODEM_MASK,
+       },
+};
+
+struct pmx_dev pmx_telecom_i2s = {
+       .name = "telecom_i2s",
+       .modes = pmx_telecom_i2s_modes,
+       .mode_count = ARRAY_SIZE(pmx_telecom_i2s_modes),
+       .enb_on_reset = 1,
+};
+
+struct pmx_dev_mode pmx_telecom_boot_pins_modes[] = {
+       {
+               .ids = NAND_MODE | NOR_MODE,
+               .mask = PMX_UART0_MODEM_MASK | PMX_TIMER_1_2_MASK |
+                       PMX_TIMER_3_4_MASK,
+       },
+};
+
+struct pmx_dev pmx_telecom_boot_pins = {
+       .name = "telecom_boot_pins",
+       .modes = pmx_telecom_boot_pins_modes,
+       .mode_count = ARRAY_SIZE(pmx_telecom_boot_pins_modes),
+       .enb_on_reset = 1,
+};
+
+struct pmx_dev_mode pmx_telecom_sdio_4bit_modes[] = {
+       {
+               .ids = PHOTO_FRAME_MODE | LEND_IP_PHONE_MODE |
+                       HEND_IP_PHONE_MODE | LEND_WIFI_PHONE_MODE |
+                       HEND_WIFI_PHONE_MODE | CAML_LCDW_MODE | CAMU_LCD_MODE |
+                       CAMU_WLCD_MODE | CAML_LCD_MODE | ATA_PABX_WI2S_MODE |
+                       ATA_PABX_I2S_MODE,
+               .mask = PMX_GPIO_PIN0_MASK | PMX_GPIO_PIN1_MASK |
+                       PMX_GPIO_PIN2_MASK | PMX_GPIO_PIN3_MASK |
+                       PMX_GPIO_PIN4_MASK | PMX_GPIO_PIN5_MASK,
+       },
+};
+
+struct pmx_dev pmx_telecom_sdio_4bit = {
+       .name = "telecom_sdio_4bit",
+       .modes = pmx_telecom_sdio_4bit_modes,
+       .mode_count = ARRAY_SIZE(pmx_telecom_sdio_4bit_modes),
+       .enb_on_reset = 1,
+};
+
+struct pmx_dev_mode pmx_telecom_sdio_8bit_modes[] = {
+       {
+               .ids = PHOTO_FRAME_MODE | LEND_IP_PHONE_MODE |
+                       HEND_IP_PHONE_MODE | LEND_WIFI_PHONE_MODE |
+                       HEND_WIFI_PHONE_MODE | CAML_LCDW_MODE | CAMU_LCD_MODE |
+                       CAMU_WLCD_MODE | CAML_LCD_MODE,
+               .mask = PMX_GPIO_PIN0_MASK | PMX_GPIO_PIN1_MASK |
+                       PMX_GPIO_PIN2_MASK | PMX_GPIO_PIN3_MASK |
+                       PMX_GPIO_PIN4_MASK | PMX_GPIO_PIN5_MASK | PMX_MII_MASK,
+       },
+};
+
+struct pmx_dev pmx_telecom_sdio_8bit = {
+       .name = "telecom_sdio_8bit",
+       .modes = pmx_telecom_sdio_8bit_modes,
+       .mode_count = ARRAY_SIZE(pmx_telecom_sdio_8bit_modes),
+       .enb_on_reset = 1,
+};
+
+struct pmx_dev_mode pmx_gpio1_modes[] = {
+       {
+               .ids = PHOTO_FRAME_MODE,
+               .mask = PMX_UART0_MODEM_MASK | PMX_TIMER_1_2_MASK |
+                       PMX_TIMER_3_4_MASK,
+       },
+};
+
+struct pmx_dev pmx_gpio1 = {
+       .name = "arm gpio1",
+       .modes = pmx_gpio1_modes,
+       .mode_count = ARRAY_SIZE(pmx_gpio1_modes),
+       .enb_on_reset = 1,
+};
+
+/* pmx driver structure */
+struct pmx_driver pmx_driver = {
+       .mode_reg = {.offset = MODE_CONFIG_REG, .mask = 0x0000000f},
+       .mux_reg = {.offset = PAD_MUX_CONFIG_REG, .mask = 0x00007fff},
+};
+
+/* Add spear300 specific devices here */
+/* arm gpio1 device registeration */
+static struct pl061_platform_data gpio1_plat_data = {
+       .gpio_base      = 8,
+       .irq_base       = SPEAR_GPIO1_INT_BASE,
+};
+
+struct amba_device gpio1_device = {
+       .dev = {
+               .init_name = "gpio1",
+               .platform_data = &gpio1_plat_data,
+       },
+       .res = {
+               .start = SPEAR300_GPIO_BASE,
+               .end = SPEAR300_GPIO_BASE + SPEAR300_GPIO_SIZE - 1,
+               .flags = IORESOURCE_MEM,
+       },
+       .irq = {VIRQ_GPIO1, NO_IRQ},
+};
+
+/* spear3xx shared irq */
+struct shirq_dev_config shirq_ras1_config[] = {
+       {
+               .virq = VIRQ_IT_PERS_S,
+               .enb_mask = IT_PERS_S_IRQ_MASK,
+               .status_mask = IT_PERS_S_IRQ_MASK,
+       }, {
+               .virq = VIRQ_IT_CHANGE_S,
+               .enb_mask = IT_CHANGE_S_IRQ_MASK,
+               .status_mask = IT_CHANGE_S_IRQ_MASK,
+       }, {
+               .virq = VIRQ_I2S,
+               .enb_mask = I2S_IRQ_MASK,
+               .status_mask = I2S_IRQ_MASK,
+       }, {
+               .virq = VIRQ_TDM,
+               .enb_mask = TDM_IRQ_MASK,
+               .status_mask = TDM_IRQ_MASK,
+       }, {
+               .virq = VIRQ_CAMERA_L,
+               .enb_mask = CAMERA_L_IRQ_MASK,
+               .status_mask = CAMERA_L_IRQ_MASK,
+       }, {
+               .virq = VIRQ_CAMERA_F,
+               .enb_mask = CAMERA_F_IRQ_MASK,
+               .status_mask = CAMERA_F_IRQ_MASK,
+       }, {
+               .virq = VIRQ_CAMERA_V,
+               .enb_mask = CAMERA_V_IRQ_MASK,
+               .status_mask = CAMERA_V_IRQ_MASK,
+       }, {
+               .virq = VIRQ_KEYBOARD,
+               .enb_mask = KEYBOARD_IRQ_MASK,
+               .status_mask = KEYBOARD_IRQ_MASK,
+       }, {
+               .virq = VIRQ_GPIO1,
+               .enb_mask = GPIO1_IRQ_MASK,
+               .status_mask = GPIO1_IRQ_MASK,
+       },
+};
+
+struct spear_shirq shirq_ras1 = {
+       .irq = IRQ_GEN_RAS_1,
+       .dev_config = shirq_ras1_config,
+       .dev_count = ARRAY_SIZE(shirq_ras1_config),
+       .regs = {
+               .enb_reg = INT_ENB_MASK_REG,
+               .status_reg = INT_STS_MASK_REG,
+               .status_reg_mask = SHIRQ_RAS1_MASK,
+               .clear_reg = -1,
+       },
+};
+
+/* spear300 routines */
+void __init spear300_init(void)
+{
+       int ret = 0;
+
+       /* call spear3xx family common init function */
+       spear3xx_init();
+
+       /* shared irq registeration */
+       shirq_ras1.regs.base =
+               ioremap(SPEAR300_TELECOM_BASE, SPEAR300_TELECOM_REG_SIZE);
+       if (shirq_ras1.regs.base) {
+               ret = spear_shirq_register(&shirq_ras1);
+               if (ret)
+                       printk(KERN_ERR "Error registering Shared IRQ\n");
+       }
+}
+
+void spear300_pmx_init(void)
+{
+       spear_pmx_init(&pmx_driver, SPEAR300_SOC_CONFIG_BASE,
+                       SPEAR300_SOC_CONFIG_SIZE);
+}
diff --git a/arch/arm/mach-spear3xx/spear300_evb.c b/arch/arm/mach-spear3xx/spear300_evb.c
new file mode 100644 (file)
index 0000000..bb21db1
--- /dev/null
@@ -0,0 +1,77 @@
+/*
+ * arch/arm/mach-spear3xx/spear300_evb.c
+ *
+ * SPEAr300 evaluation board source file
+ *
+ * Copyright (C) 2009 ST Microelectronics
+ * Viresh Kumar<viresh.kumar@st.com>
+ *
+ * This file is licensed under the terms of the GNU General Public
+ * License version 2. This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+ */
+
+#include <asm/mach/arch.h>
+#include <asm/mach-types.h>
+#include <mach/generic.h>
+#include <mach/spear.h>
+
+/* padmux devices to enable */
+static struct pmx_dev *pmx_devs[] = {
+       /* spear3xx specific devices */
+       &pmx_i2c,
+       &pmx_ssp_cs,
+       &pmx_ssp,
+       &pmx_mii,
+       &pmx_uart0,
+
+       /* spear300 specific devices */
+       &pmx_fsmc_2_chips,
+       &pmx_clcd,
+       &pmx_telecom_sdio_4bit,
+       &pmx_gpio1,
+};
+
+static struct amba_device *amba_devs[] __initdata = {
+       /* spear3xx specific devices */
+       &gpio_device,
+       &uart_device,
+
+       /* spear300 specific devices */
+       &gpio1_device,
+};
+
+static struct platform_device *plat_devs[] __initdata = {
+       /* spear3xx specific devices */
+
+       /* spear300 specific devices */
+};
+
+static void __init spear300_evb_init(void)
+{
+       unsigned int i;
+
+       /* call spear300 machine init function */
+       spear300_init();
+
+       /* padmux initialization */
+       pmx_driver.mode = &photo_frame_mode;
+       pmx_driver.devs = pmx_devs;
+       pmx_driver.devs_count = ARRAY_SIZE(pmx_devs);
+       spear300_pmx_init();
+
+       /* Add Platform Devices */
+       platform_add_devices(plat_devs, ARRAY_SIZE(plat_devs));
+
+       /* Add Amba Devices */
+       for (i = 0; i < ARRAY_SIZE(amba_devs); i++)
+               amba_device_register(amba_devs[i], &iomem_resource);
+}
+
+MACHINE_START(SPEAR300, "ST-SPEAR300-EVB")
+       .boot_params    =       0x00000100,
+       .map_io         =       spear3xx_map_io,
+       .init_irq       =       spear3xx_init_irq,
+       .timer          =       &spear_sys_timer,
+       .init_machine   =       spear300_evb_init,
+MACHINE_END
diff --git a/arch/arm/mach-spear3xx/spear310.c b/arch/arm/mach-spear3xx/spear310.c
new file mode 100644 (file)
index 0000000..96a1ab8
--- /dev/null
@@ -0,0 +1,302 @@
+/*
+ * arch/arm/mach-spear3xx/spear310.c
+ *
+ * SPEAr310 machine source file
+ *
+ * Copyright (C) 2009 ST Microelectronics
+ * Viresh Kumar<viresh.kumar@st.com>
+ *
+ * This file is licensed under the terms of the GNU General Public
+ * License version 2. This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+ */
+
+#include <linux/ptrace.h>
+#include <asm/irq.h>
+#include <mach/generic.h>
+#include <mach/spear.h>
+#include <plat/shirq.h>
+
+/* pad multiplexing support */
+/* muxing registers */
+#define PAD_MUX_CONFIG_REG     0x08
+
+/* devices */
+struct pmx_dev_mode pmx_emi_cs_0_1_4_5_modes[] = {
+       {
+               .ids = 0x00,
+               .mask = PMX_TIMER_3_4_MASK,
+       },
+};
+
+struct pmx_dev pmx_emi_cs_0_1_4_5 = {
+       .name = "emi_cs_0_1_4_5",
+       .modes = pmx_emi_cs_0_1_4_5_modes,
+       .mode_count = ARRAY_SIZE(pmx_emi_cs_0_1_4_5_modes),
+       .enb_on_reset = 1,
+};
+
+struct pmx_dev_mode pmx_emi_cs_2_3_modes[] = {
+       {
+               .ids = 0x00,
+               .mask = PMX_TIMER_1_2_MASK,
+       },
+};
+
+struct pmx_dev pmx_emi_cs_2_3 = {
+       .name = "emi_cs_2_3",
+       .modes = pmx_emi_cs_2_3_modes,
+       .mode_count = ARRAY_SIZE(pmx_emi_cs_2_3_modes),
+       .enb_on_reset = 1,
+};
+
+struct pmx_dev_mode pmx_uart1_modes[] = {
+       {
+               .ids = 0x00,
+               .mask = PMX_FIRDA_MASK,
+       },
+};
+
+struct pmx_dev pmx_uart1 = {
+       .name = "uart1",
+       .modes = pmx_uart1_modes,
+       .mode_count = ARRAY_SIZE(pmx_uart1_modes),
+       .enb_on_reset = 1,
+};
+
+struct pmx_dev_mode pmx_uart2_modes[] = {
+       {
+               .ids = 0x00,
+               .mask = PMX_TIMER_1_2_MASK,
+       },
+};
+
+struct pmx_dev pmx_uart2 = {
+       .name = "uart2",
+       .modes = pmx_uart2_modes,
+       .mode_count = ARRAY_SIZE(pmx_uart2_modes),
+       .enb_on_reset = 1,
+};
+
+struct pmx_dev_mode pmx_uart3_4_5_modes[] = {
+       {
+               .ids = 0x00,
+               .mask = PMX_UART0_MODEM_MASK,
+       },
+};
+
+struct pmx_dev pmx_uart3_4_5 = {
+       .name = "uart3_4_5",
+       .modes = pmx_uart3_4_5_modes,
+       .mode_count = ARRAY_SIZE(pmx_uart3_4_5_modes),
+       .enb_on_reset = 1,
+};
+
+struct pmx_dev_mode pmx_fsmc_modes[] = {
+       {
+               .ids = 0x00,
+               .mask = PMX_SSP_CS_MASK,
+       },
+};
+
+struct pmx_dev pmx_fsmc = {
+       .name = "fsmc",
+       .modes = pmx_fsmc_modes,
+       .mode_count = ARRAY_SIZE(pmx_fsmc_modes),
+       .enb_on_reset = 1,
+};
+
+struct pmx_dev_mode pmx_rs485_0_1_modes[] = {
+       {
+               .ids = 0x00,
+               .mask = PMX_MII_MASK,
+       },
+};
+
+struct pmx_dev pmx_rs485_0_1 = {
+       .name = "rs485_0_1",
+       .modes = pmx_rs485_0_1_modes,
+       .mode_count = ARRAY_SIZE(pmx_rs485_0_1_modes),
+       .enb_on_reset = 1,
+};
+
+struct pmx_dev_mode pmx_tdm0_modes[] = {
+       {
+               .ids = 0x00,
+               .mask = PMX_MII_MASK,
+       },
+};
+
+struct pmx_dev pmx_tdm0 = {
+       .name = "tdm0",
+       .modes = pmx_tdm0_modes,
+       .mode_count = ARRAY_SIZE(pmx_tdm0_modes),
+       .enb_on_reset = 1,
+};
+
+/* pmx driver structure */
+struct pmx_driver pmx_driver = {
+       .mux_reg = {.offset = PAD_MUX_CONFIG_REG, .mask = 0x00007fff},
+};
+
+/* Add spear310 specific devices here */
+
+/* spear3xx shared irq */
+struct shirq_dev_config shirq_ras1_config[] = {
+       {
+               .virq = VIRQ_SMII0,
+               .status_mask = SMII0_IRQ_MASK,
+       }, {
+               .virq = VIRQ_SMII1,
+               .status_mask = SMII1_IRQ_MASK,
+       }, {
+               .virq = VIRQ_SMII2,
+               .status_mask = SMII2_IRQ_MASK,
+       }, {
+               .virq = VIRQ_SMII3,
+               .status_mask = SMII3_IRQ_MASK,
+       }, {
+               .virq = VIRQ_WAKEUP_SMII0,
+               .status_mask = WAKEUP_SMII0_IRQ_MASK,
+       }, {
+               .virq = VIRQ_WAKEUP_SMII1,
+               .status_mask = WAKEUP_SMII1_IRQ_MASK,
+       }, {
+               .virq = VIRQ_WAKEUP_SMII2,
+               .status_mask = WAKEUP_SMII2_IRQ_MASK,
+       }, {
+               .virq = VIRQ_WAKEUP_SMII3,
+               .status_mask = WAKEUP_SMII3_IRQ_MASK,
+       },
+};
+
+struct spear_shirq shirq_ras1 = {
+       .irq = IRQ_GEN_RAS_1,
+       .dev_config = shirq_ras1_config,
+       .dev_count = ARRAY_SIZE(shirq_ras1_config),
+       .regs = {
+               .enb_reg = -1,
+               .status_reg = INT_STS_MASK_REG,
+               .status_reg_mask = SHIRQ_RAS1_MASK,
+               .clear_reg = -1,
+       },
+};
+
+struct shirq_dev_config shirq_ras2_config[] = {
+       {
+               .virq = VIRQ_UART1,
+               .status_mask = UART1_IRQ_MASK,
+       }, {
+               .virq = VIRQ_UART2,
+               .status_mask = UART2_IRQ_MASK,
+       }, {
+               .virq = VIRQ_UART3,
+               .status_mask = UART3_IRQ_MASK,
+       }, {
+               .virq = VIRQ_UART4,
+               .status_mask = UART4_IRQ_MASK,
+       }, {
+               .virq = VIRQ_UART5,
+               .status_mask = UART5_IRQ_MASK,
+       },
+};
+
+struct spear_shirq shirq_ras2 = {
+       .irq = IRQ_GEN_RAS_2,
+       .dev_config = shirq_ras2_config,
+       .dev_count = ARRAY_SIZE(shirq_ras2_config),
+       .regs = {
+               .enb_reg = -1,
+               .status_reg = INT_STS_MASK_REG,
+               .status_reg_mask = SHIRQ_RAS2_MASK,
+               .clear_reg = -1,
+       },
+};
+
+struct shirq_dev_config shirq_ras3_config[] = {
+       {
+               .virq = VIRQ_EMI,
+               .status_mask = EMI_IRQ_MASK,
+       },
+};
+
+struct spear_shirq shirq_ras3 = {
+       .irq = IRQ_GEN_RAS_3,
+       .dev_config = shirq_ras3_config,
+       .dev_count = ARRAY_SIZE(shirq_ras3_config),
+       .regs = {
+               .enb_reg = -1,
+               .status_reg = INT_STS_MASK_REG,
+               .status_reg_mask = SHIRQ_RAS3_MASK,
+               .clear_reg = -1,
+       },
+};
+
+struct shirq_dev_config shirq_intrcomm_ras_config[] = {
+       {
+               .virq = VIRQ_TDM_HDLC,
+               .status_mask = TDM_HDLC_IRQ_MASK,
+       }, {
+               .virq = VIRQ_RS485_0,
+               .status_mask = RS485_0_IRQ_MASK,
+       }, {
+               .virq = VIRQ_RS485_1,
+               .status_mask = RS485_1_IRQ_MASK,
+       },
+};
+
+struct spear_shirq shirq_intrcomm_ras = {
+       .irq = IRQ_INTRCOMM_RAS_ARM,
+       .dev_config = shirq_intrcomm_ras_config,
+       .dev_count = ARRAY_SIZE(shirq_intrcomm_ras_config),
+       .regs = {
+               .enb_reg = -1,
+               .status_reg = INT_STS_MASK_REG,
+               .status_reg_mask = SHIRQ_INTRCOMM_RAS_MASK,
+               .clear_reg = -1,
+       },
+};
+
+/* spear310 routines */
+void __init spear310_init(void)
+{
+       void __iomem *base;
+       int ret = 0;
+
+       /* call spear3xx family common init function */
+       spear3xx_init();
+
+       /* shared irq registeration */
+       base = ioremap(SPEAR310_SOC_CONFIG_BASE, SPEAR310_SOC_CONFIG_SIZE);
+       if (base) {
+               /* shirq 1 */
+               shirq_ras1.regs.base = base;
+               ret = spear_shirq_register(&shirq_ras1);
+               if (ret)
+                       printk(KERN_ERR "Error registering Shared IRQ 1\n");
+
+               /* shirq 2 */
+               shirq_ras2.regs.base = base;
+               ret = spear_shirq_register(&shirq_ras2);
+               if (ret)
+                       printk(KERN_ERR "Error registering Shared IRQ 2\n");
+
+               /* shirq 3 */
+               shirq_ras3.regs.base = base;
+               ret = spear_shirq_register(&shirq_ras3);
+               if (ret)
+                       printk(KERN_ERR "Error registering Shared IRQ 3\n");
+
+               /* shirq 4 */
+               shirq_intrcomm_ras.regs.base = base;
+               ret = spear_shirq_register(&shirq_intrcomm_ras);
+               if (ret)
+                       printk(KERN_ERR "Error registering Shared IRQ 4\n");
+       }
+}
+
+void spear310_pmx_init(void)
+{
+       spear_pmx_init(&pmx_driver, SPEAR310_SOC_CONFIG_BASE,
+                       SPEAR310_SOC_CONFIG_SIZE);
+}
diff --git a/arch/arm/mach-spear3xx/spear310_evb.c b/arch/arm/mach-spear3xx/spear310_evb.c
new file mode 100644 (file)
index 0000000..7facf66
--- /dev/null
@@ -0,0 +1,84 @@
+/*
+ * arch/arm/mach-spear3xx/spear310_evb.c
+ *
+ * SPEAr310 evaluation board source file
+ *
+ * Copyright (C) 2009 ST Microelectronics
+ * Viresh Kumar<viresh.kumar@st.com>
+ *
+ * This file is licensed under the terms of the GNU General Public
+ * License version 2. This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+ */
+
+#include <asm/mach/arch.h>
+#include <asm/mach-types.h>
+#include <mach/generic.h>
+#include <mach/spear.h>
+
+/* padmux devices to enable */
+static struct pmx_dev *pmx_devs[] = {
+       /* spear3xx specific devices */
+       &pmx_i2c,
+       &pmx_ssp,
+       &pmx_gpio_pin0,
+       &pmx_gpio_pin1,
+       &pmx_gpio_pin2,
+       &pmx_gpio_pin3,
+       &pmx_gpio_pin4,
+       &pmx_gpio_pin5,
+       &pmx_uart0,
+
+       /* spear310 specific devices */
+       &pmx_emi_cs_0_1_4_5,
+       &pmx_emi_cs_2_3,
+       &pmx_uart1,
+       &pmx_uart2,
+       &pmx_uart3_4_5,
+       &pmx_fsmc,
+       &pmx_rs485_0_1,
+       &pmx_tdm0,
+};
+
+static struct amba_device *amba_devs[] __initdata = {
+       /* spear3xx specific devices */
+       &gpio_device,
+       &uart_device,
+
+       /* spear310 specific devices */
+};
+
+static struct platform_device *plat_devs[] __initdata = {
+       /* spear3xx specific devices */
+
+       /* spear310 specific devices */
+};
+
+static void __init spear310_evb_init(void)
+{
+       unsigned int i;
+
+       /* call spear310 machine init function */
+       spear310_init();
+
+       /* padmux initialization */
+       pmx_driver.mode = NULL;
+       pmx_driver.devs = pmx_devs;
+       pmx_driver.devs_count = ARRAY_SIZE(pmx_devs);
+       spear310_pmx_init();
+
+       /* Add Platform Devices */
+       platform_add_devices(plat_devs, ARRAY_SIZE(plat_devs));
+
+       /* Add Amba Devices */
+       for (i = 0; i < ARRAY_SIZE(amba_devs); i++)
+               amba_device_register(amba_devs[i], &iomem_resource);
+}
+
+MACHINE_START(SPEAR310, "ST-SPEAR310-EVB")
+       .boot_params    =       0x00000100,
+       .map_io         =       spear3xx_map_io,
+       .init_irq       =       spear3xx_init_irq,
+       .timer          =       &spear_sys_timer,
+       .init_machine   =       spear310_evb_init,
+MACHINE_END
diff --git a/arch/arm/mach-spear3xx/spear320.c b/arch/arm/mach-spear3xx/spear320.c
new file mode 100644 (file)
index 0000000..6a12195
--- /dev/null
@@ -0,0 +1,549 @@
+/*
+ * arch/arm/mach-spear3xx/spear320.c
+ *
+ * SPEAr320 machine source file
+ *
+ * Copyright (C) 2009 ST Microelectronics
+ * Viresh Kumar<viresh.kumar@st.com>
+ *
+ * This file is licensed under the terms of the GNU General Public
+ * License version 2. This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+ */
+
+#include <linux/ptrace.h>
+#include <asm/irq.h>
+#include <mach/generic.h>
+#include <mach/spear.h>
+#include <plat/shirq.h>
+
+/* pad multiplexing support */
+/* muxing registers */
+#define PAD_MUX_CONFIG_REG     0x0C
+#define MODE_CONFIG_REG                0x10
+
+/* modes */
+#define AUTO_NET_SMII_MODE     (1 << 0)
+#define AUTO_NET_MII_MODE      (1 << 1)
+#define AUTO_EXP_MODE          (1 << 2)
+#define SMALL_PRINTERS_MODE    (1 << 3)
+#define ALL_MODES              0xF
+
+struct pmx_mode auto_net_smii_mode = {
+       .id = AUTO_NET_SMII_MODE,
+       .name = "Automation Networking SMII Mode",
+       .mask = 0x00,
+};
+
+struct pmx_mode auto_net_mii_mode = {
+       .id = AUTO_NET_MII_MODE,
+       .name = "Automation Networking MII Mode",
+       .mask = 0x01,
+};
+
+struct pmx_mode auto_exp_mode = {
+       .id = AUTO_EXP_MODE,
+       .name = "Automation Expanded Mode",
+       .mask = 0x02,
+};
+
+struct pmx_mode small_printers_mode = {
+       .id = SMALL_PRINTERS_MODE,
+       .name = "Small Printers Mode",
+       .mask = 0x03,
+};
+
+/* devices */
+struct pmx_dev_mode pmx_clcd_modes[] = {
+       {
+               .ids = AUTO_NET_SMII_MODE,
+               .mask = 0x0,
+       },
+};
+
+struct pmx_dev pmx_clcd = {
+       .name = "clcd",
+       .modes = pmx_clcd_modes,
+       .mode_count = ARRAY_SIZE(pmx_clcd_modes),
+       .enb_on_reset = 1,
+};
+
+struct pmx_dev_mode pmx_emi_modes[] = {
+       {
+               .ids = AUTO_EXP_MODE,
+               .mask = PMX_TIMER_1_2_MASK | PMX_TIMER_3_4_MASK,
+       },
+};
+
+struct pmx_dev pmx_emi = {
+       .name = "emi",
+       .modes = pmx_emi_modes,
+       .mode_count = ARRAY_SIZE(pmx_emi_modes),
+       .enb_on_reset = 1,
+};
+
+struct pmx_dev_mode pmx_fsmc_modes[] = {
+       {
+               .ids = ALL_MODES,
+               .mask = 0x0,
+       },
+};
+
+struct pmx_dev pmx_fsmc = {
+       .name = "fsmc",
+       .modes = pmx_fsmc_modes,
+       .mode_count = ARRAY_SIZE(pmx_fsmc_modes),
+       .enb_on_reset = 1,
+};
+
+struct pmx_dev_mode pmx_spp_modes[] = {
+       {
+               .ids = SMALL_PRINTERS_MODE,
+               .mask = 0x0,
+       },
+};
+
+struct pmx_dev pmx_spp = {
+       .name = "spp",
+       .modes = pmx_spp_modes,
+       .mode_count = ARRAY_SIZE(pmx_spp_modes),
+       .enb_on_reset = 1,
+};
+
+struct pmx_dev_mode pmx_sdio_modes[] = {
+       {
+               .ids = AUTO_NET_SMII_MODE | AUTO_NET_MII_MODE |
+                       SMALL_PRINTERS_MODE,
+               .mask = PMX_TIMER_1_2_MASK | PMX_TIMER_3_4_MASK,
+       },
+};
+
+struct pmx_dev pmx_sdio = {
+       .name = "sdio",
+       .modes = pmx_sdio_modes,
+       .mode_count = ARRAY_SIZE(pmx_sdio_modes),
+       .enb_on_reset = 1,
+};
+
+struct pmx_dev_mode pmx_i2s_modes[] = {
+       {
+               .ids = AUTO_NET_SMII_MODE | AUTO_NET_MII_MODE,
+               .mask = PMX_UART0_MODEM_MASK,
+       },
+};
+
+struct pmx_dev pmx_i2s = {
+       .name = "i2s",
+       .modes = pmx_i2s_modes,
+       .mode_count = ARRAY_SIZE(pmx_i2s_modes),
+       .enb_on_reset = 1,
+};
+
+struct pmx_dev_mode pmx_uart1_modes[] = {
+       {
+               .ids = ALL_MODES,
+               .mask = PMX_GPIO_PIN0_MASK | PMX_GPIO_PIN1_MASK,
+       },
+};
+
+struct pmx_dev pmx_uart1 = {
+       .name = "uart1",
+       .modes = pmx_uart1_modes,
+       .mode_count = ARRAY_SIZE(pmx_uart1_modes),
+       .enb_on_reset = 1,
+};
+
+struct pmx_dev_mode pmx_uart1_modem_modes[] = {
+       {
+               .ids = AUTO_EXP_MODE,
+               .mask = PMX_TIMER_1_2_MASK | PMX_TIMER_3_4_MASK |
+                       PMX_SSP_CS_MASK,
+       }, {
+               .ids = SMALL_PRINTERS_MODE,
+               .mask = PMX_GPIO_PIN3_MASK | PMX_GPIO_PIN4_MASK |
+                       PMX_GPIO_PIN5_MASK | PMX_SSP_CS_MASK,
+       },
+};
+
+struct pmx_dev pmx_uart1_modem = {
+       .name = "uart1_modem",
+       .modes = pmx_uart1_modem_modes,
+       .mode_count = ARRAY_SIZE(pmx_uart1_modem_modes),
+       .enb_on_reset = 1,
+};
+
+struct pmx_dev_mode pmx_uart2_modes[] = {
+       {
+               .ids = ALL_MODES,
+               .mask = PMX_FIRDA_MASK,
+       },
+};
+
+struct pmx_dev pmx_uart2 = {
+       .name = "uart2",
+       .modes = pmx_uart2_modes,
+       .mode_count = ARRAY_SIZE(pmx_uart2_modes),
+       .enb_on_reset = 1,
+};
+
+struct pmx_dev_mode pmx_touchscreen_modes[] = {
+       {
+               .ids = AUTO_NET_SMII_MODE,
+               .mask = PMX_SSP_CS_MASK,
+       },
+};
+
+struct pmx_dev pmx_touchscreen = {
+       .name = "touchscreen",
+       .modes = pmx_touchscreen_modes,
+       .mode_count = ARRAY_SIZE(pmx_touchscreen_modes),
+       .enb_on_reset = 1,
+};
+
+struct pmx_dev_mode pmx_can_modes[] = {
+       {
+               .ids = AUTO_NET_SMII_MODE | AUTO_NET_MII_MODE | AUTO_EXP_MODE,
+               .mask = PMX_GPIO_PIN2_MASK | PMX_GPIO_PIN3_MASK |
+                       PMX_GPIO_PIN4_MASK | PMX_GPIO_PIN5_MASK,
+       },
+};
+
+struct pmx_dev pmx_can = {
+       .name = "can",
+       .modes = pmx_can_modes,
+       .mode_count = ARRAY_SIZE(pmx_can_modes),
+       .enb_on_reset = 1,
+};
+
+struct pmx_dev_mode pmx_sdio_led_modes[] = {
+       {
+               .ids = AUTO_NET_SMII_MODE | AUTO_NET_MII_MODE,
+               .mask = PMX_SSP_CS_MASK,
+       },
+};
+
+struct pmx_dev pmx_sdio_led = {
+       .name = "sdio_led",
+       .modes = pmx_sdio_led_modes,
+       .mode_count = ARRAY_SIZE(pmx_sdio_led_modes),
+       .enb_on_reset = 1,
+};
+
+struct pmx_dev_mode pmx_pwm0_modes[] = {
+       {
+               .ids = AUTO_NET_SMII_MODE | AUTO_NET_MII_MODE,
+               .mask = PMX_UART0_MODEM_MASK,
+       }, {
+               .ids = AUTO_EXP_MODE | SMALL_PRINTERS_MODE,
+               .mask = PMX_MII_MASK,
+       },
+};
+
+struct pmx_dev pmx_pwm0 = {
+       .name = "pwm0",
+       .modes = pmx_pwm0_modes,
+       .mode_count = ARRAY_SIZE(pmx_pwm0_modes),
+       .enb_on_reset = 1,
+};
+
+struct pmx_dev_mode pmx_pwm1_modes[] = {
+       {
+               .ids = AUTO_NET_SMII_MODE | AUTO_NET_MII_MODE,
+               .mask = PMX_UART0_MODEM_MASK,
+       }, {
+               .ids = AUTO_EXP_MODE | SMALL_PRINTERS_MODE,
+               .mask = PMX_MII_MASK,
+       },
+};
+
+struct pmx_dev pmx_pwm1 = {
+       .name = "pwm1",
+       .modes = pmx_pwm1_modes,
+       .mode_count = ARRAY_SIZE(pmx_pwm1_modes),
+       .enb_on_reset = 1,
+};
+
+struct pmx_dev_mode pmx_pwm2_modes[] = {
+       {
+               .ids = AUTO_NET_SMII_MODE | AUTO_NET_MII_MODE,
+               .mask = PMX_SSP_CS_MASK,
+       }, {
+               .ids = AUTO_EXP_MODE | SMALL_PRINTERS_MODE,
+               .mask = PMX_MII_MASK,
+       },
+};
+
+struct pmx_dev pmx_pwm2 = {
+       .name = "pwm2",
+       .modes = pmx_pwm2_modes,
+       .mode_count = ARRAY_SIZE(pmx_pwm2_modes),
+       .enb_on_reset = 1,
+};
+
+struct pmx_dev_mode pmx_pwm3_modes[] = {
+       {
+               .ids = AUTO_EXP_MODE | SMALL_PRINTERS_MODE | AUTO_NET_SMII_MODE,
+               .mask = PMX_MII_MASK,
+       },
+};
+
+struct pmx_dev pmx_pwm3 = {
+       .name = "pwm3",
+       .modes = pmx_pwm3_modes,
+       .mode_count = ARRAY_SIZE(pmx_pwm3_modes),
+       .enb_on_reset = 1,
+};
+
+struct pmx_dev_mode pmx_ssp1_modes[] = {
+       {
+               .ids = SMALL_PRINTERS_MODE | AUTO_NET_SMII_MODE,
+               .mask = PMX_MII_MASK,
+       },
+};
+
+struct pmx_dev pmx_ssp1 = {
+       .name = "ssp1",
+       .modes = pmx_ssp1_modes,
+       .mode_count = ARRAY_SIZE(pmx_ssp1_modes),
+       .enb_on_reset = 1,
+};
+
+struct pmx_dev_mode pmx_ssp2_modes[] = {
+       {
+               .ids = AUTO_NET_SMII_MODE,
+               .mask = PMX_MII_MASK,
+       },
+};
+
+struct pmx_dev pmx_ssp2 = {
+       .name = "ssp2",
+       .modes = pmx_ssp2_modes,
+       .mode_count = ARRAY_SIZE(pmx_ssp2_modes),
+       .enb_on_reset = 1,
+};
+
+struct pmx_dev_mode pmx_mii1_modes[] = {
+       {
+               .ids = AUTO_NET_MII_MODE,
+               .mask = 0x0,
+       },
+};
+
+struct pmx_dev pmx_mii1 = {
+       .name = "mii1",
+       .modes = pmx_mii1_modes,
+       .mode_count = ARRAY_SIZE(pmx_mii1_modes),
+       .enb_on_reset = 1,
+};
+
+struct pmx_dev_mode pmx_smii0_modes[] = {
+       {
+               .ids = AUTO_NET_SMII_MODE | AUTO_EXP_MODE | SMALL_PRINTERS_MODE,
+               .mask = PMX_MII_MASK,
+       },
+};
+
+struct pmx_dev pmx_smii0 = {
+       .name = "smii0",
+       .modes = pmx_smii0_modes,
+       .mode_count = ARRAY_SIZE(pmx_smii0_modes),
+       .enb_on_reset = 1,
+};
+
+struct pmx_dev_mode pmx_smii1_modes[] = {
+       {
+               .ids = AUTO_NET_SMII_MODE | SMALL_PRINTERS_MODE,
+               .mask = PMX_MII_MASK,
+       },
+};
+
+struct pmx_dev pmx_smii1 = {
+       .name = "smii1",
+       .modes = pmx_smii1_modes,
+       .mode_count = ARRAY_SIZE(pmx_smii1_modes),
+       .enb_on_reset = 1,
+};
+
+struct pmx_dev_mode pmx_i2c1_modes[] = {
+       {
+               .ids = AUTO_EXP_MODE,
+               .mask = 0x0,
+       },
+};
+
+struct pmx_dev pmx_i2c1 = {
+       .name = "i2c1",
+       .modes = pmx_i2c1_modes,
+       .mode_count = ARRAY_SIZE(pmx_i2c1_modes),
+       .enb_on_reset = 1,
+};
+
+/* pmx driver structure */
+struct pmx_driver pmx_driver = {
+       .mode_reg = {.offset = MODE_CONFIG_REG, .mask = 0x00000007},
+       .mux_reg = {.offset = PAD_MUX_CONFIG_REG, .mask = 0x00007fff},
+};
+
+/* Add spear320 specific devices here */
+
+/* spear3xx shared irq */
+struct shirq_dev_config shirq_ras1_config[] = {
+       {
+               .virq = VIRQ_EMI,
+               .status_mask = EMI_IRQ_MASK,
+               .clear_mask = EMI_IRQ_MASK,
+       }, {
+               .virq = VIRQ_CLCD,
+               .status_mask = CLCD_IRQ_MASK,
+               .clear_mask = CLCD_IRQ_MASK,
+       }, {
+               .virq = VIRQ_SPP,
+               .status_mask = SPP_IRQ_MASK,
+               .clear_mask = SPP_IRQ_MASK,
+       },
+};
+
+struct spear_shirq shirq_ras1 = {
+       .irq = IRQ_GEN_RAS_1,
+       .dev_config = shirq_ras1_config,
+       .dev_count = ARRAY_SIZE(shirq_ras1_config),
+       .regs = {
+               .enb_reg = -1,
+               .status_reg = INT_STS_MASK_REG,
+               .status_reg_mask = SHIRQ_RAS1_MASK,
+               .clear_reg = INT_CLR_MASK_REG,
+               .reset_to_clear = 1,
+       },
+};
+
+struct shirq_dev_config shirq_ras3_config[] = {
+       {
+               .virq = VIRQ_PLGPIO,
+               .enb_mask = GPIO_IRQ_MASK,
+               .status_mask = GPIO_IRQ_MASK,
+               .clear_mask = GPIO_IRQ_MASK,
+       }, {
+               .virq = VIRQ_I2S_PLAY,
+               .enb_mask = I2S_PLAY_IRQ_MASK,
+               .status_mask = I2S_PLAY_IRQ_MASK,
+               .clear_mask = I2S_PLAY_IRQ_MASK,
+       }, {
+               .virq = VIRQ_I2S_REC,
+               .enb_mask = I2S_REC_IRQ_MASK,
+               .status_mask = I2S_REC_IRQ_MASK,
+               .clear_mask = I2S_REC_IRQ_MASK,
+       },
+};
+
+struct spear_shirq shirq_ras3 = {
+       .irq = IRQ_GEN_RAS_3,
+       .dev_config = shirq_ras3_config,
+       .dev_count = ARRAY_SIZE(shirq_ras3_config),
+       .regs = {
+               .enb_reg = INT_ENB_MASK_REG,
+               .reset_to_enb = 1,
+               .status_reg = INT_STS_MASK_REG,
+               .status_reg_mask = SHIRQ_RAS3_MASK,
+               .clear_reg = INT_CLR_MASK_REG,
+               .reset_to_clear = 1,
+       },
+};
+
+struct shirq_dev_config shirq_intrcomm_ras_config[] = {
+       {
+               .virq = VIRQ_CANU,
+               .status_mask = CAN_U_IRQ_MASK,
+               .clear_mask = CAN_U_IRQ_MASK,
+       }, {
+               .virq = VIRQ_CANL,
+               .status_mask = CAN_L_IRQ_MASK,
+               .clear_mask = CAN_L_IRQ_MASK,
+       }, {
+               .virq = VIRQ_UART1,
+               .status_mask = UART1_IRQ_MASK,
+               .clear_mask = UART1_IRQ_MASK,
+       }, {
+               .virq = VIRQ_UART2,
+               .status_mask = UART2_IRQ_MASK,
+               .clear_mask = UART2_IRQ_MASK,
+       }, {
+               .virq = VIRQ_SSP1,
+               .status_mask = SSP1_IRQ_MASK,
+               .clear_mask = SSP1_IRQ_MASK,
+       }, {
+               .virq = VIRQ_SSP2,
+               .status_mask = SSP2_IRQ_MASK,
+               .clear_mask = SSP2_IRQ_MASK,
+       }, {
+               .virq = VIRQ_SMII0,
+               .status_mask = SMII0_IRQ_MASK,
+               .clear_mask = SMII0_IRQ_MASK,
+       }, {
+               .virq = VIRQ_MII1_SMII1,
+               .status_mask = MII1_SMII1_IRQ_MASK,
+               .clear_mask = MII1_SMII1_IRQ_MASK,
+       }, {
+               .virq = VIRQ_WAKEUP_SMII0,
+               .status_mask = WAKEUP_SMII0_IRQ_MASK,
+               .clear_mask = WAKEUP_SMII0_IRQ_MASK,
+       }, {
+               .virq = VIRQ_WAKEUP_MII1_SMII1,
+               .status_mask = WAKEUP_MII1_SMII1_IRQ_MASK,
+               .clear_mask = WAKEUP_MII1_SMII1_IRQ_MASK,
+       }, {
+               .virq = VIRQ_I2C,
+               .status_mask = I2C1_IRQ_MASK,
+               .clear_mask = I2C1_IRQ_MASK,
+       },
+};
+
+struct spear_shirq shirq_intrcomm_ras = {
+       .irq = IRQ_INTRCOMM_RAS_ARM,
+       .dev_config = shirq_intrcomm_ras_config,
+       .dev_count = ARRAY_SIZE(shirq_intrcomm_ras_config),
+       .regs = {
+               .enb_reg = -1,
+               .status_reg = INT_STS_MASK_REG,
+               .status_reg_mask = SHIRQ_INTRCOMM_RAS_MASK,
+               .clear_reg = INT_CLR_MASK_REG,
+               .reset_to_clear = 1,
+       },
+};
+
+/* spear320 routines */
+void __init spear320_init(void)
+{
+       void __iomem *base;
+       int ret = 0;
+
+       /* call spear3xx family common init function */
+       spear3xx_init();
+
+       /* shared irq registeration */
+       base = ioremap(SPEAR320_SOC_CONFIG_BASE, SPEAR320_SOC_CONFIG_SIZE);
+       if (base) {
+               /* shirq 1 */
+               shirq_ras1.regs.base = base;
+               ret = spear_shirq_register(&shirq_ras1);
+               if (ret)
+                       printk(KERN_ERR "Error registering Shared IRQ 1\n");
+
+               /* shirq 3 */
+               shirq_ras3.regs.base = base;
+               ret = spear_shirq_register(&shirq_ras3);
+               if (ret)
+                       printk(KERN_ERR "Error registering Shared IRQ 3\n");
+
+               /* shirq 4 */
+               shirq_intrcomm_ras.regs.base = base;
+               ret = spear_shirq_register(&shirq_intrcomm_ras);
+               if (ret)
+                       printk(KERN_ERR "Error registering Shared IRQ 4\n");
+       }
+}
+
+void spear320_pmx_init(void)
+{
+       spear_pmx_init(&pmx_driver, SPEAR320_SOC_CONFIG_BASE,
+                       SPEAR320_SOC_CONFIG_SIZE);
+}
diff --git a/arch/arm/mach-spear3xx/spear320_evb.c b/arch/arm/mach-spear3xx/spear320_evb.c
new file mode 100644 (file)
index 0000000..62ac685
--- /dev/null
@@ -0,0 +1,81 @@
+/*
+ * arch/arm/mach-spear3xx/spear320_evb.c
+ *
+ * SPEAr320 evaluation board source file
+ *
+ * Copyright (C) 2009 ST Microelectronics
+ * Viresh Kumar<viresh.kumar@st.com>
+ *
+ * This file is licensed under the terms of the GNU General Public
+ * License version 2. This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+ */
+
+#include <asm/mach/arch.h>
+#include <asm/mach-types.h>
+#include <mach/generic.h>
+#include <mach/spear.h>
+
+/* padmux devices to enable */
+static struct pmx_dev *pmx_devs[] = {
+       /* spear3xx specific devices */
+       &pmx_i2c,
+       &pmx_ssp,
+       &pmx_mii,
+       &pmx_uart0,
+
+       /* spear320 specific devices */
+       &pmx_fsmc,
+       &pmx_sdio,
+       &pmx_i2s,
+       &pmx_uart1,
+       &pmx_uart2,
+       &pmx_can,
+       &pmx_pwm0,
+       &pmx_pwm1,
+       &pmx_pwm2,
+       &pmx_mii1,
+};
+
+static struct amba_device *amba_devs[] __initdata = {
+       /* spear3xx specific devices */
+       &gpio_device,
+       &uart_device,
+
+       /* spear320 specific devices */
+};
+
+static struct platform_device *plat_devs[] __initdata = {
+       /* spear3xx specific devices */
+
+       /* spear320 specific devices */
+};
+
+static void __init spear320_evb_init(void)
+{
+       unsigned int i;
+
+       /* call spear320 machine init function */
+       spear320_init();
+
+       /* padmux initialization */
+       pmx_driver.mode = &auto_net_mii_mode;
+       pmx_driver.devs = pmx_devs;
+       pmx_driver.devs_count = ARRAY_SIZE(pmx_devs);
+       spear320_pmx_init();
+
+       /* Add Platform Devices */
+       platform_add_devices(plat_devs, ARRAY_SIZE(plat_devs));
+
+       /* Add Amba Devices */
+       for (i = 0; i < ARRAY_SIZE(amba_devs); i++)
+               amba_device_register(amba_devs[i], &iomem_resource);
+}
+
+MACHINE_START(SPEAR320, "ST-SPEAR320-EVB")
+       .boot_params    =       0x00000100,
+       .map_io         =       spear3xx_map_io,
+       .init_irq       =       spear3xx_init_irq,
+       .timer          =       &spear_sys_timer,
+       .init_machine   =       spear320_evb_init,
+MACHINE_END
diff --git a/arch/arm/mach-spear3xx/spear3xx.c b/arch/arm/mach-spear3xx/spear3xx.c
new file mode 100644 (file)
index 0000000..e87313a
--- /dev/null
@@ -0,0 +1,548 @@
+/*
+ * arch/arm/mach-spear3xx/spear3xx.c
+ *
+ * SPEAr3XX machines common source file
+ *
+ * Copyright (C) 2009 ST Microelectronics
+ * Viresh Kumar<viresh.kumar@st.com>
+ *
+ * This file is licensed under the terms of the GNU General Public
+ * License version 2. This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+ */
+
+#include <linux/types.h>
+#include <linux/amba/pl061.h>
+#include <linux/ptrace.h>
+#include <linux/io.h>
+#include <asm/hardware/vic.h>
+#include <asm/irq.h>
+#include <asm/mach/arch.h>
+#include <mach/generic.h>
+#include <mach/spear.h>
+
+/* Add spear3xx machines common devices here */
+/* gpio device registeration */
+static struct pl061_platform_data gpio_plat_data = {
+       .gpio_base      = 0,
+       .irq_base       = SPEAR_GPIO_INT_BASE,
+};
+
+struct amba_device gpio_device = {
+       .dev = {
+               .init_name = "gpio",
+               .platform_data = &gpio_plat_data,
+       },
+       .res = {
+               .start = SPEAR3XX_ICM3_GPIO_BASE,
+               .end = SPEAR3XX_ICM3_GPIO_BASE + SPEAR3XX_ICM3_GPIO_SIZE - 1,
+               .flags = IORESOURCE_MEM,
+       },
+       .irq = {IRQ_BASIC_GPIO, NO_IRQ},
+};
+
+/* uart device registeration */
+struct amba_device uart_device = {
+       .dev = {
+               .init_name = "uart",
+       },
+       .res = {
+               .start = SPEAR3XX_ICM1_UART_BASE,
+               .end = SPEAR3XX_ICM1_UART_BASE + SPEAR3XX_ICM1_UART_SIZE - 1,
+               .flags = IORESOURCE_MEM,
+       },
+       .irq = {IRQ_UART, NO_IRQ},
+};
+
+/* Do spear3xx familiy common initialization part here */
+void __init spear3xx_init(void)
+{
+       /* nothing to do for now */
+}
+
+/* This will initialize vic */
+void __init spear3xx_init_irq(void)
+{
+       vic_init((void __iomem *)VA_SPEAR3XX_ML1_VIC_BASE, 0, ~0, 0);
+}
+
+/* Following will create static virtual/physical mappings */
+struct map_desc spear3xx_io_desc[] __initdata = {
+       {
+               .virtual        = VA_SPEAR3XX_ICM1_UART_BASE,
+               .pfn            = __phys_to_pfn(SPEAR3XX_ICM1_UART_BASE),
+               .length         = SPEAR3XX_ICM1_UART_SIZE,
+               .type           = MT_DEVICE
+       }, {
+               .virtual        = VA_SPEAR3XX_ML1_VIC_BASE,
+               .pfn            = __phys_to_pfn(SPEAR3XX_ML1_VIC_BASE),
+               .length         = SPEAR3XX_ML1_VIC_SIZE,
+               .type           = MT_DEVICE
+       }, {
+               .virtual        = VA_SPEAR3XX_ICM3_SYS_CTRL_BASE,
+               .pfn            = __phys_to_pfn(SPEAR3XX_ICM3_SYS_CTRL_BASE),
+               .length         = SPEAR3XX_ICM3_SYS_CTRL_SIZE,
+               .type           = MT_DEVICE
+       }, {
+               .virtual        = VA_SPEAR3XX_ICM3_MISC_REG_BASE,
+               .pfn            = __phys_to_pfn(SPEAR3XX_ICM3_MISC_REG_BASE),
+               .length         = SPEAR3XX_ICM3_MISC_REG_SIZE,
+               .type           = MT_DEVICE
+       },
+};
+
+/* This will create static memory mapping for selected devices */
+void __init spear3xx_map_io(void)
+{
+       iotable_init(spear3xx_io_desc, ARRAY_SIZE(spear3xx_io_desc));
+
+       /* This will initialize clock framework */
+       clk_init();
+}
+
+/* pad multiplexing support */
+/* devices */
+struct pmx_dev_mode pmx_firda_modes[] = {
+       {
+               .ids = 0xffffffff,
+               .mask = PMX_FIRDA_MASK,
+       },
+};
+
+struct pmx_dev pmx_firda = {
+       .name = "firda",
+       .modes = pmx_firda_modes,
+       .mode_count = ARRAY_SIZE(pmx_firda_modes),
+       .enb_on_reset = 0,
+};
+
+struct pmx_dev_mode pmx_i2c_modes[] = {
+       {
+               .ids = 0xffffffff,
+               .mask = PMX_I2C_MASK,
+       },
+};
+
+struct pmx_dev pmx_i2c = {
+       .name = "i2c",
+       .modes = pmx_i2c_modes,
+       .mode_count = ARRAY_SIZE(pmx_i2c_modes),
+       .enb_on_reset = 0,
+};
+
+struct pmx_dev_mode pmx_ssp_cs_modes[] = {
+       {
+               .ids = 0xffffffff,
+               .mask = PMX_SSP_CS_MASK,
+       },
+};
+
+struct pmx_dev pmx_ssp_cs = {
+       .name = "ssp_chip_selects",
+       .modes = pmx_ssp_cs_modes,
+       .mode_count = ARRAY_SIZE(pmx_ssp_cs_modes),
+       .enb_on_reset = 0,
+};
+
+struct pmx_dev_mode pmx_ssp_modes[] = {
+       {
+               .ids = 0xffffffff,
+               .mask = PMX_SSP_MASK,
+       },
+};
+
+struct pmx_dev pmx_ssp = {
+       .name = "ssp",
+       .modes = pmx_ssp_modes,
+       .mode_count = ARRAY_SIZE(pmx_ssp_modes),
+       .enb_on_reset = 0,
+};
+
+struct pmx_dev_mode pmx_mii_modes[] = {
+       {
+               .ids = 0xffffffff,
+               .mask = PMX_MII_MASK,
+       },
+};
+
+struct pmx_dev pmx_mii = {
+       .name = "mii",
+       .modes = pmx_mii_modes,
+       .mode_count = ARRAY_SIZE(pmx_mii_modes),
+       .enb_on_reset = 0,
+};
+
+struct pmx_dev_mode pmx_gpio_pin0_modes[] = {
+       {
+               .ids = 0xffffffff,
+               .mask = PMX_GPIO_PIN0_MASK,
+       },
+};
+
+struct pmx_dev pmx_gpio_pin0 = {
+       .name = "gpio_pin0",
+       .modes = pmx_gpio_pin0_modes,
+       .mode_count = ARRAY_SIZE(pmx_gpio_pin0_modes),
+       .enb_on_reset = 0,
+};
+
+struct pmx_dev_mode pmx_gpio_pin1_modes[] = {
+       {
+               .ids = 0xffffffff,
+               .mask = PMX_GPIO_PIN1_MASK,
+       },
+};
+
+struct pmx_dev pmx_gpio_pin1 = {
+       .name = "gpio_pin1",
+       .modes = pmx_gpio_pin1_modes,
+       .mode_count = ARRAY_SIZE(pmx_gpio_pin1_modes),
+       .enb_on_reset = 0,
+};
+
+struct pmx_dev_mode pmx_gpio_pin2_modes[] = {
+       {
+               .ids = 0xffffffff,
+               .mask = PMX_GPIO_PIN2_MASK,
+       },
+};
+
+struct pmx_dev pmx_gpio_pin2 = {
+       .name = "gpio_pin2",
+       .modes = pmx_gpio_pin2_modes,
+       .mode_count = ARRAY_SIZE(pmx_gpio_pin2_modes),
+       .enb_on_reset = 0,
+};
+
+struct pmx_dev_mode pmx_gpio_pin3_modes[] = {
+       {
+               .ids = 0xffffffff,
+               .mask = PMX_GPIO_PIN3_MASK,
+       },
+};
+
+struct pmx_dev pmx_gpio_pin3 = {
+       .name = "gpio_pin3",
+       .modes = pmx_gpio_pin3_modes,
+       .mode_count = ARRAY_SIZE(pmx_gpio_pin3_modes),
+       .enb_on_reset = 0,
+};
+
+struct pmx_dev_mode pmx_gpio_pin4_modes[] = {
+       {
+               .ids = 0xffffffff,
+               .mask = PMX_GPIO_PIN4_MASK,
+       },
+};
+
+struct pmx_dev pmx_gpio_pin4 = {
+       .name = "gpio_pin4",
+       .modes = pmx_gpio_pin4_modes,
+       .mode_count = ARRAY_SIZE(pmx_gpio_pin4_modes),
+       .enb_on_reset = 0,
+};
+
+struct pmx_dev_mode pmx_gpio_pin5_modes[] = {
+       {
+               .ids = 0xffffffff,
+               .mask = PMX_GPIO_PIN5_MASK,
+       },
+};
+
+struct pmx_dev pmx_gpio_pin5 = {
+       .name = "gpio_pin5",
+       .modes = pmx_gpio_pin5_modes,
+       .mode_count = ARRAY_SIZE(pmx_gpio_pin5_modes),
+       .enb_on_reset = 0,
+};
+
+struct pmx_dev_mode pmx_uart0_modem_modes[] = {
+       {
+               .ids = 0xffffffff,
+               .mask = PMX_UART0_MODEM_MASK,
+       },
+};
+
+struct pmx_dev pmx_uart0_modem = {
+       .name = "uart0_modem",
+       .modes = pmx_uart0_modem_modes,
+       .mode_count = ARRAY_SIZE(pmx_uart0_modem_modes),
+       .enb_on_reset = 0,
+};
+
+struct pmx_dev_mode pmx_uart0_modes[] = {
+       {
+               .ids = 0xffffffff,
+               .mask = PMX_UART0_MASK,
+       },
+};
+
+struct pmx_dev pmx_uart0 = {
+       .name = "uart0",
+       .modes = pmx_uart0_modes,
+       .mode_count = ARRAY_SIZE(pmx_uart0_modes),
+       .enb_on_reset = 0,
+};
+
+struct pmx_dev_mode pmx_timer_3_4_modes[] = {
+       {
+               .ids = 0xffffffff,
+               .mask = PMX_TIMER_3_4_MASK,
+       },
+};
+
+struct pmx_dev pmx_timer_3_4 = {
+       .name = "timer_3_4",
+       .modes = pmx_timer_3_4_modes,
+       .mode_count = ARRAY_SIZE(pmx_timer_3_4_modes),
+       .enb_on_reset = 0,
+};
+
+struct pmx_dev_mode pmx_timer_1_2_modes[] = {
+       {
+               .ids = 0xffffffff,
+               .mask = PMX_TIMER_1_2_MASK,
+       },
+};
+
+struct pmx_dev pmx_timer_1_2 = {
+       .name = "timer_1_2",
+       .modes = pmx_timer_1_2_modes,
+       .mode_count = ARRAY_SIZE(pmx_timer_1_2_modes),
+       .enb_on_reset = 0,
+};
+
+#if defined(CONFIG_MACH_SPEAR310) || defined(CONFIG_MACH_SPEAR320)
+/* plgpios devices */
+struct pmx_dev_mode pmx_plgpio_0_1_modes[] = {
+       {
+               .ids = 0x00,
+               .mask = PMX_FIRDA_MASK,
+       },
+};
+
+struct pmx_dev pmx_plgpio_0_1 = {
+       .name = "plgpio 0 and 1",
+       .modes = pmx_plgpio_0_1_modes,
+       .mode_count = ARRAY_SIZE(pmx_plgpio_0_1_modes),
+       .enb_on_reset = 1,
+};
+
+struct pmx_dev_mode pmx_plgpio_2_3_modes[] = {
+       {
+               .ids = 0x00,
+               .mask = PMX_UART0_MASK,
+       },
+};
+
+struct pmx_dev pmx_plgpio_2_3 = {
+       .name = "plgpio 2 and 3",
+       .modes = pmx_plgpio_2_3_modes,
+       .mode_count = ARRAY_SIZE(pmx_plgpio_2_3_modes),
+       .enb_on_reset = 1,
+};
+
+struct pmx_dev_mode pmx_plgpio_4_5_modes[] = {
+       {
+               .ids = 0x00,
+               .mask = PMX_I2C_MASK,
+       },
+};
+
+struct pmx_dev pmx_plgpio_4_5 = {
+       .name = "plgpio 4 and 5",
+       .modes = pmx_plgpio_4_5_modes,
+       .mode_count = ARRAY_SIZE(pmx_plgpio_4_5_modes),
+       .enb_on_reset = 1,
+};
+
+struct pmx_dev_mode pmx_plgpio_6_9_modes[] = {
+       {
+               .ids = 0x00,
+               .mask = PMX_SSP_MASK,
+       },
+};
+
+struct pmx_dev pmx_plgpio_6_9 = {
+       .name = "plgpio 6 to 9",
+       .modes = pmx_plgpio_6_9_modes,
+       .mode_count = ARRAY_SIZE(pmx_plgpio_6_9_modes),
+       .enb_on_reset = 1,
+};
+
+struct pmx_dev_mode pmx_plgpio_10_27_modes[] = {
+       {
+               .ids = 0x00,
+               .mask = PMX_MII_MASK,
+       },
+};
+
+struct pmx_dev pmx_plgpio_10_27 = {
+       .name = "plgpio 10 to 27",
+       .modes = pmx_plgpio_10_27_modes,
+       .mode_count = ARRAY_SIZE(pmx_plgpio_10_27_modes),
+       .enb_on_reset = 1,
+};
+
+struct pmx_dev_mode pmx_plgpio_28_modes[] = {
+       {
+               .ids = 0x00,
+               .mask = PMX_GPIO_PIN0_MASK,
+       },
+};
+
+struct pmx_dev pmx_plgpio_28 = {
+       .name = "plgpio 28",
+       .modes = pmx_plgpio_28_modes,
+       .mode_count = ARRAY_SIZE(pmx_plgpio_28_modes),
+       .enb_on_reset = 1,
+};
+
+struct pmx_dev_mode pmx_plgpio_29_modes[] = {
+       {
+               .ids = 0x00,
+               .mask = PMX_GPIO_PIN1_MASK,
+       },
+};
+
+struct pmx_dev pmx_plgpio_29 = {
+       .name = "plgpio 29",
+       .modes = pmx_plgpio_29_modes,
+       .mode_count = ARRAY_SIZE(pmx_plgpio_29_modes),
+       .enb_on_reset = 1,
+};
+
+struct pmx_dev_mode pmx_plgpio_30_modes[] = {
+       {
+               .ids = 0x00,
+               .mask = PMX_GPIO_PIN2_MASK,
+       },
+};
+
+struct pmx_dev pmx_plgpio_30 = {
+       .name = "plgpio 30",
+       .modes = pmx_plgpio_30_modes,
+       .mode_count = ARRAY_SIZE(pmx_plgpio_30_modes),
+       .enb_on_reset = 1,
+};
+
+struct pmx_dev_mode pmx_plgpio_31_modes[] = {
+       {
+               .ids = 0x00,
+               .mask = PMX_GPIO_PIN3_MASK,
+       },
+};
+
+struct pmx_dev pmx_plgpio_31 = {
+       .name = "plgpio 31",
+       .modes = pmx_plgpio_31_modes,
+       .mode_count = ARRAY_SIZE(pmx_plgpio_31_modes),
+       .enb_on_reset = 1,
+};
+
+struct pmx_dev_mode pmx_plgpio_32_modes[] = {
+       {
+               .ids = 0x00,
+               .mask = PMX_GPIO_PIN4_MASK,
+       },
+};
+
+struct pmx_dev pmx_plgpio_32 = {
+       .name = "plgpio 32",
+       .modes = pmx_plgpio_32_modes,
+       .mode_count = ARRAY_SIZE(pmx_plgpio_32_modes),
+       .enb_on_reset = 1,
+};
+
+struct pmx_dev_mode pmx_plgpio_33_modes[] = {
+       {
+               .ids = 0x00,
+               .mask = PMX_GPIO_PIN5_MASK,
+       },
+};
+
+struct pmx_dev pmx_plgpio_33 = {
+       .name = "plgpio 33",
+       .modes = pmx_plgpio_33_modes,
+       .mode_count = ARRAY_SIZE(pmx_plgpio_33_modes),
+       .enb_on_reset = 1,
+};
+
+struct pmx_dev_mode pmx_plgpio_34_36_modes[] = {
+       {
+               .ids = 0x00,
+               .mask = PMX_SSP_CS_MASK,
+       },
+};
+
+struct pmx_dev pmx_plgpio_34_36 = {
+       .name = "plgpio 34 to 36",
+       .modes = pmx_plgpio_34_36_modes,
+       .mode_count = ARRAY_SIZE(pmx_plgpio_34_36_modes),
+       .enb_on_reset = 1,
+};
+
+struct pmx_dev_mode pmx_plgpio_37_42_modes[] = {
+       {
+               .ids = 0x00,
+               .mask = PMX_UART0_MODEM_MASK,
+       },
+};
+
+struct pmx_dev pmx_plgpio_37_42 = {
+       .name = "plgpio 37 to 42",
+       .modes = pmx_plgpio_37_42_modes,
+       .mode_count = ARRAY_SIZE(pmx_plgpio_37_42_modes),
+       .enb_on_reset = 1,
+};
+
+struct pmx_dev_mode pmx_plgpio_43_44_47_48_modes[] = {
+       {
+               .ids = 0x00,
+               .mask = PMX_TIMER_1_2_MASK,
+       },
+};
+
+struct pmx_dev pmx_plgpio_43_44_47_48 = {
+       .name = "plgpio 43, 44, 47 and 48",
+       .modes = pmx_plgpio_43_44_47_48_modes,
+       .mode_count = ARRAY_SIZE(pmx_plgpio_43_44_47_48_modes),
+       .enb_on_reset = 1,
+};
+
+struct pmx_dev_mode pmx_plgpio_45_46_49_50_modes[] = {
+       {
+               .ids = 0x00,
+               .mask = PMX_TIMER_3_4_MASK,
+       },
+};
+
+struct pmx_dev pmx_plgpio_45_46_49_50 = {
+       .name = "plgpio 45, 46, 49 and 50",
+       .modes = pmx_plgpio_45_46_49_50_modes,
+       .mode_count = ARRAY_SIZE(pmx_plgpio_45_46_49_50_modes),
+       .enb_on_reset = 1,
+};
+
+#endif
+
+/* spear padmux initialization function */
+void spear_pmx_init(struct pmx_driver *pmx_driver, uint base, uint size)
+{
+       int ret = 0;
+
+       /* pad mux initialization */
+       pmx_driver->base = ioremap(base, size);
+       if (!pmx_driver->base) {
+               ret = -ENOMEM;
+               goto pmx_fail;
+       }
+
+       ret = pmx_register(pmx_driver);
+       iounmap(pmx_driver->base);
+
+pmx_fail:
+       if (ret)
+               printk(KERN_ERR "padmux: registeration failed. err no: %d\n",
+                               ret);
+}
diff --git a/arch/arm/mach-spear6xx/Kconfig b/arch/arm/mach-spear6xx/Kconfig
new file mode 100644 (file)
index 0000000..bddba03
--- /dev/null
@@ -0,0 +1,20 @@
+#
+# SPEAr6XX Machine configuration file
+#
+
+if ARCH_SPEAR6XX
+
+choice
+       prompt "SPEAr6XX Family"
+       default MACH_SPEAR600
+
+config MACH_SPEAR600
+       bool "SPEAr600"
+       help
+         Supports ST SPEAr600 Machine
+endchoice
+
+# Adding SPEAr6XX machine specific configuration files
+source "arch/arm/mach-spear6xx/Kconfig600"
+
+endif #ARCH_SPEAR6XX
diff --git a/arch/arm/mach-spear6xx/Kconfig600 b/arch/arm/mach-spear6xx/Kconfig600
new file mode 100644 (file)
index 0000000..9e19f65
--- /dev/null
@@ -0,0 +1,17 @@
+#
+# SPEAr600 machine configuration file
+#
+
+if MACH_SPEAR600
+
+choice
+       prompt "SPEAr600 Boards"
+       default BOARD_SPEAR600_EVB
+
+config BOARD_SPEAR600_EVB
+       bool "SPEAr600 Evaluation Board"
+       help
+         Supports ST SPEAr600 Evaluation Board
+endchoice
+
+endif  #MACH_SPEAR600
diff --git a/arch/arm/mach-spear6xx/Makefile b/arch/arm/mach-spear6xx/Makefile
new file mode 100644 (file)
index 0000000..cc1a4d8
--- /dev/null
@@ -0,0 +1,12 @@
+#
+# Makefile for SPEAr6XX machine series
+#
+
+# common files
+obj-y  += clock.o spear6xx.o
+
+# spear600 specific files
+obj-$(CONFIG_MACH_SPEAR600) += spear600.o
+
+# spear600 boards files
+obj-$(CONFIG_BOARD_SPEAR600_EVB) += spear600_evb.o
diff --git a/arch/arm/mach-spear6xx/Makefile.boot b/arch/arm/mach-spear6xx/Makefile.boot
new file mode 100644 (file)
index 0000000..7a1f3c0
--- /dev/null
@@ -0,0 +1,3 @@
+zreladdr-y     := 0x00008000
+params_phys-y  := 0x00000100
+initrd_phys-y  := 0x00800000
diff --git a/arch/arm/mach-spear6xx/clock.c b/arch/arm/mach-spear6xx/clock.c
new file mode 100644 (file)
index 0000000..13e27c7
--- /dev/null
@@ -0,0 +1,483 @@
+/*
+ * arch/arm/mach-spear6xx/clock.c
+ *
+ * SPEAr6xx machines clock framework source file
+ *
+ * Copyright (C) 2009 ST Microelectronics
+ * Viresh Kumar<viresh.kumar@st.com>
+ *
+ * This file is licensed under the terms of the GNU General Public
+ * License version 2. This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+ */
+
+#include <linux/init.h>
+#include <linux/kernel.h>
+#include <mach/misc_regs.h>
+#include <plat/clock.h>
+
+/* root clks */
+/* 32 KHz oscillator clock */
+static struct clk osc_32k_clk = {
+       .flags = ALWAYS_ENABLED,
+       .rate = 32000,
+};
+
+/* 30 MHz oscillator clock */
+static struct clk osc_30m_clk = {
+       .flags = ALWAYS_ENABLED,
+       .rate = 30000000,
+};
+
+/* clock derived from 32 KHz osc clk */
+/* rtc clock */
+static struct clk rtc_clk = {
+       .pclk = &osc_32k_clk,
+       .en_reg = PERIP1_CLK_ENB,
+       .en_reg_bit = RTC_CLK_ENB,
+       .recalc = &follow_parent,
+};
+
+/* clock derived from 30 MHz osc clk */
+/* pll1 configuration structure */
+static struct pll_clk_config pll1_config = {
+       .mode_reg = PLL1_CTR,
+       .cfg_reg = PLL1_FRQ,
+};
+
+/* PLL1 clock */
+static struct clk pll1_clk = {
+       .pclk = &osc_30m_clk,
+       .en_reg = PLL1_CTR,
+       .en_reg_bit = PLL_ENABLE,
+       .recalc = &pll1_clk_recalc,
+       .private_data = &pll1_config,
+};
+
+/* PLL3 48 MHz clock */
+static struct clk pll3_48m_clk = {
+       .flags = ALWAYS_ENABLED,
+       .pclk = &osc_30m_clk,
+       .rate = 48000000,
+};
+
+/* watch dog timer clock */
+static struct clk wdt_clk = {
+       .flags = ALWAYS_ENABLED,
+       .pclk = &osc_30m_clk,
+       .recalc = &follow_parent,
+};
+
+/* clock derived from pll1 clk */
+/* cpu clock */
+static struct clk cpu_clk = {
+       .flags = ALWAYS_ENABLED,
+       .pclk = &pll1_clk,
+       .recalc = &follow_parent,
+};
+
+/* ahb configuration structure */
+static struct bus_clk_config ahb_config = {
+       .reg = CORE_CLK_CFG,
+       .mask = PLL_HCLK_RATIO_MASK,
+       .shift = PLL_HCLK_RATIO_SHIFT,
+};
+
+/* ahb clock */
+static struct clk ahb_clk = {
+       .flags = ALWAYS_ENABLED,
+       .pclk = &pll1_clk,
+       .recalc = &bus_clk_recalc,
+       .private_data = &ahb_config,
+};
+
+/* uart parents */
+static struct pclk_info uart_pclk_info[] = {
+       {
+               .pclk = &pll1_clk,
+               .pclk_mask = AUX_CLK_PLL1_MASK,
+               .scalable = 1,
+       }, {
+               .pclk = &pll3_48m_clk,
+               .pclk_mask = AUX_CLK_PLL3_MASK,
+               .scalable = 0,
+       },
+};
+
+/* uart parent select structure */
+static struct pclk_sel uart_pclk_sel = {
+       .pclk_info = uart_pclk_info,
+       .pclk_count = ARRAY_SIZE(uart_pclk_info),
+       .pclk_sel_reg = PERIP_CLK_CFG,
+       .pclk_sel_mask = UART_CLK_MASK,
+};
+
+/* uart configurations */
+static struct aux_clk_config uart_config = {
+       .synth_reg = UART_CLK_SYNT,
+};
+
+/* uart0 clock */
+static struct clk uart0_clk = {
+       .en_reg = PERIP1_CLK_ENB,
+       .en_reg_bit = UART0_CLK_ENB,
+       .pclk_sel = &uart_pclk_sel,
+       .pclk_sel_shift = UART_CLK_SHIFT,
+       .recalc = &aux_clk_recalc,
+       .private_data = &uart_config,
+};
+
+/* uart1 clock */
+static struct clk uart1_clk = {
+       .en_reg = PERIP1_CLK_ENB,
+       .en_reg_bit = UART1_CLK_ENB,
+       .pclk_sel = &uart_pclk_sel,
+       .pclk_sel_shift = UART_CLK_SHIFT,
+       .recalc = &aux_clk_recalc,
+       .private_data = &uart_config,
+};
+
+/* firda configurations */
+static struct aux_clk_config firda_config = {
+       .synth_reg = FIRDA_CLK_SYNT,
+};
+
+/* firda parents */
+static struct pclk_info firda_pclk_info[] = {
+       {
+               .pclk = &pll1_clk,
+               .pclk_mask = AUX_CLK_PLL1_MASK,
+               .scalable = 1,
+       }, {
+               .pclk = &pll3_48m_clk,
+               .pclk_mask = AUX_CLK_PLL3_MASK,
+               .scalable = 0,
+       },
+};
+
+/* firda parent select structure */
+static struct pclk_sel firda_pclk_sel = {
+       .pclk_info = firda_pclk_info,
+       .pclk_count = ARRAY_SIZE(firda_pclk_info),
+       .pclk_sel_reg = PERIP_CLK_CFG,
+       .pclk_sel_mask = FIRDA_CLK_MASK,
+};
+
+/* firda clock */
+static struct clk firda_clk = {
+       .en_reg = PERIP1_CLK_ENB,
+       .en_reg_bit = FIRDA_CLK_ENB,
+       .pclk_sel = &firda_pclk_sel,
+       .pclk_sel_shift = FIRDA_CLK_SHIFT,
+       .recalc = &aux_clk_recalc,
+       .private_data = &firda_config,
+};
+
+/* clcd configurations */
+static struct aux_clk_config clcd_config = {
+       .synth_reg = CLCD_CLK_SYNT,
+};
+
+/* clcd parents */
+static struct pclk_info clcd_pclk_info[] = {
+       {
+               .pclk = &pll1_clk,
+               .pclk_mask = AUX_CLK_PLL1_MASK,
+               .scalable = 1,
+       }, {
+               .pclk = &pll3_48m_clk,
+               .pclk_mask = AUX_CLK_PLL3_MASK,
+               .scalable = 0,
+       },
+};
+
+/* clcd parent select structure */
+static struct pclk_sel clcd_pclk_sel = {
+       .pclk_info = clcd_pclk_info,
+       .pclk_count = ARRAY_SIZE(clcd_pclk_info),
+       .pclk_sel_reg = PERIP_CLK_CFG,
+       .pclk_sel_mask = CLCD_CLK_MASK,
+};
+
+/* clcd clock */
+static struct clk clcd_clk = {
+       .en_reg = PERIP1_CLK_ENB,
+       .en_reg_bit = CLCD_CLK_ENB,
+       .pclk_sel = &clcd_pclk_sel,
+       .pclk_sel_shift = CLCD_CLK_SHIFT,
+       .recalc = &aux_clk_recalc,
+       .private_data = &clcd_config,
+};
+
+/* gpt parents */
+static struct pclk_info gpt_pclk_info[] = {
+       {
+               .pclk = &pll1_clk,
+               .pclk_mask = AUX_CLK_PLL1_MASK,
+               .scalable = 1,
+       }, {
+               .pclk = &pll3_48m_clk,
+               .pclk_mask = AUX_CLK_PLL3_MASK,
+               .scalable = 0,
+       },
+};
+
+/* gpt parent select structure */
+static struct pclk_sel gpt_pclk_sel = {
+       .pclk_info = gpt_pclk_info,
+       .pclk_count = ARRAY_SIZE(gpt_pclk_info),
+       .pclk_sel_reg = PERIP_CLK_CFG,
+       .pclk_sel_mask = GPT_CLK_MASK,
+};
+
+/* gpt0_1 configurations */
+static struct aux_clk_config gpt0_1_config = {
+       .synth_reg = PRSC1_CLK_CFG,
+};
+
+/* gpt0 ARM1 subsystem timer clock */
+static struct clk gpt0_clk = {
+       .flags = ALWAYS_ENABLED,
+       .pclk_sel = &gpt_pclk_sel,
+       .pclk_sel_shift = GPT0_CLK_SHIFT,
+       .recalc = &gpt_clk_recalc,
+       .private_data = &gpt0_1_config,
+};
+
+/* gpt1 timer clock */
+static struct clk gpt1_clk = {
+       .flags = ALWAYS_ENABLED,
+       .pclk_sel = &gpt_pclk_sel,
+       .pclk_sel_shift = GPT1_CLK_SHIFT,
+       .recalc = &gpt_clk_recalc,
+       .private_data = &gpt0_1_config,
+};
+
+/* gpt2 configurations */
+static struct aux_clk_config gpt2_config = {
+       .synth_reg = PRSC2_CLK_CFG,
+};
+
+/* gpt2 timer clock */
+static struct clk gpt2_clk = {
+       .en_reg = PERIP1_CLK_ENB,
+       .en_reg_bit = GPT2_CLK_ENB,
+       .pclk_sel = &gpt_pclk_sel,
+       .pclk_sel_shift = GPT2_CLK_SHIFT,
+       .recalc = &gpt_clk_recalc,
+       .private_data = &gpt2_config,
+};
+
+/* gpt3 configurations */
+static struct aux_clk_config gpt3_config = {
+       .synth_reg = PRSC3_CLK_CFG,
+};
+
+/* gpt3 timer clock */
+static struct clk gpt3_clk = {
+       .en_reg = PERIP1_CLK_ENB,
+       .en_reg_bit = GPT3_CLK_ENB,
+       .pclk_sel = &gpt_pclk_sel,
+       .pclk_sel_shift = GPT3_CLK_SHIFT,
+       .recalc = &gpt_clk_recalc,
+       .private_data = &gpt3_config,
+};
+
+/* clock derived from pll3 clk */
+/* usbh0 clock */
+static struct clk usbh0_clk = {
+       .pclk = &pll3_48m_clk,
+       .en_reg = PERIP1_CLK_ENB,
+       .en_reg_bit = USBH0_CLK_ENB,
+       .recalc = &follow_parent,
+};
+
+/* usbh1 clock */
+static struct clk usbh1_clk = {
+       .pclk = &pll3_48m_clk,
+       .en_reg = PERIP1_CLK_ENB,
+       .en_reg_bit = USBH1_CLK_ENB,
+       .recalc = &follow_parent,
+};
+
+/* usbd clock */
+static struct clk usbd_clk = {
+       .pclk = &pll3_48m_clk,
+       .en_reg = PERIP1_CLK_ENB,
+       .en_reg_bit = USBD_CLK_ENB,
+       .recalc = &follow_parent,
+};
+
+/* clock derived from ahb clk */
+/* apb configuration structure */
+static struct bus_clk_config apb_config = {
+       .reg = CORE_CLK_CFG,
+       .mask = HCLK_PCLK_RATIO_MASK,
+       .shift = HCLK_PCLK_RATIO_SHIFT,
+};
+
+/* apb clock */
+static struct clk apb_clk = {
+       .flags = ALWAYS_ENABLED,
+       .pclk = &ahb_clk,
+       .recalc = &bus_clk_recalc,
+       .private_data = &apb_config,
+};
+
+/* i2c clock */
+static struct clk i2c_clk = {
+       .pclk = &ahb_clk,
+       .en_reg = PERIP1_CLK_ENB,
+       .en_reg_bit = I2C_CLK_ENB,
+       .recalc = &follow_parent,
+};
+
+/* dma clock */
+static struct clk dma_clk = {
+       .pclk = &ahb_clk,
+       .en_reg = PERIP1_CLK_ENB,
+       .en_reg_bit = DMA_CLK_ENB,
+       .recalc = &follow_parent,
+};
+
+/* jpeg clock */
+static struct clk jpeg_clk = {
+       .pclk = &ahb_clk,
+       .en_reg = PERIP1_CLK_ENB,
+       .en_reg_bit = JPEG_CLK_ENB,
+       .recalc = &follow_parent,
+};
+
+/* gmac clock */
+static struct clk gmac_clk = {
+       .pclk = &ahb_clk,
+       .en_reg = PERIP1_CLK_ENB,
+       .en_reg_bit = GMAC_CLK_ENB,
+       .recalc = &follow_parent,
+};
+
+/* smi clock */
+static struct clk smi_clk = {
+       .pclk = &ahb_clk,
+       .en_reg = PERIP1_CLK_ENB,
+       .en_reg_bit = SMI_CLK_ENB,
+       .recalc = &follow_parent,
+};
+
+/* fsmc clock */
+static struct clk fsmc_clk = {
+       .pclk = &ahb_clk,
+       .en_reg = PERIP1_CLK_ENB,
+       .en_reg_bit = FSMC_CLK_ENB,
+       .recalc = &follow_parent,
+};
+
+/* clock derived from apb clk */
+/* adc clock */
+static struct clk adc_clk = {
+       .pclk = &apb_clk,
+       .en_reg = PERIP1_CLK_ENB,
+       .en_reg_bit = ADC_CLK_ENB,
+       .recalc = &follow_parent,
+};
+
+/* ssp0 clock */
+static struct clk ssp0_clk = {
+       .pclk = &apb_clk,
+       .en_reg = PERIP1_CLK_ENB,
+       .en_reg_bit = SSP0_CLK_ENB,
+       .recalc = &follow_parent,
+};
+
+/* ssp1 clock */
+static struct clk ssp1_clk = {
+       .pclk = &apb_clk,
+       .en_reg = PERIP1_CLK_ENB,
+       .en_reg_bit = SSP1_CLK_ENB,
+       .recalc = &follow_parent,
+};
+
+/* ssp2 clock */
+static struct clk ssp2_clk = {
+       .pclk = &apb_clk,
+       .en_reg = PERIP1_CLK_ENB,
+       .en_reg_bit = SSP2_CLK_ENB,
+       .recalc = &follow_parent,
+};
+
+/* gpio0 ARM subsystem clock */
+static struct clk gpio0_clk = {
+       .flags = ALWAYS_ENABLED,
+       .pclk = &apb_clk,
+       .recalc = &follow_parent,
+};
+
+/* gpio1 clock */
+static struct clk gpio1_clk = {
+       .pclk = &apb_clk,
+       .en_reg = PERIP1_CLK_ENB,
+       .en_reg_bit = GPIO1_CLK_ENB,
+       .recalc = &follow_parent,
+};
+
+/* gpio2 clock */
+static struct clk gpio2_clk = {
+       .pclk = &apb_clk,
+       .en_reg = PERIP1_CLK_ENB,
+       .en_reg_bit = GPIO2_CLK_ENB,
+       .recalc = &follow_parent,
+};
+
+/* array of all spear 6xx clock lookups */
+static struct clk_lookup spear_clk_lookups[] = {
+       /* root clks */
+       { .con_id = "osc_32k_clk",      .clk = &osc_32k_clk},
+       { .con_id = "osc_30m_clk",      .clk = &osc_30m_clk},
+       /* clock derived from 32 KHz os          clk */
+       { .dev_id = "rtc",              .clk = &rtc_clk},
+       /* clock derived from 30 MHz os          clk */
+       { .con_id = "pll1_clk",         .clk = &pll1_clk},
+       { .con_id = "pll3_48m_clk",     .clk = &pll3_48m_clk},
+       { .dev_id = "wdt",              .clk = &wdt_clk},
+       /* clock derived from pll1 clk */
+       { .con_id = "cpu_clk",          .clk = &cpu_clk},
+       { .con_id = "ahb_clk",          .clk = &ahb_clk},
+       { .dev_id = "uart0",            .clk = &uart0_clk},
+       { .dev_id = "uart1",            .clk = &uart1_clk},
+       { .dev_id = "firda",            .clk = &firda_clk},
+       { .dev_id = "clcd",             .clk = &clcd_clk},
+       { .dev_id = "gpt0",             .clk = &gpt0_clk},
+       { .dev_id = "gpt1",             .clk = &gpt1_clk},
+       { .dev_id = "gpt2",             .clk = &gpt2_clk},
+       { .dev_id = "gpt3",             .clk = &gpt3_clk},
+       /* clock derived from pll3 clk */
+       { .dev_id = "usbh0",            .clk = &usbh0_clk},
+       { .dev_id = "usbh1",            .clk = &usbh1_clk},
+       { .dev_id = "usbd",             .clk = &usbd_clk},
+       /* clock derived from ahb clk */
+       { .con_id = "apb_clk",          .clk = &apb_clk},
+       { .dev_id = "i2c",              .clk = &i2c_clk},
+       { .dev_id = "dma",              .clk = &dma_clk},
+       { .dev_id = "jpeg",             .clk = &jpeg_clk},
+       { .dev_id = "gmac",             .clk = &gmac_clk},
+       { .dev_id = "smi",              .clk = &smi_clk},
+       { .dev_id = "fsmc",             .clk = &fsmc_clk},
+       /* clock derived from apb clk */
+       { .dev_id = "adc",              .clk = &adc_clk},
+       { .dev_id = "ssp0",             .clk = &ssp0_clk},
+       { .dev_id = "ssp1",             .clk = &ssp1_clk},
+       { .dev_id = "ssp2",             .clk = &ssp2_clk},
+       { .dev_id = "gpio0",            .clk = &gpio0_clk},
+       { .dev_id = "gpio1",            .clk = &gpio1_clk},
+       { .dev_id = "gpio2",            .clk = &gpio2_clk},
+};
+
+void __init clk_init(void)
+{
+       int i;
+
+       for (i = 0; i < ARRAY_SIZE(spear_clk_lookups); i++)
+               clk_register(&spear_clk_lookups[i]);
+
+       recalc_root_clocks();
+}
diff --git a/arch/arm/mach-spear6xx/include/mach/clkdev.h b/arch/arm/mach-spear6xx/include/mach/clkdev.h
new file mode 100644 (file)
index 0000000..05676bf
--- /dev/null
@@ -0,0 +1,19 @@
+/*
+ * arch/arm/mach-spear6xx/include/mach/clkdev.h
+ *
+ * Clock Dev framework definitions for SPEAr6xx machine family
+ *
+ * Copyright (C) 2009 ST Microelectronics
+ * Viresh Kumar<viresh.kumar@st.com>
+ *
+ * This file is licensed under the terms of the GNU General Public
+ * License version 2. This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+ */
+
+#ifndef __MACH_CLKDEV_H
+#define __MACH_CLKDEV_H
+
+#include <plat/clkdev.h>
+
+#endif /* __MACH_CLKDEV_H */
diff --git a/arch/arm/mach-spear6xx/include/mach/debug-macro.S b/arch/arm/mach-spear6xx/include/mach/debug-macro.S
new file mode 100644 (file)
index 0000000..0f3ea39
--- /dev/null
@@ -0,0 +1,14 @@
+/*
+ * arch/arm/mach-spear6xx/include/mach/debug-macro.S
+ *
+ * Debugging macro include header for SPEAr6xx machine family
+ *
+ * Copyright (C) 2009 ST Microelectronics
+ * Rajeev Kumar<rajeev-dlh.kumar@st.com>
+ *
+ * This file is licensed under the terms of the GNU General Public
+ * License version 2. This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+ */
+
+#include <plat/debug-macro.S>
diff --git a/arch/arm/mach-spear6xx/include/mach/entry-macro.S b/arch/arm/mach-spear6xx/include/mach/entry-macro.S
new file mode 100644 (file)
index 0000000..9eaecae
--- /dev/null
@@ -0,0 +1,55 @@
+/*
+ * arch/arm/mach-spear6xx/include/mach/entry-macro.S
+ *
+ * Low-level IRQ helper macros for SPEAr6xx machine family
+ *
+ * Copyright (C) 2009 ST Microelectronics
+ * Rajeev Kumar<rajeev-dlh.kumar@st.com>
+ *
+ * This file is licensed under the terms of the GNU General Public
+ * License version 2. This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+ */
+
+#include <mach/hardware.h>
+#include <mach/spear.h>
+#include <asm/hardware/vic.h>
+
+               .macro  disable_fiq
+               .endm
+
+               .macro  get_irqnr_preamble, base, tmp
+               .endm
+
+               .macro  arch_ret_to_user, tmp1, tmp2
+               .endm
+
+               .macro  get_irqnr_and_base, irqnr, irqstat, base, tmp
+               ldr     \base, =VA_SPEAR6XX_CPU_VIC_PRI_BASE
+               ldr     \irqstat, [\base, #VIC_IRQ_STATUS]      @ get status
+               mov     \irqnr, #0
+               teq     \irqstat, #0
+               bne     1001f
+               ldr     \base, =VA_SPEAR6XX_CPU_VIC_SEC_BASE
+               ldr     \irqstat, [\base, #VIC_IRQ_STATUS]      @ get status
+               teq     \irqstat, #0
+               beq     1002f                           @ this will set/reset
+                                                       @ zero register
+               mov     \irqnr, #32
+1001:
+               /*
+                * Following code will find bit position of least significang
+                * bit set in irqstat, using following equation
+                * least significant bit set in n = (n & ~(n-1))
+                */
+               sub     \tmp, \irqstat, #1              @ tmp = irqstat - 1
+               mvn     \tmp, \tmp                      @ tmp = ~tmp
+               and     \irqstat, \irqstat, \tmp        @ irqstat &= tmp
+               /* Now, irqstat is = bit no. of 1st bit set in vic irq status */
+               clz     \tmp, \irqstat                  @ tmp = leading zeros
+
+               rsb     \tmp, \tmp, #0x1F               @ tmp = 32 - tmp - 1
+               add     \irqnr, \irqnr, \tmp
+
+1002:          /* EQ will be set if no irqs pending */
+               .endm
diff --git a/arch/arm/mach-spear6xx/include/mach/generic.h b/arch/arm/mach-spear6xx/include/mach/generic.h
new file mode 100644 (file)
index 0000000..16205a5
--- /dev/null
@@ -0,0 +1,45 @@
+/*
+ * arch/arm/mach-spear6xx/include/mach/generic.h
+ *
+ * SPEAr6XX machine family specific generic header file
+ *
+ * Copyright (C) 2009 ST Microelectronics
+ * Rajeev Kumar<rajeev-dlh.kumar@st.com>
+ *
+ * This file is licensed under the terms of the GNU General Public
+ * License version 2. This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+ */
+
+#ifndef __MACH_GENERIC_H
+#define __MACH_GENERIC_H
+
+#include <asm/mach/time.h>
+#include <asm/mach/map.h>
+#include <linux/init.h>
+#include <linux/platform_device.h>
+#include <linux/amba/bus.h>
+
+/*
+ * Each GPT has 2 timer channels
+ * Following GPT channels will be used as clock source and clockevent
+ */
+#define SPEAR_GPT0_BASE                SPEAR6XX_CPU_TMR_BASE
+#define SPEAR_GPT0_CHAN0_IRQ   IRQ_CPU_GPT1_1
+#define SPEAR_GPT0_CHAN1_IRQ   IRQ_CPU_GPT1_2
+
+/* Add spear6xx family device structure declarations here */
+extern struct amba_device gpio_device[];
+extern struct amba_device uart_device[];
+extern struct sys_timer spear_sys_timer;
+
+/* Add spear6xx family function declarations here */
+void __init spear6xx_map_io(void);
+void __init spear6xx_init_irq(void);
+void __init spear6xx_init(void);
+void __init spear600_init(void);
+void __init clk_init(void);
+
+/* Add spear600 machine device structure declarations here */
+
+#endif /* __MACH_GENERIC_H */
diff --git a/arch/arm/mach-spear6xx/include/mach/gpio.h b/arch/arm/mach-spear6xx/include/mach/gpio.h
new file mode 100644 (file)
index 0000000..3a789db
--- /dev/null
@@ -0,0 +1,19 @@
+/*
+ * arch/arm/mach-spear6xx/include/mach/gpio.h
+ *
+ * GPIO macros for SPEAr6xx machine family
+ *
+ * Copyright (C) 2009 ST Microelectronics
+ * Viresh Kumar<viresh.kumar@st.com>
+ *
+ * This file is licensed under the terms of the GNU General Public
+ * License version 2. This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+ */
+
+#ifndef __MACH_GPIO_H
+#define __MACH_GPIO_H
+
+#include <plat/gpio.h>
+
+#endif /* __MACH_GPIO_H */
diff --git a/arch/arm/mach-spear6xx/include/mach/hardware.h b/arch/arm/mach-spear6xx/include/mach/hardware.h
new file mode 100644 (file)
index 0000000..7545116
--- /dev/null
@@ -0,0 +1,21 @@
+/*
+ * arch/arm/mach-spear6xx/include/mach/hardware.h
+ *
+ * Hardware definitions for SPEAr6xx machine family
+ *
+ * Copyright (C) 2009 ST Microelectronics
+ * Rajeev Kumar<rajeev-dlh.kumar@st.com>
+ *
+ * This file is licensed under the terms of the GNU General Public
+ * License version 2. This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+ */
+
+#ifndef __MACH_HARDWARE_H
+#define __MACH_HARDWARE_H
+
+/* Vitual to physical translation of statically mapped space */
+#define IO_ADDRESS(x)          (x | 0xF0000000)
+
+#endif /* __MACH_HARDWARE_H */
+
diff --git a/arch/arm/mach-spear6xx/include/mach/io.h b/arch/arm/mach-spear6xx/include/mach/io.h
new file mode 100644 (file)
index 0000000..fb7c106
--- /dev/null
@@ -0,0 +1,20 @@
+/*
+ * arch/arm/mach-spear6xx/include/mach/io.h
+ *
+ * IO definitions for SPEAr6xx machine family
+ *
+ * Copyright (C) 2009 ST Microelectronics
+ * Rajeev Kumar Kumar<rajeev-dlh.kumar@st.com>
+ *
+ * This file is licensed under the terms of the GNU General Public
+ * License version 2. This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+ */
+
+#ifndef __MACH_IO_H
+#define __MACH_IO_H
+
+#include <plat/io.h>
+
+#endif /* __MACH_IO_H */
+
diff --git a/arch/arm/mach-spear6xx/include/mach/irqs.h b/arch/arm/mach-spear6xx/include/mach/irqs.h
new file mode 100644 (file)
index 0000000..8f214b0
--- /dev/null
@@ -0,0 +1,97 @@
+/*
+ * arch/arm/mach-spear6xx/include/mach/irqs.h
+ *
+ * IRQ helper macros for SPEAr6xx machine family
+ *
+ * Copyright (C) 2009 ST Microelectronics
+ * Rajeev Kumar<rajeev-dlh.kumar@st.com>
+ *
+ * This file is licensed under the terms of the GNU General Public
+ * License version 2. This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+ */
+
+#ifndef __MACH_IRQS_H
+#define __MACH_IRQS_H
+
+/* IRQ definitions */
+/* VIC 1 */
+#define IRQ_INTRCOMM_SW_IRQ                    0
+#define IRQ_INTRCOMM_CPU_1                     1
+#define IRQ_INTRCOMM_CPU_2                     2
+#define IRQ_INTRCOMM_RAS2A11_1                 3
+#define IRQ_INTRCOMM_RAS2A11_2                 4
+#define IRQ_INTRCOMM_RAS2A12_1                 5
+#define IRQ_INTRCOMM_RAS2A12_2                 6
+#define IRQ_GEN_RAS_0                          7
+#define IRQ_GEN_RAS_1                          8
+#define IRQ_GEN_RAS_2                          9
+#define IRQ_GEN_RAS_3                          10
+#define IRQ_GEN_RAS_4                          11
+#define IRQ_GEN_RAS_5                          12
+#define IRQ_GEN_RAS_6                          13
+#define IRQ_GEN_RAS_7                          14
+#define IRQ_GEN_RAS_8                          15
+#define IRQ_CPU_GPT1_1                         16
+#define IRQ_CPU_GPT1_2                         17
+#define IRQ_LOCAL_GPIO                         18
+#define IRQ_PLL_UNLOCK                         19
+#define IRQ_JPEG                               20
+#define IRQ_FSMC                               21
+#define IRQ_IRDA                               22
+#define IRQ_RESERVED                           23
+#define IRQ_UART_0                             24
+#define IRQ_UART_1                             25
+#define IRQ_SSP_1                              26
+#define IRQ_SSP_2                              27
+#define IRQ_I2C                                        28
+#define IRQ_GEN_RAS_9                          29
+#define IRQ_GEN_RAS_10                         30
+#define IRQ_GEN_RAS_11                         31
+
+/* VIC 2 */
+#define IRQ_APPL_GPT1_1                                32
+#define IRQ_APPL_GPT1_2                                33
+#define IRQ_APPL_GPT2_1                                34
+#define IRQ_APPL_GPT2_2                                35
+#define IRQ_APPL_GPIO                          36
+#define IRQ_APPL_SSP                           37
+#define IRQ_APPL_ADC                           38
+#define IRQ_APPL_RESERVED                      39
+#define IRQ_AHB_EXP_MASTER                     40
+#define IRQ_DDR_CONTROLLER                     41
+#define IRQ_BASIC_DMA                          42
+#define IRQ_BASIC_RESERVED1                    43
+#define IRQ_BASIC_SMI                          44
+#define IRQ_BASIC_CLCD                         45
+#define IRQ_EXP_AHB_1                          46
+#define IRQ_EXP_AHB_2                          47
+#define IRQ_BASIC_GPT1_1                       48
+#define IRQ_BASIC_GPT1_2                       49
+#define IRQ_BASIC_RTC                          50
+#define IRQ_BASIC_GPIO                         51
+#define IRQ_BASIC_WDT                          52
+#define IRQ_BASIC_RESERVED                     53
+#define IRQ_AHB_EXP_SLAVE                      54
+#define IRQ_GMAC_1                             55
+#define IRQ_GMAC_2                             56
+#define IRQ_USB_DEV                            57
+#define IRQ_USB_H_OHCI_0                       58
+#define IRQ_USB_H_EHCI_0                       59
+#define IRQ_USB_H_OHCI_1                       60
+#define IRQ_USB_H_EHCI_1                       61
+#define IRQ_EXP_AHB_3                          62
+#define IRQ_EXP_AHB_4                          63
+
+#define IRQ_VIC_END                            64
+
+/* GPIO pins virtual irqs */
+#define SPEAR_GPIO_INT_BASE    IRQ_VIC_END
+#define SPEAR_GPIO0_INT_BASE   SPEAR_GPIO_INT_BASE
+#define SPEAR_GPIO1_INT_BASE   (SPEAR_GPIO0_INT_BASE + 8)
+#define SPEAR_GPIO2_INT_BASE   (SPEAR_GPIO1_INT_BASE + 8)
+#define SPEAR_GPIO_INT_END     (SPEAR_GPIO2_INT_BASE + 8)
+#define VIRTUAL_IRQS           (SPEAR_GPIO_INT_END - IRQ_VIC_END)
+#define NR_IRQS                        (IRQ_VIC_END + VIRTUAL_IRQS)
+
+#endif /* __MACH_IRQS_H */
diff --git a/arch/arm/mach-spear6xx/include/mach/memory.h b/arch/arm/mach-spear6xx/include/mach/memory.h
new file mode 100644 (file)
index 0000000..781f088
--- /dev/null
@@ -0,0 +1,19 @@
+/*
+ * arch/arm/mach-spear6xx/include/mach/memory.h
+ *
+ * Memory map for SPEAr6xx machine family
+ *
+ * Copyright (C) 2009 ST Microelectronics
+ * Rajeev Kumar<rajeev-dlh.kumar@st.com>
+ *
+ * This file is licensed under the terms of the GNU General Public
+ * License version 2. This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+ */
+
+#ifndef __MACH_MEMORY_H
+#define __MACH_MEMORY_H
+
+#include <plat/memory.h>
+
+#endif /* __MACH_MEMORY_H */
diff --git a/arch/arm/mach-spear6xx/include/mach/misc_regs.h b/arch/arm/mach-spear6xx/include/mach/misc_regs.h
new file mode 100644 (file)
index 0000000..0390803
--- /dev/null
@@ -0,0 +1,173 @@
+/*
+ * arch/arm/mach-spear6xx/include/mach/misc_regs.h
+ *
+ * Miscellaneous registers definitions for SPEAr6xx machine family
+ *
+ * Copyright (C) 2009 ST Microelectronics
+ * Viresh Kumar<viresh.kumar@st.com>
+ *
+ * This file is licensed under the terms of the GNU General Public
+ * License version 2. This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+ */
+
+#ifndef __MACH_MISC_REGS_H
+#define __MACH_MISC_REGS_H
+
+#include <mach/spear.h>
+
+#define MISC_BASE              VA_SPEAR6XX_ICM3_MISC_REG_BASE
+
+#define SOC_CFG_CTR            ((unsigned int *)(MISC_BASE + 0x000))
+#define DIAG_CFG_CTR           ((unsigned int *)(MISC_BASE + 0x004))
+#define PLL1_CTR               ((unsigned int *)(MISC_BASE + 0x008))
+#define PLL1_FRQ               ((unsigned int *)(MISC_BASE + 0x00C))
+#define PLL1_MOD               ((unsigned int *)(MISC_BASE + 0x010))
+#define PLL2_CTR               ((unsigned int *)(MISC_BASE + 0x014))
+/* PLL_CTR register masks */
+#define PLL_ENABLE             2
+#define PLL_MODE_SHIFT         4
+#define PLL_MODE_MASK          0x3
+#define PLL_MODE_NORMAL                0
+#define PLL_MODE_FRACTION      1
+#define PLL_MODE_DITH_DSB      2
+#define PLL_MODE_DITH_SSB      3
+
+#define PLL2_FRQ               ((unsigned int *)(MISC_BASE + 0x018))
+/* PLL FRQ register masks */
+#define PLL_DIV_N_SHIFT                0
+#define PLL_DIV_N_MASK         0xFF
+#define PLL_DIV_P_SHIFT                8
+#define PLL_DIV_P_MASK         0x7
+#define PLL_NORM_FDBK_M_SHIFT  24
+#define PLL_NORM_FDBK_M_MASK   0xFF
+#define PLL_DITH_FDBK_M_SHIFT  16
+#define PLL_DITH_FDBK_M_MASK   0xFFFF
+
+#define PLL2_MOD               ((unsigned int *)(MISC_BASE + 0x01C))
+#define PLL_CLK_CFG            ((unsigned int *)(MISC_BASE + 0x020))
+#define CORE_CLK_CFG           ((unsigned int *)(MISC_BASE + 0x024))
+/* CORE CLK CFG register masks */
+#define PLL_HCLK_RATIO_SHIFT   10
+#define PLL_HCLK_RATIO_MASK    0x3
+#define HCLK_PCLK_RATIO_SHIFT  8
+#define HCLK_PCLK_RATIO_MASK   0x3
+
+#define PERIP_CLK_CFG          ((unsigned int *)(MISC_BASE + 0x028))
+/* PERIP_CLK_CFG register masks */
+#define CLCD_CLK_SHIFT         2
+#define CLCD_CLK_MASK          0x3
+#define UART_CLK_SHIFT         4
+#define UART_CLK_MASK          0x1
+#define FIRDA_CLK_SHIFT                5
+#define FIRDA_CLK_MASK         0x3
+#define GPT0_CLK_SHIFT         8
+#define GPT1_CLK_SHIFT         10
+#define GPT2_CLK_SHIFT         11
+#define GPT3_CLK_SHIFT         12
+#define GPT_CLK_MASK           0x1
+#define AUX_CLK_PLL3_MASK      0
+#define AUX_CLK_PLL1_MASK      1
+
+#define PERIP1_CLK_ENB         ((unsigned int *)(MISC_BASE + 0x02C))
+/* PERIP1_CLK_ENB register masks */
+#define UART0_CLK_ENB          3
+#define UART1_CLK_ENB          4
+#define SSP0_CLK_ENB           5
+#define SSP1_CLK_ENB           6
+#define I2C_CLK_ENB            7
+#define JPEG_CLK_ENB           8
+#define FSMC_CLK_ENB           9
+#define FIRDA_CLK_ENB          10
+#define GPT2_CLK_ENB           11
+#define GPT3_CLK_ENB           12
+#define GPIO2_CLK_ENB          13
+#define SSP2_CLK_ENB           14
+#define ADC_CLK_ENB            15
+#define GPT1_CLK_ENB           11
+#define RTC_CLK_ENB            17
+#define GPIO1_CLK_ENB          18
+#define DMA_CLK_ENB            19
+#define SMI_CLK_ENB            21
+#define CLCD_CLK_ENB           22
+#define GMAC_CLK_ENB           23
+#define USBD_CLK_ENB           24
+#define USBH0_CLK_ENB          25
+#define USBH1_CLK_ENB          26
+
+#define SOC_CORE_ID            ((unsigned int *)(MISC_BASE + 0x030))
+#define RAS_CLK_ENB            ((unsigned int *)(MISC_BASE + 0x034))
+#define PERIP1_SOF_RST         ((unsigned int *)(MISC_BASE + 0x038))
+/* PERIP1_SOF_RST register masks */
+#define JPEG_SOF_RST           8
+
+#define SOC_USER_ID            ((unsigned int *)(MISC_BASE + 0x03C))
+#define RAS_SOF_RST            ((unsigned int *)(MISC_BASE + 0x040))
+#define PRSC1_CLK_CFG          ((unsigned int *)(MISC_BASE + 0x044))
+#define PRSC2_CLK_CFG          ((unsigned int *)(MISC_BASE + 0x048))
+#define PRSC3_CLK_CFG          ((unsigned int *)(MISC_BASE + 0x04C))
+/* gpt synthesizer register masks */
+#define GPT_MSCALE_SHIFT       0
+#define GPT_MSCALE_MASK                0xFFF
+#define GPT_NSCALE_SHIFT       12
+#define GPT_NSCALE_MASK                0xF
+
+#define AMEM_CLK_CFG           ((unsigned int *)(MISC_BASE + 0x050))
+#define EXPI_CLK_CFG           ((unsigned int *)(MISC_BASE + 0x054))
+#define CLCD_CLK_SYNT          ((unsigned int *)(MISC_BASE + 0x05C))
+#define FIRDA_CLK_SYNT         ((unsigned int *)(MISC_BASE + 0x060))
+#define UART_CLK_SYNT          ((unsigned int *)(MISC_BASE + 0x064))
+#define GMAC_CLK_SYNT          ((unsigned int *)(MISC_BASE + 0x068))
+#define RAS1_CLK_SYNT          ((unsigned int *)(MISC_BASE + 0x06C))
+#define RAS2_CLK_SYNT          ((unsigned int *)(MISC_BASE + 0x070))
+#define RAS3_CLK_SYNT          ((unsigned int *)(MISC_BASE + 0x074))
+#define RAS4_CLK_SYNT          ((unsigned int *)(MISC_BASE + 0x078))
+/* aux clk synthesiser register masks for irda to ras4 */
+#define AUX_EQ_SEL_SHIFT       30
+#define AUX_EQ_SEL_MASK                1
+#define AUX_EQ1_SEL            0
+#define AUX_EQ2_SEL            1
+#define AUX_XSCALE_SHIFT       16
+#define AUX_XSCALE_MASK                0xFFF
+#define AUX_YSCALE_SHIFT       0
+#define AUX_YSCALE_MASK                0xFFF
+
+#define ICM1_ARB_CFG           ((unsigned int *)(MISC_BASE + 0x07C))
+#define ICM2_ARB_CFG           ((unsigned int *)(MISC_BASE + 0x080))
+#define ICM3_ARB_CFG           ((unsigned int *)(MISC_BASE + 0x084))
+#define ICM4_ARB_CFG           ((unsigned int *)(MISC_BASE + 0x088))
+#define ICM5_ARB_CFG           ((unsigned int *)(MISC_BASE + 0x08C))
+#define ICM6_ARB_CFG           ((unsigned int *)(MISC_BASE + 0x090))
+#define ICM7_ARB_CFG           ((unsigned int *)(MISC_BASE + 0x094))
+#define ICM8_ARB_CFG           ((unsigned int *)(MISC_BASE + 0x098))
+#define ICM9_ARB_CFG           ((unsigned int *)(MISC_BASE + 0x09C))
+#define DMA_CHN_CFG            ((unsigned int *)(MISC_BASE + 0x0A0))
+#define USB2_PHY_CFG           ((unsigned int *)(MISC_BASE + 0x0A4))
+#define GMAC_CFG_CTR           ((unsigned int *)(MISC_BASE + 0x0A8))
+#define EXPI_CFG_CTR           ((unsigned int *)(MISC_BASE + 0x0AC))
+#define PRC1_LOCK_CTR          ((unsigned int *)(MISC_BASE + 0x0C0))
+#define PRC2_LOCK_CTR          ((unsigned int *)(MISC_BASE + 0x0C4))
+#define PRC3_LOCK_CTR          ((unsigned int *)(MISC_BASE + 0x0C8))
+#define PRC4_LOCK_CTR          ((unsigned int *)(MISC_BASE + 0x0CC))
+#define PRC1_IRQ_CTR           ((unsigned int *)(MISC_BASE + 0x0D0))
+#define PRC2_IRQ_CTR           ((unsigned int *)(MISC_BASE + 0x0D4))
+#define PRC3_IRQ_CTR           ((unsigned int *)(MISC_BASE + 0x0D8))
+#define PRC4_IRQ_CTR           ((unsigned int *)(MISC_BASE + 0x0DC))
+#define PWRDOWN_CFG_CTR                ((unsigned int *)(MISC_BASE + 0x0E0))
+#define COMPSSTL_1V8_CFG       ((unsigned int *)(MISC_BASE + 0x0E4))
+#define COMPSSTL_2V5_CFG       ((unsigned int *)(MISC_BASE + 0x0E8))
+#define COMPCOR_3V3_CFG                ((unsigned int *)(MISC_BASE + 0x0EC))
+#define SSTLPAD_CFG_CTR                ((unsigned int *)(MISC_BASE + 0x0F0))
+#define BIST1_CFG_CTR          ((unsigned int *)(MISC_BASE + 0x0F4))
+#define BIST2_CFG_CTR          ((unsigned int *)(MISC_BASE + 0x0F8))
+#define BIST3_CFG_CTR          ((unsigned int *)(MISC_BASE + 0x0FC))
+#define BIST4_CFG_CTR          ((unsigned int *)(MISC_BASE + 0x100))
+#define BIST5_CFG_CTR          ((unsigned int *)(MISC_BASE + 0x104))
+#define BIST1_STS_RES          ((unsigned int *)(MISC_BASE + 0x108))
+#define BIST2_STS_RES          ((unsigned int *)(MISC_BASE + 0x10C))
+#define BIST3_STS_RES          ((unsigned int *)(MISC_BASE + 0x110))
+#define BIST4_STS_RES          ((unsigned int *)(MISC_BASE + 0x114))
+#define BIST5_STS_RES          ((unsigned int *)(MISC_BASE + 0x118))
+#define SYSERR_CFG_CTR         ((unsigned int *)(MISC_BASE + 0x11C))
+
+#endif /* __MACH_MISC_REGS_H */
diff --git a/arch/arm/mach-spear6xx/include/mach/spear.h b/arch/arm/mach-spear6xx/include/mach/spear.h
new file mode 100644 (file)
index 0000000..a835f5b
--- /dev/null
@@ -0,0 +1,173 @@
+/*
+ * arch/arm/mach-spear6xx/include/mach/spear.h
+ *
+ * SPEAr6xx Machine family specific definition
+ *
+ * Copyright (C) 2009 ST Microelectronics
+ * Rajeev Kumar<rajeev-dlh.kumar@st.com>
+ *
+ * This file is licensed under the terms of the GNU General Public
+ * License version 2. This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+ */
+
+#ifndef __MACH_SPEAR6XX_H
+#define __MACH_SPEAR6XX_H
+
+#include <mach/hardware.h>
+#include <mach/spear600.h>
+
+#define SPEAR6XX_ML_SDRAM_BASE         0x00000000
+#define SPEAR6XX_ML_SDRAM_SIZE         0x40000000
+
+/* ICM1 - Low speed connection */
+#define SPEAR6XX_ICM1_BASE             0xD0000000
+#define SPEAR6XX_ICM1_SIZE             0x08000000
+
+#define SPEAR6XX_ICM1_UART0_BASE       0xD0000000
+#define VA_SPEAR6XX_ICM1_UART0_BASE    IO_ADDRESS(SPEAR6XX_ICM1_UART0_BASE)
+#define SPEAR6XX_ICM1_UART0_SIZE       0x00080000
+
+#define SPEAR6XX_ICM1_UART1_BASE       0xD0080000
+#define SPEAR6XX_ICM1_UART1_SIZE       0x00080000
+
+#define SPEAR6XX_ICM1_SSP0_BASE                0xD0100000
+#define SPEAR6XX_ICM1_SSP0_SIZE                0x00080000
+
+#define SPEAR6XX_ICM1_SSP1_BASE                0xD0180000
+#define SPEAR6XX_ICM1_SSP1_SIZE                0x00080000
+
+#define SPEAR6XX_ICM1_I2C_BASE         0xD0200000
+#define SPEAR6XX_ICM1_I2C_SIZE         0x00080000
+
+#define SPEAR6XX_ICM1_JPEG_BASE                0xD0800000
+#define SPEAR6XX_ICM1_JPEG_SIZE                0x00800000
+
+#define SPEAR6XX_ICM1_IRDA_BASE                0xD1000000
+#define SPEAR6XX_ICM1_IRDA_SIZE                0x00800000
+
+#define SPEAR6XX_ICM1_FSMC_BASE                0xD1800000
+#define SPEAR6XX_ICM1_FSMC_SIZE                0x00800000
+
+#define SPEAR6XX_ICM1_NAND_BASE                0xD2000000
+#define SPEAR6XX_ICM1_NAND_SIZE                0x00800000
+
+#define SPEAR6XX_ICM1_SRAM_BASE                0xD2800000
+#define SPEAR6XX_ICM1_SRAM_SIZE                0x00800000
+
+/* ICM2 - Application Subsystem */
+#define SPEAR6XX_ICM2_BASE             0xD8000000
+#define SPEAR6XX_ICM2_SIZE             0x08000000
+
+#define SPEAR6XX_ICM2_TMR0_BASE                0xD8000000
+#define SPEAR6XX_ICM2_TMR0_SIZE                0x00080000
+
+#define SPEAR6XX_ICM2_TMR1_BASE                0xD8080000
+#define SPEAR6XX_ICM2_TMR1_SIZE                0x00080000
+
+#define SPEAR6XX_ICM2_GPIO_BASE                0xD8100000
+#define SPEAR6XX_ICM2_GPIO_SIZE                0x00080000
+
+#define SPEAR6XX_ICM2_SPI2_BASE                0xD8180000
+#define SPEAR6XX_ICM2_SPI2_SIZE                0x00080000
+
+#define SPEAR6XX_ICM2_ADC_BASE         0xD8200000
+#define SPEAR6XX_ICM2_ADC_SIZE         0x00080000
+
+/* ML-1, 2 - Multi Layer CPU Subsystem */
+#define SPEAR6XX_ML_CPU_BASE           0xF0000000
+#define SPEAR6XX_ML_CPU_SIZE           0x08000000
+
+#define SPEAR6XX_CPU_TMR_BASE          0xF0000000
+#define SPEAR6XX_CPU_TMR_SIZE          0x00100000
+
+#define SPEAR6XX_CPU_GPIO_BASE         0xF0100000
+#define SPEAR6XX_CPU_GPIO_SIZE         0x00100000
+
+#define SPEAR6XX_CPU_VIC_SEC_BASE      0xF1000000
+#define VA_SPEAR6XX_CPU_VIC_SEC_BASE   IO_ADDRESS(SPEAR6XX_CPU_VIC_SEC_BASE)
+#define SPEAR6XX_CPU_VIC_SEC_SIZE      0x00100000
+
+#define SPEAR6XX_CPU_VIC_PRI_BASE      0xF1100000
+#define VA_SPEAR6XX_CPU_VIC_PRI_BASE   IO_ADDRESS(SPEAR6XX_CPU_VIC_PRI_BASE)
+#define SPEAR6XX_CPU_VIC_PRI_SIZE      0x00100000
+
+/* ICM3 - Basic Subsystem */
+#define SPEAR6XX_ICM3_BASE             0xF8000000
+#define SPEAR6XX_ICM3_SIZE             0x08000000
+
+#define SPEAR6XX_ICM3_SMEM_BASE                0xF8000000
+#define SPEAR6XX_ICM3_SMEM_SIZE                0x04000000
+
+#define SPEAR6XX_ICM3_SMI_CTRL_BASE    0xFC000000
+#define SPEAR6XX_ICM3_SMI_CTRL_SIZE    0x00200000
+
+#define SPEAR6XX_ICM3_CLCD_BASE                0xFC200000
+#define SPEAR6XX_ICM3_CLCD_SIZE                0x00200000
+
+#define SPEAR6XX_ICM3_DMA_BASE         0xFC400000
+#define SPEAR6XX_ICM3_DMA_SIZE         0x00200000
+
+#define SPEAR6XX_ICM3_SDRAM_CTRL_BASE  0xFC600000
+#define SPEAR6XX_ICM3_SDRAM_CTRL_SIZE  0x00200000
+
+#define SPEAR6XX_ICM3_TMR_BASE         0xFC800000
+#define SPEAR6XX_ICM3_TMR_SIZE         0x00080000
+
+#define SPEAR6XX_ICM3_WDT_BASE         0xFC880000
+#define SPEAR6XX_ICM3_WDT_SIZE         0x00080000
+
+#define SPEAR6XX_ICM3_RTC_BASE         0xFC900000
+#define SPEAR6XX_ICM3_RTC_SIZE         0x00080000
+
+#define SPEAR6XX_ICM3_GPIO_BASE                0xFC980000
+#define SPEAR6XX_ICM3_GPIO_SIZE                0x00080000
+
+#define SPEAR6XX_ICM3_SYS_CTRL_BASE    0xFCA00000
+#define VA_SPEAR6XX_ICM3_SYS_CTRL_BASE IO_ADDRESS(SPEAR6XX_ICM3_SYS_CTRL_BASE)
+#define SPEAR6XX_ICM3_SYS_CTRL_SIZE    0x00080000
+
+#define SPEAR6XX_ICM3_MISC_REG_BASE    0xFCA80000
+#define VA_SPEAR6XX_ICM3_MISC_REG_BASE IO_ADDRESS(SPEAR6XX_ICM3_MISC_REG_BASE)
+#define SPEAR6XX_ICM3_MISC_REG_SIZE    0x00080000
+
+/* ICM4 - High Speed Connection */
+#define SPEAR6XX_ICM4_BASE             0xE0000000
+#define SPEAR6XX_ICM4_SIZE             0x08000000
+
+#define SPEAR6XX_ICM4_GMAC_BASE                0xE0800000
+#define SPEAR6XX_ICM4_GMAC_SIZE                0x00800000
+
+#define SPEAR6XX_ICM4_USBD_FIFO_BASE   0xE1000000
+#define SPEAR6XX_ICM4_USBD_FIFO_SIZE   0x00100000
+
+#define SPEAR6XX_ICM4_USBD_CSR_BASE    0xE1100000
+#define SPEAR6XX_ICM4_USBD_CSR_SIZE    0x00100000
+
+#define SPEAR6XX_ICM4_USBD_PLDT_BASE   0xE1200000
+#define SPEAR6XX_ICM4_USBD_PLDT_SIZE   0x00100000
+
+#define SPEAR6XX_ICM4_USB_EHCI0_BASE   0xE1800000
+#define SPEAR6XX_ICM4_USB_EHCI0_SIZE   0x00100000
+
+#define SPEAR6XX_ICM4_USB_OHCI0_BASE   0xE1900000
+#define SPEAR6XX_ICM4_USB_OHCI0_SIZE   0x00100000
+
+#define SPEAR6XX_ICM4_USB_EHCI1_BASE   0xE2000000
+#define SPEAR6XX_ICM4_USB_EHCI1_SIZE   0x00100000
+
+#define SPEAR6XX_ICM4_USB_OHCI1_BASE   0xE2100000
+#define SPEAR6XX_ICM4_USB_OHCI1_SIZE   0x00100000
+
+#define SPEAR6XX_ICM4_USB_ARB_BASE     0xE2800000
+#define SPEAR6XX_ICM4_USB_ARB_SIZE     0x00010000
+
+/* Debug uart for linux, will be used for debug and uncompress messages */
+#define SPEAR_DBG_UART_BASE            SPEAR6XX_ICM1_UART0_BASE
+#define VA_SPEAR_DBG_UART_BASE         VA_SPEAR6XX_ICM1_UART0_BASE
+
+/* Sysctl base for spear platform */
+#define SPEAR_SYS_CTRL_BASE            SPEAR6XX_ICM3_SYS_CTRL_BASE
+#define VA_SPEAR_SYS_CTRL_BASE         VA_SPEAR6XX_ICM3_SYS_CTRL_BASE
+
+#endif /* __MACH_SPEAR6XX_H */
diff --git a/arch/arm/mach-spear6xx/include/mach/spear600.h b/arch/arm/mach-spear6xx/include/mach/spear600.h
new file mode 100644 (file)
index 0000000..c068cc5
--- /dev/null
@@ -0,0 +1,21 @@
+/*
+ * arch/arm/mach-spear66xx/include/mach/spear600.h
+ *
+ * SPEAr600 Machine specific definition
+ *
+ * Copyright (C) 2009 ST Microelectronics
+ * Viresh Kumar<viresh.kumar@st.com>
+ *
+ * This file is licensed under the terms of the GNU General Public
+ * License version 2. This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+ */
+
+#ifdef CONFIG_MACH_SPEAR600
+
+#ifndef __MACH_SPEAR600_H
+#define __MACH_SPEAR600_H
+
+#endif /* __MACH_SPEAR600_H */
+
+#endif /* CONFIG_MACH_SPEAR600 */
diff --git a/arch/arm/mach-spear6xx/include/mach/system.h b/arch/arm/mach-spear6xx/include/mach/system.h
new file mode 100644 (file)
index 0000000..0b1d2be
--- /dev/null
@@ -0,0 +1,19 @@
+/*
+ * arch/arm/mach-spear6xx/include/mach/system.h
+ *
+ * SPEAr6xx Machine family specific architecture functions
+ *
+ * Copyright (C) 2009 ST Microelectronics
+ * Rajeev Kumar<rajeev-dlh.kumar@st.com>
+ *
+ * This file is licensed under the terms of the GNU General Public
+ * License version 2. This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+ */
+
+#ifndef __MACH_SYSTEM_H
+#define __MACH_SYSTEM_H
+
+#include <plat/system.h>
+
+#endif /* __MACH_SYSTEM_H */
diff --git a/arch/arm/mach-spear6xx/include/mach/timex.h b/arch/arm/mach-spear6xx/include/mach/timex.h
new file mode 100644 (file)
index 0000000..ac1c5b0
--- /dev/null
@@ -0,0 +1,19 @@
+/*
+ * arch/arm/mach-spear6xx/include/mach/timex.h
+ *
+ * SPEAr6XX machine family specific timex definitions
+ *
+ * Copyright (C) 2009 ST Microelectronics
+ * Rajeev Kumar<rajeev-dlh.kumar@st.com>
+ *
+ * This file is licensed under the terms of the GNU General Public
+ * License version 2. This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+ */
+
+#ifndef __MACH_TIMEX_H
+#define __MACH_TIMEX_H
+
+#include <plat/timex.h>
+
+#endif /* __MACH_TIMEX_H */
diff --git a/arch/arm/mach-spear6xx/include/mach/uncompress.h b/arch/arm/mach-spear6xx/include/mach/uncompress.h
new file mode 100644 (file)
index 0000000..77f0765
--- /dev/null
@@ -0,0 +1,19 @@
+/*
+ * arch/arm/mach-spear6xx/include/mach/uncompress.h
+ *
+ * Serial port stubs for kernel decompress status messages
+ *
+ * Copyright (C) 2009 ST Microelectronics
+ * Rajeev Kumar<rajeev-dlh.kumar@st.com>
+ *
+ * This file is licensed under the terms of the GNU General Public
+ * License version 2. This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+ */
+
+#ifndef __MACH_UNCOMPRESS_H
+#define __MACH_UNCOMPRESS_H
+
+#include <plat/uncompress.h>
+
+#endif /* __MACH_UNCOMPRESS_H */
diff --git a/arch/arm/mach-spear6xx/include/mach/vmalloc.h b/arch/arm/mach-spear6xx/include/mach/vmalloc.h
new file mode 100644 (file)
index 0000000..4a0b56c
--- /dev/null
@@ -0,0 +1,19 @@
+/*
+ * arch/arm/mach-spear6xx/include/mach/vmalloc.h
+ *
+ * Defining Vmalloc area for SPEAr6xx machine family
+ *
+ * Copyright (C) 2009 ST Microelectronics
+ * Rajeev Kumar<rajeev-dlh.kumar@st.com>
+ *
+ * This file is licensed under the terms of the GNU General Public
+ * License version 2. This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+ */
+
+#ifndef __MACH_VMALLOC_H
+#define __MACH_VMALLOC_H
+
+#include <plat/vmalloc.h>
+
+#endif /* __MACH_VMALLOC_H */
diff --git a/arch/arm/mach-spear6xx/spear600.c b/arch/arm/mach-spear6xx/spear600.c
new file mode 100644 (file)
index 0000000..5c484c4
--- /dev/null
@@ -0,0 +1,25 @@
+/*
+ * arch/arm/mach-spear6xx/spear600.c
+ *
+ * SPEAr600 machine source file
+ *
+ * Copyright (C) 2009 ST Microelectronics
+ * Rajeev Kumar<rajeev-dlh.kumar@st.com>
+ *
+ * This file is licensed under the terms of the GNU General Public
+ * License version 2. This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+ */
+
+#include <linux/ptrace.h>
+#include <asm/irq.h>
+#include <mach/generic.h>
+#include <mach/spear.h>
+
+/* Add spear600 specific devices here */
+
+void __init spear600_init(void)
+{
+       /* call spear6xx family common init function */
+       spear6xx_init();
+}
diff --git a/arch/arm/mach-spear6xx/spear600_evb.c b/arch/arm/mach-spear6xx/spear600_evb.c
new file mode 100644 (file)
index 0000000..daff8d0
--- /dev/null
@@ -0,0 +1,51 @@
+/*
+ * arch/arm/mach-spear6xx/spear600_evb.c
+ *
+ * SPEAr600 evaluation board source file
+ *
+ * Copyright (C) 2009 ST Microelectronics
+ * Viresh Kumar<viresh.kumar@st.com>
+ *
+ * This file is licensed under the terms of the GNU General Public
+ * License version 2. This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+ */
+
+#include <asm/mach/arch.h>
+#include <asm/mach-types.h>
+#include <mach/generic.h>
+#include <mach/spear.h>
+
+static struct amba_device *amba_devs[] __initdata = {
+       &gpio_device[0],
+       &gpio_device[1],
+       &gpio_device[2],
+       &uart_device[0],
+       &uart_device[1],
+};
+
+static struct platform_device *plat_devs[] __initdata = {
+};
+
+static void __init spear600_evb_init(void)
+{
+       unsigned int i;
+
+       /* call spear600 machine init function */
+       spear600_init();
+
+       /* Add Platform Devices */
+       platform_add_devices(plat_devs, ARRAY_SIZE(plat_devs));
+
+       /* Add Amba Devices */
+       for (i = 0; i < ARRAY_SIZE(amba_devs); i++)
+               amba_device_register(amba_devs[i], &iomem_resource);
+}
+
+MACHINE_START(SPEAR600, "ST-SPEAR600-EVB")
+       .boot_params    =       0x00000100,
+       .map_io         =       spear6xx_map_io,
+       .init_irq       =       spear6xx_init_irq,
+       .timer          =       &spear_sys_timer,
+       .init_machine   =       spear600_evb_init,
+MACHINE_END
diff --git a/arch/arm/mach-spear6xx/spear6xx.c b/arch/arm/mach-spear6xx/spear6xx.c
new file mode 100644 (file)
index 0000000..b67e571
--- /dev/null
@@ -0,0 +1,158 @@
+/*
+ * arch/arm/mach-spear6xx/spear6xx.c
+ *
+ * SPEAr6XX machines common source file
+ *
+ * Copyright (C) 2009 ST Microelectronics
+ * Rajeev Kumar<rajeev-dlh.kumar@st.com>
+ *
+ * This file is licensed under the terms of the GNU General Public
+ * License version 2. This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+ */
+
+#include <linux/types.h>
+#include <linux/amba/pl061.h>
+#include <linux/types.h>
+#include <linux/ptrace.h>
+#include <linux/io.h>
+#include <asm/hardware/vic.h>
+#include <asm/irq.h>
+#include <asm/mach/arch.h>
+#include <mach/irqs.h>
+#include <mach/generic.h>
+#include <mach/spear.h>
+
+/* Add spear6xx machines common devices here */
+/* uart device registeration */
+struct amba_device uart_device[] = {
+       {
+               .dev = {
+                       .init_name = "uart0",
+               },
+               .res = {
+                       .start = SPEAR6XX_ICM1_UART0_BASE,
+                       .end = SPEAR6XX_ICM1_UART0_BASE +
+                               SPEAR6XX_ICM1_UART0_SIZE - 1,
+                       .flags = IORESOURCE_MEM,
+               },
+               .irq = {IRQ_UART_0, NO_IRQ},
+       }, {
+               .dev = {
+                       .init_name = "uart1",
+               },
+               .res = {
+                       .start = SPEAR6XX_ICM1_UART1_BASE,
+                       .end = SPEAR6XX_ICM1_UART1_BASE +
+                               SPEAR6XX_ICM1_UART1_SIZE - 1,
+                       .flags = IORESOURCE_MEM,
+               },
+               .irq = {IRQ_UART_1, NO_IRQ},
+       }
+};
+
+/* gpio device registeration */
+static struct pl061_platform_data gpio_plat_data[] = {
+       {
+               .gpio_base      = 0,
+               .irq_base       = SPEAR_GPIO0_INT_BASE,
+       }, {
+               .gpio_base      = 8,
+               .irq_base       = SPEAR_GPIO1_INT_BASE,
+       }, {
+               .gpio_base      = 16,
+               .irq_base       = SPEAR_GPIO2_INT_BASE,
+       },
+};
+
+struct amba_device gpio_device[] = {
+       {
+               .dev = {
+                       .init_name = "gpio0",
+                       .platform_data = &gpio_plat_data[0],
+               },
+               .res = {
+                       .start = SPEAR6XX_CPU_GPIO_BASE,
+                       .end = SPEAR6XX_CPU_GPIO_BASE +
+                               SPEAR6XX_CPU_GPIO_SIZE - 1,
+                       .flags = IORESOURCE_MEM,
+               },
+               .irq = {IRQ_LOCAL_GPIO, NO_IRQ},
+       }, {
+               .dev = {
+                       .init_name = "gpio1",
+                       .platform_data = &gpio_plat_data[1],
+               },
+               .res = {
+                       .start = SPEAR6XX_ICM3_GPIO_BASE,
+                       .end = SPEAR6XX_ICM3_GPIO_BASE +
+                               SPEAR6XX_ICM3_GPIO_SIZE - 1,
+                       .flags = IORESOURCE_MEM,
+               },
+               .irq = {IRQ_BASIC_GPIO, NO_IRQ},
+       }, {
+               .dev = {
+                       .init_name = "gpio2",
+                       .platform_data = &gpio_plat_data[2],
+               },
+               .res = {
+                       .start = SPEAR6XX_ICM2_GPIO_BASE,
+                       .end = SPEAR6XX_ICM2_GPIO_BASE +
+                               SPEAR6XX_ICM2_GPIO_SIZE - 1,
+                       .flags = IORESOURCE_MEM,
+               },
+               .irq = {IRQ_APPL_GPIO, NO_IRQ},
+       }
+};
+
+/* This will add devices, and do machine specific tasks */
+void __init spear6xx_init(void)
+{
+       /* nothing to do for now */
+}
+
+/* This will initialize vic */
+void __init spear6xx_init_irq(void)
+{
+       vic_init((void __iomem *)VA_SPEAR6XX_CPU_VIC_PRI_BASE, 0, ~0, 0);
+       vic_init((void __iomem *)VA_SPEAR6XX_CPU_VIC_SEC_BASE, 32, ~0, 0);
+}
+
+/* Following will create static virtual/physical mappings */
+static struct map_desc spear6xx_io_desc[] __initdata = {
+       {
+               .virtual        = VA_SPEAR6XX_ICM1_UART0_BASE,
+               .pfn            = __phys_to_pfn(SPEAR6XX_ICM1_UART0_BASE),
+               .length         = SPEAR6XX_ICM1_UART0_SIZE,
+               .type           = MT_DEVICE
+       }, {
+               .virtual        = VA_SPEAR6XX_CPU_VIC_PRI_BASE,
+               .pfn            = __phys_to_pfn(SPEAR6XX_CPU_VIC_PRI_BASE),
+               .length         = SPEAR6XX_CPU_VIC_PRI_SIZE,
+               .type           = MT_DEVICE
+       }, {
+               .virtual        = VA_SPEAR6XX_CPU_VIC_SEC_BASE,
+               .pfn            = __phys_to_pfn(SPEAR6XX_CPU_VIC_SEC_BASE),
+               .length         = SPEAR6XX_CPU_VIC_SEC_SIZE,
+               .type           = MT_DEVICE
+       }, {
+               .virtual        = VA_SPEAR6XX_ICM3_SYS_CTRL_BASE,
+               .pfn            = __phys_to_pfn(SPEAR6XX_ICM3_SYS_CTRL_BASE),
+               .length         = SPEAR6XX_ICM3_MISC_REG_BASE,
+               .type           = MT_DEVICE
+       }, {
+               .virtual        = VA_SPEAR6XX_ICM3_MISC_REG_BASE,
+               .pfn            = __phys_to_pfn(SPEAR6XX_ICM3_MISC_REG_BASE),
+               .length         = SPEAR6XX_ICM3_MISC_REG_SIZE,
+               .type           = MT_DEVICE
+       },
+};
+
+/* This will create static memory mapping for selected devices */
+void __init spear6xx_map_io(void)
+{
+       iotable_init(spear6xx_io_desc, ARRAY_SIZE(spear6xx_io_desc));
+
+       /* This will initialize clock framework */
+       clk_init();
+}
index 77fbb1e..88506d0 100644 (file)
@@ -102,11 +102,12 @@ int __devinit mmc_init(struct amba_device *adev)
         * we have a regulator we can control instead.
         */
        /* Nominally 2.85V on our platform */
+       mmci_card->mmc0_plat_data.f_max = 24000000;
        mmci_card->mmc0_plat_data.status = mmc_status;
        mmci_card->mmc0_plat_data.gpio_wp = -1;
        mmci_card->mmc0_plat_data.gpio_cd = -1;
        mmci_card->mmc0_plat_data.capabilities = MMC_CAP_MMC_HIGHSPEED |
-               MMC_CAP_SD_HIGHSPEED | MMC_CAP_4_BIT_DATA;
+               MMC_CAP_SD_HIGHSPEED | MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA;
 
        mmcsd_device->platform_data = (void *) &mmci_card->mmc0_plat_data;
 
index 03625d7..6625e5b 100644 (file)
@@ -1,15 +1,42 @@
-menu "ST-Ericsson platform type"
-       depends on ARCH_U8500
+if ARCH_U8500
 
-comment "ST-Ericsson Multicore Mobile Platforms"
-
-config MACH_U8500_MOP
-       bool "U8500 Early Development platform"
+config UX500_SOC_COMMON
+       bool
        default y
        select ARM_GIC
        select HAS_MTU
+       select NOMADIK_GPIO
+
+config UX500_SOC_DB8500
+       bool
+
+config UX500_SOC_DB5500
+       bool
+
+choice
+       prompt "Ux500 target platform"
+       default MACH_U8500_MOP
+
+config MACH_U8500_MOP
+       bool "U8500 Development platform"
+       select UX500_SOC_DB8500
        help
          Include support for mop500 development platform
          based on U8500 architecture. The platform is based
          on early drop silicon version of 8500.
-endmenu
+
+config MACH_U5500
+       bool "U5500 Development platform"
+       select UX500_SOC_DB5500
+       help
+         Include support for the U5500 development platform.
+endchoice
+
+config UX500_DEBUG_UART
+       int "Ux500 UART to use for low-level debug"
+       default 2
+       help
+         Choose the UART on which kernel low-level debug messages should be
+         output.
+
+endif
index 95e6e24..c7bc419 100644 (file)
@@ -2,7 +2,9 @@
 # Makefile for the linux kernel, U8500 machine.
 #
 
-obj-y                          := clock.o
-obj-$(CONFIG_ARCH_U8500)       += cpu-u8500.o
+obj-y                          := clock.o cpu.o devices.o
+obj-$(CONFIG_UX500_SOC_DB5500) += cpu-db5500.o devices-db5500.o
+obj-$(CONFIG_UX500_SOC_DB8500) += cpu-db8500.o devices-db8500.o
 obj-$(CONFIG_MACH_U8500_MOP)   += board-mop500.o
+obj-$(CONFIG_MACH_U5500)       += board-u5500.o
 obj-$(CONFIG_SMP)              += platsmp.o headsmp.o localtimer.o
index 803aec1..072196c 100644 (file)
 #include <linux/amba/pl022.h>
 #include <linux/spi/spi.h>
 
-#include <asm/localtimer.h>
 #include <asm/mach-types.h>
 #include <asm/mach/arch.h>
 
-#include <plat/mtu.h>
 #include <plat/i2c.h>
 
 #include <mach/hardware.h>
 #include <mach/setup.h>
-
-#define __MEM_4K_RESOURCE(x) \
-       .res = {.start = (x), .end = (x) + SZ_4K - 1, .flags = IORESOURCE_MEM}
-
-/* These are active devices on this board */
-static struct amba_device uart0_device = {
-       .dev = { .init_name = "uart0" },
-       __MEM_4K_RESOURCE(U8500_UART0_BASE),
-       .irq = {IRQ_UART0, NO_IRQ},
-};
-
-static struct amba_device uart1_device = {
-       .dev = { .init_name = "uart1" },
-       __MEM_4K_RESOURCE(U8500_UART1_BASE),
-       .irq = {IRQ_UART1, NO_IRQ},
-};
-
-static struct amba_device uart2_device = {
-       .dev = { .init_name = "uart2" },
-       __MEM_4K_RESOURCE(U8500_UART2_BASE),
-       .irq = {IRQ_UART2, NO_IRQ},
-};
+#include <mach/devices.h>
 
 static void ab4500_spi_cs_control(u32 command)
 {
@@ -93,55 +70,8 @@ static struct pl022_ssp_controller ssp0_platform_data = {
        .num_chipselect = 5,
 };
 
-static struct amba_device pl022_device = {
-       .dev = {
-               .coherent_dma_mask = ~0,
-               .init_name = "pl022",
-               .platform_data = &ssp0_platform_data,
-       },
-       .res = {
-               .start = U8500_SSP0_BASE,
-               .end   = U8500_SSP0_BASE + SZ_4K - 1,
-               .flags = IORESOURCE_MEM,
-       },
-       .irq = {IRQ_SSP0, NO_IRQ },
-       /* ST-Ericsson modified id */
-       .periphid = SSP_PER_ID,
-};
-
-static struct amba_device pl031_device = {
-       .dev = {
-               .init_name = "pl031",
-       },
-       .res = {
-               .start = U8500_RTC_BASE,
-               .end = U8500_RTC_BASE + SZ_4K - 1,
-               .flags = IORESOURCE_MEM,
-       },
-       .irq = {IRQ_RTC_RTT, NO_IRQ},
-};
-
-#define U8500_I2C_RESOURCES(id, size)          \
-static struct resource u8500_i2c_resources_##id[] = {  \
-       [0] = {                                 \
-               .start  = U8500_I2C##id##_BASE, \
-               .end    = U8500_I2C##id##_BASE + size - 1, \
-               .flags  = IORESOURCE_MEM,       \
-       },                                      \
-       [1] = {                                 \
-               .start  = IRQ_I2C##id,          \
-               .end    = IRQ_I2C##id,          \
-               .flags  = IORESOURCE_IRQ        \
-       }                                       \
-}
-
-U8500_I2C_RESOURCES(0, SZ_4K);
-U8500_I2C_RESOURCES(1, SZ_4K);
-U8500_I2C_RESOURCES(2, SZ_4K);
-U8500_I2C_RESOURCES(3, SZ_4K);
-
 #define U8500_I2C_CONTROLLER(id, _slsu, _tft, _rft, clk, _sm) \
-static struct nmk_i2c_controller u8500_i2c_##id = { \
+static struct nmk_i2c_controller u8500_i2c##id##_data = { \
        /*                              \
         * slave data setup time, which is      \
         * 250 ns,100ns,10ns which is 14,6,2    \
@@ -169,58 +99,32 @@ U8500_I2C_CONTROLLER(1, 0xe, 1, 1, 100000, I2C_FREQ_MODE_STANDARD);
 U8500_I2C_CONTROLLER(2,        0xe, 1, 1, 100000, I2C_FREQ_MODE_STANDARD);
 U8500_I2C_CONTROLLER(3,        0xe, 1, 1, 100000, I2C_FREQ_MODE_STANDARD);
 
-#define U8500_I2C_PDEVICE(cid)         \
-static struct platform_device i2c_controller##cid = { \
-       .name = "nmk-i2c",              \
-       .id      = cid,                 \
-       .num_resources = 2,             \
-       .resource = u8500_i2c_resources_##cid,  \
-       .dev = {                        \
-               .platform_data = &u8500_i2c_##cid \
-       }                               \
-}
-
-U8500_I2C_PDEVICE(0);
-U8500_I2C_PDEVICE(1);
-U8500_I2C_PDEVICE(2);
-U8500_I2C_PDEVICE(3);
-
 static struct amba_device *amba_devs[] __initdata = {
-       &uart0_device,
-       &uart1_device,
-       &uart2_device,
-       &pl022_device,
-       &pl031_device,
+       &ux500_uart0_device,
+       &ux500_uart1_device,
+       &ux500_uart2_device,
+       &u8500_ssp0_device,
 };
 
 /* add any platform devices here - TODO */
 static struct platform_device *platform_devs[] __initdata = {
-       &i2c_controller0,
-       &i2c_controller1,
-       &i2c_controller2,
-       &i2c_controller3,
-};
-
-static void __init u8500_timer_init(void)
-{
-#ifdef CONFIG_LOCAL_TIMERS
-       /* Setup the local timer base */
-       twd_base = __io_address(U8500_TWD_BASE);
-#endif
-       /* Setup the MTU base */
-       mtu_base = __io_address(U8500_MTU0_BASE);
-
-       nmdk_timer_init();
-}
-
-static struct sys_timer u8500_timer = {
-       .init   = u8500_timer_init,
+       &u8500_i2c0_device,
+       &ux500_i2c1_device,
+       &ux500_i2c2_device,
+       &ux500_i2c3_device,
 };
 
 static void __init u8500_init_machine(void)
 {
        int i;
 
+       u8500_i2c0_device.dev.platform_data = &u8500_i2c0_data;
+       ux500_i2c1_device.dev.platform_data = &u8500_i2c1_data;
+       ux500_i2c2_device.dev.platform_data = &u8500_i2c2_data;
+       ux500_i2c3_device.dev.platform_data = &u8500_i2c3_data;
+
+       u8500_ssp0_device.dev.platform_data = &ssp0_platform_data;
+
        /* Register the active AMBA devices on this board */
        for (i = 0; i < ARRAY_SIZE(amba_devs); i++)
                amba_device_register(amba_devs[i], &iomem_resource);
@@ -239,8 +143,8 @@ MACHINE_START(U8500, "ST-Ericsson MOP500 platform")
        .io_pg_offst    = (IO_ADDRESS(U8500_UART2_BASE) >> 18) & 0xfffc,
        .boot_params    = 0x100,
        .map_io         = u8500_map_io,
-       .init_irq       = u8500_init_irq,
+       .init_irq       = ux500_init_irq,
        /* we re-use nomadik timer here */
-       .timer          = &u8500_timer,
+       .timer          = &ux500_timer,
        .init_machine   = u8500_init_machine,
 MACHINE_END
diff --git a/arch/arm/mach-ux500/board-u5500.c b/arch/arm/mach-ux500/board-u5500.c
new file mode 100644 (file)
index 0000000..4430e69
--- /dev/null
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) ST-Ericsson SA 2010
+ *
+ * Author: Rabin Vincent <rabin.vincent@stericsson.com> for ST-Ericsson
+ * License terms: GNU General Public License (GPL) version 2
+ */
+
+#include <linux/init.h>
+#include <linux/platform_device.h>
+#include <linux/amba/bus.h>
+#include <linux/gpio.h>
+
+#include <asm/mach/arch.h>
+#include <asm/mach-types.h>
+
+#include <mach/hardware.h>
+#include <mach/devices.h>
+#include <mach/setup.h>
+
+static struct amba_device *amba_board_devs[] __initdata = {
+       &ux500_uart0_device,
+       &ux500_uart1_device,
+       &ux500_uart2_device,
+};
+
+static void __init u5500_init_machine(void)
+{
+       u5500_init_devices();
+
+       amba_add_devices(amba_board_devs, ARRAY_SIZE(amba_board_devs));
+}
+
+MACHINE_START(U8500, "ST-Ericsson U5500 Platform")
+       .phys_io        = UX500_UART0_BASE,
+       .io_pg_offst    = (IO_ADDRESS(UX500_UART0_BASE) >> 18) & 0xfffc,
+       .boot_params    = 0x00000100,
+       .map_io         = u5500_map_io,
+       .init_irq       = ux500_init_irq,
+       .timer          = &ux500_timer,
+       .init_machine   = u5500_init_machine,
+MACHINE_END
index 8359a73..1b2c989 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *  Copyright (C) 2009 ST-Ericsson
- *     heavily based on realview platform
+ *  Copyright (C) 2009 STMicroelectronics
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 as
 #include <linux/errno.h>
 #include <linux/err.h>
 #include <linux/clk.h>
-#include <linux/mutex.h>
+#include <linux/io.h>
 
 #include <asm/clkdev.h>
 
-/* currently the clk structure
- * just supports rate. This would
- * be extended as and when new devices are
- * added - TODO
- */
-struct clk {
-       unsigned long           rate;
-};
+#include <mach/hardware.h>
+#include "clock.h"
+
+#define PRCC_PCKEN             0x00
+#define PRCC_PCKDIS            0x04
+#define PRCC_KCKEN             0x08
+#define PRCC_KCKDIS            0x0C
+
+#define PRCM_YYCLKEN0_MGT_SET  0x510
+#define PRCM_YYCLKEN1_MGT_SET  0x514
+#define PRCM_YYCLKEN0_MGT_CLR  0x518
+#define PRCM_YYCLKEN1_MGT_CLR  0x51C
+#define PRCM_YYCLKEN0_MGT_VAL  0x520
+#define PRCM_YYCLKEN1_MGT_VAL  0x524
+
+#define PRCM_SVAMMDSPCLK_MGT   0x008
+#define PRCM_SIAMMDSPCLK_MGT   0x00C
+#define PRCM_SGACLK_MGT                0x014
+#define PRCM_UARTCLK_MGT       0x018
+#define PRCM_MSP02CLK_MGT      0x01C
+#define PRCM_MSP1CLK_MGT       0x288
+#define PRCM_I2CCLK_MGT                0x020
+#define PRCM_SDMMCCLK_MGT      0x024
+#define PRCM_SLIMCLK_MGT       0x028
+#define PRCM_PER1CLK_MGT       0x02C
+#define PRCM_PER2CLK_MGT       0x030
+#define PRCM_PER3CLK_MGT       0x034
+#define PRCM_PER5CLK_MGT       0x038
+#define PRCM_PER6CLK_MGT       0x03C
+#define PRCM_PER7CLK_MGT       0x040
+#define PRCM_LCDCLK_MGT                0x044
+#define PRCM_BMLCLK_MGT                0x04C
+#define PRCM_HSITXCLK_MGT      0x050
+#define PRCM_HSIRXCLK_MGT      0x054
+#define PRCM_HDMICLK_MGT       0x058
+#define PRCM_APEATCLK_MGT      0x05C
+#define PRCM_APETRACECLK_MGT   0x060
+#define PRCM_MCDECLK_MGT       0x064
+#define PRCM_IPI2CCLK_MGT      0x068
+#define PRCM_DSIALTCLK_MGT     0x06C
+#define PRCM_DMACLK_MGT                0x074
+#define PRCM_B2R2CLK_MGT       0x078
+#define PRCM_TVCLK_MGT         0x07C
+#define PRCM_UNIPROCLK_MGT     0x278
+#define PRCM_SSPCLK_MGT                0x280
+#define PRCM_RNGCLK_MGT                0x284
+#define PRCM_UICCCLK_MGT       0x27C
+
+#define PRCM_MGT_ENABLE                (1 << 8)
+
+static DEFINE_SPINLOCK(clocks_lock);
+
+static void __clk_enable(struct clk *clk)
+{
+       if (clk->enabled++ == 0) {
+               if (clk->parent_cluster)
+                       __clk_enable(clk->parent_cluster);
+
+               if (clk->parent_periph)
+                       __clk_enable(clk->parent_periph);
+
+               if (clk->ops && clk->ops->enable)
+                       clk->ops->enable(clk);
+       }
+}
 
 int clk_enable(struct clk *clk)
 {
+       unsigned long flags;
+
+       spin_lock_irqsave(&clocks_lock, flags);
+       __clk_enable(clk);
+       spin_unlock_irqrestore(&clocks_lock, flags);
+
        return 0;
 }
 EXPORT_SYMBOL(clk_enable);
 
+static void __clk_disable(struct clk *clk)
+{
+       if (--clk->enabled == 0) {
+               if (clk->ops && clk->ops->disable)
+                       clk->ops->disable(clk);
+
+               if (clk->parent_periph)
+                       __clk_disable(clk->parent_periph);
+
+               if (clk->parent_cluster)
+                       __clk_disable(clk->parent_cluster);
+       }
+}
+
 void clk_disable(struct clk *clk)
 {
+       unsigned long flags;
+
+       WARN_ON(!clk->enabled);
+
+       spin_lock_irqsave(&clocks_lock, flags);
+       __clk_disable(clk);
+       spin_unlock_irqrestore(&clocks_lock, flags);
 }
 EXPORT_SYMBOL(clk_disable);
 
 unsigned long clk_get_rate(struct clk *clk)
 {
-       return clk->rate;
+       unsigned long rate;
+
+       if (clk->ops && clk->ops->get_rate)
+               return clk->ops->get_rate(clk);
+
+       rate = clk->rate;
+       if (!rate) {
+               if (clk->parent_periph)
+                       rate = clk_get_rate(clk->parent_periph);
+               else if (clk->parent_cluster)
+                       rate = clk_get_rate(clk->parent_cluster);
+       }
+
+       return rate;
 }
 EXPORT_SYMBOL(clk_get_rate);
 
@@ -56,37 +153,373 @@ int clk_set_rate(struct clk *clk, unsigned long rate)
 }
 EXPORT_SYMBOL(clk_set_rate);
 
-/* ssp clock */
-static struct clk ssp_clk = {
-       .rate = 48000000,
+static void clk_prcmu_enable(struct clk *clk)
+{
+       void __iomem *cg_set_reg = __io_address(U8500_PRCMU_BASE)
+                                  + PRCM_YYCLKEN0_MGT_SET + clk->prcmu_cg_off;
+
+       writel(1 << clk->prcmu_cg_bit, cg_set_reg);
+}
+
+static void clk_prcmu_disable(struct clk *clk)
+{
+       void __iomem *cg_clr_reg = __io_address(U8500_PRCMU_BASE)
+                                  + PRCM_YYCLKEN0_MGT_CLR + clk->prcmu_cg_off;
+
+       writel(1 << clk->prcmu_cg_bit, cg_clr_reg);
+}
+
+/* ED doesn't have the combined set/clr registers */
+static void clk_prcmu_ed_enable(struct clk *clk)
+{
+       void __iomem *addr = __io_address(U8500_PRCMU_BASE)
+                            + clk->prcmu_cg_mgt;
+
+       writel(readl(addr) | PRCM_MGT_ENABLE, addr);
+}
+
+static void clk_prcmu_ed_disable(struct clk *clk)
+{
+       void __iomem *addr = __io_address(U8500_PRCMU_BASE)
+                            + clk->prcmu_cg_mgt;
+
+       writel(readl(addr) & ~PRCM_MGT_ENABLE, addr);
+}
+
+static struct clkops clk_prcmu_ops = {
+       .enable = clk_prcmu_enable,
+       .disable = clk_prcmu_disable,
 };
 
-/* fixed clock */
-static struct clk f38_clk = {
-       .rate = 38400000,
+static unsigned int clkrst_base[] = {
+       [1] = U8500_CLKRST1_BASE,
+       [2] = U8500_CLKRST2_BASE,
+       [3] = U8500_CLKRST3_BASE,
+       [5] = U8500_CLKRST5_BASE,
+       [6] = U8500_CLKRST6_BASE,
+       [7] = U8500_CLKRST7_BASE_ED,
 };
 
-static struct clk_lookup lookups[] = {
-       {
-               /* UART0 */
-               .dev_id         = "uart0",
-               .clk            = &f38_clk,
-       }, {    /* UART1 */
-               .dev_id         = "uart1",
-               .clk            = &f38_clk,
-       }, {    /* UART2 */
-               .dev_id         = "uart2",
-               .clk            = &f38_clk,
-       }, {    /* SSP */
-               .dev_id         = "pl022",
-               .clk            = &ssp_clk,
-       }
+static void clk_prcc_enable(struct clk *clk)
+{
+       void __iomem *addr = __io_address(clkrst_base[clk->cluster]);
+
+       if (clk->prcc_kernel != -1)
+               writel(1 << clk->prcc_kernel, addr + PRCC_KCKEN);
+
+       if (clk->prcc_bus != -1)
+               writel(1 << clk->prcc_bus, addr + PRCC_PCKEN);
+}
+
+static void clk_prcc_disable(struct clk *clk)
+{
+       void __iomem *addr = __io_address(clkrst_base[clk->cluster]);
+
+       if (clk->prcc_bus != -1)
+               writel(1 << clk->prcc_bus, addr + PRCC_PCKDIS);
+
+       if (clk->prcc_kernel != -1)
+               writel(1 << clk->prcc_kernel, addr + PRCC_KCKDIS);
+}
+
+static struct clkops clk_prcc_ops = {
+       .enable = clk_prcc_enable,
+       .disable = clk_prcc_disable,
+};
+
+static struct clk clk_32khz = {
+       .rate = 32000,
+};
+
+/*
+ * PRCMU level clock gating
+ */
+
+/* Bank 0 */
+static DEFINE_PRCMU_CLK(svaclk,                0x0, 2, SVAMMDSPCLK);
+static DEFINE_PRCMU_CLK(siaclk,                0x0, 3, SIAMMDSPCLK);
+static DEFINE_PRCMU_CLK(sgaclk,                0x0, 4, SGACLK);
+static DEFINE_PRCMU_CLK_RATE(uartclk,  0x0, 5, UARTCLK, 38400000);
+static DEFINE_PRCMU_CLK(msp02clk,      0x0, 6, MSP02CLK);
+static DEFINE_PRCMU_CLK(msp1clk,       0x0, 7, MSP1CLK); /* v1 */
+static DEFINE_PRCMU_CLK_RATE(i2cclk,   0x0, 8, I2CCLK, 48000000);
+static DEFINE_PRCMU_CLK_RATE(sdmmcclk, 0x0, 9, SDMMCCLK, 50000000);
+static DEFINE_PRCMU_CLK(slimclk,       0x0, 10, SLIMCLK);
+static DEFINE_PRCMU_CLK(per1clk,       0x0, 11, PER1CLK);
+static DEFINE_PRCMU_CLK(per2clk,       0x0, 12, PER2CLK);
+static DEFINE_PRCMU_CLK(per3clk,       0x0, 13, PER3CLK);
+static DEFINE_PRCMU_CLK(per5clk,       0x0, 14, PER5CLK);
+static DEFINE_PRCMU_CLK_RATE(per6clk,  0x0, 15, PER6CLK, 133330000);
+static DEFINE_PRCMU_CLK_RATE(per7clk,  0x0, 16, PER7CLK, 100000000);
+static DEFINE_PRCMU_CLK(lcdclk,                0x0, 17, LCDCLK);
+static DEFINE_PRCMU_CLK(bmlclk,                0x0, 18, BMLCLK);
+static DEFINE_PRCMU_CLK(hsitxclk,      0x0, 19, HSITXCLK);
+static DEFINE_PRCMU_CLK(hsirxclk,      0x0, 20, HSIRXCLK);
+static DEFINE_PRCMU_CLK(hdmiclk,       0x0, 21, HDMICLK);
+static DEFINE_PRCMU_CLK(apeatclk,      0x0, 22, APEATCLK);
+static DEFINE_PRCMU_CLK(apetraceclk,   0x0, 23, APETRACECLK);
+static DEFINE_PRCMU_CLK(mcdeclk,       0x0, 24, MCDECLK);
+static DEFINE_PRCMU_CLK(ipi2clk,       0x0, 25, IPI2CCLK);
+static DEFINE_PRCMU_CLK(dsialtclk,     0x0, 26, DSIALTCLK); /* v1 */
+static DEFINE_PRCMU_CLK(dmaclk,                0x0, 27, DMACLK);
+static DEFINE_PRCMU_CLK(b2r2clk,       0x0, 28, B2R2CLK);
+static DEFINE_PRCMU_CLK(tvclk,         0x0, 29, TVCLK);
+static DEFINE_PRCMU_CLK(uniproclk,     0x0, 30, UNIPROCLK); /* v1 */
+static DEFINE_PRCMU_CLK_RATE(sspclk,   0x0, 31, SSPCLK, 48000000); /* v1 */
+
+/* Bank 1 */
+static DEFINE_PRCMU_CLK(rngclk,                0x4, 0, RNGCLK); /* v1 */
+static DEFINE_PRCMU_CLK(uiccclk,       0x4, 1, UICCCLK); /* v1 */
+
+/*
+ * PRCC level clock gating
+ * Format: per#, clk, PCKEN bit, KCKEN bit, parent
+ */
+
+/* Peripheral Cluster #1 */
+static DEFINE_PRCC_CLK(1, i2c4,        10, 9, &clk_i2cclk);
+static DEFINE_PRCC_CLK(1, gpio0,       9, -1, NULL);
+static DEFINE_PRCC_CLK(1, slimbus0,    8,  8, &clk_slimclk);
+static DEFINE_PRCC_CLK(1, spi3_ed,     7,  7, NULL);
+static DEFINE_PRCC_CLK(1, spi3_v1,     7, -1, NULL);
+static DEFINE_PRCC_CLK(1, i2c2,        6,  6, &clk_i2cclk);
+static DEFINE_PRCC_CLK(1, sdi0,                5,  5, &clk_sdmmcclk);
+static DEFINE_PRCC_CLK(1, msp1_ed,     4,  4, &clk_msp02clk);
+static DEFINE_PRCC_CLK(1, msp1_v1,     4,  4, &clk_msp1clk);
+static DEFINE_PRCC_CLK(1, msp0,        3,  3, &clk_msp02clk);
+static DEFINE_PRCC_CLK(1, i2c1,        2,  2, &clk_i2cclk);
+static DEFINE_PRCC_CLK(1, uart1,       1,  1, &clk_uartclk);
+static DEFINE_PRCC_CLK(1, uart0,       0,  0, &clk_uartclk);
+
+/* Peripheral Cluster #2 */
+
+static DEFINE_PRCC_CLK(2, gpio1_ed,    12, -1, NULL);
+static DEFINE_PRCC_CLK(2, ssitx_ed,    11, -1, NULL);
+static DEFINE_PRCC_CLK(2, ssirx_ed,    10, -1, NULL);
+static DEFINE_PRCC_CLK(2, spi0_ed,      9, -1, NULL);
+static DEFINE_PRCC_CLK(2, sdi3_ed,      8,  6, &clk_sdmmcclk);
+static DEFINE_PRCC_CLK(2, sdi1_ed,      7,  5, &clk_sdmmcclk);
+static DEFINE_PRCC_CLK(2, msp2_ed,      6,  4, &clk_msp02clk);
+static DEFINE_PRCC_CLK(2, sdi4_ed,      4,  2, &clk_sdmmcclk);
+static DEFINE_PRCC_CLK(2, pwl_ed,       3,  1, NULL);
+static DEFINE_PRCC_CLK(2, spi1_ed,      2, -1, NULL);
+static DEFINE_PRCC_CLK(2, spi2_ed,      1, -1, NULL);
+static DEFINE_PRCC_CLK(2, i2c3_ed,      0,  0, &clk_i2cclk);
+
+static DEFINE_PRCC_CLK(2, gpio1_v1,    11, -1, NULL);
+static DEFINE_PRCC_CLK(2, ssitx_v1,    10,  7, NULL);
+static DEFINE_PRCC_CLK(2, ssirx_v1,     9,  6, NULL);
+static DEFINE_PRCC_CLK(2, spi0_v1,      8, -1, NULL);
+static DEFINE_PRCC_CLK(2, sdi3_v1,      7,  5, &clk_sdmmcclk);
+static DEFINE_PRCC_CLK(2, sdi1_v1,      6,  4, &clk_sdmmcclk);
+static DEFINE_PRCC_CLK(2, msp2_v1,      5,  3, &clk_msp02clk);
+static DEFINE_PRCC_CLK(2, sdi4_v1,      4,  2, &clk_sdmmcclk);
+static DEFINE_PRCC_CLK(2, pwl_v1,       3,  1, NULL);
+static DEFINE_PRCC_CLK(2, spi1_v1,      2, -1, NULL);
+static DEFINE_PRCC_CLK(2, spi2_v1,      1, -1, NULL);
+static DEFINE_PRCC_CLK(2, i2c3_v1,      0,  0, &clk_i2cclk);
+
+/* Peripheral Cluster #3 */
+static DEFINE_PRCC_CLK(3, gpio2,       8, -1, NULL);
+static DEFINE_PRCC_CLK(3, sdi5,        7,  7, &clk_sdmmcclk);
+static DEFINE_PRCC_CLK(3, uart2,       6,  6, &clk_uartclk);
+static DEFINE_PRCC_CLK(3, ske,                 5,  5, &clk_32khz);
+static DEFINE_PRCC_CLK(3, sdi2,        4,  4, &clk_sdmmcclk);
+static DEFINE_PRCC_CLK(3, i2c0,        3,  3, &clk_i2cclk);
+static DEFINE_PRCC_CLK(3, ssp1_ed,     2,  2, &clk_i2cclk);
+static DEFINE_PRCC_CLK(3, ssp0_ed,     1,  1, &clk_i2cclk);
+static DEFINE_PRCC_CLK(3, ssp1_v1,     2,  2, &clk_sspclk);
+static DEFINE_PRCC_CLK(3, ssp0_v1,     1,  1, &clk_sspclk);
+static DEFINE_PRCC_CLK(3, fsmc,        0, -1, NULL);
+
+/* Peripheral Cluster #4 is in the always on domain */
+
+/* Peripheral Cluster #5 */
+static DEFINE_PRCC_CLK(5, gpio3,       1, -1, NULL);
+static DEFINE_PRCC_CLK(5, usb_ed,      0,  0, &clk_i2cclk);
+static DEFINE_PRCC_CLK(5, usb_v1,      0,  0, NULL);
+
+/* Peripheral Cluster #6 */
+
+static DEFINE_PRCC_CLK(6, mtu1_v1,     8, -1, NULL);
+static DEFINE_PRCC_CLK(6, mtu0_v1,     7, -1, NULL);
+static DEFINE_PRCC_CLK(6, cfgreg_v1,   6,  6, NULL);
+static DEFINE_PRCC_CLK(6, dmc_ed,      6,  6, NULL);
+static DEFINE_PRCC_CLK(6, hash1,       5, -1, NULL);
+static DEFINE_PRCC_CLK(6, unipro_v1,   4,  1, &clk_uniproclk);
+static DEFINE_PRCC_CLK(6, cryp1_ed,    4, -1, NULL);
+static DEFINE_PRCC_CLK(6, pka,                 3, -1, NULL);
+static DEFINE_PRCC_CLK(6, hash0,       2, -1, NULL);
+static DEFINE_PRCC_CLK(6, cryp0,       1, -1, NULL);
+static DEFINE_PRCC_CLK(6, rng_ed,      0,  0, &clk_i2cclk);
+static DEFINE_PRCC_CLK(6, rng_v1,      0,  0, &clk_rngclk);
+
+/* Peripheral Cluster #7 */
+
+static DEFINE_PRCC_CLK(7, tzpc0_ed,    4, -1, NULL);
+static DEFINE_PRCC_CLK(7, mtu1_ed,     3, -1, NULL);
+static DEFINE_PRCC_CLK(7, mtu0_ed,     2, -1, NULL);
+static DEFINE_PRCC_CLK(7, wdg_ed,      1, -1, NULL);
+static DEFINE_PRCC_CLK(7, cfgreg_ed,   0, -1, NULL);
+
+static struct clk_lookup u8500_common_clks[] = {
+       /* Peripheral Cluster #1 */
+       CLK(gpio0,      "gpio.0",       NULL),
+       CLK(gpio0,      "gpio.1",       NULL),
+       CLK(slimbus0,   "slimbus0",     NULL),
+       CLK(i2c2,       "nmk-i2c.2",    NULL),
+       CLK(sdi0,       "sdi0",         NULL),
+       CLK(msp0,       "msp0",         NULL),
+       CLK(i2c1,       "nmk-i2c.1",    NULL),
+       CLK(uart1,      "uart1",        NULL),
+       CLK(uart0,      "uart0",        NULL),
+
+       /* Peripheral Cluster #3 */
+       CLK(gpio2,      "gpio.2",       NULL),
+       CLK(gpio2,      "gpio.3",       NULL),
+       CLK(gpio2,      "gpio.4",       NULL),
+       CLK(gpio2,      "gpio.5",       NULL),
+       CLK(sdi5,       "sdi5",         NULL),
+       CLK(uart2,      "uart2",        NULL),
+       CLK(ske,        "ske",          NULL),
+       CLK(sdi2,       "sdi2",         NULL),
+       CLK(i2c0,       "nmk-i2c.0",    NULL),
+       CLK(fsmc,       "fsmc",         NULL),
+
+       /* Peripheral Cluster #5 */
+       CLK(gpio3,      "gpio.8",       NULL),
+
+       /* Peripheral Cluster #6 */
+       CLK(hash1,      "hash1",        NULL),
+       CLK(pka,        "pka",          NULL),
+       CLK(hash0,      "hash0",        NULL),
+       CLK(cryp0,      "cryp0",        NULL),
+
+       /* PRCMU level clock gating */
+
+       /* Bank 0 */
+       CLK(svaclk,     "sva",          NULL),
+       CLK(siaclk,     "sia",          NULL),
+       CLK(sgaclk,     "sga",          NULL),
+       CLK(slimclk,    "slim",         NULL),
+       CLK(lcdclk,     "lcd",          NULL),
+       CLK(bmlclk,     "bml",          NULL),
+       CLK(hsitxclk,   "stm-hsi.0",    NULL),
+       CLK(hsirxclk,   "stm-hsi.1",    NULL),
+       CLK(hdmiclk,    "hdmi",         NULL),
+       CLK(apeatclk,   "apeat",        NULL),
+       CLK(apetraceclk,        "apetrace",     NULL),
+       CLK(mcdeclk,    "mcde",         NULL),
+       CLK(ipi2clk,    "ipi2",         NULL),
+       CLK(dmaclk,     "dma40",        NULL),
+       CLK(b2r2clk,    "b2r2",         NULL),
+       CLK(tvclk,      "tv",           NULL),
+};
+
+static struct clk_lookup u8500_ed_clks[] = {
+       /* Peripheral Cluster #1 */
+       CLK(spi3_ed,    "spi3",         NULL),
+       CLK(msp1_ed,    "msp1",         NULL),
+
+       /* Peripheral Cluster #2 */
+       CLK(gpio1_ed,   "gpio.6",       NULL),
+       CLK(gpio1_ed,   "gpio.7",       NULL),
+       CLK(ssitx_ed,   "ssitx",        NULL),
+       CLK(ssirx_ed,   "ssirx",        NULL),
+       CLK(spi0_ed,    "spi0",         NULL),
+       CLK(sdi3_ed,    "sdi3",         NULL),
+       CLK(sdi1_ed,    "sdi1",         NULL),
+       CLK(msp2_ed,    "msp2",         NULL),
+       CLK(sdi4_ed,    "sdi4",         NULL),
+       CLK(pwl_ed,     "pwl",          NULL),
+       CLK(spi1_ed,    "spi1",         NULL),
+       CLK(spi2_ed,    "spi2",         NULL),
+       CLK(i2c3_ed,    "nmk-i2c.3",    NULL),
+
+       /* Peripheral Cluster #3 */
+       CLK(ssp1_ed,    "ssp1",         NULL),
+       CLK(ssp0_ed,    "ssp0",         NULL),
+
+       /* Peripheral Cluster #5 */
+       CLK(usb_ed,     "musb_hdrc.0",  "usb"),
+
+       /* Peripheral Cluster #6 */
+       CLK(dmc_ed,     "dmc",          NULL),
+       CLK(cryp1_ed,   "cryp1",        NULL),
+       CLK(rng_ed,     "rng",          NULL),
+
+       /* Peripheral Cluster #7 */
+       CLK(tzpc0_ed,   "tzpc0",        NULL),
+       CLK(mtu1_ed,    "mtu1",         NULL),
+       CLK(mtu0_ed,    "mtu0",         NULL),
+       CLK(wdg_ed,     "wdg",          NULL),
+       CLK(cfgreg_ed,  "cfgreg",       NULL),
+};
+
+static struct clk_lookup u8500_v1_clks[] = {
+       /* Peripheral Cluster #1 */
+       CLK(i2c4,       "nmk-i2c.4",    NULL),
+       CLK(spi3_v1,    "spi3",         NULL),
+       CLK(msp1_v1,    "msp1",         NULL),
+
+       /* Peripheral Cluster #2 */
+       CLK(gpio1_v1,   "gpio.6",       NULL),
+       CLK(gpio1_v1,   "gpio.7",       NULL),
+       CLK(ssitx_v1,   "ssitx",        NULL),
+       CLK(ssirx_v1,   "ssirx",        NULL),
+       CLK(spi0_v1,    "spi0",         NULL),
+       CLK(sdi3_v1,    "sdi3",         NULL),
+       CLK(sdi1_v1,    "sdi1",         NULL),
+       CLK(msp2_v1,    "msp2",         NULL),
+       CLK(sdi4_v1,    "sdi4",         NULL),
+       CLK(pwl_v1,     "pwl",          NULL),
+       CLK(spi1_v1,    "spi1",         NULL),
+       CLK(spi2_v1,    "spi2",         NULL),
+       CLK(i2c3_v1,    "nmk-i2c.3",    NULL),
+
+       /* Peripheral Cluster #3 */
+       CLK(ssp1_v1,    "ssp1",         NULL),
+       CLK(ssp0_v1,    "ssp0",         NULL),
+
+       /* Peripheral Cluster #5 */
+       CLK(usb_v1,     "musb_hdrc.0",  "usb"),
+
+       /* Peripheral Cluster #6 */
+       CLK(mtu1_v1,    "mtu1",         NULL),
+       CLK(mtu0_v1,    "mtu0",         NULL),
+       CLK(cfgreg_v1,  "cfgreg",       NULL),
+       CLK(hash1,      "hash1",        NULL),
+       CLK(unipro_v1,  "unipro",       NULL),
+       CLK(rng_v1,     "rng",          NULL),
+
+       /* PRCMU level clock gating */
+
+       /* Bank 0 */
+       CLK(uniproclk,  "uniproclk",    NULL),
+       CLK(dsialtclk,  "dsialt",       NULL),
+
+       /* Bank 1 */
+       CLK(rngclk,     "rng",          NULL),
+       CLK(uiccclk,    "uicc",         NULL),
 };
 
 static int __init clk_init(void)
 {
-       /* register the clock lookups */
-       clkdev_add_table(lookups, ARRAY_SIZE(lookups));
+       if (cpu_is_u8500ed()) {
+               clk_prcmu_ops.enable = clk_prcmu_ed_enable;
+               clk_prcmu_ops.disable = clk_prcmu_ed_disable;
+       } else if (cpu_is_u5500()) {
+               /* Clock tree for U5500 not implemented yet */
+               clk_prcc_ops.enable = clk_prcc_ops.disable = NULL;
+               clk_prcmu_ops.enable = clk_prcmu_ops.disable = NULL;
+       }
+
+       clkdev_add_table(u8500_common_clks, ARRAY_SIZE(u8500_common_clks));
+       if (cpu_is_u8500ed())
+               clkdev_add_table(u8500_ed_clks, ARRAY_SIZE(u8500_ed_clks));
+       else
+               clkdev_add_table(u8500_v1_clks, ARRAY_SIZE(u8500_v1_clks));
+
        return 0;
 }
 arch_initcall(clk_init);
diff --git a/arch/arm/mach-ux500/clock.h b/arch/arm/mach-ux500/clock.h
new file mode 100644 (file)
index 0000000..e4f99b6
--- /dev/null
@@ -0,0 +1,125 @@
+/*
+ *  Copyright (C) 2010 ST-Ericsson
+ *  Copyright (C) 2009 STMicroelectronics
+ *
+ * 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.
+ */
+
+/**
+ * struct clkops - ux500 clock operations
+ * @enable:    function to enable the clock
+ * @disable:   function to disable the clock
+ * @get_rate:  function to get the current clock rate
+ *
+ * This structure contains function pointers to functions that will be used to
+ * control the clock.  All of these functions are optional.  If get_rate is
+ * NULL, the rate in the struct clk will be used.
+ */
+struct clkops {
+       void (*enable) (struct clk *);
+       void (*disable) (struct clk *);
+       unsigned long (*get_rate) (struct clk *);
+};
+
+/**
+ * struct clk - ux500 clock structure
+ * @ops:               pointer to clkops struct used to control this clock
+ * @name:              name, for debugging
+ * @enabled:           refcount. positive if enabled, zero if disabled
+ * @rate:              fixed rate for clocks which don't implement
+ *                     ops->getrate
+ * @prcmu_cg_off:      address offset of the combined enable/disable register
+ *                     (used on u8500v1)
+ * @prcmu_cg_bit:      bit in the combined enable/disable register (used on
+ *                     u8500v1)
+ * @prcmu_cg_mgt:      address of the enable/disable register (used on
+ *                     u8500ed)
+ * @cluster:           peripheral cluster number
+ * @prcc_bus:          bit for the bus clock in the peripheral's CLKRST
+ * @prcc_kernel:       bit for the kernel clock in the peripheral's CLKRST.
+ *                     -1 if no kernel clock exists.
+ * @parent_cluster:    pointer to parent's cluster clk struct
+ * @parent_periph:     pointer to parent's peripheral clk struct
+ *
+ * Peripherals are organised into clusters, and each cluster has an associated
+ * bus clock.  Some peripherals also have a parent peripheral clock.
+ *
+ * In order to enable a clock for a peripheral, we need to enable:
+ *     (1) the parent cluster (bus) clock at the PRCMU level
+ *     (2) the parent peripheral clock (if any) at the PRCMU level
+ *     (3) the peripheral's bus & kernel clock at the PRCC level
+ *
+ * (1) and (2) are handled by defining clk structs (DEFINE_PRCMU_CLK) for each
+ * of the cluster and peripheral clocks, and hooking these as the parents of
+ * the individual peripheral clocks.
+ *
+ * (3) is handled by specifying the bits in the PRCC control registers required
+ * to enable these clocks and modifying them in the ->enable and
+ * ->disable callbacks of the peripheral clocks (DEFINE_PRCC_CLK).
+ *
+ * This structure describes both the PRCMU-level clocks and PRCC-level clocks.
+ * The prcmu_* fields are only used for the PRCMU clocks, and the cluster,
+ * prcc, and parent pointers are only used for the PRCC-level clocks.
+ */
+struct clk {
+       const struct clkops     *ops;
+       const char              *name;
+       unsigned int            enabled;
+
+       unsigned long           rate;
+       struct list_head        list;
+
+       /* These three are only for PRCMU clks */
+
+       unsigned int            prcmu_cg_off;
+       unsigned int            prcmu_cg_bit;
+       unsigned int            prcmu_cg_mgt;
+
+       /* The rest are only for PRCC clks */
+
+       int                     cluster;
+       unsigned int            prcc_bus;
+       unsigned int            prcc_kernel;
+
+       struct clk              *parent_cluster;
+       struct clk              *parent_periph;
+};
+
+#define DEFINE_PRCMU_CLK(_name, _cg_off, _cg_bit, _reg)                \
+struct clk clk_##_name = {                                     \
+               .name           = #_name,                       \
+               .ops            = &clk_prcmu_ops,               \
+               .prcmu_cg_off   = _cg_off,                      \
+               .prcmu_cg_bit   = _cg_bit,                      \
+               .prcmu_cg_mgt   = PRCM_##_reg##_MGT             \
+       }
+
+#define DEFINE_PRCMU_CLK_RATE(_name, _cg_off, _cg_bit, _reg, _rate)    \
+struct clk clk_##_name = {                                             \
+               .name           = #_name,                               \
+               .ops            = &clk_prcmu_ops,                       \
+               .prcmu_cg_off   = _cg_off,                              \
+               .prcmu_cg_bit   = _cg_bit,                              \
+               .rate           = _rate,                                \
+               .prcmu_cg_mgt   = PRCM_##_reg##_MGT                     \
+       }
+
+#define DEFINE_PRCC_CLK(_pclust, _name, _bus_en, _kernel_en, _kernclk) \
+struct clk clk_##_name = {                                             \
+               .name           = #_name,                               \
+               .ops            = &clk_prcc_ops,                        \
+               .cluster        = _pclust,                              \
+               .prcc_bus       = _bus_en,                              \
+               .prcc_kernel    = _kernel_en,                           \
+               .parent_cluster = &clk_per##_pclust##clk,               \
+               .parent_periph  = _kernclk                              \
+       }
+
+#define CLK(_clk, _devname, _conname)                  \
+       {                                               \
+               .clk    = &clk_##_clk,                  \
+               .dev_id = _devname,                     \
+               .con_id = _conname,                     \
+       }
diff --git a/arch/arm/mach-ux500/cpu-db5500.c b/arch/arm/mach-ux500/cpu-db5500.c
new file mode 100644 (file)
index 0000000..6a3ac45
--- /dev/null
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) ST-Ericsson SA 2010
+ *
+ * Author: Rabin Vincent <rabin.vincent@stericsson.com> for ST-Ericsson
+ * License terms: GNU General Public License (GPL) version 2
+ */
+
+#include <linux/platform_device.h>
+#include <linux/amba/bus.h>
+#include <linux/io.h>
+
+#include <asm/mach/map.h>
+
+#include <mach/hardware.h>
+#include <mach/devices.h>
+#include <mach/setup.h>
+
+static struct map_desc u5500_io_desc[] __initdata = {
+       __IO_DEV_DESC(U5500_GPIO0_BASE, SZ_4K),
+       __IO_DEV_DESC(U5500_GPIO1_BASE, SZ_4K),
+       __IO_DEV_DESC(U5500_GPIO2_BASE, SZ_4K),
+       __IO_DEV_DESC(U5500_GPIO3_BASE, SZ_4K),
+       __IO_DEV_DESC(U5500_GPIO4_BASE, SZ_4K),
+};
+
+static struct platform_device *u5500_platform_devs[] __initdata = {
+       &u5500_gpio_devs[0],
+       &u5500_gpio_devs[1],
+       &u5500_gpio_devs[2],
+       &u5500_gpio_devs[3],
+       &u5500_gpio_devs[4],
+       &u5500_gpio_devs[5],
+       &u5500_gpio_devs[6],
+       &u5500_gpio_devs[7],
+};
+
+void __init u5500_map_io(void)
+{
+       ux500_map_io();
+
+       iotable_init(u5500_io_desc, ARRAY_SIZE(u5500_io_desc));
+}
+
+void __init u5500_init_devices(void)
+{
+       ux500_init_devices();
+
+       platform_add_devices(u5500_platform_devs,
+                            ARRAY_SIZE(u5500_platform_devs));
+}
similarity index 53%
rename from arch/arm/mach-ux500/cpu-u8500.c
rename to arch/arm/mach-ux500/cpu-db8500.c
index 397bc1f..d04299f 100644 (file)
 #include <linux/device.h>
 #include <linux/amba/bus.h>
 #include <linux/irq.h>
+#include <linux/gpio.h>
 #include <linux/platform_device.h>
+#include <linux/io.h>
 
-#include <asm/hardware/gic.h>
 #include <asm/mach/map.h>
 #include <mach/hardware.h>
+#include <mach/setup.h>
+#include <mach/devices.h>
 
-/* add any platform devices here - TODO */
 static struct platform_device *platform_devs[] __initdata = {
-       /* yet to be added, add i2c0, gpio.. */
+       &u8500_gpio_devs[0],
+       &u8500_gpio_devs[1],
+       &u8500_gpio_devs[2],
+       &u8500_gpio_devs[3],
+       &u8500_gpio_devs[4],
+       &u8500_gpio_devs[5],
+       &u8500_gpio_devs[6],
+       &u8500_gpio_devs[7],
+       &u8500_gpio_devs[8],
 };
 
-#define __IO_DEV_DESC(x, sz)   {               \
-       .virtual        = IO_ADDRESS(x),        \
-       .pfn            = __phys_to_pfn(x),     \
-       .length         = sz,                   \
-       .type           = MT_DEVICE,            \
-}
-
 /* minimum static i/o mapping required to boot U8500 platforms */
 static struct map_desc u8500_io_desc[] __initdata = {
-       __IO_DEV_DESC(U8500_UART2_BASE, SZ_4K),
-       __IO_DEV_DESC(U8500_GIC_CPU_BASE, SZ_4K),
-       __IO_DEV_DESC(U8500_GIC_DIST_BASE, SZ_4K),
+       __IO_DEV_DESC(U8500_PRCMU_BASE, SZ_4K),
+       __IO_DEV_DESC(U8500_GPIO0_BASE, SZ_4K),
+       __IO_DEV_DESC(U8500_GPIO1_BASE, SZ_4K),
+       __IO_DEV_DESC(U8500_GPIO2_BASE, SZ_4K),
+       __IO_DEV_DESC(U8500_GPIO3_BASE, SZ_4K),
+};
+
+static struct map_desc u8500ed_io_desc[] __initdata = {
+       __IO_DEV_DESC(U8500_MTU0_BASE_ED, SZ_4K),
+       __IO_DEV_DESC(U8500_CLKRST7_BASE_ED, SZ_8K),
+};
+
+static struct map_desc u8500v1_io_desc[] __initdata = {
        __IO_DEV_DESC(U8500_MTU0_BASE, SZ_4K),
-       __IO_DEV_DESC(U8500_TWD_BASE, SZ_4K),
-       __IO_DEV_DESC(U8500_SCU_BASE, SZ_4K),
-       __IO_DEV_DESC(U8500_BACKUPRAM0_BASE, SZ_8K),
 };
 
 void __init u8500_map_io(void)
 {
+       ux500_map_io();
+
        iotable_init(u8500_io_desc, ARRAY_SIZE(u8500_io_desc));
-}
 
-void __init u8500_init_irq(void)
-{
-       gic_dist_init(0, __io_address(U8500_GIC_DIST_BASE), 29);
-       gic_cpu_init(0, __io_address(U8500_GIC_CPU_BASE));
+       if (cpu_is_u8500ed())
+               iotable_init(u8500ed_io_desc, ARRAY_SIZE(u8500ed_io_desc));
+       else
+               iotable_init(u8500v1_io_desc, ARRAY_SIZE(u8500v1_io_desc));
 }
 
 /*
@@ -58,6 +69,8 @@ void __init u8500_init_irq(void)
  */
 void __init u8500_init_devices(void)
 {
+       ux500_init_devices();
+
        /* Register the platform devices */
        platform_add_devices(platform_devs, ARRAY_SIZE(platform_devs));
 
diff --git a/arch/arm/mach-ux500/cpu.c b/arch/arm/mach-ux500/cpu.c
new file mode 100644 (file)
index 0000000..d81ad02
--- /dev/null
@@ -0,0 +1,99 @@
+/*
+ * Copyright (C) ST-Ericsson SA 2010
+ *
+ * Author: Rabin Vincent <rabin.vincent@stericsson.com> for ST-Ericsson
+ * License terms: GNU General Public License (GPL) version 2
+ */
+
+#include <linux/platform_device.h>
+#include <linux/amba/bus.h>
+#include <linux/io.h>
+#include <linux/clk.h>
+
+#include <asm/hardware/cache-l2x0.h>
+#include <asm/hardware/gic.h>
+#include <asm/mach/map.h>
+#include <asm/localtimer.h>
+
+#include <plat/mtu.h>
+#include <mach/hardware.h>
+#include <mach/setup.h>
+#include <mach/devices.h>
+
+#include "clock.h"
+
+static struct map_desc ux500_io_desc[] __initdata = {
+       __IO_DEV_DESC(UX500_UART0_BASE, SZ_4K),
+       __IO_DEV_DESC(UX500_UART2_BASE, SZ_4K),
+
+       __IO_DEV_DESC(UX500_GIC_CPU_BASE, SZ_4K),
+       __IO_DEV_DESC(UX500_GIC_DIST_BASE, SZ_4K),
+       __IO_DEV_DESC(UX500_L2CC_BASE, SZ_4K),
+       __IO_DEV_DESC(UX500_TWD_BASE, SZ_4K),
+       __IO_DEV_DESC(UX500_SCU_BASE, SZ_4K),
+
+       __IO_DEV_DESC(UX500_CLKRST1_BASE, SZ_4K),
+       __IO_DEV_DESC(UX500_CLKRST2_BASE, SZ_4K),
+       __IO_DEV_DESC(UX500_CLKRST3_BASE, SZ_4K),
+       __IO_DEV_DESC(UX500_CLKRST5_BASE, SZ_4K),
+       __IO_DEV_DESC(UX500_CLKRST6_BASE, SZ_4K),
+
+       __IO_DEV_DESC(UX500_MTU0_BASE, SZ_4K),
+       __IO_DEV_DESC(UX500_MTU1_BASE, SZ_4K),
+
+       __IO_DEV_DESC(UX500_BACKUPRAM0_BASE, SZ_8K),
+};
+
+static struct amba_device *ux500_amba_devs[] __initdata = {
+       &ux500_pl031_device,
+};
+
+void __init ux500_map_io(void)
+{
+       iotable_init(ux500_io_desc, ARRAY_SIZE(ux500_io_desc));
+}
+
+void __init ux500_init_devices(void)
+{
+       amba_add_devices(ux500_amba_devs, ARRAY_SIZE(ux500_amba_devs));
+}
+
+void __init ux500_init_irq(void)
+{
+       gic_dist_init(0, __io_address(UX500_GIC_DIST_BASE), 29);
+       gic_cpu_init(0, __io_address(UX500_GIC_CPU_BASE));
+}
+
+#ifdef CONFIG_CACHE_L2X0
+static int ux500_l2x0_init(void)
+{
+       void __iomem *l2x0_base;
+
+       l2x0_base = __io_address(UX500_L2CC_BASE);
+
+       /* 64KB way size, 8 way associativity, force WA */
+       l2x0_init(l2x0_base, 0x3e060000, 0xc0000fff);
+
+       return 0;
+}
+early_initcall(ux500_l2x0_init);
+#endif
+
+static void __init ux500_timer_init(void)
+{
+#ifdef CONFIG_LOCAL_TIMERS
+       /* Setup the local timer base */
+       twd_base = __io_address(UX500_TWD_BASE);
+#endif
+       /* Setup the MTU base */
+       if (cpu_is_u8500ed())
+               mtu_base = __io_address(U8500_MTU0_BASE_ED);
+       else
+               mtu_base = __io_address(UX500_MTU0_BASE);
+
+       nmdk_timer_init();
+}
+
+struct sys_timer ux500_timer = {
+       .init   = ux500_timer_init,
+};
diff --git a/arch/arm/mach-ux500/devices-db5500.c b/arch/arm/mach-ux500/devices-db5500.c
new file mode 100644 (file)
index 0000000..33e5b56
--- /dev/null
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) ST-Ericsson SA 2010
+ *
+ * Author: Rabin Vincent <rabin.vincent@stericsson.com> for ST-Ericsson
+ * License terms: GNU General Public License (GPL) version 2
+ */
+
+#include <linux/platform_device.h>
+#include <linux/interrupt.h>
+#include <linux/gpio.h>
+
+#include <mach/hardware.h>
+#include <mach/devices.h>
+
+static struct nmk_gpio_platform_data u5500_gpio_data[] = {
+       GPIO_DATA("GPIO-0-31", 0),
+       GPIO_DATA("GPIO-32-63", 32), /* 36..63 not routed to pin */
+       GPIO_DATA("GPIO-64-95", 64), /* 83..95 not routed to pin */
+       GPIO_DATA("GPIO-96-127", 96), /* 102..127 not routed to pin */
+       GPIO_DATA("GPIO-128-159", 128), /* 149..159 not routed to pin */
+       GPIO_DATA("GPIO-160-191", 160),
+       GPIO_DATA("GPIO-192-223", 192),
+       GPIO_DATA("GPIO-224-255", 224), /* 228..255 not routed to pin */
+};
+
+static struct resource u5500_gpio_resources[] = {
+       GPIO_RESOURCE(0),
+       GPIO_RESOURCE(1),
+       GPIO_RESOURCE(2),
+       GPIO_RESOURCE(3),
+       GPIO_RESOURCE(4),
+       GPIO_RESOURCE(5),
+       GPIO_RESOURCE(6),
+       GPIO_RESOURCE(7),
+};
+
+struct platform_device u5500_gpio_devs[] = {
+       GPIO_DEVICE(0),
+       GPIO_DEVICE(1),
+       GPIO_DEVICE(2),
+       GPIO_DEVICE(3),
+       GPIO_DEVICE(4),
+       GPIO_DEVICE(5),
+       GPIO_DEVICE(6),
+       GPIO_DEVICE(7),
+};
diff --git a/arch/arm/mach-ux500/devices-db8500.c b/arch/arm/mach-ux500/devices-db8500.c
new file mode 100644 (file)
index 0000000..2033423
--- /dev/null
@@ -0,0 +1,107 @@
+/*
+ * Copyright (C) ST-Ericsson SA 2010
+ *
+ * Author: Rabin Vincent <rabin.vincent@stericsson.com> for ST-Ericsson
+ * License terms: GNU General Public License (GPL) version 2
+ */
+
+#include <linux/kernel.h>
+#include <linux/platform_device.h>
+#include <linux/interrupt.h>
+#include <linux/io.h>
+#include <linux/gpio.h>
+#include <linux/amba/bus.h>
+
+#include <mach/hardware.h>
+#include <mach/setup.h>
+
+static struct nmk_gpio_platform_data u8500_gpio_data[] = {
+       GPIO_DATA("GPIO-0-31", 0),
+       GPIO_DATA("GPIO-32-63", 32), /* 37..63 not routed to pin */
+       GPIO_DATA("GPIO-64-95", 64),
+       GPIO_DATA("GPIO-96-127", 96), /* 98..127 not routed to pin */
+       GPIO_DATA("GPIO-128-159", 128),
+       GPIO_DATA("GPIO-160-191", 160), /* 172..191 not routed to pin */
+       GPIO_DATA("GPIO-192-223", 192),
+       GPIO_DATA("GPIO-224-255", 224), /* 231..255 not routed to pin */
+       GPIO_DATA("GPIO-256-288", 256), /* 268..288 not routed to pin */
+};
+
+static struct resource u8500_gpio_resources[] = {
+       GPIO_RESOURCE(0),
+       GPIO_RESOURCE(1),
+       GPIO_RESOURCE(2),
+       GPIO_RESOURCE(3),
+       GPIO_RESOURCE(4),
+       GPIO_RESOURCE(5),
+       GPIO_RESOURCE(6),
+       GPIO_RESOURCE(7),
+       GPIO_RESOURCE(8),
+};
+
+struct platform_device u8500_gpio_devs[] = {
+       GPIO_DEVICE(0),
+       GPIO_DEVICE(1),
+       GPIO_DEVICE(2),
+       GPIO_DEVICE(3),
+       GPIO_DEVICE(4),
+       GPIO_DEVICE(5),
+       GPIO_DEVICE(6),
+       GPIO_DEVICE(7),
+       GPIO_DEVICE(8),
+};
+
+struct amba_device u8500_ssp0_device = {
+       .dev = {
+               .coherent_dma_mask = ~0,
+               .init_name = "ssp0",
+       },
+       .res = {
+               .start = U8500_SSP0_BASE,
+               .end   = U8500_SSP0_BASE + SZ_4K - 1,
+               .flags = IORESOURCE_MEM,
+       },
+       .irq = {IRQ_SSP0, NO_IRQ },
+       /* ST-Ericsson modified id */
+       .periphid = SSP_PER_ID,
+};
+
+static struct resource u8500_i2c0_resources[] = {
+       [0] = {
+               .start  = U8500_I2C0_BASE,
+               .end    = U8500_I2C0_BASE + SZ_4K - 1,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start  = IRQ_I2C0,
+               .end    = IRQ_I2C0,
+               .flags  = IORESOURCE_IRQ,
+       }
+};
+
+struct platform_device u8500_i2c0_device = {
+       .name           = "nmk-i2c",
+       .id             = 0,
+       .resource       = u8500_i2c0_resources,
+       .num_resources  = ARRAY_SIZE(u8500_i2c0_resources),
+};
+
+static struct resource u8500_i2c4_resources[] = {
+       [0] = {
+               .start  = U8500_I2C4_BASE,
+               .end    = U8500_I2C4_BASE + SZ_4K - 1,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start  = IRQ_I2C4,
+               .end    = IRQ_I2C4,
+               .flags  = IORESOURCE_IRQ,
+       }
+};
+
+struct platform_device u8500_i2c4_device = {
+       .name           = "nmk-i2c",
+       .id             = 4,
+       .resource       = u8500_i2c4_resources,
+       .num_resources  = ARRAY_SIZE(u8500_i2c4_resources),
+};
diff --git a/arch/arm/mach-ux500/devices.c b/arch/arm/mach-ux500/devices.c
new file mode 100644 (file)
index 0000000..8a26889
--- /dev/null
@@ -0,0 +1,88 @@
+/*
+ * Copyright (C) ST-Ericsson SA 2010
+ *
+ * Author: Rabin Vincent <rabin.vincent@stericsson.com> for ST-Ericsson
+ * License terms: GNU General Public License (GPL) version 2
+ */
+
+#include <linux/kernel.h>
+#include <linux/platform_device.h>
+#include <linux/interrupt.h>
+#include <linux/io.h>
+#include <linux/amba/bus.h>
+
+#include <mach/hardware.h>
+#include <mach/setup.h>
+
+#define __MEM_4K_RESOURCE(x) \
+       .res = {.start = (x), .end = (x) + SZ_4K - 1, .flags = IORESOURCE_MEM}
+
+struct amba_device ux500_pl031_device = {
+       .dev = {
+               .init_name = "pl031",
+       },
+       .res = {
+               .start  = UX500_RTC_BASE,
+               .end    = UX500_RTC_BASE + SZ_4K - 1,
+               .flags  = IORESOURCE_MEM,
+       },
+       .irq = {IRQ_RTC_RTT, NO_IRQ},
+};
+
+struct amba_device ux500_uart0_device = {
+       .dev = { .init_name = "uart0" },
+       __MEM_4K_RESOURCE(UX500_UART0_BASE),
+       .irq = {IRQ_UART0, NO_IRQ},
+};
+
+struct amba_device ux500_uart1_device = {
+       .dev = { .init_name = "uart1" },
+       __MEM_4K_RESOURCE(UX500_UART1_BASE),
+       .irq = {IRQ_UART1, NO_IRQ},
+};
+
+struct amba_device ux500_uart2_device = {
+       .dev = { .init_name = "uart2" },
+       __MEM_4K_RESOURCE(UX500_UART2_BASE),
+       .irq = {IRQ_UART2, NO_IRQ},
+};
+
+#define UX500_I2C_RESOURCES(id, size)                          \
+static struct resource ux500_i2c##id##_resources[] = {         \
+       [0] = {                                                 \
+               .start  = UX500_I2C##id##_BASE,                 \
+               .end    = UX500_I2C##id##_BASE + size - 1,      \
+               .flags  = IORESOURCE_MEM,                       \
+       },                                                      \
+       [1] = {                                                 \
+               .start  = IRQ_I2C##id,                          \
+               .end    = IRQ_I2C##id,                          \
+               .flags  = IORESOURCE_IRQ                        \
+       }                                                       \
+}
+
+UX500_I2C_RESOURCES(1, SZ_4K);
+UX500_I2C_RESOURCES(2, SZ_4K);
+UX500_I2C_RESOURCES(3, SZ_4K);
+
+#define UX500_I2C_PDEVICE(cid)                                 \
+struct platform_device ux500_i2c##cid##_device = {             \
+       .name           = "nmk-i2c",                            \
+       .id             = cid,                                  \
+       .num_resources  = 2,                                    \
+       .resource       = ux500_i2c##cid##_resources,           \
+}
+
+UX500_I2C_PDEVICE(1);
+UX500_I2C_PDEVICE(2);
+UX500_I2C_PDEVICE(3);
+
+void __init amba_add_devices(struct amba_device *devs[], int num)
+{
+       int i;
+
+       for (i = 0; i < num; i++) {
+               struct amba_device *d = devs[i];
+               amba_device_register(d, &iomem_resource);
+       }
+}
diff --git a/arch/arm/mach-ux500/include/mach/db5500-regs.h b/arch/arm/mach-ux500/include/mach/db5500-regs.h
new file mode 100644 (file)
index 0000000..545c80f
--- /dev/null
@@ -0,0 +1,103 @@
+/*
+ * Copyright (C) ST-Ericsson SA 2010
+ *
+ * License terms: GNU General Public License (GPL) version 2
+ */
+
+#ifndef __MACH_DB5500_REGS_H
+#define __MACH_DB5500_REGS_H
+
+#define U5500_PER1_BASE                0xA0020000
+#define U5500_PER2_BASE                0xA0010000
+#define U5500_PER3_BASE                0x80140000
+#define U5500_PER4_BASE                0x80150000
+#define U5500_PER5_BASE                0x80100000
+#define U5500_PER6_BASE                0x80120000
+
+#define U5500_GIC_DIST_BASE    0xA0411000
+#define U5500_GIC_CPU_BASE     0xA0410100
+#define U5500_DMA_BASE         0x90030000
+#define U5500_MCDE_BASE                0xA0400000
+#define U5500_MODEM_BASE       0xB0000000
+#define U5500_L2CC_BASE                0xA0412000
+#define U5500_SCU_BASE         0xA0410000
+#define U5500_DSI1_BASE                0xA0401000
+#define U5500_DSI2_BASE                0xA0402000
+#define U5500_SIA_BASE         0xA0100000
+#define U5500_SVA_BASE         0x80200000
+#define U5500_HSEM_BASE                0xA0000000
+#define U5500_NAND0_BASE       0x60000000
+#define U5500_NAND1_BASE       0x70000000
+#define U5500_TWD_BASE         0xa0410600
+#define U5500_B2R2_BASE                0xa0200000
+
+#define U5500_FSMC_BASE                (U5500_PER1_BASE + 0x0000)
+#define U5500_SDI0_BASE                (U5500_PER1_BASE + 0x1000)
+#define U5500_SDI2_BASE                (U5500_PER1_BASE + 0x2000)
+#define U5500_UART0_BASE       (U5500_PER1_BASE + 0x3000)
+#define U5500_I2C1_BASE                (U5500_PER1_BASE + 0x4000)
+#define U5500_MSP0_BASE                (U5500_PER1_BASE + 0x5000)
+#define U5500_GPIO0_BASE       (U5500_PER1_BASE + 0xE000)
+#define U5500_CLKRST1_BASE     (U5500_PER1_BASE + 0xF000)
+
+#define U5500_USBOTG_BASE      (U5500_PER2_BASE + 0x0000)
+#define U5500_GPIO1_BASE       (U5500_PER2_BASE + 0xE000)
+#define U5500_CLKRST2_BASE     (U5500_PER2_BASE + 0xF000)
+
+#define U5500_KEYPAD_BASE      (U5500_PER3_BASE + 0x0000)
+#define U5500_PWM_BASE         (U5500_PER3_BASE + 0x1000)
+#define U5500_GPIO3_BASE       (U5500_PER3_BASE + 0xE000)
+#define U5500_CLKRST3_BASE     (U5500_PER3_BASE + 0xF000)
+
+#define U5500_BACKUPRAM0_BASE  (U5500_PER4_BASE + 0x0000)
+#define U5500_BACKUPRAM1_BASE  (U5500_PER4_BASE + 0x1000)
+#define U5500_RTT0_BASE                (U5500_PER4_BASE + 0x2000)
+#define U5500_RTT1_BASE                (U5500_PER4_BASE + 0x3000)
+#define U5500_RTC_BASE         (U5500_PER4_BASE + 0x4000)
+#define U5500_SCR_BASE         (U5500_PER4_BASE + 0x5000)
+#define U5500_DMC_BASE         (U5500_PER4_BASE + 0x6000)
+#define U5500_PRCMU_BASE       (U5500_PER4_BASE + 0x7000)
+#define U5500_MSP1_BASE                (U5500_PER4_BASE + 0x9000)
+#define U5500_GPIO2_BASE       (U5500_PER4_BASE + 0xA000)
+#define U5500_CDETECT_BASE     (U5500_PER4_BASE + 0xF000)
+
+#define U5500_SPI0_BASE                (U5500_PER5_BASE + 0x0000)
+#define U5500_SPI1_BASE                (U5500_PER5_BASE + 0x1000)
+#define U5500_SPI2_BASE                (U5500_PER5_BASE + 0x2000)
+#define U5500_SPI3_BASE                (U5500_PER5_BASE + 0x3000)
+#define U5500_UART1_BASE       (U5500_PER5_BASE + 0x4000)
+#define U5500_UART2_BASE       (U5500_PER5_BASE + 0x5000)
+#define U5500_UART3_BASE       (U5500_PER5_BASE + 0x6000)
+#define U5500_SDI1_BASE                (U5500_PER5_BASE + 0x7000)
+#define U5500_SDI3_BASE                (U5500_PER5_BASE + 0x8000)
+#define U5500_SDI4_BASE                (U5500_PER5_BASE + 0x9000)
+#define U5500_I2C2_BASE                (U5500_PER5_BASE + 0xA000)
+#define U5500_I2C3_BASE                (U5500_PER5_BASE + 0xB000)
+#define U5500_MSP2_BASE                (U5500_PER5_BASE + 0xC000)
+#define U5500_IRDA_BASE                (U5500_PER5_BASE + 0xD000)
+#define U5500_IRRC_BASE                (U5500_PER5_BASE + 0x10000)
+#define U5500_GPIO4_BASE       (U5500_PER5_BASE + 0x1E000)
+#define U5500_CLKRST5_BASE     (U5500_PER5_BASE + 0x1F000)
+
+#define U5500_RNG_BASE         (U5500_PER6_BASE + 0x0000)
+#define U5500_HASH0_BASE       (U5500_PER6_BASE + 0x1000)
+#define U5500_HASH1_BASE       (U5500_PER6_BASE + 0x2000)
+#define U5500_PKA_BASE         (U5500_PER6_BASE + 0x4000)
+#define U5500_PKAM_BASE                (U5500_PER6_BASE + 0x5000)
+#define U5500_MTU0_BASE                (U5500_PER6_BASE + 0x6000)
+#define U5500_MTU1_BASE                (U5500_PER6_BASE + 0x7000)
+#define U5500_CR_BASE          (U5500_PER6_BASE + 0x8000)
+#define U5500_CRYP0_BASE       (U5500_PER6_BASE + 0xA000)
+#define U5500_CRYP1_BASE       (U5500_PER6_BASE + 0xB000)
+#define U5500_CLKRST6_BASE     (U5500_PER6_BASE + 0xF000)
+
+#define U5500_GPIOBANK0_BASE   U5500_GPIO0_BASE
+#define U5500_GPIOBANK1_BASE   (U5500_GPIO0_BASE + 0x80)
+#define U5500_GPIOBANK2_BASE   U5500_GPIO1_BASE
+#define U5500_GPIOBANK3_BASE   U5500_GPIO2_BASE
+#define U5500_GPIOBANK4_BASE   U5500_GPIO3_BASE
+#define U5500_GPIOBANK5_BASE   U5500_GPIO4_BASE
+#define U5500_GPIOBANK6_BASE   (U5500_GPIO4_BASE + 0x80)
+#define U5500_GPIOBANK7_BASE   (U5500_GPIO4_BASE + 0x100)
+
+#endif
diff --git a/arch/arm/mach-ux500/include/mach/db8500-regs.h b/arch/arm/mach-ux500/include/mach/db8500-regs.h
new file mode 100644 (file)
index 0000000..9169e1e
--- /dev/null
@@ -0,0 +1,135 @@
+/*
+ * Copyright (C) ST-Ericsson SA 2010
+ *
+ * License terms: GNU General Public License (GPL) version 2
+ */
+
+#ifndef __MACH_DB8500_REGS_H
+#define __MACH_DB8500_REGS_H
+
+#define U8500_PER3_BASE                0x80000000
+#define U8500_STM_BASE         0x80100000
+#define U8500_STM_REG_BASE     (U8500_STM_BASE + 0xF000)
+#define U8500_PER2_BASE                0x80110000
+#define U8500_PER1_BASE                0x80120000
+#define U8500_B2R2_BASE                0x80130000
+#define U8500_HSEM_BASE                0x80140000
+#define U8500_PER4_BASE                0x80150000
+#define U8500_ICN_BASE         0x81000000
+
+#define U8500_BOOT_ROM_BASE    0x90000000
+/* ASIC ID is at 0xff4 offset within this region */
+#define U8500_ASIC_ID_BASE     0x9001F000
+
+#define U8500_PER6_BASE                0xa03c0000
+#define U8500_PER5_BASE                0xa03e0000
+#define U8500_PER7_BASE_ED     0xa03d0000
+
+#define U8500_SVA_BASE         0xa0100000
+#define U8500_SIA_BASE         0xa0200000
+
+#define U8500_SGA_BASE         0xa0300000
+#define U8500_MCDE_BASE                0xa0350000
+#define U8500_DMA_BASE_ED      0xa0362000
+#define U8500_DMA_BASE         0x801C0000      /* v1 */
+
+#define U8500_SBAG_BASE                0xa0390000
+
+#define U8500_SCU_BASE         0xa0410000
+#define U8500_GIC_CPU_BASE     0xa0410100
+#define U8500_TWD_BASE         0xa0410600
+#define U8500_GIC_DIST_BASE    0xa0411000
+#define U8500_L2CC_BASE                0xa0412000
+
+#define U8500_MODEM_I2C                0xb7e02000
+
+#define U8500_GPIO0_BASE       (U8500_PER1_BASE + 0xE000)
+#define U8500_GPIO1_BASE       (U8500_PER3_BASE + 0xE000)
+#define U8500_GPIO2_BASE       (U8500_PER2_BASE + 0xE000)
+#define U8500_GPIO3_BASE       (U8500_PER5_BASE + 0x1E000)
+
+/* per7 base addressess */
+#define U8500_CR_BASE_ED       (U8500_PER7_BASE_ED + 0x8000)
+#define U8500_MTU0_BASE_ED     (U8500_PER7_BASE_ED + 0xa000)
+#define U8500_MTU1_BASE_ED     (U8500_PER7_BASE_ED + 0xb000)
+#define U8500_TZPC0_BASE_ED    (U8500_PER7_BASE_ED + 0xc000)
+#define U8500_CLKRST7_BASE_ED  (U8500_PER7_BASE_ED + 0xf000)
+
+#define U8500_UART0_BASE       (U8500_PER1_BASE + 0x0000)
+#define U8500_UART1_BASE       (U8500_PER1_BASE + 0x1000)
+
+/* per6 base addressess */
+#define U8500_RNG_BASE         (U8500_PER6_BASE + 0x0000)
+#define U8500_PKA_BASE         (U8500_PER6_BASE + 0x1000)
+#define U8500_PKAM_BASE                (U8500_PER6_BASE + 0x2000)
+#define U8500_MTU0_BASE                (U8500_PER6_BASE + 0x6000) /* v1 */
+#define U8500_MTU1_BASE                (U8500_PER6_BASE + 0x7000) /* v1 */
+#define U8500_CR_BASE          (U8500_PER6_BASE + 0x8000) /* v1 */
+#define U8500_CRYPTO0_BASE     (U8500_PER6_BASE + 0xa000)
+#define U8500_CRYPTO1_BASE     (U8500_PER6_BASE + 0xb000)
+#define U8500_CLKRST6_BASE     (U8500_PER6_BASE + 0xf000)
+
+/* per5 base addressess */
+#define U8500_USBOTG_BASE      (U8500_PER5_BASE + 0x00000)
+#define U8500_CLKRST5_BASE     (U8500_PER5_BASE + 0x1f000)
+
+/* per4 base addressess */
+#define U8500_BACKUPRAM0_BASE  (U8500_PER4_BASE + 0x00000)
+#define U8500_BACKUPRAM1_BASE  (U8500_PER4_BASE + 0x01000)
+#define U8500_RTT0_BASE                (U8500_PER4_BASE + 0x02000)
+#define U8500_RTT1_BASE                (U8500_PER4_BASE + 0x03000)
+#define U8500_RTC_BASE         (U8500_PER4_BASE + 0x04000)
+#define U8500_SCR_BASE         (U8500_PER4_BASE + 0x05000)
+#define U8500_DMC_BASE         (U8500_PER4_BASE + 0x06000)
+#define U8500_PRCMU_BASE       (U8500_PER4_BASE + 0x07000)
+#define U8500_PRCMU_TCDM_BASE  (U8500_PER4_BASE + 0x0f000)
+
+/* per3 base addresses */
+#define U8500_FSMC_BASE                (U8500_PER3_BASE + 0x0000)
+#define U8500_SSP0_BASE                (U8500_PER3_BASE + 0x2000)
+#define U8500_SSP1_BASE                (U8500_PER3_BASE + 0x3000)
+#define U8500_I2C0_BASE                (U8500_PER3_BASE + 0x4000)
+#define U8500_SDI2_BASE                (U8500_PER3_BASE + 0x5000)
+#define U8500_SKE_BASE         (U8500_PER3_BASE + 0x6000)
+#define U8500_UART2_BASE       (U8500_PER3_BASE + 0x7000)
+#define U8500_SDI5_BASE                (U8500_PER3_BASE + 0x8000)
+#define U8500_CLKRST3_BASE     (U8500_PER3_BASE + 0xf000)
+
+/* per2 base addressess */
+#define U8500_I2C3_BASE                (U8500_PER2_BASE + 0x0000)
+#define U8500_SPI2_BASE                (U8500_PER2_BASE + 0x1000)
+#define U8500_SPI1_BASE                (U8500_PER2_BASE + 0x2000)
+#define U8500_PWL_BASE         (U8500_PER2_BASE + 0x3000)
+#define U8500_SDI4_BASE                (U8500_PER2_BASE + 0x4000)
+#define U8500_MSP2_BASE                (U8500_PER2_BASE + 0x7000)
+#define U8500_SDI1_BASE                (U8500_PER2_BASE + 0x8000)
+#define U8500_SDI3_BASE                (U8500_PER2_BASE + 0x9000)
+#define U8500_SPI0_BASE                (U8500_PER2_BASE + 0xa000)
+#define U8500_HSIR_BASE                (U8500_PER2_BASE + 0xb000)
+#define U8500_HSIT_BASE                (U8500_PER2_BASE + 0xc000)
+#define U8500_CLKRST2_BASE     (U8500_PER2_BASE + 0xf000)
+
+/* per1 base addresses */
+#define U8500_I2C1_BASE                (U8500_PER1_BASE + 0x2000)
+#define U8500_MSP0_BASE                (U8500_PER1_BASE + 0x3000)
+#define U8500_MSP1_BASE                (U8500_PER1_BASE + 0x4000)
+#define U8500_SDI0_BASE                (U8500_PER1_BASE + 0x6000)
+#define U8500_I2C2_BASE                (U8500_PER1_BASE + 0x8000)
+#define U8500_SPI3_BASE                (U8500_PER1_BASE + 0x9000)
+#define U8500_I2C4_BASE                (U8500_PER1_BASE + 0xa000)
+#define U8500_SLIM0_BASE       (U8500_PER1_BASE + 0xb000)
+#define U8500_CLKRST1_BASE     (U8500_PER1_BASE + 0xf000)
+
+#define U8500_SHRM_GOP_INTERRUPT_BASE  0xB7C00040
+
+#define U8500_GPIOBANK0_BASE   U8500_GPIO0_BASE
+#define U8500_GPIOBANK1_BASE   (U8500_GPIO0_BASE + 0x80)
+#define U8500_GPIOBANK2_BASE   U8500_GPIO1_BASE
+#define U8500_GPIOBANK3_BASE   (U8500_GPIO1_BASE + 0x80)
+#define U8500_GPIOBANK4_BASE   (U8500_GPIO1_BASE + 0x100)
+#define U8500_GPIOBANK5_BASE   (U8500_GPIO1_BASE + 0x180)
+#define U8500_GPIOBANK6_BASE   U8500_GPIO2_BASE
+#define U8500_GPIOBANK7_BASE   (U8500_GPIO2_BASE + 0x80)
+#define U8500_GPIOBANK8_BASE   U8500_GPIO3_BASE
+
+#endif
index 09cbfda..c5203b7 100644 (file)
  */
 #include <mach/hardware.h>
 
+#if CONFIG_UX500_DEBUG_UART > 2
+#error Invalid Ux500 debug UART
+#endif
+
+#define __UX500_UART(n)        UX500_UART##n##_BASE
+#define UX500_UART(n)  __UX500_UART(n)
+#define UART_BASE      UX500_UART(CONFIG_UX500_DEBUG_UART)
+
        .macro  addruart, rx, tmp
        mrc     p15, 0, \rx, c1, c0
        tst     \rx, #1                                 @ MMU enabled?
-       ldreq   \rx, =U8500_UART2_BASE                  @ no, physical address
-       ldrne   \rx, =IO_ADDRESS(U8500_UART2_BASE)      @ yes, virtual address
+       ldreq   \rx, =UART_BASE                         @ no, physical address
+       ldrne   \rx, =IO_ADDRESS(UART_BASE)             @ yes, virtual address
        .endm
 
 #include <asm/hardware/debug-pl01x.S>
diff --git a/arch/arm/mach-ux500/include/mach/devices.h b/arch/arm/mach-ux500/include/mach/devices.h
new file mode 100644 (file)
index 0000000..0422af0
--- /dev/null
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) ST-Ericsson SA 2010
+ *
+ * License terms: GNU General Public License (GPL) version 2
+ */
+
+#ifndef __ASM_ARCH_DEVICES_H__
+#define __ASM_ARCH_DEVICES_H__
+
+struct platform_device;
+struct amba_device;
+
+extern struct platform_device u5500_gpio_devs[];
+extern struct platform_device u8500_gpio_devs[];
+
+extern struct amba_device ux500_pl031_device;
+extern struct amba_device u8500_ssp0_device;
+extern struct amba_device ux500_uart0_device;
+extern struct amba_device ux500_uart1_device;
+extern struct amba_device ux500_uart2_device;
+
+extern struct platform_device ux500_i2c1_device;
+extern struct platform_device ux500_i2c2_device;
+extern struct platform_device ux500_i2c3_device;
+
+extern struct platform_device u8500_i2c0_device;
+extern struct platform_device u8500_i2c4_device;
+
+#endif
index eece330..60ea88d 100644 (file)
@@ -17,7 +17,7 @@
                .endm
 
                .macro  get_irqnr_preamble, base, tmp
-               ldr     \base, =IO_ADDRESS(U8500_GIC_CPU_BASE)
+               ldr     \base, =IO_ADDRESS(UX500_GIC_CPU_BASE)
                .endm
 
                .macro  arch_ret_to_user, tmp1, tmp2
diff --git a/arch/arm/mach-ux500/include/mach/gpio.h b/arch/arm/mach-ux500/include/mach/gpio.h
new file mode 100644 (file)
index 0000000..d548a62
--- /dev/null
@@ -0,0 +1,50 @@
+#ifndef __ASM_ARCH_GPIO_H
+#define __ASM_ARCH_GPIO_H
+
+/*
+ * 288 (#267 is the highest one actually hooked up) onchip GPIOs, plus enough
+ * room for a couple of GPIO expanders.
+ */
+#define ARCH_NR_GPIOS  350
+
+#include <plat/gpio.h>
+
+#define __GPIO_RESOURCE(soc, block)                                    \
+       {                                                               \
+               .start  = soc##_GPIOBANK##block##_BASE,                 \
+               .end    = soc##_GPIOBANK##block##_BASE + 127,           \
+               .flags  = IORESOURCE_MEM,                               \
+       },                                                              \
+       {                                                               \
+               .start  = IRQ_GPIO##block,                              \
+               .end    = IRQ_GPIO##block,                              \
+               .flags  = IORESOURCE_IRQ,                               \
+       }
+
+#define __GPIO_DEVICE(soc, block)                                      \
+       {                                                               \
+               .name           = "gpio",                               \
+               .id             = block,                                \
+               .num_resources  = 2,                                    \
+               .resource       = &soc##_gpio_resources[block * 2],     \
+               .dev = {                                                \
+                       .platform_data = &soc##_gpio_data[block],       \
+               },                                                      \
+       }
+
+#define GPIO_DATA(_name, first)                                                \
+       {                                                               \
+               .name           = _name,                                \
+               .first_gpio     = first,                                \
+               .first_irq      = NOMADIK_GPIO_TO_IRQ(first),           \
+       }
+
+#ifdef CONFIG_UX500_SOC_DB8500
+#define GPIO_RESOURCE(block)   __GPIO_RESOURCE(U8500, block)
+#define GPIO_DEVICE(block)     __GPIO_DEVICE(u8500, block)
+#elif defined(CONFIG_UX500_SOC_DB5500)
+#define GPIO_RESOURCE(block)   __GPIO_RESOURCE(U5500, block)
+#define GPIO_DEVICE(block)     __GPIO_DEVICE(u5500, block)
+#endif
+
+#endif /* __ASM_ARCH_GPIO_H */
index 04ea836..8656379 100644 (file)
 
 /* typesafe io address */
 #define __io_address(n)                __io(IO_ADDRESS(n))
+/* used by some plat-nomadik code */
+#define io_p2v(n)              __io_address(n)
 
-/*
- * Base address definitions for U8500 Onchip IPs. All the
- * peripherals are contained in a single 1 Mbyte region, with
- * AHB peripherals at the bottom and APB peripherals at the
- * top of the region. PER stands for PERIPHERAL region which
- * itself divided into sub regions.
- */
-#define U8500_PER3_BASE                0x80000000
-#define U8500_PER2_BASE                0x80110000
-#define U8500_PER1_BASE                0x80120000
-#define U8500_PER4_BASE                0x80150000
-
-#define U8500_PER6_BASE                0xa03c0000
-#define U8500_PER5_BASE                0xa03e0000
-#define U8500_PER7_BASE                0xa03d0000
-
-#define U8500_SVA_BASE         0xa0100000
-#define U8500_SIA_BASE         0xa0200000
-
-#define U8500_SGA_BASE         0xa0300000
-#define U8500_MCDE_BASE                0xa0350000
-#define U8500_DMA_BASE         0xa0362000
-
-#define U8500_SCU_BASE         0xa0410000
-#define U8500_GIC_CPU_BASE     0xa0410100
-#define U8500_TWD_BASE         0xa0410600
-#define U8500_GIC_DIST_BASE    0xa0411000
-#define U8500_L2CC_BASE                0xa0412000
-
-#define U8500_TWD_SIZE         0x100
-
-/* per7 base addressess */
-#define U8500_CR_BASE          (U8500_PER7_BASE + 0x8000)
-#define U8500_MTU0_BASE                (U8500_PER7_BASE + 0xa000)
-#define U8500_MTU1_BASE                (U8500_PER7_BASE + 0xb000)
-#define U8500_TZPC0_BASE       (U8500_PER7_BASE + 0xc000)
-#define U8500_CLKRST7_BASE     (U8500_PER7_BASE + 0xf000)
-
-/* per6 base addressess */
-#define U8500_RNG_BASE         (U8500_PER6_BASE + 0x0000)
-#define U8500_PKA_BASE         (U8500_PER6_BASE + 0x1000)
-#define U8500_PKAM_BASE                (U8500_PER6_BASE + 0x2000)
-#define U8500_CRYPTO0_BASE     (U8500_PER6_BASE + 0xa000)
-#define U8500_CRYPTO1_BASE     (U8500_PER6_BASE + 0xb000)
-#define U8500_CLKRST6_BASE     (U8500_PER6_BASE + 0xf000)
-
-/* per5 base addressess */
-#define U8500_USBOTG_BASE      (U8500_PER5_BASE + 0x00000)
-#define U8500_GPIO5_BASE       (U8500_PER5_BASE + 0x1e000)
-#define U8500_CLKRST5_BASE     (U8500_PER5_BASE + 0x1f000)
-
-/* per4 base addressess */
-#define U8500_BACKUPRAM0_BASE  (U8500_PER4_BASE + 0x0000)
-#define U8500_BACKUPRAM1_BASE  (U8500_PER4_BASE + 0x1000)
-#define U8500_RTT0_BASE                (U8500_PER4_BASE + 0x2000)
-#define U8500_RTT1_BASE                (U8500_PER4_BASE + 0x3000)
-#define U8500_RTC_BASE         (U8500_PER4_BASE + 0x4000)
-#define U8500_SCR_BASE         (U8500_PER4_BASE + 0x5000)
-#define U8500_DMC_BASE         (U8500_PER4_BASE + 0x6000)
-#define U8500_PRCMU_BASE       (U8500_PER4_BASE + 0x7000)
-
-/* per3 base addressess */
-#define U8500_FSMC_BASE                (U8500_PER3_BASE + 0x0000)
-#define U8500_SSP0_BASE                (U8500_PER3_BASE + 0x2000)
-#define U8500_SSP1_BASE                (U8500_PER3_BASE + 0x3000)
-#define U8500_I2C0_BASE                (U8500_PER3_BASE + 0x4000)
-#define U8500_SDI2_BASE                (U8500_PER3_BASE + 0x5000)
-#define U8500_SKE_BASE         (U8500_PER3_BASE + 0x6000)
-#define U8500_UART2_BASE       (U8500_PER3_BASE + 0x7000)
-#define U8500_SDI5_BASE                (U8500_PER3_BASE + 0x8000)
-#define U8500_GPIO3_BASE       (U8500_PER3_BASE + 0xe000)
-#define U8500_CLKRST3_BASE     (U8500_PER3_BASE + 0xf000)
-
-/* per2 base addressess */
-#define U8500_I2C3_BASE                (U8500_PER2_BASE + 0x0000)
-#define U8500_SPI2_BASE                (U8500_PER2_BASE + 0x1000)
-#define U8500_SPI1_BASE                (U8500_PER2_BASE + 0x2000)
-#define U8500_PWL_BASE         (U8500_PER2_BASE + 0x3000)
-#define U8500_SDI4_BASE                (U8500_PER2_BASE + 0x4000)
-#define U8500_MSP2_BASE                (U8500_PER2_BASE + 0x7000)
-#define U8500_SDI1_BASE                (U8500_PER2_BASE + 0x8000)
-#define U8500_SDI3_BASE                (U8500_PER2_BASE + 0x9000)
-#define U8500_SPI0_BASE                (U8500_PER2_BASE + 0xa000)
-#define U8500_HSIR_BASE                (U8500_PER2_BASE + 0xb000)
-#define U8500_HSIT_BASE                (U8500_PER2_BASE + 0xc000)
-#define U8500_GPIO2_BASE       (U8500_PER2_BASE + 0xe000)
-#define U8500_CLKRST2_BASE     (U8500_PER2_BASE + 0xf000)
-
-/* per1 base addresses */
-#define U8500_UART0_BASE       (U8500_PER1_BASE + 0x0000)
-#define U8500_UART1_BASE       (U8500_PER1_BASE + 0x1000)
-#define U8500_I2C1_BASE                (U8500_PER1_BASE + 0x2000)
-#define U8500_MSP0_BASE                (U8500_PER1_BASE + 0x3000)
-#define U8500_MSP1_BASE                (U8500_PER1_BASE + 0x4000)
-#define U8500_SDI0_BASE                (U8500_PER1_BASE + 0x6000)
-#define U8500_I2C2_BASE                (U8500_PER1_BASE + 0x8000)
-#define U8500_SPI3_BASE                (U8500_PER1_BASE + 0x9000)
-#define U8500_SLIM0_BASE       (U8500_PER1_BASE + 0xa000)
-#define U8500_GPIO1_BASE       (U8500_PER1_BASE + 0xe000)
-#define U8500_CLKRST1_BASE     (U8500_PER1_BASE + 0xf000)
+#include <mach/db8500-regs.h>
+#include <mach/db5500-regs.h>
+
+#ifdef CONFIG_UX500_SOC_DB8500
+#define UX500(periph)          U8500_##periph##_BASE
+#elif defined(CONFIG_UX500_SOC_DB5500)
+#define UX500(periph)          U5500_##periph##_BASE
+#endif
+
+#define UX500_BACKUPRAM0_BASE  UX500(BACKUPRAM0)
+#define UX500_BACKUPRAM1_BASE  UX500(BACKUPRAM1)
+#define UX500_B2R2_BASE                UX500(B2R2)
+
+#define UX500_CLKRST1_BASE     UX500(CLKRST1)
+#define UX500_CLKRST2_BASE     UX500(CLKRST2)
+#define UX500_CLKRST3_BASE     UX500(CLKRST3)
+#define UX500_CLKRST5_BASE     UX500(CLKRST5)
+#define UX500_CLKRST6_BASE     UX500(CLKRST6)
+
+#define UX500_DMA_BASE         UX500(DMA)
+#define UX500_FSMC_BASE                UX500(FSMC)
+
+#define UX500_GIC_CPU_BASE     UX500(GIC_CPU)
+#define UX500_GIC_DIST_BASE    UX500(GIC_DIST)
+
+#define UX500_I2C1_BASE                UX500(I2C1)
+#define UX500_I2C2_BASE                UX500(I2C2)
+#define UX500_I2C3_BASE                UX500(I2C3)
+
+#define UX500_L2CC_BASE                UX500(L2CC)
+#define UX500_MCDE_BASE                UX500(MCDE)
+#define UX500_MTU0_BASE                UX500(MTU0)
+#define UX500_MTU1_BASE                UX500(MTU1)
+#define UX500_PRCMU_BASE       UX500(PRCMU)
+
+#define UX500_RNG_BASE         UX500(RNG)
+#define UX500_RTC_BASE         UX500(RTC)
+
+#define UX500_SCU_BASE         UX500(SCU)
+
+#define UX500_SDI0_BASE                UX500(SDI0)
+#define UX500_SDI1_BASE                UX500(SDI1)
+#define UX500_SDI2_BASE                UX500(SDI2)
+#define UX500_SDI3_BASE                UX500(SDI3)
+#define UX500_SDI4_BASE                UX500(SDI4)
+
+#define UX500_SPI0_BASE                UX500(SPI0)
+#define UX500_SPI1_BASE                UX500(SPI1)
+#define UX500_SPI2_BASE                UX500(SPI2)
+#define UX500_SPI3_BASE                UX500(SPI3)
+
+#define UX500_SIA_BASE         UX500(SIA)
+#define UX500_SVA_BASE         UX500(SVA)
+
+#define UX500_TWD_BASE         UX500(TWD)
+
+#define UX500_UART0_BASE       UX500(UART0)
+#define UX500_UART1_BASE       UX500(UART1)
+#define UX500_UART2_BASE       UX500(UART2)
+
+#define UX500_USBOTG_BASE      UX500(USBOTG)
 
 /* ST-Ericsson modified pl022 id */
 #define SSP_PER_ID             0x01080022
 
+#ifndef __ASSEMBLY__
+
+#include <asm/cputype.h>
+
+static inline bool cpu_is_u8500(void)
+{
+#ifdef CONFIG_UX500_SOC_DB8500
+       return 1;
+#else
+       return 0;
+#endif
+}
+
+static inline bool cpu_is_u8500ed(void)
+{
+       return cpu_is_u8500() && (read_cpuid_id() & 15) == 0;
+}
+
+static inline bool cpu_is_u8500v1(void)
+{
+       return cpu_is_u8500() && (read_cpuid_id() & 15) == 1;
+}
+
+static inline bool cpu_is_u5500(void)
+{
+#ifdef CONFIG_UX500_SOC_DB5500
+       return 1;
+#else
+       return 0;
+#endif
+}
+
+#endif
+
 #endif                         /* __MACH_HARDWARE_H */
index 394b5dd..7970684 100644 (file)
@@ -42,6 +42,7 @@
 #define IRQ_AB4500             (IRQ_SHPI_START + 40)
 #define IRQ_DISP               (IRQ_SHPI_START + 48)
 #define IRQ_SiPI3              (IRQ_SHPI_START + 49)
+#define IRQ_I2C4               (IRQ_SHPI_START + 51)
 #define IRQ_SSP1               (IRQ_SHPI_START + 52)
 #define IRQ_I2C2               (IRQ_SHPI_START + 55)
 #define IRQ_SDMMC0             (IRQ_SHPI_START + 60)
 /* There are 128 shared peripheral interrupts assigned to
  * INTID[160:32]. The first 32 interrupts are reserved.
  */
-#define NR_IRQS                        161
+#define U8500_SOC_NR_IRQS              161
+
+/* After chip-specific IRQ numbers we have the GPIO ones */
+#define NOMADIK_NR_GPIO                        288
+#define NOMADIK_GPIO_TO_IRQ(gpio)      ((gpio) + U8500_SOC_NR_IRQS)
+#define NOMADIK_IRQ_TO_GPIO(irq)       ((irq) - U8500_SOC_NR_IRQS)
+#define NR_IRQS                                NOMADIK_GPIO_TO_IRQ(NOMADIK_NR_GPIO)
 
 #endif /*ASM_ARCH_IRQS_H*/
index cf0ce16..e978dbd 100644 (file)
 #include <asm/mach/time.h>
 #include <linux/init.h>
 
-extern void u8500_map_io(void);
-extern void u8500_init_devices(void);
-extern void u8500_init_irq(void);
+extern void __init ux500_map_io(void);
+extern void __init u5500_map_io(void);
+extern void __init u8500_map_io(void);
+
+extern void __init ux500_init_devices(void);
+extern void __init u5500_init_devices(void);
+extern void __init u8500_init_devices(void);
+
+extern void __init ux500_init_irq(void);
 /* We re-use nomadik_timer for this platform */
 extern void nmdk_timer_init(void);
 
+extern void __init amba_add_devices(struct amba_device *devs[], int num);
+
+struct sys_timer;
+extern struct sys_timer ux500_timer;
+
+#define __IO_DEV_DESC(x, sz)   {               \
+       .virtual        = IO_ADDRESS(x),        \
+       .pfn            = __phys_to_pfn(x),     \
+       .length         = sz,                   \
+       .type           = MT_DEVICE,            \
+}
+
 #endif /*  __ASM_ARCH_SETUP_H */
index 8dfe7ca..438ef16 100644 (file)
@@ -30,7 +30,7 @@ volatile int __cpuinitdata pen_release = -1;
 
 static unsigned int __init get_core_count(void)
 {
-       return scu_get_core_count(__io_address(U8500_SCU_BASE));
+       return scu_get_core_count(__io_address(UX500_SCU_BASE));
 }
 
 static DEFINE_SPINLOCK(boot_lock);
@@ -44,7 +44,7 @@ void __cpuinit platform_secondary_init(unsigned int cpu)
         * core (e.g. timer irq), then they will not have been enabled
         * for us: do so
         */
-       gic_cpu_init(0, __io_address(U8500_GIC_CPU_BASE));
+       gic_cpu_init(0, __io_address(UX500_GIC_CPU_BASE));
 
        /*
         * let the primary processor know we're out of the
@@ -75,7 +75,8 @@ int __cpuinit boot_secondary(unsigned int cpu, struct task_struct *idle)
         * that it has been released by resetting pen_release.
         */
        pen_release = cpu;
-       flush_cache_all();
+       __cpuc_flush_dcache_area((void *)&pen_release, sizeof(pen_release));
+       outer_clean_range(__pa(&pen_release), __pa(&pen_release) + 1);
 
        timeout = jiffies + (1 * HZ);
        while (time_before(jiffies, timeout)) {
@@ -105,12 +106,12 @@ static void __init wakeup_secondary(void)
         */
 #define U8500_CPU1_JUMPADDR_OFFSET 0x1FF4
        __raw_writel(virt_to_phys(u8500_secondary_startup),
-               (void __iomem *)IO_ADDRESS(U8500_BACKUPRAM0_BASE) +
+               __io_address(UX500_BACKUPRAM0_BASE) +
                U8500_CPU1_JUMPADDR_OFFSET);
 
 #define U8500_CPU1_WAKEMAGIC_OFFSET 0x1FF0
        __raw_writel(0xA1FEED01,
-               (void __iomem *)IO_ADDRESS(U8500_BACKUPRAM0_BASE) +
+               __io_address(UX500_BACKUPRAM0_BASE) +
                U8500_CPU1_WAKEMAGIC_OFFSET);
 
        /* make sure write buffer is drained */
@@ -171,7 +172,7 @@ void __init smp_prepare_cpus(unsigned int max_cpus)
                 * boot CPU, but only if we have more than one CPU.
                 */
                percpu_timer_setup();
-               scu_enable(__io_address(U8500_SCU_BASE));
+               scu_enable(__io_address(UX500_SCU_BASE));
                wakeup_secondary();
        }
 }
index ba81e70..97cf4d8 100644 (file)
@@ -2,7 +2,7 @@
 # Makefile for the linux kernel.
 #
 
-obj-y                                  := core.o clock.o
+obj-y                                  := core.o
 obj-$(CONFIG_ARCH_VERSATILE_PB)                += versatile_pb.o
 obj-$(CONFIG_MACH_VERSATILE_AB)                += versatile_ab.o
 obj-$(CONFIG_PCI)                      += pci.o
diff --git a/arch/arm/mach-versatile/clock.c b/arch/arm/mach-versatile/clock.c
deleted file mode 100644 (file)
index c50a44e..0000000
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- *  linux/arch/arm/mach-versatile/clock.c
- *
- *  Copyright (C) 2004 ARM Limited.
- *  Written by Deep Blue Solutions Limited.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- */
-#include <linux/module.h>
-#include <linux/kernel.h>
-#include <linux/device.h>
-#include <linux/list.h>
-#include <linux/errno.h>
-#include <linux/err.h>
-#include <linux/string.h>
-#include <linux/clk.h>
-#include <linux/mutex.h>
-
-#include <asm/clkdev.h>
-#include <asm/hardware/icst307.h>
-
-#include "clock.h"
-
-int clk_enable(struct clk *clk)
-{
-       return 0;
-}
-EXPORT_SYMBOL(clk_enable);
-
-void clk_disable(struct clk *clk)
-{
-}
-EXPORT_SYMBOL(clk_disable);
-
-unsigned long clk_get_rate(struct clk *clk)
-{
-       return clk->rate;
-}
-EXPORT_SYMBOL(clk_get_rate);
-
-long clk_round_rate(struct clk *clk, unsigned long rate)
-{
-       struct icst307_vco vco;
-       vco = icst307_khz_to_vco(clk->params, rate / 1000);
-       return icst307_khz(clk->params, vco) * 1000;
-}
-EXPORT_SYMBOL(clk_round_rate);
-
-int clk_set_rate(struct clk *clk, unsigned long rate)
-{
-       int ret = -EIO;
-
-       if (clk->setvco) {
-               struct icst307_vco vco;
-
-               vco = icst307_khz_to_vco(clk->params, rate / 1000);
-               clk->rate = icst307_khz(clk->params, vco) * 1000;
-               clk->setvco(clk, vco);
-               ret = 0;
-       }
-       return ret;
-}
-EXPORT_SYMBOL(clk_set_rate);
diff --git a/arch/arm/mach-versatile/clock.h b/arch/arm/mach-versatile/clock.h
deleted file mode 100644 (file)
index 03468fd..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- *  linux/arch/arm/mach-versatile/clock.h
- *
- *  Copyright (C) 2004 ARM Limited.
- *  Written by Deep Blue Solutions Limited.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- */
-struct module;
-struct icst307_params;
-
-struct clk {
-       unsigned long           rate;
-       const struct icst307_params *params;
-       u32                     oscoff;
-       void                    *data;
-       void                    (*setvco)(struct clk *, struct icst307_vco vco);
-};
index 3b1a4ee..3dff864 100644 (file)
 #include <linux/amba/clcd.h>
 #include <linux/amba/pl061.h>
 #include <linux/amba/mmci.h>
-#include <linux/clocksource.h>
-#include <linux/clockchips.h>
-#include <linux/cnt32_to_63.h>
 #include <linux/io.h>
 #include <linux/gfp.h>
 
 #include <asm/clkdev.h>
 #include <asm/system.h>
-#include <mach/hardware.h>
 #include <asm/irq.h>
 #include <asm/leds.h>
 #include <asm/hardware/arm_timer.h>
-#include <asm/hardware/icst307.h>
+#include <asm/hardware/icst.h>
 #include <asm/hardware/vic.h>
 #include <asm/mach-types.h>
 
 #include <asm/mach/irq.h>
 #include <asm/mach/time.h>
 #include <asm/mach/map.h>
+#include <mach/clkdev.h>
+#include <mach/hardware.h>
+#include <mach/platform.h>
+#include <plat/timer-sp.h>
 
 #include "core.h"
-#include "clock.h"
 
 /*
  * All IO addresses are mapped onto VA 0xFFFx.xxxx, where x.xxxx
@@ -59,7 +58,6 @@
  *
  * Setup a VA for the Versatile Vectored Interrupt Controller.
  */
-#define __io_address(n)                __io(IO_ADDRESS(n))
 #define VA_VIC_BASE            __io_address(VERSATILE_VIC_BASE)
 #define VA_SIC_BASE            __io_address(VERSATILE_SIC_BASE)
 
@@ -229,27 +227,6 @@ void __init versatile_map_io(void)
        iotable_init(versatile_io_desc, ARRAY_SIZE(versatile_io_desc));
 }
 
-#define VERSATILE_REFCOUNTER   (__io_address(VERSATILE_SYS_BASE) + VERSATILE_SYS_24MHz_OFFSET)
-
-/*
- * This is the Versatile sched_clock implementation.  This has
- * a resolution of 41.7ns, and a maximum value of about 35583 days.
- *
- * The return value is guaranteed to be monotonic in that range as
- * long as there is always less than 89 seconds between successive
- * calls to this function.
- */
-unsigned long long sched_clock(void)
-{
-       unsigned long long v = cnt32_to_63(readl(VERSATILE_REFCOUNTER));
-
-       /* the <<1 gets rid of the cnt_32_to_63 top bit saving on a bic insn */
-       v *= 125<<1;
-       do_div(v, 3<<1);
-
-       return v;
-}
-
 
 #define VERSATILE_FLASHCTRL    (__io_address(VERSATILE_SYS_BASE) + VERSATILE_SYS_FLASH_OFFSET)
 
@@ -380,33 +357,40 @@ static struct mmci_platform_data mmc0_plat_data = {
 /*
  * Clock handling
  */
-static const struct icst307_params versatile_oscvco_params = {
-       .ref            = 24000,
-       .vco_max        = 200000,
+static const struct icst_params versatile_oscvco_params = {
+       .ref            = 24000000,
+       .vco_max        = ICST307_VCO_MAX,
+       .vco_min        = ICST307_VCO_MIN,
        .vd_min         = 4 + 8,
        .vd_max         = 511 + 8,
        .rd_min         = 1 + 2,
        .rd_max         = 127 + 2,
+       .s2div          = icst307_s2div,
+       .idx2s          = icst307_idx2s,
 };
 
-static void versatile_oscvco_set(struct clk *clk, struct icst307_vco vco)
+static void versatile_oscvco_set(struct clk *clk, struct icst_vco vco)
 {
-       void __iomem *sys = __io_address(VERSATILE_SYS_BASE);
-       void __iomem *sys_lock = sys + VERSATILE_SYS_LOCK_OFFSET;
+       void __iomem *sys_lock = __io_address(VERSATILE_SYS_BASE) + VERSATILE_SYS_LOCK_OFFSET;
        u32 val;
 
-       val = readl(sys + clk->oscoff) & ~0x7ffff;
+       val = readl(clk->vcoreg) & ~0x7ffff;
        val |= vco.v | (vco.r << 9) | (vco.s << 16);
 
        writel(0xa05f, sys_lock);
-       writel(val, sys + clk->oscoff);
+       writel(val, clk->vcoreg);
        writel(0, sys_lock);
 }
 
+static const struct clk_ops osc4_clk_ops = {
+       .round  = icst_clk_round,
+       .set    = icst_clk_set,
+       .setvco = versatile_oscvco_set,
+};
+
 static struct clk osc4_clk = {
+       .ops    = &osc4_clk_ops,
        .params = &versatile_oscvco_params,
-       .oscoff = VERSATILE_SYS_OSCCLCD_OFFSET,
-       .setvco = versatile_oscvco_set,
 };
 
 /*
@@ -852,6 +836,8 @@ void __init versatile_init(void)
 {
        int i;
 
+       osc4_clk.vcoreg = __io_address(VERSATILE_SYS_BASE) + VERSATILE_SYS_OSCCLCD_OFFSET;
+
        clkdev_add_table(lookups, ARRAY_SIZE(lookups));
 
        platform_device_register(&versatile_flash_device);
@@ -875,120 +861,6 @@ void __init versatile_init(void)
 #define TIMER1_VA_BASE         (__io_address(VERSATILE_TIMER0_1_BASE) + 0x20)
 #define TIMER2_VA_BASE          __io_address(VERSATILE_TIMER2_3_BASE)
 #define TIMER3_VA_BASE         (__io_address(VERSATILE_TIMER2_3_BASE) + 0x20)
-#define VA_IC_BASE              __io_address(VERSATILE_VIC_BASE) 
-
-/*
- * How long is the timer interval?
- */
-#define TIMER_INTERVAL (TICKS_PER_uSEC * mSEC_10)
-#if TIMER_INTERVAL >= 0x100000
-#define TIMER_RELOAD   (TIMER_INTERVAL >> 8)
-#define TIMER_DIVISOR  (TIMER_CTRL_DIV256)
-#define TICKS2USECS(x) (256 * (x) / TICKS_PER_uSEC)
-#elif TIMER_INTERVAL >= 0x10000
-#define TIMER_RELOAD   (TIMER_INTERVAL >> 4)           /* Divide by 16 */
-#define TIMER_DIVISOR  (TIMER_CTRL_DIV16)
-#define TICKS2USECS(x) (16 * (x) / TICKS_PER_uSEC)
-#else
-#define TIMER_RELOAD   (TIMER_INTERVAL)
-#define TIMER_DIVISOR  (TIMER_CTRL_DIV1)
-#define TICKS2USECS(x) ((x) / TICKS_PER_uSEC)
-#endif
-
-static void timer_set_mode(enum clock_event_mode mode,
-                          struct clock_event_device *clk)
-{
-       unsigned long ctrl;
-
-       switch(mode) {
-       case CLOCK_EVT_MODE_PERIODIC:
-               writel(TIMER_RELOAD, TIMER0_VA_BASE + TIMER_LOAD);
-
-               ctrl = TIMER_CTRL_PERIODIC;
-               ctrl |= TIMER_CTRL_32BIT | TIMER_CTRL_IE | TIMER_CTRL_ENABLE;
-               break;
-       case CLOCK_EVT_MODE_ONESHOT:
-               /* period set, and timer enabled in 'next_event' hook */
-               ctrl = TIMER_CTRL_ONESHOT;
-               ctrl |= TIMER_CTRL_32BIT | TIMER_CTRL_IE;
-               break;
-       case CLOCK_EVT_MODE_UNUSED:
-       case CLOCK_EVT_MODE_SHUTDOWN:
-       default:
-               ctrl = 0;
-       }
-
-       writel(ctrl, TIMER0_VA_BASE + TIMER_CTRL);
-}
-
-static int timer_set_next_event(unsigned long evt,
-                               struct clock_event_device *unused)
-{
-       unsigned long ctrl = readl(TIMER0_VA_BASE + TIMER_CTRL);
-
-       writel(evt, TIMER0_VA_BASE + TIMER_LOAD);
-       writel(ctrl | TIMER_CTRL_ENABLE, TIMER0_VA_BASE + TIMER_CTRL);
-
-       return 0;
-}
-
-static struct clock_event_device timer0_clockevent =    {
-       .name           = "timer0",
-       .shift          = 32,
-       .features       = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT,
-       .set_mode       = timer_set_mode,
-       .set_next_event = timer_set_next_event,
-};
-
-/*
- * IRQ handler for the timer
- */
-static irqreturn_t versatile_timer_interrupt(int irq, void *dev_id)
-{
-       struct clock_event_device *evt = &timer0_clockevent;
-
-       writel(1, TIMER0_VA_BASE + TIMER_INTCLR);
-
-       evt->event_handler(evt);
-
-       return IRQ_HANDLED;
-}
-
-static struct irqaction versatile_timer_irq = {
-       .name           = "Versatile Timer Tick",
-       .flags          = IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL,
-       .handler        = versatile_timer_interrupt,
-};
-
-static cycle_t versatile_get_cycles(struct clocksource *cs)
-{
-       return ~readl(TIMER3_VA_BASE + TIMER_VALUE);
-}
-
-static struct clocksource clocksource_versatile = {
-       .name           = "timer3",
-       .rating         = 200,
-       .read           = versatile_get_cycles,
-       .mask           = CLOCKSOURCE_MASK(32),
-       .shift          = 20,
-       .flags          = CLOCK_SOURCE_IS_CONTINUOUS,
-};
-
-static int __init versatile_clocksource_init(void)
-{
-       /* setup timer3 as free-running clocksource */
-       writel(0, TIMER3_VA_BASE + TIMER_CTRL);
-       writel(0xffffffff, TIMER3_VA_BASE + TIMER_LOAD);
-       writel(0xffffffff, TIMER3_VA_BASE + TIMER_VALUE);
-       writel(TIMER_CTRL_32BIT | TIMER_CTRL_ENABLE | TIMER_CTRL_PERIODIC,
-              TIMER3_VA_BASE + TIMER_CTRL);
-
-       clocksource_versatile.mult =
-               clocksource_khz2mult(1000, clocksource_versatile.shift);
-       clocksource_register(&clocksource_versatile);
-
-       return 0;
-}
 
 /*
  * Set up timer interrupt, and return the current time in seconds.
@@ -1017,22 +889,8 @@ static void __init versatile_timer_init(void)
        writel(0, TIMER2_VA_BASE + TIMER_CTRL);
        writel(0, TIMER3_VA_BASE + TIMER_CTRL);
 
-       /* 
-        * Make irqs happen for the system timer
-        */
-       setup_irq(IRQ_TIMERINT0_1, &versatile_timer_irq);
-
-       versatile_clocksource_init();
-
-       timer0_clockevent.mult =
-               div_sc(1000000, NSEC_PER_SEC, timer0_clockevent.shift);
-       timer0_clockevent.max_delta_ns =
-               clockevent_delta2ns(0xffffffff, &timer0_clockevent);
-       timer0_clockevent.min_delta_ns =
-               clockevent_delta2ns(0xf, &timer0_clockevent);
-
-       timer0_clockevent.cpumask = cpumask_of(0);
-       clockevents_register_device(&timer0_clockevent);
+       sp804_clocksource_init(TIMER3_VA_BASE);
+       sp804_clockevents_init(TIMER0_VA_BASE, IRQ_TIMERINT0_1);
 }
 
 struct sys_timer versatile_timer = {
index 04b37a8..e58d077 100644 (file)
@@ -1,6 +1,15 @@
 #ifndef __ASM_MACH_CLKDEV_H
 #define __ASM_MACH_CLKDEV_H
 
+#include <plat/clock.h>
+
+struct clk {
+       unsigned long           rate;
+       const struct clk_ops    *ops;
+       const struct icst_params *params;
+       void __iomem            *vcoreg;
+};
+
 #define __clk_get(clk) ({ 1; })
 #define __clk_put(clk) do { } while (0)
 
index 8c80209..e6f7c16 100644 (file)
@@ -8,6 +8,7 @@
  * warranty of any kind, whether express or implied.
  */
 #include <mach/hardware.h>
+#include <mach/platform.h>
 #include <asm/hardware/vic.h>
 
                .macro  disable_fiq
index 7aa906c..4f8f99a 100644 (file)
@@ -23,7 +23,6 @@
 #define __ASM_ARCH_HARDWARE_H
 
 #include <asm/sizes.h>
-#include <mach/platform.h>
 
 /*
  * PCI space virtual addresses
@@ -49,4 +48,6 @@
 /* macro to get at IO space when running virtually */
 #define IO_ADDRESS(x)          (((x) & 0x0fffffff) + (((x) >> 4) & 0x0f000000) + 0xf0000000)
 
+#define __io_address(n)                __io(IO_ADDRESS(n))
+
 #endif
index 8320739..ec08740 100644 (file)
 #define VERSATILE_CLCD_BASE            0x10120000      /* CLCD */
 #define VERSATILE_DMAC_BASE            0x10130000      /* DMA controller */
 #define VERSATILE_VIC_BASE             0x10140000      /* Vectored interrupt controller */
-#define VERSATILE_PERIPH_BASE          0x10150000    /* off-chip peripherals alias from */
+#define VERSATILE_PERIPH_BASE          0x10150000      /* off-chip peripherals alias from */
                                                 /* 0x10000000 - 0x100FFFFF */
 #define VERSATILE_AHBM_BASE            0x101D0000      /* AHB monitor */
 #define VERSATILE_SCTL_BASE            0x101E0000      /* System controller */
 #define VERSATILE_TIMER0_1_BASE        0x101E2000      /* Timer 0 and 1 */
 #define VERSATILE_TIMER2_3_BASE        0x101E3000      /* Timer 2 and 3 */
 #define VERSATILE_GPIO0_BASE           0x101E4000      /* GPIO port 0 */
-#define VERSATILE_GPIO1_BASE           0x101E5000    /* GPIO port 1 */
+#define VERSATILE_GPIO1_BASE           0x101E5000      /* GPIO port 1 */
 #define VERSATILE_GPIO2_BASE           0x101E6000      /* GPIO port 2 */
 #define VERSATILE_GPIO3_BASE           0x101E7000      /* GPIO port 3 */
 #define VERSATILE_RTC_BASE             0x101E8000      /* Real Time Clock */
 #define SIC_INT_PCI3                    30
 
 
-/* 
- *  Clean base - dummy
- * 
- */
-#define CLEAN_BASE                      VERSATILE_BOOT_ROM_HI
-
 /*
  * System controller bit assignment
  */
 #define VERSATILE_TIMER4_EnSel 21
 
 
-#define MAX_TIMER                       2
-#define MAX_PERIOD                      699050
-#define TICKS_PER_uSEC                  1
-
-/* 
- *  These are useconds NOT ticks.  
- * 
- */
-#define mSEC_1                          1000
-#define mSEC_5                          (mSEC_1 * 5)
-#define mSEC_10                         (mSEC_1 * 10)
-#define mSEC_25                         (mSEC_1 * 25)
-#define SEC_1                           (mSEC_1 * 1000)
-
 #define VERSATILE_CSR_BASE             0x10000000
 #define VERSATILE_CSR_SIZE             0x10000000
 
 #endif
 
 #endif
-
-/*     END */
diff --git a/arch/arm/mach-vexpress/Kconfig b/arch/arm/mach-vexpress/Kconfig
new file mode 100644 (file)
index 0000000..3f19b66
--- /dev/null
@@ -0,0 +1,9 @@
+menu "Versatile Express platform type"
+       depends on ARCH_VEXPRESS
+
+config ARCH_VEXPRESS_CA9X4
+       bool "Versatile Express Cortex-A9x4 tile"
+       select CPU_V7
+       select ARM_GIC
+
+endmenu
diff --git a/arch/arm/mach-vexpress/Makefile b/arch/arm/mach-vexpress/Makefile
new file mode 100644 (file)
index 0000000..1b71b77
--- /dev/null
@@ -0,0 +1,8 @@
+#
+# Makefile for the linux kernel.
+#
+
+obj-y                                  := v2m.o
+obj-$(CONFIG_ARCH_VEXPRESS_CA9X4)      += ct-ca9x4.o
+obj-$(CONFIG_SMP)                      += platsmp.o headsmp.o
+obj-$(CONFIG_LOCAL_TIMERS)             += localtimer.o
diff --git a/arch/arm/mach-vexpress/Makefile.boot b/arch/arm/mach-vexpress/Makefile.boot
new file mode 100644 (file)
index 0000000..07c2d9c
--- /dev/null
@@ -0,0 +1,3 @@
+   zreladdr-y  := 0x60008000
+params_phys-y  := 0x60000100
+initrd_phys-y  := 0x60800000
diff --git a/arch/arm/mach-vexpress/core.h b/arch/arm/mach-vexpress/core.h
new file mode 100644 (file)
index 0000000..57dd95c
--- /dev/null
@@ -0,0 +1,26 @@
+#define __MMIO_P2V(x)  (((x) & 0xfffff) | (((x) & 0x0f000000) >> 4) | 0xf8000000)
+#define MMIO_P2V(x)    ((void __iomem *)__MMIO_P2V(x))
+
+#define AMBA_DEVICE(name,busid,base,plat)      \
+struct amba_device name##_device = {           \
+       .dev            = {                     \
+               .coherent_dma_mask = ~0UL,      \
+               .init_name = busid,             \
+               .platform_data = plat,          \
+       },                                      \
+       .res            = {                     \
+               .start  = base,                 \
+               .end    = base + SZ_4K - 1,     \
+               .flags  = IORESOURCE_MEM,       \
+       },                                      \
+       .dma_mask       = ~0UL,                 \
+       .irq            = IRQ_##base,           \
+       /* .dma         = DMA_##base,*/         \
+}
+
+struct map_desc;
+
+void v2m_map_io(struct map_desc *tile, size_t num);
+extern struct sys_timer v2m_timer;
+
+extern void __iomem *gic_cpu_base_addr;
diff --git a/arch/arm/mach-vexpress/ct-ca9x4.c b/arch/arm/mach-vexpress/ct-ca9x4.c
new file mode 100644 (file)
index 0000000..e6f7303
--- /dev/null
@@ -0,0 +1,249 @@
+/*
+ * Versatile Express Core Tile Cortex A9x4 Support
+ */
+#include <linux/init.h>
+#include <linux/device.h>
+#include <linux/dma-mapping.h>
+#include <linux/platform_device.h>
+#include <linux/amba/bus.h>
+#include <linux/amba/clcd.h>
+
+#include <asm/clkdev.h>
+#include <asm/hardware/arm_timer.h>
+#include <asm/hardware/cache-l2x0.h>
+#include <asm/hardware/gic.h>
+#include <asm/mach-types.h>
+#include <asm/pmu.h>
+
+#include <mach/clkdev.h>
+#include <mach/ct-ca9x4.h>
+
+#include <plat/timer-sp.h>
+
+#include <asm/mach/arch.h>
+#include <asm/mach/map.h>
+#include <asm/mach/time.h>
+
+#include "core.h"
+
+#include <mach/motherboard.h>
+
+#define V2M_PA_CS7     0x10000000
+
+static struct map_desc ct_ca9x4_io_desc[] __initdata = {
+       {
+               .virtual        = __MMIO_P2V(CT_CA9X4_MPIC),
+               .pfn            = __phys_to_pfn(CT_CA9X4_MPIC),
+               .length         = SZ_16K,
+               .type           = MT_DEVICE,
+       }, {
+               .virtual        = __MMIO_P2V(CT_CA9X4_SP804_TIMER),
+               .pfn            = __phys_to_pfn(CT_CA9X4_SP804_TIMER),
+               .length         = SZ_4K,
+               .type           = MT_DEVICE,
+       }, {
+               .virtual        = __MMIO_P2V(CT_CA9X4_L2CC),
+               .pfn            = __phys_to_pfn(CT_CA9X4_L2CC),
+               .length         = SZ_4K,
+               .type           = MT_DEVICE,
+       },
+};
+
+static void __init ct_ca9x4_map_io(void)
+{
+       v2m_map_io(ct_ca9x4_io_desc, ARRAY_SIZE(ct_ca9x4_io_desc));
+}
+
+void __iomem *gic_cpu_base_addr;
+
+static void __init ct_ca9x4_init_irq(void)
+{
+       gic_cpu_base_addr = MMIO_P2V(A9_MPCORE_GIC_CPU);
+       gic_dist_init(0, MMIO_P2V(A9_MPCORE_GIC_DIST), 29);
+       gic_cpu_init(0, gic_cpu_base_addr);
+}
+
+#if 0
+static void ct_ca9x4_timer_init(void)
+{
+       writel(0, MMIO_P2V(CT_CA9X4_TIMER0) + TIMER_CTRL);
+       writel(0, MMIO_P2V(CT_CA9X4_TIMER1) + TIMER_CTRL);
+
+       sp804_clocksource_init(MMIO_P2V(CT_CA9X4_TIMER1));
+       sp804_clockevents_init(MMIO_P2V(CT_CA9X4_TIMER0), IRQ_CT_CA9X4_TIMER0);
+}
+
+static struct sys_timer ct_ca9x4_timer = {
+       .init   = ct_ca9x4_timer_init,
+};
+#endif
+
+static struct clcd_panel xvga_panel = {
+       .mode           = {
+               .name           = "XVGA",
+               .refresh        = 60,
+               .xres           = 1024,
+               .yres           = 768,
+               .pixclock       = 15384,
+               .left_margin    = 168,
+               .right_margin   = 8,
+               .upper_margin   = 29,
+               .lower_margin   = 3,
+               .hsync_len      = 144,
+               .vsync_len      = 6,
+               .sync           = 0,
+               .vmode          = FB_VMODE_NONINTERLACED,
+       },
+       .width          = -1,
+       .height         = -1,
+       .tim2           = TIM2_BCD | TIM2_IPC,
+       .cntl           = CNTL_LCDTFT | CNTL_BGR | CNTL_LCDVCOMP(1),
+       .bpp            = 16,
+};
+
+static void ct_ca9x4_clcd_enable(struct clcd_fb *fb)
+{
+       v2m_cfg_write(SYS_CFG_MUXFPGA | SYS_CFG_SITE_DB1, 0);
+       v2m_cfg_write(SYS_CFG_DVIMODE | SYS_CFG_SITE_DB1, 2);
+}
+
+static int ct_ca9x4_clcd_setup(struct clcd_fb *fb)
+{
+       unsigned long framesize = 1024 * 768 * 2;
+       dma_addr_t dma;
+
+       fb->panel = &xvga_panel;
+
+       fb->fb.screen_base = dma_alloc_writecombine(&fb->dev->dev, framesize,
+                               &dma, GFP_KERNEL);
+       if (!fb->fb.screen_base) {
+               printk(KERN_ERR "CLCD: unable to map frame buffer\n");
+               return -ENOMEM;
+       }
+       fb->fb.fix.smem_start = dma;
+       fb->fb.fix.smem_len = framesize;
+
+       return 0;
+}
+
+static int ct_ca9x4_clcd_mmap(struct clcd_fb *fb, struct vm_area_struct *vma)
+{
+       return dma_mmap_writecombine(&fb->dev->dev, vma, fb->fb.screen_base,
+               fb->fb.fix.smem_start, fb->fb.fix.smem_len);
+}
+
+static void ct_ca9x4_clcd_remove(struct clcd_fb *fb)
+{
+       dma_free_writecombine(&fb->dev->dev, fb->fb.fix.smem_len,
+               fb->fb.screen_base, fb->fb.fix.smem_start);
+}
+
+static struct clcd_board ct_ca9x4_clcd_data = {
+       .name           = "CT-CA9X4",
+       .check          = clcdfb_check,
+       .decode         = clcdfb_decode,
+       .enable         = ct_ca9x4_clcd_enable,
+       .setup          = ct_ca9x4_clcd_setup,
+       .mmap           = ct_ca9x4_clcd_mmap,
+       .remove         = ct_ca9x4_clcd_remove,
+};
+
+static AMBA_DEVICE(clcd, "ct:clcd", CT_CA9X4_CLCDC, &ct_ca9x4_clcd_data);
+static AMBA_DEVICE(dmc, "ct:dmc", CT_CA9X4_DMC, NULL);
+static AMBA_DEVICE(smc, "ct:smc", CT_CA9X4_SMC, NULL);
+static AMBA_DEVICE(gpio, "ct:gpio", CT_CA9X4_GPIO, NULL);
+
+static struct amba_device *ct_ca9x4_amba_devs[] __initdata = {
+       &clcd_device,
+       &dmc_device,
+       &smc_device,
+       &gpio_device,
+};
+
+
+static long ct_round(struct clk *clk, unsigned long rate)
+{
+       return rate;
+}
+
+static int ct_set(struct clk *clk, unsigned long rate)
+{
+       return v2m_cfg_write(SYS_CFG_OSC | SYS_CFG_SITE_DB1 | 1, rate);
+}
+
+static const struct clk_ops osc1_clk_ops = {
+       .round  = ct_round,
+       .set    = ct_set,
+};
+
+static struct clk osc1_clk = {
+       .ops    = &osc1_clk_ops,
+       .rate   = 24000000,
+};
+
+static struct clk_lookup lookups[] = {
+       {       /* CLCD */
+               .dev_id         = "ct:clcd",
+               .clk            = &osc1_clk,
+       },
+};
+
+static struct resource pmu_resources[] = {
+       [0] = {
+               .start  = IRQ_CT_CA9X4_PMU_CPU0,
+               .end    = IRQ_CT_CA9X4_PMU_CPU0,
+               .flags  = IORESOURCE_IRQ,
+       },
+       [1] = {
+               .start  = IRQ_CT_CA9X4_PMU_CPU1,
+               .end    = IRQ_CT_CA9X4_PMU_CPU1,
+               .flags  = IORESOURCE_IRQ,
+       },
+       [2] = {
+               .start  = IRQ_CT_CA9X4_PMU_CPU2,
+               .end    = IRQ_CT_CA9X4_PMU_CPU2,
+               .flags  = IORESOURCE_IRQ,
+       },
+       [3] = {
+               .start  = IRQ_CT_CA9X4_PMU_CPU3,
+               .end    = IRQ_CT_CA9X4_PMU_CPU3,
+               .flags  = IORESOURCE_IRQ,
+       },
+};
+
+static struct platform_device pmu_device = {
+       .name           = "arm-pmu",
+       .id             = ARM_PMU_DEVICE_CPU,
+       .num_resources  = ARRAY_SIZE(pmu_resources),
+       .resource       = pmu_resources,
+};
+
+static void ct_ca9x4_init(void)
+{
+       int i;
+
+#ifdef CONFIG_CACHE_L2X0
+       l2x0_init(MMIO_P2V(CT_CA9X4_L2CC), 0x00000000, 0xfe0fffff);
+#endif
+
+       clkdev_add_table(lookups, ARRAY_SIZE(lookups));
+
+       for (i = 0; i < ARRAY_SIZE(ct_ca9x4_amba_devs); i++)
+               amba_device_register(ct_ca9x4_amba_devs[i], &iomem_resource);
+
+       platform_device_register(&pmu_device);
+}
+
+MACHINE_START(VEXPRESS, "ARM-Versatile Express CA9x4")
+       .phys_io        = V2M_UART0,
+       .io_pg_offst    = (__MMIO_P2V(V2M_UART0) >> 18) & 0xfffc,
+       .boot_params    = PHYS_OFFSET + 0x00000100,
+       .map_io         = ct_ca9x4_map_io,
+       .init_irq       = ct_ca9x4_init_irq,
+#if 0
+       .timer          = &ct_ca9x4_timer,
+#else
+       .timer          = &v2m_timer,
+#endif
+       .init_machine   = ct_ca9x4_init,
+MACHINE_END
diff --git a/arch/arm/mach-vexpress/headsmp.S b/arch/arm/mach-vexpress/headsmp.S
new file mode 100644 (file)
index 0000000..8a78ff6
--- /dev/null
@@ -0,0 +1,39 @@
+/*
+ *  linux/arch/arm/mach-vexpress/headsmp.S
+ *
+ *  Copyright (c) 2003 ARM Limited
+ *  All Rights Reserved
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+#include <linux/linkage.h>
+#include <linux/init.h>
+
+       __INIT
+
+/*
+ * Versatile Express specific entry point for secondary CPUs.  This
+ * provides a "holding pen" into which all secondary cores are held
+ * until we're ready for them to initialise.
+ */
+ENTRY(vexpress_secondary_startup)
+       mrc     p15, 0, r0, c0, c0, 5
+       and     r0, r0, #15
+       adr     r4, 1f
+       ldmia   r4, {r5, r6}
+       sub     r4, r4, r5
+       add     r6, r6, r4
+pen:   ldr     r7, [r6]
+       cmp     r7, r0
+       bne     pen
+
+       /*
+        * we've been released from the holding pen: secondary_stack
+        * should now contain the SVC stack for this core
+        */
+       b       secondary_startup
+
+1:     .long   .
+       .long   pen_release
diff --git a/arch/arm/mach-vexpress/include/mach/clkdev.h b/arch/arm/mach-vexpress/include/mach/clkdev.h
new file mode 100644 (file)
index 0000000..3f8307d
--- /dev/null
@@ -0,0 +1,15 @@
+#ifndef __ASM_MACH_CLKDEV_H
+#define __ASM_MACH_CLKDEV_H
+
+#include <plat/clock.h>
+
+struct clk {
+       const struct clk_ops    *ops;
+       unsigned long           rate;
+       const struct icst_params *params;
+};
+
+#define __clk_get(clk) ({ 1; })
+#define __clk_put(clk) do { } while (0)
+
+#endif
diff --git a/arch/arm/mach-vexpress/include/mach/ct-ca9x4.h b/arch/arm/mach-vexpress/include/mach/ct-ca9x4.h
new file mode 100644 (file)
index 0000000..8650f04
--- /dev/null
@@ -0,0 +1,47 @@
+#ifndef __MACH_CT_CA9X4_H
+#define __MACH_CT_CA9X4_H
+
+/*
+ * Physical base addresses
+ */
+#define CT_CA9X4_CLCDC         (0x10020000)
+#define CT_CA9X4_AXIRAM                (0x10060000)
+#define CT_CA9X4_DMC           (0x100e0000)
+#define CT_CA9X4_SMC           (0x100e1000)
+#define CT_CA9X4_SCC           (0x100e2000)
+#define CT_CA9X4_SP804_TIMER   (0x100e4000)
+#define CT_CA9X4_SP805_WDT     (0x100e5000)
+#define CT_CA9X4_TZPC          (0x100e6000)
+#define CT_CA9X4_GPIO          (0x100e8000)
+#define CT_CA9X4_FASTAXI       (0x100e9000)
+#define CT_CA9X4_SLOWAXI       (0x100ea000)
+#define CT_CA9X4_TZASC         (0x100ec000)
+#define CT_CA9X4_CORESIGHT     (0x10200000)
+#define CT_CA9X4_MPIC          (0x1e000000)
+#define CT_CA9X4_SYSTIMER      (0x1e004000)
+#define CT_CA9X4_SYSWDT                (0x1e007000)
+#define CT_CA9X4_L2CC          (0x1e00a000)
+
+#define CT_CA9X4_TIMER0                (CT_CA9X4_SP804_TIMER + 0x000)
+#define CT_CA9X4_TIMER1                (CT_CA9X4_SP804_TIMER + 0x020)
+
+#define A9_MPCORE_SCU          (CT_CA9X4_MPIC + 0x0000)
+#define A9_MPCORE_GIC_CPU      (CT_CA9X4_MPIC + 0x0100)
+#define A9_MPCORE_GIT          (CT_CA9X4_MPIC + 0x0200)
+#define A9_MPCORE_GIC_DIST     (CT_CA9X4_MPIC + 0x1000)
+
+/*
+ * Interrupts.  Those in {} are for AMBA devices
+ */
+#define IRQ_CT_CA9X4_CLCDC     { 76 }
+#define IRQ_CT_CA9X4_DMC       { -1 }
+#define IRQ_CT_CA9X4_SMC       { 77, 78 }
+#define IRQ_CT_CA9X4_TIMER0    80
+#define IRQ_CT_CA9X4_TIMER1    81
+#define IRQ_CT_CA9X4_GPIO      { 82 }
+#define IRQ_CT_CA9X4_PMU_CPU0  92
+#define IRQ_CT_CA9X4_PMU_CPU1  93
+#define IRQ_CT_CA9X4_PMU_CPU2  94
+#define IRQ_CT_CA9X4_PMU_CPU3  95
+
+#endif
diff --git a/arch/arm/mach-vexpress/include/mach/debug-macro.S b/arch/arm/mach-vexpress/include/mach/debug-macro.S
new file mode 100644 (file)
index 0000000..5167e2a
--- /dev/null
@@ -0,0 +1,23 @@
+/* arch/arm/mach-realview/include/mach/debug-macro.S
+ *
+ * Debugging macro include header
+ *
+ *  Copyright (C) 1994-1999 Russell King
+ *  Moved from linux/arch/arm/kernel/debug.S by Ben Dooks
+ *
+ * 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 DEBUG_LL_UART_OFFSET   0x00009000
+
+               .macro  addruart,rx,tmp
+               mrc     p15, 0, \rx, c1, c0
+               tst     \rx, #1                 @ MMU enabled?
+               moveq   \rx,      #0x10000000
+               movne   \rx,      #0xf8000000   @ virtual base
+               orr     \rx, \rx, #DEBUG_LL_UART_OFFSET
+               .endm
+
+#include <asm/hardware/debug-pl01x.S>
diff --git a/arch/arm/mach-vexpress/include/mach/entry-macro.S b/arch/arm/mach-vexpress/include/mach/entry-macro.S
new file mode 100644 (file)
index 0000000..20e9fb5
--- /dev/null
@@ -0,0 +1,67 @@
+#include <asm/hardware/gic.h>
+
+       .macro  disable_fiq
+       .endm
+
+       .macro  get_irqnr_preamble, base, tmp
+       ldr     \base, =gic_cpu_base_addr
+       ldr     \base, [\base]
+       .endm
+
+       .macro  arch_ret_to_user, tmp1, tmp2
+       .endm
+
+       /*
+        * The interrupt numbering scheme is defined in the
+        * interrupt controller spec.  To wit:
+        *
+        * Interrupts 0-15 are IPI
+        * 16-28 are reserved
+        * 29-31 are local.  We allow 30 to be used for the watchdog.
+        * 32-1020 are global
+        * 1021-1022 are reserved
+        * 1023 is "spurious" (no interrupt)
+        *
+        * For now, we ignore all local interrupts so only return an interrupt if it's
+        * between 30 and 1020.  The test_for_ipi routine below will pick up on IPIs.
+        *
+        * A simple read from the controller will tell us the number of the highest
+        * priority enabled interrupt.  We then just need to check whether it is in the
+        * valid range for an IRQ (30-1020 inclusive).
+        */
+
+       .macro  get_irqnr_and_base, irqnr, irqstat, base, tmp
+       ldr     \irqstat, [\base, #GIC_CPU_INTACK] /* bits 12-10 = src CPU, 9-0 = int # */
+       ldr     \tmp, =1021
+       bic     \irqnr, \irqstat, #0x1c00
+       cmp     \irqnr, #29
+       cmpcc   \irqnr, \irqnr
+       cmpne   \irqnr, \tmp
+       cmpcs   \irqnr, \irqnr
+       .endm
+
+       /* We assume that irqstat (the raw value of the IRQ acknowledge
+        * register) is preserved from the macro above.
+        * If there is an IPI, we immediately signal end of interrupt on the
+        * controller, since this requires the original irqstat value which
+        * we won't easily be able to recreate later.
+        */
+
+       .macro test_for_ipi, irqnr, irqstat, base, tmp
+       bic     \irqnr, \irqstat, #0x1c00
+       cmp     \irqnr, #16
+       strcc   \irqstat, [\base, #GIC_CPU_EOI]
+       cmpcs   \irqnr, \irqnr
+       .endm
+
+       /* As above, this assumes that irqstat and base are preserved.. */
+
+       .macro test_for_ltirq, irqnr, irqstat, base, tmp
+       bic     \irqnr, \irqstat, #0x1c00
+       mov     \tmp, #0
+       cmp     \irqnr, #29
+       moveq   \tmp, #1
+       streq   \irqstat, [\base, #GIC_CPU_EOI]
+       cmp     \tmp, #0
+       .endm
+
diff --git a/arch/arm/mach-vexpress/include/mach/hardware.h b/arch/arm/mach-vexpress/include/mach/hardware.h
new file mode 100644 (file)
index 0000000..40a8c17
--- /dev/null
@@ -0,0 +1 @@
+/* empty */
diff --git a/arch/arm/mach-vexpress/include/mach/io.h b/arch/arm/mach-vexpress/include/mach/io.h
new file mode 100644 (file)
index 0000000..748bb52
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ *  arch/arm/mach-vexpress/include/mach/io.h
+ *
+ *  Copyright (C) 2003 ARM Limited
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+#ifndef __ASM_ARM_ARCH_IO_H
+#define __ASM_ARM_ARCH_IO_H
+
+#define IO_SPACE_LIMIT 0xffffffff
+
+#define __io(a)                __typesafe_io(a)
+#define __mem_pci(a)   (a)
+
+#endif
diff --git a/arch/arm/mach-vexpress/include/mach/irqs.h b/arch/arm/mach-vexpress/include/mach/irqs.h
new file mode 100644 (file)
index 0000000..7054cbf
--- /dev/null
@@ -0,0 +1,4 @@
+#define IRQ_LOCALTIMER         29
+#define IRQ_LOCALWDOG          30
+
+#define NR_IRQS        128
diff --git a/arch/arm/mach-vexpress/include/mach/memory.h b/arch/arm/mach-vexpress/include/mach/memory.h
new file mode 100644 (file)
index 0000000..be28232
--- /dev/null
@@ -0,0 +1,25 @@
+/*
+ *  arch/arm/mach-vexpress/include/mach/memory.h
+ *
+ *  Copyright (C) 2003 ARM Limited
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+#ifndef __ASM_ARCH_MEMORY_H
+#define __ASM_ARCH_MEMORY_H
+
+#define PHYS_OFFSET            UL(0x60000000)
+
+#endif
diff --git a/arch/arm/mach-vexpress/include/mach/motherboard.h b/arch/arm/mach-vexpress/include/mach/motherboard.h
new file mode 100644 (file)
index 0000000..98a8ded
--- /dev/null
@@ -0,0 +1,121 @@
+#ifndef __MACH_MOTHERBOARD_H
+#define __MACH_MOTHERBOARD_H
+
+/*
+ * Physical addresses, offset from V2M_PA_CS0-3
+ */
+#define V2M_NOR0               (V2M_PA_CS0)
+#define V2M_NOR1               (V2M_PA_CS1)
+#define V2M_SRAM               (V2M_PA_CS2)
+#define V2M_VIDEO_SRAM         (V2M_PA_CS3 + 0x00000000)
+#define V2M_LAN9118            (V2M_PA_CS3 + 0x02000000)
+#define V2M_ISP1761            (V2M_PA_CS3 + 0x03000000)
+
+/*
+ * Physical addresses, offset from V2M_PA_CS7
+ */
+#define V2M_SYSREGS            (V2M_PA_CS7 + 0x00000000)
+#define V2M_SYSCTL             (V2M_PA_CS7 + 0x00001000)
+#define V2M_SERIAL_BUS_PCI     (V2M_PA_CS7 + 0x00002000)
+
+#define V2M_AACI               (V2M_PA_CS7 + 0x00004000)
+#define V2M_MMCI               (V2M_PA_CS7 + 0x00005000)
+#define V2M_KMI0               (V2M_PA_CS7 + 0x00006000)
+#define V2M_KMI1               (V2M_PA_CS7 + 0x00007000)
+
+#define V2M_UART0              (V2M_PA_CS7 + 0x00009000)
+#define V2M_UART1              (V2M_PA_CS7 + 0x0000a000)
+#define V2M_UART2              (V2M_PA_CS7 + 0x0000b000)
+#define V2M_UART3              (V2M_PA_CS7 + 0x0000c000)
+
+#define V2M_WDT                        (V2M_PA_CS7 + 0x0000f000)
+
+#define V2M_TIMER01            (V2M_PA_CS7 + 0x00011000)
+#define V2M_TIMER23            (V2M_PA_CS7 + 0x00012000)
+
+#define V2M_SERIAL_BUS_DVI     (V2M_PA_CS7 + 0x00016000)
+#define V2M_RTC                        (V2M_PA_CS7 + 0x00017000)
+
+#define V2M_CF                 (V2M_PA_CS7 + 0x0001a000)
+#define V2M_CLCD               (V2M_PA_CS7 + 0x0001f000)
+
+#define V2M_SYS_ID             (V2M_SYSREGS + 0x000)
+#define V2M_SYS_SW             (V2M_SYSREGS + 0x004)
+#define V2M_SYS_LED            (V2M_SYSREGS + 0x008)
+#define V2M_SYS_100HZ          (V2M_SYSREGS + 0x024)
+#define V2M_SYS_FLAGS          (V2M_SYSREGS + 0x030)
+#define V2M_SYS_FLAGSSET       (V2M_SYSREGS + 0x030)
+#define V2M_SYS_FLAGSCLR       (V2M_SYSREGS + 0x034)
+#define V2M_SYS_NVFLAGS                (V2M_SYSREGS + 0x038)
+#define V2M_SYS_NVFLAGSSET     (V2M_SYSREGS + 0x038)
+#define V2M_SYS_NVFLAGSCLR     (V2M_SYSREGS + 0x03c)
+#define V2M_SYS_MCI            (V2M_SYSREGS + 0x048)
+#define V2M_SYS_FLASH          (V2M_SYSREGS + 0x03c)
+#define V2M_SYS_CFGSW          (V2M_SYSREGS + 0x058)
+#define V2M_SYS_24MHZ          (V2M_SYSREGS + 0x05c)
+#define V2M_SYS_MISC           (V2M_SYSREGS + 0x060)
+#define V2M_SYS_DMA            (V2M_SYSREGS + 0x064)
+#define V2M_SYS_PROCID0                (V2M_SYSREGS + 0x084)
+#define V2M_SYS_PROCID1                (V2M_SYSREGS + 0x088)
+#define V2M_SYS_CFGDATA                (V2M_SYSREGS + 0x0a0)
+#define V2M_SYS_CFGCTRL                (V2M_SYSREGS + 0x0a4)
+#define V2M_SYS_CFGSTAT                (V2M_SYSREGS + 0x0a8)
+
+#define V2M_TIMER0             (V2M_TIMER01 + 0x000)
+#define V2M_TIMER1             (V2M_TIMER01 + 0x020)
+
+#define V2M_TIMER2             (V2M_TIMER23 + 0x000)
+#define V2M_TIMER3             (V2M_TIMER23 + 0x020)
+
+
+/*
+ * Interrupts.  Those in {} are for AMBA devices
+ */
+#define IRQ_V2M_WDT            { (32 + 0) }
+#define IRQ_V2M_TIMER0         (32 + 2)
+#define IRQ_V2M_TIMER1         (32 + 2)
+#define IRQ_V2M_TIMER2         (32 + 3)
+#define IRQ_V2M_TIMER3         (32 + 3)
+#define IRQ_V2M_RTC            { (32 + 4) }
+#define IRQ_V2M_UART0          { (32 + 5) }
+#define IRQ_V2M_UART1          { (32 + 6) }
+#define IRQ_V2M_UART2          { (32 + 7) }
+#define IRQ_V2M_UART3          { (32 + 8) }
+#define IRQ_V2M_MMCI           { (32 + 9), (32 + 10) }
+#define IRQ_V2M_AACI           { (32 + 11) }
+#define IRQ_V2M_KMI0           { (32 + 12) }
+#define IRQ_V2M_KMI1           { (32 + 13) }
+#define IRQ_V2M_CLCD           { (32 + 14) }
+#define IRQ_V2M_LAN9118                (32 + 15)
+#define IRQ_V2M_ISP1761                (32 + 16)
+#define IRQ_V2M_PCIE           (32 + 17)
+
+
+/*
+ * Configuration
+ */
+#define SYS_CFG_START          (1 << 31)
+#define SYS_CFG_WRITE          (1 << 30)
+#define SYS_CFG_OSC            (1 << 20)
+#define SYS_CFG_VOLT           (2 << 20)
+#define SYS_CFG_AMP            (3 << 20)
+#define SYS_CFG_TEMP           (4 << 20)
+#define SYS_CFG_RESET          (5 << 20)
+#define SYS_CFG_SCC            (6 << 20)
+#define SYS_CFG_MUXFPGA                (7 << 20)
+#define SYS_CFG_SHUTDOWN       (8 << 20)
+#define SYS_CFG_REBOOT         (9 << 20)
+#define SYS_CFG_DVIMODE                (11 << 20)
+#define SYS_CFG_POWER          (12 << 20)
+#define SYS_CFG_SITE_MB                (0 << 16)
+#define SYS_CFG_SITE_DB1       (1 << 16)
+#define SYS_CFG_SITE_DB2       (2 << 16)
+#define SYS_CFG_STACK(n)       ((n) << 12)
+
+#define SYS_CFG_ERR            (1 << 1)
+#define SYS_CFG_COMPLETE       (1 << 0)
+
+int v2m_cfg_write(u32 devfn, u32 data);
+int v2m_cfg_read(u32 devfn, u32 *data);
+
+#endif
diff --git a/arch/arm/mach-vexpress/include/mach/smp.h b/arch/arm/mach-vexpress/include/mach/smp.h
new file mode 100644 (file)
index 0000000..72a9621
--- /dev/null
@@ -0,0 +1,21 @@
+#ifndef __MACH_SMP_H
+#define __MACH_SMP_H
+
+#include <asm/hardware/gic.h>
+
+#define hard_smp_processor_id()                                \
+       ({                                              \
+               unsigned int cpunum;                    \
+               __asm__("mrc p15, 0, %0, c0, c0, 5"     \
+                       : "=r" (cpunum));               \
+               cpunum &= 0x0F;                         \
+       })
+
+/*
+ * We use IRQ1 as the IPI
+ */
+static inline void smp_cross_call(const struct cpumask *mask)
+{
+       gic_raise_softirq(mask, 1);
+}
+#endif
diff --git a/arch/arm/mach-vexpress/include/mach/system.h b/arch/arm/mach-vexpress/include/mach/system.h
new file mode 100644 (file)
index 0000000..899a4e6
--- /dev/null
@@ -0,0 +1,37 @@
+/*
+ *  arch/arm/mach-vexpress/include/mach/system.h
+ *
+ *  Copyright (C) 2003 ARM Limited
+ *  Copyright (C) 2000 Deep Blue Solutions Ltd
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+#ifndef __ASM_ARCH_SYSTEM_H
+#define __ASM_ARCH_SYSTEM_H
+
+static inline void arch_idle(void)
+{
+       /*
+        * This should do all the clock switching
+        * and wait for interrupt tricks
+        */
+       cpu_do_idle();
+}
+
+static inline void arch_reset(char mode, const char *cmd)
+{
+}
+
+#endif
diff --git a/arch/arm/mach-vexpress/include/mach/timex.h b/arch/arm/mach-vexpress/include/mach/timex.h
new file mode 100644 (file)
index 0000000..00029ba
--- /dev/null
@@ -0,0 +1,23 @@
+/*
+ *  arch/arm/mach-vexpress/include/mach/timex.h
+ *
+ *  RealView architecture timex specifications
+ *
+ *  Copyright (C) 2003 ARM Limited
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+#define CLOCK_TICK_RATE                (50000000 / 16)
diff --git a/arch/arm/mach-vexpress/include/mach/uncompress.h b/arch/arm/mach-vexpress/include/mach/uncompress.h
new file mode 100644 (file)
index 0000000..7972c57
--- /dev/null
@@ -0,0 +1,52 @@
+/*
+ *  arch/arm/mach-vexpress/include/mach/uncompress.h
+ *
+ *  Copyright (C) 2003 ARM Limited
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+#define AMBA_UART_DR(base)     (*(volatile unsigned char *)((base) + 0x00))
+#define AMBA_UART_LCRH(base)   (*(volatile unsigned char *)((base) + 0x2c))
+#define AMBA_UART_CR(base)     (*(volatile unsigned char *)((base) + 0x30))
+#define AMBA_UART_FR(base)     (*(volatile unsigned char *)((base) + 0x18))
+
+#define get_uart_base()        (0x10000000 + 0x00009000)
+
+/*
+ * This does not append a newline
+ */
+static inline void putc(int c)
+{
+       unsigned long base = get_uart_base();
+
+       while (AMBA_UART_FR(base) & (1 << 5))
+               barrier();
+
+       AMBA_UART_DR(base) = c;
+}
+
+static inline void flush(void)
+{
+       unsigned long base = get_uart_base();
+
+       while (AMBA_UART_FR(base) & (1 << 3))
+               barrier();
+}
+
+/*
+ * nothing to do
+ */
+#define arch_decomp_setup()
+#define arch_decomp_wdog()
diff --git a/arch/arm/mach-vexpress/include/mach/vmalloc.h b/arch/arm/mach-vexpress/include/mach/vmalloc.h
new file mode 100644 (file)
index 0000000..f43a36e
--- /dev/null
@@ -0,0 +1,21 @@
+/*
+ *  arch/arm/mach-vexpress/include/mach/vmalloc.h
+ *
+ *  Copyright (C) 2003 ARM Limited
+ *  Copyright (C) 2000 Russell King.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+#define VMALLOC_END            0xf8000000UL
diff --git a/arch/arm/mach-vexpress/localtimer.c b/arch/arm/mach-vexpress/localtimer.c
new file mode 100644 (file)
index 0000000..c0e3a59
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ *  linux/arch/arm/mach-vexpress/localtimer.c
+ *
+ *  Copyright (C) 2002 ARM Ltd.
+ *  All Rights Reserved
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+#include <linux/init.h>
+#include <linux/smp.h>
+#include <linux/clockchips.h>
+
+#include <asm/smp_twd.h>
+#include <asm/localtimer.h>
+#include <mach/irqs.h>
+
+/*
+ * Setup the local clock events for a CPU.
+ */
+void __cpuinit local_timer_setup(struct clock_event_device *evt)
+{
+       evt->irq = IRQ_LOCALTIMER;
+       twd_timer_setup(evt);
+}
diff --git a/arch/arm/mach-vexpress/platsmp.c b/arch/arm/mach-vexpress/platsmp.c
new file mode 100644 (file)
index 0000000..6709706
--- /dev/null
@@ -0,0 +1,190 @@
+/*
+ *  linux/arch/arm/mach-vexpress/platsmp.c
+ *
+ *  Copyright (C) 2002 ARM Ltd.
+ *  All Rights Reserved
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+#include <linux/init.h>
+#include <linux/errno.h>
+#include <linux/delay.h>
+#include <linux/device.h>
+#include <linux/jiffies.h>
+#include <linux/smp.h>
+#include <linux/io.h>
+
+#include <asm/cacheflush.h>
+#include <asm/localtimer.h>
+#include <asm/smp_scu.h>
+#include <asm/unified.h>
+
+#include <mach/ct-ca9x4.h>
+#include <mach/motherboard.h>
+#define V2M_PA_CS7 0x10000000
+
+#include "core.h"
+
+extern void vexpress_secondary_startup(void);
+
+/*
+ * control for which core is the next to come out of the secondary
+ * boot "holding pen"
+ */
+volatile int __cpuinitdata pen_release = -1;
+
+static void __iomem *scu_base_addr(void)
+{
+       return MMIO_P2V(A9_MPCORE_SCU);
+}
+
+static DEFINE_SPINLOCK(boot_lock);
+
+void __cpuinit platform_secondary_init(unsigned int cpu)
+{
+       trace_hardirqs_off();
+
+       /*
+        * if any interrupts are already enabled for the primary
+        * core (e.g. timer irq), then they will not have been enabled
+        * for us: do so
+        */
+       gic_cpu_init(0, gic_cpu_base_addr);
+
+       /*
+        * let the primary processor know we're out of the
+        * pen, then head off into the C entry point
+        */
+       pen_release = -1;
+       smp_wmb();
+
+       /*
+        * Synchronise with the boot thread.
+        */
+       spin_lock(&boot_lock);
+       spin_unlock(&boot_lock);
+}
+
+int __cpuinit boot_secondary(unsigned int cpu, struct task_struct *idle)
+{
+       unsigned long timeout;
+
+       /*
+        * Set synchronisation state between this boot processor
+        * and the secondary one
+        */
+       spin_lock(&boot_lock);
+
+       /*
+        * This is really belt and braces; we hold unintended secondary
+        * CPUs in the holding pen until we're ready for them.  However,
+        * since we haven't sent them a soft interrupt, they shouldn't
+        * be there.
+        */
+       pen_release = cpu;
+       __cpuc_flush_dcache_area((void *)&pen_release, sizeof(pen_release));
+       outer_clean_range(__pa(&pen_release), __pa(&pen_release + 1));
+
+       /*
+        * Send the secondary CPU a soft interrupt, thereby causing
+        * the boot monitor to read the system wide flags register,
+        * and branch to the address found there.
+        */
+       smp_cross_call(cpumask_of(cpu));
+
+       timeout = jiffies + (1 * HZ);
+       while (time_before(jiffies, timeout)) {
+               smp_rmb();
+               if (pen_release == -1)
+                       break;
+
+               udelay(10);
+       }
+
+       /*
+        * now the secondary core is starting up let it run its
+        * calibrations, then wait for it to finish
+        */
+       spin_unlock(&boot_lock);
+
+       return pen_release != -1 ? -ENOSYS : 0;
+}
+
+/*
+ * Initialise the CPU possible map early - this describes the CPUs
+ * which may be present or become present in the system.
+ */
+void __init smp_init_cpus(void)
+{
+       void __iomem *scu_base = scu_base_addr();
+       unsigned int i, ncores;
+
+       ncores = scu_base ? scu_get_core_count(scu_base) : 1;
+
+       /* sanity check */
+       if (ncores == 0) {
+               printk(KERN_ERR
+                      "vexpress: strange CM count of 0? Default to 1\n");
+
+               ncores = 1;
+       }
+
+       if (ncores > NR_CPUS) {
+               printk(KERN_WARNING
+                      "vexpress: no. of cores (%d) greater than configured "
+                      "maximum of %d - clipping\n",
+                      ncores, NR_CPUS);
+               ncores = NR_CPUS;
+       }
+
+       for (i = 0; i < ncores; i++)
+               set_cpu_possible(i, true);
+}
+
+void __init smp_prepare_cpus(unsigned int max_cpus)
+{
+       unsigned int ncores = num_possible_cpus();
+       unsigned int cpu = smp_processor_id();
+       int i;
+
+       smp_store_cpu_info(cpu);
+
+       /*
+        * are we trying to boot more cores than exist?
+        */
+       if (max_cpus > ncores)
+               max_cpus = ncores;
+
+       /*
+        * Initialise the present map, which describes the set of CPUs
+        * actually populated at the present time.
+        */
+       for (i = 0; i < max_cpus; i++)
+               set_cpu_present(i, true);
+
+       /*
+        * Initialise the SCU if there are more than one CPU and let
+        * them know where to start.
+        */
+       if (max_cpus > 1) {
+               /*
+                * Enable the local timer or broadcast device for the
+                * boot CPU, but only if we have more than one CPU.
+                */
+               percpu_timer_setup();
+
+               scu_enable(scu_base_addr());
+
+               /*
+                * Write the address of secondary startup into the
+                * system-wide flags register. The boot monitor waits
+                * until it receives a soft interrupt, and then the
+                * secondary CPU branches to this address.
+                */
+               writel(~0, MMIO_P2V(V2M_SYS_FLAGSCLR));
+               writel(BSYM(virt_to_phys(vexpress_secondary_startup)),
+                       MMIO_P2V(V2M_SYS_FLAGSSET));
+       }
+}
diff --git a/arch/arm/mach-vexpress/v2m.c b/arch/arm/mach-vexpress/v2m.c
new file mode 100644 (file)
index 0000000..d250711
--- /dev/null
@@ -0,0 +1,361 @@
+/*
+ * Versatile Express V2M Motherboard Support
+ */
+#include <linux/device.h>
+#include <linux/amba/bus.h>
+#include <linux/amba/mmci.h>
+#include <linux/io.h>
+#include <linux/init.h>
+#include <linux/platform_device.h>
+#include <linux/smsc911x.h>
+#include <linux/spinlock.h>
+#include <linux/sysdev.h>
+#include <linux/usb/isp1760.h>
+
+#include <asm/clkdev.h>
+#include <asm/sizes.h>
+#include <asm/mach/flash.h>
+#include <asm/mach/map.h>
+#include <asm/mach/time.h>
+#include <asm/hardware/arm_timer.h>
+
+#include <mach/clkdev.h>
+#include <mach/motherboard.h>
+
+#include <plat/timer-sp.h>
+
+#include "core.h"
+
+#define V2M_PA_CS0     0x40000000
+#define V2M_PA_CS1     0x44000000
+#define V2M_PA_CS2     0x48000000
+#define V2M_PA_CS3     0x4c000000
+#define V2M_PA_CS7     0x10000000
+
+static struct map_desc v2m_io_desc[] __initdata = {
+       {
+               .virtual        = __MMIO_P2V(V2M_PA_CS7),
+               .pfn            = __phys_to_pfn(V2M_PA_CS7),
+               .length         = SZ_128K,
+               .type           = MT_DEVICE,
+       },
+};
+
+void __init v2m_map_io(struct map_desc *tile, size_t num)
+{
+       iotable_init(v2m_io_desc, ARRAY_SIZE(v2m_io_desc));
+       iotable_init(tile, num);
+}
+
+
+static void v2m_timer_init(void)
+{
+       writel(0, MMIO_P2V(V2M_TIMER0) + TIMER_CTRL);
+       writel(0, MMIO_P2V(V2M_TIMER1) + TIMER_CTRL);
+
+       sp804_clocksource_init(MMIO_P2V(V2M_TIMER1));
+       sp804_clockevents_init(MMIO_P2V(V2M_TIMER0), IRQ_V2M_TIMER0);
+}
+
+struct sys_timer v2m_timer = {
+       .init   = v2m_timer_init,
+};
+
+
+static DEFINE_SPINLOCK(v2m_cfg_lock);
+
+int v2m_cfg_write(u32 devfn, u32 data)
+{
+       /* Configuration interface broken? */
+       u32 val;
+
+       printk("%s: writing %08x to %08x\n", __func__, data, devfn);
+
+       devfn |= SYS_CFG_START | SYS_CFG_WRITE;
+
+       spin_lock(&v2m_cfg_lock);
+       val = readl(MMIO_P2V(V2M_SYS_CFGSTAT));
+       writel(val & ~SYS_CFG_COMPLETE, MMIO_P2V(V2M_SYS_CFGSTAT));
+
+       writel(data, MMIO_P2V(V2M_SYS_CFGDATA));
+       writel(devfn, MMIO_P2V(V2M_SYS_CFGCTRL));
+
+       do {
+               val = readl(MMIO_P2V(V2M_SYS_CFGSTAT));
+       } while (val == 0);
+       spin_unlock(&v2m_cfg_lock);
+
+       return !!(val & SYS_CFG_ERR);
+}
+
+int v2m_cfg_read(u32 devfn, u32 *data)
+{
+       u32 val;
+
+       devfn |= SYS_CFG_START;
+
+       spin_lock(&v2m_cfg_lock);
+       writel(0, MMIO_P2V(V2M_SYS_CFGSTAT));
+       writel(devfn, MMIO_P2V(V2M_SYS_CFGCTRL));
+
+       mb();
+
+       do {
+               cpu_relax();
+               val = readl(MMIO_P2V(V2M_SYS_CFGSTAT));
+       } while (val == 0);
+
+       *data = readl(MMIO_P2V(V2M_SYS_CFGDATA));
+       spin_unlock(&v2m_cfg_lock);
+
+       return !!(val & SYS_CFG_ERR);
+}
+
+
+static struct resource v2m_pcie_i2c_resource = {
+       .start  = V2M_SERIAL_BUS_PCI,
+       .end    = V2M_SERIAL_BUS_PCI + SZ_4K - 1,
+       .flags  = IORESOURCE_MEM,
+};
+
+static struct platform_device v2m_pcie_i2c_device = {
+       .name           = "versatile-i2c",
+       .id             = 0,
+       .num_resources  = 1,
+       .resource       = &v2m_pcie_i2c_resource,
+};
+
+static struct resource v2m_ddc_i2c_resource = {
+       .start  = V2M_SERIAL_BUS_DVI,
+       .end    = V2M_SERIAL_BUS_DVI + SZ_4K - 1,
+       .flags  = IORESOURCE_MEM,
+};
+
+static struct platform_device v2m_ddc_i2c_device = {
+       .name           = "versatile-i2c",
+       .id             = 1,
+       .num_resources  = 1,
+       .resource       = &v2m_ddc_i2c_resource,
+};
+
+static struct resource v2m_eth_resources[] = {
+       {
+               .start  = V2M_LAN9118,
+               .end    = V2M_LAN9118 + SZ_64K - 1,
+               .flags  = IORESOURCE_MEM,
+       }, {
+               .start  = IRQ_V2M_LAN9118,
+               .end    = IRQ_V2M_LAN9118,
+               .flags  = IORESOURCE_IRQ,
+       },
+};
+
+static struct smsc911x_platform_config v2m_eth_config = {
+       .flags          = SMSC911X_USE_32BIT,
+       .irq_polarity   = SMSC911X_IRQ_POLARITY_ACTIVE_HIGH,
+       .irq_type       = SMSC911X_IRQ_TYPE_PUSH_PULL,
+       .phy_interface  = PHY_INTERFACE_MODE_MII,
+};
+
+static struct platform_device v2m_eth_device = {
+       .name           = "smsc911x",
+       .id             = -1,
+       .resource       = v2m_eth_resources,
+       .num_resources  = ARRAY_SIZE(v2m_eth_resources),
+       .dev.platform_data = &v2m_eth_config,
+};
+
+static struct resource v2m_usb_resources[] = {
+       {
+               .start  = V2M_ISP1761,
+               .end    = V2M_ISP1761 + SZ_128K - 1,
+               .flags  = IORESOURCE_MEM,
+       }, {
+               .start  = IRQ_V2M_ISP1761,
+               .end    = IRQ_V2M_ISP1761,
+               .flags  = IORESOURCE_IRQ,
+       },
+};
+
+static struct isp1760_platform_data v2m_usb_config = {
+       .is_isp1761             = true,
+       .bus_width_16           = false,
+       .port1_otg              = true,
+       .analog_oc              = false,
+       .dack_polarity_high     = false,
+       .dreq_polarity_high     = false,
+};
+
+static struct platform_device v2m_usb_device = {
+       .name           = "isp1760",
+       .id             = -1,
+       .resource       = v2m_usb_resources,
+       .num_resources  = ARRAY_SIZE(v2m_usb_resources),
+       .dev.platform_data = &v2m_usb_config,
+};
+
+static int v2m_flash_init(void)
+{
+       writel(0, MMIO_P2V(V2M_SYS_FLASH));
+       return 0;
+}
+
+static void v2m_flash_exit(void)
+{
+       writel(0, MMIO_P2V(V2M_SYS_FLASH));
+}
+
+static void v2m_flash_set_vpp(int on)
+{
+       writel(on != 0, MMIO_P2V(V2M_SYS_FLASH));
+}
+
+static struct flash_platform_data v2m_flash_data = {
+       .map_name       = "cfi_probe",
+       .width          = 4,
+       .init           = v2m_flash_init,
+       .exit           = v2m_flash_exit,
+       .set_vpp        = v2m_flash_set_vpp,
+};
+
+static struct resource v2m_flash_resources[] = {
+       {
+               .start  = V2M_NOR0,
+               .end    = V2M_NOR0 + SZ_64M - 1,
+               .flags  = IORESOURCE_MEM,
+       }, {
+               .start  = V2M_NOR1,
+               .end    = V2M_NOR1 + SZ_64M - 1,
+               .flags  = IORESOURCE_MEM,
+       },
+};
+
+static struct platform_device v2m_flash_device = {
+       .name           = "armflash",
+       .id             = -1,
+       .resource       = v2m_flash_resources,
+       .num_resources  = ARRAY_SIZE(v2m_flash_resources),
+       .dev.platform_data = &v2m_flash_data,
+};
+
+
+static unsigned int v2m_mmci_status(struct device *dev)
+{
+       return !(readl(MMIO_P2V(V2M_SYS_MCI)) & (1 << 0));
+}
+
+static struct mmci_platform_data v2m_mmci_data = {
+       .ocr_mask       = MMC_VDD_32_33|MMC_VDD_33_34,
+       .status         = v2m_mmci_status,
+};
+
+static AMBA_DEVICE(aaci,  "mb:aaci",  V2M_AACI, NULL);
+static AMBA_DEVICE(mmci,  "mb:mmci",  V2M_MMCI, &v2m_mmci_data);
+static AMBA_DEVICE(kmi0,  "mb:kmi0",  V2M_KMI0, NULL);
+static AMBA_DEVICE(kmi1,  "mb:kmi1",  V2M_KMI1, NULL);
+static AMBA_DEVICE(uart0, "mb:uart0", V2M_UART0, NULL);
+static AMBA_DEVICE(uart1, "mb:uart1", V2M_UART1, NULL);
+static AMBA_DEVICE(uart2, "mb:uart2", V2M_UART2, NULL);
+static AMBA_DEVICE(uart3, "mb:uart3", V2M_UART3, NULL);
+static AMBA_DEVICE(wdt,   "mb:wdt",   V2M_WDT, NULL);
+static AMBA_DEVICE(rtc,   "mb:rtc",   V2M_RTC, NULL);
+
+static struct amba_device *v2m_amba_devs[] __initdata = {
+       &aaci_device,
+       &mmci_device,
+       &kmi0_device,
+       &kmi1_device,
+       &uart0_device,
+       &uart1_device,
+       &uart2_device,
+       &uart3_device,
+       &wdt_device,
+       &rtc_device,
+};
+
+
+static long v2m_osc_round(struct clk *clk, unsigned long rate)
+{
+       return rate;
+}
+
+static int v2m_osc1_set(struct clk *clk, unsigned long rate)
+{
+       return v2m_cfg_write(SYS_CFG_OSC | SYS_CFG_SITE_MB | 1, rate);
+}
+
+static const struct clk_ops osc1_clk_ops = {
+       .round  = v2m_osc_round,
+       .set    = v2m_osc1_set,
+};
+
+static struct clk osc1_clk = {
+       .ops    = &osc1_clk_ops,
+       .rate   = 24000000,
+};
+
+static struct clk osc2_clk = {
+       .rate   = 24000000,
+};
+
+static struct clk_lookup v2m_lookups[] = {
+       {       /* UART0 */
+               .dev_id         = "mb:uart0",
+               .clk            = &osc2_clk,
+       }, {    /* UART1 */
+               .dev_id         = "mb:uart1",
+               .clk            = &osc2_clk,
+       }, {    /* UART2 */
+               .dev_id         = "mb:uart2",
+               .clk            = &osc2_clk,
+       }, {    /* UART3 */
+               .dev_id         = "mb:uart3",
+               .clk            = &osc2_clk,
+       }, {    /* KMI0 */
+               .dev_id         = "mb:kmi0",
+               .clk            = &osc2_clk,
+       }, {    /* KMI1 */
+               .dev_id         = "mb:kmi1",
+               .clk            = &osc2_clk,
+       }, {    /* MMC0 */
+               .dev_id         = "mb:mmci",
+               .clk            = &osc2_clk,
+       }, {    /* CLCD */
+               .dev_id         = "mb:clcd",
+               .clk            = &osc1_clk,
+       },
+};
+
+static void v2m_power_off(void)
+{
+       if (v2m_cfg_write(SYS_CFG_SHUTDOWN | SYS_CFG_SITE_MB, 0))
+               printk(KERN_EMERG "Unable to shutdown\n");
+}
+
+static void v2m_restart(char str, const char *cmd)
+{
+       if (v2m_cfg_write(SYS_CFG_REBOOT | SYS_CFG_SITE_MB, 0))
+               printk(KERN_EMERG "Unable to reboot\n");
+}
+
+static int __init v2m_init(void)
+{
+       int i;
+
+       clkdev_add_table(v2m_lookups, ARRAY_SIZE(v2m_lookups));
+
+       platform_device_register(&v2m_pcie_i2c_device);
+       platform_device_register(&v2m_ddc_i2c_device);
+       platform_device_register(&v2m_flash_device);
+       platform_device_register(&v2m_eth_device);
+       platform_device_register(&v2m_usb_device);
+
+       for (i = 0; i < ARRAY_SIZE(v2m_amba_devs); i++)
+               amba_device_register(v2m_amba_devs[i], &iomem_resource);
+
+       pm_power_off = v2m_power_off;
+       arm_pm_restart = v2m_restart;
+
+       return 0;
+}
+arch_initcall(v2m_init);
index 3e62aae..346ae14 100644 (file)
@@ -762,7 +762,8 @@ config CACHE_FEROCEON_L2_WRITETHROUGH
 config CACHE_L2X0
        bool "Enable the L2x0 outer cache controller"
        depends on REALVIEW_EB_ARM11MP || MACH_REALVIEW_PB11MP || MACH_REALVIEW_PB1176 || \
-                  REALVIEW_EB_A9MP || ARCH_MX35 || ARCH_MX31 || MACH_REALVIEW_PBX || ARCH_NOMADIK || ARCH_OMAP4
+                  REALVIEW_EB_A9MP || ARCH_MX35 || ARCH_MX31 || MACH_REALVIEW_PBX || \
+                  ARCH_NOMADIK || ARCH_OMAP4 || ARCH_U8500 || ARCH_VEXPRESS_CA9X4
        default y
        select OUTER_CACHE
        select OUTER_CACHE_SYNC
@@ -791,6 +792,25 @@ config ARM_L1_CACHE_SHIFT
        default 6 if ARM_L1_CACHE_SHIFT_6
        default 5
 
+config ARM_DMA_MEM_BUFFERABLE
+       bool "Use non-cacheable memory for DMA" if CPU_V6 && !CPU_V7
+       default y if CPU_V6 || CPU_V7
+       help
+         Historically, the kernel has used strongly ordered mappings to
+         provide DMA coherent memory.  With the advent of ARMv7, mapping
+         memory with differing types results in unpredictable behaviour,
+         so on these CPUs, this option is forced on.
+
+         Multiple mappings with differing attributes is also unpredictable
+         on ARMv6 CPUs, but since they do not have aggressive speculative
+         prefetch, no harm appears to occur.
+
+         However, drivers may be missing the necessary barriers for ARMv6,
+         and therefore turning this on may result in unpredictable driver
+         behaviour.  Therefore, we offer this as an option.
+
+         You are recommended say 'Y' here and debug any affected drivers.
+
 config ARCH_HAS_BARRIERS
        bool
        help
index a2ab51f..6f98c35 100644 (file)
@@ -17,6 +17,7 @@
 #include <linux/errno.h>
 #include <linux/string.h>
 #include <linux/proc_fs.h>
+#include <linux/seq_file.h>
 #include <linux/init.h>
 #include <linux/sched.h>
 #include <linux/uaccess.h>
@@ -94,36 +95,29 @@ static const char *usermode_action[] = {
        "signal+warn"
 };
 
-static int
-proc_alignment_read(char *page, char **start, off_t off, int count, int *eof,
-                   void *data)
+static int alignment_proc_show(struct seq_file *m, void *v)
 {
-       char *p = page;
-       int len;
-
-       p += sprintf(p, "User:\t\t%lu\n", ai_user);
-       p += sprintf(p, "System:\t\t%lu\n", ai_sys);
-       p += sprintf(p, "Skipped:\t%lu\n", ai_skipped);
-       p += sprintf(p, "Half:\t\t%lu\n", ai_half);
-       p += sprintf(p, "Word:\t\t%lu\n", ai_word);
+       seq_printf(m, "User:\t\t%lu\n", ai_user);
+       seq_printf(m, "System:\t\t%lu\n", ai_sys);
+       seq_printf(m, "Skipped:\t%lu\n", ai_skipped);
+       seq_printf(m, "Half:\t\t%lu\n", ai_half);
+       seq_printf(m, "Word:\t\t%lu\n", ai_word);
        if (cpu_architecture() >= CPU_ARCH_ARMv5TE)
-               p += sprintf(p, "DWord:\t\t%lu\n", ai_dword);
-       p += sprintf(p, "Multi:\t\t%lu\n", ai_multi);
-       p += sprintf(p, "User faults:\t%i (%s)\n", ai_usermode,
+               seq_printf(m, "DWord:\t\t%lu\n", ai_dword);
+       seq_printf(m, "Multi:\t\t%lu\n", ai_multi);
+       seq_printf(m, "User faults:\t%i (%s)\n", ai_usermode,
                        usermode_action[ai_usermode]);
 
-       len = (p - page) - off;
-       if (len < 0)
-               len = 0;
-
-       *eof = (len <= count) ? 1 : 0;
-       *start = page + off;
+       return 0;
+}
 
-       return len;
+static int alignment_proc_open(struct inode *inode, struct file *file)
+{
+       return single_open(file, alignment_proc_show, NULL);
 }
 
-static int proc_alignment_write(struct file *file, const char __user *buffer,
-                               unsigned long count, void *data)
+static ssize_t alignment_proc_write(struct file *file, const char __user *buffer,
+                                   size_t count, loff_t *pos)
 {
        char mode;
 
@@ -136,6 +130,13 @@ static int proc_alignment_write(struct file *file, const char __user *buffer,
        return count;
 }
 
+static const struct file_operations alignment_proc_fops = {
+       .open           = alignment_proc_open,
+       .read           = seq_read,
+       .llseek         = seq_lseek,
+       .release        = single_release,
+       .write          = alignment_proc_write,
+};
 #endif /* CONFIG_PROC_FS */
 
 union offset_union {
@@ -901,12 +902,10 @@ static int __init alignment_init(void)
 #ifdef CONFIG_PROC_FS
        struct proc_dir_entry *res;
 
-       res = create_proc_entry("cpu/alignment", S_IWUSR | S_IRUGO, NULL);
+       res = proc_create("cpu/alignment", S_IWUSR | S_IRUGO, NULL,
+                         &alignment_proc_fops);
        if (!res)
                return -ENOMEM;
-
-       res->read_proc = proc_alignment_read;
-       res->write_proc = proc_alignment_write;
 #endif
 
        /*
index 21ad68b..9819869 100644 (file)
@@ -27,6 +27,7 @@
 
 static void __iomem *l2x0_base;
 static DEFINE_SPINLOCK(l2x0_lock);
+static uint32_t l2x0_way_mask; /* Bitmask of active ways */
 
 static inline void cache_wait(void __iomem *reg, unsigned long mask)
 {
@@ -108,8 +109,8 @@ static inline void l2x0_inv_all(void)
 
        /* invalidate all ways */
        spin_lock_irqsave(&l2x0_lock, flags);
-       writel(0xff, l2x0_base + L2X0_INV_WAY);
-       cache_wait(l2x0_base + L2X0_INV_WAY, 0xff);
+       writel(l2x0_way_mask, l2x0_base + L2X0_INV_WAY);
+       cache_wait(l2x0_base + L2X0_INV_WAY, l2x0_way_mask);
        cache_sync();
        spin_unlock_irqrestore(&l2x0_lock, flags);
 }
@@ -208,9 +209,37 @@ static void l2x0_flush_range(unsigned long start, unsigned long end)
 void __init l2x0_init(void __iomem *base, __u32 aux_val, __u32 aux_mask)
 {
        __u32 aux;
+       __u32 cache_id;
+       int ways;
+       const char *type;
 
        l2x0_base = base;
 
+       cache_id = readl(l2x0_base + L2X0_CACHE_ID);
+       aux = readl(l2x0_base + L2X0_AUX_CTRL);
+
+       /* Determine the number of ways */
+       switch (cache_id & L2X0_CACHE_ID_PART_MASK) {
+       case L2X0_CACHE_ID_PART_L310:
+               if (aux & (1 << 16))
+                       ways = 16;
+               else
+                       ways = 8;
+               type = "L310";
+               break;
+       case L2X0_CACHE_ID_PART_L210:
+               ways = (aux >> 13) & 0xf;
+               type = "L210";
+               break;
+       default:
+               /* Assume unknown chips have 8 ways */
+               ways = 8;
+               type = "L2x0 series";
+               break;
+       }
+
+       l2x0_way_mask = (1 << ways) - 1;
+
        /*
         * Check if l2x0 controller is already enabled.
         * If you are booting from non-secure mode
@@ -219,8 +248,6 @@ void __init l2x0_init(void __iomem *base, __u32 aux_val, __u32 aux_mask)
        if (!(readl(l2x0_base + L2X0_CTRL) & 1)) {
 
                /* l2x0 controller is disabled */
-
-               aux = readl(l2x0_base + L2X0_AUX_CTRL);
                aux &= aux_mask;
                aux |= aux_val;
                writel(aux, l2x0_base + L2X0_AUX_CTRL);
@@ -236,5 +263,7 @@ void __init l2x0_init(void __iomem *base, __u32 aux_val, __u32 aux_mask)
        outer_cache.flush_range = l2x0_flush_range;
        outer_cache.sync = l2x0_cache_sync;
 
-       printk(KERN_INFO "L2X0 cache controller enabled\n");
+       printk(KERN_INFO "%s cache controller enabled\n", type);
+       printk(KERN_INFO "l2x0: %d ways, CACHE_ID 0x%08x, AUX_CTRL 0x%08x\n",
+                        ways, cache_id, aux);
 }
index 0d414c2..9b906de 100644 (file)
@@ -134,8 +134,6 @@ make_coherent(struct address_space *mapping, struct vm_area_struct *vma,
        flush_dcache_mmap_unlock(mapping);
        if (aliases)
                do_adjust_pte(vma, addr, pfn, ptep);
-       else
-               flush_cache_page(vma, addr, pfn);
 }
 
 /*
index 9d40c34..92f5801 100644 (file)
@@ -463,7 +463,12 @@ static struct fsr_info {
        { do_bad,               SIGILL,  BUS_ADRALN,    "alignment exception"              },
        { do_bad,               SIGKILL, 0,             "terminal exception"               },
        { do_bad,               SIGILL,  BUS_ADRALN,    "alignment exception"              },
+/* Do we need runtime check ? */
+#if __LINUX_ARM_ARCH__ < 6
        { do_bad,               SIGBUS,  0,             "external abort on linefetch"      },
+#else
+       { do_translation_fault, SIGSEGV, SEGV_MAPERR,   "I-cache maintenance fault"        },
+#endif
        { do_translation_fault, SIGSEGV, SEGV_MAPERR,   "section translation fault"        },
        { do_bad,               SIGBUS,  0,             "external abort on linefetch"      },
        { do_page_fault,        SIGSEGV, SEGV_MAPERR,   "page translation fault"           },
index 0ed29bf..1ba6cf5 100644 (file)
@@ -15,7 +15,6 @@
 #include <linux/mman.h>
 #include <linux/nodemask.h>
 #include <linux/initrd.h>
-#include <linux/sort.h>
 #include <linux/highmem.h>
 #include <linux/gfp.h>
 
@@ -224,20 +223,6 @@ static int __init check_initrd(struct meminfo *mi)
        return initrd_node;
 }
 
-static inline void map_memory_bank(struct membank *bank)
-{
-#ifdef CONFIG_MMU
-       struct map_desc map;
-
-       map.pfn = bank_pfn_start(bank);
-       map.virtual = __phys_to_virt(bank_phys_start(bank));
-       map.length = bank_phys_size(bank);
-       map.type = MT_MEMORY;
-
-       create_mapping(&map);
-#endif
-}
-
 static void __init bootmem_init_node(int node, struct meminfo *mi,
        unsigned long start_pfn, unsigned long end_pfn)
 {
@@ -246,16 +231,6 @@ static void __init bootmem_init_node(int node, struct meminfo *mi,
        pg_data_t *pgdat;
        int i;
 
-       /*
-        * Map the memory banks for this node.
-        */
-       for_each_nodebank(i, mi, node) {
-               struct membank *bank = &mi->bank[i];
-
-               if (!bank->highmem)
-                       map_memory_bank(bank);
-       }
-
        /*
         * Allocate the bootmem bitmap page.
         */
@@ -385,21 +360,12 @@ static void arm_memory_present(struct meminfo *mi, int node)
 }
 #endif
 
-static int __init meminfo_cmp(const void *_a, const void *_b)
-{
-       const struct membank *a = _a, *b = _b;
-       long cmp = bank_pfn_start(a) - bank_pfn_start(b);
-       return cmp < 0 ? -1 : cmp > 0 ? 1 : 0;
-}
-
 void __init bootmem_init(void)
 {
        struct meminfo *mi = &meminfo;
        unsigned long min, max_low, max_high;
        int node, initrd_node;
 
-       sort(&mi->bank, mi->nr_banks, sizeof(mi->bank[0]), meminfo_cmp, NULL);
-
        /*
         * Locate which node contains the ramdisk image, if any.
         */
index a888363..815d08e 100644 (file)
@@ -28,10 +28,7 @@ extern void __flush_dcache_page(struct address_space *mapping, struct page *page
 
 #endif
 
-struct map_desc;
-struct meminfo;
 struct pglist_data;
 
-void __init create_mapping(struct map_desc *md);
 void __init bootmem_init(void);
 void reserve_node_zero(struct pglist_data *pgdat);
index 241c24a..e7113d0 100644 (file)
@@ -14,6 +14,7 @@
 #include <linux/bootmem.h>
 #include <linux/mman.h>
 #include <linux/nodemask.h>
+#include <linux/sort.h>
 
 #include <asm/cputype.h>
 #include <asm/mach-types.h>
@@ -603,7 +604,7 @@ static void __init create_36bit_mapping(struct map_desc *md,
  * offsets, and we take full advantage of sections and
  * supersections.
  */
-void __init create_mapping(struct map_desc *md)
+static void __init create_mapping(struct map_desc *md)
 {
        unsigned long phys, addr, length, end;
        const struct mem_type *type;
@@ -1017,6 +1018,39 @@ static void __init kmap_init(void)
 #endif
 }
 
+static inline void map_memory_bank(struct membank *bank)
+{
+       struct map_desc map;
+
+       map.pfn = bank_pfn_start(bank);
+       map.virtual = __phys_to_virt(bank_phys_start(bank));
+       map.length = bank_phys_size(bank);
+       map.type = MT_MEMORY;
+
+       create_mapping(&map);
+}
+
+static void __init map_lowmem(void)
+{
+       struct meminfo *mi = &meminfo;
+       int i;
+
+       /* Map all the lowmem memory banks. */
+       for (i = 0; i < mi->nr_banks; i++) {
+               struct membank *bank = &mi->bank[i];
+
+               if (!bank->highmem)
+                       map_memory_bank(bank);
+       }
+}
+
+static int __init meminfo_cmp(const void *_a, const void *_b)
+{
+       const struct membank *a = _a, *b = _b;
+       long cmp = bank_pfn_start(a) - bank_pfn_start(b);
+       return cmp < 0 ? -1 : cmp > 0 ? 1 : 0;
+}
+
 /*
  * paging_init() sets up the page tables, initialises the zone memory
  * maps, and sets up the zero page, bad page and bad page tables.
@@ -1025,9 +1059,12 @@ void __init paging_init(struct machine_desc *mdesc)
 {
        void *zero_page;
 
+       sort(&meminfo.bank, meminfo.nr_banks, sizeof(meminfo.bank[0]), meminfo_cmp, NULL);
+
        build_mem_type_table();
        sanity_check_meminfo();
        prepare_page_table();
+       map_lowmem();
        bootmem_init();
        devicemaps_init(mdesc);
        kmap_init();
index 4c0ab50..cb7658e 100644 (file)
@@ -24,6 +24,7 @@
 #include "fpa11.h"
 
 #include <linux/module.h>
+#include <linux/moduleparam.h>
 
 /* XXX */
 #include <linux/errno.h>
@@ -134,13 +135,17 @@ a SIGFPE exception if necessary.  If not the relevant bits in the
 cumulative exceptions flag byte are set and we return.
 */
 
+#ifdef CONFIG_DEBUG_USER
+/* By default, ignore inexact errors as there are far too many of them to log */
+static int debug = ~BIT_IXC;
+#endif
+
 void float_raise(signed char flags)
 {
        register unsigned int fpsr, cumulativeTraps;
 
 #ifdef CONFIG_DEBUG_USER
-       /* Ignore inexact errors as there are far too many of them to log */
-       if (flags & ~BIT_IXC)
+       if (flags & debug)
                printk(KERN_DEBUG
                       "NWFPE: %s[%d] takes exception %08x at %p from %08lx\n",
                       current->comm, current->pid, flags,
@@ -179,3 +184,7 @@ module_exit(fpe_exit);
 MODULE_AUTHOR("Scott Bambrough <scottb@rebel.com>");
 MODULE_DESCRIPTION("NWFPE floating point emulator (" NWFPE_BITS " precision)");
 MODULE_LICENSE("GPL");
+
+#ifdef CONFIG_DEBUG_USER
+module_param(debug, int, 0644);
+#endif
index 88e31f5..e666eaf 100644 (file)
@@ -6,9 +6,4 @@ DRIVER_OBJS = $(addprefix ../../../drivers/oprofile/, \
                oprofilefs.o oprofile_stats.o \
                timer_int.o )
 
-oprofile-y                             := $(DRIVER_OBJS) common.o backtrace.o
-oprofile-$(CONFIG_CPU_XSCALE)          += op_model_xscale.o
-oprofile-$(CONFIG_OPROFILE_ARM11_CORE) += op_model_arm11_core.o
-oprofile-$(CONFIG_OPROFILE_ARMV6)      += op_model_v6.o
-oprofile-$(CONFIG_OPROFILE_MPCORE)     += op_model_mpcore.o
-oprofile-$(CONFIG_OPROFILE_ARMV7)      += op_model_v7.o
+oprofile-y                             := $(DRIVER_OBJS) common.o
diff --git a/arch/arm/oprofile/backtrace.c b/arch/arm/oprofile/backtrace.c
deleted file mode 100644 (file)
index d805a52..0000000
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Arm specific backtracing code for oprofile
- *
- * Copyright 2005 Openedhand Ltd.
- *
- * Author: Richard Purdie <rpurdie@openedhand.com>
- *
- * Based on i386 oprofile backtrace code by John Levon, David Smith
- *
- * 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/oprofile.h>
-#include <linux/sched.h>
-#include <linux/mm.h>
-#include <linux/uaccess.h>
-#include <asm/ptrace.h>
-#include <asm/stacktrace.h>
-
-static int report_trace(struct stackframe *frame, void *d)
-{
-       unsigned int *depth = d;
-
-       if (*depth) {
-               oprofile_add_trace(frame->pc);
-               (*depth)--;
-       }
-
-       return *depth == 0;
-}
-
-/*
- * The registers we're interested in are at the end of the variable
- * length saved register structure. The fp points at the end of this
- * structure so the address of this struct is:
- * (struct frame_tail *)(xxx->fp)-1
- */
-struct frame_tail {
-       struct frame_tail *fp;
-       unsigned long sp;
-       unsigned long lr;
-} __attribute__((packed));
-
-static struct frame_tail* user_backtrace(struct frame_tail *tail)
-{
-       struct frame_tail buftail[2];
-
-       /* Also check accessibility of one struct frame_tail beyond */
-       if (!access_ok(VERIFY_READ, tail, sizeof(buftail)))
-               return NULL;
-       if (__copy_from_user_inatomic(buftail, tail, sizeof(buftail)))
-               return NULL;
-
-       oprofile_add_trace(buftail[0].lr);
-
-       /* frame pointers should strictly progress back up the stack
-        * (towards higher addresses) */
-       if (tail >= buftail[0].fp)
-               return NULL;
-
-       return buftail[0].fp-1;
-}
-
-void arm_backtrace(struct pt_regs * const regs, unsigned int depth)
-{
-       struct frame_tail *tail = ((struct frame_tail *) regs->ARM_fp) - 1;
-
-       if (!user_mode(regs)) {
-               struct stackframe frame;
-               frame.fp = regs->ARM_fp;
-               frame.sp = regs->ARM_sp;
-               frame.lr = regs->ARM_lr;
-               frame.pc = regs->ARM_pc;
-               walk_stackframe(&frame, report_trace, &depth);
-               return;
-       }
-
-       while (depth-- && tail && !((unsigned long) tail & 3))
-               tail = user_backtrace(tail);
-}
index 3fcd752..0691176 100644 (file)
  * @file common.c
  *
  * @remark Copyright 2004 Oprofile Authors
+ * @remark Copyright 2010 ARM Ltd.
  * @remark Read the file COPYING
  *
  * @author Zwane Mwaikambo
+ * @author Will Deacon [move to perf]
  */
 
+#include <linux/cpumask.h>
+#include <linux/err.h>
+#include <linux/errno.h>
 #include <linux/init.h>
+#include <linux/mutex.h>
 #include <linux/oprofile.h>
-#include <linux/errno.h>
+#include <linux/perf_event.h>
+#include <linux/platform_device.h>
 #include <linux/slab.h>
-#include <linux/sysdev.h>
-#include <linux/mutex.h>
+#include <asm/stacktrace.h>
+#include <linux/uaccess.h>
 
-#include "op_counter.h"
-#include "op_arm_model.h"
+#include <asm/perf_event.h>
+#include <asm/ptrace.h>
+
+#ifdef CONFIG_HW_PERF_EVENTS
+/*
+ * Per performance monitor configuration as set via oprofilefs.
+ */
+struct op_counter_config {
+       unsigned long count;
+       unsigned long enabled;
+       unsigned long event;
+       unsigned long unit_mask;
+       unsigned long kernel;
+       unsigned long user;
+       struct perf_event_attr attr;
+};
 
-static struct op_arm_model_spec *op_arm_model;
 static int op_arm_enabled;
 static DEFINE_MUTEX(op_arm_mutex);
 
-struct op_counter_config *counter_config;
+static struct op_counter_config *counter_config;
+static struct perf_event **perf_events[nr_cpumask_bits];
+static int perf_num_counters;
+
+/*
+ * Overflow callback for oprofile.
+ */
+static void op_overflow_handler(struct perf_event *event, int unused,
+                       struct perf_sample_data *data, struct pt_regs *regs)
+{
+       int id;
+       u32 cpu = smp_processor_id();
+
+       for (id = 0; id < perf_num_counters; ++id)
+               if (perf_events[cpu][id] == event)
+                       break;
+
+       if (id != perf_num_counters)
+               oprofile_add_sample(regs, id);
+       else
+               pr_warning("oprofile: ignoring spurious overflow "
+                               "on cpu %u\n", cpu);
+}
+
+/*
+ * Called by op_arm_setup to create perf attributes to mirror the oprofile
+ * settings in counter_config. Attributes are created as `pinned' events and
+ * so are permanently scheduled on the PMU.
+ */
+static void op_perf_setup(void)
+{
+       int i;
+       u32 size = sizeof(struct perf_event_attr);
+       struct perf_event_attr *attr;
+
+       for (i = 0; i < perf_num_counters; ++i) {
+               attr = &counter_config[i].attr;
+               memset(attr, 0, size);
+               attr->type              = PERF_TYPE_RAW;
+               attr->size              = size;
+               attr->config            = counter_config[i].event;
+               attr->sample_period     = counter_config[i].count;
+               attr->pinned            = 1;
+       }
+}
+
+static int op_create_counter(int cpu, int event)
+{
+       int ret = 0;
+       struct perf_event *pevent;
+
+       if (!counter_config[event].enabled || (perf_events[cpu][event] != NULL))
+               return ret;
+
+       pevent = perf_event_create_kernel_counter(&counter_config[event].attr,
+                                                 cpu, -1,
+                                                 op_overflow_handler);
+
+       if (IS_ERR(pevent)) {
+               ret = PTR_ERR(pevent);
+       } else if (pevent->state != PERF_EVENT_STATE_ACTIVE) {
+               pr_warning("oprofile: failed to enable event %d "
+                               "on CPU %d\n", event, cpu);
+               ret = -EBUSY;
+       } else {
+               perf_events[cpu][event] = pevent;
+       }
+
+       return ret;
+}
+
+static void op_destroy_counter(int cpu, int event)
+{
+       struct perf_event *pevent = perf_events[cpu][event];
+
+       if (pevent) {
+               perf_event_release_kernel(pevent);
+               perf_events[cpu][event] = NULL;
+       }
+}
+
+/*
+ * Called by op_arm_start to create active perf events based on the
+ * perviously configured attributes.
+ */
+static int op_perf_start(void)
+{
+       int cpu, event, ret = 0;
+
+       for_each_online_cpu(cpu) {
+               for (event = 0; event < perf_num_counters; ++event) {
+                       ret = op_create_counter(cpu, event);
+                       if (ret)
+                               goto out;
+               }
+       }
+
+out:
+       return ret;
+}
+
+/*
+ * Called by op_arm_stop at the end of a profiling run.
+ */
+static void op_perf_stop(void)
+{
+       int cpu, event;
+
+       for_each_online_cpu(cpu)
+               for (event = 0; event < perf_num_counters; ++event)
+                       op_destroy_counter(cpu, event);
+}
+
+
+static char *op_name_from_perf_id(enum arm_perf_pmu_ids id)
+{
+       switch (id) {
+       case ARM_PERF_PMU_ID_XSCALE1:
+               return "arm/xscale1";
+       case ARM_PERF_PMU_ID_XSCALE2:
+               return "arm/xscale2";
+       case ARM_PERF_PMU_ID_V6:
+               return "arm/armv6";
+       case ARM_PERF_PMU_ID_V6MP:
+               return "arm/mpcore";
+       case ARM_PERF_PMU_ID_CA8:
+               return "arm/armv7";
+       case ARM_PERF_PMU_ID_CA9:
+               return "arm/armv7-ca9";
+       default:
+               return NULL;
+       }
+}
 
 static int op_arm_create_files(struct super_block *sb, struct dentry *root)
 {
        unsigned int i;
 
-       for (i = 0; i < op_arm_model->num_counters; i++) {
+       for (i = 0; i < perf_num_counters; i++) {
                struct dentry *dir;
                char buf[4];
 
@@ -46,12 +198,10 @@ static int op_arm_create_files(struct super_block *sb, struct dentry *root)
 
 static int op_arm_setup(void)
 {
-       int ret;
-
        spin_lock(&oprofilefs_lock);
-       ret = op_arm_model->setup_ctrs();
+       op_perf_setup();
        spin_unlock(&oprofilefs_lock);
-       return ret;
+       return 0;
 }
 
 static int op_arm_start(void)
@@ -60,8 +210,9 @@ static int op_arm_start(void)
 
        mutex_lock(&op_arm_mutex);
        if (!op_arm_enabled) {
-               ret = op_arm_model->start();
-               op_arm_enabled = !ret;
+               ret = 0;
+               op_perf_start();
+               op_arm_enabled = 1;
        }
        mutex_unlock(&op_arm_mutex);
        return ret;
@@ -71,113 +222,205 @@ static void op_arm_stop(void)
 {
        mutex_lock(&op_arm_mutex);
        if (op_arm_enabled)
-               op_arm_model->stop();
+               op_perf_stop();
        op_arm_enabled = 0;
        mutex_unlock(&op_arm_mutex);
 }
 
 #ifdef CONFIG_PM
-static int op_arm_suspend(struct sys_device *dev, pm_message_t state)
+static int op_arm_suspend(struct platform_device *dev, pm_message_t state)
 {
        mutex_lock(&op_arm_mutex);
        if (op_arm_enabled)
-               op_arm_model->stop();
+               op_perf_stop();
        mutex_unlock(&op_arm_mutex);
        return 0;
 }
 
-static int op_arm_resume(struct sys_device *dev)
+static int op_arm_resume(struct platform_device *dev)
 {
        mutex_lock(&op_arm_mutex);
-       if (op_arm_enabled && op_arm_model->start())
+       if (op_arm_enabled && op_perf_start())
                op_arm_enabled = 0;
        mutex_unlock(&op_arm_mutex);
        return 0;
 }
 
-static struct sysdev_class oprofile_sysclass = {
-       .name           = "oprofile",
+static struct platform_driver oprofile_driver = {
+       .driver         = {
+               .name           = "arm-oprofile",
+       },
        .resume         = op_arm_resume,
        .suspend        = op_arm_suspend,
 };
 
-static struct sys_device device_oprofile = {
-       .id             = 0,
-       .cls            = &oprofile_sysclass,
-};
+static struct platform_device *oprofile_pdev;
 
 static int __init init_driverfs(void)
 {
        int ret;
 
-       if (!(ret = sysdev_class_register(&oprofile_sysclass)))
-               ret = sysdev_register(&device_oprofile);
+       ret = platform_driver_register(&oprofile_driver);
+       if (ret)
+               goto out;
 
+       oprofile_pdev = platform_device_register_simple(
+                               oprofile_driver.driver.name, 0, NULL, 0);
+       if (IS_ERR(oprofile_pdev)) {
+               ret = PTR_ERR(oprofile_pdev);
+               platform_driver_unregister(&oprofile_driver);
+       }
+
+out:
        return ret;
 }
 
 static void  exit_driverfs(void)
 {
-       sysdev_unregister(&device_oprofile);
-       sysdev_class_unregister(&oprofile_sysclass);
+       platform_device_unregister(oprofile_pdev);
+       platform_driver_unregister(&oprofile_driver);
 }
 #else
-#define init_driverfs()        do { } while (0)
+static int __init init_driverfs(void) { return 0; }
 #define exit_driverfs() do { } while (0)
 #endif /* CONFIG_PM */
 
-int __init oprofile_arch_init(struct oprofile_operations *ops)
+static int report_trace(struct stackframe *frame, void *d)
 {
-       struct op_arm_model_spec *spec = NULL;
-       int ret = -ENODEV;
+       unsigned int *depth = d;
 
-       ops->backtrace = arm_backtrace;
+       if (*depth) {
+               oprofile_add_trace(frame->pc);
+               (*depth)--;
+       }
 
-#ifdef CONFIG_CPU_XSCALE
-       spec = &op_xscale_spec;
-#endif
+       return *depth == 0;
+}
 
-#ifdef CONFIG_OPROFILE_ARMV6
-       spec = &op_armv6_spec;
-#endif
+/*
+ * The registers we're interested in are at the end of the variable
+ * length saved register structure. The fp points at the end of this
+ * structure so the address of this struct is:
+ * (struct frame_tail *)(xxx->fp)-1
+ */
+struct frame_tail {
+       struct frame_tail *fp;
+       unsigned long sp;
+       unsigned long lr;
+} __attribute__((packed));
 
-#ifdef CONFIG_OPROFILE_MPCORE
-       spec = &op_mpcore_spec;
-#endif
+static struct frame_tail* user_backtrace(struct frame_tail *tail)
+{
+       struct frame_tail buftail[2];
 
-#ifdef CONFIG_OPROFILE_ARMV7
-       spec = &op_armv7_spec;
-#endif
+       /* Also check accessibility of one struct frame_tail beyond */
+       if (!access_ok(VERIFY_READ, tail, sizeof(buftail)))
+               return NULL;
+       if (__copy_from_user_inatomic(buftail, tail, sizeof(buftail)))
+               return NULL;
 
-       if (spec) {
-               ret = spec->init();
-               if (ret < 0)
-                       return ret;
+       oprofile_add_trace(buftail[0].lr);
 
-               counter_config = kcalloc(spec->num_counters, sizeof(struct op_counter_config),
-                                        GFP_KERNEL);
-               if (!counter_config)
-                       return -ENOMEM;
+       /* frame pointers should strictly progress back up the stack
+        * (towards higher addresses) */
+       if (tail >= buftail[0].fp)
+               return NULL;
 
-               op_arm_model = spec;
-               init_driverfs();
-               ops->create_files = op_arm_create_files;
-               ops->setup = op_arm_setup;
-               ops->shutdown = op_arm_stop;
-               ops->start = op_arm_start;
-               ops->stop = op_arm_stop;
-               ops->cpu_type = op_arm_model->name;
-               printk(KERN_INFO "oprofile: using %s\n", spec->name);
+       return buftail[0].fp-1;
+}
+
+static void arm_backtrace(struct pt_regs * const regs, unsigned int depth)
+{
+       struct frame_tail *tail = ((struct frame_tail *) regs->ARM_fp) - 1;
+
+       if (!user_mode(regs)) {
+               struct stackframe frame;
+               frame.fp = regs->ARM_fp;
+               frame.sp = regs->ARM_sp;
+               frame.lr = regs->ARM_lr;
+               frame.pc = regs->ARM_pc;
+               walk_stackframe(&frame, report_trace, &depth);
+               return;
        }
 
+       while (depth-- && tail && !((unsigned long) tail & 3))
+               tail = user_backtrace(tail);
+}
+
+int __init oprofile_arch_init(struct oprofile_operations *ops)
+{
+       int cpu, ret = 0;
+
+       perf_num_counters = armpmu_get_max_events();
+
+       counter_config = kcalloc(perf_num_counters,
+                       sizeof(struct op_counter_config), GFP_KERNEL);
+
+       if (!counter_config) {
+               pr_info("oprofile: failed to allocate %d "
+                               "counters\n", perf_num_counters);
+               return -ENOMEM;
+       }
+
+       ret = init_driverfs();
+       if (ret) {
+               kfree(counter_config);
+               return ret;
+       }
+
+       for_each_possible_cpu(cpu) {
+               perf_events[cpu] = kcalloc(perf_num_counters,
+                               sizeof(struct perf_event *), GFP_KERNEL);
+               if (!perf_events[cpu]) {
+                       pr_info("oprofile: failed to allocate %d perf events "
+                                       "for cpu %d\n", perf_num_counters, cpu);
+                       while (--cpu >= 0)
+                               kfree(perf_events[cpu]);
+                       return -ENOMEM;
+               }
+       }
+
+       ops->backtrace          = arm_backtrace;
+       ops->create_files       = op_arm_create_files;
+       ops->setup              = op_arm_setup;
+       ops->start              = op_arm_start;
+       ops->stop               = op_arm_stop;
+       ops->shutdown           = op_arm_stop;
+       ops->cpu_type           = op_name_from_perf_id(armpmu_get_pmu_id());
+
+       if (!ops->cpu_type)
+               ret = -ENODEV;
+       else
+               pr_info("oprofile: using %s\n", ops->cpu_type);
+
        return ret;
 }
 
 void oprofile_arch_exit(void)
 {
-       if (op_arm_model) {
+       int cpu, id;
+       struct perf_event *event;
+
+       if (*perf_events) {
                exit_driverfs();
-               op_arm_model = NULL;
+               for_each_possible_cpu(cpu) {
+                       for (id = 0; id < perf_num_counters; ++id) {
+                               event = perf_events[cpu][id];
+                               if (event != NULL)
+                                       perf_event_release_kernel(event);
+                       }
+                       kfree(perf_events[cpu]);
+               }
        }
-       kfree(counter_config);
+
+       if (counter_config)
+               kfree(counter_config);
+}
+#else
+int __init oprofile_arch_init(struct oprofile_operations *ops)
+{
+       pr_info("oprofile: hardware counters not available\n");
+       return -ENODEV;
 }
+void oprofile_arch_exit(void) {}
+#endif /* CONFIG_HW_PERF_EVENTS */
diff --git a/arch/arm/oprofile/op_arm_model.h b/arch/arm/oprofile/op_arm_model.h
deleted file mode 100644 (file)
index 8c4e4f6..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-/**
- * @file op_arm_model.h
- * interface to ARM machine specific operations
- *
- * @remark Copyright 2004 Oprofile Authors
- * @remark Read the file COPYING
- *
- * @author Zwane Mwaikambo
- */
-
-#ifndef OP_ARM_MODEL_H
-#define OP_ARM_MODEL_H
-
-struct op_arm_model_spec {
-       int (*init)(void);
-       unsigned int num_counters;
-       int (*setup_ctrs)(void);
-       int (*start)(void);
-       void (*stop)(void);
-       char *name;
-};
-
-#ifdef CONFIG_CPU_XSCALE
-extern struct op_arm_model_spec op_xscale_spec;
-#endif
-
-extern struct op_arm_model_spec op_armv6_spec;
-extern struct op_arm_model_spec op_mpcore_spec;
-extern struct op_arm_model_spec op_armv7_spec;
-
-extern void arm_backtrace(struct pt_regs * const regs, unsigned int depth);
-
-extern int __init op_arm_init(struct oprofile_operations *ops, struct op_arm_model_spec *spec);
-extern void op_arm_exit(void);
-#endif /* OP_ARM_MODEL_H */
diff --git a/arch/arm/oprofile/op_counter.h b/arch/arm/oprofile/op_counter.h
deleted file mode 100644 (file)
index ca942a6..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-/**
- * @file op_counter.h
- *
- * @remark Copyright 2004 Oprofile Authors
- * @remark Read the file COPYING
- *
- * @author Zwane Mwaikambo
- */
-
-#ifndef OP_COUNTER_H
-#define OP_COUNTER_H
-
-/* Per performance monitor configuration as set via
- * oprofilefs.
- */
-struct op_counter_config {
-       unsigned long count;
-       unsigned long enabled;
-       unsigned long event;
-       unsigned long unit_mask;
-       unsigned long kernel;
-       unsigned long user;
-};
-
-extern struct op_counter_config *counter_config;
-
-#endif /* OP_COUNTER_H */
diff --git a/arch/arm/oprofile/op_model_arm11_core.c b/arch/arm/oprofile/op_model_arm11_core.c
deleted file mode 100644 (file)
index ef3e265..0000000
+++ /dev/null
@@ -1,162 +0,0 @@
-/**
- * @file op_model_arm11_core.c
- * ARM11 Event Monitor Driver
- * @remark Copyright 2004 ARM SMP Development Team
- */
-#include <linux/types.h>
-#include <linux/errno.h>
-#include <linux/oprofile.h>
-#include <linux/interrupt.h>
-#include <linux/irq.h>
-#include <linux/smp.h>
-
-#include "op_counter.h"
-#include "op_arm_model.h"
-#include "op_model_arm11_core.h"
-
-/*
- * ARM11 PMU support
- */
-static inline void arm11_write_pmnc(u32 val)
-{
-       /* upper 4bits and 7, 11 are write-as-0 */
-       val &= 0x0ffff77f;
-       asm volatile("mcr p15, 0, %0, c15, c12, 0" : : "r" (val));
-}
-
-static inline u32 arm11_read_pmnc(void)
-{
-       u32 val;
-       asm volatile("mrc p15, 0, %0, c15, c12, 0" : "=r" (val));
-       return val;
-}
-
-static void arm11_reset_counter(unsigned int cnt)
-{
-       u32 val = -(u32)counter_config[CPU_COUNTER(smp_processor_id(), cnt)].count;
-       switch (cnt) {
-       case CCNT:
-               asm volatile("mcr p15, 0, %0, c15, c12, 1" : : "r" (val));
-               break;
-
-       case PMN0:
-               asm volatile("mcr p15, 0, %0, c15, c12, 2" : : "r" (val));
-               break;
-
-       case PMN1:
-               asm volatile("mcr p15, 0, %0, c15, c12, 3" : : "r" (val));
-               break;
-       }
-}
-
-int arm11_setup_pmu(void)
-{
-       unsigned int cnt;
-       u32 pmnc;
-
-       if (arm11_read_pmnc() & PMCR_E) {
-               printk(KERN_ERR "oprofile: CPU%u PMU still enabled when setup new event counter.\n", smp_processor_id());
-               return -EBUSY;
-       }
-
-       /* initialize PMNC, reset overflow, D bit, C bit and P bit. */
-       arm11_write_pmnc(PMCR_OFL_PMN0 | PMCR_OFL_PMN1 | PMCR_OFL_CCNT |
-                        PMCR_C | PMCR_P);
-
-       for (pmnc = 0, cnt = PMN0; cnt <= CCNT; cnt++) {
-               unsigned long event;
-
-               if (!counter_config[CPU_COUNTER(smp_processor_id(), cnt)].enabled)
-                       continue;
-
-               event = counter_config[CPU_COUNTER(smp_processor_id(), cnt)].event & 255;
-
-               /*
-                * Set event (if destined for PMNx counters)
-                */
-               if (cnt == PMN0) {
-                       pmnc |= event << 20;
-               } else if (cnt == PMN1) {
-                       pmnc |= event << 12;
-               }
-
-               /*
-                * We don't need to set the event if it's a cycle count
-                * Enable interrupt for this counter
-                */
-               pmnc |= PMCR_IEN_PMN0 << cnt;
-               arm11_reset_counter(cnt);
-       }
-       arm11_write_pmnc(pmnc);
-
-       return 0;
-}
-
-int arm11_start_pmu(void)
-{
-       arm11_write_pmnc(arm11_read_pmnc() | PMCR_E);
-       return 0;
-}
-
-int arm11_stop_pmu(void)
-{
-       unsigned int cnt;
-
-       arm11_write_pmnc(arm11_read_pmnc() & ~PMCR_E);
-
-       for (cnt = PMN0; cnt <= CCNT; cnt++)
-               arm11_reset_counter(cnt);
-
-       return 0;
-}
-
-/*
- * CPU counters' IRQ handler (one IRQ per CPU)
- */
-static irqreturn_t arm11_pmu_interrupt(int irq, void *arg)
-{
-       struct pt_regs *regs = get_irq_regs();
-       unsigned int cnt;
-       u32 pmnc;
-
-       pmnc = arm11_read_pmnc();
-
-       for (cnt = PMN0; cnt <= CCNT; cnt++) {
-               if ((pmnc & (PMCR_OFL_PMN0 << cnt)) && (pmnc & (PMCR_IEN_PMN0 << cnt))) {
-                       arm11_reset_counter(cnt);
-                       oprofile_add_sample(regs, CPU_COUNTER(smp_processor_id(), cnt));
-               }
-       }
-       /* Clear counter flag(s) */
-       arm11_write_pmnc(pmnc);
-       return IRQ_HANDLED;
-}
-
-int arm11_request_interrupts(const int *irqs, int nr)
-{
-       unsigned int i;
-       int ret = 0;
-
-       for(i = 0; i < nr; i++) {
-               ret = request_irq(irqs[i], arm11_pmu_interrupt, IRQF_DISABLED, "CP15 PMU", NULL);
-               if (ret != 0) {
-                       printk(KERN_ERR "oprofile: unable to request IRQ%u for MPCORE-EM\n",
-                              irqs[i]);
-                       break;
-               }
-       }
-
-       if (i != nr)
-               while (i-- != 0)
-                       free_irq(irqs[i], NULL);
-
-       return ret;
-}
-
-void arm11_release_interrupts(const int *irqs, int nr)
-{
-       unsigned int i;
-
-       for (i = 0; i < nr; i++)
-               free_irq(irqs[i], NULL);
-}
diff --git a/arch/arm/oprofile/op_model_arm11_core.h b/arch/arm/oprofile/op_model_arm11_core.h
deleted file mode 100644 (file)
index 1902b99..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-/**
- * @file op_model_arm11_core.h
- * ARM11 Event Monitor Driver
- * @remark Copyright 2004 ARM SMP Development Team
- * @remark Copyright 2000-2004 Deepak Saxena <dsaxena@mvista.com>
- * @remark Copyright 2000-2004 MontaVista Software Inc
- * @remark Copyright 2004 Dave Jiang <dave.jiang@intel.com>
- * @remark Copyright 2004 Intel Corporation
- * @remark Copyright 2004 Zwane Mwaikambo <zwane@arm.linux.org.uk>
- * @remark Copyright 2004 Oprofile Authors
- *
- * @remark Read the file COPYING
- *
- * @author Zwane Mwaikambo
- */
-#ifndef OP_MODEL_ARM11_CORE_H
-#define OP_MODEL_ARM11_CORE_H
-
-/*
- * Per-CPU PMCR
- */
-#define PMCR_E         (1 << 0)        /* Enable */
-#define PMCR_P         (1 << 1)        /* Count reset */
-#define PMCR_C         (1 << 2)        /* Cycle counter reset */
-#define PMCR_D         (1 << 3)        /* Cycle counter counts every 64th cpu cycle */
-#define PMCR_IEN_PMN0  (1 << 4)        /* Interrupt enable count reg 0 */
-#define PMCR_IEN_PMN1  (1 << 5)        /* Interrupt enable count reg 1 */
-#define PMCR_IEN_CCNT  (1 << 6)        /* Interrupt enable cycle counter */
-#define PMCR_OFL_PMN0  (1 << 8)        /* Count reg 0 overflow */
-#define PMCR_OFL_PMN1  (1 << 9)        /* Count reg 1 overflow */
-#define PMCR_OFL_CCNT  (1 << 10)       /* Cycle counter overflow */
-
-#define PMN0 0
-#define PMN1 1
-#define CCNT 2
-
-#define CPU_COUNTER(cpu, counter)      ((cpu) * 3 + (counter))
-
-int arm11_setup_pmu(void);
-int arm11_start_pmu(void);
-int arm11_stop_pmu(void);
-int arm11_request_interrupts(const int *, int);
-void arm11_release_interrupts(const int *, int);
-
-#endif
diff --git a/arch/arm/oprofile/op_model_mpcore.c b/arch/arm/oprofile/op_model_mpcore.c
deleted file mode 100644 (file)
index f73ce87..0000000
+++ /dev/null
@@ -1,306 +0,0 @@
-/**
- * @file op_model_mpcore.c
- * MPCORE Event Monitor Driver
- * @remark Copyright 2004 ARM SMP Development Team
- * @remark Copyright 2000-2004 Deepak Saxena <dsaxena@mvista.com>
- * @remark Copyright 2000-2004 MontaVista Software Inc
- * @remark Copyright 2004 Dave Jiang <dave.jiang@intel.com>
- * @remark Copyright 2004 Intel Corporation
- * @remark Copyright 2004 Zwane Mwaikambo <zwane@arm.linux.org.uk>
- * @remark Copyright 2004 Oprofile Authors
- *
- * @remark Read the file COPYING
- *
- * @author Zwane Mwaikambo
- *
- *  Counters:
- *    0: PMN0 on CPU0, per-cpu configurable event counter
- *    1: PMN1 on CPU0, per-cpu configurable event counter
- *    2: CCNT on CPU0
- *    3: PMN0 on CPU1
- *    4: PMN1 on CPU1
- *    5: CCNT on CPU1
- *    6: PMN0 on CPU1
- *    7: PMN1 on CPU1
- *    8: CCNT on CPU1
- *    9: PMN0 on CPU1
- *   10: PMN1 on CPU1
- *   11: CCNT on CPU1
- *   12-19: configurable SCU event counters
- */
-
-/* #define DEBUG */
-#include <linux/types.h>
-#include <linux/errno.h>
-#include <linux/err.h>
-#include <linux/sched.h>
-#include <linux/oprofile.h>
-#include <linux/interrupt.h>
-#include <linux/smp.h>
-#include <linux/io.h>
-
-#include <asm/irq.h>
-#include <asm/mach/irq.h>
-#include <mach/hardware.h>
-#include <mach/board-eb.h>
-#include <asm/system.h>
-#include <asm/pmu.h>
-
-#include "op_counter.h"
-#include "op_arm_model.h"
-#include "op_model_arm11_core.h"
-#include "op_model_mpcore.h"
-
-/*
- * MPCore SCU event monitor support
- */
-#define SCU_EVENTMONITORS_VA_BASE __io_address(REALVIEW_EB11MP_SCU_BASE + 0x10)
-
-/*
- * Bitmask of used SCU counters
- */
-static unsigned int scu_em_used;
-static const struct pmu_irqs *pmu_irqs;
-
-/*
- * 2 helper fns take a counter number from 0-7 (not the userspace-visible counter number)
- */
-static inline void scu_reset_counter(struct eventmonitor __iomem *emc, unsigned int n)
-{
-       writel(-(u32)counter_config[SCU_COUNTER(n)].count, &emc->MC[n]);
-}
-
-static inline void scu_set_event(struct eventmonitor __iomem *emc, unsigned int n, u32 event)
-{
-       event &= 0xff;
-       writeb(event, &emc->MCEB[n]);
-}
-
-/*
- * SCU counters' IRQ handler (one IRQ per counter => 2 IRQs per CPU)
- */
-static irqreturn_t scu_em_interrupt(int irq, void *arg)
-{
-       struct eventmonitor __iomem *emc = SCU_EVENTMONITORS_VA_BASE;
-       unsigned int cnt;
-
-       cnt = irq - IRQ_EB11MP_PMU_SCU0;
-       oprofile_add_sample(get_irq_regs(), SCU_COUNTER(cnt));
-       scu_reset_counter(emc, cnt);
-
-       /* Clear overflow flag for this counter */
-       writel(1 << (cnt + 16), &emc->PMCR);
-
-       return IRQ_HANDLED;
-}
-
-/* Configure just the SCU counters that the user has requested */
-static void scu_setup(void)
-{
-       struct eventmonitor __iomem *emc = SCU_EVENTMONITORS_VA_BASE;
-       unsigned int i;
-
-       scu_em_used = 0;
-
-       for (i = 0; i < NUM_SCU_COUNTERS; i++) {
-               if (counter_config[SCU_COUNTER(i)].enabled &&
-                   counter_config[SCU_COUNTER(i)].event) {
-                       scu_set_event(emc, i, 0); /* disable counter for now */
-                       scu_em_used |= 1 << i;
-               }
-       }
-}
-
-static int scu_start(void)
-{
-       struct eventmonitor __iomem *emc = SCU_EVENTMONITORS_VA_BASE;
-       unsigned int temp, i;
-       unsigned long event;
-       int ret = 0;
-
-       /*
-        * request the SCU counter interrupts that we need
-        */
-       for (i = 0; i < NUM_SCU_COUNTERS; i++) {
-               if (scu_em_used & (1 << i)) {
-                       ret = request_irq(IRQ_EB11MP_PMU_SCU0 + i, scu_em_interrupt, IRQF_DISABLED, "SCU PMU", NULL);
-                       if (ret) {
-                               printk(KERN_ERR "oprofile: unable to request IRQ%u for SCU Event Monitor\n",
-                                      IRQ_EB11MP_PMU_SCU0 + i);
-                               goto err_free_scu;
-                       }
-               }
-       }
-
-       /*
-        * clear overflow and enable interrupt for all used counters
-        */
-       temp = readl(&emc->PMCR);
-       for (i = 0; i < NUM_SCU_COUNTERS; i++) {
-               if (scu_em_used & (1 << i)) {
-                       scu_reset_counter(emc, i);
-                       event = counter_config[SCU_COUNTER(i)].event;
-                       scu_set_event(emc, i, event);
-
-                       /* clear overflow/interrupt */
-                       temp |= 1 << (i + 16);
-                       /* enable interrupt*/
-                       temp |= 1 << (i + 8);
-               }
-       }
-
-       /* Enable all 8 counters */
-       temp |= PMCR_E;
-       writel(temp, &emc->PMCR);
-
-       return 0;
-
- err_free_scu:
-       while (i--)
-               free_irq(IRQ_EB11MP_PMU_SCU0 + i, NULL);
-       return ret;
-}
-
-static void scu_stop(void)
-{
-       struct eventmonitor __iomem *emc = SCU_EVENTMONITORS_VA_BASE;
-       unsigned int temp, i;
-
-       /* Disable counter interrupts */
-       /* Don't disable all 8 counters (with the E bit) as they may be in use */
-       temp = readl(&emc->PMCR);
-       for (i = 0; i < NUM_SCU_COUNTERS; i++) {
-               if (scu_em_used & (1 << i))
-                       temp &= ~(1 << (i + 8));
-       }
-       writel(temp, &emc->PMCR);
-
-       /* Free counter interrupts and reset counters */
-       for (i = 0; i < NUM_SCU_COUNTERS; i++) {
-               if (scu_em_used & (1 << i)) {
-                       scu_reset_counter(emc, i);
-                       free_irq(IRQ_EB11MP_PMU_SCU0 + i, NULL);
-               }
-       }
-}
-
-struct em_function_data {
-       int (*fn)(void);
-       int ret;
-};
-
-static void em_func(void *data)
-{
-       struct em_function_data *d = data;
-       int ret = d->fn();
-       if (ret)
-               d->ret = ret;
-}
-
-static int em_call_function(int (*fn)(void))
-{
-       struct em_function_data data;
-
-       data.fn = fn;
-       data.ret = 0;
-
-       preempt_disable();
-       smp_call_function(em_func, &data, 1);
-       em_func(&data);
-       preempt_enable();
-
-       return data.ret;
-}
-
-/*
- * Glue to stick the individual ARM11 PMUs and the SCU
- * into the oprofile framework.
- */
-static int em_setup_ctrs(void)
-{
-       int ret;
-
-       /* Configure CPU counters by cross-calling to the other CPUs */
-       ret = em_call_function(arm11_setup_pmu);
-       if (ret == 0)
-               scu_setup();
-
-       return 0;
-}
-
-static int em_start(void)
-{
-       int ret;
-
-       pmu_irqs = reserve_pmu();
-       if (IS_ERR(pmu_irqs)) {
-               ret = PTR_ERR(pmu_irqs);
-               goto out;
-       }
-
-       ret = arm11_request_interrupts(pmu_irqs->irqs, pmu_irqs->num_irqs);
-       if (ret == 0) {
-               em_call_function(arm11_start_pmu);
-
-               ret = scu_start();
-               if (ret) {
-                       arm11_release_interrupts(pmu_irqs->irqs,
-                                                pmu_irqs->num_irqs);
-               } else {
-                       release_pmu(pmu_irqs);
-                       pmu_irqs = NULL;
-               }
-       }
-
-out:
-       return ret;
-}
-
-static void em_stop(void)
-{
-       em_call_function(arm11_stop_pmu);
-       arm11_release_interrupts(pmu_irqs->irqs, pmu_irqs->num_irqs);
-       scu_stop();
-       release_pmu(pmu_irqs);
-}
-
-/*
- * Why isn't there a function to route an IRQ to a specific CPU in
- * genirq?
- */
-static void em_route_irq(int irq, unsigned int cpu)
-{
-       struct irq_desc *desc = irq_desc + irq;
-       const struct cpumask *mask = cpumask_of(cpu);
-
-       spin_lock_irq(&desc->lock);
-       cpumask_copy(desc->affinity, mask);
-       desc->chip->set_affinity(irq, mask);
-       spin_unlock_irq(&desc->lock);
-}
-
-static int em_setup(void)
-{
-       /*
-        * Send SCU PMU interrupts to the "owner" CPU.
-        */
-       em_route_irq(IRQ_EB11MP_PMU_SCU0, 0);
-       em_route_irq(IRQ_EB11MP_PMU_SCU1, 0);
-       em_route_irq(IRQ_EB11MP_PMU_SCU2, 1);
-       em_route_irq(IRQ_EB11MP_PMU_SCU3, 1);
-       em_route_irq(IRQ_EB11MP_PMU_SCU4, 2);
-       em_route_irq(IRQ_EB11MP_PMU_SCU5, 2);
-       em_route_irq(IRQ_EB11MP_PMU_SCU6, 3);
-       em_route_irq(IRQ_EB11MP_PMU_SCU7, 3);
-
-       return init_pmu();
-}
-
-struct op_arm_model_spec op_mpcore_spec = {
-       .init           = em_setup,
-       .num_counters   = MPCORE_NUM_COUNTERS,
-       .setup_ctrs     = em_setup_ctrs,
-       .start          = em_start,
-       .stop           = em_stop,
-       .name           = "arm/mpcore",
-};
diff --git a/arch/arm/oprofile/op_model_mpcore.h b/arch/arm/oprofile/op_model_mpcore.h
deleted file mode 100644 (file)
index 73d8110..0000000
+++ /dev/null
@@ -1,61 +0,0 @@
-/**
- * @file op_model_mpcore.c
- * MPCORE Event Monitor Driver
- * @remark Copyright 2004 ARM SMP Development Team
- * @remark Copyright 2000-2004 Deepak Saxena <dsaxena@mvista.com>
- * @remark Copyright 2000-2004 MontaVista Software Inc
- * @remark Copyright 2004 Dave Jiang <dave.jiang@intel.com>
- * @remark Copyright 2004 Intel Corporation
- * @remark Copyright 2004 Zwane Mwaikambo <zwane@arm.linux.org.uk>
- * @remark Copyright 2004 Oprofile Authors
- *
- * @remark Read the file COPYING
- *
- * @author Zwane Mwaikambo
- */
-#ifndef OP_MODEL_MPCORE_H
-#define OP_MODEL_MPCORE_H
-
-struct eventmonitor {
-       unsigned long PMCR;
-       unsigned char MCEB[8];
-       unsigned long MC[8];
-};
-
-/*
- * List of userspace counter numbers: note that the structure is important.
- * The code relies on CPUn's counters being CPU0's counters + 3n
- * and on CPU0's counters starting at 0
- */
-
-#define COUNTER_CPU0_PMN0 0
-#define COUNTER_CPU0_PMN1 1
-#define COUNTER_CPU0_CCNT 2
-
-#define COUNTER_CPU1_PMN0 3
-#define COUNTER_CPU1_PMN1 4
-#define COUNTER_CPU1_CCNT 5
-
-#define COUNTER_CPU2_PMN0 6
-#define COUNTER_CPU2_PMN1 7
-#define COUNTER_CPU2_CCNT 8
-
-#define COUNTER_CPU3_PMN0 9
-#define COUNTER_CPU3_PMN1 10
-#define COUNTER_CPU3_CCNT 11
-
-#define COUNTER_SCU_MN0 12
-#define COUNTER_SCU_MN1 13
-#define COUNTER_SCU_MN2 14
-#define COUNTER_SCU_MN3 15
-#define COUNTER_SCU_MN4 16
-#define COUNTER_SCU_MN5 17
-#define COUNTER_SCU_MN6 18
-#define COUNTER_SCU_MN7 19
-#define NUM_SCU_COUNTERS 8
-
-#define SCU_COUNTER(number)    ((number) + COUNTER_SCU_MN0)
-
-#define MPCORE_NUM_COUNTERS    SCU_COUNTER(NUM_SCU_COUNTERS)
-
-#endif
diff --git a/arch/arm/oprofile/op_model_v6.c b/arch/arm/oprofile/op_model_v6.c
deleted file mode 100644 (file)
index a22357a..0000000
+++ /dev/null
@@ -1,78 +0,0 @@
-/**
- * @file op_model_v6.c
- * ARM11 Performance Monitor Driver
- *
- * Based on op_model_xscale.c
- *
- * @remark Copyright 2000-2004 Deepak Saxena <dsaxena@mvista.com>
- * @remark Copyright 2000-2004 MontaVista Software Inc
- * @remark Copyright 2004 Dave Jiang <dave.jiang@intel.com>
- * @remark Copyright 2004 Intel Corporation
- * @remark Copyright 2004 Zwane Mwaikambo <zwane@arm.linux.org.uk>
- * @remark Copyright 2004 OProfile Authors
- *
- * @remark Read the file COPYING
- *
- * @author Tony Lindgren <tony@atomide.com>
- */
-
-/* #define DEBUG */
-#include <linux/types.h>
-#include <linux/errno.h>
-#include <linux/err.h>
-#include <linux/sched.h>
-#include <linux/oprofile.h>
-#include <linux/interrupt.h>
-#include <asm/irq.h>
-#include <asm/system.h>
-#include <asm/pmu.h>
-
-#include "op_counter.h"
-#include "op_arm_model.h"
-#include "op_model_arm11_core.h"
-
-static const struct pmu_irqs *pmu_irqs;
-
-static void armv6_pmu_stop(void)
-{
-       arm11_stop_pmu();
-       arm11_release_interrupts(pmu_irqs->irqs, pmu_irqs->num_irqs);
-       release_pmu(pmu_irqs);
-       pmu_irqs = NULL;
-}
-
-static int armv6_pmu_start(void)
-{
-       int ret;
-
-       pmu_irqs = reserve_pmu();
-       if (IS_ERR(pmu_irqs)) {
-               ret = PTR_ERR(pmu_irqs);
-               goto out;
-       }
-
-       ret = arm11_request_interrupts(pmu_irqs->irqs, pmu_irqs->num_irqs);
-       if (ret >= 0) {
-               ret = arm11_start_pmu();
-       } else {
-               release_pmu(pmu_irqs);
-               pmu_irqs = NULL;
-       }
-
-out:
-       return ret;
-}
-
-static int armv6_detect_pmu(void)
-{
-       return 0;
-}
-
-struct op_arm_model_spec op_armv6_spec = {
-       .init           = armv6_detect_pmu,
-       .num_counters   = 3,
-       .setup_ctrs     = arm11_setup_pmu,
-       .start          = armv6_pmu_start,
-       .stop           = armv6_pmu_stop,
-       .name           = "arm/armv6",
-};
diff --git a/arch/arm/oprofile/op_model_v7.c b/arch/arm/oprofile/op_model_v7.c
deleted file mode 100644 (file)
index 8642d08..0000000
+++ /dev/null
@@ -1,415 +0,0 @@
-/**
- * op_model_v7.c
- * ARM V7 (Cortex A8) Event Monitor Driver
- *
- * Copyright 2008 Jean Pihet <jpihet@mvista.com>
- * Copyright 2004 ARM SMP Development Team
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- */
-#include <linux/types.h>
-#include <linux/errno.h>
-#include <linux/err.h>
-#include <linux/oprofile.h>
-#include <linux/interrupt.h>
-#include <linux/irq.h>
-#include <linux/smp.h>
-
-#include <asm/pmu.h>
-
-#include "op_counter.h"
-#include "op_arm_model.h"
-#include "op_model_v7.h"
-
-/* #define DEBUG */
-
-
-/*
- * ARM V7 PMNC support
- */
-
-static u32 cnt_en[CNTMAX];
-
-static inline void armv7_pmnc_write(u32 val)
-{
-       val &= PMNC_MASK;
-       asm volatile("mcr p15, 0, %0, c9, c12, 0" : : "r" (val));
-}
-
-static inline u32 armv7_pmnc_read(void)
-{
-       u32 val;
-
-       asm volatile("mrc p15, 0, %0, c9, c12, 0" : "=r" (val));
-       return val;
-}
-
-static inline u32 armv7_pmnc_enable_counter(unsigned int cnt)
-{
-       u32 val;
-
-       if (cnt >= CNTMAX) {
-               printk(KERN_ERR "oprofile: CPU%u enabling wrong PMNC counter"
-                       " %d\n", smp_processor_id(), cnt);
-               return -1;
-       }
-
-       if (cnt == CCNT)
-               val = CNTENS_C;
-       else
-               val = (1 << (cnt - CNT0));
-
-       val &= CNTENS_MASK;
-       asm volatile("mcr p15, 0, %0, c9, c12, 1" : : "r" (val));
-
-       return cnt;
-}
-
-static inline u32 armv7_pmnc_disable_counter(unsigned int cnt)
-{
-       u32 val;
-
-       if (cnt >= CNTMAX) {
-               printk(KERN_ERR "oprofile: CPU%u disabling wrong PMNC counter"
-                       " %d\n", smp_processor_id(), cnt);
-               return -1;
-       }
-
-       if (cnt == CCNT)
-               val = CNTENC_C;
-       else
-               val = (1 << (cnt - CNT0));
-
-       val &= CNTENC_MASK;
-       asm volatile("mcr p15, 0, %0, c9, c12, 2" : : "r" (val));
-
-       return cnt;
-}
-
-static inline u32 armv7_pmnc_enable_intens(unsigned int cnt)
-{
-       u32 val;
-
-       if (cnt >= CNTMAX) {
-               printk(KERN_ERR "oprofile: CPU%u enabling wrong PMNC counter"
-                       " interrupt enable %d\n", smp_processor_id(), cnt);
-               return -1;
-       }
-
-       if (cnt == CCNT)
-               val = INTENS_C;
-       else
-               val = (1 << (cnt - CNT0));
-
-       val &= INTENS_MASK;
-       asm volatile("mcr p15, 0, %0, c9, c14, 1" : : "r" (val));
-
-       return cnt;
-}
-
-static inline u32 armv7_pmnc_getreset_flags(void)
-{
-       u32 val;
-
-       /* Read */
-       asm volatile("mrc p15, 0, %0, c9, c12, 3" : "=r" (val));
-
-       /* Write to clear flags */
-       val &= FLAG_MASK;
-       asm volatile("mcr p15, 0, %0, c9, c12, 3" : : "r" (val));
-
-       return val;
-}
-
-static inline int armv7_pmnc_select_counter(unsigned int cnt)
-{
-       u32 val;
-
-       if ((cnt == CCNT) || (cnt >= CNTMAX)) {
-               printk(KERN_ERR "oprofile: CPU%u selecting wrong PMNC counteri"
-                       " %d\n", smp_processor_id(), cnt);
-               return -1;
-       }
-
-       val = (cnt - CNT0) & SELECT_MASK;
-       asm volatile("mcr p15, 0, %0, c9, c12, 5" : : "r" (val));
-
-       return cnt;
-}
-
-static inline void armv7_pmnc_write_evtsel(unsigned int cnt, u32 val)
-{
-       if (armv7_pmnc_select_counter(cnt) == cnt) {
-               val &= EVTSEL_MASK;
-               asm volatile("mcr p15, 0, %0, c9, c13, 1" : : "r" (val));
-       }
-}
-
-static void armv7_pmnc_reset_counter(unsigned int cnt)
-{
-       u32 cpu_cnt = CPU_COUNTER(smp_processor_id(), cnt);
-       u32 val = -(u32)counter_config[cpu_cnt].count;
-
-       switch (cnt) {
-       case CCNT:
-               armv7_pmnc_disable_counter(cnt);
-
-               asm volatile("mcr p15, 0, %0, c9, c13, 0" : : "r" (val));
-
-               if (cnt_en[cnt] != 0)
-                   armv7_pmnc_enable_counter(cnt);
-
-               break;
-
-       case CNT0:
-       case CNT1:
-       case CNT2:
-       case CNT3:
-               armv7_pmnc_disable_counter(cnt);
-
-               if (armv7_pmnc_select_counter(cnt) == cnt)
-                   asm volatile("mcr p15, 0, %0, c9, c13, 2" : : "r" (val));
-
-               if (cnt_en[cnt] != 0)
-                   armv7_pmnc_enable_counter(cnt);
-
-               break;
-
-       default:
-               printk(KERN_ERR "oprofile: CPU%u resetting wrong PMNC counter"
-                       " %d\n", smp_processor_id(), cnt);
-               break;
-       }
-}
-
-int armv7_setup_pmnc(void)
-{
-       unsigned int cnt;
-
-       if (armv7_pmnc_read() & PMNC_E) {
-               printk(KERN_ERR "oprofile: CPU%u PMNC still enabled when setup"
-                       " new event counter.\n", smp_processor_id());
-               return -EBUSY;
-       }
-
-       /* Initialize & Reset PMNC: C bit and P bit */
-       armv7_pmnc_write(PMNC_P | PMNC_C);
-
-
-       for (cnt = CCNT; cnt < CNTMAX; cnt++) {
-               unsigned long event;
-               u32 cpu_cnt = CPU_COUNTER(smp_processor_id(), cnt);
-
-               /*
-                * Disable counter
-                */
-               armv7_pmnc_disable_counter(cnt);
-               cnt_en[cnt] = 0;
-
-               if (!counter_config[cpu_cnt].enabled)
-                       continue;
-
-               event = counter_config[cpu_cnt].event & 255;
-
-               /*
-                * Set event (if destined for PMNx counters)
-                * We don't need to set the event if it's a cycle count
-                */
-               if (cnt != CCNT)
-                       armv7_pmnc_write_evtsel(cnt, event);
-
-               /*
-                * Enable interrupt for this counter
-                */
-               armv7_pmnc_enable_intens(cnt);
-
-               /*
-                * Reset counter
-                */
-               armv7_pmnc_reset_counter(cnt);
-
-               /*
-                * Enable counter
-                */
-               armv7_pmnc_enable_counter(cnt);
-               cnt_en[cnt] = 1;
-       }
-
-       return 0;
-}
-
-static inline void armv7_start_pmnc(void)
-{
-       armv7_pmnc_write(armv7_pmnc_read() | PMNC_E);
-}
-
-static inline void armv7_stop_pmnc(void)
-{
-       armv7_pmnc_write(armv7_pmnc_read() & ~PMNC_E);
-}
-
-/*
- * CPU counters' IRQ handler (one IRQ per CPU)
- */
-static irqreturn_t armv7_pmnc_interrupt(int irq, void *arg)
-{
-       struct pt_regs *regs = get_irq_regs();
-       unsigned int cnt;
-       u32 flags;
-
-
-       /*
-        * Stop IRQ generation
-        */
-       armv7_stop_pmnc();
-
-       /*
-        * Get and reset overflow status flags
-        */
-       flags = armv7_pmnc_getreset_flags();
-
-       /*
-        * Cycle counter
-        */
-       if (flags & FLAG_C) {
-               u32 cpu_cnt = CPU_COUNTER(smp_processor_id(), CCNT);
-               armv7_pmnc_reset_counter(CCNT);
-               oprofile_add_sample(regs, cpu_cnt);
-       }
-
-       /*
-        * PMNC counters 0:3
-        */
-       for (cnt = CNT0; cnt < CNTMAX; cnt++) {
-               if (flags & (1 << (cnt - CNT0))) {
-                       u32 cpu_cnt = CPU_COUNTER(smp_processor_id(), cnt);
-                       armv7_pmnc_reset_counter(cnt);
-                       oprofile_add_sample(regs, cpu_cnt);
-               }
-       }
-
-       /*
-        * Allow IRQ generation
-        */
-       armv7_start_pmnc();
-
-       return IRQ_HANDLED;
-}
-
-int armv7_request_interrupts(const int *irqs, int nr)
-{
-       unsigned int i;
-       int ret = 0;
-
-       for (i = 0; i < nr; i++) {
-               ret = request_irq(irqs[i], armv7_pmnc_interrupt,
-                               IRQF_DISABLED, "CP15 PMNC", NULL);
-               if (ret != 0) {
-                       printk(KERN_ERR "oprofile: unable to request IRQ%u"
-                               " for ARMv7\n",
-                              irqs[i]);
-                       break;
-               }
-       }
-
-       if (i != nr)
-               while (i-- != 0)
-                       free_irq(irqs[i], NULL);
-
-       return ret;
-}
-
-void armv7_release_interrupts(const int *irqs, int nr)
-{
-       unsigned int i;
-
-       for (i = 0; i < nr; i++)
-               free_irq(irqs[i], NULL);
-}
-
-#ifdef DEBUG
-static void armv7_pmnc_dump_regs(void)
-{
-       u32 val;
-       unsigned int cnt;
-
-       printk(KERN_INFO "PMNC registers dump:\n");
-
-       asm volatile("mrc p15, 0, %0, c9, c12, 0" : "=r" (val));
-       printk(KERN_INFO "PMNC  =0x%08x\n", val);
-
-       asm volatile("mrc p15, 0, %0, c9, c12, 1" : "=r" (val));
-       printk(KERN_INFO "CNTENS=0x%08x\n", val);
-
-       asm volatile("mrc p15, 0, %0, c9, c14, 1" : "=r" (val));
-       printk(KERN_INFO "INTENS=0x%08x\n", val);
-
-       asm volatile("mrc p15, 0, %0, c9, c12, 3" : "=r" (val));
-       printk(KERN_INFO "FLAGS =0x%08x\n", val);
-
-       asm volatile("mrc p15, 0, %0, c9, c12, 5" : "=r" (val));
-       printk(KERN_INFO "SELECT=0x%08x\n", val);
-
-       asm volatile("mrc p15, 0, %0, c9, c13, 0" : "=r" (val));
-       printk(KERN_INFO "CCNT  =0x%08x\n", val);
-
-       for (cnt = CNT0; cnt < CNTMAX; cnt++) {
-               armv7_pmnc_select_counter(cnt);
-               asm volatile("mrc p15, 0, %0, c9, c13, 2" : "=r" (val));
-               printk(KERN_INFO "CNT[%d] count =0x%08x\n", cnt-CNT0, val);
-               asm volatile("mrc p15, 0, %0, c9, c13, 1" : "=r" (val));
-               printk(KERN_INFO "CNT[%d] evtsel=0x%08x\n", cnt-CNT0, val);
-       }
-}
-#endif
-
-static const struct pmu_irqs *pmu_irqs;
-
-static void armv7_pmnc_stop(void)
-{
-#ifdef DEBUG
-       armv7_pmnc_dump_regs();
-#endif
-       armv7_stop_pmnc();
-       armv7_release_interrupts(pmu_irqs->irqs, pmu_irqs->num_irqs);
-       release_pmu(pmu_irqs);
-       pmu_irqs = NULL;
-}
-
-static int armv7_pmnc_start(void)
-{
-       int ret;
-
-       pmu_irqs = reserve_pmu();
-       if (IS_ERR(pmu_irqs))
-               return PTR_ERR(pmu_irqs);
-
-#ifdef DEBUG
-       armv7_pmnc_dump_regs();
-#endif
-       ret = armv7_request_interrupts(pmu_irqs->irqs, pmu_irqs->num_irqs);
-       if (ret >= 0) {
-               armv7_start_pmnc();
-       } else {
-               release_pmu(pmu_irqs);
-               pmu_irqs = NULL;
-       }
-
-       return ret;
-}
-
-static int armv7_detect_pmnc(void)
-{
-       return 0;
-}
-
-struct op_arm_model_spec op_armv7_spec = {
-       .init           = armv7_detect_pmnc,
-       .num_counters   = 5,
-       .setup_ctrs     = armv7_setup_pmnc,
-       .start          = armv7_pmnc_start,
-       .stop           = armv7_pmnc_stop,
-       .name           = "arm/armv7",
-};
diff --git a/arch/arm/oprofile/op_model_v7.h b/arch/arm/oprofile/op_model_v7.h
deleted file mode 100644 (file)
index 9ca334b..0000000
+++ /dev/null
@@ -1,103 +0,0 @@
-/**
- * op_model_v7.h
- * ARM v7 (Cortex A8) Event Monitor Driver
- *
- * Copyright 2008 Jean Pihet <jpihet@mvista.com>
- * Copyright 2004 ARM SMP Development Team
- * Copyright 2000-2004 Deepak Saxena <dsaxena@mvista.com>
- * Copyright 2000-2004 MontaVista Software Inc
- * Copyright 2004 Dave Jiang <dave.jiang@intel.com>
- * Copyright 2004 Intel Corporation
- * Copyright 2004 Zwane Mwaikambo <zwane@arm.linux.org.uk>
- * Copyright 2004 Oprofile Authors
- *
- * Read the file COPYING
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- */
-#ifndef OP_MODEL_V7_H
-#define OP_MODEL_V7_H
-
-/*
- * Per-CPU PMNC: config reg
- */
-#define PMNC_E         (1 << 0)        /* Enable all counters */
-#define PMNC_P         (1 << 1)        /* Reset all counters */
-#define PMNC_C         (1 << 2)        /* Cycle counter reset */
-#define PMNC_D         (1 << 3)        /* CCNT counts every 64th cpu cycle */
-#define PMNC_X         (1 << 4)        /* Export to ETM */
-#define PMNC_DP                (1 << 5)        /* Disable CCNT if non-invasive debug*/
-#define        PMNC_MASK       0x3f            /* Mask for writable bits */
-
-/*
- * Available counters
- */
-#define CCNT           0
-#define CNT0           1
-#define CNT1           2
-#define CNT2           3
-#define CNT3           4
-#define CNTMAX                 5
-
-#define CPU_COUNTER(cpu, counter)      ((cpu) * CNTMAX + (counter))
-
-/*
- * CNTENS: counters enable reg
- */
-#define CNTENS_P0      (1 << 0)
-#define CNTENS_P1      (1 << 1)
-#define CNTENS_P2      (1 << 2)
-#define CNTENS_P3      (1 << 3)
-#define CNTENS_C       (1 << 31)
-#define        CNTENS_MASK     0x8000000f      /* Mask for writable bits */
-
-/*
- * CNTENC: counters disable reg
- */
-#define CNTENC_P0      (1 << 0)
-#define CNTENC_P1      (1 << 1)
-#define CNTENC_P2      (1 << 2)
-#define CNTENC_P3      (1 << 3)
-#define CNTENC_C       (1 << 31)
-#define        CNTENC_MASK     0x8000000f      /* Mask for writable bits */
-
-/*
- * INTENS: counters overflow interrupt enable reg
- */
-#define INTENS_P0      (1 << 0)
-#define INTENS_P1      (1 << 1)
-#define INTENS_P2      (1 << 2)
-#define INTENS_P3      (1 << 3)
-#define INTENS_C       (1 << 31)
-#define        INTENS_MASK     0x8000000f      /* Mask for writable bits */
-
-/*
- * EVTSEL: Event selection reg
- */
-#define        EVTSEL_MASK     0x7f            /* Mask for writable bits */
-
-/*
- * SELECT: Counter selection reg
- */
-#define        SELECT_MASK     0x1f            /* Mask for writable bits */
-
-/*
- * FLAG: counters overflow flag status reg
- */
-#define FLAG_P0                (1 << 0)
-#define FLAG_P1                (1 << 1)
-#define FLAG_P2                (1 << 2)
-#define FLAG_P3                (1 << 3)
-#define FLAG_C         (1 << 31)
-#define        FLAG_MASK       0x8000000f      /* Mask for writable bits */
-
-
-int armv7_setup_pmu(void);
-int armv7_start_pmu(void);
-int armv7_stop_pmu(void);
-int armv7_request_interrupts(const int *, int);
-void armv7_release_interrupts(const int *, int);
-
-#endif
diff --git a/arch/arm/oprofile/op_model_xscale.c b/arch/arm/oprofile/op_model_xscale.c
deleted file mode 100644 (file)
index 1d34a02..0000000
+++ /dev/null
@@ -1,444 +0,0 @@
-/**
- * @file op_model_xscale.c
- * XScale Performance Monitor Driver
- *
- * @remark Copyright 2000-2004 Deepak Saxena <dsaxena@mvista.com>
- * @remark Copyright 2000-2004 MontaVista Software Inc
- * @remark Copyright 2004 Dave Jiang <dave.jiang@intel.com>
- * @remark Copyright 2004 Intel Corporation
- * @remark Copyright 2004 Zwane Mwaikambo <zwane@arm.linux.org.uk>
- * @remark Copyright 2004 OProfile Authors
- *
- * @remark Read the file COPYING
- *
- * @author Zwane Mwaikambo
- */
-
-/* #define DEBUG */
-#include <linux/types.h>
-#include <linux/errno.h>
-#include <linux/err.h>
-#include <linux/sched.h>
-#include <linux/oprofile.h>
-#include <linux/interrupt.h>
-#include <linux/irq.h>
-
-#include <asm/cputype.h>
-#include <asm/pmu.h>
-
-#include "op_counter.h"
-#include "op_arm_model.h"
-
-#define        PMU_ENABLE      0x001   /* Enable counters */
-#define PMN_RESET      0x002   /* Reset event counters */
-#define        CCNT_RESET      0x004   /* Reset clock counter */
-#define        PMU_RESET       (CCNT_RESET | PMN_RESET)
-#define PMU_CNT64      0x008   /* Make CCNT count every 64th cycle */
-
-/*
- * Different types of events that can be counted by the XScale PMU
- * as used by Oprofile userspace. Here primarily for documentation
- * purposes.
- */
-
-#define EVT_ICACHE_MISS                        0x00
-#define        EVT_ICACHE_NO_DELIVER           0x01
-#define        EVT_DATA_STALL                  0x02
-#define        EVT_ITLB_MISS                   0x03
-#define        EVT_DTLB_MISS                   0x04
-#define        EVT_BRANCH                      0x05
-#define        EVT_BRANCH_MISS                 0x06
-#define        EVT_INSTRUCTION                 0x07
-#define        EVT_DCACHE_FULL_STALL           0x08
-#define        EVT_DCACHE_FULL_STALL_CONTIG    0x09
-#define        EVT_DCACHE_ACCESS               0x0A
-#define        EVT_DCACHE_MISS                 0x0B
-#define        EVT_DCACE_WRITE_BACK            0x0C
-#define        EVT_PC_CHANGED                  0x0D
-#define        EVT_BCU_REQUEST                 0x10
-#define        EVT_BCU_FULL                    0x11
-#define        EVT_BCU_DRAIN                   0x12
-#define        EVT_BCU_ECC_NO_ELOG             0x14
-#define        EVT_BCU_1_BIT_ERR               0x15
-#define        EVT_RMW                         0x16
-/* EVT_CCNT is not hardware defined */
-#define EVT_CCNT                       0xFE
-#define EVT_UNUSED                     0xFF
-
-struct pmu_counter {
-       volatile unsigned long ovf;
-       unsigned long reset_counter;
-};
-
-enum { CCNT, PMN0, PMN1, PMN2, PMN3, MAX_COUNTERS };
-
-static struct pmu_counter results[MAX_COUNTERS];
-
-/*
- * There are two versions of the PMU in current XScale processors
- * with differing register layouts and number of performance counters.
- * e.g. IOP32x is xsc1 whilst IOP33x is xsc2.
- * We detect which register layout to use in xscale_detect_pmu()
- */
-enum { PMU_XSC1, PMU_XSC2 };
-
-struct pmu_type {
-       int id;
-       char *name;
-       int num_counters;
-       unsigned int int_enable;
-       unsigned int cnt_ovf[MAX_COUNTERS];
-       unsigned int int_mask[MAX_COUNTERS];
-};
-
-static struct pmu_type pmu_parms[] = {
-       {
-               .id             = PMU_XSC1,
-               .name           = "arm/xscale1",
-               .num_counters   = 3,
-               .int_mask       = { [PMN0] = 0x10, [PMN1] = 0x20,
-                                   [CCNT] = 0x40 },
-               .cnt_ovf        = { [CCNT] = 0x400, [PMN0] = 0x100,
-                                   [PMN1] = 0x200},
-       },
-       {
-               .id             = PMU_XSC2,
-               .name           = "arm/xscale2",
-               .num_counters   = 5,
-               .int_mask       = { [CCNT] = 0x01, [PMN0] = 0x02,
-                                   [PMN1] = 0x04, [PMN2] = 0x08,
-                                   [PMN3] = 0x10 },
-               .cnt_ovf        = { [CCNT] = 0x01, [PMN0] = 0x02,
-                                   [PMN1] = 0x04, [PMN2] = 0x08,
-                                   [PMN3] = 0x10 },
-       },
-};
-
-static struct pmu_type *pmu;
-
-static void write_pmnc(u32 val)
-{
-       if (pmu->id == PMU_XSC1) {
-               /* upper 4bits and 7, 11 are write-as-0 */
-               val &= 0xffff77f;
-               __asm__ __volatile__ ("mcr p14, 0, %0, c0, c0, 0" : : "r" (val));
-       } else {
-               /* bits 4-23 are write-as-0, 24-31 are write ignored */
-               val &= 0xf;
-               __asm__ __volatile__ ("mcr p14, 0, %0, c0, c1, 0" : : "r" (val));
-       }
-}
-
-static u32 read_pmnc(void)
-{
-       u32 val;
-
-       if (pmu->id == PMU_XSC1)
-               __asm__ __volatile__ ("mrc p14, 0, %0, c0, c0, 0" : "=r" (val));
-       else {
-               __asm__ __volatile__ ("mrc p14, 0, %0, c0, c1, 0" : "=r" (val));
-               /* bits 1-2 and 4-23 are read-unpredictable */
-               val &= 0xff000009;
-       }
-
-       return val;
-}
-
-static u32 __xsc1_read_counter(int counter)
-{
-       u32 val = 0;
-
-       switch (counter) {
-       case CCNT:
-               __asm__ __volatile__ ("mrc p14, 0, %0, c1, c0, 0" : "=r" (val));
-               break;
-       case PMN0:
-               __asm__ __volatile__ ("mrc p14, 0, %0, c2, c0, 0" : "=r" (val));
-               break;
-       case PMN1:
-               __asm__ __volatile__ ("mrc p14, 0, %0, c3, c0, 0" : "=r" (val));
-               break;
-       }
-       return val;
-}
-
-static u32 __xsc2_read_counter(int counter)
-{
-       u32 val = 0;
-
-       switch (counter) {
-       case CCNT:
-               __asm__ __volatile__ ("mrc p14, 0, %0, c1, c1, 0" : "=r" (val));
-               break;
-       case PMN0:
-               __asm__ __volatile__ ("mrc p14, 0, %0, c0, c2, 0" : "=r" (val));
-               break;
-       case PMN1:
-               __asm__ __volatile__ ("mrc p14, 0, %0, c1, c2, 0" : "=r" (val));
-               break;
-       case PMN2:
-               __asm__ __volatile__ ("mrc p14, 0, %0, c2, c2, 0" : "=r" (val));
-               break;
-       case PMN3:
-               __asm__ __volatile__ ("mrc p14, 0, %0, c3, c2, 0" : "=r" (val));
-               break;
-       }
-       return val;
-}
-
-static u32 read_counter(int counter)
-{
-       u32 val;
-
-       if (pmu->id == PMU_XSC1)
-               val = __xsc1_read_counter(counter);
-       else
-               val = __xsc2_read_counter(counter);
-
-       return val;
-}
-
-static void __xsc1_write_counter(int counter, u32 val)
-{
-       switch (counter) {
-       case CCNT:
-               __asm__ __volatile__ ("mcr p14, 0, %0, c1, c0, 0" : : "r" (val));
-               break;
-       case PMN0:
-               __asm__ __volatile__ ("mcr p14, 0, %0, c2, c0, 0" : : "r" (val));
-               break;
-       case PMN1:
-               __asm__ __volatile__ ("mcr p14, 0, %0, c3, c0, 0" : : "r" (val));
-               break;
-       }
-}
-
-static void __xsc2_write_counter(int counter, u32 val)
-{
-       switch (counter) {
-       case CCNT:
-               __asm__ __volatile__ ("mcr p14, 0, %0, c1, c1, 0" : : "r" (val));
-               break;
-       case PMN0:
-               __asm__ __volatile__ ("mcr p14, 0, %0, c0, c2, 0" : : "r" (val));
-               break;
-       case PMN1:
-               __asm__ __volatile__ ("mcr p14, 0, %0, c1, c2, 0" : : "r" (val));
-               break;
-       case PMN2:
-               __asm__ __volatile__ ("mcr p14, 0, %0, c2, c2, 0" : : "r" (val));
-               break;
-       case PMN3:
-               __asm__ __volatile__ ("mcr p14, 0, %0, c3, c2, 0" : : "r" (val));
-               break;
-       }
-}
-
-static void write_counter(int counter, u32 val)
-{
-       if (pmu->id == PMU_XSC1)
-               __xsc1_write_counter(counter, val);
-       else
-               __xsc2_write_counter(counter, val);
-}
-
-static int xscale_setup_ctrs(void)
-{
-       u32 evtsel, pmnc;
-       int i;
-
-       for (i = CCNT; i < MAX_COUNTERS; i++) {
-               if (counter_config[i].enabled)
-                       continue;
-
-               counter_config[i].event = EVT_UNUSED;
-       }
-
-       switch (pmu->id) {
-       case PMU_XSC1:
-               pmnc = (counter_config[PMN1].event << 20) | (counter_config[PMN0].event << 12);
-               pr_debug("xscale_setup_ctrs: pmnc: %#08x\n", pmnc);
-               write_pmnc(pmnc);
-               break;
-
-       case PMU_XSC2:
-               evtsel = counter_config[PMN0].event | (counter_config[PMN1].event << 8) |
-                       (counter_config[PMN2].event << 16) | (counter_config[PMN3].event << 24);
-
-               pr_debug("xscale_setup_ctrs: evtsel %#08x\n", evtsel);
-               __asm__ __volatile__ ("mcr p14, 0, %0, c8, c1, 0" : : "r" (evtsel));
-               break;
-       }
-
-       for (i = CCNT; i < MAX_COUNTERS; i++) {
-               if (counter_config[i].event == EVT_UNUSED) {
-                       counter_config[i].event = 0;
-                       pmu->int_enable &= ~pmu->int_mask[i];
-                       continue;
-               }
-
-               results[i].reset_counter = counter_config[i].count;
-               write_counter(i, -(u32)counter_config[i].count);
-               pmu->int_enable |= pmu->int_mask[i];
-               pr_debug("xscale_setup_ctrs: counter%d %#08x from %#08lx\n", i,
-                       read_counter(i), counter_config[i].count);
-       }
-
-       return 0;
-}
-
-static void inline __xsc1_check_ctrs(void)
-{
-       int i;
-       u32 pmnc = read_pmnc();
-
-       /* NOTE: there's an A stepping errata that states if an overflow */
-       /*       bit already exists and another occurs, the previous     */
-       /*       Overflow bit gets cleared. There's no workaround.       */
-       /*       Fixed in B stepping or later                            */
-
-       /* Write the value back to clear the overflow flags. Overflow */
-       /* flags remain in pmnc for use below */
-       write_pmnc(pmnc & ~PMU_ENABLE);
-
-       for (i = CCNT; i <= PMN1; i++) {
-               if (!(pmu->int_mask[i] & pmu->int_enable))
-                       continue;
-
-               if (pmnc & pmu->cnt_ovf[i])
-                       results[i].ovf++;
-       }
-}
-
-static void inline __xsc2_check_ctrs(void)
-{
-       int i;
-       u32 flag = 0, pmnc = read_pmnc();
-
-       pmnc &= ~PMU_ENABLE;
-       write_pmnc(pmnc);
-
-       /* read overflow flag register */
-       __asm__ __volatile__ ("mrc p14, 0, %0, c5, c1, 0" : "=r" (flag));
-
-       for (i = CCNT; i <= PMN3; i++) {
-               if (!(pmu->int_mask[i] & pmu->int_enable))
-                       continue;
-
-               if (flag & pmu->cnt_ovf[i])
-                       results[i].ovf++;
-       }
-
-       /* writeback clears overflow bits */
-       __asm__ __volatile__ ("mcr p14, 0, %0, c5, c1, 0" : : "r" (flag));
-}
-
-static irqreturn_t xscale_pmu_interrupt(int irq, void *arg)
-{
-       int i;
-       u32 pmnc;
-
-       if (pmu->id == PMU_XSC1)
-               __xsc1_check_ctrs();
-       else
-               __xsc2_check_ctrs();
-
-       for (i = CCNT; i < MAX_COUNTERS; i++) {
-               if (!results[i].ovf)
-                       continue;
-
-               write_counter(i, -(u32)results[i].reset_counter);
-               oprofile_add_sample(get_irq_regs(), i);
-               results[i].ovf--;
-       }
-
-       pmnc = read_pmnc() | PMU_ENABLE;
-       write_pmnc(pmnc);
-
-       return IRQ_HANDLED;
-}
-
-static const struct pmu_irqs *pmu_irqs;
-
-static void xscale_pmu_stop(void)
-{
-       u32 pmnc = read_pmnc();
-
-       pmnc &= ~PMU_ENABLE;
-       write_pmnc(pmnc);
-
-       free_irq(pmu_irqs->irqs[0], results);
-       release_pmu(pmu_irqs);
-       pmu_irqs = NULL;
-}
-
-static int xscale_pmu_start(void)
-{
-       int ret;
-       u32 pmnc;
-
-       pmu_irqs = reserve_pmu();
-       if (IS_ERR(pmu_irqs))
-               return PTR_ERR(pmu_irqs);
-
-       pmnc = read_pmnc();
-
-       ret = request_irq(pmu_irqs->irqs[0], xscale_pmu_interrupt,
-                         IRQF_DISABLED, "XScale PMU", (void *)results);
-
-       if (ret < 0) {
-               printk(KERN_ERR "oprofile: unable to request IRQ%d for XScale PMU\n",
-                      pmu_irqs->irqs[0]);
-               release_pmu(pmu_irqs);
-               pmu_irqs = NULL;
-               return ret;
-       }
-
-       if (pmu->id == PMU_XSC1)
-               pmnc |= pmu->int_enable;
-       else {
-               __asm__ __volatile__ ("mcr p14, 0, %0, c4, c1, 0" : : "r" (pmu->int_enable));
-               pmnc &= ~PMU_CNT64;
-       }
-
-       pmnc |= PMU_ENABLE;
-       write_pmnc(pmnc);
-       pr_debug("xscale_pmu_start: pmnc: %#08x mask: %08x\n", pmnc, pmu->int_enable);
-       return 0;
-}
-
-static int xscale_detect_pmu(void)
-{
-       int ret = 0;
-       u32 id;
-
-       id = (read_cpuid(CPUID_ID) >> 13) & 0x7;
-
-       switch (id) {
-       case 1:
-               pmu = &pmu_parms[PMU_XSC1];
-               break;
-       case 2:
-               pmu = &pmu_parms[PMU_XSC2];
-               break;
-       default:
-               ret = -ENODEV;
-               break;
-       }
-
-       if (!ret) {
-               op_xscale_spec.name = pmu->name;
-               op_xscale_spec.num_counters = pmu->num_counters;
-               pr_debug("xscale_detect_pmu: detected %s PMU\n", pmu->name);
-       }
-
-       return ret;
-}
-
-struct op_arm_model_spec op_xscale_spec = {
-       .init           = xscale_detect_pmu,
-       .setup_ctrs     = xscale_setup_ctrs,
-       .start          = xscale_pmu_start,
-       .stop           = xscale_pmu_stop,
-};
-
index 36bff03..69b09c1 100644 (file)
@@ -13,6 +13,7 @@ obj-$(CONFIG_ARCH_IOP32X) += time.o
 obj-$(CONFIG_ARCH_IOP32X) += io.o
 obj-$(CONFIG_ARCH_IOP32X) += cp6.o
 obj-$(CONFIG_ARCH_IOP32X) += adma.o
+obj-$(CONFIG_ARCH_IOP32X) += pmu.o
 
 # IOP33X
 obj-$(CONFIG_ARCH_IOP33X) += gpio.o
@@ -23,6 +24,7 @@ obj-$(CONFIG_ARCH_IOP33X) += time.o
 obj-$(CONFIG_ARCH_IOP33X) += io.o
 obj-$(CONFIG_ARCH_IOP33X) += cp6.o
 obj-$(CONFIG_ARCH_IOP33X) += adma.o
+obj-$(CONFIG_ARCH_IOP33X) += pmu.o
 
 # IOP13XX
 obj-$(CONFIG_ARCH_IOP13XX) += cp6.o
diff --git a/arch/arm/plat-iop/pmu.c b/arch/arm/plat-iop/pmu.c
new file mode 100644 (file)
index 0000000..a2024b8
--- /dev/null
@@ -0,0 +1,40 @@
+/*
+ * PMU IRQ registration for the iop3xx xscale PMU families.
+ * Copyright (C) 2010 Will Deacon, ARM Ltd.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ */
+
+#include <linux/platform_device.h>
+#include <asm/pmu.h>
+#include <mach/irqs.h>
+
+static struct resource pmu_resource = {
+#ifdef CONFIG_ARCH_IOP32X
+       .start  = IRQ_IOP32X_CORE_PMU,
+       .end    = IRQ_IOP32X_CORE_PMU,
+#endif
+#ifdef CONFIG_ARCH_IOP33X
+       .start  = IRQ_IOP33X_CORE_PMU,
+       .end    = IRQ_IOP33X_CORE_PMU,
+#endif
+       .flags  = IORESOURCE_IRQ,
+};
+
+static struct platform_device pmu_device = {
+       .name           = "arm-pmu",
+       .id             = ARM_PMU_DEVICE_CPU,
+       .resource       = &pmu_resource,
+       .num_resources  = 1,
+};
+
+static int __init iop3xx_pmu_init(void)
+{
+       platform_device_register(&pmu_device);
+       return 0;
+}
+
+arch_initcall(iop3xx_pmu_init);
index 159daf5..5da3f97 100644 (file)
@@ -19,4 +19,9 @@ config HAS_MTU
          to multiple interrupt generating programmable
          32-bit free running decrementing counters.
 
+config NOMADIK_GPIO
+       bool
+       help
+         Support for the Nomadik GPIO controller.
+
 endif
index 37c7cdd..c335473 100644 (file)
@@ -3,3 +3,4 @@
 # Licensed under GPLv2
 
 obj-$(CONFIG_HAS_MTU)  += timer.o
+obj-$(CONFIG_NOMADIK_GPIO)     += gpio.o
similarity index 74%
rename from arch/arm/mach-nomadik/gpio.c
rename to arch/arm/plat-nomadik/gpio.c
index 66b1c91..5a6ef25 100644 (file)
 #include <linux/module.h>
 #include <linux/init.h>
 #include <linux/device.h>
-#include <linux/amba/bus.h>
+#include <linux/platform_device.h>
 #include <linux/io.h>
+#include <linux/clk.h>
+#include <linux/err.h>
 #include <linux/gpio.h>
 #include <linux/spinlock.h>
 #include <linux/interrupt.h>
@@ -36,8 +38,9 @@
 struct nmk_gpio_chip {
        struct gpio_chip chip;
        void __iomem *addr;
+       struct clk *clk;
        unsigned int parent_irq;
-       spinlock_t *lock;
+       spinlock_t lock;
        /* Keep track of configured edges */
        u32 edge_rising;
        u32 edge_falling;
@@ -108,40 +111,37 @@ static void nmk_gpio_irq_ack(unsigned int irq)
        writel(nmk_gpio_get_bitmask(gpio), nmk_chip->addr + NMK_GPIO_IC);
 }
 
-static void nmk_gpio_irq_mask(unsigned int irq)
+static void __nmk_gpio_irq_modify(struct nmk_gpio_chip *nmk_chip,
+                                 int gpio, bool enable)
 {
-       int gpio;
-       struct nmk_gpio_chip *nmk_chip;
-       unsigned long flags;
-       u32 bitmask, reg;
-
-       gpio = NOMADIK_IRQ_TO_GPIO(irq);
-       nmk_chip = get_irq_chip_data(irq);
-       bitmask = nmk_gpio_get_bitmask(gpio);
-       if (!nmk_chip)
-               return;
+       u32 bitmask = nmk_gpio_get_bitmask(gpio);
+       u32 reg;
 
-       /* we must individually clear the two edges */
-       spin_lock_irqsave(&nmk_chip->lock, flags);
+       /* we must individually set/clear the two edges */
        if (nmk_chip->edge_rising & bitmask) {
-               reg = readl(nmk_chip->addr + NMK_GPIO_RWIMSC);
-               reg &= ~bitmask;
-               writel(reg, nmk_chip->addr + NMK_GPIO_RWIMSC);
+               reg = readl(nmk_chip->addr + NMK_GPIO_RIMSC);
+               if (enable)
+                       reg |= bitmask;
+               else
+                       reg &= ~bitmask;
+               writel(reg, nmk_chip->addr + NMK_GPIO_RIMSC);
        }
        if (nmk_chip->edge_falling & bitmask) {
-               reg = readl(nmk_chip->addr + NMK_GPIO_FWIMSC);
-               reg &= ~bitmask;
-               writel(reg, nmk_chip->addr + NMK_GPIO_FWIMSC);
+               reg = readl(nmk_chip->addr + NMK_GPIO_FIMSC);
+               if (enable)
+                       reg |= bitmask;
+               else
+                       reg &= ~bitmask;
+               writel(reg, nmk_chip->addr + NMK_GPIO_FIMSC);
        }
-       spin_unlock_irqrestore(&nmk_chip->lock, flags);
-};
+}
 
-static void nmk_gpio_irq_unmask(unsigned int irq)
+static void nmk_gpio_irq_modify(unsigned int irq, bool enable)
 {
        int gpio;
        struct nmk_gpio_chip *nmk_chip;
        unsigned long flags;
-       u32 bitmask, reg;
+       u32 bitmask;
 
        gpio = NOMADIK_IRQ_TO_GPIO(irq);
        nmk_chip = get_irq_chip_data(irq);
@@ -149,23 +149,24 @@ static void nmk_gpio_irq_unmask(unsigned int irq)
        if (!nmk_chip)
                return;
 
-       /* we must individually set the two edges */
        spin_lock_irqsave(&nmk_chip->lock, flags);
-       if (nmk_chip->edge_rising & bitmask) {
-               reg = readl(nmk_chip->addr + NMK_GPIO_RWIMSC);
-               reg |= bitmask;
-               writel(reg, nmk_chip->addr + NMK_GPIO_RWIMSC);
-       }
-       if (nmk_chip->edge_falling & bitmask) {
-               reg = readl(nmk_chip->addr + NMK_GPIO_FWIMSC);
-               reg |= bitmask;
-               writel(reg, nmk_chip->addr + NMK_GPIO_FWIMSC);
-       }
+       __nmk_gpio_irq_modify(nmk_chip, gpio, enable);
        spin_unlock_irqrestore(&nmk_chip->lock, flags);
 }
 
+static void nmk_gpio_irq_mask(unsigned int irq)
+{
+       nmk_gpio_irq_modify(irq, false);
+};
+
+static void nmk_gpio_irq_unmask(unsigned int irq)
+{
+       nmk_gpio_irq_modify(irq, true);
+}
+
 static int nmk_gpio_irq_set_type(unsigned int irq, unsigned int type)
 {
+       bool enabled = !(irq_to_desc(irq)->status & IRQ_DISABLED);
        int gpio;
        struct nmk_gpio_chip *nmk_chip;
        unsigned long flags;
@@ -184,19 +185,21 @@ static int nmk_gpio_irq_set_type(unsigned int irq, unsigned int type)
 
        spin_lock_irqsave(&nmk_chip->lock, flags);
 
+       if (enabled)
+               __nmk_gpio_irq_modify(nmk_chip, gpio, false);
+
        nmk_chip->edge_rising &= ~bitmask;
        if (type & IRQ_TYPE_EDGE_RISING)
                nmk_chip->edge_rising |= bitmask;
-       writel(nmk_chip->edge_rising, nmk_chip->addr + NMK_GPIO_RIMSC);
 
        nmk_chip->edge_falling &= ~bitmask;
        if (type & IRQ_TYPE_EDGE_FALLING)
                nmk_chip->edge_falling |= bitmask;
-       writel(nmk_chip->edge_falling, nmk_chip->addr + NMK_GPIO_FIMSC);
 
-       spin_unlock_irqrestore(&nmk_chip->lock, flags);
+       if (enabled)
+               __nmk_gpio_irq_modify(nmk_chip, gpio, true);
 
-       nmk_gpio_irq_unmask(irq);
+       spin_unlock_irqrestore(&nmk_chip->lock, flags);
 
        return 0;
 }
@@ -212,21 +215,27 @@ static struct irq_chip nmk_gpio_irq_chip = {
 static void nmk_gpio_irq_handler(unsigned int irq, struct irq_desc *desc)
 {
        struct nmk_gpio_chip *nmk_chip;
-       struct irq_chip *host_chip;
+       struct irq_chip *host_chip = get_irq_chip(irq);
        unsigned int gpio_irq;
        u32 pending;
        unsigned int first_irq;
 
+       if (host_chip->mask_ack)
+               host_chip->mask_ack(irq);
+       else {
+               host_chip->mask(irq);
+               if (host_chip->ack)
+                       host_chip->ack(irq);
+       }
+
        nmk_chip = get_irq_data(irq);
        first_irq = NOMADIK_GPIO_TO_IRQ(nmk_chip->chip.base);
        while ( (pending = readl(nmk_chip->addr + NMK_GPIO_IS)) ) {
                gpio_irq = first_irq + __ffs(pending);
                generic_handle_irq(gpio_irq);
        }
-       if (0) {/* don't ack parent irq, as ack == disable */
-               host_chip = get_irq_chip(irq);
-               host_chip->ack(irq);
-       }
+
+       host_chip->unmask(irq);
 }
 
 static int nmk_gpio_init_irq(struct nmk_gpio_chip *nmk_chip)
@@ -240,6 +249,7 @@ static int nmk_gpio_init_irq(struct nmk_gpio_chip *nmk_chip)
                set_irq_handler(i, handle_edge_irq);
                set_irq_flags(i, IRQF_VALID);
                set_irq_chip_data(i, nmk_chip);
+               set_irq_type(i, IRQ_TYPE_EDGE_FALLING);
        }
        set_irq_chained_handler(nmk_chip->parent_irq, nmk_gpio_irq_handler);
        set_irq_data(nmk_chip->parent_irq, nmk_chip);
@@ -298,30 +308,59 @@ static struct gpio_chip nmk_gpio_template = {
        .can_sleep              = 0,
 };
 
-static int __init nmk_gpio_probe(struct amba_device *dev, struct amba_id *id)
+static int __init nmk_gpio_probe(struct platform_device *dev)
 {
-       struct nmk_gpio_platform_data *pdata;
+       struct nmk_gpio_platform_data *pdata = dev->dev.platform_data;
        struct nmk_gpio_chip *nmk_chip;
        struct gpio_chip *chip;
+       struct resource *res;
+       struct clk *clk;
+       int irq;
        int ret;
 
-       pdata = dev->dev.platform_data;
-       ret = amba_request_regions(dev, pdata->name);
-       if (ret)
-               return ret;
+       if (!pdata)
+               return -ENODEV;
+
+       res = platform_get_resource(dev, IORESOURCE_MEM, 0);
+       if (!res) {
+               ret = -ENOENT;
+               goto out;
+       }
+
+       irq = platform_get_irq(dev, 0);
+       if (irq < 0) {
+               ret = irq;
+               goto out;
+       }
+
+       if (request_mem_region(res->start, resource_size(res),
+                              dev_name(&dev->dev)) == NULL) {
+               ret = -EBUSY;
+               goto out;
+       }
+
+       clk = clk_get(&dev->dev, NULL);
+       if (IS_ERR(clk)) {
+               ret = PTR_ERR(clk);
+               goto out_release;
+       }
+
+       clk_enable(clk);
 
        nmk_chip = kzalloc(sizeof(*nmk_chip), GFP_KERNEL);
        if (!nmk_chip) {
                ret = -ENOMEM;
-               goto out_amba;
+               goto out_clk;
        }
        /*
         * The virt address in nmk_chip->addr is in the nomadik register space,
         * so we can simply convert the resource address, without remapping
         */
-       nmk_chip->addr = io_p2v(dev->res.start);
+       nmk_chip->clk = clk;
+       nmk_chip->addr = io_p2v(res->start);
        nmk_chip->chip = nmk_gpio_template;
-       nmk_chip->parent_irq = pdata->parent_irq;
+       nmk_chip->parent_irq = irq;
+       spin_lock_init(&nmk_chip->lock);
 
        chip = &nmk_chip->chip;
        chip->base = pdata->first_gpio;
@@ -333,7 +372,7 @@ static int __init nmk_gpio_probe(struct amba_device *dev, struct amba_id *id)
        if (ret)
                goto out_free;
 
-       amba_set_drvdata(dev, nmk_chip);
+       platform_set_drvdata(dev, nmk_chip);
 
        nmk_gpio_init_irq(nmk_chip);
 
@@ -341,51 +380,50 @@ static int __init nmk_gpio_probe(struct amba_device *dev, struct amba_id *id)
                 nmk_chip->chip.base, nmk_chip->chip.base+31, nmk_chip->addr);
        return 0;
 
- out_free:
+out_free:
        kfree(nmk_chip);
- out_amba:
-       amba_release_regions(dev);
+out_clk:
+       clk_disable(clk);
+       clk_put(clk);
+out_release:
+       release_mem_region(res->start, resource_size(res));
+out:
        dev_err(&dev->dev, "Failure %i for GPIO %i-%i\n", ret,
                  pdata->first_gpio, pdata->first_gpio+31);
        return ret;
 }
 
-static int nmk_gpio_remove(struct amba_device *dev)
+static int __exit nmk_gpio_remove(struct platform_device *dev)
 {
        struct nmk_gpio_chip *nmk_chip;
+       struct resource *res;
 
-       nmk_chip = amba_get_drvdata(dev);
+       res = platform_get_resource(dev, IORESOURCE_MEM, 0);
+
+       nmk_chip = platform_get_drvdata(dev);
        gpiochip_remove(&nmk_chip->chip);
+       clk_disable(nmk_chip->clk);
+       clk_put(nmk_chip->clk);
        kfree(nmk_chip);
-       amba_release_regions(dev);
+       release_mem_region(res->start, resource_size(res));
        return 0;
 }
 
 
-/* We have 0x1f080060 and 0x1f180060, accept both using the mask */
-static struct amba_id nmk_gpio_ids[] = {
-       {
-               .id     = 0x1f080060,
-               .mask   = 0xffefffff,
-       },
-       {0, 0},
-};
-
-static struct amba_driver nmk_gpio_driver = {
-       .drv = {
+static struct platform_driver nmk_gpio_driver = {
+       .driver = {
                .owner = THIS_MODULE,
                .name = "gpio",
                },
        .probe = nmk_gpio_probe,
-       .remove = nmk_gpio_remove,
+       .remove = __exit_p(nmk_gpio_remove),
        .suspend = NULL, /* to be done */
        .resume = NULL,
-       .id_table = nmk_gpio_ids,
 };
 
 static int __init nmk_gpio_init(void)
 {
-       return amba_driver_register(&nmk_gpio_driver);
+       return platform_driver_register(&nmk_gpio_driver);
 }
 
 arch_initcall(nmk_gpio_init);
diff --git a/arch/arm/plat-nomadik/include/plat/gpio.h b/arch/arm/plat-nomadik/include/plat/gpio.h
new file mode 100644 (file)
index 0000000..4200811
--- /dev/null
@@ -0,0 +1,70 @@
+/*
+ * Structures and registers for GPIO access in the Nomadik SoC
+ *
+ * Copyright (C) 2008 STMicroelectronics
+ *     Author: Prafulla WADASKAR <prafulla.wadaskar@st.com>
+ * Copyright (C) 2009 Alessandro Rubini <rubini@unipv.it>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+#ifndef __ASM_PLAT_GPIO_H
+#define __ASM_PLAT_GPIO_H
+
+#include <asm-generic/gpio.h>
+
+/*
+ * These currently cause a function call to happen, they may be optimized
+ * if needed by adding cpu-specific defines to identify blocks
+ * (see mach-pxa/include/mach/gpio.h as an example using GPLR etc)
+ */
+#define gpio_get_value  __gpio_get_value
+#define gpio_set_value  __gpio_set_value
+#define gpio_cansleep   __gpio_cansleep
+#define gpio_to_irq     __gpio_to_irq
+
+/*
+ * "nmk_gpio" and "NMK_GPIO" stand for "Nomadik GPIO", leaving
+ * the "gpio" namespace for generic and cross-machine functions
+ */
+
+/* Register in the logic block */
+#define NMK_GPIO_DAT   0x00
+#define NMK_GPIO_DATS  0x04
+#define NMK_GPIO_DATC  0x08
+#define NMK_GPIO_PDIS  0x0c
+#define NMK_GPIO_DIR   0x10
+#define NMK_GPIO_DIRS  0x14
+#define NMK_GPIO_DIRC  0x18
+#define NMK_GPIO_SLPC  0x1c
+#define NMK_GPIO_AFSLA 0x20
+#define NMK_GPIO_AFSLB 0x24
+
+#define NMK_GPIO_RIMSC 0x40
+#define NMK_GPIO_FIMSC 0x44
+#define NMK_GPIO_IS    0x48
+#define NMK_GPIO_IC    0x4c
+#define NMK_GPIO_RWIMSC        0x50
+#define NMK_GPIO_FWIMSC        0x54
+#define NMK_GPIO_WKS   0x58
+
+/* Alternate functions: function C is set in hw by setting both A and B */
+#define NMK_GPIO_ALT_GPIO      0
+#define NMK_GPIO_ALT_A 1
+#define NMK_GPIO_ALT_B 2
+#define NMK_GPIO_ALT_C (NMK_GPIO_ALT_A | NMK_GPIO_ALT_B)
+
+extern int nmk_gpio_set_mode(int gpio, int gpio_mode);
+extern int nmk_gpio_get_mode(int gpio);
+
+/*
+ * Platform data to register a block: only the initial gpio/irq number.
+ */
+struct nmk_gpio_platform_data {
+       char *name;
+       int first_gpio;
+       int first_irq;
+};
+
+#endif /* __ASM_PLAT_GPIO_H */
index fa7cb3a..0ff3798 100644 (file)
@@ -2,7 +2,7 @@
  *  linux/arch/arm/mach-nomadik/timer.c
  *
  * Copyright (C) 2008 STMicroelectronics
- * Copyright (C) 2009 Alessandro Rubini, somewhat based on at91sam926x
+ * Copyright (C) 2010 Alessandro Rubini
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2, as
 
 #include <plat/mtu.h>
 
-static u32     nmdk_count;             /* accumulated count */
-static u32     nmdk_cycle;             /* write-once */
-
-/* setup by the platform code */
-void __iomem *mtu_base;
+void __iomem *mtu_base; /* ssigned by machine code */
 
 /*
- * clocksource: the MTU device is a decrementing counters, so we negate
- * the value being read.
+ * Kernel assumes that sched_clock can be called early
+ * but the MTU may not yet be initialized.
  */
-static cycle_t nmdk_read_timer(struct clocksource *cs)
+static cycle_t nmdk_read_timer_dummy(struct clocksource *cs)
 {
-       u32 count = readl(mtu_base + MTU_VAL(0));
-       return nmdk_count + nmdk_cycle - count;
+       return 0;
+}
 
+/* clocksource: MTU decrements, so we negate the value being read. */
+static cycle_t nmdk_read_timer(struct clocksource *cs)
+{
+       return -readl(mtu_base + MTU_VAL(0));
 }
 
 static struct clocksource nmdk_clksrc = {
        .name           = "mtu_0",
-       .rating         = 120,
-       .read           = nmdk_read_timer,
+       .rating         = 200,
+       .read           = nmdk_read_timer_dummy,
+       .mask           = CLOCKSOURCE_MASK(32),
        .shift          = 20,
        .flags          = CLOCK_SOURCE_IS_CONTINUOUS,
 };
 
 /*
- * Clockevent device: currently only periodic mode is supported
+ * Override the global weak sched_clock symbol with this
+ * local implementation which uses the clocksource to get some
+ * better resolution when scheduling the kernel. We accept that
+ * this wraps around for now, since it is just a relative time
+ * stamp. (Inspired by OMAP implementation.)
  */
+unsigned long long notrace sched_clock(void)
+{
+       return clocksource_cyc2ns(nmdk_clksrc.read(
+                                 &nmdk_clksrc),
+                                 nmdk_clksrc.mult,
+                                 nmdk_clksrc.shift);
+}
+
+/* Clockevent device: use one-shot mode */
 static void nmdk_clkevt_mode(enum clock_event_mode mode,
                             struct clock_event_device *dev)
 {
+       u32 cr;
+
        switch (mode) {
        case CLOCK_EVT_MODE_PERIODIC:
-               /* count current value? */
-               writel(readl(mtu_base + MTU_IMSC) | 1, mtu_base + MTU_IMSC);
+               pr_err("%s: periodic mode not supported\n", __func__);
                break;
        case CLOCK_EVT_MODE_ONESHOT:
-               BUG(); /* Not supported, yet */
-               /* FALLTHROUGH */
+               /* Load highest value, enable device, enable interrupts */
+               cr = readl(mtu_base + MTU_CR(1));
+               writel(0, mtu_base + MTU_LR(1));
+               writel(cr | MTU_CRn_ENA, mtu_base + MTU_CR(1));
+               writel(0x2, mtu_base + MTU_IMSC);
+               break;
        case CLOCK_EVT_MODE_SHUTDOWN:
        case CLOCK_EVT_MODE_UNUSED:
-               writel(readl(mtu_base + MTU_IMSC) & ~1, mtu_base + MTU_IMSC);
+               /* disable irq */
+               writel(0, mtu_base + MTU_IMSC);
                break;
        case CLOCK_EVT_MODE_RESUME:
                break;
        }
 }
 
+static int nmdk_clkevt_next(unsigned long evt, struct clock_event_device *ev)
+{
+       /* writing the value has immediate effect */
+       writel(evt, mtu_base + MTU_LR(1));
+       return 0;
+}
+
 static struct clock_event_device nmdk_clkevt = {
-       .name           = "mtu_0",
-       .features       = CLOCK_EVT_FEAT_PERIODIC,
+       .name           = "mtu_1",
+       .features       = CLOCK_EVT_FEAT_ONESHOT,
        .shift          = 32,
-       .rating         = 100,
+       .rating         = 200,
        .set_mode       = nmdk_clkevt_mode,
+       .set_next_event = nmdk_clkevt_next,
 };
 
 /*
- * IRQ Handler for the timer 0 of the MTU block. The irq is not shared
- * as we are the only users of mtu0 by now.
+ * IRQ Handler for timer 1 of the MTU block.
  */
 static irqreturn_t nmdk_timer_interrupt(int irq, void *dev_id)
 {
-       /* ack: "interrupt clear register" */
-       writel(1 << 0, mtu_base + MTU_ICR);
-
-       /* we can't count lost ticks, unfortunately */
-       nmdk_count += nmdk_cycle;
-       nmdk_clkevt.event_handler(&nmdk_clkevt);
+       struct clock_event_device *evdev = dev_id;
 
+       writel(1 << 1, mtu_base + MTU_ICR); /* Interrupt clear reg */
+       evdev->event_handler(evdev);
        return IRQ_HANDLED;
 }
 
-/*
- * Set up timer interrupt, and return the current time in seconds.
- */
 static struct irqaction nmdk_timer_irq = {
        .name           = "Nomadik Timer Tick",
        .flags          = IRQF_DISABLED | IRQF_TIMER,
        .handler        = nmdk_timer_interrupt,
+       .dev_id         = &nmdk_clkevt,
 };
 
-static void nmdk_timer_reset(void)
-{
-       u32 cr;
-
-       writel(0, mtu_base + MTU_CR(0)); /* off */
-
-       /* configure load and background-load, and fire it up */
-       writel(nmdk_cycle, mtu_base + MTU_LR(0));
-       writel(nmdk_cycle, mtu_base + MTU_BGLR(0));
-       cr = MTU_CRn_PERIODIC | MTU_CRn_PRESCALE_1 | MTU_CRn_32BITS;
-       writel(cr, mtu_base + MTU_CR(0));
-       writel(cr | MTU_CRn_ENA, mtu_base + MTU_CR(0));
-}
-
 void __init nmdk_timer_init(void)
 {
        unsigned long rate;
-       int bits;
-
-       rate = CLOCK_TICK_RATE; /* 2.4MHz */
-       nmdk_cycle = (rate + HZ/2) / HZ;
+       u32 cr = MTU_CRn_32BITS;;
+
+       /*
+        * Tick rate is 2.4MHz for Nomadik and 110MHz for ux500:
+        * use a divide-by-16 counter if it's more than 16MHz
+        */
+       rate = CLOCK_TICK_RATE;
+       if (rate > 16 << 20) {
+               rate /= 16;
+               cr |= MTU_CRn_PRESCALE_16;
+       } else {
+               cr |= MTU_CRn_PRESCALE_1;
+       }
 
-       /* Init the timer and register clocksource */
-       nmdk_timer_reset();
+       /* Timer 0 is the free running clocksource */
+       writel(cr, mtu_base + MTU_CR(0));
+       writel(0, mtu_base + MTU_LR(0));
+       writel(0, mtu_base + MTU_BGLR(0));
+       writel(cr | MTU_CRn_ENA, mtu_base + MTU_CR(0));
 
        nmdk_clksrc.mult = clocksource_hz2mult(rate, nmdk_clksrc.shift);
-       bits =  8*sizeof(nmdk_count);
-       nmdk_clksrc.mask = CLOCKSOURCE_MASK(bits);
+       /* Now the scheduling clock is ready */
+       nmdk_clksrc.read = nmdk_read_timer;
 
        if (clocksource_register(&nmdk_clksrc))
-               printk(KERN_ERR "timer: failed to initialize clock "
-                       "source %s\n", nmdk_clksrc.name);
+               pr_err("timer: failed to initialize clock source %s\n",
+                      nmdk_clksrc.name);
+
+       /* Timer 1 is used for events, fix according to rate */
+       writel(cr | MTU_CRn_ONESHOT, mtu_base + MTU_CR(1)); /* off, currently */
+       nmdk_clkevt.mult = div_sc(rate, NSEC_PER_SEC, nmdk_clkevt.shift);
+       nmdk_clkevt.max_delta_ns =
+               clockevent_delta2ns(0xffffffff, &nmdk_clkevt);
+       nmdk_clkevt.min_delta_ns =
+               clockevent_delta2ns(0x00000002, &nmdk_clkevt);
+       nmdk_clkevt.cpumask     = cpumask_of(0);
 
        /* Register irq and clockevents */
        setup_irq(IRQ_MTU0, &nmdk_timer_irq);
-       nmdk_clkevt.mult = div_sc(rate, NSEC_PER_SEC, nmdk_clkevt.shift);
-       nmdk_clkevt.cpumask = cpumask_of(0);
        clockevents_register_device(&nmdk_clkevt);
 }
index 4aacdd1..6187edf 100644 (file)
@@ -2,7 +2,7 @@
 # Makefile for code common across different PXA processor families
 #
 
-obj-y  := dma.o
+obj-y  := dma.o pmu.o
 
 obj-$(CONFIG_GENERIC_GPIO)     += gpio.o
 obj-$(CONFIG_PXA3xx)           += mfp.o
diff --git a/arch/arm/plat-pxa/pmu.c b/arch/arm/plat-pxa/pmu.c
new file mode 100644 (file)
index 0000000..267ceb6
--- /dev/null
@@ -0,0 +1,33 @@
+/*
+ * PMU IRQ registration for the PXA xscale PMU families.
+ * Copyright (C) 2010 Will Deacon, ARM Ltd.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ */
+
+#include <linux/platform_device.h>
+#include <asm/pmu.h>
+#include <mach/irqs.h>
+
+static struct resource pmu_resource = {
+       .start  = IRQ_PMU,
+       .end    = IRQ_PMU,
+       .flags  = IORESOURCE_IRQ,
+};
+
+static struct platform_device pmu_device = {
+       .name           = "arm-pmu",
+       .id             = ARM_PMU_DEVICE_CPU,
+       .resource       = &pmu_resource,
+       .num_resources  = 1,
+};
+
+static int __init pxa_pmu_init(void)
+{
+       platform_device_register(&pmu_device);
+       return 0;
+}
+arch_initcall(pxa_pmu_init);
diff --git a/arch/arm/plat-spear/Kconfig b/arch/arm/plat-spear/Kconfig
new file mode 100644 (file)
index 0000000..1bb3dbc
--- /dev/null
@@ -0,0 +1,31 @@
+#
+# SPEAr Platform configuration file
+#
+
+if PLAT_SPEAR
+
+choice
+       prompt "ST SPEAr Family"
+       default ARCH_SPEAR3XX
+
+config ARCH_SPEAR3XX
+       bool "SPEAr3XX"
+       select ARM_VIC
+       select CPU_ARM926T
+       help
+         Supports for ARM's SPEAR3XX family
+
+config ARCH_SPEAR6XX
+       bool "SPEAr6XX"
+       select ARM_VIC
+       select CPU_ARM926T
+       help
+         Supports for ARM's SPEAR6XX family
+
+endchoice
+
+# Adding SPEAr machine specific configuration files
+source "arch/arm/mach-spear3xx/Kconfig"
+source "arch/arm/mach-spear6xx/Kconfig"
+
+endif
diff --git a/arch/arm/plat-spear/Makefile b/arch/arm/plat-spear/Makefile
new file mode 100644 (file)
index 0000000..eb89540
--- /dev/null
@@ -0,0 +1,8 @@
+#
+# SPEAr Platform specific Makefile
+#
+
+# Common support
+obj-y  := clock.o padmux.o time.o
+
+obj-$(CONFIG_ARCH_SPEAR3XX)    += shirq.o
diff --git a/arch/arm/plat-spear/clock.c b/arch/arm/plat-spear/clock.c
new file mode 100644 (file)
index 0000000..ee4f90e
--- /dev/null
@@ -0,0 +1,435 @@
+/*
+ * arch/arm/plat-spear/clock.c
+ *
+ * Clock framework for SPEAr platform
+ *
+ * Copyright (C) 2009 ST Microelectronics
+ * Viresh Kumar<viresh.kumar@st.com>
+ *
+ * This file is licensed under the terms of the GNU General Public
+ * License version 2. This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+ */
+
+#include <linux/bug.h>
+#include <linux/err.h>
+#include <linux/io.h>
+#include <linux/list.h>
+#include <linux/module.h>
+#include <linux/spinlock.h>
+#include <mach/misc_regs.h>
+#include <plat/clock.h>
+
+static DEFINE_SPINLOCK(clocks_lock);
+static LIST_HEAD(root_clks);
+
+static void propagate_rate(struct list_head *);
+
+static int generic_clk_enable(struct clk *clk)
+{
+       unsigned int val;
+
+       if (!clk->en_reg)
+               return -EFAULT;
+
+       val = readl(clk->en_reg);
+       if (unlikely(clk->flags & RESET_TO_ENABLE))
+               val &= ~(1 << clk->en_reg_bit);
+       else
+               val |= 1 << clk->en_reg_bit;
+
+       writel(val, clk->en_reg);
+
+       return 0;
+}
+
+static void generic_clk_disable(struct clk *clk)
+{
+       unsigned int val;
+
+       if (!clk->en_reg)
+               return;
+
+       val = readl(clk->en_reg);
+       if (unlikely(clk->flags & RESET_TO_ENABLE))
+               val |= 1 << clk->en_reg_bit;
+       else
+               val &= ~(1 << clk->en_reg_bit);
+
+       writel(val, clk->en_reg);
+}
+
+/* generic clk ops */
+static struct clkops generic_clkops = {
+       .enable = generic_clk_enable,
+       .disable = generic_clk_disable,
+};
+
+/*
+ * clk_enable - inform the system when the clock source should be running.
+ * @clk: clock source
+ *
+ * If the clock can not be enabled/disabled, this should return success.
+ *
+ * Returns success (0) or negative errno.
+ */
+int clk_enable(struct clk *clk)
+{
+       unsigned long flags;
+       int ret = 0;
+
+       if (!clk || IS_ERR(clk))
+               return -EFAULT;
+
+       spin_lock_irqsave(&clocks_lock, flags);
+       if (clk->usage_count == 0) {
+               if (clk->ops && clk->ops->enable)
+                       ret = clk->ops->enable(clk);
+       }
+       clk->usage_count++;
+       spin_unlock_irqrestore(&clocks_lock, flags);
+
+       return ret;
+}
+EXPORT_SYMBOL(clk_enable);
+
+/*
+ * clk_disable - inform the system when the clock source is no longer required.
+ * @clk: clock source
+ *
+ * Inform the system that a clock source is no longer required by
+ * a driver and may be shut down.
+ *
+ * Implementation detail: if the clock source is shared between
+ * multiple drivers, clk_enable() calls must be balanced by the
+ * same number of clk_disable() calls for the clock source to be
+ * disabled.
+ */
+void clk_disable(struct clk *clk)
+{
+       unsigned long flags;
+
+       if (!clk || IS_ERR(clk))
+               return;
+
+       WARN_ON(clk->usage_count == 0);
+
+       spin_lock_irqsave(&clocks_lock, flags);
+       clk->usage_count--;
+       if (clk->usage_count == 0) {
+               if (clk->ops && clk->ops->disable)
+                       clk->ops->disable(clk);
+       }
+       spin_unlock_irqrestore(&clocks_lock, flags);
+}
+EXPORT_SYMBOL(clk_disable);
+
+/**
+ * clk_get_rate - obtain the current clock rate (in Hz) for a clock source.
+ *              This is only valid once the clock source has been enabled.
+ * @clk: clock source
+ */
+unsigned long clk_get_rate(struct clk *clk)
+{
+       unsigned long flags, rate;
+
+       spin_lock_irqsave(&clocks_lock, flags);
+       rate = clk->rate;
+       spin_unlock_irqrestore(&clocks_lock, flags);
+
+       return rate;
+}
+EXPORT_SYMBOL(clk_get_rate);
+
+/**
+ * clk_set_parent - set the parent clock source for this clock
+ * @clk: clock source
+ * @parent: parent clock source
+ *
+ * Returns success (0) or negative errno.
+ */
+int clk_set_parent(struct clk *clk, struct clk *parent)
+{
+       int i, found = 0, val = 0;
+       unsigned long flags;
+
+       if (!clk || IS_ERR(clk) || !parent || IS_ERR(parent))
+               return -EFAULT;
+       if (clk->usage_count)
+               return -EBUSY;
+       if (!clk->pclk_sel)
+               return -EPERM;
+       if (clk->pclk == parent)
+               return 0;
+
+       for (i = 0; i < clk->pclk_sel->pclk_count; i++) {
+               if (clk->pclk_sel->pclk_info[i].pclk == parent) {
+                       found = 1;
+                       break;
+               }
+       }
+
+       if (!found)
+               return -EINVAL;
+
+       spin_lock_irqsave(&clocks_lock, flags);
+       /* reflect parent change in hardware */
+       val = readl(clk->pclk_sel->pclk_sel_reg);
+       val &= ~(clk->pclk_sel->pclk_sel_mask << clk->pclk_sel_shift);
+       val |= clk->pclk_sel->pclk_info[i].pclk_mask << clk->pclk_sel_shift;
+       writel(val, clk->pclk_sel->pclk_sel_reg);
+       spin_unlock_irqrestore(&clocks_lock, flags);
+
+       /* reflect parent change in software */
+       clk->recalc(clk);
+       propagate_rate(&clk->children);
+       return 0;
+}
+EXPORT_SYMBOL(clk_set_parent);
+
+/* registers clock in platform clock framework */
+void clk_register(struct clk_lookup *cl)
+{
+       struct clk *clk = cl->clk;
+       unsigned long flags;
+
+       if (!clk || IS_ERR(clk))
+               return;
+
+       spin_lock_irqsave(&clocks_lock, flags);
+
+       INIT_LIST_HEAD(&clk->children);
+       if (clk->flags & ALWAYS_ENABLED)
+               clk->ops = NULL;
+       else if (!clk->ops)
+               clk->ops = &generic_clkops;
+
+       /* root clock don't have any parents */
+       if (!clk->pclk && !clk->pclk_sel) {
+               list_add(&clk->sibling, &root_clks);
+               /* add clocks with only one parent to parent's children list */
+       } else if (clk->pclk && !clk->pclk_sel) {
+               list_add(&clk->sibling, &clk->pclk->children);
+       } else {
+               /* add clocks with > 1 parent to 1st parent's children list */
+               list_add(&clk->sibling,
+                        &clk->pclk_sel->pclk_info[0].pclk->children);
+       }
+       spin_unlock_irqrestore(&clocks_lock, flags);
+
+       /* add clock to arm clockdev framework */
+       clkdev_add(cl);
+}
+
+/**
+ * propagate_rate - recalculate and propagate all clocks in list head
+ *
+ * Recalculates all root clocks in list head, which if the clock's .recalc is
+ * set correctly, should also propagate their rates.
+ */
+static void propagate_rate(struct list_head *lhead)
+{
+       struct clk *clkp, *_temp;
+
+       list_for_each_entry_safe(clkp, _temp, lhead, sibling) {
+               if (clkp->recalc)
+                       clkp->recalc(clkp);
+               propagate_rate(&clkp->children);
+       }
+}
+
+/* returns current programmed clocks clock info structure */
+static struct pclk_info *pclk_info_get(struct clk *clk)
+{
+       unsigned int mask, i;
+       unsigned long flags;
+       struct pclk_info *info = NULL;
+
+       spin_lock_irqsave(&clocks_lock, flags);
+       mask = (readl(clk->pclk_sel->pclk_sel_reg) >> clk->pclk_sel_shift)
+                       & clk->pclk_sel->pclk_sel_mask;
+
+       for (i = 0; i < clk->pclk_sel->pclk_count; i++) {
+               if (clk->pclk_sel->pclk_info[i].pclk_mask == mask)
+                       info = &clk->pclk_sel->pclk_info[i];
+       }
+       spin_unlock_irqrestore(&clocks_lock, flags);
+
+       return info;
+}
+
+/*
+ * Set pclk as cclk's parent and add clock sibling node to current parents
+ * children list
+ */
+static void change_parent(struct clk *cclk, struct clk *pclk)
+{
+       unsigned long flags;
+
+       spin_lock_irqsave(&clocks_lock, flags);
+       list_del(&cclk->sibling);
+       list_add(&cclk->sibling, &pclk->children);
+
+       cclk->pclk = pclk;
+       spin_unlock_irqrestore(&clocks_lock, flags);
+}
+
+/*
+ * calculates current programmed rate of pll1
+ *
+ * In normal mode
+ * rate = (2 * M[15:8] * Fin)/(N * 2^P)
+ *
+ * In Dithered mode
+ * rate = (2 * M[15:0] * Fin)/(256 * N * 2^P)
+ */
+void pll1_clk_recalc(struct clk *clk)
+{
+       struct pll_clk_config *config = clk->private_data;
+       unsigned int num = 2, den = 0, val, mode = 0;
+       unsigned long flags;
+
+       spin_lock_irqsave(&clocks_lock, flags);
+       mode = (readl(config->mode_reg) >> PLL_MODE_SHIFT) &
+               PLL_MODE_MASK;
+
+       val = readl(config->cfg_reg);
+       /* calculate denominator */
+       den = (val >> PLL_DIV_P_SHIFT) & PLL_DIV_P_MASK;
+       den = 1 << den;
+       den *= (val >> PLL_DIV_N_SHIFT) & PLL_DIV_N_MASK;
+
+       /* calculate numerator & denominator */
+       if (!mode) {
+               /* Normal mode */
+               num *= (val >> PLL_NORM_FDBK_M_SHIFT) & PLL_NORM_FDBK_M_MASK;
+       } else {
+               /* Dithered mode */
+               num *= (val >> PLL_DITH_FDBK_M_SHIFT) & PLL_DITH_FDBK_M_MASK;
+               den *= 256;
+       }
+
+       clk->rate = (((clk->pclk->rate/10000) * num) / den) * 10000;
+       spin_unlock_irqrestore(&clocks_lock, flags);
+}
+
+/* calculates current programmed rate of ahb or apb bus */
+void bus_clk_recalc(struct clk *clk)
+{
+       struct bus_clk_config *config = clk->private_data;
+       unsigned int div;
+       unsigned long flags;
+
+       spin_lock_irqsave(&clocks_lock, flags);
+       div = ((readl(config->reg) >> config->shift) & config->mask) + 1;
+       clk->rate = (unsigned long)clk->pclk->rate / div;
+       spin_unlock_irqrestore(&clocks_lock, flags);
+}
+
+/*
+ * calculates current programmed rate of auxiliary synthesizers
+ * used by: UART, FIRDA
+ *
+ * Fout from synthesizer can be given from two equations:
+ * Fout1 = (Fin * X/Y)/2
+ * Fout2 = Fin * X/Y
+ *
+ * Selection of eqn 1 or 2 is programmed in register
+ */
+void aux_clk_recalc(struct clk *clk)
+{
+       struct aux_clk_config *config = clk->private_data;
+       struct pclk_info *pclk_info = NULL;
+       unsigned int num = 1, den = 1, val, eqn;
+       unsigned long flags;
+
+       /* get current programmed parent */
+       pclk_info = pclk_info_get(clk);
+       if (!pclk_info) {
+               spin_lock_irqsave(&clocks_lock, flags);
+               clk->pclk = NULL;
+               clk->rate = 0;
+               spin_unlock_irqrestore(&clocks_lock, flags);
+               return;
+       }
+
+       change_parent(clk, pclk_info->pclk);
+
+       spin_lock_irqsave(&clocks_lock, flags);
+       if (pclk_info->scalable) {
+               val = readl(config->synth_reg);
+
+               eqn = (val >> AUX_EQ_SEL_SHIFT) & AUX_EQ_SEL_MASK;
+               if (eqn == AUX_EQ1_SEL)
+                       den *= 2;
+
+               /* calculate numerator */
+               num = (val >> AUX_XSCALE_SHIFT) & AUX_XSCALE_MASK;
+
+               /* calculate denominator */
+               den *= (val >> AUX_YSCALE_SHIFT) & AUX_YSCALE_MASK;
+               val = (((clk->pclk->rate/10000) * num) / den) * 10000;
+       } else
+               val = clk->pclk->rate;
+
+       clk->rate = val;
+       spin_unlock_irqrestore(&clocks_lock, flags);
+}
+
+/*
+ * calculates current programmed rate of gpt synthesizers
+ * Fout from synthesizer can be given from below equations:
+ * Fout= Fin/((2 ^ (N+1)) * (M+1))
+ */
+void gpt_clk_recalc(struct clk *clk)
+{
+       struct aux_clk_config *config = clk->private_data;
+       struct pclk_info *pclk_info = NULL;
+       unsigned int div = 1, val;
+       unsigned long flags;
+
+       pclk_info = pclk_info_get(clk);
+       if (!pclk_info) {
+               spin_lock_irqsave(&clocks_lock, flags);
+               clk->pclk = NULL;
+               clk->rate = 0;
+               spin_unlock_irqrestore(&clocks_lock, flags);
+               return;
+       }
+
+       change_parent(clk, pclk_info->pclk);
+
+       spin_lock_irqsave(&clocks_lock, flags);
+       if (pclk_info->scalable) {
+               val = readl(config->synth_reg);
+               div += (val >> GPT_MSCALE_SHIFT) & GPT_MSCALE_MASK;
+               div *= 1 << (((val >> GPT_NSCALE_SHIFT) & GPT_NSCALE_MASK) + 1);
+       }
+
+       clk->rate = (unsigned long)clk->pclk->rate / div;
+       spin_unlock_irqrestore(&clocks_lock, flags);
+}
+
+/*
+ * Used for clocks that always have same value as the parent clock divided by a
+ * fixed divisor
+ */
+void follow_parent(struct clk *clk)
+{
+       unsigned long flags;
+
+       spin_lock_irqsave(&clocks_lock, flags);
+       clk->rate = clk->pclk->rate;
+       spin_unlock_irqrestore(&clocks_lock, flags);
+}
+
+/**
+ * recalc_root_clocks - recalculate and propagate all root clocks
+ *
+ * Recalculates all root clocks (clocks with no parent), which if the
+ * clock's .recalc is set correctly, should also propagate their rates.
+ */
+void recalc_root_clocks(void)
+{
+       propagate_rate(&root_clks);
+}
diff --git a/arch/arm/plat-spear/include/plat/clkdev.h b/arch/arm/plat-spear/include/plat/clkdev.h
new file mode 100644 (file)
index 0000000..a2d0112
--- /dev/null
@@ -0,0 +1,20 @@
+/*
+ * arch/arm/plat-spear/include/plat/clkdev.h
+ *
+ * Clock Dev framework definitions for SPEAr platform
+ *
+ * Copyright (C) 2009 ST Microelectronics
+ * Viresh Kumar<viresh.kumar@st.com>
+ *
+ * This file is licensed under the terms of the GNU General Public
+ * License version 2. This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+ */
+
+#ifndef __PLAT_CLKDEV_H
+#define __PLAT_CLKDEV_H
+
+#define __clk_get(clk) ({ 1; })
+#define __clk_put(clk) do { } while (0)
+
+#endif /* __PLAT_CLKDEV_H */
diff --git a/arch/arm/plat-spear/include/plat/clock.h b/arch/arm/plat-spear/include/plat/clock.h
new file mode 100644 (file)
index 0000000..298bafc
--- /dev/null
@@ -0,0 +1,126 @@
+/*
+ * arch/arm/plat-spear/include/plat/clock.h
+ *
+ * Clock framework definitions for SPEAr platform
+ *
+ * Copyright (C) 2009 ST Microelectronics
+ * Viresh Kumar<viresh.kumar@st.com>
+ *
+ * This file is licensed under the terms of the GNU General Public
+ * License version 2. This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+ */
+
+#ifndef __PLAT_CLOCK_H
+#define __PLAT_CLOCK_H
+
+#include <linux/list.h>
+#include <asm/clkdev.h>
+#include <linux/types.h>
+
+/* clk structure flags */
+#define        ALWAYS_ENABLED          (1 << 0) /* clock always enabled */
+#define        RESET_TO_ENABLE         (1 << 1) /* reset register bit to enable clk */
+
+/**
+ * struct clkops - clock operations
+ * @enable: pointer to clock enable function
+ * @disable: pointer to clock disable function
+ */
+struct clkops {
+       int (*enable) (struct clk *);
+       void (*disable) (struct clk *);
+};
+
+/**
+ * struct pclk_info - parents info
+ * @pclk: pointer to parent clk
+ * @pclk_mask: value to be written for selecting this parent
+ * @scalable: Is parent scalable (1 - YES, 0 - NO)
+ */
+struct pclk_info {
+       struct clk *pclk;
+       u8 pclk_mask;
+       u8 scalable;
+};
+
+/**
+ * struct pclk_sel - parents selection configuration
+ * @pclk_info: pointer to array of parent clock info
+ * @pclk_count: number of parents
+ * @pclk_sel_reg: register for selecting a parent
+ * @pclk_sel_mask: mask for selecting parent (can be used to clear bits also)
+ */
+struct pclk_sel {
+       struct pclk_info *pclk_info;
+       u8 pclk_count;
+       unsigned int *pclk_sel_reg;
+       unsigned int pclk_sel_mask;
+};
+
+/**
+ * struct clk - clock structure
+ * @usage_count: num of users who enabled this clock
+ * @flags: flags for clock properties
+ * @rate: programmed clock rate in Hz
+ * @en_reg: clk enable/disable reg
+ * @en_reg_bit: clk enable/disable bit
+ * @ops: clk enable/disable ops - generic_clkops selected if NULL
+ * @recalc: pointer to clock rate recalculate function
+ * @pclk: current parent clk
+ * @pclk_sel: pointer to parent selection structure
+ * @pclk_sel_shift: register shift for selecting parent of this clock
+ * @children: list for childrens or this clock
+ * @sibling: node for list of clocks having same parents
+ * @private_data: clock specific private data
+ */
+struct clk {
+       unsigned int usage_count;
+       unsigned int flags;
+       unsigned long rate;
+       unsigned int *en_reg;
+       u8 en_reg_bit;
+       const struct clkops *ops;
+       void (*recalc) (struct clk *);
+
+       struct clk *pclk;
+       struct pclk_sel *pclk_sel;
+       unsigned int pclk_sel_shift;
+
+       struct list_head children;
+       struct list_head sibling;
+       void *private_data;
+};
+
+/* pll configuration structure */
+struct pll_clk_config {
+       unsigned int *mode_reg;
+       unsigned int *cfg_reg;
+};
+
+/* ahb and apb bus configuration structure */
+struct bus_clk_config {
+       unsigned int *reg;
+       unsigned int mask;
+       unsigned int shift;
+};
+
+/*
+ * Aux clk configuration structure: applicable to GPT, UART and FIRDA
+ */
+struct aux_clk_config {
+       unsigned int *synth_reg;
+};
+
+/* platform specific clock functions */
+void clk_register(struct clk_lookup *cl);
+void recalc_root_clocks(void);
+
+/* clock recalc functions */
+void follow_parent(struct clk *clk);
+void pll1_clk_recalc(struct clk *clk);
+void bus_clk_recalc(struct clk *clk);
+void gpt_clk_recalc(struct clk *clk);
+void aux_clk_recalc(struct clk *clk);
+
+#endif /* __PLAT_CLOCK_H */
diff --git a/arch/arm/plat-spear/include/plat/debug-macro.S b/arch/arm/plat-spear/include/plat/debug-macro.S
new file mode 100644 (file)
index 0000000..1670734
--- /dev/null
@@ -0,0 +1,38 @@
+/*
+ * arch/arm/plat-spear/include/plat/debug-macro.S
+ *
+ * Debugging macro include header for spear platform
+ *
+ * Copyright (C) 2009 ST Microelectronics
+ * Viresh Kumar<viresh.kumar@st.com>
+ *
+ * This file is licensed under the terms of the GNU General Public
+ * License version 2. This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+ */
+
+#include <linux/amba/serial.h>
+#include <mach/spear.h>
+
+               .macro  addruart, rx
+               mrc     p15, 0, \rx, c1, c0
+               tst     \rx, #1                                 @ MMU enabled?
+               moveq   \rx, =SPEAR_DBG_UART_BASE               @ Physical base
+               movne   \rx, =VA_SPEAR_DBG_UART_BASE            @ Virtual base
+               .endm
+
+               .macro  senduart, rd, rx
+               strb    \rd, [\rx, #UART01x_DR]                 @ ASC_TX_BUFFER
+               .endm
+
+               .macro  waituart, rd, rx
+1001:          ldr     \rd, [\rx, #UART01x_FR]                 @ FLAG REGISTER
+               tst     \rd, #UART01x_FR_TXFF                   @ TX_FULL
+               bne     1001b
+               .endm
+
+               .macro  busyuart, rd, rx
+1002:          ldr     \rd, [\rx, #UART01x_FR]                 @ FLAG REGISTER
+               tst     \rd, #UART011_FR_TXFE                   @ TX_EMPTY
+               beq     1002b
+               .endm
diff --git a/arch/arm/plat-spear/include/plat/gpio.h b/arch/arm/plat-spear/include/plat/gpio.h
new file mode 100644 (file)
index 0000000..b857c91
--- /dev/null
@@ -0,0 +1,24 @@
+/*
+ * arch/arm/plat-spear/include/plat/gpio.h
+ *
+ * GPIO macros for SPEAr platform
+ *
+ * Copyright (C) 2009 ST Microelectronics
+ * Viresh Kumar<viresh.kumar@st.com>
+ *
+ * This file is licensed under the terms of the GNU General Public
+ * License version 2. This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+ */
+
+#ifndef __PLAT_GPIO_H
+#define __PLAT_GPIO_H
+
+#include <asm-generic/gpio.h>
+
+#define gpio_get_value __gpio_get_value
+#define gpio_set_value __gpio_set_value
+#define gpio_cansleep  __gpio_cansleep
+#define gpio_to_irq    __gpio_to_irq
+
+#endif /* __PLAT_GPIO_H */
diff --git a/arch/arm/plat-spear/include/plat/io.h b/arch/arm/plat-spear/include/plat/io.h
new file mode 100644 (file)
index 0000000..4d4ba82
--- /dev/null
@@ -0,0 +1,22 @@
+/*
+ * arch/arm/plat-spear/include/plat/io.h
+ *
+ * IO definitions for SPEAr platform
+ *
+ * Copyright (C) 2009 ST Microelectronics
+ * Viresh Kumar<viresh.kumar@st.com>
+ *
+ * This file is licensed under the terms of the GNU General Public
+ * License version 2. This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+ */
+
+#ifndef __PLAT_IO_H
+#define __PLAT_IO_H
+
+#define IO_SPACE_LIMIT         0xFFFFFFFF
+
+#define __io(a)                        __typesafe_io(a)
+#define __mem_pci(a)           (a)
+
+#endif /* __PLAT_IO_H */
diff --git a/arch/arm/plat-spear/include/plat/memory.h b/arch/arm/plat-spear/include/plat/memory.h
new file mode 100644 (file)
index 0000000..27a4aba
--- /dev/null
@@ -0,0 +1,20 @@
+/*
+ * arch/arm/plat-spear/include/plat/memory.h
+ *
+ * Memory map for SPEAr platform
+ *
+ * Copyright (C) 2009 ST Microelectronics
+ * Viresh Kumar<viresh.kumar@st.com>
+ *
+ * This file is licensed under the terms of the GNU General Public
+ * License version 2. This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+ */
+
+#ifndef __PLAT_MEMORY_H
+#define __PLAT_MEMORY_H
+
+/* Physical DRAM offset */
+#define PHYS_OFFSET            UL(0x00000000)
+
+#endif /* __PLAT_MEMORY_H */
diff --git a/arch/arm/plat-spear/include/plat/padmux.h b/arch/arm/plat-spear/include/plat/padmux.h
new file mode 100644 (file)
index 0000000..877f3ad
--- /dev/null
@@ -0,0 +1,92 @@
+/*
+ * arch/arm/plat-spear/include/plat/padmux.h
+ *
+ * SPEAr platform specific gpio pads muxing file
+ *
+ * Copyright (C) 2009 ST Microelectronics
+ * Viresh Kumar<viresh.kumar@st.com>
+ *
+ * This file is licensed under the terms of the GNU General Public
+ * License version 2. This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+ */
+
+#ifndef __PLAT_PADMUX_H
+#define __PLAT_PADMUX_H
+
+#include <linux/types.h>
+
+/*
+ * struct pmx_reg: configuration structure for mode reg and mux reg
+ *
+ * offset: offset of mode reg
+ * mask: mask of mode reg
+ */
+struct pmx_reg {
+       u32 offset;
+       u32 mask;
+};
+
+/*
+ * struct pmx_dev_mode: configuration structure every group of modes of a device
+ *
+ * ids: all modes for this configuration
+ * mask: mask for supported mode
+ */
+struct pmx_dev_mode {
+       u32 ids;
+       u32 mask;
+};
+
+/*
+ * struct pmx_mode: mode definition structure
+ *
+ * name: mode name
+ * mask: mode mask
+ */
+struct pmx_mode {
+       char *name;
+       u32 id;
+       u32 mask;
+};
+
+/*
+ * struct pmx_dev: device definition structure
+ *
+ * name: device name
+ * modes: device configuration array for different modes supported
+ * mode_count: size of modes array
+ * is_active: is peripheral active/enabled
+ * enb_on_reset: if 1, mask bits to be cleared in reg otherwise to be set in reg
+ */
+struct pmx_dev {
+       char *name;
+       struct pmx_dev_mode *modes;
+       u8 mode_count;
+       bool is_active;
+       bool enb_on_reset;
+};
+
+/*
+ * struct pmx_driver: driver definition structure
+ *
+ * mode: mode to be set
+ * devs: array of pointer to pmx devices
+ * devs_count: ARRAY_SIZE of devs
+ * base: base address of soc config registers
+ * mode_reg: structure of mode config register
+ * mux_reg: structure of device mux config register
+ */
+struct pmx_driver {
+       struct pmx_mode *mode;
+       struct pmx_dev **devs;
+       u8 devs_count;
+       u32 *base;
+       struct pmx_reg mode_reg;
+       struct pmx_reg mux_reg;
+};
+
+/* pmx functions */
+int pmx_register(struct pmx_driver *driver);
+
+#endif /* __PLAT_PADMUX_H */
diff --git a/arch/arm/plat-spear/include/plat/shirq.h b/arch/arm/plat-spear/include/plat/shirq.h
new file mode 100644 (file)
index 0000000..03ed8b5
--- /dev/null
@@ -0,0 +1,73 @@
+/*
+ * arch/arm/plat-spear/include/plat/shirq.h
+ *
+ * SPEAr platform shared irq layer header file
+ *
+ * Copyright (C) 2009 ST Microelectronics
+ * Viresh Kumar<viresh.kumar@st.com>
+ *
+ * This file is licensed under the terms of the GNU General Public
+ * License version 2. This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+ */
+
+#ifndef __PLAT_SHIRQ_H
+#define __PLAT_SHIRQ_H
+
+#include <linux/irq.h>
+#include <linux/types.h>
+
+/*
+ * struct shirq_dev_config: shared irq device configuration
+ *
+ * virq: virtual irq number of device
+ * enb_mask: enable mask of device
+ * status_mask: status mask of device
+ * clear_mask: clear mask of device
+ */
+struct shirq_dev_config {
+       u32 virq;
+       u32 enb_mask;
+       u32 status_mask;
+       u32 clear_mask;
+};
+
+/*
+ * struct shirq_regs: shared irq register configuration
+ *
+ * base: base address of shared irq register
+ * enb_reg: enable register offset
+ * reset_to_enb: val 1 indicates, we need to clear bit for enabling interrupt
+ * status_reg: status register offset
+ * status_reg_mask: status register valid mask
+ * clear_reg: clear register offset
+ * reset_to_clear: val 1 indicates, we need to clear bit for clearing interrupt
+ */
+struct shirq_regs {
+       void __iomem *base;
+       u32 enb_reg;
+       u32 reset_to_enb;
+       u32 status_reg;
+       u32 status_reg_mask;
+       u32 clear_reg;
+       u32 reset_to_clear;
+};
+
+/*
+ * struct spear_shirq: shared irq structure
+ *
+ * irq: hardware irq number
+ * dev_config: array of device config structures which are using "irq" line
+ * dev_count: size of dev_config array
+ * regs: register configuration for shared irq block
+ */
+struct spear_shirq {
+       u32 irq;
+       struct shirq_dev_config *dev_config;
+       u32 dev_count;
+       struct shirq_regs regs;
+};
+
+int spear_shirq_register(struct spear_shirq *shirq);
+
+#endif /* __PLAT_SHIRQ_H */
diff --git a/arch/arm/plat-spear/include/plat/system.h b/arch/arm/plat-spear/include/plat/system.h
new file mode 100644 (file)
index 0000000..55a4e40
--- /dev/null
@@ -0,0 +1,41 @@
+/*
+ * arch/arm/plat-spear/include/plat/system.h
+ *
+ * SPEAr platform specific architecture functions
+ *
+ * Copyright (C) 2009 ST Microelectronics
+ * Viresh Kumar<viresh.kumar@st.com>
+ *
+ * This file is licensed under the terms of the GNU General Public
+ * License version 2. This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+ */
+
+#ifndef __PLAT_SYSTEM_H
+#define __PLAT_SYSTEM_H
+
+#include <asm/hardware/sp810.h>
+#include <linux/io.h>
+#include <mach/spear.h>
+
+static inline void arch_idle(void)
+{
+       /*
+        * This should do all the clock switching
+        * and wait for interrupt tricks
+        */
+       cpu_do_idle();
+}
+
+static inline void arch_reset(char mode, const char *cmd)
+{
+       if (mode == 's') {
+               /* software reset, Jump into ROM at address 0 */
+               cpu_reset(0);
+       } else {
+               /* hardware reset, Use on-chip reset capability */
+               sysctl_soft_reset((void __iomem *)VA_SPEAR_SYS_CTRL_BASE);
+       }
+}
+
+#endif /* __PLAT_SYSTEM_H */
diff --git a/arch/arm/plat-spear/include/plat/timex.h b/arch/arm/plat-spear/include/plat/timex.h
new file mode 100644 (file)
index 0000000..914d09d
--- /dev/null
@@ -0,0 +1,19 @@
+/*
+ * arch/arm/plat-spear/include/plat/timex.h
+ *
+ * SPEAr platform specific timex definitions
+ *
+ * Copyright (C) 2009 ST Microelectronics
+ * Viresh Kumar<viresh.kumar@st.com>
+ *
+ * This file is licensed under the terms of the GNU General Public
+ * License version 2. This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+ */
+
+#ifndef __PLAT_TIMEX_H
+#define __PLAT_TIMEX_H
+
+#define CLOCK_TICK_RATE                        48000000
+
+#endif /* __PLAT_TIMEX_H */
diff --git a/arch/arm/plat-spear/include/plat/uncompress.h b/arch/arm/plat-spear/include/plat/uncompress.h
new file mode 100644 (file)
index 0000000..99ba678
--- /dev/null
@@ -0,0 +1,43 @@
+/*
+ * arch/arm/plat-spear/include/plat/uncompress.h
+ *
+ * Serial port stubs for kernel decompress status messages
+ *
+ * Copyright (C) 2009 ST Microelectronics
+ * Viresh Kumar<viresh.kumar@st.com>
+ *
+ * This file is licensed under the terms of the GNU General Public
+ * License version 2. This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+ */
+
+#include <linux/io.h>
+#include <linux/amba/serial.h>
+#include <mach/spear.h>
+
+#ifndef __PLAT_UNCOMPRESS_H
+#define __PLAT_UNCOMPRESS_H
+/*
+ * This does not append a newline
+ */
+static inline void putc(int c)
+{
+       void __iomem *base = (void __iomem *)SPEAR_DBG_UART_BASE;
+
+       while (readl(base + UART01x_FR) & UART01x_FR_TXFF)
+               barrier();
+
+       writel(c, base + UART01x_DR);
+}
+
+static inline void flush(void)
+{
+}
+
+/*
+ * nothing to do
+ */
+#define arch_decomp_setup()
+#define arch_decomp_wdog()
+
+#endif /* __PLAT_UNCOMPRESS_H */
diff --git a/arch/arm/plat-spear/include/plat/vmalloc.h b/arch/arm/plat-spear/include/plat/vmalloc.h
new file mode 100644 (file)
index 0000000..09e9372
--- /dev/null
@@ -0,0 +1,19 @@
+/*
+ * arch/arm/plat-spear/include/plat/vmalloc.h
+ *
+ * Defining Vmalloc area for SPEAr platform
+ *
+ * Copyright (C) 2009 ST Microelectronics
+ * Viresh Kumar<viresh.kumar@st.com>
+ *
+ * This file is licensed under the terms of the GNU General Public
+ * License version 2. This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+ */
+
+#ifndef __PLAT_VMALLOC_H
+#define __PLAT_VMALLOC_H
+
+#define VMALLOC_END            0xF0000000
+
+#endif /* __PLAT_VMALLOC_H */
diff --git a/arch/arm/plat-spear/padmux.c b/arch/arm/plat-spear/padmux.c
new file mode 100644 (file)
index 0000000..d2aab3a
--- /dev/null
@@ -0,0 +1,164 @@
+/*
+ * arch/arm/plat-spear/include/plat/padmux.c
+ *
+ * SPEAr platform specific gpio pads muxing source file
+ *
+ * Copyright (C) 2009 ST Microelectronics
+ * Viresh Kumar<viresh.kumar@st.com>
+ *
+ * This file is licensed under the terms of the GNU General Public
+ * License version 2. This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+ */
+
+#include <linux/err.h>
+#include <linux/io.h>
+#include <linux/slab.h>
+#include <plat/padmux.h>
+
+/*
+ * struct pmx: pmx definition structure
+ *
+ * base: base address of configuration registers
+ * mode_reg: mode configurations
+ * mux_reg: muxing configurations
+ * active_mode: pointer to current active mode
+ */
+struct pmx {
+       u32 base;
+       struct pmx_reg mode_reg;
+       struct pmx_reg mux_reg;
+       struct pmx_mode *active_mode;
+};
+
+static struct pmx *pmx;
+
+/**
+ * pmx_mode_set - Enables an multiplexing mode
+ * @mode - pointer to pmx mode
+ *
+ * It will set mode of operation in hardware.
+ * Returns -ve on Err otherwise 0
+ */
+static int pmx_mode_set(struct pmx_mode *mode)
+{
+       u32 val;
+
+       if (!mode->name)
+               return -EFAULT;
+
+       pmx->active_mode = mode;
+
+       val = readl(pmx->base + pmx->mode_reg.offset);
+       val &= ~pmx->mode_reg.mask;
+       val |= mode->mask & pmx->mode_reg.mask;
+       writel(val, pmx->base + pmx->mode_reg.offset);
+
+       return 0;
+}
+
+/**
+ * pmx_devs_enable - Enables list of devices
+ * @devs - pointer to pmx device array
+ * @count - number of devices to enable
+ *
+ * It will enable pads for all required peripherals once and only once.
+ * If peripheral is not supported by current mode then request is rejected.
+ * Conflicts between peripherals are not handled and peripherals will be
+ * enabled in the order they are present in pmx_dev array.
+ * In case of conflicts last peripheral enalbed will be present.
+ * Returns -ve on Err otherwise 0
+ */
+static int pmx_devs_enable(struct pmx_dev **devs, u8 count)
+{
+       u32 val, i, mask;
+
+       if (!count)
+               return -EINVAL;
+
+       val = readl(pmx->base + pmx->mux_reg.offset);
+       for (i = 0; i < count; i++) {
+               u8 j = 0;
+
+               if (!devs[i]->name || !devs[i]->modes) {
+                       printk(KERN_ERR "padmux: dev name or modes is null\n");
+                       continue;
+               }
+               /* check if peripheral exists in active mode */
+               if (pmx->active_mode) {
+                       bool found = false;
+                       for (j = 0; j < devs[i]->mode_count; j++) {
+                               if (devs[i]->modes[j].ids &
+                                               pmx->active_mode->id) {
+                                       found = true;
+                                       break;
+                               }
+                       }
+                       if (found == false) {
+                               printk(KERN_ERR "%s device not available in %s"\
+                                               "mode\n", devs[i]->name,
+                                               pmx->active_mode->name);
+                               continue;
+                       }
+               }
+
+               /* enable peripheral */
+               mask = devs[i]->modes[j].mask & pmx->mux_reg.mask;
+               if (devs[i]->enb_on_reset)
+                       val &= ~mask;
+               else
+                       val |= mask;
+
+               devs[i]->is_active = true;
+       }
+       writel(val, pmx->base + pmx->mux_reg.offset);
+       kfree(pmx);
+
+       /* this will ensure that multiplexing can't be changed now */
+       pmx = (struct pmx *)-1;
+
+       return 0;
+}
+
+/**
+ * pmx_register - registers a platform requesting pad mux feature
+ * @driver - pointer to driver structure containing driver specific parameters
+ *
+ * Also this must be called only once. This will allocate memory for pmx
+ * structure, will call pmx_mode_set, will call pmx_devs_enable.
+ * Returns -ve on Err otherwise 0
+ */
+int pmx_register(struct pmx_driver *driver)
+{
+       int ret = 0;
+
+       if (pmx)
+               return -EPERM;
+       if (!driver->base || !driver->devs)
+               return -EFAULT;
+
+       pmx = kzalloc(sizeof(*pmx), GFP_KERNEL);
+       if (!pmx)
+               return -ENOMEM;
+
+       pmx->base = (u32)driver->base;
+       pmx->mode_reg.offset = driver->mode_reg.offset;
+       pmx->mode_reg.mask = driver->mode_reg.mask;
+       pmx->mux_reg.offset = driver->mux_reg.offset;
+       pmx->mux_reg.mask = driver->mux_reg.mask;
+
+       /* choose mode to enable */
+       if (driver->mode) {
+               ret = pmx_mode_set(driver->mode);
+               if (ret)
+                       goto pmx_fail;
+       }
+       ret = pmx_devs_enable(driver->devs, driver->devs_count);
+       if (ret)
+               goto pmx_fail;
+
+       return 0;
+
+pmx_fail:
+       return ret;
+}
diff --git a/arch/arm/plat-spear/shirq.c b/arch/arm/plat-spear/shirq.c
new file mode 100644 (file)
index 0000000..2172d69
--- /dev/null
@@ -0,0 +1,118 @@
+/*
+ * arch/arm/plat-spear/shirq.c
+ *
+ * SPEAr platform shared irq layer source file
+ *
+ * Copyright (C) 2009 ST Microelectronics
+ * Viresh Kumar<viresh.kumar@st.com>
+ *
+ * This file is licensed under the terms of the GNU General Public
+ * License version 2. This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+ */
+
+#include <linux/err.h>
+#include <linux/io.h>
+#include <linux/irq.h>
+#include <linux/spinlock.h>
+#include <plat/shirq.h>
+
+struct spear_shirq *shirq;
+static DEFINE_SPINLOCK(lock);
+
+static void shirq_irq_mask(unsigned irq)
+{
+       struct spear_shirq *shirq = get_irq_chip_data(irq);
+       u32 val, id = irq - shirq->dev_config[0].virq;
+       unsigned long flags;
+
+       if ((shirq->regs.enb_reg == -1) || shirq->dev_config[id].enb_mask == -1)
+               return;
+
+       spin_lock_irqsave(&lock, flags);
+       val = readl(shirq->regs.base + shirq->regs.enb_reg);
+       if (shirq->regs.reset_to_enb)
+               val |= shirq->dev_config[id].enb_mask;
+       else
+               val &= ~(shirq->dev_config[id].enb_mask);
+       writel(val, shirq->regs.base + shirq->regs.enb_reg);
+       spin_unlock_irqrestore(&lock, flags);
+}
+
+static void shirq_irq_unmask(unsigned irq)
+{
+       struct spear_shirq *shirq = get_irq_chip_data(irq);
+       u32 val, id = irq - shirq->dev_config[0].virq;
+       unsigned long flags;
+
+       if ((shirq->regs.enb_reg == -1) || shirq->dev_config[id].enb_mask == -1)
+               return;
+
+       spin_lock_irqsave(&lock, flags);
+       val = readl(shirq->regs.base + shirq->regs.enb_reg);
+       if (shirq->regs.reset_to_enb)
+               val &= ~(shirq->dev_config[id].enb_mask);
+       else
+               val |= shirq->dev_config[id].enb_mask;
+       writel(val, shirq->regs.base + shirq->regs.enb_reg);
+       spin_unlock_irqrestore(&lock, flags);
+}
+
+static struct irq_chip shirq_chip = {
+       .name           = "spear_shirq",
+       .ack            = shirq_irq_mask,
+       .mask           = shirq_irq_mask,
+       .unmask         = shirq_irq_unmask,
+};
+
+static void shirq_handler(unsigned irq, struct irq_desc *desc)
+{
+       u32 i, val, mask;
+       struct spear_shirq *shirq = get_irq_data(irq);
+
+       desc->chip->ack(irq);
+       while ((val = readl(shirq->regs.base + shirq->regs.status_reg) &
+                               shirq->regs.status_reg_mask)) {
+               for (i = 0; (i < shirq->dev_count) && val; i++) {
+                       if (!(shirq->dev_config[i].status_mask & val))
+                               continue;
+
+                       generic_handle_irq(shirq->dev_config[i].virq);
+
+                       /* clear interrupt */
+                       val &= ~shirq->dev_config[i].status_mask;
+                       if ((shirq->regs.clear_reg == -1) ||
+                                       shirq->dev_config[i].clear_mask == -1)
+                               continue;
+                       mask = readl(shirq->regs.base + shirq->regs.clear_reg);
+                       if (shirq->regs.reset_to_clear)
+                               mask &= ~shirq->dev_config[i].clear_mask;
+                       else
+                               mask |= shirq->dev_config[i].clear_mask;
+                       writel(mask, shirq->regs.base + shirq->regs.clear_reg);
+               }
+       }
+       desc->chip->unmask(irq);
+}
+
+int spear_shirq_register(struct spear_shirq *shirq)
+{
+       int i;
+
+       if (!shirq || !shirq->dev_config || !shirq->regs.base)
+               return -EFAULT;
+
+       if (!shirq->dev_count)
+               return -EINVAL;
+
+       set_irq_chained_handler(shirq->irq, shirq_handler);
+       for (i = 0; i < shirq->dev_count; i++) {
+               set_irq_chip(shirq->dev_config[i].virq, &shirq_chip);
+               set_irq_handler(shirq->dev_config[i].virq, handle_simple_irq);
+               set_irq_flags(shirq->dev_config[i].virq, IRQF_VALID);
+               set_irq_chip_data(shirq->dev_config[i].virq, shirq);
+       }
+
+       set_irq_data(shirq->irq, shirq);
+       return 0;
+}
diff --git a/arch/arm/plat-spear/time.c b/arch/arm/plat-spear/time.c
new file mode 100644 (file)
index 0000000..a1025d3
--- /dev/null
@@ -0,0 +1,292 @@
+/*
+ * arch/arm/plat-spear/time.c
+ *
+ * Copyright (C) 2009 ST Microelectronics
+ * Shiraz Hashim<shiraz.hashim@st.com>
+ *
+ * This file is licensed under the terms of the GNU General Public
+ * License version 2. This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+ */
+
+#include <linux/clk.h>
+#include <linux/clockchips.h>
+#include <linux/clocksource.h>
+#include <linux/err.h>
+#include <linux/init.h>
+#include <linux/interrupt.h>
+#include <linux/io.h>
+#include <linux/kernel.h>
+#include <linux/time.h>
+#include <linux/irq.h>
+#include <asm/mach/time.h>
+#include <mach/irqs.h>
+#include <mach/hardware.h>
+#include <mach/spear.h>
+#include <mach/generic.h>
+
+/*
+ * We would use TIMER0 and TIMER1 as clockevent and clocksource.
+ * Timer0 and Timer1 both belong to same gpt block in cpu subbsystem. Further
+ * they share same functional clock. Any change in one's functional clock will
+ * also affect other timer.
+ */
+
+#define CLKEVT 0       /* gpt0, channel0 as clockevent */
+#define CLKSRC 1       /* gpt0, channel1 as clocksource */
+
+/* Register offsets, x is channel number */
+#define CR(x)          ((x) * 0x80 + 0x80)
+#define IR(x)          ((x) * 0x80 + 0x84)
+#define LOAD(x)                ((x) * 0x80 + 0x88)
+#define COUNT(x)       ((x) * 0x80 + 0x8C)
+
+/* Reg bit definitions */
+#define CTRL_INT_ENABLE                0x0100
+#define CTRL_ENABLE            0x0020
+#define CTRL_ONE_SHOT          0x0010
+
+#define CTRL_PRESCALER1                0x0
+#define CTRL_PRESCALER2                0x1
+#define CTRL_PRESCALER4                0x2
+#define CTRL_PRESCALER8                0x3
+#define CTRL_PRESCALER16       0x4
+#define CTRL_PRESCALER32       0x5
+#define CTRL_PRESCALER64       0x6
+#define CTRL_PRESCALER128      0x7
+#define CTRL_PRESCALER256      0x8
+
+#define INT_STATUS             0x1
+
+static __iomem void *gpt_base;
+static struct clk *gpt_clk;
+
+static void clockevent_set_mode(enum clock_event_mode mode,
+                               struct clock_event_device *clk_event_dev);
+static int clockevent_next_event(unsigned long evt,
+                                struct clock_event_device *clk_event_dev);
+
+/*
+ * Following clocksource_set_clock and clockevent_set_clock picked
+ * from arch/mips/kernel/time.c
+ */
+
+void __init clocksource_set_clock(struct clocksource *cs, unsigned int clock)
+{
+       u64 temp;
+       u32 shift;
+
+       /* Find a shift value */
+       for (shift = 32; shift > 0; shift--) {
+               temp = (u64) NSEC_PER_SEC << shift;
+               do_div(temp, clock);
+               if ((temp >> 32) == 0)
+                       break;
+       }
+       cs->shift = shift;
+       cs->mult = (u32) temp;
+}
+
+void __init clockevent_set_clock(struct clock_event_device *cd,
+       unsigned int clock)
+{
+       u64 temp;
+       u32 shift;
+
+       /* Find a shift value */
+       for (shift = 32; shift > 0; shift--) {
+               temp = (u64) clock << shift;
+               do_div(temp, NSEC_PER_SEC);
+               if ((temp >> 32) == 0)
+                       break;
+       }
+       cd->shift = shift;
+       cd->mult = (u32) temp;
+}
+
+static cycle_t clocksource_read_cycles(struct clocksource *cs)
+{
+       return (cycle_t) readw(gpt_base + COUNT(CLKSRC));
+}
+
+static struct clocksource clksrc = {
+       .name = "tmr1",
+       .rating = 200,          /* its a pretty decent clock */
+       .read = clocksource_read_cycles,
+       .mask = 0xFFFF,         /* 16 bits */
+       .mult = 0,              /* to be computed */
+       .shift = 0,             /* to be computed */
+       .flags = CLOCK_SOURCE_IS_CONTINUOUS,
+};
+
+static void spear_clocksource_init(void)
+{
+       u32 tick_rate;
+       u16 val;
+
+       /* program the prescaler (/256)*/
+       writew(CTRL_PRESCALER256, gpt_base + CR(CLKSRC));
+
+       /* find out actual clock driving Timer */
+       tick_rate = clk_get_rate(gpt_clk);
+       tick_rate >>= CTRL_PRESCALER256;
+
+       writew(0xFFFF, gpt_base + LOAD(CLKSRC));
+
+       val = readw(gpt_base + CR(CLKSRC));
+       val &= ~CTRL_ONE_SHOT;  /* autoreload mode */
+       val |= CTRL_ENABLE ;
+       writew(val, gpt_base + CR(CLKSRC));
+
+       clocksource_set_clock(&clksrc, tick_rate);
+
+       /* register the clocksource */
+       clocksource_register(&clksrc);
+}
+
+static struct clock_event_device clkevt = {
+       .name = "tmr0",
+       .features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT,
+       .set_mode = clockevent_set_mode,
+       .set_next_event = clockevent_next_event,
+       .shift = 0,     /* to be computed */
+};
+
+static void clockevent_set_mode(enum clock_event_mode mode,
+                               struct clock_event_device *clk_event_dev)
+{
+       u32 period;
+       u16 val;
+
+       /* stop the timer */
+       val = readw(gpt_base + CR(CLKEVT));
+       val &= ~CTRL_ENABLE;
+       writew(val, gpt_base + CR(CLKEVT));
+
+       switch (mode) {
+       case CLOCK_EVT_MODE_PERIODIC:
+               period = clk_get_rate(gpt_clk) / HZ;
+               period >>= CTRL_PRESCALER16;
+               writew(period, gpt_base + LOAD(CLKEVT));
+
+               val = readw(gpt_base + CR(CLKEVT));
+               val &= ~CTRL_ONE_SHOT;
+               val |= CTRL_ENABLE | CTRL_INT_ENABLE;
+               writew(val, gpt_base + CR(CLKEVT));
+
+               break;
+       case CLOCK_EVT_MODE_ONESHOT:
+               val = readw(gpt_base + CR(CLKEVT));
+               val |= CTRL_ONE_SHOT;
+               writew(val, gpt_base + CR(CLKEVT));
+
+               break;
+       case CLOCK_EVT_MODE_UNUSED:
+       case CLOCK_EVT_MODE_SHUTDOWN:
+       case CLOCK_EVT_MODE_RESUME:
+
+               break;
+       default:
+               pr_err("Invalid mode requested\n");
+               break;
+       }
+}
+
+static int clockevent_next_event(unsigned long cycles,
+                                struct clock_event_device *clk_event_dev)
+{
+       u16 val;
+
+       writew(cycles, gpt_base + LOAD(CLKEVT));
+
+       val = readw(gpt_base + CR(CLKEVT));
+       val |= CTRL_ENABLE | CTRL_INT_ENABLE;
+       writew(val, gpt_base + CR(CLKEVT));
+
+       return 0;
+}
+
+static irqreturn_t spear_timer_interrupt(int irq, void *dev_id)
+{
+       struct clock_event_device *evt = &clkevt;
+
+       writew(INT_STATUS, gpt_base + IR(CLKEVT));
+
+       evt->event_handler(evt);
+
+       return IRQ_HANDLED;
+}
+
+static struct irqaction spear_timer_irq = {
+       .name = "timer",
+       .flags = IRQF_DISABLED | IRQF_TIMER,
+       .handler = spear_timer_interrupt
+};
+
+static void __init spear_clockevent_init(void)
+{
+       u32 tick_rate;
+
+       /* program the prescaler */
+       writew(CTRL_PRESCALER16, gpt_base + CR(CLKEVT));
+
+       tick_rate = clk_get_rate(gpt_clk);
+       tick_rate >>= CTRL_PRESCALER16;
+
+       clockevent_set_clock(&clkevt, tick_rate);
+
+       clkevt.max_delta_ns = clockevent_delta2ns(0xfff0,
+                       &clkevt);
+       clkevt.min_delta_ns = clockevent_delta2ns(3, &clkevt);
+
+       clkevt.cpumask = cpumask_of(0);
+
+       clockevents_register_device(&clkevt);
+
+       setup_irq(SPEAR_GPT0_CHAN0_IRQ, &spear_timer_irq);
+}
+
+void __init spear_setup_timer(void)
+{
+       struct clk *pll3_clk;
+
+       if (!request_mem_region(SPEAR_GPT0_BASE, SZ_1K, "gpt0")) {
+               pr_err("%s:cannot get IO addr\n", __func__);
+               return;
+       }
+
+       gpt_base = (void __iomem *)ioremap(SPEAR_GPT0_BASE, SZ_1K);
+       if (!gpt_base) {
+               pr_err("%s:ioremap failed for gpt\n", __func__);
+               goto err_mem;
+       }
+
+       gpt_clk = clk_get_sys("gpt0", NULL);
+       if (!gpt_clk) {
+               pr_err("%s:couldn't get clk for gpt\n", __func__);
+               goto err_iomap;
+       }
+
+       pll3_clk = clk_get(NULL, "pll3_48m_clk");
+       if (!pll3_clk) {
+               pr_err("%s:couldn't get PLL3 as parent for gpt\n", __func__);
+               goto err_iomap;
+       }
+
+       clk_set_parent(gpt_clk, pll3_clk);
+
+       spear_clockevent_init();
+       spear_clocksource_init();
+
+       return;
+
+err_iomap:
+       iounmap(gpt_base);
+
+err_mem:
+       release_mem_region(SPEAR_GPT0_BASE, SZ_1K);
+}
+
+struct sys_timer spear_sys_timer = {
+       .init = spear_setup_timer,
+};
diff --git a/arch/arm/plat-versatile/Makefile b/arch/arm/plat-versatile/Makefile
new file mode 100644 (file)
index 0000000..9b1a668
--- /dev/null
@@ -0,0 +1,4 @@
+obj-y  := clock.o
+obj-$(CONFIG_ARM_TIMER_SP804) += timer-sp.o
+obj-$(CONFIG_ARCH_REALVIEW) += sched-clock.o
+obj-$(CONFIG_ARCH_VERSATILE) += sched-clock.o
similarity index 59%
rename from arch/arm/mach-integrator/clock.c
rename to arch/arm/plat-versatile/clock.c
index 989ecf5..5c8b656 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  linux/arch/arm/mach-integrator/clock.c
+ *  linux/arch/arm/plat-versatile/clock.c
  *
  *  Copyright (C) 2004 ARM Limited.
  *  Written by Deep Blue Solutions Limited.
@@ -14,7 +14,8 @@
 #include <linux/clk.h>
 #include <linux/mutex.h>
 
-#include <asm/clkdev.h>
+#include <asm/hardware/icst.h>
+
 #include <mach/clkdev.h>
 
 int clk_enable(struct clk *clk)
@@ -36,24 +37,38 @@ EXPORT_SYMBOL(clk_get_rate);
 
 long clk_round_rate(struct clk *clk, unsigned long rate)
 {
-       struct icst525_vco vco;
-       vco = icst525_khz_to_vco(clk->params, rate / 1000);
-       return icst525_khz(clk->params, vco) * 1000;
+       long ret = -EIO;
+       if (clk->ops && clk->ops->round)
+               ret = clk->ops->round(clk, rate);
+       return ret;
 }
 EXPORT_SYMBOL(clk_round_rate);
 
 int clk_set_rate(struct clk *clk, unsigned long rate)
 {
        int ret = -EIO;
-
-       if (clk->setvco) {
-               struct icst525_vco vco;
-
-               vco = icst525_khz_to_vco(clk->params, rate / 1000);
-               clk->rate = icst525_khz(clk->params, vco) * 1000;
-               clk->setvco(clk, vco);
-               ret = 0;
-       }
+       if (clk->ops && clk->ops->set)
+               ret = clk->ops->set(clk, rate);
        return ret;
 }
 EXPORT_SYMBOL(clk_set_rate);
+
+long icst_clk_round(struct clk *clk, unsigned long rate)
+{
+       struct icst_vco vco;
+       vco = icst_hz_to_vco(clk->params, rate);
+       return icst_hz(clk->params, vco);
+}
+EXPORT_SYMBOL(icst_clk_round);
+
+int icst_clk_set(struct clk *clk, unsigned long rate)
+{
+       struct icst_vco vco;
+
+       vco = icst_hz_to_vco(clk->params, rate);
+       clk->rate = icst_hz(clk->params, vco);
+       clk->ops->setvco(clk, vco);
+
+       return 0;
+}
+EXPORT_SYMBOL(icst_clk_set);
diff --git a/arch/arm/plat-versatile/include/plat/clock.h b/arch/arm/plat-versatile/include/plat/clock.h
new file mode 100644 (file)
index 0000000..3cfb024
--- /dev/null
@@ -0,0 +1,15 @@
+#ifndef PLAT_CLOCK_H
+#define PLAT_CLOCK_H
+
+#include <asm/hardware/icst.h>
+
+struct clk_ops {
+       long    (*round)(struct clk *, unsigned long);
+       int     (*set)(struct clk *, unsigned long);
+       void    (*setvco)(struct clk *, struct icst_vco);
+};
+
+int icst_clk_set(struct clk *, unsigned long);
+long icst_clk_round(struct clk *, unsigned long);
+
+#endif
diff --git a/arch/arm/plat-versatile/include/plat/timer-sp.h b/arch/arm/plat-versatile/include/plat/timer-sp.h
new file mode 100644 (file)
index 0000000..21e75e3
--- /dev/null
@@ -0,0 +1,2 @@
+void sp804_clocksource_init(void __iomem *);
+void sp804_clockevents_init(void __iomem *, unsigned int);
diff --git a/arch/arm/plat-versatile/sched-clock.c b/arch/arm/plat-versatile/sched-clock.c
new file mode 100644 (file)
index 0000000..9768cf7
--- /dev/null
@@ -0,0 +1,53 @@
+/*
+ *  linux/arch/arm/plat-versatile/sched-clock.c
+ *
+ *  Copyright (C) 1999 - 2003 ARM Limited
+ *  Copyright (C) 2000 Deep Blue Solutions Ltd
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+#include <linux/cnt32_to_63.h>
+#include <linux/io.h>
+#include <asm/div64.h>
+
+#include <mach/hardware.h>
+#include <mach/platform.h>
+
+#ifdef VERSATILE_SYS_BASE
+#define REFCOUNTER     (__io_address(VERSATILE_SYS_BASE) + VERSATILE_SYS_24MHz_OFFSET)
+#endif
+
+#ifdef REALVIEW_SYS_BASE
+#define REFCOUNTER     (__io_address(REALVIEW_SYS_BASE) + REALVIEW_SYS_24MHz_OFFSET)
+#endif
+
+/*
+ * This is the Realview and Versatile sched_clock implementation.  This
+ * has a resolution of 41.7ns, and a maximum value of about 35583 days.
+ *
+ * The return value is guaranteed to be monotonic in that range as
+ * long as there is always less than 89 seconds between successive
+ * calls to this function.
+ */
+unsigned long long sched_clock(void)
+{
+       unsigned long long v = cnt32_to_63(readl(REFCOUNTER));
+
+       /* the <<1 gets rid of the cnt_32_to_63 top bit saving on a bic insn */
+       v *= 125<<1;
+       do_div(v, 3<<1);
+
+       return v;
+}
diff --git a/arch/arm/plat-versatile/timer-sp.c b/arch/arm/plat-versatile/timer-sp.c
new file mode 100644 (file)
index 0000000..fb0d1c2
--- /dev/null
@@ -0,0 +1,156 @@
+/*
+ *  linux/arch/arm/plat-versatile/timer-sp.c
+ *
+ *  Copyright (C) 1999 - 2003 ARM Limited
+ *  Copyright (C) 2000 Deep Blue Solutions Ltd
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+#include <linux/clocksource.h>
+#include <linux/clockchips.h>
+#include <linux/interrupt.h>
+#include <linux/irq.h>
+#include <linux/io.h>
+
+#include <asm/hardware/arm_timer.h>
+
+#include <plat/timer-sp.h>
+
+/*
+ * These timers are currently always setup to be clocked at 1MHz.
+ */
+#define TIMER_FREQ_KHZ (1000)
+#define TIMER_RELOAD   (TIMER_FREQ_KHZ * 1000 / HZ)
+
+static void __iomem *clksrc_base;
+
+static cycle_t sp804_read(struct clocksource *cs)
+{
+       return ~readl(clksrc_base + TIMER_VALUE);
+}
+
+static struct clocksource clocksource_sp804 = {
+       .name           = "timer3",
+       .rating         = 200,
+       .read           = sp804_read,
+       .mask           = CLOCKSOURCE_MASK(32),
+       .shift          = 20,
+       .flags          = CLOCK_SOURCE_IS_CONTINUOUS,
+};
+
+void __init sp804_clocksource_init(void __iomem *base)
+{
+       struct clocksource *cs = &clocksource_sp804;
+
+       clksrc_base = base;
+
+       /* setup timer 0 as free-running clocksource */
+       writel(0, clksrc_base + TIMER_CTRL);
+       writel(0xffffffff, clksrc_base + TIMER_LOAD);
+       writel(0xffffffff, clksrc_base + TIMER_VALUE);
+       writel(TIMER_CTRL_32BIT | TIMER_CTRL_ENABLE | TIMER_CTRL_PERIODIC,
+               clksrc_base + TIMER_CTRL);
+
+       cs->mult = clocksource_khz2mult(TIMER_FREQ_KHZ, cs->shift);
+       clocksource_register(cs);
+}
+
+
+static void __iomem *clkevt_base;
+
+/*
+ * IRQ handler for the timer
+ */
+static irqreturn_t sp804_timer_interrupt(int irq, void *dev_id)
+{
+       struct clock_event_device *evt = dev_id;
+
+       /* clear the interrupt */
+       writel(1, clkevt_base + TIMER_INTCLR);
+
+       evt->event_handler(evt);
+
+       return IRQ_HANDLED;
+}
+
+static void sp804_set_mode(enum clock_event_mode mode,
+       struct clock_event_device *evt)
+{
+       unsigned long ctrl = TIMER_CTRL_32BIT | TIMER_CTRL_IE;
+
+       writel(ctrl, clkevt_base + TIMER_CTRL);
+
+       switch (mode) {
+       case CLOCK_EVT_MODE_PERIODIC:
+               writel(TIMER_RELOAD, clkevt_base + TIMER_LOAD);
+               ctrl |= TIMER_CTRL_PERIODIC | TIMER_CTRL_ENABLE;
+               break;
+
+       case CLOCK_EVT_MODE_ONESHOT:
+               /* period set, and timer enabled in 'next_event' hook */
+               ctrl |= TIMER_CTRL_ONESHOT;
+               break;
+
+       case CLOCK_EVT_MODE_UNUSED:
+       case CLOCK_EVT_MODE_SHUTDOWN:
+       default:
+               break;
+       }
+
+       writel(ctrl, clkevt_base + TIMER_CTRL);
+}
+
+static int sp804_set_next_event(unsigned long next,
+       struct clock_event_device *evt)
+{
+       unsigned long ctrl = readl(clkevt_base + TIMER_CTRL);
+
+       writel(next, clkevt_base + TIMER_LOAD);
+       writel(ctrl | TIMER_CTRL_ENABLE, clkevt_base + TIMER_CTRL);
+
+       return 0;
+}
+
+static struct clock_event_device sp804_clockevent = {
+       .name           = "timer0",
+       .shift          = 32,
+       .features       = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT,
+       .set_mode       = sp804_set_mode,
+       .set_next_event = sp804_set_next_event,
+       .rating         = 300,
+       .cpumask        = cpu_all_mask,
+};
+
+static struct irqaction sp804_timer_irq = {
+       .name           = "timer",
+       .flags          = IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL,
+       .handler        = sp804_timer_interrupt,
+       .dev_id         = &sp804_clockevent,
+};
+
+void __init sp804_clockevents_init(void __iomem *base, unsigned int timer_irq)
+{
+       struct clock_event_device *evt = &sp804_clockevent;
+
+       clkevt_base = base;
+
+       evt->irq = timer_irq;
+       evt->mult = div_sc(TIMER_FREQ_KHZ, NSEC_PER_MSEC, evt->shift);
+       evt->max_delta_ns = clockevent_delta2ns(0xffffffff, evt);
+       evt->min_delta_ns = clockevent_delta2ns(0xf, evt);
+
+       setup_irq(timer_irq, &sp804_timer_irq);
+       clockevents_register_device(evt);
+}
index 9c6170c..87ab056 100644 (file)
@@ -564,7 +564,7 @@ config I2C_STU300
 
 config I2C_VERSATILE
        tristate "ARM Versatile/Realview I2C bus support"
-       depends on ARCH_VERSATILE || ARCH_REALVIEW
+       depends on ARCH_VERSATILE || ARCH_REALVIEW || ARCH_VEXPRESS
        select I2C_ALGOBIT
        help
          Say yes if you want to support the I2C serial bus on ARMs Versatile
index 84c103a..ff115d9 100644 (file)
@@ -55,14 +55,16 @@ static void mmci_set_clkreg(struct mmci_host *host, unsigned int desired)
                        host->cclk = host->mclk / (2 * (clk + 1));
                }
                if (host->hw_designer == AMBA_VENDOR_ST)
-                       clk |= MCI_FCEN; /* Bug fix in ST IP block */
+                       clk |= MCI_ST_FCEN; /* Bug fix in ST IP block */
                clk |= MCI_CLK_ENABLE;
                /* This hasn't proven to be worthwhile */
                /* clk |= MCI_CLK_PWRSAVE; */
        }
 
        if (host->mmc->ios.bus_width == MMC_BUS_WIDTH_4)
-               clk |= MCI_WIDE_BUS;
+               clk |= MCI_4BIT_BUS;
+       if (host->mmc->ios.bus_width == MMC_BUS_WIDTH_8)
+               clk |= MCI_ST_8BIT_BUS;
 
        writel(clk, host->base + MMCICLOCK);
 }
@@ -629,7 +631,18 @@ static int __devinit mmci_probe(struct amba_device *dev, struct amba_id *id)
 
        mmc->ops = &mmci_ops;
        mmc->f_min = (host->mclk + 511) / 512;
-       mmc->f_max = min(host->mclk, fmax);
+       /*
+        * If the platform data supplies a maximum operating
+        * frequency, this takes precedence. Else, we fall back
+        * to using the module parameter, which has a (low)
+        * default value in case it is not specified. Either
+        * value must not exceed the clock rate into the block,
+        * of course.
+        */
+       if (plat->f_max)
+               mmc->f_max = min(host->mclk, plat->f_max);
+       else
+               mmc->f_max = min(host->mclk, fmax);
        dev_dbg(mmc_dev(mmc), "clocking block at %u Hz\n", mmc->f_max);
 
 #ifdef CONFIG_REGULATOR
index 1ceb9a9..d77062e 100644 (file)
 #define MCI_CLK_ENABLE         (1 << 8)
 #define MCI_CLK_PWRSAVE                (1 << 9)
 #define MCI_CLK_BYPASS         (1 << 10)
-#define MCI_WIDE_BUS           (1 << 11)
+#define MCI_4BIT_BUS           (1 << 11)
+/* 8bit wide buses supported in ST Micro versions */
+#define MCI_ST_8BIT_BUS                (1 << 12)
 /* HW flow control on the ST Micro version */
-#define MCI_FCEN               (1 << 13)
+#define MCI_ST_FCEN            (1 << 13)
 
 #define MMCIARGUMENT           0x008
 #define MMCICOMMAND            0x00c
index 2c9bf9b..eed3c2d 100644 (file)
@@ -38,6 +38,7 @@
 #include <linux/dma-mapping.h>
 #include <linux/atmel_pdc.h>
 #include <linux/atmel_serial.h>
+#include <linux/uaccess.h>
 
 #include <asm/io.h>
 
@@ -59,6 +60,9 @@
 
 #include <linux/serial_core.h>
 
+static void atmel_start_rx(struct uart_port *port);
+static void atmel_stop_rx(struct uart_port *port);
+
 #ifdef CONFIG_SERIAL_ATMEL_TTYAT
 
 /* Use device name ttyAT, major 204 and minor 154-169.  This is necessary if we
@@ -93,6 +97,7 @@
 #define UART_GET_BRGR(port)    __raw_readl((port)->membase + ATMEL_US_BRGR)
 #define UART_PUT_BRGR(port,v)  __raw_writel(v, (port)->membase + ATMEL_US_BRGR)
 #define UART_PUT_RTOR(port,v)  __raw_writel(v, (port)->membase + ATMEL_US_RTOR)
+#define UART_PUT_TTGR(port, v) __raw_writel(v, (port)->membase + ATMEL_US_TTGR)
 
  /* PDC registers */
 #define UART_PUT_PTCR(port,v)  __raw_writel(v, (port)->membase + ATMEL_PDC_PTCR)
@@ -147,6 +152,9 @@ struct atmel_uart_port {
        unsigned int            irq_status_prev;
 
        struct circ_buf         rx_ring;
+
+       struct serial_rs485     rs485;          /* rs485 settings */
+       unsigned int            tx_done_mask;
 };
 
 static struct atmel_uart_port atmel_ports[ATMEL_MAX_UART];
@@ -187,6 +195,46 @@ static bool atmel_use_dma_tx(struct uart_port *port)
 }
 #endif
 
+/* Enable or disable the rs485 support */
+void atmel_config_rs485(struct uart_port *port, struct serial_rs485 *rs485conf)
+{
+       struct atmel_uart_port *atmel_port = to_atmel_uart_port(port);
+       unsigned int mode;
+
+       spin_lock(&port->lock);
+
+       /* Disable interrupts */
+       UART_PUT_IDR(port, atmel_port->tx_done_mask);
+
+       mode = UART_GET_MR(port);
+
+       /* Resetting serial mode to RS232 (0x0) */
+       mode &= ~ATMEL_US_USMODE;
+
+       atmel_port->rs485 = *rs485conf;
+
+       if (rs485conf->flags & SER_RS485_ENABLED) {
+               dev_dbg(port->dev, "Setting UART to RS485\n");
+               atmel_port->tx_done_mask = ATMEL_US_TXEMPTY;
+               UART_PUT_TTGR(port, rs485conf->delay_rts_before_send);
+               mode |= ATMEL_US_USMODE_RS485;
+       } else {
+               dev_dbg(port->dev, "Setting UART to RS232\n");
+               if (atmel_use_dma_tx(port))
+                       atmel_port->tx_done_mask = ATMEL_US_ENDTX |
+                               ATMEL_US_TXBUFE;
+               else
+                       atmel_port->tx_done_mask = ATMEL_US_TXRDY;
+       }
+       UART_PUT_MR(port, mode);
+
+       /* Enable interrupts */
+       UART_PUT_IER(port, atmel_port->tx_done_mask);
+
+       spin_unlock(&port->lock);
+
+}
+
 /*
  * Return TIOCSER_TEMT when transmitter FIFO and Shift register is empty.
  */
@@ -202,6 +250,7 @@ static void atmel_set_mctrl(struct uart_port *port, u_int mctrl)
 {
        unsigned int control = 0;
        unsigned int mode;
+       struct atmel_uart_port *atmel_port = to_atmel_uart_port(port);
 
 #ifdef CONFIG_ARCH_AT91RM9200
        if (cpu_is_at91rm9200()) {
@@ -236,6 +285,17 @@ static void atmel_set_mctrl(struct uart_port *port, u_int mctrl)
                mode |= ATMEL_US_CHMODE_LOC_LOOP;
        else
                mode |= ATMEL_US_CHMODE_NORMAL;
+
+       /* Resetting serial mode to RS232 (0x0) */
+       mode &= ~ATMEL_US_USMODE;
+
+       if (atmel_port->rs485.flags & SER_RS485_ENABLED) {
+               dev_dbg(port->dev, "Setting UART to RS485\n");
+               UART_PUT_TTGR(port, atmel_port->rs485.delay_rts_before_send);
+               mode |= ATMEL_US_USMODE_RS485;
+       } else {
+               dev_dbg(port->dev, "Setting UART to RS232\n");
+       }
        UART_PUT_MR(port, mode);
 }
 
@@ -268,12 +328,17 @@ static u_int atmel_get_mctrl(struct uart_port *port)
  */
 static void atmel_stop_tx(struct uart_port *port)
 {
+       struct atmel_uart_port *atmel_port = to_atmel_uart_port(port);
+
        if (atmel_use_dma_tx(port)) {
                /* disable PDC transmit */
                UART_PUT_PTCR(port, ATMEL_PDC_TXTDIS);
-               UART_PUT_IDR(port, ATMEL_US_ENDTX | ATMEL_US_TXBUFE);
-       } else
-               UART_PUT_IDR(port, ATMEL_US_TXRDY);
+       }
+       /* Disable interrupts */
+       UART_PUT_IDR(port, atmel_port->tx_done_mask);
+
+       if (atmel_port->rs485.flags & SER_RS485_ENABLED)
+               atmel_start_rx(port);
 }
 
 /*
@@ -281,17 +346,39 @@ static void atmel_stop_tx(struct uart_port *port)
  */
 static void atmel_start_tx(struct uart_port *port)
 {
+       struct atmel_uart_port *atmel_port = to_atmel_uart_port(port);
+
        if (atmel_use_dma_tx(port)) {
                if (UART_GET_PTSR(port) & ATMEL_PDC_TXTEN)
                        /* The transmitter is already running.  Yes, we
                           really need this.*/
                        return;
 
-               UART_PUT_IER(port, ATMEL_US_ENDTX | ATMEL_US_TXBUFE);
+               if (atmel_port->rs485.flags & SER_RS485_ENABLED)
+                       atmel_stop_rx(port);
+
                /* re-enable PDC transmit */
                UART_PUT_PTCR(port, ATMEL_PDC_TXTEN);
-       } else
-               UART_PUT_IER(port, ATMEL_US_TXRDY);
+       }
+       /* Enable interrupts */
+       UART_PUT_IER(port, atmel_port->tx_done_mask);
+}
+
+/*
+ * start receiving - port is in process of being opened.
+ */
+static void atmel_start_rx(struct uart_port *port)
+{
+       UART_PUT_CR(port, ATMEL_US_RSTSTA);  /* reset status and receiver */
+
+       if (atmel_use_dma_rx(port)) {
+               /* enable PDC controller */
+               UART_PUT_IER(port, ATMEL_US_ENDRX | ATMEL_US_TIMEOUT |
+                       port->read_status_mask);
+               UART_PUT_PTCR(port, ATMEL_PDC_RXTEN);
+       } else {
+               UART_PUT_IER(port, ATMEL_US_RXRDY);
+       }
 }
 
 /*
@@ -302,9 +389,11 @@ static void atmel_stop_rx(struct uart_port *port)
        if (atmel_use_dma_rx(port)) {
                /* disable PDC receive */
                UART_PUT_PTCR(port, ATMEL_PDC_RXTDIS);
-               UART_PUT_IDR(port, ATMEL_US_ENDRX | ATMEL_US_TIMEOUT);
-       } else
+               UART_PUT_IDR(port, ATMEL_US_ENDRX | ATMEL_US_TIMEOUT |
+                       port->read_status_mask);
+       } else {
                UART_PUT_IDR(port, ATMEL_US_RXRDY);
+       }
 }
 
 /*
@@ -428,8 +517,9 @@ static void atmel_rx_chars(struct uart_port *port)
 static void atmel_tx_chars(struct uart_port *port)
 {
        struct circ_buf *xmit = &port->state->xmit;
+       struct atmel_uart_port *atmel_port = to_atmel_uart_port(port);
 
-       if (port->x_char && UART_GET_CSR(port) & ATMEL_US_TXRDY) {
+       if (port->x_char && UART_GET_CSR(port) & atmel_port->tx_done_mask) {
                UART_PUT_CHAR(port, port->x_char);
                port->icount.tx++;
                port->x_char = 0;
@@ -437,7 +527,7 @@ static void atmel_tx_chars(struct uart_port *port)
        if (uart_circ_empty(xmit) || uart_tx_stopped(port))
                return;
 
-       while (UART_GET_CSR(port) & ATMEL_US_TXRDY) {
+       while (UART_GET_CSR(port) & atmel_port->tx_done_mask) {
                UART_PUT_CHAR(port, xmit->buf[xmit->tail]);
                xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1);
                port->icount.tx++;
@@ -449,7 +539,8 @@ static void atmel_tx_chars(struct uart_port *port)
                uart_write_wakeup(port);
 
        if (!uart_circ_empty(xmit))
-               UART_PUT_IER(port, ATMEL_US_TXRDY);
+               /* Enable interrupts */
+               UART_PUT_IER(port, atmel_port->tx_done_mask);
 }
 
 /*
@@ -501,18 +592,10 @@ atmel_handle_transmit(struct uart_port *port, unsigned int pending)
 {
        struct atmel_uart_port *atmel_port = to_atmel_uart_port(port);
 
-       if (atmel_use_dma_tx(port)) {
-               /* PDC transmit */
-               if (pending & (ATMEL_US_ENDTX | ATMEL_US_TXBUFE)) {
-                       UART_PUT_IDR(port, ATMEL_US_ENDTX | ATMEL_US_TXBUFE);
-                       tasklet_schedule(&atmel_port->tasklet);
-               }
-       } else {
-               /* Interrupt transmit */
-               if (pending & ATMEL_US_TXRDY) {
-                       UART_PUT_IDR(port, ATMEL_US_TXRDY);
-                       tasklet_schedule(&atmel_port->tasklet);
-               }
+       if (pending & atmel_port->tx_done_mask) {
+               /* Either PDC or interrupt transmission */
+               UART_PUT_IDR(port, atmel_port->tx_done_mask);
+               tasklet_schedule(&atmel_port->tasklet);
        }
 }
 
@@ -590,9 +673,15 @@ static void atmel_tx_dma(struct uart_port *port)
 
                UART_PUT_TPR(port, pdc->dma_addr + xmit->tail);
                UART_PUT_TCR(port, count);
-               /* re-enable PDC transmit and interrupts */
+               /* re-enable PDC transmit */
                UART_PUT_PTCR(port, ATMEL_PDC_TXTEN);
-               UART_PUT_IER(port, ATMEL_US_ENDTX | ATMEL_US_TXBUFE);
+               /* Enable interrupts */
+               UART_PUT_IER(port, atmel_port->tx_done_mask);
+       } else {
+               if (atmel_port->rs485.flags & SER_RS485_ENABLED) {
+                       /* DMA done, stop TX, start RX for RS485 */
+                       atmel_start_rx(port);
+               }
        }
 
        if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS)
@@ -1017,6 +1106,7 @@ static void atmel_set_termios(struct uart_port *port, struct ktermios *termios,
 {
        unsigned long flags;
        unsigned int mode, imr, quot, baud;
+       struct atmel_uart_port *atmel_port = to_atmel_uart_port(port);
 
        /* Get current mode register */
        mode = UART_GET_MR(port) & ~(ATMEL_US_USCLKS | ATMEL_US_CHRL
@@ -1115,6 +1205,17 @@ static void atmel_set_termios(struct uart_port *port, struct ktermios *termios,
        /* disable receiver and transmitter */
        UART_PUT_CR(port, ATMEL_US_TXDIS | ATMEL_US_RXDIS);
 
+       /* Resetting serial mode to RS232 (0x0) */
+       mode &= ~ATMEL_US_USMODE;
+
+       if (atmel_port->rs485.flags & SER_RS485_ENABLED) {
+               dev_dbg(port->dev, "Setting UART to RS485\n");
+               UART_PUT_TTGR(port, atmel_port->rs485.delay_rts_before_send);
+               mode |= ATMEL_US_USMODE_RS485;
+       } else {
+               dev_dbg(port->dev, "Setting UART to RS232\n");
+       }
+
        /* set the parity, stop bits and data size */
        UART_PUT_MR(port, mode);
 
@@ -1231,6 +1332,35 @@ static void atmel_poll_put_char(struct uart_port *port, unsigned char ch)
 }
 #endif
 
+static int
+atmel_ioctl(struct uart_port *port, unsigned int cmd, unsigned long arg)
+{
+       struct serial_rs485 rs485conf;
+
+       switch (cmd) {
+       case TIOCSRS485:
+               if (copy_from_user(&rs485conf, (struct serial_rs485 *) arg,
+                                       sizeof(rs485conf)))
+                       return -EFAULT;
+
+               atmel_config_rs485(port, &rs485conf);
+               break;
+
+       case TIOCGRS485:
+               if (copy_to_user((struct serial_rs485 *) arg,
+                                       &(to_atmel_uart_port(port)->rs485),
+                                       sizeof(rs485conf)))
+                       return -EFAULT;
+               break;
+
+       default:
+               return -ENOIOCTLCMD;
+       }
+       return 0;
+}
+
+
+
 static struct uart_ops atmel_pops = {
        .tx_empty       = atmel_tx_empty,
        .set_mctrl      = atmel_set_mctrl,
@@ -1250,6 +1380,7 @@ static struct uart_ops atmel_pops = {
        .config_port    = atmel_config_port,
        .verify_port    = atmel_verify_port,
        .pm             = atmel_serial_pm,
+       .ioctl          = atmel_ioctl,
 #ifdef CONFIG_CONSOLE_POLL
        .poll_get_char  = atmel_poll_get_char,
        .poll_put_char  = atmel_poll_put_char,
@@ -1265,13 +1396,12 @@ static void __devinit atmel_init_port(struct atmel_uart_port *atmel_port,
        struct uart_port *port = &atmel_port->uart;
        struct atmel_uart_data *data = pdev->dev.platform_data;
 
-       port->iotype    = UPIO_MEM;
-       port->flags     = UPF_BOOT_AUTOCONF;
-       port->ops       = &atmel_pops;
-       port->fifosize  = 1;
-       port->line      = pdev->id;
-       port->dev       = &pdev->dev;
-
+       port->iotype            = UPIO_MEM;
+       port->flags             = UPF_BOOT_AUTOCONF;
+       port->ops               = &atmel_pops;
+       port->fifosize          = 1;
+       port->line              = pdev->id;
+       port->dev               = &pdev->dev;
        port->mapbase   = pdev->resource[0].start;
        port->irq       = pdev->resource[1].start;
 
@@ -1299,8 +1429,16 @@ static void __devinit atmel_init_port(struct atmel_uart_port *atmel_port,
 
        atmel_port->use_dma_rx = data->use_dma_rx;
        atmel_port->use_dma_tx = data->use_dma_tx;
-       if (atmel_use_dma_tx(port))
+       atmel_port->rs485       = data->rs485;
+       /* Use TXEMPTY for interrupt when rs485 else TXRDY or ENDTX|TXBUFE */
+       if (atmel_port->rs485.flags & SER_RS485_ENABLED)
+               atmel_port->tx_done_mask = ATMEL_US_TXEMPTY;
+       else if (atmel_use_dma_tx(port)) {
                port->fifosize = PDC_BUFFER_SIZE;
+               atmel_port->tx_done_mask = ATMEL_US_ENDTX | ATMEL_US_TXBUFE;
+       } else {
+               atmel_port->tx_done_mask = ATMEL_US_TXRDY;
+       }
 }
 
 /*
@@ -1334,6 +1472,7 @@ static void atmel_console_putchar(struct uart_port *port, int ch)
 static void atmel_console_write(struct console *co, const char *s, u_int count)
 {
        struct uart_port *port = &atmel_ports[co->index].uart;
+       struct atmel_uart_port *atmel_port = to_atmel_uart_port(port);
        unsigned int status, imr;
        unsigned int pdc_tx;
 
@@ -1341,7 +1480,7 @@ static void atmel_console_write(struct console *co, const char *s, u_int count)
         * First, save IMR and then disable interrupts
         */
        imr = UART_GET_IMR(port);
-       UART_PUT_IDR(port, ATMEL_US_RXRDY | ATMEL_US_TXRDY);
+       UART_PUT_IDR(port, ATMEL_US_RXRDY | atmel_port->tx_done_mask);
 
        /* Store PDC transmit status and disable it */
        pdc_tx = UART_GET_PTSR(port) & ATMEL_PDC_TXTEN;
index df1bae9..eaa79c8 100644 (file)
@@ -366,6 +366,13 @@ rescan:
        if (is_done)
                done(ep, req, 0);
        else if (ep->is_pingpong) {
+               /*
+                * One dummy read to delay the code because of a HW glitch:
+                * CSR returns bad RXCOUNT when read too soon after updating
+                * RX_DATA_BK flags.
+                */
+               csr = __raw_readl(creg);
+
                bufferspace -= count;
                buf += count;
                goto rescan;
index 6b42417..7e466fe 100644 (file)
@@ -6,8 +6,29 @@
 
 #include <linux/mmc/host.h>
 
+/**
+ * struct mmci_platform_data - platform configuration for the MMCI
+ * (also known as PL180) block.
+ * @f_max: the maximum operational frequency for this host in this
+ * platform configuration. When this is specified it takes precedence
+ * over the module parameter for the same frequency.
+ * @ocr_mask: available voltages on the 4 pins from the block, this
+ * is ignored if a regulator is used, see the MMC_VDD_* masks in
+ * mmc/host.h
+ * @translate_vdd: a callback function to translate a MMC_VDD_*
+ * mask into a value to be binary or:ed and written into the
+ * MMCIPWR register of the block
+ * @status: if no GPIO read function was given to the block in
+ * gpio_wp (below) this function will be called to determine
+ * whether a card is present in the MMC slot or not
+ * @gpio_wp: read this GPIO pin to see if the card is write protected
+ * @gpio_cd: read this GPIO pin to detect card insertion
+ * @capabilities: the capabilities of the block as implemented in
+ * this platform, signify anything MMC_CAP_* from mmc/host.h
+ */
 struct mmci_platform_data {
-       unsigned int ocr_mask;                  /* available voltages */
+       unsigned int f_max;
+       unsigned int ocr_mask;
        u32 (*translate_vdd)(struct device *, unsigned int);
        unsigned int (*status)(struct device *);
        int     gpio_wp;