Merge branches 'arm', 'at91', 'bcmring', 'ep93xx', 'mach-types', 'misc' and 'w90x900...
authorRussell King <rmk@dyn-67.arm.linux.org.uk>
Sat, 12 Sep 2009 11:01:34 +0000 (12:01 +0100)
committerRussell King <rmk+kernel@arm.linux.org.uk>
Sat, 12 Sep 2009 11:01:34 +0000 (12:01 +0100)
169 files changed:
MAINTAINERS
arch/arm/Kconfig
arch/arm/Makefile
arch/arm/configs/bcmring_defconfig [new file with mode: 0644]
arch/arm/configs/cpu9260_defconfig [new file with mode: 0644]
arch/arm/configs/cpu9g20_defconfig [new file with mode: 0644]
arch/arm/configs/cpuat91_defconfig [new file with mode: 0644]
arch/arm/include/asm/mach/mmc.h
arch/arm/kernel/crunch.c
arch/arm/mach-at91/Kconfig
arch/arm/mach-at91/Makefile
arch/arm/mach-at91/Makefile.boot
arch/arm/mach-at91/at91sam9260_devices.c
arch/arm/mach-at91/at91sam9261.c
arch/arm/mach-at91/at91sam9263_devices.c
arch/arm/mach-at91/at91sam9g45.c [new file with mode: 0644]
arch/arm/mach-at91/at91sam9g45_devices.c [new file with mode: 0644]
arch/arm/mach-at91/board-afeb-9260v1.c
arch/arm/mach-at91/board-cpu9krea.c [new file with mode: 0644]
arch/arm/mach-at91/board-cpuat91.c [new file with mode: 0644]
arch/arm/mach-at91/board-sam9261ek.c
arch/arm/mach-at91/board-sam9263ek.c
arch/arm/mach-at91/board-sam9g20ek.c
arch/arm/mach-at91/board-sam9m10g45ek.c [new file with mode: 0644]
arch/arm/mach-at91/board-sam9rlek.c
arch/arm/mach-at91/clock.c
arch/arm/mach-at91/generic.h
arch/arm/mach-at91/gpio.c
arch/arm/mach-at91/include/mach/at91sam9261.h
arch/arm/mach-at91/include/mach/at91sam9g45.h [new file with mode: 0644]
arch/arm/mach-at91/include/mach/at91sam9g45_matrix.h [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/hardware.h
arch/arm/mach-at91/include/mach/timex.h
arch/arm/mach-at91/pm.c
arch/arm/mach-bcmring/Kconfig [new file with mode: 0644]
arch/arm/mach-bcmring/Makefile [new file with mode: 0644]
arch/arm/mach-bcmring/Makefile.boot [new file with mode: 0644]
arch/arm/mach-bcmring/arch.c [new file with mode: 0644]
arch/arm/mach-bcmring/clock.c [new file with mode: 0644]
arch/arm/mach-bcmring/clock.h [new file with mode: 0644]
arch/arm/mach-bcmring/core.c [new file with mode: 0644]
arch/arm/mach-bcmring/core.h [new file with mode: 0644]
arch/arm/mach-bcmring/csp/Makefile [new file with mode: 0644]
arch/arm/mach-bcmring/csp/chipc/Makefile [new file with mode: 0644]
arch/arm/mach-bcmring/csp/chipc/chipcHw.c [new file with mode: 0644]
arch/arm/mach-bcmring/csp/chipc/chipcHw_init.c [new file with mode: 0644]
arch/arm/mach-bcmring/csp/chipc/chipcHw_reset.c [new file with mode: 0644]
arch/arm/mach-bcmring/csp/chipc/chipcHw_str.c [new file with mode: 0644]
arch/arm/mach-bcmring/csp/dmac/Makefile [new file with mode: 0644]
arch/arm/mach-bcmring/csp/dmac/dmacHw.c [new file with mode: 0644]
arch/arm/mach-bcmring/csp/dmac/dmacHw_extra.c [new file with mode: 0644]
arch/arm/mach-bcmring/csp/tmr/Makefile [new file with mode: 0644]
arch/arm/mach-bcmring/csp/tmr/tmrHw.c [new file with mode: 0644]
arch/arm/mach-bcmring/dma.c [new file with mode: 0644]
arch/arm/mach-bcmring/dma_device.c [new file with mode: 0644]
arch/arm/mach-bcmring/include/cfg_global.h [new file with mode: 0644]
arch/arm/mach-bcmring/include/cfg_global_defines.h [new file with mode: 0644]
arch/arm/mach-bcmring/include/csp/cache.h [new file with mode: 0644]
arch/arm/mach-bcmring/include/csp/delay.h [new file with mode: 0644]
arch/arm/mach-bcmring/include/csp/dmacHw.h [new file with mode: 0644]
arch/arm/mach-bcmring/include/csp/errno.h [new file with mode: 0644]
arch/arm/mach-bcmring/include/csp/intcHw.h [new file with mode: 0644]
arch/arm/mach-bcmring/include/csp/module.h [new file with mode: 0644]
arch/arm/mach-bcmring/include/csp/reg.h [new file with mode: 0644]
arch/arm/mach-bcmring/include/csp/secHw.h [new file with mode: 0644]
arch/arm/mach-bcmring/include/csp/stdint.h [new file with mode: 0644]
arch/arm/mach-bcmring/include/csp/string.h [new file with mode: 0644]
arch/arm/mach-bcmring/include/csp/tmrHw.h [new file with mode: 0644]
arch/arm/mach-bcmring/include/mach/clkdev.h [new file with mode: 0644]
arch/arm/mach-bcmring/include/mach/csp/cap.h [new file with mode: 0644]
arch/arm/mach-bcmring/include/mach/csp/cap_inline.h [new file with mode: 0644]
arch/arm/mach-bcmring/include/mach/csp/chipcHw_def.h [new file with mode: 0644]
arch/arm/mach-bcmring/include/mach/csp/chipcHw_inline.h [new file with mode: 0644]
arch/arm/mach-bcmring/include/mach/csp/chipcHw_reg.h [new file with mode: 0644]
arch/arm/mach-bcmring/include/mach/csp/ddrcReg.h [new file with mode: 0644]
arch/arm/mach-bcmring/include/mach/csp/dmacHw_priv.h [new file with mode: 0644]
arch/arm/mach-bcmring/include/mach/csp/dmacHw_reg.h [new file with mode: 0644]
arch/arm/mach-bcmring/include/mach/csp/hw_cfg.h [new file with mode: 0644]
arch/arm/mach-bcmring/include/mach/csp/intcHw_reg.h [new file with mode: 0644]
arch/arm/mach-bcmring/include/mach/csp/mm_addr.h [new file with mode: 0644]
arch/arm/mach-bcmring/include/mach/csp/mm_io.h [new file with mode: 0644]
arch/arm/mach-bcmring/include/mach/csp/secHw_def.h [new file with mode: 0644]
arch/arm/mach-bcmring/include/mach/csp/secHw_inline.h [new file with mode: 0644]
arch/arm/mach-bcmring/include/mach/csp/tmrHw_reg.h [new file with mode: 0644]
arch/arm/mach-bcmring/include/mach/dma.h [new file with mode: 0644]
arch/arm/mach-bcmring/include/mach/entry-macro.S [new file with mode: 0644]
arch/arm/mach-bcmring/include/mach/hardware.h [new file with mode: 0644]
arch/arm/mach-bcmring/include/mach/io.h [new file with mode: 0644]
arch/arm/mach-bcmring/include/mach/irqs.h [new file with mode: 0644]
arch/arm/mach-bcmring/include/mach/memory.h [new file with mode: 0644]
arch/arm/mach-bcmring/include/mach/memory_settings.h [new file with mode: 0644]
arch/arm/mach-bcmring/include/mach/system.h [new file with mode: 0644]
arch/arm/mach-bcmring/include/mach/timer.h [new file with mode: 0644]
arch/arm/mach-bcmring/include/mach/timex.h [new file with mode: 0644]
arch/arm/mach-bcmring/include/mach/uncompress.h [new file with mode: 0644]
arch/arm/mach-bcmring/include/mach/vmalloc.h [new file with mode: 0644]
arch/arm/mach-bcmring/irq.c [new file with mode: 0644]
arch/arm/mach-bcmring/mm.c [new file with mode: 0644]
arch/arm/mach-bcmring/timer.c [new file with mode: 0644]
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/gpio.c
arch/arm/mach-ep93xx/include/mach/ep93xx-regs.h
arch/arm/mach-ep93xx/include/mach/hardware.h
arch/arm/mach-ep93xx/include/mach/io.h
arch/arm/mach-ep93xx/include/mach/platform.h
arch/arm/mach-ep93xx/include/mach/system.h
arch/arm/mach-ep93xx/include/mach/ts72xx.h
arch/arm/mach-ep93xx/micro9.c
arch/arm/mach-ep93xx/ts72xx.c
arch/arm/mach-integrator/integrator_cp.c
arch/arm/mach-realview/core.c
arch/arm/mach-realview/include/mach/gpio.h [new file with mode: 0644]
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-u300/mmc.c
arch/arm/mach-versatile/core.c
arch/arm/mach-versatile/include/mach/gpio.h [new file with mode: 0644]
arch/arm/mach-versatile/include/mach/irqs.h
arch/arm/mach-versatile/versatile_pb.c
arch/arm/mach-w90x900/Kconfig
arch/arm/mach-w90x900/Makefile
arch/arm/mach-w90x900/clksel.c [new file with mode: 0644]
arch/arm/mach-w90x900/clock.c
arch/arm/mach-w90x900/clock.h
arch/arm/mach-w90x900/cpu.c [new file with mode: 0644]
arch/arm/mach-w90x900/cpu.h
arch/arm/mach-w90x900/dev.c [new file with mode: 0644]
arch/arm/mach-w90x900/gpio.c
arch/arm/mach-w90x900/include/mach/regs-clock.h
arch/arm/mach-w90x900/include/mach/regs-ebi.h [new file with mode: 0644]
arch/arm/mach-w90x900/irq.c
arch/arm/mach-w90x900/mach-nuc910evb.c [new file with mode: 0644]
arch/arm/mach-w90x900/mach-nuc950evb.c [new file with mode: 0644]
arch/arm/mach-w90x900/mach-nuc960evb.c [new file with mode: 0644]
arch/arm/mach-w90x900/mach-w90p910evb.c [deleted file]
arch/arm/mach-w90x900/mfp-w90p910.c [deleted file]
arch/arm/mach-w90x900/mfp.c [new file with mode: 0644]
arch/arm/mach-w90x900/nuc910.c [new file with mode: 0644]
arch/arm/mach-w90x900/nuc910.h [new file with mode: 0644]
arch/arm/mach-w90x900/nuc950.c [new file with mode: 0644]
arch/arm/mach-w90x900/nuc950.h [new file with mode: 0644]
arch/arm/mach-w90x900/nuc960.c [new file with mode: 0644]
arch/arm/mach-w90x900/nuc960.h [new file with mode: 0644]
arch/arm/mach-w90x900/time.c
arch/arm/mach-w90x900/w90p910.c [deleted file]
arch/arm/tools/mach-types
drivers/amba/bus.c
drivers/input/touchscreen/w90p910_ts.c
drivers/misc/Kconfig
drivers/misc/Makefile
drivers/misc/ep93xx_pwm.c [new file with mode: 0644]
drivers/mmc/host/mmci.c
drivers/mmc/host/mmci.h
drivers/mtd/nand/ts7250.c
drivers/net/Kconfig
drivers/serial/amba-pl011.c
drivers/video/Kconfig
drivers/video/atmel_lcdfb.c
drivers/video/backlight/Kconfig
sound/soc/atmel/sam9g20_wm8731.c

index 9d1601ec13113037859a88c5174e5b475fa194fe..7b91c6e69d559bdf7f29b99c5f430c146b5def8c 100644 (file)
@@ -603,11 +603,32 @@ L:        linux-arm-kernel@lists.arm.linux.org.uk (subscribers-only)
 W:     http://maxim.org.za/at91_26.html
 S:     Maintained
 
+ARM/BCMRING ARM ARCHITECTURE
+P:     Leo Chen <leochen@broadcom.com>
+P:     Scott Branden <sbranden@broadcom.com>
+L:     linux-arm-kernel@lists.arm.linux.org.uk (subscribers-only)
+S:     Maintained
+F:     arch/arm/mach-bcmring
+
+ARM/BCMRING MTD NAND DRIVER
+P:     Leo Chen <leochen@broadcom.com>
+P:     Scott Branden <sbranden@broadcom.com>
+L:     linux-mtd@lists.infradead.org
+S:     Maintained
+F:     drivers/mtd/nand/bcm_umi_nand.c
+F:     drivers/mtd/nand/bcm_umi_bch.c
+F:     drivers/mtd/nand/bcm_umi_hamming.c
+F:     drivers/mtd/nand/nand_bcm_umi.h
+
 ARM/CIRRUS LOGIC EP93XX ARM ARCHITECTURE
-P:     Lennert Buytenhek
-M:     kernel@wantstofly.org
+P:     Hartley Sweeten
+M:     hsweeten@visionengravers.com
+P:     Ryan Mallon
+M:     ryan@bluewatersys.com
 L:     linux-arm-kernel@lists.arm.linux.org.uk (subscribers-only)
 S:     Maintained
+F:     arch/arm/mach-ep93xx/
+F:     arch/arm/mach-ep93xx/include/mach/
 
 ARM/CIRRUS LOGIC EDB9315A MACHINE SUPPORT
 P:     Lennert Buytenhek
index 370f477871227da67787c45ef154ebf45503dd3e..5d60508472f0fca049467b93fa65774e0eaa0720 100644 (file)
@@ -217,6 +217,7 @@ config ARCH_REALVIEW
        select ICST307
        select GENERIC_TIME
        select GENERIC_CLOCKEVENTS
+       select ARCH_WANT_OPTIONAL_GPIOLIB
        help
          This enables support for ARM Ltd RealView boards.
 
@@ -229,6 +230,7 @@ config ARCH_VERSATILE
        select ICST307
        select GENERIC_TIME
        select GENERIC_CLOCKEVENTS
+       select ARCH_WANT_OPTIONAL_GPIOLIB
        help
          This enables support for ARM Ltd Versatile board.
 
@@ -493,10 +495,18 @@ config ARCH_W90X900
        select CPU_ARM926T
        select ARCH_REQUIRE_GPIOLIB
        select GENERIC_GPIO
+       select HAVE_CLK
        select COMMON_CLKDEV
+       select GENERIC_TIME
+       select GENERIC_CLOCKEVENTS
        help
-               Support for Nuvoton (Winbond logic dept.) ARM9 processor,You
-               can login www.mcuos.com or www.nuvoton.com to know more.
+         Support for Nuvoton (Winbond logic dept.) ARM9 processor,
+         At present, the w90x900 has been renamed nuc900, regarding
+         the ARM series product line, you can login the following
+         link address to know more.
+
+         <http://www.nuvoton.com/hq/enu/ProductAndSales/ProductLines/
+               ConsumerElectronicsIC/ARMMicrocontroller/ARMMicrocontroller>
 
 config ARCH_PNX4008
        bool "Philips Nexperia PNX4008 Mobile"
@@ -637,6 +647,18 @@ config ARCH_OMAP
        help
          Support for TI's OMAP platform (OMAP1 and OMAP2).
 
+config ARCH_BCMRING
+       bool "Broadcom BCMRING"
+       depends on MMU
+       select CPU_V6
+       select ARM_AMBA
+       select COMMON_CLKDEV
+       select GENERIC_TIME
+       select GENERIC_CLOCKEVENTS
+       select ARCH_WANT_OPTIONAL_GPIOLIB
+       help
+         Support for Broadcom's BCMRing platform.
+
 endchoice
 
 source "arch/arm/mach-clps711x/Kconfig"
@@ -730,6 +752,8 @@ source "arch/arm/mach-u300/Kconfig"
 
 source "arch/arm/mach-w90x900/Kconfig"
 
+source "arch/arm/mach-bcmring/Kconfig"
+
 # Definitions to make life easier
 config ARCH_ACORN
        bool
index c877d6df23d116286d17e51429058135f022de70..b9ae98b88a7e3207a5c3adcf4b442f619a45949e 100644 (file)
@@ -112,6 +112,7 @@ endif
 # by CONFIG_* macro name.
 machine-$(CONFIG_ARCH_AAEC2000)                := aaec2000
 machine-$(CONFIG_ARCH_AT91)            := at91
+machine-$(CONFIG_ARCH_BCMRING)         := bcmring
 machine-$(CONFIG_ARCH_CLPS711X)                := clps711x
 machine-$(CONFIG_ARCH_DAVINCI)         := davinci
 machine-$(CONFIG_ARCH_EBSA110)         := ebsa110
diff --git a/arch/arm/configs/bcmring_defconfig b/arch/arm/configs/bcmring_defconfig
new file mode 100644 (file)
index 0000000..bcc0bac
--- /dev/null
@@ -0,0 +1,725 @@
+#
+# Automatically generated make config: don't edit
+# Linux kernel version: 2.6.31-rc3
+# Fri Jul 17 12:07:28 2009
+#
+CONFIG_ARM=y
+CONFIG_SYS_SUPPORTS_APM_EMULATION=y
+CONFIG_GENERIC_TIME=y
+CONFIG_GENERIC_CLOCKEVENTS=y
+CONFIG_MMU=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_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_CLASSIC_RCU=y
+# CONFIG_TREE_RCU is not set
+# CONFIG_PREEMPT_RCU is not set
+# CONFIG_TREE_RCU_TRACE is not set
+# CONFIG_PREEMPT_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 is not set
+# CONFIG_BLK_DEV_INITRD is not set
+CONFIG_CC_OPTIMIZE_FOR_SIZE=y
+CONFIG_SYSCTL=y
+CONFIG_EMBEDDED=y
+CONFIG_UID16=y
+CONFIG_SYSCTL_SYSCALL=y
+CONFIG_KALLSYMS=y
+CONFIG_KALLSYMS_EXTRA_PASS=y
+# CONFIG_HOTPLUG is not set
+CONFIG_PRINTK=y
+CONFIG_BUG=y
+# CONFIG_ELF_CORE is not set
+CONFIG_BASE_FULL=y
+CONFIG_FUTEX=y
+# CONFIG_EPOLL is not set
+# CONFIG_SIGNALFD is not set
+# CONFIG_TIMERFD is not set
+# CONFIG_EVENTFD is not set
+CONFIG_SHMEM=y
+# CONFIG_AIO is not set
+
+#
+# Performance Counters
+#
+# CONFIG_VM_EVENT_COUNTERS is not set
+# CONFIG_SLUB_DEBUG is not set
+# CONFIG_STRIP_ASM_SYMS is not set
+# CONFIG_COMPAT_BRK is not set
+# CONFIG_SLAB is not set
+CONFIG_SLUB=y
+# CONFIG_SLOB is not set
+# CONFIG_PROFILING is not set
+# CONFIG_MARKERS is not set
+CONFIG_HAVE_OPROFILE=y
+# CONFIG_KPROBES is not set
+CONFIG_HAVE_KPROBES=y
+CONFIG_HAVE_KRETPROBES=y
+
+#
+# GCOV-based kernel profiling
+#
+# CONFIG_SLOW_WORK is not set
+CONFIG_HAVE_GENERIC_DMA_COHERENT=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=y
+# CONFIG_BLK_DEV_BSG is not set
+# CONFIG_BLK_DEV_INTEGRITY is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+# CONFIG_IOSCHED_AS is not set
+# CONFIG_IOSCHED_DEADLINE is not set
+# CONFIG_IOSCHED_CFQ is not set
+# CONFIG_DEFAULT_AS is not set
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+CONFIG_DEFAULT_NOOP=y
+CONFIG_DEFAULT_IOSCHED="noop"
+# CONFIG_FREEZER is not set
+
+#
+# System Type
+#
+# 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_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_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=y
+# CONFIG_ARCH_FPGA11107 is not set
+CONFIG_ARCH_BCM11107=y
+
+#
+# BCMRING Options
+#
+CONFIG_BCM_ZRELADDR=0x8000
+
+#
+# Processor Type
+#
+CONFIG_CPU_32=y
+CONFIG_CPU_V6=y
+CONFIG_CPU_32v6K=y
+CONFIG_CPU_32v6=y
+CONFIG_CPU_ABRT_EV6=y
+CONFIG_CPU_PABRT_NOIFAR=y
+CONFIG_CPU_CACHE_V6=y
+CONFIG_CPU_CACHE_VIPT=y
+CONFIG_CPU_COPY_V6=y
+CONFIG_CPU_TLB_V6=y
+CONFIG_CPU_HAS_ASID=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_BPREDICT_DISABLE is not set
+# CONFIG_ARM_ERRATA_411920 is not set
+CONFIG_COMMON_CLKDEV=y
+
+#
+# Bus support
+#
+CONFIG_ARM_AMBA=y
+# CONFIG_PCI_SYSCALL is not set
+# CONFIG_ARCH_SUPPORTS_MSI is not set
+
+#
+# Kernel Features
+#
+CONFIG_TICK_ONESHOT=y
+CONFIG_NO_HZ=y
+# 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=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=4
+# 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_DEFAULT_MMAP_MIN_ADDR=4096
+CONFIG_ALIGNMENT_TRAP=y
+CONFIG_UACCESS_WITH_MEMCPY=y
+
+#
+# Boot options
+#
+CONFIG_ZBOOT_ROM_TEXT=0x0e000000
+CONFIG_ZBOOT_ROM_BSS=0x0ea00000
+CONFIG_ZBOOT_ROM=y
+CONFIG_CMDLINE=""
+# 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_VFP is not set
+
+#
+# Userspace binary formats
+#
+CONFIG_BINFMT_ELF=y
+CONFIG_HAVE_AOUT=y
+# CONFIG_BINFMT_AOUT is not set
+# CONFIG_BINFMT_MISC is not set
+
+#
+# Power management options
+#
+# CONFIG_PM is not set
+CONFIG_ARCH_SUSPEND_POSSIBLE=y
+CONFIG_NET=y
+
+#
+# Networking options
+#
+# CONFIG_PACKET is not set
+# CONFIG_UNIX is not set
+# CONFIG_NET_KEY is not set
+# CONFIG_INET is not set
+# CONFIG_NETWORK_SECMARK is not set
+# CONFIG_NETFILTER 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_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_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_STANDALONE=y
+CONFIG_PREVENT_FIRMWARE_BUILD=y
+# CONFIG_SYS_HYPERVISOR is not set
+# CONFIG_CONNECTOR is not set
+CONFIG_MTD=y
+# CONFIG_MTD_DEBUG is not set
+CONFIG_MTD_CONCAT=y
+CONFIG_MTD_PARTITIONS=y
+# CONFIG_MTD_TESTS is not set
+# 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=y
+# CONFIG_MTD_JEDECPROBE is not set
+CONFIG_MTD_GEN_PROBE=y
+CONFIG_MTD_CFI_ADV_OPTIONS=y
+CONFIG_MTD_CFI_NOSWAP=y
+# CONFIG_MTD_CFI_BE_BYTE_SWAP is not set
+# CONFIG_MTD_CFI_LE_BYTE_SWAP is not set
+CONFIG_MTD_CFI_GEOMETRY=y
+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 is not set
+# CONFIG_MTD_CFI_I4 is not set
+# CONFIG_MTD_CFI_I8 is not set
+# CONFIG_MTD_OTP is not set
+# CONFIG_MTD_CFI_INTELEXT is not set
+# CONFIG_MTD_CFI_AMDSTD is not set
+# CONFIG_MTD_CFI_STAA is not set
+CONFIG_MTD_CFI_UTIL=y
+# 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_PHYSMAP is not set
+# CONFIG_MTD_ARM_INTEGRATOR is not set
+# CONFIG_MTD_PLATRAM is not set
+
+#
+# Self-contained MTD device drivers
+#
+# 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=y
+# CONFIG_MTD_NAND_ECC_SMC is not set
+# CONFIG_MTD_NAND_MUSEUM_IDS is not set
+CONFIG_MTD_NAND_IDS=y
+CONFIG_MTD_NAND_BCM_UMI=y
+CONFIG_MTD_NAND_BCM_UMI_HWCS=y
+# CONFIG_MTD_NAND_DISKONCHIP is not set
+# CONFIG_MTD_NAND_NANDSIM is not set
+# CONFIG_MTD_NAND_PLATFORM 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 is not set
+# CONFIG_BLK_DEV_NBD is not set
+# CONFIG_BLK_DEV_RAM is not set
+# CONFIG_CDROM_PKTCDVD is not set
+# CONFIG_ATA_OVER_ETH 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 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_NETDEVICES is not set
+# CONFIG_ISDN is not set
+
+#
+# Input device support
+#
+CONFIG_INPUT=y
+# CONFIG_INPUT_FF_MEMLESS is not set
+# CONFIG_INPUT_POLLDEV is not set
+
+#
+# Userland interfaces
+#
+# CONFIG_INPUT_MOUSEDEV is not set
+# 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 is not set
+CONFIG_VT_CONSOLE=y
+CONFIG_HW_CONSOLE=y
+# CONFIG_VT_HW_CONSOLE_BINDING is not set
+# CONFIG_DEVKMEM is not set
+# 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=y
+CONFIG_LEGACY_PTY_COUNT=64
+# 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 is not set
+# CONFIG_SPI is not set
+CONFIG_ARCH_WANT_OPTIONAL_GPIOLIB=y
+# CONFIG_GPIOLIB is not set
+# CONFIG_W1 is not set
+# CONFIG_POWER_SUPPLY is not set
+# CONFIG_HWMON is not set
+# CONFIG_THERMAL is not set
+# CONFIG_THERMAL_HWMON 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_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_ACCESSIBILITY is not set
+# CONFIG_NEW_LEDS is not set
+CONFIG_RTC_LIB=y
+# CONFIG_RTC_CLASS is not set
+# CONFIG_DMADEVICES is not set
+# CONFIG_AUXDISPLAY is not set
+# CONFIG_REGULATOR is not set
+# CONFIG_UIO is not set
+# CONFIG_STAGING is not set
+
+#
+# File systems
+#
+# CONFIG_EXT2_FS is not set
+# CONFIG_EXT3_FS is not set
+# CONFIG_EXT4_FS is not set
+# CONFIG_REISERFS_FS is not set
+# CONFIG_JFS_FS is not set
+CONFIG_FS_POSIX_ACL=y
+# CONFIG_XFS_FS is not set
+# CONFIG_GFS2_FS is not set
+# CONFIG_OCFS2_FS is not set
+# CONFIG_BTRFS_FS is not set
+# CONFIG_FILE_LOCKING is not set
+# CONFIG_FSNOTIFY is not set
+# CONFIG_INOTIFY is not set
+# 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_MSDOS_FS is not set
+# CONFIG_VFAT_FS is not set
+# CONFIG_NTFS_FS is not set
+
+#
+# Pseudo filesystems
+#
+CONFIG_PROC_FS=y
+CONFIG_PROC_SYSCTL=y
+# CONFIG_PROC_PAGE_MONITOR is not set
+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=y
+CONFIG_JFFS2_FS_POSIX_ACL=y
+# CONFIG_JFFS2_FS_SECURITY 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_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_NILFS2_FS is not set
+# CONFIG_NETWORK_FILESYSTEMS is not set
+
+#
+# Partition Types
+#
+# CONFIG_PARTITION_ADVANCED is not set
+CONFIG_MSDOS_PARTITION=y
+# CONFIG_NLS is not set
+
+#
+# Kernel hacking
+#
+# CONFIG_PRINTK_TIME is not set
+# CONFIG_ENABLE_WARN_DEPRECATED is not set
+CONFIG_ENABLE_MUST_CHECK=y
+CONFIG_FRAME_WARN=1024
+CONFIG_MAGIC_SYSRQ=y
+# CONFIG_UNUSED_SYMBOLS is not set
+# CONFIG_DEBUG_FS is not set
+CONFIG_HEADERS_CHECK=y
+# CONFIG_DEBUG_KERNEL is not set
+# CONFIG_DEBUG_BUGVERBOSE is not set
+# CONFIG_DEBUG_MEMORY_INIT is not set
+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_BUILD_DOCSRC 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
+
+#
+# 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_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_HAS_IOMEM=y
+CONFIG_HAS_IOPORT=y
+CONFIG_HAS_DMA=y
+CONFIG_NLATTR=y
diff --git a/arch/arm/configs/cpu9260_defconfig b/arch/arm/configs/cpu9260_defconfig
new file mode 100644 (file)
index 0000000..601e7f3
--- /dev/null
@@ -0,0 +1,1338 @@
+#
+# Automatically generated make config: don't edit
+# Linux kernel version: 2.6.31-rc3
+# Tue Jul 14 14:57:55 2009
+#
+CONFIG_ARM=y
+CONFIG_SYS_SUPPORTS_APM_EMULATION=y
+CONFIG_GENERIC_GPIO=y
+CONFIG_GENERIC_TIME=y
+CONFIG_GENERIC_CLOCKEVENTS=y
+CONFIG_MMU=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_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_CLASSIC_RCU=y
+# CONFIG_TREE_RCU is not set
+# CONFIG_PREEMPT_RCU is not set
+# CONFIG_TREE_RCU_TRACE is not set
+# CONFIG_PREEMPT_RCU_TRACE is not set
+# CONFIG_IKCONFIG is not set
+CONFIG_LOG_BUF_SHIFT=14
+# CONFIG_GROUP_SCHED is not set
+# CONFIG_CGROUPS is not set
+CONFIG_SYSFS_DEPRECATED=y
+CONFIG_SYSFS_DEPRECATED_V2=y
+# 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 is not set
+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
+
+#
+# Performance Counters
+#
+CONFIG_VM_EVENT_COUNTERS=y
+CONFIG_SLUB_DEBUG=y
+# CONFIG_STRIP_ASM_SYMS is not set
+CONFIG_COMPAT_BRK=y
+# CONFIG_SLAB is not set
+CONFIG_SLUB=y
+# CONFIG_SLOB is not set
+# CONFIG_PROFILING is not set
+# CONFIG_MARKERS 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=y
+# CONFIG_BLK_DEV_BSG is not set
+# CONFIG_BLK_DEV_INTEGRITY is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+# CONFIG_IOSCHED_AS is not set
+CONFIG_IOSCHED_DEADLINE=y
+# CONFIG_IOSCHED_CFQ is not set
+# CONFIG_DEFAULT_AS is not set
+CONFIG_DEFAULT_DEADLINE=y
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="deadline"
+# CONFIG_FREEZER is not set
+
+#
+# System Type
+#
+# 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_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_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
+
+#
+# Atmel AT91 System-on-Chip
+#
+# CONFIG_ARCH_AT91RM9200 is not set
+CONFIG_ARCH_AT91SAM9260=y
+# CONFIG_ARCH_AT91SAM9261 is not set
+# CONFIG_ARCH_AT91SAM9263 is not set
+# CONFIG_ARCH_AT91SAM9RL is not set
+# CONFIG_ARCH_AT91SAM9G20 is not set
+# CONFIG_ARCH_AT91CAP9 is not set
+# CONFIG_ARCH_AT91X40 is not set
+CONFIG_AT91_PMC_UNIT=y
+
+#
+# AT91SAM9260 Variants
+#
+# CONFIG_ARCH_AT91SAM9260_SAM9XE is not set
+
+#
+# AT91SAM9260 / AT91SAM9XE Board Type
+#
+# CONFIG_MACH_AT91SAM9260EK is not set
+# CONFIG_MACH_CAM60 is not set
+# CONFIG_MACH_SAM9_L9260 is not set
+# CONFIG_MACH_AFEB9260 is not set
+# CONFIG_MACH_USB_A9260 is not set
+# CONFIG_MACH_QIL_A9260 is not set
+CONFIG_MACH_CPU9260=y
+
+#
+# AT91 Board Options
+#
+
+#
+# AT91 Feature Selections
+#
+# CONFIG_AT91_PROGRAMMABLE_CLOCKS is not set
+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_32=y
+CONFIG_CPU_ARM926T=y
+CONFIG_CPU_32v5=y
+CONFIG_CPU_ABRT_EV5TJ=y
+CONFIG_CPU_PABRT_NOIFAR=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 is not set
+# 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
+
+#
+# Bus support
+#
+# 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=y
+CONFIG_HZ=100
+CONFIG_AEABI=y
+CONFIG_OABI_COMPAT=y
+# 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_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=""
+# 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 is not set
+
+#
+# Power management options
+#
+# CONFIG_PM is not set
+CONFIG_ARCH_SUSPEND_POSSIBLE=y
+CONFIG_NET=y
+
+#
+# Networking options
+#
+CONFIG_PACKET=y
+# CONFIG_PACKET_MMAP is not set
+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=y
+# CONFIG_IP_PNP_DHCP is not set
+# CONFIG_IP_PNP_BOOTP is not set
+# CONFIG_IP_PNP_RARP 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=y
+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_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_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_CONCAT is not set
+CONFIG_MTD_PARTITIONS=y
+# CONFIG_MTD_TESTS is not set
+# 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=y
+# CONFIG_MTD_JEDECPROBE is not set
+CONFIG_MTD_GEN_PROBE=y
+# CONFIG_MTD_CFI_ADV_OPTIONS 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_CFI_INTELEXT=y
+# CONFIG_MTD_CFI_AMDSTD is not set
+# CONFIG_MTD_CFI_STAA is not set
+CONFIG_MTD_CFI_UTIL=y
+CONFIG_MTD_RAM=y
+# 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_PHYSMAP=y
+# CONFIG_MTD_PHYSMAP_COMPAT is not set
+# CONFIG_MTD_ARM_INTEGRATOR is not set
+CONFIG_MTD_PLATRAM=y
+
+#
+# Self-contained MTD device drivers
+#
+# 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=y
+# CONFIG_MTD_NAND_ATMEL_ECC_SOFT is not set
+# 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
+CONFIG_BLK_DEV_NBD=y
+# CONFIG_BLK_DEV_UB is not set
+CONFIG_BLK_DEV_RAM=y
+CONFIG_BLK_DEV_RAM_COUNT=16
+CONFIG_BLK_DEV_RAM_SIZE=4096
+# 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=y
+# 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=y
+CONFIG_MACB=y
+# CONFIG_AX88796 is not set
+# CONFIG_SMC91X is not set
+# CONFIG_DM9000 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_NETDEV_1000 is not set
+# CONFIG_NETDEV_10000 is not set
+
+#
+# Wireless LAN
+#
+# CONFIG_WLAN_PRE80211 is not set
+# CONFIG_WLAN_80211 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=y
+# CONFIG_PPP_MULTILINK is not set
+# CONFIG_PPP_FILTER is not set
+CONFIG_PPP_ASYNC=y
+# CONFIG_PPP_SYNC_TTY is not set
+CONFIG_PPP_DEFLATE=y
+CONFIG_PPP_BSDCOMP=y
+# CONFIG_PPP_MPPE is not set
+# CONFIG_PPPOE is not set
+# CONFIG_PPPOL2TP is not set
+# CONFIG_SLIP is not set
+CONFIG_SLHC=y
+# CONFIG_NETCONSOLE is not set
+# CONFIG_NETPOLL is not set
+# CONFIG_NET_POLL_CONTROLLER is not set
+# CONFIG_ISDN is not set
+
+#
+# Input device support
+#
+CONFIG_INPUT=y
+# CONFIG_INPUT_FF_MEMLESS is not set
+# 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=y
+# CONFIG_KEYBOARD_ATKBD is not set
+# CONFIG_KEYBOARD_LKKBD is not set
+CONFIG_KEYBOARD_GPIO=y
+# CONFIG_KEYBOARD_MATRIX is not set
+# CONFIG_KEYBOARD_LM8323 is not set
+# CONFIG_KEYBOARD_NEWTON is not set
+# CONFIG_KEYBOARD_STOWAWAY is not set
+# CONFIG_KEYBOARD_SUNKBD is not set
+# CONFIG_KEYBOARD_XTKBD 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_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+CONFIG_UNIX98_PTYS=y
+# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=32
+# 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_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
+
+#
+# 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_DS1682 is not set
+# CONFIG_SENSORS_PCF8574 is not set
+# CONFIG_PCF8575 is not set
+# CONFIG_SENSORS_PCA9539 is not set
+# 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 is not set
+CONFIG_ARCH_REQUIRE_GPIOLIB=y
+CONFIG_GPIOLIB=y
+CONFIG_GPIO_SYSFS=y
+
+#
+# Memory mapped GPIO expanders:
+#
+
+#
+# I2C GPIO expanders:
+#
+# CONFIG_GPIO_MAX732X is not set
+# CONFIG_GPIO_PCA953X is not set
+# CONFIG_GPIO_PCF857X is not set
+
+#
+# PCI GPIO expanders:
+#
+
+#
+# SPI GPIO expanders:
+#
+# CONFIG_W1 is not set
+# CONFIG_POWER_SUPPLY is not set
+# CONFIG_HWMON is not set
+# CONFIG_THERMAL is not set
+# CONFIG_THERMAL_HWMON is not set
+CONFIG_WATCHDOG=y
+CONFIG_WATCHDOG_NOWAYOUT=y
+
+#
+# Watchdog Device Drivers
+#
+# CONFIG_SOFT_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_SM501 is not set
+# CONFIG_MFD_ASIC3 is not set
+# CONFIG_HTC_EGPIO is not set
+# CONFIG_HTC_PASIC3 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_MFD_WM8400 is not set
+# CONFIG_MFD_WM8350_I2C is not set
+# CONFIG_MFD_PCF50633 is not set
+# CONFIG_AB3100_CORE 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 is not set
+# CONFIG_USB_DEVICE_CLASS is not set
+# CONFIG_USB_DYNAMIC_MINORS is not set
+# CONFIG_USB_OTG is not set
+# CONFIG_USB_MON is not set
+# 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_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_BERRY_CHARGE 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_ISIGHTFW is not set
+# CONFIG_USB_VST is not set
+CONFIG_USB_GADGET=y
+# 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=y
+# 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_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 is not set
+# CONFIG_USB_AUDIO is not set
+CONFIG_USB_ETH=y
+CONFIG_USB_ETH_RNDIS=y
+# CONFIG_USB_GADGETFS is not set
+# CONFIG_USB_FILE_STORAGE is not set
+# CONFIG_USB_G_SERIAL is not set
+# CONFIG_USB_MIDI_GADGET is not set
+# CONFIG_USB_G_PRINTER is not set
+# CONFIG_USB_CDC_COMPOSITE is not set
+
+#
+# OTG and related infrastructure
+#
+# CONFIG_USB_GPIO_VBUS 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=y
+# CONFIG_MEMSTICK is not set
+# CONFIG_ACCESSIBILITY 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_BD2802 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=y
+CONFIG_LEDS_TRIGGER_DEFAULT_ON=y
+
+#
+# iptables trigger is under Netfilter config (LED target)
+#
+CONFIG_RTC_LIB=y
+CONFIG_RTC_CLASS=y
+# CONFIG_RTC_HCTOSYS is not set
+# 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=y
+# 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_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
+#
+
+#
+# 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_BQ4802 is not set
+# CONFIG_RTC_DRV_V3020 is not set
+
+#
+# on-CPU RTC drivers
+#
+# CONFIG_RTC_DRV_AT91SAM9 is not set
+# CONFIG_DMADEVICES is not set
+# CONFIG_AUXDISPLAY is not set
+# CONFIG_REGULATOR is not set
+# CONFIG_UIO is not set
+# 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 is not set
+# CONFIG_EXT4_FS is not set
+CONFIG_JBD=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_OCFS2_FS is not set
+# CONFIG_BTRFS_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=y
+# 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=y
+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_CRAMFS=y
+# CONFIG_SQUASHFS is not set
+# CONFIG_VXFS_FS is not set
+CONFIG_MINIX_FS=y
+# 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_NILFS2_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_ROOT_NFS=y
+# 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=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="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 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 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 is not set
+# 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_UNUSED_SYMBOLS is not set
+# CONFIG_DEBUG_FS is not set
+# CONFIG_HEADERS_CHECK is not set
+# CONFIG_DEBUG_KERNEL is not set
+# CONFIG_SLUB_DEBUG_ON is not set
+# CONFIG_SLUB_STATS is not set
+CONFIG_DEBUG_BUGVERBOSE=y
+CONFIG_DEBUG_MEMORY_INIT=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=y
+# CONFIG_DEBUG_USER 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_BITREVERSE=y
+CONFIG_GENERIC_FIND_LAST_BIT=y
+CONFIG_CRC_CCITT=y
+# 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_HAS_IOMEM=y
+CONFIG_HAS_IOPORT=y
+CONFIG_HAS_DMA=y
+CONFIG_NLATTR=y
diff --git a/arch/arm/configs/cpu9g20_defconfig b/arch/arm/configs/cpu9g20_defconfig
new file mode 100644 (file)
index 0000000..b5b9cbb
--- /dev/null
@@ -0,0 +1,1328 @@
+#
+# Automatically generated make config: don't edit
+# Linux kernel version: 2.6.31-rc3
+# Tue Jul 14 15:03:43 2009
+#
+CONFIG_ARM=y
+CONFIG_SYS_SUPPORTS_APM_EMULATION=y
+CONFIG_GENERIC_GPIO=y
+CONFIG_GENERIC_TIME=y
+CONFIG_GENERIC_CLOCKEVENTS=y
+CONFIG_MMU=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_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_CLASSIC_RCU=y
+# CONFIG_TREE_RCU is not set
+# CONFIG_PREEMPT_RCU is not set
+# CONFIG_TREE_RCU_TRACE is not set
+# CONFIG_PREEMPT_RCU_TRACE is not set
+# CONFIG_IKCONFIG is not set
+CONFIG_LOG_BUF_SHIFT=14
+# CONFIG_GROUP_SCHED is not set
+# CONFIG_CGROUPS is not set
+CONFIG_SYSFS_DEPRECATED=y
+CONFIG_SYSFS_DEPRECATED_V2=y
+# 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 is not set
+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
+
+#
+# Performance Counters
+#
+CONFIG_VM_EVENT_COUNTERS=y
+CONFIG_SLUB_DEBUG=y
+# CONFIG_STRIP_ASM_SYMS is not set
+CONFIG_COMPAT_BRK=y
+# CONFIG_SLAB is not set
+CONFIG_SLUB=y
+# CONFIG_SLOB is not set
+# CONFIG_PROFILING is not set
+# CONFIG_MARKERS 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=y
+# CONFIG_BLK_DEV_BSG is not set
+# CONFIG_BLK_DEV_INTEGRITY is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+# CONFIG_IOSCHED_AS is not set
+CONFIG_IOSCHED_DEADLINE=y
+# CONFIG_IOSCHED_CFQ is not set
+# CONFIG_DEFAULT_AS is not set
+CONFIG_DEFAULT_DEADLINE=y
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="deadline"
+# CONFIG_FREEZER is not set
+
+#
+# System Type
+#
+# 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_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_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
+
+#
+# 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_AT91SAM9263 is not set
+# CONFIG_ARCH_AT91SAM9RL is not set
+CONFIG_ARCH_AT91SAM9G20=y
+# CONFIG_ARCH_AT91CAP9 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_CPU9G20=y
+
+#
+# AT91 Board Options
+#
+
+#
+# AT91 Feature Selections
+#
+# CONFIG_AT91_PROGRAMMABLE_CLOCKS is not set
+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_32=y
+CONFIG_CPU_ARM926T=y
+CONFIG_CPU_32v5=y
+CONFIG_CPU_ABRT_EV5TJ=y
+CONFIG_CPU_PABRT_NOIFAR=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 is not set
+# 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
+
+#
+# Bus support
+#
+# 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=y
+CONFIG_HZ=100
+CONFIG_AEABI=y
+CONFIG_OABI_COMPAT=y
+# 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_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=""
+# 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 is not set
+
+#
+# Power management options
+#
+# CONFIG_PM is not set
+CONFIG_ARCH_SUSPEND_POSSIBLE=y
+CONFIG_NET=y
+
+#
+# Networking options
+#
+CONFIG_PACKET=y
+# CONFIG_PACKET_MMAP is not set
+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=y
+# CONFIG_IP_PNP_DHCP is not set
+# CONFIG_IP_PNP_BOOTP is not set
+# CONFIG_IP_PNP_RARP 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=y
+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_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_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_CONCAT is not set
+CONFIG_MTD_PARTITIONS=y
+# CONFIG_MTD_TESTS is not set
+# 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=y
+# CONFIG_MTD_JEDECPROBE is not set
+CONFIG_MTD_GEN_PROBE=y
+# CONFIG_MTD_CFI_ADV_OPTIONS 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_CFI_INTELEXT=y
+# CONFIG_MTD_CFI_AMDSTD is not set
+# CONFIG_MTD_CFI_STAA is not set
+CONFIG_MTD_CFI_UTIL=y
+CONFIG_MTD_RAM=y
+# 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_PHYSMAP=y
+# CONFIG_MTD_PHYSMAP_COMPAT is not set
+# CONFIG_MTD_ARM_INTEGRATOR is not set
+CONFIG_MTD_PLATRAM=y
+
+#
+# Self-contained MTD device drivers
+#
+# 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
+CONFIG_BLK_DEV_NBD=y
+# CONFIG_BLK_DEV_UB is not set
+CONFIG_BLK_DEV_RAM=y
+CONFIG_BLK_DEV_RAM_COUNT=16
+CONFIG_BLK_DEV_RAM_SIZE=4096
+# 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=y
+# 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=y
+CONFIG_MACB=y
+# CONFIG_AX88796 is not set
+# CONFIG_SMC91X is not set
+# CONFIG_DM9000 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_NETDEV_1000 is not set
+# CONFIG_NETDEV_10000 is not set
+
+#
+# Wireless LAN
+#
+# CONFIG_WLAN_PRE80211 is not set
+# CONFIG_WLAN_80211 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=y
+# CONFIG_PPP_MULTILINK is not set
+# CONFIG_PPP_FILTER is not set
+CONFIG_PPP_ASYNC=y
+# CONFIG_PPP_SYNC_TTY is not set
+CONFIG_PPP_DEFLATE=y
+CONFIG_PPP_BSDCOMP=y
+# CONFIG_PPP_MPPE is not set
+# CONFIG_PPPOE is not set
+# CONFIG_PPPOL2TP is not set
+# CONFIG_SLIP is not set
+CONFIG_SLHC=y
+# CONFIG_NETCONSOLE is not set
+# CONFIG_NETPOLL is not set
+# CONFIG_NET_POLL_CONTROLLER is not set
+# CONFIG_ISDN is not set
+
+#
+# Input device support
+#
+CONFIG_INPUT=y
+# CONFIG_INPUT_FF_MEMLESS is not set
+# 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=y
+# CONFIG_KEYBOARD_ATKBD is not set
+# CONFIG_KEYBOARD_LKKBD is not set
+CONFIG_KEYBOARD_GPIO=y
+# CONFIG_KEYBOARD_MATRIX is not set
+# CONFIG_KEYBOARD_LM8323 is not set
+# CONFIG_KEYBOARD_NEWTON is not set
+# CONFIG_KEYBOARD_STOWAWAY is not set
+# CONFIG_KEYBOARD_SUNKBD is not set
+# CONFIG_KEYBOARD_XTKBD 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_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+CONFIG_UNIX98_PTYS=y
+# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=32
+# 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_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
+
+#
+# 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_DS1682 is not set
+# CONFIG_SENSORS_PCF8574 is not set
+# CONFIG_PCF8575 is not set
+# CONFIG_SENSORS_PCA9539 is not set
+# 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 is not set
+CONFIG_ARCH_REQUIRE_GPIOLIB=y
+CONFIG_GPIOLIB=y
+CONFIG_GPIO_SYSFS=y
+
+#
+# Memory mapped GPIO expanders:
+#
+
+#
+# I2C GPIO expanders:
+#
+# CONFIG_GPIO_MAX732X is not set
+# CONFIG_GPIO_PCA953X is not set
+# CONFIG_GPIO_PCF857X is not set
+
+#
+# PCI GPIO expanders:
+#
+
+#
+# SPI GPIO expanders:
+#
+# CONFIG_W1 is not set
+# CONFIG_POWER_SUPPLY is not set
+# CONFIG_HWMON is not set
+# CONFIG_THERMAL is not set
+# CONFIG_THERMAL_HWMON is not set
+CONFIG_WATCHDOG=y
+CONFIG_WATCHDOG_NOWAYOUT=y
+
+#
+# Watchdog Device Drivers
+#
+# CONFIG_SOFT_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_SM501 is not set
+# CONFIG_MFD_ASIC3 is not set
+# CONFIG_HTC_EGPIO is not set
+# CONFIG_HTC_PASIC3 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_MFD_WM8400 is not set
+# CONFIG_MFD_WM8350_I2C is not set
+# CONFIG_MFD_PCF50633 is not set
+# CONFIG_AB3100_CORE 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 is not set
+# CONFIG_USB_DEVICE_CLASS is not set
+# CONFIG_USB_DYNAMIC_MINORS is not set
+# CONFIG_USB_OTG is not set
+# CONFIG_USB_MON is not set
+# 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_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_BERRY_CHARGE 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_ISIGHTFW is not set
+# CONFIG_USB_VST is not set
+CONFIG_USB_GADGET=y
+# 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=y
+# 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_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 is not set
+# CONFIG_USB_AUDIO is not set
+CONFIG_USB_ETH=y
+CONFIG_USB_ETH_RNDIS=y
+# CONFIG_USB_GADGETFS is not set
+# CONFIG_USB_FILE_STORAGE is not set
+# CONFIG_USB_G_SERIAL is not set
+# CONFIG_USB_MIDI_GADGET is not set
+# CONFIG_USB_G_PRINTER is not set
+# CONFIG_USB_CDC_COMPOSITE is not set
+
+#
+# OTG and related infrastructure
+#
+# CONFIG_USB_GPIO_VBUS 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=y
+# CONFIG_MEMSTICK is not set
+# CONFIG_ACCESSIBILITY 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_BD2802 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=y
+CONFIG_LEDS_TRIGGER_DEFAULT_ON=y
+
+#
+# iptables trigger is under Netfilter config (LED target)
+#
+CONFIG_RTC_LIB=y
+CONFIG_RTC_CLASS=y
+# CONFIG_RTC_HCTOSYS is not set
+# 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=y
+# 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_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
+#
+
+#
+# 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_BQ4802 is not set
+# CONFIG_RTC_DRV_V3020 is not set
+
+#
+# on-CPU RTC drivers
+#
+# CONFIG_RTC_DRV_AT91SAM9 is not set
+# CONFIG_DMADEVICES is not set
+# CONFIG_AUXDISPLAY is not set
+# CONFIG_REGULATOR is not set
+# CONFIG_UIO is not set
+# 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 is not set
+# CONFIG_EXT4_FS is not set
+CONFIG_JBD=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_OCFS2_FS is not set
+# CONFIG_BTRFS_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=y
+# 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=y
+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_CRAMFS=y
+# CONFIG_SQUASHFS is not set
+# CONFIG_VXFS_FS is not set
+CONFIG_MINIX_FS=y
+# 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_NILFS2_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_ROOT_NFS=y
+# 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=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="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 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 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 is not set
+# 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_UNUSED_SYMBOLS is not set
+# CONFIG_DEBUG_FS is not set
+# CONFIG_HEADERS_CHECK is not set
+# CONFIG_DEBUG_KERNEL is not set
+# CONFIG_SLUB_DEBUG_ON is not set
+# CONFIG_SLUB_STATS is not set
+CONFIG_DEBUG_BUGVERBOSE=y
+CONFIG_DEBUG_MEMORY_INIT=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=y
+# CONFIG_DEBUG_USER 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_BITREVERSE=y
+CONFIG_GENERIC_FIND_LAST_BIT=y
+CONFIG_CRC_CCITT=y
+# 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_HAS_IOMEM=y
+CONFIG_HAS_IOPORT=y
+CONFIG_HAS_DMA=y
+CONFIG_NLATTR=y
diff --git a/arch/arm/configs/cpuat91_defconfig b/arch/arm/configs/cpuat91_defconfig
new file mode 100644 (file)
index 0000000..4901827
--- /dev/null
@@ -0,0 +1,1316 @@
+#
+# Automatically generated make config: don't edit
+# Linux kernel version: 2.6.31-rc3
+# Tue Jul 14 14:45:01 2009
+#
+CONFIG_ARM=y
+CONFIG_SYS_SUPPORTS_APM_EMULATION=y
+CONFIG_GENERIC_GPIO=y
+CONFIG_GENERIC_TIME=y
+CONFIG_GENERIC_CLOCKEVENTS=y
+CONFIG_MMU=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_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_CLASSIC_RCU=y
+# CONFIG_TREE_RCU is not set
+# CONFIG_PREEMPT_RCU is not set
+# CONFIG_TREE_RCU_TRACE is not set
+# CONFIG_PREEMPT_RCU_TRACE is not set
+# CONFIG_IKCONFIG is not set
+CONFIG_LOG_BUF_SHIFT=14
+# CONFIG_GROUP_SCHED is not set
+# CONFIG_CGROUPS is not set
+CONFIG_SYSFS_DEPRECATED=y
+CONFIG_SYSFS_DEPRECATED_V2=y
+# 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 is not set
+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
+
+#
+# Performance Counters
+#
+CONFIG_VM_EVENT_COUNTERS=y
+CONFIG_SLUB_DEBUG=y
+# CONFIG_STRIP_ASM_SYMS is not set
+CONFIG_COMPAT_BRK=y
+# CONFIG_SLAB is not set
+CONFIG_SLUB=y
+# CONFIG_SLOB is not set
+# CONFIG_PROFILING is not set
+# CONFIG_MARKERS 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=y
+# CONFIG_BLK_DEV_BSG is not set
+# CONFIG_BLK_DEV_INTEGRITY is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+# CONFIG_IOSCHED_AS is not set
+CONFIG_IOSCHED_DEADLINE=y
+# CONFIG_IOSCHED_CFQ is not set
+# CONFIG_DEFAULT_AS is not set
+CONFIG_DEFAULT_DEADLINE=y
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="deadline"
+# CONFIG_FREEZER is not set
+
+#
+# System Type
+#
+# 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_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_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
+
+#
+# Atmel AT91 System-on-Chip
+#
+CONFIG_ARCH_AT91RM9200=y
+# CONFIG_ARCH_AT91SAM9260 is not set
+# CONFIG_ARCH_AT91SAM9261 is not set
+# CONFIG_ARCH_AT91SAM9263 is not set
+# CONFIG_ARCH_AT91SAM9RL is not set
+# CONFIG_ARCH_AT91SAM9G20 is not set
+# CONFIG_ARCH_AT91CAP9 is not set
+# CONFIG_ARCH_AT91X40 is not set
+CONFIG_AT91_PMC_UNIT=y
+
+#
+# AT91RM9200 Board Type
+#
+# CONFIG_MACH_ONEARM is not set
+# CONFIG_ARCH_AT91RM9200DK is not set
+# CONFIG_MACH_AT91RM9200EK is not set
+# CONFIG_MACH_CSB337 is not set
+# CONFIG_MACH_CSB637 is not set
+# CONFIG_MACH_CARMEVA is not set
+# CONFIG_MACH_ATEB9200 is not set
+# CONFIG_MACH_KB9200 is not set
+# CONFIG_MACH_PICOTUX2XX is not set
+# CONFIG_MACH_KAFA is not set
+# CONFIG_MACH_ECBAT91 is not set
+# CONFIG_MACH_YL9200 is not set
+CONFIG_MACH_CPUAT91=y
+
+#
+# AT91 Board Options
+#
+
+#
+# AT91 Feature Selections
+#
+# CONFIG_AT91_PROGRAMMABLE_CLOCKS is not set
+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_32=y
+CONFIG_CPU_ARM920T=y
+CONFIG_CPU_32v4T=y
+CONFIG_CPU_ABRT_EV4T=y
+CONFIG_CPU_PABRT_NOIFAR=y
+CONFIG_CPU_CACHE_V4WT=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 is not set
+# CONFIG_CPU_ICACHE_DISABLE is not set
+# CONFIG_CPU_DCACHE_DISABLE is not set
+# CONFIG_CPU_DCACHE_WRITETHROUGH is not set
+
+#
+# Bus support
+#
+# 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=y
+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_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=""
+# 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
+
+#
+# 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
+# CONFIG_ARTHUR is not set
+
+#
+# Power management options
+#
+# CONFIG_PM is not set
+CONFIG_ARCH_SUSPEND_POSSIBLE=y
+CONFIG_NET=y
+
+#
+# Networking options
+#
+CONFIG_PACKET=y
+# CONFIG_PACKET_MMAP is not set
+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=y
+# CONFIG_IP_PNP_DHCP is not set
+# CONFIG_IP_PNP_BOOTP is not set
+# CONFIG_IP_PNP_RARP 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=y
+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_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_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_CONCAT is not set
+CONFIG_MTD_PARTITIONS=y
+# CONFIG_MTD_TESTS is not set
+# 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=y
+# CONFIG_MTD_JEDECPROBE is not set
+CONFIG_MTD_GEN_PROBE=y
+# CONFIG_MTD_CFI_ADV_OPTIONS 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_CFI_INTELEXT=y
+# CONFIG_MTD_CFI_AMDSTD is not set
+# CONFIG_MTD_CFI_STAA is not set
+CONFIG_MTD_CFI_UTIL=y
+CONFIG_MTD_RAM=y
+# 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_PHYSMAP=y
+# CONFIG_MTD_PHYSMAP_COMPAT is not set
+# CONFIG_MTD_ARM_INTEGRATOR is not set
+CONFIG_MTD_PLATRAM=y
+
+#
+# Self-contained MTD device drivers
+#
+# 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 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
+CONFIG_BLK_DEV_NBD=y
+# CONFIG_BLK_DEV_UB is not set
+CONFIG_BLK_DEV_RAM=y
+CONFIG_BLK_DEV_RAM_COUNT=16
+CONFIG_BLK_DEV_RAM_SIZE=4096
+# 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=y
+CONFIG_ARM_AT91_ETHER=y
+# CONFIG_AX88796 is not set
+# CONFIG_SMC91X is not set
+# CONFIG_DM9000 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_NETDEV_1000 is not set
+# CONFIG_NETDEV_10000 is not set
+
+#
+# Wireless LAN
+#
+# CONFIG_WLAN_PRE80211 is not set
+# CONFIG_WLAN_80211 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=y
+# CONFIG_PPP_MULTILINK is not set
+# CONFIG_PPP_FILTER is not set
+CONFIG_PPP_ASYNC=y
+# CONFIG_PPP_SYNC_TTY is not set
+CONFIG_PPP_DEFLATE=y
+CONFIG_PPP_BSDCOMP=y
+# CONFIG_PPP_MPPE is not set
+# CONFIG_PPPOE is not set
+# CONFIG_PPPOL2TP is not set
+# CONFIG_SLIP is not set
+CONFIG_SLHC=y
+# CONFIG_NETCONSOLE is not set
+# CONFIG_NETPOLL is not set
+# CONFIG_NET_POLL_CONTROLLER is not set
+# CONFIG_ISDN is not set
+
+#
+# Input device support
+#
+CONFIG_INPUT=y
+# CONFIG_INPUT_FF_MEMLESS is not set
+# 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 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_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+CONFIG_UNIX98_PTYS=y
+# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=32
+# 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_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
+
+#
+# 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_DS1682 is not set
+# CONFIG_SENSORS_PCF8574 is not set
+# CONFIG_PCF8575 is not set
+# CONFIG_SENSORS_PCA9539 is not set
+# 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 is not set
+CONFIG_ARCH_REQUIRE_GPIOLIB=y
+CONFIG_GPIOLIB=y
+CONFIG_GPIO_SYSFS=y
+
+#
+# Memory mapped GPIO expanders:
+#
+
+#
+# I2C GPIO expanders:
+#
+# CONFIG_GPIO_MAX732X is not set
+# CONFIG_GPIO_PCA953X is not set
+# CONFIG_GPIO_PCF857X is not set
+
+#
+# PCI GPIO expanders:
+#
+
+#
+# SPI GPIO expanders:
+#
+# CONFIG_W1 is not set
+# CONFIG_POWER_SUPPLY is not set
+# CONFIG_HWMON is not set
+# CONFIG_THERMAL is not set
+# CONFIG_THERMAL_HWMON is not set
+CONFIG_WATCHDOG=y
+CONFIG_WATCHDOG_NOWAYOUT=y
+
+#
+# Watchdog Device Drivers
+#
+# CONFIG_SOFT_WATCHDOG is not set
+CONFIG_AT91RM9200_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_SM501 is not set
+# CONFIG_MFD_ASIC3 is not set
+# CONFIG_HTC_EGPIO is not set
+# CONFIG_HTC_PASIC3 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_MFD_WM8400 is not set
+# CONFIG_MFD_WM8350_I2C is not set
+# CONFIG_MFD_PCF50633 is not set
+# CONFIG_AB3100_CORE 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 is not set
+# CONFIG_USB_DEVICE_CLASS is not set
+# CONFIG_USB_DYNAMIC_MINORS is not set
+# CONFIG_USB_OTG is not set
+# CONFIG_USB_MON is not set
+# 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_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_BERRY_CHARGE 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_ISIGHTFW is not set
+# CONFIG_USB_VST is not set
+CONFIG_USB_GADGET=y
+# 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=y
+# 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_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 is not set
+# CONFIG_USB_AUDIO is not set
+CONFIG_USB_ETH=y
+CONFIG_USB_ETH_RNDIS=y
+# CONFIG_USB_GADGETFS is not set
+# CONFIG_USB_FILE_STORAGE is not set
+# CONFIG_USB_G_SERIAL is not set
+# CONFIG_USB_MIDI_GADGET is not set
+# CONFIG_USB_G_PRINTER is not set
+# CONFIG_USB_CDC_COMPOSITE is not set
+
+#
+# OTG and related infrastructure
+#
+# CONFIG_USB_GPIO_VBUS 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=y
+# CONFIG_MEMSTICK is not set
+# CONFIG_ACCESSIBILITY 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_BD2802 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=y
+CONFIG_LEDS_TRIGGER_DEFAULT_ON=y
+
+#
+# iptables trigger is under Netfilter config (LED target)
+#
+CONFIG_RTC_LIB=y
+CONFIG_RTC_CLASS=y
+# CONFIG_RTC_HCTOSYS is not set
+# 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=y
+# 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=y
+# CONFIG_RTC_DRV_PCF8583 is not set
+# CONFIG_RTC_DRV_M41T80 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
+#
+
+#
+# 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_BQ4802 is not set
+# CONFIG_RTC_DRV_V3020 is not set
+
+#
+# on-CPU RTC drivers
+#
+# CONFIG_RTC_DRV_AT91RM9200 is not set
+# CONFIG_DMADEVICES is not set
+# CONFIG_AUXDISPLAY is not set
+# CONFIG_REGULATOR is not set
+# CONFIG_UIO is not set
+# 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 is not set
+# CONFIG_EXT4_FS is not set
+CONFIG_JBD=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_OCFS2_FS is not set
+# CONFIG_BTRFS_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=y
+# 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=y
+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_CRAMFS=y
+# CONFIG_SQUASHFS is not set
+# CONFIG_VXFS_FS is not set
+CONFIG_MINIX_FS=y
+# 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_NILFS2_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_ROOT_NFS=y
+# 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=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="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 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 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 is not set
+# 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_UNUSED_SYMBOLS is not set
+# CONFIG_DEBUG_FS is not set
+# CONFIG_HEADERS_CHECK is not set
+# CONFIG_DEBUG_KERNEL is not set
+# CONFIG_SLUB_DEBUG_ON is not set
+# CONFIG_SLUB_STATS 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_DEBUG_USER 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_BITREVERSE=y
+CONFIG_GENERIC_FIND_LAST_BIT=y
+CONFIG_CRC_CCITT=y
+# 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_HAS_IOMEM=y
+CONFIG_HAS_IOPORT=y
+CONFIG_HAS_DMA=y
+CONFIG_NLATTR=y
index 4da332b03144c4d27bf07876506f2c94f72adb0b..b490ecc79defdfa2cb721dbbff30c8c17ff8f6f4 100644 (file)
@@ -10,6 +10,8 @@ struct mmc_platform_data {
        unsigned int ocr_mask;                  /* available voltages */
        u32 (*translate_vdd)(struct device *, unsigned int);
        unsigned int (*status)(struct device *);
+       int     gpio_wp;
+       int     gpio_cd;
 };
 
 #endif
index 99995c2b2312551917f19492194f0b2966425425..769abe15cf91d280425a95bf7042642c2214e68b 100644 (file)
@@ -31,7 +31,7 @@ void crunch_task_release(struct thread_info *thread)
 
 static int crunch_enabled(u32 devcfg)
 {
-       return !!(devcfg & EP93XX_SYSCON_DEVICE_CONFIG_CRUNCH_ENABLE);
+       return !!(devcfg & EP93XX_SYSCON_DEVCFG_CPENA);
 }
 
 static int crunch_do(struct notifier_block *self, unsigned long cmd, void *t)
@@ -56,11 +56,16 @@ static int crunch_do(struct notifier_block *self, unsigned long cmd, void *t)
                break;
 
        case THREAD_NOTIFY_SWITCH:
-               devcfg = __raw_readl(EP93XX_SYSCON_DEVICE_CONFIG);
+               devcfg = __raw_readl(EP93XX_SYSCON_DEVCFG);
                if (crunch_enabled(devcfg) || crunch_owner == crunch_state) {
-                       devcfg ^= EP93XX_SYSCON_DEVICE_CONFIG_CRUNCH_ENABLE;
+                       /*
+                        * We don't use ep93xx_syscon_swlocked_write() here
+                        * because we are on the context switch path and
+                        * preemption is already disabled.
+                        */
+                       devcfg ^= EP93XX_SYSCON_DEVCFG_CPENA;
                        __raw_writel(0xaa, EP93XX_SYSCON_SWLOCK);
-                       __raw_writel(devcfg, EP93XX_SYSCON_DEVICE_CONFIG);
+                       __raw_writel(devcfg, EP93XX_SYSCON_DEVCFG);
                }
                break;
        }
index 323b47f2b52f20d7478eafa4a068940ba1c2bb91..a24d824c428b3cf1e3aa45c31a7f53f8bb9a7d2d 100644 (file)
@@ -23,6 +23,12 @@ config ARCH_AT91SAM9261
        select GENERIC_TIME
        select GENERIC_CLOCKEVENTS
 
+config ARCH_AT91SAM9G10
+       bool "AT91SAM9G10"
+       select CPU_ARM926T
+       select GENERIC_TIME
+       select GENERIC_CLOCKEVENTS
+
 config ARCH_AT91SAM9263
        bool "AT91SAM9263"
        select CPU_ARM926T
@@ -41,6 +47,12 @@ config ARCH_AT91SAM9G20
        select GENERIC_TIME
        select GENERIC_CLOCKEVENTS
 
+config ARCH_AT91SAM9G45
+       bool "AT91SAM9G45"
+       select CPU_ARM926T
+       select GENERIC_TIME
+       select GENERIC_CLOCKEVENTS
+
 config ARCH_AT91CAP9
        bool "AT91CAP9"
        select CPU_ARM926T
@@ -144,6 +156,13 @@ config MACH_YL9200
        help
          Select this if you are using the ucDragon YL-9200 board.
 
+config MACH_CPUAT91
+       bool "Eukrea CPUAT91"
+       depends on ARCH_AT91RM9200
+       help
+         Select this if you are using the Eukrea Electromatique's
+         CPUAT91 board <http://www.eukrea.com/>.
+
 endif
 
 # ----------------------------------------------------------
@@ -205,6 +224,13 @@ config MACH_QIL_A9260
          Select this if you are using a Calao Systems QIL-A9260 Board.
          <http://www.calao-systems.com>
 
+config MACH_CPU9260
+       bool "Eukrea CPU9260 board"
+       depends on ARCH_AT91SAM9260
+       help
+         Select this if you are using a Eukrea Electromatique's
+         CPU9260 Board <http://www.eukrea.com/>
+
 endif
 
 # ----------------------------------------------------------
@@ -224,6 +250,21 @@ endif
 
 # ----------------------------------------------------------
 
+if ARCH_AT91SAM9G10
+
+comment "AT91SAM9G10 Board Type"
+
+config MACH_AT91SAM9G10EK
+       bool "Atmel AT91SAM9G10-EK Evaluation Kit"
+       depends on ARCH_AT91SAM9G10
+       help
+         Select this if you are using Atmel's AT91SAM9G10-EK Evaluation Kit.
+         <http://www.atmel.com/dyn/products/tools_card.asp?tool_id=4588>
+
+endif
+
+# ----------------------------------------------------------
+
 if ARCH_AT91SAM9263
 
 comment "AT91SAM9263 Board Type"
@@ -276,6 +317,29 @@ config MACH_AT91SAM9G20EK
        help
          Select this if you are using Atmel's AT91SAM9G20-EK Evaluation Kit.
 
+config MACH_CPU9G20
+       bool "Eukrea CPU9G20 board"
+       depends on ARCH_AT91SAM9G20
+       help
+         Select this if you are using a Eukrea Electromatique's
+         CPU9G20 Board <http://www.eukrea.com/>
+
+endif
+
+# ----------------------------------------------------------
+
+if ARCH_AT91SAM9G45
+
+comment "AT91SAM9G45 Board Type"
+
+config MACH_AT91SAM9G45EKES
+       bool "Atmel AT91SAM9G45-EKES Evaluation Kit"
+       depends on ARCH_AT91SAM9G45
+       help
+         Select this if you are using Atmel's AT91SAM9G45-EKES Evaluation Kit.
+         "ES" at the end of the name means that this board is an
+         Engineering Sample.
+
 endif
 
 # ----------------------------------------------------------
@@ -315,13 +379,13 @@ comment "AT91 Board Options"
 
 config MTD_AT91_DATAFLASH_CARD
        bool "Enable DataFlash Card support"
-       depends on (ARCH_AT91RM9200DK || MACH_AT91RM9200EK || MACH_AT91SAM9260EK || MACH_AT91SAM9261EK || MACH_AT91SAM9263EK || MACH_AT91SAM9G20EK || MACH_ECBAT91 || MACH_SAM9_L9260 || MACH_AT91CAP9ADK || MACH_NEOCORE926)
+       depends on (ARCH_AT91RM9200DK || MACH_AT91RM9200EK || MACH_AT91SAM9260EK || MACH_AT91SAM9261EK || MACH_AT91SAM9G10EK || MACH_AT91SAM9263EK || MACH_AT91SAM9G20EK || MACH_ECBAT91 || MACH_SAM9_L9260 || MACH_AT91CAP9ADK || MACH_NEOCORE926)
        help
          Enable support for the DataFlash card.
 
 config MTD_NAND_ATMEL_BUSWIDTH_16
        bool "Enable 16-bit data bus interface to NAND flash"
-       depends on (MACH_AT91SAM9260EK || MACH_AT91SAM9261EK || MACH_AT91SAM9263EK || MACH_AT91SAM9G20EK || MACH_AT91CAP9ADK)
+       depends on (MACH_AT91SAM9260EK || MACH_AT91SAM9261EK || MACH_AT91SAM9G10EK || MACH_AT91SAM9263EK || MACH_AT91SAM9G20EK || MACH_AT91SAM9G45EKES || MACH_AT91CAP9ADK)
        help
          On AT91SAM926x boards both types of NAND flash can be present
          (8 and 16 bit data bus width).
@@ -383,7 +447,7 @@ config AT91_EARLY_USART2
 
 config AT91_EARLY_USART3
        bool "USART3"
-       depends on (ARCH_AT91RM9200 || ARCH_AT91SAM9RL || ARCH_AT91SAM9260 || ARCH_AT91SAM9G20)
+       depends on (ARCH_AT91RM9200 || ARCH_AT91SAM9RL || ARCH_AT91SAM9260 || ARCH_AT91SAM9G20 || ARCH_AT91SAM9G45)
 
 config AT91_EARLY_USART4
        bool "USART4"
index c69ff237fd14878498eeb56e452fa55e6b8da9ec..a6ed015d82edc9822f92a57a72ead4cf22760095 100644 (file)
@@ -13,9 +13,11 @@ obj-$(CONFIG_AT91_PMC_UNIT)  += clock.o
 obj-$(CONFIG_ARCH_AT91RM9200)  += at91rm9200.o at91rm9200_time.o at91rm9200_devices.o
 obj-$(CONFIG_ARCH_AT91SAM9260) += at91sam9260.o at91sam926x_time.o at91sam9260_devices.o sam9_smc.o
 obj-$(CONFIG_ARCH_AT91SAM9261) += at91sam9261.o at91sam926x_time.o at91sam9261_devices.o sam9_smc.o
+obj-$(CONFIG_ARCH_AT91SAM9G10) += at91sam9261.o at91sam926x_time.o at91sam9261_devices.o sam9_smc.o
 obj-$(CONFIG_ARCH_AT91SAM9263) += at91sam9263.o at91sam926x_time.o at91sam9263_devices.o sam9_smc.o
 obj-$(CONFIG_ARCH_AT91SAM9RL)  += at91sam9rl.o at91sam926x_time.o at91sam9rl_devices.o sam9_smc.o
 obj-$(CONFIG_ARCH_AT91SAM9G20) += at91sam9260.o at91sam926x_time.o at91sam9260_devices.o  sam9_smc.o
+ obj-$(CONFIG_ARCH_AT91SAM9G45)        += at91sam9g45.o at91sam926x_time.o at91sam9g45_devices.o sam9_smc.o
 obj-$(CONFIG_ARCH_AT91CAP9)    += at91cap9.o at91sam926x_time.o at91cap9_devices.o sam9_smc.o
 obj-$(CONFIG_ARCH_AT91X40)     += at91x40.o at91x40_time.o
 
@@ -32,6 +34,7 @@ obj-$(CONFIG_MACH_KAFA)               += board-kafa.o
 obj-$(CONFIG_MACH_PICOTUX2XX)  += board-picotux200.o
 obj-$(CONFIG_MACH_ECBAT91)     += board-ecbat91.o
 obj-$(CONFIG_MACH_YL9200)      += board-yl-9200.o
+obj-$(CONFIG_MACH_CPUAT91)     += board-cpuat91.o
 
 # AT91SAM9260 board-specific support
 obj-$(CONFIG_MACH_AT91SAM9260EK) += board-sam9260ek.o
@@ -40,9 +43,11 @@ obj-$(CONFIG_MACH_SAM9_L9260)        += board-sam9-l9260.o
 obj-$(CONFIG_MACH_USB_A9260)   += board-usb-a9260.o
 obj-$(CONFIG_MACH_QIL_A9260)   += board-qil-a9260.o
 obj-$(CONFIG_MACH_AFEB9260)    += board-afeb-9260v1.o
+obj-$(CONFIG_MACH_CPU9260)     += board-cpu9krea.o
 
 # AT91SAM9261 board-specific support
 obj-$(CONFIG_MACH_AT91SAM9261EK) += board-sam9261ek.o
+obj-$(CONFIG_MACH_AT91SAM9G10EK) += board-sam9261ek.o
 
 # AT91SAM9263 board-specific support
 obj-$(CONFIG_MACH_AT91SAM9263EK) += board-sam9263ek.o
@@ -54,6 +59,10 @@ obj-$(CONFIG_MACH_AT91SAM9RLEK)      += board-sam9rlek.o
 
 # AT91SAM9G20 board-specific support
 obj-$(CONFIG_MACH_AT91SAM9G20EK) += board-sam9g20ek.o
+obj-$(CONFIG_MACH_CPU9G20)     += board-cpu9krea.o
+
+# AT91SAM9G45 board-specific support
+obj-$(CONFIG_MACH_AT91SAM9G45EKES) += board-sam9m10g45ek.o
 
 # AT91CAP9 board-specific support
 obj-$(CONFIG_MACH_AT91CAP9ADK) += board-cap9adk.o
index 071a2506a69fb5ed8abdea4cf51e1fa45ffc22fd..3462b815054ace1695cfe1f5f9bddc3358e4d513 100644 (file)
@@ -7,6 +7,10 @@ ifeq ($(CONFIG_ARCH_AT91CAP9),y)
    zreladdr-y  := 0x70008000
 params_phys-y  := 0x70000100
 initrd_phys-y  := 0x70410000
+else ifeq ($(CONFIG_ARCH_AT91SAM9G45),y)
+   zreladdr-y  := 0x70008000
+params_phys-y  := 0x70000100
+initrd_phys-y  := 0x70410000
 else
    zreladdr-y  := 0x20008000
 params_phys-y  := 0x20000100
index d74c9ac007e75c1d91642d711c7ef19c93b320e1..ee4ea0e720cf14239dedbece059d24c9c20c0f54 100644 (file)
@@ -1113,6 +1113,122 @@ void __init at91_set_serial_console(unsigned portnr) {}
 void __init at91_add_device_serial(void) {}
 #endif
 
+/* --------------------------------------------------------------------
+ *  CF/IDE
+ * -------------------------------------------------------------------- */
+
+#if defined(CONFIG_BLK_DEV_IDE_AT91) || defined(CONFIG_BLK_DEV_IDE_AT91_MODULE) || \
+       defined(CONFIG_PATA_AT91) || defined(CONFIG_PATA_AT91_MODULE) || \
+       defined(CONFIG_AT91_CF) || defined(CONFIG_AT91_CF_MODULE)
+
+static struct at91_cf_data cf0_data;
+
+static struct resource cf0_resources[] = {
+       [0] = {
+               .start  = AT91_CHIPSELECT_4,
+               .end    = AT91_CHIPSELECT_4 + SZ_256M - 1,
+               .flags  = IORESOURCE_MEM,
+       }
+};
+
+static struct platform_device cf0_device = {
+       .id             = 0,
+       .dev            = {
+                               .platform_data  = &cf0_data,
+       },
+       .resource       = cf0_resources,
+       .num_resources  = ARRAY_SIZE(cf0_resources),
+};
+
+static struct at91_cf_data cf1_data;
+
+static struct resource cf1_resources[] = {
+       [0] = {
+               .start  = AT91_CHIPSELECT_5,
+               .end    = AT91_CHIPSELECT_5 + SZ_256M - 1,
+               .flags  = IORESOURCE_MEM,
+       }
+};
+
+static struct platform_device cf1_device = {
+       .id             = 1,
+       .dev            = {
+                               .platform_data  = &cf1_data,
+       },
+       .resource       = cf1_resources,
+       .num_resources  = ARRAY_SIZE(cf1_resources),
+};
+
+void __init at91_add_device_cf(struct at91_cf_data *data)
+{
+       struct platform_device *pdev;
+       unsigned long csa;
+
+       if (!data)
+               return;
+
+       csa = at91_sys_read(AT91_MATRIX_EBICSA);
+
+       switch (data->chipselect) {
+       case 4:
+               at91_set_multi_drive(AT91_PIN_PC8, 0);
+               at91_set_A_periph(AT91_PIN_PC8, 0);
+               csa |= AT91_MATRIX_CS4A_SMC_CF1;
+               cf0_data = *data;
+               pdev = &cf0_device;
+               break;
+       case 5:
+               at91_set_multi_drive(AT91_PIN_PC9, 0);
+               at91_set_A_periph(AT91_PIN_PC9, 0);
+               csa |= AT91_MATRIX_CS5A_SMC_CF2;
+               cf1_data = *data;
+               pdev = &cf1_device;
+               break;
+       default:
+               printk(KERN_ERR "AT91 CF: bad chip-select requested (%u)\n",
+                      data->chipselect);
+               return;
+       }
+
+       at91_sys_write(AT91_MATRIX_EBICSA, csa);
+
+       if (data->rst_pin) {
+               at91_set_multi_drive(data->rst_pin, 0);
+               at91_set_gpio_output(data->rst_pin, 1);
+       }
+
+       if (data->irq_pin) {
+               at91_set_gpio_input(data->irq_pin, 0);
+               at91_set_deglitch(data->irq_pin, 1);
+       }
+
+       if (data->det_pin) {
+               at91_set_gpio_input(data->det_pin, 0);
+               at91_set_deglitch(data->det_pin, 1);
+       }
+
+       at91_set_B_periph(AT91_PIN_PC6, 0);     /* CFCE1 */
+       at91_set_B_periph(AT91_PIN_PC7, 0);     /* CFCE2 */
+       at91_set_A_periph(AT91_PIN_PC10, 0);    /* CFRNW */
+       at91_set_A_periph(AT91_PIN_PC15, 1);    /* NWAIT */
+
+       if (data->flags & AT91_CF_TRUE_IDE)
+#if defined(CONFIG_PATA_AT91) || defined(CONFIG_PATA_AT91_MODULE)
+               pdev->name = "pata_at91";
+#elif defined(CONFIG_BLK_DEV_IDE_AT91) || defined(CONFIG_BLK_DEV_IDE_AT91_MODULE)
+               pdev->name = "at91_ide";
+#else
+#warning "board requires AT91_CF_TRUE_IDE: enable either at91_ide or pata_at91"
+#endif
+       else
+               pdev->name = "at91_cf";
+
+       platform_device_register(pdev);
+}
+
+#else
+void __init at91_add_device_cf(struct at91_cf_data * data) {}
+#endif
 
 /* -------------------------------------------------------------------- */
 /*
index 3acd7d7e6a423116411805f7b546099ba674d447..4ecf37996c770faf83e48d93cf707ef4dd90fc45 100644 (file)
@@ -16,6 +16,7 @@
 #include <asm/irq.h>
 #include <asm/mach/arch.h>
 #include <asm/mach/map.h>
+#include <mach/cpu.h>
 #include <mach/at91sam9261.h>
 #include <mach/at91_pmc.h>
 #include <mach/at91_rstc.h>
@@ -30,7 +31,11 @@ static struct map_desc at91sam9261_io_desc[] __initdata = {
                .pfn            = __phys_to_pfn(AT91_BASE_SYS),
                .length         = SZ_16K,
                .type           = MT_DEVICE,
-       }, {
+       },
+};
+
+static struct map_desc at91sam9261_sram_desc[] __initdata = {
+       {
                .virtual        = AT91_IO_VIRT_BASE - AT91SAM9261_SRAM_SIZE,
                .pfn            = __phys_to_pfn(AT91SAM9261_SRAM_BASE),
                .length         = AT91SAM9261_SRAM_SIZE,
@@ -38,6 +43,15 @@ static struct map_desc at91sam9261_io_desc[] __initdata = {
        },
 };
 
+static struct map_desc at91sam9g10_sram_desc[] __initdata = {
+       {
+               .virtual        = AT91_IO_VIRT_BASE - AT91SAM9G10_SRAM_SIZE,
+               .pfn            = __phys_to_pfn(AT91SAM9G10_SRAM_BASE),
+               .length         = AT91SAM9G10_SRAM_SIZE,
+               .type           = MT_DEVICE,
+       },
+};
+
 /* --------------------------------------------------------------------
  *  Clocks
  * -------------------------------------------------------------------- */
@@ -263,6 +277,12 @@ void __init at91sam9261_initialize(unsigned long main_clock)
        /* Map peripherals */
        iotable_init(at91sam9261_io_desc, ARRAY_SIZE(at91sam9261_io_desc));
 
+       if (cpu_is_at91sam9g10())
+               iotable_init(at91sam9g10_sram_desc, ARRAY_SIZE(at91sam9g10_sram_desc));
+       else
+               iotable_init(at91sam9261_sram_desc, ARRAY_SIZE(at91sam9261_sram_desc));
+
+
        at91_arch_reset = at91sam9261_reset;
        pm_power_off = at91sam9261_poweroff;
        at91_extern_irq = (1 << AT91SAM9261_ID_IRQ0) | (1 << AT91SAM9261_ID_IRQ1)
index b7f23324231560635b0d053ac7fac703a249e19f..55719a974276e315d42173e26118fee4790076a6 100644 (file)
@@ -707,9 +707,9 @@ void __init at91_add_device_spi(struct spi_board_info *devices, int nr_devices)
  *  AC97
  * -------------------------------------------------------------------- */
 
-#if defined(CONFIG_SND_AT91_AC97) || defined(CONFIG_SND_AT91_AC97_MODULE)
+#if defined(CONFIG_SND_ATMEL_AC97C) || defined(CONFIG_SND_ATMEL_AC97C_MODULE)
 static u64 ac97_dmamask = DMA_BIT_MASK(32);
-static struct atmel_ac97_data ac97_data;
+static struct ac97c_platform_data ac97_data;
 
 static struct resource ac97_resources[] = {
        [0] = {
@@ -725,8 +725,8 @@ static struct resource ac97_resources[] = {
 };
 
 static struct platform_device at91sam9263_ac97_device = {
-       .name           = "ac97c",
-       .id             = 1,
+       .name           = "atmel_ac97c",
+       .id             = 0,
        .dev            = {
                                .dma_mask               = &ac97_dmamask,
                                .coherent_dma_mask      = DMA_BIT_MASK(32),
@@ -736,7 +736,7 @@ static struct platform_device at91sam9263_ac97_device = {
        .num_resources  = ARRAY_SIZE(ac97_resources),
 };
 
-void __init at91_add_device_ac97(struct atmel_ac97_data *data)
+void __init at91_add_device_ac97(struct ac97c_platform_data *data)
 {
        if (!data)
                return;
@@ -750,11 +750,11 @@ void __init at91_add_device_ac97(struct atmel_ac97_data *data)
        if (data->reset_pin)
                at91_set_gpio_output(data->reset_pin, 0);
 
-       ac97_data = *ek_data;
+       ac97_data = *data;
        platform_device_register(&at91sam9263_ac97_device);
 }
 #else
-void __init at91_add_device_ac97(struct atmel_ac97_data *data) {}
+void __init at91_add_device_ac97(struct ac97c_platform_data *data) {}
 #endif
 
 
diff --git a/arch/arm/mach-at91/at91sam9g45.c b/arch/arm/mach-at91/at91sam9g45.c
new file mode 100644 (file)
index 0000000..85166b7
--- /dev/null
@@ -0,0 +1,360 @@
+/*
+ *  Chip-specific setup code for the AT91SAM9G45 family
+ *
+ *  Copyright (C) 2009 Atmel Corporation.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ */
+
+#include <linux/module.h>
+#include <linux/pm.h>
+
+#include <asm/irq.h>
+#include <asm/mach/arch.h>
+#include <asm/mach/map.h>
+#include <mach/at91sam9g45.h>
+#include <mach/at91_pmc.h>
+#include <mach/at91_rstc.h>
+#include <mach/at91_shdwc.h>
+
+#include "generic.h"
+#include "clock.h"
+
+static struct map_desc at91sam9g45_io_desc[] __initdata = {
+       {
+               .virtual        = AT91_VA_BASE_SYS,
+               .pfn            = __phys_to_pfn(AT91_BASE_SYS),
+               .length         = SZ_16K,
+               .type           = MT_DEVICE,
+       }, {
+               .virtual        = AT91_IO_VIRT_BASE - AT91SAM9G45_SRAM_SIZE,
+               .pfn            = __phys_to_pfn(AT91SAM9G45_SRAM_BASE),
+               .length         = AT91SAM9G45_SRAM_SIZE,
+               .type           = MT_DEVICE,
+       }
+};
+
+/* --------------------------------------------------------------------
+ *  Clocks
+ * -------------------------------------------------------------------- */
+
+/*
+ * The peripheral clocks.
+ */
+static struct clk pioA_clk = {
+       .name           = "pioA_clk",
+       .pmc_mask       = 1 << AT91SAM9G45_ID_PIOA,
+       .type           = CLK_TYPE_PERIPHERAL,
+};
+static struct clk pioB_clk = {
+       .name           = "pioB_clk",
+       .pmc_mask       = 1 << AT91SAM9G45_ID_PIOB,
+       .type           = CLK_TYPE_PERIPHERAL,
+};
+static struct clk pioC_clk = {
+       .name           = "pioC_clk",
+       .pmc_mask       = 1 << AT91SAM9G45_ID_PIOC,
+       .type           = CLK_TYPE_PERIPHERAL,
+};
+static struct clk pioDE_clk = {
+       .name           = "pioDE_clk",
+       .pmc_mask       = 1 << AT91SAM9G45_ID_PIODE,
+       .type           = CLK_TYPE_PERIPHERAL,
+};
+static struct clk usart0_clk = {
+       .name           = "usart0_clk",
+       .pmc_mask       = 1 << AT91SAM9G45_ID_US0,
+       .type           = CLK_TYPE_PERIPHERAL,
+};
+static struct clk usart1_clk = {
+       .name           = "usart1_clk",
+       .pmc_mask       = 1 << AT91SAM9G45_ID_US1,
+       .type           = CLK_TYPE_PERIPHERAL,
+};
+static struct clk usart2_clk = {
+       .name           = "usart2_clk",
+       .pmc_mask       = 1 << AT91SAM9G45_ID_US2,
+       .type           = CLK_TYPE_PERIPHERAL,
+};
+static struct clk usart3_clk = {
+       .name           = "usart3_clk",
+       .pmc_mask       = 1 << AT91SAM9G45_ID_US3,
+       .type           = CLK_TYPE_PERIPHERAL,
+};
+static struct clk mmc0_clk = {
+       .name           = "mci0_clk",
+       .pmc_mask       = 1 << AT91SAM9G45_ID_MCI0,
+       .type           = CLK_TYPE_PERIPHERAL,
+};
+static struct clk twi0_clk = {
+       .name           = "twi0_clk",
+       .pmc_mask       = 1 << AT91SAM9G45_ID_TWI0,
+       .type           = CLK_TYPE_PERIPHERAL,
+};
+static struct clk twi1_clk = {
+       .name           = "twi1_clk",
+       .pmc_mask       = 1 << AT91SAM9G45_ID_TWI1,
+       .type           = CLK_TYPE_PERIPHERAL,
+};
+static struct clk spi0_clk = {
+       .name           = "spi0_clk",
+       .pmc_mask       = 1 << AT91SAM9G45_ID_SPI0,
+       .type           = CLK_TYPE_PERIPHERAL,
+};
+static struct clk spi1_clk = {
+       .name           = "spi1_clk",
+       .pmc_mask       = 1 << AT91SAM9G45_ID_SPI1,
+       .type           = CLK_TYPE_PERIPHERAL,
+};
+static struct clk ssc0_clk = {
+       .name           = "ssc0_clk",
+       .pmc_mask       = 1 << AT91SAM9G45_ID_SSC0,
+       .type           = CLK_TYPE_PERIPHERAL,
+};
+static struct clk ssc1_clk = {
+       .name           = "ssc1_clk",
+       .pmc_mask       = 1 << AT91SAM9G45_ID_SSC1,
+       .type           = CLK_TYPE_PERIPHERAL,
+};
+static struct clk tcb_clk = {
+       .name           = "tcb_clk",
+       .pmc_mask       = 1 << AT91SAM9G45_ID_TCB,
+       .type           = CLK_TYPE_PERIPHERAL,
+};
+static struct clk pwm_clk = {
+       .name           = "pwm_clk",
+       .pmc_mask       = 1 << AT91SAM9G45_ID_PWMC,
+       .type           = CLK_TYPE_PERIPHERAL,
+};
+static struct clk tsc_clk = {
+       .name           = "tsc_clk",
+       .pmc_mask       = 1 << AT91SAM9G45_ID_TSC,
+       .type           = CLK_TYPE_PERIPHERAL,
+};
+static struct clk dma_clk = {
+       .name           = "dma_clk",
+       .pmc_mask       = 1 << AT91SAM9G45_ID_DMA,
+       .type           = CLK_TYPE_PERIPHERAL,
+};
+static struct clk uhphs_clk = {
+       .name           = "uhphs_clk",
+       .pmc_mask       = 1 << AT91SAM9G45_ID_UHPHS,
+       .type           = CLK_TYPE_PERIPHERAL,
+};
+static struct clk lcdc_clk = {
+       .name           = "lcdc_clk",
+       .pmc_mask       = 1 << AT91SAM9G45_ID_LCDC,
+       .type           = CLK_TYPE_PERIPHERAL,
+};
+static struct clk ac97_clk = {
+       .name           = "ac97_clk",
+       .pmc_mask       = 1 << AT91SAM9G45_ID_AC97C,
+       .type           = CLK_TYPE_PERIPHERAL,
+};
+static struct clk macb_clk = {
+       .name           = "macb_clk",
+       .pmc_mask       = 1 << AT91SAM9G45_ID_EMAC,
+       .type           = CLK_TYPE_PERIPHERAL,
+};
+static struct clk isi_clk = {
+       .name           = "isi_clk",
+       .pmc_mask       = 1 << AT91SAM9G45_ID_ISI,
+       .type           = CLK_TYPE_PERIPHERAL,
+};
+static struct clk udphs_clk = {
+       .name           = "udphs_clk",
+       .pmc_mask       = 1 << AT91SAM9G45_ID_UDPHS,
+       .type           = CLK_TYPE_PERIPHERAL,
+};
+static struct clk mmc1_clk = {
+       .name           = "mci1_clk",
+       .pmc_mask       = 1 << AT91SAM9G45_ID_MCI1,
+       .type           = CLK_TYPE_PERIPHERAL,
+};
+
+/* One additional fake clock for ohci */
+static struct clk ohci_clk = {
+       .name           = "ohci_clk",
+       .pmc_mask       = 0,
+       .type           = CLK_TYPE_PERIPHERAL,
+       .parent         = &uhphs_clk,
+};
+
+static struct clk *periph_clocks[] __initdata = {
+       &pioA_clk,
+       &pioB_clk,
+       &pioC_clk,
+       &pioDE_clk,
+       &usart0_clk,
+       &usart1_clk,
+       &usart2_clk,
+       &usart3_clk,
+       &mmc0_clk,
+       &twi0_clk,
+       &twi1_clk,
+       &spi0_clk,
+       &spi1_clk,
+       &ssc0_clk,
+       &ssc1_clk,
+       &tcb_clk,
+       &pwm_clk,
+       &tsc_clk,
+       &dma_clk,
+       &uhphs_clk,
+       &lcdc_clk,
+       &ac97_clk,
+       &macb_clk,
+       &isi_clk,
+       &udphs_clk,
+       &mmc1_clk,
+       // irq0
+       &ohci_clk,
+};
+
+/*
+ * The two programmable clocks.
+ * You must configure pin multiplexing to bring these signals out.
+ */
+static struct clk pck0 = {
+       .name           = "pck0",
+       .pmc_mask       = AT91_PMC_PCK0,
+       .type           = CLK_TYPE_PROGRAMMABLE,
+       .id             = 0,
+};
+static struct clk pck1 = {
+       .name           = "pck1",
+       .pmc_mask       = AT91_PMC_PCK1,
+       .type           = CLK_TYPE_PROGRAMMABLE,
+       .id             = 1,
+};
+
+static void __init at91sam9g45_register_clocks(void)
+{
+       int i;
+
+       for (i = 0; i < ARRAY_SIZE(periph_clocks); i++)
+               clk_register(periph_clocks[i]);
+
+       clk_register(&pck0);
+       clk_register(&pck1);
+}
+
+/* --------------------------------------------------------------------
+ *  GPIO
+ * -------------------------------------------------------------------- */
+
+static struct at91_gpio_bank at91sam9g45_gpio[] = {
+       {
+               .id             = AT91SAM9G45_ID_PIOA,
+               .offset         = AT91_PIOA,
+               .clock          = &pioA_clk,
+       }, {
+               .id             = AT91SAM9G45_ID_PIOB,
+               .offset         = AT91_PIOB,
+               .clock          = &pioB_clk,
+       }, {
+               .id             = AT91SAM9G45_ID_PIOC,
+               .offset         = AT91_PIOC,
+               .clock          = &pioC_clk,
+       }, {
+               .id             = AT91SAM9G45_ID_PIODE,
+               .offset         = AT91_PIOD,
+               .clock          = &pioDE_clk,
+       }, {
+               .id             = AT91SAM9G45_ID_PIODE,
+               .offset         = AT91_PIOE,
+               .clock          = &pioDE_clk,
+       }
+};
+
+static void at91sam9g45_reset(void)
+{
+       at91_sys_write(AT91_RSTC_CR, AT91_RSTC_KEY | AT91_RSTC_PROCRST | AT91_RSTC_PERRST);
+}
+
+static void at91sam9g45_poweroff(void)
+{
+       at91_sys_write(AT91_SHDW_CR, AT91_SHDW_KEY | AT91_SHDW_SHDW);
+}
+
+
+/* --------------------------------------------------------------------
+ *  AT91SAM9G45 processor initialization
+ * -------------------------------------------------------------------- */
+
+void __init at91sam9g45_initialize(unsigned long main_clock)
+{
+       /* Map peripherals */
+       iotable_init(at91sam9g45_io_desc, ARRAY_SIZE(at91sam9g45_io_desc));
+
+       at91_arch_reset = at91sam9g45_reset;
+       pm_power_off = at91sam9g45_poweroff;
+       at91_extern_irq = (1 << AT91SAM9G45_ID_IRQ0);
+
+       /* Init clock subsystem */
+       at91_clock_init(main_clock);
+
+       /* Register the processor-specific clocks */
+       at91sam9g45_register_clocks();
+
+       /* Register GPIO subsystem */
+       at91_gpio_init(at91sam9g45_gpio, 5);
+}
+
+/* --------------------------------------------------------------------
+ *  Interrupt initialization
+ * -------------------------------------------------------------------- */
+
+/*
+ * The default interrupt priority levels (0 = lowest, 7 = highest).
+ */
+static unsigned int at91sam9g45_default_irq_priority[NR_AIC_IRQS] __initdata = {
+       7,      /* Advanced Interrupt Controller (FIQ) */
+       7,      /* System Peripherals */
+       1,      /* Parallel IO Controller A */
+       1,      /* Parallel IO Controller B */
+       1,      /* Parallel IO Controller C */
+       1,      /* Parallel IO Controller D and E */
+       0,
+       5,      /* USART 0 */
+       5,      /* USART 1 */
+       5,      /* USART 2 */
+       5,      /* USART 3 */
+       0,      /* Multimedia Card Interface 0 */
+       6,      /* Two-Wire Interface 0 */
+       6,      /* Two-Wire Interface 1 */
+       5,      /* Serial Peripheral Interface 0 */
+       5,      /* Serial Peripheral Interface 1 */
+       4,      /* Serial Synchronous Controller 0 */
+       4,      /* Serial Synchronous Controller 1 */
+       0,      /* Timer Counter 0, 1, 2, 3, 4 and 5 */
+       0,      /* Pulse Width Modulation Controller */
+       0,      /* Touch Screen Controller */
+       0,      /* DMA Controller */
+       2,      /* USB Host High Speed port */
+       3,      /* LDC Controller */
+       5,      /* AC97 Controller */
+       3,      /* Ethernet */
+       0,      /* Image Sensor Interface */
+       2,      /* USB Device High speed port */
+       0,
+       0,      /* Multimedia Card Interface 1 */
+       0,
+       0,      /* Advanced Interrupt Controller (IRQ0) */
+};
+
+void __init at91sam9g45_init_interrupts(unsigned int priority[NR_AIC_IRQS])
+{
+       if (!priority)
+               priority = at91sam9g45_default_irq_priority;
+
+       /* Initialize the AIC interrupt controller */
+       at91_aic_init(priority);
+
+       /* Enable GPIO interrupts */
+       at91_gpio_irq_setup();
+}
diff --git a/arch/arm/mach-at91/at91sam9g45_devices.c b/arch/arm/mach-at91/at91sam9g45_devices.c
new file mode 100644 (file)
index 0000000..d746e86
--- /dev/null
@@ -0,0 +1,1230 @@
+/*
+ *  On-Chip devices setup code for the AT91SAM9G45 family
+ *
+ *  Copyright (C) 2009 Atmel Corporation.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ */
+#include <asm/mach/arch.h>
+#include <asm/mach/map.h>
+
+#include <linux/dma-mapping.h>
+#include <linux/platform_device.h>
+#include <linux/i2c-gpio.h>
+
+#include <linux/fb.h>
+#include <video/atmel_lcdc.h>
+
+#include <mach/board.h>
+#include <mach/gpio.h>
+#include <mach/at91sam9g45.h>
+#include <mach/at91sam9g45_matrix.h>
+#include <mach/at91sam9_smc.h>
+
+#include "generic.h"
+
+
+/* --------------------------------------------------------------------
+ *  USB Host (OHCI)
+ * -------------------------------------------------------------------- */
+
+#if defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE)
+static u64 ohci_dmamask = DMA_BIT_MASK(32);
+static struct at91_usbh_data usbh_ohci_data;
+
+static struct resource usbh_ohci_resources[] = {
+       [0] = {
+               .start  = AT91SAM9G45_OHCI_BASE,
+               .end    = AT91SAM9G45_OHCI_BASE + SZ_1M - 1,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start  = AT91SAM9G45_ID_UHPHS,
+               .end    = AT91SAM9G45_ID_UHPHS,
+               .flags  = IORESOURCE_IRQ,
+       },
+};
+
+static struct platform_device at91_usbh_ohci_device = {
+       .name           = "at91_ohci",
+       .id             = -1,
+       .dev            = {
+                               .dma_mask               = &ohci_dmamask,
+                               .coherent_dma_mask      = DMA_BIT_MASK(32),
+                               .platform_data          = &usbh_ohci_data,
+       },
+       .resource       = usbh_ohci_resources,
+       .num_resources  = ARRAY_SIZE(usbh_ohci_resources),
+};
+
+void __init at91_add_device_usbh_ohci(struct at91_usbh_data *data)
+{
+       int i;
+
+       if (!data)
+               return;
+
+       /* Enable VBus control for UHP ports */
+       for (i = 0; i < data->ports; i++) {
+               if (data->vbus_pin[i])
+                       at91_set_gpio_output(data->vbus_pin[i], 0);
+       }
+
+       usbh_ohci_data = *data;
+       platform_device_register(&at91_usbh_ohci_device);
+}
+#else
+void __init at91_add_device_usbh_ohci(struct at91_usbh_data *data) {}
+#endif
+
+
+/* --------------------------------------------------------------------
+ *  USB HS Device (Gadget)
+ * -------------------------------------------------------------------- */
+
+#if defined(CONFIG_USB_GADGET_ATMEL_USBA) || defined(CONFIG_USB_GADGET_ATMEL_USBA_MODULE)
+static struct resource usba_udc_resources[] = {
+       [0] = {
+               .start  = AT91SAM9G45_UDPHS_FIFO,
+               .end    = AT91SAM9G45_UDPHS_FIFO + SZ_512K - 1,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start  = AT91SAM9G45_BASE_UDPHS,
+               .end    = AT91SAM9G45_BASE_UDPHS + SZ_1K - 1,
+               .flags  = IORESOURCE_MEM,
+       },
+       [2] = {
+               .start  = AT91SAM9G45_ID_UDPHS,
+               .end    = AT91SAM9G45_ID_UDPHS,
+               .flags  = IORESOURCE_IRQ,
+       },
+};
+
+#define EP(nam, idx, maxpkt, maxbk, dma, isoc)                 \
+       [idx] = {                                               \
+               .name           = nam,                          \
+               .index          = idx,                          \
+               .fifo_size      = maxpkt,                       \
+               .nr_banks       = maxbk,                        \
+               .can_dma        = dma,                          \
+               .can_isoc       = isoc,                         \
+       }
+
+static struct usba_ep_data usba_udc_ep[] __initdata = {
+       EP("ep0", 0, 64, 1, 0, 0),
+       EP("ep1", 1, 1024, 2, 1, 1),
+       EP("ep2", 2, 1024, 2, 1, 1),
+       EP("ep3", 3, 1024, 3, 1, 0),
+       EP("ep4", 4, 1024, 3, 1, 0),
+       EP("ep5", 5, 1024, 3, 1, 1),
+       EP("ep6", 6, 1024, 3, 1, 1),
+};
+
+#undef EP
+
+/*
+ * pdata doesn't have room for any endpoints, so we need to
+ * append room for the ones we need right after it.
+ */
+static struct {
+       struct usba_platform_data pdata;
+       struct usba_ep_data ep[7];
+} usba_udc_data;
+
+static struct platform_device at91_usba_udc_device = {
+       .name           = "atmel_usba_udc",
+       .id             = -1,
+       .dev            = {
+                               .platform_data  = &usba_udc_data.pdata,
+       },
+       .resource       = usba_udc_resources,
+       .num_resources  = ARRAY_SIZE(usba_udc_resources),
+};
+
+void __init at91_add_device_usba(struct usba_platform_data *data)
+{
+       usba_udc_data.pdata.vbus_pin = -EINVAL;
+       usba_udc_data.pdata.num_ep = ARRAY_SIZE(usba_udc_ep);
+       memcpy(usba_udc_data.ep, usba_udc_ep, sizeof(usba_udc_ep));;
+
+       if (data && data->vbus_pin > 0) {
+               at91_set_gpio_input(data->vbus_pin, 0);
+               at91_set_deglitch(data->vbus_pin, 1);
+               usba_udc_data.pdata.vbus_pin = data->vbus_pin;
+       }
+
+       /* Pullup pin is handled internally by USB device peripheral */
+
+       /* Clocks */
+       at91_clock_associate("utmi_clk", &at91_usba_udc_device.dev, "hclk");
+       at91_clock_associate("udphs_clk", &at91_usba_udc_device.dev, "pclk");
+
+       platform_device_register(&at91_usba_udc_device);
+}
+#else
+void __init at91_add_device_usba(struct usba_platform_data *data) {}
+#endif
+
+
+/* --------------------------------------------------------------------
+ *  Ethernet
+ * -------------------------------------------------------------------- */
+
+#if defined(CONFIG_MACB) || defined(CONFIG_MACB_MODULE)
+static u64 eth_dmamask = DMA_BIT_MASK(32);
+static struct at91_eth_data eth_data;
+
+static struct resource eth_resources[] = {
+       [0] = {
+               .start  = AT91SAM9G45_BASE_EMAC,
+               .end    = AT91SAM9G45_BASE_EMAC + SZ_16K - 1,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start  = AT91SAM9G45_ID_EMAC,
+               .end    = AT91SAM9G45_ID_EMAC,
+               .flags  = IORESOURCE_IRQ,
+       },
+};
+
+static struct platform_device at91sam9g45_eth_device = {
+       .name           = "macb",
+       .id             = -1,
+       .dev            = {
+                               .dma_mask               = &eth_dmamask,
+                               .coherent_dma_mask      = DMA_BIT_MASK(32),
+                               .platform_data          = &eth_data,
+       },
+       .resource       = eth_resources,
+       .num_resources  = ARRAY_SIZE(eth_resources),
+};
+
+void __init at91_add_device_eth(struct at91_eth_data *data)
+{
+       if (!data)
+               return;
+
+       if (data->phy_irq_pin) {
+               at91_set_gpio_input(data->phy_irq_pin, 0);
+               at91_set_deglitch(data->phy_irq_pin, 1);
+       }
+
+       /* Pins used for MII and RMII */
+       at91_set_A_periph(AT91_PIN_PA17, 0);    /* ETXCK_EREFCK */
+       at91_set_A_periph(AT91_PIN_PA15, 0);    /* ERXDV */
+       at91_set_A_periph(AT91_PIN_PA12, 0);    /* ERX0 */
+       at91_set_A_periph(AT91_PIN_PA13, 0);    /* ERX1 */
+       at91_set_A_periph(AT91_PIN_PA16, 0);    /* ERXER */
+       at91_set_A_periph(AT91_PIN_PA14, 0);    /* ETXEN */
+       at91_set_A_periph(AT91_PIN_PA10, 0);    /* ETX0 */
+       at91_set_A_periph(AT91_PIN_PA11, 0);    /* ETX1 */
+       at91_set_A_periph(AT91_PIN_PA19, 0);    /* EMDIO */
+       at91_set_A_periph(AT91_PIN_PA18, 0);    /* EMDC */
+
+       if (!data->is_rmii) {
+               at91_set_B_periph(AT91_PIN_PA29, 0);    /* ECRS */
+               at91_set_B_periph(AT91_PIN_PA30, 0);    /* ECOL */
+               at91_set_B_periph(AT91_PIN_PA8,  0);    /* ERX2 */
+               at91_set_B_periph(AT91_PIN_PA9,  0);    /* ERX3 */
+               at91_set_B_periph(AT91_PIN_PA28, 0);    /* ERXCK */
+               at91_set_B_periph(AT91_PIN_PA6,  0);    /* ETX2 */
+               at91_set_B_periph(AT91_PIN_PA7,  0);    /* ETX3 */
+               at91_set_B_periph(AT91_PIN_PA27, 0);    /* ETXER */
+       }
+
+       eth_data = *data;
+       platform_device_register(&at91sam9g45_eth_device);
+}
+#else
+void __init at91_add_device_eth(struct at91_eth_data *data) {}
+#endif
+
+
+/* --------------------------------------------------------------------
+ *  NAND / SmartMedia
+ * -------------------------------------------------------------------- */
+
+#if defined(CONFIG_MTD_NAND_ATMEL) || defined(CONFIG_MTD_NAND_ATMEL_MODULE)
+static struct atmel_nand_data nand_data;
+
+#define NAND_BASE      AT91_CHIPSELECT_3
+
+static struct resource nand_resources[] = {
+       [0] = {
+               .start  = NAND_BASE,
+               .end    = NAND_BASE + SZ_256M - 1,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start  = AT91_BASE_SYS + AT91_ECC,
+               .end    = AT91_BASE_SYS + AT91_ECC + SZ_512 - 1,
+               .flags  = IORESOURCE_MEM,
+       }
+};
+
+static struct platform_device at91sam9g45_nand_device = {
+       .name           = "atmel_nand",
+       .id             = -1,
+       .dev            = {
+                               .platform_data  = &nand_data,
+       },
+       .resource       = nand_resources,
+       .num_resources  = ARRAY_SIZE(nand_resources),
+};
+
+void __init at91_add_device_nand(struct atmel_nand_data *data)
+{
+       unsigned long csa;
+
+       if (!data)
+               return;
+
+       csa = at91_sys_read(AT91_MATRIX_EBICSA);
+       at91_sys_write(AT91_MATRIX_EBICSA, csa | AT91_MATRIX_EBI_CS3A_SMC_SMARTMEDIA);
+
+       /* enable pin */
+       if (data->enable_pin)
+               at91_set_gpio_output(data->enable_pin, 1);
+
+       /* ready/busy pin */
+       if (data->rdy_pin)
+               at91_set_gpio_input(data->rdy_pin, 1);
+
+       /* card detect pin */
+       if (data->det_pin)
+               at91_set_gpio_input(data->det_pin, 1);
+
+       nand_data = *data;
+       platform_device_register(&at91sam9g45_nand_device);
+}
+#else
+void __init at91_add_device_nand(struct atmel_nand_data *data) {}
+#endif
+
+
+/* --------------------------------------------------------------------
+ *  TWI (i2c)
+ * -------------------------------------------------------------------- */
+
+/*
+ * Prefer the GPIO code since the TWI controller isn't robust
+ * (gets overruns and underruns under load) and can only issue
+ * repeated STARTs in one scenario (the driver doesn't yet handle them).
+ */
+#if defined(CONFIG_I2C_GPIO) || defined(CONFIG_I2C_GPIO_MODULE)
+static struct i2c_gpio_platform_data pdata_i2c0 = {
+       .sda_pin                = AT91_PIN_PA20,
+       .sda_is_open_drain      = 1,
+       .scl_pin                = AT91_PIN_PA21,
+       .scl_is_open_drain      = 1,
+       .udelay                 = 2,            /* ~100 kHz */
+};
+
+static struct platform_device at91sam9g45_twi0_device = {
+       .name                   = "i2c-gpio",
+       .id                     = 0,
+       .dev.platform_data      = &pdata_i2c0,
+};
+
+static struct i2c_gpio_platform_data pdata_i2c1 = {
+       .sda_pin                = AT91_PIN_PB10,
+       .sda_is_open_drain      = 1,
+       .scl_pin                = AT91_PIN_PB11,
+       .scl_is_open_drain      = 1,
+       .udelay                 = 2,            /* ~100 kHz */
+};
+
+static struct platform_device at91sam9g45_twi1_device = {
+       .name                   = "i2c-gpio",
+       .id                     = 1,
+       .dev.platform_data      = &pdata_i2c1,
+};
+
+void __init at91_add_device_i2c(short i2c_id, struct i2c_board_info *devices, int nr_devices)
+{
+       i2c_register_board_info(i2c_id, devices, nr_devices);
+
+       if (i2c_id == 0) {
+               at91_set_GPIO_periph(AT91_PIN_PA20, 1);         /* TWD (SDA) */
+               at91_set_multi_drive(AT91_PIN_PA20, 1);
+
+               at91_set_GPIO_periph(AT91_PIN_PA21, 1);         /* TWCK (SCL) */
+               at91_set_multi_drive(AT91_PIN_PA21, 1);
+
+               platform_device_register(&at91sam9g45_twi0_device);
+       } else {
+               at91_set_GPIO_periph(AT91_PIN_PB10, 1);         /* TWD (SDA) */
+               at91_set_multi_drive(AT91_PIN_PB10, 1);
+
+               at91_set_GPIO_periph(AT91_PIN_PB11, 1);         /* TWCK (SCL) */
+               at91_set_multi_drive(AT91_PIN_PB11, 1);
+
+               platform_device_register(&at91sam9g45_twi1_device);
+       }
+}
+
+#elif defined(CONFIG_I2C_AT91) || defined(CONFIG_I2C_AT91_MODULE)
+static struct resource twi0_resources[] = {
+       [0] = {
+               .start  = AT91SAM9G45_BASE_TWI0,
+               .end    = AT91SAM9G45_BASE_TWI0 + SZ_16K - 1,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start  = AT91SAM9G45_ID_TWI0,
+               .end    = AT91SAM9G45_ID_TWI0,
+               .flags  = IORESOURCE_IRQ,
+       },
+};
+
+static struct platform_device at91sam9g45_twi0_device = {
+       .name           = "at91_i2c",
+       .id             = 0,
+       .resource       = twi0_resources,
+       .num_resources  = ARRAY_SIZE(twi0_resources),
+};
+
+static struct resource twi1_resources[] = {
+       [0] = {
+               .start  = AT91SAM9G45_BASE_TWI1,
+               .end    = AT91SAM9G45_BASE_TWI1 + SZ_16K - 1,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start  = AT91SAM9G45_ID_TWI1,
+               .end    = AT91SAM9G45_ID_TWI1,
+               .flags  = IORESOURCE_IRQ,
+       },
+};
+
+static struct platform_device at91sam9g45_twi1_device = {
+       .name           = "at91_i2c",
+       .id             = 1,
+       .resource       = twi1_resources,
+       .num_resources  = ARRAY_SIZE(twi1_resources),
+};
+
+void __init at91_add_device_i2c(short i2c_id, struct i2c_board_info *devices, int nr_devices)
+{
+       i2c_register_board_info(i2c_id, devices, nr_devices);
+
+       /* pins used for TWI interface */
+       if (i2c_id == 0) {
+               at91_set_A_periph(AT91_PIN_PA20, 0);            /* TWD */
+               at91_set_multi_drive(AT91_PIN_PA20, 1);
+
+               at91_set_A_periph(AT91_PIN_PA21, 0);            /* TWCK */
+               at91_set_multi_drive(AT91_PIN_PA21, 1);
+
+               platform_device_register(&at91sam9g45_twi0_device);
+       } else {
+               at91_set_A_periph(AT91_PIN_PB10, 0);            /* TWD */
+               at91_set_multi_drive(AT91_PIN_PB10, 1);
+
+               at91_set_A_periph(AT91_PIN_PB11, 0);            /* TWCK */
+               at91_set_multi_drive(AT91_PIN_PB11, 1);
+
+               platform_device_register(&at91sam9g45_twi1_device);
+       }
+}
+#else
+void __init at91_add_device_i2c(short i2c_id, struct i2c_board_info *devices, int nr_devices) {}
+#endif
+
+
+/* --------------------------------------------------------------------
+ *  SPI
+ * -------------------------------------------------------------------- */
+
+#if defined(CONFIG_SPI_ATMEL) || defined(CONFIG_SPI_ATMEL_MODULE)
+static u64 spi_dmamask = DMA_BIT_MASK(32);
+
+static struct resource spi0_resources[] = {
+       [0] = {
+               .start  = AT91SAM9G45_BASE_SPI0,
+               .end    = AT91SAM9G45_BASE_SPI0 + SZ_16K - 1,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start  = AT91SAM9G45_ID_SPI0,
+               .end    = AT91SAM9G45_ID_SPI0,
+               .flags  = IORESOURCE_IRQ,
+       },
+};
+
+static struct platform_device at91sam9g45_spi0_device = {
+       .name           = "atmel_spi",
+       .id             = 0,
+       .dev            = {
+                               .dma_mask               = &spi_dmamask,
+                               .coherent_dma_mask      = DMA_BIT_MASK(32),
+       },
+       .resource       = spi0_resources,
+       .num_resources  = ARRAY_SIZE(spi0_resources),
+};
+
+static const unsigned spi0_standard_cs[4] = { AT91_PIN_PB3, AT91_PIN_PB18, AT91_PIN_PB19, AT91_PIN_PD27 };
+
+static struct resource spi1_resources[] = {
+       [0] = {
+               .start  = AT91SAM9G45_BASE_SPI1,
+               .end    = AT91SAM9G45_BASE_SPI1 + SZ_16K - 1,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start  = AT91SAM9G45_ID_SPI1,
+               .end    = AT91SAM9G45_ID_SPI1,
+               .flags  = IORESOURCE_IRQ,
+       },
+};
+
+static struct platform_device at91sam9g45_spi1_device = {
+       .name           = "atmel_spi",
+       .id             = 1,
+       .dev            = {
+                               .dma_mask               = &spi_dmamask,
+                               .coherent_dma_mask      = DMA_BIT_MASK(32),
+       },
+       .resource       = spi1_resources,
+       .num_resources  = ARRAY_SIZE(spi1_resources),
+};
+
+static const unsigned spi1_standard_cs[4] = { AT91_PIN_PB17, AT91_PIN_PD28, AT91_PIN_PD18, AT91_PIN_PD19 };
+
+void __init at91_add_device_spi(struct spi_board_info *devices, int nr_devices)
+{
+       int i;
+       unsigned long cs_pin;
+       short enable_spi0 = 0;
+       short enable_spi1 = 0;
+
+       /* Choose SPI chip-selects */
+       for (i = 0; i < nr_devices; i++) {
+               if (devices[i].controller_data)
+                       cs_pin = (unsigned long) devices[i].controller_data;
+               else if (devices[i].bus_num == 0)
+                       cs_pin = spi0_standard_cs[devices[i].chip_select];
+               else
+                       cs_pin = spi1_standard_cs[devices[i].chip_select];
+
+               if (devices[i].bus_num == 0)
+                       enable_spi0 = 1;
+               else
+                       enable_spi1 = 1;
+
+               /* enable chip-select pin */
+               at91_set_gpio_output(cs_pin, 1);
+
+               /* pass chip-select pin to driver */
+               devices[i].controller_data = (void *) cs_pin;
+       }
+
+       spi_register_board_info(devices, nr_devices);
+
+       /* Configure SPI bus(es) */
+       if (enable_spi0) {
+               at91_set_A_periph(AT91_PIN_PB0, 0);     /* SPI0_MISO */
+               at91_set_A_periph(AT91_PIN_PB1, 0);     /* SPI0_MOSI */
+               at91_set_A_periph(AT91_PIN_PB2, 0);     /* SPI0_SPCK */
+
+               at91_clock_associate("spi0_clk", &at91sam9g45_spi0_device.dev, "spi_clk");
+               platform_device_register(&at91sam9g45_spi0_device);
+       }
+       if (enable_spi1) {
+               at91_set_A_periph(AT91_PIN_PB14, 0);    /* SPI1_MISO */
+               at91_set_A_periph(AT91_PIN_PB15, 0);    /* SPI1_MOSI */
+               at91_set_A_periph(AT91_PIN_PB16, 0);    /* SPI1_SPCK */
+
+               at91_clock_associate("spi1_clk", &at91sam9g45_spi1_device.dev, "spi_clk");
+               platform_device_register(&at91sam9g45_spi1_device);
+       }
+}
+#else
+void __init at91_add_device_spi(struct spi_board_info *devices, int nr_devices) {}
+#endif
+
+
+/* --------------------------------------------------------------------
+ *  LCD Controller
+ * -------------------------------------------------------------------- */
+
+#if defined(CONFIG_FB_ATMEL) || defined(CONFIG_FB_ATMEL_MODULE)
+static u64 lcdc_dmamask = DMA_BIT_MASK(32);
+static struct atmel_lcdfb_info lcdc_data;
+
+static struct resource lcdc_resources[] = {
+       [0] = {
+               .start  = AT91SAM9G45_LCDC_BASE,
+               .end    = AT91SAM9G45_LCDC_BASE + SZ_4K - 1,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start  = AT91SAM9G45_ID_LCDC,
+               .end    = AT91SAM9G45_ID_LCDC,
+               .flags  = IORESOURCE_IRQ,
+       },
+};
+
+static struct platform_device at91_lcdc_device = {
+       .name           = "atmel_lcdfb",
+       .id             = 0,
+       .dev            = {
+                               .dma_mask               = &lcdc_dmamask,
+                               .coherent_dma_mask      = DMA_BIT_MASK(32),
+                               .platform_data          = &lcdc_data,
+       },
+       .resource       = lcdc_resources,
+       .num_resources  = ARRAY_SIZE(lcdc_resources),
+};
+
+void __init at91_add_device_lcdc(struct atmel_lcdfb_info *data)
+{
+       if (!data)
+               return;
+
+       at91_set_A_periph(AT91_PIN_PE0, 0);     /* LCDDPWR */
+
+       at91_set_A_periph(AT91_PIN_PE2, 0);     /* LCDCC */
+       at91_set_A_periph(AT91_PIN_PE3, 0);     /* LCDVSYNC */
+       at91_set_A_periph(AT91_PIN_PE4, 0);     /* LCDHSYNC */
+       at91_set_A_periph(AT91_PIN_PE5, 0);     /* LCDDOTCK */
+       at91_set_A_periph(AT91_PIN_PE6, 0);     /* LCDDEN */
+       at91_set_A_periph(AT91_PIN_PE7, 0);     /* LCDD0 */
+       at91_set_A_periph(AT91_PIN_PE8, 0);     /* LCDD1 */
+       at91_set_A_periph(AT91_PIN_PE9, 0);     /* LCDD2 */
+       at91_set_A_periph(AT91_PIN_PE10, 0);    /* LCDD3 */
+       at91_set_A_periph(AT91_PIN_PE11, 0);    /* LCDD4 */
+       at91_set_A_periph(AT91_PIN_PE12, 0);    /* LCDD5 */
+       at91_set_A_periph(AT91_PIN_PE13, 0);    /* LCDD6 */
+       at91_set_A_periph(AT91_PIN_PE14, 0);    /* LCDD7 */
+       at91_set_A_periph(AT91_PIN_PE15, 0);    /* LCDD8 */
+       at91_set_A_periph(AT91_PIN_PE16, 0);    /* LCDD9 */
+       at91_set_A_periph(AT91_PIN_PE17, 0);    /* LCDD10 */
+       at91_set_A_periph(AT91_PIN_PE18, 0);    /* LCDD11 */
+       at91_set_A_periph(AT91_PIN_PE19, 0);    /* LCDD12 */
+       at91_set_A_periph(AT91_PIN_PE20, 0);    /* LCDD13 */
+       at91_set_A_periph(AT91_PIN_PE21, 0);    /* LCDD14 */
+       at91_set_A_periph(AT91_PIN_PE22, 0);    /* LCDD15 */
+       at91_set_A_periph(AT91_PIN_PE23, 0);    /* LCDD16 */
+       at91_set_A_periph(AT91_PIN_PE24, 0);    /* LCDD17 */
+       at91_set_A_periph(AT91_PIN_PE25, 0);    /* LCDD18 */
+       at91_set_A_periph(AT91_PIN_PE26, 0);    /* LCDD19 */
+       at91_set_A_periph(AT91_PIN_PE27, 0);    /* LCDD20 */
+       at91_set_A_periph(AT91_PIN_PE28, 0);    /* LCDD21 */
+       at91_set_A_periph(AT91_PIN_PE29, 0);    /* LCDD22 */
+       at91_set_A_periph(AT91_PIN_PE30, 0);    /* LCDD23 */
+
+       lcdc_data = *data;
+       platform_device_register(&at91_lcdc_device);
+}
+#else
+void __init at91_add_device_lcdc(struct atmel_lcdfb_info *data) {}
+#endif
+
+
+/* --------------------------------------------------------------------
+ *  Timer/Counter block
+ * -------------------------------------------------------------------- */
+
+#ifdef CONFIG_ATMEL_TCLIB
+static struct resource tcb0_resources[] = {
+       [0] = {
+               .start  = AT91SAM9G45_BASE_TCB0,
+               .end    = AT91SAM9G45_BASE_TCB0 + SZ_16K - 1,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start  = AT91SAM9G45_ID_TCB,
+               .end    = AT91SAM9G45_ID_TCB,
+               .flags  = IORESOURCE_IRQ,
+       },
+};
+
+static struct platform_device at91sam9g45_tcb0_device = {
+       .name           = "atmel_tcb",
+       .id             = 0,
+       .resource       = tcb0_resources,
+       .num_resources  = ARRAY_SIZE(tcb0_resources),
+};
+
+/* TCB1 begins with TC3 */
+static struct resource tcb1_resources[] = {
+       [0] = {
+               .start  = AT91SAM9G45_BASE_TCB1,
+               .end    = AT91SAM9G45_BASE_TCB1 + SZ_16K - 1,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start  = AT91SAM9G45_ID_TCB,
+               .end    = AT91SAM9G45_ID_TCB,
+               .flags  = IORESOURCE_IRQ,
+       },
+};
+
+static struct platform_device at91sam9g45_tcb1_device = {
+       .name           = "atmel_tcb",
+       .id             = 1,
+       .resource       = tcb1_resources,
+       .num_resources  = ARRAY_SIZE(tcb1_resources),
+};
+
+static void __init at91_add_device_tc(void)
+{
+       /* this chip has one clock and irq for all six TC channels */
+       at91_clock_associate("tcb_clk", &at91sam9g45_tcb0_device.dev, "t0_clk");
+       platform_device_register(&at91sam9g45_tcb0_device);
+       at91_clock_associate("tcb_clk", &at91sam9g45_tcb1_device.dev, "t0_clk");
+       platform_device_register(&at91sam9g45_tcb1_device);
+}
+#else
+static void __init at91_add_device_tc(void) { }
+#endif
+
+
+/* --------------------------------------------------------------------
+ *  RTC
+ * -------------------------------------------------------------------- */
+
+#if defined(CONFIG_RTC_DRV_AT91RM9200) || defined(CONFIG_RTC_DRV_AT91RM9200_MODULE)
+static struct platform_device at91sam9g45_rtc_device = {
+       .name           = "at91_rtc",
+       .id             = -1,
+       .num_resources  = 0,
+};
+
+static void __init at91_add_device_rtc(void)
+{
+       platform_device_register(&at91sam9g45_rtc_device);
+}
+#else
+static void __init at91_add_device_rtc(void) {}
+#endif
+
+
+/* --------------------------------------------------------------------
+ *  RTT
+ * -------------------------------------------------------------------- */
+
+static struct resource rtt_resources[] = {
+       {
+               .start  = AT91_BASE_SYS + AT91_RTT,
+               .end    = AT91_BASE_SYS + AT91_RTT + SZ_16 - 1,
+               .flags  = IORESOURCE_MEM,
+       }
+};
+
+static struct platform_device at91sam9g45_rtt_device = {
+       .name           = "at91_rtt",
+       .id             = 0,
+       .resource       = rtt_resources,
+       .num_resources  = ARRAY_SIZE(rtt_resources),
+};
+
+static void __init at91_add_device_rtt(void)
+{
+       platform_device_register(&at91sam9g45_rtt_device);
+}
+
+
+/* --------------------------------------------------------------------
+ *  Watchdog
+ * -------------------------------------------------------------------- */
+
+#if defined(CONFIG_AT91SAM9_WATCHDOG) || defined(CONFIG_AT91SAM9_WATCHDOG_MODULE)
+static struct platform_device at91sam9g45_wdt_device = {
+       .name           = "at91_wdt",
+       .id             = -1,
+       .num_resources  = 0,
+};
+
+static void __init at91_add_device_watchdog(void)
+{
+       platform_device_register(&at91sam9g45_wdt_device);
+}
+#else
+static void __init at91_add_device_watchdog(void) {}
+#endif
+
+
+/* --------------------------------------------------------------------
+ *  PWM
+ * --------------------------------------------------------------------*/
+
+#if defined(CONFIG_ATMEL_PWM) || defined(CONFIG_ATMEL_PWM_MODULE)
+static u32 pwm_mask;
+
+static struct resource pwm_resources[] = {
+       [0] = {
+               .start  = AT91SAM9G45_BASE_PWMC,
+               .end    = AT91SAM9G45_BASE_PWMC + SZ_16K - 1,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start  = AT91SAM9G45_ID_PWMC,
+               .end    = AT91SAM9G45_ID_PWMC,
+               .flags  = IORESOURCE_IRQ,
+       },
+};
+
+static struct platform_device at91sam9g45_pwm0_device = {
+       .name   = "atmel_pwm",
+       .id     = -1,
+       .dev    = {
+               .platform_data          = &pwm_mask,
+       },
+       .resource       = pwm_resources,
+       .num_resources  = ARRAY_SIZE(pwm_resources),
+};
+
+void __init at91_add_device_pwm(u32 mask)
+{
+       if (mask & (1 << AT91_PWM0))
+               at91_set_B_periph(AT91_PIN_PD24, 1);    /* enable PWM0 */
+
+       if (mask & (1 << AT91_PWM1))
+               at91_set_B_periph(AT91_PIN_PD31, 1);    /* enable PWM1 */
+
+       if (mask & (1 << AT91_PWM2))
+               at91_set_B_periph(AT91_PIN_PD26, 1);    /* enable PWM2 */
+
+       if (mask & (1 << AT91_PWM3))
+               at91_set_B_periph(AT91_PIN_PD0, 1);     /* enable PWM3 */
+
+       pwm_mask = mask;
+
+       platform_device_register(&at91sam9g45_pwm0_device);
+}
+#else
+void __init at91_add_device_pwm(u32 mask) {}
+#endif
+
+
+/* --------------------------------------------------------------------
+ *  SSC -- Synchronous Serial Controller
+ * -------------------------------------------------------------------- */
+
+#if defined(CONFIG_ATMEL_SSC) || defined(CONFIG_ATMEL_SSC_MODULE)
+static u64 ssc0_dmamask = DMA_BIT_MASK(32);
+
+static struct resource ssc0_resources[] = {
+       [0] = {
+               .start  = AT91SAM9G45_BASE_SSC0,
+               .end    = AT91SAM9G45_BASE_SSC0 + SZ_16K - 1,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start  = AT91SAM9G45_ID_SSC0,
+               .end    = AT91SAM9G45_ID_SSC0,
+               .flags  = IORESOURCE_IRQ,
+       },
+};
+
+static struct platform_device at91sam9g45_ssc0_device = {
+       .name   = "ssc",
+       .id     = 0,
+       .dev    = {
+               .dma_mask               = &ssc0_dmamask,
+               .coherent_dma_mask      = DMA_BIT_MASK(32),
+       },
+       .resource       = ssc0_resources,
+       .num_resources  = ARRAY_SIZE(ssc0_resources),
+};
+
+static inline void configure_ssc0_pins(unsigned pins)
+{
+       if (pins & ATMEL_SSC_TF)
+               at91_set_A_periph(AT91_PIN_PD1, 1);
+       if (pins & ATMEL_SSC_TK)
+               at91_set_A_periph(AT91_PIN_PD0, 1);
+       if (pins & ATMEL_SSC_TD)
+               at91_set_A_periph(AT91_PIN_PD2, 1);
+       if (pins & ATMEL_SSC_RD)
+               at91_set_A_periph(AT91_PIN_PD3, 1);
+       if (pins & ATMEL_SSC_RK)
+               at91_set_A_periph(AT91_PIN_PD4, 1);
+       if (pins & ATMEL_SSC_RF)
+               at91_set_A_periph(AT91_PIN_PD5, 1);
+}
+
+static u64 ssc1_dmamask = DMA_BIT_MASK(32);
+
+static struct resource ssc1_resources[] = {
+       [0] = {
+               .start  = AT91SAM9G45_BASE_SSC1,
+               .end    = AT91SAM9G45_BASE_SSC1 + SZ_16K - 1,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start  = AT91SAM9G45_ID_SSC1,
+               .end    = AT91SAM9G45_ID_SSC1,
+               .flags  = IORESOURCE_IRQ,
+       },
+};
+
+static struct platform_device at91sam9g45_ssc1_device = {
+       .name   = "ssc",
+       .id     = 1,
+       .dev    = {
+               .dma_mask               = &ssc1_dmamask,
+               .coherent_dma_mask      = DMA_BIT_MASK(32),
+       },
+       .resource       = ssc1_resources,
+       .num_resources  = ARRAY_SIZE(ssc1_resources),
+};
+
+static inline void configure_ssc1_pins(unsigned pins)
+{
+       if (pins & ATMEL_SSC_TF)
+               at91_set_A_periph(AT91_PIN_PD14, 1);
+       if (pins & ATMEL_SSC_TK)
+               at91_set_A_periph(AT91_PIN_PD12, 1);
+       if (pins & ATMEL_SSC_TD)
+               at91_set_A_periph(AT91_PIN_PD10, 1);
+       if (pins & ATMEL_SSC_RD)
+               at91_set_A_periph(AT91_PIN_PD11, 1);
+       if (pins & ATMEL_SSC_RK)
+               at91_set_A_periph(AT91_PIN_PD13, 1);
+       if (pins & ATMEL_SSC_RF)
+               at91_set_A_periph(AT91_PIN_PD15, 1);
+}
+
+/*
+ * SSC controllers are accessed through library code, instead of any
+ * kind of all-singing/all-dancing driver.  For example one could be
+ * used by a particular I2S audio codec's driver, while another one
+ * on the same system might be used by a custom data capture driver.
+ */
+void __init at91_add_device_ssc(unsigned id, unsigned pins)
+{
+       struct platform_device *pdev;
+
+       /*
+        * NOTE: caller is responsible for passing information matching
+        * "pins" to whatever will be using each particular controller.
+        */
+       switch (id) {
+       case AT91SAM9G45_ID_SSC0:
+               pdev = &at91sam9g45_ssc0_device;
+               configure_ssc0_pins(pins);
+               at91_clock_associate("ssc0_clk", &pdev->dev, "pclk");
+               break;
+       case AT91SAM9G45_ID_SSC1:
+               pdev = &at91sam9g45_ssc1_device;
+               configure_ssc1_pins(pins);
+               at91_clock_associate("ssc1_clk", &pdev->dev, "pclk");
+               break;
+       default:
+               return;
+       }
+
+       platform_device_register(pdev);
+}
+
+#else
+void __init at91_add_device_ssc(unsigned id, unsigned pins) {}
+#endif
+
+
+/* --------------------------------------------------------------------
+ *  UART
+ * -------------------------------------------------------------------- */
+
+#if defined(CONFIG_SERIAL_ATMEL)
+static struct resource dbgu_resources[] = {
+       [0] = {
+               .start  = AT91_VA_BASE_SYS + AT91_DBGU,
+               .end    = AT91_VA_BASE_SYS + AT91_DBGU + SZ_512 - 1,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start  = AT91_ID_SYS,
+               .end    = AT91_ID_SYS,
+               .flags  = IORESOURCE_IRQ,
+       },
+};
+
+static struct atmel_uart_data dbgu_data = {
+       .use_dma_tx     = 0,
+       .use_dma_rx     = 0,
+       .regs           = (void __iomem *)(AT91_VA_BASE_SYS + AT91_DBGU),
+};
+
+static u64 dbgu_dmamask = DMA_BIT_MASK(32);
+
+static struct platform_device at91sam9g45_dbgu_device = {
+       .name           = "atmel_usart",
+       .id             = 0,
+       .dev            = {
+                               .dma_mask               = &dbgu_dmamask,
+                               .coherent_dma_mask      = DMA_BIT_MASK(32),
+                               .platform_data          = &dbgu_data,
+       },
+       .resource       = dbgu_resources,
+       .num_resources  = ARRAY_SIZE(dbgu_resources),
+};
+
+static inline void configure_dbgu_pins(void)
+{
+       at91_set_A_periph(AT91_PIN_PB12, 0);            /* DRXD */
+       at91_set_A_periph(AT91_PIN_PB13, 1);            /* DTXD */
+}
+
+static struct resource uart0_resources[] = {
+       [0] = {
+               .start  = AT91SAM9G45_BASE_US0,
+               .end    = AT91SAM9G45_BASE_US0 + SZ_16K - 1,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start  = AT91SAM9G45_ID_US0,
+               .end    = AT91SAM9G45_ID_US0,
+               .flags  = IORESOURCE_IRQ,
+       },
+};
+
+static struct atmel_uart_data uart0_data = {
+       .use_dma_tx     = 1,
+       .use_dma_rx     = 1,
+};
+
+static u64 uart0_dmamask = DMA_BIT_MASK(32);
+
+static struct platform_device at91sam9g45_uart0_device = {
+       .name           = "atmel_usart",
+       .id             = 1,
+       .dev            = {
+                               .dma_mask               = &uart0_dmamask,
+                               .coherent_dma_mask      = DMA_BIT_MASK(32),
+                               .platform_data          = &uart0_data,
+       },
+       .resource       = uart0_resources,
+       .num_resources  = ARRAY_SIZE(uart0_resources),
+};
+
+static inline void configure_usart0_pins(unsigned pins)
+{
+       at91_set_A_periph(AT91_PIN_PB19, 1);            /* TXD0 */
+       at91_set_A_periph(AT91_PIN_PB18, 0);            /* RXD0 */
+
+       if (pins & ATMEL_UART_RTS)
+               at91_set_B_periph(AT91_PIN_PB17, 0);    /* RTS0 */
+       if (pins & ATMEL_UART_CTS)
+               at91_set_B_periph(AT91_PIN_PB15, 0);    /* CTS0 */
+}
+
+static struct resource uart1_resources[] = {
+       [0] = {
+               .start  = AT91SAM9G45_BASE_US1,
+               .end    = AT91SAM9G45_BASE_US1 + SZ_16K - 1,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start  = AT91SAM9G45_ID_US1,
+               .end    = AT91SAM9G45_ID_US1,
+               .flags  = IORESOURCE_IRQ,
+       },
+};
+
+static struct atmel_uart_data uart1_data = {
+       .use_dma_tx     = 1,
+       .use_dma_rx     = 1,
+};
+
+static u64 uart1_dmamask = DMA_BIT_MASK(32);
+
+static struct platform_device at91sam9g45_uart1_device = {
+       .name           = "atmel_usart",
+       .id             = 2,
+       .dev            = {
+                               .dma_mask               = &uart1_dmamask,
+                               .coherent_dma_mask      = DMA_BIT_MASK(32),
+                               .platform_data          = &uart1_data,
+       },
+       .resource       = uart1_resources,
+       .num_resources  = ARRAY_SIZE(uart1_resources),
+};
+
+static inline void configure_usart1_pins(unsigned pins)
+{
+       at91_set_A_periph(AT91_PIN_PB4, 1);             /* TXD1 */
+       at91_set_A_periph(AT91_PIN_PB5, 0);             /* RXD1 */
+
+       if (pins & ATMEL_UART_RTS)
+               at91_set_A_periph(AT91_PIN_PD16, 0);    /* RTS1 */
+       if (pins & ATMEL_UART_CTS)
+               at91_set_A_periph(AT91_PIN_PD17, 0);    /* CTS1 */
+}
+
+static struct resource uart2_resources[] = {
+       [0] = {
+               .start  = AT91SAM9G45_BASE_US2,
+               .end    = AT91SAM9G45_BASE_US2 + SZ_16K - 1,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start  = AT91SAM9G45_ID_US2,
+               .end    = AT91SAM9G45_ID_US2,
+               .flags  = IORESOURCE_IRQ,
+       },
+};
+
+static struct atmel_uart_data uart2_data = {
+       .use_dma_tx     = 1,
+       .use_dma_rx     = 1,
+};
+
+static u64 uart2_dmamask = DMA_BIT_MASK(32);
+
+static struct platform_device at91sam9g45_uart2_device = {
+       .name           = "atmel_usart",
+       .id             = 3,
+       .dev            = {
+                               .dma_mask               = &uart2_dmamask,
+                               .coherent_dma_mask      = DMA_BIT_MASK(32),
+                               .platform_data          = &uart2_data,
+       },
+       .resource       = uart2_resources,
+       .num_resources  = ARRAY_SIZE(uart2_resources),
+};
+
+static inline void configure_usart2_pins(unsigned pins)
+{
+       at91_set_A_periph(AT91_PIN_PB6, 1);             /* TXD2 */
+       at91_set_A_periph(AT91_PIN_PB7, 0);             /* RXD2 */
+
+       if (pins & ATMEL_UART_RTS)
+               at91_set_B_periph(AT91_PIN_PC9, 0);     /* RTS2 */
+       if (pins & ATMEL_UART_CTS)
+               at91_set_B_periph(AT91_PIN_PC11, 0);    /* CTS2 */
+}
+
+static struct resource uart3_resources[] = {
+       [0] = {
+               .start  = AT91SAM9G45_BASE_US3,
+               .end    = AT91SAM9G45_BASE_US3 + SZ_16K - 1,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start  = AT91SAM9G45_ID_US3,
+               .end    = AT91SAM9G45_ID_US3,
+               .flags  = IORESOURCE_IRQ,
+       },
+};
+
+static struct atmel_uart_data uart3_data = {
+       .use_dma_tx     = 1,
+       .use_dma_rx     = 1,
+};
+
+static u64 uart3_dmamask = DMA_BIT_MASK(32);
+
+static struct platform_device at91sam9g45_uart3_device = {
+       .name           = "atmel_usart",
+       .id             = 4,
+       .dev            = {
+                               .dma_mask               = &uart3_dmamask,
+                               .coherent_dma_mask      = DMA_BIT_MASK(32),
+                               .platform_data          = &uart3_data,
+       },
+       .resource       = uart3_resources,
+       .num_resources  = ARRAY_SIZE(uart3_resources),
+};
+
+static inline void configure_usart3_pins(unsigned pins)
+{
+       at91_set_A_periph(AT91_PIN_PB8, 1);             /* TXD3 */
+       at91_set_A_periph(AT91_PIN_PB9, 0);             /* RXD3 */
+
+       if (pins & ATMEL_UART_RTS)
+               at91_set_B_periph(AT91_PIN_PA23, 0);    /* RTS3 */
+       if (pins & ATMEL_UART_CTS)
+               at91_set_B_periph(AT91_PIN_PA24, 0);    /* CTS3 */
+}
+
+static struct platform_device *__initdata at91_uarts[ATMEL_MAX_UART];  /* the UARTs to use */
+struct platform_device *atmel_default_console_device;  /* the serial console device */
+
+void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins)
+{
+       struct platform_device *pdev;
+
+       switch (id) {
+               case 0:         /* DBGU */
+                       pdev = &at91sam9g45_dbgu_device;
+                       configure_dbgu_pins();
+                       at91_clock_associate("mck", &pdev->dev, "usart");
+                       break;
+               case AT91SAM9G45_ID_US0:
+                       pdev = &at91sam9g45_uart0_device;
+                       configure_usart0_pins(pins);
+                       at91_clock_associate("usart0_clk", &pdev->dev, "usart");
+                       break;
+               case AT91SAM9G45_ID_US1:
+                       pdev = &at91sam9g45_uart1_device;
+                       configure_usart1_pins(pins);
+                       at91_clock_associate("usart1_clk", &pdev->dev, "usart");
+                       break;
+               case AT91SAM9G45_ID_US2:
+                       pdev = &at91sam9g45_uart2_device;
+                       configure_usart2_pins(pins);
+                       at91_clock_associate("usart2_clk", &pdev->dev, "usart");
+                       break;
+               case AT91SAM9G45_ID_US3:
+                       pdev = &at91sam9g45_uart3_device;
+                       configure_usart3_pins(pins);
+                       at91_clock_associate("usart3_clk", &pdev->dev, "usart");
+                       break;
+               default:
+                       return;
+       }
+       pdev->id = portnr;              /* update to mapped ID */
+
+       if (portnr < ATMEL_MAX_UART)
+               at91_uarts[portnr] = pdev;
+}
+
+void __init at91_set_serial_console(unsigned portnr)
+{
+       if (portnr < ATMEL_MAX_UART)
+               atmel_default_console_device = at91_uarts[portnr];
+}
+
+void __init at91_add_device_serial(void)
+{
+       int i;
+
+       for (i = 0; i < ATMEL_MAX_UART; i++) {
+               if (at91_uarts[i])
+                       platform_device_register(at91_uarts[i]);
+       }
+
+       if (!atmel_default_console_device)
+               printk(KERN_INFO "AT91: No default serial console defined.\n");
+}
+#else
+void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins) {}
+void __init at91_set_serial_console(unsigned portnr) {}
+void __init at91_add_device_serial(void) {}
+#endif
+
+
+/* -------------------------------------------------------------------- */
+/*
+ * These devices are always present and don't need any board-specific
+ * setup.
+ */
+static int __init at91_add_standard_devices(void)
+{
+       at91_add_device_rtc();
+       at91_add_device_rtt();
+       at91_add_device_watchdog();
+       at91_add_device_tc();
+       return 0;
+}
+
+arch_initcall(at91_add_standard_devices);
index 970fd6b6753ea0d1285ffcd390d7ffe17a0ca497..61e52b66bc72ed218ccb6af5009da3c6086ef462 100644 (file)
@@ -174,6 +174,16 @@ static struct i2c_board_info __initdata afeb9260_i2c_devices[] = {
        },
 };
 
+/*
+ * IDE (CF True IDE mode)
+ */
+static struct at91_cf_data afeb9260_cf_data = {
+       .chipselect = 4,
+       .irq_pin    = AT91_PIN_PA6,
+       .rst_pin    = AT91_PIN_PA7,
+       .flags      = AT91_CF_TRUE_IDE,
+};
+
 static void __init afeb9260_board_init(void)
 {
        /* Serial */
@@ -202,6 +212,8 @@ static void __init afeb9260_board_init(void)
                        ARRAY_SIZE(afeb9260_i2c_devices));
        /* Audio */
        at91_add_device_ssc(AT91SAM9260_ID_SSC, ATMEL_SSC_TX);
+       /* IDE */
+       at91_add_device_cf(&afeb9260_cf_data);
 }
 
 MACHINE_START(AFEB9260, "Custom afeb9260 board")
diff --git a/arch/arm/mach-at91/board-cpu9krea.c b/arch/arm/mach-at91/board-cpu9krea.c
new file mode 100644 (file)
index 0000000..4bc2e9f
--- /dev/null
@@ -0,0 +1,385 @@
+/*
+ * linux/arch/arm/mach-at91/board-cpu9krea.c
+ *
+ *  Copyright (C) 2005 SAN People
+ *  Copyright (C) 2006 Atmel
+ *  Copyright (C) 2009 Eric Benard - eric@eukrea.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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+#include <linux/types.h>
+#include <linux/init.h>
+#include <linux/mm.h>
+#include <linux/module.h>
+#include <linux/platform_device.h>
+#include <linux/clk.h>
+#include <linux/gpio_keys.h>
+#include <linux/input.h>
+#include <linux/mtd/physmap.h>
+
+#include <asm/setup.h>
+#include <asm/mach-types.h>
+#include <asm/irq.h>
+
+#include <asm/mach/arch.h>
+#include <asm/mach/map.h>
+#include <asm/mach/irq.h>
+
+#include <mach/hardware.h>
+#include <mach/board.h>
+#include <mach/gpio.h>
+#include <mach/at91sam9_smc.h>
+#include <mach/at91sam9260_matrix.h>
+
+#include "sam9_smc.h"
+#include "generic.h"
+
+static void __init cpu9krea_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, RTS, CTS) */
+       at91_register_uart(AT91SAM9260_ID_US1, 2, ATMEL_UART_CTS |
+               ATMEL_UART_RTS);
+
+       /* USART2 on ttyS3. (Rx, Tx, RTS, CTS) */
+       at91_register_uart(AT91SAM9260_ID_US2, 3, ATMEL_UART_CTS |
+               ATMEL_UART_RTS);
+
+       /* USART3 on ttyS4. (Rx, Tx) */
+       at91_register_uart(AT91SAM9260_ID_US3, 4, 0);
+
+       /* USART4 on ttyS5. (Rx, Tx) */
+       at91_register_uart(AT91SAM9260_ID_US4, 5, 0);
+
+       /* USART5 on ttyS6. (Rx, Tx) */
+       at91_register_uart(AT91SAM9260_ID_US5, 6, 0);
+
+       /* set serial console to ttyS0 (ie, DBGU) */
+       at91_set_serial_console(0);
+}
+
+static void __init cpu9krea_init_irq(void)
+{
+       at91sam9260_init_interrupts(NULL);
+}
+
+/*
+ * USB Host port
+ */
+static struct at91_usbh_data __initdata cpu9krea_usbh_data = {
+       .ports          = 2,
+};
+
+/*
+ * USB Device port
+ */
+static struct at91_udc_data __initdata cpu9krea_udc_data = {
+       .vbus_pin       = AT91_PIN_PC8,
+       .pullup_pin     = 0,            /* pull-up driven by UDC */
+};
+
+/*
+ * MACB Ethernet device
+ */
+static struct at91_eth_data __initdata cpu9krea_macb_data = {
+       .is_rmii        = 1,
+};
+
+/*
+ * NAND flash
+ */
+static struct atmel_nand_data __initdata cpu9krea_nand_data = {
+       .ale            = 21,
+       .cle            = 22,
+       .rdy_pin        = AT91_PIN_PC13,
+       .enable_pin     = AT91_PIN_PC14,
+       .bus_width_16   = 0,
+};
+
+#ifdef CONFIG_MACH_CPU9260
+static struct sam9_smc_config __initdata cpu9krea_nand_smc_config = {
+       .ncs_read_setup         = 0,
+       .nrd_setup              = 1,
+       .ncs_write_setup        = 0,
+       .nwe_setup              = 1,
+
+       .ncs_read_pulse         = 3,
+       .nrd_pulse              = 3,
+       .ncs_write_pulse        = 3,
+       .nwe_pulse              = 3,
+
+       .read_cycle             = 5,
+       .write_cycle            = 5,
+
+       .mode                   = AT91_SMC_READMODE | AT91_SMC_WRITEMODE
+               | AT91_SMC_EXNWMODE_DISABLE | AT91_SMC_DBW_8,
+       .tdf_cycles             = 2,
+};
+#else
+static struct sam9_smc_config __initdata cpu9krea_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,
+};
+#endif
+
+static void __init cpu9krea_add_device_nand(void)
+{
+       sam9_smc_configure(3, &cpu9krea_nand_smc_config);
+       at91_add_device_nand(&cpu9krea_nand_data);
+}
+
+/*
+ * NOR flash
+ */
+static struct physmap_flash_data cpuat9260_nor_data = {
+       .width          = 2,
+};
+
+#define NOR_BASE       AT91_CHIPSELECT_0
+#define NOR_SIZE       SZ_64M
+
+static struct resource nor_flash_resources[] = {
+       {
+               .start  = NOR_BASE,
+               .end    = NOR_BASE + NOR_SIZE - 1,
+               .flags  = IORESOURCE_MEM,
+       }
+};
+
+static struct platform_device cpu9krea_nor_flash = {
+       .name           = "physmap-flash",
+       .id             = 0,
+       .dev            = {
+               .platform_data  = &cpuat9260_nor_data,
+       },
+       .resource       = nor_flash_resources,
+       .num_resources  = ARRAY_SIZE(nor_flash_resources),
+};
+
+#ifdef CONFIG_MACH_CPU9260
+static struct sam9_smc_config __initdata cpu9krea_nor_smc_config = {
+       .ncs_read_setup         = 0,
+       .nrd_setup              = 1,
+       .ncs_write_setup        = 0,
+       .nwe_setup              = 1,
+
+       .ncs_read_pulse         = 10,
+       .nrd_pulse              = 10,
+       .ncs_write_pulse        = 6,
+       .nwe_pulse              = 6,
+
+       .read_cycle             = 12,
+       .write_cycle            = 8,
+
+       .mode                   = AT91_SMC_READMODE | AT91_SMC_WRITEMODE
+                       | AT91_SMC_EXNWMODE_DISABLE | AT91_SMC_BAT_WRITE
+                       | AT91_SMC_DBW_16,
+       .tdf_cycles             = 2,
+};
+#else
+static struct sam9_smc_config __initdata cpu9krea_nor_smc_config = {
+       .ncs_read_setup         = 0,
+       .nrd_setup              = 1,
+       .ncs_write_setup        = 0,
+       .nwe_setup              = 1,
+
+       .ncs_read_pulse         = 13,
+       .nrd_pulse              = 13,
+       .ncs_write_pulse        = 8,
+       .nwe_pulse              = 8,
+
+       .read_cycle             = 15,
+       .write_cycle            = 10,
+
+       .mode                   = AT91_SMC_READMODE | AT91_SMC_WRITEMODE
+                       | AT91_SMC_EXNWMODE_DISABLE | AT91_SMC_BAT_WRITE
+                       | AT91_SMC_DBW_16,
+       .tdf_cycles             = 2,
+};
+#endif
+
+static __init void cpu9krea_add_device_nor(void)
+{
+       unsigned long csa;
+
+       csa = at91_sys_read(AT91_MATRIX_EBICSA);
+       at91_sys_write(AT91_MATRIX_EBICSA, csa | AT91_MATRIX_VDDIOMSEL_3_3V);
+
+       /* configure chip-select 0 (NOR) */
+       sam9_smc_configure(0, &cpu9krea_nor_smc_config);
+
+       platform_device_register(&cpu9krea_nor_flash);
+}
+
+/*
+ * LEDs
+ */
+static struct gpio_led cpu9krea_leds[] = {
+       {       /* LED1 */
+               .name                   = "LED1",
+               .gpio                   = AT91_PIN_PC11,
+               .active_low             = 1,
+               .default_trigger        = "timer",
+       },
+       {       /* LED2 */
+               .name                   = "LED2",
+               .gpio                   = AT91_PIN_PC12,
+               .active_low             = 1,
+               .default_trigger        = "heartbeat",
+       },
+       {       /* LED3 */
+               .name                   = "LED3",
+               .gpio                   = AT91_PIN_PC7,
+               .active_low             = 1,
+               .default_trigger        = "none",
+       },
+       {       /* LED4 */
+               .name                   = "LED4",
+               .gpio                   = AT91_PIN_PC9,
+               .active_low             = 1,
+               .default_trigger        = "none",
+       }
+};
+
+static struct i2c_board_info __initdata cpu9krea_i2c_devices[] = {
+       {
+               I2C_BOARD_INFO("rtc-ds1307", 0x68),
+               .type   = "ds1339",
+       },
+};
+
+/*
+ * GPIO Buttons
+ */
+#if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE)
+static struct gpio_keys_button cpu9krea_buttons[] = {
+       {
+               .gpio           = AT91_PIN_PC3,
+               .code           = BTN_0,
+               .desc           = "BP1",
+               .active_low     = 1,
+               .wakeup         = 1,
+       },
+       {
+               .gpio           = AT91_PIN_PB20,
+               .code           = BTN_1,
+               .desc           = "BP2",
+               .active_low     = 1,
+               .wakeup         = 1,
+       }
+};
+
+static struct gpio_keys_platform_data cpu9krea_button_data = {
+       .buttons        = cpu9krea_buttons,
+       .nbuttons       = ARRAY_SIZE(cpu9krea_buttons),
+};
+
+static struct platform_device cpu9krea_button_device = {
+       .name           = "gpio-keys",
+       .id             = -1,
+       .num_resources  = 0,
+       .dev            = {
+               .platform_data  = &cpu9krea_button_data,
+       }
+};
+
+static void __init cpu9krea_add_device_buttons(void)
+{
+       at91_set_gpio_input(AT91_PIN_PC3, 1);   /* BP1 */
+       at91_set_deglitch(AT91_PIN_PC3, 1);
+       at91_set_gpio_input(AT91_PIN_PB20, 1);  /* BP2 */
+       at91_set_deglitch(AT91_PIN_PB20, 1);
+
+       platform_device_register(&cpu9krea_button_device);
+}
+#else
+static void __init cpu9krea_add_device_buttons(void)
+{
+}
+#endif
+
+/*
+ * MCI (SD/MMC)
+ */
+static struct at91_mmc_data __initdata cpu9krea_mmc_data = {
+       .slot_b         = 0,
+       .wire4          = 1,
+       .det_pin        = AT91_PIN_PA29,
+};
+
+static void __init cpu9krea_board_init(void)
+{
+       /* NOR */
+       cpu9krea_add_device_nor();
+       /* Serial */
+       at91_add_device_serial();
+       /* USB Host */
+       at91_add_device_usbh(&cpu9krea_usbh_data);
+       /* USB Device */
+       at91_add_device_udc(&cpu9krea_udc_data);
+       /* NAND */
+       cpu9krea_add_device_nand();
+       /* Ethernet */
+       at91_add_device_eth(&cpu9krea_macb_data);
+       /* MMC */
+       at91_add_device_mmc(0, &cpu9krea_mmc_data);
+       /* I2C */
+       at91_add_device_i2c(cpu9krea_i2c_devices,
+               ARRAY_SIZE(cpu9krea_i2c_devices));
+       /* LEDs */
+       at91_gpio_leds(cpu9krea_leds, ARRAY_SIZE(cpu9krea_leds));
+       /* Push Buttons */
+       cpu9krea_add_device_buttons();
+}
+
+#ifdef CONFIG_MACH_CPU9260
+MACHINE_START(CPUAT9260, "Eukrea CPU9260")
+#else
+MACHINE_START(CPUAT9G20, "Eukrea CPU9G20")
+#endif
+       /* Maintainer: Eric Benard - EUKREA Electromatique */
+       .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         = cpu9krea_map_io,
+       .init_irq       = cpu9krea_init_irq,
+       .init_machine   = cpu9krea_board_init,
+MACHINE_END
diff --git a/arch/arm/mach-at91/board-cpuat91.c b/arch/arm/mach-at91/board-cpuat91.c
new file mode 100644 (file)
index 0000000..a28d996
--- /dev/null
@@ -0,0 +1,185 @@
+/*
+ * linux/arch/arm/mach-at91/board-cpuat91.c
+ *
+ *  Copyright (C) 2009 Eric Benard - eric@eukrea.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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+#include <linux/types.h>
+#include <linux/init.h>
+#include <linux/mm.h>
+#include <linux/module.h>
+#include <linux/platform_device.h>
+#include <linux/mtd/physmap.h>
+#include <linux/mtd/plat-ram.h>
+
+#include <mach/hardware.h>
+#include <asm/setup.h>
+#include <asm/mach-types.h>
+#include <asm/irq.h>
+
+#include <asm/mach/arch.h>
+#include <asm/mach/map.h>
+#include <asm/mach/irq.h>
+
+#include <mach/board.h>
+#include <mach/gpio.h>
+#include <mach/at91rm9200_mc.h>
+
+#include "generic.h"
+
+static struct gpio_led cpuat91_leds[] = {
+       {
+               .name                   = "led1",
+               .default_trigger        = "heartbeat",
+               .active_low             = 1,
+               .gpio                   = AT91_PIN_PC0,
+       },
+};
+
+static void __init cpuat91_map_io(void)
+{
+       /* Initialize processor: 18.432 MHz crystal */
+       at91rm9200_initialize(18432000, AT91RM9200_PQFP);
+
+       /* DBGU on ttyS0. (Rx & Tx only) */
+       at91_register_uart(0, 0, 0);
+
+       /* USART0 on ttyS1. (Rx, Tx, CTS, RTS) */
+       at91_register_uart(AT91RM9200_ID_US0, 1, ATMEL_UART_CTS |
+               ATMEL_UART_RTS);
+
+       /* USART1 on ttyS2. (Rx, Tx, CTS, RTS, DTR, DSR, DCD, RI) */
+       at91_register_uart(AT91RM9200_ID_US1, 2, ATMEL_UART_CTS |
+               ATMEL_UART_RTS | ATMEL_UART_DTR | ATMEL_UART_DSR |
+               ATMEL_UART_DCD | ATMEL_UART_RI);
+
+       /* USART2 on ttyS3 (Rx, Tx) */
+       at91_register_uart(AT91RM9200_ID_US2, 3, 0);
+
+       /* USART3 on ttyS4 (Rx, Tx, CTS, RTS) */
+       at91_register_uart(AT91RM9200_ID_US3, 4, ATMEL_UART_CTS |
+               ATMEL_UART_RTS);
+
+       /* set serial console to ttyS0 (ie, DBGU) */
+       at91_set_serial_console(0);
+}
+
+static void __init cpuat91_init_irq(void)
+{
+       at91rm9200_init_interrupts(NULL);
+}
+
+static struct at91_eth_data __initdata cpuat91_eth_data = {
+       .is_rmii        = 1,
+};
+
+static struct at91_usbh_data __initdata cpuat91_usbh_data = {
+       .ports          = 1,
+};
+
+static struct at91_udc_data __initdata cpuat91_udc_data = {
+       .vbus_pin       = AT91_PIN_PC15,
+       .pullup_pin     = AT91_PIN_PC14,
+};
+
+static struct at91_mmc_data __initdata cpuat91_mmc_data = {
+       .det_pin        = AT91_PIN_PC2,
+       .wire4          = 1,
+};
+
+static struct physmap_flash_data cpuat91_flash_data = {
+       .width          = 2,
+};
+
+static struct resource cpuat91_flash_resource = {
+       .start          = AT91_CHIPSELECT_0,
+       .end            = AT91_CHIPSELECT_0 + SZ_16M - 1,
+       .flags          = IORESOURCE_MEM,
+};
+
+static struct platform_device cpuat91_norflash = {
+       .name           = "physmap-flash",
+       .id             = 0,
+       .dev    = {
+               .platform_data  = &cpuat91_flash_data,
+       },
+       .resource       = &cpuat91_flash_resource,
+       .num_resources  = 1,
+};
+
+#ifdef CONFIG_MTD_PLATRAM
+struct platdata_mtd_ram at91_sram_pdata = {
+       .mapname        = "SRAM",
+       .bankwidth      = 2,
+};
+
+static struct resource at91_sram_resource[] = {
+       [0] = {
+               .start = AT91RM9200_SRAM_BASE,
+               .end   = AT91RM9200_SRAM_BASE + AT91RM9200_SRAM_SIZE - 1,
+               .flags = IORESOURCE_MEM,
+       },
+};
+
+static struct platform_device at91_sram = {
+       .name           = "mtd-ram",
+       .id             = 0,
+       .resource       = at91_sram_resource,
+       .num_resources  = ARRAY_SIZE(at91_sram_resource),
+       .dev    = {
+               .platform_data = &at91_sram_pdata,
+       },
+};
+#endif /* MTD_PLATRAM */
+
+static struct platform_device *platform_devices[] __initdata = {
+       &cpuat91_norflash,
+#ifdef CONFIG_MTD_PLATRAM
+       &at91_sram,
+#endif /* CONFIG_MTD_PLATRAM */
+};
+
+static void __init cpuat91_board_init(void)
+{
+       /* Serial */
+       at91_add_device_serial();
+       /* LEDs. */
+       at91_gpio_leds(cpuat91_leds, ARRAY_SIZE(cpuat91_leds));
+       /* Ethernet */
+       at91_add_device_eth(&cpuat91_eth_data);
+       /* USB Host */
+       at91_add_device_usbh(&cpuat91_usbh_data);
+       /* USB Device */
+       at91_add_device_udc(&cpuat91_udc_data);
+       /* MMC */
+       at91_add_device_mmc(0, &cpuat91_mmc_data);
+       /* I2C */
+       at91_add_device_i2c(NULL, 0);
+       /* Platform devices */
+       platform_add_devices(platform_devices, ARRAY_SIZE(platform_devices));
+}
+
+MACHINE_START(CPUAT91, "Eukrea")
+       /* Maintainer: Eric Benard - EUKREA Electromatique */
+       .phys_io        = AT91_BASE_SYS,
+       .io_pg_offst    = (AT91_VA_BASE_SYS >> 18) & 0xfffc,
+       .boot_params    = AT91_SDRAM_BASE + 0x100,
+       .timer          = &at91rm9200_timer,
+       .map_io         = cpuat91_map_io,
+       .init_irq       = cpuat91_init_irq,
+       .init_machine   = cpuat91_board_init,
+MACHINE_END
index d5266da553112651228679c4beb42944b89a2d42..f9b19993a7a95e488109f985d4a3e4e90a5f0c86 100644 (file)
@@ -287,7 +287,11 @@ static void __init ek_add_device_ts(void) {}
  */
 static struct at73c213_board_info at73c213_data = {
        .ssc_id         = 1,
+#if defined(CONFIG_MACH_AT91SAM9261EK)
        .shortname      = "AT91SAM9261-EK external DAC",
+#else
+       .shortname      = "AT91SAM9G10-EK external DAC",
+#endif
 };
 
 #if defined(CONFIG_SND_AT73C213) || defined(CONFIG_SND_AT73C213_MODULE)
@@ -414,6 +418,9 @@ static struct atmel_lcdfb_info __initdata ek_lcdc_data = {
        .default_monspecs               = &at91fb_default_stn_monspecs,
        .atmel_lcdfb_power_control      = at91_lcdc_stn_power_control,
        .guard_time                     = 1,
+#if defined(CONFIG_MACH_AT91SAM9G10EK)
+       .lcd_wiring_mode                = ATMEL_LCDC_WIRING_RGB,
+#endif
 };
 
 #else
@@ -467,6 +474,9 @@ static struct atmel_lcdfb_info __initdata ek_lcdc_data = {
        .default_monspecs               = &at91fb_default_tft_monspecs,
        .atmel_lcdfb_power_control      = at91_lcdc_tft_power_control,
        .guard_time                     = 1,
+#if defined(CONFIG_MACH_AT91SAM9G10EK)
+       .lcd_wiring_mode                = ATMEL_LCDC_WIRING_RGB,
+#endif
 };
 #endif
 
@@ -600,7 +610,11 @@ static void __init ek_board_init(void)
        at91_gpio_leds(ek_leds, ARRAY_SIZE(ek_leds));
 }
 
+#if defined(CONFIG_MACH_AT91SAM9261EK)
 MACHINE_START(AT91SAM9261EK, "Atmel AT91SAM9261-EK")
+#else
+MACHINE_START(AT91SAM9G10EK, "Atmel AT91SAM9G10-EK")
+#endif
        /* Maintainer: Atmel */
        .phys_io        = AT91_BASE_SYS,
        .io_pg_offst    = (AT91_VA_BASE_SYS >> 18) & 0xfffc,
index 57d52528f2247950b90c9b4010af813595eeedcc..1bf7bd4cbe13cbe622000bccdcfe99e91f7f4e4f 100644 (file)
@@ -364,9 +364,9 @@ static void __init ek_add_device_buttons(void) {}
 
 /*
  * AC97
+ * reset_pin is not connected: NRST
  */
-static struct atmel_ac97_data ek_ac97_data = {
-       .reset_pin      = AT91_PIN_PA13,
+static struct ac97c_platform_data ek_ac97_data = {
 };
 
 
index a55398ed1211d932266ac4ebace286ffe53490df..ca470d504ea09ecb5fdef59ba50625290ef088a3 100644 (file)
@@ -273,6 +273,7 @@ static void __init ek_add_device_buttons(void) {}
 static struct i2c_board_info __initdata ek_i2c_devices[] = {
        {
                I2C_BOARD_INFO("24c512", 0x50),
+               I2C_BOARD_INFO("wm8731", 0x1b),
        },
 };
 
diff --git a/arch/arm/mach-at91/board-sam9m10g45ek.c b/arch/arm/mach-at91/board-sam9m10g45ek.c
new file mode 100644 (file)
index 0000000..b8558ea
--- /dev/null
@@ -0,0 +1,389 @@
+/*
+ *  Board-specific setup code for the AT91SAM9M10G45 Evaluation Kit family
+ *
+ *  Covers: * AT91SAM9G45-EKES  board
+ *          * AT91SAM9M10G45-EK board
+ *
+ *  Copyright (C) 2009 Atmel Corporation.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ */
+
+#include <linux/types.h>
+#include <linux/init.h>
+#include <linux/mm.h>
+#include <linux/module.h>
+#include <linux/platform_device.h>
+#include <linux/spi/spi.h>
+#include <linux/fb.h>
+#include <linux/gpio_keys.h>
+#include <linux/input.h>
+#include <linux/leds.h>
+#include <linux/clk.h>
+
+#include <mach/hardware.h>
+#include <video/atmel_lcdc.h>
+
+#include <asm/setup.h>
+#include <asm/mach-types.h>
+#include <asm/irq.h>
+
+#include <asm/mach/arch.h>
+#include <asm/mach/map.h>
+#include <asm/mach/irq.h>
+
+#include <mach/hardware.h>
+#include <mach/board.h>
+#include <mach/gpio.h>
+#include <mach/at91sam9_smc.h>
+#include <mach/at91_shdwc.h>
+
+#include "sam9_smc.h"
+#include "generic.h"
+
+
+static void __init ek_map_io(void)
+{
+       /* Initialize processor: 12.000 MHz crystal */
+       at91sam9g45_initialize(12000000);
+
+       /* DGBU on ttyS0. (Rx & Tx only) */
+       at91_register_uart(0, 0, 0);
+
+       /* USART0 not connected on the -EK board */
+       /* USART1 on ttyS2. (Rx, Tx, RTS, CTS) */
+       at91_register_uart(AT91SAM9G45_ID_US1, 2, ATMEL_UART_CTS | ATMEL_UART_RTS);
+
+       /* set serial console to ttyS0 (ie, DBGU) */
+       at91_set_serial_console(0);
+}
+
+static void __init ek_init_irq(void)
+{
+       at91sam9g45_init_interrupts(NULL);
+}
+
+
+/*
+ * USB HS Host port (common to OHCI & EHCI)
+ */
+static struct at91_usbh_data __initdata ek_usbh_hs_data = {
+       .ports          = 2,
+       .vbus_pin       = {AT91_PIN_PD1, AT91_PIN_PD3},
+};
+
+
+/*
+ * USB HS Device port
+ */
+static struct usba_platform_data __initdata ek_usba_udc_data = {
+       .vbus_pin       = AT91_PIN_PB19,
+};
+
+
+/*
+ * SPI devices.
+ */
+static struct spi_board_info ek_spi_devices[] = {
+       {       /* DataFlash chip */
+               .modalias       = "mtd_dataflash",
+               .chip_select    = 0,
+               .max_speed_hz   = 15 * 1000 * 1000,
+               .bus_num        = 0,
+       },
+};
+
+
+/*
+ * MACB Ethernet device
+ */
+static struct at91_eth_data __initdata ek_macb_data = {
+       .phy_irq_pin    = AT91_PIN_PD5,
+       .is_rmii        = 1,
+};
+
+
+/*
+ * NAND flash
+ */
+static struct mtd_partition __initdata ek_nand_partition[] = {
+       {
+               .name   = "Partition 1",
+               .offset = 0,
+               .size   = SZ_64M,
+       },
+       {
+               .name   = "Partition 2",
+               .offset = MTDPART_OFS_NXTBLK,
+               .size   = MTDPART_SIZ_FULL,
+       },
+};
+
+static struct mtd_partition * __init nand_partitions(int size, int *num_partitions)
+{
+       *num_partitions = ARRAY_SIZE(ek_nand_partition);
+       return ek_nand_partition;
+}
+
+/* det_pin is not connected */
+static struct atmel_nand_data __initdata ek_nand_data = {
+       .ale            = 21,
+       .cle            = 22,
+       .rdy_pin        = AT91_PIN_PC8,
+       .enable_pin     = AT91_PIN_PC14,
+       .partition_info = nand_partitions,
+#if defined(CONFIG_MTD_NAND_AT91_BUSWIDTH_16)
+       .bus_width_16   = 1,
+#else
+       .bus_width_16   = 0,
+#endif
+};
+
+static struct sam9_smc_config __initdata ek_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,
+       .tdf_cycles             = 3,
+};
+
+static void __init ek_add_device_nand(void)
+{
+       /* setup bus-width (8 or 16) */
+       if (ek_nand_data.bus_width_16)
+               ek_nand_smc_config.mode |= AT91_SMC_DBW_16;
+       else
+               ek_nand_smc_config.mode |= AT91_SMC_DBW_8;
+
+       /* configure chip-select 3 (NAND) */
+       sam9_smc_configure(3, &ek_nand_smc_config);
+
+       at91_add_device_nand(&ek_nand_data);
+}
+
+
+/*
+ * LCD Controller
+ */
+#if defined(CONFIG_FB_ATMEL) || defined(CONFIG_FB_ATMEL_MODULE)
+static struct fb_videomode at91_tft_vga_modes[] = {
+       {
+               .name           = "LG",
+               .refresh        = 60,
+               .xres           = 480,          .yres           = 272,
+               .pixclock       = KHZ2PICOS(9000),
+
+               .left_margin    = 1,            .right_margin   = 1,
+               .upper_margin   = 40,           .lower_margin   = 1,
+               .hsync_len      = 45,           .vsync_len      = 1,
+
+               .sync           = 0,
+               .vmode          = FB_VMODE_NONINTERLACED,
+       },
+};
+
+static struct fb_monspecs at91fb_default_monspecs = {
+       .manufacturer   = "LG",
+       .monitor        = "LB043WQ1",
+
+       .modedb         = at91_tft_vga_modes,
+       .modedb_len     = ARRAY_SIZE(at91_tft_vga_modes),
+       .hfmin          = 15000,
+       .hfmax          = 17640,
+       .vfmin          = 57,
+       .vfmax          = 67,
+};
+
+#define AT91SAM9G45_DEFAULT_LCDCON2    (ATMEL_LCDC_MEMOR_LITTLE \
+                                       | ATMEL_LCDC_DISTYPE_TFT \
+                                       | ATMEL_LCDC_CLKMOD_ALWAYSACTIVE)
+
+/* Driver datas */
+static struct atmel_lcdfb_info __initdata ek_lcdc_data = {
+       .lcdcon_is_backlight            = true,
+       .default_bpp                    = 32,
+       .default_dmacon                 = ATMEL_LCDC_DMAEN,
+       .default_lcdcon2                = AT91SAM9G45_DEFAULT_LCDCON2,
+       .default_monspecs               = &at91fb_default_monspecs,
+       .guard_time                     = 9,
+       .lcd_wiring_mode                = ATMEL_LCDC_WIRING_RGB,
+};
+
+#else
+static struct atmel_lcdfb_info __initdata ek_lcdc_data;
+#endif
+
+
+/*
+ * GPIO Buttons
+ */
+#if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE)
+static struct gpio_keys_button ek_buttons[] = {
+       {       /* BP1, "leftclic" */
+               .code           = BTN_LEFT,
+               .gpio           = AT91_PIN_PB6,
+               .active_low     = 1,
+               .desc           = "left_click",
+               .wakeup         = 1,
+       },
+       {       /* BP2, "rightclic" */
+               .code           = BTN_RIGHT,
+               .gpio           = AT91_PIN_PB7,
+               .active_low     = 1,
+               .desc           = "right_click",
+               .wakeup         = 1,
+       },
+               /* BP3, "joystick" */
+       {
+               .code           = KEY_LEFT,
+               .gpio           = AT91_PIN_PB14,
+               .active_low     = 1,
+               .desc           = "Joystick Left",
+       },
+       {
+               .code           = KEY_RIGHT,
+               .gpio           = AT91_PIN_PB15,
+               .active_low     = 1,
+               .desc           = "Joystick Right",
+       },
+       {
+               .code           = KEY_UP,
+               .gpio           = AT91_PIN_PB16,
+               .active_low     = 1,
+               .desc           = "Joystick Up",
+       },
+       {
+               .code           = KEY_DOWN,
+               .gpio           = AT91_PIN_PB17,
+               .active_low     = 1,
+               .desc           = "Joystick Down",
+       },
+       {
+               .code           = KEY_ENTER,
+               .gpio           = AT91_PIN_PB18,
+               .active_low     = 1,
+               .desc           = "Joystick Press",
+       },
+};
+
+static struct gpio_keys_platform_data ek_button_data = {
+       .buttons        = ek_buttons,
+       .nbuttons       = ARRAY_SIZE(ek_buttons),
+};
+
+static struct platform_device ek_button_device = {
+       .name           = "gpio-keys",
+       .id             = -1,
+       .num_resources  = 0,
+       .dev            = {
+               .platform_data  = &ek_button_data,
+       }
+};
+
+static void __init ek_add_device_buttons(void)
+{
+       int i;
+
+       for (i = 0; i < ARRAY_SIZE(ek_buttons); i++) {
+               at91_set_GPIO_periph(ek_buttons[i].gpio, 1);
+               at91_set_deglitch(ek_buttons[i].gpio, 1);
+       }
+
+       platform_device_register(&ek_button_device);
+}
+#else
+static void __init ek_add_device_buttons(void) {}
+#endif
+
+
+/*
+ * LEDs ... these could all be PWM-driven, for variable brightness
+ */
+static struct gpio_led ek_leds[] = {
+       {       /* "top" led, red, powerled */
+               .name                   = "d8",
+               .gpio                   = AT91_PIN_PD30,
+               .default_trigger        = "heartbeat",
+       },
+       {       /* "left" led, green, userled2, pwm3 */
+               .name                   = "d6",
+               .gpio                   = AT91_PIN_PD0,
+               .active_low             = 1,
+               .default_trigger        = "nand-disk",
+       },
+#if !(defined(CONFIG_LEDS_ATMEL_PWM) || defined(CONFIG_LEDS_ATMEL_PWM_MODULE))
+       {       /* "right" led, green, userled1, pwm1 */
+               .name                   = "d7",
+               .gpio                   = AT91_PIN_PD31,
+               .active_low             = 1,
+               .default_trigger        = "mmc0",
+       },
+#endif
+};
+
+
+/*
+ * PWM Leds
+ */
+static struct gpio_led ek_pwm_led[] = {
+#if defined(CONFIG_LEDS_ATMEL_PWM) || defined(CONFIG_LEDS_ATMEL_PWM_MODULE)
+       {       /* "right" led, green, userled1, pwm1 */
+               .name                   = "d7",
+               .gpio                   = 1,    /* is PWM channel number */
+               .active_low             = 1,
+               .default_trigger        = "none",
+       },
+#endif
+};
+
+
+
+static void __init ek_board_init(void)
+{
+       /* Serial */
+       at91_add_device_serial();
+       /* USB HS Host */
+       at91_add_device_usbh_ohci(&ek_usbh_hs_data);
+       /* USB HS Device */
+       at91_add_device_usba(&ek_usba_udc_data);
+       /* SPI */
+       at91_add_device_spi(ek_spi_devices, ARRAY_SIZE(ek_spi_devices));
+       /* Ethernet */
+       at91_add_device_eth(&ek_macb_data);
+       /* NAND */
+       ek_add_device_nand();
+       /* I2C */
+       at91_add_device_i2c(0, NULL, 0);
+       /* LCD Controller */
+       at91_add_device_lcdc(&ek_lcdc_data);
+       /* Push Buttons */
+       ek_add_device_buttons();
+       /* LEDs */
+       at91_gpio_leds(ek_leds, ARRAY_SIZE(ek_leds));
+       at91_pwm_leds(ek_pwm_led, ARRAY_SIZE(ek_pwm_led));
+}
+
+MACHINE_START(AT91SAM9G45EKES, "Atmel AT91SAM9G45-EKES")
+       /* Maintainer: Atmel */
+       .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         = ek_map_io,
+       .init_irq       = ek_init_irq,
+       .init_machine   = ek_board_init,
+MACHINE_END
index f6b5672cabd6377e6fdb8cc9b9531c565c72042a..9d07679efce701d3528aef0abc15a184a827fdbc 100644 (file)
@@ -15,6 +15,8 @@
 #include <linux/spi/spi.h>
 #include <linux/fb.h>
 #include <linux/clk.h>
+#include <linux/input.h>
+#include <linux/gpio_keys.h>
 
 #include <video/atmel_lcdc.h>
 
@@ -208,6 +210,79 @@ static struct atmel_lcdfb_info __initdata ek_lcdc_data;
 #endif
 
 
+/*
+ * LEDs
+ */
+static struct gpio_led ek_leds[] = {
+       {       /* "bottom" led, green, userled1 to be defined */
+               .name                   = "ds1",
+               .gpio                   = AT91_PIN_PD15,
+               .active_low             = 1,
+               .default_trigger        = "none",
+       },
+       {       /* "bottom" led, green, userled2 to be defined */
+               .name                   = "ds2",
+               .gpio                   = AT91_PIN_PD16,
+               .active_low             = 1,
+               .default_trigger        = "none",
+       },
+       {       /* "power" led, yellow */
+               .name                   = "ds3",
+               .gpio                   = AT91_PIN_PD14,
+               .default_trigger        = "heartbeat",
+       }
+};
+
+
+/*
+ * GPIO Buttons
+ */
+#if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE)
+static struct gpio_keys_button ek_buttons[] = {
+       {
+               .gpio           = AT91_PIN_PB0,
+               .code           = BTN_2,
+               .desc           = "Right Click",
+               .active_low     = 1,
+               .wakeup         = 1,
+       },
+       {
+               .gpio           = AT91_PIN_PB1,
+               .code           = BTN_1,
+               .desc           = "Left Click",
+               .active_low     = 1,
+               .wakeup         = 1,
+       }
+};
+
+static struct gpio_keys_platform_data ek_button_data = {
+       .buttons        = ek_buttons,
+       .nbuttons       = ARRAY_SIZE(ek_buttons),
+};
+
+static struct platform_device ek_button_device = {
+       .name           = "gpio-keys",
+       .id             = -1,
+       .num_resources  = 0,
+       .dev            = {
+               .platform_data  = &ek_button_data,
+       }
+};
+
+static void __init ek_add_device_buttons(void)
+{
+       at91_set_gpio_input(AT91_PIN_PB1, 1);   /* btn1 */
+       at91_set_deglitch(AT91_PIN_PB1, 1);
+       at91_set_gpio_input(AT91_PIN_PB0, 1);   /* btn2 */
+       at91_set_deglitch(AT91_PIN_PB0, 1);
+
+       platform_device_register(&ek_button_device);
+}
+#else
+static void __init ek_add_device_buttons(void) {}
+#endif
+
+
 static void __init ek_board_init(void)
 {
        /* Serial */
@@ -226,6 +301,10 @@ static void __init ek_board_init(void)
        at91_add_device_lcdc(&ek_lcdc_data);
        /* Touch Screen Controller */
        at91_add_device_tsadcc();
+       /* LEDs */
+       at91_gpio_leds(ek_leds, ARRAY_SIZE(ek_leds));
+       /* Push Buttons */
+       ek_add_device_buttons();
 }
 
 MACHINE_START(AT91SAM9RLEK, "Atmel AT91SAM9RL-EK")
index bac578fe0d3d38ca0680145209888522282dfb93..c042dcf4725fc8ec3166cb9ddc7436109f1fca6c 100644 (file)
  * Chips have some kind of clocks : group them by functionality
  */
 #define cpu_has_utmi()         (  cpu_is_at91cap9() \
-                               || cpu_is_at91sam9rl())
+                               || cpu_is_at91sam9rl() \
+                               || cpu_is_at91sam9g45())
 
-#define cpu_has_800M_plla()    (cpu_is_at91sam9g20())
+#define cpu_has_800M_plla()    (  cpu_is_at91sam9g20() \
+                               || cpu_is_at91sam9g45())
 
-#define cpu_has_pllb()         (!cpu_is_at91sam9rl())
+#define cpu_has_300M_plla()    (cpu_is_at91sam9g10())
 
-#define cpu_has_upll()         (0)
+#define cpu_has_pllb()         (!(cpu_is_at91sam9rl() \
+                               || cpu_is_at91sam9g45()))
+
+#define cpu_has_upll()         (cpu_is_at91sam9g45())
 
 /* USB host HS & FS */
 #define cpu_has_uhp()          (!cpu_is_at91sam9rl())
 
 /* USB device FS only */
-#define cpu_has_udpfs()                (!cpu_is_at91sam9rl())
-
+#define cpu_has_udpfs()                (!(cpu_is_at91sam9rl() \
+                               || cpu_is_at91sam9g45()))
 
 static LIST_HEAD(clocks);
 static DEFINE_SPINLOCK(clk_lock);
@@ -133,6 +138,13 @@ static void pmc_uckr_mode(struct clk *clk, int is_on)
 {
        unsigned int uckr = at91_sys_read(AT91_CKGR_UCKR);
 
+       if (cpu_is_at91sam9g45()) {
+               if (is_on)
+                       uckr |= AT91_PMC_BIASEN;
+               else
+                       uckr &= ~AT91_PMC_BIASEN;
+       }
+
        if (is_on) {
                is_on = AT91_PMC_LOCKU;
                at91_sys_write(AT91_CKGR_UCKR, uckr | clk->pmc_mask);
@@ -310,6 +322,7 @@ long clk_round_rate(struct clk *clk, unsigned long rate)
        unsigned long   flags;
        unsigned        prescale;
        unsigned long   actual;
+       unsigned long   prev = ULONG_MAX;
 
        if (!clk_is_programmable(clk))
                return -EINVAL;
@@ -317,8 +330,16 @@ long clk_round_rate(struct clk *clk, unsigned long rate)
 
        actual = clk->parent->rate_hz;
        for (prescale = 0; prescale < 7; prescale++) {
-               if (actual && actual <= rate)
+               if (actual > rate)
+                       prev = actual;
+
+               if (actual && actual <= rate) {
+                       if ((prev - rate) < (rate - actual)) {
+                               actual = prev;
+                               prescale--;
+                       }
                        break;
+               }
                actual >>= 1;
        }
 
@@ -373,6 +394,10 @@ int clk_set_parent(struct clk *clk, struct clk *parent)
                return -EBUSY;
        if (!clk_is_primary(parent) || !clk_is_programmable(clk))
                return -EINVAL;
+
+       if (cpu_is_at91sam9rl() && parent->id == AT91_PMC_CSS_PLLB)
+               return -EINVAL;
+
        spin_lock_irqsave(&clk_lock, flags);
 
        clk->rate_hz = parent->rate_hz;
@@ -601,7 +626,9 @@ static void __init at91_pllb_usbfs_clock_init(unsigned long main_clock)
                uhpck.pmc_mask = AT91RM9200_PMC_UHP;
                udpck.pmc_mask = AT91RM9200_PMC_UDP;
                at91_sys_write(AT91_PMC_SCER, AT91RM9200_PMC_MCKUDP);
-       } else if (cpu_is_at91sam9260() || cpu_is_at91sam9261() || cpu_is_at91sam9263() || cpu_is_at91sam9g20()) {
+       } else if (cpu_is_at91sam9260() || cpu_is_at91sam9261() ||
+                  cpu_is_at91sam9263() || cpu_is_at91sam9g20() ||
+                  cpu_is_at91sam9g10()) {
                uhpck.pmc_mask = AT91SAM926x_PMC_UHP;
                udpck.pmc_mask = AT91SAM926x_PMC_UDP;
        } else if (cpu_is_at91cap9()) {
@@ -637,6 +664,7 @@ int __init at91_clock_init(unsigned long main_clock)
 {
        unsigned tmp, freq, mckr;
        int i;
+       int pll_overclock = false;
 
        /*
         * When the bootloader initialized the main oscillator correctly,
@@ -654,12 +682,25 @@ int __init at91_clock_init(unsigned long main_clock)
 
        /* report if PLLA is more than mildly overclocked */
        plla.rate_hz = at91_pll_rate(&plla, main_clock, at91_sys_read(AT91_CKGR_PLLAR));
-       if ((!cpu_has_800M_plla() && plla.rate_hz > 209000000)
-          || (cpu_has_800M_plla() && plla.rate_hz > 800000000))
+       if (cpu_has_300M_plla()) {
+               if (plla.rate_hz > 300000000)
+                       pll_overclock = true;
+       } else if (cpu_has_800M_plla()) {
+               if (plla.rate_hz > 800000000)
+                       pll_overclock = true;
+       } else {
+               if (plla.rate_hz > 209000000)
+                       pll_overclock = true;
+       }
+       if (pll_overclock)
                pr_info("Clocks: PLLA overclocked, %ld MHz\n", plla.rate_hz / 1000000);
 
+       if (cpu_is_at91sam9g45()) {
+               mckr = at91_sys_read(AT91_PMC_MCKR);
+               plla.rate_hz /= (1 << ((mckr & AT91_PMC_PLLADIV2) >> 12));      /* plla divisor by 2 */
+       }
 
-       if (cpu_has_upll() && !cpu_has_pllb()) {
+       if (!cpu_has_pllb() && cpu_has_upll()) {
                /* setup UTMI clock as the fourth primary clock
                 * (instead of pllb) */
                utmi_clk.type |= CLK_TYPE_PRIMARY;
@@ -701,6 +742,9 @@ int __init at91_clock_init(unsigned long main_clock)
                        freq / ((mckr & AT91_PMC_MDIV) >> 7) : freq;    /* mdiv ; (x >> 7) = ((x >> 8) * 2) */
                if (mckr & AT91_PMC_PDIV)
                        freq /= 2;              /* processor clock division */
+       } else if (cpu_is_at91sam9g45()) {
+               mck.rate_hz = (mckr & AT91_PMC_MDIV) == AT91SAM9_PMC_MDIV_3 ?
+                       freq / 3 : freq / (1 << ((mckr & AT91_PMC_MDIV) >> 8)); /* mdiv */
        } else {
                mck.rate_hz = freq / (1 << ((mckr & AT91_PMC_MDIV) >> 8));      /* mdiv */
        }
index b5daf7f5e011a797cc6b88f75ae9b9170a451174..88e413b38480233f40d61bf5b8edbb1a8d46d432 100644 (file)
@@ -14,6 +14,7 @@ extern void __init at91sam9260_initialize(unsigned long main_clock);
 extern void __init at91sam9261_initialize(unsigned long main_clock);
 extern void __init at91sam9263_initialize(unsigned long main_clock);
 extern void __init at91sam9rl_initialize(unsigned long main_clock);
+extern void __init at91sam9g45_initialize(unsigned long main_clock);
 extern void __init at91x40_initialize(unsigned long main_clock);
 extern void __init at91cap9_initialize(unsigned long main_clock);
 
@@ -23,6 +24,7 @@ extern void __init at91sam9260_init_interrupts(unsigned int priority[]);
 extern void __init at91sam9261_init_interrupts(unsigned int priority[]);
 extern void __init at91sam9263_init_interrupts(unsigned int priority[]);
 extern void __init at91sam9rl_init_interrupts(unsigned int priority[]);
+extern void __init at91sam9g45_init_interrupts(unsigned int priority[]);
 extern void __init at91x40_init_interrupts(unsigned int priority[]);
 extern void __init at91cap9_init_interrupts(unsigned int priority[]);
 extern void __init at91_aic_init(unsigned int priority[]);
index f2236f0e101f6ba522529e1708c219cf587fa8b3..ae4772e744ac4ec5635e97bdc30d0be48ac861d7 100644 (file)
@@ -44,13 +44,11 @@ static int at91_gpiolib_direction_output(struct gpio_chip *chip,
                                         unsigned offset, int val);
 static int at91_gpiolib_direction_input(struct gpio_chip *chip,
                                        unsigned offset);
-static int at91_gpiolib_request(struct gpio_chip *chip, unsigned offset);
 
 #define AT91_GPIO_CHIP(name, base_gpio, nr_gpio)                       \
        {                                                               \
                .chip = {                                               \
                        .label            = name,                       \
-                       .request          = at91_gpiolib_request,       \
                        .direction_input  = at91_gpiolib_direction_input, \
                        .direction_output = at91_gpiolib_direction_output, \
                        .get              = at91_gpiolib_get,           \
@@ -588,19 +586,6 @@ static void at91_gpiolib_set(struct gpio_chip *chip, unsigned offset, int val)
        __raw_writel(mask, pio + (val ? PIO_SODR : PIO_CODR));
 }
 
-static int at91_gpiolib_request(struct gpio_chip *chip, unsigned offset)
-{
-       unsigned pin = chip->base + offset;
-       void __iomem *pio = pin_to_controller(pin);
-       unsigned mask = pin_to_mask(pin);
-
-       /* Cannot request GPIOs that are in alternate function mode */
-       if (!(__raw_readl(pio + PIO_PSR) & mask))
-               return -EPERM;
-
-       return 0;
-}
-
 static void at91_gpiolib_dbg_show(struct seq_file *s, struct gpio_chip *chip)
 {
        int i;
index 3a348ca20773c37fae486c24b27bbf23cb2b2160..87de8be17484be6966c7ee02bcf4a94620932e63 100644 (file)
@@ -95,6 +95,9 @@
 #define AT91SAM9261_SRAM_BASE  0x00300000      /* Internal SRAM base address */
 #define AT91SAM9261_SRAM_SIZE  0x00028000      /* Internal SRAM size (160Kb) */
 
+#define AT91SAM9G10_SRAM_BASE  AT91SAM9261_SRAM_BASE   /* Internal SRAM base address */
+#define AT91SAM9G10_SRAM_SIZE  0x00004000      /* Internal SRAM size (16Kb) */
+
 #define AT91SAM9261_ROM_BASE   0x00400000      /* Internal ROM base address */
 #define AT91SAM9261_ROM_SIZE   SZ_32K          /* Internal ROM size (32Kb) */
 
diff --git a/arch/arm/mach-at91/include/mach/at91sam9g45.h b/arch/arm/mach-at91/include/mach/at91sam9g45.h
new file mode 100644 (file)
index 0000000..a526869
--- /dev/null
@@ -0,0 +1,155 @@
+/*
+ * Chip-specific header file for the AT91SAM9G45 family
+ *
+ *  Copyright (C) 2008-2009 Atmel Corporation.
+ *
+ * Common definitions.
+ * Based on AT91SAM9G45 preliminary datasheet.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ */
+
+#ifndef AT91SAM9G45_H
+#define AT91SAM9G45_H
+
+/*
+ * Peripheral identifiers/interrupts.
+ */
+#define AT91_ID_FIQ            0       /* Advanced Interrupt Controller (FIQ) */
+#define AT91_ID_SYS            1       /* System Controller Interrupt */
+#define AT91SAM9G45_ID_PIOA    2       /* Parallel I/O Controller A */
+#define AT91SAM9G45_ID_PIOB    3       /* Parallel I/O Controller B */
+#define AT91SAM9G45_ID_PIOC    4       /* Parallel I/O Controller C */
+#define AT91SAM9G45_ID_PIODE   5       /* Parallel I/O Controller D and E */
+#define AT91SAM9G45_ID_TRNG    6       /* True Random Number Generator */
+#define AT91SAM9G45_ID_US0     7       /* USART 0 */
+#define AT91SAM9G45_ID_US1     8       /* USART 1 */
+#define AT91SAM9G45_ID_US2     9       /* USART 2 */
+#define AT91SAM9G45_ID_US3     10      /* USART 3 */
+#define AT91SAM9G45_ID_MCI0    11      /* High Speed Multimedia Card Interface 0 */
+#define AT91SAM9G45_ID_TWI0    12      /* Two-Wire Interface 0 */
+#define AT91SAM9G45_ID_TWI1    13      /* Two-Wire Interface 1 */
+#define AT91SAM9G45_ID_SPI0    14      /* Serial Peripheral Interface 0 */
+#define AT91SAM9G45_ID_SPI1    15      /* Serial Peripheral Interface 1 */
+#define AT91SAM9G45_ID_SSC0    16      /* Synchronous Serial Controller 0 */
+#define AT91SAM9G45_ID_SSC1    17      /* Synchronous Serial Controller 1 */
+#define AT91SAM9G45_ID_TCB     18      /* Timer Counter 0, 1, 2, 3, 4 and 5 */
+#define AT91SAM9G45_ID_PWMC    19      /* Pulse Width Modulation Controller */
+#define AT91SAM9G45_ID_TSC     20      /* Touch Screen ADC Controller */
+#define AT91SAM9G45_ID_DMA     21      /* DMA Controller */
+#define AT91SAM9G45_ID_UHPHS   22      /* USB Host High Speed */
+#define AT91SAM9G45_ID_LCDC    23      /* LCD Controller */
+#define AT91SAM9G45_ID_AC97C   24      /* AC97 Controller */
+#define AT91SAM9G45_ID_EMAC    25      /* Ethernet MAC */
+#define AT91SAM9G45_ID_ISI     26      /* Image Sensor Interface */
+#define AT91SAM9G45_ID_UDPHS   27      /* USB Device High Speed */
+#define AT91SAM9G45_ID_AESTDESSHA 28   /* AES + T-DES + SHA */
+#define AT91SAM9G45_ID_MCI1    29      /* High Speed Multimedia Card Interface 1 */
+#define AT91SAM9G45_ID_VDEC    30      /* Video Decoder */
+#define AT91SAM9G45_ID_IRQ0    31      /* Advanced Interrupt Controller */
+
+/*
+ * User Peripheral physical base addresses.
+ */
+#define AT91SAM9G45_BASE_UDPHS         0xfff78000
+#define AT91SAM9G45_BASE_TCB0          0xfff7c000
+#define AT91SAM9G45_BASE_TC0           0xfff7c000
+#define AT91SAM9G45_BASE_TC1           0xfff7c040
+#define AT91SAM9G45_BASE_TC2           0xfff7c080
+#define AT91SAM9G45_BASE_MCI0          0xfff80000
+#define AT91SAM9G45_BASE_TWI0          0xfff84000
+#define AT91SAM9G45_BASE_TWI1          0xfff88000
+#define AT91SAM9G45_BASE_US0           0xfff8c000
+#define AT91SAM9G45_BASE_US1           0xfff90000
+#define AT91SAM9G45_BASE_US2           0xfff94000
+#define AT91SAM9G45_BASE_US3           0xfff98000
+#define AT91SAM9G45_BASE_SSC0          0xfff9c000
+#define AT91SAM9G45_BASE_SSC1          0xfffa0000
+#define AT91SAM9G45_BASE_SPI0          0xfffa4000
+#define AT91SAM9G45_BASE_SPI1          0xfffa8000
+#define AT91SAM9G45_BASE_AC97C         0xfffac000
+#define AT91SAM9G45_BASE_TSC           0xfffb0000
+#define AT91SAM9G45_BASE_ISI           0xfffb4000
+#define AT91SAM9G45_BASE_PWMC          0xfffb8000
+#define AT91SAM9G45_BASE_EMAC          0xfffbc000
+#define AT91SAM9G45_BASE_AES           0xfffc0000
+#define AT91SAM9G45_BASE_TDES          0xfffc4000
+#define AT91SAM9G45_BASE_SHA           0xfffc8000
+#define AT91SAM9G45_BASE_TRNG          0xfffcc000
+#define AT91SAM9G45_BASE_MCI1          0xfffd0000
+#define AT91SAM9G45_BASE_TCB1          0xfffd4000
+#define AT91SAM9G45_BASE_TC3           0xfffd4000
+#define AT91SAM9G45_BASE_TC4           0xfffd4040
+#define AT91SAM9G45_BASE_TC5           0xfffd4080
+#define AT91_BASE_SYS                  0xffffe200
+
+/*
+ * System Peripherals (offset from AT91_BASE_SYS)
+ */
+#define AT91_ECC       (0xffffe200 - AT91_BASE_SYS)
+#define AT91_DDRSDRC1  (0xffffe400 - AT91_BASE_SYS)
+#define AT91_DDRSDRC0  (0xffffe600 - AT91_BASE_SYS)
+#define AT91_SMC       (0xffffe800 - AT91_BASE_SYS)
+#define AT91_MATRIX    (0xffffea00 - AT91_BASE_SYS)
+#define AT91_DMA       (0xffffec00 - AT91_BASE_SYS)
+#define AT91_DBGU      (0xffffee00 - AT91_BASE_SYS)
+#define AT91_AIC       (0xfffff000 - AT91_BASE_SYS)
+#define AT91_PIOA      (0xfffff200 - AT91_BASE_SYS)
+#define AT91_PIOB      (0xfffff400 - AT91_BASE_SYS)
+#define AT91_PIOC      (0xfffff600 - AT91_BASE_SYS)
+#define AT91_PIOD      (0xfffff800 - AT91_BASE_SYS)
+#define AT91_PIOE      (0xfffffa00 - AT91_BASE_SYS)
+#define AT91_PMC       (0xfffffc00 - AT91_BASE_SYS)
+#define AT91_RSTC      (0xfffffd00 - AT91_BASE_SYS)
+#define AT91_SHDWC     (0xfffffd10 - AT91_BASE_SYS)
+#define AT91_RTT       (0xfffffd20 - AT91_BASE_SYS)
+#define AT91_PIT       (0xfffffd30 - AT91_BASE_SYS)
+#define AT91_WDT       (0xfffffd40 - AT91_BASE_SYS)
+#define AT91_GPBR      (0xfffffd60 - AT91_BASE_SYS)
+#define AT91_RTC       (0xfffffdb0 - AT91_BASE_SYS)
+
+#define AT91_USART0    AT91SAM9G45_BASE_US0
+#define AT91_USART1    AT91SAM9G45_BASE_US1
+#define AT91_USART2    AT91SAM9G45_BASE_US2
+#define AT91_USART3    AT91SAM9G45_BASE_US3
+
+/*
+ * Internal Memory.
+ */
+#define AT91SAM9G45_SRAM_BASE  0x00300000      /* Internal SRAM base address */
+#define AT91SAM9G45_SRAM_SIZE  SZ_64K          /* Internal SRAM size (64Kb) */
+
+#define AT91SAM9G45_ROM_BASE   0x00400000      /* Internal ROM base address */
+#define AT91SAM9G45_ROM_SIZE   SZ_64K          /* Internal ROM size (64Kb) */
+
+#define AT91SAM9G45_LCDC_BASE  0x00500000      /* LCD Controller */
+#define AT91SAM9G45_UDPHS_FIFO 0x00600000      /* USB Device HS controller */
+#define AT91SAM9G45_OHCI_BASE  0x00700000      /* USB Host controller (OHCI) */
+#define AT91SAM9G45_EHCI_BASE  0x00800000      /* USB Host controller (EHCI) */
+#define AT91SAM9G45_VDEC_BASE  0x00900000      /* Video Decoder Controller */
+
+#define CONFIG_DRAM_BASE       AT91_CHIPSELECT_6
+
+#define CONSISTENT_DMA_SIZE    SZ_4M
+
+/*
+ * DMA peripheral identifiers
+ * for hardware handshaking interface
+ */
+#define AT_DMA_ID_MCI0          0
+#define AT_DMA_ID_SPI0_TX       1
+#define AT_DMA_ID_SPI0_RX       2
+#define AT_DMA_ID_SPI1_TX       3
+#define AT_DMA_ID_SPI1_RX       4
+#define AT_DMA_ID_SSC0_TX       5
+#define AT_DMA_ID_SSC0_RX       6
+#define AT_DMA_ID_SSC1_TX       7
+#define AT_DMA_ID_SSC1_RX       8
+#define AT_DMA_ID_AC97_TX       9
+#define AT_DMA_ID_AC97_RX      10
+#define AT_DMA_ID_MCI1         13
+
+#endif
diff --git a/arch/arm/mach-at91/include/mach/at91sam9g45_matrix.h b/arch/arm/mach-at91/include/mach/at91sam9g45_matrix.h
new file mode 100644 (file)
index 0000000..c972d60
--- /dev/null
@@ -0,0 +1,153 @@
+/*
+ * Matrix-centric header file for the AT91SAM9G45 family
+ *
+ *  Copyright (C) 2008-2009 Atmel Corporation.
+ *
+ * Memory Controllers (MATRIX, EBI) - System peripherals registers.
+ * Based on AT91SAM9G45 preliminary datasheet.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ */
+
+#ifndef AT91SAM9G45_MATRIX_H
+#define AT91SAM9G45_MATRIX_H
+
+#define AT91_MATRIX_MCFG0      (AT91_MATRIX + 0x00)    /* Master Configuration Register 0 */
+#define AT91_MATRIX_MCFG1      (AT91_MATRIX + 0x04)    /* Master Configuration Register 1 */
+#define AT91_MATRIX_MCFG2      (AT91_MATRIX + 0x08)    /* Master Configuration Register 2 */
+#define AT91_MATRIX_MCFG3      (AT91_MATRIX + 0x0C)    /* Master Configuration Register 3 */
+#define AT91_MATRIX_MCFG4      (AT91_MATRIX + 0x10)    /* Master Configuration Register 4 */
+#define AT91_MATRIX_MCFG5      (AT91_MATRIX + 0x14)    /* Master Configuration Register 5 */
+#define AT91_MATRIX_MCFG6      (AT91_MATRIX + 0x18)    /* Master Configuration Register 6 */
+#define AT91_MATRIX_MCFG7      (AT91_MATRIX + 0x1C)    /* Master Configuration Register 7 */
+#define AT91_MATRIX_MCFG8      (AT91_MATRIX + 0x20)    /* Master Configuration Register 8 */
+#define AT91_MATRIX_MCFG9      (AT91_MATRIX + 0x24)    /* Master Configuration Register 9 */
+#define AT91_MATRIX_MCFG10     (AT91_MATRIX + 0x28)    /* Master Configuration Register 10 */
+#define AT91_MATRIX_MCFG11     (AT91_MATRIX + 0x2C)    /* Master Configuration Register 11 */
+#define                AT91_MATRIX_ULBT        (7 << 0)        /* Undefined Length Burst Type */
+#define                        AT91_MATRIX_ULBT_INFINITE       (0 << 0)
+#define                        AT91_MATRIX_ULBT_SINGLE         (1 << 0)
+#define                        AT91_MATRIX_ULBT_FOUR           (2 << 0)
+#define                        AT91_MATRIX_ULBT_EIGHT          (3 << 0)
+#define                        AT91_MATRIX_ULBT_SIXTEEN        (4 << 0)
+#define                        AT91_MATRIX_ULBT_THIRTYTWO      (5 << 0)
+#define                        AT91_MATRIX_ULBT_SIXTYFOUR      (6 << 0)
+#define                        AT91_MATRIX_ULBT_128            (7 << 0)
+
+#define AT91_MATRIX_SCFG0      (AT91_MATRIX + 0x40)    /* Slave Configuration Register 0 */
+#define AT91_MATRIX_SCFG1      (AT91_MATRIX + 0x44)    /* Slave Configuration Register 1 */
+#define AT91_MATRIX_SCFG2      (AT91_MATRIX + 0x48)    /* Slave Configuration Register 2 */
+#define AT91_MATRIX_SCFG3      (AT91_MATRIX + 0x4C)    /* Slave Configuration Register 3 */
+#define AT91_MATRIX_SCFG4      (AT91_MATRIX + 0x50)    /* Slave Configuration Register 4 */
+#define AT91_MATRIX_SCFG5      (AT91_MATRIX + 0x54)    /* Slave Configuration Register 5 */
+#define AT91_MATRIX_SCFG6      (AT91_MATRIX + 0x58)    /* Slave Configuration Register 6 */
+#define AT91_MATRIX_SCFG7      (AT91_MATRIX + 0x5C)    /* Slave Configuration Register 7 */
+#define                AT91_MATRIX_SLOT_CYCLE          (0x1ff << 0)    /* Maximum Number of Allowed Cycles for a Burst */
+#define                AT91_MATRIX_DEFMSTR_TYPE        (3    << 16)    /* Default Master Type */
+#define                        AT91_MATRIX_DEFMSTR_TYPE_NONE   (0 << 16)
+#define                        AT91_MATRIX_DEFMSTR_TYPE_LAST   (1 << 16)
+#define                        AT91_MATRIX_DEFMSTR_TYPE_FIXED  (2 << 16)
+#define                AT91_MATRIX_FIXED_DEFMSTR       (0xf  << 18)    /* Fixed Index of Default Master */
+
+#define AT91_MATRIX_PRAS0      (AT91_MATRIX + 0x80)    /* Priority Register A for Slave 0 */
+#define AT91_MATRIX_PRBS0      (AT91_MATRIX + 0x84)    /* Priority Register B for Slave 0 */
+#define AT91_MATRIX_PRAS1      (AT91_MATRIX + 0x88)    /* Priority Register A for Slave 1 */
+#define AT91_MATRIX_PRBS1      (AT91_MATRIX + 0x8C)    /* Priority Register B for Slave 1 */
+#define AT91_MATRIX_PRAS2      (AT91_MATRIX + 0x90)    /* Priority Register A for Slave 2 */
+#define AT91_MATRIX_PRBS2      (AT91_MATRIX + 0x94)    /* Priority Register B for Slave 2 */
+#define AT91_MATRIX_PRAS3      (AT91_MATRIX + 0x98)    /* Priority Register A for Slave 3 */
+#define AT91_MATRIX_PRBS3      (AT91_MATRIX + 0x9C)    /* Priority Register B for Slave 3 */
+#define AT91_MATRIX_PRAS4      (AT91_MATRIX + 0xA0)    /* Priority Register A for Slave 4 */
+#define AT91_MATRIX_PRBS4      (AT91_MATRIX + 0xA4)    /* Priority Register B for Slave 4 */
+#define AT91_MATRIX_PRAS5      (AT91_MATRIX + 0xA8)    /* Priority Register A for Slave 5 */
+#define AT91_MATRIX_PRBS5      (AT91_MATRIX + 0xAC)    /* Priority Register B for Slave 5 */
+#define AT91_MATRIX_PRAS6      (AT91_MATRIX + 0xB0)    /* Priority Register A for Slave 6 */
+#define AT91_MATRIX_PRBS6      (AT91_MATRIX + 0xB4)    /* Priority Register B for Slave 6 */
+#define AT91_MATRIX_PRAS7      (AT91_MATRIX + 0xB8)    /* Priority Register A for Slave 7 */
+#define AT91_MATRIX_PRBS7      (AT91_MATRIX + 0xBC)    /* Priority Register B for Slave 7 */
+#define                AT91_MATRIX_M0PR                (3 << 0)        /* Master 0 Priority */
+#define                AT91_MATRIX_M1PR                (3 << 4)        /* Master 1 Priority */
+#define                AT91_MATRIX_M2PR                (3 << 8)        /* Master 2 Priority */
+#define                AT91_MATRIX_M3PR                (3 << 12)       /* Master 3 Priority */
+#define                AT91_MATRIX_M4PR                (3 << 16)       /* Master 4 Priority */
+#define                AT91_MATRIX_M5PR                (3 << 20)       /* Master 5 Priority */
+#define                AT91_MATRIX_M6PR                (3 << 24)       /* Master 6 Priority */
+#define                AT91_MATRIX_M7PR                (3 << 28)       /* Master 7 Priority */
+#define                AT91_MATRIX_M8PR                (3 << 0)        /* Master 8 Priority (in Register B) */
+#define                AT91_MATRIX_M9PR                (3 << 4)        /* Master 9 Priority (in Register B) */
+#define                AT91_MATRIX_M10PR               (3 << 8)        /* Master 10 Priority (in Register B) */
+#define                AT91_MATRIX_M11PR               (3 << 12)       /* Master 11 Priority (in Register B) */
+
+#define AT91_MATRIX_MRCR       (AT91_MATRIX + 0x100)   /* Master Remap Control Register */
+#define                AT91_MATRIX_RCB0                (1 << 0)        /* Remap Command for AHB Master 0 (ARM926EJ-S Instruction Master) */
+#define                AT91_MATRIX_RCB1                (1 << 1)        /* Remap Command for AHB Master 1 (ARM926EJ-S Data Master) */
+#define                AT91_MATRIX_RCB2                (1 << 2)
+#define                AT91_MATRIX_RCB3                (1 << 3)
+#define                AT91_MATRIX_RCB4                (1 << 4)
+#define                AT91_MATRIX_RCB5                (1 << 5)
+#define                AT91_MATRIX_RCB6                (1 << 6)
+#define                AT91_MATRIX_RCB7                (1 << 7)
+#define                AT91_MATRIX_RCB8                (1 << 8)
+#define                AT91_MATRIX_RCB9                (1 << 9)
+#define                AT91_MATRIX_RCB10               (1 << 10)
+#define                AT91_MATRIX_RCB11               (1 << 11)
+
+#define AT91_MATRIX_TCMR       (AT91_MATRIX + 0x110)   /* TCM Configuration Register */
+#define                AT91_MATRIX_ITCM_SIZE           (0xf << 0)      /* Size of ITCM enabled memory block */
+#define                        AT91_MATRIX_ITCM_0              (0 << 0)
+#define                        AT91_MATRIX_ITCM_32             (6 << 0)
+#define                AT91_MATRIX_DTCM_SIZE           (0xf << 4)      /* Size of DTCM enabled memory block */
+#define                        AT91_MATRIX_DTCM_0              (0 << 4)
+#define                        AT91_MATRIX_DTCM_32             (6 << 4)
+#define                        AT91_MATRIX_DTCM_64             (7 << 4)
+#define                AT91_MATRIX_TCM_NWS             (0x1 << 11)     /* Wait state TCM register */
+#define                        AT91_MATRIX_TCM_NO_WS           (0x0 << 11)
+#define                        AT91_MATRIX_TCM_ONE_WS          (0x1 << 11)
+
+#define AT91_MATRIX_VIDEO      (AT91_MATRIX + 0x118)   /* Video Mode Configuration Register */
+#define                AT91C_VDEC_SEL                  (0x1 <<  0) /* Video Mode Selection */
+#define                        AT91C_VDEC_SEL_OFF              (0 << 0)
+#define                        AT91C_VDEC_SEL_ON               (1 << 0)
+
+#define AT91_MATRIX_EBICSA     (AT91_MATRIX + 0x128)   /* EBI Chip Select Assignment Register */
+#define                AT91_MATRIX_EBI_CS1A            (1 << 1)        /* Chip Select 1 Assignment */
+#define                        AT91_MATRIX_EBI_CS1A_SMC                (0 << 1)
+#define                        AT91_MATRIX_EBI_CS1A_SDRAMC             (1 << 1)
+#define                AT91_MATRIX_EBI_CS3A            (1 << 3)        /* Chip Select 3 Assignment */
+#define                        AT91_MATRIX_EBI_CS3A_SMC                (0 << 3)
+#define                        AT91_MATRIX_EBI_CS3A_SMC_SMARTMEDIA     (1 << 3)
+#define                AT91_MATRIX_EBI_CS4A            (1 << 4)        /* Chip Select 4 Assignment */
+#define                        AT91_MATRIX_EBI_CS4A_SMC                (0 << 4)
+#define                        AT91_MATRIX_EBI_CS4A_SMC_CF0            (1 << 4)
+#define                AT91_MATRIX_EBI_CS5A            (1 << 5)        /* Chip Select 5 Assignment */
+#define                        AT91_MATRIX_EBI_CS5A_SMC                (0 << 5)
+#define                        AT91_MATRIX_EBI_CS5A_SMC_CF1            (1 << 5)
+#define                AT91_MATRIX_EBI_DBPUC           (1 << 8)        /* Data Bus Pull-up Configuration */
+#define                        AT91_MATRIX_EBI_DBPU_ON                 (0 << 8)
+#define                        AT91_MATRIX_EBI_DBPU_OFF                (1 << 8)
+#define                AT91_MATRIX_EBI_VDDIOMSEL       (1 << 16)       /* Memory voltage selection */
+#define                        AT91_MATRIX_EBI_VDDIOMSEL_1_8V          (0 << 16)
+#define                        AT91_MATRIX_EBI_VDDIOMSEL_3_3V          (1 << 16)
+#define                AT91_MATRIX_EBI_EBI_IOSR        (1 << 17)       /* EBI I/O slew rate selection */
+#define                        AT91_MATRIX_EBI_EBI_IOSR_REDUCED        (0 << 17)
+#define                        AT91_MATRIX_EBI_EBI_IOSR_NORMAL         (1 << 17)
+#define                AT91_MATRIX_EBI_DDR_IOSR        (1 << 18)       /* DDR2 dedicated port I/O slew rate selection */
+#define                        AT91_MATRIX_EBI_DDR_IOSR_REDUCED        (0 << 18)
+#define                        AT91_MATRIX_EBI_DDR_IOSR_NORMAL         (1 << 18)
+
+#define AT91_MATRIX_WPMR       (AT91_MATRIX + 0x1E4)   /* Write Protect Mode Register */
+#define                AT91_MATRIX_WPMR_WPEN           (1 << 0)        /* Write Protect ENable */
+#define                        AT91_MATRIX_WPMR_WP_WPDIS               (0 << 0)
+#define                        AT91_MATRIX_WPMR_WP_WPEN                (1 << 0)
+#define                AT91_MATRIX_WPMR_WPKEY          (0xFFFFFF << 8) /* Write Protect KEY */
+
+#define AT91_MATRIX_WPSR       (AT91_MATRIX + 0x1E8)   /* Write Protect Status Register */
+#define                AT91_MATRIX_WPSR_WPVS           (1 << 0)        /* Write Protect Violation Status */
+#define                        AT91_MATRIX_WPSR_NO_WPV         (0 << 0)
+#define                        AT91_MATRIX_WPSR_WPV            (1 << 0)
+#define                AT91_MATRIX_WPSR_WPVSRC         (0xFFFF << 8)   /* Write Protect Violation Source */
+
+#endif
index e6afff849b85e5475155b344123387276958a694..13f27a4b882d10aef10df715f8f846dd06920d4d 100644 (file)
@@ -37,6 +37,7 @@
 #include <linux/leds.h>
 #include <linux/spi/spi.h>
 #include <linux/usb/atmel_usba_udc.h>
+#include <sound/atmel-ac97c.h>
 
  /* USB Device */
 struct at91_udc_data {
@@ -80,7 +81,8 @@ struct at91_eth_data {
 };
 extern void __init at91_add_device_eth(struct at91_eth_data *data);
 
-#if defined(CONFIG_ARCH_AT91SAM9260) || defined(CONFIG_ARCH_AT91SAM9263) || defined(CONFIG_ARCH_AT91SAM9G20) || defined(CONFIG_ARCH_AT91CAP9)
+#if defined(CONFIG_ARCH_AT91SAM9260) || defined(CONFIG_ARCH_AT91SAM9263) || defined(CONFIG_ARCH_AT91SAM9G20) || defined(CONFIG_ARCH_AT91CAP9) \
+       || defined(CONFIG_ARCH_AT91SAM9G45)
 #define eth_platform_data      at91_eth_data
 #endif
 
@@ -90,6 +92,7 @@ struct at91_usbh_data {
        u8              vbus_pin[2];    /* port power-control pin */
 };
 extern void __init at91_add_device_usbh(struct at91_usbh_data *data);
+extern void __init at91_add_device_usbh_ohci(struct at91_usbh_data *data);
 
  /* NAND / SmartMedia */
 struct atmel_nand_data {
@@ -105,7 +108,11 @@ struct atmel_nand_data {
 extern void __init at91_add_device_nand(struct atmel_nand_data *data);
 
  /* I2C*/
+#if defined(CONFIG_ARCH_AT91SAM9G45)
+extern void __init at91_add_device_i2c(short i2c_id, struct i2c_board_info *devices, int nr_devices);
+#else
 extern void __init at91_add_device_i2c(struct i2c_board_info *devices, int nr_devices);
+#endif
 
  /* SPI */
 extern void __init at91_add_device_spi(struct spi_board_info *devices, int nr_devices);
@@ -168,10 +175,7 @@ struct atmel_lcdfb_info;
 extern void __init at91_add_device_lcdc(struct atmel_lcdfb_info *data);
 
  /* AC97 */
-struct atmel_ac97_data {
-       u8              reset_pin;      /* reset */
-};
-extern void __init at91_add_device_ac97(struct atmel_ac97_data *data);
+extern void __init at91_add_device_ac97(struct ac97c_platform_data *data);
 
  /* ISI */
 extern void __init at91_add_device_isi(void);
index c554c3e4d5532c09a96eef3270c3e5a71f68fb99..34a9502c48bce9ab05dae962c89cf3ac68ae6162 100644 (file)
 #define ARCH_ID_AT91SAM9260    0x019803a0
 #define ARCH_ID_AT91SAM9261    0x019703a0
 #define ARCH_ID_AT91SAM9263    0x019607a0
+#define ARCH_ID_AT91SAM9G10    0x819903a0
 #define ARCH_ID_AT91SAM9G20    0x019905a0
 #define ARCH_ID_AT91SAM9RL64   0x019b03a0
+#define ARCH_ID_AT91SAM9G45    0x819b05a0
 #define ARCH_ID_AT91CAP9       0x039A03A0
 
 #define ARCH_ID_AT91SAM9XE128  0x329973a0
@@ -39,6 +41,15 @@ static inline unsigned long at91_cpu_identify(void)
        return (at91_sys_read(AT91_DBGU_CIDR) & ~AT91_CIDR_VERSION);
 }
 
+#define ARCH_EXID_AT91SAM9M11  0x00000001
+#define ARCH_EXID_AT91SAM9M10  0x00000002
+#define ARCH_EXID_AT91SAM9G45  0x00000004
+
+static inline unsigned long at91_exid_identify(void)
+{
+       return at91_sys_read(AT91_DBGU_EXID);
+}
+
 
 #define ARCH_FAMILY_AT91X92    0x09200000
 #define ARCH_FAMILY_AT91SAM9   0x01900000
@@ -87,6 +98,12 @@ static inline unsigned long at91cap9_rev_identify(void)
 #define cpu_is_at91sam9261()   (0)
 #endif
 
+#ifdef CONFIG_ARCH_AT91SAM9G10
+#define cpu_is_at91sam9g10()   (at91_cpu_identify() == ARCH_ID_AT91SAM9G10)
+#else
+#define cpu_is_at91sam9g10()   (0)
+#endif
+
 #ifdef CONFIG_ARCH_AT91SAM9263
 #define cpu_is_at91sam9263()   (at91_cpu_identify() == ARCH_ID_AT91SAM9263)
 #else
@@ -99,6 +116,12 @@ static inline unsigned long at91cap9_rev_identify(void)
 #define cpu_is_at91sam9rl()    (0)
 #endif
 
+#ifdef CONFIG_ARCH_AT91SAM9G45
+#define cpu_is_at91sam9g45()   (at91_cpu_identify() == ARCH_ID_AT91SAM9G45)
+#else
+#define cpu_is_at91sam9g45()   (0)
+#endif
+
 #ifdef CONFIG_ARCH_AT91CAP9
 #define cpu_is_at91cap9()      (at91_cpu_identify() == ARCH_ID_AT91CAP9)
 #define cpu_is_at91cap9_revB() (at91cap9_rev_identify() == ARCH_REVISION_CAP9_B)
index da0b681c652cf12b53a8a47d633a9fd23a955610..a0df8b022df27bd3ede5e22aa2d3dff3f9c98fd3 100644 (file)
 #include <mach/at91rm9200.h>
 #elif defined(CONFIG_ARCH_AT91SAM9260) || defined(CONFIG_ARCH_AT91SAM9G20)
 #include <mach/at91sam9260.h>
-#elif defined(CONFIG_ARCH_AT91SAM9261)
+#elif defined(CONFIG_ARCH_AT91SAM9261) || defined(CONFIG_ARCH_AT91SAM9G10)
 #include <mach/at91sam9261.h>
 #elif defined(CONFIG_ARCH_AT91SAM9263)
 #include <mach/at91sam9263.h>
 #elif defined(CONFIG_ARCH_AT91SAM9RL)
 #include <mach/at91sam9rl.h>
+#elif defined(CONFIG_ARCH_AT91SAM9G45)
+#include <mach/at91sam9g45.h>
 #elif defined(CONFIG_ARCH_AT91CAP9)
 #include <mach/at91cap9.h>
 #elif defined(CONFIG_ARCH_AT91X40)
index d84c9948becf5f64a730bee50a3d3c598470883d..31ac2d97f14cb24b85371b259a2c70b27fc6a461 100644 (file)
 #define AT91SAM9_MASTER_CLOCK  99300000
 #define CLOCK_TICK_RATE                (AT91SAM9_MASTER_CLOCK/16)
 
+#elif defined(CONFIG_ARCH_AT91SAM9G10)
+
+#define AT91SAM9_MASTER_CLOCK  133000000
+#define CLOCK_TICK_RATE                (AT91SAM9_MASTER_CLOCK/16)
+
 #elif defined(CONFIG_ARCH_AT91SAM9263)
 
 #if defined(CONFIG_MACH_USB_A9263)
 #define AT91SAM9_MASTER_CLOCK  132096000
 #define CLOCK_TICK_RATE                (AT91SAM9_MASTER_CLOCK/16)
 
+#elif defined(CONFIG_ARCH_AT91SAM9G45)
+
+#define AT91SAM9_MASTER_CLOCK  133333333
+#define CLOCK_TICK_RATE                (AT91SAM9_MASTER_CLOCK/16)
+
 #elif defined(CONFIG_ARCH_AT91CAP9)
 
 #define AT91CAP9_MASTER_CLOCK  100000000
index e26c4fe61faeaa6180c0735cff5c94c18d33073b..4028724d490df418768f175ce8ac9eee66b4f93e 100644 (file)
@@ -201,7 +201,8 @@ static int at91_pm_verify_clocks(void)
                        pr_err("AT91: PM - Suspend-to-RAM with USB still active\n");
                        return 0;
                }
-       } else if (cpu_is_at91sam9260() || cpu_is_at91sam9261() || cpu_is_at91sam9263() || cpu_is_at91sam9g20()) {
+       } else if (cpu_is_at91sam9260() || cpu_is_at91sam9261() || cpu_is_at91sam9263()
+                       || cpu_is_at91sam9g20() || cpu_is_at91sam9g10()) {
                if ((scsr & (AT91SAM926x_PMC_UHP | AT91SAM926x_PMC_UDP)) != 0) {
                        pr_err("AT91: PM - Suspend-to-RAM with USB still active\n");
                        return 0;
diff --git a/arch/arm/mach-bcmring/Kconfig b/arch/arm/mach-bcmring/Kconfig
new file mode 100644 (file)
index 0000000..457b438
--- /dev/null
@@ -0,0 +1,21 @@
+choice
+       prompt "Processor selection in BCMRING family of devices"
+       depends on ARCH_BCMRING
+       default ARCH_BCM11107
+
+config ARCH_FPGA11107
+       bool "FPGA11107"
+
+config ARCH_BCM11107
+       bool "BCM11107"
+endchoice
+
+menu "BCMRING Options"
+       depends on ARCH_BCMRING
+
+config BCM_ZRELADDR
+       hex "Compressed ZREL ADDR"
+
+endmenu
+
+# source "drivers/char/bcmring/Kconfig"
diff --git a/arch/arm/mach-bcmring/Makefile b/arch/arm/mach-bcmring/Makefile
new file mode 100644 (file)
index 0000000..f8d9fce
--- /dev/null
@@ -0,0 +1,8 @@
+#
+# Makefile for the linux kernel.
+#
+
+# Object file lists.
+
+obj-y := arch.o mm.o irq.o clock.o core.o timer.o dma.o
+obj-y += csp/
diff --git a/arch/arm/mach-bcmring/Makefile.boot b/arch/arm/mach-bcmring/Makefile.boot
new file mode 100644 (file)
index 0000000..fb53b28
--- /dev/null
@@ -0,0 +1,6 @@
+# Address where decompressor will be written and eventually executed.
+#
+# default to SDRAM
+zreladdr-y      := $(CONFIG_BCM_ZRELADDR)
+params_phys-y   := 0x00000800
+
diff --git a/arch/arm/mach-bcmring/arch.c b/arch/arm/mach-bcmring/arch.c
new file mode 100644 (file)
index 0000000..0da693b
--- /dev/null
@@ -0,0 +1,157 @@
+/*****************************************************************************
+* Copyright 2003 - 2008 Broadcom Corporation.  All rights reserved.
+*
+* Unless you and Broadcom execute a separate written software license
+* agreement governing use of this software, this software is licensed to you
+* under the terms of the GNU General Public License version 2, available at
+* http://www.broadcom.com/licenses/GPLv2.php (the "GPL").
+*
+* Notwithstanding the above, under no circumstances may you combine this
+* software in any way with any other Broadcom software provided under a
+* license other than the GPL, without Broadcom's express prior written
+* consent.
+*****************************************************************************/
+
+#include <linux/kernel.h>
+#include <linux/platform_device.h>
+#include <linux/types.h>
+#include <linux/sched.h>
+#include <linux/interrupt.h>
+#include <linux/init.h>
+#include <linux/errno.h>
+#include <linux/spinlock.h>
+#include <linux/module.h>
+
+#include <linux/proc_fs.h>
+#include <linux/sysctl.h>
+
+#include <asm/irq.h>
+#include <asm/setup.h>
+#include <asm/mach-types.h>
+#include <asm/mach/time.h>
+
+#include <asm/mach/arch.h>
+#include <mach/dma.h>
+#include <mach/hardware.h>
+#include <mach/csp/mm_io.h>
+#include <mach/csp/chipcHw_def.h>
+#include <mach/csp/chipcHw_inline.h>
+
+#include <cfg_global.h>
+
+#include "core.h"
+
+HW_DECLARE_SPINLOCK(arch)
+HW_DECLARE_SPINLOCK(gpio)
+#if defined(CONFIG_DEBUG_SPINLOCK)
+    EXPORT_SYMBOL(bcmring_gpio_reg_lock);
+#endif
+
+/* FIXME: temporary solution */
+#define BCM_SYSCTL_REBOOT_WARM               1
+#define CTL_BCM_REBOOT                 112
+
+/* sysctl */
+int bcmring_arch_warm_reboot;  /* do a warm reboot on hard reset */
+
+static struct ctl_table_header *bcmring_sysctl_header;
+
+static struct ctl_table bcmring_sysctl_warm_reboot[] = {
+       {
+        .ctl_name = BCM_SYSCTL_REBOOT_WARM,
+        .procname = "warm",
+        .data = &bcmring_arch_warm_reboot,
+        .maxlen = sizeof(int),
+        .mode = 0644,
+        .proc_handler = &proc_dointvec},
+       {}
+};
+
+static struct ctl_table bcmring_sysctl_reboot[] = {
+       {
+        .ctl_name = CTL_BCM_REBOOT,
+        .procname = "reboot",
+        .mode = 0555,
+        .child = bcmring_sysctl_warm_reboot},
+       {}
+};
+
+static struct platform_device nand_device = {
+       .name = "bcm-nand",
+       .id = -1,
+};
+
+static struct platform_device *devices[] __initdata = {
+       &nand_device,
+};
+
+/****************************************************************************
+*
+*   Called from the customize_machine function in arch/arm/kernel/setup.c
+*
+*   The customize_machine function is tagged as an arch_initcall
+*   (see include/linux/init.h for the order that the various init sections
+*   are called in.
+*
+*****************************************************************************/
+static void __init bcmring_init_machine(void)
+{
+
+       bcmring_sysctl_header = register_sysctl_table(bcmring_sysctl_reboot);
+
+       /* Enable spread spectrum */
+       chipcHw_enableSpreadSpectrum();
+
+       platform_add_devices(devices, ARRAY_SIZE(devices));
+
+       bcmring_amba_init();
+
+       dma_init();
+}
+
+/****************************************************************************
+*
+*   Called from setup_arch (in arch/arm/kernel/setup.c) to fixup any tags
+*   passed in by the boot loader.
+*
+*****************************************************************************/
+
+static void __init bcmring_fixup(struct machine_desc *desc,
+     struct tag *t, char **cmdline, struct meminfo *mi) {
+#ifdef CONFIG_BLK_DEV_INITRD
+       printk(KERN_NOTICE "bcmring_fixup\n");
+       t->hdr.tag = ATAG_CORE;
+       t->hdr.size = tag_size(tag_core);
+       t->u.core.flags = 0;
+       t->u.core.pagesize = PAGE_SIZE;
+       t->u.core.rootdev = 31 << 8 | 0;
+       t = tag_next(t);
+
+       t->hdr.tag = ATAG_MEM;
+       t->hdr.size = tag_size(tag_mem32);
+       t->u.mem.start = CFG_GLOBAL_RAM_BASE;
+       t->u.mem.size = CFG_GLOBAL_RAM_SIZE;
+
+       t = tag_next(t);
+
+       t->hdr.tag = ATAG_NONE;
+       t->hdr.size = 0;
+#endif
+}
+
+/****************************************************************************
+*
+*   Machine Description
+*
+*****************************************************************************/
+
+MACHINE_START(BCMRING, "BCMRING")
+       /* Maintainer: Broadcom Corporation */
+       .phys_io = MM_IO_START,
+       .io_pg_offst = (MM_IO_BASE >> 18) & 0xfffc,
+       .fixup = bcmring_fixup,
+       .map_io = bcmring_map_io,
+       .init_irq = bcmring_init_irq,
+       .timer = &bcmring_timer,
+       .init_machine = bcmring_init_machine
+MACHINE_END
diff --git a/arch/arm/mach-bcmring/clock.c b/arch/arm/mach-bcmring/clock.c
new file mode 100644 (file)
index 0000000..14bafc3
--- /dev/null
@@ -0,0 +1,224 @@
+/*****************************************************************************
+* Copyright 2001 - 2009 Broadcom Corporation.  All rights reserved.
+*
+* Unless you and Broadcom execute a separate written software license
+* agreement governing use of this software, this software is licensed to you
+* under the terms of the GNU General Public License version 2, available at
+* http://www.broadcom.com/licenses/GPLv2.php (the "GPL").
+*
+* Notwithstanding the above, under no circumstances may you combine this
+* software in any way with any other Broadcom software provided under a
+* license other than the GPL, without Broadcom's express prior written
+* consent.
+*****************************************************************************/
+
+#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/spinlock.h>
+#include <mach/csp/hw_cfg.h>
+#include <mach/csp/chipcHw_def.h>
+#include <mach/csp/chipcHw_reg.h>
+#include <mach/csp/chipcHw_inline.h>
+
+#include <asm/clkdev.h>
+
+#include "clock.h"
+
+#define clk_is_primary(x)       ((x)->type & CLK_TYPE_PRIMARY)
+#define clk_is_pll1(x)          ((x)->type & CLK_TYPE_PLL1)
+#define clk_is_pll2(x)          ((x)->type & CLK_TYPE_PLL2)
+#define clk_is_programmable(x)  ((x)->type & CLK_TYPE_PROGRAMMABLE)
+#define clk_is_bypassable(x)    ((x)->type & CLK_TYPE_BYPASSABLE)
+
+#define clk_is_using_xtal(x)    ((x)->mode & CLK_MODE_XTAL)
+
+static DEFINE_SPINLOCK(clk_lock);
+
+static void __clk_enable(struct clk *clk)
+{
+       if (!clk)
+               return;
+
+       /* enable parent clock first */
+       if (clk->parent)
+               __clk_enable(clk->parent);
+
+       if (clk->use_cnt++ == 0) {
+               if (clk_is_pll1(clk)) { /* PLL1 */
+                       chipcHw_pll1Enable(clk->rate_hz, 0);
+               } else if (clk_is_pll2(clk)) {  /* PLL2 */
+                       chipcHw_pll2Enable(clk->rate_hz);
+               } else if (clk_is_using_xtal(clk)) {    /* source is crystal */
+                       if (!clk_is_primary(clk))
+                               chipcHw_bypassClockEnable(clk->csp_id);
+               } else {        /* source is PLL */
+                       chipcHw_setClockEnable(clk->csp_id);
+               }
+       }
+}
+
+int clk_enable(struct clk *clk)
+{
+       unsigned long flags;
+
+       if (!clk)
+               return -EINVAL;
+
+       spin_lock_irqsave(&clk_lock, flags);
+       __clk_enable(clk);
+       spin_unlock_irqrestore(&clk_lock, flags);
+
+       return 0;
+}
+EXPORT_SYMBOL(clk_enable);
+
+static void __clk_disable(struct clk *clk)
+{
+       if (!clk)
+               return;
+
+       BUG_ON(clk->use_cnt == 0);
+
+       if (--clk->use_cnt == 0) {
+               if (clk_is_pll1(clk)) { /* PLL1 */
+                       chipcHw_pll1Disable();
+               } else if (clk_is_pll2(clk)) {  /* PLL2 */
+                       chipcHw_pll2Disable();
+               } else if (clk_is_using_xtal(clk)) {    /* source is crystal */
+                       if (!clk_is_primary(clk))
+                               chipcHw_bypassClockDisable(clk->csp_id);
+               } else {        /* source is PLL */
+                       chipcHw_setClockDisable(clk->csp_id);
+               }
+       }
+
+       if (clk->parent)
+               __clk_disable(clk->parent);
+}
+
+void clk_disable(struct clk *clk)
+{
+       unsigned long flags;
+
+       if (!clk)
+               return;
+
+       spin_lock_irqsave(&clk_lock, flags);
+       __clk_disable(clk);
+       spin_unlock_irqrestore(&clk_lock, flags);
+}
+EXPORT_SYMBOL(clk_disable);
+
+unsigned long clk_get_rate(struct clk *clk)
+{
+       if (!clk)
+               return 0;
+
+       return clk->rate_hz;
+}
+EXPORT_SYMBOL(clk_get_rate);
+
+long clk_round_rate(struct clk *clk, unsigned long rate)
+{
+       unsigned long flags;
+       unsigned long actual;
+       unsigned long rate_hz;
+
+       if (!clk)
+               return -EINVAL;
+
+       if (!clk_is_programmable(clk))
+               return -EINVAL;
+
+       if (clk->use_cnt)
+               return -EBUSY;
+
+       spin_lock_irqsave(&clk_lock, flags);
+       actual = clk->parent->rate_hz;
+       rate_hz = min(actual, rate);
+       spin_unlock_irqrestore(&clk_lock, flags);
+
+       return rate_hz;
+}
+EXPORT_SYMBOL(clk_round_rate);
+
+int clk_set_rate(struct clk *clk, unsigned long rate)
+{
+       unsigned long flags;
+       unsigned long actual;
+       unsigned long rate_hz;
+
+       if (!clk)
+               return -EINVAL;
+
+       if (!clk_is_programmable(clk))
+               return -EINVAL;
+
+       if (clk->use_cnt)
+               return -EBUSY;
+
+       spin_lock_irqsave(&clk_lock, flags);
+       actual = clk->parent->rate_hz;
+       rate_hz = min(actual, rate);
+       rate_hz = chipcHw_setClockFrequency(clk->csp_id, rate_hz);
+       clk->rate_hz = rate_hz;
+       spin_unlock_irqrestore(&clk_lock, flags);
+
+       return 0;
+}
+EXPORT_SYMBOL(clk_set_rate);
+
+struct clk *clk_get_parent(struct clk *clk)
+{
+       if (!clk)
+               return NULL;
+
+       return clk->parent;
+}
+EXPORT_SYMBOL(clk_get_parent);
+
+int clk_set_parent(struct clk *clk, struct clk *parent)
+{
+       unsigned long flags;
+       struct clk *old_parent;
+
+       if (!clk || !parent)
+               return -EINVAL;
+
+       if (!clk_is_primary(parent) || !clk_is_bypassable(clk))
+               return -EINVAL;
+
+       /* if more than one user, parent is not allowed */
+       if (clk->use_cnt > 1)
+               return -EBUSY;
+
+       if (clk->parent == parent)
+               return 0;
+
+       spin_lock_irqsave(&clk_lock, flags);
+       old_parent = clk->parent;
+       clk->parent = parent;
+       if (clk_is_using_xtal(parent))
+               clk->mode |= CLK_MODE_XTAL;
+       else
+               clk->mode &= (~CLK_MODE_XTAL);
+
+       /* if clock is active */
+       if (clk->use_cnt != 0) {
+               clk->use_cnt--;
+               /* enable clock with the new parent */
+               __clk_enable(clk);
+               /* disable the old parent */
+               __clk_disable(old_parent);
+       }
+       spin_unlock_irqrestore(&clk_lock, flags);
+
+       return 0;
+}
+EXPORT_SYMBOL(clk_set_parent);
diff --git a/arch/arm/mach-bcmring/clock.h b/arch/arm/mach-bcmring/clock.h
new file mode 100644 (file)
index 0000000..5e0b981
--- /dev/null
@@ -0,0 +1,33 @@
+/*****************************************************************************
+* Copyright 2001 - 2009 Broadcom Corporation.  All rights reserved.
+*
+* Unless you and Broadcom execute a separate written software license
+* agreement governing use of this software, this software is licensed to you
+* under the terms of the GNU General Public License version 2, available at
+* http://www.broadcom.com/licenses/GPLv2.php (the "GPL").
+*
+* Notwithstanding the above, under no circumstances may you combine this
+* software in any way with any other Broadcom software provided under a
+* license other than the GPL, without Broadcom's express prior written
+* consent.
+*****************************************************************************/
+#include <mach/csp/chipcHw_def.h>
+
+#define CLK_TYPE_PRIMARY         1     /* primary clock must NOT have a parent */
+#define CLK_TYPE_PLL1            2     /* PPL1 */
+#define CLK_TYPE_PLL2            4     /* PPL2 */
+#define CLK_TYPE_PROGRAMMABLE    8     /* programmable clock rate */
+#define CLK_TYPE_BYPASSABLE      16    /* parent can be changed */
+
+#define CLK_MODE_XTAL            1     /* clock source is from crystal */
+
+struct clk {
+       const char *name;       /* clock name */
+       unsigned int type;      /* clock type */
+       unsigned int mode;      /* current mode */
+       volatile int use_bypass;        /* indicate if it's in bypass mode */
+       chipcHw_CLOCK_e csp_id; /* clock ID for CSP CHIPC */
+       unsigned long rate_hz;  /* clock rate in Hz */
+       unsigned int use_cnt;   /* usage count */
+       struct clk *parent;     /* parent clock */
+};
diff --git a/arch/arm/mach-bcmring/core.c b/arch/arm/mach-bcmring/core.c
new file mode 100644 (file)
index 0000000..492c649
--- /dev/null
@@ -0,0 +1,367 @@
+/*
+ *  derived from linux/arch/arm/mach-versatile/core.c
+ *  linux/arch/arm/mach-bcmring/core.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
+ */
+/* Portions copyright Broadcom 2008 */
+
+#include <linux/init.h>
+#include <linux/device.h>
+#include <linux/dma-mapping.h>
+#include <linux/platform_device.h>
+#include <linux/sysdev.h>
+#include <linux/interrupt.h>
+#include <linux/amba/bus.h>
+#include <linux/clocksource.h>
+#include <linux/clockchips.h>
+
+#include <linux/amba/bus.h>
+#include <mach/csp/mm_addr.h>
+#include <mach/hardware.h>
+#include <asm/clkdev.h>
+#include <linux/io.h>
+#include <asm/irq.h>
+#include <asm/hardware/arm_timer.h>
+#include <asm/mach-types.h>
+
+#include <asm/mach/arch.h>
+#include <asm/mach/flash.h>
+#include <asm/mach/irq.h>
+#include <asm/mach/time.h>
+#include <asm/mach/map.h>
+#include <asm/mach/mmc.h>
+
+#include <cfg_global.h>
+
+#include "clock.h"
+
+#include <csp/secHw.h>
+#include <mach/csp/secHw_def.h>
+#include <mach/csp/chipcHw_inline.h>
+#include <mach/csp/tmrHw_reg.h>
+
+#define AMBA_DEVICE(name, initname, base, plat, size)       \
+static struct amba_device name##_device = {     \
+   .dev = {                                     \
+      .coherent_dma_mask = ~0,                  \
+      .init_name = initname,                    \
+      .platform_data = plat                     \
+   },                                           \
+   .res = {                                     \
+      .start = MM_ADDR_IO_##base,               \
+               .end = MM_ADDR_IO_##base + (size) - 1,    \
+      .flags = IORESOURCE_MEM                   \
+   },                                           \
+   .dma_mask = ~0,                              \
+   .irq = {                                     \
+      IRQ_##base                                \
+   }                                            \
+}
+
+
+AMBA_DEVICE(uartA, "uarta", UARTA, NULL, SZ_4K);
+AMBA_DEVICE(uartB, "uartb", UARTB, NULL, SZ_4K);
+
+static struct clk pll1_clk = {
+       .name = "PLL1",
+       .type = CLK_TYPE_PRIMARY | CLK_TYPE_PLL1,
+       .rate_hz = 2000000000,
+       .use_cnt = 7,
+};
+
+static struct clk uart_clk = {
+       .name = "UART",
+       .type = CLK_TYPE_PROGRAMMABLE,
+       .csp_id = chipcHw_CLOCK_UART,
+       .rate_hz = HW_CFG_UART_CLK_HZ,
+       .parent = &pll1_clk,
+};
+
+static struct clk_lookup lookups[] = {
+       {                       /* UART0 */
+        .dev_id = "uarta",
+        .clk = &uart_clk,
+        }, {                   /* UART1 */
+            .dev_id = "uartb",
+            .clk = &uart_clk,
+            }
+};
+
+static struct amba_device *amba_devs[] __initdata = {
+       &uartA_device,
+       &uartB_device,
+};
+
+void __init bcmring_amba_init(void)
+{
+       int i;
+       u32 bus_clock;
+
+/* Linux is run initially in non-secure mode. Secure peripherals */
+/* generate FIQ, and must be handled in secure mode. Until we have */
+/* a linux security monitor implementation, keep everything in */
+/* non-secure mode. */
+       chipcHw_busInterfaceClockEnable(chipcHw_REG_BUS_CLOCK_SPU);
+       secHw_setUnsecure(secHw_BLK_MASK_CHIP_CONTROL |
+                         secHw_BLK_MASK_KEY_SCAN |
+                         secHw_BLK_MASK_TOUCH_SCREEN |
+                         secHw_BLK_MASK_UART0 |
+                         secHw_BLK_MASK_UART1 |
+                         secHw_BLK_MASK_WATCHDOG |
+                         secHw_BLK_MASK_SPUM |
+                         secHw_BLK_MASK_DDR2 |
+                         secHw_BLK_MASK_SPU |
+                         secHw_BLK_MASK_PKA |
+                         secHw_BLK_MASK_RNG |
+                         secHw_BLK_MASK_RTC |
+                         secHw_BLK_MASK_OTP |
+                         secHw_BLK_MASK_BOOT |
+                         secHw_BLK_MASK_MPU |
+                         secHw_BLK_MASK_TZCTRL | secHw_BLK_MASK_INTR);
+
+       /* Only the devices attached to the AMBA bus are enabled just before the bus is */
+       /* scanned and the drivers are loaded. The clocks need to be on for the AMBA bus */
+       /* driver to access these blocks. The bus is probed, and the drivers are loaded. */
+       /* FIXME Need to remove enable of PIF once CLCD clock enable used properly in FPGA. */
+       bus_clock = chipcHw_REG_BUS_CLOCK_GE
+           | chipcHw_REG_BUS_CLOCK_SDIO0 | chipcHw_REG_BUS_CLOCK_SDIO1;
+
+       chipcHw_busInterfaceClockEnable(bus_clock);
+
+       for (i = 0; i < ARRAY_SIZE(lookups); i++)
+               clkdev_add(&lookups[i]);
+
+       for (i = 0; i < ARRAY_SIZE(amba_devs); i++) {
+               struct amba_device *d = amba_devs[i];
+               amba_device_register(d, &iomem_resource);
+       }
+}
+
+/*
+ * Where is the timer (VA)?
+ */
+#define TIMER0_VA_BASE          MM_IO_BASE_TMR
+#define TIMER1_VA_BASE         (MM_IO_BASE_TMR + 0x20)
+#define TIMER2_VA_BASE         (MM_IO_BASE_TMR + 0x40)
+#define TIMER3_VA_BASE          (MM_IO_BASE_TMR + 0x60)
+
+/* Timer 0 - 25 MHz, Timer3 at bus clock rate, typically  150-166 MHz */
+#if defined(CONFIG_ARCH_FPGA11107)
+/* fpga cpu/bus are currently 30 times slower so scale frequency as well to */
+/* slow down Linux's sense of time */
+#define TIMER0_FREQUENCY_MHZ  (tmrHw_LOW_FREQUENCY_MHZ * 30)
+#define TIMER1_FREQUENCY_MHZ  (tmrHw_LOW_FREQUENCY_MHZ * 30)
+#define TIMER3_FREQUENCY_MHZ  (tmrHw_HIGH_FREQUENCY_MHZ * 30)
+#define TIMER3_FREQUENCY_KHZ   (tmrHw_HIGH_FREQUENCY_HZ / 1000 * 30)
+#else
+#define TIMER0_FREQUENCY_MHZ  tmrHw_LOW_FREQUENCY_MHZ
+#define TIMER1_FREQUENCY_MHZ  tmrHw_LOW_FREQUENCY_MHZ
+#define TIMER3_FREQUENCY_MHZ  tmrHw_HIGH_FREQUENCY_MHZ
+#define TIMER3_FREQUENCY_KHZ  (tmrHw_HIGH_FREQUENCY_HZ / 1000)
+#endif
+
+#define TICKS_PER_uSEC     TIMER0_FREQUENCY_MHZ
+
+/*
+ *  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)
+
+/*
+ * 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_DIVISOR | 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_DIVISOR | 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 bcmring_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 bcmring_timer_irq = {
+       .name = "bcmring Timer Tick",
+       .flags = IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL,
+       .handler = bcmring_timer_interrupt,
+};
+
+static cycle_t bcmring_get_cycles_timer1(void)
+{
+       return ~readl(TIMER1_VA_BASE + TIMER_VALUE);
+}
+
+static cycle_t bcmring_get_cycles_timer3(void)
+{
+       return ~readl(TIMER3_VA_BASE + TIMER_VALUE);
+}
+
+static struct clocksource clocksource_bcmring_timer1 = {
+       .name = "timer1",
+       .rating = 200,
+       .read = bcmring_get_cycles_timer1,
+       .mask = CLOCKSOURCE_MASK(32),
+       .shift = 20,
+       .flags = CLOCK_SOURCE_IS_CONTINUOUS,
+};
+
+static struct clocksource clocksource_bcmring_timer3 = {
+       .name = "timer3",
+       .rating = 100,
+       .read = bcmring_get_cycles_timer3,
+       .mask = CLOCKSOURCE_MASK(32),
+       .shift = 20,
+       .flags = CLOCK_SOURCE_IS_CONTINUOUS,
+};
+
+static int __init bcmring_clocksource_init(void)
+{
+       /* setup timer1 as free-running clocksource */
+       writel(0, TIMER1_VA_BASE + TIMER_CTRL);
+       writel(0xffffffff, TIMER1_VA_BASE + TIMER_LOAD);
+       writel(0xffffffff, TIMER1_VA_BASE + TIMER_VALUE);
+       writel(TIMER_CTRL_32BIT | TIMER_CTRL_ENABLE | TIMER_CTRL_PERIODIC,
+              TIMER1_VA_BASE + TIMER_CTRL);
+
+       clocksource_bcmring_timer1.mult =
+           clocksource_khz2mult(TIMER1_FREQUENCY_MHZ * 1000,
+                                clocksource_bcmring_timer1.shift);
+       clocksource_register(&clocksource_bcmring_timer1);
+
+       /* 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_bcmring_timer3.mult =
+           clocksource_khz2mult(TIMER3_FREQUENCY_KHZ,
+                                clocksource_bcmring_timer3.shift);
+       clocksource_register(&clocksource_bcmring_timer3);
+
+       return 0;
+}
+
+/*
+ * Set up timer interrupt, and return the current time in seconds.
+ */
+void __init bcmring_init_timer(void)
+{
+       printk(KERN_INFO "bcmring_init_timer\n");
+       /*
+        * 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(0, TIMER3_VA_BASE + TIMER_CTRL);
+
+       /*
+        * Make irqs happen for the system timer
+        */
+       setup_irq(IRQ_TIMER0, &bcmring_timer_irq);
+
+       bcmring_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);
+}
+
+struct sys_timer bcmring_timer = {
+       .init = bcmring_init_timer,
+};
diff --git a/arch/arm/mach-bcmring/core.h b/arch/arm/mach-bcmring/core.h
new file mode 100644 (file)
index 0000000..b197ba4
--- /dev/null
@@ -0,0 +1,30 @@
+/*
+ *  linux/arch/arm/mach-versatile/core.h
+ *
+ *  Copyright (C) 2004 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
+ */
+/* Portions copyright Broadcom 2008 */
+#ifndef __ASM_ARCH_BCMRING_H
+#define __ASM_ARCH_BCMRING_H
+
+void __init bcmring_amba_init(void);
+void __init bcmring_map_io(void);
+void __init bcmring_init_irq(void);
+
+extern struct sys_timer bcmring_timer;
+#endif
diff --git a/arch/arm/mach-bcmring/csp/Makefile b/arch/arm/mach-bcmring/csp/Makefile
new file mode 100644 (file)
index 0000000..648c037
--- /dev/null
@@ -0,0 +1,3 @@
+obj-y += dmac/
+obj-y += tmr/
+obj-y += chipc/
diff --git a/arch/arm/mach-bcmring/csp/chipc/Makefile b/arch/arm/mach-bcmring/csp/chipc/Makefile
new file mode 100644 (file)
index 0000000..6739527
--- /dev/null
@@ -0,0 +1 @@
+obj-y += chipcHw.o chipcHw_str.o chipcHw_reset.o chipcHw_init.o
diff --git a/arch/arm/mach-bcmring/csp/chipc/chipcHw.c b/arch/arm/mach-bcmring/csp/chipc/chipcHw.c
new file mode 100644 (file)
index 0000000..b3a61d8
--- /dev/null
@@ -0,0 +1,776 @@
+/*****************************************************************************
+* Copyright 2003 - 2008 Broadcom Corporation.  All rights reserved.
+*
+* Unless you and Broadcom execute a separate written software license
+* agreement governing use of this software, this software is licensed to you
+* under the terms of the GNU General Public License version 2, available at
+* http://www.broadcom.com/licenses/GPLv2.php (the "GPL").
+*
+* Notwithstanding the above, under no circumstances may you combine this
+* software in any way with any other Broadcom software provided under a
+* license other than the GPL, without Broadcom's express prior written
+* consent.
+*****************************************************************************/
+
+/****************************************************************************/
+/**
+*  @file    chipcHw.c
+*
+*  @brief   Low level Various CHIP clock controlling routines
+*
+*  @note
+*
+*   These routines provide basic clock controlling functionality only.
+*/
+/****************************************************************************/
+
+/* ---- Include Files ---------------------------------------------------- */
+
+#include <csp/errno.h>
+#include <csp/stdint.h>
+#include <csp/module.h>
+
+#include <mach/csp/chipcHw_def.h>
+#include <mach/csp/chipcHw_inline.h>
+
+#include <csp/reg.h>
+#include <csp/delay.h>
+
+/* ---- Private Constants and Types --------------------------------------- */
+
+/* VPM alignment algorithm uses this */
+#define MAX_PHASE_ADJUST_COUNT         0xFFFF  /* Max number of times allowed to adjust the phase */
+#define MAX_PHASE_ALIGN_ATTEMPTS       10      /* Max number of attempt to align the phase */
+
+/* Local definition of clock type */
+#define PLL_CLOCK                      1       /* PLL Clock */
+#define NON_PLL_CLOCK                  2       /* Divider clock */
+
+static int chipcHw_divide(int num, int denom)
+    __attribute__ ((section(".aramtext")));
+
+/****************************************************************************/
+/**
+*  @brief   Set clock fequency for miscellaneous configurable clocks
+*
+*  This function sets clock frequency
+*
+*  @return  Configured clock frequency in hertz
+*
+*/
+/****************************************************************************/
+chipcHw_freq chipcHw_getClockFrequency(chipcHw_CLOCK_e clock   /*  [ IN ] Configurable clock */
+    ) {
+       volatile uint32_t *pPLLReg = (uint32_t *) 0x0;
+       volatile uint32_t *pClockCtrl = (uint32_t *) 0x0;
+       volatile uint32_t *pDependentClock = (uint32_t *) 0x0;
+       uint32_t vcoFreqPll1Hz = 0;     /* Effective VCO frequency for PLL1 in Hz */
+       uint32_t vcoFreqPll2Hz = 0;     /* Effective VCO frequency for PLL2 in Hz */
+       uint32_t dependentClockType = 0;
+       uint32_t vcoHz = 0;
+
+       /* Get VCO frequencies */
+       if ((pChipcHw->PLLPreDivider & chipcHw_REG_PLL_PREDIVIDER_NDIV_MODE_MASK) != chipcHw_REG_PLL_PREDIVIDER_NDIV_MODE_INTEGER) {
+               uint64_t adjustFreq = 0;
+
+               vcoFreqPll1Hz = chipcHw_XTAL_FREQ_Hz *
+                   chipcHw_divide(chipcHw_REG_PLL_PREDIVIDER_P1, chipcHw_REG_PLL_PREDIVIDER_P2) *
+                   ((pChipcHw->PLLPreDivider & chipcHw_REG_PLL_PREDIVIDER_NDIV_MASK) >>
+                    chipcHw_REG_PLL_PREDIVIDER_NDIV_SHIFT);
+
+               /* Adjusted frequency due to chipcHw_REG_PLL_DIVIDER_NDIV_f_SS */
+               adjustFreq = (uint64_t) chipcHw_XTAL_FREQ_Hz *
+                       (uint64_t) chipcHw_REG_PLL_DIVIDER_NDIV_f_SS *
+                       chipcHw_divide(chipcHw_REG_PLL_PREDIVIDER_P1, (chipcHw_REG_PLL_PREDIVIDER_P2 * (uint64_t) chipcHw_REG_PLL_DIVIDER_FRAC));
+               vcoFreqPll1Hz += (uint32_t) adjustFreq;
+       } else {
+               vcoFreqPll1Hz = chipcHw_XTAL_FREQ_Hz *
+                   chipcHw_divide(chipcHw_REG_PLL_PREDIVIDER_P1, chipcHw_REG_PLL_PREDIVIDER_P2) *
+                   ((pChipcHw->PLLPreDivider & chipcHw_REG_PLL_PREDIVIDER_NDIV_MASK) >>
+                    chipcHw_REG_PLL_PREDIVIDER_NDIV_SHIFT);
+       }
+       vcoFreqPll2Hz =
+           chipcHw_XTAL_FREQ_Hz *
+                chipcHw_divide(chipcHw_REG_PLL_PREDIVIDER_P1, chipcHw_REG_PLL_PREDIVIDER_P2) *
+           ((pChipcHw->PLLPreDivider2 & chipcHw_REG_PLL_PREDIVIDER_NDIV_MASK) >>
+            chipcHw_REG_PLL_PREDIVIDER_NDIV_SHIFT);
+
+       switch (clock) {
+       case chipcHw_CLOCK_DDR:
+               pPLLReg = &pChipcHw->DDRClock;
+               vcoHz = vcoFreqPll1Hz;
+               break;
+       case chipcHw_CLOCK_ARM:
+               pPLLReg = &pChipcHw->ARMClock;
+               vcoHz = vcoFreqPll1Hz;
+               break;
+       case chipcHw_CLOCK_ESW:
+               pPLLReg = &pChipcHw->ESWClock;
+               vcoHz = vcoFreqPll1Hz;
+               break;
+       case chipcHw_CLOCK_VPM:
+               pPLLReg = &pChipcHw->VPMClock;
+               vcoHz = vcoFreqPll1Hz;
+               break;
+       case chipcHw_CLOCK_ESW125:
+               pPLLReg = &pChipcHw->ESW125Clock;
+               vcoHz = vcoFreqPll1Hz;
+               break;
+       case chipcHw_CLOCK_UART:
+               pPLLReg = &pChipcHw->UARTClock;
+               vcoHz = vcoFreqPll1Hz;
+               break;
+       case chipcHw_CLOCK_SDIO0:
+               pPLLReg = &pChipcHw->SDIO0Clock;
+               vcoHz = vcoFreqPll1Hz;
+               break;
+       case chipcHw_CLOCK_SDIO1:
+               pPLLReg = &pChipcHw->SDIO1Clock;
+               vcoHz = vcoFreqPll1Hz;
+               break;
+       case chipcHw_CLOCK_SPI:
+               pPLLReg = &pChipcHw->SPIClock;
+               vcoHz = vcoFreqPll1Hz;
+               break;
+       case chipcHw_CLOCK_ETM:
+               pPLLReg = &pChipcHw->ETMClock;
+               vcoHz = vcoFreqPll1Hz;
+               break;
+       case chipcHw_CLOCK_USB:
+               pPLLReg = &pChipcHw->USBClock;
+               vcoHz = vcoFreqPll2Hz;
+               break;
+       case chipcHw_CLOCK_LCD:
+               pPLLReg = &pChipcHw->LCDClock;
+               vcoHz = vcoFreqPll2Hz;
+               break;
+       case chipcHw_CLOCK_APM:
+               pPLLReg = &pChipcHw->APMClock;
+               vcoHz = vcoFreqPll2Hz;
+               break;
+       case chipcHw_CLOCK_BUS:
+               pClockCtrl = &pChipcHw->ACLKClock;
+               pDependentClock = &pChipcHw->ARMClock;
+               vcoHz = vcoFreqPll1Hz;
+               dependentClockType = PLL_CLOCK;
+               break;
+       case chipcHw_CLOCK_OTP:
+               pClockCtrl = &pChipcHw->OTPClock;
+               break;
+       case chipcHw_CLOCK_I2C:
+               pClockCtrl = &pChipcHw->I2CClock;
+               break;
+       case chipcHw_CLOCK_I2S0:
+               pClockCtrl = &pChipcHw->I2S0Clock;
+               break;
+       case chipcHw_CLOCK_RTBUS:
+               pClockCtrl = &pChipcHw->RTBUSClock;
+               pDependentClock = &pChipcHw->ACLKClock;
+               dependentClockType = NON_PLL_CLOCK;
+               break;
+       case chipcHw_CLOCK_APM100:
+               pClockCtrl = &pChipcHw->APM100Clock;
+               pDependentClock = &pChipcHw->APMClock;
+               vcoHz = vcoFreqPll2Hz;
+               dependentClockType = PLL_CLOCK;
+               break;
+       case chipcHw_CLOCK_TSC:
+               pClockCtrl = &pChipcHw->TSCClock;
+               break;
+       case chipcHw_CLOCK_LED:
+               pClockCtrl = &pChipcHw->LEDClock;
+               break;
+       case chipcHw_CLOCK_I2S1:
+               pClockCtrl = &pChipcHw->I2S1Clock;
+               break;
+       }
+
+       if (pPLLReg) {
+               /* Obtain PLL clock frequency */
+               if (*pPLLReg & chipcHw_REG_PLL_CLOCK_BYPASS_SELECT) {
+                       /* Return crystal clock frequency when bypassed */
+                       return chipcHw_XTAL_FREQ_Hz;
+               } else if (clock == chipcHw_CLOCK_DDR) {
+                       /* DDR frequency is configured in PLLDivider register */
+                       return chipcHw_divide (vcoHz, (((pChipcHw->PLLDivider & 0xFF000000) >> 24) ? ((pChipcHw->PLLDivider & 0xFF000000) >> 24) : 256));
+               } else {
+                       /* From chip revision number B0, LCD clock is internally divided by 2 */
+                       if ((pPLLReg == &pChipcHw->LCDClock) && (chipcHw_getChipRevisionNumber() != chipcHw_REV_NUMBER_A0)) {
+                               vcoHz >>= 1;
+                       }
+                       /* Obtain PLL clock frequency using VCO dividers */
+                       return chipcHw_divide(vcoHz, ((*pPLLReg & chipcHw_REG_PLL_CLOCK_MDIV_MASK) ? (*pPLLReg & chipcHw_REG_PLL_CLOCK_MDIV_MASK) : 256));
+               }
+       } else if (pClockCtrl) {
+               /* Obtain divider clock frequency */
+               uint32_t div;
+               uint32_t freq = 0;
+
+               if (*pClockCtrl & chipcHw_REG_DIV_CLOCK_BYPASS_SELECT) {
+                       /* Return crystal clock frequency when bypassed */
+                       return chipcHw_XTAL_FREQ_Hz;
+               } else if (pDependentClock) {
+                       /* Identify the dependent clock frequency */
+                       switch (dependentClockType) {
+                       case PLL_CLOCK:
+                               if (*pDependentClock & chipcHw_REG_PLL_CLOCK_BYPASS_SELECT) {
+                                       /* Use crystal clock frequency when dependent PLL clock is bypassed */
+                                       freq = chipcHw_XTAL_FREQ_Hz;
+                               } else {
+                                       /* Obtain PLL clock frequency using VCO dividers */
+                                       div = *pDependentClock & chipcHw_REG_PLL_CLOCK_MDIV_MASK;
+                                       freq = div ? chipcHw_divide(vcoHz, div) : 0;
+                               }
+                               break;
+                       case NON_PLL_CLOCK:
+                               if (pDependentClock == (uint32_t *) &pChipcHw->ACLKClock) {
+                                       freq = chipcHw_getClockFrequency (chipcHw_CLOCK_BUS);
+                               } else {
+                                       if (*pDependentClock & chipcHw_REG_DIV_CLOCK_BYPASS_SELECT) {
+                                               /* Use crystal clock frequency when dependent divider clock is bypassed */
+                                               freq = chipcHw_XTAL_FREQ_Hz;
+                                       } else {
+                                               /* Obtain divider clock frequency using XTAL dividers */
+                                               div = *pDependentClock & chipcHw_REG_DIV_CLOCK_DIV_MASK;
+                                               freq = chipcHw_divide (chipcHw_XTAL_FREQ_Hz, (div ? div : 256));
+                                       }
+                               }
+                               break;
+                       }
+               } else {
+                       /* Dependent on crystal clock */
+                       freq = chipcHw_XTAL_FREQ_Hz;
+               }
+
+               div = *pClockCtrl & chipcHw_REG_DIV_CLOCK_DIV_MASK;
+               return chipcHw_divide(freq, (div ? div : 256));
+       }
+       return 0;
+}
+
+/****************************************************************************/
+/**
+*  @brief   Set clock fequency for miscellaneous configurable clocks
+*
+*  This function sets clock frequency
+*
+*  @return  Configured clock frequency in Hz
+*
+*/
+/****************************************************************************/
+chipcHw_freq chipcHw_setClockFrequency(chipcHw_CLOCK_e clock,  /*  [ IN ] Configurable clock */
+                                      uint32_t freq    /*  [ IN ] Clock frequency in Hz */
+    ) {
+       volatile uint32_t *pPLLReg = (uint32_t *) 0x0;
+       volatile uint32_t *pClockCtrl = (uint32_t *) 0x0;
+       volatile uint32_t *pDependentClock = (uint32_t *) 0x0;
+       uint32_t vcoFreqPll1Hz = 0;     /* Effective VCO frequency for PLL1 in Hz */
+       uint32_t desVcoFreqPll1Hz = 0;  /* Desired VCO frequency for PLL1 in Hz */
+       uint32_t vcoFreqPll2Hz = 0;     /* Effective VCO frequency for PLL2 in Hz */
+       uint32_t dependentClockType = 0;
+       uint32_t vcoHz = 0;
+       uint32_t desVcoHz = 0;
+
+       /* Get VCO frequencies */
+       if ((pChipcHw->PLLPreDivider & chipcHw_REG_PLL_PREDIVIDER_NDIV_MODE_MASK) != chipcHw_REG_PLL_PREDIVIDER_NDIV_MODE_INTEGER) {
+               uint64_t adjustFreq = 0;
+
+               vcoFreqPll1Hz = chipcHw_XTAL_FREQ_Hz *
+                   chipcHw_divide(chipcHw_REG_PLL_PREDIVIDER_P1, chipcHw_REG_PLL_PREDIVIDER_P2) *
+                   ((pChipcHw->PLLPreDivider & chipcHw_REG_PLL_PREDIVIDER_NDIV_MASK) >>
+                    chipcHw_REG_PLL_PREDIVIDER_NDIV_SHIFT);
+
+               /* Adjusted frequency due to chipcHw_REG_PLL_DIVIDER_NDIV_f_SS */
+               adjustFreq = (uint64_t) chipcHw_XTAL_FREQ_Hz *
+                       (uint64_t) chipcHw_REG_PLL_DIVIDER_NDIV_f_SS *
+                       chipcHw_divide(chipcHw_REG_PLL_PREDIVIDER_P1, (chipcHw_REG_PLL_PREDIVIDER_P2 * (uint64_t) chipcHw_REG_PLL_DIVIDER_FRAC));
+               vcoFreqPll1Hz += (uint32_t) adjustFreq;
+
+               /* Desired VCO frequency */
+               desVcoFreqPll1Hz = chipcHw_XTAL_FREQ_Hz *
+                   chipcHw_divide(chipcHw_REG_PLL_PREDIVIDER_P1, chipcHw_REG_PLL_PREDIVIDER_P2) *
+                   (((pChipcHw->PLLPreDivider & chipcHw_REG_PLL_PREDIVIDER_NDIV_MASK) >>
+                     chipcHw_REG_PLL_PREDIVIDER_NDIV_SHIFT) + 1);
+       } else {
+               vcoFreqPll1Hz = desVcoFreqPll1Hz = chipcHw_XTAL_FREQ_Hz *
+                   chipcHw_divide(chipcHw_REG_PLL_PREDIVIDER_P1, chipcHw_REG_PLL_PREDIVIDER_P2) *
+                   ((pChipcHw->PLLPreDivider & chipcHw_REG_PLL_PREDIVIDER_NDIV_MASK) >>
+                    chipcHw_REG_PLL_PREDIVIDER_NDIV_SHIFT);
+       }
+       vcoFreqPll2Hz = chipcHw_XTAL_FREQ_Hz * chipcHw_divide(chipcHw_REG_PLL_PREDIVIDER_P1, chipcHw_REG_PLL_PREDIVIDER_P2) *
+           ((pChipcHw->PLLPreDivider2 & chipcHw_REG_PLL_PREDIVIDER_NDIV_MASK) >>
+            chipcHw_REG_PLL_PREDIVIDER_NDIV_SHIFT);
+
+       switch (clock) {
+       case chipcHw_CLOCK_DDR:
+               /* Configure the DDR_ctrl:BUS ratio settings */
+               {
+                       REG_LOCAL_IRQ_SAVE;
+                       /* Dvide DDR_phy by two to obtain DDR_ctrl clock */
+                       pChipcHw->DDRClock = (pChipcHw->DDRClock & ~chipcHw_REG_PLL_CLOCK_TO_BUS_RATIO_MASK) | ((((freq / 2) / chipcHw_getClockFrequency(chipcHw_CLOCK_BUS)) - 1)
+                               << chipcHw_REG_PLL_CLOCK_TO_BUS_RATIO_SHIFT);
+                       REG_LOCAL_IRQ_RESTORE;
+               }
+               pPLLReg = &pChipcHw->DDRClock;
+               vcoHz = vcoFreqPll1Hz;
+               desVcoHz = desVcoFreqPll1Hz;
+               break;
+       case chipcHw_CLOCK_ARM:
+               pPLLReg = &pChipcHw->ARMClock;
+               vcoHz = vcoFreqPll1Hz;
+               desVcoHz = desVcoFreqPll1Hz;
+               break;
+       case chipcHw_CLOCK_ESW:
+               pPLLReg = &pChipcHw->ESWClock;
+               vcoHz = vcoFreqPll1Hz;
+               desVcoHz = desVcoFreqPll1Hz;
+               break;
+       case chipcHw_CLOCK_VPM:
+               /* Configure the VPM:BUS ratio settings */
+               {
+                       REG_LOCAL_IRQ_SAVE;
+                       pChipcHw->VPMClock = (pChipcHw->VPMClock & ~chipcHw_REG_PLL_CLOCK_TO_BUS_RATIO_MASK) | ((chipcHw_divide (freq, chipcHw_getClockFrequency(chipcHw_CLOCK_BUS)) - 1)
+                               << chipcHw_REG_PLL_CLOCK_TO_BUS_RATIO_SHIFT);
+                       REG_LOCAL_IRQ_RESTORE;
+               }
+               pPLLReg = &pChipcHw->VPMClock;
+               vcoHz = vcoFreqPll1Hz;
+               desVcoHz = desVcoFreqPll1Hz;
+               break;
+       case chipcHw_CLOCK_ESW125:
+               pPLLReg = &pChipcHw->ESW125Clock;
+               vcoHz = vcoFreqPll1Hz;
+               desVcoHz = desVcoFreqPll1Hz;
+               break;
+       case chipcHw_CLOCK_UART:
+               pPLLReg = &pChipcHw->UARTClock;
+               vcoHz = vcoFreqPll1Hz;
+               desVcoHz = desVcoFreqPll1Hz;
+               break;
+       case chipcHw_CLOCK_SDIO0:
+               pPLLReg = &pChipcHw->SDIO0Clock;
+               vcoHz = vcoFreqPll1Hz;
+               desVcoHz = desVcoFreqPll1Hz;
+               break;
+       case chipcHw_CLOCK_SDIO1:
+               pPLLReg = &pChipcHw->SDIO1Clock;
+               vcoHz = vcoFreqPll1Hz;
+               desVcoHz = desVcoFreqPll1Hz;
+               break;
+       case chipcHw_CLOCK_SPI:
+               pPLLReg = &pChipcHw->SPIClock;
+               vcoHz = vcoFreqPll1Hz;
+               desVcoHz = desVcoFreqPll1Hz;
+               break;
+       case chipcHw_CLOCK_ETM:
+               pPLLReg = &pChipcHw->ETMClock;
+               vcoHz = vcoFreqPll1Hz;
+               desVcoHz = desVcoFreqPll1Hz;
+               break;
+       case chipcHw_CLOCK_USB:
+               pPLLReg = &pChipcHw->USBClock;
+               vcoHz = vcoFreqPll2Hz;
+               desVcoHz = vcoFreqPll2Hz;
+               break;
+       case chipcHw_CLOCK_LCD:
+               pPLLReg = &pChipcHw->LCDClock;
+               vcoHz = vcoFreqPll2Hz;
+               desVcoHz = vcoFreqPll2Hz;
+               break;
+       case chipcHw_CLOCK_APM:
+               pPLLReg = &pChipcHw->APMClock;
+               vcoHz = vcoFreqPll2Hz;
+               desVcoHz = vcoFreqPll2Hz;
+               break;
+       case chipcHw_CLOCK_BUS:
+               pClockCtrl = &pChipcHw->ACLKClock;
+               pDependentClock = &pChipcHw->ARMClock;
+               vcoHz = vcoFreqPll1Hz;
+               desVcoHz = desVcoFreqPll1Hz;
+               dependentClockType = PLL_CLOCK;
+               break;
+       case chipcHw_CLOCK_OTP:
+               pClockCtrl = &pChipcHw->OTPClock;
+               break;
+       case chipcHw_CLOCK_I2C:
+               pClockCtrl = &pChipcHw->I2CClock;
+               break;
+       case chipcHw_CLOCK_I2S0:
+               pClockCtrl = &pChipcHw->I2S0Clock;
+               break;
+       case chipcHw_CLOCK_RTBUS:
+               pClockCtrl = &pChipcHw->RTBUSClock;
+               pDependentClock = &pChipcHw->ACLKClock;
+               dependentClockType = NON_PLL_CLOCK;
+               break;
+       case chipcHw_CLOCK_APM100:
+               pClockCtrl = &pChipcHw->APM100Clock;
+               pDependentClock = &pChipcHw->APMClock;
+               vcoHz = vcoFreqPll2Hz;
+               desVcoHz = vcoFreqPll2Hz;
+               dependentClockType = PLL_CLOCK;
+               break;
+       case chipcHw_CLOCK_TSC:
+               pClockCtrl = &pChipcHw->TSCClock;
+               break;
+       case chipcHw_CLOCK_LED:
+               pClockCtrl = &pChipcHw->LEDClock;
+               break;
+       case chipcHw_CLOCK_I2S1:
+               pClockCtrl = &pChipcHw->I2S1Clock;
+               break;
+       }
+
+       if (pPLLReg) {
+               /* Select XTAL as bypass source */
+               reg32_modify_and(pPLLReg, ~chipcHw_REG_PLL_CLOCK_SOURCE_GPIO);
+               reg32_modify_or(pPLLReg, chipcHw_REG_PLL_CLOCK_BYPASS_SELECT);
+               /* For DDR settings use only the PLL divider clock */
+               if (pPLLReg == &pChipcHw->DDRClock) {
+                       /* Set M1DIV for PLL1, which controls the DDR clock */
+                       reg32_write(&pChipcHw->PLLDivider, (pChipcHw->PLLDivider & 0x00FFFFFF) | ((chipcHw_REG_PLL_DIVIDER_MDIV (desVcoHz, freq)) << 24));
+                       /* Calculate expected frequency */
+                       freq = chipcHw_divide(vcoHz, (((pChipcHw->PLLDivider & 0xFF000000) >> 24) ? ((pChipcHw->PLLDivider & 0xFF000000) >> 24) : 256));
+               } else {
+                       /* From chip revision number B0, LCD clock is internally divided by 2 */
+                       if ((pPLLReg == &pChipcHw->LCDClock) && (chipcHw_getChipRevisionNumber() != chipcHw_REV_NUMBER_A0)) {
+                               desVcoHz >>= 1;
+                               vcoHz >>= 1;
+                       }
+                       /* Set MDIV to change the frequency */
+                       reg32_modify_and(pPLLReg, ~(chipcHw_REG_PLL_CLOCK_MDIV_MASK));
+                       reg32_modify_or(pPLLReg, chipcHw_REG_PLL_DIVIDER_MDIV(desVcoHz, freq));
+                       /* Calculate expected frequency */
+                       freq = chipcHw_divide(vcoHz, ((*(pPLLReg) & chipcHw_REG_PLL_CLOCK_MDIV_MASK) ? (*(pPLLReg) & chipcHw_REG_PLL_CLOCK_MDIV_MASK) : 256));
+               }
+               /* Wait for for atleast 200ns as per the protocol to change frequency */
+               udelay(1);
+               /* Do not bypass */
+               reg32_modify_and(pPLLReg, ~chipcHw_REG_PLL_CLOCK_BYPASS_SELECT);
+               /* Return the configured frequency */
+               return freq;
+       } else if (pClockCtrl) {
+               uint32_t divider = 0;
+
+               /* Divider clock should not be bypassed  */
+               reg32_modify_and(pClockCtrl,
+                                ~chipcHw_REG_DIV_CLOCK_BYPASS_SELECT);
+
+               /* Identify the clock source */
+               if (pDependentClock) {
+                       switch (dependentClockType) {
+                       case PLL_CLOCK:
+                               divider = chipcHw_divide(chipcHw_divide (desVcoHz, (*pDependentClock & chipcHw_REG_PLL_CLOCK_MDIV_MASK)), freq);
+                               break;
+                       case NON_PLL_CLOCK:
+                               {
+                                       uint32_t sourceClock = 0;
+
+                                       if (pDependentClock == (uint32_t *) &pChipcHw->ACLKClock) {
+                                               sourceClock = chipcHw_getClockFrequency (chipcHw_CLOCK_BUS);
+                                       } else {
+                                               uint32_t div = *pDependentClock & chipcHw_REG_DIV_CLOCK_DIV_MASK;
+                                               sourceClock = chipcHw_divide (chipcHw_XTAL_FREQ_Hz, ((div) ? div : 256));
+                                       }
+                                       divider = chipcHw_divide(sourceClock, freq);
+                               }
+                               break;
+                       }
+               } else {
+                       divider = chipcHw_divide(chipcHw_XTAL_FREQ_Hz, freq);
+               }
+
+               if (divider) {
+                       REG_LOCAL_IRQ_SAVE;
+                       /* Set the divider to obtain the required frequency */
+                       *pClockCtrl = (*pClockCtrl & (~chipcHw_REG_DIV_CLOCK_DIV_MASK)) | (((divider > 256) ? chipcHw_REG_DIV_CLOCK_DIV_256 : divider) & chipcHw_REG_DIV_CLOCK_DIV_MASK);
+                       REG_LOCAL_IRQ_RESTORE;
+                       return freq;
+               }
+       }
+
+       return 0;
+}
+
+EXPORT_SYMBOL(chipcHw_setClockFrequency);
+
+/****************************************************************************/
+/**
+*  @brief   Set VPM clock in sync with BUS clock for Chip Rev #A0
+*
+*  This function does the phase adjustment between VPM and BUS clock
+*
+*  @return >= 0 : On success (# of adjustment required)
+*            -1 : On failure
+*
+*/
+/****************************************************************************/
+static int vpmPhaseAlignA0(void)
+{
+       uint32_t phaseControl;
+       uint32_t phaseValue;
+       uint32_t prevPhaseComp;
+       int iter = 0;
+       int adjustCount = 0;
+       int count = 0;
+
+       for (iter = 0; (iter < MAX_PHASE_ALIGN_ATTEMPTS) && (adjustCount < MAX_PHASE_ADJUST_COUNT); iter++) {
+               phaseControl = (pChipcHw->VPMClock & chipcHw_REG_PLL_CLOCK_PHASE_CONTROL_MASK) >> chipcHw_REG_PLL_CLOCK_PHASE_CONTROL_SHIFT;
+               phaseValue = 0;
+               prevPhaseComp = 0;
+
+               /* Step 1: Look for falling PH_COMP transition */
+
+               /* Read the contents of VPM Clock resgister */
+               phaseValue = pChipcHw->VPMClock;
+               do {
+                       /* Store previous value of phase comparator */
+                       prevPhaseComp = phaseValue & chipcHw_REG_PLL_CLOCK_PHASE_COMP;
+                       /* Change the value of PH_CTRL. */
+                       reg32_write(&pChipcHw->VPMClock, (pChipcHw->VPMClock & (~chipcHw_REG_PLL_CLOCK_PHASE_CONTROL_MASK)) | (phaseControl << chipcHw_REG_PLL_CLOCK_PHASE_CONTROL_SHIFT));
+                       /* Wait atleast 20 ns */
+                       udelay(1);
+                       /* Toggle the LOAD_CH after phase control is written. */
+                       pChipcHw->VPMClock ^= chipcHw_REG_PLL_CLOCK_PHASE_UPDATE_ENABLE;
+                       /* Read the contents of  VPM Clock resgister. */
+                       phaseValue = pChipcHw->VPMClock;
+
+                       if ((phaseValue & chipcHw_REG_PLL_CLOCK_PHASE_COMP) == 0x0) {
+                               phaseControl = (0x3F & (phaseControl - 1));
+                       } else {
+                               /* Increment to the Phase count value for next write, if Phase is not stable. */
+                               phaseControl = (0x3F & (phaseControl + 1));
+                       }
+                       /* Count number of adjustment made */
+                       adjustCount++;
+               } while (((prevPhaseComp == (phaseValue & chipcHw_REG_PLL_CLOCK_PHASE_COMP)) || /* Look for a transition */
+                         ((phaseValue & chipcHw_REG_PLL_CLOCK_PHASE_COMP) != 0x0)) &&  /* Look for a falling edge */
+                        (adjustCount < MAX_PHASE_ADJUST_COUNT) /* Do not exceed the limit while trying */
+                   );
+
+               if (adjustCount >= MAX_PHASE_ADJUST_COUNT) {
+                       /* Failed to align VPM phase after MAX_PHASE_ADJUST_COUNT tries */
+                       return -1;
+               }
+
+               /* Step 2: Keep moving forward to make sure falling PH_COMP transition was valid */
+
+               for (count = 0; (count < 5) && ((phaseValue & chipcHw_REG_PLL_CLOCK_PHASE_COMP) == 0); count++) {
+                       phaseControl = (0x3F & (phaseControl + 1));
+                       reg32_write(&pChipcHw->VPMClock, (pChipcHw->VPMClock & (~chipcHw_REG_PLL_CLOCK_PHASE_CONTROL_MASK)) | (phaseControl << chipcHw_REG_PLL_CLOCK_PHASE_CONTROL_SHIFT));
+                       /* Wait atleast 20 ns */
+                       udelay(1);
+                       /* Toggle the LOAD_CH after phase control is written. */
+                       pChipcHw->VPMClock ^= chipcHw_REG_PLL_CLOCK_PHASE_UPDATE_ENABLE;
+                       phaseValue = pChipcHw->VPMClock;
+                       /* Count number of adjustment made */
+                       adjustCount++;
+               }
+
+               if (adjustCount >= MAX_PHASE_ADJUST_COUNT) {
+                       /* Failed to align VPM phase after MAX_PHASE_ADJUST_COUNT tries */
+                       return -1;
+               }
+
+               if (count != 5) {
+                       /* Detected false transition */
+                       continue;
+               }
+
+               /* Step 3: Keep moving backward to make sure falling PH_COMP transition was stable */
+
+               for (count = 0; (count < 3) && ((phaseValue & chipcHw_REG_PLL_CLOCK_PHASE_COMP) == 0); count++) {
+                       phaseControl = (0x3F & (phaseControl - 1));
+                       reg32_write(&pChipcHw->VPMClock, (pChipcHw->VPMClock & (~chipcHw_REG_PLL_CLOCK_PHASE_CONTROL_MASK)) | (phaseControl << chipcHw_REG_PLL_CLOCK_PHASE_CONTROL_SHIFT));
+                       /* Wait atleast 20 ns */
+                       udelay(1);
+                       /* Toggle the LOAD_CH after phase control is written. */
+                       pChipcHw->VPMClock ^= chipcHw_REG_PLL_CLOCK_PHASE_UPDATE_ENABLE;
+                       phaseValue = pChipcHw->VPMClock;
+                       /* Count number of adjustment made */
+                       adjustCount++;
+               }
+
+               if (adjustCount >= MAX_PHASE_ADJUST_COUNT) {
+                       /* Failed to align VPM phase after MAX_PHASE_ADJUST_COUNT tries */
+                       return -1;
+               }
+
+               if (count != 3) {
+                       /* Detected noisy transition */
+                       continue;
+               }
+
+               /* Step 4: Keep moving backward before the original transition took place. */
+
+               for (count = 0; (count < 5); count++) {
+                       phaseControl = (0x3F & (phaseControl - 1));
+                       reg32_write(&pChipcHw->VPMClock, (pChipcHw->VPMClock & (~chipcHw_REG_PLL_CLOCK_PHASE_CONTROL_MASK)) | (phaseControl << chipcHw_REG_PLL_CLOCK_PHASE_CONTROL_SHIFT));
+                       /* Wait atleast 20 ns */
+                       udelay(1);
+                       /* Toggle the LOAD_CH after phase control is written. */
+                       pChipcHw->VPMClock ^= chipcHw_REG_PLL_CLOCK_PHASE_UPDATE_ENABLE;
+                       phaseValue = pChipcHw->VPMClock;
+                       /* Count number of adjustment made */
+                       adjustCount++;
+               }
+
+               if (adjustCount >= MAX_PHASE_ADJUST_COUNT) {
+                       /* Failed to align VPM phase after MAX_PHASE_ADJUST_COUNT tries */
+                       return -1;
+               }
+
+               if ((phaseValue & chipcHw_REG_PLL_CLOCK_PHASE_COMP) == 0) {
+                       /* Detected false transition */
+                       continue;
+               }
+
+               /* Step 5: Re discover the valid transition */
+
+               do {
+                       /* Store previous value of phase comparator */
+                       prevPhaseComp = phaseValue;
+                       /* Change the value of PH_CTRL. */
+                       reg32_write(&pChipcHw->VPMClock, (pChipcHw->VPMClock & (~chipcHw_REG_PLL_CLOCK_PHASE_CONTROL_MASK)) | (phaseControl << chipcHw_REG_PLL_CLOCK_PHASE_CONTROL_SHIFT));
+                       /* Wait atleast 20 ns */
+                       udelay(1);
+                       /* Toggle the LOAD_CH after phase control is written. */
+                       pChipcHw->VPMClock ^=
+                           chipcHw_REG_PLL_CLOCK_PHASE_UPDATE_ENABLE;
+                       /* Read the contents of  VPM Clock resgister. */
+                       phaseValue = pChipcHw->VPMClock;
+
+                       if ((phaseValue & chipcHw_REG_PLL_CLOCK_PHASE_COMP) == 0x0) {
+                               phaseControl = (0x3F & (phaseControl - 1));
+                       } else {
+                               /* Increment to the Phase count value for next write, if Phase is not stable. */
+                               phaseControl = (0x3F & (phaseControl + 1));
+                       }
+
+                       /* Count number of adjustment made */
+                       adjustCount++;
+               } while (((prevPhaseComp == (phaseValue & chipcHw_REG_PLL_CLOCK_PHASE_COMP)) || ((phaseValue & chipcHw_REG_PLL_CLOCK_PHASE_COMP) != 0x0)) && (adjustCount < MAX_PHASE_ADJUST_COUNT));
+
+               if (adjustCount >= MAX_PHASE_ADJUST_COUNT) {
+                       /* Failed to align VPM phase after MAX_PHASE_ADJUST_COUNT tries  */
+                       return -1;
+               } else {
+                       /* Valid phase must have detected */
+                       break;
+               }
+       }
+
+       /* For VPM Phase should be perfectly aligned. */
+       phaseControl = (((pChipcHw->VPMClock >> chipcHw_REG_PLL_CLOCK_PHASE_CONTROL_SHIFT) - 1) & 0x3F);
+       {
+               REG_LOCAL_IRQ_SAVE;
+
+               pChipcHw->VPMClock = (pChipcHw->VPMClock & ~chipcHw_REG_PLL_CLOCK_PHASE_CONTROL_MASK) | (phaseControl << chipcHw_REG_PLL_CLOCK_PHASE_CONTROL_SHIFT);
+               /* Load new phase value */
+               pChipcHw->VPMClock ^= chipcHw_REG_PLL_CLOCK_PHASE_UPDATE_ENABLE;
+
+               REG_LOCAL_IRQ_RESTORE;
+       }
+       /* Return the status */
+       return (int)adjustCount;
+}
+
+/****************************************************************************/
+/**
+*  @brief   Set VPM clock in sync with BUS clock
+*
+*  This function does the phase adjustment between VPM and BUS clock
+*
+*  @return >= 0 : On success (# of adjustment required)
+*            -1 : On failure
+*
+*/
+/****************************************************************************/
+int chipcHw_vpmPhaseAlign(void)
+{
+
+       if (chipcHw_getChipRevisionNumber() == chipcHw_REV_NUMBER_A0) {
+               return vpmPhaseAlignA0();
+       } else {
+               uint32_t phaseControl = chipcHw_getVpmPhaseControl();
+               uint32_t phaseValue = 0;
+               int adjustCount = 0;
+
+               /* Disable VPM access */
+               pChipcHw->Spare1 &= ~chipcHw_REG_SPARE1_VPM_BUS_ACCESS_ENABLE;
+               /* Disable HW VPM phase alignment  */
+               chipcHw_vpmHwPhaseAlignDisable();
+               /* Enable SW VPM phase alignment  */
+               chipcHw_vpmSwPhaseAlignEnable();
+               /* Adjust VPM phase */
+               while (adjustCount < MAX_PHASE_ADJUST_COUNT) {
+                       phaseValue = chipcHw_getVpmHwPhaseAlignStatus();
+
+                       /* Adjust phase control value */
+                       if (phaseValue > 0xF) {
+                               /* Increment phase control value */
+                               phaseControl++;
+                       } else if (phaseValue < 0xF) {
+                               /* Decrement phase control value */
+                               phaseControl--;
+                       } else {
+                               /* Enable VPM access */
+                               pChipcHw->Spare1 |= chipcHw_REG_SPARE1_VPM_BUS_ACCESS_ENABLE;
+                               /* Return adjust count */
+                               return adjustCount;
+                       }
+                       /* Change the value of PH_CTRL. */
+                       reg32_write(&pChipcHw->VPMClock, (pChipcHw->VPMClock & (~chipcHw_REG_PLL_CLOCK_PHASE_CONTROL_MASK)) | (phaseControl << chipcHw_REG_PLL_CLOCK_PHASE_CONTROL_SHIFT));
+                       /* Wait atleast 20 ns */
+                       udelay(1);
+                       /* Toggle the LOAD_CH after phase control is written. */
+                       pChipcHw->VPMClock ^= chipcHw_REG_PLL_CLOCK_PHASE_UPDATE_ENABLE;
+                       /* Count adjustment */
+                       adjustCount++;
+               }
+       }
+
+       /* Disable VPM access */
+       pChipcHw->Spare1 &= ~chipcHw_REG_SPARE1_VPM_BUS_ACCESS_ENABLE;
+       return -1;
+}
+
+/****************************************************************************/
+/**
+*  @brief   Local Divide function
+*
+*  This function does the divide
+*
+*  @return divide value
+*
+*/
+/****************************************************************************/
+static int chipcHw_divide(int num, int denom)
+{
+       int r;
+       int t = 1;
+
+       /* Shift denom and t up to the largest value to optimize algorithm */
+       /* t contains the units of each divide */
+       while ((denom & 0x40000000) == 0) {     /* fails if denom=0 */
+               denom = denom << 1;
+               t = t << 1;
+       }
+
+       /* Intialize the result */
+       r = 0;
+
+       do {
+               /* Determine if there exists a positive remainder */
+               if ((num - denom) >= 0) {
+                       /* Accumlate t to the result and calculate a new remainder */
+                       num = num - denom;
+                       r = r + t;
+               }
+               /* Continue to shift denom and shift t down to 0 */
+               denom = denom >> 1;
+               t = t >> 1;
+       } while (t != 0);
+
+       return r;
+}
diff --git a/arch/arm/mach-bcmring/csp/chipc/chipcHw_init.c b/arch/arm/mach-bcmring/csp/chipc/chipcHw_init.c
new file mode 100644 (file)
index 0000000..367df75
--- /dev/null
@@ -0,0 +1,293 @@
+/*****************************************************************************
+* Copyright 2003 - 2008 Broadcom Corporation.  All rights reserved.
+*
+* Unless you and Broadcom execute a separate written software license
+* agreement governing use of this software, this software is licensed to you
+* under the terms of the GNU General Public License version 2, available at
+* http://www.broadcom.com/licenses/GPLv2.php (the "GPL").
+*
+* Notwithstanding the above, under no circumstances may you combine this
+* software in any way with any other Broadcom software provided under a
+* license other than the GPL, without Broadcom's express prior written
+* consent.
+*****************************************************************************/
+
+/****************************************************************************/
+/**
+*  @file    chipcHw_init.c
+*
+*  @brief   Low level CHIPC PLL configuration functions
+*
+*  @note
+*
+*   These routines provide basic PLL controlling functionality only.
+*/
+/****************************************************************************/
+
+/* ---- Include Files ---------------------------------------------------- */
+
+#include <csp/errno.h>
+#include <csp/stdint.h>
+#include <csp/module.h>
+
+#include <mach/csp/chipcHw_def.h>
+#include <mach/csp/chipcHw_inline.h>
+
+#include <csp/reg.h>
+#include <csp/delay.h>
+/* ---- Private Constants and Types --------------------------------------- */
+
+/*
+    Calculation for NDIV_i to obtain VCO frequency
+    -----------------------------------------------
+
+       Freq_vco = Freq_ref * (P2 / P1) * (PLL_NDIV_i + PLL_NDIV_f)
+       for Freq_vco = VCO_FREQ_MHz
+               Freq_ref = chipcHw_XTAL_FREQ_Hz
+               PLL_P1 = PLL_P2 = 1
+               and
+               PLL_NDIV_f = 0
+
+       We get:
+               PLL_NDIV_i = Freq_vco / Freq_ref = VCO_FREQ_MHz / chipcHw_XTAL_FREQ_Hz
+
+    Calculation for PLL MDIV to obtain frequency Freq_x for channel x
+    -----------------------------------------------------------------
+               Freq_x = chipcHw_XTAL_FREQ_Hz * PLL_NDIV_i / PLL_MDIV_x = VCO_FREQ_MHz / PLL_MDIV_x
+
+               PLL_MDIV_x = VCO_FREQ_MHz / Freq_x
+*/
+
+/* ---- Private Variables ------------------------------------------------- */
+/****************************************************************************/
+/**
+*  @brief  Initializes the PLL2
+*
+*  This function initializes the PLL2
+*
+*/
+/****************************************************************************/
+void chipcHw_pll2Enable(uint32_t vcoFreqHz)
+{
+       uint32_t pllPreDivider2 = 0;
+
+       {
+               REG_LOCAL_IRQ_SAVE;
+               pChipcHw->PLLConfig2 =
+                   chipcHw_REG_PLL_CONFIG_D_RESET |
+                   chipcHw_REG_PLL_CONFIG_A_RESET;
+
+               pllPreDivider2 = chipcHw_REG_PLL_PREDIVIDER_POWER_DOWN |
+                   chipcHw_REG_PLL_PREDIVIDER_NDIV_MODE_INTEGER |
+                   (chipcHw_REG_PLL_PREDIVIDER_NDIV_i(vcoFreqHz) <<
+                    chipcHw_REG_PLL_PREDIVIDER_NDIV_SHIFT) |
+                   (chipcHw_REG_PLL_PREDIVIDER_P1 <<
+                    chipcHw_REG_PLL_PREDIVIDER_P1_SHIFT) |
+                   (chipcHw_REG_PLL_PREDIVIDER_P2 <<
+                    chipcHw_REG_PLL_PREDIVIDER_P2_SHIFT);
+
+               /* Enable CHIPC registers to control the PLL */
+               pChipcHw->PLLStatus |= chipcHw_REG_PLL_STATUS_CONTROL_ENABLE;
+
+               /* Set pre divider to get desired VCO frequency */
+               pChipcHw->PLLPreDivider2 = pllPreDivider2;
+               /* Set NDIV Frac */
+               pChipcHw->PLLDivider2 = chipcHw_REG_PLL_DIVIDER_NDIV_f;
+
+               /* This has to be removed once the default values are fixed for PLL2. */
+               pChipcHw->PLLControl12 = 0x38000700;
+               pChipcHw->PLLControl22 = 0x00000015;
+
+               /* Reset PLL2 */
+               if (vcoFreqHz > chipcHw_REG_PLL_CONFIG_VCO_SPLIT_FREQ) {
+                       pChipcHw->PLLConfig2 = chipcHw_REG_PLL_CONFIG_D_RESET |
+                           chipcHw_REG_PLL_CONFIG_A_RESET |
+                           chipcHw_REG_PLL_CONFIG_VCO_1601_3200 |
+                           chipcHw_REG_PLL_CONFIG_POWER_DOWN;
+               } else {
+                       pChipcHw->PLLConfig2 = chipcHw_REG_PLL_CONFIG_D_RESET |
+                           chipcHw_REG_PLL_CONFIG_A_RESET |
+                           chipcHw_REG_PLL_CONFIG_VCO_800_1600 |
+                           chipcHw_REG_PLL_CONFIG_POWER_DOWN;
+               }
+               REG_LOCAL_IRQ_RESTORE;
+       }
+
+       /* Insert certain amount of delay before deasserting ARESET. */
+       udelay(1);
+
+       {
+               REG_LOCAL_IRQ_SAVE;
+               /* Remove analog reset and Power on the PLL */
+               pChipcHw->PLLConfig2 &=
+                   ~(chipcHw_REG_PLL_CONFIG_A_RESET |
+                     chipcHw_REG_PLL_CONFIG_POWER_DOWN);
+
+               REG_LOCAL_IRQ_RESTORE;
+
+       }
+
+       /* Wait until PLL is locked */
+       while (!(pChipcHw->PLLStatus2 & chipcHw_REG_PLL_STATUS_LOCKED))
+               ;
+
+       {
+               REG_LOCAL_IRQ_SAVE;
+               /* Remove digital reset */
+               pChipcHw->PLLConfig2 &= ~chipcHw_REG_PLL_CONFIG_D_RESET;
+
+               REG_LOCAL_IRQ_RESTORE;
+       }
+}
+
+EXPORT_SYMBOL(chipcHw_pll2Enable);
+
+/****************************************************************************/
+/**
+*  @brief  Initializes the PLL1
+*
+*  This function initializes the PLL1
+*
+*/
+/****************************************************************************/
+void chipcHw_pll1Enable(uint32_t vcoFreqHz, chipcHw_SPREAD_SPECTRUM_e ssSupport)
+{
+       uint32_t pllPreDivider = 0;
+
+       {
+               REG_LOCAL_IRQ_SAVE;
+
+               pChipcHw->PLLConfig =
+                   chipcHw_REG_PLL_CONFIG_D_RESET |
+                   chipcHw_REG_PLL_CONFIG_A_RESET;
+               /* Setting VCO frequency */
+               if (ssSupport == chipcHw_SPREAD_SPECTRUM_ALLOW) {
+                       pllPreDivider =
+                           chipcHw_REG_PLL_PREDIVIDER_NDIV_MODE_MASH_1_8 |
+                           ((chipcHw_REG_PLL_PREDIVIDER_NDIV_i(vcoFreqHz) -
+                             1) << chipcHw_REG_PLL_PREDIVIDER_NDIV_SHIFT) |
+                           (chipcHw_REG_PLL_PREDIVIDER_P1 <<
+                            chipcHw_REG_PLL_PREDIVIDER_P1_SHIFT) |
+                           (chipcHw_REG_PLL_PREDIVIDER_P2 <<
+                            chipcHw_REG_PLL_PREDIVIDER_P2_SHIFT);
+               } else {
+                       pllPreDivider = chipcHw_REG_PLL_PREDIVIDER_POWER_DOWN |
+                           chipcHw_REG_PLL_PREDIVIDER_NDIV_MODE_INTEGER |
+                           (chipcHw_REG_PLL_PREDIVIDER_NDIV_i(vcoFreqHz) <<
+                            chipcHw_REG_PLL_PREDIVIDER_NDIV_SHIFT) |
+                           (chipcHw_REG_PLL_PREDIVIDER_P1 <<
+                            chipcHw_REG_PLL_PREDIVIDER_P1_SHIFT) |
+                           (chipcHw_REG_PLL_PREDIVIDER_P2 <<
+                            chipcHw_REG_PLL_PREDIVIDER_P2_SHIFT);
+               }
+
+               /* Enable CHIPC registers to control the PLL */
+               pChipcHw->PLLStatus |= chipcHw_REG_PLL_STATUS_CONTROL_ENABLE;
+
+               /* Set pre divider to get desired VCO frequency */
+               pChipcHw->PLLPreDivider = pllPreDivider;
+               /* Set NDIV Frac */
+               if (ssSupport == chipcHw_SPREAD_SPECTRUM_ALLOW) {
+                       pChipcHw->PLLDivider = chipcHw_REG_PLL_DIVIDER_M1DIV |
+                           chipcHw_REG_PLL_DIVIDER_NDIV_f_SS;
+               } else {
+                       pChipcHw->PLLDivider = chipcHw_REG_PLL_DIVIDER_M1DIV |
+                           chipcHw_REG_PLL_DIVIDER_NDIV_f;
+               }
+
+               /* Reset PLL1 */
+               if (vcoFreqHz > chipcHw_REG_PLL_CONFIG_VCO_SPLIT_FREQ) {
+                       pChipcHw->PLLConfig = chipcHw_REG_PLL_CONFIG_D_RESET |
+                           chipcHw_REG_PLL_CONFIG_A_RESET |
+                           chipcHw_REG_PLL_CONFIG_VCO_1601_3200 |
+                           chipcHw_REG_PLL_CONFIG_POWER_DOWN;
+               } else {
+                       pChipcHw->PLLConfig = chipcHw_REG_PLL_CONFIG_D_RESET |
+                           chipcHw_REG_PLL_CONFIG_A_RESET |
+                           chipcHw_REG_PLL_CONFIG_VCO_800_1600 |
+                           chipcHw_REG_PLL_CONFIG_POWER_DOWN;
+               }
+
+               REG_LOCAL_IRQ_RESTORE;
+
+               /* Insert certain amount of delay before deasserting ARESET. */
+               udelay(1);
+
+               {
+                       REG_LOCAL_IRQ_SAVE;
+                       /* Remove analog reset and Power on the PLL */
+                       pChipcHw->PLLConfig &=
+                           ~(chipcHw_REG_PLL_CONFIG_A_RESET |
+                             chipcHw_REG_PLL_CONFIG_POWER_DOWN);
+                       REG_LOCAL_IRQ_RESTORE;
+               }
+
+               /* Wait until PLL is locked */
+               while (!(pChipcHw->PLLStatus & chipcHw_REG_PLL_STATUS_LOCKED)
+                      || !(pChipcHw->
+                           PLLStatus2 & chipcHw_REG_PLL_STATUS_LOCKED))
+                       ;
+
+               /* Remove digital reset */
+               {
+                       REG_LOCAL_IRQ_SAVE;
+                       pChipcHw->PLLConfig &= ~chipcHw_REG_PLL_CONFIG_D_RESET;
+                       REG_LOCAL_IRQ_RESTORE;
+               }
+       }
+}
+
+EXPORT_SYMBOL(chipcHw_pll1Enable);
+
+/****************************************************************************/
+/**
+*  @brief  Initializes the chipc module
+*
+*  This function initializes the PLLs and core system clocks
+*
+*/
+/****************************************************************************/
+
+void chipcHw_Init(chipcHw_INIT_PARAM_t *initParam      /*  [ IN ] Misc chip initialization parameter */
+    ) {
+#if !(defined(__KERNEL__) && !defined(STANDALONE))
+       delay_init();
+#endif
+
+       /* Do not program PLL, when warm reset */
+       if (!(chipcHw_getStickyBits() & chipcHw_REG_STICKY_CHIP_WARM_RESET)) {
+               chipcHw_pll1Enable(initParam->pllVcoFreqHz,
+                                  initParam->ssSupport);
+               chipcHw_pll2Enable(initParam->pll2VcoFreqHz);
+       } else {
+               /* Clear sticky bits */
+               chipcHw_clearStickyBits(chipcHw_REG_STICKY_CHIP_WARM_RESET);
+       }
+       /* Clear sticky bits */
+       chipcHw_clearStickyBits(chipcHw_REG_STICKY_CHIP_SOFT_RESET);
+
+       /* Before configuring the ARM clock, atleast we need to make sure BUS clock maintains the proper ratio with ARM clock */
+       pChipcHw->ACLKClock =
+           (pChipcHw->
+            ACLKClock & ~chipcHw_REG_ACLKClock_CLK_DIV_MASK) | (initParam->
+                                                                armBusRatio &
+                                                                chipcHw_REG_ACLKClock_CLK_DIV_MASK);
+
+       /* Set various core component frequencies. The order in which this is done is important for some. */
+       /* The RTBUS (DDR PHY) is derived from the BUS, and the BUS from the ARM, and VPM needs to know BUS */
+       /* frequency to find its ratio with the BUS.  Hence we must set the ARM first, followed by the BUS,  */
+       /* then VPM and RTBUS. */
+
+       chipcHw_setClockFrequency(chipcHw_CLOCK_ARM,
+                                 initParam->busClockFreqHz *
+                                 initParam->armBusRatio);
+       chipcHw_setClockFrequency(chipcHw_CLOCK_BUS, initParam->busClockFreqHz);
+       chipcHw_setClockFrequency(chipcHw_CLOCK_VPM,
+                                 initParam->busClockFreqHz *
+                                 initParam->vpmBusRatio);
+       chipcHw_setClockFrequency(chipcHw_CLOCK_DDR,
+                                 initParam->busClockFreqHz *
+                                 initParam->ddrBusRatio);
+       chipcHw_setClockFrequency(chipcHw_CLOCK_RTBUS,
+                                 initParam->busClockFreqHz / 2);
+}
diff --git a/arch/arm/mach-bcmring/csp/chipc/chipcHw_reset.c b/arch/arm/mach-bcmring/csp/chipc/chipcHw_reset.c
new file mode 100644 (file)
index 0000000..2671d88
--- /dev/null
@@ -0,0 +1,124 @@
+/*****************************************************************************
+* Copyright 2003 - 2008 Broadcom Corporation.  All rights reserved.
+*
+* Unless you and Broadcom execute a separate written software license
+* agreement governing use of this software, this software is licensed to you
+* under the terms of the GNU General Public License version 2, available at
+* http://www.broadcom.com/licenses/GPLv2.php (the "GPL").
+*
+* Notwithstanding the above, under no circumstances may you combine this
+* software in any way with any other Broadcom software provided under a
+* license other than the GPL, without Broadcom's express prior written
+* consent.
+*****************************************************************************/
+
+/* ---- Include Files ---------------------------------------------------- */
+#include <csp/stdint.h>
+#include <mach/csp/chipcHw_def.h>
+#include <mach/csp/chipcHw_inline.h>
+#include <csp/intcHw.h>
+#include <csp/cache.h>
+
+/* ---- Private Constants and Types --------------------------------------- */
+/* ---- Private Variables ------------------------------------------------- */
+void chipcHw_reset_run_from_aram(void);
+
+typedef void (*RUNFUNC) (void);
+
+/****************************************************************************/
+/**
+*  @brief   warmReset
+*
+*  @note warmReset configures the clocks which are not reset back to the state
+*   required to execute on reset.  To do so we need to copy the code into internal
+*   memory to change the ARM clock while we are not executing from DDR.
+*/
+/****************************************************************************/
+void chipcHw_reset(uint32_t mask)
+{
+       int i = 0;
+       RUNFUNC runFunc = (RUNFUNC) (unsigned long)MM_ADDR_IO_ARAM;
+
+       /* Disable all interrupts */
+       intcHw_irq_disable(INTCHW_INTC0, 0xffffffff);
+       intcHw_irq_disable(INTCHW_INTC1, 0xffffffff);
+       intcHw_irq_disable(INTCHW_SINTC, 0xffffffff);
+
+       {
+               REG_LOCAL_IRQ_SAVE;
+               if (mask & chipcHw_REG_SOFT_RESET_CHIP_SOFT) {
+                       chipcHw_softReset(chipcHw_REG_SOFT_RESET_CHIP_SOFT);
+               }
+               /* Bypass the PLL clocks before reboot */
+               pChipcHw->UARTClock |= chipcHw_REG_PLL_CLOCK_BYPASS_SELECT;
+               pChipcHw->SPIClock |= chipcHw_REG_PLL_CLOCK_BYPASS_SELECT;
+
+               /* Copy the chipcHw_warmReset_run_from_aram function into ARAM */
+               do {
+                       ((uint32_t *) MM_IO_BASE_ARAM)[i] =
+                           ((uint32_t *) &chipcHw_reset_run_from_aram)[i];
+                       i++;
+               } while (((uint32_t *) MM_IO_BASE_ARAM)[i - 1] != 0xe1a0f00f);  /* 0xe1a0f00f == asm ("mov r15, r15"); */
+
+               CSP_CACHE_FLUSH_ALL;
+
+               /* run the function from ARAM */
+               runFunc();
+
+               /* Code will never get here, but include it to balance REG_LOCAL_IRQ_SAVE above */
+               REG_LOCAL_IRQ_RESTORE;
+       }
+}
+
+/* This function must run from internal memory */
+void chipcHw_reset_run_from_aram(void)
+{
+/* Make sure, pipeline is filled with instructions coming from ARAM */
+__asm (" nop                                                            \n\t"
+               " nop                                                            \n\t"
+#if defined(__KERNEL__) && !defined(STANDALONE)
+               " MRC      p15,#0x0,r0,c1,c0,#0                                  \n\t"
+               " BIC      r0,r0,#0xd                                            \n\t"
+               " MCR      p15,#0x0,r0,c1,c0,#0                                  \n\t"
+               " nop                                                            \n\t"
+               " nop                                                            \n\t"
+               " nop                                                            \n\t"
+               " nop                                                            \n\t"
+               " nop                                                            \n\t"
+               " nop                                                            \n\t"
+#endif
+               " nop                                                            \n\t"
+               " nop                                                            \n\t"
+/* Bypass the ARM clock and switch to XTAL clock */
+               " MOV      r2,#0x80000000                                        \n\t"
+               " LDR      r3,[r2,#8]                                            \n\t"
+               " ORR      r3,r3,#0x20000                                        \n\t"
+               " STR      r3,[r2,#8]                                            \n\t"
+
+               " nop                                                            \n\t"
+               " nop                                                            \n\t"
+               " nop                                                            \n\t"
+               " nop                                                            \n\t"
+               " nop                                                            \n\t"
+               " nop                                                            \n\t"
+               " nop                                                            \n\t"
+               " nop                                                            \n\t"
+               " nop                                                            \n\t"
+               " nop                                                            \n\t"
+               " nop                                                            \n\t"
+               " nop                                                            \n\t"
+               " nop                                                            \n\t"
+               " nop                                                            \n\t"
+               " nop                                                            \n\t"
+               " nop                                                            \n\t"
+               " nop                                                            \n\t"
+               " nop                                                            \n\t"
+               " nop                                                            \n\t"
+               " nop                                                            \n\t"
+/* Issue reset */
+               " MOV      r3,#0x2                                               \n\t"
+               " STR      r3,[r2,#0x80]                                         \n\t"
+/* End here */
+               " MOV      pc,pc                                                 \n\t");
+/* 0xe1a0f00f ==  asm ("mov r15, r15"); */
+}
diff --git a/arch/arm/mach-bcmring/csp/chipc/chipcHw_str.c b/arch/arm/mach-bcmring/csp/chipc/chipcHw_str.c
new file mode 100644 (file)
index 0000000..54ad964
--- /dev/null
@@ -0,0 +1,64 @@
+/*****************************************************************************
+* Copyright 2008 Broadcom Corporation.  All rights reserved.
+*
+* Unless you and Broadcom execute a separate written software license
+* agreement governing use of this software, this software is licensed to you
+* under the terms of the GNU General Public License version 2, available at
+* http://www.broadcom.com/licenses/GPLv2.php (the "GPL").
+*
+* Notwithstanding the above, under no circumstances may you combine this
+* software in any way with any other Broadcom software provided under a
+* license other than the GPL, without Broadcom's express prior written
+* consent.
+*****************************************************************************/
+/****************************************************************************/
+/**
+*  @file    chipcHw_str.c
+*
+*  @brief   Contains strings which are useful to linux and csp
+*
+*  @note
+*/
+/****************************************************************************/
+
+/* ---- Include Files ---------------------------------------------------- */
+
+#include <mach/csp/chipcHw_inline.h>
+
+/* ---- Private Constants and Types --------------------------------------- */
+
+static const char *gMuxStr[] = {
+       "GPIO",                 /* 0 */
+       "KeyPad",               /* 1 */
+       "I2C-Host",             /* 2 */
+       "SPI",                  /* 3 */
+       "Uart",                 /* 4 */
+       "LED-Mtx-P",            /* 5 */
+       "LED-Mtx-S",            /* 6 */
+       "SDIO-0",               /* 7 */
+       "SDIO-1",               /* 8 */
+       "PCM",                  /* 9 */
+       "I2S",                  /* 10 */
+       "ETM",                  /* 11 */
+       "Debug",                /* 12 */
+       "Misc",                 /* 13 */
+       "0xE",                  /* 14 */
+       "0xF",                  /* 15 */
+};
+
+/****************************************************************************/
+/**
+*  @brief   Retrieves a string representation of the mux setting for a pin.
+*
+*  @return  Pointer to a character string.
+*/
+/****************************************************************************/
+
+const char *chipcHw_getGpioPinFunctionStr(int pin)
+{
+       if ((pin < 0) || (pin >= chipcHw_GPIO_COUNT)) {
+               return "";
+       }
+
+       return gMuxStr[chipcHw_getGpioPinFunction(pin)];
+}
diff --git a/arch/arm/mach-bcmring/csp/dmac/Makefile b/arch/arm/mach-bcmring/csp/dmac/Makefile
new file mode 100644 (file)
index 0000000..fb1104f
--- /dev/null
@@ -0,0 +1 @@
+obj-y += dmacHw.o dmacHw_extra.o
\ No newline at end of file
diff --git a/arch/arm/mach-bcmring/csp/dmac/dmacHw.c b/arch/arm/mach-bcmring/csp/dmac/dmacHw.c
new file mode 100644 (file)
index 0000000..7b9bac2
--- /dev/null
@@ -0,0 +1,917 @@
+/*****************************************************************************
+* Copyright 2003 - 2008 Broadcom Corporation.  All rights reserved.
+*
+* Unless you and Broadcom execute a separate written software license
+* agreement governing use of this software, this software is licensed to you
+* under the terms of the GNU General Public License version 2, available at
+* http://www.broadcom.com/licenses/GPLv2.php (the "GPL").
+*
+* Notwithstanding the above, under no circumstances may you combine this
+* software in any way with any other Broadcom software provided under a
+* license other than the GPL, without Broadcom's express prior written
+* consent.
+*****************************************************************************/
+
+/****************************************************************************/
+/**
+*  @file    dmacHw.c
+*
+*  @brief   Low level DMA controller driver routines
+*
+*  @note
+*
+*   These routines provide basic DMA functionality only.
+*/
+/****************************************************************************/
+
+/* ---- Include Files ---------------------------------------------------- */
+#include <csp/stdint.h>
+#include <csp/string.h>
+#include <stddef.h>
+
+#include <csp/dmacHw.h>
+#include <mach/csp/dmacHw_reg.h>
+#include <mach/csp/dmacHw_priv.h>
+#include <mach/csp/chipcHw_inline.h>
+
+/* ---- External Function Prototypes ------------------------------------- */
+
+/* Allocate DMA control blocks */
+dmacHw_CBLK_t dmacHw_gCblk[dmacHw_MAX_CHANNEL_COUNT];
+
+uint32_t dmaChannelCount_0 = dmacHw_MAX_CHANNEL_COUNT / 2;
+uint32_t dmaChannelCount_1 = dmacHw_MAX_CHANNEL_COUNT / 2;
+
+/****************************************************************************/
+/**
+*  @brief   Get maximum FIFO for a DMA channel
+*
+*  @return  Maximum allowable FIFO size
+*
+*
+*/
+/****************************************************************************/
+static uint32_t GetFifoSize(dmacHw_HANDLE_t handle     /*   [ IN ] DMA Channel handle */
+    ) {
+       uint32_t val = 0;
+       dmacHw_CBLK_t *pCblk = dmacHw_HANDLE_TO_CBLK(handle);
+       dmacHw_MISC_t *pMiscReg =
+           (dmacHw_MISC_t *) dmacHw_REG_MISC_BASE(pCblk->module);
+
+       switch (pCblk->channel) {
+       case 0:
+               val = (pMiscReg->CompParm2.lo & 0x70000000) >> 28;
+               break;
+       case 1:
+               val = (pMiscReg->CompParm3.hi & 0x70000000) >> 28;
+               break;
+       case 2:
+               val = (pMiscReg->CompParm3.lo & 0x70000000) >> 28;
+               break;
+       case 3:
+               val = (pMiscReg->CompParm4.hi & 0x70000000) >> 28;
+               break;
+       case 4:
+               val = (pMiscReg->CompParm4.lo & 0x70000000) >> 28;
+               break;
+       case 5:
+               val = (pMiscReg->CompParm5.hi & 0x70000000) >> 28;
+               break;
+       case 6:
+               val = (pMiscReg->CompParm5.lo & 0x70000000) >> 28;
+               break;
+       case 7:
+               val = (pMiscReg->CompParm6.hi & 0x70000000) >> 28;
+               break;
+       }
+
+       if (val <= 0x4) {
+               return 8 << val;
+       } else {
+               dmacHw_ASSERT(0);
+       }
+       return 0;
+}
+
+/****************************************************************************/
+/**
+*  @brief   Program channel register to initiate transfer
+*
+*  @return  void
+*
+*
+*  @note
+*     - Descriptor buffer MUST ALWAYS be flushed before calling this function
+*     - This function should also be called from ISR to program the channel with
+*       pending descriptors
+*/
+/****************************************************************************/
+void dmacHw_initiateTransfer(dmacHw_HANDLE_t handle,   /*   [ IN ] DMA Channel handle */
+                            dmacHw_CONFIG_t *pConfig,  /*   [ IN ] Configuration settings */
+                            void *pDescriptor  /*   [ IN ] Descriptor buffer */
+    ) {
+       dmacHw_DESC_RING_t *pRing;
+       dmacHw_DESC_t *pProg;
+       dmacHw_CBLK_t *pCblk;
+
+       pCblk = dmacHw_HANDLE_TO_CBLK(handle);
+       pRing = dmacHw_GET_DESC_RING(pDescriptor);
+
+       if (CHANNEL_BUSY(pCblk->module, pCblk->channel)) {
+               /* Not safe yet to program the channel */
+               return;
+       }
+
+       if (pCblk->varDataStarted) {
+               if (pCblk->descUpdated) {
+                       pCblk->descUpdated = 0;
+                       pProg =
+                           (dmacHw_DESC_t *) ((uint32_t)
+                                              dmacHw_REG_LLP(pCblk->module,
+                                                             pCblk->channel) +
+                                              pRing->virt2PhyOffset);
+
+                       /* Load descriptor if not loaded */
+                       if (!(pProg->ctl.hi & dmacHw_REG_CTL_DONE)) {
+                               dmacHw_SET_SAR(pCblk->module, pCblk->channel,
+                                              pProg->sar);
+                               dmacHw_SET_DAR(pCblk->module, pCblk->channel,
+                                              pProg->dar);
+                               dmacHw_REG_CTL_LO(pCblk->module,
+                                                 pCblk->channel) =
+                                   pProg->ctl.lo;
+                               dmacHw_REG_CTL_HI(pCblk->module,
+                                                 pCblk->channel) =
+                                   pProg->ctl.hi;
+                       } else if (pProg == (dmacHw_DESC_t *) pRing->pEnd->llp) {
+                               /* Return as end descriptor is processed */
+                               return;
+                       } else {
+                               dmacHw_ASSERT(0);
+                       }
+               } else {
+                       return;
+               }
+       } else {
+               if (pConfig->transferMode == dmacHw_TRANSFER_MODE_PERIODIC) {
+                       /* Do not make a single chain, rather process one descriptor at a time */
+                       pProg = pRing->pHead;
+                       /* Point to the next descriptor for next iteration */
+                       dmacHw_NEXT_DESC(pRing, pHead);
+               } else {
+                       /* Return if no more pending descriptor */
+                       if (pRing->pEnd == NULL) {
+                               return;
+                       }
+
+                       pProg = pRing->pProg;
+                       if (pConfig->transferMode ==
+                           dmacHw_TRANSFER_MODE_CONTINUOUS) {
+                               /* Make sure a complete ring can be formed */
+                               dmacHw_ASSERT((dmacHw_DESC_t *) pRing->pEnd->
+                                             llp == pRing->pProg);
+                               /* Make sure pProg pointing to the pHead */
+                               dmacHw_ASSERT((dmacHw_DESC_t *) pRing->pProg ==
+                                             pRing->pHead);
+                               /* Make a complete ring */
+                               do {
+                                       pRing->pProg->ctl.lo |=
+                                           (dmacHw_REG_CTL_LLP_DST_EN |
+                                            dmacHw_REG_CTL_LLP_SRC_EN);
+                                       pRing->pProg =
+                                           (dmacHw_DESC_t *) pRing->pProg->llp;
+                               } while (pRing->pProg != pRing->pHead);
+                       } else {
+                               /* Make a single long chain */
+                               while (pRing->pProg != pRing->pEnd) {
+                                       pRing->pProg->ctl.lo |=
+                                           (dmacHw_REG_CTL_LLP_DST_EN |
+                                            dmacHw_REG_CTL_LLP_SRC_EN);
+                                       pRing->pProg =
+                                           (dmacHw_DESC_t *) pRing->pProg->llp;
+                               }
+                       }
+               }
+
+               /* Program the channel registers */
+               dmacHw_SET_SAR(pCblk->module, pCblk->channel, pProg->sar);
+               dmacHw_SET_DAR(pCblk->module, pCblk->channel, pProg->dar);
+               dmacHw_SET_LLP(pCblk->module, pCblk->channel,
+                              (uint32_t) pProg - pRing->virt2PhyOffset);
+               dmacHw_REG_CTL_LO(pCblk->module, pCblk->channel) =
+                   pProg->ctl.lo;
+               dmacHw_REG_CTL_HI(pCblk->module, pCblk->channel) =
+                   pProg->ctl.hi;
+               if (pRing->pEnd) {
+                       /* Remember the descriptor to use next */
+                       pRing->pProg = (dmacHw_DESC_t *) pRing->pEnd->llp;
+               }
+               /* Indicate no more pending descriptor  */
+               pRing->pEnd = (dmacHw_DESC_t *) NULL;
+       }
+       /* Start DMA operation */
+       dmacHw_DMA_START(pCblk->module, pCblk->channel);
+}
+
+/****************************************************************************/
+/**
+*  @brief   Initializes DMA
+*
+*  This function initializes DMA CSP driver
+*
+*  @note
+*     Must be called before using any DMA channel
+*/
+/****************************************************************************/
+void dmacHw_initDma(void)
+{
+
+       uint32_t i = 0;
+
+       dmaChannelCount_0 = dmacHw_GET_NUM_CHANNEL(0);
+       dmaChannelCount_1 = dmacHw_GET_NUM_CHANNEL(1);
+
+       /* Enable access to the DMA block */
+       chipcHw_busInterfaceClockEnable(chipcHw_REG_BUS_CLOCK_DMAC0);
+       chipcHw_busInterfaceClockEnable(chipcHw_REG_BUS_CLOCK_DMAC1);
+
+       if ((dmaChannelCount_0 + dmaChannelCount_1) > dmacHw_MAX_CHANNEL_COUNT) {
+               dmacHw_ASSERT(0);
+       }
+
+       memset((void *)dmacHw_gCblk, 0,
+              sizeof(dmacHw_CBLK_t) * (dmaChannelCount_0 + dmaChannelCount_1));
+       for (i = 0; i < dmaChannelCount_0; i++) {
+               dmacHw_gCblk[i].module = 0;
+               dmacHw_gCblk[i].channel = i;
+       }
+       for (i = 0; i < dmaChannelCount_1; i++) {
+               dmacHw_gCblk[i + dmaChannelCount_0].module = 1;
+               dmacHw_gCblk[i + dmaChannelCount_0].channel = i;
+       }
+}
+
+/****************************************************************************/
+/**
+*  @brief   Exit function for  DMA
+*
+*  This function isolates DMA from the system
+*
+*/
+/****************************************************************************/
+void dmacHw_exitDma(void)
+{
+       /* Disable access to the DMA block */
+       chipcHw_busInterfaceClockDisable(chipcHw_REG_BUS_CLOCK_DMAC0);
+       chipcHw_busInterfaceClockDisable(chipcHw_REG_BUS_CLOCK_DMAC1);
+}
+
+/****************************************************************************/
+/**
+*  @brief   Gets a handle to a DMA channel
+*
+*  This function returns a handle, representing a control block of a particular DMA channel
+*
+*  @return  -1       - On Failure
+*            handle  - On Success, representing a channel control block
+*
+*  @note
+*     None  Channel ID must be created using "dmacHw_MAKE_CHANNEL_ID" macro
+*/
+/****************************************************************************/
+dmacHw_HANDLE_t dmacHw_getChannelHandle(dmacHw_ID_t channelId  /* [ IN ] DMA Channel Id */
+    ) {
+       int idx;
+
+       switch ((channelId >> 8)) {
+       case 0:
+               dmacHw_ASSERT((channelId & 0xff) < dmaChannelCount_0);
+               idx = (channelId & 0xff);
+               break;
+       case 1:
+               dmacHw_ASSERT((channelId & 0xff) < dmaChannelCount_1);
+               idx = dmaChannelCount_0 + (channelId & 0xff);
+               break;
+       default:
+               dmacHw_ASSERT(0);
+               return (dmacHw_HANDLE_t) -1;
+       }
+
+       return dmacHw_CBLK_TO_HANDLE(&dmacHw_gCblk[idx]);
+}
+
+/****************************************************************************/
+/**
+*  @brief   Initializes a DMA channel for use
+*
+*  This function initializes and resets a DMA channel for use
+*
+*  @return  -1     - On Failure
+*            0     - On Success
+*
+*  @note
+*     None
+*/
+/****************************************************************************/
+int dmacHw_initChannel(dmacHw_HANDLE_t handle  /*   [ IN ] DMA Channel handle */
+    ) {
+       dmacHw_CBLK_t *pCblk = dmacHw_HANDLE_TO_CBLK(handle);
+       int module = pCblk->module;
+       int channel = pCblk->channel;
+
+       /* Reinitialize the control block */
+       memset((void *)pCblk, 0, sizeof(dmacHw_CBLK_t));
+       pCblk->module = module;
+       pCblk->channel = channel;
+
+       /* Enable DMA controller */
+       dmacHw_DMA_ENABLE(pCblk->module);
+       /* Reset DMA channel */
+       dmacHw_RESET_CONTROL_LO(pCblk->module, pCblk->channel);
+       dmacHw_RESET_CONTROL_HI(pCblk->module, pCblk->channel);
+       dmacHw_RESET_CONFIG_LO(pCblk->module, pCblk->channel);
+       dmacHw_RESET_CONFIG_HI(pCblk->module, pCblk->channel);
+
+       /* Clear all raw interrupt status */
+       dmacHw_TRAN_INT_CLEAR(pCblk->module, pCblk->channel);
+       dmacHw_BLOCK_INT_CLEAR(pCblk->module, pCblk->channel);
+       dmacHw_ERROR_INT_CLEAR(pCblk->module, pCblk->channel);
+
+       /* Mask event specific interrupts */
+       dmacHw_TRAN_INT_DISABLE(pCblk->module, pCblk->channel);
+       dmacHw_BLOCK_INT_DISABLE(pCblk->module, pCblk->channel);
+       dmacHw_STRAN_INT_DISABLE(pCblk->module, pCblk->channel);
+       dmacHw_DTRAN_INT_DISABLE(pCblk->module, pCblk->channel);
+       dmacHw_ERROR_INT_DISABLE(pCblk->module, pCblk->channel);
+
+       return 0;
+}
+
+/****************************************************************************/
+/**
+*  @brief  Finds amount of memory required to form a descriptor ring
+*
+*
+*  @return   Number of bytes required to form a descriptor ring
+*
+*
+*/
+/****************************************************************************/
+uint32_t dmacHw_descriptorLen(uint32_t descCnt /* [ IN ] Number of descriptor in the ring */
+    ) {
+       /* Need extra 4 byte to ensure 32 bit alignment  */
+       return (descCnt * sizeof(dmacHw_DESC_t)) + sizeof(dmacHw_DESC_RING_t) +
+               sizeof(uint32_t);
+}
+
+/****************************************************************************/
+/**
+*  @brief   Initializes descriptor ring
+*
+*  This function will initializes the descriptor ring of a DMA channel
+*
+*
+*  @return   -1 - On failure
+*             0 - On success
+*  @note
+*     - "len" parameter should be obtained from "dmacHw_descriptorLen"
+*     - Descriptor buffer MUST be 32 bit aligned and uncached as it is
+*       accessed by ARM and DMA
+*/
+/****************************************************************************/
+int dmacHw_initDescriptor(void *pDescriptorVirt,       /*  [ IN ] Virtual address of uncahced buffer allocated to form descriptor ring */
+                         uint32_t descriptorPhyAddr,   /*  [ IN ] Physical address of pDescriptorVirt (descriptor buffer) */
+                         uint32_t len, /*  [ IN ] Size of the pBuf */
+                         uint32_t num  /*  [ IN ] Number of descriptor in the ring */
+    ) {
+       uint32_t i;
+       dmacHw_DESC_RING_t *pRing;
+       dmacHw_DESC_t *pDesc;
+
+       /* Check the alignment of the descriptor */
+       if ((uint32_t) pDescriptorVirt & 0x00000003) {
+               dmacHw_ASSERT(0);
+               return -1;
+       }
+
+       /* Check if enough space has been allocated for descriptor ring */
+       if (len < dmacHw_descriptorLen(num)) {
+               return -1;
+       }
+
+       pRing = dmacHw_GET_DESC_RING(pDescriptorVirt);
+       pRing->pHead =
+           (dmacHw_DESC_t *) ((uint32_t) pRing + sizeof(dmacHw_DESC_RING_t));
+       pRing->pFree = pRing->pTail = pRing->pEnd = pRing->pHead;
+       pRing->pProg = dmacHw_DESC_INIT;
+       /* Initialize link item chain, starting from the head */
+       pDesc = pRing->pHead;
+       /* Find the offset between virtual to physical address */
+       pRing->virt2PhyOffset = (uint32_t) pDescriptorVirt - descriptorPhyAddr;
+
+       /* Form the descriptor ring */
+       for (i = 0; i < num - 1; i++) {
+               /* Clear link list item */
+               memset((void *)pDesc, 0, sizeof(dmacHw_DESC_t));
+               /* Point to the next item in the physical address */
+               pDesc->llpPhy = (uint32_t) (pDesc + 1) - pRing->virt2PhyOffset;
+               /* Point to the next item in the virtual address */
+               pDesc->llp = (uint32_t) (pDesc + 1);
+               /* Mark descriptor is ready to use */
+               pDesc->ctl.hi = dmacHw_DESC_FREE;
+               /* Look into next link list item */
+               pDesc++;
+       }
+
+       /* Clear last link list item */
+       memset((void *)pDesc, 0, sizeof(dmacHw_DESC_t));
+       /* Last item pointing to the first item in the
+          physical address to complete the ring */
+       pDesc->llpPhy = (uint32_t) pRing->pHead - pRing->virt2PhyOffset;
+       /* Last item pointing to the first item in the
+          virtual address to complete the ring
+        */
+       pDesc->llp = (uint32_t) pRing->pHead;
+       /* Mark descriptor is ready to use */
+       pDesc->ctl.hi = dmacHw_DESC_FREE;
+       /* Set the number of descriptors in the ring */
+       pRing->num = num;
+       return 0;
+}
+
+/****************************************************************************/
+/**
+*  @brief   Configure DMA channel
+*
+*  @return  0  : On success
+*           -1 : On failure
+*/
+/****************************************************************************/
+int dmacHw_configChannel(dmacHw_HANDLE_t handle,       /*   [ IN ] DMA Channel handle */
+                        dmacHw_CONFIG_t *pConfig       /*   [ IN ] Configuration settings */
+    ) {
+       dmacHw_CBLK_t *pCblk = dmacHw_HANDLE_TO_CBLK(handle);
+       uint32_t cfgHigh = 0;
+       int srcTrSize;
+       int dstTrSize;
+
+       pCblk->varDataStarted = 0;
+       pCblk->userData = NULL;
+
+       /* Configure
+          - Burst transaction when enough data in available in FIFO
+          - AHB Access protection 1
+          - Source and destination peripheral ports
+        */
+       cfgHigh =
+           dmacHw_REG_CFG_HI_FIFO_ENOUGH | dmacHw_REG_CFG_HI_AHB_HPROT_1 |
+           dmacHw_SRC_PERI_INTF(pConfig->
+                                srcPeripheralPort) |
+           dmacHw_DST_PERI_INTF(pConfig->dstPeripheralPort);
+       /* Set priority */
+       dmacHw_SET_CHANNEL_PRIORITY(pCblk->module, pCblk->channel,
+                                   pConfig->channelPriority);
+
+       if (pConfig->dstStatusRegisterAddress != 0) {
+               /* Destination status update enable */
+               cfgHigh |= dmacHw_REG_CFG_HI_UPDATE_DST_STAT;
+               /* Configure status registers */
+               dmacHw_SET_DSTATAR(pCblk->module, pCblk->channel,
+                                  pConfig->dstStatusRegisterAddress);
+       }
+
+       if (pConfig->srcStatusRegisterAddress != 0) {
+               /* Source status update enable */
+               cfgHigh |= dmacHw_REG_CFG_HI_UPDATE_SRC_STAT;
+               /* Source status update enable */
+               dmacHw_SET_SSTATAR(pCblk->module, pCblk->channel,
+                                  pConfig->srcStatusRegisterAddress);
+       }
+       /* Configure the config high register */
+       dmacHw_GET_CONFIG_HI(pCblk->module, pCblk->channel) = cfgHigh;
+
+       /* Clear all raw interrupt status */
+       dmacHw_TRAN_INT_CLEAR(pCblk->module, pCblk->channel);
+       dmacHw_BLOCK_INT_CLEAR(pCblk->module, pCblk->channel);
+       dmacHw_ERROR_INT_CLEAR(pCblk->module, pCblk->channel);
+
+       /* Configure block interrupt */
+       if (pConfig->blockTransferInterrupt == dmacHw_INTERRUPT_ENABLE) {
+               dmacHw_BLOCK_INT_ENABLE(pCblk->module, pCblk->channel);
+       } else {
+               dmacHw_BLOCK_INT_DISABLE(pCblk->module, pCblk->channel);
+       }
+       /* Configure complete transfer interrupt */
+       if (pConfig->completeTransferInterrupt == dmacHw_INTERRUPT_ENABLE) {
+               dmacHw_TRAN_INT_ENABLE(pCblk->module, pCblk->channel);
+       } else {
+               dmacHw_TRAN_INT_DISABLE(pCblk->module, pCblk->channel);
+       }
+       /* Configure error interrupt */
+       if (pConfig->errorInterrupt == dmacHw_INTERRUPT_ENABLE) {
+               dmacHw_ERROR_INT_ENABLE(pCblk->module, pCblk->channel);
+       } else {
+               dmacHw_ERROR_INT_DISABLE(pCblk->module, pCblk->channel);
+       }
+       /* Configure gather register */
+       if (pConfig->srcGatherWidth) {
+               srcTrSize =
+                   dmacHw_GetTrWidthInBytes(pConfig->srcMaxTransactionWidth);
+               if (!
+                   ((pConfig->srcGatherWidth % srcTrSize)
+                    && (pConfig->srcGatherJump % srcTrSize))) {
+                       dmacHw_REG_SGR_LO(pCblk->module, pCblk->channel) =
+                           ((pConfig->srcGatherWidth /
+                             srcTrSize) << 20) | (pConfig->srcGatherJump /
+                                                  srcTrSize);
+               } else {
+                       return -1;
+               }
+       }
+       /* Configure scatter register */
+       if (pConfig->dstScatterWidth) {
+               dstTrSize =
+                   dmacHw_GetTrWidthInBytes(pConfig->dstMaxTransactionWidth);
+               if (!
+                   ((pConfig->dstScatterWidth % dstTrSize)
+                    && (pConfig->dstScatterJump % dstTrSize))) {
+                       dmacHw_REG_DSR_LO(pCblk->module, pCblk->channel) =
+                           ((pConfig->dstScatterWidth /
+                             dstTrSize) << 20) | (pConfig->dstScatterJump /
+                                                  dstTrSize);
+               } else {
+                       return -1;
+               }
+       }
+       return 0;
+}
+
+/****************************************************************************/
+/**
+*  @brief   Indicates whether DMA transfer is in progress or completed
+*
+*  @return   DMA transfer status
+*          dmacHw_TRANSFER_STATUS_BUSY:         DMA Transfer ongoing
+*          dmacHw_TRANSFER_STATUS_DONE:         DMA Transfer completed
+*          dmacHw_TRANSFER_STATUS_ERROR:        DMA Transfer error
+*
+*/
+/****************************************************************************/
+dmacHw_TRANSFER_STATUS_e dmacHw_transferCompleted(dmacHw_HANDLE_t handle       /*   [ IN ] DMA Channel handle */
+    ) {
+       dmacHw_CBLK_t *pCblk = dmacHw_HANDLE_TO_CBLK(handle);
+
+       if (CHANNEL_BUSY(pCblk->module, pCblk->channel)) {
+               return dmacHw_TRANSFER_STATUS_BUSY;
+       } else if (dmacHw_REG_INT_RAW_ERROR(pCblk->module) &
+                  (0x00000001 << pCblk->channel)) {
+               return dmacHw_TRANSFER_STATUS_ERROR;
+       }
+
+       return dmacHw_TRANSFER_STATUS_DONE;
+}
+
+/****************************************************************************/
+/**
+*  @brief   Set descriptors for known data length
+*
+*  When DMA has to work as a flow controller, this function prepares the
+*  descriptor chain to transfer data
+*
+*  from:
+*          - Memory to memory
+*          - Peripheral to memory
+*          - Memory to Peripheral
+*          - Peripheral to Peripheral
+*
+*  @return   -1 - On failure
+*             0 - On success
+*
+*/
+/****************************************************************************/
+int dmacHw_setDataDescriptor(dmacHw_CONFIG_t *pConfig, /*   [ IN ] Configuration settings */
+                            void *pDescriptor, /*   [ IN ] Descriptor buffer */
+                            void *pSrcAddr,    /*   [ IN ] Source (Peripheral/Memory) address */
+                            void *pDstAddr,    /*   [ IN ] Destination (Peripheral/Memory) address */
+                            size_t dataLen     /*   [ IN ] Data length in bytes */
+    ) {
+       dmacHw_TRANSACTION_WIDTH_e dstTrWidth;
+       dmacHw_TRANSACTION_WIDTH_e srcTrWidth;
+       dmacHw_DESC_RING_t *pRing = dmacHw_GET_DESC_RING(pDescriptor);
+       dmacHw_DESC_t *pStart;
+       dmacHw_DESC_t *pProg;
+       int srcTs = 0;
+       int blkTs = 0;
+       int oddSize = 0;
+       int descCount = 0;
+       int count = 0;
+       int dstTrSize = 0;
+       int srcTrSize = 0;
+       uint32_t maxBlockSize = dmacHw_MAX_BLOCKSIZE;
+
+       dstTrSize = dmacHw_GetTrWidthInBytes(pConfig->dstMaxTransactionWidth);
+       srcTrSize = dmacHw_GetTrWidthInBytes(pConfig->srcMaxTransactionWidth);
+
+       /* Skip Tx if buffer is NULL  or length is unknown */
+       if ((pSrcAddr == NULL) || (pDstAddr == NULL) || (dataLen == 0)) {
+               /* Do not initiate transfer */
+               return -1;
+       }
+
+       /* Ensure scatter and gather are transaction aligned */
+       if ((pConfig->srcGatherWidth % srcTrSize)
+           || (pConfig->dstScatterWidth % dstTrSize)) {
+               return -2;
+       }
+
+       /*
+          Background 1: DMAC can not perform DMA if source and destination addresses are
+          not properly aligned with the channel's transaction width. So, for successful
+          DMA transfer, transaction width must be set according to the alignment of the
+          source and destination address.
+        */
+
+       /* Adjust destination transaction width if destination address is not aligned properly */
+       dstTrWidth = pConfig->dstMaxTransactionWidth;
+       while (dmacHw_ADDRESS_MASK(dstTrSize) & (uint32_t) pDstAddr) {
+               dstTrWidth = dmacHw_GetNextTrWidth(dstTrWidth);
+               dstTrSize = dmacHw_GetTrWidthInBytes(dstTrWidth);
+       }
+
+       /* Adjust source transaction width if source address is not aligned properly */
+       srcTrWidth = pConfig->srcMaxTransactionWidth;
+       while (dmacHw_ADDRESS_MASK(srcTrSize) & (uint32_t) pSrcAddr) {
+               srcTrWidth = dmacHw_GetNextTrWidth(srcTrWidth);
+               srcTrSize = dmacHw_GetTrWidthInBytes(srcTrWidth);
+       }
+
+       /* Find the maximum transaction per descriptor */
+       if (pConfig->maxDataPerBlock
+           && ((pConfig->maxDataPerBlock / srcTrSize) <
+               dmacHw_MAX_BLOCKSIZE)) {
+               maxBlockSize = pConfig->maxDataPerBlock / srcTrSize;
+       }
+
+       /* Find number of source transactions needed to complete the DMA transfer */
+       srcTs = dataLen / srcTrSize;
+       /* Find the odd number of bytes that need to be transferred as single byte transaction width */
+       if (srcTs && (dstTrSize > srcTrSize)) {
+               oddSize = dataLen % dstTrSize;
+               /* Adjust source transaction count due to "oddSize" */
+               srcTs = srcTs - (oddSize / srcTrSize);
+       } else {
+               oddSize = dataLen % srcTrSize;
+       }
+       /* Adjust "descCount" due to "oddSize" */
+       if (oddSize) {
+               descCount++;
+       }
+       /* Find the number of descriptor needed for total "srcTs" */
+       if (srcTs) {
+               descCount += ((srcTs - 1) / maxBlockSize) + 1;
+       }
+
+       /* Check the availability of "descCount" discriptors in the ring */
+       pProg = pRing->pHead;
+       for (count = 0; (descCount <= pRing->num) && (count < descCount);
+            count++) {
+               if ((pProg->ctl.hi & dmacHw_DESC_FREE) == 0) {
+                       /* Sufficient descriptors are not available */
+                       return -3;
+               }
+               pProg = (dmacHw_DESC_t *) pProg->llp;
+       }
+
+       /* Remember the link list item to program the channel registers */
+       pStart = pProg = pRing->pHead;
+       /* Make a link list with "descCount(=count)" number of descriptors */
+       while (count) {
+               /* Reset channel control information */
+               pProg->ctl.lo = 0;
+               /* Enable source gather if configured */
+               if (pConfig->srcGatherWidth) {
+                       pProg->ctl.lo |= dmacHw_REG_CTL_SG_ENABLE;
+               }
+               /* Enable destination scatter if configured */
+               if (pConfig->dstScatterWidth) {
+                       pProg->ctl.lo |= dmacHw_REG_CTL_DS_ENABLE;
+               }
+               /* Set source and destination address */
+               pProg->sar = (uint32_t) pSrcAddr;
+               pProg->dar = (uint32_t) pDstAddr;
+               /* Use "devCtl" to mark that user memory need to be freed later if needed */
+               if (pProg == pRing->pHead) {
+                       pProg->devCtl = dmacHw_FREE_USER_MEMORY;
+               } else {
+                       pProg->devCtl = 0;
+               }
+
+               blkTs = srcTs;
+
+               /* Special treatmeant for last descriptor */
+               if (count == 1) {
+                       /* Mark the last descriptor */
+                       pProg->ctl.lo &=
+                           ~(dmacHw_REG_CTL_LLP_DST_EN |
+                             dmacHw_REG_CTL_LLP_SRC_EN);
+                       /* Treatment for odd data bytes */
+                       if (oddSize) {
+                               /* Adjust for single byte transaction width */
+                               switch (pConfig->transferType) {
+                               case dmacHw_TRANSFER_TYPE_PERIPHERAL_TO_MEM:
+                                       dstTrWidth =
+                                           dmacHw_DST_TRANSACTION_WIDTH_8;
+                                       blkTs =
+                                           (oddSize / srcTrSize) +
+                                           ((oddSize % srcTrSize) ? 1 : 0);
+                                       break;
+                               case dmacHw_TRANSFER_TYPE_MEM_TO_PERIPHERAL:
+                                       srcTrWidth =
+                                           dmacHw_SRC_TRANSACTION_WIDTH_8;
+                                       blkTs = oddSize;
+                                       break;
+                               case dmacHw_TRANSFER_TYPE_MEM_TO_MEM:
+                                       srcTrWidth =
+                                           dmacHw_SRC_TRANSACTION_WIDTH_8;
+                                       dstTrWidth =
+                                           dmacHw_DST_TRANSACTION_WIDTH_8;
+                                       blkTs = oddSize;
+                                       break;
+                               case dmacHw_TRANSFER_TYPE_PERIPHERAL_TO_PERIPHERAL:
+                                       /* Do not adjust the transaction width  */
+                                       break;
+                               }
+                       } else {
+                               srcTs -= blkTs;
+                       }
+               } else {
+                       if (srcTs / maxBlockSize) {
+                               blkTs = maxBlockSize;
+                       }
+                       /* Remaining source transactions for next iteration */
+                       srcTs -= blkTs;
+               }
+               /* Must have a valid source transactions */
+               dmacHw_ASSERT(blkTs > 0);
+               /* Set control information */
+               if (pConfig->flowControler == dmacHw_FLOW_CONTROL_DMA) {
+                       pProg->ctl.lo |= pConfig->transferType |
+                           pConfig->srcUpdate |
+                           pConfig->dstUpdate |
+                           srcTrWidth |
+                           dstTrWidth |
+                           pConfig->srcMaxBurstWidth |
+                           pConfig->dstMaxBurstWidth |
+                           pConfig->srcMasterInterface |
+                           pConfig->dstMasterInterface | dmacHw_REG_CTL_INT_EN;
+               } else {
+                       uint32_t transferType = 0;
+                       switch (pConfig->transferType) {
+                       case dmacHw_TRANSFER_TYPE_PERIPHERAL_TO_MEM:
+                               transferType = dmacHw_REG_CTL_TTFC_PM_PERI;
+                               break;
+                       case dmacHw_TRANSFER_TYPE_MEM_TO_PERIPHERAL:
+                               transferType = dmacHw_REG_CTL_TTFC_MP_PERI;
+                               break;
+                       default:
+                               dmacHw_ASSERT(0);
+                       }
+                       pProg->ctl.lo |= transferType |
+                           pConfig->srcUpdate |
+                           pConfig->dstUpdate |
+                           srcTrWidth |
+                           dstTrWidth |
+                           pConfig->srcMaxBurstWidth |
+                           pConfig->dstMaxBurstWidth |
+                           pConfig->srcMasterInterface |
+                           pConfig->dstMasterInterface | dmacHw_REG_CTL_INT_EN;
+               }
+
+               /* Set block transaction size */
+               pProg->ctl.hi = blkTs & dmacHw_REG_CTL_BLOCK_TS_MASK;
+               /* Look for next descriptor */
+               if (count > 1) {
+                       /* Point to the next descriptor */
+                       pProg = (dmacHw_DESC_t *) pProg->llp;
+
+                       /* Update source and destination address for next iteration */
+                       switch (pConfig->transferType) {
+                       case dmacHw_TRANSFER_TYPE_PERIPHERAL_TO_MEM:
+                               if (pConfig->dstScatterWidth) {
+                                       pDstAddr =
+                                           (char *)pDstAddr +
+                                           blkTs * srcTrSize +
+                                           (((blkTs * srcTrSize) /
+                                             pConfig->dstScatterWidth) *
+                                            pConfig->dstScatterJump);
+                               } else {
+                                       pDstAddr =
+                                           (char *)pDstAddr +
+                                           blkTs * srcTrSize;
+                               }
+                               break;
+                       case dmacHw_TRANSFER_TYPE_MEM_TO_PERIPHERAL:
+                               if (pConfig->srcGatherWidth) {
+                                       pSrcAddr =
+                                           (char *)pDstAddr +
+                                           blkTs * srcTrSize +
+                                           (((blkTs * srcTrSize) /
+                                             pConfig->srcGatherWidth) *
+                                            pConfig->srcGatherJump);
+                               } else {
+                                       pSrcAddr =
+                                           (char *)pSrcAddr +
+                                           blkTs * srcTrSize;
+                               }
+                               break;
+                       case dmacHw_TRANSFER_TYPE_MEM_TO_MEM:
+                               if (pConfig->dstScatterWidth) {
+                                       pDstAddr =
+                                           (char *)pDstAddr +
+                                           blkTs * srcTrSize +
+                                           (((blkTs * srcTrSize) /
+                                             pConfig->dstScatterWidth) *
+                                            pConfig->dstScatterJump);
+                               } else {
+                                       pDstAddr =
+                                           (char *)pDstAddr +
+                                           blkTs * srcTrSize;
+                               }
+
+                               if (pConfig->srcGatherWidth) {
+                                       pSrcAddr =
+                                           (char *)pDstAddr +
+                                           blkTs * srcTrSize +
+                                           (((blkTs * srcTrSize) /
+                                             pConfig->srcGatherWidth) *
+                                            pConfig->srcGatherJump);
+                               } else {
+                                       pSrcAddr =
+                                           (char *)pSrcAddr +
+                                           blkTs * srcTrSize;
+                               }
+                               break;
+                       case dmacHw_TRANSFER_TYPE_PERIPHERAL_TO_PERIPHERAL:
+                               /* Do not adjust the address */
+                               break;
+                       default:
+                               dmacHw_ASSERT(0);
+                       }
+               } else {
+                       /* At the end of transfer "srcTs" must be zero */
+                       dmacHw_ASSERT(srcTs == 0);
+               }
+               count--;
+       }
+
+       /* Remember the descriptor to initialize the registers */
+       if (pRing->pProg == dmacHw_DESC_INIT) {
+               pRing->pProg = pStart;
+       }
+       /* Indicate that the descriptor is updated */
+       pRing->pEnd = pProg;
+       /* Head pointing to the next descriptor */
+       pRing->pHead = (dmacHw_DESC_t *) pProg->llp;
+       /* Update Tail pointer if destination is a peripheral,
+          because no one is going to read from the pTail
+        */
+       if (!dmacHw_DST_IS_MEMORY(pConfig->transferType)) {
+               pRing->pTail = pRing->pHead;
+       }
+       return 0;
+}
+
+/****************************************************************************/
+/**
+*  @brief   Provides DMA controller attributes
+*
+*
+*  @return  DMA controller attributes
+*
+*  @note
+*     None
+*/
+/****************************************************************************/
+uint32_t dmacHw_getDmaControllerAttribute(dmacHw_HANDLE_t handle,      /*  [ IN ]  DMA Channel handle */
+                                         dmacHw_CONTROLLER_ATTRIB_e attr       /*  [ IN ]  DMA Controler attribute of type  dmacHw_CONTROLLER_ATTRIB_e */
+    ) {
+       dmacHw_CBLK_t *pCblk = dmacHw_HANDLE_TO_CBLK(handle);
+
+       switch (attr) {
+       case dmacHw_CONTROLLER_ATTRIB_CHANNEL_NUM:
+               return dmacHw_GET_NUM_CHANNEL(pCblk->module);
+       case dmacHw_CONTROLLER_ATTRIB_CHANNEL_MAX_BLOCK_SIZE:
+               return (1 <<
+                        (dmacHw_GET_MAX_BLOCK_SIZE
+                         (pCblk->module, pCblk->module) + 2)) - 8;
+       case dmacHw_CONTROLLER_ATTRIB_MASTER_INTF_NUM:
+               return dmacHw_GET_NUM_INTERFACE(pCblk->module);
+       case dmacHw_CONTROLLER_ATTRIB_CHANNEL_BUS_WIDTH:
+               return 32 << dmacHw_GET_CHANNEL_DATA_WIDTH(pCblk->module,
+                                                          pCblk->channel);
+       case dmacHw_CONTROLLER_ATTRIB_CHANNEL_FIFO_SIZE:
+               return GetFifoSize(handle);
+       }
+       dmacHw_ASSERT(0);
+       return 0;
+}
diff --git a/arch/arm/mach-bcmring/csp/dmac/dmacHw_extra.c b/arch/arm/mach-bcmring/csp/dmac/dmacHw_extra.c
new file mode 100644 (file)
index 0000000..ff7b436
--- /dev/null
@@ -0,0 +1,1017 @@
+/*****************************************************************************
+* Copyright 2003 - 2008 Broadcom Corporation.  All rights reserved.
+*
+* Unless you and Broadcom execute a separate written software license
+* agreement governing use of this software, this software is licensed to you
+* under the terms of the GNU General Public License version 2, available at
+* http://www.broadcom.com/licenses/GPLv2.php (the "GPL").
+*
+* Notwithstanding the above, under no circumstances may you combine this
+* software in any way with any other Broadcom software provided under a
+* license other than the GPL, without Broadcom's express prior written
+* consent.
+*****************************************************************************/
+
+/****************************************************************************/
+/**
+*  @file    dmacHw_extra.c
+*
+*  @brief   Extra Low level DMA controller driver routines
+*
+*  @note
+*
+*   These routines provide basic DMA functionality only.
+*/
+/****************************************************************************/
+
+/* ---- Include Files ---------------------------------------------------- */
+
+#include <csp/stdint.h>
+#include <stddef.h>
+
+#include <csp/dmacHw.h>
+#include <mach/csp/dmacHw_reg.h>
+#include <mach/csp/dmacHw_priv.h>
+
+extern dmacHw_CBLK_t dmacHw_gCblk[dmacHw_MAX_CHANNEL_COUNT];   /* Declared in dmacHw.c */
+
+/* ---- External Function Prototypes ------------------------------------- */
+
+/* ---- Internal Use Function Prototypes --------------------------------- */
+/****************************************************************************/
+/**
+*  @brief   Overwrites data length in the descriptor
+*
+*  This function overwrites data length in the descriptor
+*
+*
+*  @return   void
+*
+*  @note
+*          This is only used for PCM channel
+*/
+/****************************************************************************/
+void dmacHw_setDataLength(dmacHw_CONFIG_t *pConfig,    /*   [ IN ] Configuration settings */
+                         void *pDescriptor,    /*   [ IN ] Descriptor buffer */
+                         size_t dataLen        /*   [ IN ] Data length in bytes */
+    );
+
+/****************************************************************************/
+/**
+*  @brief   Helper function to display DMA registers
+*
+*  @return  void
+*
+*
+*  @note
+*     None
+*/
+/****************************************************************************/
+static void DisplayRegisterContents(int module,        /*   [ IN ] DMA Controller unit  (0-1) */
+                                   int channel,        /*   [ IN ] DMA Channel          (0-7) / -1(all) */
+                                   int (*fpPrint) (const char *, ...)  /*   [ IN ] Callback to the print function */
+    ) {
+       int chan;
+
+       (*fpPrint) ("Displaying register content \n\n");
+       (*fpPrint) ("Module %d: Interrupt raw transfer              0x%X\n",
+                   module, (uint32_t) (dmacHw_REG_INT_RAW_TRAN(module)));
+       (*fpPrint) ("Module %d: Interrupt raw block                 0x%X\n",
+                   module, (uint32_t) (dmacHw_REG_INT_RAW_BLOCK(module)));
+       (*fpPrint) ("Module %d: Interrupt raw src transfer          0x%X\n",
+                   module, (uint32_t) (dmacHw_REG_INT_RAW_STRAN(module)));
+       (*fpPrint) ("Module %d: Interrupt raw dst transfer          0x%X\n",
+                   module, (uint32_t) (dmacHw_REG_INT_RAW_DTRAN(module)));
+       (*fpPrint) ("Module %d: Interrupt raw error                 0x%X\n",
+                   module, (uint32_t) (dmacHw_REG_INT_RAW_ERROR(module)));
+       (*fpPrint) ("--------------------------------------------------\n");
+       (*fpPrint) ("Module %d: Interrupt stat transfer             0x%X\n",
+                   module, (uint32_t) (dmacHw_REG_INT_STAT_TRAN(module)));
+       (*fpPrint) ("Module %d: Interrupt stat block                0x%X\n",
+                   module, (uint32_t) (dmacHw_REG_INT_STAT_BLOCK(module)));
+       (*fpPrint) ("Module %d: Interrupt stat src transfer         0x%X\n",
+                   module, (uint32_t) (dmacHw_REG_INT_STAT_STRAN(module)));
+       (*fpPrint) ("Module %d: Interrupt stat dst transfer         0x%X\n",
+                   module, (uint32_t) (dmacHw_REG_INT_STAT_DTRAN(module)));
+       (*fpPrint) ("Module %d: Interrupt stat error                0x%X\n",
+                   module, (uint32_t) (dmacHw_REG_INT_STAT_ERROR(module)));
+       (*fpPrint) ("--------------------------------------------------\n");
+       (*fpPrint) ("Module %d: Interrupt mask transfer             0x%X\n",
+                   module, (uint32_t) (dmacHw_REG_INT_MASK_TRAN(module)));
+       (*fpPrint) ("Module %d: Interrupt mask block                0x%X\n",
+                   module, (uint32_t) (dmacHw_REG_INT_MASK_BLOCK(module)));
+       (*fpPrint) ("Module %d: Interrupt mask src transfer         0x%X\n",
+                   module, (uint32_t) (dmacHw_REG_INT_MASK_STRAN(module)));
+       (*fpPrint) ("Module %d: Interrupt mask dst transfer         0x%X\n",
+                   module, (uint32_t) (dmacHw_REG_INT_MASK_DTRAN(module)));
+       (*fpPrint) ("Module %d: Interrupt mask error                0x%X\n",
+                   module, (uint32_t) (dmacHw_REG_INT_MASK_ERROR(module)));
+       (*fpPrint) ("--------------------------------------------------\n");
+       (*fpPrint) ("Module %d: Interrupt clear transfer            0x%X\n",
+                   module, (uint32_t) (dmacHw_REG_INT_CLEAR_TRAN(module)));
+       (*fpPrint) ("Module %d: Interrupt clear block               0x%X\n",
+                   module, (uint32_t) (dmacHw_REG_INT_CLEAR_BLOCK(module)));
+       (*fpPrint) ("Module %d: Interrupt clear src transfer        0x%X\n",
+                   module, (uint32_t) (dmacHw_REG_INT_CLEAR_STRAN(module)));
+       (*fpPrint) ("Module %d: Interrupt clear dst transfer        0x%X\n",
+                   module, (uint32_t) (dmacHw_REG_INT_CLEAR_DTRAN(module)));
+       (*fpPrint) ("Module %d: Interrupt clear error               0x%X\n",
+                   module, (uint32_t) (dmacHw_REG_INT_CLEAR_ERROR(module)));
+       (*fpPrint) ("--------------------------------------------------\n");
+       (*fpPrint) ("Module %d: SW source req                       0x%X\n",
+                   module, (uint32_t) (dmacHw_REG_SW_HS_SRC_REQ(module)));
+       (*fpPrint) ("Module %d: SW dest req                         0x%X\n",
+                   module, (uint32_t) (dmacHw_REG_SW_HS_DST_REQ(module)));
+       (*fpPrint) ("Module %d: SW source signal                    0x%X\n",
+                   module, (uint32_t) (dmacHw_REG_SW_HS_SRC_SGL_REQ(module)));
+       (*fpPrint) ("Module %d: SW dest signal                      0x%X\n",
+                   module, (uint32_t) (dmacHw_REG_SW_HS_DST_SGL_REQ(module)));
+       (*fpPrint) ("Module %d: SW source last                      0x%X\n",
+                   module, (uint32_t) (dmacHw_REG_SW_HS_SRC_LST_REQ(module)));
+       (*fpPrint) ("Module %d: SW dest last                        0x%X\n",
+                   module, (uint32_t) (dmacHw_REG_SW_HS_DST_LST_REQ(module)));
+       (*fpPrint) ("--------------------------------------------------\n");
+       (*fpPrint) ("Module %d: misc config                         0x%X\n",
+                   module, (uint32_t) (dmacHw_REG_MISC_CFG(module)));
+       (*fpPrint) ("Module %d: misc channel enable                 0x%X\n",
+                   module, (uint32_t) (dmacHw_REG_MISC_CH_ENABLE(module)));
+       (*fpPrint) ("Module %d: misc ID                             0x%X\n",
+                   module, (uint32_t) (dmacHw_REG_MISC_ID(module)));
+       (*fpPrint) ("Module %d: misc test                           0x%X\n",
+                   module, (uint32_t) (dmacHw_REG_MISC_TEST(module)));
+
+       if (channel == -1) {
+               for (chan = 0; chan < 8; chan++) {
+                       (*fpPrint)
+                           ("--------------------------------------------------\n");
+                       (*fpPrint)
+                           ("Module %d: Channel %d Source                   0x%X\n",
+                            module, chan,
+                            (uint32_t) (dmacHw_REG_SAR(module, chan)));
+                       (*fpPrint)
+                           ("Module %d: Channel %d Destination              0x%X\n",
+                            module, chan,
+                            (uint32_t) (dmacHw_REG_DAR(module, chan)));
+                       (*fpPrint)
+                           ("Module %d: Channel %d LLP                      0x%X\n",
+                            module, chan,
+                            (uint32_t) (dmacHw_REG_LLP(module, chan)));
+                       (*fpPrint)
+                           ("Module %d: Channel %d Control (LO)             0x%X\n",
+                            module, chan,
+                            (uint32_t) (dmacHw_REG_CTL_LO(module, chan)));
+                       (*fpPrint)
+                           ("Module %d: Channel %d Control (HI)             0x%X\n",
+                            module, chan,
+                            (uint32_t) (dmacHw_REG_CTL_HI(module, chan)));
+                       (*fpPrint)
+                           ("Module %d: Channel %d Source Stats             0x%X\n",
+                            module, chan,
+                            (uint32_t) (dmacHw_REG_SSTAT(module, chan)));
+                       (*fpPrint)
+                           ("Module %d: Channel %d Dest Stats               0x%X\n",
+                            module, chan,
+                            (uint32_t) (dmacHw_REG_DSTAT(module, chan)));
+                       (*fpPrint)
+                           ("Module %d: Channel %d Source Stats Addr        0x%X\n",
+                            module, chan,
+                            (uint32_t) (dmacHw_REG_SSTATAR(module, chan)));
+                       (*fpPrint)
+                           ("Module %d: Channel %d Dest Stats Addr          0x%X\n",
+                            module, chan,
+                            (uint32_t) (dmacHw_REG_DSTATAR(module, chan)));
+                       (*fpPrint)
+                           ("Module %d: Channel %d Config (LO)              0x%X\n",
+                            module, chan,
+                            (uint32_t) (dmacHw_REG_CFG_LO(module, chan)));
+                       (*fpPrint)
+                           ("Module %d: Channel %d Config (HI)              0x%X\n",
+                            module, chan,
+                            (uint32_t) (dmacHw_REG_CFG_HI(module, chan)));
+               }
+       } else {
+               chan = channel;
+               (*fpPrint)
+                   ("--------------------------------------------------\n");
+               (*fpPrint)
+                   ("Module %d: Channel %d Source                   0x%X\n",
+                    module, chan, (uint32_t) (dmacHw_REG_SAR(module, chan)));
+               (*fpPrint)
+                   ("Module %d: Channel %d Destination              0x%X\n",
+                    module, chan, (uint32_t) (dmacHw_REG_DAR(module, chan)));
+               (*fpPrint)
+                   ("Module %d: Channel %d LLP                      0x%X\n",
+                    module, chan, (uint32_t) (dmacHw_REG_LLP(module, chan)));
+               (*fpPrint)
+                   ("Module %d: Channel %d Control (LO)             0x%X\n",
+                    module, chan,
+                    (uint32_t) (dmacHw_REG_CTL_LO(module, chan)));
+               (*fpPrint)
+                   ("Module %d: Channel %d Control (HI)             0x%X\n",
+                    module, chan,
+                    (uint32_t) (dmacHw_REG_CTL_HI(module, chan)));
+               (*fpPrint)
+                   ("Module %d: Channel %d Source Stats             0x%X\n",
+                    module, chan, (uint32_t) (dmacHw_REG_SSTAT(module, chan)));
+               (*fpPrint)
+                   ("Module %d: Channel %d Dest Stats               0x%X\n",
+                    module, chan, (uint32_t) (dmacHw_REG_DSTAT(module, chan)));
+               (*fpPrint)
+                   ("Module %d: Channel %d Source Stats Addr        0x%X\n",
+                    module, chan,
+                    (uint32_t) (dmacHw_REG_SSTATAR(module, chan)));
+               (*fpPrint)
+                   ("Module %d: Channel %d Dest Stats Addr          0x%X\n",
+                    module, chan,
+                    (uint32_t) (dmacHw_REG_DSTATAR(module, chan)));
+               (*fpPrint)
+                   ("Module %d: Channel %d Config (LO)              0x%X\n",
+                    module, chan,
+                    (uint32_t) (dmacHw_REG_CFG_LO(module, chan)));
+               (*fpPrint)
+                   ("Module %d: Channel %d Config (HI)              0x%X\n",
+                    module, chan,
+                    (uint32_t) (dmacHw_REG_CFG_HI(module, chan)));
+       }
+}
+
+/****************************************************************************/
+/**
+*  @brief   Helper function to display descriptor ring
+*
+*  @return  void
+*
+*
+*  @note
+*     None
+*/
+/****************************************************************************/
+static void DisplayDescRing(void *pDescriptor, /*   [ IN ] Descriptor buffer */
+                           int (*fpPrint) (const char *, ...)  /*   [ IN ] Callback to the print function */
+    ) {
+       dmacHw_DESC_RING_t *pRing = dmacHw_GET_DESC_RING(pDescriptor);
+       dmacHw_DESC_t *pStart;
+
+       if (pRing->pHead == NULL) {
+               return;
+       }
+
+       pStart = pRing->pHead;
+
+       while ((dmacHw_DESC_t *) pStart->llp != pRing->pHead) {
+               if (pStart == pRing->pHead) {
+                       (*fpPrint) ("Head\n");
+               }
+               if (pStart == pRing->pTail) {
+                       (*fpPrint) ("Tail\n");
+               }
+               if (pStart == pRing->pProg) {
+                       (*fpPrint) ("Prog\n");
+               }
+               if (pStart == pRing->pEnd) {
+                       (*fpPrint) ("End\n");
+               }
+               if (pStart == pRing->pFree) {
+                       (*fpPrint) ("Free\n");
+               }
+               (*fpPrint) ("0x%X:\n", (uint32_t) pStart);
+               (*fpPrint) ("sar    0x%0X\n", pStart->sar);
+               (*fpPrint) ("dar    0x%0X\n", pStart->dar);
+               (*fpPrint) ("llp    0x%0X\n", pStart->llp);
+               (*fpPrint) ("ctl.lo 0x%0X\n", pStart->ctl.lo);
+               (*fpPrint) ("ctl.hi 0x%0X\n", pStart->ctl.hi);
+               (*fpPrint) ("sstat  0x%0X\n", pStart->sstat);
+               (*fpPrint) ("dstat  0x%0X\n", pStart->dstat);
+               (*fpPrint) ("devCtl 0x%0X\n", pStart->devCtl);
+
+               pStart = (dmacHw_DESC_t *) pStart->llp;
+       }
+       if (pStart == pRing->pHead) {
+               (*fpPrint) ("Head\n");
+       }
+       if (pStart == pRing->pTail) {
+               (*fpPrint) ("Tail\n");
+       }
+       if (pStart == pRing->pProg) {
+               (*fpPrint) ("Prog\n");
+       }
+       if (pStart == pRing->pEnd) {
+               (*fpPrint) ("End\n");
+       }
+       if (pStart == pRing->pFree) {
+               (*fpPrint) ("Free\n");
+       }
+       (*fpPrint) ("0x%X:\n", (uint32_t) pStart);
+       (*fpPrint) ("sar    0x%0X\n", pStart->sar);
+       (*fpPrint) ("dar    0x%0X\n", pStart->dar);
+       (*fpPrint) ("llp    0x%0X\n", pStart->llp);
+       (*fpPrint) ("ctl.lo 0x%0X\n", pStart->ctl.lo);
+       (*fpPrint) ("ctl.hi 0x%0X\n", pStart->ctl.hi);
+       (*fpPrint) ("sstat  0x%0X\n", pStart->sstat);
+       (*fpPrint) ("dstat  0x%0X\n", pStart->dstat);
+       (*fpPrint) ("devCtl 0x%0X\n", pStart->devCtl);
+}
+
+/****************************************************************************/
+/**
+*  @brief   Check if DMA channel is the flow controller
+*
+*  @return  1 : If DMA is a flow controler
+*           0 : Peripheral is the flow controller
+*
+*  @note
+*     None
+*/
+/****************************************************************************/
+static inline int DmaIsFlowController(void *pDescriptor        /*   [ IN ] Descriptor buffer */
+    ) {
+       uint32_t ttfc =
+           (dmacHw_GET_DESC_RING(pDescriptor))->pTail->ctl.
+           lo & dmacHw_REG_CTL_TTFC_MASK;
+
+       switch (ttfc) {
+       case dmacHw_REG_CTL_TTFC_MM_DMAC:
+       case dmacHw_REG_CTL_TTFC_MP_DMAC:
+       case dmacHw_REG_CTL_TTFC_PM_DMAC:
+       case dmacHw_REG_CTL_TTFC_PP_DMAC:
+               return 1;
+       }
+
+       return 0;
+}
+
+/****************************************************************************/
+/**
+*  @brief   Overwrites data length in the descriptor
+*
+*  This function overwrites data length in the descriptor
+*
+*
+*  @return   void
+*
+*  @note
+*          This is only used for PCM channel
+*/
+/****************************************************************************/
+void dmacHw_setDataLength(dmacHw_CONFIG_t *pConfig,    /*   [ IN ] Configuration settings */
+                         void *pDescriptor,    /*   [ IN ] Descriptor buffer */
+                         size_t dataLen        /*   [ IN ] Data length in bytes */
+    ) {
+       dmacHw_DESC_t *pProg;
+       dmacHw_DESC_t *pHead;
+       int srcTs = 0;
+       int srcTrSize = 0;
+
+       pHead = (dmacHw_GET_DESC_RING(pDescriptor))->pHead;
+       pProg = pHead;
+
+       srcTrSize = dmacHw_GetTrWidthInBytes(pConfig->srcMaxTransactionWidth);
+       srcTs = dataLen / srcTrSize;
+       do {
+               pProg->ctl.hi = srcTs & dmacHw_REG_CTL_BLOCK_TS_MASK;
+               pProg = (dmacHw_DESC_t *) pProg->llp;
+       } while (pProg != pHead);
+}
+
+/****************************************************************************/
+/**
+*  @brief   Clears the interrupt
+*
+*  This function clears the DMA channel specific interrupt
+*
+*
+*  @return   void
+*
+*  @note
+*     Must be called under the context of ISR
+*/
+/****************************************************************************/
+void dmacHw_clearInterrupt(dmacHw_HANDLE_t handle      /* [ IN ] DMA Channel handle */
+    ) {
+       dmacHw_CBLK_t *pCblk = dmacHw_HANDLE_TO_CBLK(handle);
+
+       dmacHw_TRAN_INT_CLEAR(pCblk->module, pCblk->channel);
+       dmacHw_BLOCK_INT_CLEAR(pCblk->module, pCblk->channel);
+       dmacHw_ERROR_INT_CLEAR(pCblk->module, pCblk->channel);
+}
+
+/****************************************************************************/
+/**
+*  @brief   Returns the cause of channel specific DMA interrupt
+*
+*  This function returns the cause of interrupt
+*
+*  @return  Interrupt status, each bit representing a specific type of interrupt
+*
+*  @note
+*     Should be called under the context of ISR
+*/
+/****************************************************************************/
+dmacHw_INTERRUPT_STATUS_e dmacHw_getInterruptStatus(dmacHw_HANDLE_t handle     /* [ IN ] DMA Channel handle */
+    ) {
+       dmacHw_CBLK_t *pCblk = dmacHw_HANDLE_TO_CBLK(handle);
+       dmacHw_INTERRUPT_STATUS_e status = dmacHw_INTERRUPT_STATUS_NONE;
+
+       if (dmacHw_REG_INT_STAT_TRAN(pCblk->module) &
+           ((0x00000001 << pCblk->channel))) {
+               status |= dmacHw_INTERRUPT_STATUS_TRANS;
+       }
+       if (dmacHw_REG_INT_STAT_BLOCK(pCblk->module) &
+           ((0x00000001 << pCblk->channel))) {
+               status |= dmacHw_INTERRUPT_STATUS_BLOCK;
+       }
+       if (dmacHw_REG_INT_STAT_ERROR(pCblk->module) &
+           ((0x00000001 << pCblk->channel))) {
+               status |= dmacHw_INTERRUPT_STATUS_ERROR;
+       }
+
+       return status;
+}
+
+/****************************************************************************/
+/**
+*  @brief   Indentifies a DMA channel causing interrupt
+*
+*  This functions returns a channel causing interrupt of type dmacHw_INTERRUPT_STATUS_e
+*
+*  @return  NULL   : No channel causing DMA interrupt
+*           ! NULL : Handle to a channel causing DMA interrupt
+*  @note
+*     dmacHw_clearInterrupt() must be called with a valid handle after calling this function
+*/
+/****************************************************************************/
+dmacHw_HANDLE_t dmacHw_getInterruptSource(void)
+{
+       uint32_t i;
+
+       for (i = 0; i < dmaChannelCount_0 + dmaChannelCount_1; i++) {
+               if ((dmacHw_REG_INT_STAT_TRAN(dmacHw_gCblk[i].module) &
+                    ((0x00000001 << dmacHw_gCblk[i].channel)))
+                   || (dmacHw_REG_INT_STAT_BLOCK(dmacHw_gCblk[i].module) &
+                       ((0x00000001 << dmacHw_gCblk[i].channel)))
+                   || (dmacHw_REG_INT_STAT_ERROR(dmacHw_gCblk[i].module) &
+                       ((0x00000001 << dmacHw_gCblk[i].channel)))
+                   ) {
+                       return dmacHw_CBLK_TO_HANDLE(&dmacHw_gCblk[i]);
+               }
+       }
+       return dmacHw_CBLK_TO_HANDLE(NULL);
+}
+
+/****************************************************************************/
+/**
+*  @brief  Estimates number of descriptor needed to perform certain DMA transfer
+*
+*
+*  @return  On failure : -1
+*           On success : Number of descriptor count
+*
+*
+*/
+/****************************************************************************/
+int dmacHw_calculateDescriptorCount(dmacHw_CONFIG_t *pConfig,  /*   [ IN ] Configuration settings */
+                                   void *pSrcAddr,     /*   [ IN ] Source (Peripheral/Memory) address */
+                                   void *pDstAddr,     /*   [ IN ] Destination (Peripheral/Memory) address */
+                                   size_t dataLen      /*   [ IN ] Data length in bytes */
+    ) {
+       int srcTs = 0;
+       int oddSize = 0;
+       int descCount = 0;
+       int dstTrSize = 0;
+       int srcTrSize = 0;
+       uint32_t maxBlockSize = dmacHw_MAX_BLOCKSIZE;
+       dmacHw_TRANSACTION_WIDTH_e dstTrWidth;
+       dmacHw_TRANSACTION_WIDTH_e srcTrWidth;
+
+       dstTrSize = dmacHw_GetTrWidthInBytes(pConfig->dstMaxTransactionWidth);
+       srcTrSize = dmacHw_GetTrWidthInBytes(pConfig->srcMaxTransactionWidth);
+
+       /* Skip Tx if buffer is NULL  or length is unknown */
+       if ((pSrcAddr == NULL) || (pDstAddr == NULL) || (dataLen == 0)) {
+               /* Do not initiate transfer */
+               return -1;
+       }
+
+       /* Ensure scatter and gather are transaction aligned */
+       if (pConfig->srcGatherWidth % srcTrSize
+           || pConfig->dstScatterWidth % dstTrSize) {
+               return -1;
+       }
+
+       /*
+          Background 1: DMAC can not perform DMA if source and destination addresses are
+          not properly aligned with the channel's transaction width. So, for successful
+          DMA transfer, transaction width must be set according to the alignment of the
+          source and destination address.
+        */
+
+       /* Adjust destination transaction width if destination address is not aligned properly */
+       dstTrWidth = pConfig->dstMaxTransactionWidth;
+       while (dmacHw_ADDRESS_MASK(dstTrSize) & (uint32_t) pDstAddr) {
+               dstTrWidth = dmacHw_GetNextTrWidth(dstTrWidth);
+               dstTrSize = dmacHw_GetTrWidthInBytes(dstTrWidth);
+       }
+
+       /* Adjust source transaction width if source address is not aligned properly */
+       srcTrWidth = pConfig->srcMaxTransactionWidth;
+       while (dmacHw_ADDRESS_MASK(srcTrSize) & (uint32_t) pSrcAddr) {
+               srcTrWidth = dmacHw_GetNextTrWidth(srcTrWidth);
+               srcTrSize = dmacHw_GetTrWidthInBytes(srcTrWidth);
+       }
+
+       /* Find the maximum transaction per descriptor */
+       if (pConfig->maxDataPerBlock
+           && ((pConfig->maxDataPerBlock / srcTrSize) <
+               dmacHw_MAX_BLOCKSIZE)) {
+               maxBlockSize = pConfig->maxDataPerBlock / srcTrSize;
+       }
+
+       /* Find number of source transactions needed to complete the DMA transfer */
+       srcTs = dataLen / srcTrSize;
+       /* Find the odd number of bytes that need to be transferred as single byte transaction width */
+       if (srcTs && (dstTrSize > srcTrSize)) {
+               oddSize = dataLen % dstTrSize;
+               /* Adjust source transaction count due to "oddSize" */
+               srcTs = srcTs - (oddSize / srcTrSize);
+       } else {
+               oddSize = dataLen % srcTrSize;
+       }
+       /* Adjust "descCount" due to "oddSize" */
+       if (oddSize) {
+               descCount++;
+       }
+
+       /* Find the number of descriptor needed for total "srcTs" */
+       if (srcTs) {
+               descCount += ((srcTs - 1) / maxBlockSize) + 1;
+       }
+
+       return descCount;
+}
+
+/****************************************************************************/
+/**
+*  @brief   Check the existance of pending descriptor
+*
+*  This function confirmes if there is any pending descriptor in the chain
+*  to program the channel
+*
+*  @return  1 : Channel need to be programmed with pending descriptor
+*           0 : No more pending descriptor to programe the channel
+*
+*  @note
+*     - This function should be called from ISR in case there are pending
+*       descriptor to program the channel.
+*
+*     Example:
+*
+*     dmac_isr ()
+*     {
+*         ...
+*         if (dmacHw_descriptorPending (handle))
+*         {
+*            dmacHw_initiateTransfer (handle);
+*         }
+*     }
+*
+*/
+/****************************************************************************/
+uint32_t dmacHw_descriptorPending(dmacHw_HANDLE_t handle,      /*   [ IN ] DMA Channel handle */
+                                 void *pDescriptor     /*   [ IN ] Descriptor buffer */
+    ) {
+       dmacHw_CBLK_t *pCblk = dmacHw_HANDLE_TO_CBLK(handle);
+       dmacHw_DESC_RING_t *pRing = dmacHw_GET_DESC_RING(pDescriptor);
+
+       /* Make sure channel is not busy */
+       if (!CHANNEL_BUSY(pCblk->module, pCblk->channel)) {
+               /* Check if pEnd is not processed */
+               if (pRing->pEnd) {
+                       /* Something left for processing */
+                       return 1;
+               }
+       }
+       return 0;
+}
+
+/****************************************************************************/
+/**
+*  @brief   Program channel register to stop transfer
+*
+*  Ensures the channel is not doing any transfer after calling this function
+*
+*  @return  void
+*
+*/
+/****************************************************************************/
+void dmacHw_stopTransfer(dmacHw_HANDLE_t handle        /*   [ IN ] DMA Channel handle */
+    ) {
+       dmacHw_CBLK_t *pCblk;
+
+       pCblk = dmacHw_HANDLE_TO_CBLK(handle);
+
+       /* Stop the channel */
+       dmacHw_DMA_STOP(pCblk->module, pCblk->channel);
+}
+
+/****************************************************************************/
+/**
+*  @brief   Deallocates source or destination memory, allocated
+*
+*  This function can be called to deallocate data memory that was DMAed successfully
+*
+*  @return  On failure : -1
+*           On success : Number of buffer freed
+*
+*  @note
+*     This function will be called ONLY, when source OR destination address is pointing
+*     to dynamic memory
+*/
+/****************************************************************************/
+int dmacHw_freeMem(dmacHw_CONFIG_t *pConfig,   /*   [ IN ] Configuration settings */
+                  void *pDescriptor,   /*   [ IN ] Descriptor buffer */
+                  void (*fpFree) (void *)      /*   [ IN ] Function pointer to free data memory */
+    ) {
+       dmacHw_DESC_RING_t *pRing = dmacHw_GET_DESC_RING(pDescriptor);
+       uint32_t count = 0;
+
+       if (fpFree == NULL) {
+               return -1;
+       }
+
+       while ((pRing->pFree != pRing->pTail)
+              && (pRing->pFree->ctl.lo & dmacHw_DESC_FREE)) {
+               if (pRing->pFree->devCtl == dmacHw_FREE_USER_MEMORY) {
+                       /* Identify, which memory to free */
+                       if (dmacHw_DST_IS_MEMORY(pConfig->transferType)) {
+                               (*fpFree) ((void *)pRing->pFree->dar);
+                       } else {
+                               /* Destination was a peripheral */
+                               (*fpFree) ((void *)pRing->pFree->sar);
+                       }
+                       /* Unmark user memory to indicate it is freed */
+                       pRing->pFree->devCtl = ~dmacHw_FREE_USER_MEMORY;
+               }
+               dmacHw_NEXT_DESC(pRing, pFree);
+
+               count++;
+       }
+
+       return count;
+}
+
+/****************************************************************************/
+/**
+*  @brief   Prepares descriptor ring, when source peripheral working as a flow controller
+*
+*  This function will update the discriptor ring by allocating buffers, when source peripheral
+*  has to work as a flow controller to transfer data from:
+*           - Peripheral to memory.
+*
+*  @return  On failure : -1
+*           On success : Number of descriptor updated
+*
+*
+*  @note
+*     Channel must be configured for peripheral to memory transfer
+*
+*/
+/****************************************************************************/
+int dmacHw_setVariableDataDescriptor(dmacHw_HANDLE_t handle,   /*   [ IN ] DMA Channel handle */
+                                    dmacHw_CONFIG_t *pConfig,  /*   [ IN ] Configuration settings */
+                                    void *pDescriptor, /*   [ IN ] Descriptor buffer */
+                                    uint32_t srcAddr,  /*   [ IN ] Source peripheral address */
+                                    void *(*fpAlloc) (int len),        /*   [ IN ] Function pointer  that provides destination memory */
+                                    int len,   /*   [ IN ] Number of bytes "fpAlloc" will allocate for destination */
+                                    int num    /*   [ IN ] Number of descriptor to set */
+    ) {
+       dmacHw_CBLK_t *pCblk = dmacHw_HANDLE_TO_CBLK(handle);
+       dmacHw_DESC_t *pProg = NULL;
+       dmacHw_DESC_t *pLast = NULL;
+       dmacHw_DESC_RING_t *pRing = dmacHw_GET_DESC_RING(pDescriptor);
+       uint32_t dstAddr;
+       uint32_t controlParam;
+       int i;
+
+       dmacHw_ASSERT(pConfig->transferType ==
+                     dmacHw_TRANSFER_TYPE_PERIPHERAL_TO_MEM);
+
+       if (num > pRing->num) {
+               return -1;
+       }
+
+       pLast = pRing->pEnd;    /* Last descriptor updated */
+       pProg = pRing->pHead;   /* First descriptor in the new list */
+
+       controlParam = pConfig->srcUpdate |
+           pConfig->dstUpdate |
+           pConfig->srcMaxTransactionWidth |
+           pConfig->dstMaxTransactionWidth |
+           pConfig->srcMasterInterface |
+           pConfig->dstMasterInterface |
+           pConfig->srcMaxBurstWidth |
+           pConfig->dstMaxBurstWidth |
+           dmacHw_REG_CTL_TTFC_PM_PERI |
+           dmacHw_REG_CTL_LLP_DST_EN |
+           dmacHw_REG_CTL_LLP_SRC_EN | dmacHw_REG_CTL_INT_EN;
+
+       for (i = 0; i < num; i++) {
+               /* Allocate Rx buffer only for idle descriptor */
+               if (((pRing->pHead->ctl.hi & dmacHw_DESC_FREE) == 0) ||
+                   ((dmacHw_DESC_t *) pRing->pHead->llp == pRing->pTail)
+                   ) {
+                       /* Rx descriptor is not idle */
+                       break;
+               }
+               /* Set source address */
+               pRing->pHead->sar = srcAddr;
+               if (fpAlloc) {
+                       /* Allocate memory for buffer in descriptor */
+                       dstAddr = (uint32_t) (*fpAlloc) (len);
+                       /* Check the destination address */
+                       if (dstAddr == 0) {
+                               if (i == 0) {
+                                       /* Not a single descriptor is available */
+                                       return -1;
+                               }
+                               break;
+                       }
+                       /* Set destination address */
+                       pRing->pHead->dar = dstAddr;
+               }
+               /* Set control information */
+               pRing->pHead->ctl.lo = controlParam;
+               /* Use "devCtl" to mark the memory that need to be freed later */
+               pRing->pHead->devCtl = dmacHw_FREE_USER_MEMORY;
+               /* Descriptor is now owned by the channel */
+               pRing->pHead->ctl.hi = 0;
+               /* Remember the descriptor last updated */
+               pRing->pEnd = pRing->pHead;
+               /* Update next descriptor */
+               dmacHw_NEXT_DESC(pRing, pHead);
+       }
+
+       /* Mark the end of the list */
+       pRing->pEnd->ctl.lo &=
+           ~(dmacHw_REG_CTL_LLP_DST_EN | dmacHw_REG_CTL_LLP_SRC_EN);
+       /* Connect the list */
+       if (pLast != pProg) {
+               pLast->ctl.lo |=
+                   dmacHw_REG_CTL_LLP_DST_EN | dmacHw_REG_CTL_LLP_SRC_EN;
+       }
+       /* Mark the descriptors are updated */
+       pCblk->descUpdated = 1;
+       if (!pCblk->varDataStarted) {
+               /* LLP must be pointing to the first descriptor */
+               dmacHw_SET_LLP(pCblk->module, pCblk->channel,
+                              (uint32_t) pProg - pRing->virt2PhyOffset);
+               /* Channel, handling variable data started */
+               pCblk->varDataStarted = 1;
+       }
+
+       return i;
+}
+
+/****************************************************************************/
+/**
+*  @brief   Read data DMAed to memory
+*
+*  This function will read data that has been DMAed to memory while transfering from:
+*          - Memory to memory
+*          - Peripheral to memory
+*
+*  @param    handle     -
+*  @param    ppBbuf     -
+*  @param    pLen       -
+*
+*  @return  0 - No more data is available to read
+*           1 - More data might be available to read
+*
+*/
+/****************************************************************************/
+int dmacHw_readTransferredData(dmacHw_HANDLE_t handle, /*  [ IN ] DMA Channel handle */
+                              dmacHw_CONFIG_t *pConfig,        /*   [ IN ]  Configuration settings */
+                              void *pDescriptor,       /*   [ IN ] Descriptor buffer */
+                              void **ppBbuf,   /*   [ OUT ] Data received */
+                              size_t *pLlen    /*   [ OUT ] Length of the data received */
+    ) {
+       dmacHw_DESC_RING_t *pRing = dmacHw_GET_DESC_RING(pDescriptor);
+
+       (void)handle;
+
+       if (pConfig->transferMode != dmacHw_TRANSFER_MODE_CONTINUOUS) {
+               if (((pRing->pTail->ctl.hi & dmacHw_DESC_FREE) == 0) ||
+                   (pRing->pTail == pRing->pHead)
+                   ) {
+                       /* No receive data available */
+                       *ppBbuf = (char *)NULL;
+                       *pLlen = 0;
+
+                       return 0;
+               }
+       }
+
+       /* Return read buffer and length */
+       *ppBbuf = (char *)pRing->pTail->dar;
+
+       /* Extract length of the received data */
+       if (DmaIsFlowController(pDescriptor)) {
+               uint32_t srcTrSize = 0;
+
+               switch (pRing->pTail->ctl.lo & dmacHw_REG_CTL_SRC_TR_WIDTH_MASK) {
+               case dmacHw_REG_CTL_SRC_TR_WIDTH_8:
+                       srcTrSize = 1;
+                       break;
+               case dmacHw_REG_CTL_SRC_TR_WIDTH_16:
+                       srcTrSize = 2;
+                       break;
+               case dmacHw_REG_CTL_SRC_TR_WIDTH_32:
+                       srcTrSize = 4;
+                       break;
+               case dmacHw_REG_CTL_SRC_TR_WIDTH_64:
+                       srcTrSize = 8;
+                       break;
+               default:
+                       dmacHw_ASSERT(0);
+               }
+               /* Calculate length from the block size */
+               *pLlen =
+                   (pRing->pTail->ctl.hi & dmacHw_REG_CTL_BLOCK_TS_MASK) *
+                   srcTrSize;
+       } else {
+               /* Extract length from the source peripheral */
+               *pLlen = pRing->pTail->sstat;
+       }
+
+       /* Advance tail to next descriptor */
+       dmacHw_NEXT_DESC(pRing, pTail);
+
+       return 1;
+}
+
+/****************************************************************************/
+/**
+*  @brief   Set descriptor carrying control information
+*
+*  This function will be used to send specific control information to the device
+*  using the DMA channel
+*
+*
+*  @return  -1 - On failure
+*            0 - On success
+*
+*  @note
+*     None
+*/
+/****************************************************************************/
+int dmacHw_setControlDescriptor(dmacHw_CONFIG_t *pConfig,      /*   [ IN ] Configuration settings */
+                               void *pDescriptor,      /*   [ IN ] Descriptor buffer */
+                               uint32_t ctlAddress,    /*   [ IN ] Address of the device control register */
+                               uint32_t control        /*   [ IN ] Device control information */
+    ) {
+       dmacHw_DESC_RING_t *pRing = dmacHw_GET_DESC_RING(pDescriptor);
+
+       if (ctlAddress == 0) {
+               return -1;
+       }
+
+       /* Check the availability of descriptors in the ring */
+       if ((pRing->pHead->ctl.hi & dmacHw_DESC_FREE) == 0) {
+               return -1;
+       }
+       /* Set control information */
+       pRing->pHead->devCtl = control;
+       /* Set source and destination address */
+       pRing->pHead->sar = (uint32_t) &pRing->pHead->devCtl;
+       pRing->pHead->dar = ctlAddress;
+       /* Set control parameters */
+       if (pConfig->flowControler == dmacHw_FLOW_CONTROL_DMA) {
+               pRing->pHead->ctl.lo = pConfig->transferType |
+                   dmacHw_SRC_ADDRESS_UPDATE_MODE_INC |
+                   dmacHw_DST_ADDRESS_UPDATE_MODE_INC |
+                   dmacHw_SRC_TRANSACTION_WIDTH_32 |
+                   pConfig->dstMaxTransactionWidth |
+                   dmacHw_SRC_BURST_WIDTH_0 |
+                   dmacHw_DST_BURST_WIDTH_0 |
+                   pConfig->srcMasterInterface |
+                   pConfig->dstMasterInterface | dmacHw_REG_CTL_INT_EN;
+       } else {
+               uint32_t transferType = 0;
+               switch (pConfig->transferType) {
+               case dmacHw_TRANSFER_TYPE_PERIPHERAL_TO_MEM:
+                       transferType = dmacHw_REG_CTL_TTFC_PM_PERI;
+                       break;
+               case dmacHw_TRANSFER_TYPE_MEM_TO_PERIPHERAL:
+                       transferType = dmacHw_REG_CTL_TTFC_MP_PERI;
+                       break;
+               default:
+                       dmacHw_ASSERT(0);
+               }
+               pRing->pHead->ctl.lo = transferType |
+                   dmacHw_SRC_ADDRESS_UPDATE_MODE_INC |
+                   dmacHw_DST_ADDRESS_UPDATE_MODE_INC |
+                   dmacHw_SRC_TRANSACTION_WIDTH_32 |
+                   pConfig->dstMaxTransactionWidth |
+                   dmacHw_SRC_BURST_WIDTH_0 |
+                   dmacHw_DST_BURST_WIDTH_0 |
+                   pConfig->srcMasterInterface |
+                   pConfig->dstMasterInterface |
+                   pConfig->flowControler | dmacHw_REG_CTL_INT_EN;
+       }
+
+       /* Set block transaction size to one 32 bit transaction */
+       pRing->pHead->ctl.hi = dmacHw_REG_CTL_BLOCK_TS_MASK & 1;
+
+       /* Remember the descriptor to initialize the registers */
+       if (pRing->pProg == dmacHw_DESC_INIT) {
+               pRing->pProg = pRing->pHead;
+       }
+       pRing->pEnd = pRing->pHead;
+
+       /* Advance the descriptor */
+       dmacHw_NEXT_DESC(pRing, pHead);
+
+       /* Update Tail pointer if destination is a peripheral */
+       if (!dmacHw_DST_IS_MEMORY(pConfig->transferType)) {
+               pRing->pTail = pRing->pHead;
+       }
+       return 0;
+}
+
+/****************************************************************************/
+/**
+*  @brief   Sets channel specific user data
+*
+*  This function associates user data to a specif DMA channel
+*
+*/
+/****************************************************************************/
+void dmacHw_setChannelUserData(dmacHw_HANDLE_t handle, /*  [ IN ] DMA Channel handle */
+                              void *userData   /*  [ IN ] User data */
+    ) {
+       dmacHw_CBLK_t *pCblk = dmacHw_HANDLE_TO_CBLK(handle);
+
+       pCblk->userData = userData;
+}
+
+/****************************************************************************/
+/**
+*  @brief   Gets channel specific user data
+*
+*  This function returns user data specific to a DMA channel
+*
+*  @return   user data
+*/
+/****************************************************************************/
+void *dmacHw_getChannelUserData(dmacHw_HANDLE_t handle /*  [ IN ] DMA Channel handle */
+    ) {
+       dmacHw_CBLK_t *pCblk = dmacHw_HANDLE_TO_CBLK(handle);
+
+       return pCblk->userData;
+}
+
+/****************************************************************************/
+/**
+*  @brief   Resets descriptor control information
+*
+*  @return  void
+*/
+/****************************************************************************/
+void dmacHw_resetDescriptorControl(void *pDescriptor   /*   [ IN ] Descriptor buffer  */
+    ) {
+       int i;
+       dmacHw_DESC_RING_t *pRing;
+       dmacHw_DESC_t *pDesc;
+
+       pRing = dmacHw_GET_DESC_RING(pDescriptor);
+       pDesc = pRing->pHead;
+
+       for (i = 0; i < pRing->num; i++) {
+               /* Mark descriptor is ready to use */
+               pDesc->ctl.hi = dmacHw_DESC_FREE;
+               /* Look into next link list item */
+               pDesc++;
+       }
+       pRing->pFree = pRing->pTail = pRing->pEnd = pRing->pHead;
+       pRing->pProg = dmacHw_DESC_INIT;
+}
+
+/****************************************************************************/
+/**
+*  @brief   Displays channel specific registers and other control parameters
+*
+*  @return  void
+*
+*
+*  @note
+*     None
+*/
+/****************************************************************************/
+void dmacHw_printDebugInfo(dmacHw_HANDLE_t handle,     /*  [ IN ] DMA Channel handle */
+                          void *pDescriptor,   /*   [ IN ] Descriptor buffer */
+                          int (*fpPrint) (const char *, ...)   /*  [ IN ] Print callback function */
+    ) {
+       dmacHw_CBLK_t *pCblk = dmacHw_HANDLE_TO_CBLK(handle);
+
+       DisplayRegisterContents(pCblk->module, pCblk->channel, fpPrint);
+       DisplayDescRing(pDescriptor, fpPrint);
+}
diff --git a/arch/arm/mach-bcmring/csp/tmr/Makefile b/arch/arm/mach-bcmring/csp/tmr/Makefile
new file mode 100644 (file)
index 0000000..244a61a
--- /dev/null
@@ -0,0 +1 @@
+obj-y += tmrHw.o
diff --git a/arch/arm/mach-bcmring/csp/tmr/tmrHw.c b/arch/arm/mach-bcmring/csp/tmr/tmrHw.c
new file mode 100644 (file)
index 0000000..5c1c9a0
--- /dev/null
@@ -0,0 +1,576 @@
+/*****************************************************************************
+* Copyright 2003 - 2008 Broadcom Corporation.  All rights reserved.
+*
+* Unless you and Broadcom execute a separate written software license
+* agreement governing use of this software, this software is licensed to you
+* under the terms of the GNU General Public License version 2, available at
+* http://www.broadcom.com/licenses/GPLv2.php (the "GPL").
+*
+* Notwithstanding the above, under no circumstances may you combine this
+* software in any way with any other Broadcom software provided under a
+* license other than the GPL, without Broadcom's express prior written
+* consent.
+*****************************************************************************/
+
+/****************************************************************************/
+/**
+*  @file    tmrHw.c
+*
+*  @brief   Low level Timer driver routines
+*
+*  @note
+*
+*   These routines provide basic timer functionality only.
+*/
+/****************************************************************************/
+
+/* ---- Include Files ---------------------------------------------------- */
+
+#include <csp/errno.h>
+#include <csp/stdint.h>
+
+#include <csp/tmrHw.h>
+#include <mach/csp/tmrHw_reg.h>
+
+#define tmrHw_ASSERT(a)                     if (!(a)) *(char *)0 = 0
+#define tmrHw_MILLISEC_PER_SEC              (1000)
+
+#define tmrHw_LOW_1_RESOLUTION_COUNT        (tmrHw_LOW_RESOLUTION_CLOCK / tmrHw_MILLISEC_PER_SEC)
+#define tmrHw_LOW_1_MAX_MILLISEC            (0xFFFFFFFF / tmrHw_LOW_1_RESOLUTION_COUNT)
+#define tmrHw_LOW_16_RESOLUTION_COUNT       (tmrHw_LOW_1_RESOLUTION_COUNT / 16)
+#define tmrHw_LOW_16_MAX_MILLISEC           (0xFFFFFFFF / tmrHw_LOW_16_RESOLUTION_COUNT)
+#define tmrHw_LOW_256_RESOLUTION_COUNT      (tmrHw_LOW_1_RESOLUTION_COUNT / 256)
+#define tmrHw_LOW_256_MAX_MILLISEC          (0xFFFFFFFF / tmrHw_LOW_256_RESOLUTION_COUNT)
+
+#define tmrHw_HIGH_1_RESOLUTION_COUNT       (tmrHw_HIGH_RESOLUTION_CLOCK / tmrHw_MILLISEC_PER_SEC)
+#define tmrHw_HIGH_1_MAX_MILLISEC           (0xFFFFFFFF / tmrHw_HIGH_1_RESOLUTION_COUNT)
+#define tmrHw_HIGH_16_RESOLUTION_COUNT      (tmrHw_HIGH_1_RESOLUTION_COUNT / 16)
+#define tmrHw_HIGH_16_MAX_MILLISEC          (0xFFFFFFFF / tmrHw_HIGH_16_RESOLUTION_COUNT)
+#define tmrHw_HIGH_256_RESOLUTION_COUNT     (tmrHw_HIGH_1_RESOLUTION_COUNT / 256)
+#define tmrHw_HIGH_256_MAX_MILLISEC         (0xFFFFFFFF / tmrHw_HIGH_256_RESOLUTION_COUNT)
+
+static void ResetTimer(tmrHw_ID_t timerId)
+    __attribute__ ((section(".aramtext")));
+static int tmrHw_divide(int num, int denom)
+    __attribute__ ((section(".aramtext")));
+
+/****************************************************************************/
+/**
+*  @brief   Get timer capability
+*
+*  This function returns various capabilities/attributes of a timer
+*
+*  @return  Capability
+*
+*/
+/****************************************************************************/
+uint32_t tmrHw_getTimerCapability(tmrHw_ID_t timerId,  /*  [ IN ] Timer Id */
+                                 tmrHw_CAPABILITY_e capability /*  [ IN ] Timer capability */
+) {
+       switch (capability) {
+       case tmrHw_CAPABILITY_CLOCK:
+               return (timerId <=
+                       1) ? tmrHw_LOW_RESOLUTION_CLOCK :
+                   tmrHw_HIGH_RESOLUTION_CLOCK;
+       case tmrHw_CAPABILITY_RESOLUTION:
+               return 32;
+       default:
+               return 0;
+       }
+       return 0;
+}
+
+/****************************************************************************/
+/**
+*  @brief   Resets a timer
+*
+*  This function initializes  timer
+*
+*  @return  void
+*
+*/
+/****************************************************************************/
+static void ResetTimer(tmrHw_ID_t timerId      /*  [ IN ] Timer Id */
+) {
+       /* Reset timer */
+       pTmrHw[timerId].LoadValue = 0;
+       pTmrHw[timerId].CurrentValue = 0xFFFFFFFF;
+       pTmrHw[timerId].Control = 0;
+       pTmrHw[timerId].BackgroundLoad = 0;
+       /* Always configure as a 32 bit timer */
+       pTmrHw[timerId].Control |= tmrHw_CONTROL_32BIT;
+       /* Clear interrupt only if raw status interrupt is set */
+       if (pTmrHw[timerId].RawInterruptStatus) {
+               pTmrHw[timerId].InterruptClear = 0xFFFFFFFF;
+       }
+}
+
+/****************************************************************************/
+/**
+*  @brief   Sets counter value for an interval in ms
+*
+*  @return   On success: Effective counter value set
+*            On failure: 0
+*
+*/
+/****************************************************************************/
+static tmrHw_INTERVAL_t SetTimerPeriod(tmrHw_ID_t timerId,     /*  [ IN ] Timer Id */
+                                      tmrHw_INTERVAL_t msec    /*  [ IN ] Interval in milli-second */
+) {
+       uint32_t scale = 0;
+       uint32_t count = 0;
+
+       if (timerId == 0 || timerId == 1) {
+               if (msec <= tmrHw_LOW_1_MAX_MILLISEC) {
+                       pTmrHw[timerId].Control |= tmrHw_CONTROL_PRESCALE_1;
+                       scale = tmrHw_LOW_1_RESOLUTION_COUNT;
+               } else if (msec <= tmrHw_LOW_16_MAX_MILLISEC) {
+                       pTmrHw[timerId].Control |= tmrHw_CONTROL_PRESCALE_16;
+                       scale = tmrHw_LOW_16_RESOLUTION_COUNT;
+               } else if (msec <= tmrHw_LOW_256_MAX_MILLISEC) {
+                       pTmrHw[timerId].Control |= tmrHw_CONTROL_PRESCALE_256;
+                       scale = tmrHw_LOW_256_RESOLUTION_COUNT;
+               } else {
+                       return 0;
+               }
+
+               count = msec * scale;
+               /* Set counter value */
+               pTmrHw[timerId].LoadValue = count;
+               pTmrHw[timerId].BackgroundLoad = count;
+
+       } else if (timerId == 2 || timerId == 3) {
+               if (msec <= tmrHw_HIGH_1_MAX_MILLISEC) {
+                       pTmrHw[timerId].Control |= tmrHw_CONTROL_PRESCALE_1;
+                       scale = tmrHw_HIGH_1_RESOLUTION_COUNT;
+               } else if (msec <= tmrHw_HIGH_16_MAX_MILLISEC) {
+                       pTmrHw[timerId].Control |= tmrHw_CONTROL_PRESCALE_16;
+                       scale = tmrHw_HIGH_16_RESOLUTION_COUNT;
+               } else if (msec <= tmrHw_HIGH_256_MAX_MILLISEC) {
+                       pTmrHw[timerId].Control |= tmrHw_CONTROL_PRESCALE_256;
+                       scale = tmrHw_HIGH_256_RESOLUTION_COUNT;
+               } else {
+                       return 0;
+               }
+
+               count = msec * scale;
+               /* Set counter value */
+               pTmrHw[timerId].LoadValue = count;
+               pTmrHw[timerId].BackgroundLoad = count;
+       }
+       return count / scale;
+}
+
+/****************************************************************************/
+/**
+*  @brief   Configures a periodic timer in terms of timer interrupt rate
+*
+*  This function initializes a periodic timer to generate specific number of
+*  timer interrupt per second
+*
+*  @return   On success: Effective timer frequency
+*            On failure: 0
+*
+*/
+/****************************************************************************/
+tmrHw_RATE_t tmrHw_setPeriodicTimerRate(tmrHw_ID_t timerId,    /*  [ IN ] Timer Id */
+                                       tmrHw_RATE_t rate       /*  [ IN ] Number of timer interrupt per second */
+) {
+       uint32_t resolution = 0;
+       uint32_t count = 0;
+       ResetTimer(timerId);
+
+       /* Set timer mode periodic */
+       pTmrHw[timerId].Control |= tmrHw_CONTROL_PERIODIC;
+       pTmrHw[timerId].Control &= ~tmrHw_CONTROL_ONESHOT;
+       /* Set timer in highest resolution */
+       pTmrHw[timerId].Control |= tmrHw_CONTROL_PRESCALE_1;
+
+       if (rate && (timerId == 0 || timerId == 1)) {
+               if (rate > tmrHw_LOW_RESOLUTION_CLOCK) {
+                       return 0;
+               }
+               resolution = tmrHw_LOW_RESOLUTION_CLOCK;
+       } else if (rate && (timerId == 2 || timerId == 3)) {
+               if (rate > tmrHw_HIGH_RESOLUTION_CLOCK) {
+                       return 0;
+               } else {
+                       resolution = tmrHw_HIGH_RESOLUTION_CLOCK;
+               }
+       } else {
+               return 0;
+       }
+       /* Find the counter value */
+       count = resolution / rate;
+       /* Set counter value */
+       pTmrHw[timerId].LoadValue = count;
+       pTmrHw[timerId].BackgroundLoad = count;
+
+       return resolution / count;
+}
+
+/****************************************************************************/
+/**
+*  @brief   Configures a periodic timer to generate timer interrupt after
+*           certain time interval
+*
+*  This function initializes a periodic timer to generate timer interrupt
+*  after every time interval in millisecond
+*
+*  @return   On success: Effective interval set in milli-second
+*            On failure: 0
+*
+*/
+/****************************************************************************/
+tmrHw_INTERVAL_t tmrHw_setPeriodicTimerInterval(tmrHw_ID_t timerId,    /*  [ IN ] Timer Id */
+                                               tmrHw_INTERVAL_t msec   /*  [ IN ] Interval in milli-second */
+) {
+       ResetTimer(timerId);
+
+       /* Set timer mode periodic */
+       pTmrHw[timerId].Control |= tmrHw_CONTROL_PERIODIC;
+       pTmrHw[timerId].Control &= ~tmrHw_CONTROL_ONESHOT;
+
+       return SetTimerPeriod(timerId, msec);
+}
+
+/****************************************************************************/
+/**
+*  @brief   Configures a periodic timer to generate timer interrupt just once
+*           after certain time interval
+*
+*  This function initializes a periodic timer to generate a single ticks after
+*  certain time interval in millisecond
+*
+*  @return   On success: Effective interval set in milli-second
+*            On failure: 0
+*
+*/
+/****************************************************************************/
+tmrHw_INTERVAL_t tmrHw_setOneshotTimerInterval(tmrHw_ID_t timerId,     /*  [ IN ] Timer Id */
+                                              tmrHw_INTERVAL_t msec    /*  [ IN ] Interval in milli-second */
+) {
+       ResetTimer(timerId);
+
+       /* Set timer mode oneshot */
+       pTmrHw[timerId].Control |= tmrHw_CONTROL_PERIODIC;
+       pTmrHw[timerId].Control |= tmrHw_CONTROL_ONESHOT;
+
+       return SetTimerPeriod(timerId, msec);
+}
+
+/****************************************************************************/
+/**
+*  @brief   Configures a timer to run as a free running timer
+*
+*  This function initializes a timer to run as a free running timer
+*
+*  @return   Timer resolution (count / sec)
+*
+*/
+/****************************************************************************/
+tmrHw_RATE_t tmrHw_setFreeRunningTimer(tmrHw_ID_t timerId,     /*  [ IN ] Timer Id */
+                                      uint32_t divider /*  [ IN ] Dividing the clock frequency */
+) {
+       uint32_t scale = 0;
+
+       ResetTimer(timerId);
+       /* Set timer as free running mode */
+       pTmrHw[timerId].Control &= ~tmrHw_CONTROL_PERIODIC;
+       pTmrHw[timerId].Control &= ~tmrHw_CONTROL_ONESHOT;
+
+       if (divider >= 64) {
+               pTmrHw[timerId].Control |= tmrHw_CONTROL_PRESCALE_256;
+               scale = 256;
+       } else if (divider >= 8) {
+               pTmrHw[timerId].Control |= tmrHw_CONTROL_PRESCALE_16;
+               scale = 16;
+       } else {
+               pTmrHw[timerId].Control |= tmrHw_CONTROL_PRESCALE_1;
+               scale = 1;
+       }
+
+       if (timerId == 0 || timerId == 1) {
+               return tmrHw_divide(tmrHw_LOW_RESOLUTION_CLOCK, scale);
+       } else if (timerId == 2 || timerId == 3) {
+               return tmrHw_divide(tmrHw_HIGH_RESOLUTION_CLOCK, scale);
+       }
+
+       return 0;
+}
+
+/****************************************************************************/
+/**
+*  @brief   Starts a timer
+*
+*  This function starts a preconfigured timer
+*
+*  @return  -1     - On Failure
+*            0     - On Success
+*
+*/
+/****************************************************************************/
+int tmrHw_startTimer(tmrHw_ID_t timerId        /*  [ IN ] Timer id */
+) {
+       pTmrHw[timerId].Control |= tmrHw_CONTROL_TIMER_ENABLE;
+       return 0;
+}
+
+/****************************************************************************/
+/**
+*  @brief   Stops a timer
+*
+*  This function stops a running timer
+*
+*  @return  -1     - On Failure
+*            0     - On Success
+*
+*/
+/****************************************************************************/
+int tmrHw_stopTimer(tmrHw_ID_t timerId /*  [ IN ] Timer id */
+) {
+       pTmrHw[timerId].Control &= ~tmrHw_CONTROL_TIMER_ENABLE;
+       return 0;
+}
+
+/****************************************************************************/
+/**
+*  @brief   Gets current timer count
+*
+*  This function returns the current timer value
+*
+*  @return  Current downcounting timer value
+*
+*/
+/****************************************************************************/
+uint32_t tmrHw_GetCurrentCount(tmrHw_ID_t timerId      /*  [ IN ] Timer id */
+) {
+       /* return 32 bit timer value */
+       switch (pTmrHw[timerId].Control & tmrHw_CONTROL_MODE_MASK) {
+       case tmrHw_CONTROL_FREE_RUNNING:
+               if (pTmrHw[timerId].CurrentValue) {
+                       return tmrHw_MAX_COUNT - pTmrHw[timerId].CurrentValue;
+               }
+               break;
+       case tmrHw_CONTROL_PERIODIC:
+       case tmrHw_CONTROL_ONESHOT:
+               return pTmrHw[timerId].BackgroundLoad -
+                   pTmrHw[timerId].CurrentValue;
+       }
+       return 0;
+}
+
+/****************************************************************************/
+/**
+*  @brief   Gets timer count rate
+*
+*  This function returns the number of counts per second
+*
+*  @return  Count rate
+*
+*/
+/****************************************************************************/
+tmrHw_RATE_t tmrHw_getCountRate(tmrHw_ID_t timerId     /*  [ IN ] Timer id */
+) {
+       uint32_t divider = 0;
+
+       switch (pTmrHw[timerId].Control & tmrHw_CONTROL_PRESCALE_MASK) {
+       case tmrHw_CONTROL_PRESCALE_1:
+               divider = 1;
+               break;
+       case tmrHw_CONTROL_PRESCALE_16:
+               divider = 16;
+               break;
+       case tmrHw_CONTROL_PRESCALE_256:
+               divider = 256;
+               break;
+       default:
+               tmrHw_ASSERT(0);
+       }
+
+       if (timerId == 0 || timerId == 1) {
+               return tmrHw_divide(tmrHw_LOW_RESOLUTION_CLOCK, divider);
+       } else {
+               return tmrHw_divide(tmrHw_HIGH_RESOLUTION_CLOCK, divider);
+       }
+       return 0;
+}
+
+/****************************************************************************/
+/**
+*  @brief   Enables timer interrupt
+*
+*  This function enables the timer interrupt
+*
+*  @return   N/A
+*
+*/
+/****************************************************************************/
+void tmrHw_enableInterrupt(tmrHw_ID_t timerId  /*  [ IN ] Timer id */
+) {
+       pTmrHw[timerId].Control |= tmrHw_CONTROL_INTERRUPT_ENABLE;
+}
+
+/****************************************************************************/
+/**
+*  @brief   Disables timer interrupt
+*
+*  This function disable the timer interrupt
+*
+*  @return   N/A
+*
+*/
+/****************************************************************************/
+void tmrHw_disableInterrupt(tmrHw_ID_t timerId /*  [ IN ] Timer id */
+) {
+       pTmrHw[timerId].Control &= ~tmrHw_CONTROL_INTERRUPT_ENABLE;
+}
+
+/****************************************************************************/
+/**
+*  @brief   Clears the interrupt
+*
+*  This function clears the timer interrupt
+*
+*  @return   N/A
+*
+*  @note
+*     Must be called under the context of ISR
+*/
+/****************************************************************************/
+void tmrHw_clearInterrupt(tmrHw_ID_t timerId   /*  [ IN ] Timer id */
+) {
+       pTmrHw[timerId].InterruptClear = 0x1;
+}
+
+/****************************************************************************/
+/**
+*  @brief   Gets the interrupt status
+*
+*  This function returns timer interrupt status
+*
+*  @return   Interrupt status
+*/
+/****************************************************************************/
+tmrHw_INTERRUPT_STATUS_e tmrHw_getInterruptStatus(tmrHw_ID_t timerId   /*  [ IN ] Timer id */
+) {
+       if (pTmrHw[timerId].InterruptStatus) {
+               return tmrHw_INTERRUPT_STATUS_SET;
+       } else {
+               return tmrHw_INTERRUPT_STATUS_UNSET;
+       }
+}
+
+/****************************************************************************/
+/**
+*  @brief   Indentifies a timer causing interrupt
+*
+*  This functions returns a timer causing interrupt
+*
+*  @return  0xFFFFFFFF   : No timer causing an interrupt
+*           ! 0xFFFFFFFF : timer causing an interrupt
+*  @note
+*     tmrHw_clearIntrrupt() must be called with a valid timer id after calling this function
+*/
+/****************************************************************************/
+tmrHw_ID_t tmrHw_getInterruptSource(void       /*  void */
+) {
+       int i;
+
+       for (i = 0; i < tmrHw_TIMER_NUM_COUNT; i++) {
+               if (pTmrHw[i].InterruptStatus) {
+                       return i;
+               }
+       }
+
+       return 0xFFFFFFFF;
+}
+
+/****************************************************************************/
+/**
+*  @brief   Displays specific timer registers
+*
+*
+*  @return  void
+*
+*/
+/****************************************************************************/
+void tmrHw_printDebugInfo(tmrHw_ID_t timerId,  /*  [ IN ] Timer id */
+                         int (*fpPrint) (const char *, ...)    /*  [ IN ] Print callback function */
+) {
+       (*fpPrint) ("Displaying register contents \n\n");
+       (*fpPrint) ("Timer %d: Load value              0x%X\n", timerId,
+                   pTmrHw[timerId].LoadValue);
+       (*fpPrint) ("Timer %d: Background load value   0x%X\n", timerId,
+                   pTmrHw[timerId].BackgroundLoad);
+       (*fpPrint) ("Timer %d: Control                 0x%X\n", timerId,
+                   pTmrHw[timerId].Control);
+       (*fpPrint) ("Timer %d: Interrupt clear         0x%X\n", timerId,
+                   pTmrHw[timerId].InterruptClear);
+       (*fpPrint) ("Timer %d: Interrupt raw interrupt 0x%X\n", timerId,
+                   pTmrHw[timerId].RawInterruptStatus);
+       (*fpPrint) ("Timer %d: Interrupt status        0x%X\n", timerId,
+                   pTmrHw[timerId].InterruptStatus);
+}
+
+/****************************************************************************/
+/**
+*  @brief   Use a timer to perform a busy wait delay for a number of usecs.
+*
+*  @return   N/A
+*/
+/****************************************************************************/
+void tmrHw_udelay(tmrHw_ID_t timerId,  /*  [ IN ] Timer id */
+                 unsigned long usecs /*  [ IN ] usec to delay */
+) {
+       tmrHw_RATE_t usec_tick_rate;
+       tmrHw_COUNT_t start_time;
+       tmrHw_COUNT_t delta_time;
+
+       start_time = tmrHw_GetCurrentCount(timerId);
+       usec_tick_rate = tmrHw_divide(tmrHw_getCountRate(timerId), 1000000);
+       delta_time = usecs * usec_tick_rate;
+
+       /* Busy wait */
+       while (delta_time > (tmrHw_GetCurrentCount(timerId) - start_time))
+               ;
+}
+
+/****************************************************************************/
+/**
+*  @brief   Local Divide function
+*
+*  This function does the divide
+*
+*  @return divide value
+*
+*/
+/****************************************************************************/
+static int tmrHw_divide(int num, int denom)
+{
+       int r;
+       int t = 1;
+
+       /* Shift denom and t up to the largest value to optimize algorithm */
+       /* t contains the units of each divide */
+       while ((denom & 0x40000000) == 0) {     /* fails if denom=0 */
+               denom = denom << 1;
+               t = t << 1;
+       }
+
+       /* Intialize the result */
+       r = 0;
+
+       do {
+               /* Determine if there exists a positive remainder */
+               if ((num - denom) >= 0) {
+                       /* Accumlate t to the result and calculate a new remainder */
+                       num = num - denom;
+                       r = r + t;
+               }
+               /* Continue to shift denom and shift t down to 0 */
+               denom = denom >> 1;
+               t = t >> 1;
+       } while (t != 0);
+       return r;
+}
diff --git a/arch/arm/mach-bcmring/dma.c b/arch/arm/mach-bcmring/dma.c
new file mode 100644 (file)
index 0000000..7b20fcc
--- /dev/null
@@ -0,0 +1,2321 @@
+/*****************************************************************************
+* Copyright 2004 - 2008 Broadcom Corporation.  All rights reserved.
+*
+* Unless you and Broadcom execute a separate written software license
+* agreement governing use of this software, this software is licensed to you
+* under the terms of the GNU General Public License version 2, available at
+* http://www.broadcom.com/licenses/GPLv2.php (the "GPL").
+*
+* Notwithstanding the above, under no circumstances may you combine this
+* software in any way with any other Broadcom software provided under a
+* license other than the GPL, without Broadcom's express prior written
+* consent.
+*****************************************************************************/
+
+/****************************************************************************/
+/**
+*   @file   dma.c
+*
+*   @brief  Implements the DMA interface.
+*/
+/****************************************************************************/
+
+/* ---- Include Files ---------------------------------------------------- */
+
+#include <linux/module.h>
+#include <linux/device.h>
+#include <linux/dma-mapping.h>
+#include <linux/interrupt.h>
+#include <linux/irqreturn.h>
+#include <linux/proc_fs.h>
+
+#include <mach/timer.h>
+
+#include <linux/mm.h>
+#include <linux/pfn.h>
+#include <asm/atomic.h>
+#include <mach/dma.h>
+
+/* I don't quite understand why dc4 fails when this is set to 1 and DMA is enabled */
+/* especially since dc4 doesn't use kmalloc'd memory. */
+
+#define ALLOW_MAP_OF_KMALLOC_MEMORY 0
+
+/* ---- Public Variables ------------------------------------------------- */
+
+/* ---- Private Constants and Types -------------------------------------- */
+
+#define MAKE_HANDLE(controllerIdx, channelIdx)    (((controllerIdx) << 4) | (channelIdx))
+
+#define CONTROLLER_FROM_HANDLE(handle)    (((handle) >> 4) & 0x0f)
+#define CHANNEL_FROM_HANDLE(handle)       ((handle) & 0x0f)
+
+#define DMA_MAP_DEBUG   0
+
+#if DMA_MAP_DEBUG
+#   define  DMA_MAP_PRINT(fmt, args...)   printk("%s: " fmt, __func__,  ## args)
+#else
+#   define  DMA_MAP_PRINT(fmt, args...)
+#endif
+
+/* ---- Private Variables ------------------------------------------------ */
+
+static DMA_Global_t gDMA;
+static struct proc_dir_entry *gDmaDir;
+
+static atomic_t gDmaStatMemTypeKmalloc = ATOMIC_INIT(0);
+static atomic_t gDmaStatMemTypeVmalloc = ATOMIC_INIT(0);
+static atomic_t gDmaStatMemTypeUser = ATOMIC_INIT(0);
+static atomic_t gDmaStatMemTypeCoherent = ATOMIC_INIT(0);
+
+#include "dma_device.c"
+
+/* ---- Private Function Prototypes -------------------------------------- */
+
+/* ---- Functions  ------------------------------------------------------- */
+
+/****************************************************************************/
+/**
+*   Displays information for /proc/dma/mem-type
+*/
+/****************************************************************************/
+
+static int dma_proc_read_mem_type(char *buf, char **start, off_t offset,
+                                 int count, int *eof, void *data)
+{
+       int len = 0;
+
+       len += sprintf(buf + len, "dma_map_mem statistics\n");
+       len +=
+           sprintf(buf + len, "coherent: %d\n",
+                   atomic_read(&gDmaStatMemTypeCoherent));
+       len +=
+           sprintf(buf + len, "kmalloc:  %d\n",
+                   atomic_read(&gDmaStatMemTypeKmalloc));
+       len +=
+           sprintf(buf + len, "vmalloc:  %d\n",
+                   atomic_read(&gDmaStatMemTypeVmalloc));
+       len +=
+           sprintf(buf + len, "user:     %d\n",
+                   atomic_read(&gDmaStatMemTypeUser));
+
+       return len;
+}
+
+/****************************************************************************/
+/**
+*   Displays information for /proc/dma/channels
+*/
+/****************************************************************************/
+
+static int dma_proc_read_channels(char *buf, char **start, off_t offset,
+                                 int count, int *eof, void *data)
+{
+       int controllerIdx;
+       int channelIdx;
+       int limit = count - 200;
+       int len = 0;
+       DMA_Channel_t *channel;
+
+       if (down_interruptible(&gDMA.lock) < 0) {
+               return -ERESTARTSYS;
+       }
+
+       for (controllerIdx = 0; controllerIdx < DMA_NUM_CONTROLLERS;
+            controllerIdx++) {
+               for (channelIdx = 0; channelIdx < DMA_NUM_CHANNELS;
+                    channelIdx++) {
+                       if (len >= limit) {
+                               break;
+                       }
+
+                       channel =
+                           &gDMA.controller[controllerIdx].channel[channelIdx];
+
+                       len +=
+                           sprintf(buf + len, "%d:%d ", controllerIdx,
+                                   channelIdx);
+
+                       if ((channel->flags & DMA_CHANNEL_FLAG_IS_DEDICATED) !=
+                           0) {
+                               len +=
+                                   sprintf(buf + len, "Dedicated for %s ",
+                                           DMA_gDeviceAttribute[channel->
+                                                                devType].name);
+                       } else {
+                               len += sprintf(buf + len, "Shared ");
+                       }
+
+                       if ((channel->flags & DMA_CHANNEL_FLAG_NO_ISR) != 0) {
+                               len += sprintf(buf + len, "No ISR ");
+                       }
+
+                       if ((channel->flags & DMA_CHANNEL_FLAG_LARGE_FIFO) != 0) {
+                               len += sprintf(buf + len, "Fifo: 128 ");
+                       } else {
+                               len += sprintf(buf + len, "Fifo: 64  ");
+                       }
+
+                       if ((channel->flags & DMA_CHANNEL_FLAG_IN_USE) != 0) {
+                               len +=
+                                   sprintf(buf + len, "InUse by %s",
+                                           DMA_gDeviceAttribute[channel->
+                                                                devType].name);
+#if (DMA_DEBUG_TRACK_RESERVATION)
+                               len +=
+                                   sprintf(buf + len, " (%s:%d)",
+                                           channel->fileName,
+                                           channel->lineNum);
+#endif
+                       } else {
+                               len += sprintf(buf + len, "Avail ");
+                       }
+
+                       if (channel->lastDevType != DMA_DEVICE_NONE) {
+                               len +=
+                                   sprintf(buf + len, "Last use: %s ",
+                                           DMA_gDeviceAttribute[channel->
+                                                                lastDevType].
+                                           name);
+                       }
+
+                       len += sprintf(buf + len, "\n");
+               }
+       }
+       up(&gDMA.lock);
+       *eof = 1;
+
+       return len;
+}
+
+/****************************************************************************/
+/**
+*   Displays information for /proc/dma/devices
+*/
+/****************************************************************************/
+
+static int dma_proc_read_devices(char *buf, char **start, off_t offset,
+                                int count, int *eof, void *data)
+{
+       int limit = count - 200;
+       int len = 0;
+       int devIdx;
+
+       if (down_interruptible(&gDMA.lock) < 0) {
+               return -ERESTARTSYS;
+       }
+
+       for (devIdx = 0; devIdx < DMA_NUM_DEVICE_ENTRIES; devIdx++) {
+               DMA_DeviceAttribute_t *devAttr = &DMA_gDeviceAttribute[devIdx];
+
+               if (devAttr->name == NULL) {
+                       continue;
+               }
+
+               if (len >= limit) {
+                       break;
+               }
+
+               len += sprintf(buf + len, "%-12s ", devAttr->name);
+
+               if ((devAttr->flags & DMA_DEVICE_FLAG_IS_DEDICATED) != 0) {
+                       len +=
+                           sprintf(buf + len, "Dedicated %d:%d ",
+                                   devAttr->dedicatedController,
+                                   devAttr->dedicatedChannel);
+               } else {
+                       len += sprintf(buf + len, "Shared DMA:");
+                       if ((devAttr->flags & DMA_DEVICE_FLAG_ON_DMA0) != 0) {
+                               len += sprintf(buf + len, "0");
+                       }
+                       if ((devAttr->flags & DMA_DEVICE_FLAG_ON_DMA1) != 0) {
+                               len += sprintf(buf + len, "1");
+                       }
+                       len += sprintf(buf + len, " ");
+               }
+               if ((devAttr->flags & DMA_DEVICE_FLAG_NO_ISR) != 0) {
+                       len += sprintf(buf + len, "NoISR ");
+               }
+               if ((devAttr->flags & DMA_DEVICE_FLAG_ALLOW_LARGE_FIFO) != 0) {
+                       len += sprintf(buf + len, "Allow-128 ");
+               }
+
+               len +=
+                   sprintf(buf + len,
+                           "Xfer #: %Lu Ticks: %Lu Bytes: %Lu DescLen: %u\n",
+                           devAttr->numTransfers, devAttr->transferTicks,
+                           devAttr->transferBytes,
+                           devAttr->ring.bytesAllocated);
+
+       }
+
+       up(&gDMA.lock);
+       *eof = 1;
+
+       return len;
+}
+
+/****************************************************************************/
+/**
+*   Determines if a DMA_Device_t is "valid".
+*
+*   @return
+*       TRUE        - dma device is valid
+*       FALSE       - dma device isn't valid
+*/
+/****************************************************************************/
+
+static inline int IsDeviceValid(DMA_Device_t device)
+{
+       return (device >= 0) && (device < DMA_NUM_DEVICE_ENTRIES);
+}
+
+/****************************************************************************/
+/**
+*   Translates a DMA handle into a pointer to a channel.
+*
+*   @return
+*       non-NULL    - pointer to DMA_Channel_t
+*       NULL        - DMA Handle was invalid
+*/
+/****************************************************************************/
+
+static inline DMA_Channel_t *HandleToChannel(DMA_Handle_t handle)
+{
+       int controllerIdx;
+       int channelIdx;
+
+       controllerIdx = CONTROLLER_FROM_HANDLE(handle);
+       channelIdx = CHANNEL_FROM_HANDLE(handle);
+
+       if ((controllerIdx > DMA_NUM_CONTROLLERS)
+           || (channelIdx > DMA_NUM_CHANNELS)) {
+               return NULL;
+       }
+       return &gDMA.controller[controllerIdx].channel[channelIdx];
+}
+
+/****************************************************************************/
+/**
+*   Interrupt handler which is called to process DMA interrupts.
+*/
+/****************************************************************************/
+
+static irqreturn_t dma_interrupt_handler(int irq, void *dev_id)
+{
+       DMA_Channel_t *channel;
+       DMA_DeviceAttribute_t *devAttr;
+       int irqStatus;
+
+       channel = (DMA_Channel_t *) dev_id;
+
+       /* Figure out why we were called, and knock down the interrupt */
+
+       irqStatus = dmacHw_getInterruptStatus(channel->dmacHwHandle);
+       dmacHw_clearInterrupt(channel->dmacHwHandle);
+
+       if ((channel->devType < 0)
+           || (channel->devType > DMA_NUM_DEVICE_ENTRIES)) {
+               printk(KERN_ERR "dma_interrupt_handler: Invalid devType: %d\n",
+                      channel->devType);
+               return IRQ_NONE;
+       }
+       devAttr = &DMA_gDeviceAttribute[channel->devType];
+
+       /* Update stats */
+
+       if ((irqStatus & dmacHw_INTERRUPT_STATUS_TRANS) != 0) {
+               devAttr->transferTicks +=
+                   (timer_get_tick_count() - devAttr->transferStartTime);
+       }
+
+       if ((irqStatus & dmacHw_INTERRUPT_STATUS_ERROR) != 0) {
+               printk(KERN_ERR
+                      "dma_interrupt_handler: devType :%d DMA error (%s)\n",
+                      channel->devType, devAttr->name);
+       } else {
+               devAttr->numTransfers++;
+               devAttr->transferBytes += devAttr->numBytes;
+       }
+
+       /* Call any installed handler */
+
+       if (devAttr->devHandler != NULL) {
+               devAttr->devHandler(channel->devType, irqStatus,
+                                   devAttr->userData);
+       }
+
+       return IRQ_HANDLED;
+}
+
+/****************************************************************************/
+/**
+*   Allocates memory to hold a descriptor ring. The descriptor ring then
+*   needs to be populated by making one or more calls to
+*   dna_add_descriptors.
+*
+*   The returned descriptor ring will be automatically initialized.
+*
+*   @return
+*       0           Descriptor ring was allocated successfully
+*       -EINVAL     Invalid parameters passed in
+*       -ENOMEM     Unable to allocate memory for the desired number of descriptors.
+*/
+/****************************************************************************/
+
+int dma_alloc_descriptor_ring(DMA_DescriptorRing_t *ring,      /* Descriptor ring to populate */
+                             int numDescriptors        /* Number of descriptors that need to be allocated. */
+    ) {
+       size_t bytesToAlloc = dmacHw_descriptorLen(numDescriptors);
+
+       if ((ring == NULL) || (numDescriptors <= 0)) {
+               return -EINVAL;
+       }
+
+       ring->physAddr = 0;
+       ring->descriptorsAllocated = 0;
+       ring->bytesAllocated = 0;
+
+       ring->virtAddr = dma_alloc_writecombine(NULL,
+                                                    bytesToAlloc,
+                                                    &ring->physAddr,
+                                                    GFP_KERNEL);
+       if (ring->virtAddr == NULL) {
+               return -ENOMEM;
+       }
+
+       ring->bytesAllocated = bytesToAlloc;
+       ring->descriptorsAllocated = numDescriptors;
+
+       return dma_init_descriptor_ring(ring, numDescriptors);
+}
+
+EXPORT_SYMBOL(dma_alloc_descriptor_ring);
+
+/****************************************************************************/
+/**
+*   Releases the memory which was previously allocated for a descriptor ring.
+*/
+/****************************************************************************/
+
+void dma_free_descriptor_ring(DMA_DescriptorRing_t *ring       /* Descriptor to release */
+    ) {
+       if (ring->virtAddr != NULL) {
+               dma_free_writecombine(NULL,
+                                     ring->bytesAllocated,
+                                     ring->virtAddr, ring->physAddr);
+       }
+
+       ring->bytesAllocated = 0;
+       ring->descriptorsAllocated = 0;
+       ring->virtAddr = NULL;
+       ring->physAddr = 0;
+}
+
+EXPORT_SYMBOL(dma_free_descriptor_ring);
+
+/****************************************************************************/
+/**
+*   Initializes a descriptor ring, so that descriptors can be added to it.
+*   Once a descriptor ring has been allocated, it may be reinitialized for
+*   use with additional/different regions of memory.
+*
+*   Note that if 7 descriptors are allocated, it's perfectly acceptable to
+*   initialize the ring with a smaller number of descriptors. The amount
+*   of memory allocated for the descriptor ring will not be reduced, and
+*   the descriptor ring may be reinitialized later
+*
+*   @return
+*       0           Descriptor ring was initialized successfully
+*       -ENOMEM     The descriptor which was passed in has insufficient space
+*                   to hold the desired number of descriptors.
+*/
+/****************************************************************************/
+
+int dma_init_descriptor_ring(DMA_DescriptorRing_t *ring,       /* Descriptor ring to initialize */
+                            int numDescriptors /* Number of descriptors to initialize. */
+    ) {
+       if (ring->virtAddr == NULL) {
+               return -EINVAL;
+       }
+       if (dmacHw_initDescriptor(ring->virtAddr,
+                                 ring->physAddr,
+                                 ring->bytesAllocated, numDescriptors) < 0) {
+               printk(KERN_ERR
+                      "dma_init_descriptor_ring: dmacHw_initDescriptor failed\n");
+               return -ENOMEM;
+       }
+
+       return 0;
+}
+
+EXPORT_SYMBOL(dma_init_descriptor_ring);
+
+/****************************************************************************/
+/**
+*   Determines the number of descriptors which would be required for a
+*   transfer of the indicated memory region.
+*
+*   This function also needs to know which DMA device this transfer will
+*   be destined for, so that the appropriate DMA configuration can be retrieved.
+*   DMA parameters such as transfer width, and whether this is a memory-to-memory
+*   or memory-to-peripheral, etc can all affect the actual number of descriptors
+*   required.
+*
+*   @return
+*       > 0     Returns the number of descriptors required for the indicated transfer
+*       -ENODEV - Device handed in is invalid.
+*       -EINVAL Invalid parameters
+*       -ENOMEM Memory exhausted
+*/
+/****************************************************************************/
+
+int dma_calculate_descriptor_count(DMA_Device_t device,        /* DMA Device that this will be associated with */
+                                  dma_addr_t srcData,  /* Place to get data to write to device */
+                                  dma_addr_t dstData,  /* Pointer to device data address */
+                                  size_t numBytes      /* Number of bytes to transfer to the device */
+    ) {
+       int numDescriptors;
+       DMA_DeviceAttribute_t *devAttr;
+
+       if (!IsDeviceValid(device)) {
+               return -ENODEV;
+       }
+       devAttr = &DMA_gDeviceAttribute[device];
+
+       numDescriptors = dmacHw_calculateDescriptorCount(&devAttr->config,
+                                                             (void *)srcData,
+                                                             (void *)dstData,
+                                                             numBytes);
+       if (numDescriptors < 0) {
+               printk(KERN_ERR
+                      "dma_calculate_descriptor_count: dmacHw_calculateDescriptorCount failed\n");
+               return -EINVAL;
+       }
+
+       return numDescriptors;
+}
+
+EXPORT_SYMBOL(dma_calculate_descriptor_count);
+
+/****************************************************************************/
+/**
+*   Adds a region of memory to the descriptor ring. Note that it may take
+*   multiple descriptors for each region of memory. It is the callers
+*   responsibility to allocate a sufficiently large descriptor ring.
+*
+*   @return
+*       0       Descriptors were added successfully
+*       -ENODEV Device handed in is invalid.
+*       -EINVAL Invalid parameters
+*       -ENOMEM Memory exhausted
+*/
+/****************************************************************************/
+
+int dma_add_descriptors(DMA_DescriptorRing_t *ring,    /* Descriptor ring to add descriptors to */
+                       DMA_Device_t device,    /* DMA Device that descriptors are for */
+                       dma_addr_t srcData,     /* Place to get data (memory or device) */
+                       dma_addr_t dstData,     /* Place to put data (memory or device) */
+                       size_t numBytes /* Number of bytes to transfer to the device */
+    ) {
+       int rc;
+       DMA_DeviceAttribute_t *devAttr;
+
+       if (!IsDeviceValid(device)) {
+               return -ENODEV;
+       }
+       devAttr = &DMA_gDeviceAttribute[device];
+
+       rc = dmacHw_setDataDescriptor(&devAttr->config,
+                                     ring->virtAddr,
+                                     (void *)srcData,
+                                     (void *)dstData, numBytes);
+       if (rc < 0) {
+               printk(KERN_ERR
+                      "dma_add_descriptors: dmacHw_setDataDescriptor failed with code: %d\n",
+                      rc);
+               return -ENOMEM;
+       }
+
+       return 0;
+}
+
+EXPORT_SYMBOL(dma_add_descriptors);
+
+/****************************************************************************/
+/**
+*   Sets the descriptor ring associated with a device.
+*
+*   Once set, the descriptor ring will be associated with the device, even
+*   across channel request/free calls. Passing in a NULL descriptor ring
+*   will release any descriptor ring currently associated with the device.
+*
+*   Note: If you call dma_transfer, or one of the other dma_alloc_ functions
+*         the descriptor ring may be released and reallocated.
+*
+*   Note: This function will release the descriptor memory for any current
+*         descriptor ring associated with this device.
+*
+*   @return
+*       0       Descriptors were added successfully
+*       -ENODEV Device handed in is invalid.
+*/
+/****************************************************************************/
+
+int dma_set_device_descriptor_ring(DMA_Device_t device,        /* Device to update the descriptor ring for. */
+                                  DMA_DescriptorRing_t *ring   /* Descriptor ring to add descriptors to */
+    ) {
+       DMA_DeviceAttribute_t *devAttr;
+
+       if (!IsDeviceValid(device)) {
+               return -ENODEV;
+       }
+       devAttr = &DMA_gDeviceAttribute[device];
+
+       /* Free the previously allocated descriptor ring */
+
+       dma_free_descriptor_ring(&devAttr->ring);
+
+       if (ring != NULL) {
+               /* Copy in the new one */
+
+               devAttr->ring = *ring;
+       }
+
+       /* Set things up so that if dma_transfer is called then this descriptor */
+       /* ring will get freed. */
+
+       devAttr->prevSrcData = 0;
+       devAttr->prevDstData = 0;
+       devAttr->prevNumBytes = 0;
+
+       return 0;
+}
+
+EXPORT_SYMBOL(dma_set_device_descriptor_ring);
+
+/****************************************************************************/
+/**
+*   Retrieves the descriptor ring associated with a device.
+*
+*   @return
+*       0       Descriptors were added successfully
+*       -ENODEV Device handed in is invalid.
+*/
+/****************************************************************************/
+
+int dma_get_device_descriptor_ring(DMA_Device_t device,        /* Device to retrieve the descriptor ring for. */
+                                  DMA_DescriptorRing_t *ring   /* Place to store retrieved ring */
+    ) {
+       DMA_DeviceAttribute_t *devAttr;
+
+       memset(ring, 0, sizeof(*ring));
+
+       if (!IsDeviceValid(device)) {
+               return -ENODEV;
+       }
+       devAttr = &DMA_gDeviceAttribute[device];
+
+       *ring = devAttr->ring;
+
+       return 0;
+}
+
+EXPORT_SYMBOL(dma_get_device_descriptor_ring);
+
+/****************************************************************************/
+/**
+*   Configures a DMA channel.
+*
+*   @return
+*       >= 0    - Initialization was successfull.
+*
+*       -EBUSY  - Device is currently being used.
+*       -ENODEV - Device handed in is invalid.
+*/
+/****************************************************************************/
+
+static int ConfigChannel(DMA_Handle_t handle)
+{
+       DMA_Channel_t *channel;
+       DMA_DeviceAttribute_t *devAttr;
+       int controllerIdx;
+
+       channel = HandleToChannel(handle);
+       if (channel == NULL) {
+               return -ENODEV;
+       }
+       devAttr = &DMA_gDeviceAttribute[channel->devType];
+       controllerIdx = CONTROLLER_FROM_HANDLE(handle);
+
+       if ((devAttr->flags & DMA_DEVICE_FLAG_PORT_PER_DMAC) != 0) {
+               if (devAttr->config.transferType ==
+                   dmacHw_TRANSFER_TYPE_MEM_TO_PERIPHERAL) {
+                       devAttr->config.dstPeripheralPort =
+                           devAttr->dmacPort[controllerIdx];
+               } else if (devAttr->config.transferType ==
+                          dmacHw_TRANSFER_TYPE_PERIPHERAL_TO_MEM) {
+                       devAttr->config.srcPeripheralPort =
+                           devAttr->dmacPort[controllerIdx];
+               }
+       }
+
+       if (dmacHw_configChannel(channel->dmacHwHandle, &devAttr->config) != 0) {
+               printk(KERN_ERR "ConfigChannel: dmacHw_configChannel failed\n");
+               return -EIO;
+       }
+
+       return 0;
+}
+
+/****************************************************************************/
+/**
+*   Intializes all of the data structures associated with the DMA.
+*   @return
+*       >= 0    - Initialization was successfull.
+*
+*       -EBUSY  - Device is currently being used.
+*       -ENODEV - Device handed in is invalid.
+*/
+/****************************************************************************/
+
+int dma_init(void)
+{
+       int rc = 0;
+       int controllerIdx;
+       int channelIdx;
+       DMA_Device_t devIdx;
+       DMA_Channel_t *channel;
+       DMA_Handle_t dedicatedHandle;
+
+       memset(&gDMA, 0, sizeof(gDMA));
+
+       init_MUTEX_LOCKED(&gDMA.lock);
+       init_waitqueue_head(&gDMA.freeChannelQ);
+
+       /* Initialize the Hardware */
+
+       dmacHw_initDma();
+
+       /* Start off by marking all of the DMA channels as shared. */
+
+       for (controllerIdx = 0; controllerIdx < DMA_NUM_CONTROLLERS;
+            controllerIdx++) {
+               for (channelIdx = 0; channelIdx < DMA_NUM_CHANNELS;
+                    channelIdx++) {
+                       channel =
+                           &gDMA.controller[controllerIdx].channel[channelIdx];
+
+                       channel->flags = 0;
+                       channel->devType = DMA_DEVICE_NONE;
+                       channel->lastDevType = DMA_DEVICE_NONE;
+
+#if (DMA_DEBUG_TRACK_RESERVATION)
+                       channel->fileName = "";
+                       channel->lineNum = 0;
+#endif
+
+                       channel->dmacHwHandle =
+                           dmacHw_getChannelHandle(dmacHw_MAKE_CHANNEL_ID
+                                                   (controllerIdx,
+                                                    channelIdx));
+                       dmacHw_initChannel(channel->dmacHwHandle);
+               }
+       }
+
+       /* Record any special attributes that channels may have */
+
+       gDMA.controller[0].channel[0].flags |= DMA_CHANNEL_FLAG_LARGE_FIFO;
+       gDMA.controller[0].channel[1].flags |= DMA_CHANNEL_FLAG_LARGE_FIFO;
+       gDMA.controller[1].channel[0].flags |= DMA_CHANNEL_FLAG_LARGE_FIFO;
+       gDMA.controller[1].channel[1].flags |= DMA_CHANNEL_FLAG_LARGE_FIFO;
+
+       /* Now walk through and record the dedicated channels. */
+
+       for (devIdx = 0; devIdx < DMA_NUM_DEVICE_ENTRIES; devIdx++) {
+               DMA_DeviceAttribute_t *devAttr = &DMA_gDeviceAttribute[devIdx];
+
+               if (((devAttr->flags & DMA_DEVICE_FLAG_NO_ISR) != 0)
+                   && ((devAttr->flags & DMA_DEVICE_FLAG_IS_DEDICATED) == 0)) {
+                       printk(KERN_ERR
+                              "DMA Device: %s Can only request NO_ISR for dedicated devices\n",
+                              devAttr->name);
+                       rc = -EINVAL;
+                       goto out;
+               }
+
+               if ((devAttr->flags & DMA_DEVICE_FLAG_IS_DEDICATED) != 0) {
+                       /* This is a dedicated device. Mark the channel as being reserved. */
+
+                       if (devAttr->dedicatedController >= DMA_NUM_CONTROLLERS) {
+                               printk(KERN_ERR
+                                      "DMA Device: %s DMA Controller %d is out of range\n",
+                                      devAttr->name,
+                                      devAttr->dedicatedController);
+                               rc = -EINVAL;
+                               goto out;
+                       }
+
+                       if (devAttr->dedicatedChannel >= DMA_NUM_CHANNELS) {
+                               printk(KERN_ERR
+                                      "DMA Device: %s DMA Channel %d is out of range\n",
+                                      devAttr->name,
+                                      devAttr->dedicatedChannel);
+                               rc = -EINVAL;
+                               goto out;
+                       }
+
+                       dedicatedHandle =
+                           MAKE_HANDLE(devAttr->dedicatedController,
+                                       devAttr->dedicatedChannel);
+                       channel = HandleToChannel(dedicatedHandle);
+
+                       if ((channel->flags & DMA_CHANNEL_FLAG_IS_DEDICATED) !=
+                           0) {
+                               printk
+                                   ("DMA Device: %s attempting to use same DMA Controller:Channel (%d:%d) as %s\n",
+                                    devAttr->name,
+                                    devAttr->dedicatedController,
+                                    devAttr->dedicatedChannel,
+                                    DMA_gDeviceAttribute[channel->devType].
+                                    name);
+                               rc = -EBUSY;
+                               goto out;
+                       }
+
+                       channel->flags |= DMA_CHANNEL_FLAG_IS_DEDICATED;
+                       channel->devType = devIdx;
+
+                       if (devAttr->flags & DMA_DEVICE_FLAG_NO_ISR) {
+                               channel->flags |= DMA_CHANNEL_FLAG_NO_ISR;
+                       }
+
+                       /* For dedicated channels, we can go ahead and configure the DMA channel now */
+                       /* as well. */
+
+                       ConfigChannel(dedicatedHandle);
+               }
+       }
+
+       /* Go through and register the interrupt handlers */
+
+       for (controllerIdx = 0; controllerIdx < DMA_NUM_CONTROLLERS;
+            controllerIdx++) {
+               for (channelIdx = 0; channelIdx < DMA_NUM_CHANNELS;
+                    channelIdx++) {
+                       channel =
+                           &gDMA.controller[controllerIdx].channel[channelIdx];
+
+                       if ((channel->flags & DMA_CHANNEL_FLAG_NO_ISR) == 0) {
+                               snprintf(channel->name, sizeof(channel->name),
+                                        "dma %d:%d %s", controllerIdx,
+                                        channelIdx,
+                                        channel->devType ==
+                                        DMA_DEVICE_NONE ? "" :
+                                        DMA_gDeviceAttribute[channel->devType].
+                                        name);
+
+                               rc =
+                                    request_irq(IRQ_DMA0C0 +
+                                                (controllerIdx *
+                                                 DMA_NUM_CHANNELS) +
+                                                channelIdx,
+                                                dma_interrupt_handler,
+                                                IRQF_DISABLED, channel->name,
+                                                channel);
+                               if (rc != 0) {
+                                       printk(KERN_ERR
+                                              "request_irq for IRQ_DMA%dC%d failed\n",
+                                              controllerIdx, channelIdx);
+                               }
+                       }
+               }
+       }
+
+       /* Create /proc/dma/channels and /proc/dma/devices */
+
+       gDmaDir = create_proc_entry("dma", S_IFDIR | S_IRUGO | S_IXUGO, NULL);
+
+       if (gDmaDir == NULL) {
+               printk(KERN_ERR "Unable to create /proc/dma\n");
+       } else {
+               create_proc_read_entry("channels", 0, gDmaDir,
+                                      dma_proc_read_channels, NULL);
+               create_proc_read_entry("devices", 0, gDmaDir,
+                                      dma_proc_read_devices, NULL);
+               create_proc_read_entry("mem-type", 0, gDmaDir,
+                                      dma_proc_read_mem_type, NULL);
+       }
+
+out:
+
+       up(&gDMA.lock);
+
+       return rc;
+}
+
+/****************************************************************************/
+/**
+*   Reserves a channel for use with @a dev. If the device is setup to use
+*   a shared channel, then this function will block until a free channel
+*   becomes available.
+*
+*   @return
+*       >= 0    - A valid DMA Handle.
+*       -EBUSY  - Device is currently being used.
+*       -ENODEV - Device handed in is invalid.
+*/
+/****************************************************************************/
+
+#if (DMA_DEBUG_TRACK_RESERVATION)
+DMA_Handle_t dma_request_channel_dbg
+    (DMA_Device_t dev, const char *fileName, int lineNum)
+#else
+DMA_Handle_t dma_request_channel(DMA_Device_t dev)
+#endif
+{
+       DMA_Handle_t handle;
+       DMA_DeviceAttribute_t *devAttr;
+       DMA_Channel_t *channel;
+       int controllerIdx;
+       int controllerIdx2;
+       int channelIdx;
+
+       if (down_interruptible(&gDMA.lock) < 0) {
+               return -ERESTARTSYS;
+       }
+
+       if ((dev < 0) || (dev >= DMA_NUM_DEVICE_ENTRIES)) {
+               handle = -ENODEV;
+               goto out;
+       }
+       devAttr = &DMA_gDeviceAttribute[dev];
+
+#if (DMA_DEBUG_TRACK_RESERVATION)
+       {
+               char *s;
+
+               s = strrchr(fileName, '/');
+               if (s != NULL) {
+                       fileName = s + 1;
+               }
+       }
+#endif
+       if ((devAttr->flags & DMA_DEVICE_FLAG_IN_USE) != 0) {
+               /* This device has already been requested and not been freed */
+
+               printk(KERN_ERR "%s: device %s is already requested\n",
+                      __func__, devAttr->name);
+               handle = -EBUSY;
+               goto out;
+       }
+
+       if ((devAttr->flags & DMA_DEVICE_FLAG_IS_DEDICATED) != 0) {
+               /* This device has a dedicated channel. */
+
+               channel =
+                   &gDMA.controller[devAttr->dedicatedController].
+                   channel[devAttr->dedicatedChannel];
+               if ((channel->flags & DMA_CHANNEL_FLAG_IN_USE) != 0) {
+                       handle = -EBUSY;
+                       goto out;
+               }
+
+               channel->flags |= DMA_CHANNEL_FLAG_IN_USE;
+               devAttr->flags |= DMA_DEVICE_FLAG_IN_USE;
+
+#if (DMA_DEBUG_TRACK_RESERVATION)
+               channel->fileName = fileName;
+               channel->lineNum = lineNum;
+#endif
+               handle =
+                   MAKE_HANDLE(devAttr->dedicatedController,
+                               devAttr->dedicatedChannel);
+               goto out;
+       }
+
+       /* This device needs to use one of the shared channels. */
+
+       handle = DMA_INVALID_HANDLE;
+       while (handle == DMA_INVALID_HANDLE) {
+               /* Scan through the shared channels and see if one is available */
+
+               for (controllerIdx2 = 0; controllerIdx2 < DMA_NUM_CONTROLLERS;
+                    controllerIdx2++) {
+                       /* Check to see if we should try on controller 1 first. */
+
+                       controllerIdx = controllerIdx2;
+                       if ((devAttr->
+                            flags & DMA_DEVICE_FLAG_ALLOC_DMA1_FIRST) != 0) {
+                               controllerIdx = 1 - controllerIdx;
+                       }
+
+                       /* See if the device is available on the controller being tested */
+
+                       if ((devAttr->
+                            flags & (DMA_DEVICE_FLAG_ON_DMA0 << controllerIdx))
+                           != 0) {
+                               for (channelIdx = 0;
+                                    channelIdx < DMA_NUM_CHANNELS;
+                                    channelIdx++) {
+                                       channel =
+                                           &gDMA.controller[controllerIdx].
+                                           channel[channelIdx];
+
+                                       if (((channel->
+                                             flags &
+                                             DMA_CHANNEL_FLAG_IS_DEDICATED) ==
+                                            0)
+                                           &&
+                                           ((channel->
+                                             flags & DMA_CHANNEL_FLAG_IN_USE)
+                                            == 0)) {
+                                               if (((channel->
+                                                     flags &
+                                                     DMA_CHANNEL_FLAG_LARGE_FIFO)
+                                                    != 0)
+                                                   &&
+                                                   ((devAttr->
+                                                     flags &
+                                                     DMA_DEVICE_FLAG_ALLOW_LARGE_FIFO)
+                                                    == 0)) {
+                                                       /* This channel is a large fifo - don't tie it up */
+                                                       /* with devices that we don't want using it. */
+
+                                                       continue;
+                                               }
+
+                                               channel->flags |=
+                                                   DMA_CHANNEL_FLAG_IN_USE;
+                                               channel->devType = dev;
+                                               devAttr->flags |=
+                                                   DMA_DEVICE_FLAG_IN_USE;
+
+#if (DMA_DEBUG_TRACK_RESERVATION)
+                                               channel->fileName = fileName;
+                                               channel->lineNum = lineNum;
+#endif
+                                               handle =
+                                                   MAKE_HANDLE(controllerIdx,
+                                                               channelIdx);
+
+                                               /* Now that we've reserved the channel - we can go ahead and configure it */
+
+                                               if (ConfigChannel(handle) != 0) {
+                                                       handle = -EIO;
+                                                       printk(KERN_ERR
+                                                              "dma_request_channel: ConfigChannel failed\n");
+                                               }
+                                               goto out;
+                                       }
+                               }
+                       }
+               }
+
+               /* No channels are currently available. Let's wait for one to free up. */
+
+               {
+                       DEFINE_WAIT(wait);
+
+                       prepare_to_wait(&gDMA.freeChannelQ, &wait,
+                                       TASK_INTERRUPTIBLE);
+                       up(&gDMA.lock);
+                       schedule();
+                       finish_wait(&gDMA.freeChannelQ, &wait);
+
+                       if (signal_pending(current)) {
+                               /* We don't currently hold gDMA.lock, so we return directly */
+
+                               return -ERESTARTSYS;
+                       }
+               }
+
+               if (down_interruptible(&gDMA.lock)) {
+                       return -ERESTARTSYS;
+               }
+       }
+
+out:
+       up(&gDMA.lock);
+
+       return handle;
+}
+
+/* Create both _dbg and non _dbg functions for modules. */
+
+#if (DMA_DEBUG_TRACK_RESERVATION)
+#undef dma_request_channel
+DMA_Handle_t dma_request_channel(DMA_Device_t dev)
+{
+       return dma_request_channel_dbg(dev, __FILE__, __LINE__);
+}
+
+EXPORT_SYMBOL(dma_request_channel_dbg);
+#endif
+EXPORT_SYMBOL(dma_request_channel);
+
+/****************************************************************************/
+/**
+*   Frees a previously allocated DMA Handle.
+*/
+/****************************************************************************/
+
+int dma_free_channel(DMA_Handle_t handle       /* DMA handle. */
+    ) {
+       int rc = 0;
+       DMA_Channel_t *channel;
+       DMA_DeviceAttribute_t *devAttr;
+
+       if (down_interruptible(&gDMA.lock) < 0) {
+               return -ERESTARTSYS;
+       }
+
+       channel = HandleToChannel(handle);
+       if (channel == NULL) {
+               rc = -EINVAL;
+               goto out;
+       }
+
+       devAttr = &DMA_gDeviceAttribute[channel->devType];
+
+       if ((channel->flags & DMA_CHANNEL_FLAG_IS_DEDICATED) == 0) {
+               channel->lastDevType = channel->devType;
+               channel->devType = DMA_DEVICE_NONE;
+       }
+       channel->flags &= ~DMA_CHANNEL_FLAG_IN_USE;
+       devAttr->flags &= ~DMA_DEVICE_FLAG_IN_USE;
+
+out:
+       up(&gDMA.lock);
+
+       wake_up_interruptible(&gDMA.freeChannelQ);
+
+       return rc;
+}
+
+EXPORT_SYMBOL(dma_free_channel);
+
+/****************************************************************************/
+/**
+*   Determines if a given device has been configured as using a shared
+*   channel.
+*
+*   @return
+*       0           Device uses a dedicated channel
+*       > zero      Device uses a shared channel
+*       < zero      Error code
+*/
+/****************************************************************************/
+
+int dma_device_is_channel_shared(DMA_Device_t device   /* Device to check. */
+    ) {
+       DMA_DeviceAttribute_t *devAttr;
+
+       if (!IsDeviceValid(device)) {
+               return -ENODEV;
+       }
+       devAttr = &DMA_gDeviceAttribute[device];
+
+       return ((devAttr->flags & DMA_DEVICE_FLAG_IS_DEDICATED) == 0);
+}
+
+EXPORT_SYMBOL(dma_device_is_channel_shared);
+
+/****************************************************************************/
+/**
+*   Allocates buffers for the descriptors. This is normally done automatically
+*   but needs to be done explicitly when initiating a dma from interrupt
+*   context.
+*
+*   @return
+*       0       Descriptors were allocated successfully
+*       -EINVAL Invalid device type for this kind of transfer
+*               (i.e. the device is _MEM_TO_DEV and not _DEV_TO_MEM)
+*       -ENOMEM Memory exhausted
+*/
+/****************************************************************************/
+
+int dma_alloc_descriptors(DMA_Handle_t handle, /* DMA Handle */
+                         dmacHw_TRANSFER_TYPE_e transferType,  /* Type of transfer being performed */
+                         dma_addr_t srcData,   /* Place to get data to write to device */
+                         dma_addr_t dstData,   /* Pointer to device data address */
+                         size_t numBytes       /* Number of bytes to transfer to the device */
+    ) {
+       DMA_Channel_t *channel;
+       DMA_DeviceAttribute_t *devAttr;
+       int numDescriptors;
+       size_t ringBytesRequired;
+       int rc = 0;
+
+       channel = HandleToChannel(handle);
+       if (channel == NULL) {
+               return -ENODEV;
+       }
+
+       devAttr = &DMA_gDeviceAttribute[channel->devType];
+
+       if (devAttr->config.transferType != transferType) {
+               return -EINVAL;
+       }
+
+       /* Figure out how many descriptors we need. */
+
+       /* printk("srcData: 0x%08x dstData: 0x%08x, numBytes: %d\n", */
+       /*        srcData, dstData, numBytes); */
+
+       numDescriptors = dmacHw_calculateDescriptorCount(&devAttr->config,
+                                                             (void *)srcData,
+                                                             (void *)dstData,
+                                                             numBytes);
+       if (numDescriptors < 0) {
+               printk(KERN_ERR "%s: dmacHw_calculateDescriptorCount failed\n",
+                      __func__);
+               return -EINVAL;
+       }
+
+       /* Check to see if we can reuse the existing descriptor ring, or if we need to allocate */
+       /* a new one. */
+
+       ringBytesRequired = dmacHw_descriptorLen(numDescriptors);
+
+       /* printk("ringBytesRequired: %d\n", ringBytesRequired); */
+
+       if (ringBytesRequired > devAttr->ring.bytesAllocated) {
+               /* Make sure that this code path is never taken from interrupt context. */
+               /* It's OK for an interrupt to initiate a DMA transfer, but the descriptor */
+               /* allocation needs to have already been done. */
+
+               might_sleep();
+
+               /* Free the old descriptor ring and allocate a new one. */
+
+               dma_free_descriptor_ring(&devAttr->ring);
+
+               /* And allocate a new one. */
+
+               rc =
+                    dma_alloc_descriptor_ring(&devAttr->ring,
+                                              numDescriptors);
+               if (rc < 0) {
+                       printk(KERN_ERR
+                              "%s: dma_alloc_descriptor_ring(%d) failed\n",
+                              __func__, numDescriptors);
+                       return rc;
+               }
+               /* Setup the descriptor for this transfer */
+
+               if (dmacHw_initDescriptor(devAttr->ring.virtAddr,
+                                         devAttr->ring.physAddr,
+                                         devAttr->ring.bytesAllocated,
+                                         numDescriptors) < 0) {
+                       printk(KERN_ERR "%s: dmacHw_initDescriptor failed\n",
+                              __func__);
+                       return -EINVAL;
+               }
+       } else {
+               /* We've already got enough ring buffer allocated. All we need to do is reset */
+               /* any control information, just in case the previous DMA was stopped. */
+
+               dmacHw_resetDescriptorControl(devAttr->ring.virtAddr);
+       }
+
+       /* dma_alloc/free both set the prevSrc/DstData to 0. If they happen to be the same */
+       /* as last time, then we don't need to call setDataDescriptor again. */
+
+       if (dmacHw_setDataDescriptor(&devAttr->config,
+                                    devAttr->ring.virtAddr,
+                                    (void *)srcData,
+                                    (void *)dstData, numBytes) < 0) {
+               printk(KERN_ERR "%s: dmacHw_setDataDescriptor failed\n",
+                      __func__);
+               return -EINVAL;
+       }
+
+       /* Remember the critical information for this transfer so that we can eliminate */
+       /* another call to dma_alloc_descriptors if the caller reuses the same buffers */
+
+       devAttr->prevSrcData = srcData;
+       devAttr->prevDstData = dstData;
+       devAttr->prevNumBytes = numBytes;
+
+       return 0;
+}
+
+EXPORT_SYMBOL(dma_alloc_descriptors);
+
+/****************************************************************************/
+/**
+*   Allocates and sets up descriptors for a double buffered circular buffer.
+*
+*   This is primarily intended to be used for things like the ingress samples
+*   from a microphone.
+*
+*   @return
+*       > 0     Number of descriptors actually allocated.
+*       -EINVAL Invalid device type for this kind of transfer
+*               (i.e. the device is _MEM_TO_DEV and not _DEV_TO_MEM)
+*       -ENOMEM Memory exhausted
+*/
+/****************************************************************************/
+
+int dma_alloc_double_dst_descriptors(DMA_Handle_t handle,      /* DMA Handle */
+                                    dma_addr_t srcData,        /* Physical address of source data */
+                                    dma_addr_t dstData1,       /* Physical address of first destination buffer */
+                                    dma_addr_t dstData2,       /* Physical address of second destination buffer */
+                                    size_t numBytes    /* Number of bytes in each destination buffer */
+    ) {
+       DMA_Channel_t *channel;
+       DMA_DeviceAttribute_t *devAttr;
+       int numDst1Descriptors;
+       int numDst2Descriptors;
+       int numDescriptors;
+       size_t ringBytesRequired;
+       int rc = 0;
+
+       channel = HandleToChannel(handle);
+       if (channel == NULL) {
+               return -ENODEV;
+       }
+
+       devAttr = &DMA_gDeviceAttribute[channel->devType];
+
+       /* Figure out how many descriptors we need. */
+
+       /* printk("srcData: 0x%08x dstData: 0x%08x, numBytes: %d\n", */
+       /*        srcData, dstData, numBytes); */
+
+       numDst1Descriptors =
+            dmacHw_calculateDescriptorCount(&devAttr->config, (void *)srcData,
+                                            (void *)dstData1, numBytes);
+       if (numDst1Descriptors < 0) {
+               return -EINVAL;
+       }
+       numDst2Descriptors =
+            dmacHw_calculateDescriptorCount(&devAttr->config, (void *)srcData,
+                                            (void *)dstData2, numBytes);
+       if (numDst2Descriptors < 0) {
+               return -EINVAL;
+       }
+       numDescriptors = numDst1Descriptors + numDst2Descriptors;
+       /* printk("numDescriptors: %d\n", numDescriptors); */
+
+       /* Check to see if we can reuse the existing descriptor ring, or if we need to allocate */
+       /* a new one. */
+
+       ringBytesRequired = dmacHw_descriptorLen(numDescriptors);
+
+       /* printk("ringBytesRequired: %d\n", ringBytesRequired); */
+
+       if (ringBytesRequired > devAttr->ring.bytesAllocated) {
+               /* Make sure that this code path is never taken from interrupt context. */
+               /* It's OK for an interrupt to initiate a DMA transfer, but the descriptor */
+               /* allocation needs to have already been done. */
+
+               might_sleep();
+
+               /* Free the old descriptor ring and allocate a new one. */
+
+               dma_free_descriptor_ring(&devAttr->ring);
+
+               /* And allocate a new one. */
+
+               rc =
+                    dma_alloc_descriptor_ring(&devAttr->ring,
+                                              numDescriptors);
+               if (rc < 0) {
+                       printk(KERN_ERR
+                              "%s: dma_alloc_descriptor_ring(%d) failed\n",
+                              __func__, ringBytesRequired);
+                       return rc;
+               }
+       }
+
+       /* Setup the descriptor for this transfer. Since this function is used with */
+       /* CONTINUOUS DMA operations, we need to reinitialize every time, otherwise */
+       /* setDataDescriptor will keep trying to append onto the end. */
+
+       if (dmacHw_initDescriptor(devAttr->ring.virtAddr,
+                                 devAttr->ring.physAddr,
+                                 devAttr->ring.bytesAllocated,
+                                 numDescriptors) < 0) {
+               printk(KERN_ERR "%s: dmacHw_initDescriptor failed\n", __func__);
+               return -EINVAL;
+       }
+
+       /* dma_alloc/free both set the prevSrc/DstData to 0. If they happen to be the same */
+       /* as last time, then we don't need to call setDataDescriptor again. */
+
+       if (dmacHw_setDataDescriptor(&devAttr->config,
+                                    devAttr->ring.virtAddr,
+                                    (void *)srcData,
+                                    (void *)dstData1, numBytes) < 0) {
+               printk(KERN_ERR "%s: dmacHw_setDataDescriptor 1 failed\n",
+                      __func__);
+               return -EINVAL;
+       }
+       if (dmacHw_setDataDescriptor(&devAttr->config,
+                                    devAttr->ring.virtAddr,
+                                    (void *)srcData,
+                                    (void *)dstData2, numBytes) < 0) {
+               printk(KERN_ERR "%s: dmacHw_setDataDescriptor 2 failed\n",
+                      __func__);
+               return -EINVAL;
+       }
+
+       /* You should use dma_start_transfer rather than dma_transfer_xxx so we don't */
+       /* try to make the 'prev' variables right. */
+
+       devAttr->prevSrcData = 0;
+       devAttr->prevDstData = 0;
+       devAttr->prevNumBytes = 0;
+
+       return numDescriptors;
+}
+
+EXPORT_SYMBOL(dma_alloc_double_dst_descriptors);
+
+/****************************************************************************/
+/**
+*   Initiates a transfer when the descriptors have already been setup.
+*
+*   This is a special case, and normally, the dma_transfer_xxx functions should
+*   be used.
+*
+*   @return
+*       0       Transfer was started successfully
+*       -ENODEV Invalid handle
+*/
+/****************************************************************************/
+
+int dma_start_transfer(DMA_Handle_t handle)
+{
+       DMA_Channel_t *channel;
+       DMA_DeviceAttribute_t *devAttr;
+
+       channel = HandleToChannel(handle);
+       if (channel == NULL) {
+               return -ENODEV;
+       }
+       devAttr = &DMA_gDeviceAttribute[channel->devType];
+
+       dmacHw_initiateTransfer(channel->dmacHwHandle, &devAttr->config,
+                               devAttr->ring.virtAddr);
+
+       /* Since we got this far, everything went successfully */
+
+       return 0;
+}
+
+EXPORT_SYMBOL(dma_start_transfer);
+
+/****************************************************************************/
+/**
+*   Stops a previously started DMA transfer.
+*
+*   @return
+*       0       Transfer was stopped successfully
+*       -ENODEV Invalid handle
+*/
+/****************************************************************************/
+
+int dma_stop_transfer(DMA_Handle_t handle)
+{
+       DMA_Channel_t *channel;
+
+       channel = HandleToChannel(handle);
+       if (channel == NULL) {
+               return -ENODEV;
+       }
+
+       dmacHw_stopTransfer(channel->dmacHwHandle);
+
+       return 0;
+}
+
+EXPORT_SYMBOL(dma_stop_transfer);
+
+/****************************************************************************/
+/**
+*   Waits for a DMA to complete by polling. This function is only intended
+*   to be used for testing. Interrupts should be used for most DMA operations.
+*/
+/****************************************************************************/
+
+int dma_wait_transfer_done(DMA_Handle_t handle)
+{
+       DMA_Channel_t *channel;
+       dmacHw_TRANSFER_STATUS_e status;
+
+       channel = HandleToChannel(handle);
+       if (channel == NULL) {
+               return -ENODEV;
+       }
+
+       while ((status =
+               dmacHw_transferCompleted(channel->dmacHwHandle)) ==
+              dmacHw_TRANSFER_STATUS_BUSY) {
+               ;
+       }
+
+       if (status == dmacHw_TRANSFER_STATUS_ERROR) {
+               printk(KERN_ERR "%s: DMA transfer failed\n", __func__);
+               return -EIO;
+       }
+       return 0;
+}
+
+EXPORT_SYMBOL(dma_wait_transfer_done);
+
+/****************************************************************************/
+/**
+*   Initiates a DMA, allocating the descriptors as required.
+*
+*   @return
+*       0       Transfer was started successfully
+*       -EINVAL Invalid device type for this kind of transfer
+*               (i.e. the device is _DEV_TO_MEM and not _MEM_TO_DEV)
+*/
+/****************************************************************************/
+
+int dma_transfer(DMA_Handle_t handle,  /* DMA Handle */
+                dmacHw_TRANSFER_TYPE_e transferType,   /* Type of transfer being performed */
+                dma_addr_t srcData,    /* Place to get data to write to device */
+                dma_addr_t dstData,    /* Pointer to device data address */
+                size_t numBytes        /* Number of bytes to transfer to the device */
+    ) {
+       DMA_Channel_t *channel;
+       DMA_DeviceAttribute_t *devAttr;
+       int rc = 0;
+
+       channel = HandleToChannel(handle);
+       if (channel == NULL) {
+               return -ENODEV;
+       }
+
+       devAttr = &DMA_gDeviceAttribute[channel->devType];
+
+       if (devAttr->config.transferType != transferType) {
+               return -EINVAL;
+       }
+
+       /* We keep track of the information about the previous request for this */
+       /* device, and if the attributes match, then we can use the descriptors we setup */
+       /* the last time, and not have to reinitialize everything. */
+
+       {
+               rc =
+                    dma_alloc_descriptors(handle, transferType, srcData,
+                                          dstData, numBytes);
+               if (rc != 0) {
+                       return rc;
+               }
+       }
+
+       /* And kick off the transfer */
+
+       devAttr->numBytes = numBytes;
+       devAttr->transferStartTime = timer_get_tick_count();
+
+       dmacHw_initiateTransfer(channel->dmacHwHandle, &devAttr->config,
+                               devAttr->ring.virtAddr);
+
+       /* Since we got this far, everything went successfully */
+
+       return 0;
+}
+
+EXPORT_SYMBOL(dma_transfer);
+
+/****************************************************************************/
+/**
+*   Set the callback function which will be called when a transfer completes.
+*   If a NULL callback function is set, then no callback will occur.
+*
+*   @note   @a devHandler will be called from IRQ context.
+*
+*   @return
+*       0       - Success
+*       -ENODEV - Device handed in is invalid.
+*/
+/****************************************************************************/
+
+int dma_set_device_handler(DMA_Device_t dev,   /* Device to set the callback for. */
+                          DMA_DeviceHandler_t devHandler,      /* Function to call when the DMA completes */
+                          void *userData       /* Pointer which will be passed to devHandler. */
+    ) {
+       DMA_DeviceAttribute_t *devAttr;
+       unsigned long flags;
+
+       if (!IsDeviceValid(dev)) {
+               return -ENODEV;
+       }
+       devAttr = &DMA_gDeviceAttribute[dev];
+
+       local_irq_save(flags);
+
+       devAttr->userData = userData;
+       devAttr->devHandler = devHandler;
+
+       local_irq_restore(flags);
+
+       return 0;
+}
+
+EXPORT_SYMBOL(dma_set_device_handler);
+
+/****************************************************************************/
+/**
+*   Initializes a memory mapping structure
+*/
+/****************************************************************************/
+
+int dma_init_mem_map(DMA_MemMap_t *memMap)
+{
+       memset(memMap, 0, sizeof(*memMap));
+
+       init_MUTEX(&memMap->lock);
+
+       return 0;
+}
+
+EXPORT_SYMBOL(dma_init_mem_map);
+
+/****************************************************************************/
+/**
+*   Releases any memory currently being held by a memory mapping structure.
+*/
+/****************************************************************************/
+
+int dma_term_mem_map(DMA_MemMap_t *memMap)
+{
+       down(&memMap->lock);    /* Just being paranoid */
+
+       /* Free up any allocated memory */
+
+       up(&memMap->lock);
+       memset(memMap, 0, sizeof(*memMap));
+
+       return 0;
+}
+
+EXPORT_SYMBOL(dma_term_mem_map);
+
+/****************************************************************************/
+/**
+*   Looks at a memory address and categorizes it.
+*
+*   @return One of the values from the DMA_MemType_t enumeration.
+*/
+/****************************************************************************/
+
+DMA_MemType_t dma_mem_type(void *addr)
+{
+       unsigned long addrVal = (unsigned long)addr;
+
+       if (addrVal >= VMALLOC_END) {
+               /* NOTE: DMA virtual memory space starts at 0xFFxxxxxx */
+
+               /* dma_alloc_xxx pages are physically and virtually contiguous */
+
+               return DMA_MEM_TYPE_DMA;
+       }
+
+       /* Technically, we could add one more classification. Addresses between VMALLOC_END */
+       /* and the beginning of the DMA virtual address could be considered to be I/O space. */
+       /* Right now, nobody cares about this particular classification, so we ignore it. */
+
+       if (is_vmalloc_addr(addr)) {
+               /* Address comes from the vmalloc'd region. Pages are virtually */
+               /* contiguous but NOT physically contiguous */
+
+               return DMA_MEM_TYPE_VMALLOC;
+       }
+
+       if (addrVal >= PAGE_OFFSET) {
+               /* PAGE_OFFSET is typically 0xC0000000 */
+
+               /* kmalloc'd pages are physically contiguous */
+
+               return DMA_MEM_TYPE_KMALLOC;
+       }
+
+       return DMA_MEM_TYPE_USER;
+}
+
+EXPORT_SYMBOL(dma_mem_type);
+
+/****************************************************************************/
+/**
+*   Looks at a memory address and determines if we support DMA'ing to/from
+*   that type of memory.
+*
+*   @return boolean -
+*               return value != 0 means dma supported
+*               return value == 0 means dma not supported
+*/
+/****************************************************************************/
+
+int dma_mem_supports_dma(void *addr)
+{
+       DMA_MemType_t memType = dma_mem_type(addr);
+
+       return (memType == DMA_MEM_TYPE_DMA)
+#if ALLOW_MAP_OF_KMALLOC_MEMORY
+           || (memType == DMA_MEM_TYPE_KMALLOC)
+#endif
+           || (memType == DMA_MEM_TYPE_USER);
+}
+
+EXPORT_SYMBOL(dma_mem_supports_dma);
+
+/****************************************************************************/
+/**
+*   Maps in a memory region such that it can be used for performing a DMA.
+*
+*   @return
+*/
+/****************************************************************************/
+
+int dma_map_start(DMA_MemMap_t *memMap,        /* Stores state information about the map */
+                 enum dma_data_direction dir   /* Direction that the mapping will be going */
+    ) {
+       int rc;
+
+       down(&memMap->lock);
+
+       DMA_MAP_PRINT("memMap: %p\n", memMap);
+
+       if (memMap->inUse) {
+               printk(KERN_ERR "%s: memory map %p is already being used\n",
+                      __func__, memMap);
+               rc = -EBUSY;
+               goto out;
+       }
+
+       memMap->inUse = 1;
+       memMap->dir = dir;
+       memMap->numRegionsUsed = 0;
+
+       rc = 0;
+
+out:
+
+       DMA_MAP_PRINT("returning %d", rc);
+
+       up(&memMap->lock);
+
+       return rc;
+}
+
+EXPORT_SYMBOL(dma_map_start);
+
+/****************************************************************************/
+/**
+*   Adds a segment of memory to a memory map. Each segment is both
+*   physically and virtually contiguous.
+*
+*   @return     0 on success, error code otherwise.
+*/
+/****************************************************************************/
+
+static int dma_map_add_segment(DMA_MemMap_t *memMap,   /* Stores state information about the map */
+                              DMA_Region_t *region,    /* Region that the segment belongs to */
+                              void *virtAddr,  /* Virtual address of the segment being added */
+                              dma_addr_t physAddr,     /* Physical address of the segment being added */
+                              size_t numBytes  /* Number of bytes of the segment being added */
+    ) {
+       DMA_Segment_t *segment;
+
+       DMA_MAP_PRINT("memMap:%p va:%p pa:0x%x #:%d\n", memMap, virtAddr,
+                     physAddr, numBytes);
+
+       /* Sanity check */
+
+       if (((unsigned long)virtAddr < (unsigned long)region->virtAddr)
+           || (((unsigned long)virtAddr + numBytes)) >
+           ((unsigned long)region->virtAddr + region->numBytes)) {
+               printk(KERN_ERR
+                      "%s: virtAddr %p is outside region @ %p len: %d\n",
+                      __func__, virtAddr, region->virtAddr, region->numBytes);
+               return -EINVAL;
+       }
+
+       if (region->numSegmentsUsed > 0) {
+               /* Check to see if this segment is physically contiguous with the previous one */
+
+               segment = &region->segment[region->numSegmentsUsed - 1];
+
+               if ((segment->physAddr + segment->numBytes) == physAddr) {
+                       /* It is - just add on to the end */
+
+                       DMA_MAP_PRINT("appending %d bytes to last segment\n",
+                                     numBytes);
+
+                       segment->numBytes += numBytes;
+
+                       return 0;
+               }
+       }
+
+       /* Reallocate to hold more segments, if required. */
+
+       if (region->numSegmentsUsed >= region->numSegmentsAllocated) {
+               DMA_Segment_t *newSegment;
+               size_t oldSize =
+                   region->numSegmentsAllocated * sizeof(*newSegment);
+               int newAlloc = region->numSegmentsAllocated + 4;
+               size_t newSize = newAlloc * sizeof(*newSegment);
+
+               newSegment = kmalloc(newSize, GFP_KERNEL);
+               if (newSegment == NULL) {
+                       return -ENOMEM;
+               }
+               memcpy(newSegment, region->segment, oldSize);
+               memset(&((uint8_t *) newSegment)[oldSize], 0,
+                      newSize - oldSize);
+               kfree(region->segment);
+
+               region->numSegmentsAllocated = newAlloc;
+               region->segment = newSegment;
+       }
+
+       segment = &region->segment[region->numSegmentsUsed];
+       region->numSegmentsUsed++;
+
+       segment->virtAddr = virtAddr;
+       segment->physAddr = physAddr;
+       segment->numBytes = numBytes;
+
+       DMA_MAP_PRINT("returning success\n");
+
+       return 0;
+}
+
+/****************************************************************************/
+/**
+*   Adds a region of memory to a memory map. Each region is virtually
+*   contiguous, but not necessarily physically contiguous.
+*
+*   @return     0 on success, error code otherwise.
+*/
+/****************************************************************************/
+
+int dma_map_add_region(DMA_MemMap_t *memMap,   /* Stores state information about the map */
+                      void *mem,       /* Virtual address that we want to get a map of */
+                      size_t numBytes  /* Number of bytes being mapped */
+    ) {
+       unsigned long addr = (unsigned long)mem;
+       unsigned int offset;
+       int rc = 0;
+       DMA_Region_t *region;
+       dma_addr_t physAddr;
+
+       down(&memMap->lock);
+
+       DMA_MAP_PRINT("memMap:%p va:%p #:%d\n", memMap, mem, numBytes);
+
+       if (!memMap->inUse) {
+               printk(KERN_ERR "%s: Make sure you call dma_map_start first\n",
+                      __func__);
+               rc = -EINVAL;
+               goto out;
+       }
+
+       /* Reallocate to hold more regions. */
+
+       if (memMap->numRegionsUsed >= memMap->numRegionsAllocated) {
+               DMA_Region_t *newRegion;
+               size_t oldSize =
+                   memMap->numRegionsAllocated * sizeof(*newRegion);
+               int newAlloc = memMap->numRegionsAllocated + 4;
+               size_t newSize = newAlloc * sizeof(*newRegion);
+
+               newRegion = kmalloc(newSize, GFP_KERNEL);
+               if (newRegion == NULL) {
+                       rc = -ENOMEM;
+                       goto out;
+               }
+               memcpy(newRegion, memMap->region, oldSize);
+               memset(&((uint8_t *) newRegion)[oldSize], 0, newSize - oldSize);
+
+               kfree(memMap->region);
+
+               memMap->numRegionsAllocated = newAlloc;
+               memMap->region = newRegion;
+       }
+
+       region = &memMap->region[memMap->numRegionsUsed];
+       memMap->numRegionsUsed++;
+
+       offset = addr & ~PAGE_MASK;
+
+       region->memType = dma_mem_type(mem);
+       region->virtAddr = mem;
+       region->numBytes = numBytes;
+       region->numSegmentsUsed = 0;
+       region->numLockedPages = 0;
+       region->lockedPages = NULL;
+
+       switch (region->memType) {
+       case DMA_MEM_TYPE_VMALLOC:
+               {
+                       atomic_inc(&gDmaStatMemTypeVmalloc);
+
+                       /* printk(KERN_ERR "%s: vmalloc'd pages are not supported\n", __func__); */
+
+                       /* vmalloc'd pages are not physically contiguous */
+
+                       rc = -EINVAL;
+                       break;
+               }
+
+       case DMA_MEM_TYPE_KMALLOC:
+               {
+                       atomic_inc(&gDmaStatMemTypeKmalloc);
+
+                       /* kmalloc'd pages are physically contiguous, so they'll have exactly */
+                       /* one segment */
+
+#if ALLOW_MAP_OF_KMALLOC_MEMORY
+                       physAddr =
+                           dma_map_single(NULL, mem, numBytes, memMap->dir);
+                       rc = dma_map_add_segment(memMap, region, mem, physAddr,
+                                                numBytes);
+#else
+                       rc = -EINVAL;
+#endif
+                       break;
+               }
+
+       case DMA_MEM_TYPE_DMA:
+               {
+                       /* dma_alloc_xxx pages are physically contiguous */
+
+                       atomic_inc(&gDmaStatMemTypeCoherent);
+
+                       physAddr = (vmalloc_to_pfn(mem) << PAGE_SHIFT) + offset;
+
+                       dma_sync_single_for_cpu(NULL, physAddr, numBytes,
+                                               memMap->dir);
+                       rc = dma_map_add_segment(memMap, region, mem, physAddr,
+                                                numBytes);
+                       break;
+               }
+
+       case DMA_MEM_TYPE_USER:
+               {
+                       size_t firstPageOffset;
+                       size_t firstPageSize;
+                       struct page **pages;
+                       struct task_struct *userTask;
+
+                       atomic_inc(&gDmaStatMemTypeUser);
+
+#if 1
+                       /* If the pages are user pages, then the dma_mem_map_set_user_task function */
+                       /* must have been previously called. */
+
+                       if (memMap->userTask == NULL) {
+                               printk(KERN_ERR
+                                      "%s: must call dma_mem_map_set_user_task when using user-mode memory\n",
+                                      __func__);
+                               return -EINVAL;
+                       }
+
+                       /* User pages need to be locked. */
+
+                       firstPageOffset =
+                           (unsigned long)region->virtAddr & (PAGE_SIZE - 1);
+                       firstPageSize = PAGE_SIZE - firstPageOffset;
+
+                       region->numLockedPages = (firstPageOffset
+                                                 + region->numBytes +
+                                                 PAGE_SIZE - 1) / PAGE_SIZE;
+                       pages =
+                           kmalloc(region->numLockedPages *
+                                   sizeof(struct page *), GFP_KERNEL);
+
+                       if (pages == NULL) {
+                               region->numLockedPages = 0;
+                               return -ENOMEM;
+                       }
+
+                       userTask = memMap->userTask;
+
+                       down_read(&userTask->mm->mmap_sem);
+                       rc = get_user_pages(userTask,   /* task */
+                                           userTask->mm,       /* mm */
+                                           (unsigned long)region->virtAddr,    /* start */
+                                           region->numLockedPages,     /* len */
+                                           memMap->dir == DMA_FROM_DEVICE,     /* write */
+                                           0,  /* force */
+                                           pages,      /* pages (array of pointers to page) */
+                                           NULL);      /* vmas */
+                       up_read(&userTask->mm->mmap_sem);
+
+                       if (rc != region->numLockedPages) {
+                               kfree(pages);
+                               region->numLockedPages = 0;
+
+                               if (rc >= 0) {
+                                       rc = -EINVAL;
+                               }
+                       } else {
+                               uint8_t *virtAddr = region->virtAddr;
+                               size_t bytesRemaining;
+                               int pageIdx;
+
+                               rc = 0; /* Since get_user_pages returns +ve number */
+
+                               region->lockedPages = pages;
+
+                               /* We've locked the user pages. Now we need to walk them and figure */
+                               /* out the physical addresses. */
+
+                               /* The first page may be partial */
+
+                               dma_map_add_segment(memMap,
+                                                   region,
+                                                   virtAddr,
+                                                   PFN_PHYS(page_to_pfn
+                                                            (pages[0])) +
+                                                   firstPageOffset,
+                                                   firstPageSize);
+
+                               virtAddr += firstPageSize;
+                               bytesRemaining =
+                                   region->numBytes - firstPageSize;
+
+                               for (pageIdx = 1;
+                                    pageIdx < region->numLockedPages;
+                                    pageIdx++) {
+                                       size_t bytesThisPage =
+                                           (bytesRemaining >
+                                            PAGE_SIZE ? PAGE_SIZE :
+                                            bytesRemaining);
+
+                                       DMA_MAP_PRINT
+                                           ("pageIdx:%d pages[pageIdx]=%p pfn=%u phys=%u\n",
+                                            pageIdx, pages[pageIdx],
+                                            page_to_pfn(pages[pageIdx]),
+                                            PFN_PHYS(page_to_pfn
+                                                     (pages[pageIdx])));
+
+                                       dma_map_add_segment(memMap,
+                                                           region,
+                                                           virtAddr,
+                                                           PFN_PHYS(page_to_pfn
+                                                                    (pages
+                                                                     [pageIdx])),
+                                                           bytesThisPage);
+
+                                       virtAddr += bytesThisPage;
+                                       bytesRemaining -= bytesThisPage;
+                               }
+                       }
+#else
+                       printk(KERN_ERR
+                              "%s: User mode pages are not yet supported\n",
+                              __func__);
+
+                       /* user pages are not physically contiguous */
+
+                       rc = -EINVAL;
+#endif
+                       break;
+               }
+
+       default:
+               {
+                       printk(KERN_ERR "%s: Unsupported memory type: %d\n",
+                              __func__, region->memType);
+
+                       rc = -EINVAL;
+                       break;
+               }
+       }
+
+       if (rc != 0) {
+               memMap->numRegionsUsed--;
+       }
+
+out:
+
+       DMA_MAP_PRINT("returning %d\n", rc);
+
+       up(&memMap->lock);
+
+       return rc;
+}
+
+EXPORT_SYMBOL(dma_map_add_segment);
+
+/****************************************************************************/
+/**
+*   Maps in a memory region such that it can be used for performing a DMA.
+*
+*   @return     0 on success, error code otherwise.
+*/
+/****************************************************************************/
+
+int dma_map_mem(DMA_MemMap_t *memMap,  /* Stores state information about the map */
+               void *mem,      /* Virtual address that we want to get a map of */
+               size_t numBytes,        /* Number of bytes being mapped */
+               enum dma_data_direction dir     /* Direction that the mapping will be going */
+    ) {
+       int rc;
+
+       rc = dma_map_start(memMap, dir);
+       if (rc == 0) {
+               rc = dma_map_add_region(memMap, mem, numBytes);
+               if (rc < 0) {
+                       /* Since the add fails, this function will fail, and the caller won't */
+                       /* call unmap, so we need to do it here. */
+
+                       dma_unmap(memMap, 0);
+               }
+       }
+
+       return rc;
+}
+
+EXPORT_SYMBOL(dma_map_mem);
+
+/****************************************************************************/
+/**
+*   Setup a descriptor ring for a given memory map.
+*
+*   It is assumed that the descriptor ring has already been initialized, and
+*   this routine will only reallocate a new descriptor ring if the existing
+*   one is too small.
+*
+*   @return     0 on success, error code otherwise.
+*/
+/****************************************************************************/
+
+int dma_map_create_descriptor_ring(DMA_Device_t dev,   /* DMA device (where the ring is stored) */
+                                  DMA_MemMap_t *memMap,        /* Memory map that will be used */
+                                  dma_addr_t devPhysAddr       /* Physical address of device */
+    ) {
+       int rc;
+       int numDescriptors;
+       DMA_DeviceAttribute_t *devAttr;
+       DMA_Region_t *region;
+       DMA_Segment_t *segment;
+       dma_addr_t srcPhysAddr;
+       dma_addr_t dstPhysAddr;
+       int regionIdx;
+       int segmentIdx;
+
+       devAttr = &DMA_gDeviceAttribute[dev];
+
+       down(&memMap->lock);
+
+       /* Figure out how many descriptors we need */
+
+       numDescriptors = 0;
+       for (regionIdx = 0; regionIdx < memMap->numRegionsUsed; regionIdx++) {
+               region = &memMap->region[regionIdx];
+
+               for (segmentIdx = 0; segmentIdx < region->numSegmentsUsed;
+                    segmentIdx++) {
+                       segment = &region->segment[segmentIdx];
+
+                       if (memMap->dir == DMA_TO_DEVICE) {
+                               srcPhysAddr = segment->physAddr;
+                               dstPhysAddr = devPhysAddr;
+                       } else {
+                               srcPhysAddr = devPhysAddr;
+                               dstPhysAddr = segment->physAddr;
+                       }
+
+                       rc =
+                            dma_calculate_descriptor_count(dev, srcPhysAddr,
+                                                           dstPhysAddr,
+                                                           segment->
+                                                           numBytes);
+                       if (rc < 0) {
+                               printk(KERN_ERR
+                                      "%s: dma_calculate_descriptor_count failed: %d\n",
+                                      __func__, rc);
+                               goto out;
+                       }
+                       numDescriptors += rc;
+               }
+       }
+
+       /* Adjust the size of the ring, if it isn't big enough */
+
+       if (numDescriptors > devAttr->ring.descriptorsAllocated) {
+               dma_free_descriptor_ring(&devAttr->ring);
+               rc =
+                    dma_alloc_descriptor_ring(&devAttr->ring,
+                                              numDescriptors);
+               if (rc < 0) {
+                       printk(KERN_ERR
+                              "%s: dma_alloc_descriptor_ring failed: %d\n",
+                              __func__, rc);
+                       goto out;
+               }
+       } else {
+               rc =
+                    dma_init_descriptor_ring(&devAttr->ring,
+                                             numDescriptors);
+               if (rc < 0) {
+                       printk(KERN_ERR
+                              "%s: dma_init_descriptor_ring failed: %d\n",
+                              __func__, rc);
+                       goto out;
+               }
+       }
+
+       /* Populate the descriptors */
+
+       for (regionIdx = 0; regionIdx < memMap->numRegionsUsed; regionIdx++) {
+               region = &memMap->region[regionIdx];
+
+               for (segmentIdx = 0; segmentIdx < region->numSegmentsUsed;
+                    segmentIdx++) {
+                       segment = &region->segment[segmentIdx];
+
+                       if (memMap->dir == DMA_TO_DEVICE) {
+                               srcPhysAddr = segment->physAddr;
+                               dstPhysAddr = devPhysAddr;
+                       } else {
+                               srcPhysAddr = devPhysAddr;
+                               dstPhysAddr = segment->physAddr;
+                       }
+
+                       rc =
+                            dma_add_descriptors(&devAttr->ring, dev,
+                                                srcPhysAddr, dstPhysAddr,
+                                                segment->numBytes);
+                       if (rc < 0) {
+                               printk(KERN_ERR
+                                      "%s: dma_add_descriptors failed: %d\n",
+                                      __func__, rc);
+                               goto out;
+                       }
+               }
+       }
+
+       rc = 0;
+
+out:
+
+       up(&memMap->lock);
+       return rc;
+}
+
+EXPORT_SYMBOL(dma_map_create_descriptor_ring);
+
+/****************************************************************************/
+/**
+*   Maps in a memory region such that it can be used for performing a DMA.
+*
+*   @return
+*/
+/****************************************************************************/
+
+int dma_unmap(DMA_MemMap_t *memMap,    /* Stores state information about the map */
+             int dirtied       /* non-zero if any of the pages were modified */
+    ) {
+       int regionIdx;
+       int segmentIdx;
+       DMA_Region_t *region;
+       DMA_Segment_t *segment;
+
+       for (regionIdx = 0; regionIdx < memMap->numRegionsUsed; regionIdx++) {
+               region = &memMap->region[regionIdx];
+
+               for (segmentIdx = 0; segmentIdx < region->numSegmentsUsed;
+                    segmentIdx++) {
+                       segment = &region->segment[segmentIdx];
+
+                       switch (region->memType) {
+                       case DMA_MEM_TYPE_VMALLOC:
+                               {
+                                       printk(KERN_ERR
+                                              "%s: vmalloc'd pages are not yet supported\n",
+                                              __func__);
+                                       return -EINVAL;
+                               }
+
+                       case DMA_MEM_TYPE_KMALLOC:
+                               {
+#if ALLOW_MAP_OF_KMALLOC_MEMORY
+                                       dma_unmap_single(NULL,
+                                                        segment->physAddr,
+                                                        segment->numBytes,
+                                                        memMap->dir);
+#endif
+                                       break;
+                               }
+
+                       case DMA_MEM_TYPE_DMA:
+                               {
+                                       dma_sync_single_for_cpu(NULL,
+                                                               segment->
+                                                               physAddr,
+                                                               segment->
+                                                               numBytes,
+                                                               memMap->dir);
+                                       break;
+                               }
+
+                       case DMA_MEM_TYPE_USER:
+                               {
+                                       /* Nothing to do here. */
+
+                                       break;
+                               }
+
+                       default:
+                               {
+                                       printk(KERN_ERR
+                                              "%s: Unsupported memory type: %d\n",
+                                              __func__, region->memType);
+                                       return -EINVAL;
+                               }
+                       }
+
+                       segment->virtAddr = NULL;
+                       segment->physAddr = 0;
+                       segment->numBytes = 0;
+               }
+
+               if (region->numLockedPages > 0) {
+                       int pageIdx;
+
+                       /* Some user pages were locked. We need to go and unlock them now. */
+
+                       for (pageIdx = 0; pageIdx < region->numLockedPages;
+                            pageIdx++) {
+                               struct page *page =
+                                   region->lockedPages[pageIdx];
+
+                               if (memMap->dir == DMA_FROM_DEVICE) {
+                                       SetPageDirty(page);
+                               }
+                               page_cache_release(page);
+                       }
+                       kfree(region->lockedPages);
+                       region->numLockedPages = 0;
+                       region->lockedPages = NULL;
+               }
+
+               region->memType = DMA_MEM_TYPE_NONE;
+               region->virtAddr = NULL;
+               region->numBytes = 0;
+               region->numSegmentsUsed = 0;
+       }
+       memMap->userTask = NULL;
+       memMap->numRegionsUsed = 0;
+       memMap->inUse = 0;
+
+       up(&memMap->lock);
+
+       return 0;
+}
+
+EXPORT_SYMBOL(dma_unmap);
diff --git a/arch/arm/mach-bcmring/dma_device.c b/arch/arm/mach-bcmring/dma_device.c
new file mode 100644 (file)
index 0000000..ca0ad73
--- /dev/null
@@ -0,0 +1,593 @@
+/*****************************************************************************
+* Copyright 2004 - 2008 Broadcom Corporation.  All rights reserved.
+*
+* Unless you and Broadcom execute a separate written software license
+* agreement governing use of this software, this software is licensed to you
+* under the terms of the GNU General Public License version 2, available at
+* http://www.broadcom.com/licenses/GPLv2.php (the "GPL").
+*
+* Notwithstanding the above, under no circumstances may you combine this
+* software in any way with any other Broadcom software provided under a
+* license other than the GPL, without Broadcom's express prior written
+* consent.
+*****************************************************************************/
+
+/****************************************************************************/
+/**
+*   @file   dma_device.c
+*
+*   @brief  private array of DMA_DeviceAttribute_t
+*/
+/****************************************************************************/
+
+DMA_DeviceAttribute_t DMA_gDeviceAttribute[DMA_NUM_DEVICE_ENTRIES] = {
+       [DMA_DEVICE_MEM_TO_MEM] =       /* MEM 2 MEM */
+       {
+        .flags = DMA_DEVICE_FLAG_ON_DMA0 | DMA_DEVICE_FLAG_ON_DMA1,
+        .name = "mem-to-mem",
+        .config = {
+                   .srcUpdate = dmacHw_SRC_ADDRESS_UPDATE_MODE_INC,
+                   .dstUpdate = dmacHw_DST_ADDRESS_UPDATE_MODE_INC,
+                   .transferType = dmacHw_TRANSFER_TYPE_MEM_TO_MEM,
+                   .transferMode = dmacHw_TRANSFER_MODE_PERREQUEST,
+                   .srcMasterInterface = dmacHw_SRC_MASTER_INTERFACE_1,
+                   .dstMasterInterface = dmacHw_DST_MASTER_INTERFACE_1,
+                   .completeTransferInterrupt = dmacHw_INTERRUPT_ENABLE,
+                   .errorInterrupt = dmacHw_INTERRUPT_ENABLE,
+                   .channelPriority = dmacHw_CHANNEL_PRIORITY_7,
+                   .srcMaxTransactionWidth = dmacHw_SRC_TRANSACTION_WIDTH_64,
+                   .dstMaxTransactionWidth = dmacHw_DST_TRANSACTION_WIDTH_64,
+
+                   },
+        },
+       [DMA_DEVICE_VPM_MEM_TO_MEM] =   /* VPM */
+       {
+        .flags = DMA_DEVICE_FLAG_IS_DEDICATED | DMA_DEVICE_FLAG_NO_ISR,
+        .name = "vpm",
+        .dedicatedController = 0,
+        .dedicatedChannel = 0,
+        /* reserve DMA0:0 for VPM */
+        },
+       [DMA_DEVICE_NAND_MEM_TO_MEM] =  /* NAND */
+       {
+        .flags = DMA_DEVICE_FLAG_ON_DMA0 | DMA_DEVICE_FLAG_ON_DMA1,
+        .name = "nand",
+        .config = {
+                   .srcPeripheralPort = 0,
+                   .dstPeripheralPort = 0,
+                   .srcStatusRegisterAddress = 0x00000000,
+                   .dstStatusRegisterAddress = 0x00000000,
+                   .transferType = dmacHw_TRANSFER_TYPE_MEM_TO_MEM,
+                   .srcMasterInterface = dmacHw_SRC_MASTER_INTERFACE_1,
+                   .dstMasterInterface = dmacHw_DST_MASTER_INTERFACE_1,
+                   .srcMaxTransactionWidth = dmacHw_SRC_TRANSACTION_WIDTH_32,
+                   .dstMaxTransactionWidth = dmacHw_DST_TRANSACTION_WIDTH_32,
+                   .srcMaxBurstWidth = dmacHw_SRC_BURST_WIDTH_4,
+                   .dstMaxBurstWidth = dmacHw_DST_BURST_WIDTH_4,
+                   .completeTransferInterrupt = dmacHw_INTERRUPT_ENABLE,
+                   .errorInterrupt = dmacHw_INTERRUPT_ENABLE,
+                   .channelPriority = dmacHw_CHANNEL_PRIORITY_6,
+                   },
+        },
+       [DMA_DEVICE_PIF_MEM_TO_DEV] =   /* PIF TX */
+       {
+        .flags = DMA_DEVICE_FLAG_ON_DMA0 | DMA_DEVICE_FLAG_ON_DMA1
+        | DMA_DEVICE_FLAG_ALLOW_LARGE_FIFO
+        | DMA_DEVICE_FLAG_ALLOC_DMA1_FIRST | DMA_DEVICE_FLAG_PORT_PER_DMAC,
+        .name = "pif_tx",
+        .dmacPort = {14, 5},
+        .config = {
+                   .srcPeripheralPort = 0,     /* SRC: memory */
+                   /* dstPeripheralPort          = 5 or 14 */
+                   .srcStatusRegisterAddress = 0x00000000,
+                   .dstStatusRegisterAddress = 0x00000000,
+                   .srcUpdate = dmacHw_SRC_ADDRESS_UPDATE_MODE_INC,
+                   .dstUpdate = dmacHw_DST_ADDRESS_UPDATE_MODE_INC,
+                   .transferType = dmacHw_TRANSFER_TYPE_MEM_TO_PERIPHERAL,
+                   .srcMasterInterface = dmacHw_SRC_MASTER_INTERFACE_1,
+                   .dstMasterInterface = dmacHw_DST_MASTER_INTERFACE_2,
+                   .completeTransferInterrupt = dmacHw_INTERRUPT_ENABLE,
+                   .errorInterrupt = dmacHw_INTERRUPT_ENABLE,
+                   .channelPriority = dmacHw_CHANNEL_PRIORITY_7,
+                   .srcMaxTransactionWidth = dmacHw_SRC_TRANSACTION_WIDTH_64,
+                   .dstMaxTransactionWidth = dmacHw_DST_TRANSACTION_WIDTH_32,
+                   .srcMaxBurstWidth = dmacHw_SRC_BURST_WIDTH_8,
+                   .dstMaxBurstWidth = dmacHw_DST_BURST_WIDTH_8,
+                   .maxDataPerBlock = 16256,
+                   },
+        },
+       [DMA_DEVICE_PIF_DEV_TO_MEM] =   /* PIF RX */
+       {
+        .flags = DMA_DEVICE_FLAG_ON_DMA0 | DMA_DEVICE_FLAG_ON_DMA1
+        | DMA_DEVICE_FLAG_ALLOW_LARGE_FIFO
+        /* DMA_DEVICE_FLAG_ALLOC_DMA1_FIRST */
+        | DMA_DEVICE_FLAG_PORT_PER_DMAC,
+        .name = "pif_rx",
+        .dmacPort = {14, 5},
+        .config = {
+                   /* srcPeripheralPort          = 5 or 14 */
+                   .dstPeripheralPort = 0,     /* DST: memory */
+                   .srcStatusRegisterAddress = 0x00000000,
+                   .dstStatusRegisterAddress = 0x00000000,
+                   .srcUpdate = dmacHw_SRC_ADDRESS_UPDATE_MODE_INC,
+                   .dstUpdate = dmacHw_DST_ADDRESS_UPDATE_MODE_INC,
+                   .transferType = dmacHw_TRANSFER_TYPE_PERIPHERAL_TO_MEM,
+                   .srcMasterInterface = dmacHw_SRC_MASTER_INTERFACE_2,
+                   .dstMasterInterface = dmacHw_DST_MASTER_INTERFACE_1,
+                   .completeTransferInterrupt = dmacHw_INTERRUPT_ENABLE,
+                   .errorInterrupt = dmacHw_INTERRUPT_ENABLE,
+                   .channelPriority = dmacHw_CHANNEL_PRIORITY_7,
+                   .srcMaxTransactionWidth = dmacHw_SRC_TRANSACTION_WIDTH_32,
+                   .dstMaxTransactionWidth = dmacHw_DST_TRANSACTION_WIDTH_64,
+                   .srcMaxBurstWidth = dmacHw_SRC_BURST_WIDTH_8,
+                   .dstMaxBurstWidth = dmacHw_DST_BURST_WIDTH_8,
+                   .maxDataPerBlock = 16256,
+                   },
+        },
+       [DMA_DEVICE_I2S0_DEV_TO_MEM] =  /* I2S RX */
+       {
+        .flags = DMA_DEVICE_FLAG_ON_DMA0,
+        .name = "i2s0_rx",
+        .config = {
+                   .srcPeripheralPort = 0,     /* SRC: I2S0 */
+                   .dstPeripheralPort = 0,     /* DST: memory */
+                   .srcStatusRegisterAddress = 0,
+                   .dstStatusRegisterAddress = 0,
+                   .transferType = dmacHw_TRANSFER_TYPE_PERIPHERAL_TO_MEM,
+                   .srcMasterInterface = dmacHw_SRC_MASTER_INTERFACE_1,
+                   .dstMasterInterface = dmacHw_DST_MASTER_INTERFACE_1,
+                   .srcMaxTransactionWidth = dmacHw_SRC_TRANSACTION_WIDTH_16,
+                   .dstMaxTransactionWidth = dmacHw_DST_TRANSACTION_WIDTH_64,
+                   .srcMaxBurstWidth = dmacHw_SRC_BURST_WIDTH_4,
+                   .dstMaxBurstWidth = dmacHw_DST_BURST_WIDTH_0,
+                   .blockTransferInterrupt = dmacHw_INTERRUPT_ENABLE,
+                   .completeTransferInterrupt = dmacHw_INTERRUPT_DISABLE,
+                   .errorInterrupt = dmacHw_INTERRUPT_ENABLE,
+                   .channelPriority = dmacHw_CHANNEL_PRIORITY_7,
+                   .transferMode = dmacHw_TRANSFER_MODE_CONTINUOUS,
+                   },
+        },
+       [DMA_DEVICE_I2S0_MEM_TO_DEV] =  /* I2S TX */
+       {
+        .flags = DMA_DEVICE_FLAG_ON_DMA0,
+        .name = "i2s0_tx",
+        .config = {
+                   .srcPeripheralPort = 0,     /* SRC: memory */
+                   .dstPeripheralPort = 1,     /* DST: I2S0 */
+                   .srcStatusRegisterAddress = 0,
+                   .dstStatusRegisterAddress = 0,
+                   .transferType = dmacHw_TRANSFER_TYPE_MEM_TO_PERIPHERAL,
+                   .srcMasterInterface = dmacHw_SRC_MASTER_INTERFACE_1,
+                   .dstMasterInterface = dmacHw_DST_MASTER_INTERFACE_1,
+                   .srcMaxTransactionWidth = dmacHw_SRC_TRANSACTION_WIDTH_64,
+                   .dstMaxTransactionWidth = dmacHw_DST_TRANSACTION_WIDTH_16,
+                   .srcMaxBurstWidth = dmacHw_SRC_BURST_WIDTH_0,
+                   .dstMaxBurstWidth = dmacHw_DST_BURST_WIDTH_4,
+                   .blockTransferInterrupt = dmacHw_INTERRUPT_DISABLE,
+                   .completeTransferInterrupt = dmacHw_INTERRUPT_ENABLE,
+                   .errorInterrupt = dmacHw_INTERRUPT_ENABLE,
+                   .channelPriority = dmacHw_CHANNEL_PRIORITY_7,
+                   .transferMode = dmacHw_TRANSFER_MODE_PERREQUEST,
+                   },
+        },
+       [DMA_DEVICE_I2S1_DEV_TO_MEM] =  /* I2S1 RX */
+       {
+        .flags = DMA_DEVICE_FLAG_ON_DMA1,
+        .name = "i2s1_rx",
+        .config = {
+                   .srcPeripheralPort = 2,     /* SRC: I2S1 */
+                   .dstPeripheralPort = 0,     /* DST: memory */
+                   .srcStatusRegisterAddress = 0,
+                   .dstStatusRegisterAddress = 0,
+                   .transferType = dmacHw_TRANSFER_TYPE_PERIPHERAL_TO_MEM,
+                   .srcMasterInterface = dmacHw_SRC_MASTER_INTERFACE_1,
+                   .dstMasterInterface = dmacHw_DST_MASTER_INTERFACE_1,
+                   .srcMaxTransactionWidth = dmacHw_SRC_TRANSACTION_WIDTH_16,
+                   .dstMaxTransactionWidth = dmacHw_DST_TRANSACTION_WIDTH_64,
+                   .srcMaxBurstWidth = dmacHw_SRC_BURST_WIDTH_4,
+                   .dstMaxBurstWidth = dmacHw_DST_BURST_WIDTH_0,
+                   .blockTransferInterrupt = dmacHw_INTERRUPT_ENABLE,
+                   .completeTransferInterrupt = dmacHw_INTERRUPT_DISABLE,
+                   .errorInterrupt = dmacHw_INTERRUPT_ENABLE,
+                   .channelPriority = dmacHw_CHANNEL_PRIORITY_7,
+                   .transferMode = dmacHw_TRANSFER_MODE_CONTINUOUS,
+                   },
+        },
+       [DMA_DEVICE_I2S1_MEM_TO_DEV] =  /* I2S1 TX */
+       {
+        .flags = DMA_DEVICE_FLAG_ON_DMA1,
+        .name = "i2s1_tx",
+        .config = {
+                   .srcPeripheralPort = 0,     /* SRC: memory */
+                   .dstPeripheralPort = 3,     /* DST: I2S1 */
+                   .srcStatusRegisterAddress = 0,
+                   .dstStatusRegisterAddress = 0,
+                   .transferType = dmacHw_TRANSFER_TYPE_MEM_TO_PERIPHERAL,
+                   .srcMasterInterface = dmacHw_SRC_MASTER_INTERFACE_1,
+                   .dstMasterInterface = dmacHw_DST_MASTER_INTERFACE_1,
+                   .srcMaxTransactionWidth = dmacHw_SRC_TRANSACTION_WIDTH_64,
+                   .dstMaxTransactionWidth = dmacHw_DST_TRANSACTION_WIDTH_16,
+                   .srcMaxBurstWidth = dmacHw_SRC_BURST_WIDTH_0,
+                   .dstMaxBurstWidth = dmacHw_DST_BURST_WIDTH_4,
+                   .blockTransferInterrupt = dmacHw_INTERRUPT_DISABLE,
+                   .completeTransferInterrupt = dmacHw_INTERRUPT_ENABLE,
+                   .errorInterrupt = dmacHw_INTERRUPT_ENABLE,
+                   .channelPriority = dmacHw_CHANNEL_PRIORITY_7,
+                   .transferMode = dmacHw_TRANSFER_MODE_PERREQUEST,
+                   },
+        },
+       [DMA_DEVICE_ESW_MEM_TO_DEV] =   /* ESW TX */
+       {
+        .name = "esw_tx",
+        .flags = DMA_DEVICE_FLAG_IS_DEDICATED,
+        .dedicatedController = 1,
+        .dedicatedChannel = 3,
+        .config = {
+                   .srcPeripheralPort = 0,     /* SRC: memory */
+                   .dstPeripheralPort = 1,     /* DST: ESW (MTP) */
+                   .completeTransferInterrupt = dmacHw_INTERRUPT_ENABLE,
+                   .errorInterrupt = dmacHw_INTERRUPT_DISABLE,
+                   /* DMAx_AHB_SSTATARy */
+                   .srcStatusRegisterAddress = 0x00000000,
+                   /* DMAx_AHB_DSTATARy */
+                   .dstStatusRegisterAddress = 0x30490010,
+                   /* DMAx_AHB_CFGy */
+                   .channelPriority = dmacHw_CHANNEL_PRIORITY_7,
+                   /* DMAx_AHB_CTLy */
+                   .srcMasterInterface = dmacHw_SRC_MASTER_INTERFACE_2,
+                   .dstMasterInterface = dmacHw_DST_MASTER_INTERFACE_1,
+                   .transferType = dmacHw_TRANSFER_TYPE_MEM_TO_PERIPHERAL,
+                   .srcMaxBurstWidth = dmacHw_SRC_BURST_WIDTH_0,
+                   .dstMaxBurstWidth = dmacHw_DST_BURST_WIDTH_8,
+                   .srcUpdate = dmacHw_SRC_ADDRESS_UPDATE_MODE_INC,
+                   .dstUpdate = dmacHw_DST_ADDRESS_UPDATE_MODE_INC,
+                   .srcMaxTransactionWidth = dmacHw_SRC_TRANSACTION_WIDTH_64,
+                   .dstMaxTransactionWidth = dmacHw_DST_TRANSACTION_WIDTH_64,
+                   },
+        },
+       [DMA_DEVICE_ESW_DEV_TO_MEM] =   /* ESW RX */
+       {
+        .name = "esw_rx",
+        .flags = DMA_DEVICE_FLAG_IS_DEDICATED,
+        .dedicatedController = 1,
+        .dedicatedChannel = 2,
+        .config = {
+                   .srcPeripheralPort = 0,     /* SRC: ESW (PTM) */
+                   .dstPeripheralPort = 0,     /* DST: memory */
+                   .completeTransferInterrupt = dmacHw_INTERRUPT_ENABLE,
+                   .errorInterrupt = dmacHw_INTERRUPT_DISABLE,
+                   /* DMAx_AHB_SSTATARy */
+                   .srcStatusRegisterAddress = 0x30480010,
+                   /* DMAx_AHB_DSTATARy */
+                   .dstStatusRegisterAddress = 0x00000000,
+                   /* DMAx_AHB_CFGy */
+                   .channelPriority = dmacHw_CHANNEL_PRIORITY_7,
+                   /* DMAx_AHB_CTLy */
+                   .srcMasterInterface = dmacHw_SRC_MASTER_INTERFACE_2,
+                   .dstMasterInterface = dmacHw_DST_MASTER_INTERFACE_1,
+                   .transferType = dmacHw_TRANSFER_TYPE_PERIPHERAL_TO_MEM,
+                   .srcMaxBurstWidth = dmacHw_SRC_BURST_WIDTH_8,
+                   .dstMaxBurstWidth = dmacHw_DST_BURST_WIDTH_0,
+                   .srcUpdate = dmacHw_SRC_ADDRESS_UPDATE_MODE_INC,
+                   .dstUpdate = dmacHw_DST_ADDRESS_UPDATE_MODE_INC,
+                   .srcMaxTransactionWidth = dmacHw_SRC_TRANSACTION_WIDTH_64,
+                   .dstMaxTransactionWidth = dmacHw_DST_TRANSACTION_WIDTH_64,
+                   },
+        },
+       [DMA_DEVICE_APM_CODEC_A_DEV_TO_MEM] =   /* APM Codec A Ingress */
+       {
+        .flags = DMA_DEVICE_FLAG_ON_DMA0,
+        .name = "apm_a_rx",
+        .config = {
+                   .srcPeripheralPort = 2,     /* SRC: Codec A Ingress FIFO */
+                   .dstPeripheralPort = 0,     /* DST: memory */
+                   .srcStatusRegisterAddress = 0x00000000,
+                   .dstStatusRegisterAddress = 0x00000000,
+                   .srcUpdate = dmacHw_SRC_ADDRESS_UPDATE_MODE_INC,
+                   .dstUpdate = dmacHw_DST_ADDRESS_UPDATE_MODE_INC,
+                   .transferType = dmacHw_TRANSFER_TYPE_PERIPHERAL_TO_MEM,
+                   .srcMasterInterface = dmacHw_SRC_MASTER_INTERFACE_2,
+                   .dstMasterInterface = dmacHw_DST_MASTER_INTERFACE_1,
+                   .blockTransferInterrupt = dmacHw_INTERRUPT_ENABLE,
+                   .completeTransferInterrupt = dmacHw_INTERRUPT_DISABLE,
+                   .errorInterrupt = dmacHw_INTERRUPT_ENABLE,
+                   .channelPriority = dmacHw_CHANNEL_PRIORITY_7,
+                   .srcMaxTransactionWidth = dmacHw_SRC_TRANSACTION_WIDTH_32,
+                   .dstMaxTransactionWidth = dmacHw_DST_TRANSACTION_WIDTH_64,
+                   .srcMaxBurstWidth = dmacHw_SRC_BURST_WIDTH_4,
+                   .dstMaxBurstWidth = dmacHw_DST_BURST_WIDTH_4,
+                   .transferMode = dmacHw_TRANSFER_MODE_CONTINUOUS,
+                   },
+        },
+       [DMA_DEVICE_APM_CODEC_A_MEM_TO_DEV] =   /* APM Codec A Egress */
+       {
+        .flags = DMA_DEVICE_FLAG_ON_DMA0,
+        .name = "apm_a_tx",
+        .config = {
+                   .srcPeripheralPort = 0,     /* SRC: memory */
+                   .dstPeripheralPort = 3,     /* DST: Codec A Egress FIFO */
+                   .srcStatusRegisterAddress = 0x00000000,
+                   .dstStatusRegisterAddress = 0x00000000,
+                   .srcUpdate = dmacHw_SRC_ADDRESS_UPDATE_MODE_INC,
+                   .dstUpdate = dmacHw_DST_ADDRESS_UPDATE_MODE_INC,
+                   .transferType = dmacHw_TRANSFER_TYPE_MEM_TO_PERIPHERAL,
+                   .srcMasterInterface = dmacHw_SRC_MASTER_INTERFACE_1,
+                   .dstMasterInterface = dmacHw_DST_MASTER_INTERFACE_2,
+                   .blockTransferInterrupt = dmacHw_INTERRUPT_DISABLE,
+                   .completeTransferInterrupt = dmacHw_INTERRUPT_ENABLE,
+                   .errorInterrupt = dmacHw_INTERRUPT_ENABLE,
+                   .channelPriority = dmacHw_CHANNEL_PRIORITY_7,
+                   .srcMaxTransactionWidth = dmacHw_SRC_TRANSACTION_WIDTH_64,
+                   .dstMaxTransactionWidth = dmacHw_DST_TRANSACTION_WIDTH_32,
+                   .srcMaxBurstWidth = dmacHw_SRC_BURST_WIDTH_4,
+                   .dstMaxBurstWidth = dmacHw_DST_BURST_WIDTH_4,
+                   .transferMode = dmacHw_TRANSFER_MODE_PERREQUEST,
+                   },
+        },
+       [DMA_DEVICE_APM_CODEC_B_DEV_TO_MEM] =   /* APM Codec B Ingress */
+       {
+        .flags = DMA_DEVICE_FLAG_ON_DMA0,
+        .name = "apm_b_rx",
+        .config = {
+                   .srcPeripheralPort = 4,     /* SRC: Codec B Ingress FIFO */
+                   .dstPeripheralPort = 0,     /* DST: memory */
+                   .srcStatusRegisterAddress = 0x00000000,
+                   .dstStatusRegisterAddress = 0x00000000,
+                   .srcUpdate = dmacHw_SRC_ADDRESS_UPDATE_MODE_INC,
+                   .dstUpdate = dmacHw_DST_ADDRESS_UPDATE_MODE_INC,
+                   .transferType = dmacHw_TRANSFER_TYPE_PERIPHERAL_TO_MEM,
+                   .srcMasterInterface = dmacHw_SRC_MASTER_INTERFACE_2,
+                   .dstMasterInterface = dmacHw_DST_MASTER_INTERFACE_1,
+                   .blockTransferInterrupt = dmacHw_INTERRUPT_ENABLE,
+                   .completeTransferInterrupt = dmacHw_INTERRUPT_DISABLE,
+                   .errorInterrupt = dmacHw_INTERRUPT_ENABLE,
+                   .channelPriority = dmacHw_CHANNEL_PRIORITY_7,
+                   .srcMaxTransactionWidth = dmacHw_SRC_TRANSACTION_WIDTH_32,
+                   .dstMaxTransactionWidth = dmacHw_DST_TRANSACTION_WIDTH_64,
+                   .srcMaxBurstWidth = dmacHw_SRC_BURST_WIDTH_4,
+                   .dstMaxBurstWidth = dmacHw_DST_BURST_WIDTH_4,
+                   .transferMode = dmacHw_TRANSFER_MODE_CONTINUOUS,
+                   },
+        },
+       [DMA_DEVICE_APM_CODEC_B_MEM_TO_DEV] =   /* APM Codec B Egress */
+       {
+        .flags = DMA_DEVICE_FLAG_ON_DMA0,
+        .name = "apm_b_tx",
+        .config = {
+                   .srcPeripheralPort = 0,     /* SRC: memory */
+                   .dstPeripheralPort = 5,     /* DST: Codec B Egress FIFO */
+                   .srcStatusRegisterAddress = 0x00000000,
+                   .dstStatusRegisterAddress = 0x00000000,
+                   .srcUpdate = dmacHw_SRC_ADDRESS_UPDATE_MODE_INC,
+                   .dstUpdate = dmacHw_DST_ADDRESS_UPDATE_MODE_INC,
+                   .transferType = dmacHw_TRANSFER_TYPE_MEM_TO_PERIPHERAL,
+                   .srcMasterInterface = dmacHw_SRC_MASTER_INTERFACE_1,
+                   .dstMasterInterface = dmacHw_DST_MASTER_INTERFACE_2,
+                   .blockTransferInterrupt = dmacHw_INTERRUPT_DISABLE,
+                   .completeTransferInterrupt = dmacHw_INTERRUPT_ENABLE,
+                   .errorInterrupt = dmacHw_INTERRUPT_ENABLE,
+                   .channelPriority = dmacHw_CHANNEL_PRIORITY_7,
+                   .srcMaxTransactionWidth = dmacHw_SRC_TRANSACTION_WIDTH_64,
+                   .dstMaxTransactionWidth = dmacHw_DST_TRANSACTION_WIDTH_32,
+                   .srcMaxBurstWidth = dmacHw_SRC_BURST_WIDTH_4,
+                   .dstMaxBurstWidth = dmacHw_DST_BURST_WIDTH_4,
+                   .transferMode = dmacHw_TRANSFER_MODE_PERREQUEST,
+                   },
+        },
+       [DMA_DEVICE_APM_CODEC_C_DEV_TO_MEM] =   /* APM Codec C Ingress */
+       {
+        .flags = DMA_DEVICE_FLAG_ON_DMA1,
+        .name = "apm_c_rx",
+        .config = {
+                   .srcPeripheralPort = 4,     /* SRC: Codec C Ingress FIFO */
+                   .dstPeripheralPort = 0,     /* DST: memory */
+                   .srcStatusRegisterAddress = 0x00000000,
+                   .dstStatusRegisterAddress = 0x00000000,
+                   .srcUpdate = dmacHw_SRC_ADDRESS_UPDATE_MODE_INC,
+                   .dstUpdate = dmacHw_DST_ADDRESS_UPDATE_MODE_INC,
+                   .transferType = dmacHw_TRANSFER_TYPE_PERIPHERAL_TO_MEM,
+                   .srcMasterInterface = dmacHw_SRC_MASTER_INTERFACE_2,
+                   .dstMasterInterface = dmacHw_DST_MASTER_INTERFACE_1,
+                   .blockTransferInterrupt = dmacHw_INTERRUPT_ENABLE,
+                   .completeTransferInterrupt = dmacHw_INTERRUPT_DISABLE,
+                   .errorInterrupt = dmacHw_INTERRUPT_ENABLE,
+                   .channelPriority = dmacHw_CHANNEL_PRIORITY_7,
+                   .srcMaxTransactionWidth = dmacHw_SRC_TRANSACTION_WIDTH_32,
+                   .dstMaxTransactionWidth = dmacHw_DST_TRANSACTION_WIDTH_64,
+                   .srcMaxBurstWidth = dmacHw_SRC_BURST_WIDTH_4,
+                   .dstMaxBurstWidth = dmacHw_DST_BURST_WIDTH_4,
+                   .transferMode = dmacHw_TRANSFER_MODE_CONTINUOUS,
+                   },
+        },
+       [DMA_DEVICE_APM_PCM0_DEV_TO_MEM] =      /* PCM0 RX */
+       {
+        .flags = DMA_DEVICE_FLAG_ON_DMA0,
+        .name = "pcm0_rx",
+        .config = {
+                   .srcPeripheralPort = 12,    /* SRC: PCM0 */
+                   .dstPeripheralPort = 0,     /* DST: memory */
+                   .srcStatusRegisterAddress = 0,
+                   .dstStatusRegisterAddress = 0,
+                   .transferType = dmacHw_TRANSFER_TYPE_PERIPHERAL_TO_MEM,
+                   .srcMasterInterface = dmacHw_SRC_MASTER_INTERFACE_2,
+                   .dstMasterInterface = dmacHw_DST_MASTER_INTERFACE_1,
+                   .srcMaxTransactionWidth = dmacHw_SRC_TRANSACTION_WIDTH_32,
+                   .dstMaxTransactionWidth = dmacHw_DST_TRANSACTION_WIDTH_64,
+                   .srcMaxBurstWidth = dmacHw_SRC_BURST_WIDTH_8,
+                   .dstMaxBurstWidth = dmacHw_DST_BURST_WIDTH_4,
+                   .blockTransferInterrupt = dmacHw_INTERRUPT_ENABLE,
+                   .completeTransferInterrupt = dmacHw_INTERRUPT_DISABLE,
+                   .errorInterrupt = dmacHw_INTERRUPT_ENABLE,
+                   .channelPriority = dmacHw_CHANNEL_PRIORITY_7,
+                   .transferMode = dmacHw_TRANSFER_MODE_CONTINUOUS,
+                   },
+        },
+       [DMA_DEVICE_APM_PCM0_MEM_TO_DEV] =      /* PCM0 TX */
+       {
+        .flags = DMA_DEVICE_FLAG_ON_DMA0,
+        .name = "pcm0_tx",
+        .config = {
+                   .srcPeripheralPort = 0,     /* SRC: memory */
+                   .dstPeripheralPort = 13,    /* DST: PCM0 */
+                   .srcStatusRegisterAddress = 0,
+                   .dstStatusRegisterAddress = 0,
+                   .transferType = dmacHw_TRANSFER_TYPE_MEM_TO_PERIPHERAL,
+                   .srcMasterInterface = dmacHw_SRC_MASTER_INTERFACE_1,
+                   .dstMasterInterface = dmacHw_DST_MASTER_INTERFACE_2,
+                   .srcMaxTransactionWidth = dmacHw_SRC_TRANSACTION_WIDTH_64,
+                   .dstMaxTransactionWidth = dmacHw_DST_TRANSACTION_WIDTH_32,
+                   .srcMaxBurstWidth = dmacHw_SRC_BURST_WIDTH_4,
+                   .dstMaxBurstWidth = dmacHw_DST_BURST_WIDTH_8,
+                   .blockTransferInterrupt = dmacHw_INTERRUPT_DISABLE,
+                   .completeTransferInterrupt = dmacHw_INTERRUPT_ENABLE,
+                   .errorInterrupt = dmacHw_INTERRUPT_ENABLE,
+                   .channelPriority = dmacHw_CHANNEL_PRIORITY_7,
+                   .transferMode = dmacHw_TRANSFER_MODE_PERREQUEST,
+                   },
+        },
+       [DMA_DEVICE_APM_PCM1_DEV_TO_MEM] =      /* PCM1 RX */
+       {
+        .flags = DMA_DEVICE_FLAG_ON_DMA1,
+        .name = "pcm1_rx",
+        .config = {
+                   .srcPeripheralPort = 14,    /* SRC: PCM1 */
+                   .dstPeripheralPort = 0,     /* DST: memory */
+                   .srcStatusRegisterAddress = 0,
+                   .dstStatusRegisterAddress = 0,
+                   .transferType = dmacHw_TRANSFER_TYPE_PERIPHERAL_TO_MEM,
+                   .srcMasterInterface = dmacHw_SRC_MASTER_INTERFACE_2,
+                   .dstMasterInterface = dmacHw_DST_MASTER_INTERFACE_1,
+                   .srcMaxTransactionWidth = dmacHw_SRC_TRANSACTION_WIDTH_32,
+                   .dstMaxTransactionWidth = dmacHw_DST_TRANSACTION_WIDTH_64,
+                   .srcMaxBurstWidth = dmacHw_SRC_BURST_WIDTH_8,
+                   .dstMaxBurstWidth = dmacHw_DST_BURST_WIDTH_4,
+                   .blockTransferInterrupt = dmacHw_INTERRUPT_ENABLE,
+                   .completeTransferInterrupt = dmacHw_INTERRUPT_DISABLE,
+                   .errorInterrupt = dmacHw_INTERRUPT_ENABLE,
+                   .channelPriority = dmacHw_CHANNEL_PRIORITY_7,
+                   .transferMode = dmacHw_TRANSFER_MODE_CONTINUOUS,
+                   },
+        },
+       [DMA_DEVICE_APM_PCM1_MEM_TO_DEV] =      /* PCM1 TX */
+       {
+        .flags = DMA_DEVICE_FLAG_ON_DMA1,
+        .name = "pcm1_tx",
+        .config = {
+                   .srcPeripheralPort = 0,     /* SRC: memory */
+                   .dstPeripheralPort = 15,    /* DST: PCM1 */
+                   .srcStatusRegisterAddress = 0,
+                   .dstStatusRegisterAddress = 0,
+                   .transferType = dmacHw_TRANSFER_TYPE_MEM_TO_PERIPHERAL,
+                   .srcMasterInterface = dmacHw_SRC_MASTER_INTERFACE_1,
+                   .dstMasterInterface = dmacHw_DST_MASTER_INTERFACE_2,
+                   .srcMaxTransactionWidth = dmacHw_SRC_TRANSACTION_WIDTH_64,
+                   .dstMaxTransactionWidth = dmacHw_DST_TRANSACTION_WIDTH_32,
+                   .srcMaxBurstWidth = dmacHw_SRC_BURST_WIDTH_4,
+                   .dstMaxBurstWidth = dmacHw_DST_BURST_WIDTH_8,
+                   .blockTransferInterrupt = dmacHw_INTERRUPT_DISABLE,
+                   .completeTransferInterrupt = dmacHw_INTERRUPT_ENABLE,
+                   .errorInterrupt = dmacHw_INTERRUPT_ENABLE,
+                   .channelPriority = dmacHw_CHANNEL_PRIORITY_7,
+                   .transferMode = dmacHw_TRANSFER_MODE_PERREQUEST,
+                   },
+        },
+       [DMA_DEVICE_SPUM_DEV_TO_MEM] =  /* SPUM RX */
+       {
+        .flags = DMA_DEVICE_FLAG_ON_DMA0 | DMA_DEVICE_FLAG_ON_DMA1,
+        .name = "spum_rx",
+        .config = {
+                   .srcPeripheralPort = 6,     /* SRC: Codec A Ingress FIFO */
+                   .dstPeripheralPort = 0,     /* DST: memory */
+                   .srcStatusRegisterAddress = 0x00000000,
+                   .dstStatusRegisterAddress = 0x00000000,
+                   .srcUpdate = dmacHw_SRC_ADDRESS_UPDATE_MODE_INC,
+                   .dstUpdate = dmacHw_DST_ADDRESS_UPDATE_MODE_INC,
+                   .transferType = dmacHw_TRANSFER_TYPE_PERIPHERAL_TO_MEM,
+                   .srcMasterInterface = dmacHw_SRC_MASTER_INTERFACE_2,
+                   .dstMasterInterface = dmacHw_DST_MASTER_INTERFACE_1,
+                   .blockTransferInterrupt = dmacHw_INTERRUPT_DISABLE,
+                   .completeTransferInterrupt = dmacHw_INTERRUPT_ENABLE,
+                   .errorInterrupt = dmacHw_INTERRUPT_ENABLE,
+                   .channelPriority = dmacHw_CHANNEL_PRIORITY_7,
+                   .srcMaxTransactionWidth = dmacHw_SRC_TRANSACTION_WIDTH_32,
+                   .dstMaxTransactionWidth = dmacHw_DST_TRANSACTION_WIDTH_32,
+                   /* Busrt size **MUST** be 16 for SPUM to work */
+                   .srcMaxBurstWidth = dmacHw_SRC_BURST_WIDTH_16,
+                   .dstMaxBurstWidth = dmacHw_DST_BURST_WIDTH_16,
+                   .transferMode = dmacHw_TRANSFER_MODE_PERREQUEST,
+                   /* on the RX side, SPU needs to be the flow controller */
+                   .flowControler = dmacHw_FLOW_CONTROL_PERIPHERAL,
+                   },
+        },
+       [DMA_DEVICE_SPUM_MEM_TO_DEV] =  /* SPUM TX */
+       {
+        .flags = DMA_DEVICE_FLAG_ON_DMA0 | DMA_DEVICE_FLAG_ON_DMA1,
+        .name = "spum_tx",
+        .config = {
+                   .srcPeripheralPort = 0,     /* SRC: memory */
+                   .dstPeripheralPort = 7,     /* DST: SPUM */
+                   .srcStatusRegisterAddress = 0x00000000,
+                   .dstStatusRegisterAddress = 0x00000000,
+                   .srcUpdate = dmacHw_SRC_ADDRESS_UPDATE_MODE_INC,
+                   .dstUpdate = dmacHw_DST_ADDRESS_UPDATE_MODE_INC,
+                   .transferType = dmacHw_TRANSFER_TYPE_MEM_TO_PERIPHERAL,
+                   .srcMasterInterface = dmacHw_SRC_MASTER_INTERFACE_1,
+                   .dstMasterInterface = dmacHw_DST_MASTER_INTERFACE_2,
+                   .blockTransferInterrupt = dmacHw_INTERRUPT_DISABLE,
+                   .completeTransferInterrupt = dmacHw_INTERRUPT_ENABLE,
+                   .errorInterrupt = dmacHw_INTERRUPT_ENABLE,
+                   .channelPriority = dmacHw_CHANNEL_PRIORITY_7,
+                   .srcMaxTransactionWidth = dmacHw_SRC_TRANSACTION_WIDTH_32,
+                   .dstMaxTransactionWidth = dmacHw_DST_TRANSACTION_WIDTH_32,
+                   /* Busrt size **MUST** be 16 for SPUM to work */
+                   .srcMaxBurstWidth = dmacHw_SRC_BURST_WIDTH_16,
+                   .dstMaxBurstWidth = dmacHw_DST_BURST_WIDTH_16,
+                   .transferMode = dmacHw_TRANSFER_MODE_PERREQUEST,
+                   },
+        },
+       [DMA_DEVICE_MEM_TO_VRAM] =      /* MEM 2 VRAM */
+       {
+        .flags = DMA_DEVICE_FLAG_ON_DMA0 | DMA_DEVICE_FLAG_ON_DMA1,
+        .name = "mem-to-vram",
+        .config = {
+                   .srcPeripheralPort = 0,     /* SRC: memory */
+                   .srcStatusRegisterAddress = 0x00000000,
+                   .dstStatusRegisterAddress = 0x00000000,
+                   .srcUpdate = dmacHw_SRC_ADDRESS_UPDATE_MODE_INC,
+                   .dstUpdate = dmacHw_DST_ADDRESS_UPDATE_MODE_INC,
+                   .transferType = dmacHw_TRANSFER_TYPE_MEM_TO_MEM,
+                   .srcMasterInterface = dmacHw_SRC_MASTER_INTERFACE_1,
+                   .dstMasterInterface = dmacHw_DST_MASTER_INTERFACE_2,
+                   .completeTransferInterrupt = dmacHw_INTERRUPT_ENABLE,
+                   .errorInterrupt = dmacHw_INTERRUPT_ENABLE,
+                   .channelPriority = dmacHw_CHANNEL_PRIORITY_7,
+                   .srcMaxTransactionWidth = dmacHw_SRC_TRANSACTION_WIDTH_64,
+                   .dstMaxTransactionWidth = dmacHw_DST_TRANSACTION_WIDTH_64,
+                   .srcMaxBurstWidth = dmacHw_SRC_BURST_WIDTH_8,
+                   .dstMaxBurstWidth = dmacHw_DST_BURST_WIDTH_8,
+                   },
+        },
+       [DMA_DEVICE_VRAM_TO_MEM] =      /* VRAM 2 MEM */
+       {
+        .flags = DMA_DEVICE_FLAG_ON_DMA0 | DMA_DEVICE_FLAG_ON_DMA1,
+        .name = "vram-to-mem",
+        .config = {
+                   .dstPeripheralPort = 0,     /* DST: memory */
+                   .srcStatusRegisterAddress = 0x00000000,
+                   .dstStatusRegisterAddress = 0x00000000,
+                   .srcUpdate = dmacHw_SRC_ADDRESS_UPDATE_MODE_INC,
+                   .dstUpdate = dmacHw_DST_ADDRESS_UPDATE_MODE_INC,
+                   .transferType = dmacHw_TRANSFER_TYPE_MEM_TO_MEM,
+                   .srcMasterInterface = dmacHw_SRC_MASTER_INTERFACE_2,
+                   .dstMasterInterface = dmacHw_DST_MASTER_INTERFACE_1,
+                   .completeTransferInterrupt = dmacHw_INTERRUPT_ENABLE,
+                   .errorInterrupt = dmacHw_INTERRUPT_ENABLE,
+                   .channelPriority = dmacHw_CHANNEL_PRIORITY_7,
+                   .srcMaxTransactionWidth = dmacHw_SRC_TRANSACTION_WIDTH_64,
+                   .dstMaxTransactionWidth = dmacHw_DST_TRANSACTION_WIDTH_64,
+                   .srcMaxBurstWidth = dmacHw_SRC_BURST_WIDTH_8,
+                   .dstMaxBurstWidth = dmacHw_DST_BURST_WIDTH_8,
+                   },
+        },
+};
+EXPORT_SYMBOL(DMA_gDeviceAttribute);   /* primarily for dma-test.c */
diff --git a/arch/arm/mach-bcmring/include/cfg_global.h b/arch/arm/mach-bcmring/include/cfg_global.h
new file mode 100644 (file)
index 0000000..f01da87
--- /dev/null
@@ -0,0 +1,13 @@
+#ifndef _CFG_GLOBAL_H_
+#define _CFG_GLOBAL_H_
+
+#include <cfg_global_defines.h>
+
+#define CFG_GLOBAL_CHIP                         BCM11107
+#define CFG_GLOBAL_CHIP_FAMILY                  CFG_GLOBAL_CHIP_FAMILY_BCMRING
+#define CFG_GLOBAL_CHIP_REV                     0xB0
+#define CFG_GLOBAL_RAM_SIZE                     0x10000000
+#define CFG_GLOBAL_RAM_BASE                     0x00000000
+#define CFG_GLOBAL_RAM_RESERVED_SIZE            0x000000
+
+#endif /* _CFG_GLOBAL_H_ */
diff --git a/arch/arm/mach-bcmring/include/cfg_global_defines.h b/arch/arm/mach-bcmring/include/cfg_global_defines.h
new file mode 100644 (file)
index 0000000..b5beb0b
--- /dev/null
@@ -0,0 +1,40 @@
+/*****************************************************************************
+* Copyright 2006 - 2008 Broadcom Corporation.  All rights reserved.
+*
+* Unless you and Broadcom execute a separate written software license
+* agreement governing use of this software, this software is licensed to you
+* under the terms of the GNU General Public License version 2, available at
+* http://www.broadcom.com/licenses/GPLv2.php (the "GPL").
+*
+* Notwithstanding the above, under no circumstances may you combine this
+* software in any way with any other Broadcom software provided under a
+* license other than the GPL, without Broadcom's express prior written
+* consent.
+*****************************************************************************/
+
+#ifndef CFG_GLOBAL_DEFINES_H
+#define CFG_GLOBAL_DEFINES_H
+
+/* CHIP */
+#define BCM1103 1
+
+#define BCM1191 4
+#define BCM2153 5
+#define BCM2820 6
+
+#define BCM2826 8
+#define FPGA11107 9
+#define BCM11107   10
+#define BCM11109   11
+#define BCM11170   12
+#define BCM11110   13
+#define BCM11211   14
+
+/* CFG_GLOBAL_CHIP_FAMILY types */
+#define CFG_GLOBAL_CHIP_FAMILY_NONE        0
+#define CFG_GLOBAL_CHIP_FAMILY_BCM116X     2
+#define CFG_GLOBAL_CHIP_FAMILY_BCMRING     4
+#define CFG_GLOBAL_CHIP_FAMILY_BCM1103     8
+
+#define IMAGE_HEADER_SIZE_CHECKSUM    4
+#endif
diff --git a/arch/arm/mach-bcmring/include/csp/cache.h b/arch/arm/mach-bcmring/include/csp/cache.h
new file mode 100644 (file)
index 0000000..caa20e5
--- /dev/null
@@ -0,0 +1,35 @@
+/*****************************************************************************
+* Copyright 2003 - 2008 Broadcom Corporation.  All rights reserved.
+*
+* Unless you and Broadcom execute a separate written software license
+* agreement governing use of this software, this software is licensed to you
+* under the terms of the GNU General Public License version 2, available at
+* http://www.broadcom.com/licenses/GPLv2.php (the "GPL").
+*
+* Notwithstanding the above, under no circumstances may you combine this
+* software in any way with any other Broadcom software provided under a
+* license other than the GPL, without Broadcom's express prior written
+* consent.
+*****************************************************************************/
+
+#ifndef CSP_CACHE_H
+#define CSP_CACHE_H
+
+/* ---- Include Files ---------------------------------------------------- */
+
+#include <csp/stdint.h>
+
+/* ---- Public Constants and Types --------------------------------------- */
+
+#if defined(__KERNEL__) && !defined(STANDALONE)
+#include <asm/cacheflush.h>
+
+#define CSP_CACHE_FLUSH_ALL      flush_cache_all()
+
+#else
+
+#define CSP_CACHE_FLUSH_ALL
+
+#endif
+
+#endif /* CSP_CACHE_H */
diff --git a/arch/arm/mach-bcmring/include/csp/delay.h b/arch/arm/mach-bcmring/include/csp/delay.h
new file mode 100644 (file)
index 0000000..8b3d803
--- /dev/null
@@ -0,0 +1,36 @@
+/*****************************************************************************
+* Copyright 2003 - 2008 Broadcom Corporation.  All rights reserved.
+*
+* Unless you and Broadcom execute a separate written software license
+* agreement governing use of this software, this software is licensed to you
+* under the terms of the GNU General Public License version 2, available at
+* http://www.broadcom.com/licenses/GPLv2.php (the "GPL").
+*
+* Notwithstanding the above, under no circumstances may you combine this
+* software in any way with any other Broadcom software provided under a
+* license other than the GPL, without Broadcom's express prior written
+* consent.
+*****************************************************************************/
+
+
+#ifndef CSP_DELAY_H
+#define CSP_DELAY_H
+
+/* ---- Include Files ---------------------------------------------------- */
+
+/* Some CSP routines require use of the following delay routines. Use the OS */
+/* version if available, otherwise use a CSP specific definition. */
+/* void udelay(unsigned long usecs); */
+/* void mdelay(unsigned long msecs); */
+
+#if defined(__KERNEL__) && !defined(STANDALONE)
+   #include <linux/delay.h>
+#else
+   #include <mach/csp/delay.h>
+#endif
+
+/* ---- Public Constants and Types --------------------------------------- */
+/* ---- Public Variable Externs ------------------------------------------ */
+/* ---- Public Function Prototypes --------------------------------------- */
+
+#endif /*  CSP_DELAY_H */
diff --git a/arch/arm/mach-bcmring/include/csp/dmacHw.h b/arch/arm/mach-bcmring/include/csp/dmacHw.h
new file mode 100644 (file)
index 0000000..5d51013
--- /dev/null
@@ -0,0 +1,596 @@
+/*****************************************************************************
+* Copyright 2004 - 2008 Broadcom Corporation.  All rights reserved.
+*
+* Unless you and Broadcom execute a separate written software license
+* agreement governing use of this software, this software is licensed to you
+* under the terms of the GNU General Public License version 2, available at
+* http://www.broadcom.com/licenses/GPLv2.php (the "GPL").
+*
+* Notwithstanding the above, under no circumstances may you combine this
+* software in any way with any other Broadcom software provided under a
+* license other than the GPL, without Broadcom's express prior written
+* consent.
+*****************************************************************************/
+
+/****************************************************************************/
+/**
+*  @file    dmacHw.h
+*
+*  @brief   API definitions for low level DMA controller driver
+*
+*/
+/****************************************************************************/
+#ifndef _DMACHW_H
+#define _DMACHW_H
+
+#include <stddef.h>
+
+#include <csp/stdint.h>
+#include <mach/csp/dmacHw_reg.h>
+
+/* Define DMA Channel ID using DMA controller number (m) and channel number (c).
+
+   System specific channel ID should be defined as follows
+
+   For example:
+
+   #include <dmacHw.h>
+   ...
+   #define systemHw_LCD_CHANNEL_ID                dmacHw_MAKE_CHANNEL_ID(0,5)
+   #define systemHw_SWITCH_RX_CHANNEL_ID          dmacHw_MAKE_CHANNEL_ID(0,0)
+   #define systemHw_SWITCH_TX_CHANNEL_ID          dmacHw_MAKE_CHANNEL_ID(0,1)
+   #define systemHw_APM_RX_CHANNEL_ID             dmacHw_MAKE_CHANNEL_ID(0,3)
+   #define systemHw_APM_TX_CHANNEL_ID             dmacHw_MAKE_CHANNEL_ID(0,4)
+   ...
+   #define systemHw_SHARED1_CHANNEL_ID            dmacHw_MAKE_CHANNEL_ID(1,4)
+   #define systemHw_SHARED2_CHANNEL_ID            dmacHw_MAKE_CHANNEL_ID(1,5)
+   #define systemHw_SHARED3_CHANNEL_ID            dmacHw_MAKE_CHANNEL_ID(0,6)
+   ...
+*/
+#define dmacHw_MAKE_CHANNEL_ID(m, c)         (m << 8 | c)
+
+typedef enum {
+       dmacHw_CHANNEL_PRIORITY_0 = dmacHw_REG_CFG_LO_CH_PRIORITY_0,    /* Channel priority 0. Lowest priority DMA channel */
+       dmacHw_CHANNEL_PRIORITY_1 = dmacHw_REG_CFG_LO_CH_PRIORITY_1,    /* Channel priority 1 */
+       dmacHw_CHANNEL_PRIORITY_2 = dmacHw_REG_CFG_LO_CH_PRIORITY_2,    /* Channel priority 2 */
+       dmacHw_CHANNEL_PRIORITY_3 = dmacHw_REG_CFG_LO_CH_PRIORITY_3,    /* Channel priority 3 */
+       dmacHw_CHANNEL_PRIORITY_4 = dmacHw_REG_CFG_LO_CH_PRIORITY_4,    /* Channel priority 4 */
+       dmacHw_CHANNEL_PRIORITY_5 = dmacHw_REG_CFG_LO_CH_PRIORITY_5,    /* Channel priority 5 */
+       dmacHw_CHANNEL_PRIORITY_6 = dmacHw_REG_CFG_LO_CH_PRIORITY_6,    /* Channel priority 6 */
+       dmacHw_CHANNEL_PRIORITY_7 = dmacHw_REG_CFG_LO_CH_PRIORITY_7     /* Channel priority 7. Highest priority DMA channel */
+} dmacHw_CHANNEL_PRIORITY_e;
+
+/* Source destination master interface */
+typedef enum {
+       dmacHw_SRC_MASTER_INTERFACE_1 = dmacHw_REG_CTL_SMS_1,   /* Source DMA master interface 1 */
+       dmacHw_SRC_MASTER_INTERFACE_2 = dmacHw_REG_CTL_SMS_2,   /* Source DMA master interface 2 */
+       dmacHw_DST_MASTER_INTERFACE_1 = dmacHw_REG_CTL_DMS_1,   /* Destination DMA master interface 1 */
+       dmacHw_DST_MASTER_INTERFACE_2 = dmacHw_REG_CTL_DMS_2    /* Destination DMA master interface 2 */
+} dmacHw_MASTER_INTERFACE_e;
+
+typedef enum {
+       dmacHw_SRC_TRANSACTION_WIDTH_8 = dmacHw_REG_CTL_SRC_TR_WIDTH_8, /* Source 8 bit  (1 byte) per transaction */
+       dmacHw_SRC_TRANSACTION_WIDTH_16 = dmacHw_REG_CTL_SRC_TR_WIDTH_16,       /* Source 16 bit (2 byte) per transaction */
+       dmacHw_SRC_TRANSACTION_WIDTH_32 = dmacHw_REG_CTL_SRC_TR_WIDTH_32,       /* Source 32 bit (4 byte) per transaction */
+       dmacHw_SRC_TRANSACTION_WIDTH_64 = dmacHw_REG_CTL_SRC_TR_WIDTH_64,       /* Source 64 bit (8 byte) per transaction */
+       dmacHw_DST_TRANSACTION_WIDTH_8 = dmacHw_REG_CTL_DST_TR_WIDTH_8, /* Destination 8 bit  (1 byte) per transaction */
+       dmacHw_DST_TRANSACTION_WIDTH_16 = dmacHw_REG_CTL_DST_TR_WIDTH_16,       /* Destination 16 bit (2 byte) per transaction */
+       dmacHw_DST_TRANSACTION_WIDTH_32 = dmacHw_REG_CTL_DST_TR_WIDTH_32,       /* Destination 32 bit (4 byte) per transaction */
+       dmacHw_DST_TRANSACTION_WIDTH_64 = dmacHw_REG_CTL_DST_TR_WIDTH_64        /* Destination 64 bit (8 byte) per transaction */
+} dmacHw_TRANSACTION_WIDTH_e;
+
+typedef enum {
+       dmacHw_SRC_BURST_WIDTH_0 = dmacHw_REG_CTL_SRC_MSIZE_0,  /* Source No burst */
+       dmacHw_SRC_BURST_WIDTH_4 = dmacHw_REG_CTL_SRC_MSIZE_4,  /* Source 4  X dmacHw_TRANSACTION_WIDTH_xxx bytes per burst */
+       dmacHw_SRC_BURST_WIDTH_8 = dmacHw_REG_CTL_SRC_MSIZE_8,  /* Source 8  X dmacHw_TRANSACTION_WIDTH_xxx bytes per burst */
+       dmacHw_SRC_BURST_WIDTH_16 = dmacHw_REG_CTL_SRC_MSIZE_16,        /* Source 16 X dmacHw_TRANSACTION_WIDTH_xxx bytes per burst */
+       dmacHw_DST_BURST_WIDTH_0 = dmacHw_REG_CTL_DST_MSIZE_0,  /* Destination No burst */
+       dmacHw_DST_BURST_WIDTH_4 = dmacHw_REG_CTL_DST_MSIZE_4,  /* Destination 4  X dmacHw_TRANSACTION_WIDTH_xxx bytes per burst */
+       dmacHw_DST_BURST_WIDTH_8 = dmacHw_REG_CTL_DST_MSIZE_8,  /* Destination 8  X dmacHw_TRANSACTION_WIDTH_xxx bytes per burst */
+       dmacHw_DST_BURST_WIDTH_16 = dmacHw_REG_CTL_DST_MSIZE_16 /* Destination 16 X dmacHw_TRANSACTION_WIDTH_xxx bytes per burst */
+} dmacHw_BURST_WIDTH_e;
+
+typedef enum {
+       dmacHw_TRANSFER_TYPE_MEM_TO_MEM = dmacHw_REG_CTL_TTFC_MM_DMAC,  /* Memory to memory transfer */
+       dmacHw_TRANSFER_TYPE_PERIPHERAL_TO_MEM = dmacHw_REG_CTL_TTFC_PM_DMAC,   /* Peripheral to memory transfer */
+       dmacHw_TRANSFER_TYPE_MEM_TO_PERIPHERAL = dmacHw_REG_CTL_TTFC_MP_DMAC,   /* Memory to peripheral transfer */
+       dmacHw_TRANSFER_TYPE_PERIPHERAL_TO_PERIPHERAL = dmacHw_REG_CTL_TTFC_PP_DMAC     /* Peripheral to peripheral transfer */
+} dmacHw_TRANSFER_TYPE_e;
+
+typedef enum {
+       dmacHw_TRANSFER_MODE_PERREQUEST,        /* Block transfer per DMA request */
+       dmacHw_TRANSFER_MODE_CONTINUOUS,        /* Continuous transfer of streaming data */
+       dmacHw_TRANSFER_MODE_PERIODIC   /* Periodic transfer of streaming data */
+} dmacHw_TRANSFER_MODE_e;
+
+typedef enum {
+       dmacHw_SRC_ADDRESS_UPDATE_MODE_INC = dmacHw_REG_CTL_SINC_INC,   /* Increment source address after every transaction */
+       dmacHw_SRC_ADDRESS_UPDATE_MODE_DEC = dmacHw_REG_CTL_SINC_DEC,   /* Decrement source address after every transaction */
+       dmacHw_DST_ADDRESS_UPDATE_MODE_INC = dmacHw_REG_CTL_DINC_INC,   /* Increment destination address after every transaction */
+       dmacHw_DST_ADDRESS_UPDATE_MODE_DEC = dmacHw_REG_CTL_DINC_DEC,   /* Decrement destination address after every transaction */
+       dmacHw_SRC_ADDRESS_UPDATE_MODE_NC = dmacHw_REG_CTL_SINC_NC,     /* No change in source address after every transaction */
+       dmacHw_DST_ADDRESS_UPDATE_MODE_NC = dmacHw_REG_CTL_DINC_NC      /* No change in destination address after every transaction */
+} dmacHw_ADDRESS_UPDATE_MODE_e;
+
+typedef enum {
+       dmacHw_FLOW_CONTROL_DMA,        /* DMA working as flow controller (default) */
+       dmacHw_FLOW_CONTROL_PERIPHERAL  /* Peripheral working as flow controller */
+} dmacHw_FLOW_CONTROL_e;
+
+typedef enum {
+       dmacHw_TRANSFER_STATUS_BUSY,    /* DMA Transfer ongoing */
+       dmacHw_TRANSFER_STATUS_DONE,    /* DMA Transfer completed */
+       dmacHw_TRANSFER_STATUS_ERROR    /* DMA Transfer error */
+} dmacHw_TRANSFER_STATUS_e;
+
+typedef enum {
+       dmacHw_INTERRUPT_DISABLE,       /* Interrupt disable  */
+       dmacHw_INTERRUPT_ENABLE /* Interrupt enable */
+} dmacHw_INTERRUPT_e;
+
+typedef enum {
+       dmacHw_INTERRUPT_STATUS_NONE = 0x0,     /* No DMA interrupt */
+       dmacHw_INTERRUPT_STATUS_TRANS = 0x1,    /* End of DMA transfer interrupt */
+       dmacHw_INTERRUPT_STATUS_BLOCK = 0x2,    /* End of block transfer interrupt */
+       dmacHw_INTERRUPT_STATUS_ERROR = 0x4     /* Error interrupt */
+} dmacHw_INTERRUPT_STATUS_e;
+
+typedef enum {
+       dmacHw_CONTROLLER_ATTRIB_CHANNEL_NUM,   /* Number of DMA channel */
+       dmacHw_CONTROLLER_ATTRIB_CHANNEL_MAX_BLOCK_SIZE,        /* Maximum channel burst size */
+       dmacHw_CONTROLLER_ATTRIB_MASTER_INTF_NUM,       /* Number of DMA master interface */
+       dmacHw_CONTROLLER_ATTRIB_CHANNEL_BUS_WIDTH,     /* Channel Data bus width */
+       dmacHw_CONTROLLER_ATTRIB_CHANNEL_FIFO_SIZE      /* Channel FIFO size */
+} dmacHw_CONTROLLER_ATTRIB_e;
+
+typedef unsigned long dmacHw_HANDLE_t; /* DMA channel handle */
+typedef uint32_t dmacHw_ID_t;  /* DMA channel Id.  Must be created using
+                                  "dmacHw_MAKE_CHANNEL_ID" macro
+                                */
+/* DMA channel configuration parameters */
+typedef struct {
+       uint32_t srcPeripheralPort;     /* Source peripheral port */
+       uint32_t dstPeripheralPort;     /* Destination peripheral port */
+       uint32_t srcStatusRegisterAddress;      /* Source status register address */
+       uint32_t dstStatusRegisterAddress;      /* Destination status register address of type  */
+
+       uint32_t srcGatherWidth;        /* Number of bytes gathered before successive gather opearation */
+       uint32_t srcGatherJump; /* Number of bytes jumpped before successive gather opearation */
+       uint32_t dstScatterWidth;       /* Number of bytes sacattered before successive scatter opearation */
+       uint32_t dstScatterJump;        /* Number of bytes jumpped  before successive scatter opearation */
+       uint32_t maxDataPerBlock;       /* Maximum number of bytes to be transferred per block/descrptor.
+                                          0 = Maximum possible.
+                                        */
+
+       dmacHw_ADDRESS_UPDATE_MODE_e srcUpdate; /* Source address update mode */
+       dmacHw_ADDRESS_UPDATE_MODE_e dstUpdate; /* Destination address update mode */
+       dmacHw_TRANSFER_TYPE_e transferType;    /* DMA transfer type  */
+       dmacHw_TRANSFER_MODE_e transferMode;    /* DMA transfer mode */
+       dmacHw_MASTER_INTERFACE_e srcMasterInterface;   /* DMA source interface  */
+       dmacHw_MASTER_INTERFACE_e dstMasterInterface;   /* DMA destination interface */
+       dmacHw_TRANSACTION_WIDTH_e srcMaxTransactionWidth;      /* Source transaction width   */
+       dmacHw_TRANSACTION_WIDTH_e dstMaxTransactionWidth;      /* Destination transaction width */
+       dmacHw_BURST_WIDTH_e srcMaxBurstWidth;  /* Source burst width */
+       dmacHw_BURST_WIDTH_e dstMaxBurstWidth;  /* Destination burst width */
+       dmacHw_INTERRUPT_e blockTransferInterrupt;      /* Block trsnafer interrupt */
+       dmacHw_INTERRUPT_e completeTransferInterrupt;   /* Complete DMA trsnafer interrupt */
+       dmacHw_INTERRUPT_e errorInterrupt;      /* Error interrupt */
+       dmacHw_CHANNEL_PRIORITY_e channelPriority;      /* Channel priority */
+       dmacHw_FLOW_CONTROL_e flowControler;    /* Data flow controller */
+} dmacHw_CONFIG_t;
+
+/****************************************************************************/
+/**
+*  @brief   Initializes DMA
+*
+*  This function initializes DMA CSP driver
+*
+*  @note
+*     Must be called before using any DMA channel
+*/
+/****************************************************************************/
+void dmacHw_initDma(void);
+
+/****************************************************************************/
+/**
+*  @brief   Exit function for  DMA
+*
+*  This function isolates DMA from the system
+*
+*/
+/****************************************************************************/
+void dmacHw_exitDma(void);
+
+/****************************************************************************/
+/**
+*  @brief   Gets a handle to a DMA channel
+*
+*  This function returns a handle, representing a control block of a particular DMA channel
+*
+*  @return  -1       - On Failure
+*            handle  - On Success, representing a channel control block
+*
+*  @note
+*     None  Channel ID must be created using "dmacHw_MAKE_CHANNEL_ID" macro
+*/
+/****************************************************************************/
+dmacHw_HANDLE_t dmacHw_getChannelHandle(dmacHw_ID_t channelId  /* [ IN ] DMA Channel Id */
+    );
+
+/****************************************************************************/
+/**
+*  @brief   Initializes a DMA channel for use
+*
+*  This function initializes and resets a DMA channel for use
+*
+*  @return  -1     - On Failure
+*            0     - On Success
+*
+*  @note
+*     None
+*/
+/****************************************************************************/
+int dmacHw_initChannel(dmacHw_HANDLE_t handle  /*  [ IN ] DMA Channel handle  */
+    );
+
+/****************************************************************************/
+/**
+*  @brief  Estimates number of descriptor needed to perform certain DMA transfer
+*
+*
+*  @return  On failure : -1
+*           On success : Number of descriptor count
+*
+*
+*/
+/****************************************************************************/
+int dmacHw_calculateDescriptorCount(dmacHw_CONFIG_t *pConfig,  /*   [ IN ] Configuration settings */
+                                   void *pSrcAddr,     /*   [ IN ] Source (Peripheral/Memory) address */
+                                   void *pDstAddr,     /*   [ IN ] Destination (Peripheral/Memory) address */
+                                   size_t dataLen      /*   [ IN ] Data length in bytes */
+    );
+
+/****************************************************************************/
+/**
+*  @brief   Initializes descriptor ring
+*
+*  This function will initializes the descriptor ring of a DMA channel
+*
+*
+*  @return   -1 - On failure
+*             0 - On success
+*  @note
+*     - "len" parameter should be obtained from "dmacHw_descriptorLen"
+*     - Descriptor buffer MUST be 32 bit aligned and uncached as it
+*       is accessed by ARM and DMA
+*/
+/****************************************************************************/
+int dmacHw_initDescriptor(void *pDescriptorVirt,       /*  [ IN ] Virtual address of uncahced buffer allocated to form descriptor ring */
+                         uint32_t descriptorPhyAddr,   /*  [ IN ] Physical address of pDescriptorVirt (descriptor buffer) */
+                         uint32_t len, /*  [ IN ] Size of the pBuf */
+                         uint32_t num  /*  [ IN ] Number of descriptor in the ring */
+    );
+
+/****************************************************************************/
+/**
+*  @brief  Finds amount of memory required to form a descriptor ring
+*
+*
+*  @return   Number of bytes required to form a descriptor ring
+*
+*
+*  @note
+*     None
+*/
+/****************************************************************************/
+uint32_t dmacHw_descriptorLen(uint32_t descCnt /*  [ IN ] Number of descriptor in the ring */
+    );
+
+/****************************************************************************/
+/**
+*  @brief   Configure DMA channel
+*
+*  @return  0  : On success
+*           -1 : On failure
+*/
+/****************************************************************************/
+int dmacHw_configChannel(dmacHw_HANDLE_t handle,       /*  [ IN ] DMA Channel handle  */
+                        dmacHw_CONFIG_t *pConfig       /*   [ IN ] Configuration settings */
+    );
+
+/****************************************************************************/
+/**
+*  @brief   Set descriptors for known data length
+*
+*  When DMA has to work as a flow controller, this function prepares the
+*  descriptor chain to transfer data
+*
+*  from:
+*          - Memory to memory
+*          - Peripheral to memory
+*          - Memory to Peripheral
+*          - Peripheral to Peripheral
+*
+*  @return   -1 - On failure
+*             0 - On success
+*
+*/
+/****************************************************************************/
+int dmacHw_setDataDescriptor(dmacHw_CONFIG_t *pConfig, /*  [ IN ] Configuration settings */
+                            void *pDescriptor, /*  [ IN ] Descriptor buffer  */
+                            void *pSrcAddr,    /*  [ IN ] Source (Peripheral/Memory) address */
+                            void *pDstAddr,    /*  [ IN ] Destination (Peripheral/Memory) address */
+                            size_t dataLen     /*  [ IN ] Length in bytes   */
+    );
+
+/****************************************************************************/
+/**
+*  @brief   Indicates whether DMA transfer is in progress or completed
+*
+*  @return   DMA transfer status
+*          dmacHw_TRANSFER_STATUS_BUSY:         DMA Transfer ongoing
+*          dmacHw_TRANSFER_STATUS_DONE:         DMA Transfer completed
+*          dmacHw_TRANSFER_STATUS_ERROR:        DMA Transfer error
+*
+*/
+/****************************************************************************/
+dmacHw_TRANSFER_STATUS_e dmacHw_transferCompleted(dmacHw_HANDLE_t handle       /*   [ IN ] DMA Channel handle  */
+    );
+
+/****************************************************************************/
+/**
+*  @brief   Set descriptor carrying control information
+*
+*  This function will be used to send specific control information to the device
+*  using the DMA channel
+*
+*
+*  @return  -1 - On failure
+*            0 - On success
+*
+*  @note
+*     None
+*/
+/****************************************************************************/
+int dmacHw_setControlDescriptor(dmacHw_CONFIG_t *pConfig,      /*  [ IN ] Configuration settings */
+                               void *pDescriptor,      /*  [ IN ] Descriptor buffer  */
+                               uint32_t ctlAddress,    /*  [ IN ] Address of the device control register  */
+                               uint32_t control        /*  [ IN ] Device control information */
+    );
+
+/****************************************************************************/
+/**
+*  @brief   Read data DMA transferred to memory
+*
+*  This function will read data that has been DMAed to memory while transfering from:
+*          - Memory to memory
+*          - Peripheral to memory
+*
+*  @return  0 - No more data is available to read
+*           1 - More data might be available to read
+*
+*/
+/****************************************************************************/
+int dmacHw_readTransferredData(dmacHw_HANDLE_t handle, /*  [ IN ] DMA Channel handle    */
+                              dmacHw_CONFIG_t *pConfig,        /*  [ IN ]  Configuration settings */
+                              void *pDescriptor,       /*  [ IN ] Descriptor buffer  */
+                              void **ppBbuf,   /*  [ OUT ] Data received */
+                              size_t *pLlen    /*  [ OUT ] Length of the data received */
+    );
+
+/****************************************************************************/
+/**
+*  @brief   Prepares descriptor ring, when source peripheral working as a flow controller
+*
+*  This function will form the descriptor ring by allocating buffers, when source peripheral
+*  has to work as a flow controller to transfer data from:
+*           - Peripheral to memory.
+*
+*  @return  -1 - On failure
+*            0 - On success
+*
+*
+*  @note
+*     None
+*/
+/****************************************************************************/
+int dmacHw_setVariableDataDescriptor(dmacHw_HANDLE_t handle,   /*  [ IN ] DMA Channel handle   */
+                                    dmacHw_CONFIG_t *pConfig,  /*  [ IN ] Configuration settings */
+                                    void *pDescriptor, /*  [ IN ] Descriptor buffer  */
+                                    uint32_t srcAddr,  /*  [ IN ] Source peripheral address */
+                                    void *(*fpAlloc) (int len),        /*  [ IN ] Function pointer  that provides destination memory */
+                                    int len,   /*  [ IN ] Number of bytes "fpAlloc" will allocate for destination */
+                                    int num    /*  [ IN ] Number of descriptor to set */
+    );
+
+/****************************************************************************/
+/**
+*  @brief   Program channel register to initiate transfer
+*
+*  @return  void
+*
+*
+*  @note
+*     - Descriptor buffer MUST ALWAYS be flushed before calling this function
+*     - This function should also be called from ISR to program the channel with
+*       pending descriptors
+*/
+/****************************************************************************/
+void dmacHw_initiateTransfer(dmacHw_HANDLE_t handle,   /*   [ IN ] DMA Channel handle */
+                            dmacHw_CONFIG_t *pConfig,  /*   [ IN ] Configuration settings */
+                            void *pDescriptor  /*   [ IN ] Descriptor buffer  */
+    );
+
+/****************************************************************************/
+/**
+*  @brief   Resets descriptor control information
+*
+*  @return  void
+*/
+/****************************************************************************/
+void dmacHw_resetDescriptorControl(void *pDescriptor   /*   [ IN ] Descriptor buffer  */
+    );
+
+/****************************************************************************/
+/**
+*  @brief   Program channel register to stop transfer
+*
+*  Ensures the channel is not doing any transfer after calling this function
+*
+*  @return  void
+*
+*/
+/****************************************************************************/
+void dmacHw_stopTransfer(dmacHw_HANDLE_t handle        /*   [ IN ] DMA Channel handle */
+    );
+
+/****************************************************************************/
+/**
+*  @brief   Check the existance of pending descriptor
+*
+*  This function confirmes if there is any pending descriptor in the chain
+*  to program the channel
+*
+*  @return  1 : Channel need to be programmed with pending descriptor
+*           0 : No more pending descriptor to programe the channel
+*
+*  @note
+*     - This function should be called from ISR in case there are pending
+*       descriptor to program the channel.
+*
+*     Example:
+*
+*     dmac_isr ()
+*     {
+*         ...
+*         if (dmacHw_descriptorPending (handle))
+*         {
+*            dmacHw_initiateTransfer (handle);
+*         }
+*     }
+*
+*/
+/****************************************************************************/
+uint32_t dmacHw_descriptorPending(dmacHw_HANDLE_t handle,      /*   [ IN ] DMA Channel handle */
+                                 void *pDescriptor     /*   [ IN ] Descriptor buffer */
+    );
+
+/****************************************************************************/
+/**
+*  @brief   Deallocates source or destination memory, allocated
+*
+*  This function can be called to deallocate data memory that was DMAed successfully
+*
+*  @return  -1  - On failure
+*            0  - On success
+*
+*  @note
+*     This function will be called ONLY, when source OR destination address is pointing
+*     to dynamic memory
+*/
+/****************************************************************************/
+int dmacHw_freeMem(dmacHw_CONFIG_t *pConfig,   /*  [ IN ] Configuration settings */
+                  void *pDescriptor,   /*  [ IN ] Descriptor buffer  */
+                  void (*fpFree) (void *)      /*  [ IN ] Function pointer to free data memory */
+    );
+
+/****************************************************************************/
+/**
+*  @brief   Clears the interrupt
+*
+*  This function clears the DMA channel specific interrupt
+*
+*  @return   N/A
+*
+*  @note
+*     Must be called under the context of ISR
+*/
+/****************************************************************************/
+void dmacHw_clearInterrupt(dmacHw_HANDLE_t handle      /*  [ IN ] DMA Channel handle  */
+    );
+
+/****************************************************************************/
+/**
+*  @brief   Returns the cause of channel specific DMA interrupt
+*
+*  This function returns the cause of interrupt
+*
+*  @return  Interrupt status, each bit representing a specific type of interrupt
+*           of type dmacHw_INTERRUPT_STATUS_e
+*  @note
+*           This function should be called under the context of ISR
+*/
+/****************************************************************************/
+dmacHw_INTERRUPT_STATUS_e dmacHw_getInterruptStatus(dmacHw_HANDLE_t handle     /*  [ IN ] DMA Channel handle  */
+    );
+
+/****************************************************************************/
+/**
+*  @brief   Indentifies a DMA channel causing interrupt
+*
+*  This functions returns a channel causing interrupt of type dmacHw_INTERRUPT_STATUS_e
+*
+*  @return  NULL   : No channel causing DMA interrupt
+*           ! NULL : Handle to a channel causing DMA interrupt
+*  @note
+*     dmacHw_clearInterrupt() must be called with a valid handle after calling this function
+*/
+/****************************************************************************/
+dmacHw_HANDLE_t dmacHw_getInterruptSource(void);
+
+/****************************************************************************/
+/**
+*  @brief   Sets channel specific user data
+*
+*  This function associates user data to a specif DMA channel
+*
+*/
+/****************************************************************************/
+void dmacHw_setChannelUserData(dmacHw_HANDLE_t handle, /*  [ IN ] DMA Channel handle  */
+                              void *userData   /*  [ IN ] User data  */
+    );
+
+/****************************************************************************/
+/**
+*  @brief   Gets channel specific user data
+*
+*  This function returns user data specific to a DMA channel
+*
+*  @return   user data
+*/
+/****************************************************************************/
+void *dmacHw_getChannelUserData(dmacHw_HANDLE_t handle /*  [ IN ] DMA Channel handle  */
+    );
+
+/****************************************************************************/
+/**
+*  @brief   Displays channel specific registers and other control parameters
+*
+*
+*  @return  void
+*
+*  @note
+*     None
+*/
+/****************************************************************************/
+void dmacHw_printDebugInfo(dmacHw_HANDLE_t handle,     /*  [ IN ] DMA Channel handle  */
+                          void *pDescriptor,   /*  [ IN ] Descriptor buffer  */
+                          int (*fpPrint) (const char *, ...)   /*  [ IN ] Print callback function */
+    );
+
+/****************************************************************************/
+/**
+*  @brief   Provides DMA controller attributes
+*
+*
+*  @return  DMA controller attributes
+*
+*  @note
+*     None
+*/
+/****************************************************************************/
+uint32_t dmacHw_getDmaControllerAttribute(dmacHw_HANDLE_t handle,      /*  [ IN ]  DMA Channel handle  */
+                                         dmacHw_CONTROLLER_ATTRIB_e attr       /*  [ IN ]  DMA Controler attribute of type  dmacHw_CONTROLLER_ATTRIB_e */
+    );
+
+#endif /* _DMACHW_H */
diff --git a/arch/arm/mach-bcmring/include/csp/errno.h b/arch/arm/mach-bcmring/include/csp/errno.h
new file mode 100644 (file)
index 0000000..51357dd
--- /dev/null
@@ -0,0 +1,32 @@
+/*****************************************************************************
+* Copyright 2003 - 2008 Broadcom Corporation.  All rights reserved.
+*
+* Unless you and Broadcom execute a separate written software license
+* agreement governing use of this software, this software is licensed to you
+* under the terms of the GNU General Public License version 2, available at
+* http://www.broadcom.com/licenses/GPLv2.php (the "GPL").
+*
+* Notwithstanding the above, under no circumstances may you combine this
+* software in any way with any other Broadcom software provided under a
+* license other than the GPL, without Broadcom's express prior written
+* consent.
+*****************************************************************************/
+
+#ifndef CSP_ERRNO_H
+#define CSP_ERRNO_H
+
+/* ---- Include Files ---------------------------------------------------- */
+
+#if   defined(__KERNEL__)
+#include <linux/errno.h>
+#elif defined(CSP_SIMULATION)
+#include <asm-generic/errno.h>
+#else
+#include <errno.h>
+#endif
+
+/* ---- Public Constants and Types --------------------------------------- */
+/* ---- Public Variable Externs ------------------------------------------ */
+/* ---- Public Function Prototypes --------------------------------------- */
+
+#endif /* CSP_ERRNO_H */
diff --git a/arch/arm/mach-bcmring/include/csp/intcHw.h b/arch/arm/mach-bcmring/include/csp/intcHw.h
new file mode 100644 (file)
index 0000000..1c639c8
--- /dev/null
@@ -0,0 +1,40 @@
+/*****************************************************************************
+* Copyright 2003 - 2008 Broadcom Corporation.  All rights reserved.
+*
+* Unless you and Broadcom execute a separate written software license
+* agreement governing use of this software, this software is licensed to you
+* under the terms of the GNU General Public License version 2, available at
+* http://www.broadcom.com/licenses/GPLv2.php (the "GPL").
+*
+* Notwithstanding the above, under no circumstances may you combine this
+* software in any way with any other Broadcom software provided under a
+* license other than the GPL, without Broadcom's express prior written
+* consent.
+*****************************************************************************/
+
+
+/****************************************************************************/
+/**
+*  @file    intcHw.h
+*
+*  @brief   generic interrupt controller API
+*
+*  @note
+*     None
+*/
+/****************************************************************************/
+
+#ifndef _INTCHW_H
+#define _INTCHW_H
+
+/* ---- Include Files ---------------------------------------------------- */
+#include <mach/csp/intcHw_reg.h>
+
+/* ---- Public Constants and Types --------------------------------------- */
+/* ---- Public Variable Externs ------------------------------------------ */
+/* ---- Public Function Prototypes --------------------------------------- */
+static inline void intcHw_irq_disable(void *basep, uint32_t mask);
+static inline void intcHw_irq_enable(void *basep, uint32_t mask);
+
+#endif /* _INTCHW_H */
+
diff --git a/arch/arm/mach-bcmring/include/csp/module.h b/arch/arm/mach-bcmring/include/csp/module.h
new file mode 100644 (file)
index 0000000..c30d2a5
--- /dev/null
@@ -0,0 +1,32 @@
+/*****************************************************************************
+* Copyright 2003 - 2008 Broadcom Corporation.  All rights reserved.
+*
+* Unless you and Broadcom execute a separate written software license
+* agreement governing use of this software, this software is licensed to you
+* under the terms of the GNU General Public License version 2, available at
+* http://www.broadcom.com/licenses/GPLv2.php (the "GPL").
+*
+* Notwithstanding the above, under no circumstances may you combine this
+* software in any way with any other Broadcom software provided under a
+* license other than the GPL, without Broadcom's express prior written
+* consent.
+*****************************************************************************/
+
+
+#ifndef CSP_MODULE_H
+#define CSP_MODULE_H
+
+/* ---- Include Files ---------------------------------------------------- */
+
+#ifdef __KERNEL__
+    #include <linux/module.h>
+#else
+    #define EXPORT_SYMBOL(symbol)
+#endif
+
+/* ---- Public Constants and Types --------------------------------------- */
+/* ---- Public Variable Externs ------------------------------------------ */
+/* ---- Public Function Prototypes --------------------------------------- */
+
+
+#endif /* CSP_MODULE_H */
diff --git a/arch/arm/mach-bcmring/include/csp/reg.h b/arch/arm/mach-bcmring/include/csp/reg.h
new file mode 100644 (file)
index 0000000..e5f60bf
--- /dev/null
@@ -0,0 +1,114 @@
+/*****************************************************************************
+* Copyright 2003 - 2008 Broadcom Corporation.  All rights reserved.
+*
+* Unless you and Broadcom execute a separate written software license
+* agreement governing use of this software, this software is licensed to you
+* under the terms of the GNU General Public License version 2, available at
+* http://www.broadcom.com/licenses/GPLv2.php (the "GPL").
+*
+* Notwithstanding the above, under no circumstances may you combine this
+* software in any way with any other Broadcom software provided under a
+* license other than the GPL, without Broadcom's express prior written
+* consent.
+*****************************************************************************/
+
+/****************************************************************************/
+/**
+*  @file    reg.h
+*
+*  @brief   Generic register defintions used in CSP
+*/
+/****************************************************************************/
+
+#ifndef CSP_REG_H
+#define CSP_REG_H
+
+/* ---- Include Files ---------------------------------------------------- */
+
+#include <csp/stdint.h>
+
+/* ---- Public Constants and Types --------------------------------------- */
+
+#define __REG32(x)      (*((volatile uint32_t *)(x)))
+#define __REG16(x)      (*((volatile uint16_t *)(x)))
+#define __REG8(x)       (*((volatile uint8_t *) (x)))
+
+/* Macros used to define a sequence of reserved registers. The start / end */
+/* are byte offsets in the particular register definition, with the "end" */
+/* being the offset of the next un-reserved register. E.g. if offsets */
+/* 0x10 through to 0x1f are reserved, then this reserved area could be */
+/* specified as follows. */
+/*  typedef struct */
+/*  { */
+/*      uint32_t reg1;           offset 0x00 */
+/*      uint32_t reg2;           offset 0x04 */
+/*      uint32_t reg3;           offset 0x08 */
+/*      uint32_t reg4;           offset 0x0c */
+/*      REG32_RSVD(0x10, 0x20); */
+/*      uint32_t reg5;           offset 0x20 */
+/*      ... */
+/*  } EXAMPLE_REG_t; */
+#define REG8_RSVD(start, end)   uint8_t rsvd_##start[(end - start) / sizeof(uint8_t)]
+#define REG16_RSVD(start, end)  uint16_t rsvd_##start[(end - start) / sizeof(uint16_t)]
+#define REG32_RSVD(start, end)  uint32_t rsvd_##start[(end - start) / sizeof(uint32_t)]
+
+/* ---- Public Variable Externs ------------------------------------------ */
+/* ---- Public Function Prototypes --------------------------------------- */
+
+/* Note: When protecting multiple statements, the REG_LOCAL_IRQ_SAVE and */
+/* REG_LOCAL_IRQ_RESTORE must be enclosed in { } to allow the  */
+/* flags variable to be declared locally. */
+/* e.g. */
+/*    statement1; */
+/*    { */
+/*       REG_LOCAL_IRQ_SAVE; */
+/*       <multiple statements here> */
+/*       REG_LOCAL_IRQ_RESTORE; */
+/*    } */
+/*    statement2; */
+/*  */
+
+#if defined(__KERNEL__) && !defined(STANDALONE)
+#include <mach/hardware.h>
+#include <linux/interrupt.h>
+
+#define REG_LOCAL_IRQ_SAVE      HW_DECLARE_SPINLOCK(reg32) \
+       unsigned long flags; HW_IRQ_SAVE(reg32, flags)
+
+#define REG_LOCAL_IRQ_RESTORE   HW_IRQ_RESTORE(reg32, flags)
+
+#else
+
+#define REG_LOCAL_IRQ_SAVE
+#define REG_LOCAL_IRQ_RESTORE
+
+#endif
+
+static inline void reg32_modify_and(volatile uint32_t *reg, uint32_t value)
+{
+       REG_LOCAL_IRQ_SAVE;
+       *reg &= value;
+       REG_LOCAL_IRQ_RESTORE;
+}
+
+static inline void reg32_modify_or(volatile uint32_t *reg, uint32_t value)
+{
+       REG_LOCAL_IRQ_SAVE;
+       *reg |= value;
+       REG_LOCAL_IRQ_RESTORE;
+}
+
+static inline void reg32_modify_mask(volatile uint32_t *reg, uint32_t mask,
+                                    uint32_t value)
+{
+       REG_LOCAL_IRQ_SAVE;
+       *reg = (*reg & mask) | value;
+       REG_LOCAL_IRQ_RESTORE;
+}
+
+static inline void reg32_write(volatile uint32_t *reg, uint32_t value)
+{
+       *reg = value;
+}
+
+#endif /* CSP_REG_H */
diff --git a/arch/arm/mach-bcmring/include/csp/secHw.h b/arch/arm/mach-bcmring/include/csp/secHw.h
new file mode 100644 (file)
index 0000000..b9d7e07
--- /dev/null
@@ -0,0 +1,65 @@
+/*****************************************************************************
+* Copyright 2004 - 2008 Broadcom Corporation.  All rights reserved.
+*
+* Unless you and Broadcom execute a separate written software license
+* agreement governing use of this software, this software is licensed to you
+* under the terms of the GNU General Public License version 2, available at
+* http://www.broadcom.com/licenses/GPLv2.php (the "GPL").
+*
+* Notwithstanding the above, under no circumstances may you combine this
+* software in any way with any other Broadcom software provided under a
+* license other than the GPL, without Broadcom's express prior written
+* consent.
+*****************************************************************************/
+
+/****************************************************************************/
+/**
+*  @file    secHw.h
+*
+*  @brief   Definitions for accessing low level security features
+*
+*/
+/****************************************************************************/
+#ifndef SECHW_H
+#define SECHW_H
+
+typedef void (*secHw_FUNC_t) (void);
+
+typedef enum {
+       secHw_MODE_SECURE = 0x0,        /* Switches processor into secure mode */
+       secHw_MODE_NONSECURE = 0x1      /* Switches processor into non-secure mode */
+} secHw_MODE;
+
+/****************************************************************************/
+/**
+*  @brief   Requesting to execute the function in secure mode
+*
+*  This function requests the given function to run in secure mode
+*
+*/
+/****************************************************************************/
+void secHw_RunSecure(secHw_FUNC_t      /* Function to run in secure mode */
+    );
+
+/****************************************************************************/
+/**
+*  @brief   Sets the  mode
+*
+*  his function sets the processor mode (secure/non-secure)
+*
+*/
+/****************************************************************************/
+void secHw_SetMode(secHw_MODE  /* Processor mode */
+    );
+
+/****************************************************************************/
+/**
+*  @brief   Get the current mode
+*
+*  This function retieves the processor mode (secure/non-secure)
+*
+*/
+/****************************************************************************/
+void secHw_GetMode(secHw_MODE *);
+
+#endif /* SECHW_H */
diff --git a/arch/arm/mach-bcmring/include/csp/stdint.h b/arch/arm/mach-bcmring/include/csp/stdint.h
new file mode 100644 (file)
index 0000000..3a8718b
--- /dev/null
@@ -0,0 +1,30 @@
+/*****************************************************************************
+* Copyright 2003 - 2008 Broadcom Corporation.  All rights reserved.
+*
+* Unless you and Broadcom execute a separate written software license
+* agreement governing use of this software, this software is licensed to you
+* under the terms of the GNU General Public License version 2, available at
+* http://www.broadcom.com/licenses/GPLv2.php (the "GPL").
+*
+* Notwithstanding the above, under no circumstances may you combine this
+* software in any way with any other Broadcom software provided under a
+* license other than the GPL, without Broadcom's express prior written
+* consent.
+*****************************************************************************/
+
+#ifndef CSP_STDINT_H
+#define CSP_STDINT_H
+
+/* ---- Include Files ---------------------------------------------------- */
+
+#ifdef __KERNEL__
+#include <linux/types.h>
+#else
+#include <stdint.h>
+#endif
+
+/* ---- Public Constants and Types --------------------------------------- */
+/* ---- Public Variable Externs ------------------------------------------ */
+/* ---- Public Function Prototypes --------------------------------------- */
+
+#endif /* CSP_STDINT_H */
diff --git a/arch/arm/mach-bcmring/include/csp/string.h b/arch/arm/mach-bcmring/include/csp/string.h
new file mode 100644 (file)
index 0000000..ad9e400
--- /dev/null
@@ -0,0 +1,34 @@
+/*****************************************************************************
+* Copyright 2003 - 2008 Broadcom Corporation.  All rights reserved.
+*
+* Unless you and Broadcom execute a separate written software license
+* agreement governing use of this software, this software is licensed to you
+* under the terms of the GNU General Public License version 2, available at
+* http://www.broadcom.com/licenses/GPLv2.php (the "GPL").
+*
+* Notwithstanding the above, under no circumstances may you combine this
+* software in any way with any other Broadcom software provided under a
+* license other than the GPL, without Broadcom's express prior written
+* consent.
+*****************************************************************************/
+
+
+
+#ifndef CSP_STRING_H
+#define CSP_STRING_H
+
+/* ---- Include Files ---------------------------------------------------- */
+
+#ifdef __KERNEL__
+   #include <linux/string.h>
+#else
+   #include <string.h>
+#endif
+
+/* ---- Public Constants and Types --------------------------------------- */
+/* ---- Public Variable Externs ------------------------------------------ */
+/* ---- Public Function Prototypes --------------------------------------- */
+
+
+#endif /* CSP_STRING_H */
+
diff --git a/arch/arm/mach-bcmring/include/csp/tmrHw.h b/arch/arm/mach-bcmring/include/csp/tmrHw.h
new file mode 100644 (file)
index 0000000..f1236d0
--- /dev/null
@@ -0,0 +1,263 @@
+/*****************************************************************************
+* Copyright 2004 - 2008 Broadcom Corporation.  All rights reserved.
+*
+* Unless you and Broadcom execute a separate written software license
+* agreement governing use of this software, this software is licensed to you
+* under the terms of the GNU General Public License version 2, available at
+* http://www.broadcom.com/licenses/GPLv2.php (the "GPL").
+*
+* Notwithstanding the above, under no circumstances may you combine this
+* software in any way with any other Broadcom software provided under a
+* license other than the GPL, without Broadcom's express prior written
+* consent.
+*****************************************************************************/
+
+/****************************************************************************/
+/**
+*  @file    tmrHw.h
+*
+*  @brief   API definitions for low level Timer driver
+*
+*/
+/****************************************************************************/
+#ifndef _TMRHW_H
+#define _TMRHW_H
+
+#include <csp/stdint.h>
+
+typedef uint32_t tmrHw_ID_t;   /* Timer ID */
+typedef uint32_t tmrHw_COUNT_t;        /* Timer count */
+typedef uint32_t tmrHw_INTERVAL_t;     /* Timer interval */
+typedef uint32_t tmrHw_RATE_t; /* Timer event (count/interrupt) rate */
+
+typedef enum {
+       tmrHw_INTERRUPT_STATUS_SET,     /* Interrupted  */
+       tmrHw_INTERRUPT_STATUS_UNSET    /* No Interrupt */
+} tmrHw_INTERRUPT_STATUS_e;
+
+typedef enum {
+       tmrHw_CAPABILITY_CLOCK, /* Clock speed in HHz */
+       tmrHw_CAPABILITY_RESOLUTION     /* Timer resolution in bits */
+} tmrHw_CAPABILITY_e;
+
+/****************************************************************************/
+/**
+*  @brief   Get timer capability
+*
+*  This function returns various capabilities/attributes of a timer
+*
+*  @return  Numeric capability
+*
+*/
+/****************************************************************************/
+uint32_t tmrHw_getTimerCapability(tmrHw_ID_t timerId,  /*  [ IN ] Timer Id */
+                                 tmrHw_CAPABILITY_e capability /*  [ IN ] Timer capability */
+);
+
+/****************************************************************************/
+/**
+*  @brief   Configures a periodic timer in terms of timer interrupt rate
+*
+*  This function initializes a periodic timer to generate specific number of
+*  timer interrupt per second
+*
+*  @return   On success: Effective timer frequency
+*            On failure: 0
+*
+*/
+/****************************************************************************/
+tmrHw_RATE_t tmrHw_setPeriodicTimerRate(tmrHw_ID_t timerId,    /*  [ IN ] Timer Id */
+                                       tmrHw_RATE_t rate       /*  [ IN ] Number of timer interrupt per second */
+);
+
+/****************************************************************************/
+/**
+*  @brief   Configures a periodic timer to generate timer interrupt after
+*           certain time interval
+*
+*  This function initializes a periodic timer to generate timer interrupt
+*  after every time interval in milisecond
+*
+*  @return   On success: Effective interval set in mili-second
+*            On failure: 0
+*
+*/
+/****************************************************************************/
+tmrHw_INTERVAL_t tmrHw_setPeriodicTimerInterval(tmrHw_ID_t timerId,    /*  [ IN ] Timer Id */
+                                               tmrHw_INTERVAL_t msec   /*  [ IN ] Interval in mili-second */
+);
+
+/****************************************************************************/
+/**
+*  @brief   Configures a periodic timer to generate timer interrupt just once
+*           after certain time interval
+*
+*  This function initializes a periodic timer to generate a single ticks after
+*  certain time interval in milisecond
+*
+*  @return   On success: Effective interval set in mili-second
+*            On failure: 0
+*
+*/
+/****************************************************************************/
+tmrHw_INTERVAL_t tmrHw_setOneshotTimerInterval(tmrHw_ID_t timerId,     /*  [ IN ] Timer Id */
+                                              tmrHw_INTERVAL_t msec    /*  [ IN ] Interval in mili-second */
+);
+
+/****************************************************************************/
+/**
+*  @brief   Configures a timer to run as a free running timer
+*
+*  This function initializes a timer to run as a free running timer
+*
+*  @return   Timer resolution (count / sec)
+*
+*/
+/****************************************************************************/
+tmrHw_RATE_t tmrHw_setFreeRunningTimer(tmrHw_ID_t timerId,     /*  [ IN ] Timer Id */
+                                      uint32_t divider /*  [ IN ] Dividing the clock frequency */
+) __attribute__ ((section(".aramtext")));
+
+/****************************************************************************/
+/**
+*  @brief   Starts a timer
+*
+*  This function starts a preconfigured timer
+*
+*  @return  -1     - On Failure
+*            0     - On Success
+*/
+/****************************************************************************/
+int tmrHw_startTimer(tmrHw_ID_t timerId        /*  [ IN ] Timer id */
+) __attribute__ ((section(".aramtext")));
+
+/****************************************************************************/
+/**
+*  @brief   Stops a timer
+*
+*  This function stops a running timer
+*
+*  @return  -1     - On Failure
+*            0     - On Success
+*/
+/****************************************************************************/
+int tmrHw_stopTimer(tmrHw_ID_t timerId /*  [ IN ] Timer id */
+);
+
+/****************************************************************************/
+/**
+*  @brief   Gets current timer count
+*
+*  This function returns the current timer value
+*
+*  @return  Current downcounting timer value
+*
+*/
+/****************************************************************************/
+tmrHw_COUNT_t tmrHw_GetCurrentCount(tmrHw_ID_t timerId /*  [ IN ] Timer id */
+) __attribute__ ((section(".aramtext")));
+
+/****************************************************************************/
+/**
+*  @brief   Gets timer count rate
+*
+*  This function returns the number of counts per second
+*
+*  @return  Count rate
+*
+*/
+/****************************************************************************/
+tmrHw_RATE_t tmrHw_getCountRate(tmrHw_ID_t timerId     /*  [ IN ] Timer id */
+) __attribute__ ((section(".aramtext")));
+
+/****************************************************************************/
+/**
+*  @brief   Enables timer interrupt
+*
+*  This function enables the timer interrupt
+*
+*  @return   N/A
+*
+*/
+/****************************************************************************/
+void tmrHw_enableInterrupt(tmrHw_ID_t timerId  /*  [ IN ] Timer id */
+);
+
+/****************************************************************************/
+/**
+*  @brief   Disables timer interrupt
+*
+*  This function disable the timer interrupt
+*
+*  @return   N/A
+*/
+/****************************************************************************/
+void tmrHw_disableInterrupt(tmrHw_ID_t timerId /*  [ IN ] Timer id */
+);
+
+/****************************************************************************/
+/**
+*  @brief   Clears the interrupt
+*
+*  This function clears the timer interrupt
+*
+*  @return   N/A
+*
+*  @note
+*     Must be called under the context of ISR
+*/
+/****************************************************************************/
+void tmrHw_clearInterrupt(tmrHw_ID_t timerId   /*  [ IN ] Timer id */
+);
+
+/****************************************************************************/
+/**
+*  @brief   Gets the interrupt status
+*
+*  This function returns timer interrupt status
+*
+*  @return   Interrupt status
+*/
+/****************************************************************************/
+tmrHw_INTERRUPT_STATUS_e tmrHw_getInterruptStatus(tmrHw_ID_t timerId   /*  [ IN ] Timer id */
+);
+
+/****************************************************************************/
+/**
+*  @brief   Indentifies a timer causing interrupt
+*
+*  This functions returns a timer causing interrupt
+*
+*  @return  0xFFFFFFFF   : No timer causing an interrupt
+*           ! 0xFFFFFFFF : timer causing an interrupt
+*  @note
+*     tmrHw_clearIntrrupt() must be called with a valid timer id after calling this function
+*/
+/****************************************************************************/
+tmrHw_ID_t tmrHw_getInterruptSource(void);
+
+/****************************************************************************/
+/**
+*  @brief   Displays specific timer registers
+*
+*
+*  @return  void
+*
+*/
+/****************************************************************************/
+void tmrHw_printDebugInfo(tmrHw_ID_t timerId,  /*  [ IN ] Timer id */
+                         int (*fpPrint) (const char *, ...)    /*  [ IN ] Print callback function */
+);
+
+/****************************************************************************/
+/**
+*  @brief   Use a timer to perform a busy wait delay for a number of usecs.
+*
+*  @return   N/A
+*/
+/****************************************************************************/
+void tmrHw_udelay(tmrHw_ID_t timerId,  /*  [ IN ] Timer id */
+                 unsigned long usecs   /*  [ IN ] usec to delay */
+) __attribute__ ((section(".aramtext")));
+
+#endif /* _TMRHW_H */
diff --git a/arch/arm/mach-bcmring/include/mach/clkdev.h b/arch/arm/mach-bcmring/include/mach/clkdev.h
new file mode 100644 (file)
index 0000000..04b37a8
--- /dev/null
@@ -0,0 +1,7 @@
+#ifndef __ASM_MACH_CLKDEV_H
+#define __ASM_MACH_CLKDEV_H
+
+#define __clk_get(clk) ({ 1; })
+#define __clk_put(clk) do { } while (0)
+
+#endif
diff --git a/arch/arm/mach-bcmring/include/mach/csp/cap.h b/arch/arm/mach-bcmring/include/mach/csp/cap.h
new file mode 100644 (file)
index 0000000..30fa2d5
--- /dev/null
@@ -0,0 +1,63 @@
+/*****************************************************************************
+* Copyright 2009 Broadcom Corporation.  All rights reserved.
+*
+* Unless you and Broadcom execute a separate written software license
+* agreement governing use of this software, this software is licensed to you
+* under the terms of the GNU General Public License version 2, available at
+* http://www.broadcom.com/licenses/GPLv2.php (the "GPL").
+*
+* Notwithstanding the above, under no circumstances may you combine this
+* software in any way with any other Broadcom software provided under a
+* license other than the GPL, without Broadcom's express prior written
+* consent.
+*****************************************************************************/
+
+#ifndef CAP_H
+#define CAP_H
+
+/* ---- Include Files ---------------------------------------------------- */
+/* ---- Public Constants and Types --------------------------------------- */
+typedef enum {
+       CAP_NOT_PRESENT = 0,
+       CAP_PRESENT
+} CAP_RC_T;
+
+typedef enum {
+       CAP_VPM,
+       CAP_ETH_PHY,
+       CAP_ETH_GMII,
+       CAP_ETH_SGMII,
+       CAP_USB,
+       CAP_TSC,
+       CAP_EHSS,
+       CAP_SDIO,
+       CAP_UARTB,
+       CAP_KEYPAD,
+       CAP_CLCD,
+       CAP_GE,
+       CAP_LEDM,
+       CAP_BBL,
+       CAP_VDEC,
+       CAP_PIF,
+       CAP_APM,
+       CAP_SPU,
+       CAP_PKA,
+       CAP_RNG,
+} CAP_CAPABILITY_T;
+
+typedef enum {
+       CAP_LCD_WVGA = 0,
+       CAP_LCD_VGA = 0x1,
+       CAP_LCD_WQVGA = 0x2,
+       CAP_LCD_QVGA = 0x3
+} CAP_LCD_RES_T;
+
+/* ---- Public Variable Externs ------------------------------------------ */
+/* ---- Public Function Prototypes --------------------------------------- */
+
+static inline CAP_RC_T cap_isPresent(CAP_CAPABILITY_T capability, int index);
+static inline uint32_t cap_getMaxArmSpeedHz(void);
+static inline uint32_t cap_getMaxVpmSpeedHz(void);
+static inline CAP_LCD_RES_T cap_getMaxLcdRes(void);
+
+#endif
diff --git a/arch/arm/mach-bcmring/include/mach/csp/cap_inline.h b/arch/arm/mach-bcmring/include/mach/csp/cap_inline.h
new file mode 100644 (file)
index 0000000..933ce68
--- /dev/null
@@ -0,0 +1,409 @@
+/*****************************************************************************
+* Copyright 2009 Broadcom Corporation.  All rights reserved.
+*
+* Unless you and Broadcom execute a separate written software license
+* agreement governing use of this software, this software is licensed to you
+* under the terms of the GNU General Public License version 2, available at
+* http://www.broadcom.com/licenses/GPLv2.php (the "GPL").
+*
+* Notwithstanding the above, under no circumstances may you combine this
+* software in any way with any other Broadcom software provided under a
+* license other than the GPL, without Broadcom's express prior written
+* consent.
+*****************************************************************************/
+
+#ifndef CAP_INLINE_H
+#define CAP_INLINE_H
+
+/* ---- Include Files ---------------------------------------------------- */
+#include <mach/csp/cap.h>
+#include <cfg_global.h>
+
+/* ---- Public Constants and Types --------------------------------------- */
+#define CAP_CONFIG0_VPM_DIS          0x00000001
+#define CAP_CONFIG0_ETH_PHY0_DIS     0x00000002
+#define CAP_CONFIG0_ETH_PHY1_DIS     0x00000004
+#define CAP_CONFIG0_ETH_GMII0_DIS    0x00000008
+#define CAP_CONFIG0_ETH_GMII1_DIS    0x00000010
+#define CAP_CONFIG0_ETH_SGMII0_DIS   0x00000020
+#define CAP_CONFIG0_ETH_SGMII1_DIS   0x00000040
+#define CAP_CONFIG0_USB0_DIS         0x00000080
+#define CAP_CONFIG0_USB1_DIS         0x00000100
+#define CAP_CONFIG0_TSC_DIS          0x00000200
+#define CAP_CONFIG0_EHSS0_DIS        0x00000400
+#define CAP_CONFIG0_EHSS1_DIS        0x00000800
+#define CAP_CONFIG0_SDIO0_DIS        0x00001000
+#define CAP_CONFIG0_SDIO1_DIS        0x00002000
+#define CAP_CONFIG0_UARTB_DIS        0x00004000
+#define CAP_CONFIG0_KEYPAD_DIS       0x00008000
+#define CAP_CONFIG0_CLCD_DIS         0x00010000
+#define CAP_CONFIG0_GE_DIS           0x00020000
+#define CAP_CONFIG0_LEDM_DIS         0x00040000
+#define CAP_CONFIG0_BBL_DIS          0x00080000
+#define CAP_CONFIG0_VDEC_DIS         0x00100000
+#define CAP_CONFIG0_PIF_DIS          0x00200000
+#define CAP_CONFIG0_RESERVED1_DIS    0x00400000
+#define CAP_CONFIG0_RESERVED2_DIS    0x00800000
+
+#define CAP_CONFIG1_APMA_DIS         0x00000001
+#define CAP_CONFIG1_APMB_DIS         0x00000002
+#define CAP_CONFIG1_APMC_DIS         0x00000004
+#define CAP_CONFIG1_CLCD_RES_MASK    0x00000600
+#define CAP_CONFIG1_CLCD_RES_SHIFT   9
+#define CAP_CONFIG1_CLCD_RES_WVGA    (CAP_LCD_WVGA << CAP_CONFIG1_CLCD_RES_SHIFT)
+#define CAP_CONFIG1_CLCD_RES_VGA     (CAP_LCD_VGA << CAP_CONFIG1_CLCD_RES_SHIFT)
+#define CAP_CONFIG1_CLCD_RES_WQVGA   (CAP_LCD_WQVGA << CAP_CONFIG1_CLCD_RES_SHIFT)
+#define CAP_CONFIG1_CLCD_RES_QVGA    (CAP_LCD_QVGA << CAP_CONFIG1_CLCD_RES_SHIFT)
+
+#define CAP_CONFIG2_SPU_DIS          0x00000010
+#define CAP_CONFIG2_PKA_DIS          0x00000020
+#define CAP_CONFIG2_RNG_DIS          0x00000080
+
+#if   (CFG_GLOBAL_CHIP == BCM11107)
+#define capConfig0 0
+#define capConfig1 CAP_CONFIG1_CLCD_RES_WVGA
+#define capConfig2 0
+#define CAP_APM_MAX_NUM_CHANS 3
+#elif (CFG_GLOBAL_CHIP == FPGA11107)
+#define capConfig0 0
+#define capConfig1 CAP_CONFIG1_CLCD_RES_WVGA
+#define capConfig2 0
+#define CAP_APM_MAX_NUM_CHANS 3
+#elif (CFG_GLOBAL_CHIP == BCM11109)
+#define capConfig0 (CAP_CONFIG0_USB1_DIS | CAP_CONFIG0_EHSS1_DIS | CAP_CONFIG0_SDIO1_DIS | CAP_CONFIG0_GE_DIS | CAP_CONFIG0_BBL_DIS | CAP_CONFIG0_VDEC_DIS)
+#define capConfig1 (CAP_CONFIG1_APMC_DIS | CAP_CONFIG1_CLCD_RES_WQVGA)
+#define capConfig2 (CAP_CONFIG2_SPU_DIS | CAP_CONFIG2_PKA_DIS)
+#define CAP_APM_MAX_NUM_CHANS 2
+#elif (CFG_GLOBAL_CHIP == BCM11170)
+#define capConfig0 (CAP_CONFIG0_ETH_GMII0_DIS | CAP_CONFIG0_ETH_GMII1_DIS | CAP_CONFIG0_USB0_DIS | CAP_CONFIG0_USB1_DIS | CAP_CONFIG0_TSC_DIS | CAP_CONFIG0_EHSS1_DIS | CAP_CONFIG0_SDIO0_DIS | CAP_CONFIG0_SDIO1_DIS | CAP_CONFIG0_UARTB_DIS | CAP_CONFIG0_CLCD_DIS | CAP_CONFIG0_GE_DIS | CAP_CONFIG0_BBL_DIS | CAP_CONFIG0_VDEC_DIS)
+#define capConfig1 (CAP_CONFIG1_APMC_DIS | CAP_CONFIG1_CLCD_RES_WQVGA)
+#define capConfig2 (CAP_CONFIG2_SPU_DIS | CAP_CONFIG2_PKA_DIS)
+#define CAP_APM_MAX_NUM_CHANS 2
+#elif (CFG_GLOBAL_CHIP == BCM11110)
+#define capConfig0 (CAP_CONFIG0_USB1_DIS | CAP_CONFIG0_TSC_DIS | CAP_CONFIG0_EHSS1_DIS | CAP_CONFIG0_SDIO0_DIS | CAP_CONFIG0_SDIO1_DIS | CAP_CONFIG0_UARTB_DIS | CAP_CONFIG0_GE_DIS | CAP_CONFIG0_BBL_DIS | CAP_CONFIG0_VDEC_DIS)
+#define capConfig1 CAP_CONFIG1_APMC_DIS
+#define capConfig2 (CAP_CONFIG2_SPU_DIS | CAP_CONFIG2_PKA_DIS)
+#define CAP_APM_MAX_NUM_CHANS 2
+#elif (CFG_GLOBAL_CHIP == BCM11211)
+#define capConfig0 (CAP_CONFIG0_ETH_PHY0_DIS | CAP_CONFIG0_ETH_GMII0_DIS | CAP_CONFIG0_ETH_GMII1_DIS | CAP_CONFIG0_ETH_SGMII0_DIS | CAP_CONFIG0_ETH_SGMII1_DIS | CAP_CONFIG0_CLCD_DIS)
+#define capConfig1 CAP_CONFIG1_APMC_DIS
+#define capConfig2 0
+#define CAP_APM_MAX_NUM_CHANS 2
+#else
+#error CFG_GLOBAL_CHIP type capabilities not defined
+#endif
+
+#if   ((CFG_GLOBAL_CHIP == BCM11107) || (CFG_GLOBAL_CHIP == FPGA11107))
+#define CAP_HW_CFG_ARM_CLK_HZ 500000000
+#elif ((CFG_GLOBAL_CHIP == BCM11109) || (CFG_GLOBAL_CHIP == BCM11170) || (CFG_GLOBAL_CHIP == BCM11110))
+#define CAP_HW_CFG_ARM_CLK_HZ 300000000
+#elif (CFG_GLOBAL_CHIP == BCM11211)
+#define CAP_HW_CFG_ARM_CLK_HZ 666666666
+#else
+#error CFG_GLOBAL_CHIP type capabilities not defined
+#endif
+
+#if ((CFG_GLOBAL_CHIP == BCM11107) || (CFG_GLOBAL_CHIP == BCM11211) || (CFG_GLOBAL_CHIP == FPGA11107))
+#define CAP_HW_CFG_VPM_CLK_HZ 333333333
+#elif ((CFG_GLOBAL_CHIP == BCM11109) || (CFG_GLOBAL_CHIP == BCM11170) || (CFG_GLOBAL_CHIP == BCM11110))
+#define CAP_HW_CFG_VPM_CLK_HZ 200000000
+#else
+#error CFG_GLOBAL_CHIP type capabilities not defined
+#endif
+
+/* ---- Public Variable Externs ------------------------------------------ */
+/* ---- Public Function Prototypes --------------------------------------- */
+
+/****************************************************************************
+*  cap_isPresent -
+*
+*  PURPOSE:
+*     Determines if the chip has a certain capability present
+*
+*  PARAMETERS:
+*     capability - type of capability to determine if present
+*
+*  RETURNS:
+*     CAP_PRESENT or CAP_NOT_PRESENT
+****************************************************************************/
+static inline CAP_RC_T cap_isPresent(CAP_CAPABILITY_T capability, int index)
+{
+       CAP_RC_T returnVal = CAP_NOT_PRESENT;
+
+       switch (capability) {
+       case CAP_VPM:
+               {
+                       if (!(capConfig0 & CAP_CONFIG0_VPM_DIS)) {
+                               returnVal = CAP_PRESENT;
+                       }
+               }
+               break;
+
+       case CAP_ETH_PHY:
+               {
+                       if ((index == 0)
+                           && (!(capConfig0 & CAP_CONFIG0_ETH_PHY0_DIS))) {
+                               returnVal = CAP_PRESENT;
+                       }
+                       if ((index == 1)
+                           && (!(capConfig0 & CAP_CONFIG0_ETH_PHY1_DIS))) {
+                               returnVal = CAP_PRESENT;
+                       }
+               }
+               break;
+
+       case CAP_ETH_GMII:
+               {
+                       if ((index == 0)
+                           && (!(capConfig0 & CAP_CONFIG0_ETH_GMII0_DIS))) {
+                               returnVal = CAP_PRESENT;
+                       }
+                       if ((index == 1)
+                           && (!(capConfig0 & CAP_CONFIG0_ETH_GMII1_DIS))) {
+                               returnVal = CAP_PRESENT;
+                       }
+               }
+               break;
+
+       case CAP_ETH_SGMII:
+               {
+                       if ((index == 0)
+                           && (!(capConfig0 & CAP_CONFIG0_ETH_SGMII0_DIS))) {
+                               returnVal = CAP_PRESENT;
+                       }
+                       if ((index == 1)
+                           && (!(capConfig0 & CAP_CONFIG0_ETH_SGMII1_DIS))) {
+                               returnVal = CAP_PRESENT;
+                       }
+               }
+               break;
+
+       case CAP_USB:
+               {
+                       if ((index == 0)
+                           && (!(capConfig0 & CAP_CONFIG0_USB0_DIS))) {
+                               returnVal = CAP_PRESENT;
+                       }
+                       if ((index == 1)
+                           && (!(capConfig0 & CAP_CONFIG0_USB1_DIS))) {
+                               returnVal = CAP_PRESENT;
+                       }
+               }
+               break;
+
+       case CAP_TSC:
+               {
+                       if (!(capConfig0 & CAP_CONFIG0_TSC_DIS)) {
+                               returnVal = CAP_PRESENT;
+                       }
+               }
+               break;
+
+       case CAP_EHSS:
+               {
+                       if ((index == 0)
+                           && (!(capConfig0 & CAP_CONFIG0_EHSS0_DIS))) {
+                               returnVal = CAP_PRESENT;
+                       }
+                       if ((index == 1)
+                           && (!(capConfig0 & CAP_CONFIG0_EHSS1_DIS))) {
+                               returnVal = CAP_PRESENT;
+                       }
+               }
+               break;
+
+       case CAP_SDIO:
+               {
+                       if ((index == 0)
+                           && (!(capConfig0 & CAP_CONFIG0_SDIO0_DIS))) {
+                               returnVal = CAP_PRESENT;
+                       }
+                       if ((index == 1)
+                           && (!(capConfig0 & CAP_CONFIG0_SDIO1_DIS))) {
+                               returnVal = CAP_PRESENT;
+                       }
+               }
+               break;
+
+       case CAP_UARTB:
+               {
+                       if (!(capConfig0 & CAP_CONFIG0_UARTB_DIS)) {
+                               returnVal = CAP_PRESENT;
+                       }
+               }
+               break;
+
+       case CAP_KEYPAD:
+               {
+                       if (!(capConfig0 & CAP_CONFIG0_KEYPAD_DIS)) {
+                               returnVal = CAP_PRESENT;
+                       }
+               }
+               break;
+
+       case CAP_CLCD:
+               {
+                       if (!(capConfig0 & CAP_CONFIG0_CLCD_DIS)) {
+                               returnVal = CAP_PRESENT;
+                       }
+               }
+               break;
+
+       case CAP_GE:
+               {
+                       if (!(capConfig0 & CAP_CONFIG0_GE_DIS)) {
+                               returnVal = CAP_PRESENT;
+                       }
+               }
+               break;
+
+       case CAP_LEDM:
+               {
+                       if (!(capConfig0 & CAP_CONFIG0_LEDM_DIS)) {
+                               returnVal = CAP_PRESENT;
+                       }
+               }
+               break;
+
+       case CAP_BBL:
+               {
+                       if (!(capConfig0 & CAP_CONFIG0_BBL_DIS)) {
+                               returnVal = CAP_PRESENT;
+                       }
+               }
+               break;
+
+       case CAP_VDEC:
+               {
+                       if (!(capConfig0 & CAP_CONFIG0_VDEC_DIS)) {
+                               returnVal = CAP_PRESENT;
+                       }
+               }
+               break;
+
+       case CAP_PIF:
+               {
+                       if (!(capConfig0 & CAP_CONFIG0_PIF_DIS)) {
+                               returnVal = CAP_PRESENT;
+                       }
+               }
+               break;
+
+       case CAP_APM:
+               {
+                       if ((index == 0)
+                           && (!(capConfig1 & CAP_CONFIG1_APMA_DIS))) {
+                               returnVal = CAP_PRESENT;
+                       }
+                       if ((index == 1)
+                           && (!(capConfig1 & CAP_CONFIG1_APMB_DIS))) {
+                               returnVal = CAP_PRESENT;
+                       }
+                       if ((index == 2)
+                           && (!(capConfig1 & CAP_CONFIG1_APMC_DIS))) {
+                               returnVal = CAP_PRESENT;
+                       }
+               }
+               break;
+
+       case CAP_SPU:
+               {
+                       if (!(capConfig2 & CAP_CONFIG2_SPU_DIS)) {
+                               returnVal = CAP_PRESENT;
+                       }
+               }
+               break;
+
+       case CAP_PKA:
+               {
+                       if (!(capConfig2 & CAP_CONFIG2_PKA_DIS)) {
+                               returnVal = CAP_PRESENT;
+                       }
+               }
+               break;
+
+       case CAP_RNG:
+               {
+                       if (!(capConfig2 & CAP_CONFIG2_RNG_DIS)) {
+                               returnVal = CAP_PRESENT;
+                       }
+               }
+               break;
+
+       default:
+               {
+               }
+               break;
+       }
+       return returnVal;
+}
+
+/****************************************************************************
+*  cap_getMaxArmSpeedHz -
+*
+*  PURPOSE:
+*     Determines the maximum speed of the ARM CPU
+*
+*  PARAMETERS:
+*     none
+*
+*  RETURNS:
+*     clock speed in Hz that the ARM processor is able to run at
+****************************************************************************/
+static inline uint32_t cap_getMaxArmSpeedHz(void)
+{
+#if   ((CFG_GLOBAL_CHIP == BCM11107) || (CFG_GLOBAL_CHIP == FPGA11107))
+       return 500000000;
+#elif ((CFG_GLOBAL_CHIP == BCM11109) || (CFG_GLOBAL_CHIP == BCM11170) || (CFG_GLOBAL_CHIP == BCM11110))
+       return 300000000;
+#elif (CFG_GLOBAL_CHIP == BCM11211)
+       return 666666666;
+#else
+#error CFG_GLOBAL_CHIP type capabilities not defined
+#endif
+}
+
+/****************************************************************************
+*  cap_getMaxVpmSpeedHz -
+*
+*  PURPOSE:
+*     Determines the maximum speed of the VPM
+*
+*  PARAMETERS:
+*     none
+*
+*  RETURNS:
+*     clock speed in Hz that the VPM is able to run at
+****************************************************************************/
+static inline uint32_t cap_getMaxVpmSpeedHz(void)
+{
+#if ((CFG_GLOBAL_CHIP == BCM11107) || (CFG_GLOBAL_CHIP == BCM11211) || (CFG_GLOBAL_CHIP == FPGA11107))
+       return 333333333;
+#elif ((CFG_GLOBAL_CHIP == BCM11109) || (CFG_GLOBAL_CHIP == BCM11170) || (CFG_GLOBAL_CHIP == BCM11110))
+       return 200000000;
+#else
+#error CFG_GLOBAL_CHIP type capabilities not defined
+#endif
+}
+
+/****************************************************************************
+*  cap_getMaxLcdRes -
+*
+*  PURPOSE:
+*     Determines the maximum LCD resolution capabilities
+*
+*  PARAMETERS:
+*     none
+*
+*  RETURNS:
+*   CAP_LCD_WVGA, CAP_LCD_VGA, CAP_LCD_WQVGA or CAP_LCD_QVGA
+*
+****************************************************************************/
+static inline CAP_LCD_RES_T cap_getMaxLcdRes(void)
+{
+       return (CAP_LCD_RES_T)
+               ((capConfig1 & CAP_CONFIG1_CLCD_RES_MASK) >>
+                CAP_CONFIG1_CLCD_RES_SHIFT);
+}
+
+#endif
diff --git a/arch/arm/mach-bcmring/include/mach/csp/chipcHw_def.h b/arch/arm/mach-bcmring/include/mach/csp/chipcHw_def.h
new file mode 100644 (file)
index 0000000..70eaea8
--- /dev/null
@@ -0,0 +1,1123 @@
+/*****************************************************************************
+* Copyright 2003 - 2008 Broadcom Corporation.  All rights reserved.
+*
+* Unless you and Broadcom execute a separate written software license
+* agreement governing use of this software, this software is licensed to you
+* under the terms of the GNU General Public License version 2, available at
+* http://www.broadcom.com/licenses/GPLv2.php (the "GPL").
+*
+* Notwithstanding the above, under no circumstances may you combine this
+* software in any way with any other Broadcom software provided under a
+* license other than the GPL, without Broadcom's express prior written
+* consent.
+*****************************************************************************/
+
+#ifndef CHIPC_DEF_H
+#define CHIPC_DEF_H
+
+/* ---- Include Files ----------------------------------------------------- */
+
+#include <csp/stdint.h>
+#include <csp/errno.h>
+#include <csp/reg.h>
+#include <mach/csp/chipcHw_reg.h>
+
+/* ---- Public Constants and Types ---------------------------------------- */
+
+/* Set 1 to configure DDR/VPM phase alignment by HW */
+#define chipcHw_DDR_HW_PHASE_ALIGN    0
+#define chipcHw_VPM_HW_PHASE_ALIGN    0
+
+typedef uint32_t chipcHw_freq;
+
+/* Configurable miscellaneous clocks */
+typedef enum {
+       chipcHw_CLOCK_DDR,      /* DDR PHY Clock */
+       chipcHw_CLOCK_ARM,      /* ARM Clock */
+       chipcHw_CLOCK_ESW,      /* Ethernet Switch Clock */
+       chipcHw_CLOCK_VPM,      /* VPM Clock */
+       chipcHw_CLOCK_ESW125,   /* Ethernet MII Clock */
+       chipcHw_CLOCK_UART,     /* UART Clock */
+       chipcHw_CLOCK_SDIO0,    /* SDIO 0 Clock */
+       chipcHw_CLOCK_SDIO1,    /* SDIO 1 Clock */
+       chipcHw_CLOCK_SPI,      /* SPI Clock */
+       chipcHw_CLOCK_ETM,      /* ARM ETM Clock */
+
+       chipcHw_CLOCK_BUS,      /* BUS Clock */
+       chipcHw_CLOCK_OTP,      /* OTP Clock */
+       chipcHw_CLOCK_I2C,      /* I2C Host Clock */
+       chipcHw_CLOCK_I2S0,     /* I2S 0 Host Clock */
+       chipcHw_CLOCK_RTBUS,    /* DDR PHY Configuration Clock */
+       chipcHw_CLOCK_APM100,   /* APM100 Clock */
+       chipcHw_CLOCK_TSC,      /* Touch screen Clock */
+       chipcHw_CLOCK_LED,      /* LED Clock */
+
+       chipcHw_CLOCK_USB,      /* USB Clock */
+       chipcHw_CLOCK_LCD,      /* LCD CLock */
+       chipcHw_CLOCK_APM,      /* APM Clock */
+
+       chipcHw_CLOCK_I2S1,     /* I2S 1 Host Clock */
+} chipcHw_CLOCK_e;
+
+/* System booting strap options */
+typedef enum {
+       chipcHw_BOOT_DEVICE_UART = chipcHw_STRAPS_BOOT_DEVICE_UART,
+       chipcHw_BOOT_DEVICE_SERIAL_FLASH =
+           chipcHw_STRAPS_BOOT_DEVICE_SERIAL_FLASH,
+       chipcHw_BOOT_DEVICE_NOR_FLASH_16 =
+           chipcHw_STRAPS_BOOT_DEVICE_NOR_FLASH_16,
+       chipcHw_BOOT_DEVICE_NAND_FLASH_8 =
+           chipcHw_STRAPS_BOOT_DEVICE_NAND_FLASH_8,
+       chipcHw_BOOT_DEVICE_NAND_FLASH_16 =
+           chipcHw_STRAPS_BOOT_DEVICE_NAND_FLASH_16
+} chipcHw_BOOT_DEVICE_e;
+
+/* System booting modes */
+typedef enum {
+       chipcHw_BOOT_MODE_NORMAL = chipcHw_STRAPS_BOOT_MODE_NORMAL,
+       chipcHw_BOOT_MODE_DBG_SW = chipcHw_STRAPS_BOOT_MODE_DBG_SW,
+       chipcHw_BOOT_MODE_DBG_BOOT = chipcHw_STRAPS_BOOT_MODE_DBG_BOOT,
+       chipcHw_BOOT_MODE_NORMAL_QUIET = chipcHw_STRAPS_BOOT_MODE_NORMAL_QUIET
+} chipcHw_BOOT_MODE_e;
+
+/* NAND Flash page size strap options */
+typedef enum {
+       chipcHw_NAND_PAGESIZE_512 = chipcHw_STRAPS_NAND_PAGESIZE_512,
+       chipcHw_NAND_PAGESIZE_2048 = chipcHw_STRAPS_NAND_PAGESIZE_2048,
+       chipcHw_NAND_PAGESIZE_4096 = chipcHw_STRAPS_NAND_PAGESIZE_4096,
+       chipcHw_NAND_PAGESIZE_EXT = chipcHw_STRAPS_NAND_PAGESIZE_EXT
+} chipcHw_NAND_PAGESIZE_e;
+
+/* GPIO Pin function */
+typedef enum {
+       chipcHw_GPIO_FUNCTION_KEYPAD = chipcHw_REG_GPIO_MUX_KEYPAD,
+       chipcHw_GPIO_FUNCTION_I2CH = chipcHw_REG_GPIO_MUX_I2CH,
+       chipcHw_GPIO_FUNCTION_SPI = chipcHw_REG_GPIO_MUX_SPI,
+       chipcHw_GPIO_FUNCTION_UART = chipcHw_REG_GPIO_MUX_UART,
+       chipcHw_GPIO_FUNCTION_LEDMTXP = chipcHw_REG_GPIO_MUX_LEDMTXP,
+       chipcHw_GPIO_FUNCTION_LEDMTXS = chipcHw_REG_GPIO_MUX_LEDMTXS,
+       chipcHw_GPIO_FUNCTION_SDIO0 = chipcHw_REG_GPIO_MUX_SDIO0,
+       chipcHw_GPIO_FUNCTION_SDIO1 = chipcHw_REG_GPIO_MUX_SDIO1,
+       chipcHw_GPIO_FUNCTION_PCM = chipcHw_REG_GPIO_MUX_PCM,
+       chipcHw_GPIO_FUNCTION_I2S = chipcHw_REG_GPIO_MUX_I2S,
+       chipcHw_GPIO_FUNCTION_ETM = chipcHw_REG_GPIO_MUX_ETM,
+       chipcHw_GPIO_FUNCTION_DEBUG = chipcHw_REG_GPIO_MUX_DEBUG,
+       chipcHw_GPIO_FUNCTION_MISC = chipcHw_REG_GPIO_MUX_MISC,
+       chipcHw_GPIO_FUNCTION_GPIO = chipcHw_REG_GPIO_MUX_GPIO
+} chipcHw_GPIO_FUNCTION_e;
+
+/* PIN Output slew rate */
+typedef enum {
+       chipcHw_PIN_SLEW_RATE_HIGH = chipcHw_REG_SLEW_RATE_HIGH,
+       chipcHw_PIN_SLEW_RATE_NORMAL = chipcHw_REG_SLEW_RATE_NORMAL
+} chipcHw_PIN_SLEW_RATE_e;
+
+/* PIN Current drive strength */
+typedef enum {
+       chipcHw_PIN_CURRENT_STRENGTH_2mA = chipcHw_REG_CURRENT_STRENGTH_2mA,
+       chipcHw_PIN_CURRENT_STRENGTH_4mA = chipcHw_REG_CURRENT_STRENGTH_4mA,
+       chipcHw_PIN_CURRENT_STRENGTH_6mA = chipcHw_REG_CURRENT_STRENGTH_6mA,
+       chipcHw_PIN_CURRENT_STRENGTH_8mA = chipcHw_REG_CURRENT_STRENGTH_8mA,
+       chipcHw_PIN_CURRENT_STRENGTH_10mA = chipcHw_REG_CURRENT_STRENGTH_10mA,
+       chipcHw_PIN_CURRENT_STRENGTH_12mA = chipcHw_REG_CURRENT_STRENGTH_12mA
+} chipcHw_PIN_CURRENT_STRENGTH_e;
+
+/* PIN Pull up register settings */
+typedef enum {
+       chipcHw_PIN_PULL_NONE = chipcHw_REG_PULL_NONE,
+       chipcHw_PIN_PULL_UP = chipcHw_REG_PULL_UP,
+       chipcHw_PIN_PULL_DOWN = chipcHw_REG_PULL_DOWN
+} chipcHw_PIN_PULL_e;
+
+/* PIN input type settings */
+typedef enum {
+       chipcHw_PIN_INPUTTYPE_CMOS = chipcHw_REG_INPUTTYPE_CMOS,
+       chipcHw_PIN_INPUTTYPE_ST = chipcHw_REG_INPUTTYPE_ST
+} chipcHw_PIN_INPUTTYPE_e;
+
+/* Allow/Disalow the support of spread spectrum  */
+typedef enum {
+       chipcHw_SPREAD_SPECTRUM_DISALLOW,       /* Spread spectrum support is not allowed */
+       chipcHw_SPREAD_SPECTRUM_ALLOW   /* Spread spectrum support is allowed */
+} chipcHw_SPREAD_SPECTRUM_e;
+
+typedef struct {
+       chipcHw_SPREAD_SPECTRUM_e ssSupport;    /* Allow/Disalow to support spread spectrum.
+                                                  If supported, call chipcHw_enableSpreadSpectrum ()
+                                                  to activate the spread spectrum with desired spread. */
+       uint32_t pllVcoFreqHz;  /* PLL VCO frequency in Hz */
+       uint32_t pll2VcoFreqHz; /* PLL2 VCO frequency in Hz */
+       uint32_t busClockFreqHz;        /* Bus clock frequency in Hz */
+       uint32_t armBusRatio;   /* ARM clock : Bus clock */
+       uint32_t vpmBusRatio;   /* VPM clock : Bus clock */
+       uint32_t ddrBusRatio;   /* DDR clock : Bus clock */
+} chipcHw_INIT_PARAM_t;
+
+/* CHIP revision number */
+typedef enum {
+       chipcHw_REV_NUMBER_A0 = chipcHw_REG_REV_A0,
+       chipcHw_REV_NUMBER_B0 = chipcHw_REG_REV_B0
+} chipcHw_REV_NUMBER_e;
+
+typedef enum {
+       chipcHw_VPM_HW_PHASE_INTR_DISABLE = chipcHw_REG_VPM_INTR_DISABLE,
+       chipcHw_VPM_HW_PHASE_INTR_FAST = chipcHw_REG_VPM_INTR_FAST,
+       chipcHw_VPM_HW_PHASE_INTR_MEDIUM = chipcHw_REG_VPM_INTR_MEDIUM,
+       chipcHw_VPM_HW_PHASE_INTR_SLOW = chipcHw_REG_VPM_INTR_SLOW
+} chipcHw_VPM_HW_PHASE_INTR_e;
+
+typedef enum {
+       chipcHw_DDR_HW_PHASE_MARGIN_STRICT,     /*  Strict margin for DDR phase align condition */
+       chipcHw_DDR_HW_PHASE_MARGIN_MEDIUM,     /*  Medium margin for DDR phase align condition */
+       chipcHw_DDR_HW_PHASE_MARGIN_WIDE        /*  Wider margin for DDR phase align condition */
+} chipcHw_DDR_HW_PHASE_MARGIN_e;
+
+typedef enum {
+       chipcHw_VPM_HW_PHASE_MARGIN_STRICT,     /*  Strict margin for VPM phase align condition */
+       chipcHw_VPM_HW_PHASE_MARGIN_MEDIUM,     /*  Medium margin for VPM phase align condition */
+       chipcHw_VPM_HW_PHASE_MARGIN_WIDE        /*  Wider margin for VPM phase align condition */
+} chipcHw_VPM_HW_PHASE_MARGIN_e;
+
+#define chipcHw_XTAL_FREQ_Hz                    25000000       /* Reference clock frequency in Hz */
+
+/* Programable pin defines */
+#define chipcHw_PIN_GPIO(n)                     ((((n) >= 0) && ((n) < (chipcHw_GPIO_COUNT))) ? (n) : 0xFFFFFFFF)
+                                                                            /* GPIO pin 0 - 60 */
+#define chipcHw_PIN_UARTTXD                     (chipcHw_GPIO_COUNT + 0)       /* UART Transmit */
+#define chipcHw_PIN_NVI_A                       (chipcHw_GPIO_COUNT + 1)       /* NVI Interface */
+#define chipcHw_PIN_NVI_D                       (chipcHw_GPIO_COUNT + 2)       /* NVI Interface */
+#define chipcHw_PIN_NVI_OEB                     (chipcHw_GPIO_COUNT + 3)       /* NVI Interface */
+#define chipcHw_PIN_NVI_WEB                     (chipcHw_GPIO_COUNT + 4)       /* NVI Interface */
+#define chipcHw_PIN_NVI_CS                      (chipcHw_GPIO_COUNT + 5)       /* NVI Interface */
+#define chipcHw_PIN_NVI_NAND_CSB                (chipcHw_GPIO_COUNT + 6)       /* NVI Interface */
+#define chipcHw_PIN_NVI_FLASHWP                 (chipcHw_GPIO_COUNT + 7)       /* NVI Interface */
+#define chipcHw_PIN_NVI_NAND_RDYB               (chipcHw_GPIO_COUNT + 8)       /* NVI Interface */
+#define chipcHw_PIN_CL_DATA_0_17                (chipcHw_GPIO_COUNT + 9)       /* LCD Data 0 - 17 */
+#define chipcHw_PIN_CL_DATA_18_20               (chipcHw_GPIO_COUNT + 10)      /* LCD Data 18 - 20 */
+#define chipcHw_PIN_CL_DATA_21_23               (chipcHw_GPIO_COUNT + 11)      /* LCD Data 21 - 23 */
+#define chipcHw_PIN_CL_POWER                    (chipcHw_GPIO_COUNT + 12)      /* LCD Power */
+#define chipcHw_PIN_CL_ACK                      (chipcHw_GPIO_COUNT + 13)      /* LCD Ack */
+#define chipcHw_PIN_CL_FP                       (chipcHw_GPIO_COUNT + 14)      /* LCD FP */
+#define chipcHw_PIN_CL_LP                       (chipcHw_GPIO_COUNT + 15)      /* LCD LP */
+#define chipcHw_PIN_UARTRXD                     (chipcHw_GPIO_COUNT + 16)      /* UART Receive */
+
+/* ---- Public Variable Externs ------------------------------------------ */
+/* ---- Public Function Prototypes --------------------------------------- */
+
+/****************************************************************************/
+/**
+*  @brief  Initializes the clock module
+*
+*/
+/****************************************************************************/
+void chipcHw_Init(chipcHw_INIT_PARAM_t *initParam      /*  [ IN ] Misc chip initialization parameter */
+    ) __attribute__ ((section(".aramtext")));
+
+/****************************************************************************/
+/**
+*  @brief  Enables the PLL1
+*
+*  This function enables the PLL1
+*
+*/
+/****************************************************************************/
+void chipcHw_pll1Enable(uint32_t vcoFreqHz,    /*  [ IN ] VCO frequency in Hz */
+                       chipcHw_SPREAD_SPECTRUM_e ssSupport     /*  [ IN ] SS status */
+    ) __attribute__ ((section(".aramtext")));
+
+/****************************************************************************/
+/**
+*  @brief  Enables the PLL2
+*
+*  This function enables the PLL2
+*
+*/
+/****************************************************************************/
+void chipcHw_pll2Enable(uint32_t vcoFreqHz     /*  [ IN ] VCO frequency in Hz */
+    ) __attribute__ ((section(".aramtext")));
+
+/****************************************************************************/
+/**
+*  @brief  Disable the PLL1
+*
+*/
+/****************************************************************************/
+static inline void chipcHw_pll1Disable(void);
+
+/****************************************************************************/
+/**
+*  @brief  Disable the PLL2
+*
+*/
+/****************************************************************************/
+static inline void chipcHw_pll2Disable(void);
+
+/****************************************************************************/
+/**
+*  @brief   Set clock fequency for miscellaneous configurable clocks
+*
+*  This function sets clock frequency
+*
+*  @return  Configured clock frequency in KHz
+*
+*/
+/****************************************************************************/
+chipcHw_freq chipcHw_getClockFrequency(chipcHw_CLOCK_e clock   /*  [ IN ] Configurable clock */
+    ) __attribute__ ((section(".aramtext")));
+
+/****************************************************************************/
+/**
+*  @brief   Set clock fequency for miscellaneous configurable clocks
+*
+*  This function sets clock frequency
+*
+*  @return  Configured clock frequency in Hz
+*
+*/
+/****************************************************************************/
+chipcHw_freq chipcHw_setClockFrequency(chipcHw_CLOCK_e clock,  /*  [ IN ] Configurable clock */
+                                      uint32_t freq    /*  [ IN ] Clock frequency in Hz */
+    ) __attribute__ ((section(".aramtext")));
+
+/****************************************************************************/
+/**
+*  @brief   Set VPM clock in sync with BUS clock
+*
+*  This function does the phase adjustment between VPM and BUS clock
+*
+*  @return >= 0 : On success ( # of adjustment required )
+*            -1 : On failure
+*/
+/****************************************************************************/
+int chipcHw_vpmPhaseAlign(void);
+
+/****************************************************************************/
+/**
+*  @brief   Enables core a clock of a certain device
+*
+*  This function enables a core clock
+*
+*  @return  void
+*
+*  @note    Doesnot affect the bus interface clock
+*/
+/****************************************************************************/
+static inline void chipcHw_setClockEnable(chipcHw_CLOCK_e clock        /*  [ IN ] Configurable clock */
+    );
+
+/****************************************************************************/
+/**
+*  @brief   Disabled a core clock of a certain device
+*
+*  This function disables a core clock
+*
+*  @return  void
+*
+*  @note    Doesnot affect the bus interface clock
+*/
+/****************************************************************************/
+static inline void chipcHw_setClockDisable(chipcHw_CLOCK_e clock       /*  [ IN ] Configurable clock */
+    );
+
+/****************************************************************************/
+/**
+*  @brief   Enables bypass clock of a certain device
+*
+*  This function enables bypass clock
+*
+*  @note    Doesnot affect the bus interface clock
+*/
+/****************************************************************************/
+static inline void chipcHw_bypassClockEnable(chipcHw_CLOCK_e clock     /*  [ IN ] Configurable clock */
+    );
+
+/****************************************************************************/
+/**
+*  @brief   Disabled bypass clock of a certain device
+*
+*  This function disables bypass clock
+*
+*  @note    Doesnot affect the bus interface clock
+*/
+/****************************************************************************/
+static inline void chipcHw_bypassClockDisable(chipcHw_CLOCK_e clock    /*  [ IN ] Configurable clock */
+    );
+
+/****************************************************************************/
+/**
+*  @brief   Get Numeric Chip ID
+*
+*  This function returns Chip ID that includes the revison number
+*
+*  @return  Complete numeric Chip ID
+*
+*/
+/****************************************************************************/
+static inline uint32_t chipcHw_getChipId(void);
+
+/****************************************************************************/
+/**
+*  @brief   Get Chip Product ID
+*
+*  This function returns Chip Product ID
+*
+*  @return  Chip Product ID
+*/
+/****************************************************************************/
+static inline uint32_t chipcHw_getChipProductId(void);
+
+/****************************************************************************/
+/**
+*  @brief   Get revision number
+*
+*  This function returns revision number of the chip
+*
+*  @return  Revision number
+*/
+/****************************************************************************/
+static inline chipcHw_REV_NUMBER_e chipcHw_getChipRevisionNumber(void);
+
+/****************************************************************************/
+/**
+*  @brief   Enables bus interface clock
+*
+*  Enables  bus interface clock of various device
+*
+*  @return  void
+*
+*  @note    use chipcHw_REG_BUS_CLOCK_XXXX
+*/
+/****************************************************************************/
+static inline void chipcHw_busInterfaceClockEnable(uint32_t mask       /*  [ IN ] Bit map of type  chipcHw_REG_BUS_CLOCK_XXXXX */
+    );
+
+/****************************************************************************/
+/**
+*  @brief   Disables bus interface clock
+*
+*  Disables  bus interface clock of various device
+*
+*  @return  void
+*
+*  @note    use chipcHw_REG_BUS_CLOCK_XXXX
+*/
+/****************************************************************************/
+static inline void chipcHw_busInterfaceClockDisable(uint32_t mask      /*  [ IN ] Bit map of type  chipcHw_REG_BUS_CLOCK_XXXXX */
+    );
+
+/****************************************************************************/
+/**
+*  @brief   Enables various audio channels
+*
+*  Enables audio channel
+*
+*  @return  void
+*
+*  @note    use chipcHw_REG_AUDIO_CHANNEL_XXXXXX
+*/
+/****************************************************************************/
+static inline void chipcHw_audioChannelEnable(uint32_t mask    /*  [ IN ] Bit map of type  chipcHw_REG_AUDIO_CHANNEL_XXXXXX */
+    );
+
+/****************************************************************************/
+/**
+*  @brief   Disables various audio channels
+*
+*  Disables audio channel
+*
+*  @return  void
+*
+*  @note    use chipcHw_REG_AUDIO_CHANNEL_XXXXXX
+*/
+/****************************************************************************/
+static inline void chipcHw_audioChannelDisable(uint32_t mask   /*  [ IN ] Bit map of type  chipcHw_REG_AUDIO_CHANNEL_XXXXXX */
+    );
+
+/****************************************************************************/
+/**
+*  @brief    Soft resets devices
+*
+*  Soft resets various devices
+*
+*  @return   void
+*
+*  @note     use chipcHw_REG_SOFT_RESET_XXXXXX defines
+*/
+/****************************************************************************/
+static inline void chipcHw_softReset(uint64_t mask     /*  [ IN ] Bit map of type chipcHw_REG_SOFT_RESET_XXXXXX */
+    );
+
+static inline void chipcHw_softResetDisable(uint64_t mask      /*  [ IN ] Bit map of type chipcHw_REG_SOFT_RESET_XXXXXX */
+    );
+
+static inline void chipcHw_softResetEnable(uint64_t mask       /*  [ IN ] Bit map of type chipcHw_REG_SOFT_RESET_XXXXXX */
+    );
+
+/****************************************************************************/
+/**
+*  @brief    Configures misc CHIP functionality
+*
+*  Configures CHIP functionality
+*
+*  @return   void
+*
+*  @note     use chipcHw_REG_MISC_CTRL_XXXXXX
+*/
+/****************************************************************************/
+static inline void chipcHw_miscControl(uint32_t mask   /*  [ IN ] Bit map of type chipcHw_REG_MISC_CTRL_XXXXXX */
+    );
+
+static inline void chipcHw_miscControlDisable(uint32_t mask    /*  [ IN ] Bit map of type chipcHw_REG_MISC_CTRL_XXXXXX */
+    );
+
+static inline void chipcHw_miscControlEnable(uint32_t mask     /*  [ IN ] Bit map of type chipcHw_REG_MISC_CTRL_XXXXXX */
+    );
+
+/****************************************************************************/
+/**
+*  @brief    Set OTP options
+*
+*  Set OTP options
+*
+*  @return   void
+*
+*  @note     use chipcHw_REG_OTP_XXXXXX
+*/
+/****************************************************************************/
+static inline void chipcHw_setOTPOption(uint64_t mask  /*  [ IN ] Bit map of type chipcHw_REG_OTP_XXXXXX */
+    );
+
+/****************************************************************************/
+/**
+*  @brief    Get sticky bits
+*
+*  @return   Sticky bit options of type chipcHw_REG_STICKY_XXXXXX
+*
+*/
+/****************************************************************************/
+static inline uint32_t chipcHw_getStickyBits(void);
+
+/****************************************************************************/
+/**
+*  @brief    Set sticky bits
+*
+*  @return   void
+*
+*  @note     use chipcHw_REG_STICKY_XXXXXX
+*/
+/****************************************************************************/
+static inline void chipcHw_setStickyBits(uint32_t mask /*  [ IN ] Bit map of type chipcHw_REG_STICKY_XXXXXX */
+    );
+
+/****************************************************************************/
+/**
+*  @brief    Clear sticky bits
+*
+*  @return   void
+*
+*  @note     use chipcHw_REG_STICKY_XXXXXX
+*/
+/****************************************************************************/
+static inline void chipcHw_clearStickyBits(uint32_t mask       /*  [ IN ] Bit map of type chipcHw_REG_STICKY_XXXXXX */
+    );
+
+/****************************************************************************/
+/**
+*  @brief    Get software override strap options
+*
+*  Retrieves software override strap options
+*
+*  @return   Software override strap value
+*
+*/
+/****************************************************************************/
+static inline uint32_t chipcHw_getSoftStraps(void);
+
+/****************************************************************************/
+/**
+*  @brief    Set software override strap options
+*
+*  set software override strap options
+*
+*  @return   nothing
+*
+*/
+/****************************************************************************/
+static inline void chipcHw_setSoftStraps(uint32_t strapOptions);
+
+/****************************************************************************/
+/**
+*  @brief    Get pin strap options
+*
+*  Retrieves pin strap options
+*
+*  @return   Pin strap value
+*
+*/
+/****************************************************************************/
+static inline uint32_t chipcHw_getPinStraps(void);
+
+/****************************************************************************/
+/**
+*  @brief    Get valid pin strap options
+*
+*  Retrieves valid pin strap options
+*
+*  @return   valid Pin strap value
+*
+*/
+/****************************************************************************/
+static inline uint32_t chipcHw_getValidStraps(void);
+
+/****************************************************************************/
+/**
+*  @brief    Initialize valid pin strap options
+*
+*  Retrieves valid pin strap options by copying HW strap options to soft register
+*  (if chipcHw_STRAPS_SOFT_OVERRIDE not set)
+*
+*  @return   nothing
+*
+*/
+/****************************************************************************/
+static inline void chipcHw_initValidStraps(void);
+
+/****************************************************************************/
+/**
+*  @brief   Get status (enabled/disabled) of bus interface clock
+*
+*  This function returns the status of devices' bus interface clock
+*
+*  @return  Bus interface clock
+*
+*/
+/****************************************************************************/
+static inline uint32_t chipcHw_getBusInterfaceClockStatus(void);
+
+/****************************************************************************/
+/**
+*  @brief   Get boot device
+*
+*  This function returns the device type used in booting the system
+*
+*  @return  Boot device of type chipcHw_BOOT_DEVICE_e
+*
+*/
+/****************************************************************************/
+static inline chipcHw_BOOT_DEVICE_e chipcHw_getBootDevice(void);
+
+/****************************************************************************/
+/**
+*  @brief   Get boot mode
+*
+*  This function returns the way the system was booted
+*
+*  @return  Boot mode of type chipcHw_BOOT_MODE_e
+*
+*/
+/****************************************************************************/
+static inline chipcHw_BOOT_MODE_e chipcHw_getBootMode(void);
+
+/****************************************************************************/
+/**
+*  @brief   Get NAND flash page size
+*
+*  This function returns the NAND device page size
+*
+*  @return  Boot NAND device page size
+*
+*/
+/****************************************************************************/
+static inline chipcHw_NAND_PAGESIZE_e chipcHw_getNandPageSize(void);
+
+/****************************************************************************/
+/**
+*  @brief   Get NAND flash address cycle configuration
+*
+*  This function returns the NAND flash address cycle configuration
+*
+*  @return  0 = Do not extra address cycle, 1 = Add extra cycle
+*
+*/
+/****************************************************************************/
+static inline int chipcHw_getNandExtraCycle(void);
+
+/****************************************************************************/
+/**
+*  @brief   Activates PIF interface
+*
+*  This function activates PIF interface by taking control of LCD pins
+*
+*  @note
+*       When activated, LCD pins will be defined as follows for PIF operation
+*
+*       CLD[17:0]  = pif_data[17:0]
+*       CLD[23:18] = pif_address[5:0]
+*       CLPOWER    = pif_wr_str
+*       CLCP       = pif_rd_str
+*       CLAC       = pif_hat1
+*       CLFP       = pif_hrdy1
+*       CLLP       = pif_hat2
+*       GPIO[42]   = pif_hrdy2
+*
+*       In PIF mode, "pif_hrdy2" overrides other shared function for GPIO[42] pin
+*
+*/
+/****************************************************************************/
+static inline void chipcHw_activatePifInterface(void);
+
+/****************************************************************************/
+/**
+*  @brief   Activates LCD interface
+*
+*  This function activates LCD interface
+*
+*  @note
+*       When activated, LCD pins will be defined as follows
+*
+*       CLD[17:0]  = LCD data
+*       CLD[23:18] = LCD data
+*       CLPOWER    = LCD power
+*       CLCP       =
+*       CLAC       = LCD ack
+*       CLFP       =
+*       CLLP       =
+*/
+/****************************************************************************/
+static inline void chipcHw_activateLcdInterface(void);
+
+/****************************************************************************/
+/**
+*  @brief   Deactivates PIF/LCD interface
+*
+*  This function deactivates PIF/LCD interface
+*
+*  @note
+*       When deactivated LCD pins will be in rti-stated
+*
+*/
+/****************************************************************************/
+static inline void chipcHw_deactivatePifLcdInterface(void);
+
+/****************************************************************************/
+/**
+*  @brief   Get to know the configuration of GPIO pin
+*
+*/
+/****************************************************************************/
+static inline chipcHw_GPIO_FUNCTION_e chipcHw_getGpioPinFunction(int pin       /* GPIO Pin number */
+    );
+
+/****************************************************************************/
+/**
+*  @brief   Configure GPIO pin function
+*
+*/
+/****************************************************************************/
+static inline void chipcHw_setGpioPinFunction(int pin, /* GPIO Pin number */
+                                             chipcHw_GPIO_FUNCTION_e func      /* Configuration function */
+    );
+
+/****************************************************************************/
+/**
+*  @brief   Set Pin slew rate
+*
+*  This function sets the slew of individual pin
+*
+*/
+/****************************************************************************/
+static inline void chipcHw_setPinSlewRate(uint32_t pin,        /* Pin of type chipcHw_PIN_XXXXX */
+                                         chipcHw_PIN_SLEW_RATE_e slewRate      /* Pin slew rate */
+    );
+
+/****************************************************************************/
+/**
+*  @brief   Set Pin output drive current
+*
+*  This function sets output drive current of individual pin
+*
+*  Note: Avoid the use of the word 'current' since linux headers define this
+*        to be the current task.
+*/
+/****************************************************************************/
+static inline void chipcHw_setPinOutputCurrent(uint32_t pin,   /* Pin of type chipcHw_PIN_XXXXX */
+                                              chipcHw_PIN_CURRENT_STRENGTH_e curr      /* Pin current rating */
+    );
+
+/****************************************************************************/
+/**
+*  @brief   Set Pin pullup register
+*
+*  This function sets pullup register of individual  pin
+*
+*/
+/****************************************************************************/
+static inline void chipcHw_setPinPullup(uint32_t pin,  /* Pin of type chipcHw_PIN_XXXXX */
+                                       chipcHw_PIN_PULL_e pullup       /* Pullup register settings */
+    );
+
+/****************************************************************************/
+/**
+*  @brief   Set Pin input type
+*
+*  This function sets input type of individual Pin
+*
+*/
+/****************************************************************************/
+static inline void chipcHw_setPinInputType(uint32_t pin,       /* Pin of type chipcHw_PIN_XXXXX */
+                                          chipcHw_PIN_INPUTTYPE_e inputType    /* Pin input type */
+    );
+
+/****************************************************************************/
+/**
+*  @brief   Retrieves a string representation of the mux setting for a pin.
+*
+*  @return  Pointer to a character string.
+*/
+/****************************************************************************/
+
+const char *chipcHw_getGpioPinFunctionStr(int pin);
+
+/****************************************************************************/
+/**  @brief issue warmReset
+ */
+/****************************************************************************/
+void chipcHw_reset(uint32_t mask);
+
+/****************************************************************************/
+/**  @brief clock reconfigure
+ */
+/****************************************************************************/
+void chipcHw_clockReconfig(uint32_t busHz, uint32_t armRatio, uint32_t vpmRatio,
+                          uint32_t ddrRatio);
+
+/****************************************************************************/
+/**
+*  @brief   Enable Spread Spectrum
+*
+*  @note chipcHw_Init() must be called earlier
+*/
+/****************************************************************************/
+static inline void chipcHw_enableSpreadSpectrum(void);
+
+/****************************************************************************/
+/**
+*  @brief   Disable Spread Spectrum
+*
+*/
+/****************************************************************************/
+static inline void chipcHw_disableSpreadSpectrum(void);
+
+/****************************************************************************/
+/**  @brief Checks if software strap is enabled
+ *
+ *   @return 1 : When enable
+ *           0 : When disable
+ */
+/****************************************************************************/
+static inline int chipcHw_isSoftwareStrapsEnable(void);
+
+/****************************************************************************/
+/**  @brief Enable software strap
+ */
+/****************************************************************************/
+static inline void chipcHw_softwareStrapsEnable(void);
+
+/****************************************************************************/
+/**  @brief Disable software strap
+ */
+/****************************************************************************/
+static inline void chipcHw_softwareStrapsDisable(void);
+
+/****************************************************************************/
+/**  @brief PLL test enable
+ */
+/****************************************************************************/
+static inline void chipcHw_pllTestEnable(void);
+
+/****************************************************************************/
+/**  @brief PLL2 test enable
+ */
+/****************************************************************************/
+static inline void chipcHw_pll2TestEnable(void);
+
+/****************************************************************************/
+/**  @brief PLL test disable
+ */
+/****************************************************************************/
+static inline void chipcHw_pllTestDisable(void);
+
+/****************************************************************************/
+/**  @brief PLL2 test disable
+ */
+/****************************************************************************/
+static inline void chipcHw_pll2TestDisable(void);
+
+/****************************************************************************/
+/**  @brief Get PLL test status
+ */
+/****************************************************************************/
+static inline int chipcHw_isPllTestEnable(void);
+
+/****************************************************************************/
+/**  @brief Get PLL2 test status
+ */
+/****************************************************************************/
+static inline int chipcHw_isPll2TestEnable(void);
+
+/****************************************************************************/
+/**  @brief PLL test select
+ */
+/****************************************************************************/
+static inline void chipcHw_pllTestSelect(uint32_t val);
+
+/****************************************************************************/
+/**  @brief PLL2 test select
+ */
+/****************************************************************************/
+static inline void chipcHw_pll2TestSelect(uint32_t val);
+
+/****************************************************************************/
+/**  @brief Get PLL test selected option
+ */
+/****************************************************************************/
+static inline uint8_t chipcHw_getPllTestSelected(void);
+
+/****************************************************************************/
+/**  @brief Get PLL2 test selected option
+ */
+/****************************************************************************/
+static inline uint8_t chipcHw_getPll2TestSelected(void);
+
+/****************************************************************************/
+/**
+*  @brief   Enables DDR SW phase alignment interrupt
+*/
+/****************************************************************************/
+static inline void chipcHw_ddrPhaseAlignInterruptEnable(void);
+
+/****************************************************************************/
+/**
+*  @brief   Disables DDR SW phase alignment interrupt
+*/
+/****************************************************************************/
+static inline void chipcHw_ddrPhaseAlignInterruptDisable(void);
+
+/****************************************************************************/
+/**
+*  @brief   Set VPM SW phase alignment interrupt mode
+*
+*  This function sets VPM phase alignment interrupt
+*
+*/
+/****************************************************************************/
+static inline void
+chipcHw_vpmPhaseAlignInterruptMode(chipcHw_VPM_HW_PHASE_INTR_e mode);
+
+/****************************************************************************/
+/**
+*  @brief   Enable DDR phase alignment in software
+*
+*/
+/****************************************************************************/
+static inline void chipcHw_ddrSwPhaseAlignEnable(void);
+
+/****************************************************************************/
+/**
+*  @brief   Disable DDR phase alignment in software
+*
+*/
+/****************************************************************************/
+static inline void chipcHw_ddrSwPhaseAlignDisable(void);
+
+/****************************************************************************/
+/**
+*  @brief   Enable DDR phase alignment in hardware
+*
+*/
+/****************************************************************************/
+static inline void chipcHw_ddrHwPhaseAlignEnable(void);
+
+/****************************************************************************/
+/**
+*  @brief   Disable DDR phase alignment in hardware
+*
+*/
+/****************************************************************************/
+static inline void chipcHw_ddrHwPhaseAlignDisable(void);
+
+/****************************************************************************/
+/**
+*  @brief   Enable VPM phase alignment in software
+*
+*/
+/****************************************************************************/
+static inline void chipcHw_vpmSwPhaseAlignEnable(void);
+
+/****************************************************************************/
+/**
+*  @brief   Disable VPM phase alignment in software
+*
+*/
+/****************************************************************************/
+static inline void chipcHw_vpmSwPhaseAlignDisable(void);
+
+/****************************************************************************/
+/**
+*  @brief   Enable VPM phase alignment in hardware
+*
+*/
+/****************************************************************************/
+static inline void chipcHw_vpmHwPhaseAlignEnable(void);
+
+/****************************************************************************/
+/**
+*  @brief   Disable VPM phase alignment in hardware
+*
+*/
+/****************************************************************************/
+static inline void chipcHw_vpmHwPhaseAlignDisable(void);
+
+/****************************************************************************/
+/**
+*  @brief   Set DDR phase alignment margin in hardware
+*
+*/
+/****************************************************************************/
+static inline void chipcHw_setDdrHwPhaseAlignMargin(chipcHw_DDR_HW_PHASE_MARGIN_e margin       /* Margin alinging DDR  phase */
+    );
+
+/****************************************************************************/
+/**
+*  @brief   Set VPM phase alignment margin in hardware
+*
+*/
+/****************************************************************************/
+static inline void chipcHw_setVpmHwPhaseAlignMargin(chipcHw_VPM_HW_PHASE_MARGIN_e margin       /* Margin alinging VPM  phase */
+    );
+
+/****************************************************************************/
+/**
+*  @brief   Checks DDR phase aligned status done by HW
+*
+*  @return  1: When aligned
+*           0: When not aligned
+*/
+/****************************************************************************/
+static inline uint32_t chipcHw_isDdrHwPhaseAligned(void);
+
+/****************************************************************************/
+/**
+*  @brief   Checks VPM phase aligned status done by HW
+*
+*  @return  1: When aligned
+*           0: When not aligned
+*/
+/****************************************************************************/
+static inline uint32_t chipcHw_isVpmHwPhaseAligned(void);
+
+/****************************************************************************/
+/**
+*  @brief   Get DDR phase aligned status done by HW
+*
+*/
+/****************************************************************************/
+static inline uint32_t chipcHw_getDdrHwPhaseAlignStatus(void);
+
+/****************************************************************************/
+/**
+*  @brief   Get VPM phase aligned status done by HW
+*
+*/
+/****************************************************************************/
+static inline uint32_t chipcHw_getVpmHwPhaseAlignStatus(void);
+
+/****************************************************************************/
+/**
+*  @brief   Get DDR phase control value
+*
+*/
+/****************************************************************************/
+static inline uint32_t chipcHw_getDdrPhaseControl(void);
+
+/****************************************************************************/
+/**
+*  @brief   Get VPM phase control value
+*
+*/
+/****************************************************************************/
+static inline uint32_t chipcHw_getVpmPhaseControl(void);
+
+/****************************************************************************/
+/**
+*  @brief   DDR phase alignment timeout count
+*
+*  @note    If HW fails to perform the phase alignment, it will trigger
+*           a DDR phase alignment timeout interrupt.
+*/
+/****************************************************************************/
+static inline void chipcHw_ddrHwPhaseAlignTimeout(uint32_t busCycle    /* Timeout in bus cycle */
+    );
+
+/****************************************************************************/
+/**
+*  @brief   VPM phase alignment timeout count
+*
+*  @note    If HW fails to perform the phase alignment, it will trigger
+*           a VPM phase alignment timeout interrupt.
+*/
+/****************************************************************************/
+static inline void chipcHw_vpmHwPhaseAlignTimeout(uint32_t busCycle    /* Timeout in bus cycle */
+    );
+
+/****************************************************************************/
+/**
+*  @brief   DDR phase alignment timeout interrupt enable
+*
+*/
+/****************************************************************************/
+static inline void chipcHw_ddrHwPhaseAlignTimeoutInterruptEnable(void);
+
+/****************************************************************************/
+/**
+*  @brief   VPM phase alignment timeout interrupt enable
+*
+*/
+/****************************************************************************/
+static inline void chipcHw_vpmHwPhaseAlignTimeoutInterruptEnable(void);
+
+/****************************************************************************/
+/**
+*  @brief   DDR phase alignment timeout interrupt disable
+*
+*/
+/****************************************************************************/
+static inline void chipcHw_ddrHwPhaseAlignTimeoutInterruptDisable(void);
+
+/****************************************************************************/
+/**
+*  @brief   VPM phase alignment timeout interrupt disable
+*
+*/
+/****************************************************************************/
+static inline void chipcHw_vpmHwPhaseAlignTimeoutInterruptDisable(void);
+
+/****************************************************************************/
+/**
+*  @brief   Clear DDR phase alignment timeout interrupt
+*
+*/
+/****************************************************************************/
+static inline void chipcHw_ddrHwPhaseAlignTimeoutInterruptClear(void);
+
+/****************************************************************************/
+/**
+*  @brief   Clear VPM phase alignment timeout interrupt
+*
+*/
+/****************************************************************************/
+static inline void chipcHw_vpmHwPhaseAlignTimeoutInterruptClear(void);
+
+/* ---- Private Constants and Types -------------------------------------- */
+
+#endif /* CHIPC_DEF_H */
diff --git a/arch/arm/mach-bcmring/include/mach/csp/chipcHw_inline.h b/arch/arm/mach-bcmring/include/mach/csp/chipcHw_inline.h
new file mode 100644 (file)
index 0000000..c78833a
--- /dev/null
@@ -0,0 +1,1673 @@
+/*****************************************************************************
+* Copyright 2003 - 2008 Broadcom Corporation.  All rights reserved.
+*
+* Unless you and Broadcom execute a separate written software license
+* agreement governing use of this software, this software is licensed to you
+* under the terms of the GNU General Public License version 2, available at
+* http://www.broadcom.com/licenses/GPLv2.php (the "GPL").
+*
+* Notwithstanding the above, under no circumstances may you combine this
+* software in any way with any other Broadcom software provided under a
+* license other than the GPL, without Broadcom's express prior written
+* consent.
+*****************************************************************************/
+
+#ifndef CHIPC_INLINE_H
+#define CHIPC_INLINE_H
+
+/* ---- Include Files ----------------------------------------------------- */
+
+#include <csp/errno.h>
+#include <csp/reg.h>
+#include <mach/csp/chipcHw_reg.h>
+#include <mach/csp/chipcHw_def.h>
+
+/* ---- Private Constants and Types --------------------------------------- */
+typedef enum {
+       chipcHw_OPTYPE_BYPASS,  /* Bypass operation */
+       chipcHw_OPTYPE_OUTPUT   /* Output operation */
+} chipcHw_OPTYPE_e;
+
+/* ---- Public Constants and Types ---------------------------------------- */
+/* ---- Public Variable Externs ------------------------------------------- */
+/* ---- Public Function Prototypes ---------------------------------------- */
+/* ---- Private Function Prototypes --------------------------------------- */
+static inline void chipcHw_setClock(chipcHw_CLOCK_e clock,
+                                   chipcHw_OPTYPE_e type, int mode);
+
+/****************************************************************************/
+/**
+*  @brief   Get Numeric Chip ID
+*
+*  This function returns Chip ID that includes the revison number
+*
+*  @return  Complete numeric Chip ID
+*
+*/
+/****************************************************************************/
+static inline uint32_t chipcHw_getChipId(void)
+{
+       return pChipcHw->ChipId;
+}
+
+/****************************************************************************/
+/**
+*  @brief   Enable Spread Spectrum
+*
+*  @note chipcHw_Init() must be called earlier
+*/
+/****************************************************************************/
+static inline void chipcHw_enableSpreadSpectrum(void)
+{
+       if ((pChipcHw->
+            PLLPreDivider & chipcHw_REG_PLL_PREDIVIDER_NDIV_MODE_MASK) !=
+           chipcHw_REG_PLL_PREDIVIDER_NDIV_MODE_INTEGER) {
+               ddrcReg_PHY_ADDR_CTL_REGP->ssCfg =
+                   (0xFFFF << ddrcReg_PHY_ADDR_SS_CFG_NDIV_AMPLITUDE_SHIFT) |
+                   (ddrcReg_PHY_ADDR_SS_CFG_MIN_CYCLE_PER_TICK <<
+                    ddrcReg_PHY_ADDR_SS_CFG_CYCLE_PER_TICK_SHIFT);
+               ddrcReg_PHY_ADDR_CTL_REGP->ssCtl |=
+                   ddrcReg_PHY_ADDR_SS_CTRL_ENABLE;
+       }
+}
+
+/****************************************************************************/
+/**
+*  @brief   Disable Spread Spectrum
+*
+*/
+/****************************************************************************/
+static inline void chipcHw_disableSpreadSpectrum(void)
+{
+       ddrcReg_PHY_ADDR_CTL_REGP->ssCtl &= ~ddrcReg_PHY_ADDR_SS_CTRL_ENABLE;
+}
+
+/****************************************************************************/
+/**
+*  @brief   Get Chip Product ID
+*
+*  This function returns Chip Product ID
+*
+*  @return  Chip Product ID
+*/
+/****************************************************************************/
+static inline uint32_t chipcHw_getChipProductId(void)
+{
+       return (pChipcHw->
+                ChipId & chipcHw_REG_CHIPID_BASE_MASK) >>
+               chipcHw_REG_CHIPID_BASE_SHIFT;
+}
+
+/****************************************************************************/
+/**
+*  @brief   Get revision number
+*
+*  This function returns revision number of the chip
+*
+*  @return  Revision number
+*/
+/****************************************************************************/
+static inline chipcHw_REV_NUMBER_e chipcHw_getChipRevisionNumber(void)
+{
+       return pChipcHw->ChipId & chipcHw_REG_CHIPID_REV_MASK;
+}
+
+/****************************************************************************/
+/**
+*  @brief   Enables bus interface clock
+*
+*  Enables  bus interface clock of various device
+*
+*  @return  void
+*
+*  @note    use chipcHw_REG_BUS_CLOCK_XXXX for mask
+*/
+/****************************************************************************/
+static inline void chipcHw_busInterfaceClockEnable(uint32_t mask)
+{
+       reg32_modify_or(&pChipcHw->BusIntfClock, mask);
+}
+
+/****************************************************************************/
+/**
+*  @brief   Disables bus interface clock
+*
+*  Disables  bus interface clock of various device
+*
+*  @return  void
+*
+*  @note    use chipcHw_REG_BUS_CLOCK_XXXX
+*/
+/****************************************************************************/
+static inline void chipcHw_busInterfaceClockDisable(uint32_t mask)
+{
+       reg32_modify_and(&pChipcHw->BusIntfClock, ~mask);
+}
+
+/****************************************************************************/
+/**
+*  @brief   Get status (enabled/disabled) of bus interface clock
+*
+*  This function returns the status of devices' bus interface clock
+*
+*  @return  Bus interface clock
+*
+*/
+/****************************************************************************/
+static inline uint32_t chipcHw_getBusInterfaceClockStatus(void)
+{
+       return pChipcHw->BusIntfClock;
+}
+
+/****************************************************************************/
+/**
+*  @brief   Enables various audio channels
+*
+*  Enables audio channel
+*
+*  @return  void
+*
+*  @note    use chipcHw_REG_AUDIO_CHANNEL_XXXXXX
+*/
+/****************************************************************************/
+static inline void chipcHw_audioChannelEnable(uint32_t mask)
+{
+       reg32_modify_or(&pChipcHw->AudioEnable, mask);
+}
+
+/****************************************************************************/
+/**
+*  @brief   Disables various audio channels
+*
+*  Disables audio channel
+*
+*  @return  void
+*
+*  @note    use chipcHw_REG_AUDIO_CHANNEL_XXXXXX
+*/
+/****************************************************************************/
+static inline void chipcHw_audioChannelDisable(uint32_t mask)
+{
+       reg32_modify_and(&pChipcHw->AudioEnable, ~mask);
+}
+
+/****************************************************************************/
+/**
+*  @brief    Soft resets devices
+*
+*  Soft resets various devices
+*
+*  @return   void
+*
+*  @note     use chipcHw_REG_SOFT_RESET_XXXXXX defines
+*/
+/****************************************************************************/
+static inline void chipcHw_softReset(uint64_t mask)
+{
+       chipcHw_softResetEnable(mask);
+       chipcHw_softResetDisable(mask);
+}
+
+static inline void chipcHw_softResetDisable(uint64_t mask)
+{
+       uint32_t ctrl1 = (uint32_t) mask;
+       uint32_t ctrl2 = (uint32_t) (mask >> 32);
+
+       /* Deassert module soft reset */
+       REG_LOCAL_IRQ_SAVE;
+       pChipcHw->SoftReset1 ^= ctrl1;
+       pChipcHw->SoftReset2 ^= (ctrl2 & (~chipcHw_REG_SOFT_RESET_UNHOLD_MASK));
+       REG_LOCAL_IRQ_RESTORE;
+}
+
+static inline void chipcHw_softResetEnable(uint64_t mask)
+{
+       uint32_t ctrl1 = (uint32_t) mask;
+       uint32_t ctrl2 = (uint32_t) (mask >> 32);
+       uint32_t unhold = 0;
+
+       REG_LOCAL_IRQ_SAVE;
+       pChipcHw->SoftReset1 |= ctrl1;
+       /* Mask out unhold request bits */
+       pChipcHw->SoftReset2 |= (ctrl2 & (~chipcHw_REG_SOFT_RESET_UNHOLD_MASK));
+
+       /* Process unhold requests */
+       if (ctrl2 & chipcHw_REG_SOFT_RESET_VPM_GLOBAL_UNHOLD) {
+               unhold = chipcHw_REG_SOFT_RESET_VPM_GLOBAL_HOLD;
+       }
+
+       if (ctrl2 & chipcHw_REG_SOFT_RESET_VPM_UNHOLD) {
+               unhold |= chipcHw_REG_SOFT_RESET_VPM_HOLD;
+       }
+
+       if (ctrl2 & chipcHw_REG_SOFT_RESET_ARM_UNHOLD) {
+               unhold |= chipcHw_REG_SOFT_RESET_ARM_HOLD;
+       }
+
+       if (unhold) {
+               /* Make sure unhold request is effective */
+               pChipcHw->SoftReset1 &= ~unhold;
+       }
+       REG_LOCAL_IRQ_RESTORE;
+}
+
+/****************************************************************************/
+/**
+*  @brief    Configures misc CHIP functionality
+*
+*  Configures CHIP functionality
+*
+*  @return   void
+*
+*  @note     use chipcHw_REG_MISC_CTRL_XXXXXX
+*/
+/****************************************************************************/
+static inline void chipcHw_miscControl(uint32_t mask)
+{
+       reg32_write(&pChipcHw->MiscCtrl, mask);
+}
+
+static inline void chipcHw_miscControlDisable(uint32_t mask)
+{
+       reg32_modify_and(&pChipcHw->MiscCtrl, ~mask);
+}
+
+static inline void chipcHw_miscControlEnable(uint32_t mask)
+{
+       reg32_modify_or(&pChipcHw->MiscCtrl, mask);
+}
+
+/****************************************************************************/
+/**
+*  @brief    Set OTP options
+*
+*  Set OTP options
+*
+*  @return   void
+*
+*  @note     use chipcHw_REG_OTP_XXXXXX
+*/
+/****************************************************************************/
+static inline void chipcHw_setOTPOption(uint64_t mask)
+{
+       uint32_t ctrl1 = (uint32_t) mask;
+       uint32_t ctrl2 = (uint32_t) (mask >> 32);
+
+       reg32_modify_or(&pChipcHw->SoftOTP1, ctrl1);
+       reg32_modify_or(&pChipcHw->SoftOTP2, ctrl2);
+}
+
+/****************************************************************************/
+/**
+*  @brief    Get sticky bits
+*
+*  @return   Sticky bit options of type chipcHw_REG_STICKY_XXXXXX
+*
+*/
+/****************************************************************************/
+static inline uint32_t chipcHw_getStickyBits(void)
+{
+       return pChipcHw->Sticky;
+}
+
+/****************************************************************************/
+/**
+*  @brief    Set sticky bits
+*
+*  @return   void
+*
+*  @note     use chipcHw_REG_STICKY_XXXXXX
+*/
+/****************************************************************************/
+static inline void chipcHw_setStickyBits(uint32_t mask)
+{
+       uint32_t bits = 0;
+
+       REG_LOCAL_IRQ_SAVE;
+       if (mask & chipcHw_REG_STICKY_POR_BROM) {
+               bits |= chipcHw_REG_STICKY_POR_BROM;
+       } else {
+               uint32_t sticky;
+               sticky = pChipcHw->Sticky;
+
+               if ((mask & chipcHw_REG_STICKY_BOOT_DONE)
+                   && (sticky & chipcHw_REG_STICKY_BOOT_DONE) == 0) {
+                       bits |= chipcHw_REG_STICKY_BOOT_DONE;
+               }
+               if ((mask & chipcHw_REG_STICKY_GENERAL_1)
+                   && (sticky & chipcHw_REG_STICKY_GENERAL_1) == 0) {
+                       bits |= chipcHw_REG_STICKY_GENERAL_1;
+               }
+               if ((mask & chipcHw_REG_STICKY_GENERAL_2)
+                   && (sticky & chipcHw_REG_STICKY_GENERAL_2) == 0) {
+                       bits |= chipcHw_REG_STICKY_GENERAL_2;
+               }
+               if ((mask & chipcHw_REG_STICKY_GENERAL_3)
+                   && (sticky & chipcHw_REG_STICKY_GENERAL_3) == 0) {
+                       bits |= chipcHw_REG_STICKY_GENERAL_3;
+               }
+               if ((mask & chipcHw_REG_STICKY_GENERAL_4)
+                   && (sticky & chipcHw_REG_STICKY_GENERAL_4) == 0) {
+                       bits |= chipcHw_REG_STICKY_GENERAL_4;
+               }
+               if ((mask & chipcHw_REG_STICKY_GENERAL_5)
+                   && (sticky & chipcHw_REG_STICKY_GENERAL_5) == 0) {
+                       bits |= chipcHw_REG_STICKY_GENERAL_5;
+               }
+       }
+       pChipcHw->Sticky = bits;
+       REG_LOCAL_IRQ_RESTORE;
+}
+
+/****************************************************************************/
+/**
+*  @brief    Clear sticky bits
+*
+*  @return   void
+*
+*  @note     use chipcHw_REG_STICKY_XXXXXX
+*/
+/****************************************************************************/
+static inline void chipcHw_clearStickyBits(uint32_t mask)
+{
+       uint32_t bits = 0;
+
+       REG_LOCAL_IRQ_SAVE;
+       if (mask &
+           (chipcHw_REG_STICKY_BOOT_DONE | chipcHw_REG_STICKY_GENERAL_1 |
+            chipcHw_REG_STICKY_GENERAL_2 | chipcHw_REG_STICKY_GENERAL_3 |
+            chipcHw_REG_STICKY_GENERAL_4 | chipcHw_REG_STICKY_GENERAL_5)) {
+               uint32_t sticky = pChipcHw->Sticky;
+
+               if ((mask & chipcHw_REG_STICKY_BOOT_DONE)
+                   && (sticky & chipcHw_REG_STICKY_BOOT_DONE)) {
+                       bits = chipcHw_REG_STICKY_BOOT_DONE;
+                       mask &= ~chipcHw_REG_STICKY_BOOT_DONE;
+               }
+               if ((mask & chipcHw_REG_STICKY_GENERAL_1)
+                   && (sticky & chipcHw_REG_STICKY_GENERAL_1)) {
+                       bits |= chipcHw_REG_STICKY_GENERAL_1;
+                       mask &= ~chipcHw_REG_STICKY_GENERAL_1;
+               }
+               if ((mask & chipcHw_REG_STICKY_GENERAL_2)
+                   && (sticky & chipcHw_REG_STICKY_GENERAL_2)) {
+                       bits |= chipcHw_REG_STICKY_GENERAL_2;
+                       mask &= ~chipcHw_REG_STICKY_GENERAL_2;
+               }
+               if ((mask & chipcHw_REG_STICKY_GENERAL_3)
+                   && (sticky & chipcHw_REG_STICKY_GENERAL_3)) {
+                       bits |= chipcHw_REG_STICKY_GENERAL_3;
+                       mask &= ~chipcHw_REG_STICKY_GENERAL_3;
+               }
+               if ((mask & chipcHw_REG_STICKY_GENERAL_4)
+                   && (sticky & chipcHw_REG_STICKY_GENERAL_4)) {
+                       bits |= chipcHw_REG_STICKY_GENERAL_4;
+                       mask &= ~chipcHw_REG_STICKY_GENERAL_4;
+               }
+               if ((mask & chipcHw_REG_STICKY_GENERAL_5)
+                   && (sticky & chipcHw_REG_STICKY_GENERAL_5)) {
+                       bits |= chipcHw_REG_STICKY_GENERAL_5;
+                       mask &= ~chipcHw_REG_STICKY_GENERAL_5;
+               }
+       }
+       pChipcHw->Sticky = bits | mask;
+       REG_LOCAL_IRQ_RESTORE;
+}
+
+/****************************************************************************/
+/**
+*  @brief    Get software strap value
+*
+*  Retrieves software strap value
+*
+*  @return   Software strap value
+*
+*/
+/****************************************************************************/
+static inline uint32_t chipcHw_getSoftStraps(void)
+{
+       return pChipcHw->SoftStraps;
+}
+
+/****************************************************************************/
+/**
+*  @brief    Set software override strap options
+*
+*  set software override strap options
+*
+*  @return   nothing
+*
+*/
+/****************************************************************************/
+static inline void chipcHw_setSoftStraps(uint32_t strapOptions)
+{
+       reg32_write(&pChipcHw->SoftStraps, strapOptions);
+}
+
+/****************************************************************************/
+/**
+*  @brief   Get Pin Strap Options
+*
+*  This function returns the raw boot strap options
+*
+*  @return  strap options
+*
+*/
+/****************************************************************************/
+static inline uint32_t chipcHw_getPinStraps(void)
+{
+       return pChipcHw->PinStraps;
+}
+
+/****************************************************************************/
+/**
+*  @brief   Get Valid Strap Options
+*
+*  This function returns the valid raw boot strap options
+*
+*  @return  strap options
+*
+*/
+/****************************************************************************/
+static inline uint32_t chipcHw_getValidStraps(void)
+{
+       uint32_t softStraps;
+
+       /*
+        ** Always return the SoftStraps - bootROM calls chipcHw_initValidStraps
+        ** which copies HW straps to soft straps if there is no override
+        */
+       softStraps = chipcHw_getSoftStraps();
+
+       return softStraps;
+}
+
+/****************************************************************************/
+/**
+*  @brief    Initialize valid pin strap options
+*
+*  Retrieves valid pin strap options by copying HW strap options to soft register
+*  (if chipcHw_STRAPS_SOFT_OVERRIDE not set)
+*
+*  @return   nothing
+*
+*/
+/****************************************************************************/
+static inline void chipcHw_initValidStraps(void)
+{
+       uint32_t softStraps;
+
+       REG_LOCAL_IRQ_SAVE;
+       softStraps = chipcHw_getSoftStraps();
+
+       if ((softStraps & chipcHw_STRAPS_SOFT_OVERRIDE) == 0) {
+               /* Copy HW straps to software straps */
+               chipcHw_setSoftStraps(chipcHw_getPinStraps());
+       }
+       REG_LOCAL_IRQ_RESTORE;
+}
+
+/****************************************************************************/
+/**
+*  @brief   Get boot device
+*
+*  This function returns the device type used in booting the system
+*
+*  @return  Boot device of type chipcHw_BOOT_DEVICE
+*
+*/
+/****************************************************************************/
+static inline chipcHw_BOOT_DEVICE_e chipcHw_getBootDevice(void)
+{
+       return chipcHw_getValidStraps() & chipcHw_STRAPS_BOOT_DEVICE_MASK;
+}
+
+/****************************************************************************/
+/**
+*  @brief   Get boot mode
+*
+*  This function returns the way the system was booted
+*
+*  @return  Boot mode of type chipcHw_BOOT_MODE
+*
+*/
+/****************************************************************************/
+static inline chipcHw_BOOT_MODE_e chipcHw_getBootMode(void)
+{
+       return chipcHw_getValidStraps() & chipcHw_STRAPS_BOOT_MODE_MASK;
+}
+
+/****************************************************************************/
+/**
+*  @brief   Get NAND flash page size
+*
+*  This function returns the NAND device page size
+*
+*  @return  Boot NAND device page size
+*
+*/
+/****************************************************************************/
+static inline chipcHw_NAND_PAGESIZE_e chipcHw_getNandPageSize(void)
+{
+       return chipcHw_getValidStraps() & chipcHw_STRAPS_NAND_PAGESIZE_MASK;
+}
+
+/****************************************************************************/
+/**
+*  @brief   Get NAND flash address cycle configuration
+*
+*  This function returns the NAND flash address cycle configuration
+*
+*  @return  0 = Do not extra address cycle, 1 = Add extra cycle
+*
+*/
+/****************************************************************************/
+static inline int chipcHw_getNandExtraCycle(void)
+{
+       if (chipcHw_getValidStraps() & chipcHw_STRAPS_NAND_EXTRA_CYCLE) {
+               return 1;
+       } else {
+               return 0;
+       }
+}
+
+/****************************************************************************/
+/**
+*  @brief   Activates PIF interface
+*
+*  This function activates PIF interface by taking control of LCD pins
+*
+*  @note
+*       When activated, LCD pins will be defined as follows for PIF operation
+*
+*       CLD[17:0]  = pif_data[17:0]
+*       CLD[23:18] = pif_address[5:0]
+*       CLPOWER    = pif_wr_str
+*       CLCP       = pif_rd_str
+*       CLAC       = pif_hat1
+*       CLFP       = pif_hrdy1
+*       CLLP       = pif_hat2
+*       GPIO[42]   = pif_hrdy2
+*
+*       In PIF mode, "pif_hrdy2" overrides other shared function for GPIO[42] pin
+*
+*/
+/****************************************************************************/
+static inline void chipcHw_activatePifInterface(void)
+{
+       reg32_write(&pChipcHw->LcdPifMode, chipcHw_REG_PIF_PIN_ENABLE);
+}
+
+/****************************************************************************/
+/**
+*  @brief   Activates LCD interface
+*
+*  This function activates LCD interface
+*
+*  @note
+*       When activated, LCD pins will be defined as follows
+*
+*       CLD[17:0]  = LCD data
+*       CLD[23:18] = LCD data
+*       CLPOWER    = LCD power
+*       CLCP       =
+*       CLAC       = LCD ack
+*       CLFP       =
+*       CLLP       =
+*/
+/****************************************************************************/
+static inline void chipcHw_activateLcdInterface(void)
+{
+       reg32_write(&pChipcHw->LcdPifMode, chipcHw_REG_LCD_PIN_ENABLE);
+}
+
+/****************************************************************************/
+/**
+*  @brief   Deactivates PIF/LCD interface
+*
+*  This function deactivates PIF/LCD interface
+*
+*  @note
+*       When deactivated LCD pins will be in rti-stated
+*
+*/
+/****************************************************************************/
+static inline void chipcHw_deactivatePifLcdInterface(void)
+{
+       reg32_write(&pChipcHw->LcdPifMode, 0);
+}
+
+/****************************************************************************/
+/**
+*  @brief   Select GE2
+*
+*  This function select GE2 as the graphic engine
+*
+*/
+/****************************************************************************/
+static inline void chipcHw_selectGE2(void)
+{
+       reg32_modify_and(&pChipcHw->MiscCtrl, ~chipcHw_REG_MISC_CTRL_GE_SEL);
+}
+
+/****************************************************************************/
+/**
+*  @brief   Select GE3
+*
+*  This function select GE3 as the graphic engine
+*
+*/
+/****************************************************************************/
+static inline void chipcHw_selectGE3(void)
+{
+       reg32_modify_or(&pChipcHw->MiscCtrl, chipcHw_REG_MISC_CTRL_GE_SEL);
+}
+
+/****************************************************************************/
+/**
+*  @brief   Get to know the configuration of GPIO pin
+*
+*/
+/****************************************************************************/
+static inline chipcHw_GPIO_FUNCTION_e chipcHw_getGpioPinFunction(int pin)
+{
+       return (*((uint32_t *) chipcHw_REG_GPIO_MUX(pin)) &
+               (chipcHw_REG_GPIO_MUX_MASK <<
+                chipcHw_REG_GPIO_MUX_POSITION(pin))) >>
+           chipcHw_REG_GPIO_MUX_POSITION(pin);
+}
+
+/****************************************************************************/
+/**
+*  @brief   Configure GPIO pin function
+*
+*/
+/****************************************************************************/
+static inline void chipcHw_setGpioPinFunction(int pin,
+                                             chipcHw_GPIO_FUNCTION_e func)
+{
+       REG_LOCAL_IRQ_SAVE;
+       *((uint32_t *) chipcHw_REG_GPIO_MUX(pin)) &=
+           ~(chipcHw_REG_GPIO_MUX_MASK << chipcHw_REG_GPIO_MUX_POSITION(pin));
+       *((uint32_t *) chipcHw_REG_GPIO_MUX(pin)) |=
+           func << chipcHw_REG_GPIO_MUX_POSITION(pin);
+       REG_LOCAL_IRQ_RESTORE;
+}
+
+/****************************************************************************/
+/**
+*  @brief   Set Pin slew rate
+*
+*  This function sets the slew of individual pin
+*
+*/
+/****************************************************************************/
+static inline void chipcHw_setPinSlewRate(uint32_t pin,
+                                         chipcHw_PIN_SLEW_RATE_e slewRate)
+{
+       REG_LOCAL_IRQ_SAVE;
+       *((uint32_t *) chipcHw_REG_SLEW_RATE(pin)) &=
+           ~(chipcHw_REG_SLEW_RATE_MASK <<
+             chipcHw_REG_SLEW_RATE_POSITION(pin));
+       *((uint32_t *) chipcHw_REG_SLEW_RATE(pin)) |=
+           (uint32_t) slewRate << chipcHw_REG_SLEW_RATE_POSITION(pin);
+       REG_LOCAL_IRQ_RESTORE;
+}
+
+/****************************************************************************/
+/**
+*  @brief   Set Pin output drive current
+*
+*  This function sets output drive current of individual pin
+*
+*  Note: Avoid the use of the word 'current' since linux headers define this
+*        to be the current task.
+*/
+/****************************************************************************/
+static inline void chipcHw_setPinOutputCurrent(uint32_t pin,
+                                              chipcHw_PIN_CURRENT_STRENGTH_e
+                                              curr)
+{
+       REG_LOCAL_IRQ_SAVE;
+       *((uint32_t *) chipcHw_REG_CURRENT(pin)) &=
+           ~(chipcHw_REG_CURRENT_MASK << chipcHw_REG_CURRENT_POSITION(pin));
+       *((uint32_t *) chipcHw_REG_CURRENT(pin)) |=
+           (uint32_t) curr << chipcHw_REG_CURRENT_POSITION(pin);
+       REG_LOCAL_IRQ_RESTORE;
+}
+
+/****************************************************************************/
+/**
+*  @brief   Set Pin pullup register
+*
+*  This function sets pullup register of individual pin
+*
+*/
+/****************************************************************************/
+static inline void chipcHw_setPinPullup(uint32_t pin, chipcHw_PIN_PULL_e pullup)
+{
+       REG_LOCAL_IRQ_SAVE;
+       *((uint32_t *) chipcHw_REG_PULLUP(pin)) &=
+           ~(chipcHw_REG_PULLUP_MASK << chipcHw_REG_PULLUP_POSITION(pin));
+       *((uint32_t *) chipcHw_REG_PULLUP(pin)) |=
+           (uint32_t) pullup << chipcHw_REG_PULLUP_POSITION(pin);
+       REG_LOCAL_IRQ_RESTORE;
+}
+
+/****************************************************************************/
+/**
+*  @brief   Set Pin input type
+*
+*  This function sets input type of individual pin
+*
+*/
+/****************************************************************************/
+static inline void chipcHw_setPinInputType(uint32_t pin,
+                                          chipcHw_PIN_INPUTTYPE_e inputType)
+{
+       REG_LOCAL_IRQ_SAVE;
+       *((uint32_t *) chipcHw_REG_INPUTTYPE(pin)) &=
+           ~(chipcHw_REG_INPUTTYPE_MASK <<
+             chipcHw_REG_INPUTTYPE_POSITION(pin));
+       *((uint32_t *) chipcHw_REG_INPUTTYPE(pin)) |=
+           (uint32_t) inputType << chipcHw_REG_INPUTTYPE_POSITION(pin);
+       REG_LOCAL_IRQ_RESTORE;
+}
+
+/****************************************************************************/
+/**
+*  @brief   Power up the USB PHY
+*
+*  This function powers up the USB PHY
+*
+*/
+/****************************************************************************/
+static inline void chipcHw_powerUpUsbPhy(void)
+{
+       reg32_modify_and(&pChipcHw->MiscCtrl,
+                        chipcHw_REG_MISC_CTRL_USB_POWERON);
+}
+
+/****************************************************************************/
+/**
+*  @brief   Power down the USB PHY
+*
+*  This function powers down the USB PHY
+*
+*/
+/****************************************************************************/
+static inline void chipcHw_powerDownUsbPhy(void)
+{
+       reg32_modify_or(&pChipcHw->MiscCtrl,
+                       chipcHw_REG_MISC_CTRL_USB_POWEROFF);
+}
+
+/****************************************************************************/
+/**
+*  @brief   Set the 2nd USB as host
+*
+*  This function sets the 2nd USB as host
+*
+*/
+/****************************************************************************/
+static inline void chipcHw_setUsbHost(void)
+{
+       reg32_modify_or(&pChipcHw->MiscCtrl,
+                       chipcHw_REG_MISC_CTRL_USB_MODE_HOST);
+}
+
+/****************************************************************************/
+/**
+*  @brief   Set the 2nd USB as device
+*
+*  This function sets the 2nd USB as device
+*
+*/
+/****************************************************************************/
+static inline void chipcHw_setUsbDevice(void)
+{
+       reg32_modify_and(&pChipcHw->MiscCtrl,
+                        chipcHw_REG_MISC_CTRL_USB_MODE_DEVICE);
+}
+
+/****************************************************************************/
+/**
+*  @brief   Lower layer funtion to enable/disable a clock of a certain device
+*
+*  This function enables/disables a core clock
+*
+*/
+/****************************************************************************/
+static inline void chipcHw_setClock(chipcHw_CLOCK_e clock,
+                                   chipcHw_OPTYPE_e type, int mode)
+{
+       volatile uint32_t *pPLLReg = (uint32_t *) 0x0;
+       volatile uint32_t *pClockCtrl = (uint32_t *) 0x0;
+
+       switch (clock) {
+       case chipcHw_CLOCK_DDR:
+               pPLLReg = &pChipcHw->DDRClock;
+               break;
+       case chipcHw_CLOCK_ARM:
+               pPLLReg = &pChipcHw->ARMClock;
+               break;
+       case chipcHw_CLOCK_ESW:
+               pPLLReg = &pChipcHw->ESWClock;
+               break;
+       case chipcHw_CLOCK_VPM:
+               pPLLReg = &pChipcHw->VPMClock;
+               break;
+       case chipcHw_CLOCK_ESW125:
+               pPLLReg = &pChipcHw->ESW125Clock;
+               break;
+       case chipcHw_CLOCK_UART:
+               pPLLReg = &pChipcHw->UARTClock;
+               break;
+       case chipcHw_CLOCK_SDIO0:
+               pPLLReg = &pChipcHw->SDIO0Clock;
+               break;
+       case chipcHw_CLOCK_SDIO1:
+               pPLLReg = &pChipcHw->SDIO1Clock;
+               break;
+       case chipcHw_CLOCK_SPI:
+               pPLLReg = &pChipcHw->SPIClock;
+               break;
+       case chipcHw_CLOCK_ETM:
+               pPLLReg = &pChipcHw->ETMClock;
+               break;
+       case chipcHw_CLOCK_USB:
+               pPLLReg = &pChipcHw->USBClock;
+               if (type == chipcHw_OPTYPE_OUTPUT) {
+                       if (mode) {
+                               reg32_modify_and(pPLLReg,
+                                                ~chipcHw_REG_PLL_CLOCK_POWER_DOWN);
+                       } else {
+                               reg32_modify_or(pPLLReg,
+                                               chipcHw_REG_PLL_CLOCK_POWER_DOWN);
+                       }
+               }
+               break;
+       case chipcHw_CLOCK_LCD:
+               pPLLReg = &pChipcHw->LCDClock;
+               if (type == chipcHw_OPTYPE_OUTPUT) {
+                       if (mode) {
+                               reg32_modify_and(pPLLReg,
+                                                ~chipcHw_REG_PLL_CLOCK_POWER_DOWN);
+                       } else {
+                               reg32_modify_or(pPLLReg,
+                                               chipcHw_REG_PLL_CLOCK_POWER_DOWN);
+                       }
+               }
+               break;
+       case chipcHw_CLOCK_APM:
+               pPLLReg = &pChipcHw->APMClock;
+               if (type == chipcHw_OPTYPE_OUTPUT) {
+                       if (mode) {
+                               reg32_modify_and(pPLLReg,
+                                                ~chipcHw_REG_PLL_CLOCK_POWER_DOWN);
+                       } else {
+                               reg32_modify_or(pPLLReg,
+                                               chipcHw_REG_PLL_CLOCK_POWER_DOWN);
+                       }
+               }
+               break;
+       case chipcHw_CLOCK_BUS:
+               pClockCtrl = &pChipcHw->ACLKClock;
+               break;
+       case chipcHw_CLOCK_OTP:
+               pClockCtrl = &pChipcHw->OTPClock;
+               break;
+       case chipcHw_CLOCK_I2C:
+               pClockCtrl = &pChipcHw->I2CClock;
+               break;
+       case chipcHw_CLOCK_I2S0:
+               pClockCtrl = &pChipcHw->I2S0Clock;
+               break;
+       case chipcHw_CLOCK_RTBUS:
+               pClockCtrl = &pChipcHw->RTBUSClock;
+               break;
+       case chipcHw_CLOCK_APM100:
+               pClockCtrl = &pChipcHw->APM100Clock;
+               break;
+       case chipcHw_CLOCK_TSC:
+               pClockCtrl = &pChipcHw->TSCClock;
+               break;
+       case chipcHw_CLOCK_LED:
+               pClockCtrl = &pChipcHw->LEDClock;
+               break;
+       case chipcHw_CLOCK_I2S1:
+               pClockCtrl = &pChipcHw->I2S1Clock;
+               break;
+       }
+
+       if (pPLLReg) {
+               switch (type) {
+               case chipcHw_OPTYPE_OUTPUT:
+                       /* PLL clock output enable/disable */
+                       if (mode) {
+                               if (clock == chipcHw_CLOCK_DDR) {
+                                       /* DDR clock enable is inverted */
+                                       reg32_modify_and(pPLLReg,
+                                                        ~chipcHw_REG_PLL_CLOCK_OUTPUT_ENABLE);
+                               } else {
+                                       reg32_modify_or(pPLLReg,
+                                                       chipcHw_REG_PLL_CLOCK_OUTPUT_ENABLE);
+                               }
+                       } else {
+                               if (clock == chipcHw_CLOCK_DDR) {
+                                       /* DDR clock disable is inverted */
+                                       reg32_modify_or(pPLLReg,
+                                                       chipcHw_REG_PLL_CLOCK_OUTPUT_ENABLE);
+                               } else {
+                                       reg32_modify_and(pPLLReg,
+                                                        ~chipcHw_REG_PLL_CLOCK_OUTPUT_ENABLE);
+                               }
+                       }
+                       break;
+               case chipcHw_OPTYPE_BYPASS:
+                       /* PLL clock bypass enable/disable */
+                       if (mode) {
+                               reg32_modify_or(pPLLReg,
+                                               chipcHw_REG_PLL_CLOCK_BYPASS_SELECT);
+                       } else {
+                               reg32_modify_and(pPLLReg,
+                                                ~chipcHw_REG_PLL_CLOCK_BYPASS_SELECT);
+                       }
+                       break;
+               }
+       } else if (pClockCtrl) {
+               switch (type) {
+               case chipcHw_OPTYPE_OUTPUT:
+                       if (mode) {
+                               reg32_modify_or(pClockCtrl,
+                                               chipcHw_REG_DIV_CLOCK_OUTPUT_ENABLE);
+                       } else {
+                               reg32_modify_and(pClockCtrl,
+                                                ~chipcHw_REG_DIV_CLOCK_OUTPUT_ENABLE);
+                       }
+                       break;
+               case chipcHw_OPTYPE_BYPASS:
+                       if (mode) {
+                               reg32_modify_or(pClockCtrl,
+                                               chipcHw_REG_DIV_CLOCK_BYPASS_SELECT);
+                       } else {
+                               reg32_modify_and(pClockCtrl,
+                                                ~chipcHw_REG_DIV_CLOCK_BYPASS_SELECT);
+                       }
+                       break;
+               }
+       }
+}
+
+/****************************************************************************/
+/**
+*  @brief   Disables a core clock of a certain device
+*
+*  This function disables a core clock
+*
+*  @note    no change in power consumption
+*/
+/****************************************************************************/
+static inline void chipcHw_setClockDisable(chipcHw_CLOCK_e clock)
+{
+
+       /* Disable output of the clock */
+       chipcHw_setClock(clock, chipcHw_OPTYPE_OUTPUT, 0);
+}
+
+/****************************************************************************/
+/**
+*  @brief   Enable a core clock of a certain device
+*
+*  This function enables a core clock
+*
+*  @note    no change in power consumption
+*/
+/****************************************************************************/
+static inline void chipcHw_setClockEnable(chipcHw_CLOCK_e clock)
+{
+
+       /* Enable output of the clock */
+       chipcHw_setClock(clock, chipcHw_OPTYPE_OUTPUT, 1);
+}
+
+/****************************************************************************/
+/**
+*  @brief   Enables bypass clock of a certain device
+*
+*  This function enables bypass clock
+*
+*  @note    Doesnot affect the bus interface clock
+*/
+/****************************************************************************/
+static inline void chipcHw_bypassClockEnable(chipcHw_CLOCK_e clock)
+{
+       /* Enable bypass clock */
+       chipcHw_setClock(clock, chipcHw_OPTYPE_BYPASS, 1);
+}
+
+/****************************************************************************/
+/**
+*  @brief   Disabled bypass clock of a certain device
+*
+*  This function disables bypass clock
+*
+*  @note    Doesnot affect the bus interface clock
+*/
+/****************************************************************************/
+static inline void chipcHw_bypassClockDisable(chipcHw_CLOCK_e clock)
+{
+       /* Disable bypass clock */
+       chipcHw_setClock(clock, chipcHw_OPTYPE_BYPASS, 0);
+
+}
+
+/****************************************************************************/
+/**  @brief Checks if software strap is enabled
+ *
+ *   @return 1 : When enable
+ *           0 : When disable
+ */
+/****************************************************************************/
+static inline int chipcHw_isSoftwareStrapsEnable(void)
+{
+       return pChipcHw->SoftStraps & 0x00000001;
+}
+
+/****************************************************************************/
+/**  @brief Enable software strap
+ */
+/****************************************************************************/
+static inline void chipcHw_softwareStrapsEnable(void)
+{
+       reg32_modify_or(&pChipcHw->SoftStraps, 0x00000001);
+}
+
+/****************************************************************************/
+/**  @brief Disable software strap
+ */
+/****************************************************************************/
+static inline void chipcHw_softwareStrapsDisable(void)
+{
+       reg32_modify_and(&pChipcHw->SoftStraps, (~0x00000001));
+}
+
+/****************************************************************************/
+/**  @brief PLL test enable
+ */
+/****************************************************************************/
+static inline void chipcHw_pllTestEnable(void)
+{
+       reg32_modify_or(&pChipcHw->PLLConfig,
+                       chipcHw_REG_PLL_CONFIG_TEST_ENABLE);
+}
+
+/****************************************************************************/
+/**  @brief PLL2 test enable
+ */
+/****************************************************************************/
+static inline void chipcHw_pll2TestEnable(void)
+{
+       reg32_modify_or(&pChipcHw->PLLConfig2,
+                       chipcHw_REG_PLL_CONFIG_TEST_ENABLE);
+}
+
+/****************************************************************************/
+/**  @brief PLL test disable
+ */
+/****************************************************************************/
+static inline void chipcHw_pllTestDisable(void)
+{
+       reg32_modify_and(&pChipcHw->PLLConfig,
+                        ~chipcHw_REG_PLL_CONFIG_TEST_ENABLE);
+}
+
+/****************************************************************************/
+/**  @brief PLL2 test disable
+ */
+/****************************************************************************/
+static inline void chipcHw_pll2TestDisable(void)
+{
+       reg32_modify_and(&pChipcHw->PLLConfig2,
+                        ~chipcHw_REG_PLL_CONFIG_TEST_ENABLE);
+}
+
+/****************************************************************************/
+/**  @brief Get PLL test status
+ */
+/****************************************************************************/
+static inline int chipcHw_isPllTestEnable(void)
+{
+       return pChipcHw->PLLConfig & chipcHw_REG_PLL_CONFIG_TEST_ENABLE;
+}
+
+/****************************************************************************/
+/**  @brief Get PLL2 test status
+ */
+/****************************************************************************/
+static inline int chipcHw_isPll2TestEnable(void)
+{
+       return pChipcHw->PLLConfig2 & chipcHw_REG_PLL_CONFIG_TEST_ENABLE;
+}
+
+/****************************************************************************/
+/**  @brief PLL test select
+ */
+/****************************************************************************/
+static inline void chipcHw_pllTestSelect(uint32_t val)
+{
+       REG_LOCAL_IRQ_SAVE;
+       pChipcHw->PLLConfig &= ~chipcHw_REG_PLL_CONFIG_TEST_SELECT_MASK;
+       pChipcHw->PLLConfig |=
+           (val) << chipcHw_REG_PLL_CONFIG_TEST_SELECT_SHIFT;
+       REG_LOCAL_IRQ_RESTORE;
+}
+
+/****************************************************************************/
+/**  @brief PLL2 test select
+ */
+/****************************************************************************/
+static inline void chipcHw_pll2TestSelect(uint32_t val)
+{
+
+       REG_LOCAL_IRQ_SAVE;
+       pChipcHw->PLLConfig2 &= ~chipcHw_REG_PLL_CONFIG_TEST_SELECT_MASK;
+       pChipcHw->PLLConfig2 |=
+           (val) << chipcHw_REG_PLL_CONFIG_TEST_SELECT_SHIFT;
+       REG_LOCAL_IRQ_RESTORE;
+}
+
+/****************************************************************************/
+/**  @brief Get PLL test selected option
+ */
+/****************************************************************************/
+static inline uint8_t chipcHw_getPllTestSelected(void)
+{
+       return (uint8_t) ((pChipcHw->
+                          PLLConfig & chipcHw_REG_PLL_CONFIG_TEST_SELECT_MASK)
+                         >> chipcHw_REG_PLL_CONFIG_TEST_SELECT_SHIFT);
+}
+
+/****************************************************************************/
+/**  @brief Get PLL2 test selected option
+ */
+/****************************************************************************/
+static inline uint8_t chipcHw_getPll2TestSelected(void)
+{
+       return (uint8_t) ((pChipcHw->
+                          PLLConfig2 & chipcHw_REG_PLL_CONFIG_TEST_SELECT_MASK)
+                         >> chipcHw_REG_PLL_CONFIG_TEST_SELECT_SHIFT);
+}
+
+/****************************************************************************/
+/**
+*  @brief  Disable the PLL1
+*
+*/
+/****************************************************************************/
+static inline void chipcHw_pll1Disable(void)
+{
+       REG_LOCAL_IRQ_SAVE;
+       pChipcHw->PLLConfig |= chipcHw_REG_PLL_CONFIG_POWER_DOWN;
+       REG_LOCAL_IRQ_RESTORE;
+}
+
+/****************************************************************************/
+/**
+*  @brief  Disable the PLL2
+*
+*/
+/****************************************************************************/
+static inline void chipcHw_pll2Disable(void)
+{
+       REG_LOCAL_IRQ_SAVE;
+       pChipcHw->PLLConfig2 |= chipcHw_REG_PLL_CONFIG_POWER_DOWN;
+       REG_LOCAL_IRQ_RESTORE;
+}
+
+/****************************************************************************/
+/**
+*  @brief   Enables DDR SW phase alignment interrupt
+*/
+/****************************************************************************/
+static inline void chipcHw_ddrPhaseAlignInterruptEnable(void)
+{
+       REG_LOCAL_IRQ_SAVE;
+       pChipcHw->Spare1 |= chipcHw_REG_SPARE1_DDR_PHASE_INTR_ENABLE;
+       REG_LOCAL_IRQ_RESTORE;
+}
+
+/****************************************************************************/
+/**
+*  @brief   Disables DDR SW phase alignment interrupt
+*/
+/****************************************************************************/
+static inline void chipcHw_ddrPhaseAlignInterruptDisable(void)
+{
+       REG_LOCAL_IRQ_SAVE;
+       pChipcHw->Spare1 &= ~chipcHw_REG_SPARE1_DDR_PHASE_INTR_ENABLE;
+       REG_LOCAL_IRQ_RESTORE;
+}
+
+/****************************************************************************/
+/**
+*  @brief   Set VPM SW phase alignment interrupt mode
+*
+*  This function sets VPM phase alignment interrupt
+*/
+/****************************************************************************/
+static inline void
+chipcHw_vpmPhaseAlignInterruptMode(chipcHw_VPM_HW_PHASE_INTR_e mode)
+{
+       REG_LOCAL_IRQ_SAVE;
+       if (mode == chipcHw_VPM_HW_PHASE_INTR_DISABLE) {
+               pChipcHw->Spare1 &= ~chipcHw_REG_SPARE1_VPM_PHASE_INTR_ENABLE;
+       } else {
+               pChipcHw->Spare1 |= chipcHw_REG_SPARE1_VPM_PHASE_INTR_ENABLE;
+       }
+       pChipcHw->VPMPhaseCtrl2 =
+           (pChipcHw->
+            VPMPhaseCtrl2 & ~(chipcHw_REG_VPM_INTR_SELECT_MASK <<
+                              chipcHw_REG_VPM_INTR_SELECT_SHIFT)) | mode;
+       REG_LOCAL_IRQ_RESTORE;
+}
+
+/****************************************************************************/
+/**
+*  @brief   Enable DDR phase alignment in software
+*
+*/
+/****************************************************************************/
+static inline void chipcHw_ddrSwPhaseAlignEnable(void)
+{
+       REG_LOCAL_IRQ_SAVE;
+       pChipcHw->DDRPhaseCtrl1 |= chipcHw_REG_DDR_SW_PHASE_CTRL_ENABLE;
+       REG_LOCAL_IRQ_RESTORE;
+}
+
+/****************************************************************************/
+/**
+*  @brief   Disable DDR phase alignment in software
+*
+*/
+/****************************************************************************/
+static inline void chipcHw_ddrSwPhaseAlignDisable(void)
+{
+       REG_LOCAL_IRQ_SAVE;
+       pChipcHw->DDRPhaseCtrl1 &= ~chipcHw_REG_DDR_SW_PHASE_CTRL_ENABLE;
+       REG_LOCAL_IRQ_RESTORE;
+}
+
+/****************************************************************************/
+/**
+*  @brief   Enable DDR phase alignment in hardware
+*
+*/
+/****************************************************************************/
+static inline void chipcHw_ddrHwPhaseAlignEnable(void)
+{
+       REG_LOCAL_IRQ_SAVE;
+       pChipcHw->DDRPhaseCtrl1 |= chipcHw_REG_DDR_HW_PHASE_CTRL_ENABLE;
+       REG_LOCAL_IRQ_RESTORE;
+}
+
+/****************************************************************************/
+/**
+*  @brief   Disable DDR phase alignment in hardware
+*
+*/
+/****************************************************************************/
+static inline void chipcHw_ddrHwPhaseAlignDisable(void)
+{
+       REG_LOCAL_IRQ_SAVE;
+       pChipcHw->DDRPhaseCtrl1 &= ~chipcHw_REG_DDR_HW_PHASE_CTRL_ENABLE;
+       REG_LOCAL_IRQ_RESTORE;
+}
+
+/****************************************************************************/
+/**
+*  @brief   Enable VPM phase alignment in software
+*
+*/
+/****************************************************************************/
+static inline void chipcHw_vpmSwPhaseAlignEnable(void)
+{
+       REG_LOCAL_IRQ_SAVE;
+       pChipcHw->VPMPhaseCtrl1 |= chipcHw_REG_VPM_SW_PHASE_CTRL_ENABLE;
+       REG_LOCAL_IRQ_RESTORE;
+}
+
+/****************************************************************************/
+/**
+*  @brief   Disable VPM phase alignment in software
+*
+*/
+/****************************************************************************/
+static inline void chipcHw_vpmSwPhaseAlignDisable(void)
+{
+       REG_LOCAL_IRQ_SAVE;
+       pChipcHw->VPMPhaseCtrl1 &= ~chipcHw_REG_VPM_SW_PHASE_CTRL_ENABLE;
+       REG_LOCAL_IRQ_RESTORE;
+}
+
+/****************************************************************************/
+/**
+*  @brief   Enable VPM phase alignment in hardware
+*
+*/
+/****************************************************************************/
+static inline void chipcHw_vpmHwPhaseAlignEnable(void)
+{
+       REG_LOCAL_IRQ_SAVE;
+       pChipcHw->VPMPhaseCtrl1 |= chipcHw_REG_VPM_HW_PHASE_CTRL_ENABLE;
+       REG_LOCAL_IRQ_RESTORE;
+}
+
+/****************************************************************************/
+/**
+*  @brief   Disable VPM phase alignment in hardware
+*
+*/
+/****************************************************************************/
+static inline void chipcHw_vpmHwPhaseAlignDisable(void)
+{
+       REG_LOCAL_IRQ_SAVE;
+       pChipcHw->VPMPhaseCtrl1 &= ~chipcHw_REG_VPM_HW_PHASE_CTRL_ENABLE;
+       REG_LOCAL_IRQ_RESTORE;
+}
+
+/****************************************************************************/
+/**
+*  @brief   Set DDR phase alignment margin in hardware
+*
+*/
+/****************************************************************************/
+static inline void
+chipcHw_setDdrHwPhaseAlignMargin(chipcHw_DDR_HW_PHASE_MARGIN_e margin)
+{
+       uint32_t ge = 0;
+       uint32_t le = 0;
+
+       switch (margin) {
+       case chipcHw_DDR_HW_PHASE_MARGIN_STRICT:
+               ge = 0x0F;
+               le = 0x0F;
+               break;
+       case chipcHw_DDR_HW_PHASE_MARGIN_MEDIUM:
+               ge = 0x03;
+               le = 0x3F;
+               break;
+       case chipcHw_DDR_HW_PHASE_MARGIN_WIDE:
+               ge = 0x01;
+               le = 0x7F;
+               break;
+       }
+
+       {
+               REG_LOCAL_IRQ_SAVE;
+
+               pChipcHw->DDRPhaseCtrl1 &=
+                   ~((chipcHw_REG_DDR_PHASE_VALUE_GE_MASK <<
+                      chipcHw_REG_DDR_PHASE_VALUE_GE_SHIFT)
+                     || (chipcHw_REG_DDR_PHASE_VALUE_LE_MASK <<
+                         chipcHw_REG_DDR_PHASE_VALUE_LE_SHIFT));
+
+               pChipcHw->DDRPhaseCtrl1 |=
+                   ((ge << chipcHw_REG_DDR_PHASE_VALUE_GE_SHIFT)
+                    || (le << chipcHw_REG_DDR_PHASE_VALUE_LE_SHIFT));
+
+               REG_LOCAL_IRQ_RESTORE;
+       }
+}
+
+/****************************************************************************/
+/**
+*  @brief   Set VPM phase alignment margin in hardware
+*
+*/
+/****************************************************************************/
+static inline void
+chipcHw_setVpmHwPhaseAlignMargin(chipcHw_VPM_HW_PHASE_MARGIN_e margin)
+{
+       uint32_t ge = 0;
+       uint32_t le = 0;
+
+       switch (margin) {
+       case chipcHw_VPM_HW_PHASE_MARGIN_STRICT:
+               ge = 0x0F;
+               le = 0x0F;
+               break;
+       case chipcHw_VPM_HW_PHASE_MARGIN_MEDIUM:
+               ge = 0x03;
+               le = 0x3F;
+               break;
+       case chipcHw_VPM_HW_PHASE_MARGIN_WIDE:
+               ge = 0x01;
+               le = 0x7F;
+               break;
+       }
+
+       {
+               REG_LOCAL_IRQ_SAVE;
+
+               pChipcHw->VPMPhaseCtrl1 &=
+                   ~((chipcHw_REG_VPM_PHASE_VALUE_GE_MASK <<
+                      chipcHw_REG_VPM_PHASE_VALUE_GE_SHIFT)
+                     || (chipcHw_REG_VPM_PHASE_VALUE_LE_MASK <<
+                         chipcHw_REG_VPM_PHASE_VALUE_LE_SHIFT));
+
+               pChipcHw->VPMPhaseCtrl1 |=
+                   ((ge << chipcHw_REG_VPM_PHASE_VALUE_GE_SHIFT)
+                    || (le << chipcHw_REG_VPM_PHASE_VALUE_LE_SHIFT));
+
+               REG_LOCAL_IRQ_RESTORE;
+       }
+}
+
+/****************************************************************************/
+/**
+*  @brief   Checks DDR phase aligned status done by HW
+*
+*  @return  1: When aligned
+*           0: When not aligned
+*/
+/****************************************************************************/
+static inline uint32_t chipcHw_isDdrHwPhaseAligned(void)
+{
+       return (pChipcHw->
+               PhaseAlignStatus & chipcHw_REG_DDR_PHASE_ALIGNED) ? 1 : 0;
+}
+
+/****************************************************************************/
+/**
+*  @brief   Checks VPM phase aligned status done by HW
+*
+*  @return  1: When aligned
+*           0: When not aligned
+*/
+/****************************************************************************/
+static inline uint32_t chipcHw_isVpmHwPhaseAligned(void)
+{
+       return (pChipcHw->
+               PhaseAlignStatus & chipcHw_REG_VPM_PHASE_ALIGNED) ? 1 : 0;
+}
+
+/****************************************************************************/
+/**
+*  @brief   Get DDR phase aligned status done by HW
+*
+*/
+/****************************************************************************/
+static inline uint32_t chipcHw_getDdrHwPhaseAlignStatus(void)
+{
+       return (pChipcHw->
+               PhaseAlignStatus & chipcHw_REG_DDR_PHASE_STATUS_MASK) >>
+           chipcHw_REG_DDR_PHASE_STATUS_SHIFT;
+}
+
+/****************************************************************************/
+/**
+*  @brief   Get VPM phase aligned status done by HW
+*
+*/
+/****************************************************************************/
+static inline uint32_t chipcHw_getVpmHwPhaseAlignStatus(void)
+{
+       return (pChipcHw->
+               PhaseAlignStatus & chipcHw_REG_VPM_PHASE_STATUS_MASK) >>
+           chipcHw_REG_VPM_PHASE_STATUS_SHIFT;
+}
+
+/****************************************************************************/
+/**
+*  @brief   Get DDR phase control value
+*
+*/
+/****************************************************************************/
+static inline uint32_t chipcHw_getDdrPhaseControl(void)
+{
+       return (pChipcHw->
+               PhaseAlignStatus & chipcHw_REG_DDR_PHASE_CTRL_MASK) >>
+           chipcHw_REG_DDR_PHASE_CTRL_SHIFT;
+}
+
+/****************************************************************************/
+/**
+*  @brief   Get VPM phase control value
+*
+*/
+/****************************************************************************/
+static inline uint32_t chipcHw_getVpmPhaseControl(void)
+{
+       return (pChipcHw->
+               PhaseAlignStatus & chipcHw_REG_VPM_PHASE_CTRL_MASK) >>
+           chipcHw_REG_VPM_PHASE_CTRL_SHIFT;
+}
+
+/****************************************************************************/
+/**
+*  @brief   DDR phase alignment timeout count
+*
+*  @note    If HW fails to perform the phase alignment, it will trigger
+*           a DDR phase alignment timeout interrupt.
+*/
+/****************************************************************************/
+static inline void chipcHw_ddrHwPhaseAlignTimeout(uint32_t busCycle)
+{
+       REG_LOCAL_IRQ_SAVE;
+       pChipcHw->DDRPhaseCtrl2 &=
+           ~(chipcHw_REG_DDR_PHASE_TIMEOUT_COUNT_MASK <<
+             chipcHw_REG_DDR_PHASE_TIMEOUT_COUNT_SHIFT);
+       pChipcHw->DDRPhaseCtrl2 |=
+           (busCycle & chipcHw_REG_DDR_PHASE_TIMEOUT_COUNT_MASK) <<
+           chipcHw_REG_DDR_PHASE_TIMEOUT_COUNT_SHIFT;
+       REG_LOCAL_IRQ_RESTORE;
+}
+
+/****************************************************************************/
+/**
+*  @brief   VPM phase alignment timeout count
+*
+*  @note    If HW fails to perform the phase alignment, it will trigger
+*           a VPM phase alignment timeout interrupt.
+*/
+/****************************************************************************/
+static inline void chipcHw_vpmHwPhaseAlignTimeout(uint32_t busCycle)
+{
+       REG_LOCAL_IRQ_SAVE;
+       pChipcHw->VPMPhaseCtrl2 &=
+           ~(chipcHw_REG_VPM_PHASE_TIMEOUT_COUNT_MASK <<
+             chipcHw_REG_VPM_PHASE_TIMEOUT_COUNT_SHIFT);
+       pChipcHw->VPMPhaseCtrl2 |=
+           (busCycle & chipcHw_REG_VPM_PHASE_TIMEOUT_COUNT_MASK) <<
+           chipcHw_REG_VPM_PHASE_TIMEOUT_COUNT_SHIFT;
+       REG_LOCAL_IRQ_RESTORE;
+}
+
+/****************************************************************************/
+/**
+*  @brief   Clear DDR phase alignment timeout interrupt
+*
+*/
+/****************************************************************************/
+static inline void chipcHw_ddrHwPhaseAlignTimeoutInterruptClear(void)
+{
+       REG_LOCAL_IRQ_SAVE;
+       /* Clear timeout interrupt service bit */
+       pChipcHw->DDRPhaseCtrl2 |= chipcHw_REG_DDR_INTR_SERVICED;
+       pChipcHw->DDRPhaseCtrl2 &= ~chipcHw_REG_DDR_INTR_SERVICED;
+       REG_LOCAL_IRQ_RESTORE;
+}
+
+/****************************************************************************/
+/**
+*  @brief   Clear VPM phase alignment timeout interrupt
+*
+*/
+/****************************************************************************/
+static inline void chipcHw_vpmHwPhaseAlignTimeoutInterruptClear(void)
+{
+       REG_LOCAL_IRQ_SAVE;
+       /* Clear timeout interrupt service bit */
+       pChipcHw->VPMPhaseCtrl2 |= chipcHw_REG_VPM_INTR_SERVICED;
+       pChipcHw->VPMPhaseCtrl2 &= ~chipcHw_REG_VPM_INTR_SERVICED;
+       REG_LOCAL_IRQ_RESTORE;
+}
+
+/****************************************************************************/
+/**
+*  @brief   DDR phase alignment timeout interrupt enable
+*
+*/
+/****************************************************************************/
+static inline void chipcHw_ddrHwPhaseAlignTimeoutInterruptEnable(void)
+{
+       REG_LOCAL_IRQ_SAVE;
+       chipcHw_ddrHwPhaseAlignTimeoutInterruptClear(); /* Recommended */
+       /* Enable timeout interrupt */
+       pChipcHw->DDRPhaseCtrl2 |= chipcHw_REG_DDR_TIMEOUT_INTR_ENABLE;
+       REG_LOCAL_IRQ_RESTORE;
+}
+
+/****************************************************************************/
+/**
+*  @brief   VPM phase alignment timeout interrupt enable
+*
+*/
+/****************************************************************************/
+static inline void chipcHw_vpmHwPhaseAlignTimeoutInterruptEnable(void)
+{
+       REG_LOCAL_IRQ_SAVE;
+       chipcHw_vpmHwPhaseAlignTimeoutInterruptClear(); /* Recommended */
+       /* Enable timeout interrupt */
+       pChipcHw->VPMPhaseCtrl2 |= chipcHw_REG_VPM_TIMEOUT_INTR_ENABLE;
+       REG_LOCAL_IRQ_RESTORE;
+}
+
+/****************************************************************************/
+/**
+*  @brief   DDR phase alignment timeout interrupt disable
+*
+*/
+/****************************************************************************/
+static inline void chipcHw_ddrHwPhaseAlignTimeoutInterruptDisable(void)
+{
+       REG_LOCAL_IRQ_SAVE;
+       pChipcHw->DDRPhaseCtrl2 &= ~chipcHw_REG_DDR_TIMEOUT_INTR_ENABLE;
+       REG_LOCAL_IRQ_RESTORE;
+}
+
+/****************************************************************************/
+/**
+*  @brief   VPM phase alignment timeout interrupt disable
+*
+*/
+/****************************************************************************/
+static inline void chipcHw_vpmHwPhaseAlignTimeoutInterruptDisable(void)
+{
+       REG_LOCAL_IRQ_SAVE;
+       pChipcHw->VPMPhaseCtrl2 &= ~chipcHw_REG_VPM_TIMEOUT_INTR_ENABLE;
+       REG_LOCAL_IRQ_RESTORE;
+}
+
+#endif /* CHIPC_INLINE_H */
diff --git a/arch/arm/mach-bcmring/include/mach/csp/chipcHw_reg.h b/arch/arm/mach-bcmring/include/mach/csp/chipcHw_reg.h
new file mode 100644 (file)
index 0000000..b162448
--- /dev/null
@@ -0,0 +1,530 @@
+/*****************************************************************************
+* Copyright 2004 - 2008 Broadcom Corporation.  All rights reserved.
+*
+* Unless you and Broadcom execute a separate written software license
+* agreement governing use of this software, this software is licensed to you
+* under the terms of the GNU General Public License version 2, available at
+* http://www.broadcom.com/licenses/GPLv2.php (the "GPL").
+*
+* Notwithstanding the above, under no circumstances may you combine this
+* software in any way with any other Broadcom software provided under a
+* license other than the GPL, without Broadcom's express prior written
+* consent.
+*****************************************************************************/
+
+/****************************************************************************/
+/**
+*  @file    chipcHw_reg.h
+*
+*  @brief   Definitions for low level chip control registers
+*
+*/
+/****************************************************************************/
+#ifndef CHIPCHW_REG_H
+#define CHIPCHW_REG_H
+
+#include <mach/csp/mm_io.h>
+#include <csp/reg.h>
+#include <mach/csp/ddrcReg.h>
+
+#define chipcHw_BASE_ADDRESS    MM_IO_BASE_CHIPC
+
+typedef struct {
+       uint32_t ChipId;        /* Chip ID */
+       uint32_t DDRClock;      /* PLL1 Channel 1 for DDR clock */
+       uint32_t ARMClock;      /* PLL1 Channel 2 for ARM clock */
+       uint32_t ESWClock;      /* PLL1 Channel 3 for ESW system clock */
+       uint32_t VPMClock;      /* PLL1 Channel 4 for VPM clock */
+       uint32_t ESW125Clock;   /* PLL1 Channel 5 for ESW 125MHz clock */
+       uint32_t UARTClock;     /* PLL1 Channel 6 for UART clock */
+       uint32_t SDIO0Clock;    /* PLL1 Channel 7 for SDIO 0 clock */
+       uint32_t SDIO1Clock;    /* PLL1 Channel 8 for SDIO 1 clock */
+       uint32_t SPIClock;      /* PLL1 Channel 9 for SPI master Clock  */
+       uint32_t ETMClock;      /* PLL1 Channel 10 for ARM ETM Clock  */
+
+       uint32_t ACLKClock;     /* ACLK Clock (Divider) */
+       uint32_t OTPClock;      /* OTP Clock  (Divider) */
+       uint32_t I2CClock;      /* I2C Clock (CK_13m) (Divider) */
+       uint32_t I2S0Clock;     /* I2S0 Clock (Divider) */
+       uint32_t RTBUSClock;    /* RTBUS (DDR PHY Config.) Clock (Divider) */
+       uint32_t pad1;
+       uint32_t APM100Clock;   /* APM 100MHz CLK Clock (Divider) */
+       uint32_t TSCClock;      /* TSC Clock (Divider) */
+       uint32_t LEDClock;      /* LED Clock (Divider) */
+
+       uint32_t USBClock;      /* PLL2 Channel 1 for USB clock */
+       uint32_t LCDClock;      /* PLL2 Channel 2 for LCD clock */
+       uint32_t APMClock;      /* PLL2 Channel 3 for APM 200 MHz clock */
+
+       uint32_t BusIntfClock;  /* Bus interface clock */
+
+       uint32_t PLLStatus;     /* PLL status register (PLL1) */
+       uint32_t PLLConfig;     /* PLL configuration register  (PLL1) */
+       uint32_t PLLPreDivider; /* PLL pre-divider control register (PLL1) */
+       uint32_t PLLDivider;    /* PLL divider control register (PLL1) */
+       uint32_t PLLControl1;   /* PLL analog control register #1 (PLL1) */
+       uint32_t PLLControl2;   /* PLL analog control register #2 (PLL1) */
+
+       uint32_t I2S1Clock;     /* I2S1 Clock  */
+       uint32_t AudioEnable;   /* Enable/ disable audio channel */
+       uint32_t SoftReset1;    /* Reset blocks */
+       uint32_t SoftReset2;    /* Reset blocks */
+       uint32_t Spare1;        /* Phase align interrupts */
+       uint32_t Sticky;        /* Sticky bits */
+       uint32_t MiscCtrl;      /* Misc. control */
+       uint32_t pad3[3];
+
+       uint32_t PLLStatus2;    /* PLL status register (PLL2) */
+       uint32_t PLLConfig2;    /* PLL configuration register  (PLL2) */
+       uint32_t PLLPreDivider2;        /* PLL pre-divider control register (PLL2) */
+       uint32_t PLLDivider2;   /* PLL divider control register (PLL2) */
+       uint32_t PLLControl12;  /* PLL analog control register #1 (PLL2) */
+       uint32_t PLLControl22;  /* PLL analog control register #2 (PLL2) */
+
+       uint32_t DDRPhaseCtrl1; /* DDR Clock Phase Alignment control1 */
+       uint32_t VPMPhaseCtrl1; /* VPM Clock Phase Alignment control1 */
+       uint32_t PhaseAlignStatus;      /* DDR/VPM Clock Phase Alignment Status */
+       uint32_t PhaseCtrlStatus;       /* DDR/VPM Clock HW DDR/VPM ph_ctrl and load_ch Status */
+       uint32_t DDRPhaseCtrl2; /* DDR Clock Phase Alignment control2 */
+       uint32_t VPMPhaseCtrl2; /* VPM Clock Phase Alignment control2 */
+       uint32_t pad4[9];
+
+       uint32_t SoftOTP1;      /* Software OTP control */
+       uint32_t SoftOTP2;      /* Software OTP control */
+       uint32_t SoftStraps;    /* Software strap */
+       uint32_t PinStraps;     /* Pin Straps */
+       uint32_t DiffOscCtrl;   /* Diff oscillator control */
+       uint32_t DiagsCtrl;     /* Diagnostic control */
+       uint32_t DiagsOutputCtrl;       /* Diagnostic output enable */
+       uint32_t DiagsReadBackCtrl;     /* Diagnostic read back control */
+
+       uint32_t LcdPifMode;    /* LCD/PIF Pin Sharing MUX Mode */
+
+       uint32_t GpioMux_0_7;   /* Pin Sharing MUX0 Control */
+       uint32_t GpioMux_8_15;  /* Pin Sharing MUX1 Control */
+       uint32_t GpioMux_16_23; /* Pin Sharing MUX2 Control */
+       uint32_t GpioMux_24_31; /* Pin Sharing MUX3 Control */
+       uint32_t GpioMux_32_39; /* Pin Sharing MUX4 Control */
+       uint32_t GpioMux_40_47; /* Pin Sharing MUX5 Control */
+       uint32_t GpioMux_48_55; /* Pin Sharing MUX6 Control */
+       uint32_t GpioMux_56_63; /* Pin Sharing MUX7 Control */
+
+       uint32_t GpioSR_0_7;    /* Slew rate for GPIO 0 - 7 */
+       uint32_t GpioSR_8_15;   /* Slew rate for GPIO 8 - 15 */
+       uint32_t GpioSR_16_23;  /* Slew rate for GPIO 16 - 23 */
+       uint32_t GpioSR_24_31;  /* Slew rate for GPIO 24 - 31 */
+       uint32_t GpioSR_32_39;  /* Slew rate for GPIO 32 - 39 */
+       uint32_t GpioSR_40_47;  /* Slew rate for GPIO 40 - 47 */
+       uint32_t GpioSR_48_55;  /* Slew rate for GPIO 48 - 55 */
+       uint32_t GpioSR_56_63;  /* Slew rate for GPIO 56 - 63 */
+       uint32_t MiscSR_0_7;    /* Slew rate for MISC 0 - 7 */
+       uint32_t MiscSR_8_15;   /* Slew rate for MISC 8 - 15 */
+
+       uint32_t GpioPull_0_15; /* Pull up registers for GPIO 0 - 15 */
+       uint32_t GpioPull_16_31;        /* Pull up registers for GPIO 16 - 31 */
+       uint32_t GpioPull_32_47;        /* Pull up registers for GPIO 32 - 47 */
+       uint32_t GpioPull_48_63;        /* Pull up registers for GPIO 48 - 63 */
+       uint32_t MiscPull_0_15; /* Pull up registers for MISC 0 - 15 */
+
+       uint32_t GpioInput_0_31;        /* Input type for GPIO 0 - 31 */
+       uint32_t GpioInput_32_63;       /* Input type for GPIO 32 - 63 */
+       uint32_t MiscInput_0_15;        /* Input type for MISC 0 - 16 */
+} chipcHw_REG_t;
+
+#define pChipcHw  ((volatile chipcHw_REG_t *) chipcHw_BASE_ADDRESS)
+#define pChipcPhysical  ((volatile chipcHw_REG_t *) MM_ADDR_IO_CHIPC)
+
+#define chipcHw_REG_CHIPID_BASE_MASK                    0xFFFFF000
+#define chipcHw_REG_CHIPID_BASE_SHIFT                   12
+#define chipcHw_REG_CHIPID_REV_MASK                     0x00000FFF
+#define chipcHw_REG_REV_A0                              0xA00
+#define chipcHw_REG_REV_B0                              0x0B0
+
+#define chipcHw_REG_PLL_STATUS_CONTROL_ENABLE           0x80000000     /* Allow controlling PLL registers */
+#define chipcHw_REG_PLL_STATUS_LOCKED                   0x00000001     /* PLL is settled */
+#define chipcHw_REG_PLL_CONFIG_D_RESET                  0x00000008     /* Digital reset */
+#define chipcHw_REG_PLL_CONFIG_A_RESET                  0x00000004     /* Analog reset */
+#define chipcHw_REG_PLL_CONFIG_BYPASS_ENABLE            0x00000020     /* Bypass enable */
+#define chipcHw_REG_PLL_CONFIG_OUTPUT_ENABLE            0x00000010     /* Output enable */
+#define chipcHw_REG_PLL_CONFIG_POWER_DOWN               0x00000001     /* Power down */
+#define chipcHw_REG_PLL_CONFIG_VCO_SPLIT_FREQ           1600000000     /* 1.6GHz VCO split frequency */
+#define chipcHw_REG_PLL_CONFIG_VCO_800_1600             0x00000000     /* VCO range 800-1600 MHz */
+#define chipcHw_REG_PLL_CONFIG_VCO_1601_3200            0x00000080     /* VCO range 1601-3200 MHz */
+#define chipcHw_REG_PLL_CONFIG_TEST_ENABLE              0x00010000     /* PLL test output enable */
+#define chipcHw_REG_PLL_CONFIG_TEST_SELECT_MASK         0x003E0000     /* Mask to set test values */
+#define chipcHw_REG_PLL_CONFIG_TEST_SELECT_SHIFT        17
+
+#define chipcHw_REG_PLL_CLOCK_PHASE_COMP                0x00800000     /* Phase comparator output */
+#define chipcHw_REG_PLL_CLOCK_TO_BUS_RATIO_MASK         0x00300000     /* Clock to bus ratio mask */
+#define chipcHw_REG_PLL_CLOCK_TO_BUS_RATIO_SHIFT        20     /* Number of bits to be shifted */
+#define chipcHw_REG_PLL_CLOCK_POWER_DOWN                0x00080000     /* PLL channel power down */
+#define chipcHw_REG_PLL_CLOCK_SOURCE_GPIO               0x00040000     /* Use GPIO as source */
+#define chipcHw_REG_PLL_CLOCK_BYPASS_SELECT             0x00020000     /* Select bypass clock */
+#define chipcHw_REG_PLL_CLOCK_OUTPUT_ENABLE             0x00010000     /* Clock gated ON */
+#define chipcHw_REG_PLL_CLOCK_PHASE_UPDATE_ENABLE       0x00008000     /* Clock phase update enable */
+#define chipcHw_REG_PLL_CLOCK_PHASE_CONTROL_SHIFT       8      /* Number of bits to be shifted */
+#define chipcHw_REG_PLL_CLOCK_PHASE_CONTROL_MASK        0x00003F00     /* Phase control mask */
+#define chipcHw_REG_PLL_CLOCK_MDIV_MASK                 0x000000FF     /* Clock post divider mask
+
+                                                                          00000000 = divide-by-256
+                                                                          00000001 = divide-by-1
+                                                                          00000010 = divide-by-2
+                                                                          00000011 = divide-by-3
+                                                                          00000100 = divide-by-4
+                                                                          00000101 = divide-by-5
+                                                                          00000110 = divide-by-6
+                                                                          .
+                                                                          .
+                                                                          11111011 = divide-by-251
+                                                                          11111100 = divide-by-252
+                                                                          11111101 = divide-by-253
+                                                                          11111110 = divide-by-254
+                                                                        */
+
+#define chipcHw_REG_DIV_CLOCK_SOURCE_OTHER              0x00040000     /* NON-PLL clock source select */
+#define chipcHw_REG_DIV_CLOCK_BYPASS_SELECT             0x00020000     /* NON-PLL clock bypass enable */
+#define chipcHw_REG_DIV_CLOCK_OUTPUT_ENABLE             0x00010000     /* NON-PLL clock output enable */
+#define chipcHw_REG_DIV_CLOCK_DIV_MASK                  0x000000FF     /* NON-PLL clock post-divide mask */
+#define chipcHw_REG_DIV_CLOCK_DIV_256                   0x00000000     /* NON-PLL clock post-divide by 256 */
+
+#define chipcHw_REG_PLL_PREDIVIDER_P1_SHIFT             0
+#define chipcHw_REG_PLL_PREDIVIDER_P2_SHIFT             4
+#define chipcHw_REG_PLL_PREDIVIDER_NDIV_SHIFT           8
+#define chipcHw_REG_PLL_PREDIVIDER_NDIV_MASK            0x0001FF00
+#define chipcHw_REG_PLL_PREDIVIDER_POWER_DOWN           0x02000000
+#define chipcHw_REG_PLL_PREDIVIDER_NDIV_MODE_MASK       0x00700000     /* Divider mask */
+#define chipcHw_REG_PLL_PREDIVIDER_NDIV_MODE_INTEGER    0x00000000     /* Integer-N Mode */
+#define chipcHw_REG_PLL_PREDIVIDER_NDIV_MODE_MASH_UNIT  0x00100000     /* MASH Sigma-Delta Modulator Unit Mode */
+#define chipcHw_REG_PLL_PREDIVIDER_NDIV_MODE_MFB_UNIT   0x00200000     /* MFB Sigma-Delta Modulator Unit Mode */
+#define chipcHw_REG_PLL_PREDIVIDER_NDIV_MODE_MASH_1_8   0x00300000     /* MASH Sigma-Delta Modulator 1/8 Mode */
+#define chipcHw_REG_PLL_PREDIVIDER_NDIV_MODE_MFB_1_8    0x00400000     /* MFB Sigma-Delta Modulator 1/8 Mode */
+
+#define chipcHw_REG_PLL_PREDIVIDER_NDIV_i(vco)          ((vco) / chipcHw_XTAL_FREQ_Hz)
+#define chipcHw_REG_PLL_PREDIVIDER_P1                   1
+#define chipcHw_REG_PLL_PREDIVIDER_P2                   1
+
+#define chipcHw_REG_PLL_DIVIDER_M1DIV                   0x03000000
+#define chipcHw_REG_PLL_DIVIDER_FRAC                    0x00FFFFFF     /* Fractional divider */
+
+#define chipcHw_REG_PLL_DIVIDER_NDIV_f_SS               (0x00FFFFFF)   /* To attain spread with max frequency */
+
+#define chipcHw_REG_PLL_DIVIDER_NDIV_f                  0      /* ndiv_frac = chipcHw_REG_PLL_DIVIDER_NDIV_f /
+                                                                  chipcHw_REG_PLL_DIVIDER_FRAC
+                                                                  = 0, when SS is disable
+                                                                */
+
+#define chipcHw_REG_PLL_DIVIDER_MDIV(vco, Hz)           ((chipcHw_divide((vco), (Hz)) > 255) ? 0 : chipcHw_divide((vco), (Hz)))
+
+#define chipcHw_REG_ACLKClock_CLK_DIV_MASK              0x3
+
+/* System booting strap options */
+#define chipcHw_STRAPS_SOFT_OVERRIDE                    0x00000001     /* Software Strap Override */
+
+#define chipcHw_STRAPS_BOOT_DEVICE_NAND_FLASH_8         0x00000000     /* 8 bit NAND FLASH Boot */
+#define chipcHw_STRAPS_BOOT_DEVICE_NOR_FLASH_16         0x00000002     /* 16 bit NOR FLASH Boot */
+#define chipcHw_STRAPS_BOOT_DEVICE_SERIAL_FLASH         0x00000004     /* Serial FLASH Boot */
+#define chipcHw_STRAPS_BOOT_DEVICE_NAND_FLASH_16        0x00000006     /* 16 bit NAND FLASH Boot */
+#define chipcHw_STRAPS_BOOT_DEVICE_UART                 0x00000008     /* UART Boot */
+#define chipcHw_STRAPS_BOOT_DEVICE_MASK                 0x0000000E     /* Mask */
+
+/* System boot option */
+#define chipcHw_STRAPS_BOOT_OPTION_BROM                 0x00000000     /* Boot from Boot ROM */
+#define chipcHw_STRAPS_BOOT_OPTION_ARAM                 0x00000020     /* Boot from ARAM */
+#define chipcHw_STRAPS_BOOT_OPTION_NOR                  0x00000030     /* Boot from NOR flash */
+
+/* NAND Flash page size strap options */
+#define chipcHw_STRAPS_NAND_PAGESIZE_512                0x00000000     /* NAND FLASH page size of 512 bytes */
+#define chipcHw_STRAPS_NAND_PAGESIZE_2048               0x00000040     /* NAND FLASH page size of 2048 bytes */
+#define chipcHw_STRAPS_NAND_PAGESIZE_4096               0x00000080     /* NAND FLASH page size of 4096 bytes */
+#define chipcHw_STRAPS_NAND_PAGESIZE_EXT                0x000000C0     /* NAND FLASH page of extened size */
+#define chipcHw_STRAPS_NAND_PAGESIZE_MASK               0x000000C0     /* Mask */
+
+#define chipcHw_STRAPS_NAND_EXTRA_CYCLE                 0x00000400     /* NAND FLASH address cycle configuration */
+#define chipcHw_STRAPS_REBOOT_TO_UART                   0x00000800     /* Reboot to UART on error */
+
+/* Secure boot mode strap options */
+#define chipcHw_STRAPS_BOOT_MODE_NORMAL                 0x00000000     /* Normal Boot */
+#define chipcHw_STRAPS_BOOT_MODE_DBG_SW                 0x00000100     /* Software debugging Boot */
+#define chipcHw_STRAPS_BOOT_MODE_DBG_BOOT               0x00000200     /* Boot rom debugging Boot */
+#define chipcHw_STRAPS_BOOT_MODE_NORMAL_QUIET           0x00000300     /* Normal Boot (Quiet BootRom) */
+#define chipcHw_STRAPS_BOOT_MODE_MASK                   0x00000300     /* Mask */
+
+/* Slave Mode straps */
+#define chipcHw_STRAPS_I2CS                             0x02000000     /* I2C Slave  */
+#define chipcHw_STRAPS_SPIS                             0x01000000     /* SPI Slave  */
+
+/* Strap pin options */
+#define chipcHw_REG_SW_STRAPS                           ((pChipcHw->PinStraps & 0x0000FC00) >> 10)
+
+/* PIF/LCD pin sharing defines */
+#define chipcHw_REG_LCD_PIN_ENABLE                      0x00000001     /* LCD Controller is used and the pins have LCD functions */
+#define chipcHw_REG_PIF_PIN_ENABLE                      0x00000002     /* LCD pins are used to perform PIF functions  */
+
+#define chipcHw_GPIO_COUNT                              61     /* Number of GPIO pin accessible thorugh CHIPC */
+
+/* NOTE: Any changes to these constants will require a corresponding change to chipcHw_str.c */
+#define chipcHw_REG_GPIO_MUX_KEYPAD                     0x00000001     /* GPIO mux for Keypad */
+#define chipcHw_REG_GPIO_MUX_I2CH                       0x00000002     /* GPIO mux for I2CH */
+#define chipcHw_REG_GPIO_MUX_SPI                        0x00000003     /* GPIO mux for SPI */
+#define chipcHw_REG_GPIO_MUX_UART                       0x00000004     /* GPIO mux for UART */
+#define chipcHw_REG_GPIO_MUX_LEDMTXP                    0x00000005     /* GPIO mux for LEDMTXP */
+#define chipcHw_REG_GPIO_MUX_LEDMTXS                    0x00000006     /* GPIO mux for LEDMTXS */
+#define chipcHw_REG_GPIO_MUX_SDIO0                      0x00000007     /* GPIO mux for SDIO0 */
+#define chipcHw_REG_GPIO_MUX_SDIO1                      0x00000008     /* GPIO mux for SDIO1 */
+#define chipcHw_REG_GPIO_MUX_PCM                        0x00000009     /* GPIO mux for PCM */
+#define chipcHw_REG_GPIO_MUX_I2S                        0x0000000A     /* GPIO mux for I2S */
+#define chipcHw_REG_GPIO_MUX_ETM                        0x0000000B     /* GPIO mux for ETM */
+#define chipcHw_REG_GPIO_MUX_DEBUG                      0x0000000C     /* GPIO mux for DEBUG */
+#define chipcHw_REG_GPIO_MUX_MISC                       0x0000000D     /* GPIO mux for MISC */
+#define chipcHw_REG_GPIO_MUX_GPIO                       0x00000000     /* GPIO mux for GPIO */
+#define chipcHw_REG_GPIO_MUX(pin)                       (&pChipcHw->GpioMux_0_7 + ((pin) >> 3))
+#define chipcHw_REG_GPIO_MUX_POSITION(pin)              (((pin) & 0x00000007) << 2)
+#define chipcHw_REG_GPIO_MUX_MASK                       0x0000000F     /* Mask */
+
+#define chipcHw_REG_SLEW_RATE_HIGH                      0x00000000     /* High speed slew rate */
+#define chipcHw_REG_SLEW_RATE_NORMAL                    0x00000008     /* Normal slew rate */
+                                                       /* Pins beyond 42 are defined by skipping 8 bits within the register */
+#define chipcHw_REG_SLEW_RATE(pin)                      (((pin) > 42) ? (&pChipcHw->GpioSR_0_7 + (((pin) + 2) >> 3)) : (&pChipcHw->GpioSR_0_7 + ((pin) >> 3)))
+#define chipcHw_REG_SLEW_RATE_POSITION(pin)             (((pin) > 42) ? ((((pin) + 2) & 0x00000007) << 2) : (((pin) & 0x00000007) << 2))
+#define chipcHw_REG_SLEW_RATE_MASK                      0x00000008     /* Mask */
+
+#define chipcHw_REG_CURRENT_STRENGTH_2mA                0x00000001     /* Current driving strength 2 milli ampere */
+#define chipcHw_REG_CURRENT_STRENGTH_4mA                0x00000002     /* Current driving strength 4 milli ampere */
+#define chipcHw_REG_CURRENT_STRENGTH_6mA                0x00000004     /* Current driving strength 6 milli ampere */
+#define chipcHw_REG_CURRENT_STRENGTH_8mA                0x00000005     /* Current driving strength 8 milli ampere */
+#define chipcHw_REG_CURRENT_STRENGTH_10mA               0x00000006     /* Current driving strength 10 milli ampere */
+#define chipcHw_REG_CURRENT_STRENGTH_12mA               0x00000007     /* Current driving strength 12 milli ampere */
+#define chipcHw_REG_CURRENT_MASK                        0x00000007     /* Mask */
+                                                       /* Pins beyond 42 are defined by skipping 8 bits */
+#define chipcHw_REG_CURRENT(pin)                        (((pin) > 42) ? (&pChipcHw->GpioSR_0_7 + (((pin) + 2) >> 3)) : (&pChipcHw->GpioSR_0_7 + ((pin) >> 3)))
+#define chipcHw_REG_CURRENT_POSITION(pin)               (((pin) > 42) ? ((((pin) + 2) & 0x00000007) << 2) : (((pin) & 0x00000007) << 2))
+
+#define chipcHw_REG_PULL_NONE                           0x00000000     /* No pull up register */
+#define chipcHw_REG_PULL_UP                             0x00000001     /* Pull up register enable */
+#define chipcHw_REG_PULL_DOWN                           0x00000002     /* Pull down register enable */
+#define chipcHw_REG_PULLUP_MASK                         0x00000003     /* Mask */
+                                                       /* Pins beyond 42 are defined by skipping 4 bits */
+#define chipcHw_REG_PULLUP(pin)                         (((pin) > 42) ? (&pChipcHw->GpioPull_0_15 + (((pin) + 2) >> 4)) : (&pChipcHw->GpioPull_0_15 + ((pin) >> 4)))
+#define chipcHw_REG_PULLUP_POSITION(pin)                (((pin) > 42) ? ((((pin) + 2) & 0x0000000F) << 1) : (((pin) & 0x0000000F) << 1))
+
+#define chipcHw_REG_INPUTTYPE_CMOS                      0x00000000     /* Normal CMOS logic */
+#define chipcHw_REG_INPUTTYPE_ST                        0x00000001     /* High speed Schmitt Trigger */
+#define chipcHw_REG_INPUTTYPE_MASK                      0x00000001     /* Mask */
+                                                       /* Pins beyond 42 are defined by skipping 2 bits */
+#define chipcHw_REG_INPUTTYPE(pin)                      (((pin) > 42) ? (&pChipcHw->GpioInput_0_31 + (((pin) + 2) >> 5)) : (&pChipcHw->GpioInput_0_31 + ((pin) >> 5)))
+#define chipcHw_REG_INPUTTYPE_POSITION(pin)             (((pin) > 42) ? ((((pin) + 2) & 0x0000001F)) : (((pin) & 0x0000001F)))
+
+/* Device connected to the bus clock */
+#define chipcHw_REG_BUS_CLOCK_ARM                       0x00000001     /* Bus interface clock for ARM */
+#define chipcHw_REG_BUS_CLOCK_VDEC                      0x00000002     /* Bus interface clock for VDEC */
+#define chipcHw_REG_BUS_CLOCK_ARAM                      0x00000004     /* Bus interface clock for ARAM */
+#define chipcHw_REG_BUS_CLOCK_HPM                       0x00000008     /* Bus interface clock for HPM */
+#define chipcHw_REG_BUS_CLOCK_DDRC                      0x00000010     /* Bus interface clock for DDRC */
+#define chipcHw_REG_BUS_CLOCK_DMAC0                     0x00000020     /* Bus interface clock for DMAC0 */
+#define chipcHw_REG_BUS_CLOCK_DMAC1                     0x00000040     /* Bus interface clock for DMAC1 */
+#define chipcHw_REG_BUS_CLOCK_NVI                       0x00000080     /* Bus interface clock for NVI */
+#define chipcHw_REG_BUS_CLOCK_ESW                       0x00000100     /* Bus interface clock for ESW */
+#define chipcHw_REG_BUS_CLOCK_GE                        0x00000200     /* Bus interface clock for GE */
+#define chipcHw_REG_BUS_CLOCK_I2CH                      0x00000400     /* Bus interface clock for I2CH */
+#define chipcHw_REG_BUS_CLOCK_I2S0                      0x00000800     /* Bus interface clock for I2S0 */
+#define chipcHw_REG_BUS_CLOCK_I2S1                      0x00001000     /* Bus interface clock for I2S1 */
+#define chipcHw_REG_BUS_CLOCK_VRAM                      0x00002000     /* Bus interface clock for VRAM */
+#define chipcHw_REG_BUS_CLOCK_CLCD                      0x00004000     /* Bus interface clock for CLCD */
+#define chipcHw_REG_BUS_CLOCK_LDK                       0x00008000     /* Bus interface clock for LDK */
+#define chipcHw_REG_BUS_CLOCK_LED                       0x00010000     /* Bus interface clock for LED */
+#define chipcHw_REG_BUS_CLOCK_OTP                       0x00020000     /* Bus interface clock for OTP */
+#define chipcHw_REG_BUS_CLOCK_PIF                       0x00040000     /* Bus interface clock for PIF */
+#define chipcHw_REG_BUS_CLOCK_SPU                       0x00080000     /* Bus interface clock for SPU */
+#define chipcHw_REG_BUS_CLOCK_SDIO0                     0x00100000     /* Bus interface clock for SDIO0 */
+#define chipcHw_REG_BUS_CLOCK_SDIO1                     0x00200000     /* Bus interface clock for SDIO1 */
+#define chipcHw_REG_BUS_CLOCK_SPIH                      0x00400000     /* Bus interface clock for SPIH */
+#define chipcHw_REG_BUS_CLOCK_SPIS                      0x00800000     /* Bus interface clock for SPIS */
+#define chipcHw_REG_BUS_CLOCK_UART0                     0x01000000     /* Bus interface clock for UART0 */
+#define chipcHw_REG_BUS_CLOCK_UART1                     0x02000000     /* Bus interface clock for UART1 */
+#define chipcHw_REG_BUS_CLOCK_BBL                       0x04000000     /* Bus interface clock for BBL */
+#define chipcHw_REG_BUS_CLOCK_I2CS                      0x08000000     /* Bus interface clock for I2CS */
+#define chipcHw_REG_BUS_CLOCK_USBH                      0x10000000     /* Bus interface clock for USB Host */
+#define chipcHw_REG_BUS_CLOCK_USBD                      0x20000000     /* Bus interface clock for USB Device */
+#define chipcHw_REG_BUS_CLOCK_BROM                      0x40000000     /* Bus interface clock for Boot ROM */
+#define chipcHw_REG_BUS_CLOCK_TSC                       0x80000000     /* Bus interface clock for Touch screen */
+
+/* Software resets defines */
+#define chipcHw_REG_SOFT_RESET_VPM_GLOBAL_HOLD          0x0000000080000000ULL  /* Reset Global VPM and hold */
+#define chipcHw_REG_SOFT_RESET_VPM_HOLD                 0x0000000040000000ULL  /* Reset VPM and hold */
+#define chipcHw_REG_SOFT_RESET_VPM_GLOBAL               0x0000000020000000ULL  /* Reset Global VPM */
+#define chipcHw_REG_SOFT_RESET_VPM                      0x0000000010000000ULL  /* Reset VPM */
+#define chipcHw_REG_SOFT_RESET_KEYPAD                   0x0000000008000000ULL  /* Reset Key pad */
+#define chipcHw_REG_SOFT_RESET_LED                      0x0000000004000000ULL  /* Reset LED */
+#define chipcHw_REG_SOFT_RESET_SPU                      0x0000000002000000ULL  /* Reset SPU */
+#define chipcHw_REG_SOFT_RESET_RNG                      0x0000000001000000ULL  /* Reset RNG */
+#define chipcHw_REG_SOFT_RESET_PKA                      0x0000000000800000ULL  /* Reset PKA */
+#define chipcHw_REG_SOFT_RESET_LCD                      0x0000000000400000ULL  /* Reset LCD */
+#define chipcHw_REG_SOFT_RESET_PIF                      0x0000000000200000ULL  /* Reset PIF */
+#define chipcHw_REG_SOFT_RESET_I2CS                     0x0000000000100000ULL  /* Reset I2C Slave */
+#define chipcHw_REG_SOFT_RESET_I2CH                     0x0000000000080000ULL  /* Reset I2C Host */
+#define chipcHw_REG_SOFT_RESET_SDIO1                    0x0000000000040000ULL  /* Reset SDIO 1 */
+#define chipcHw_REG_SOFT_RESET_SDIO0                    0x0000000000020000ULL  /* Reset SDIO 0 */
+#define chipcHw_REG_SOFT_RESET_BBL                      0x0000000000010000ULL  /* Reset BBL */
+#define chipcHw_REG_SOFT_RESET_I2S1                     0x0000000000008000ULL  /* Reset I2S1 */
+#define chipcHw_REG_SOFT_RESET_I2S0                     0x0000000000004000ULL  /* Reset I2S0 */
+#define chipcHw_REG_SOFT_RESET_SPIS                     0x0000000000002000ULL  /* Reset SPI Slave */
+#define chipcHw_REG_SOFT_RESET_SPIH                     0x0000000000001000ULL  /* Reset SPI Host */
+#define chipcHw_REG_SOFT_RESET_GPIO1                    0x0000000000000800ULL  /* Reset GPIO block 1 */
+#define chipcHw_REG_SOFT_RESET_GPIO0                    0x0000000000000400ULL  /* Reset GPIO block 0 */
+#define chipcHw_REG_SOFT_RESET_UART1                    0x0000000000000200ULL  /* Reset UART 1 */
+#define chipcHw_REG_SOFT_RESET_UART0                    0x0000000000000100ULL  /* Reset UART 0 */
+#define chipcHw_REG_SOFT_RESET_NVI                      0x0000000000000080ULL  /* Reset NVI */
+#define chipcHw_REG_SOFT_RESET_WDOG                     0x0000000000000040ULL  /* Reset Watch dog */
+#define chipcHw_REG_SOFT_RESET_TMR                      0x0000000000000020ULL  /* Reset Timer */
+#define chipcHw_REG_SOFT_RESET_ETM                      0x0000000000000010ULL  /* Reset ETM */
+#define chipcHw_REG_SOFT_RESET_ARM_HOLD                 0x0000000000000008ULL  /* Reset ARM and HOLD */
+#define chipcHw_REG_SOFT_RESET_ARM                      0x0000000000000004ULL  /* Reset ARM */
+#define chipcHw_REG_SOFT_RESET_CHIP_WARM                0x0000000000000002ULL  /* Chip warm reset */
+#define chipcHw_REG_SOFT_RESET_CHIP_SOFT                0x0000000000000001ULL  /* Chip soft reset */
+#define chipcHw_REG_SOFT_RESET_VDEC                     0x0000100000000000ULL  /* Video decoder */
+#define chipcHw_REG_SOFT_RESET_GE                       0x0000080000000000ULL  /* Graphics engine */
+#define chipcHw_REG_SOFT_RESET_OTP                      0x0000040000000000ULL  /* Reset OTP */
+#define chipcHw_REG_SOFT_RESET_USB2                     0x0000020000000000ULL  /* Reset USB2 */
+#define chipcHw_REG_SOFT_RESET_USB1                     0x0000010000000000ULL  /* Reset USB 1 */
+#define chipcHw_REG_SOFT_RESET_USB                      0x0000008000000000ULL  /* Reset USB 1 and USB2 soft reset */
+#define chipcHw_REG_SOFT_RESET_ESW                      0x0000004000000000ULL  /* Reset Ethernet switch */
+#define chipcHw_REG_SOFT_RESET_ESWCLK                   0x0000002000000000ULL  /* Reset Ethernet switch clock */
+#define chipcHw_REG_SOFT_RESET_DDRPHY                   0x0000001000000000ULL  /* Reset DDR Physical */
+#define chipcHw_REG_SOFT_RESET_DDR                      0x0000000800000000ULL  /* Reset DDR Controller */
+#define chipcHw_REG_SOFT_RESET_TSC                      0x0000000400000000ULL  /* Reset Touch screen */
+#define chipcHw_REG_SOFT_RESET_PCM                      0x0000000200000000ULL  /* Reset PCM device */
+#define chipcHw_REG_SOFT_RESET_APM                      0x0000200100000000ULL  /* Reset APM device */
+
+#define chipcHw_REG_SOFT_RESET_VPM_GLOBAL_UNHOLD        0x8000000000000000ULL  /* Unhold Global VPM */
+#define chipcHw_REG_SOFT_RESET_VPM_UNHOLD               0x4000000000000000ULL  /* Unhold VPM */
+#define chipcHw_REG_SOFT_RESET_ARM_UNHOLD               0x2000000000000000ULL  /* Unhold ARM reset  */
+#define chipcHw_REG_SOFT_RESET_UNHOLD_MASK              0xF000000000000000ULL  /* Mask to handle unhold request */
+
+/* Audio channel control defines */
+#define chipcHw_REG_AUDIO_CHANNEL_ENABLE_ALL            0x00000001     /* Enable all audio channel */
+#define chipcHw_REG_AUDIO_CHANNEL_ENABLE_A              0x00000002     /* Enable channel A */
+#define chipcHw_REG_AUDIO_CHANNEL_ENABLE_B              0x00000004     /* Enable channel B */
+#define chipcHw_REG_AUDIO_CHANNEL_ENABLE_C              0x00000008     /* Enable channel C */
+#define chipcHw_REG_AUDIO_CHANNEL_ENABLE_NTP_CLOCK      0x00000010     /* Enable NTP clock */
+#define chipcHw_REG_AUDIO_CHANNEL_ENABLE_PCM0_CLOCK     0x00000020     /* Enable PCM0 clock */
+#define chipcHw_REG_AUDIO_CHANNEL_ENABLE_PCM1_CLOCK     0x00000040     /* Enable PCM1 clock */
+#define chipcHw_REG_AUDIO_CHANNEL_ENABLE_APM_CLOCK      0x00000080     /* Enable APM clock */
+
+/* Misc. chip control defines */
+#define chipcHw_REG_MISC_CTRL_GE_SEL                    0x00040000     /* Select GE2/GE3 */
+#define chipcHw_REG_MISC_CTRL_I2S1_CLOCK_ONCHIP         0x00000000     /* Use on chip clock for I2S1 */
+#define chipcHw_REG_MISC_CTRL_I2S1_CLOCK_GPIO           0x00020000     /* Use external clock via GPIO pin 26 for I2S1 */
+#define chipcHw_REG_MISC_CTRL_I2S0_CLOCK_ONCHIP         0x00000000     /* Use on chip clock for I2S0 */
+#define chipcHw_REG_MISC_CTRL_I2S0_CLOCK_GPIO           0x00010000     /* Use external clock via GPIO pin 45 for I2S0 */
+#define chipcHw_REG_MISC_CTRL_ARM_CP15_DISABLE          0x00008000     /* Disable ARM CP15 bit */
+#define chipcHw_REG_MISC_CTRL_RTC_DISABLE               0x00000008     /* Disable RTC registers */
+#define chipcHw_REG_MISC_CTRL_BBRAM_DISABLE             0x00000004     /* Disable Battery Backed RAM */
+#define chipcHw_REG_MISC_CTRL_USB_MODE_HOST             0x00000002     /* Set USB as host */
+#define chipcHw_REG_MISC_CTRL_USB_MODE_DEVICE           0xFFFFFFFD     /* Set USB as device */
+#define chipcHw_REG_MISC_CTRL_USB_POWERON               0xFFFFFFFE     /* Power up USB */
+#define chipcHw_REG_MISC_CTRL_USB_POWEROFF              0x00000001     /* Power down USB */
+
+/* OTP configuration defines */
+#define chipcHw_REG_OTP_SECURITY_OFF                    0x0000020000000000ULL  /* Security support is OFF */
+#define chipcHw_REG_OTP_SPU_SLOW                        0x0000010000000000ULL  /* Limited SPU throughput */
+#define chipcHw_REG_OTP_LCD_SPEED                       0x0000000600000000ULL  /* Set VPM speed one */
+#define chipcHw_REG_OTP_VPM_SPEED_1                     0x0000000100000000ULL  /* Set VPM speed one */
+#define chipcHw_REG_OTP_VPM_SPEED_0                     0x0000000080000000ULL  /* Set VPM speed zero */
+#define chipcHw_REG_OTP_AXI_SPEED                       0x0000000060000000ULL  /* Set maximum AXI bus speed */
+#define chipcHw_REG_OTP_APM_DISABLE                     0x000000001F000000ULL  /* Disable APM */
+#define chipcHw_REG_OTP_PIF_DISABLE                     0x0000000000200000ULL  /* Disable PIF */
+#define chipcHw_REG_OTP_VDEC_DISABLE                    0x0000000000100000ULL  /* Disable Video decoder */
+#define chipcHw_REG_OTP_BBL_DISABLE                     0x0000000000080000ULL  /* Disable RTC and BBRAM */
+#define chipcHw_REG_OTP_LED_DISABLE                     0x0000000000040000ULL  /* Disable LED */
+#define chipcHw_REG_OTP_GE_DISABLE                      0x0000000000020000ULL  /* Disable Graphics Engine */
+#define chipcHw_REG_OTP_LCD_DISABLE                     0x0000000000010000ULL  /* Disable LCD */
+#define chipcHw_REG_OTP_KEYPAD_DISABLE                  0x0000000000008000ULL  /* Disable keypad */
+#define chipcHw_REG_OTP_UART_DISABLE                    0x0000000000004000ULL  /* Disable UART */
+#define chipcHw_REG_OTP_SDIOH_DISABLE                   0x0000000000003000ULL  /* Disable SDIO host */
+#define chipcHw_REG_OTP_HSS_DISABLE                     0x0000000000000C00ULL  /* Disable HSS */
+#define chipcHw_REG_OTP_TSC_DISABLE                     0x0000000000000200ULL  /* Disable touch screen */
+#define chipcHw_REG_OTP_USB_DISABLE                     0x0000000000000180ULL  /* Disable USB */
+#define chipcHw_REG_OTP_SGMII_DISABLE                   0x0000000000000060ULL  /* Disable SGMII */
+#define chipcHw_REG_OTP_ETH_DISABLE                     0x0000000000000018ULL  /* Disable gigabit ethernet */
+#define chipcHw_REG_OTP_ETH_PHY_DISABLE                 0x0000000000000006ULL  /* Disable ethernet PHY */
+#define chipcHw_REG_OTP_VPM_DISABLE                     0x0000000000000001ULL  /* Disable VPM */
+
+/* Sticky bit defines */
+#define chipcHw_REG_STICKY_BOOT_DONE                    0x00000001     /* Boot done */
+#define chipcHw_REG_STICKY_SOFT_RESET                   0x00000002     /* ARM soft reset */
+#define chipcHw_REG_STICKY_GENERAL_1                    0x00000004     /* General purpose bit 1 */
+#define chipcHw_REG_STICKY_GENERAL_2                    0x00000008     /* General purpose bit 2 */
+#define chipcHw_REG_STICKY_GENERAL_3                    0x00000010     /* General purpose bit 3 */
+#define chipcHw_REG_STICKY_GENERAL_4                    0x00000020     /* General purpose bit 4 */
+#define chipcHw_REG_STICKY_GENERAL_5                    0x00000040     /* General purpose bit 5 */
+#define chipcHw_REG_STICKY_POR_BROM                     0x00000080     /* Special sticky bit for security - set in BROM to avoid other modes being entered */
+#define chipcHw_REG_STICKY_ARM_RESET                    0x00000100     /* ARM reset */
+#define chipcHw_REG_STICKY_CHIP_SOFT_RESET              0x00000200     /* Chip soft reset */
+#define chipcHw_REG_STICKY_CHIP_WARM_RESET              0x00000400     /* Chip warm reset */
+#define chipcHw_REG_STICKY_WDOG_RESET                   0x00000800     /* Watchdog reset */
+#define chipcHw_REG_STICKY_OTP_RESET                    0x00001000     /* OTP reset */
+
+                                                       /* HW phase alignment defines *//* Spare1 register definitions */
+#define chipcHw_REG_SPARE1_DDR_PHASE_INTR_ENABLE        0x80000000     /* Enable DDR phase align panic interrupt */
+#define chipcHw_REG_SPARE1_VPM_PHASE_INTR_ENABLE        0x40000000     /* Enable VPM phase align panic interrupt */
+#define chipcHw_REG_SPARE1_VPM_BUS_ACCESS_ENABLE        0x00000002     /* Enable access to VPM using system BUS */
+#define chipcHw_REG_SPARE1_DDR_BUS_ACCESS_ENABLE        0x00000001     /* Enable access to DDR using system BUS */
+                                                       /* DDRPhaseCtrl1 register definitions */
+#define chipcHw_REG_DDR_SW_PHASE_CTRL_ENABLE            0x80000000     /* Enable DDR SW phase alignment */
+#define chipcHw_REG_DDR_HW_PHASE_CTRL_ENABLE            0x40000000     /* Enable DDR HW phase alignment */
+#define chipcHw_REG_DDR_PHASE_VALUE_GE_MASK             0x0000007F     /* DDR lower threshold for phase alignment */
+#define chipcHw_REG_DDR_PHASE_VALUE_GE_SHIFT            23
+#define chipcHw_REG_DDR_PHASE_VALUE_LE_MASK             0x0000007F     /* DDR upper threshold for phase alignment */
+#define chipcHw_REG_DDR_PHASE_VALUE_LE_SHIFT            16
+#define chipcHw_REG_DDR_PHASE_ALIGN_WAIT_CYCLE_MASK     0x0000FFFF     /* BUS Cycle to wait to run next DDR phase alignment */
+#define chipcHw_REG_DDR_PHASE_ALIGN_WAIT_CYCLE_SHIFT    0
+                                                       /* VPMPhaseCtrl1 register definitions */
+#define chipcHw_REG_VPM_SW_PHASE_CTRL_ENABLE            0x80000000     /* Enable VPM SW phase alignment */
+#define chipcHw_REG_VPM_HW_PHASE_CTRL_ENABLE            0x40000000     /* Enable VPM HW phase alignment */
+#define chipcHw_REG_VPM_PHASE_VALUE_GE_MASK             0x0000007F     /* VPM lower threshold for phase alignment */
+#define chipcHw_REG_VPM_PHASE_VALUE_GE_SHIFT            23
+#define chipcHw_REG_VPM_PHASE_VALUE_LE_MASK             0x0000007F     /* VPM upper threshold for phase alignment */
+#define chipcHw_REG_VPM_PHASE_VALUE_LE_SHIFT            16
+#define chipcHw_REG_VPM_PHASE_ALIGN_WAIT_CYCLE_MASK     0x0000FFFF     /* BUS Cycle to wait to complete the VPM phase alignment */
+#define chipcHw_REG_VPM_PHASE_ALIGN_WAIT_CYCLE_SHIFT    0
+                                                       /* PhaseAlignStatus register definitions */
+#define chipcHw_REG_DDR_TIMEOUT_INTR_STATUS             0x80000000     /* DDR time out interrupt status */
+#define chipcHw_REG_DDR_PHASE_STATUS_MASK               0x0000007F     /* DDR phase status value */
+#define chipcHw_REG_DDR_PHASE_STATUS_SHIFT              24
+#define chipcHw_REG_DDR_PHASE_ALIGNED                   0x00800000     /* DDR Phase aligned status */
+#define chipcHw_REG_DDR_LOAD                            0x00400000     /* Load DDR phase status */
+#define chipcHw_REG_DDR_PHASE_CTRL_MASK                 0x0000003F     /* DDR phase control value */
+#define chipcHw_REG_DDR_PHASE_CTRL_SHIFT                16
+#define chipcHw_REG_VPM_TIMEOUT_INTR_STATUS             0x80000000     /* VPM time out interrupt status */
+#define chipcHw_REG_VPM_PHASE_STATUS_MASK               0x0000007F     /* VPM phase status value */
+#define chipcHw_REG_VPM_PHASE_STATUS_SHIFT              8
+#define chipcHw_REG_VPM_PHASE_ALIGNED                   0x00000080     /* VPM Phase aligned status */
+#define chipcHw_REG_VPM_LOAD                            0x00000040     /* Load VPM phase status */
+#define chipcHw_REG_VPM_PHASE_CTRL_MASK                 0x0000003F     /* VPM phase control value */
+#define chipcHw_REG_VPM_PHASE_CTRL_SHIFT                0
+                                                       /* DDRPhaseCtrl2 register definitions */
+#define chipcHw_REG_DDR_INTR_SERVICED                   0x02000000     /* Acknowledge that interrupt was serviced */
+#define chipcHw_REG_DDR_TIMEOUT_INTR_ENABLE             0x01000000     /* Enable time out interrupt */
+#define chipcHw_REG_DDR_LOAD_COUNT_PHASE_CTRL_MASK      0x0000000F     /* Wait before toggling load_ch */
+#define chipcHw_REG_DDR_LOAD_COUNT_PHASE_CTRL_SHIFT     20
+#define chipcHw_REG_DDR_TOTAL_LOAD_COUNT_CTRL_MASK      0x0000000F     /* Total wait to settle ph_ctrl and load_ch */
+#define chipcHw_REG_DDR_TOTAL_LOAD_COUNT_CTRL_SHIFT     16
+#define chipcHw_REG_DDR_PHASE_TIMEOUT_COUNT_MASK        0x0000FFFF     /* Time out value for DDR HW phase alignment */
+#define chipcHw_REG_DDR_PHASE_TIMEOUT_COUNT_SHIFT       0
+                                                       /* VPMPhaseCtrl2 register definitions */
+#define chipcHw_REG_VPM_INTR_SELECT_MASK                0x00000003     /* Interrupt select */
+#define chipcHw_REG_VPM_INTR_SELECT_SHIFT               26
+#define chipcHw_REG_VPM_INTR_DISABLE                    0x00000000
+#define chipcHw_REG_VPM_INTR_FAST                       (0x1 << chipcHw_REG_VPM_INTR_SELECT_SHIFT)
+#define chipcHw_REG_VPM_INTR_MEDIUM                     (0x2 << chipcHw_REG_VPM_INTR_SELECT_SHIFT)
+#define chipcHw_REG_VPM_INTR_SLOW                       (0x3 << chipcHw_REG_VPM_INTR_SELECT_SHIFT)
+#define chipcHw_REG_VPM_INTR_SERVICED                   0x02000000     /* Acknowledge that interrupt was serviced */
+#define chipcHw_REG_VPM_TIMEOUT_INTR_ENABLE             0x01000000     /* Enable time out interrupt */
+#define chipcHw_REG_VPM_LOAD_COUNT_PHASE_CTRL_MASK      0x0000000F     /* Wait before toggling load_ch */
+#define chipcHw_REG_VPM_LOAD_COUNT_PHASE_CTRL_SHIFT     20
+#define chipcHw_REG_VPM_TOTAL_LOAD_COUNT_CTRL_MASK      0x0000000F     /* Total wait cycle to settle ph_ctrl and load_ch */
+#define chipcHw_REG_VPM_TOTAL_LOAD_COUNT_CTRL_SHIFT     16
+#define chipcHw_REG_VPM_PHASE_TIMEOUT_COUNT_MASK        0x0000FFFF     /* Time out value for VPM HW phase alignment */
+#define chipcHw_REG_VPM_PHASE_TIMEOUT_COUNT_SHIFT       0
+
+#endif /* CHIPCHW_REG_H */
diff --git a/arch/arm/mach-bcmring/include/mach/csp/ddrcReg.h b/arch/arm/mach-bcmring/include/mach/csp/ddrcReg.h
new file mode 100644 (file)
index 0000000..f1b68e2
--- /dev/null
@@ -0,0 +1,872 @@
+/*****************************************************************************
+* Copyright 2003 - 2008 Broadcom Corporation.  All rights reserved.
+*
+* Unless you and Broadcom execute a separate written software license
+* agreement governing use of this software, this software is licensed to you
+* under the terms of the GNU General Public License version 2, available at
+* http://www.broadcom.com/licenses/GPLv2.php (the "GPL").
+*
+* Notwithstanding the above, under no circumstances may you combine this
+* software in any way with any other Broadcom software provided under a
+* license other than the GPL, without Broadcom's express prior written
+* consent.
+*****************************************************************************/
+
+/****************************************************************************/
+/**
+*  @file    ddrcReg.h
+*
+*  @brief   Register definitions for BCMRING DDR2 Controller and PHY
+*
+*/
+/****************************************************************************/
+
+#ifndef DDRC_REG_H
+#define DDRC_REG_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* ---- Include Files ---------------------------------------------------- */
+
+#include <csp/reg.h>
+#include <csp/stdint.h>
+
+#include <mach/csp/mm_io.h>
+
+/* ---- Public Constants and Types --------------------------------------- */
+
+/*********************************************************************/
+/* DDR2 Controller (ARM PL341) register definitions */
+/*********************************************************************/
+
+/* -------------------------------------------------------------------- */
+/* -------------------------------------------------------------------- */
+/* ARM PL341 DDR2 configuration registers, offset 0x000 */
+/* -------------------------------------------------------------------- */
+/* -------------------------------------------------------------------- */
+
+       typedef struct {
+               uint32_t memcStatus;
+               uint32_t memcCmd;
+               uint32_t directCmd;
+               uint32_t memoryCfg;
+               uint32_t refreshPrd;
+               uint32_t casLatency;
+               uint32_t writeLatency;
+               uint32_t tMrd;
+               uint32_t tRas;
+               uint32_t tRc;
+               uint32_t tRcd;
+               uint32_t tRfc;
+               uint32_t tRp;
+               uint32_t tRrd;
+               uint32_t tWr;
+               uint32_t tWtr;
+               uint32_t tXp;
+               uint32_t tXsr;
+               uint32_t tEsr;
+               uint32_t memoryCfg2;
+               uint32_t memoryCfg3;
+               uint32_t tFaw;
+       } ddrcReg_CTLR_MEMC_REG_t;
+
+#define ddrcReg_CTLR_MEMC_REG_OFFSET                    0x0000
+#define ddrcReg_CTLR_MEMC_REGP                          ((volatile ddrcReg_CTLR_MEMC_REG_t *)  (MM_IO_BASE_DDRC + ddrcReg_CTLR_MEMC_REG_OFFSET))
+
+/* ----------------------------------------------------- */
+
+#define ddrcReg_CTLR_MEMC_STATUS_BANKS_MASK             (0x3 << 12)
+#define ddrcReg_CTLR_MEMC_STATUS_BANKS_4                (0x0 << 12)
+#define ddrcReg_CTLR_MEMC_STATUS_BANKS_8                (0x3 << 12)
+
+#define ddrcReg_CTLR_MEMC_STATUS_MONITORS_MASK          (0x3 << 10)
+#define ddrcReg_CTLR_MEMC_STATUS_MONITORS_0             (0x0 << 10)
+#define ddrcReg_CTLR_MEMC_STATUS_MONITORS_1             (0x1 << 10)
+#define ddrcReg_CTLR_MEMC_STATUS_MONITORS_2             (0x2 << 10)
+#define ddrcReg_CTLR_MEMC_STATUS_MONITORS_4             (0x3 << 10)
+
+#define ddrcReg_CTLR_MEMC_STATUS_CHIPS_MASK             (0x3 << 7)
+#define ddrcReg_CTLR_MEMC_STATUS_CHIPS_1                (0x0 << 7)
+#define ddrcReg_CTLR_MEMC_STATUS_CHIPS_2                (0x1 << 7)
+#define ddrcReg_CTLR_MEMC_STATUS_CHIPS_3                (0x2 << 7)
+#define ddrcReg_CTLR_MEMC_STATUS_CHIPS_4                (0x3 << 7)
+
+#define ddrcReg_CTLR_MEMC_STATUS_TYPE_MASK              (0x7 << 4)
+#define ddrcReg_CTLR_MEMC_STATUS_TYPE_DDR2              (0x5 << 4)
+
+#define ddrcReg_CTLR_MEMC_STATUS_WIDTH_MASK             (0x3 << 2)
+#define ddrcReg_CTLR_MEMC_STATUS_WIDTH_16               (0x0 << 2)
+#define ddrcReg_CTLR_MEMC_STATUS_WIDTH_32               (0x1 << 2)
+#define ddrcReg_CTLR_MEMC_STATUS_WIDTH_64               (0x2 << 2)
+#define ddrcReg_CTLR_MEMC_STATUS_WIDTH_128              (0x3 << 2)
+
+#define ddrcReg_CTLR_MEMC_STATUS_STATE_MASK             (0x3 << 0)
+#define ddrcReg_CTLR_MEMC_STATUS_STATE_CONFIG           (0x0 << 0)
+#define ddrcReg_CTLR_MEMC_STATUS_STATE_READY            (0x1 << 0)
+#define ddrcReg_CTLR_MEMC_STATUS_STATE_PAUSED           (0x2 << 0)
+#define ddrcReg_CTLR_MEMC_STATUS_STATE_LOWPWR           (0x3 << 0)
+
+/* ----------------------------------------------------- */
+
+#define ddrcReg_CTLR_MEMC_CMD_MASK                      (0x7 << 0)
+#define ddrcReg_CTLR_MEMC_CMD_GO                        (0x0 << 0)
+#define ddrcReg_CTLR_MEMC_CMD_SLEEP                     (0x1 << 0)
+#define ddrcReg_CTLR_MEMC_CMD_WAKEUP                    (0x2 << 0)
+#define ddrcReg_CTLR_MEMC_CMD_PAUSE                     (0x3 << 0)
+#define ddrcReg_CTLR_MEMC_CMD_CONFIGURE                 (0x4 << 0)
+#define ddrcReg_CTLR_MEMC_CMD_ACTIVE_PAUSE              (0x7 << 0)
+
+/* ----------------------------------------------------- */
+
+#define ddrcReg_CTLR_DIRECT_CMD_CHIP_SHIFT              20
+#define ddrcReg_CTLR_DIRECT_CMD_CHIP_MASK               (0x3 << ddrcReg_CTLR_DIRECT_CMD_CHIP_SHIFT)
+
+#define ddrcReg_CTLR_DIRECT_CMD_TYPE_PRECHARGEALL       (0x0 << 18)
+#define ddrcReg_CTLR_DIRECT_CMD_TYPE_AUTOREFRESH        (0x1 << 18)
+#define ddrcReg_CTLR_DIRECT_CMD_TYPE_MODEREG            (0x2 << 18)
+#define ddrcReg_CTLR_DIRECT_CMD_TYPE_NOP                (0x3 << 18)
+
+#define ddrcReg_CTLR_DIRECT_CMD_BANK_SHIFT              16
+#define ddrcReg_CTLR_DIRECT_CMD_BANK_MASK               (0x3 << ddrcReg_CTLR_DIRECT_CMD_BANK_SHIFT)
+
+#define ddrcReg_CTLR_DIRECT_CMD_ADDR_SHIFT              0
+#define ddrcReg_CTLR_DIRECT_CMD_ADDR_MASK               (0x1ffff << ddrcReg_CTLR_DIRECT_CMD_ADDR_SHIFT)
+
+/* ----------------------------------------------------- */
+
+#define ddrcReg_CTLR_MEMORY_CFG_CHIP_CNT_MASK           (0x3 << 21)
+#define ddrcReg_CTLR_MEMORY_CFG_CHIP_CNT_1              (0x0 << 21)
+#define ddrcReg_CTLR_MEMORY_CFG_CHIP_CNT_2              (0x1 << 21)
+#define ddrcReg_CTLR_MEMORY_CFG_CHIP_CNT_3              (0x2 << 21)
+#define ddrcReg_CTLR_MEMORY_CFG_CHIP_CNT_4              (0x3 << 21)
+
+#define ddrcReg_CTLR_MEMORY_CFG_QOS_ARID_MASK           (0x7 << 18)
+#define ddrcReg_CTLR_MEMORY_CFG_QOS_ARID_3_0            (0x0 << 18)
+#define ddrcReg_CTLR_MEMORY_CFG_QOS_ARID_4_1            (0x1 << 18)
+#define ddrcReg_CTLR_MEMORY_CFG_QOS_ARID_5_2            (0x2 << 18)
+#define ddrcReg_CTLR_MEMORY_CFG_QOS_ARID_6_3            (0x3 << 18)
+#define ddrcReg_CTLR_MEMORY_CFG_QOS_ARID_7_4            (0x4 << 18)
+#define ddrcReg_CTLR_MEMORY_CFG_QOS_ARID_8_5            (0x5 << 18)
+#define ddrcReg_CTLR_MEMORY_CFG_QOS_ARID_9_6            (0x6 << 18)
+#define ddrcReg_CTLR_MEMORY_CFG_QOS_ARID_10_7           (0x7 << 18)
+
+#define ddrcReg_CTLR_MEMORY_CFG_BURST_LEN_MASK          (0x7 << 15)
+#define ddrcReg_CTLR_MEMORY_CFG_BURST_LEN_4             (0x2 << 15)
+#define ddrcReg_CTLR_MEMORY_CFG_BURST_LEN_8             (0x3 << 15)    /* @note Not supported in PL341 */
+
+#define ddrcReg_CTLR_MEMORY_CFG_PWRDOWN_ENABLE          (0x1 << 13)
+
+#define ddrcReg_CTLR_MEMORY_CFG_PWRDOWN_CYCLES_SHIFT    7
+#define ddrcReg_CTLR_MEMORY_CFG_PWRDOWN_CYCLES_MASK     (0x3f << ddrcReg_CTLR_MEMORY_CFG_PWRDOWN_CYCLES_SHIFT)
+
+#define ddrcReg_CTLR_MEMORY_CFG_AXI_ROW_BITS_MASK       (0x7 << 3)
+#define ddrcReg_CTLR_MEMORY_CFG_AXI_ROW_BITS_11         (0x0 << 3)
+#define ddrcReg_CTLR_MEMORY_CFG_AXI_ROW_BITS_12         (0x1 << 3)
+#define ddrcReg_CTLR_MEMORY_CFG_AXI_ROW_BITS_13         (0x2 << 3)
+#define ddrcReg_CTLR_MEMORY_CFG_AXI_ROW_BITS_14         (0x3 << 3)
+#define ddrcReg_CTLR_MEMORY_CFG_AXI_ROW_BITS_15         (0x4 << 3)
+#define ddrcReg_CTLR_MEMORY_CFG_AXI_ROW_BITS_16         (0x5 << 3)
+
+#define ddrcReg_CTLR_MEMORY_CFG_AXI_COL_BITS_MASK       (0x7 << 0)
+#define ddrcReg_CTLR_MEMORY_CFG_AXI_COL_BITS_9          (0x1 << 0)
+#define ddrcReg_CTLR_MEMORY_CFG_AXI_COL_BITS_10         (0x2 << 0)
+#define ddrcReg_CTLR_MEMORY_CFG_AXI_COL_BITS_11         (0x3 << 0)
+
+/* ----------------------------------------------------- */
+
+#define ddrcReg_CTLR_REFRESH_PRD_SHIFT                  0
+#define ddrcReg_CTLR_REFRESH_PRD_MASK                   (0x7fff << ddrcReg_CTLR_REFRESH_PRD_SHIFT)
+
+/* ----------------------------------------------------- */
+
+#define ddrcReg_CTLR_CAS_LATENCY_SHIFT                  1
+#define ddrcReg_CTLR_CAS_LATENCY_MASK                   (0x7 << ddrcReg_CTLR_CAS_LATENCY_SHIFT)
+
+/* ----------------------------------------------------- */
+
+#define ddrcReg_CTLR_WRITE_LATENCY_SHIFT                0
+#define ddrcReg_CTLR_WRITE_LATENCY_MASK                 (0x7 << ddrcReg_CTLR_WRITE_LATENCY_SHIFT)
+
+/* ----------------------------------------------------- */
+
+#define ddrcReg_CTLR_T_MRD_SHIFT                        0
+#define ddrcReg_CTLR_T_MRD_MASK                         (0x7f << ddrcReg_CTLR_T_MRD_SHIFT)
+
+/* ----------------------------------------------------- */
+
+#define ddrcReg_CTLR_T_RAS_SHIFT                        0
+#define ddrcReg_CTLR_T_RAS_MASK                         (0x1f << ddrcReg_CTLR_T_RAS_SHIFT)
+
+/* ----------------------------------------------------- */
+
+#define ddrcReg_CTLR_T_RC_SHIFT                         0
+#define ddrcReg_CTLR_T_RC_MASK                          (0x1f << ddrcReg_CTLR_T_RC_SHIFT)
+
+/* ----------------------------------------------------- */
+
+#define ddrcReg_CTLR_T_RCD_SCHEDULE_DELAY_SHIFT         8
+#define ddrcReg_CTLR_T_RCD_SCHEDULE_DELAY_MASK          (0x7 << ddrcReg_CTLR_T_RCD_SCHEDULE_DELAY_SHIFT)
+
+#define ddrcReg_CTLR_T_RCD_SHIFT                        0
+#define ddrcReg_CTLR_T_RCD_MASK                         (0x7 << ddrcReg_CTLR_T_RCD_SHIFT)
+
+/* ----------------------------------------------------- */
+
+#define ddrcReg_CTLR_T_RFC_SCHEDULE_DELAY_SHIFT         8
+#define ddrcReg_CTLR_T_RFC_SCHEDULE_DELAY_MASK          (0x7f << ddrcReg_CTLR_T_RFC_SCHEDULE_DELAY_SHIFT)
+
+#define ddrcReg_CTLR_T_RFC_SHIFT                        0
+#define ddrcReg_CTLR_T_RFC_MASK                         (0x7f << ddrcReg_CTLR_T_RFC_SHIFT)
+
+/* ----------------------------------------------------- */
+
+#define ddrcReg_CTLR_T_RP_SCHEDULE_DELAY_SHIFT          8
+#define ddrcReg_CTLR_T_RP_SCHEDULE_DELAY_MASK           (0x7 << ddrcReg_CTLR_T_RP_SCHEDULE_DELAY_SHIFT)
+
+#define ddrcReg_CTLR_T_RP_SHIFT                         0
+#define ddrcReg_CTLR_T_RP_MASK                          (0xf << ddrcReg_CTLR_T_RP_SHIFT)
+
+/* ----------------------------------------------------- */
+
+#define ddrcReg_CTLR_T_RRD_SHIFT                        0
+#define ddrcReg_CTLR_T_RRD_MASK                         (0xf << ddrcReg_CTLR_T_RRD_SHIFT)
+
+/* ----------------------------------------------------- */
+
+#define ddrcReg_CTLR_T_WR_SHIFT                         0
+#define ddrcReg_CTLR_T_WR_MASK                          (0x7 << ddrcReg_CTLR_T_WR_SHIFT)
+
+/* ----------------------------------------------------- */
+
+#define ddrcReg_CTLR_T_WTR_SHIFT                        0
+#define ddrcReg_CTLR_T_WTR_MASK                         (0x7 << ddrcReg_CTLR_T_WTR_SHIFT)
+
+/* ----------------------------------------------------- */
+
+#define ddrcReg_CTLR_T_XP_SHIFT                         0
+#define ddrcReg_CTLR_T_XP_MASK                          (0xff << ddrcReg_CTLR_T_XP_SHIFT)
+
+/* ----------------------------------------------------- */
+
+#define ddrcReg_CTLR_T_XSR_SHIFT                        0
+#define ddrcReg_CTLR_T_XSR_MASK                         (0xff << ddrcReg_CTLR_T_XSR_SHIFT)
+
+/* ----------------------------------------------------- */
+
+#define ddrcReg_CTLR_T_ESR_SHIFT                        0
+#define ddrcReg_CTLR_T_ESR_MASK                         (0xff << ddrcReg_CTLR_T_ESR_SHIFT)
+
+/* ----------------------------------------------------- */
+
+#define ddrcReg_CTLR_MEMORY_CFG2_WIDTH_MASK             (0x3 << 6)
+#define ddrcReg_CTLR_MEMORY_CFG2_WIDTH_16BITS           (0 << 6)
+#define ddrcReg_CTLR_MEMORY_CFG2_WIDTH_32BITS           (1 << 6)
+#define ddrcReg_CTLR_MEMORY_CFG2_WIDTH_64BITS           (2 << 6)
+
+#define ddrcReg_CTLR_MEMORY_CFG2_AXI_BANK_BITS_MASK     (0x3 << 4)
+#define ddrcReg_CTLR_MEMORY_CFG2_AXI_BANK_BITS_2        (0 << 4)
+#define ddrcReg_CTLR_MEMORY_CFG2_AXI_BANK_BITS_3        (3 << 4)
+
+#define ddrcReg_CTLR_MEMORY_CFG2_CKE_INIT_STATE_LOW     (0 << 3)
+#define ddrcReg_CTLR_MEMORY_CFG2_CKE_INIT_STATE_HIGH    (1 << 3)
+
+#define ddrcReg_CTLR_MEMORY_CFG2_DQM_INIT_STATE_LOW     (0 << 2)
+#define ddrcReg_CTLR_MEMORY_CFG2_DQM_INIT_STATE_HIGH    (1 << 2)
+
+#define ddrcReg_CTLR_MEMORY_CFG2_CLK_MASK               (0x3 << 0)
+#define ddrcReg_CTLR_MEMORY_CFG2_CLK_ASYNC              (0 << 0)
+#define ddrcReg_CTLR_MEMORY_CFG2_CLK_SYNC_A_LE_M        (1 << 0)
+#define ddrcReg_CTLR_MEMORY_CFG2_CLK_SYNC_A_GT_M        (3 << 0)
+
+/* ----------------------------------------------------- */
+
+#define ddrcReg_CTLR_MEMORY_CFG3_REFRESH_TO_SHIFT       0
+#define ddrcReg_CTLR_MEMORY_CFG3_REFRESH_TO_MASK        (0x7 << ddrcReg_CTLR_MEMORY_CFG3_REFRESH_TO_SHIFT)
+
+/* ----------------------------------------------------- */
+
+#define ddrcReg_CTLR_T_FAW_SCHEDULE_DELAY_SHIFT         8
+#define ddrcReg_CTLR_T_FAW_SCHEDULE_DELAY_MASK          (0x1f << ddrcReg_CTLR_T_FAW_SCHEDULE_DELAY_SHIFT)
+
+#define ddrcReg_CTLR_T_FAW_PERIOD_SHIFT                 0
+#define ddrcReg_CTLR_T_FAW_PERIOD_MASK                  (0x1f << ddrcReg_CTLR_T_FAW_PERIOD_SHIFT)
+
+/* -------------------------------------------------------------------- */
+/* -------------------------------------------------------------------- */
+/* ARM PL341 AXI ID QOS configuration registers, offset 0x100 */
+/* -------------------------------------------------------------------- */
+/* -------------------------------------------------------------------- */
+
+#define ddrcReg_CTLR_QOS_CNT                            16
+#define ddrcReg_CTLR_QOS_MAX                            (ddrcReg_CTLR_QOS_CNT - 1)
+
+       typedef struct {
+               uint32_t cfg[ddrcReg_CTLR_QOS_CNT];
+       } ddrcReg_CTLR_QOS_REG_t;
+
+#define ddrcReg_CTLR_QOS_REG_OFFSET                     0x100
+#define ddrcReg_CTLR_QOS_REGP                           ((volatile ddrcReg_CTLR_QOS_REG_t *) (MM_IO_BASE_DDRC + ddrcReg_CTLR_QOS_REG_OFFSET))
+
+/* ----------------------------------------------------- */
+
+#define ddrcReg_CTLR_QOS_CFG_MAX_SHIFT                  2
+#define ddrcReg_CTLR_QOS_CFG_MAX_MASK                   (0xff << ddrcReg_CTLR_QOS_CFG_MAX_SHIFT)
+
+#define ddrcReg_CTLR_QOS_CFG_MIN_SHIFT                  1
+#define ddrcReg_CTLR_QOS_CFG_MIN_MASK                   (1 << ddrcReg_CTLR_QOS_CFG_MIN_SHIFT)
+
+#define ddrcReg_CTLR_QOS_CFG_ENABLE                     (1 << 0)
+
+/* -------------------------------------------------------------------- */
+/* -------------------------------------------------------------------- */
+/* ARM PL341 Memory chip configuration registers, offset 0x200 */
+/* -------------------------------------------------------------------- */
+/* -------------------------------------------------------------------- */
+
+#define ddrcReg_CTLR_CHIP_CNT                           4
+#define ddrcReg_CTLR_CHIP_MAX                           (ddrcReg_CTLR_CHIP_CNT - 1)
+
+       typedef struct {
+               uint32_t cfg[ddrcReg_CTLR_CHIP_CNT];
+       } ddrcReg_CTLR_CHIP_REG_t;
+
+#define ddrcReg_CTLR_CHIP_REG_OFFSET                    0x200
+#define ddrcReg_CTLR_CHIP_REGP                          ((volatile ddrcReg_CTLR_CHIP_REG_t *) (MM_IO_BASE_DDRC + ddrcReg_CTLR_CHIP_REG_OFFSET))
+
+/* ----------------------------------------------------- */
+
+#define ddrcReg_CTLR_CHIP_CFG_MEM_ORG_MASK              (1 << 16)
+#define ddrcReg_CTLR_CHIP_CFG_MEM_ORG_ROW_BANK_COL      (0 << 16)
+#define ddrcReg_CTLR_CHIP_CFG_MEM_ORG_BANK_ROW_COL      (1 << 16)
+
+#define ddrcReg_CTLR_CHIP_CFG_AXI_ADDR_MATCH_SHIFT      8
+#define ddrcReg_CTLR_CHIP_CFG_AXI_ADDR_MATCH_MASK       (0xff << ddrcReg_CTLR_CHIP_CFG_AXI_ADDR_MATCH_SHIFT)
+
+#define ddrcReg_CTLR_CHIP_CFG_AXI_ADDR_MASK_SHIFT       0
+#define ddrcReg_CTLR_CHIP_CFG_AXI_ADDR_MASK_MASK        (0xff << ddrcReg_CTLR_CHIP_CFG_AXI_ADDR_MASK_SHIFT)
+
+/* -------------------------------------------------------------------- */
+/* -------------------------------------------------------------------- */
+/* ARM PL341 User configuration registers, offset 0x300 */
+/* -------------------------------------------------------------------- */
+/* -------------------------------------------------------------------- */
+
+#define ddrcReg_CTLR_USER_OUTPUT_CNT                    2
+
+       typedef struct {
+               uint32_t input;
+               uint32_t output[ddrcReg_CTLR_USER_OUTPUT_CNT];
+               uint32_t feature;
+       } ddrcReg_CTLR_USER_REG_t;
+
+#define ddrcReg_CTLR_USER_REG_OFFSET                    0x300
+#define ddrcReg_CTLR_USER_REGP                          ((volatile ddrcReg_CTLR_USER_REG_t *) (MM_IO_BASE_DDRC + ddrcReg_CTLR_USER_REG_OFFSET))
+
+/* ----------------------------------------------------- */
+
+#define ddrcReg_CTLR_USER_INPUT_STATUS_SHIFT            0
+#define ddrcReg_CTLR_USER_INPUT_STATUS_MASK             (0xff << ddrcReg_CTLR_USER_INPUT_STATUS_SHIFT)
+
+/* ----------------------------------------------------- */
+
+#define ddrcReg_CTLR_USER_OUTPUT_CFG_SHIFT              0
+#define ddrcReg_CTLR_USER_OUTPUT_CFG_MASK               (0xff << ddrcReg_CTLR_USER_OUTPUT_CFG_SHIFT)
+
+#define ddrcReg_CTLR_USER_OUTPUT_0_CFG_SYNC_BRIDGE_SHIFT      1
+#define ddrcReg_CTLR_USER_OUTPUT_0_CFG_SYNC_BRIDGE_MASK       (1 << ddrcReg_CTLR_USER_OUTPUT_0_CFG_SYNC_BRIDGE_SHIFT)
+#define ddrcReg_CTLR_USER_OUTPUT_0_CFG_SYNC_BRIDGE_BP134      (0 << ddrcReg_CTLR_USER_OUTPUT_0_CFG_SYNC_BRIDGE_SHIFT)
+#define ddrcReg_CTLR_USER_OUTPUT_0_CFG_SYNC_BRIDGE_PL301      (1 << ddrcReg_CTLR_USER_OUTPUT_0_CFG_SYNC_BRIDGE_SHIFT)
+#define ddrcReg_CTLR_USER_OUTPUT_0_CFG_SYNC_BRIDGE_REGISTERED ddrcReg_CTLR_USER_OUTPUT_0_CFG_SYNC_BRIDGE_PL301
+
+/* ----------------------------------------------------- */
+
+#define ddrcReg_CTLR_FEATURE_WRITE_BLOCK_DISABLE        (1 << 2)
+#define ddrcReg_CTLR_FEATURE_EARLY_BURST_RSP_DISABLE    (1 << 0)
+
+/*********************************************************************/
+/* Broadcom DDR23 PHY register definitions */
+/*********************************************************************/
+
+/* -------------------------------------------------------------------- */
+/* -------------------------------------------------------------------- */
+/* Broadcom DDR23 PHY Address and Control register definitions */
+/* -------------------------------------------------------------------- */
+/* -------------------------------------------------------------------- */
+
+       typedef struct {
+               uint32_t revision;
+               uint32_t pmCtl;
+                REG32_RSVD(0x0008, 0x0010);
+               uint32_t pllStatus;
+               uint32_t pllCfg;
+               uint32_t pllPreDiv;
+               uint32_t pllDiv;
+               uint32_t pllCtl1;
+               uint32_t pllCtl2;
+               uint32_t ssCtl;
+               uint32_t ssCfg;
+               uint32_t vdlStatic;
+               uint32_t vdlDynamic;
+               uint32_t padIdle;
+               uint32_t pvtComp;
+               uint32_t padDrive;
+               uint32_t clkRgltrCtl;
+       } ddrcReg_PHY_ADDR_CTL_REG_t;
+
+#define ddrcReg_PHY_ADDR_CTL_REG_OFFSET                 0x0400
+#define ddrcReg_PHY_ADDR_CTL_REGP                       ((volatile ddrcReg_PHY_ADDR_CTL_REG_t *) (MM_IO_BASE_DDRC + ddrcReg_PHY_ADDR_CTL_REG_OFFSET))
+
+/* @todo These SS definitions are duplicates of ones below */
+
+#define ddrcReg_PHY_ADDR_SS_CTRL_ENABLE                 0x00000001
+#define ddrcReg_PHY_ADDR_SS_CFG_CYCLE_PER_TICK_MASK     0xFFFF0000
+#define ddrcReg_PHY_ADDR_SS_CFG_CYCLE_PER_TICK_SHIFT    16
+#define ddrcReg_PHY_ADDR_SS_CFG_MIN_CYCLE_PER_TICK      10     /* Higher the value, lower the SS modulation frequency */
+#define ddrcReg_PHY_ADDR_SS_CFG_NDIV_AMPLITUDE_MASK     0x0000FFFF
+#define ddrcReg_PHY_ADDR_SS_CFG_NDIV_AMPLITUDE_SHIFT    0
+
+/* ----------------------------------------------------- */
+
+#define ddrcReg_PHY_ADDR_CTL_REVISION_MAJOR_SHIFT       8
+#define ddrcReg_PHY_ADDR_CTL_REVISION_MAJOR_MASK        (0xff << ddrcReg_PHY_ADDR_CTL_REVISION_MAJOR_SHIFT)
+
+#define ddrcReg_PHY_ADDR_CTL_REVISION_MINOR_SHIFT       0
+#define ddrcReg_PHY_ADDR_CTL_REVISION_MINOR_MASK        (0xff << ddrcReg_PHY_ADDR_CTL_REVISION_MINOR_SHIFT)
+
+/* ----------------------------------------------------- */
+
+#define ddrcReg_PHY_ADDR_CTL_CLK_PM_CTL_DDR_CLK_DISABLE (1 << 0)
+
+/* ----------------------------------------------------- */
+
+#define ddrcReg_PHY_ADDR_CTL_PLL_STATUS_LOCKED          (1 << 0)
+
+/* ----------------------------------------------------- */
+
+#define ddrcReg_PHY_ADDR_CTL_PLL_CFG_DIV2_CLK_RESET     (1 << 31)
+
+#define ddrcReg_PHY_ADDR_CTL_PLL_CFG_TEST_SEL_SHIFT     17
+#define ddrcReg_PHY_ADDR_CTL_PLL_CFG_TEST_SEL_MASK      (0x1f << ddrcReg_PHY_ADDR_CTL_PLL_CFG_TEST_SEL_SHIFT)
+
+#define ddrcReg_PHY_ADDR_CTL_PLL_CFG_TEST_ENABLE        (1 << 16)
+
+#define ddrcReg_PHY_ADDR_CTL_PLL_CFG_BGAP_ADJ_SHIFT     12
+#define ddrcReg_PHY_ADDR_CTL_PLL_CFG_BGAP_ADJ_MASK      (0xf << ddrcReg_PHY_ADDR_CTL_PLL_CFG_BGAP_ADJ_SHIFT)
+
+#define ddrcReg_PHY_ADDR_CTL_PLL_CFG_VCO_RNG            (1 << 7)
+#define ddrcReg_PHY_ADDR_CTL_PLL_CFG_CH1_PWRDWN         (1 << 6)
+#define ddrcReg_PHY_ADDR_CTL_PLL_CFG_BYPASS_ENABLE      (1 << 5)
+#define ddrcReg_PHY_ADDR_CTL_PLL_CFG_CLKOUT_ENABLE      (1 << 4)
+#define ddrcReg_PHY_ADDR_CTL_PLL_CFG_D_RESET            (1 << 3)
+#define ddrcReg_PHY_ADDR_CTL_PLL_CFG_A_RESET            (1 << 2)
+#define ddrcReg_PHY_ADDR_CTL_PLL_CFG_PWRDWN             (1 << 0)
+
+/* ----------------------------------------------------- */
+
+#define ddrcReg_PHY_ADDR_CTL_PLL_PRE_DIV_DITHER_MFB     (1 << 26)
+#define ddrcReg_PHY_ADDR_CTL_PLL_PRE_DIV_PWRDWN         (1 << 25)
+
+#define ddrcReg_PHY_ADDR_CTL_PLL_PRE_DIV_MODE_SHIFT     20
+#define ddrcReg_PHY_ADDR_CTL_PLL_PRE_DIV_MODE_MASK      (0x7 << ddrcReg_PHY_ADDR_CTL_PLL_PRE_DIV_MODE_SHIFT)
+
+#define ddrcReg_PHY_ADDR_CTL_PLL_PRE_DIV_INT_SHIFT      8
+#define ddrcReg_PHY_ADDR_CTL_PLL_PRE_DIV_INT_MASK       (0x1ff << ddrcReg_PHY_ADDR_CTL_PLL_PRE_DIV_INT_SHIFT)
+
+#define ddrcReg_PHY_ADDR_CTL_PLL_PRE_DIV_P2_SHIFT       4
+#define ddrcReg_PHY_ADDR_CTL_PLL_PRE_DIV_P2_MASK        (0xf << ddrcReg_PHY_ADDR_CTL_PLL_PRE_DIV_P2_SHIFT)
+
+#define ddrcReg_PHY_ADDR_CTL_PLL_PRE_DIV_P1_SHIFT       0
+#define ddrcReg_PHY_ADDR_CTL_PLL_PRE_DIV_P1_MASK        (0xf << ddrcReg_PHY_ADDR_CTL_PLL_PRE_DIV_P1_SHIFT)
+
+/* ----------------------------------------------------- */
+
+#define ddrcReg_PHY_ADDR_CTL_PLL_DIV_M1_SHIFT           24
+#define ddrcReg_PHY_ADDR_CTL_PLL_DIV_M1_MASK            (0xff << ddrcReg_PHY_ADDR_CTL_PLL_DIV_M1_SHIFT)
+
+#define ddrcReg_PHY_ADDR_CTL_PLL_DIV_FRAC_SHIFT         0
+#define ddrcReg_PHY_ADDR_CTL_PLL_DIV_FRAC_MASK          (0xffffff << ddrcReg_PHY_ADDR_CTL_PLL_DIV_FRAC_SHIFT)
+
+/* ----------------------------------------------------- */
+
+#define ddrcReg_PHY_ADDR_CTL_PLL_CTL1_TESTA_SHIFT       30
+#define ddrcReg_PHY_ADDR_CTL_PLL_CTL1_TESTA_MASK        (0x3 << ddrcReg_PHY_ADDR_CTL_PLL_CTL1_TESTA_SHIFT)
+
+#define ddrcReg_PHY_ADDR_CTL_PLL_CTL1_KVCO_XS_SHIFT     27
+#define ddrcReg_PHY_ADDR_CTL_PLL_CTL1_KVCO_XS_MASK      (0x7 << ddrcReg_PHY_ADDR_CTL_PLL_CTL1_KVCO_XS_SHIFT)
+
+#define ddrcReg_PHY_ADDR_CTL_PLL_CTL1_KVCO_XF_SHIFT     24
+#define ddrcReg_PHY_ADDR_CTL_PLL_CTL1_KVCO_XF_MASK      (0x7 << ddrcReg_PHY_ADDR_CTL_PLL_CTL1_KVCO_XF_SHIFT)
+
+#define ddrcReg_PHY_ADDR_CTL_PLL_CTL1_LPF_BW_SHIFT      22
+#define ddrcReg_PHY_ADDR_CTL_PLL_CTL1_LPF_BW_MASK       (0x3 << ddrcReg_PHY_ADDR_CTL_PLL_CTL1_LPF_BW_SHIFT)
+
+#define ddrcReg_PHY_ADDR_CTL_PLL_CTL1_LF_ORDER          (0x1 << 21)
+
+#define ddrcReg_PHY_ADDR_CTL_PLL_CTL1_CN_SHIFT          19
+#define ddrcReg_PHY_ADDR_CTL_PLL_CTL1_CN_MASK           (0x3 << ddrcReg_PHY_ADDR_CTL_PLL_CTL1_CN_SHIFT)
+
+#define ddrcReg_PHY_ADDR_CTL_PLL_CTL1_RN_SHIFT          17
+#define ddrcReg_PHY_ADDR_CTL_PLL_CTL1_RN_MASK           (0x3 << ddrcReg_PHY_ADDR_CTL_PLL_CTL1_RN_SHIFT)
+
+#define ddrcReg_PHY_ADDR_CTL_PLL_CTL1_CP_SHIFT          15
+#define ddrcReg_PHY_ADDR_CTL_PLL_CTL1_CP_MASK           (0x3 << ddrcReg_PHY_ADDR_CTL_PLL_CTL1_CP_SHIFT)
+
+#define ddrcReg_PHY_ADDR_CTL_PLL_CTL1_CZ_SHIFT          13
+#define ddrcReg_PHY_ADDR_CTL_PLL_CTL1_CZ_MASK           (0x3 << ddrcReg_PHY_ADDR_CTL_PLL_CTL1_CZ_SHIFT)
+
+#define ddrcReg_PHY_ADDR_CTL_PLL_CTL1_RZ_SHIFT          10
+#define ddrcReg_PHY_ADDR_CTL_PLL_CTL1_RZ_MASK           (0x7 << ddrcReg_PHY_ADDR_CTL_PLL_CTL1_RZ_SHIFT)
+
+#define ddrcReg_PHY_ADDR_CTL_PLL_CTL1_ICPX_SHIFT        5
+#define ddrcReg_PHY_ADDR_CTL_PLL_CTL1_ICPX_MASK         (0x1f << ddrcReg_PHY_ADDR_CTL_PLL_CTL1_ICPX_SHIFT)
+
+#define ddrcReg_PHY_ADDR_CTL_PLL_CTL1_ICP_OFF_SHIFT     0
+#define ddrcReg_PHY_ADDR_CTL_PLL_CTL1_ICP_OFF_MASK      (0x1f << ddrcReg_PHY_ADDR_CTL_PLL_CTL1_ICP_OFF_SHIFT)
+
+/* ----------------------------------------------------- */
+#define ddrcReg_PHY_ADDR_CTL_PLL_CTL2_PTAP_ADJ_SHIFT    4
+#define ddrcReg_PHY_ADDR_CTL_PLL_CTL2_PTAP_ADJ_MASK     (0x3 << ddrcReg_PHY_ADDR_CTL_PLL_CTL2_PTAP_ADJ_SHIFT)
+
+#define ddrcReg_PHY_ADDR_CTL_PLL_CTL2_CTAP_ADJ_SHIFT    2
+#define ddrcReg_PHY_ADDR_CTL_PLL_CTL2_CTAP_ADJ_MASK     (0x3 << ddrcReg_PHY_ADDR_CTL_PLL_CTL2_CTAP_ADJ_SHIFT)
+
+#define ddrcReg_PHY_ADDR_CTL_PLL_CTL2_LOWCUR_ENABLE     (0x1 << 1)
+#define ddrcReg_PHY_ADDR_CTL_PLL_CTL2_BIASIN_ENABLE     (0x1 << 0)
+
+/* ----------------------------------------------------- */
+
+#define ddrcReg_PHY_ADDR_CTL_PLL_SS_EN_ENABLE           (0x1 << 0)
+
+/* ----------------------------------------------------- */
+
+#define ddrcReg_PHY_ADDR_CTL_PLL_SS_CFG_CYC_PER_TICK_SHIFT  16
+#define ddrcReg_PHY_ADDR_CTL_PLL_SS_CFG_CYC_PER_TICK_MASK   (0xffff << ddrcReg_PHY_ADDR_CTL_PLL_SS_CFG_CYC_PER_TICK_SHIFT)
+
+#define ddrcReg_PHY_ADDR_CTL_PLL_SS_CFG_NDIV_AMP_SHIFT      0
+#define ddrcReg_PHY_ADDR_CTL_PLL_SS_CFG_NDIV_AMP_MASK       (0xffff << ddrcReg_PHY_ADDR_CTL_PLL_SS_CFG_NDIV_AMP_SHIFT)
+
+/* ----------------------------------------------------- */
+
+#define ddrcReg_PHY_ADDR_CTL_VDL_STATIC_OVR_FORCE           (1 << 20)
+#define ddrcReg_PHY_ADDR_CTL_VDL_STATIC_OVR_ENABLE          (1 << 16)
+
+#define ddrcReg_PHY_ADDR_CTL_VDL_STATIC_OVR_FALL_SHIFT      12
+#define ddrcReg_PHY_ADDR_CTL_VDL_STATIC_OVR_FALL_MASK       (0x3 << ddrcReg_PHY_ADDR_CTL_VDL_STATIC_OVR_FALL_SHIFT)
+
+#define ddrcReg_PHY_ADDR_CTL_VDL_STATIC_OVR_RISE_SHIFT      8
+#define ddrcReg_PHY_ADDR_CTL_VDL_STATIC_OVR_RISE_MASK       (0x3 << ddrcReg_PHY_ADDR_CTL_VDL_STATIC_OVR_RISE_SHIFT)
+
+#define ddrcReg_PHY_ADDR_CTL_VDL_STATIC_OVR_STEP_SHIFT      0
+#define ddrcReg_PHY_ADDR_CTL_VDL_STATIC_OVR_STEP_MASK       (0x3f << ddrcReg_PHY_ADDR_CTL_VDL_STATIC_OVR_STEP_SHIFT)
+
+/* ----------------------------------------------------- */
+
+#define ddrcReg_PHY_ADDR_CTL_VDL_DYNAMIC_OVR_ENABLE         (1 << 16)
+
+#define ddrcReg_PHY_ADDR_CTL_VDL_DYNAMIC_OVR_FALL_SHIFT     12
+#define ddrcReg_PHY_ADDR_CTL_VDL_DYNAMIC_OVR_FALL_MASK      (0x3 << ddrcReg_PHY_ADDR_CTL_VDL_DYNAMIC_OVR_FALL_SHIFT)
+
+#define ddrcReg_PHY_ADDR_CTL_VDL_DYNAMIC_OVR_RISE_SHIFT     8
+#define ddrcReg_PHY_ADDR_CTL_VDL_DYNAMIC_OVR_RISE_MASK      (0x3 << ddrcReg_PHY_ADDR_CTL_VDL_DYNAMIC_OVR_RISE_SHIFT)
+
+#define ddrcReg_PHY_ADDR_CTL_VDL_DYNAMIC_OVR_STEP_SHIFT     0
+#define ddrcReg_PHY_ADDR_CTL_VDL_DYNAMIC_OVR_STEP_MASK      (0x3f << ddrcReg_PHY_ADDR_CTL_VDL_DYNAMIC_OVR_STEP_SHIFT)
+
+/* ----------------------------------------------------- */
+
+#define ddrcReg_PHY_ADDR_CTL_PAD_IDLE_ENABLE            (1u << 31)
+#define ddrcReg_PHY_ADDR_CTL_PAD_IDLE_RXENB_DISABLE     (1 << 8)
+#define ddrcReg_PHY_ADDR_CTL_PAD_IDLE_CTL_IDDQ_DISABLE  (1 << 6)
+#define ddrcReg_PHY_ADDR_CTL_PAD_IDLE_CTL_REB_DISABLE   (1 << 5)
+#define ddrcReg_PHY_ADDR_CTL_PAD_IDLE_CTL_OEB_DISABLE   (1 << 4)
+#define ddrcReg_PHY_ADDR_CTL_PAD_IDLE_CKE_IDDQ_DISABLE  (1 << 2)
+#define ddrcReg_PHY_ADDR_CTL_PAD_IDLE_CKE_REB_DISABLE   (1 << 1)
+#define ddrcReg_PHY_ADDR_CTL_PAD_IDLE_CKE_OEB_DISABLE   (1 << 0)
+
+/* ----------------------------------------------------- */
+
+#define ddrcReg_PHY_ADDR_CTL_PVT_COMP_PD_DONE           (1 << 30)
+#define ddrcReg_PHY_ADDR_CTL_PVT_COMP_ND_DONE           (1 << 29)
+#define ddrcReg_PHY_ADDR_CTL_PVT_COMP_SAMPLE_DONE       (1 << 28)
+#define ddrcReg_PHY_ADDR_CTL_PVT_COMP_SAMPLE_AUTO_ENABLE    (1 << 27)
+#define ddrcReg_PHY_ADDR_CTL_PVT_COMP_SAMPLE_ENABLE     (1 << 26)
+#define ddrcReg_PHY_ADDR_CTL_PVT_COMP_ADDR_OVR_ENABLE   (1 << 25)
+#define ddrcReg_PHY_ADDR_CTL_PVT_COMP_DQ_OVR_ENABLE     (1 << 24)
+
+#define ddrcReg_PHY_ADDR_CTL_PVT_COMP_PD_SHIFT          20
+#define ddrcReg_PHY_ADDR_CTL_PVT_COMP_PD_MASK           (0xf << ddrcReg_PHY_ADDR_CTL_PVT_COMP_PD_SHIFT)
+
+#define ddrcReg_PHY_ADDR_CTL_PVT_COMP_ND_SHIFT          16
+#define ddrcReg_PHY_ADDR_CTL_PVT_COMP_ND_MASK           (0xf << ddrcReg_PHY_ADDR_CTL_PVT_COMP_ND_SHIFT)
+
+#define ddrcReg_PHY_ADDR_CTL_PVT_COMP_ADDR_PD_SHIFT     12
+#define ddrcReg_PHY_ADDR_CTL_PVT_COMP_ADDR_PD_MASK      (0xf << ddrcReg_PHY_ADDR_CTL_PVT_COMP_ADDR_PD_SHIFT)
+
+#define ddrcReg_PHY_ADDR_CTL_PVT_COMP_ADDR_ND_SHIFT     8
+#define ddrcReg_PHY_ADDR_CTL_PVT_COMP_ADDR_ND_MASK      (0xf << ddrcReg_PHY_ADDR_CTL_PVT_COMP_ADDR_ND_SHIFT)
+
+#define ddrcReg_PHY_ADDR_CTL_PVT_COMP_DQ_PD_SHIFT       4
+#define ddrcReg_PHY_ADDR_CTL_PVT_COMP_DQ_PD_MASK        (0xf << ddrcReg_PHY_ADDR_CTL_PVT_COMP_DQ_PD_SHIFT)
+
+#define ddrcReg_PHY_ADDR_CTL_PVT_COMP_DQ_ND_SHIFT       0
+#define ddrcReg_PHY_ADDR_CTL_PVT_COMP_DQ_ND_MASK        (0xf << ddrcReg_PHY_ADDR_CTL_PVT_COMP_DQ_ND_SHIFT)
+
+/* ----------------------------------------------------- */
+
+#define ddrcReg_PHY_ADDR_CTL_PAD_DRIVE_RT60B            (1 << 4)
+#define ddrcReg_PHY_ADDR_CTL_PAD_DRIVE_SEL_SSTL18       (1 << 3)
+#define ddrcReg_PHY_ADDR_CTL_PAD_DRIVE_SELTXDRV_CI      (1 << 2)
+#define ddrcReg_PHY_ADDR_CTL_PAD_DRIVE_SELRXDRV         (1 << 1)
+#define ddrcReg_PHY_ADDR_CTL_PAD_DRIVE_SLEW             (1 << 0)
+
+/* ----------------------------------------------------- */
+
+#define ddrcReg_PHY_ADDR_CTL_CLK_RGLTR_CTL_PWR_HALF     (1 << 1)
+#define ddrcReg_PHY_ADDR_CTL_CLK_RGLTR_CTL_PWR_OFF      (1 << 0)
+
+/* -------------------------------------------------------------------- */
+/* -------------------------------------------------------------------- */
+/* Broadcom DDR23 PHY Byte Lane register definitions */
+/* -------------------------------------------------------------------- */
+/* -------------------------------------------------------------------- */
+
+#define ddrcReg_PHY_BYTE_LANE_CNT                       2
+#define ddrcReg_PHY_BYTE_LANE_MAX                       (ddrcReg_CTLR_BYTE_LANE_CNT - 1)
+
+#define ddrcReg_PHY_BYTE_LANE_VDL_OVR_CNT               8
+
+       typedef struct {
+               uint32_t revision;
+               uint32_t vdlCalibrate;
+               uint32_t vdlStatus;
+                REG32_RSVD(0x000c, 0x0010);
+               uint32_t vdlOverride[ddrcReg_PHY_BYTE_LANE_VDL_OVR_CNT];
+               uint32_t readCtl;
+               uint32_t readStatus;
+               uint32_t readClear;
+               uint32_t padIdleCtl;
+               uint32_t padDriveCtl;
+               uint32_t padClkCtl;
+               uint32_t writeCtl;
+               uint32_t clkRegCtl;
+       } ddrcReg_PHY_BYTE_LANE_REG_t;
+
+/* There are 2 instances of the byte Lane registers, one for each byte lane. */
+#define ddrcReg_PHY_BYTE_LANE_1_REG_OFFSET              0x0500
+#define ddrcReg_PHY_BYTE_LANE_2_REG_OFFSET              0x0600
+
+#define ddrcReg_PHY_BYTE_LANE_1_REGP                    ((volatile ddrcReg_PHY_BYTE_LANE_REG_t *) (MM_IO_BASE_DDRC + ddrcReg_PHY_BYTE_LANE_1_REG_OFFSET))
+#define ddrcReg_PHY_BYTE_LANE_2_REGP                    ((volatile ddrcReg_PHY_BYTE_LANE_REG_t *) (MM_IO_BASE_DDRC + ddrcReg_PHY_BYTE_LANE_2_REG_OFFSET))
+
+/* ----------------------------------------------------- */
+
+#define ddrcReg_PHY_BYTE_LANE_REVISION_MAJOR_SHIFT      8
+#define ddrcReg_PHY_BYTE_LANE_REVISION_MAJOR_MASK       (0xff << ddrcReg_PHY_BYTE_LANE_REVISION_MAJOR_SHIFT)
+
+#define ddrcReg_PHY_BYTE_LANE_REVISION_MINOR_SHIFT      0
+#define ddrcReg_PHY_BYTE_LANE_REVISION_MINOR_MASK       (0xff << ddrcReg_PHY_BYTE_LANE_REVISION_MINOR_SHIFT)
+
+/* ----------------------------------------------------- */
+
+#define ddrcReg_PHY_BYTE_LANE_VDL_CALIB_CLK_2CYCLE      (1 << 4)
+#define ddrcReg_PHY_BYTE_LANE_VDL_CALIB_CLK_1CYCLE      (0 << 4)
+
+#define ddrcReg_PHY_BYTE_LANE_VDL_CALIB_TEST            (1 << 3)
+#define ddrcReg_PHY_BYTE_LANE_VDL_CALIB_ALWAYS          (1 << 2)
+#define ddrcReg_PHY_BYTE_LANE_VDL_CALIB_ONCE            (1 << 1)
+#define ddrcReg_PHY_BYTE_LANE_VDL_CALIB_FAST            (1 << 0)
+
+/* ----------------------------------------------------- */
+
+/* The byte lane VDL status calibTotal[9:0] is comprised of [9:4] step value, [3:2] fine fall */
+/* and [1:0] fine rise. Note that calibTotal[9:0] is located at bit 4 in the VDL status */
+/* register. The fine rise and fall are no longer used, so add some definitions for just */
+/* the step setting to simplify things. */
+
+#define ddrcReg_PHY_BYTE_LANE_VDL_STATUS_STEP_SHIFT     8
+#define ddrcReg_PHY_BYTE_LANE_VDL_STATUS_STEP_MASK      (0x3f << ddrcReg_PHY_BYTE_LANE_VDL_STATUS_STEP_SHIFT)
+
+#define ddrcReg_PHY_BYTE_LANE_VDL_STATUS_TOTAL_SHIFT    4
+#define ddrcReg_PHY_BYTE_LANE_VDL_STATUS_TOTAL_MASK     (0x3ff << ddrcReg_PHY_BYTE_LANE_VDL_STATUS_TOTAL_SHIFT)
+
+#define ddrcReg_PHY_BYTE_LANE_VDL_STATUS_LOCK           (1 << 1)
+#define ddrcReg_PHY_BYTE_LANE_VDL_STATUS_IDLE           (1 << 0)
+
+/* ----------------------------------------------------- */
+
+#define ddrcReg_PHY_BYTE_LANE_VDL_OVR_ENABLE            (1 << 16)
+
+#define ddrcReg_PHY_BYTE_LANE_VDL_OVR_FALL_SHIFT        12
+#define ddrcReg_PHY_BYTE_LANE_VDL_OVR_FALL_MASK         (0x3 << ddrcReg_PHY_BYTE_LANE_VDL_OVR_FALL_SHIFT)
+
+#define ddrcReg_PHY_BYTE_LANE_VDL_OVR_RISE_SHIFT        8
+#define ddrcReg_PHY_BYTE_LANE_VDL_OVR_RISE_MASK         (0x3 << ddrcReg_PHY_BYTE_LANE_VDL_OVR_RISE_SHIFT)
+
+#define ddrcReg_PHY_BYTE_LANE_VDL_OVR_STEP_SHIFT        0
+#define ddrcReg_PHY_BYTE_LANE_VDL_OVR_STEP_MASK         (0x3f << ddrcReg_PHY_BYTE_LANE_VDL_OVR_STEP_SHIFT)
+
+#define ddrcReg_PHY_BYTE_LANE_VDL_OVR_IDX_STATIC_READ_DQS_P     0
+#define ddrcReg_PHY_BYTE_LANE_VDL_OVR_IDX_STATIC_READ_DQS_N     1
+#define ddrcReg_PHY_BYTE_LANE_VDL_OVR_IDX_STATIC_READ_EN        2
+#define ddrcReg_PHY_BYTE_LANE_VDL_OVR_IDX_STATIC_WRITE_DQ_DQM   3
+#define ddrcReg_PHY_BYTE_LANE_VDL_OVR_IDX_DYNAMIC_READ_DQS_P    4
+#define ddrcReg_PHY_BYTE_LANE_VDL_OVR_IDX_DYNAMIC_READ_DQS_N    5
+#define ddrcReg_PHY_BYTE_LANE_VDL_OVR_IDX_DYNAMIC_READ_EN       6
+#define ddrcReg_PHY_BYTE_LANE_VDL_OVR_IDX_DYNAMIC_WRITE_DQ_DQM  7
+
+/* ----------------------------------------------------- */
+
+#define ddrcReg_PHY_BYTE_LANE_READ_CTL_DELAY_SHIFT      8
+#define ddrcReg_PHY_BYTE_LANE_READ_CTL_DELAY_MASK       (0x3 << ddrcReg_PHY_BYTE_LANE_READ_CTL_DELAY_SHIFT)
+
+#define ddrcReg_PHY_BYTE_LANE_READ_CTL_DQ_ODT_ENABLE    (1 << 3)
+#define ddrcReg_PHY_BYTE_LANE_READ_CTL_DQ_ODT_ADJUST    (1 << 2)
+#define ddrcReg_PHY_BYTE_LANE_READ_CTL_RD_ODT_ENABLE    (1 << 1)
+#define ddrcReg_PHY_BYTE_LANE_READ_CTL_RD_ODT_ADJUST    (1 << 0)
+
+/* ----------------------------------------------------- */
+
+#define ddrcReg_PHY_BYTE_LANE_READ_STATUS_ERROR_SHIFT   0
+#define ddrcReg_PHY_BYTE_LANE_READ_STATUS_ERROR_MASK    (0xf << ddrcReg_PHY_BYTE_LANE_READ_STATUS_ERROR_SHIFT)
+
+/* ----------------------------------------------------- */
+
+#define ddrcReg_PHY_BYTE_LANE_READ_CLEAR_STATUS         (1 << 0)
+
+/* ----------------------------------------------------- */
+
+#define ddrcReg_PHY_BYTE_LANE_PAD_IDLE_CTL_ENABLE                   (1u << 31)
+#define ddrcReg_PHY_BYTE_LANE_PAD_IDLE_CTL_DM_RXENB_DISABLE         (1 << 19)
+#define ddrcReg_PHY_BYTE_LANE_PAD_IDLE_CTL_DM_IDDQ_DISABLE          (1 << 18)
+#define ddrcReg_PHY_BYTE_LANE_PAD_IDLE_CTL_DM_REB_DISABLE           (1 << 17)
+#define ddrcReg_PHY_BYTE_LANE_PAD_IDLE_CTL_DM_OEB_DISABLE           (1 << 16)
+#define ddrcReg_PHY_BYTE_LANE_PAD_IDLE_CTL_DQ_RXENB_DISABLE         (1 << 15)
+#define ddrcReg_PHY_BYTE_LANE_PAD_IDLE_CTL_DQ_IDDQ_DISABLE          (1 << 14)
+#define ddrcReg_PHY_BYTE_LANE_PAD_IDLE_CTL_DQ_REB_DISABLE           (1 << 13)
+#define ddrcReg_PHY_BYTE_LANE_PAD_IDLE_CTL_DQ_OEB_DISABLE           (1 << 12)
+#define ddrcReg_PHY_BYTE_LANE_PAD_IDLE_CTL_READ_ENB_RXENB_DISABLE   (1 << 11)
+#define ddrcReg_PHY_BYTE_LANE_PAD_IDLE_CTL_READ_ENB_IDDQ_DISABLE    (1 << 10)
+#define ddrcReg_PHY_BYTE_LANE_PAD_IDLE_CTL_READ_ENB_REB_DISABLE     (1 << 9)
+#define ddrcReg_PHY_BYTE_LANE_PAD_IDLE_CTL_READ_ENB_OEB_DISABLE     (1 << 8)
+#define ddrcReg_PHY_BYTE_LANE_PAD_IDLE_CTL_DQS_RXENB_DISABLE        (1 << 7)
+#define ddrcReg_PHY_BYTE_LANE_PAD_IDLE_CTL_DQS_IDDQ_DISABLE         (1 << 6)
+#define ddrcReg_PHY_BYTE_LANE_PAD_IDLE_CTL_DQS_REB_DISABLE          (1 << 5)
+#define ddrcReg_PHY_BYTE_LANE_PAD_IDLE_CTL_DQS_OEB_DISABLE          (1 << 4)
+#define ddrcReg_PHY_BYTE_LANE_PAD_IDLE_CTL_CLK_RXENB_DISABLE        (1 << 3)
+#define ddrcReg_PHY_BYTE_LANE_PAD_IDLE_CTL_CLK_IDDQ_DISABLE         (1 << 2)
+#define ddrcReg_PHY_BYTE_LANE_PAD_IDLE_CTL_CLK_REB_DISABLE          (1 << 1)
+#define ddrcReg_PHY_BYTE_LANE_PAD_IDLE_CTL_CLK_OEB_DISABLE          (1 << 0)
+
+/* ----------------------------------------------------- */
+
+#define ddrcReg_PHY_BYTE_LANE_PAD_DRIVE_CTL_RT60B_DDR_READ_ENB      (1 << 5)
+#define ddrcReg_PHY_BYTE_LANE_PAD_DRIVE_CTL_RT60B                   (1 << 4)
+#define ddrcReg_PHY_BYTE_LANE_PAD_DRIVE_CTL_SEL_SSTL18              (1 << 3)
+#define ddrcReg_PHY_BYTE_LANE_PAD_DRIVE_CTL_SELTXDRV_CI             (1 << 2)
+#define ddrcReg_PHY_BYTE_LANE_PAD_DRIVE_CTL_SELRXDRV                (1 << 1)
+#define ddrcReg_PHY_BYTE_LANE_PAD_DRIVE_CTL_SLEW                    (1 << 0)
+
+/* ----------------------------------------------------- */
+
+#define ddrcReg_PHY_BYTE_LANE_PAD_CLK_CTL_DISABLE                   (1 << 0)
+
+/* ----------------------------------------------------- */
+
+#define ddrcReg_PHY_BYTE_LANE_WRITE_CTL_PREAMBLE_DDR3               (1 << 0)
+
+/* ----------------------------------------------------- */
+
+#define ddrcReg_PHY_BYTE_LANE_CLK_REG_CTL_PWR_HALF                  (1 << 1)
+#define ddrcReg_PHY_BYTE_LANE_CLK_REG_CTL_PWR_OFF                   (1 << 0)
+
+/*********************************************************************/
+/* ARM PL341 DDRC to Broadcom DDR23 PHY glue register definitions */
+/*********************************************************************/
+
+       typedef struct {
+               uint32_t cfg;
+               uint32_t actMonCnt;
+               uint32_t ctl;
+               uint32_t lbistCtl;
+               uint32_t lbistSeed;
+               uint32_t lbistStatus;
+               uint32_t tieOff;
+               uint32_t actMonClear;
+               uint32_t status;
+               uint32_t user;
+       } ddrcReg_CTLR_PHY_GLUE_REG_t;
+
+#define ddrcReg_CTLR_PHY_GLUE_OFFSET                            0x0700
+#define ddrcReg_CTLR_PHY_GLUE_REGP                              ((volatile ddrcReg_CTLR_PHY_GLUE_REG_t *) (MM_IO_BASE_DDRC + ddrcReg_CTLR_PHY_GLUE_OFFSET))
+
+/* ----------------------------------------------------- */
+
+/* DDR2 / AXI block phase alignment interrupt control */
+#define ddrcReg_CTLR_PHY_GLUE_CFG_INT_SHIFT                     18
+#define ddrcReg_CTLR_PHY_GLUE_CFG_INT_MASK                      (0x3 << ddrcReg_CTLR_PHY_GLUE_CFG_INT_SHIFT)
+#define ddrcReg_CTLR_PHY_GLUE_CFG_INT_OFF                       (0 << ddrcReg_CTLR_PHY_GLUE_CFG_INT_SHIFT)
+#define ddrcReg_CTLR_PHY_GLUE_CFG_INT_ON_TIGHT                  (1 << ddrcReg_CTLR_PHY_GLUE_CFG_INT_SHIFT)
+#define ddrcReg_CTLR_PHY_GLUE_CFG_INT_ON_MEDIUM                 (2 << ddrcReg_CTLR_PHY_GLUE_CFG_INT_SHIFT)
+#define ddrcReg_CTLR_PHY_GLUE_CFG_INT_ON_LOOSE                  (3 << ddrcReg_CTLR_PHY_GLUE_CFG_INT_SHIFT)
+
+#define ddrcReg_CTLR_PHY_GLUE_CFG_PLL_REFCLK_SHIFT              17
+#define ddrcReg_CTLR_PHY_GLUE_CFG_PLL_REFCLK_MASK               (1 << ddrcReg_CTLR_PHY_GLUE_CFG_PLL_REFCLK_SHIFT)
+#define ddrcReg_CTLR_PHY_GLUE_CFG_PLL_REFCLK_DIFFERENTIAL       (0 << ddrcReg_CTLR_PHY_GLUE_CFG_PLL_REFCLK_SHIFT)
+#define ddrcReg_CTLR_PHY_GLUE_CFG_PLL_REFCLK_CMOS               (1 << ddrcReg_CTLR_PHY_GLUE_CFG_PLL_REFCLK_SHIFT)
+
+#define ddrcReg_CTLR_PHY_GLUE_CFG_DIV2CLK_TREE_SHIFT            16
+#define ddrcReg_CTLR_PHY_GLUE_CFG_DIV2CLK_TREE_MASK             (1 << ddrcReg_CTLR_PHY_GLUE_CFG_DIV2CLK_TREE_SHIFT)
+#define ddrcReg_CTLR_PHY_GLUE_CFG_DIV2CLK_TREE_DEEP             (0 << ddrcReg_CTLR_PHY_GLUE_CFG_DIV2CLK_TREE_SHIFT)
+#define ddrcReg_CTLR_PHY_GLUE_CFG_DIV2CLK_TREE_SHALLOW          (1 << ddrcReg_CTLR_PHY_GLUE_CFG_DIV2CLK_TREE_SHIFT)
+#define ddrcReg_CTLR_PHY_GLUE_CFG_HW_FIXED_ALIGNMENT_DISABLED   ddrcReg_CTLR_PHY_GLUE_CFG_DIV2CLK_TREE_SHALLOW
+
+#define ddrcReg_CTLR_PHY_GLUE_CFG_SYNC_BRIDGE_SHIFT             15
+#define ddrcReg_CTLR_PHY_GLUE_CFG_SYNC_BRIDGE_MASK              (1 << ddrcReg_CTLR_PHY_GLUE_CFG_SYNC_BRIDGE_SHIFT)
+#define ddrcReg_CTLR_PHY_GLUE_CFG_SYNC_BRIDGE_BP134             (0 << ddrcReg_CTLR_PHY_GLUE_CFG_SYNC_BRIDGE_SHIFT)
+#define ddrcReg_CTLR_PHY_GLUE_CFG_SYNC_BRIDGE_PL301             (1 << ddrcReg_CTLR_PHY_GLUE_CFG_SYNC_BRIDGE_SHIFT)
+#define ddrcReg_CTLR_PHY_GLUE_CFG_SYNC_BRIDGE_REGISTERED        ddrcReg_CTLR_PHY_GLUE_CFG_SYNC_BRIDGE_PL301
+
+/* Software control of PHY VDL updates from control register settings. Bit 13 enables the use of Bit 14. */
+/* If software control is not enabled, then updates occur when a refresh command is issued by the hardware */
+/* controller. If 2 chips selects are being used, then software control must be enabled. */
+#define ddrcReg_CTLR_PHY_GLUE_CFG_PHY_VDL_UPDATE_SW_CTL_LOAD    (1 << 14)
+#define ddrcReg_CTLR_PHY_GLUE_CFG_PHY_VDL_UPDATE_SW_CTL_ENABLE  (1 << 13)
+
+/* Use these to bypass a pipeline stage. By default the ADDR is off but the BYTE LANE in / out are on. */
+#define ddrcReg_CTLR_PHY_GLUE_CFG_PHY_ADDR_CTL_IN_BYPASS_PIPELINE_STAGE (1 << 12)
+#define ddrcReg_CTLR_PHY_GLUE_CFG_PHY_BYTE_LANE_IN_BYPASS_PIPELINE_STAGE (1 << 11)
+#define ddrcReg_CTLR_PHY_GLUE_CFG_PHY_BYTE_LANE_OUT_BYPASS_PIPELINE_STAGE (1 << 10)
+
+/* Chip select count */
+#define ddrcReg_CTLR_PHY_GLUE_CFG_CS_CNT_SHIFT                  9
+#define ddrcReg_CTLR_PHY_GLUE_CFG_CS_CNT_MASK                   (1 << ddrcReg_CTLR_PHY_GLUE_CFG_CS_CNT_SHIFT)
+#define ddrcReg_CTLR_PHY_GLUE_CFG_CS_CNT_1                      (0 << ddrcReg_CTLR_PHY_GLUE_CFG_CS_CNT_SHIFT)
+#define ddrcReg_CTLR_PHY_GLUE_CFG_CS_CNT_2                      (1 << ddrcReg_CTLR_PHY_GLUE_CFG_CS_CNT_SHIFT)
+
+#define ddrcReg_CTLR_PHY_GLUE_CFG_CLK_SHIFT                     8
+#define ddrcReg_CTLR_PHY_GLUE_CFG_CLK_ASYNC                     (0 << ddrcReg_CTLR_PHY_GLUE_CFG_CLK_SHIFT)
+#define ddrcReg_CTLR_PHY_GLUE_CFG_CLK_SYNC                      (1 << ddrcReg_CTLR_PHY_GLUE_CFG_CLK_SHIFT)
+
+#define ddrcReg_CTLR_PHY_GLUE_CFG_CKE_INIT_SHIFT                7
+#define ddrcReg_CTLR_PHY_GLUE_CFG_CKE_INIT_LOW                  (0 << ddrcReg_CTLR_PHY_GLUE_CFG_CKE_INIT_SHIFT)
+#define ddrcReg_CTLR_PHY_GLUE_CFG_CKE_INIT_HIGH                 (1 << ddrcReg_CTLR_PHY_GLUE_CFG_CKE_INIT_SHIFT)
+
+#define ddrcReg_CTLR_PHY_GLUE_CFG_DQM_INIT_SHIFT                6
+#define ddrcReg_CTLR_PHY_GLUE_CFG_DQM_INIT_LOW                  (0 << ddrcReg_CTLR_PHY_GLUE_CFG_DQM_INIT_SHIFT)
+#define ddrcReg_CTLR_PHY_GLUE_CFG_DQM_INIT_HIGH                 (1 << ddrcReg_CTLR_PHY_GLUE_CFG_DQM_INIT_SHIFT)
+
+#define ddrcReg_CTLR_PHY_GLUE_CFG_CAS_LATENCY_SHIFT             0
+#define ddrcReg_CTLR_PHY_GLUE_CFG_CAS_LATENCY_MASK              (0x7 << ddrcReg_CTLR_PHY_GLUE_CFG_CAS_LATENCY_SHIFT)
+
+/* ----------------------------------------------------- */
+#define ddrcReg_CTLR_PHY_GLUE_STATUS_PHASE_SHIFT                0
+#define ddrcReg_CTLR_PHY_GLUE_STATUS_PHASE_MASK                 (0x7f << ddrcReg_CTLR_PHY_GLUE_STATUS_PHASE_SHIFT)
+
+/* ---- Public Function Prototypes --------------------------------------- */
+
+#ifdef __cplusplus
+}                              /* end extern "C" */
+#endif
+#endif                         /* DDRC_REG_H */
diff --git a/arch/arm/mach-bcmring/include/mach/csp/dmacHw_priv.h b/arch/arm/mach-bcmring/include/mach/csp/dmacHw_priv.h
new file mode 100644 (file)
index 0000000..375066a
--- /dev/null
@@ -0,0 +1,145 @@
+/*****************************************************************************
+* Copyright 2004 - 2008 Broadcom Corporation.  All rights reserved.
+*
+* Unless you and Broadcom execute a separate written software license
+* agreement governing use of this software, this software is licensed to you
+* under the terms of the GNU General Public License version 2, available at
+* http://www.broadcom.com/licenses/GPLv2.php (the "GPL").
+*
+* Notwithstanding the above, under no circumstances may you combine this
+* software in any way with any other Broadcom software provided under a
+* license other than the GPL, without Broadcom's express prior written
+* consent.
+*****************************************************************************/
+
+/****************************************************************************/
+/**
+*  @file    dmacHw_priv.h
+*
+*  @brief   Private Definitions for low level DMA driver
+*
+*/
+/****************************************************************************/
+
+#ifndef _DMACHW_PRIV_H
+#define _DMACHW_PRIV_H
+
+#include <csp/stdint.h>
+
+/* Data type for DMA Link List Item */
+typedef struct {
+       uint32_t sar;           /* Source Adress Register.
+                                  Address must be aligned to CTLx.SRC_TR_WIDTH.             */
+       uint32_t dar;           /* Destination Address Register.
+                                  Address must be aligned to CTLx.DST_TR_WIDTH.             */
+       uint32_t llpPhy;        /* LLP contains the physical address of the next descriptor for block chaining using linked lists.
+                                  Address MUST be aligned to a 32-bit boundary.             */
+       dmacHw_REG64_t ctl;     /* Control Register. 64 bits */
+       uint32_t sstat;         /* Source Status Register */
+       uint32_t dstat;         /* Destination Status Register */
+       uint32_t devCtl;        /* Device specific control information */
+       uint32_t llp;           /* LLP contains the virtual address of the next descriptor for block chaining using linked lists. */
+} dmacHw_DESC_t;
+
+/*
+ *  Descriptor ring pointers
+ */
+typedef struct {
+       int num;                /* Number of link items */
+       dmacHw_DESC_t *pHead;   /* Head of descriptor ring (for writing) */
+       dmacHw_DESC_t *pTail;   /* Tail of descriptor ring (for reading) */
+       dmacHw_DESC_t *pProg;   /* Descriptor to program the channel (for programming the channel register) */
+       dmacHw_DESC_t *pEnd;    /* End of current descriptor chain */
+       dmacHw_DESC_t *pFree;   /* Descriptor to free memory (freeing dynamic memory) */
+       uint32_t virt2PhyOffset;        /* Virtual to physical address offset for the descriptor ring */
+} dmacHw_DESC_RING_t;
+
+/*
+ *  DMA channel control block
+ */
+typedef struct {
+       uint32_t module;        /* DMA controller module (0-1) */
+       uint32_t channel;       /* DMA channel (0-7) */
+       volatile uint32_t varDataStarted;       /* Flag indicating variable data channel is enabled */
+       volatile uint32_t descUpdated;  /* Flag to indicate descriptor update is complete */
+       void *userData;         /* Channel specifc user data */
+} dmacHw_CBLK_t;
+
+#define dmacHw_ASSERT(a)                  if (!(a)) while (1)
+#define dmacHw_MAX_CHANNEL_COUNT          16
+#define dmacHw_FREE_USER_MEMORY           0xFFFFFFFF
+#define dmacHw_DESC_FREE                  dmacHw_REG_CTL_DONE
+#define dmacHw_DESC_INIT                  ((dmacHw_DESC_t *) 0xFFFFFFFF)
+#define dmacHw_MAX_BLOCKSIZE              4064
+#define dmacHw_GET_DESC_RING(addr)        (dmacHw_DESC_RING_t *)(addr)
+#define dmacHw_ADDRESS_MASK(byte)         ((byte) - 1)
+#define dmacHw_NEXT_DESC(rp, dp)           ((rp)->dp = (dmacHw_DESC_t *)(rp)->dp->llp)
+#define dmacHw_HANDLE_TO_CBLK(handle)     ((dmacHw_CBLK_t *) (handle))
+#define dmacHw_CBLK_TO_HANDLE(cblkp)      ((dmacHw_HANDLE_t) (cblkp))
+#define dmacHw_DST_IS_MEMORY(tt)          (((tt) ==  dmacHw_TRANSFER_TYPE_PERIPHERAL_TO_MEM) || ((tt) == dmacHw_TRANSFER_TYPE_MEM_TO_MEM)) ? 1 : 0
+
+/****************************************************************************/
+/**
+*  @brief   Get next available transaction width
+*
+*
+*  @return  On sucess  : Next avail able transaction width
+*           On failure : dmacHw_TRANSACTION_WIDTH_8
+*
+*  @note
+*     None
+*/
+/****************************************************************************/
+static inline dmacHw_TRANSACTION_WIDTH_e dmacHw_GetNextTrWidth(dmacHw_TRANSACTION_WIDTH_e tw   /*   [ IN ] Current transaction width */
+    ) {
+       if (tw & dmacHw_REG_CTL_SRC_TR_WIDTH_MASK) {
+               return ((tw >> dmacHw_REG_CTL_SRC_TR_WIDTH_SHIFT) -
+                        1) << dmacHw_REG_CTL_SRC_TR_WIDTH_SHIFT;
+       } else if (tw & dmacHw_REG_CTL_DST_TR_WIDTH_MASK) {
+               return ((tw >> dmacHw_REG_CTL_DST_TR_WIDTH_SHIFT) -
+                        1) << dmacHw_REG_CTL_DST_TR_WIDTH_SHIFT;
+       }
+
+       /* Default return  */
+       return dmacHw_SRC_TRANSACTION_WIDTH_8;
+}
+
+/****************************************************************************/
+/**
+*  @brief   Get number of bytes per transaction
+*
+*  @return  Number of bytes per transaction
+*
+*
+*  @note
+*     None
+*/
+/****************************************************************************/
+static inline int dmacHw_GetTrWidthInBytes(dmacHw_TRANSACTION_WIDTH_e tw       /*   [ IN ]  Transaction width */
+    ) {
+       int width = 1;
+       switch (tw) {
+       case dmacHw_SRC_TRANSACTION_WIDTH_8:
+               width = 1;
+               break;
+       case dmacHw_SRC_TRANSACTION_WIDTH_16:
+       case dmacHw_DST_TRANSACTION_WIDTH_16:
+               width = 2;
+               break;
+       case dmacHw_SRC_TRANSACTION_WIDTH_32:
+       case dmacHw_DST_TRANSACTION_WIDTH_32:
+               width = 4;
+               break;
+       case dmacHw_SRC_TRANSACTION_WIDTH_64:
+       case dmacHw_DST_TRANSACTION_WIDTH_64:
+               width = 8;
+               break;
+       default:
+               dmacHw_ASSERT(0);
+       }
+
+       /* Default transaction width */
+       return width;
+}
+
+#endif /* _DMACHW_PRIV_H */
diff --git a/arch/arm/mach-bcmring/include/mach/csp/dmacHw_reg.h b/arch/arm/mach-bcmring/include/mach/csp/dmacHw_reg.h
new file mode 100644 (file)
index 0000000..891cea8
--- /dev/null
@@ -0,0 +1,406 @@
+/*****************************************************************************
+* Copyright 2004 - 2008 Broadcom Corporation.  All rights reserved.
+*
+* Unless you and Broadcom execute a separate written software license
+* agreement governing use of this software, this software is licensed to you
+* under the terms of the GNU General Public License version 2, available at
+* http://www.broadcom.com/licenses/GPLv2.php (the "GPL").
+*
+* Notwithstanding the above, under no circumstances may you combine this
+* software in any way with any other Broadcom software provided under a
+* license other than the GPL, without Broadcom's express prior written
+* consent.
+*****************************************************************************/
+
+/****************************************************************************/
+/**
+*  @file    dmacHw_reg.h
+*
+*  @brief   Definitions for low level DMA registers
+*
+*/
+/****************************************************************************/
+
+#ifndef _DMACHW_REG_H
+#define _DMACHW_REG_H
+
+#include <csp/stdint.h>
+#include <mach/csp/mm_io.h>
+
+/* Data type for 64 bit little endian register */
+typedef struct {
+       volatile uint32_t lo;   /* Lower 32 bit in little endian mode */
+       volatile uint32_t hi;   /* Upper 32 bit in little endian mode */
+} dmacHw_REG64_t;
+
+/* Data type representing DMA channel registers */
+typedef struct {
+       dmacHw_REG64_t ChannelSar;      /*  Source Adress Register. 64 bits (upper 32 bits are reserved)
+                                          Address must be aligned to CTLx.SRC_TR_WIDTH.
+                                        */
+       dmacHw_REG64_t ChannelDar;      /*  Destination Address Register.64 bits (upper 32 bits are reserved)
+                                          Address must be aligned to CTLx.DST_TR_WIDTH.
+                                        */
+       dmacHw_REG64_t ChannelLlp;      /*  Link List Pointer.64 bits (upper 32 bits are reserved)
+                                          LLP contains the pointer to the next LLI for block chaining using linked lists.
+                                          If LLPis set to 0x0, then transfers using linked lists are not enabled.
+                                          Address MUST be aligned to a 32-bit boundary.
+                                        */
+       dmacHw_REG64_t ChannelCtl;      /* Control Register. 64 bits */
+       dmacHw_REG64_t ChannelSstat;    /* Source Status Register */
+       dmacHw_REG64_t ChannelDstat;    /* Destination Status Register */
+       dmacHw_REG64_t ChannelSstatAddr;        /* Source Status Address Register */
+       dmacHw_REG64_t ChannelDstatAddr;        /* Destination Status Address Register */
+       dmacHw_REG64_t ChannelConfig;   /* Channel Configuration Register */
+       dmacHw_REG64_t SrcGather;       /* Source gather register */
+       dmacHw_REG64_t DstScatter;      /* Destination scatter register */
+} dmacHw_CH_REG_t;
+
+/* Data type for RAW interrupt status registers */
+typedef struct {
+       dmacHw_REG64_t RawTfr;  /* Raw Status for IntTfr Interrupt */
+       dmacHw_REG64_t RawBlock;        /* Raw Status for IntBlock Interrupt */
+       dmacHw_REG64_t RawSrcTran;      /* Raw Status for IntSrcTran Interrupt */
+       dmacHw_REG64_t RawDstTran;      /* Raw Status for IntDstTran Interrupt */
+       dmacHw_REG64_t RawErr;  /* Raw Status for IntErr Interrupt */
+} dmacHw_INT_RAW_t;
+
+/* Data type for interrupt status registers */
+typedef struct {
+       dmacHw_REG64_t StatusTfr;       /* Status for IntTfr Interrupt */
+       dmacHw_REG64_t StatusBlock;     /* Status for IntBlock Interrupt */
+       dmacHw_REG64_t StatusSrcTran;   /* Status for IntSrcTran Interrupt */
+       dmacHw_REG64_t StatusDstTran;   /* Status for IntDstTran Interrupt */
+       dmacHw_REG64_t StatusErr;       /* Status for IntErr Interrupt */
+} dmacHw_INT_STATUS_t;
+
+/* Data type for interrupt mask registers*/
+typedef struct {
+       dmacHw_REG64_t MaskTfr; /* Mask for IntTfr Interrupt */
+       dmacHw_REG64_t MaskBlock;       /* Mask for IntBlock Interrupt */
+       dmacHw_REG64_t MaskSrcTran;     /* Mask for IntSrcTran Interrupt */
+       dmacHw_REG64_t MaskDstTran;     /* Mask for IntDstTran Interrupt */
+       dmacHw_REG64_t MaskErr; /* Mask for IntErr Interrupt */
+} dmacHw_INT_MASK_t;
+
+/* Data type for interrupt clear registers */
+typedef struct {
+       dmacHw_REG64_t ClearTfr;        /* Clear for IntTfr Interrupt */
+       dmacHw_REG64_t ClearBlock;      /* Clear for IntBlock Interrupt */
+       dmacHw_REG64_t ClearSrcTran;    /* Clear for IntSrcTran Interrupt */
+       dmacHw_REG64_t ClearDstTran;    /* Clear for IntDstTran Interrupt */
+       dmacHw_REG64_t ClearErr;        /* Clear for IntErr Interrupt */
+       dmacHw_REG64_t StatusInt;       /* Status for each interrupt type */
+} dmacHw_INT_CLEAR_t;
+
+/* Data type for software handshaking registers */
+typedef struct {
+       dmacHw_REG64_t ReqSrcReg;       /* Source Software Transaction Request Register */
+       dmacHw_REG64_t ReqDstReg;       /* Destination Software Transaction Request Register */
+       dmacHw_REG64_t SglReqSrcReg;    /* Single Source Transaction Request Register */
+       dmacHw_REG64_t SglReqDstReg;    /* Single Destination Transaction Request Register */
+       dmacHw_REG64_t LstSrcReg;       /* Last Source Transaction Request Register */
+       dmacHw_REG64_t LstDstReg;       /* Last Destination Transaction Request Register */
+} dmacHw_SW_HANDSHAKE_t;
+
+/* Data type for misc. registers */
+typedef struct {
+       dmacHw_REG64_t DmaCfgReg;       /* DMA Configuration Register */
+       dmacHw_REG64_t ChEnReg; /* DMA Channel Enable Register */
+       dmacHw_REG64_t DmaIdReg;        /* DMA ID Register */
+       dmacHw_REG64_t DmaTestReg;      /* DMA Test Register */
+       dmacHw_REG64_t Reserved0;       /* Reserved */
+       dmacHw_REG64_t Reserved1;       /* Reserved */
+       dmacHw_REG64_t CompParm6;       /* Component Parameter 6 */
+       dmacHw_REG64_t CompParm5;       /* Component Parameter 5 */
+       dmacHw_REG64_t CompParm4;       /* Component Parameter 4 */
+       dmacHw_REG64_t CompParm3;       /* Component Parameter 3 */
+       dmacHw_REG64_t CompParm2;       /* Component Parameter 2 */
+       dmacHw_REG64_t CompParm1;       /* Component Parameter 1 */
+       dmacHw_REG64_t CompId;  /* Compoent ID */
+} dmacHw_MISC_t;
+
+/* Base registers */
+#define dmacHw_0_MODULE_BASE_ADDR        (char *) MM_IO_BASE_DMA0      /* DMAC 0 module's base address */
+#define dmacHw_1_MODULE_BASE_ADDR        (char *) MM_IO_BASE_DMA1      /* DMAC 1 module's base address */
+
+extern uint32_t dmaChannelCount_0;
+extern uint32_t dmaChannelCount_1;
+
+/* Define channel specific registers */
+#define dmacHw_CHAN_BASE(module, chan)          ((dmacHw_CH_REG_t *) ((char *)((module) ? dmacHw_1_MODULE_BASE_ADDR : dmacHw_0_MODULE_BASE_ADDR) + ((chan) * sizeof(dmacHw_CH_REG_t))))
+
+/* Raw interrupt status registers */
+#define dmacHw_REG_INT_RAW_BASE(module)         ((char *)dmacHw_CHAN_BASE((module), ((module) ? dmaChannelCount_1 : dmaChannelCount_0)))
+#define dmacHw_REG_INT_RAW_TRAN(module)         (((dmacHw_INT_RAW_t *) dmacHw_REG_INT_RAW_BASE((module)))->RawTfr.lo)
+#define dmacHw_REG_INT_RAW_BLOCK(module)        (((dmacHw_INT_RAW_t *) dmacHw_REG_INT_RAW_BASE((module)))->RawBlock.lo)
+#define dmacHw_REG_INT_RAW_STRAN(module)        (((dmacHw_INT_RAW_t *) dmacHw_REG_INT_RAW_BASE((module)))->RawSrcTran.lo)
+#define dmacHw_REG_INT_RAW_DTRAN(module)        (((dmacHw_INT_RAW_t *) dmacHw_REG_INT_RAW_BASE((module)))->RawDstTran.lo)
+#define dmacHw_REG_INT_RAW_ERROR(module)        (((dmacHw_INT_RAW_t *) dmacHw_REG_INT_RAW_BASE((module)))->RawErr.lo)
+
+/* Interrupt status registers */
+#define dmacHw_REG_INT_STAT_BASE(module)        ((char *)(dmacHw_REG_INT_RAW_BASE((module)) + sizeof(dmacHw_INT_RAW_t)))
+#define dmacHw_REG_INT_STAT_TRAN(module)        (((dmacHw_INT_STATUS_t *) dmacHw_REG_INT_STAT_BASE((module)))->StatusTfr.lo)
+#define dmacHw_REG_INT_STAT_BLOCK(module)       (((dmacHw_INT_STATUS_t *) dmacHw_REG_INT_STAT_BASE((module)))->StatusBlock.lo)
+#define dmacHw_REG_INT_STAT_STRAN(module)       (((dmacHw_INT_STATUS_t *) dmacHw_REG_INT_STAT_BASE((module)))->StatusSrcTran.lo)
+#define dmacHw_REG_INT_STAT_DTRAN(module)       (((dmacHw_INT_STATUS_t *) dmacHw_REG_INT_STAT_BASE((module)))->StatusDstTran.lo)
+#define dmacHw_REG_INT_STAT_ERROR(module)       (((dmacHw_INT_STATUS_t *) dmacHw_REG_INT_STAT_BASE((module)))->StatusErr.lo)
+
+/* Interrupt status registers */
+#define dmacHw_REG_INT_MASK_BASE(module)        ((char *)(dmacHw_REG_INT_STAT_BASE((module)) + sizeof(dmacHw_INT_STATUS_t)))
+#define dmacHw_REG_INT_MASK_TRAN(module)        (((dmacHw_INT_MASK_t *) dmacHw_REG_INT_MASK_BASE((module)))->MaskTfr.lo)
+#define dmacHw_REG_INT_MASK_BLOCK(module)       (((dmacHw_INT_MASK_t *) dmacHw_REG_INT_MASK_BASE((module)))->MaskBlock.lo)
+#define dmacHw_REG_INT_MASK_STRAN(module)       (((dmacHw_INT_MASK_t *) dmacHw_REG_INT_MASK_BASE((module)))->MaskSrcTran.lo)
+#define dmacHw_REG_INT_MASK_DTRAN(module)       (((dmacHw_INT_MASK_t *) dmacHw_REG_INT_MASK_BASE((module)))->MaskDstTran.lo)
+#define dmacHw_REG_INT_MASK_ERROR(module)       (((dmacHw_INT_MASK_t *) dmacHw_REG_INT_MASK_BASE((module)))->MaskErr.lo)
+
+/* Interrupt clear registers */
+#define dmacHw_REG_INT_CLEAR_BASE(module)       ((char *)(dmacHw_REG_INT_MASK_BASE((module)) + sizeof(dmacHw_INT_MASK_t)))
+#define dmacHw_REG_INT_CLEAR_TRAN(module)       (((dmacHw_INT_CLEAR_t *) dmacHw_REG_INT_CLEAR_BASE((module)))->ClearTfr.lo)
+#define dmacHw_REG_INT_CLEAR_BLOCK(module)      (((dmacHw_INT_CLEAR_t *) dmacHw_REG_INT_CLEAR_BASE((module)))->ClearBlock.lo)
+#define dmacHw_REG_INT_CLEAR_STRAN(module)      (((dmacHw_INT_CLEAR_t *) dmacHw_REG_INT_CLEAR_BASE((module)))->ClearSrcTran.lo)
+#define dmacHw_REG_INT_CLEAR_DTRAN(module)      (((dmacHw_INT_CLEAR_t *) dmacHw_REG_INT_CLEAR_BASE((module)))->ClearDstTran.lo)
+#define dmacHw_REG_INT_CLEAR_ERROR(module)      (((dmacHw_INT_CLEAR_t *) dmacHw_REG_INT_CLEAR_BASE((module)))->ClearErr.lo)
+#define dmacHw_REG_INT_STATUS(module)           (((dmacHw_INT_CLEAR_t *) dmacHw_REG_INT_CLEAR_BASE((module)))->StatusInt.lo)
+
+/* Software handshaking registers */
+#define dmacHw_REG_SW_HS_BASE(module)           ((char *)(dmacHw_REG_INT_CLEAR_BASE((module)) + sizeof(dmacHw_INT_CLEAR_t)))
+#define dmacHw_REG_SW_HS_SRC_REQ(module)        (((dmacHw_SW_HANDSHAKE_t *) dmacHw_REG_SW_HS_BASE((module)))->ReqSrcReg.lo)
+#define dmacHw_REG_SW_HS_DST_REQ(module)        (((dmacHw_SW_HANDSHAKE_t *) dmacHw_REG_SW_HS_BASE((module)))->ReqDstReg.lo)
+#define dmacHw_REG_SW_HS_SRC_SGL_REQ(module)    (((dmacHw_SW_HANDSHAKE_t *) dmacHw_REG_SW_HS_BASE((module)))->SglReqSrcReg.lo)
+#define dmacHw_REG_SW_HS_DST_SGL_REQ(module)    (((dmacHw_SW_HANDSHAKE_t *) dmacHw_REG_SW_HS_BASE((module)))->SglReqDstReg.lo)
+#define dmacHw_REG_SW_HS_SRC_LST_REQ(module)    (((dmacHw_SW_HANDSHAKE_t *) dmacHw_REG_SW_HS_BASE((module)))->LstSrcReg.lo)
+#define dmacHw_REG_SW_HS_DST_LST_REQ(module)    (((dmacHw_SW_HANDSHAKE_t *) dmacHw_REG_SW_HS_BASE((module)))->LstDstReg.lo)
+
+/* Miscellaneous registers */
+#define dmacHw_REG_MISC_BASE(module)            ((char *)(dmacHw_REG_SW_HS_BASE((module)) + sizeof(dmacHw_SW_HANDSHAKE_t)))
+#define dmacHw_REG_MISC_CFG(module)             (((dmacHw_MISC_t *) dmacHw_REG_MISC_BASE((module)))->DmaCfgReg.lo)
+#define dmacHw_REG_MISC_CH_ENABLE(module)       (((dmacHw_MISC_t *) dmacHw_REG_MISC_BASE((module)))->ChEnReg.lo)
+#define dmacHw_REG_MISC_ID(module)              (((dmacHw_MISC_t *) dmacHw_REG_MISC_BASE((module)))->DmaIdReg.lo)
+#define dmacHw_REG_MISC_TEST(module)            (((dmacHw_MISC_t *) dmacHw_REG_MISC_BASE((module)))->DmaTestReg.lo)
+#define dmacHw_REG_MISC_COMP_PARAM1_LO(module)  (((dmacHw_MISC_t *) dmacHw_REG_MISC_BASE((module)))->CompParm1.lo)
+#define dmacHw_REG_MISC_COMP_PARAM1_HI(module)  (((dmacHw_MISC_t *) dmacHw_REG_MISC_BASE((module)))->CompParm1.hi)
+#define dmacHw_REG_MISC_COMP_PARAM2_LO(module)  (((dmacHw_MISC_t *) dmacHw_REG_MISC_BASE((module)))->CompParm2.lo)
+#define dmacHw_REG_MISC_COMP_PARAM2_HI(module)  (((dmacHw_MISC_t *) dmacHw_REG_MISC_BASE((module)))->CompParm2.hi)
+#define dmacHw_REG_MISC_COMP_PARAM3_LO(module)  (((dmacHw_MISC_t *) dmacHw_REG_MISC_BASE((module)))->CompParm3.lo)
+#define dmacHw_REG_MISC_COMP_PARAM3_HI(module)  (((dmacHw_MISC_t *) dmacHw_REG_MISC_BASE((module)))->CompParm3.hi)
+#define dmacHw_REG_MISC_COMP_PARAM4_LO(module)  (((dmacHw_MISC_t *) dmacHw_REG_MISC_BASE((module)))->CompParm4.lo)
+#define dmacHw_REG_MISC_COMP_PARAM4_HI(module)  (((dmacHw_MISC_t *) dmacHw_REG_MISC_BASE((module)))->CompParm4.hi)
+#define dmacHw_REG_MISC_COMP_PARAM5_LO(module)  (((dmacHw_MISC_t *) dmacHw_REG_MISC_BASE((module)))->CompParm5.lo)
+#define dmacHw_REG_MISC_COMP_PARAM5_HI(module)  (((dmacHw_MISC_t *) dmacHw_REG_MISC_BASE((module)))->CompParm5.hi)
+#define dmacHw_REG_MISC_COMP_PARAM6_LO(module)  (((dmacHw_MISC_t *) dmacHw_REG_MISC_BASE((module)))->CompParm6.lo)
+#define dmacHw_REG_MISC_COMP_PARAM6_HI(module)  (((dmacHw_MISC_t *) dmacHw_REG_MISC_BASE((module)))->CompParm6.hi)
+
+/* Channel control registers */
+#define dmacHw_REG_SAR(module, chan)            (dmacHw_CHAN_BASE((module), (chan))->ChannelSar.lo)
+#define dmacHw_REG_DAR(module, chan)            (dmacHw_CHAN_BASE((module), (chan))->ChannelDar.lo)
+#define dmacHw_REG_LLP(module, chan)            (dmacHw_CHAN_BASE((module), (chan))->ChannelLlp.lo)
+
+#define dmacHw_REG_CTL_LO(module, chan)         (dmacHw_CHAN_BASE((module), (chan))->ChannelCtl.lo)
+#define dmacHw_REG_CTL_HI(module, chan)         (dmacHw_CHAN_BASE((module), (chan))->ChannelCtl.hi)
+
+#define dmacHw_REG_SSTAT(module, chan)          (dmacHw_CHAN_BASE((module), (chan))->ChannelSstat.lo)
+#define dmacHw_REG_DSTAT(module, chan)          (dmacHw_CHAN_BASE((module), (chan))->ChannelDstat.lo)
+#define dmacHw_REG_SSTATAR(module, chan)        (dmacHw_CHAN_BASE((module), (chan))->ChannelSstatAddr.lo)
+#define dmacHw_REG_DSTATAR(module, chan)        (dmacHw_CHAN_BASE((module), (chan))->ChannelDstatAddr.lo)
+
+#define dmacHw_REG_CFG_LO(module, chan)         (dmacHw_CHAN_BASE((module), (chan))->ChannelConfig.lo)
+#define dmacHw_REG_CFG_HI(module, chan)         (dmacHw_CHAN_BASE((module), (chan))->ChannelConfig.hi)
+
+#define dmacHw_REG_SGR_LO(module, chan)         (dmacHw_CHAN_BASE((module), (chan))->SrcGather.lo)
+#define dmacHw_REG_SGR_HI(module, chan)         (dmacHw_CHAN_BASE((module), (chan))->SrcGather.hi)
+
+#define dmacHw_REG_DSR_LO(module, chan)         (dmacHw_CHAN_BASE((module), (chan))->DstScatter.lo)
+#define dmacHw_REG_DSR_HI(module, chan)         (dmacHw_CHAN_BASE((module), (chan))->DstScatter.hi)
+
+#define INT_STATUS_MASK(channel)                (0x00000001 << (channel))
+#define CHANNEL_BUSY(mod, channel)              (dmacHw_REG_MISC_CH_ENABLE((mod)) & (0x00000001 << (channel)))
+
+/* Bit mask for REG_DMACx_CTL_LO */
+
+#define dmacHw_REG_CTL_INT_EN                       0x00000001 /* Channel interrupt enable */
+
+#define dmacHw_REG_CTL_DST_TR_WIDTH_MASK            0x0000000E /* Destination transaction width mask */
+#define dmacHw_REG_CTL_DST_TR_WIDTH_SHIFT           1
+#define dmacHw_REG_CTL_DST_TR_WIDTH_8               0x00000000 /* Destination transaction width 8 bit */
+#define dmacHw_REG_CTL_DST_TR_WIDTH_16              0x00000002 /* Destination transaction width 16 bit */
+#define dmacHw_REG_CTL_DST_TR_WIDTH_32              0x00000004 /* Destination transaction width 32 bit */
+#define dmacHw_REG_CTL_DST_TR_WIDTH_64              0x00000006 /* Destination transaction width 64 bit */
+
+#define dmacHw_REG_CTL_SRC_TR_WIDTH_MASK            0x00000070 /* Source transaction width mask */
+#define dmacHw_REG_CTL_SRC_TR_WIDTH_SHIFT           4
+#define dmacHw_REG_CTL_SRC_TR_WIDTH_8               0x00000000 /* Source transaction width 8 bit */
+#define dmacHw_REG_CTL_SRC_TR_WIDTH_16              0x00000010 /* Source transaction width 16 bit */
+#define dmacHw_REG_CTL_SRC_TR_WIDTH_32              0x00000020 /* Source transaction width 32 bit */
+#define dmacHw_REG_CTL_SRC_TR_WIDTH_64              0x00000030 /* Source transaction width 64 bit */
+
+#define dmacHw_REG_CTL_DS_ENABLE                    0x00040000 /* Destination scatter enable */
+#define dmacHw_REG_CTL_SG_ENABLE                    0x00020000 /* Source gather enable */
+
+#define dmacHw_REG_CTL_DINC_MASK                    0x00000180 /* Destination address inc/dec mask */
+#define dmacHw_REG_CTL_DINC_INC                     0x00000000 /* Destination address increment */
+#define dmacHw_REG_CTL_DINC_DEC                     0x00000080 /* Destination address decrement */
+#define dmacHw_REG_CTL_DINC_NC                      0x00000100 /* Destination address no change */
+
+#define dmacHw_REG_CTL_SINC_MASK                    0x00000600 /* Source address inc/dec mask */
+#define dmacHw_REG_CTL_SINC_INC                     0x00000000 /* Source address increment */
+#define dmacHw_REG_CTL_SINC_DEC                     0x00000200 /* Source address decrement */
+#define dmacHw_REG_CTL_SINC_NC                      0x00000400 /* Source address no change */
+
+#define dmacHw_REG_CTL_DST_MSIZE_MASK               0x00003800 /* Destination burst transaction length */
+#define dmacHw_REG_CTL_DST_MSIZE_0                  0x00000000 /* No Destination burst */
+#define dmacHw_REG_CTL_DST_MSIZE_4                  0x00000800 /* Destination burst transaction length 4 */
+#define dmacHw_REG_CTL_DST_MSIZE_8                  0x00001000 /* Destination burst transaction length 8 */
+#define dmacHw_REG_CTL_DST_MSIZE_16                 0x00001800 /* Destination burst transaction length 16 */
+
+#define dmacHw_REG_CTL_SRC_MSIZE_MASK               0x0001C000 /* Source burst transaction length */
+#define dmacHw_REG_CTL_SRC_MSIZE_0                  0x00000000 /* No Source burst */
+#define dmacHw_REG_CTL_SRC_MSIZE_4                  0x00004000 /* Source burst transaction length 4 */
+#define dmacHw_REG_CTL_SRC_MSIZE_8                  0x00008000 /* Source burst transaction length 8 */
+#define dmacHw_REG_CTL_SRC_MSIZE_16                 0x0000C000 /* Source burst transaction length 16 */
+
+#define dmacHw_REG_CTL_TTFC_MASK                    0x00700000 /* Transfer type and flow controller */
+#define dmacHw_REG_CTL_TTFC_MM_DMAC                 0x00000000 /* Memory to Memory with DMAC as flow controller */
+#define dmacHw_REG_CTL_TTFC_MP_DMAC                 0x00100000 /* Memory to Peripheral with DMAC as flow controller */
+#define dmacHw_REG_CTL_TTFC_PM_DMAC                 0x00200000 /* Peripheral to Memory with DMAC as flow controller */
+#define dmacHw_REG_CTL_TTFC_PP_DMAC                 0x00300000 /* Peripheral to Peripheral with DMAC as flow controller */
+#define dmacHw_REG_CTL_TTFC_PM_PERI                 0x00400000 /* Peripheral to Memory with Peripheral as flow controller */
+#define dmacHw_REG_CTL_TTFC_PP_SPERI                0x00500000 /* Peripheral to Peripheral with Source Peripheral as flow controller */
+#define dmacHw_REG_CTL_TTFC_MP_PERI                 0x00600000 /* Memory to Peripheral with Peripheral as flow controller */
+#define dmacHw_REG_CTL_TTFC_PP_DPERI                0x00700000 /* Peripheral to Peripheral with Destination Peripheral as flow controller */
+
+#define dmacHw_REG_CTL_DMS_MASK                     0x01800000 /* Destination AHB master interface */
+#define dmacHw_REG_CTL_DMS_1                        0x00000000 /* Destination AHB master interface 1 */
+#define dmacHw_REG_CTL_DMS_2                        0x00800000 /* Destination AHB master interface 2 */
+
+#define dmacHw_REG_CTL_SMS_MASK                     0x06000000 /* Source AHB master interface */
+#define dmacHw_REG_CTL_SMS_1                        0x00000000 /* Source AHB master interface 1 */
+#define dmacHw_REG_CTL_SMS_2                        0x02000000 /* Source AHB master interface 2 */
+
+#define dmacHw_REG_CTL_LLP_DST_EN                   0x08000000 /* Block chaining enable for destination side */
+#define dmacHw_REG_CTL_LLP_SRC_EN                   0x10000000 /* Block chaining enable for source side */
+
+/* Bit mask for REG_DMACx_CTL_HI */
+#define dmacHw_REG_CTL_BLOCK_TS_MASK                0x00000FFF /* Block transfer size */
+#define dmacHw_REG_CTL_DONE                         0x00001000 /* Block trasnfer done */
+
+/* Bit mask for REG_DMACx_CFG_LO */
+#define dmacHw_REG_CFG_LO_CH_PRIORITY_SHIFT                  5 /* Channel priority shift */
+#define dmacHw_REG_CFG_LO_CH_PRIORITY_MASK          0x000000E0 /* Channel priority mask */
+#define dmacHw_REG_CFG_LO_CH_PRIORITY_0             0x00000000 /* Channel priority 0 */
+#define dmacHw_REG_CFG_LO_CH_PRIORITY_1             0x00000020 /* Channel priority 1 */
+#define dmacHw_REG_CFG_LO_CH_PRIORITY_2             0x00000040 /* Channel priority 2 */
+#define dmacHw_REG_CFG_LO_CH_PRIORITY_3             0x00000060 /* Channel priority 3 */
+#define dmacHw_REG_CFG_LO_CH_PRIORITY_4             0x00000080 /* Channel priority 4 */
+#define dmacHw_REG_CFG_LO_CH_PRIORITY_5             0x000000A0 /* Channel priority 5 */
+#define dmacHw_REG_CFG_LO_CH_PRIORITY_6             0x000000C0 /* Channel priority 6 */
+#define dmacHw_REG_CFG_LO_CH_PRIORITY_7             0x000000E0 /* Channel priority 7 */
+
+#define dmacHw_REG_CFG_LO_CH_SUSPEND                0x00000100 /* Channel suspend */
+#define dmacHw_REG_CFG_LO_CH_FIFO_EMPTY             0x00000200 /* Channel FIFO empty */
+#define dmacHw_REG_CFG_LO_DST_CH_SW_HS              0x00000400 /* Destination channel SW handshaking */
+#define dmacHw_REG_CFG_LO_SRC_CH_SW_HS              0x00000800 /* Source channel SW handshaking */
+
+#define dmacHw_REG_CFG_LO_CH_LOCK_MASK              0x00003000 /* Channel locking mask */
+#define dmacHw_REG_CFG_LO_CH_LOCK_DMA               0x00000000 /* Channel lock over the entire DMA transfer operation */
+#define dmacHw_REG_CFG_LO_CH_LOCK_BLOCK             0x00001000 /* Channel lock over the block transfer operation */
+#define dmacHw_REG_CFG_LO_CH_LOCK_TRANS             0x00002000 /* Channel lock over the transaction */
+#define dmacHw_REG_CFG_LO_CH_LOCK_ENABLE            0x00010000 /* Channel lock enable */
+
+#define dmacHw_REG_CFG_LO_BUS_LOCK_MASK             0x0000C000 /* Bus locking mask */
+#define dmacHw_REG_CFG_LO_BUS_LOCK_DMA              0x00000000 /* Bus lock over the entire DMA transfer operation */
+#define dmacHw_REG_CFG_LO_BUS_LOCK_BLOCK            0x00004000 /* Bus lock over the block transfer operation */
+#define dmacHw_REG_CFG_LO_BUS_LOCK_TRANS            0x00008000 /* Bus lock over the transaction */
+#define dmacHw_REG_CFG_LO_BUS_LOCK_ENABLE           0x00020000 /* Bus lock enable */
+
+#define dmacHw_REG_CFG_LO_DST_HS_POLARITY_LOW       0x00040000 /* Destination channel handshaking signal polarity low */
+#define dmacHw_REG_CFG_LO_SRC_HS_POLARITY_LOW       0x00080000 /* Source channel handshaking signal polarity low */
+
+#define dmacHw_REG_CFG_LO_MAX_AMBA_BURST_LEN_MASK   0x3FF00000 /* Maximum AMBA burst length */
+
+#define dmacHw_REG_CFG_LO_AUTO_RELOAD_SRC           0x40000000 /* Source address auto reload */
+#define dmacHw_REG_CFG_LO_AUTO_RELOAD_DST           0x80000000 /* Destination address auto reload */
+
+/* Bit mask for REG_DMACx_CFG_HI */
+#define dmacHw_REG_CFG_HI_FC_DST_READY              0x00000001 /* Source transaction request is serviced when destination is ready */
+#define dmacHw_REG_CFG_HI_FIFO_ENOUGH               0x00000002 /* Initiate burst transaction when enough data in available in FIFO */
+
+#define dmacHw_REG_CFG_HI_AHB_HPROT_MASK            0x0000001C /* AHB protection mask */
+#define dmacHw_REG_CFG_HI_AHB_HPROT_1               0x00000004 /* AHB protection 1 */
+#define dmacHw_REG_CFG_HI_AHB_HPROT_2               0x00000008 /* AHB protection 2 */
+#define dmacHw_REG_CFG_HI_AHB_HPROT_3               0x00000010 /* AHB protection 3 */
+
+#define dmacHw_REG_CFG_HI_UPDATE_DST_STAT           0x00000020 /* Destination status update enable */
+#define dmacHw_REG_CFG_HI_UPDATE_SRC_STAT           0x00000040 /* Source status update enable */
+
+#define dmacHw_REG_CFG_HI_SRC_PERI_INTF_MASK        0x00000780 /* Source peripheral hardware interface mask */
+#define dmacHw_REG_CFG_HI_DST_PERI_INTF_MASK        0x00007800 /* Destination peripheral hardware interface mask */
+
+/* DMA Configuration Parameters */
+#define dmacHw_REG_COMP_PARAM_NUM_CHANNELS          0x00000700 /* Number of channels */
+#define dmacHw_REG_COMP_PARAM_NUM_INTERFACE         0x00001800 /* Number of master interface */
+#define dmacHw_REG_COMP_PARAM_MAX_BLK_SIZE          0x0000000f /* Maximum brust size */
+#define dmacHw_REG_COMP_PARAM_DATA_WIDTH            0x00006000 /* Data transfer width */
+
+/* Define GET/SET macros to program the registers */
+#define dmacHw_SET_SAR(module, channel, addr)          (dmacHw_REG_SAR((module), (channel)) = (uint32_t) (addr))
+#define dmacHw_SET_DAR(module, channel, addr)          (dmacHw_REG_DAR((module), (channel)) = (uint32_t) (addr))
+#define dmacHw_SET_LLP(module, channel, ptr)           (dmacHw_REG_LLP((module), (channel)) = (uint32_t) (ptr))
+
+#define dmacHw_GET_SSTAT(module, channel)              (dmacHw_REG_SSTAT((module), (channel)))
+#define dmacHw_GET_DSTAT(module, channel)              (dmacHw_REG_DSTAT((module), (channel)))
+
+#define dmacHw_SET_SSTATAR(module, channel, addr)      (dmacHw_REG_SSTATAR((module), (channel)) = (uint32_t) (addr))
+#define dmacHw_SET_DSTATAR(module, channel, addr)      (dmacHw_REG_DSTATAR((module), (channel)) = (uint32_t) (addr))
+
+#define dmacHw_SET_CONTROL_LO(module, channel, ctl)    (dmacHw_REG_CTL_LO((module), (channel)) |= (ctl))
+#define dmacHw_RESET_CONTROL_LO(module, channel)       (dmacHw_REG_CTL_LO((module), (channel)) = 0)
+#define dmacHw_GET_CONTROL_LO(module, channel)         (dmacHw_REG_CTL_LO((module), (channel)))
+
+#define dmacHw_SET_CONTROL_HI(module, channel, ctl)    (dmacHw_REG_CTL_HI((module), (channel)) |= (ctl))
+#define dmacHw_RESET_CONTROL_HI(module, channel)       (dmacHw_REG_CTL_HI((module), (channel)) = 0)
+#define dmacHw_GET_CONTROL_HI(module, channel)         (dmacHw_REG_CTL_HI((module), (channel)))
+
+#define dmacHw_GET_BLOCK_SIZE(module, channel)         (dmacHw_REG_CTL_HI((module), (channel)) & dmacHw_REG_CTL_BLOCK_TS_MASK)
+#define dmacHw_DMA_COMPLETE(module, channel)           (dmacHw_REG_CTL_HI((module), (channel)) & dmacHw_REG_CTL_DONE)
+
+#define dmacHw_SET_CONFIG_LO(module, channel, cfg)     (dmacHw_REG_CFG_LO((module), (channel)) |= (cfg))
+#define dmacHw_RESET_CONFIG_LO(module, channel)        (dmacHw_REG_CFG_LO((module), (channel)) = 0)
+#define dmacHw_GET_CONFIG_LO(module, channel)          (dmacHw_REG_CFG_LO((module), (channel)))
+#define dmacHw_SET_AMBA_BUSRT_LEN(module, channel, len)    (dmacHw_REG_CFG_LO((module), (channel)) = (dmacHw_REG_CFG_LO((module), (channel)) & ~(dmacHw_REG_CFG_LO_MAX_AMBA_BURST_LEN_MASK)) | (((len) << 20) & dmacHw_REG_CFG_LO_MAX_AMBA_BURST_LEN_MASK))
+#define dmacHw_SET_CHANNEL_PRIORITY(module, channel, prio) (dmacHw_REG_CFG_LO((module), (channel)) = (dmacHw_REG_CFG_LO((module), (channel)) & ~(dmacHw_REG_CFG_LO_CH_PRIORITY_MASK)) | (prio))
+#define dmacHw_SET_AHB_HPROT(module, channel, protect)  (dmacHw_REG_CFG_HI(module, channel) = (dmacHw_REG_CFG_HI((module), (channel)) & ~(dmacHw_REG_CFG_HI_AHB_HPROT_MASK)) | (protect))
+
+#define dmacHw_SET_CONFIG_HI(module, channel, cfg)      (dmacHw_REG_CFG_HI((module), (channel)) |= (cfg))
+#define dmacHw_RESET_CONFIG_HI(module, channel)         (dmacHw_REG_CFG_HI((module), (channel)) = 0)
+#define dmacHw_GET_CONFIG_HI(module, channel)           (dmacHw_REG_CFG_HI((module), (channel)))
+#define dmacHw_SET_SRC_PERI_INTF(module, channel, intf) (dmacHw_REG_CFG_HI((module), (channel)) = (dmacHw_REG_CFG_HI((module), (channel)) & ~(dmacHw_REG_CFG_HI_SRC_PERI_INTF_MASK)) | (((intf) << 7) & dmacHw_REG_CFG_HI_SRC_PERI_INTF_MASK))
+#define dmacHw_SRC_PERI_INTF(intf)                      (((intf) << 7) & dmacHw_REG_CFG_HI_SRC_PERI_INTF_MASK)
+#define dmacHw_SET_DST_PERI_INTF(module, channel, intf) (dmacHw_REG_CFG_HI((module), (channel)) = (dmacHw_REG_CFG_HI((module), (channel)) & ~(dmacHw_REG_CFG_HI_DST_PERI_INTF_MASK)) | (((intf) << 11) & dmacHw_REG_CFG_HI_DST_PERI_INTF_MASK))
+#define dmacHw_DST_PERI_INTF(intf)                      (((intf) << 11) & dmacHw_REG_CFG_HI_DST_PERI_INTF_MASK)
+
+#define dmacHw_DMA_START(module, channel)              (dmacHw_REG_MISC_CH_ENABLE((module)) = (0x00000001 << ((channel) + 8)) | (0x00000001 << (channel)))
+#define dmacHw_DMA_STOP(module, channel)               (dmacHw_REG_MISC_CH_ENABLE((module)) = (0x00000001 << ((channel) + 8)))
+#define dmacHw_DMA_ENABLE(module)                      (dmacHw_REG_MISC_CFG((module)) = 1)
+#define dmacHw_DMA_DISABLE(module)                     (dmacHw_REG_MISC_CFG((module)) = 0)
+
+#define dmacHw_TRAN_INT_ENABLE(module, channel)        (dmacHw_REG_INT_MASK_TRAN((module)) = (0x00000001 << ((channel) + 8)) | (0x00000001 << (channel)))
+#define dmacHw_BLOCK_INT_ENABLE(module, channel)       (dmacHw_REG_INT_MASK_BLOCK((module)) = (0x00000001 << ((channel) + 8)) | (0x00000001 << (channel)))
+#define dmacHw_ERROR_INT_ENABLE(module, channel)       (dmacHw_REG_INT_MASK_ERROR((module)) = (0x00000001 << ((channel) + 8)) | (0x00000001 << (channel)))
+
+#define dmacHw_TRAN_INT_DISABLE(module, channel)       (dmacHw_REG_INT_MASK_TRAN((module)) = (0x00000001 << ((channel) + 8)))
+#define dmacHw_BLOCK_INT_DISABLE(module, channel)      (dmacHw_REG_INT_MASK_BLOCK((module)) = (0x00000001 << ((channel) + 8)))
+#define dmacHw_ERROR_INT_DISABLE(module, channel)      (dmacHw_REG_INT_MASK_ERROR((module)) = (0x00000001 << ((channel) + 8)))
+#define dmacHw_STRAN_INT_DISABLE(module, channel)      (dmacHw_REG_INT_MASK_STRAN((module)) = (0x00000001 << ((channel) + 8)))
+#define dmacHw_DTRAN_INT_DISABLE(module, channel)      (dmacHw_REG_INT_MASK_DTRAN((module)) = (0x00000001 << ((channel) + 8)))
+
+#define dmacHw_TRAN_INT_CLEAR(module, channel)         (dmacHw_REG_INT_CLEAR_TRAN((module)) = (0x00000001 << (channel)))
+#define dmacHw_BLOCK_INT_CLEAR(module, channel)        (dmacHw_REG_INT_CLEAR_BLOCK((module)) = (0x00000001 << (channel)))
+#define dmacHw_ERROR_INT_CLEAR(module, channel)        (dmacHw_REG_INT_CLEAR_ERROR((module)) = (0x00000001 << (channel)))
+
+#define dmacHw_GET_NUM_CHANNEL(module)                 (((dmacHw_REG_MISC_COMP_PARAM1_HI((module)) & dmacHw_REG_COMP_PARAM_NUM_CHANNELS) >> 8) + 1)
+#define dmacHw_GET_NUM_INTERFACE(module)               (((dmacHw_REG_MISC_COMP_PARAM1_HI((module)) & dmacHw_REG_COMP_PARAM_NUM_INTERFACE) >> 11) + 1)
+#define dmacHw_GET_MAX_BLOCK_SIZE(module, channel)     ((dmacHw_REG_MISC_COMP_PARAM1_LO((module)) >> (4 * (channel))) & dmacHw_REG_COMP_PARAM_MAX_BLK_SIZE)
+#define dmacHw_GET_CHANNEL_DATA_WIDTH(module, channel) ((dmacHw_REG_MISC_COMP_PARAM1_HI((module)) & dmacHw_REG_COMP_PARAM_DATA_WIDTH) >> 13)
+
+#endif /* _DMACHW_REG_H */
diff --git a/arch/arm/mach-bcmring/include/mach/csp/hw_cfg.h b/arch/arm/mach-bcmring/include/mach/csp/hw_cfg.h
new file mode 100644 (file)
index 0000000..cfa91be
--- /dev/null
@@ -0,0 +1,73 @@
+/*****************************************************************************
+* Copyright 2003 - 2008 Broadcom Corporation.  All rights reserved.
+*
+* Unless you and Broadcom execute a separate written software license
+* agreement governing use of this software, this software is licensed to you
+* under the terms of the GNU General Public License version 2, available at
+* http://www.broadcom.com/licenses/GPLv2.php (the "GPL").
+*
+* Notwithstanding the above, under no circumstances may you combine this
+* software in any way with any other Broadcom software provided under a
+* license other than the GPL, without Broadcom's express prior written
+* consent.
+*****************************************************************************/
+
+
+#ifndef CSP_HW_CFG_H
+#define CSP_HW_CFG_H
+
+/* ---- Include Files ---------------------------------------------------- */
+
+#include <cfg_global.h>
+#include <mach/csp/cap_inline.h>
+
+#if defined(__KERNEL__)
+#include <mach/memory_settings.h>
+#else
+#include <hw_cfg.h>
+#endif
+
+/* Some items that can be defined externally, but will be set to default values */
+/* if they are not defined. */
+/*      HW_CFG_PLL_SPREAD_SPECTRUM_DISABLE   Default undefined and SS is enabled. */
+/*      HW_CFG_SDRAM_CAS_LATENCY        5    Default 5, Values [3..6] */
+/*      HW_CFG_SDRAM_CHIP_SELECT_CNT    1    Default 1, Vaules [1..2] */
+/*      HW_CFG_SDRAM_SPEED_GRADE        667  Default 667, Values [400,533,667,800] */
+/*      HW_CFG_SDRAM_WIDTH_BITS         16   Default 16, Vaules [8,16] */
+/*      HW_CFG_SDRAM_ADDR_BRC                Default undefined and Row-Bank-Col (RBC) addressing used. Define to use Bank-Row-Col (BRC). */
+/*      HW_CFG_SDRAM_CLK_ASYNC               Default undefined and DDR clock is synchronous with AXI BUS clock. Define for ASYNC mode. */
+
+#if defined(CFG_GLOBAL_CHIP)
+  #if (CFG_GLOBAL_CHIP == FPGA11107)
+     #define HW_CFG_BUS_CLK_HZ            5000000
+     #define HW_CFG_DDR_CTLR_CLK_HZ      10000000
+     #define HW_CFG_DDR_PHY_OMIT
+     #define HW_CFG_UART_CLK_HZ           7500000
+  #else
+     #define HW_CFG_PLL_VCO_HZ           2000000000
+     #define HW_CFG_PLL2_VCO_HZ          1800000000
+     #define HW_CFG_ARM_CLK_HZ            CAP_HW_CFG_ARM_CLK_HZ
+     #define HW_CFG_BUS_CLK_HZ            166666666
+     #define HW_CFG_DDR_CTLR_CLK_HZ       333333333
+     #define HW_CFG_DDR_PHY_CLK_HZ        (2 * HW_CFG_DDR_CTLR_CLK_HZ)
+     #define HW_CFG_UART_CLK_HZ           142857142
+     #define HW_CFG_VPM_CLK_HZ            CAP_HW_CFG_VPM_CLK_HZ
+  #endif
+#else
+   #define HW_CFG_PLL_VCO_HZ           1800000000
+   #define HW_CFG_PLL2_VCO_HZ          1800000000
+   #define HW_CFG_ARM_CLK_HZ            450000000
+   #define HW_CFG_BUS_CLK_HZ            150000000
+   #define HW_CFG_DDR_CTLR_CLK_HZ       300000000
+   #define HW_CFG_DDR_PHY_CLK_HZ        (2 * HW_CFG_DDR_CTLR_CLK_HZ)
+   #define HW_CFG_UART_CLK_HZ           150000000
+   #define HW_CFG_VPM_CLK_HZ            300000000
+#endif
+
+/* ---- Public Constants and Types --------------------------------------- */
+/* ---- Public Variable Externs ------------------------------------------ */
+/* ---- Public Function Prototypes --------------------------------------- */
+
+
+#endif /* CSP_HW_CFG_H */
+
diff --git a/arch/arm/mach-bcmring/include/mach/csp/intcHw_reg.h b/arch/arm/mach-bcmring/include/mach/csp/intcHw_reg.h
new file mode 100644 (file)
index 0000000..e01fc46
--- /dev/null
@@ -0,0 +1,246 @@
+/*****************************************************************************
+* Copyright 2003 - 2008 Broadcom Corporation.  All rights reserved.
+*
+* Unless you and Broadcom execute a separate written software license
+* agreement governing use of this software, this software is licensed to you
+* under the terms of the GNU General Public License version 2, available at
+* http://www.broadcom.com/licenses/GPLv2.php (the "GPL").
+*
+* Notwithstanding the above, under no circumstances may you combine this
+* software in any way with any other Broadcom software provided under a
+* license other than the GPL, without Broadcom's express prior written
+* consent.
+*****************************************************************************/
+
+/****************************************************************************/
+/**
+*  @file    intcHw_reg.h
+*
+*  @brief   platform specific interrupt controller bit assignments
+*
+*  @note
+*     None
+*/
+/****************************************************************************/
+
+#ifndef _INTCHW_REG_H
+#define _INTCHW_REG_H
+
+/* ---- Include Files ---------------------------------------------------- */
+#include <csp/stdint.h>
+#include <csp/reg.h>
+#include <mach/csp/mm_io.h>
+
+/* ---- Public Constants and Types --------------------------------------- */
+
+#define INTCHW_NUM_IRQ_PER_INTC   32   /* Maximum number of interrupt controllers */
+#define INTCHW_NUM_INTC           3
+
+/* Defines for interrupt controllers. This simplifies and cleans up the function calls. */
+#define INTCHW_INTC0    ((void *)MM_IO_BASE_INTC0)
+#define INTCHW_INTC1    ((void *)MM_IO_BASE_INTC1)
+#define INTCHW_SINTC    ((void *)MM_IO_BASE_SINTC)
+
+/* INTC0 - interrupt controller 0 */
+#define INTCHW_INTC0_PIF_BITNUM           31   /* Peripheral interface interrupt */
+#define INTCHW_INTC0_CLCD_BITNUM          30   /* LCD Controller interrupt */
+#define INTCHW_INTC0_GE_BITNUM            29   /* Graphic engine interrupt */
+#define INTCHW_INTC0_APM_BITNUM           28   /* Audio process module interrupt */
+#define INTCHW_INTC0_ESW_BITNUM           27   /* Ethernet switch interrupt */
+#define INTCHW_INTC0_SPIH_BITNUM          26   /* SPI host interrupt */
+#define INTCHW_INTC0_TIMER3_BITNUM        25   /* Timer3 interrupt */
+#define INTCHW_INTC0_TIMER2_BITNUM        24   /* Timer2 interrupt */
+#define INTCHW_INTC0_TIMER1_BITNUM        23   /* Timer1 interrupt */
+#define INTCHW_INTC0_TIMER0_BITNUM        22   /* Timer0 interrupt */
+#define INTCHW_INTC0_SDIOH1_BITNUM        21   /* SDIO1 host interrupt */
+#define INTCHW_INTC0_SDIOH0_BITNUM        20   /* SDIO0 host interrupt */
+#define INTCHW_INTC0_USBD_BITNUM          19   /* USB device interrupt */
+#define INTCHW_INTC0_USBH1_BITNUM         18   /* USB1 host interrupt */
+#define INTCHW_INTC0_USBHD2_BITNUM        17   /* USB host2/device2 interrupt */
+#define INTCHW_INTC0_VPM_BITNUM           16   /* Voice process module interrupt */
+#define INTCHW_INTC0_DMA1C7_BITNUM        15   /* DMA1 channel 7 interrupt */
+#define INTCHW_INTC0_DMA1C6_BITNUM        14   /* DMA1 channel 6 interrupt */
+#define INTCHW_INTC0_DMA1C5_BITNUM        13   /* DMA1 channel 5 interrupt */
+#define INTCHW_INTC0_DMA1C4_BITNUM        12   /* DMA1 channel 4 interrupt */
+#define INTCHW_INTC0_DMA1C3_BITNUM        11   /* DMA1 channel 3 interrupt */
+#define INTCHW_INTC0_DMA1C2_BITNUM        10   /* DMA1 channel 2 interrupt */
+#define INTCHW_INTC0_DMA1C1_BITNUM         9   /* DMA1 channel 1 interrupt */
+#define INTCHW_INTC0_DMA1C0_BITNUM         8   /* DMA1 channel 0 interrupt */
+#define INTCHW_INTC0_DMA0C7_BITNUM         7   /* DMA0 channel 7 interrupt */
+#define INTCHW_INTC0_DMA0C6_BITNUM         6   /* DMA0 channel 6 interrupt */
+#define INTCHW_INTC0_DMA0C5_BITNUM         5   /* DMA0 channel 5 interrupt */
+#define INTCHW_INTC0_DMA0C4_BITNUM         4   /* DMA0 channel 4 interrupt */
+#define INTCHW_INTC0_DMA0C3_BITNUM         3   /* DMA0 channel 3 interrupt */
+#define INTCHW_INTC0_DMA0C2_BITNUM         2   /* DMA0 channel 2 interrupt */
+#define INTCHW_INTC0_DMA0C1_BITNUM         1   /* DMA0 channel 1 interrupt */
+#define INTCHW_INTC0_DMA0C0_BITNUM         0   /* DMA0 channel 0 interrupt */
+
+#define INTCHW_INTC0_PIF                  (1<<INTCHW_INTC0_PIF_BITNUM)
+#define INTCHW_INTC0_CLCD                 (1<<INTCHW_INTC0_CLCD_BITNUM)
+#define INTCHW_INTC0_GE                   (1<<INTCHW_INTC0_GE_BITNUM)
+#define INTCHW_INTC0_APM                  (1<<INTCHW_INTC0_APM_BITNUM)
+#define INTCHW_INTC0_ESW                  (1<<INTCHW_INTC0_ESW_BITNUM)
+#define INTCHW_INTC0_SPIH                 (1<<INTCHW_INTC0_SPIH_BITNUM)
+#define INTCHW_INTC0_TIMER3               (1<<INTCHW_INTC0_TIMER3_BITNUM)
+#define INTCHW_INTC0_TIMER2               (1<<INTCHW_INTC0_TIMER2_BITNUM)
+#define INTCHW_INTC0_TIMER1               (1<<INTCHW_INTC0_TIMER1_BITNUM)
+#define INTCHW_INTC0_TIMER0               (1<<INTCHW_INTC0_TIMER0_BITNUM)
+#define INTCHW_INTC0_SDIOH1               (1<<INTCHW_INTC0_SDIOH1_BITNUM)
+#define INTCHW_INTC0_SDIOH0               (1<<INTCHW_INTC0_SDIOH0_BITNUM)
+#define INTCHW_INTC0_USBD                 (1<<INTCHW_INTC0_USBD_BITNUM)
+#define INTCHW_INTC0_USBH1                (1<<INTCHW_INTC0_USBH1_BITNUM)
+#define INTCHW_INTC0_USBHD2               (1<<INTCHW_INTC0_USBHD2_BITNUM)
+#define INTCHW_INTC0_VPM                  (1<<INTCHW_INTC0_VPM_BITNUM)
+#define INTCHW_INTC0_DMA1C7               (1<<INTCHW_INTC0_DMA1C7_BITNUM)
+#define INTCHW_INTC0_DMA1C6               (1<<INTCHW_INTC0_DMA1C6_BITNUM)
+#define INTCHW_INTC0_DMA1C5               (1<<INTCHW_INTC0_DMA1C5_BITNUM)
+#define INTCHW_INTC0_DMA1C4               (1<<INTCHW_INTC0_DMA1C4_BITNUM)
+#define INTCHW_INTC0_DMA1C3               (1<<INTCHW_INTC0_DMA1C3_BITNUM)
+#define INTCHW_INTC0_DMA1C2               (1<<INTCHW_INTC0_DMA1C2_BITNUM)
+#define INTCHW_INTC0_DMA1C1               (1<<INTCHW_INTC0_DMA1C1_BITNUM)
+#define INTCHW_INTC0_DMA1C0               (1<<INTCHW_INTC0_DMA1C0_BITNUM)
+#define INTCHW_INTC0_DMA0C7               (1<<INTCHW_INTC0_DMA0C7_BITNUM)
+#define INTCHW_INTC0_DMA0C6               (1<<INTCHW_INTC0_DMA0C6_BITNUM)
+#define INTCHW_INTC0_DMA0C5               (1<<INTCHW_INTC0_DMA0C5_BITNUM)
+#define INTCHW_INTC0_DMA0C4               (1<<INTCHW_INTC0_DMA0C4_BITNUM)
+#define INTCHW_INTC0_DMA0C3               (1<<INTCHW_INTC0_DMA0C3_BITNUM)
+#define INTCHW_INTC0_DMA0C2               (1<<INTCHW_INTC0_DMA0C2_BITNUM)
+#define INTCHW_INTC0_DMA0C1               (1<<INTCHW_INTC0_DMA0C1_BITNUM)
+#define INTCHW_INTC0_DMA0C0               (1<<INTCHW_INTC0_DMA0C0_BITNUM)
+
+/* INTC1 - interrupt controller 1 */
+#define INTCHW_INTC1_DDRVPMP_BITNUM       27   /* DDR and VPM PLL clock phase relationship interupt (Not for A0) */
+#define INTCHW_INTC1_DDRVPMT_BITNUM       26   /* DDR and VPM HW phase align timeout interrupt (Not for A0) */
+#define INTCHW_INTC1_DDRP_BITNUM          26   /* DDR and PLL clock phase relationship interupt (For A0 only)) */
+#define INTCHW_INTC1_RTC2_BITNUM          25   /* Real time clock tamper interrupt */
+#define INTCHW_INTC1_VDEC_BITNUM          24   /* Hantro Video Decoder interrupt */
+/* Bits 13-23 are non-secure versions of the corresponding secure bits in SINTC bits 0-10. */
+#define INTCHW_INTC1_SPUM_BITNUM          23   /* Secure process module interrupt */
+#define INTCHW_INTC1_RTC1_BITNUM          22   /* Real time clock one-shot interrupt */
+#define INTCHW_INTC1_RTC0_BITNUM          21   /* Real time clock periodic interrupt */
+#define INTCHW_INTC1_RNG_BITNUM           20   /* Random number generator interrupt */
+#define INTCHW_INTC1_FMPU_BITNUM          19   /* Flash memory parition unit interrupt */
+#define INTCHW_INTC1_VMPU_BITNUM          18   /* VRAM memory partition interrupt */
+#define INTCHW_INTC1_DMPU_BITNUM          17   /* DDR2 memory partition interrupt */
+#define INTCHW_INTC1_KEYC_BITNUM          16   /* Key pad controller interrupt */
+#define INTCHW_INTC1_TSC_BITNUM           15   /* Touch screen controller interrupt */
+#define INTCHW_INTC1_UART0_BITNUM         14   /* UART 0 */
+#define INTCHW_INTC1_WDOG_BITNUM          13   /* Watchdog timer interrupt */
+
+#define INTCHW_INTC1_UART1_BITNUM         12   /* UART 1 */
+#define INTCHW_INTC1_PMUIRQ_BITNUM        11   /* ARM performance monitor interrupt */
+#define INTCHW_INTC1_COMMRX_BITNUM        10   /* ARM DDC receive interrupt */
+#define INTCHW_INTC1_COMMTX_BITNUM         9   /* ARM DDC transmit interrupt */
+#define INTCHW_INTC1_FLASHC_BITNUM         8   /* Flash controller interrupt */
+#define INTCHW_INTC1_GPHY_BITNUM           7   /* Gigabit Phy interrupt */
+#define INTCHW_INTC1_SPIS_BITNUM           6   /* SPI slave interrupt */
+#define INTCHW_INTC1_I2CS_BITNUM           5   /* I2C slave interrupt */
+#define INTCHW_INTC1_I2CH_BITNUM           4   /* I2C host interrupt */
+#define INTCHW_INTC1_I2S1_BITNUM           3   /* I2S1 interrupt */
+#define INTCHW_INTC1_I2S0_BITNUM           2   /* I2S0 interrupt */
+#define INTCHW_INTC1_GPIO1_BITNUM          1   /* GPIO bit 64//32 combined interrupt */
+#define INTCHW_INTC1_GPIO0_BITNUM          0   /* GPIO bit 31//0 combined interrupt */
+
+#define INTCHW_INTC1_DDRVPMT              (1<<INTCHW_INTC1_DDRVPMT_BITNUM)
+#define INTCHW_INTC1_DDRVPMP              (1<<INTCHW_INTC1_DDRVPMP_BITNUM)
+#define INTCHW_INTC1_DDRP                 (1<<INTCHW_INTC1_DDRP_BITNUM)
+#define INTCHW_INTC1_VDEC                 (1<<INTCHW_INTC1_VDEC_BITNUM)
+#define INTCHW_INTC1_SPUM                 (1<<INTCHW_INTC1_SPUM_BITNUM)
+#define INTCHW_INTC1_RTC2                 (1<<INTCHW_INTC1_RTC2_BITNUM)
+#define INTCHW_INTC1_RTC1                 (1<<INTCHW_INTC1_RTC1_BITNUM)
+#define INTCHW_INTC1_RTC0                 (1<<INTCHW_INTC1_RTC0_BITNUM)
+#define INTCHW_INTC1_RNG                  (1<<INTCHW_INTC1_RNG_BITNUM)
+#define INTCHW_INTC1_FMPU                 (1<<INTCHW_INTC1_FMPU_BITNUM)
+#define INTCHW_INTC1_IMPU                 (1<<INTCHW_INTC1_IMPU_BITNUM)
+#define INTCHW_INTC1_DMPU                 (1<<INTCHW_INTC1_DMPU_BITNUM)
+#define INTCHW_INTC1_KEYC                 (1<<INTCHW_INTC1_KEYC_BITNUM)
+#define INTCHW_INTC1_TSC                  (1<<INTCHW_INTC1_TSC_BITNUM)
+#define INTCHW_INTC1_UART0                (1<<INTCHW_INTC1_UART0_BITNUM)
+#define INTCHW_INTC1_WDOG                 (1<<INTCHW_INTC1_WDOG_BITNUM)
+#define INTCHW_INTC1_UART1                (1<<INTCHW_INTC1_UART1_BITNUM)
+#define INTCHW_INTC1_PMUIRQ               (1<<INTCHW_INTC1_PMUIRQ_BITNUM)
+#define INTCHW_INTC1_COMMRX               (1<<INTCHW_INTC1_COMMRX_BITNUM)
+#define INTCHW_INTC1_COMMTX               (1<<INTCHW_INTC1_COMMTX_BITNUM)
+#define INTCHW_INTC1_FLASHC               (1<<INTCHW_INTC1_FLASHC_BITNUM)
+#define INTCHW_INTC1_GPHY                 (1<<INTCHW_INTC1_GPHY_BITNUM)
+#define INTCHW_INTC1_SPIS                 (1<<INTCHW_INTC1_SPIS_BITNUM)
+#define INTCHW_INTC1_I2CS                 (1<<INTCHW_INTC1_I2CS_BITNUM)
+#define INTCHW_INTC1_I2CH                 (1<<INTCHW_INTC1_I2CH_BITNUM)
+#define INTCHW_INTC1_I2S1                 (1<<INTCHW_INTC1_I2S1_BITNUM)
+#define INTCHW_INTC1_I2S0                 (1<<INTCHW_INTC1_I2S0_BITNUM)
+#define INTCHW_INTC1_GPIO1                (1<<INTCHW_INTC1_GPIO1_BITNUM)
+#define INTCHW_INTC1_GPIO0                (1<<INTCHW_INTC1_GPIO0_BITNUM)
+
+/* SINTC secure int controller */
+#define INTCHW_SINTC_RTC2_BITNUM          15   /* Real time clock tamper interrupt */
+#define INTCHW_SINTC_TIMER3_BITNUM        14   /* Secure timer3 interrupt */
+#define INTCHW_SINTC_TIMER2_BITNUM        13   /* Secure timer2 interrupt */
+#define INTCHW_SINTC_TIMER1_BITNUM        12   /* Secure timer1 interrupt */
+#define INTCHW_SINTC_TIMER0_BITNUM        11   /* Secure timer0 interrupt */
+#define INTCHW_SINTC_SPUM_BITNUM          10   /* Secure process module interrupt */
+#define INTCHW_SINTC_RTC1_BITNUM           9   /* Real time clock one-shot interrupt */
+#define INTCHW_SINTC_RTC0_BITNUM           8   /* Real time clock periodic interrupt */
+#define INTCHW_SINTC_RNG_BITNUM            7   /* Random number generator interrupt */
+#define INTCHW_SINTC_FMPU_BITNUM           6   /* Flash memory parition unit interrupt */
+#define INTCHW_SINTC_VMPU_BITNUM           5   /* VRAM memory partition interrupt */
+#define INTCHW_SINTC_DMPU_BITNUM           4   /* DDR2 memory partition interrupt */
+#define INTCHW_SINTC_KEYC_BITNUM           3   /* Key pad controller interrupt */
+#define INTCHW_SINTC_TSC_BITNUM            2   /* Touch screen controller interrupt */
+#define INTCHW_SINTC_UART0_BITNUM          1   /* UART0 interrupt */
+#define INTCHW_SINTC_WDOG_BITNUM           0   /* Watchdog timer interrupt */
+
+#define INTCHW_SINTC_TIMER3               (1<<INTCHW_SINTC_TIMER3_BITNUM)
+#define INTCHW_SINTC_TIMER2               (1<<INTCHW_SINTC_TIMER2_BITNUM)
+#define INTCHW_SINTC_TIMER1               (1<<INTCHW_SINTC_TIMER1_BITNUM)
+#define INTCHW_SINTC_TIMER0               (1<<INTCHW_SINTC_TIMER0_BITNUM)
+#define INTCHW_SINTC_SPUM                 (1<<INTCHW_SINTC_SPUM_BITNUM)
+#define INTCHW_SINTC_RTC2                 (1<<INTCHW_SINTC_RTC2_BITNUM)
+#define INTCHW_SINTC_RTC1                 (1<<INTCHW_SINTC_RTC1_BITNUM)
+#define INTCHW_SINTC_RTC0                 (1<<INTCHW_SINTC_RTC0_BITNUM)
+#define INTCHW_SINTC_RNG                  (1<<INTCHW_SINTC_RNG_BITNUM)
+#define INTCHW_SINTC_FMPU                 (1<<INTCHW_SINTC_FMPU_BITNUM)
+#define INTCHW_SINTC_IMPU                 (1<<INTCHW_SINTC_IMPU_BITNUM)
+#define INTCHW_SINTC_DMPU                 (1<<INTCHW_SINTC_DMPU_BITNUM)
+#define INTCHW_SINTC_KEYC                 (1<<INTCHW_SINTC_KEYC_BITNUM)
+#define INTCHW_SINTC_TSC                  (1<<INTCHW_SINTC_TSC_BITNUM)
+#define INTCHW_SINTC_UART0                (1<<INTCHW_SINTC_UART0_BITNUM)
+#define INTCHW_SINTC_WDOG                 (1<<INTCHW_SINTC_WDOG_BITNUM)
+
+/* PL192 Vectored Interrupt Controller (VIC) layout */
+#define INTCHW_IRQSTATUS      0x00     /* IRQ status register */
+#define INTCHW_FIQSTATUS      0x04     /* FIQ status register */
+#define INTCHW_RAWINTR        0x08     /* Raw Interrupt Status register */
+#define INTCHW_INTSELECT      0x0c     /* Interrupt Select Register */
+#define INTCHW_INTENABLE      0x10     /* Interrupt Enable Register */
+#define INTCHW_INTENCLEAR     0x14     /* Interrupt Enable Clear Register */
+#define INTCHW_SOFTINT        0x18     /* Soft Interrupt Register */
+#define INTCHW_SOFTINTCLEAR   0x1c     /* Soft Interrupt Clear Register */
+#define INTCHW_PROTECTION     0x20     /* Protection Enable Register */
+#define INTCHW_SWPRIOMASK     0x24     /* Software Priority Mask Register */
+#define INTCHW_PRIODAISY      0x28     /* Priority Daisy Chain Register */
+#define INTCHW_VECTADDR0      0x100    /* Vector Address Registers */
+#define INTCHW_VECTPRIO0      0x200    /* Vector Priority Registers 0-31 */
+#define INTCHW_ADDRESS        0xf00    /* Vector Address Register 0-31 */
+#define INTCHW_PID            0xfe0    /* Peripheral ID Register 0-3 */
+#define INTCHW_PCELLID        0xff0    /* PrimeCell ID Register 0-3 */
+
+/* Example Usage: intcHw_irq_enable(INTCHW_INTC0, INTCHW_INTC0_TIMER0); */
+/*                intcHw_irq_clear(INTCHW_INTC0, INTCHW_INTC0_TIMER0); */
+/*                uint32_t bits = intcHw_irq_status(INTCHW_INTC0); */
+/*                uint32_t bits = intcHw_irq_raw_status(INTCHW_INTC0); */
+
+/* ---- Public Variable Externs ------------------------------------------ */
+/* ---- Public Function Prototypes --------------------------------------- */
+/* Clear one or more IRQ interrupts. */
+static inline void intcHw_irq_disable(void *basep, uint32_t mask)
+{
+       __REG32(basep + INTCHW_INTENCLEAR) = mask;
+}
+
+/* Enables one or more IRQ interrupts. */
+static inline void intcHw_irq_enable(void *basep, uint32_t mask)
+{
+       __REG32(basep + INTCHW_INTENABLE) = mask;
+}
+
+#endif /* _INTCHW_REG_H */
diff --git a/arch/arm/mach-bcmring/include/mach/csp/mm_addr.h b/arch/arm/mach-bcmring/include/mach/csp/mm_addr.h
new file mode 100644 (file)
index 0000000..86bb58d
--- /dev/null
@@ -0,0 +1,101 @@
+/*****************************************************************************
+* Copyright 2003 - 2008 Broadcom Corporation.  All rights reserved.
+*
+* Unless you and Broadcom execute a separate written software license
+* agreement governing use of this software, this software is licensed to you
+* under the terms of the GNU General Public License version 2, available at
+* http://www.broadcom.com/licenses/GPLv2.php (the "GPL").
+*
+* Notwithstanding the above, under no circumstances may you combine this
+* software in any way with any other Broadcom software provided under a
+* license other than the GPL, without Broadcom's express prior written
+* consent.
+*****************************************************************************/
+
+/****************************************************************************/
+/**
+*  @file    mm_addr.h
+*
+*  @brief   Memory Map address defintions
+*
+*  @note
+*     None
+*/
+/****************************************************************************/
+
+#ifndef _MM_ADDR_H
+#define _MM_ADDR_H
+
+/* ---- Include Files ---------------------------------------------------- */
+
+#if !defined(CSP_SIMULATION)
+#include <cfg_global.h>
+#endif
+
+/* ---- Public Constants and Types --------------------------------------- */
+
+/*  Memory Map address definitions */
+
+#define MM_ADDR_DDR                0x00000000
+
+#define MM_ADDR_IO_VPM_EXTMEM_RSVD 0x0F000000  /* 16 MB - Reserved external memory for VPM use */
+
+#define MM_ADDR_IO_FLASHC          0x20000000
+#define MM_ADDR_IO_BROM            0x30000000
+#define MM_ADDR_IO_ARAM            0x30100000  /* 64 KB - extra cycle latency - WS switch */
+#define MM_ADDR_IO_DMA0            0x30200000
+#define MM_ADDR_IO_DMA1            0x30300000
+#define MM_ADDR_IO_ESW             0x30400000
+#define MM_ADDR_IO_CLCD            0x30500000
+#define MM_ADDR_IO_PIF             0x30580000
+#define MM_ADDR_IO_APM             0x30600000
+#define MM_ADDR_IO_SPUM            0x30700000
+#define MM_ADDR_IO_VPM_PROG        0x30800000
+#define MM_ADDR_IO_VPM_DATA        0x30A00000
+#define MM_ADDR_IO_VRAM            0x40000000  /* 64 KB  - security block in front of it */
+#define MM_ADDR_IO_CHIPC           0x80000000
+#define MM_ADDR_IO_UMI             0x80001000
+#define MM_ADDR_IO_NAND            0x80001800
+#define MM_ADDR_IO_LEDM            0x80002000
+#define MM_ADDR_IO_PWM             0x80002040
+#define MM_ADDR_IO_VINTC           0x80003000
+#define MM_ADDR_IO_GPIO0           0x80004000
+#define MM_ADDR_IO_GPIO1           0x80004800
+#define MM_ADDR_IO_I2CS            0x80005000
+#define MM_ADDR_IO_SPIS            0x80006000
+#define MM_ADDR_IO_HPM             0x80007400
+#define MM_ADDR_IO_HPM_REMAP       0x80007800
+#define MM_ADDR_IO_TZPC            0x80008000
+#define MM_ADDR_IO_MPU             0x80009000
+#define MM_ADDR_IO_SPUMP           0x8000a000
+#define MM_ADDR_IO_PKA             0x8000b000
+#define MM_ADDR_IO_RNG             0x8000c000
+#define MM_ADDR_IO_KEYC            0x8000d000
+#define MM_ADDR_IO_BBL             0x8000e000
+#define MM_ADDR_IO_OTP             0x8000f000
+#define MM_ADDR_IO_I2S0            0x80010000
+#define MM_ADDR_IO_I2S1            0x80011000
+#define MM_ADDR_IO_UARTA           0x80012000
+#define MM_ADDR_IO_UARTB           0x80013000
+#define MM_ADDR_IO_I2CH            0x80014020
+#define MM_ADDR_IO_SPIH            0x80015000
+#define MM_ADDR_IO_TSC             0x80016000
+#define MM_ADDR_IO_TMR             0x80017000
+#define MM_ADDR_IO_WATCHDOG        0x80017800
+#define MM_ADDR_IO_ETM             0x80018000
+#define MM_ADDR_IO_DDRC            0x80019000
+#define MM_ADDR_IO_SINTC           0x80100000
+#define MM_ADDR_IO_INTC0           0x80200000
+#define MM_ADDR_IO_INTC1           0x80201000
+#define MM_ADDR_IO_GE              0x80300000
+#define MM_ADDR_IO_USB_CTLR0       0x80400000
+#define MM_ADDR_IO_USB_CTLR1       0x80410000
+#define MM_ADDR_IO_USB_PHY         0x80420000
+#define MM_ADDR_IO_SDIOH0          0x80500000
+#define MM_ADDR_IO_SDIOH1          0x80600000
+#define MM_ADDR_IO_VDEC            0x80700000
+
+/* ---- Public Variable Externs ------------------------------------------ */
+/* ---- Public Function Prototypes --------------------------------------- */
+
+#endif /* _MM_ADDR_H */
diff --git a/arch/arm/mach-bcmring/include/mach/csp/mm_io.h b/arch/arm/mach-bcmring/include/mach/csp/mm_io.h
new file mode 100644 (file)
index 0000000..de92ec6
--- /dev/null
@@ -0,0 +1,147 @@
+/*****************************************************************************
+* Copyright 2003 - 2008 Broadcom Corporation.  All rights reserved.
+*
+* Unless you and Broadcom execute a separate written software license
+* agreement governing use of this software, this software is licensed to you
+* under the terms of the GNU General Public License version 2, available at
+* http://www.broadcom.com/licenses/GPLv2.php (the "GPL").
+*
+* Notwithstanding the above, under no circumstances may you combine this
+* software in any way with any other Broadcom software provided under a
+* license other than the GPL, without Broadcom's express prior written
+* consent.
+*****************************************************************************/
+
+/****************************************************************************/
+/**
+*  @file    mm_io.h
+*
+*  @brief   Memory Map I/O definitions
+*
+*  @note
+*     None
+*/
+/****************************************************************************/
+
+#ifndef _MM_IO_H
+#define _MM_IO_H
+
+/* ---- Include Files ---------------------------------------------------- */
+#include <mach/csp/mm_addr.h>
+
+#if !defined(CSP_SIMULATION)
+#include <cfg_global.h>
+#endif
+
+/* ---- Public Constants and Types --------------------------------------- */
+
+#if defined(CONFIG_MMU)
+
+/* This macro is referenced in <mach/io.h>
+ * Phys to Virtual 0xNyxxxxxx => 0xFNxxxxxx
+ * This macro is referenced in <asm/arch/io.h>
+ *
+ * Assume VPM address is the last x MB of memory.  For VPM, map to
+ * 0xf0000000 and up.
+ */
+
+#ifndef MM_IO_PHYS_TO_VIRT
+#ifdef __ASSEMBLY__
+#define MM_IO_PHYS_TO_VIRT(phys)       (0xF0000000 | (((phys) >> 4) & 0x0F000000) | ((phys) & 0xFFFFFF))
+#else
+#define MM_IO_PHYS_TO_VIRT(phys)       (((phys) == MM_ADDR_IO_VPM_EXTMEM_RSVD) ? 0xF0000000 : \
+                       (0xF0000000 | (((phys) >> 4) & 0x0F000000) | ((phys) & 0xFFFFFF)))
+#endif
+#endif
+
+/* Virtual to Physical 0xFNxxxxxx => 0xN0xxxxxx */
+
+#ifndef MM_IO_VIRT_TO_PHYS
+#ifdef __ASSEMBLY__
+#define MM_IO_VIRT_TO_PHYS(virt)       ((((virt) & 0x0F000000) << 4) | ((virt) & 0xFFFFFF))
+#else
+#define MM_IO_VIRT_TO_PHYS(virt)       (((virt) == 0xF0000000) ? MM_ADDR_IO_VPM_EXTMEM_RSVD : \
+                       ((((virt) & 0x0F000000) << 4) | ((virt) & 0xFFFFFF)))
+#endif
+#endif
+
+#else
+
+#ifndef MM_IO_PHYS_TO_VIRT
+#define MM_IO_PHYS_TO_VIRT(phys)       (phys)
+#endif
+
+#ifndef MM_IO_VIRT_TO_PHYS
+#define MM_IO_VIRT_TO_PHYS(virt)       (virt)
+#endif
+
+#endif
+
+/* Registers in 0xExxxxxxx that should be moved to 0xFxxxxxxx */
+#define MM_IO_BASE_FLASHC              MM_IO_PHYS_TO_VIRT(MM_ADDR_IO_FLASHC)
+#define MM_IO_BASE_NAND                MM_IO_PHYS_TO_VIRT(MM_ADDR_IO_NAND)
+#define MM_IO_BASE_UMI                 MM_IO_PHYS_TO_VIRT(MM_ADDR_IO_UMI)
+
+#define MM_IO_START MM_ADDR_IO_FLASHC  /* Physical beginning of IO mapped memory */
+#define MM_IO_BASE  MM_IO_BASE_FLASHC  /* Virtual beginning of IO mapped memory */
+
+#define MM_IO_BASE_BROM                MM_IO_PHYS_TO_VIRT(MM_ADDR_IO_BROM)
+#define MM_IO_BASE_ARAM                MM_IO_PHYS_TO_VIRT(MM_ADDR_IO_ARAM)
+#define MM_IO_BASE_DMA0                MM_IO_PHYS_TO_VIRT(MM_ADDR_IO_DMA0)
+#define MM_IO_BASE_DMA1                MM_IO_PHYS_TO_VIRT(MM_ADDR_IO_DMA1)
+#define MM_IO_BASE_ESW                 MM_IO_PHYS_TO_VIRT(MM_ADDR_IO_ESW)
+#define MM_IO_BASE_CLCD                MM_IO_PHYS_TO_VIRT(MM_ADDR_IO_CLCD)
+#define MM_IO_BASE_PIF                 MM_IO_PHYS_TO_VIRT(MM_ADDR_IO_PIF)
+#define MM_IO_BASE_APM                 MM_IO_PHYS_TO_VIRT(MM_ADDR_IO_APM)
+#define MM_IO_BASE_SPUM                MM_IO_PHYS_TO_VIRT(MM_ADDR_IO_SPUM)
+#define MM_IO_BASE_VPM_PROG            MM_IO_PHYS_TO_VIRT(MM_ADDR_IO_VPM_PROG)
+#define MM_IO_BASE_VPM_DATA            MM_IO_PHYS_TO_VIRT(MM_ADDR_IO_VPM_DATA)
+
+#define MM_IO_BASE_VRAM                MM_IO_PHYS_TO_VIRT(MM_ADDR_IO_VRAM)
+
+#define MM_IO_BASE_CHIPC               MM_IO_PHYS_TO_VIRT(MM_ADDR_IO_CHIPC)
+#define MM_IO_BASE_DDRC                MM_IO_PHYS_TO_VIRT(MM_ADDR_IO_DDRC)
+#define MM_IO_BASE_LEDM                MM_IO_PHYS_TO_VIRT(MM_ADDR_IO_LEDM)
+#define MM_IO_BASE_PWM                 MM_IO_PHYS_TO_VIRT(MM_ADDR_IO_PWM)
+#define MM_IO_BASE_VINTC               MM_IO_PHYS_TO_VIRT(MM_ADDR_IO_VINTC)
+#define MM_IO_BASE_GPIO0               MM_IO_PHYS_TO_VIRT(MM_ADDR_IO_GPIO0)
+#define MM_IO_BASE_GPIO1               MM_IO_PHYS_TO_VIRT(MM_ADDR_IO_GPIO1)
+#define MM_IO_BASE_TMR                 MM_IO_PHYS_TO_VIRT(MM_ADDR_IO_TMR)
+#define MM_IO_BASE_WATCHDOG            MM_IO_PHYS_TO_VIRT(MM_ADDR_IO_WATCHDOG)
+#define MM_IO_BASE_ETM                 MM_IO_PHYS_TO_VIRT(MM_ADDR_IO_ETM)
+#define MM_IO_BASE_HPM                 MM_IO_PHYS_TO_VIRT(MM_ADDR_IO_HPM)
+#define MM_IO_BASE_HPM_REMAP           MM_IO_PHYS_TO_VIRT(MM_ADDR_IO_HPM_REMAP)
+#define MM_IO_BASE_TZPC                MM_IO_PHYS_TO_VIRT(MM_ADDR_IO_TZPC)
+#define MM_IO_BASE_MPU                 MM_IO_PHYS_TO_VIRT(MM_ADDR_IO_MPU)
+#define MM_IO_BASE_SPUMP               MM_IO_PHYS_TO_VIRT(MM_ADDR_IO_SPUMP)
+#define MM_IO_BASE_PKA                 MM_IO_PHYS_TO_VIRT(MM_ADDR_IO_PKA)
+#define MM_IO_BASE_RNG                 MM_IO_PHYS_TO_VIRT(MM_ADDR_IO_RNG)
+#define MM_IO_BASE_KEYC                MM_IO_PHYS_TO_VIRT(MM_ADDR_IO_KEYC)
+#define MM_IO_BASE_BBL                 MM_IO_PHYS_TO_VIRT(MM_ADDR_IO_BBL)
+#define MM_IO_BASE_OTP                 MM_IO_PHYS_TO_VIRT(MM_ADDR_IO_OTP)
+#define MM_IO_BASE_I2S0                MM_IO_PHYS_TO_VIRT(MM_ADDR_IO_I2S0)
+#define MM_IO_BASE_I2S1                MM_IO_PHYS_TO_VIRT(MM_ADDR_IO_I2S1)
+#define MM_IO_BASE_UARTA               MM_IO_PHYS_TO_VIRT(MM_ADDR_IO_UARTA)
+#define MM_IO_BASE_UARTB               MM_IO_PHYS_TO_VIRT(MM_ADDR_IO_UARTB)
+#define MM_IO_BASE_I2CH                MM_IO_PHYS_TO_VIRT(MM_ADDR_IO_I2CH)
+#define MM_IO_BASE_SPIH                MM_IO_PHYS_TO_VIRT(MM_ADDR_IO_SPIH)
+#define MM_IO_BASE_TSC                 MM_IO_PHYS_TO_VIRT(MM_ADDR_IO_TSC)
+#define MM_IO_BASE_I2CS                MM_IO_PHYS_TO_VIRT(MM_ADDR_IO_I2CS)
+#define MM_IO_BASE_SPIS                MM_IO_PHYS_TO_VIRT(MM_ADDR_IO_SPIS)
+#define MM_IO_BASE_SINTC               MM_IO_PHYS_TO_VIRT(MM_ADDR_IO_SINTC)
+#define MM_IO_BASE_INTC0               MM_IO_PHYS_TO_VIRT(MM_ADDR_IO_INTC0)
+#define MM_IO_BASE_INTC1               MM_IO_PHYS_TO_VIRT(MM_ADDR_IO_INTC1)
+#define MM_IO_BASE_GE                  MM_IO_PHYS_TO_VIRT(MM_ADDR_IO_GE)
+#define MM_IO_BASE_USB_CTLR0           MM_IO_PHYS_TO_VIRT(MM_ADDR_IO_USB_CTLR0)
+#define MM_IO_BASE_USB_CTLR1           MM_IO_PHYS_TO_VIRT(MM_ADDR_IO_USB_CTLR1)
+#define MM_IO_BASE_USB_PHY             MM_IO_PHYS_TO_VIRT(MM_ADDR_IO_USB_PHY)
+#define MM_IO_BASE_SDIOH0              MM_IO_PHYS_TO_VIRT(MM_ADDR_IO_SDIOH0)
+#define MM_IO_BASE_SDIOH1              MM_IO_PHYS_TO_VIRT(MM_ADDR_IO_SDIOH1)
+#define MM_IO_BASE_VDEC                MM_IO_PHYS_TO_VIRT(MM_ADDR_IO_VDEC)
+
+#define MM_IO_BASE_VPM_EXTMEM_RSVD     MM_IO_PHYS_TO_VIRT(MM_ADDR_IO_VPM_EXTMEM_RSVD)
+
+/* ---- Public Variable Externs ------------------------------------------ */
+/* ---- Public Function Prototypes --------------------------------------- */
+
+#endif /* _MM_IO_H */
diff --git a/arch/arm/mach-bcmring/include/mach/csp/secHw_def.h b/arch/arm/mach-bcmring/include/mach/csp/secHw_def.h
new file mode 100644 (file)
index 0000000..d15f5f3
--- /dev/null
@@ -0,0 +1,100 @@
+/*****************************************************************************
+* Copyright 2003 - 2008 Broadcom Corporation.  All rights reserved.
+*
+* Unless you and Broadcom execute a separate written software license
+* agreement governing use of this software, this software is licensed to you
+* under the terms of the GNU General Public License version 2, available at
+* http://www.broadcom.com/licenses/GPLv2.php (the "GPL").
+*
+* Notwithstanding the above, under no circumstances may you combine this
+* software in any way with any other Broadcom software provided under a
+* license other than the GPL, without Broadcom's express prior written
+* consent.
+*****************************************************************************/
+
+/****************************************************************************/
+/**
+*  @file    secHw_def.h
+*
+*  @brief   Definitions for configuring/testing secure blocks
+*
+*  @note
+*     None
+*/
+/****************************************************************************/
+
+#ifndef SECHW_DEF_H
+#define SECHW_DEF_H
+
+#include <mach/csp/mm_io.h>
+
+/* Bit mask for various secure device */
+#define secHw_BLK_MASK_CHIP_CONTROL     0x00000001
+#define secHw_BLK_MASK_KEY_SCAN         0x00000002
+#define secHw_BLK_MASK_TOUCH_SCREEN     0x00000004
+#define secHw_BLK_MASK_UART0            0x00000008
+#define secHw_BLK_MASK_UART1            0x00000010
+#define secHw_BLK_MASK_WATCHDOG         0x00000020
+#define secHw_BLK_MASK_SPUM             0x00000040
+#define secHw_BLK_MASK_DDR2             0x00000080
+#define secHw_BLK_MASK_EXT_MEM          0x00000100
+#define secHw_BLK_MASK_ESW              0x00000200
+#define secHw_BLK_MASK_SPU              0x00010000
+#define secHw_BLK_MASK_PKA              0x00020000
+#define secHw_BLK_MASK_RNG              0x00040000
+#define secHw_BLK_MASK_RTC              0x00080000
+#define secHw_BLK_MASK_OTP              0x00100000
+#define secHw_BLK_MASK_BOOT             0x00200000
+#define secHw_BLK_MASK_MPU              0x00400000
+#define secHw_BLK_MASK_TZCTRL           0x00800000
+#define secHw_BLK_MASK_INTR             0x01000000
+
+/* Trustzone register set */
+typedef struct {
+       volatile uint32_t status;       /* read only - reflects status of writes of 2 write registers */
+       volatile uint32_t setUnsecure;  /* write only. reads back as 0 */
+       volatile uint32_t setSecure;    /* write only. reads back as 0 */
+} secHw_TZREG_t;
+
+/* There are 2 register sets. The first is for the lower 16 bits, the 2nd */
+/* is for the higher 16 bits. */
+
+typedef enum {
+       secHw_IDX_LS = 0,
+       secHw_IDX_MS = 1,
+       secHw_IDX_NUM
+} secHw_IDX_e;
+
+typedef struct {
+       volatile secHw_TZREG_t reg[secHw_IDX_NUM];
+} secHw_REGS_t;
+
+/****************************************************************************/
+/**
+*  @brief  Configures a device as a secure device
+*
+*/
+/****************************************************************************/
+static inline void secHw_setSecure(uint32_t mask       /*  mask of type secHw_BLK_MASK_XXXXXX */
+    );
+
+/****************************************************************************/
+/**
+*  @brief  Configures a device as a non-secure device
+*
+*/
+/****************************************************************************/
+static inline void secHw_setUnsecure(uint32_t mask     /*  mask of type secHw_BLK_MASK_XXXXXX */
+    );
+
+/****************************************************************************/
+/**
+*  @brief  Get the trustzone status for all components. 1 = non-secure, 0 = secure
+*
+*/
+/****************************************************************************/
+static inline uint32_t secHw_getStatus(void);
+
+#include <mach/csp/secHw_inline.h>
+
+#endif /* SECHW_DEF_H */
diff --git a/arch/arm/mach-bcmring/include/mach/csp/secHw_inline.h b/arch/arm/mach-bcmring/include/mach/csp/secHw_inline.h
new file mode 100644 (file)
index 0000000..9cd6a03
--- /dev/null
@@ -0,0 +1,79 @@
+/*****************************************************************************
+* Copyright 2003 - 2008 Broadcom Corporation.  All rights reserved.
+*
+* Unless you and Broadcom execute a separate written software license
+* agreement governing use of this software, this software is licensed to you
+* under the terms of the GNU General Public License version 2, available at
+* http://www.broadcom.com/licenses/GPLv2.php (the "GPL").
+*
+* Notwithstanding the above, under no circumstances may you combine this
+* software in any way with any other Broadcom software provided under a
+* license other than the GPL, without Broadcom's express prior written
+* consent.
+*****************************************************************************/
+
+/****************************************************************************/
+/**
+*  @file    secHw_inline.h
+*
+*  @brief   Definitions for configuring/testing secure blocks
+*
+*  @note
+*     None
+*/
+/****************************************************************************/
+
+#ifndef SECHW_INLINE_H
+#define SECHW_INLINE_H
+
+/****************************************************************************/
+/**
+*  @brief  Configures a device as a secure device
+*
+*/
+/****************************************************************************/
+static inline void secHw_setSecure(uint32_t mask       /*  mask of type secHw_BLK_MASK_XXXXXX */
+    ) {
+       secHw_REGS_t *regp = (secHw_REGS_t *) MM_IO_BASE_TZPC;
+
+       if (mask & 0x0000FFFF) {
+               regp->reg[secHw_IDX_LS].setSecure = mask & 0x0000FFFF;
+       }
+
+       if (mask & 0xFFFF0000) {
+               regp->reg[secHw_IDX_MS].setSecure = mask >> 16;
+       }
+}
+
+/****************************************************************************/
+/**
+*  @brief  Configures a device as a non-secure device
+*
+*/
+/****************************************************************************/
+static inline void secHw_setUnsecure(uint32_t mask     /*  mask of type secHw_BLK_MASK_XXXXXX */
+    ) {
+       secHw_REGS_t *regp = (secHw_REGS_t *) MM_IO_BASE_TZPC;
+
+       if (mask & 0x0000FFFF) {
+               regp->reg[secHw_IDX_LS].setUnsecure = mask & 0x0000FFFF;
+       }
+       if (mask & 0xFFFF0000) {
+               regp->reg[secHw_IDX_MS].setUnsecure = mask >> 16;
+       }
+}
+
+/****************************************************************************/
+/**
+*  @brief  Get the trustzone status for all components. 1 = non-secure, 0 = secure
+*
+*/
+/****************************************************************************/
+static inline uint32_t secHw_getStatus(void)
+{
+       secHw_REGS_t *regp = (secHw_REGS_t *) MM_IO_BASE_TZPC;
+
+       return (regp->reg[1].status << 16) + regp->reg[0].status;
+}
+
+#endif /* SECHW_INLINE_H */
diff --git a/arch/arm/mach-bcmring/include/mach/csp/tmrHw_reg.h b/arch/arm/mach-bcmring/include/mach/csp/tmrHw_reg.h
new file mode 100644 (file)
index 0000000..3080ac7
--- /dev/null
@@ -0,0 +1,82 @@
+/*****************************************************************************
+* Copyright 2004 - 2008 Broadcom Corporation.  All rights reserved.
+*
+* Unless you and Broadcom execute a separate written software license
+* agreement governing use of this software, this software is licensed to you
+* under the terms of the GNU General Public License version 2, available at
+* http://www.broadcom.com/licenses/GPLv2.php (the "GPL").
+*
+* Notwithstanding the above, under no circumstances may you combine this
+* software in any way with any other Broadcom software provided under a
+* license other than the GPL, without Broadcom's express prior written
+* consent.
+*****************************************************************************/
+
+/****************************************************************************/
+/**
+*  @file    tmrHw_reg.h
+*
+*  @brief   Definitions for low level Timer registers
+*
+*/
+/****************************************************************************/
+#ifndef _TMRHW_REG_H
+#define _TMRHW_REG_H
+
+#include <mach/csp/mm_io.h>
+#include <mach/csp/hw_cfg.h>
+/* Base address */
+#define tmrHw_MODULE_BASE_ADDR          MM_IO_BASE_TMR
+
+/*
+This platform has four different timers running at different clock speed
+
+Timer one   (Timer ID 0) runs at  25 MHz
+Timer two   (Timer ID 1) runs at  25 MHz
+Timer three (Timer ID 2) runs at 150 MHz
+Timer four  (Timer ID 3) runs at 150 MHz
+*/
+#define tmrHw_LOW_FREQUENCY_MHZ         25     /* Always 25MHz from XTAL */
+#define tmrHw_LOW_FREQUENCY_HZ          25000000
+
+#if defined(CFG_GLOBAL_CHIP) && (CFG_GLOBAL_CHIP == FPGA11107)
+#define tmrHw_HIGH_FREQUENCY_MHZ        150    /* Always 150MHz for FPGA */
+#define tmrHw_HIGH_FREQUENCY_HZ         150000000
+#else
+#define tmrHw_HIGH_FREQUENCY_HZ         HW_CFG_BUS_CLK_HZ
+#define tmrHw_HIGH_FREQUENCY_MHZ        (HW_CFG_BUS_CLK_HZ / 1000000)
+#endif
+
+#define tmrHw_LOW_RESOLUTION_CLOCK      tmrHw_LOW_FREQUENCY_HZ
+#define tmrHw_HIGH_RESOLUTION_CLOCK     tmrHw_HIGH_FREQUENCY_HZ
+#define tmrHw_MAX_COUNT                 (0xFFFFFFFF)   /* maximum number of count a timer can count */
+#define tmrHw_TIMER_NUM_COUNT           (4)    /* Number of timer module supported */
+
+typedef struct {
+       uint32_t LoadValue;     /* Load value for timer */
+       uint32_t CurrentValue;  /* Current value for timer */
+       uint32_t Control;       /* Control register */
+       uint32_t InterruptClear;        /* Interrupt clear register */
+       uint32_t RawInterruptStatus;    /* Raw interrupt status */
+       uint32_t InterruptStatus;       /* Masked interrupt status */
+       uint32_t BackgroundLoad;        /* Background load value */
+       uint32_t padding;       /* Padding register */
+} tmrHw_REG_t;
+
+/* Control bot masks */
+#define tmrHw_CONTROL_TIMER_ENABLE            0x00000080
+#define tmrHw_CONTROL_PERIODIC                0x00000040
+#define tmrHw_CONTROL_INTERRUPT_ENABLE        0x00000020
+#define tmrHw_CONTROL_PRESCALE_MASK           0x0000000C
+#define tmrHw_CONTROL_PRESCALE_1              0x00000000
+#define tmrHw_CONTROL_PRESCALE_16             0x00000004
+#define tmrHw_CONTROL_PRESCALE_256            0x00000008
+#define tmrHw_CONTROL_32BIT                   0x00000002
+#define tmrHw_CONTROL_ONESHOT                 0x00000001
+#define tmrHw_CONTROL_FREE_RUNNING            0x00000000
+
+#define tmrHw_CONTROL_MODE_MASK               (tmrHw_CONTROL_PERIODIC | tmrHw_CONTROL_ONESHOT)
+
+#define pTmrHw ((volatile tmrHw_REG_t *)tmrHw_MODULE_BASE_ADDR)
+
+#endif /* _TMRHW_REG_H */
diff --git a/arch/arm/mach-bcmring/include/mach/dma.h b/arch/arm/mach-bcmring/include/mach/dma.h
new file mode 100644 (file)
index 0000000..847980c
--- /dev/null
@@ -0,0 +1,826 @@
+/*****************************************************************************
+* Copyright 2004 - 2008 Broadcom Corporation.  All rights reserved.
+*
+* Unless you and Broadcom execute a separate written software license
+* agreement governing use of this software, this software is licensed to you
+* under the terms of the GNU General Public License version 2, available at
+* http://www.broadcom.com/licenses/GPLv2.php (the "GPL").
+*
+* Notwithstanding the above, under no circumstances may you combine this
+* software in any way with any other Broadcom software provided under a
+* license other than the GPL, without Broadcom's express prior written
+* consent.
+*****************************************************************************/
+
+/****************************************************************************/
+/**
+*   @file   dma.h
+*
+*   @brief  API definitions for the linux DMA interface.
+*/
+/****************************************************************************/
+
+#if !defined(ASM_ARM_ARCH_BCMRING_DMA_H)
+#define ASM_ARM_ARCH_BCMRING_DMA_H
+
+/* ---- Include Files ---------------------------------------------------- */
+
+#include <linux/kernel.h>
+#include <linux/wait.h>
+#include <linux/semaphore.h>
+#include <csp/dmacHw.h>
+#include <mach/timer.h>
+#include <linux/scatterlist.h>
+#include <linux/dma-mapping.h>
+#include <linux/mm.h>
+#include <linux/vmalloc.h>
+#include <linux/pagemap.h>
+
+/* ---- Constants and Types ---------------------------------------------- */
+
+/* If DMA_DEBUG_TRACK_RESERVATION is set to a non-zero value, then the filename */
+/* and line number of the reservation request will be recorded in the channel table */
+
+#define DMA_DEBUG_TRACK_RESERVATION   1
+
+#define DMA_NUM_CONTROLLERS     2
+#define DMA_NUM_CHANNELS        8      /* per controller */
+
+typedef enum {
+       DMA_DEVICE_MEM_TO_MEM,  /* For memory to memory transfers */
+       DMA_DEVICE_I2S0_DEV_TO_MEM,
+       DMA_DEVICE_I2S0_MEM_TO_DEV,
+       DMA_DEVICE_I2S1_DEV_TO_MEM,
+       DMA_DEVICE_I2S1_MEM_TO_DEV,
+       DMA_DEVICE_APM_CODEC_A_DEV_TO_MEM,
+       DMA_DEVICE_APM_CODEC_A_MEM_TO_DEV,
+       DMA_DEVICE_APM_CODEC_B_DEV_TO_MEM,
+       DMA_DEVICE_APM_CODEC_B_MEM_TO_DEV,
+       DMA_DEVICE_APM_CODEC_C_DEV_TO_MEM,      /* Additional mic input for beam-forming */
+       DMA_DEVICE_APM_PCM0_DEV_TO_MEM,
+       DMA_DEVICE_APM_PCM0_MEM_TO_DEV,
+       DMA_DEVICE_APM_PCM1_DEV_TO_MEM,
+       DMA_DEVICE_APM_PCM1_MEM_TO_DEV,
+       DMA_DEVICE_SPUM_DEV_TO_MEM,
+       DMA_DEVICE_SPUM_MEM_TO_DEV,
+       DMA_DEVICE_SPIH_DEV_TO_MEM,
+       DMA_DEVICE_SPIH_MEM_TO_DEV,
+       DMA_DEVICE_UART_A_DEV_TO_MEM,
+       DMA_DEVICE_UART_A_MEM_TO_DEV,
+       DMA_DEVICE_UART_B_DEV_TO_MEM,
+       DMA_DEVICE_UART_B_MEM_TO_DEV,
+       DMA_DEVICE_PIF_MEM_TO_DEV,
+       DMA_DEVICE_PIF_DEV_TO_MEM,
+       DMA_DEVICE_ESW_DEV_TO_MEM,
+       DMA_DEVICE_ESW_MEM_TO_DEV,
+       DMA_DEVICE_VPM_MEM_TO_MEM,
+       DMA_DEVICE_CLCD_MEM_TO_MEM,
+       DMA_DEVICE_NAND_MEM_TO_MEM,
+       DMA_DEVICE_MEM_TO_VRAM,
+       DMA_DEVICE_VRAM_TO_MEM,
+
+       /* Add new entries before this line. */
+
+       DMA_NUM_DEVICE_ENTRIES,
+       DMA_DEVICE_NONE = 0xff, /* Special value to indicate that no device is currently assigned. */
+
+} DMA_Device_t;
+
+/****************************************************************************
+*
+*   The DMA_Handle_t is the primary object used by callers of the API.
+*
+*****************************************************************************/
+
+#define DMA_INVALID_HANDLE  ((DMA_Handle_t) -1)
+
+typedef int DMA_Handle_t;
+
+/****************************************************************************
+*
+*   The DMA_DescriptorRing_t contains a ring of descriptors which is used
+*   to point to regions of memory.
+*
+*****************************************************************************/
+
+typedef struct {
+       void *virtAddr;         /* Virtual Address of the descriptor ring */
+       dma_addr_t physAddr;    /* Physical address of the descriptor ring */
+       int descriptorsAllocated;       /* Number of descriptors allocated in the descriptor ring */
+       size_t bytesAllocated;  /* Number of bytes allocated in the descriptor ring */
+
+} DMA_DescriptorRing_t;
+
+/****************************************************************************
+*
+*   The DMA_MemType_t and DMA_MemMap_t are helper structures used to setup
+*   DMA chains from a variety of memory sources.
+*
+*****************************************************************************/
+
+#define DMA_MEM_MAP_MIN_SIZE    4096   /* Pages less than this size are better */
+                                       /* off not being DMA'd. */
+
+typedef enum {
+       DMA_MEM_TYPE_NONE,      /* Not a valid setting */
+       DMA_MEM_TYPE_VMALLOC,   /* Memory came from vmalloc call */
+       DMA_MEM_TYPE_KMALLOC,   /* Memory came from kmalloc call */
+       DMA_MEM_TYPE_DMA,       /* Memory came from dma_alloc_xxx call */
+       DMA_MEM_TYPE_USER,      /* Memory came from user space. */
+
+} DMA_MemType_t;
+
+/* A segment represents a physically and virtually contiguous chunk of memory. */
+/* i.e. each segment can be DMA'd */
+/* A user of the DMA code will add memory regions. Each region may need to be */
+/* represented by one or more segments. */
+
+typedef struct {
+       void *virtAddr;         /* Virtual address used for this segment */
+       dma_addr_t physAddr;    /* Physical address this segment maps to */
+       size_t numBytes;        /* Size of the segment, in bytes */
+
+} DMA_Segment_t;
+
+/* A region represents a virtually contiguous chunk of memory, which may be */
+/* made up of multiple segments. */
+
+typedef struct {
+       DMA_MemType_t memType;
+       void *virtAddr;
+       size_t numBytes;
+
+       /* Each region (virtually contiguous) consists of one or more segments. Each */
+       /* segment is virtually and physically contiguous. */
+
+       int numSegmentsUsed;
+       int numSegmentsAllocated;
+       DMA_Segment_t *segment;
+
+       /* When a region corresponds to user memory, we need to lock all of the pages */
+       /* down before we can figure out the physical addresses. The lockedPage array contains */
+       /* the pages that were locked, and which subsequently need to be unlocked once the */
+       /* memory is unmapped. */
+
+       unsigned numLockedPages;
+       struct page **lockedPages;
+
+} DMA_Region_t;
+
+typedef struct {
+       int inUse;              /* Is this mapping currently being used? */
+       struct semaphore lock;  /* Acquired when using this structure */
+       enum dma_data_direction dir;    /* Direction this transfer is intended for */
+
+       /* In the event that we're mapping user memory, we need to know which task */
+       /* the memory is for, so that we can obtain the correct mm locks. */
+
+       struct task_struct *userTask;
+
+       int numRegionsUsed;
+       int numRegionsAllocated;
+       DMA_Region_t *region;
+
+} DMA_MemMap_t;
+
+/****************************************************************************
+*
+*   The DMA_DeviceAttribute_t contains information which describes a
+*   particular DMA device (or peripheral).
+*
+*   It is anticipated that the arrary of DMA_DeviceAttribute_t's will be
+*   statically initialized.
+*
+*****************************************************************************/
+
+/* The device handler is called whenever a DMA operation completes. The reaon */
+/* for it to be called will be a bitmask with one or more of the following bits */
+/* set. */
+
+#define DMA_HANDLER_REASON_BLOCK_COMPLETE       dmacHw_INTERRUPT_STATUS_BLOCK
+#define DMA_HANDLER_REASON_TRANSFER_COMPLETE    dmacHw_INTERRUPT_STATUS_TRANS
+#define DMA_HANDLER_REASON_ERROR                dmacHw_INTERRUPT_STATUS_ERROR
+
+typedef void (*DMA_DeviceHandler_t) (DMA_Device_t dev, int reason,
+                                    void *userData);
+
+#define DMA_DEVICE_FLAG_ON_DMA0             0x00000001
+#define DMA_DEVICE_FLAG_ON_DMA1             0x00000002
+#define DMA_DEVICE_FLAG_PORT_PER_DMAC       0x00000004 /* If set, it means that the port used on DMAC0 is different from the port used on DMAC1 */
+#define DMA_DEVICE_FLAG_ALLOC_DMA1_FIRST    0x00000008 /* If set, allocate from DMA1 before allocating from DMA0 */
+#define DMA_DEVICE_FLAG_IS_DEDICATED        0x00000100
+#define DMA_DEVICE_FLAG_NO_ISR              0x00000200
+#define DMA_DEVICE_FLAG_ALLOW_LARGE_FIFO    0x00000400
+#define DMA_DEVICE_FLAG_IN_USE              0x00000800 /* If set, device is in use on a channel */
+
+/* Note: Some DMA devices can be used from multiple DMA Controllers. The bitmask is used to */
+/*       determine which DMA controllers a given device can be used from, and the interface */
+/*       array determeines the actual interface number to use for a given controller. */
+
+typedef struct {
+       uint32_t flags;         /* Bitmask of DMA_DEVICE_FLAG_xxx constants */
+       uint8_t dedicatedController;    /* Controller number to use if DMA_DEVICE_FLAG_IS_DEDICATED is set. */
+       uint8_t dedicatedChannel;       /* Channel number to use if DMA_DEVICE_FLAG_IS_DEDICATED is set. */
+       const char *name;       /* Will show up in the /proc entry */
+
+       uint32_t dmacPort[DMA_NUM_CONTROLLERS]; /* Specifies the port number when DMA_DEVICE_FLAG_PORT_PER_DMAC flag is set */
+
+       dmacHw_CONFIG_t config; /* Configuration to use when DMA'ing using this device */
+
+       void *userData;         /* Passed to the devHandler */
+       DMA_DeviceHandler_t devHandler; /* Called when DMA operations finish. */
+
+       timer_tick_count_t transferStartTime;   /* Time the current transfer was started */
+
+       /* The following statistical information will be collected and presented in a proc entry. */
+       /* Note: With a contiuous bandwidth of 1 Gb/sec, it would take 584 years to overflow */
+       /*       a 64 bit counter. */
+
+       uint64_t numTransfers;  /* Number of DMA transfers performed */
+       uint64_t transferTicks; /* Total time spent doing DMA transfers (measured in timer_tick_count_t's) */
+       uint64_t transferBytes; /* Total bytes transferred */
+       uint32_t timesBlocked;  /* Number of times a channel was unavailable */
+       uint32_t numBytes;      /* Last transfer size */
+
+       /* It's not possible to free memory which is allocated for the descriptors from within */
+       /* the ISR. So make the presumption that a given device will tend to use the */
+       /* same sized buffers over and over again, and we keep them around. */
+
+       DMA_DescriptorRing_t ring;      /* Ring of descriptors allocated for this device */
+
+       /* We stash away some of the information from the previous transfer. If back-to-back */
+       /* transfers are performed from the same buffer, then we don't have to keep re-initializing */
+       /* the descriptor buffers. */
+
+       uint32_t prevNumBytes;
+       dma_addr_t prevSrcData;
+       dma_addr_t prevDstData;
+
+} DMA_DeviceAttribute_t;
+
+/****************************************************************************
+*
+*   DMA_Channel_t, DMA_Controller_t, and DMA_State_t are really internal
+*   data structures and don't belong in this header file, but are included
+*   merely for discussion.
+*
+*   By the time this is implemented, these structures will be moved out into
+*   the appropriate C source file instead.
+*
+*****************************************************************************/
+
+/****************************************************************************
+*
+*   The DMA_Channel_t contains state information about each DMA channel. Some
+*   of the channels are dedicated. Non-dedicated channels are shared
+*   amongst the other devices.
+*
+*****************************************************************************/
+
+#define DMA_CHANNEL_FLAG_IN_USE         0x00000001
+#define DMA_CHANNEL_FLAG_IS_DEDICATED   0x00000002
+#define DMA_CHANNEL_FLAG_NO_ISR         0x00000004
+#define DMA_CHANNEL_FLAG_LARGE_FIFO     0x00000008
+
+typedef struct {
+       uint32_t flags;         /* bitmask of DMA_CHANNEL_FLAG_xxx constants */
+       DMA_Device_t devType;   /* Device this channel is currently reserved for */
+       DMA_Device_t lastDevType;       /* Device type that used this previously */
+       char name[20];          /* Name passed onto request_irq */
+
+#if (DMA_DEBUG_TRACK_RESERVATION)
+       const char *fileName;   /* Place where channel reservation took place */
+       int lineNum;            /* Place where channel reservation took place */
+#endif
+       dmacHw_HANDLE_t dmacHwHandle;   /* low level channel handle. */
+
+} DMA_Channel_t;
+
+/****************************************************************************
+*
+*   The DMA_Controller_t contains state information about each DMA controller.
+*
+*   The freeChannelQ is stored in the controller data structure rather than
+*   the channel data structure since several of the devices are accessible
+*   from multiple controllers, and there is no way to know which controller
+*   will become available first.
+*
+*****************************************************************************/
+
+typedef struct {
+       DMA_Channel_t channel[DMA_NUM_CHANNELS];
+
+} DMA_Controller_t;
+
+/****************************************************************************
+*
+*   The DMA_Global_t contains all of the global state information used by
+*   the DMA code.
+*
+*   Callers which need to allocate a shared channel will be queued up
+*   on the freeChannelQ until a channel becomes available.
+*
+*****************************************************************************/
+
+typedef struct {
+       struct semaphore lock;  /* acquired when manipulating table entries */
+       wait_queue_head_t freeChannelQ;
+
+       DMA_Controller_t controller[DMA_NUM_CONTROLLERS];
+
+} DMA_Global_t;
+
+/* ---- Variable Externs ------------------------------------------------- */
+
+extern DMA_DeviceAttribute_t DMA_gDeviceAttribute[DMA_NUM_DEVICE_ENTRIES];
+
+/* ---- Function Prototypes ---------------------------------------------- */
+
+#if defined(__KERNEL__)
+
+/****************************************************************************/
+/**
+*   Initializes the DMA module.
+*
+*   @return
+*       0       - Success
+*       < 0     - Error
+*/
+/****************************************************************************/
+
+int dma_init(void);
+
+#if (DMA_DEBUG_TRACK_RESERVATION)
+DMA_Handle_t dma_request_channel_dbg(DMA_Device_t dev, const char *fileName,
+                                    int lineNum);
+#define dma_request_channel(dev)  dma_request_channel_dbg(dev, __FILE__, __LINE__)
+#else
+
+/****************************************************************************/
+/**
+*   Reserves a channel for use with @a dev. If the device is setup to use
+*   a shared channel, then this function will block until a free channel
+*   becomes available.
+*
+*   @return
+*       >= 0    - A valid DMA Handle.
+*       -EBUSY  - Device is currently being used.
+*       -ENODEV - Device handed in is invalid.
+*/
+/****************************************************************************/
+
+DMA_Handle_t dma_request_channel(DMA_Device_t dev      /* Device to use with the allocated channel. */
+    );
+#endif
+
+/****************************************************************************/
+/**
+*   Frees a previously allocated DMA Handle.
+*
+*   @return
+*        0      - DMA Handle was released successfully.
+*       -EINVAL - Invalid DMA handle
+*/
+/****************************************************************************/
+
+int dma_free_channel(DMA_Handle_t channel      /* DMA handle. */
+    );
+
+/****************************************************************************/
+/**
+*   Determines if a given device has been configured as using a shared
+*   channel.
+*
+*   @return boolean
+*       0           Device uses a dedicated channel
+*       non-zero    Device uses a shared channel
+*/
+/****************************************************************************/
+
+int dma_device_is_channel_shared(DMA_Device_t dev      /* Device to check. */
+    );
+
+/****************************************************************************/
+/**
+*   Allocates memory to hold a descriptor ring. The descriptor ring then
+*   needs to be populated by making one or more calls to
+*   dna_add_descriptors.
+*
+*   The returned descriptor ring will be automatically initialized.
+*
+*   @return
+*       0           Descriptor ring was allocated successfully
+*       -ENOMEM     Unable to allocate memory for the desired number of descriptors.
+*/
+/****************************************************************************/
+
+int dma_alloc_descriptor_ring(DMA_DescriptorRing_t *ring,      /* Descriptor ring to populate */
+                             int numDescriptors        /* Number of descriptors that need to be allocated. */
+    );
+
+/****************************************************************************/
+/**
+*   Releases the memory which was previously allocated for a descriptor ring.
+*/
+/****************************************************************************/
+
+void dma_free_descriptor_ring(DMA_DescriptorRing_t *ring       /* Descriptor to release */
+    );
+
+/****************************************************************************/
+/**
+*   Initializes a descriptor ring, so that descriptors can be added to it.
+*   Once a descriptor ring has been allocated, it may be reinitialized for
+*   use with additional/different regions of memory.
+*
+*   Note that if 7 descriptors are allocated, it's perfectly acceptable to
+*   initialize the ring with a smaller number of descriptors. The amount
+*   of memory allocated for the descriptor ring will not be reduced, and
+*   the descriptor ring may be reinitialized later
+*
+*   @return
+*       0           Descriptor ring was initialized successfully
+*       -ENOMEM     The descriptor which was passed in has insufficient space
+*                   to hold the desired number of descriptors.
+*/
+/****************************************************************************/
+
+int dma_init_descriptor_ring(DMA_DescriptorRing_t *ring,       /* Descriptor ring to initialize */
+                            int numDescriptors /* Number of descriptors to initialize. */
+    );
+
+/****************************************************************************/
+/**
+*   Determines the number of descriptors which would be required for a
+*   transfer of the indicated memory region.
+*
+*   This function also needs to know which DMA device this transfer will
+*   be destined for, so that the appropriate DMA configuration can be retrieved.
+*   DMA parameters such as transfer width, and whether this is a memory-to-memory
+*   or memory-to-peripheral, etc can all affect the actual number of descriptors
+*   required.
+*
+*   @return
+*       > 0     Returns the number of descriptors required for the indicated transfer
+*       -EINVAL Invalid device type for this kind of transfer
+*               (i.e. the device is _MEM_TO_DEV and not _DEV_TO_MEM)
+*       -ENOMEM Memory exhausted
+*/
+/****************************************************************************/
+
+int dma_calculate_descriptor_count(DMA_Device_t device,        /* DMA Device that this will be associated with */
+                                  dma_addr_t srcData,  /* Place to get data to write to device */
+                                  dma_addr_t dstData,  /* Pointer to device data address */
+                                  size_t numBytes      /* Number of bytes to transfer to the device */
+    );
+
+/****************************************************************************/
+/**
+*   Adds a region of memory to the descriptor ring. Note that it may take
+*   multiple descriptors for each region of memory. It is the callers
+*   responsibility to allocate a sufficiently large descriptor ring.
+*
+*   @return
+*       0       Descriptors were added successfully
+*       -EINVAL Invalid device type for this kind of transfer
+*               (i.e. the device is _MEM_TO_DEV and not _DEV_TO_MEM)
+*       -ENOMEM Memory exhausted
+*/
+/****************************************************************************/
+
+int dma_add_descriptors(DMA_DescriptorRing_t *ring,    /* Descriptor ring to add descriptors to */
+                       DMA_Device_t device,    /* DMA Device that descriptors are for */
+                       dma_addr_t srcData,     /* Place to get data (memory or device) */
+                       dma_addr_t dstData,     /* Place to put data (memory or device) */
+                       size_t numBytes /* Number of bytes to transfer to the device */
+    );
+
+/****************************************************************************/
+/**
+*   Sets the descriptor ring associated with a device.
+*
+*   Once set, the descriptor ring will be associated with the device, even
+*   across channel request/free calls. Passing in a NULL descriptor ring
+*   will release any descriptor ring currently associated with the device.
+*
+*   Note: If you call dma_transfer, or one of the other dma_alloc_ functions
+*         the descriptor ring may be released and reallocated.
+*
+*   Note: This function will release the descriptor memory for any current
+*         descriptor ring associated with this device.
+*/
+/****************************************************************************/
+
+int dma_set_device_descriptor_ring(DMA_Device_t device,        /* Device to update the descriptor ring for. */
+                                  DMA_DescriptorRing_t *ring   /* Descriptor ring to add descriptors to */
+    );
+
+/****************************************************************************/
+/**
+*   Retrieves the descriptor ring associated with a device.
+*/
+/****************************************************************************/
+
+int dma_get_device_descriptor_ring(DMA_Device_t device,        /* Device to retrieve the descriptor ring for. */
+                                  DMA_DescriptorRing_t *ring   /* Place to store retrieved ring */
+    );
+
+/****************************************************************************/
+/**
+*   Allocates buffers for the descriptors. This is normally done automatically
+*   but needs to be done explicitly when initiating a dma from interrupt
+*   context.
+*
+*   @return
+*       0       Descriptors were allocated successfully
+*       -EINVAL Invalid device type for this kind of transfer
+*               (i.e. the device is _MEM_TO_DEV and not _DEV_TO_MEM)
+*       -ENOMEM Memory exhausted
+*/
+/****************************************************************************/
+
+int dma_alloc_descriptors(DMA_Handle_t handle, /* DMA Handle */
+                         dmacHw_TRANSFER_TYPE_e transferType,  /* Type of transfer being performed */
+                         dma_addr_t srcData,   /* Place to get data to write to device */
+                         dma_addr_t dstData,   /* Pointer to device data address */
+                         size_t numBytes       /* Number of bytes to transfer to the device */
+    );
+
+/****************************************************************************/
+/**
+*   Allocates and sets up descriptors for a double buffered circular buffer.
+*
+*   This is primarily intended to be used for things like the ingress samples
+*   from a microphone.
+*
+*   @return
+*       > 0     Number of descriptors actually allocated.
+*       -EINVAL Invalid device type for this kind of transfer
+*               (i.e. the device is _MEM_TO_DEV and not _DEV_TO_MEM)
+*       -ENOMEM Memory exhausted
+*/
+/****************************************************************************/
+
+int dma_alloc_double_dst_descriptors(DMA_Handle_t handle,      /* DMA Handle */
+                                    dma_addr_t srcData,        /* Physical address of source data */
+                                    dma_addr_t dstData1,       /* Physical address of first destination buffer */
+                                    dma_addr_t dstData2,       /* Physical address of second destination buffer */
+                                    size_t numBytes    /* Number of bytes in each destination buffer */
+    );
+
+/****************************************************************************/
+/**
+*   Initializes a DMA_MemMap_t data structure
+*/
+/****************************************************************************/
+
+int dma_init_mem_map(DMA_MemMap_t *memMap      /* Stores state information about the map */
+    );
+
+/****************************************************************************/
+/**
+*   Releases any memory currently being held by a memory mapping structure.
+*/
+/****************************************************************************/
+
+int dma_term_mem_map(DMA_MemMap_t *memMap      /* Stores state information about the map */
+    );
+
+/****************************************************************************/
+/**
+*   Looks at a memory address and categorizes it.
+*
+*   @return One of the values from the DMA_MemType_t enumeration.
+*/
+/****************************************************************************/
+
+DMA_MemType_t dma_mem_type(void *addr);
+
+/****************************************************************************/
+/**
+*   Sets the process (aka userTask) associated with a mem map. This is
+*   required if user-mode segments will be added to the mapping.
+*/
+/****************************************************************************/
+
+static inline void dma_mem_map_set_user_task(DMA_MemMap_t *memMap,
+                                            struct task_struct *task)
+{
+       memMap->userTask = task;
+}
+
+/****************************************************************************/
+/**
+*   Looks at a memory address and determines if we support DMA'ing to/from
+*   that type of memory.
+*
+*   @return boolean -
+*               return value != 0 means dma supported
+*               return value == 0 means dma not supported
+*/
+/****************************************************************************/
+
+int dma_mem_supports_dma(void *addr);
+
+/****************************************************************************/
+/**
+*   Initializes a memory map for use. Since this function acquires a
+*   sempaphore within the memory map, it is VERY important that dma_unmap
+*   be called when you're finished using the map.
+*/
+/****************************************************************************/
+
+int dma_map_start(DMA_MemMap_t *memMap,        /* Stores state information about the map */
+                 enum dma_data_direction dir   /* Direction that the mapping will be going */
+    );
+
+/****************************************************************************/
+/**
+*   Adds a segment of memory to a memory map.
+*
+*   @return     0 on success, error code otherwise.
+*/
+/****************************************************************************/
+
+int dma_map_add_region(DMA_MemMap_t *memMap,   /* Stores state information about the map */
+                      void *mem,       /* Virtual address that we want to get a map of */
+                      size_t numBytes  /* Number of bytes being mapped */
+    );
+
+/****************************************************************************/
+/**
+*   Creates a descriptor ring from a memory mapping.
+*
+*   @return 0 on sucess, error code otherwise.
+*/
+/****************************************************************************/
+
+int dma_map_create_descriptor_ring(DMA_Device_t dev,   /* DMA device (where the ring is stored) */
+                                  DMA_MemMap_t *memMap,        /* Memory map that will be used */
+                                  dma_addr_t devPhysAddr       /* Physical address of device */
+    );
+
+/****************************************************************************/
+/**
+*   Maps in a memory region such that it can be used for performing a DMA.
+*
+*   @return
+*/
+/****************************************************************************/
+
+int dma_map_mem(DMA_MemMap_t *memMap,  /* Stores state information about the map */
+               void *addr,     /* Virtual address that we want to get a map of */
+               size_t count,   /* Number of bytes being mapped */
+               enum dma_data_direction dir     /* Direction that the mapping will be going */
+    );
+
+/****************************************************************************/
+/**
+*   Maps in a memory region such that it can be used for performing a DMA.
+*
+*   @return
+*/
+/****************************************************************************/
+
+int dma_unmap(DMA_MemMap_t *memMap,    /* Stores state information about the map */
+             int dirtied       /* non-zero if any of the pages were modified */
+    );
+
+/****************************************************************************/
+/**
+*   Initiates a transfer when the descriptors have already been setup.
+*
+*   This is a special case, and normally, the dma_transfer_xxx functions should
+*   be used.
+*
+*   @return
+*       0       Transfer was started successfully
+*       -ENODEV Invalid handle
+*/
+/****************************************************************************/
+
+int dma_start_transfer(DMA_Handle_t handle);
+
+/****************************************************************************/
+/**
+*   Stops a previously started DMA transfer.
+*
+*   @return
+*       0       Transfer was stopped successfully
+*       -ENODEV Invalid handle
+*/
+/****************************************************************************/
+
+int dma_stop_transfer(DMA_Handle_t handle);
+
+/****************************************************************************/
+/**
+*   Waits for a DMA to complete by polling. This function is only intended
+*   to be used for testing. Interrupts should be used for most DMA operations.
+*/
+/****************************************************************************/
+
+int dma_wait_transfer_done(DMA_Handle_t handle);
+
+/****************************************************************************/
+/**
+*   Initiates a DMA transfer
+*
+*   @return
+*       0       Transfer was started successfully
+*       -EINVAL Invalid device type for this kind of transfer
+*               (i.e. the device is _MEM_TO_DEV and not _DEV_TO_MEM)
+*/
+/****************************************************************************/
+
+int dma_transfer(DMA_Handle_t handle,  /* DMA Handle */
+                dmacHw_TRANSFER_TYPE_e transferType,   /* Type of transfer being performed */
+                dma_addr_t srcData,    /* Place to get data to write to device */
+                dma_addr_t dstData,    /* Pointer to device data address */
+                size_t numBytes        /* Number of bytes to transfer to the device */
+    );
+
+/****************************************************************************/
+/**
+*   Initiates a transfer from memory to a device.
+*
+*   @return
+*       0       Transfer was started successfully
+*       -EINVAL Invalid device type for this kind of transfer
+*               (i.e. the device is _DEV_TO_MEM and not _MEM_TO_DEV)
+*/
+/****************************************************************************/
+
+static inline int dma_transfer_to_device(DMA_Handle_t handle,  /* DMA Handle */
+                                        dma_addr_t srcData,    /* Place to get data to write to device (physical address) */
+                                        dma_addr_t dstData,    /* Pointer to device data address (physical address) */
+                                        size_t numBytes        /* Number of bytes to transfer to the device */
+    ) {
+       return dma_transfer(handle,
+                           dmacHw_TRANSFER_TYPE_MEM_TO_PERIPHERAL,
+                           srcData, dstData, numBytes);
+}
+
+/****************************************************************************/
+/**
+*   Initiates a transfer from a device to memory.
+*
+*   @return
+*       0       Transfer was started successfully
+*       -EINVAL Invalid device type for this kind of transfer
+*               (i.e. the device is _MEM_TO_DEV and not _DEV_TO_MEM)
+*/
+/****************************************************************************/
+
+static inline int dma_transfer_from_device(DMA_Handle_t handle,        /* DMA Handle */
+                                          dma_addr_t srcData,  /* Pointer to the device data address (physical address) */
+                                          dma_addr_t dstData,  /* Place to store data retrieved from the device (physical address) */
+                                          size_t numBytes      /* Number of bytes to retrieve from the device */
+    ) {
+       return dma_transfer(handle,
+                           dmacHw_TRANSFER_TYPE_PERIPHERAL_TO_MEM,
+                           srcData, dstData, numBytes);
+}
+
+/****************************************************************************/
+/**
+*   Initiates a memory to memory transfer.
+*
+*   @return
+*       0       Transfer was started successfully
+*       -EINVAL Invalid device type for this kind of transfer
+*               (i.e. the device wasn't DMA_DEVICE_MEM_TO_MEM)
+*/
+/****************************************************************************/
+
+static inline int dma_transfer_mem_to_mem(DMA_Handle_t handle, /* DMA Handle */
+                                         dma_addr_t srcData,   /* Place to transfer data from (physical address) */
+                                         dma_addr_t dstData,   /* Place to transfer data to (physical address) */
+                                         size_t numBytes       /* Number of bytes to transfer */
+    ) {
+       return dma_transfer(handle,
+                           dmacHw_TRANSFER_TYPE_MEM_TO_MEM,
+                           srcData, dstData, numBytes);
+}
+
+/****************************************************************************/
+/**
+*   Set the callback function which will be called when a transfer completes.
+*   If a NULL callback function is set, then no callback will occur.
+*
+*   @note   @a devHandler will be called from IRQ context.
+*
+*   @return
+*       0       - Success
+*       -ENODEV - Device handed in is invalid.
+*/
+/****************************************************************************/
+
+int dma_set_device_handler(DMA_Device_t dev,   /* Device to set the callback for. */
+                          DMA_DeviceHandler_t devHandler,      /* Function to call when the DMA completes */
+                          void *userData       /* Pointer which will be passed to devHandler. */
+    );
+
+#endif
+
+#endif /* ASM_ARM_ARCH_BCMRING_DMA_H */
diff --git a/arch/arm/mach-bcmring/include/mach/entry-macro.S b/arch/arm/mach-bcmring/include/mach/entry-macro.S
new file mode 100644 (file)
index 0000000..7d393ca
--- /dev/null
@@ -0,0 +1,86 @@
+/*****************************************************************************
+* Copyright 2006 - 2008 Broadcom Corporation.  All rights reserved.
+*
+* Unless you and Broadcom execute a separate written software license
+* agreement governing use of this software, this software is licensed to you
+* under the terms of the GNU General Public License version 2, available at
+* http://www.broadcom.com/licenses/GPLv2.php (the "GPL").
+*
+* Notwithstanding the above, under no circumstances may you combine this
+* software in any way with any other Broadcom software provided under a
+* license other than the GPL, without Broadcom's express prior written
+* consent.
+*****************************************************************************/
+
+/*
+ *
+ * Low-level IRQ helper macros for BCMRing-based platforms
+ *
+ */
+#include <mach/irqs.h>
+#include <mach/hardware.h>
+#include <mach/csp/mm_io.h>
+
+               .macro  disable_fiq
+               .endm
+
+               .macro  get_irqnr_and_base, irqnr, irqstat, base, tmp
+               ldr     \base, =(MM_IO_BASE_INTC0)
+               ldr     \irqstat, [\base, #0]           @ get status
+                ldr     \irqnr, [\base, #0x10]          @ mask with enable register
+                ands    \irqstat, \irqstat, \irqnr
+               mov     \irqnr, #IRQ_INTC0_START
+               cmp     \irqstat, #0
+               bne     1001f
+
+               ldr     \base, =(MM_IO_BASE_INTC1)
+               ldr     \irqstat, [\base, #0]           @ get status
+                ldr     \irqnr, [\base, #0x10]          @ mask with enable register
+                ands    \irqstat, \irqstat, \irqnr
+               mov     \irqnr, #IRQ_INTC1_START
+               cmp     \irqstat, #0
+               bne     1001f
+
+               ldr     \base, =(MM_IO_BASE_SINTC)
+               ldr     \irqstat, [\base, #0]           @ get status
+                ldr     \irqnr, [\base, #0x10]          @ mask with enable register
+                ands    \irqstat, \irqstat, \irqnr
+               mov     \irqnr, #0xffffffff             @ code meaning no interrupt bits set
+               cmp     \irqstat, #0
+               beq     1002f
+
+               mov     \irqnr, #IRQ_SINTC_START        @ something is set, so fixup return value
+
+1001:
+               movs    \tmp, \irqstat, lsl #16
+               movne   \irqstat, \tmp
+               addeq   \irqnr, \irqnr, #16
+
+               movs    \tmp, \irqstat, lsl #8
+               movne   \irqstat, \tmp
+               addeq   \irqnr, \irqnr, #8
+
+               movs    \tmp, \irqstat, lsl #4
+               movne   \irqstat, \tmp
+               addeq   \irqnr, \irqnr, #4
+
+               movs    \tmp, \irqstat, lsl #2
+               movne   \irqstat, \tmp
+               addeq   \irqnr, \irqnr, #2
+
+               movs    \tmp, \irqstat, lsl #1
+               addeq   \irqnr, \irqnr, #1
+               orrs    \base, \base, #1
+
+1002:           @ irqnr will be set to 0xffffffff if no irq bits are set
+               .endm
+
+               .macro  get_irqnr_preamble, base, tmp
+               .endm
+
+               .macro  arch_ret_to_user, tmp1, tmp2
+               .endm
+
+               .macro  irq_prio_table
+               .endm
+
diff --git a/arch/arm/mach-bcmring/include/mach/hardware.h b/arch/arm/mach-bcmring/include/mach/hardware.h
new file mode 100644 (file)
index 0000000..447eb34
--- /dev/null
@@ -0,0 +1,60 @@
+/*
+ *
+ *  This file contains the hardware definitions of the BCMRing.
+ *
+ *  Copyright (C) 1999 ARM Limited.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+#ifndef __ASM_ARCH_HARDWARE_H
+#define __ASM_ARCH_HARDWARE_H
+
+#include <asm/sizes.h>
+#include <mach/memory.h>
+#include <cfg_global.h>
+#include <mach/csp/mm_io.h>
+
+/* Hardware addresses of major areas.
+ *  *_START is the physical address
+ *  *_SIZE  is the size of the region
+ *  *_BASE  is the virtual address
+ */
+#define RAM_START               PHYS_OFFSET
+
+#define RAM_SIZE                (CFG_GLOBAL_RAM_SIZE-CFG_GLOBAL_RAM_SIZE_RESERVED)
+#define RAM_BASE                PAGE_OFFSET
+
+#define pcibios_assign_all_busses()    1
+
+/* Macros to make managing spinlocks a bit more controlled in terms of naming. */
+/* See reg_gpio.h, reg_irq.h, arch.c, gpio.c for example usage. */
+#if defined(__KERNEL__)
+#define HW_DECLARE_SPINLOCK(name)  DEFINE_SPINLOCK(bcmring_##name##_reg_lock);
+#define HW_EXTERN_SPINLOCK(name)   extern spinlock_t bcmring_##name##_reg_lock;
+#define HW_IRQ_SAVE(name, val)     spin_lock_irqsave(&bcmring_##name##_reg_lock, (val))
+#define HW_IRQ_RESTORE(name, val)  spin_unlock_irqrestore(&bcmring_##name##_reg_lock, (val))
+#else
+#define HW_DECLARE_SPINLOCK(name)
+#define HW_EXTERN_SPINLOCK(name)
+#define HW_IRQ_SAVE(name, val)     {(void)(name); (void)(val); }
+#define HW_IRQ_RESTORE(name, val)  {(void)(name); (void)(val); }
+#endif
+
+#ifndef HW_IO_PHYS_TO_VIRT
+#define HW_IO_PHYS_TO_VIRT MM_IO_PHYS_TO_VIRT
+#endif
+#define HW_IO_VIRT_TO_PHYS MM_IO_VIRT_TO_PHYS
+
+#endif
diff --git a/arch/arm/mach-bcmring/include/mach/io.h b/arch/arm/mach-bcmring/include/mach/io.h
new file mode 100644 (file)
index 0000000..4db0eff
--- /dev/null
@@ -0,0 +1,56 @@
+/*
+ *
+ *  Copyright (C) 1999 ARM Limited
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+#ifndef __ASM_ARM_ARCH_IO_H
+#define __ASM_ARM_ARCH_IO_H
+
+#include <mach/hardware.h>
+
+#define IO_SPACE_LIMIT 0xffffffff
+
+#define __io(a)         ((void __iomem *)HW_IO_PHYS_TO_VIRT(a))
+
+/* Do not enable mem_pci for a big endian arm architecture or unexpected byteswaps will */
+/* happen in readw/writew etc. */
+
+#define readb(c)        __raw_readb(c)
+#define readw(c)        __raw_readw(c)
+#define readl(c)        __raw_readl(c)
+#define readb_relaxed(addr) readb(addr)
+#define readw_relaxed(addr) readw(addr)
+#define readl_relaxed(addr) readl(addr)
+
+#define readsb(p, d, l)   __raw_readsb(p, d, l)
+#define readsw(p, d, l)   __raw_readsw(p, d, l)
+#define readsl(p, d, l)   __raw_readsl(p, d, l)
+
+#define writeb(v, c)     __raw_writeb(v, c)
+#define writew(v, c)     __raw_writew(v, c)
+#define writel(v, c)     __raw_writel(v, c)
+
+#define writesb(p, d, l)  __raw_writesb(p, d, l)
+#define writesw(p, d, l)  __raw_writesw(p, d, l)
+#define writesl(p, d, l)  __raw_writesl(p, d, l)
+
+#define memset_io(c, v, l)    _memset_io((c), (v), (l))
+#define memcpy_fromio(a, c, l)    _memcpy_fromio((a), (c), (l))
+#define memcpy_toio(c, a, l)  _memcpy_toio((c), (a), (l))
+
+#define eth_io_copy_and_sum(s, c, l, b) eth_copy_and_sum((s), (c), (l), (b))
+
+#endif
diff --git a/arch/arm/mach-bcmring/include/mach/irqs.h b/arch/arm/mach-bcmring/include/mach/irqs.h
new file mode 100644 (file)
index 0000000..b279b82
--- /dev/null
@@ -0,0 +1,132 @@
+/*
+ *  Copyright (C) 2007 Broadcom
+ *  Copyright (C) 1999 ARM Limited
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+#if !defined(ARCH_BCMRING_IRQS_H)
+#define ARCH_BCMRING_IRQS_H
+
+/* INTC0 - interrupt controller 0 */
+#define IRQ_INTC0_START     0
+#define IRQ_DMA0C0          0  /* DMA0 channel 0 interrupt */
+#define IRQ_DMA0C1          1  /* DMA0 channel 1 interrupt */
+#define IRQ_DMA0C2          2  /* DMA0 channel 2 interrupt */
+#define IRQ_DMA0C3          3  /* DMA0 channel 3 interrupt */
+#define IRQ_DMA0C4          4  /* DMA0 channel 4 interrupt */
+#define IRQ_DMA0C5          5  /* DMA0 channel 5 interrupt */
+#define IRQ_DMA0C6          6  /* DMA0 channel 6 interrupt */
+#define IRQ_DMA0C7          7  /* DMA0 channel 7 interrupt */
+#define IRQ_DMA1C0          8  /* DMA1 channel 0 interrupt */
+#define IRQ_DMA1C1          9  /* DMA1 channel 1 interrupt */
+#define IRQ_DMA1C2         10  /* DMA1 channel 2 interrupt */
+#define IRQ_DMA1C3         11  /* DMA1 channel 3 interrupt */
+#define IRQ_DMA1C4         12  /* DMA1 channel 4 interrupt */
+#define IRQ_DMA1C5         13  /* DMA1 channel 5 interrupt */
+#define IRQ_DMA1C6         14  /* DMA1 channel 6 interrupt */
+#define IRQ_DMA1C7         15  /* DMA1 channel 7 interrupt */
+#define IRQ_VPM            16  /* Voice process module interrupt */
+#define IRQ_USBHD2         17  /* USB host2/device2 interrupt */
+#define IRQ_USBH1          18  /* USB1 host interrupt */
+#define IRQ_USBD           19  /* USB device interrupt */
+#define IRQ_SDIOH0         20  /* SDIO0 host interrupt */
+#define IRQ_SDIOH1         21  /* SDIO1 host interrupt */
+#define IRQ_TIMER0         22  /* Timer0 interrupt */
+#define IRQ_TIMER1         23  /* Timer1 interrupt */
+#define IRQ_TIMER2         24  /* Timer2 interrupt */
+#define IRQ_TIMER3         25  /* Timer3 interrupt */
+#define IRQ_SPIH           26  /* SPI host interrupt */
+#define IRQ_ESW            27  /* Ethernet switch interrupt */
+#define IRQ_APM            28  /* Audio process module interrupt */
+#define IRQ_GE             29  /* Graphic engine interrupt */
+#define IRQ_CLCD           30  /* LCD Controller interrupt */
+#define IRQ_PIF            31  /* Peripheral interface interrupt */
+#define IRQ_INTC0_END      31
+
+/* INTC1 - interrupt controller 1 */
+#define IRQ_INTC1_START    32
+#define IRQ_GPIO0          32  /*  0 GPIO bit 31//0 combined interrupt */
+#define IRQ_GPIO1          33  /*  1 GPIO bit 64//32 combined interrupt */
+#define IRQ_I2S0           34  /*  2 I2S0 interrupt */
+#define IRQ_I2S1           35  /*  3 I2S1 interrupt */
+#define IRQ_I2CH           36  /*  4 I2C host interrupt */
+#define IRQ_I2CS           37  /*  5 I2C slave interrupt */
+#define IRQ_SPIS           38  /*  6 SPI slave interrupt */
+#define IRQ_GPHY           39  /*  7 Gigabit Phy interrupt */
+#define IRQ_FLASHC         40  /*  8 Flash controller interrupt */
+#define IRQ_COMMTX         41  /*  9 ARM DDC transmit interrupt */
+#define IRQ_COMMRX         42  /* 10 ARM DDC receive interrupt */
+#define IRQ_PMUIRQ         43  /* 11 ARM performance monitor interrupt */
+#define IRQ_UARTB          44  /* 12 UARTB */
+#define IRQ_WATCHDOG       45  /* 13 Watchdog timer interrupt */
+#define IRQ_UARTA          46  /* 14 UARTA */
+#define IRQ_TSC            47  /* 15 Touch screen controller interrupt */
+#define IRQ_KEYC           48  /* 16 Key pad controller interrupt */
+#define IRQ_DMPU           49  /* 17 DDR2 memory partition interrupt */
+#define IRQ_VMPU           50  /* 18 VRAM memory partition interrupt */
+#define IRQ_FMPU           51  /* 19 Flash memory parition unit interrupt */
+#define IRQ_RNG            52  /* 20 Random number generator interrupt */
+#define IRQ_RTC0           53  /* 21 Real time clock periodic interrupt */
+#define IRQ_RTC1           54  /* 22 Real time clock one-shot interrupt */
+#define IRQ_SPUM           55  /* 23 Secure process module interrupt */
+#define IRQ_VDEC           56  /* 24 Hantro video decoder interrupt */
+#define IRQ_RTC2           57  /* 25 Real time clock tamper interrupt */
+#define IRQ_DDRP           58  /* 26 DDR Panic interrupt */
+#define IRQ_INTC1_END      58
+
+/* SINTC secure int controller */
+#define IRQ_SINTC_START    59
+#define IRQ_SEC_WATCHDOG   59  /*  0 Watchdog timer interrupt */
+#define IRQ_SEC_UARTA      60  /*  1 UARTA interrupt */
+#define IRQ_SEC_TSC        61  /*  2 Touch screen controller interrupt */
+#define IRQ_SEC_KEYC       62  /*  3 Key pad controller interrupt */
+#define IRQ_SEC_DMPU       63  /*  4 DDR2 memory partition interrupt */
+#define IRQ_SEC_VMPU       64  /*  5 VRAM memory partition interrupt */
+#define IRQ_SEC_FMPU       65  /*  6 Flash memory parition unit interrupt */
+#define IRQ_SEC_RNG        66  /*  7 Random number generator interrupt */
+#define IRQ_SEC_RTC0       67  /*  8 Real time clock periodic interrupt */
+#define IRQ_SEC_RTC1       68  /*  9 Real time clock one-shot interrupt */
+#define IRQ_SEC_SPUM       69  /* 10 Secure process module interrupt */
+#define IRQ_SEC_TIMER0     70  /* 11 Secure timer0 interrupt */
+#define IRQ_SEC_TIMER1     71  /* 12 Secure timer1 interrupt */
+#define IRQ_SEC_TIMER2     72  /* 13 Secure timer2 interrupt */
+#define IRQ_SEC_TIMER3     73  /* 14 Secure timer3 interrupt */
+#define IRQ_SEC_RTC2       74  /* 15 Real time clock tamper interrupt */
+
+#define IRQ_SINTC_END      74
+
+/* Note: there are 3 INTC registers of 32 bits each. So internal IRQs could go from 0-95 */
+/*       Since IRQs are typically viewed in decimal, we start the gpio based IRQs off at 100 */
+/*       to make the mapping easy for humans to decipher. */
+
+#define IRQ_GPIO_0                  100
+
+#define NUM_INTERNAL_IRQS          (IRQ_SINTC_END+1)
+
+/* I couldn't get the gpioHw_reg.h file to be included cleanly, so I hardcoded it */
+/* define NUM_GPIO_IRQS               GPIOHW_TOTAL_NUM_PINS */
+#define NUM_GPIO_IRQS               62
+
+#define NR_IRQS                     (IRQ_GPIO_0 + NUM_GPIO_IRQS)
+
+#define IRQ_UNKNOWN                 -1
+
+/* Tune these bits to preclude noisy or unsupported interrupt sources as required. */
+#define IRQ_INTC0_VALID_MASK        0xffffffff
+#define IRQ_INTC1_VALID_MASK        0x07ffffff
+#define IRQ_SINTC_VALID_MASK        0x0000ffff
+
+#endif /* ARCH_BCMRING_IRQS_H */
diff --git a/arch/arm/mach-bcmring/include/mach/memory.h b/arch/arm/mach-bcmring/include/mach/memory.h
new file mode 100644 (file)
index 0000000..114f942
--- /dev/null
@@ -0,0 +1,33 @@
+/*****************************************************************************
+* Copyright 2005 - 2008 Broadcom Corporation.  All rights reserved.
+*
+* Unless you and Broadcom execute a separate written software license
+* agreement governing use of this software, this software is licensed to you
+* under the terms of the GNU General Public License version 2, available at
+* http://www.broadcom.com/licenses/GPLv2.php (the "GPL").
+*
+* Notwithstanding the above, under no circumstances may you combine this
+* software in any way with any other Broadcom software provided under a
+* license other than the GPL, without Broadcom's express prior written
+* consent.
+*****************************************************************************/
+
+#ifndef __ASM_ARCH_MEMORY_H
+#define __ASM_ARCH_MEMORY_H
+
+#include <cfg_global.h>
+
+/*
+ * Physical vs virtual RAM address space conversion.  These are
+ * private definitions which should NOT be used outside memory.h
+ * files.  Use virt_to_phys/phys_to_virt/__pa/__va instead.
+ */
+
+#define PHYS_OFFSET CFG_GLOBAL_RAM_BASE
+
+/*
+ * Maximum DMA memory allowed is 14M
+ */
+#define CONSISTENT_DMA_SIZE (SZ_16M - SZ_2M)
+
+#endif
diff --git a/arch/arm/mach-bcmring/include/mach/memory_settings.h b/arch/arm/mach-bcmring/include/mach/memory_settings.h
new file mode 100644 (file)
index 0000000..ce5cd16
--- /dev/null
@@ -0,0 +1,67 @@
+/*****************************************************************************
+* Copyright 2004 - 2008 Broadcom Corporation.  All rights reserved.
+*
+* Unless you and Broadcom execute a separate written software license
+* agreement governing use of this software, this software is licensed to you
+* under the terms of the GNU General Public License version 2, available at
+* http://www.broadcom.com/licenses/GPLv2.php (the "GPL").
+*
+* Notwithstanding the above, under no circumstances may you combine this
+* software in any way with any other Broadcom software provided under a
+* license other than the GPL, without Broadcom's express prior written
+* consent.
+*****************************************************************************/
+
+#ifndef MEMORY_SETTINGS_H
+#define MEMORY_SETTINGS_H
+
+/* ---- Include Files ---------------------------------------- */
+/* ---- Constants and Types ---------------------------------- */
+
+/* Memory devices */
+/* NAND Flash timing for 166 MHz setting */
+#define HW_CFG_NAND_tBTA  (5 << 16)    /* Bus turnaround cycle (n)        0-7  (30 ns) */
+#define HW_CFG_NAND_tWP   (4 << 11)    /* Write pulse width cycle (n+1)   0-31 (25 ns) */
+#define HW_CFG_NAND_tWR   (1 << 9)     /* Write recovery cycle (n+1)      0-3  (10 ns) */
+#define HW_CFG_NAND_tAS   (0 << 7)     /* Write address setup cycle (n+1) 0-3  ( 0 ns) */
+#define HW_CFG_NAND_tOE   (3 << 5)     /* Output enable delay cycle (n)   0-3  (15 ns) */
+#define HW_CFG_NAND_tRC   (7 << 0)     /* Read access cycle (n+2)         0-31 (50 ns) */
+
+#define HW_CFG_NAND_TCR (HW_CFG_NAND_tBTA \
+       | HW_CFG_NAND_tWP  \
+       | HW_CFG_NAND_tWR  \
+       | HW_CFG_NAND_tAS  \
+       | HW_CFG_NAND_tOE  \
+       | HW_CFG_NAND_tRC)
+
+/* NOR Flash timing for 166 MHz setting */
+#define HW_CFG_NOR_TPRC_TWLC (0 << 19) /* Page read access cycle / Burst write latency (n+2 / n+1) (max 25ns) */
+#define HW_CFG_NOR_TBTA      (0 << 16) /* Bus turnaround cycle (n)                                 (DNA)      */
+#define HW_CFG_NOR_TWP       (6 << 11) /* Write pulse width cycle (n+1)                            (35ns)     */
+#define HW_CFG_NOR_TWR       (0 << 9)  /* Write recovery cycle (n+1)                               (0ns)      */
+#define HW_CFG_NOR_TAS       (0 << 7)  /* Write address setup cycle (n+1)                          (0ns)      */
+#define HW_CFG_NOR_TOE       (0 << 5)  /* Output enable delay cycle (n)                            (max 25ns) */
+#define HW_CFG_NOR_TRC_TLC   (0x10 << 0)       /* Read access cycle / Burst read latency (n+2 / n+1)       (100ns)    */
+
+#define HW_CFG_FLASH0_TCR (HW_CFG_NOR_TPRC_TWLC \
+       | HW_CFG_NOR_TBTA      \
+       | HW_CFG_NOR_TWP       \
+       | HW_CFG_NOR_TWR       \
+       | HW_CFG_NOR_TAS       \
+       | HW_CFG_NOR_TOE       \
+       | HW_CFG_NOR_TRC_TLC)
+
+#define HW_CFG_FLASH1_TCR    HW_CFG_FLASH0_TCR
+#define HW_CFG_FLASH2_TCR    HW_CFG_FLASH0_TCR
+
+/* SDRAM Settings */
+/* #define HW_CFG_SDRAM_CAS_LATENCY        5    Default 5, Values [3..6] */
+/* #define HW_CFG_SDRAM_CHIP_SELECT_CNT    1    Default 1, Vaules [1..2] */
+/* #define HW_CFG_SDRAM_SPEED_GRADE        667  Default 667, Values [400,533,667,800] */
+/* #define HW_CFG_SDRAM_WIDTH_BITS         16   Default 16, Vaules [8,16] */
+#define HW_CFG_SDRAM_SIZE_BYTES         0x10000000     /* Total memory, not per device size */
+
+/* ---- Variable Externs ------------------------------------- */
+/* ---- Function Prototypes ---------------------------------- */
+
+#endif /* MEMORY_SETTINGS_H */
diff --git a/arch/arm/mach-bcmring/include/mach/system.h b/arch/arm/mach-bcmring/include/mach/system.h
new file mode 100644 (file)
index 0000000..cdbf93c
--- /dev/null
@@ -0,0 +1,54 @@
+/*
+ *
+ *  Copyright (C) 1999 ARM Limited
+ *  Copyright (C) 2000 Deep Blue Solutions Ltd
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+#ifndef __ASM_ARCH_SYSTEM_H
+#define __ASM_ARCH_SYSTEM_H
+
+#include <mach/csp/chipcHw_inline.h>
+
+extern int bcmring_arch_warm_reboot;
+
+static inline void arch_idle(void)
+{
+       cpu_do_idle();
+}
+
+static inline void arch_reset(char mode, char *cmd)
+{
+       printk("arch_reset:%c %x\n", mode, bcmring_arch_warm_reboot);
+
+       if (mode == 'h') {
+               /* Reboot configured in proc entry */
+               if (bcmring_arch_warm_reboot) {
+                       printk("warm reset\n");
+                       /* Issue Warm reset (do not reset ethernet switch, keep alive) */
+                       chipcHw_reset(chipcHw_REG_SOFT_RESET_CHIP_WARM);
+               } else {
+                       /* Force reset of everything */
+                       printk("force reset\n");
+                       chipcHw_reset(chipcHw_REG_SOFT_RESET_CHIP_SOFT);
+               }
+       } else {
+               /* Force reset of everything */
+               printk("force reset\n");
+               chipcHw_reset(chipcHw_REG_SOFT_RESET_CHIP_SOFT);
+       }
+}
+
+#endif
diff --git a/arch/arm/mach-bcmring/include/mach/timer.h b/arch/arm/mach-bcmring/include/mach/timer.h
new file mode 100644 (file)
index 0000000..5a94bbb
--- /dev/null
@@ -0,0 +1,77 @@
+/*****************************************************************************
+* Copyright 2004 - 2008 Broadcom Corporation.  All rights reserved.
+*
+* Unless you and Broadcom execute a separate written software license
+* agreement governing use of this software, this software is licensed to you
+* under the terms of the GNU General Public License version 2, available at
+* http://www.broadcom.com/licenses/GPLv2.php (the "GPL").
+*
+* Notwithstanding the above, under no circumstances may you combine this
+* software in any way with any other Broadcom software provided under a
+* license other than the GPL, without Broadcom's express prior written
+* consent.
+*****************************************************************************/
+
+/*
+*
+*****************************************************************************
+*
+*  timer.h
+*
+*  PURPOSE:
+*
+*
+*
+*  NOTES:
+*
+*****************************************************************************/
+
+#if !defined(BCM_LINUX_TIMER_H)
+#define BCM_LINUX_TIMER_H
+
+#if defined(__KERNEL__)
+
+/* ---- Include Files ---------------------------------------------------- */
+/* ---- Constants and Types ---------------------------------------------- */
+
+typedef unsigned int timer_tick_count_t;
+typedef unsigned int timer_tick_rate_t;
+typedef unsigned int timer_msec_t;
+
+/* ---- Variable Externs ------------------------------------------------- */
+/* ---- Function Prototypes ---------------------------------------------- */
+
+/****************************************************************************
+*
+*  timer_get_tick_count
+*
+*
+***************************************************************************/
+timer_tick_count_t timer_get_tick_count(void);
+
+/****************************************************************************
+*
+*  timer_get_tick_rate
+*
+*
+***************************************************************************/
+timer_tick_rate_t timer_get_tick_rate(void);
+
+/****************************************************************************
+*
+*  timer_get_msec
+*
+*
+***************************************************************************/
+timer_msec_t timer_get_msec(void);
+
+/****************************************************************************
+*
+*  timer_ticks_to_msec
+*
+*
+***************************************************************************/
+timer_msec_t timer_ticks_to_msec(timer_tick_count_t ticks);
+
+#endif /* __KERNEL__ */
+#endif /* BCM_LINUX_TIMER_H */
diff --git a/arch/arm/mach-bcmring/include/mach/timex.h b/arch/arm/mach-bcmring/include/mach/timex.h
new file mode 100644 (file)
index 0000000..40d033e
--- /dev/null
@@ -0,0 +1,25 @@
+/*
+ *
+ *  Integrator architecture timex specifications
+ *
+ *  Copyright (C) 1999 ARM Limited
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+/*
+ * Specifies the number of ticks per second
+ */
+#define CLOCK_TICK_RATE                100000 /* REG_SMT_TICKS_PER_SEC */
diff --git a/arch/arm/mach-bcmring/include/mach/uncompress.h b/arch/arm/mach-bcmring/include/mach/uncompress.h
new file mode 100644 (file)
index 0000000..9c9821b
--- /dev/null
@@ -0,0 +1,43 @@
+/*****************************************************************************
+* Copyright 2005 - 2008 Broadcom Corporation.  All rights reserved.
+*
+* Unless you and Broadcom execute a separate written software license
+* agreement governing use of this software, this software is licensed to you
+* under the terms of the GNU General Public License version 2, available at
+* http://www.broadcom.com/licenses/GPLv2.php (the "GPL").
+*
+* Notwithstanding the above, under no circumstances may you combine this
+* software in any way with any other Broadcom software provided under a
+* license other than the GPL, without Broadcom's express prior written
+* consent.
+*****************************************************************************/
+#include <mach/csp/mm_addr.h>
+
+#define BCMRING_UART_0_DR (*(volatile unsigned int *)MM_ADDR_IO_UARTA)
+#define BCMRING_UART_0_FR (*(volatile unsigned int *)(MM_ADDR_IO_UARTA + 0x18))
+/*
+ * This does not append a newline
+ */
+static inline void putc(int c)
+{
+       /* Send out UARTA */
+       while (BCMRING_UART_0_FR & (1 << 5))
+               ;
+
+       BCMRING_UART_0_DR = c;
+}
+
+
+static inline void flush(void)
+{
+       /* Wait for the tx fifo to be empty */
+       while ((BCMRING_UART_0_FR & (1 << 7)) == 0)
+               ;
+
+       /* Wait for the final character to be sent on the txd line */
+       while (BCMRING_UART_0_FR & (1 << 3))
+               ;
+}
+
+#define arch_decomp_setup()
+#define arch_decomp_wdog()
diff --git a/arch/arm/mach-bcmring/include/mach/vmalloc.h b/arch/arm/mach-bcmring/include/mach/vmalloc.h
new file mode 100644 (file)
index 0000000..35e2ead
--- /dev/null
@@ -0,0 +1,25 @@
+/*
+ *
+ *  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
+ */
+
+/*
+ * Move VMALLOC_END to 0xf0000000 so that the vm space can range from
+ * 0xe0000000 to 0xefffffff. This gives us 256 MB of vm space and handles
+ * larger physical memory designs better.
+ */
+#define VMALLOC_END       (PAGE_OFFSET + 0x30000000)
diff --git a/arch/arm/mach-bcmring/irq.c b/arch/arm/mach-bcmring/irq.c
new file mode 100644 (file)
index 0000000..dc1c493
--- /dev/null
@@ -0,0 +1,127 @@
+/*
+ *
+ *  Copyright (C) 1999 ARM Limited
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+#include <linux/init.h>
+#include <linux/stddef.h>
+#include <linux/list.h>
+#include <linux/timer.h>
+#include <linux/version.h>
+#include <linux/io.h>
+
+#include <mach/hardware.h>
+#include <asm/irq.h>
+
+#include <asm/mach/irq.h>
+#include <mach/csp/intcHw_reg.h>
+#include <mach/csp/mm_io.h>
+
+static void bcmring_mask_irq0(unsigned int irq)
+{
+       writel(1 << (irq - IRQ_INTC0_START),
+              MM_IO_BASE_INTC0 + INTCHW_INTENCLEAR);
+}
+
+static void bcmring_unmask_irq0(unsigned int irq)
+{
+       writel(1 << (irq - IRQ_INTC0_START),
+              MM_IO_BASE_INTC0 + INTCHW_INTENABLE);
+}
+
+static void bcmring_mask_irq1(unsigned int irq)
+{
+       writel(1 << (irq - IRQ_INTC1_START),
+              MM_IO_BASE_INTC1 + INTCHW_INTENCLEAR);
+}
+
+static void bcmring_unmask_irq1(unsigned int irq)
+{
+       writel(1 << (irq - IRQ_INTC1_START),
+              MM_IO_BASE_INTC1 + INTCHW_INTENABLE);
+}
+
+static void bcmring_mask_irq2(unsigned int irq)
+{
+       writel(1 << (irq - IRQ_SINTC_START),
+              MM_IO_BASE_SINTC + INTCHW_INTENCLEAR);
+}
+
+static void bcmring_unmask_irq2(unsigned int irq)
+{
+       writel(1 << (irq - IRQ_SINTC_START),
+              MM_IO_BASE_SINTC + INTCHW_INTENABLE);
+}
+
+static struct irq_chip bcmring_irq0_chip = {
+       .typename = "ARM-INTC0",
+       .ack = bcmring_mask_irq0,
+       .mask = bcmring_mask_irq0,      /* mask a specific interrupt, blocking its delivery. */
+       .unmask = bcmring_unmask_irq0,  /* unmaks an interrupt */
+};
+
+static struct irq_chip bcmring_irq1_chip = {
+       .typename = "ARM-INTC1",
+       .ack = bcmring_mask_irq1,
+       .mask = bcmring_mask_irq1,
+       .unmask = bcmring_unmask_irq1,
+};
+
+static struct irq_chip bcmring_irq2_chip = {
+       .typename = "ARM-SINTC",
+       .ack = bcmring_mask_irq2,
+       .mask = bcmring_mask_irq2,
+       .unmask = bcmring_unmask_irq2,
+};
+
+static void vic_init(void __iomem *base, struct irq_chip *chip,
+                    unsigned int irq_start, unsigned int vic_sources)
+{
+       unsigned int i;
+       for (i = 0; i < 32; i++) {
+               unsigned int irq = irq_start + i;
+               set_irq_chip(irq, chip);
+               set_irq_chip_data(irq, base);
+
+               if (vic_sources & (1 << i)) {
+                       set_irq_handler(irq, handle_level_irq);
+                       set_irq_flags(irq, IRQF_VALID | IRQF_PROBE);
+               }
+       }
+       writel(0, base + INTCHW_INTSELECT);
+       writel(0, base + INTCHW_INTENABLE);
+       writel(~0, base + INTCHW_INTENCLEAR);
+       writel(0, base + INTCHW_IRQSTATUS);
+       writel(~0, base + INTCHW_SOFTINTCLEAR);
+}
+
+void __init bcmring_init_irq(void)
+{
+       vic_init((void __iomem *)MM_IO_BASE_INTC0, &bcmring_irq0_chip,
+                IRQ_INTC0_START, IRQ_INTC0_VALID_MASK);
+       vic_init((void __iomem *)MM_IO_BASE_INTC1, &bcmring_irq1_chip,
+                IRQ_INTC1_START, IRQ_INTC1_VALID_MASK);
+       vic_init((void __iomem *)MM_IO_BASE_SINTC, &bcmring_irq2_chip,
+                IRQ_SINTC_START, IRQ_SINTC_VALID_MASK);
+
+       /* special cases */
+       if (INTCHW_INTC1_GPIO0 & IRQ_INTC1_VALID_MASK) {
+               set_irq_handler(IRQ_GPIO0, handle_simple_irq);
+       }
+       if (INTCHW_INTC1_GPIO1 & IRQ_INTC1_VALID_MASK) {
+               set_irq_handler(IRQ_GPIO1, handle_simple_irq);
+       }
+}
diff --git a/arch/arm/mach-bcmring/mm.c b/arch/arm/mach-bcmring/mm.c
new file mode 100644 (file)
index 0000000..0f1c37e
--- /dev/null
@@ -0,0 +1,56 @@
+/*****************************************************************************
+* Copyright 2003 - 2008 Broadcom Corporation.  All rights reserved.
+*
+* Unless you and Broadcom execute a separate written software license
+* agreement governing use of this software, this software is licensed to you
+* under the terms of the GNU General Public License version 2, available at
+* http://www.broadcom.com/licenses/GPLv2.php (the "GPL").
+*
+* Notwithstanding the above, under no circumstances may you combine this
+* software in any way with any other Broadcom software provided under a
+* license other than the GPL, without Broadcom's express prior written
+* consent.
+*****************************************************************************/
+
+#include <linux/platform_device.h>
+#include <asm/mach/map.h>
+
+#include <mach/hardware.h>
+#include <mach/csp/mm_io.h>
+
+#define IO_DESC(va, sz) { .virtual = va, \
+       .pfn = __phys_to_pfn(HW_IO_VIRT_TO_PHYS(va)), \
+       .length = sz, \
+       .type = MT_DEVICE }
+
+#define MEM_DESC(va, sz) { .virtual = va, \
+       .pfn = __phys_to_pfn(HW_IO_VIRT_TO_PHYS(va)), \
+       .length = sz, \
+       .type = MT_MEMORY }
+
+static struct map_desc bcmring_io_desc[] __initdata = {
+       IO_DESC(MM_IO_BASE_NAND, SZ_64K),       /* phys:0x28000000-0x28000FFF  virt:0xE8000000-0xE8000FFF  size:0x00010000 */
+       IO_DESC(MM_IO_BASE_UMI, SZ_64K),        /* phys:0x2C000000-0x2C000FFF  virt:0xEC000000-0xEC000FFF  size:0x00010000 */
+
+       IO_DESC(MM_IO_BASE_BROM, SZ_64K),       /* phys:0x30000000-0x3000FFFF  virt:0xF3000000-0xF300FFFF  size:0x00010000 */
+       MEM_DESC(MM_IO_BASE_ARAM, SZ_1M),       /* phys:0x31000000-0x31FFFFFF  virt:0xF3100000-0xF31FFFFF  size:0x01000000 */
+       IO_DESC(MM_IO_BASE_DMA0, SZ_1M),        /* phys:0x32000000-0x32FFFFFF  virt:0xF3200000-0xF32FFFFF  size:0x01000000 */
+       IO_DESC(MM_IO_BASE_DMA1, SZ_1M),        /* phys:0x33000000-0x33FFFFFF  virt:0xF3300000-0xF33FFFFF  size:0x01000000 */
+       IO_DESC(MM_IO_BASE_ESW, SZ_1M), /* phys:0x34000000-0x34FFFFFF  virt:0xF3400000-0xF34FFFFF  size:0x01000000 */
+       IO_DESC(MM_IO_BASE_CLCD, SZ_1M),        /* phys:0x35000000-0x35FFFFFF  virt:0xF3500000-0xF35FFFFF  size:0x01000000 */
+       IO_DESC(MM_IO_BASE_APM, SZ_1M), /* phys:0x36000000-0x36FFFFFF  virt:0xF3600000-0xF36FFFFF  size:0x01000000 */
+       IO_DESC(MM_IO_BASE_SPUM, SZ_1M),        /* phys:0x37000000-0x37FFFFFF  virt:0xF3700000-0xF37FFFFF  size:0x01000000 */
+       IO_DESC(MM_IO_BASE_VPM_PROG, SZ_1M),    /* phys:0x38000000-0x38FFFFFF  virt:0xF3800000-0xF38FFFFF  size:0x01000000 */
+       IO_DESC(MM_IO_BASE_VPM_DATA, SZ_1M),    /* phys:0x3A000000-0x3AFFFFFF  virt:0xF3A00000-0xF3AFFFFF  size:0x01000000 */
+
+       IO_DESC(MM_IO_BASE_VRAM, SZ_64K),       /* phys:0x40000000-0x4000FFFF  virt:0xF4000000-0xF400FFFF  size:0x00010000 */
+       IO_DESC(MM_IO_BASE_CHIPC, SZ_16M),      /* phys:0x80000000-0x80FFFFFF  virt:0xF8000000-0xF8FFFFFF  size:0x01000000 */
+       IO_DESC(MM_IO_BASE_VPM_EXTMEM_RSVD,
+               SZ_16M),        /* phys:0x0F000000-0x0FFFFFFF  virt:0xF0000000-0xF0FFFFFF  size:0x01000000 */
+};
+
+void __init bcmring_map_io(void)
+{
+
+       iotable_init(bcmring_io_desc, ARRAY_SIZE(bcmring_io_desc));
+}
diff --git a/arch/arm/mach-bcmring/timer.c b/arch/arm/mach-bcmring/timer.c
new file mode 100644 (file)
index 0000000..2d415d2
--- /dev/null
@@ -0,0 +1,62 @@
+/*****************************************************************************
+* Copyright 2003 - 2008 Broadcom Corporation.  All rights reserved.
+*
+* Unless you and Broadcom execute a separate written software license
+* agreement governing use of this software, this software is licensed to you
+* under the terms of the GNU General Public License version 2, available at
+* http://www.broadcom.com/licenses/GPLv2.php (the "GPL").
+*
+* Notwithstanding the above, under no circumstances may you combine this
+* software in any way with any other Broadcom software provided under a
+* license other than the GPL, without Broadcom's express prior written
+* consent.
+*****************************************************************************/
+
+#include <linux/version.h>
+#include <linux/types.h>
+#include <linux/module.h>
+#include <csp/tmrHw.h>
+
+#include <mach/timer.h>
+/* The core.c file initializes timers 1 and 3 as a linux clocksource. */
+/* The real time clock should probably be the real linux clocksource. */
+/* In the meantime, this file should agree with core.c as to the */
+/* profiling timer. If the clocksource is moved to rtc later, then */
+/* we can init the profiling timer here instead. */
+
+/* Timer 1 provides 25MHz resolution syncrhonized to scheduling and APM timing */
+/* Timer 3 provides bus freqeuncy sychronized to ACLK, but spread spectrum will */
+/* affect synchronization with scheduling and APM timing. */
+
+#define PROF_TIMER 1
+
+timer_tick_rate_t timer_get_tick_rate(void)
+{
+       return tmrHw_getCountRate(PROF_TIMER);
+}
+
+timer_tick_count_t timer_get_tick_count(void)
+{
+       return tmrHw_GetCurrentCount(PROF_TIMER);       /* change downcounter to upcounter */
+}
+
+timer_msec_t timer_ticks_to_msec(timer_tick_count_t ticks)
+{
+       static int tickRateMsec;
+
+       if (tickRateMsec == 0) {
+               tickRateMsec = timer_get_tick_rate() / 1000;
+       }
+
+       return ticks / tickRateMsec;
+}
+
+timer_msec_t timer_get_msec(void)
+{
+       return timer_ticks_to_msec(timer_get_tick_count());
+}
+
+EXPORT_SYMBOL(timer_get_tick_count);
+EXPORT_SYMBOL(timer_ticks_to_msec);
+EXPORT_SYMBOL(timer_get_tick_rate);
+EXPORT_SYMBOL(timer_get_msec);
index 3fbd9b0fbe24e634795d4ca069051d4917b0e689..caf6d5154aecd9c37a5034173750d64695969401 100644 (file)
 
 #include <linux/kernel.h>
 #include <linux/init.h>
-#include <linux/mm.h>
-#include <linux/sched.h>
-#include <linux/interrupt.h>
-#include <linux/ioport.h>
-#include <linux/mtd/physmap.h>
 #include <linux/platform_device.h>
-#include <linux/io.h>
-#include <linux/i2c.h>
+#include <linux/mtd/physmap.h>
+
 #include <mach/hardware.h>
+
 #include <asm/mach-types.h>
 #include <asm/mach/arch.h>
 
+
 static struct physmap_flash_data adssphere_flash_data = {
        .width          = 4,
 };
index 6c4c1633ed123c8457fd20a4f1c51c6bafe39534..3dd0e2a23095c8c6b57ed493baf5e2655c7a6d63 100644 (file)
 #include <mach/hardware.h>
 
 
-/*
- * The EP93xx has two external crystal oscillators.  To generate the
- * required high-frequency clocks, the processor uses two phase-locked-
- * loops (PLLs) to multiply the incoming external clock signal to much
- * higher frequencies that are then divided down by programmable dividers
- * to produce the needed clocks.  The PLLs operate independently of one
- * another.
- */
-#define EP93XX_EXT_CLK_RATE    14745600
-#define EP93XX_EXT_RTC_RATE    32768
-
-
 struct clk {
        unsigned long   rate;
        int             users;
        int             sw_locked;
-       u32             enable_reg;
+       void __iomem    *enable_reg;
        u32             enable_mask;
 
        unsigned long   (*get_rate)(struct clk *clk);
+       int             (*set_rate)(struct clk *clk, unsigned long rate);
 };
 
 
 static unsigned long get_uart_rate(struct clk *clk);
 
+static int set_keytchclk_rate(struct clk *clk, unsigned long rate);
+
 
 static struct clk clk_uart1 = {
        .sw_locked      = 1,
-       .enable_reg     = EP93XX_SYSCON_DEVICE_CONFIG,
-       .enable_mask    = EP93XX_SYSCON_DEVICE_CONFIG_U1EN,
+       .enable_reg     = EP93XX_SYSCON_DEVCFG,
+       .enable_mask    = EP93XX_SYSCON_DEVCFG_U1EN,
        .get_rate       = get_uart_rate,
 };
 static struct clk clk_uart2 = {
        .sw_locked      = 1,
-       .enable_reg     = EP93XX_SYSCON_DEVICE_CONFIG,
-       .enable_mask    = EP93XX_SYSCON_DEVICE_CONFIG_U2EN,
+       .enable_reg     = EP93XX_SYSCON_DEVCFG,
+       .enable_mask    = EP93XX_SYSCON_DEVCFG_U2EN,
        .get_rate       = get_uart_rate,
 };
 static struct clk clk_uart3 = {
        .sw_locked      = 1,
-       .enable_reg     = EP93XX_SYSCON_DEVICE_CONFIG,
-       .enable_mask    = EP93XX_SYSCON_DEVICE_CONFIG_U3EN,
+       .enable_reg     = EP93XX_SYSCON_DEVCFG,
+       .enable_mask    = EP93XX_SYSCON_DEVCFG_U3EN,
        .get_rate       = get_uart_rate,
 };
 static struct clk clk_pll1;
@@ -75,6 +66,15 @@ static struct clk clk_usb_host = {
        .enable_reg     = EP93XX_SYSCON_PWRCNT,
        .enable_mask    = EP93XX_SYSCON_PWRCNT_USH_EN,
 };
+static struct clk clk_keypad = {
+       .sw_locked      = 1,
+       .enable_reg     = EP93XX_SYSCON_KEYTCHCLKDIV,
+       .enable_mask    = EP93XX_SYSCON_KEYTCHCLKDIV_KEN,
+       .set_rate       = set_keytchclk_rate,
+};
+static struct clk clk_pwm = {
+       .rate           = EP93XX_EXT_CLK_RATE,
+};
 
 /* DMA Clocks */
 static struct clk clk_m2p0 = {
@@ -130,27 +130,29 @@ static struct clk clk_m2m1 = {
        { .dev_id = dev, .con_id = con, .clk = ck }
 
 static struct clk_lookup clocks[] = {
-       INIT_CK("apb:uart1", NULL, &clk_uart1),
-       INIT_CK("apb:uart2", NULL, &clk_uart2),
-       INIT_CK("apb:uart3", NULL, &clk_uart3),
-       INIT_CK(NULL, "pll1", &clk_pll1),
-       INIT_CK(NULL, "fclk", &clk_f),
-       INIT_CK(NULL, "hclk", &clk_h),
-       INIT_CK(NULL, "pclk", &clk_p),
-       INIT_CK(NULL, "pll2", &clk_pll2),
-       INIT_CK("ep93xx-ohci", NULL, &clk_usb_host),
-       INIT_CK(NULL, "m2p0", &clk_m2p0),
-       INIT_CK(NULL, "m2p1", &clk_m2p1),
-       INIT_CK(NULL, "m2p2", &clk_m2p2),
-       INIT_CK(NULL, "m2p3", &clk_m2p3),
-       INIT_CK(NULL, "m2p4", &clk_m2p4),
-       INIT_CK(NULL, "m2p5", &clk_m2p5),
-       INIT_CK(NULL, "m2p6", &clk_m2p6),
-       INIT_CK(NULL, "m2p7", &clk_m2p7),
-       INIT_CK(NULL, "m2p8", &clk_m2p8),
-       INIT_CK(NULL, "m2p9", &clk_m2p9),
-       INIT_CK(NULL, "m2m0", &clk_m2m0),
-       INIT_CK(NULL, "m2m1", &clk_m2m1),
+       INIT_CK("apb:uart1",            NULL,           &clk_uart1),
+       INIT_CK("apb:uart2",            NULL,           &clk_uart2),
+       INIT_CK("apb:uart3",            NULL,           &clk_uart3),
+       INIT_CK(NULL,                   "pll1",         &clk_pll1),
+       INIT_CK(NULL,                   "fclk",         &clk_f),
+       INIT_CK(NULL,                   "hclk",         &clk_h),
+       INIT_CK(NULL,                   "pclk",         &clk_p),
+       INIT_CK(NULL,                   "pll2",         &clk_pll2),
+       INIT_CK("ep93xx-ohci",          NULL,           &clk_usb_host),
+       INIT_CK("ep93xx-keypad",        NULL,           &clk_keypad),
+       INIT_CK(NULL,                   "pwm_clk",      &clk_pwm),
+       INIT_CK(NULL,                   "m2p0",         &clk_m2p0),
+       INIT_CK(NULL,                   "m2p1",         &clk_m2p1),
+       INIT_CK(NULL,                   "m2p2",         &clk_m2p2),
+       INIT_CK(NULL,                   "m2p3",         &clk_m2p3),
+       INIT_CK(NULL,                   "m2p4",         &clk_m2p4),
+       INIT_CK(NULL,                   "m2p5",         &clk_m2p5),
+       INIT_CK(NULL,                   "m2p6",         &clk_m2p6),
+       INIT_CK(NULL,                   "m2p7",         &clk_m2p7),
+       INIT_CK(NULL,                   "m2p8",         &clk_m2p8),
+       INIT_CK(NULL,                   "m2p9",         &clk_m2p9),
+       INIT_CK(NULL,                   "m2m0",         &clk_m2m0),
+       INIT_CK(NULL,                   "m2m1",         &clk_m2m1),
 };
 
 
@@ -160,9 +162,11 @@ int clk_enable(struct clk *clk)
                u32 value;
 
                value = __raw_readl(clk->enable_reg);
+               value |= clk->enable_mask;
                if (clk->sw_locked)
-                       __raw_writel(0xaa, EP93XX_SYSCON_SWLOCK);
-               __raw_writel(value | clk->enable_mask, clk->enable_reg);
+                       ep93xx_syscon_swlocked_write(value, clk->enable_reg);
+               else
+                       __raw_writel(value, clk->enable_reg);
        }
 
        return 0;
@@ -175,9 +179,11 @@ void clk_disable(struct clk *clk)
                u32 value;
 
                value = __raw_readl(clk->enable_reg);
+               value &= ~clk->enable_mask;
                if (clk->sw_locked)
-                       __raw_writel(0xaa, EP93XX_SYSCON_SWLOCK);
-               __raw_writel(value & ~clk->enable_mask, clk->enable_reg);
+                       ep93xx_syscon_swlocked_write(value, clk->enable_reg);
+               else
+                       __raw_writel(value, clk->enable_reg);
        }
 }
 EXPORT_SYMBOL(clk_disable);
@@ -202,6 +208,43 @@ unsigned long clk_get_rate(struct clk *clk)
 }
 EXPORT_SYMBOL(clk_get_rate);
 
+static int set_keytchclk_rate(struct clk *clk, unsigned long rate)
+{
+       u32 val;
+       u32 div_bit;
+
+       val = __raw_readl(clk->enable_reg);
+
+       /*
+        * The Key Matrix and ADC clocks are configured using the same
+        * System Controller register.  The clock used will be either
+        * 1/4 or 1/16 the external clock rate depending on the
+        * EP93XX_SYSCON_KEYTCHCLKDIV_KDIV/EP93XX_SYSCON_KEYTCHCLKDIV_ADIV
+        * bit being set or cleared.
+        */
+       div_bit = clk->enable_mask >> 15;
+
+       if (rate == EP93XX_KEYTCHCLK_DIV4)
+               val |= div_bit;
+       else if (rate == EP93XX_KEYTCHCLK_DIV16)
+               val &= ~div_bit;
+       else
+               return -EINVAL;
+
+       ep93xx_syscon_swlocked_write(val, clk->enable_reg);
+       clk->rate = rate;
+       return 0;
+}
+
+int clk_set_rate(struct clk *clk, unsigned long rate)
+{
+       if (clk->set_rate)
+               return clk->set_rate(clk, rate);
+
+       return -EINVAL;
+}
+EXPORT_SYMBOL(clk_set_rate);
+
 
 static char fclk_divisors[] = { 1, 2, 4, 8, 16, 1, 1, 1 };
 static char hclk_divisors[] = { 1, 2, 4, 5, 6, 8, 16, 32 };
index 204dc5cbd0b88367001cad3ec38855bf8832cd5c..16b92c37ec99a7107ec29ef51103a67ba0c4c191 100644 (file)
 
 #include <linux/kernel.h>
 #include <linux/init.h>
-#include <linux/spinlock.h>
-#include <linux/sched.h>
+#include <linux/platform_device.h>
 #include <linux/interrupt.h>
-#include <linux/serial.h>
-#include <linux/tty.h>
-#include <linux/bitops.h>
-#include <linux/serial_8250.h>
-#include <linux/serial_core.h>
-#include <linux/device.h>
-#include <linux/mm.h>
 #include <linux/dma-mapping.h>
-#include <linux/time.h>
 #include <linux/timex.h>
-#include <linux/delay.h>
+#include <linux/io.h>
+#include <linux/gpio.h>
+#include <linux/leds.h>
 #include <linux/termios.h>
 #include <linux/amba/bus.h>
 #include <linux/amba/serial.h>
-#include <linux/io.h>
 #include <linux/i2c.h>
 #include <linux/i2c-gpio.h>
 
-#include <asm/types.h>
-#include <asm/setup.h>
-#include <asm/memory.h>
 #include <mach/hardware.h>
-#include <asm/irq.h>
-#include <asm/system.h>
-#include <asm/tlbflush.h>
-#include <asm/pgtable.h>
 
 #include <asm/mach/map.h>
 #include <asm/mach/time.h>
 #include <asm/mach/irq.h>
-#include <mach/gpio.h>
 
 #include <asm/hardware/vic.h>
 
@@ -98,7 +82,7 @@ void __init ep93xx_map_io(void)
  */
 static unsigned int last_jiffy_time;
 
-#define TIMER4_TICKS_PER_JIFFY         ((CLOCK_TICK_RATE + (HZ/2)) / HZ)
+#define TIMER4_TICKS_PER_JIFFY         DIV_ROUND_CLOSEST(CLOCK_TICK_RATE, HZ)
 
 static irqreturn_t ep93xx_timer_interrupt(int irq, void *dev_id)
 {
@@ -362,8 +346,8 @@ void __init ep93xx_init_irq(void)
 {
        int gpio_irq;
 
-       vic_init((void *)EP93XX_VIC1_BASE, 0, EP93XX_VIC1_VALID_IRQ_MASK, 0);
-       vic_init((void *)EP93XX_VIC2_BASE, 32, EP93XX_VIC2_VALID_IRQ_MASK, 0);
+       vic_init(EP93XX_VIC1_BASE, 0, EP93XX_VIC1_VALID_IRQ_MASK, 0);
+       vic_init(EP93XX_VIC2_BASE, 32, EP93XX_VIC2_VALID_IRQ_MASK, 0);
 
        for (gpio_irq = gpio_to_irq(0);
             gpio_irq <= gpio_to_irq(EP93XX_GPIO_LINE_MAX_IRQ); ++gpio_irq) {
@@ -384,6 +368,47 @@ void __init ep93xx_init_irq(void)
 }
 
 
+/*************************************************************************
+ * EP93xx System Controller Software Locked register handling
+ *************************************************************************/
+
+/*
+ * syscon_swlock prevents anything else from writing to the syscon
+ * block while a software locked register is being written.
+ */
+static DEFINE_SPINLOCK(syscon_swlock);
+
+void ep93xx_syscon_swlocked_write(unsigned int val, void __iomem *reg)
+{
+       unsigned long flags;
+
+       spin_lock_irqsave(&syscon_swlock, flags);
+
+       __raw_writel(0xaa, EP93XX_SYSCON_SWLOCK);
+       __raw_writel(val, reg);
+
+       spin_unlock_irqrestore(&syscon_swlock, flags);
+}
+EXPORT_SYMBOL(ep93xx_syscon_swlocked_write);
+
+void ep93xx_devcfg_set_clear(unsigned int set_bits, unsigned int clear_bits)
+{
+       unsigned long flags;
+       unsigned int val;
+
+       spin_lock_irqsave(&syscon_swlock, flags);
+
+       val = __raw_readl(EP93XX_SYSCON_DEVCFG);
+       val |= set_bits;
+       val &= ~clear_bits;
+       __raw_writel(0xaa, EP93XX_SYSCON_SWLOCK);
+       __raw_writel(val, EP93XX_SYSCON_DEVCFG);
+
+       spin_unlock_irqrestore(&syscon_swlock, flags);
+}
+EXPORT_SYMBOL(ep93xx_devcfg_set_clear);
+
+
 /*************************************************************************
  * EP93xx peripheral handling
  *************************************************************************/
@@ -517,10 +542,8 @@ static struct platform_device ep93xx_eth_device = {
 
 void __init ep93xx_register_eth(struct ep93xx_eth_data *data, int copy_addr)
 {
-       if (copy_addr) {
-               memcpy(data->dev_addr,
-                       (void *)(EP93XX_ETHERNET_BASE + 0x50), 6);
-       }
+       if (copy_addr)
+               memcpy_fromio(data->dev_addr, EP93XX_ETHERNET_BASE + 0x50, 6);
 
        ep93xx_eth_data = *data;
        platform_device_register(&ep93xx_eth_device);
@@ -546,19 +569,125 @@ void __init ep93xx_register_i2c(struct i2c_board_info *devices, int num)
        platform_device_register(&ep93xx_i2c_device);
 }
 
+
+/*************************************************************************
+ * EP93xx LEDs
+ *************************************************************************/
+static struct gpio_led ep93xx_led_pins[] = {
+       {
+               .name                   = "platform:grled",
+               .gpio                   = EP93XX_GPIO_LINE_GRLED,
+       }, {
+               .name                   = "platform:rdled",
+               .gpio                   = EP93XX_GPIO_LINE_RDLED,
+       },
+};
+
+static struct gpio_led_platform_data ep93xx_led_data = {
+       .num_leds       = ARRAY_SIZE(ep93xx_led_pins),
+       .leds           = ep93xx_led_pins,
+};
+
+static struct platform_device ep93xx_leds = {
+       .name           = "leds-gpio",
+       .id             = -1,
+       .dev            = {
+               .platform_data  = &ep93xx_led_data,
+       },
+};
+
+
+/*************************************************************************
+ * EP93xx pwm peripheral handling
+ *************************************************************************/
+static struct resource ep93xx_pwm0_resource[] = {
+       {
+               .start  = EP93XX_PWM_PHYS_BASE,
+               .end    = EP93XX_PWM_PHYS_BASE + 0x10 - 1,
+               .flags  = IORESOURCE_MEM,
+       },
+};
+
+static struct platform_device ep93xx_pwm0_device = {
+       .name           = "ep93xx-pwm",
+       .id             = 0,
+       .num_resources  = ARRAY_SIZE(ep93xx_pwm0_resource),
+       .resource       = ep93xx_pwm0_resource,
+};
+
+static struct resource ep93xx_pwm1_resource[] = {
+       {
+               .start  = EP93XX_PWM_PHYS_BASE + 0x20,
+               .end    = EP93XX_PWM_PHYS_BASE + 0x30 - 1,
+               .flags  = IORESOURCE_MEM,
+       },
+};
+
+static struct platform_device ep93xx_pwm1_device = {
+       .name           = "ep93xx-pwm",
+       .id             = 1,
+       .num_resources  = ARRAY_SIZE(ep93xx_pwm1_resource),
+       .resource       = ep93xx_pwm1_resource,
+};
+
+void __init ep93xx_register_pwm(int pwm0, int pwm1)
+{
+       if (pwm0)
+               platform_device_register(&ep93xx_pwm0_device);
+
+       /* NOTE: EP9307 does not have PWMOUT1 (pin EGPIO14) */
+       if (pwm1)
+               platform_device_register(&ep93xx_pwm1_device);
+}
+
+int ep93xx_pwm_acquire_gpio(struct platform_device *pdev)
+{
+       int err;
+
+       if (pdev->id == 0) {
+               err = 0;
+       } else if (pdev->id == 1) {
+               err = gpio_request(EP93XX_GPIO_LINE_EGPIO14,
+                                  dev_name(&pdev->dev));
+               if (err)
+                       return err;
+               err = gpio_direction_output(EP93XX_GPIO_LINE_EGPIO14, 0);
+               if (err)
+                       goto fail;
+
+               /* PWM 1 output on EGPIO[14] */
+               ep93xx_devcfg_set_bits(EP93XX_SYSCON_DEVCFG_PONG);
+       } else {
+               err = -ENODEV;
+       }
+
+       return err;
+
+fail:
+       gpio_free(EP93XX_GPIO_LINE_EGPIO14);
+       return err;
+}
+EXPORT_SYMBOL(ep93xx_pwm_acquire_gpio);
+
+void ep93xx_pwm_release_gpio(struct platform_device *pdev)
+{
+       if (pdev->id == 1) {
+               gpio_direction_input(EP93XX_GPIO_LINE_EGPIO14);
+               gpio_free(EP93XX_GPIO_LINE_EGPIO14);
+
+               /* EGPIO[14] used for GPIO */
+               ep93xx_devcfg_clear_bits(EP93XX_SYSCON_DEVCFG_PONG);
+       }
+}
+EXPORT_SYMBOL(ep93xx_pwm_release_gpio);
+
+
 extern void ep93xx_gpio_init(void);
 
 void __init ep93xx_init_devices(void)
 {
-       unsigned int v;
-
-       /*
-        * Disallow access to MaverickCrunch initially.
-        */
-       v = __raw_readl(EP93XX_SYSCON_DEVICE_CONFIG);
-       v &= ~EP93XX_SYSCON_DEVICE_CONFIG_CRUNCH_ENABLE;
-       __raw_writel(0xaa, EP93XX_SYSCON_SWLOCK);
-       __raw_writel(v, EP93XX_SYSCON_DEVICE_CONFIG);
+       /* Disallow access to MaverickCrunch initially */
+       ep93xx_devcfg_clear_bits(EP93XX_SYSCON_DEVCFG_CPENA);
 
        ep93xx_gpio_init();
 
@@ -568,4 +697,5 @@ void __init ep93xx_init_devices(void)
 
        platform_device_register(&ep93xx_rtc_device);
        platform_device_register(&ep93xx_ohci_device);
+       platform_device_register(&ep93xx_leds);
 }
index e9e45b92457e6680046adf7e055c48144f9346ec..73145ae5d3fa345b4700897bc350c30ba05c73bb 100644 (file)
 
 #include <linux/kernel.h>
 #include <linux/init.h>
-#include <linux/mm.h>
-#include <linux/sched.h>
-#include <linux/interrupt.h>
-#include <linux/ioport.h>
-#include <linux/mtd/physmap.h>
 #include <linux/platform_device.h>
-#include <linux/io.h>
 #include <linux/i2c.h>
+#include <linux/mtd/physmap.h>
+
 #include <mach/hardware.h>
+
 #include <asm/mach-types.h>
 #include <asm/mach/arch.h>
 
+
 static struct physmap_flash_data edb93xx_flash_data;
 
 static struct resource edb93xx_flash_resource = {
index 3bad500b71b692adad98db5fd33b286b55da3023..3da7ca816d19546af2cd6acee4c7eb92e10c00e2 100644 (file)
 
 #include <linux/kernel.h>
 #include <linux/init.h>
-#include <linux/mm.h>
-#include <linux/sched.h>
-#include <linux/interrupt.h>
-#include <linux/ioport.h>
-#include <linux/mtd/physmap.h>
 #include <linux/platform_device.h>
-#include <linux/io.h>
-#include <linux/i2c.h>
+#include <linux/mtd/physmap.h>
+
 #include <mach/hardware.h>
+
 #include <asm/mach-types.h>
 #include <asm/mach/arch.h>
 
+
 static struct physmap_flash_data gesbc9312_flash_data = {
        .width          = 4,
 };
index 482cf3d2fbcd5de4c6e841590c200bb4d5d9df8c..1ea8871e03a96db862ef27ebca06fc325baeb6aa 100644 (file)
 #include <linux/module.h>
 #include <linux/seq_file.h>
 #include <linux/io.h>
+#include <linux/gpio.h>
+#include <linux/irq.h>
 
-#include <mach/ep93xx-regs.h>
-#include <asm/gpio.h>
+#include <mach/hardware.h>
 
 struct ep93xx_gpio_chip {
        struct gpio_chip        chip;
 
-       unsigned int            data_reg;
-       unsigned int            data_dir_reg;
+       void __iomem            *data_reg;
+       void __iomem            *data_dir_reg;
 };
 
 #define to_ep93xx_gpio_chip(c) container_of(c, struct ep93xx_gpio_chip, chip)
@@ -111,15 +112,61 @@ static void ep93xx_gpio_dbg_show(struct seq_file *s, struct gpio_chip *chip)
 {
        struct ep93xx_gpio_chip *ep93xx_chip = to_ep93xx_gpio_chip(chip);
        u8 data_reg, data_dir_reg;
-       int i;
+       int gpio, i;
 
        data_reg = __raw_readb(ep93xx_chip->data_reg);
        data_dir_reg = __raw_readb(ep93xx_chip->data_dir_reg);
 
-       for (i = 0; i < chip->ngpio; i++)
-               seq_printf(s, "GPIO %s%d: %s %s\n", chip->label, i,
-                          (data_reg & (1 << i)) ? "set" : "clear",
-                          (data_dir_reg & (1 << i)) ? "out" : "in");
+       gpio = ep93xx_chip->chip.base;
+       for (i = 0; i < chip->ngpio; i++, gpio++) {
+               int is_out = data_dir_reg & (1 << i);
+
+               seq_printf(s, " %s%d gpio-%-3d (%-12s) %s %s",
+                               chip->label, i, gpio,
+                               gpiochip_is_requested(chip, i) ? : "",
+                               is_out ? "out" : "in ",
+                               (data_reg & (1 << i)) ? "hi" : "lo");
+
+               if (!is_out) {
+                       int irq = gpio_to_irq(gpio);
+                       struct irq_desc *desc = irq_desc + irq;
+
+                       if (irq >= 0 && desc->action) {
+                               char *trigger;
+
+                               switch (desc->status & IRQ_TYPE_SENSE_MASK) {
+                               case IRQ_TYPE_NONE:
+                                       trigger = "(default)";
+                                       break;
+                               case IRQ_TYPE_EDGE_FALLING:
+                                       trigger = "edge-falling";
+                                       break;
+                               case IRQ_TYPE_EDGE_RISING:
+                                       trigger = "edge-rising";
+                                       break;
+                               case IRQ_TYPE_EDGE_BOTH:
+                                       trigger = "edge-both";
+                                       break;
+                               case IRQ_TYPE_LEVEL_HIGH:
+                                       trigger = "level-high";
+                                       break;
+                               case IRQ_TYPE_LEVEL_LOW:
+                                       trigger = "level-low";
+                                       break;
+                               default:
+                                       trigger = "?trigger?";
+                                       break;
+                               }
+
+                               seq_printf(s, " irq-%d %s%s",
+                                               irq, trigger,
+                                               (desc->status & IRQ_WAKEUP)
+                                                       ? " wakeup" : "");
+                       }
+               }
+
+               seq_printf(s, "\n");
+       }
 }
 
 #define EP93XX_GPIO_BANK(name, dr, ddr, base_gpio)                     \
index 967c079180dbc8b3e7b453296a20c699baa4065c..ea78e908fc82cecc9bf7c32ccbf2fe597785bf2e 100644 (file)
 #define EP93XX_AHB_VIRT_BASE           0xfef00000
 #define EP93XX_AHB_SIZE                        0x00100000
 
+#define EP93XX_AHB_IOMEM(x)            IOMEM(EP93XX_AHB_VIRT_BASE + (x))
+
 #define EP93XX_APB_PHYS_BASE           0x80800000
 #define EP93XX_APB_VIRT_BASE           0xfed00000
 #define EP93XX_APB_SIZE                        0x00200000
 
+#define EP93XX_APB_IOMEM(x)            IOMEM(EP93XX_APB_VIRT_BASE + (x))
+
 
 /* AHB peripherals */
-#define EP93XX_DMA_BASE                        ((void __iomem *)               \
-                                        (EP93XX_AHB_VIRT_BASE + 0x00000000))
+#define EP93XX_DMA_BASE                        EP93XX_AHB_IOMEM(0x00000000)
 
-#define EP93XX_ETHERNET_BASE           (EP93XX_AHB_VIRT_BASE + 0x00010000)
 #define EP93XX_ETHERNET_PHYS_BASE      (EP93XX_AHB_PHYS_BASE + 0x00010000)
+#define EP93XX_ETHERNET_BASE           EP93XX_AHB_IOMEM(0x00010000)
 
-#define EP93XX_USB_BASE                        (EP93XX_AHB_VIRT_BASE + 0x00020000)
 #define EP93XX_USB_PHYS_BASE           (EP93XX_AHB_PHYS_BASE + 0x00020000)
+#define EP93XX_USB_BASE                        EP93XX_AHB_IOMEM(0x00020000)
 
-#define EP93XX_RASTER_BASE             (EP93XX_AHB_VIRT_BASE + 0x00030000)
+#define EP93XX_RASTER_BASE             EP93XX_AHB_IOMEM(0x00030000)
 
-#define EP93XX_GRAPHICS_ACCEL_BASE     (EP93XX_AHB_VIRT_BASE + 0x00040000)
+#define EP93XX_GRAPHICS_ACCEL_BASE     EP93XX_AHB_IOMEM(0x00040000)
 
-#define EP93XX_SDRAM_CONTROLLER_BASE   (EP93XX_AHB_VIRT_BASE + 0x00060000)
+#define EP93XX_SDRAM_CONTROLLER_BASE   EP93XX_AHB_IOMEM(0x00060000)
 
-#define EP93XX_PCMCIA_CONTROLLER_BASE  (EP93XX_AHB_VIRT_BASE + 0x00080000)
+#define EP93XX_PCMCIA_CONTROLLER_BASE  EP93XX_AHB_IOMEM(0x00080000)
 
-#define EP93XX_BOOT_ROM_BASE           (EP93XX_AHB_VIRT_BASE + 0x00090000)
+#define EP93XX_BOOT_ROM_BASE           EP93XX_AHB_IOMEM(0x00090000)
 
-#define EP93XX_IDE_BASE                        (EP93XX_AHB_VIRT_BASE + 0x000a0000)
+#define EP93XX_IDE_BASE                        EP93XX_AHB_IOMEM(0x000a0000)
 
-#define EP93XX_VIC1_BASE               (EP93XX_AHB_VIRT_BASE + 0x000b0000)
+#define EP93XX_VIC1_BASE               EP93XX_AHB_IOMEM(0x000b0000)
 
-#define EP93XX_VIC2_BASE               (EP93XX_AHB_VIRT_BASE + 0x000c0000)
+#define EP93XX_VIC2_BASE               EP93XX_AHB_IOMEM(0x000c0000)
 
 
 /* APB peripherals */
-#define EP93XX_TIMER_BASE              (EP93XX_APB_VIRT_BASE + 0x00010000)
+#define EP93XX_TIMER_BASE              EP93XX_APB_IOMEM(0x00010000)
 #define EP93XX_TIMER_REG(x)            (EP93XX_TIMER_BASE + (x))
 #define EP93XX_TIMER1_LOAD             EP93XX_TIMER_REG(0x00)
 #define EP93XX_TIMER1_VALUE            EP93XX_TIMER_REG(0x04)
 #define EP93XX_TIMER3_CONTROL          EP93XX_TIMER_REG(0x88)
 #define EP93XX_TIMER3_CLEAR            EP93XX_TIMER_REG(0x8c)
 
-#define EP93XX_I2S_BASE                        (EP93XX_APB_VIRT_BASE + 0x00020000)
+#define EP93XX_I2S_BASE                        EP93XX_APB_IOMEM(0x00020000)
 
-#define EP93XX_SECURITY_BASE           (EP93XX_APB_VIRT_BASE + 0x00030000)
+#define EP93XX_SECURITY_BASE           EP93XX_APB_IOMEM(0x00030000)
 
-#define EP93XX_GPIO_BASE               (EP93XX_APB_VIRT_BASE + 0x00040000)
+#define EP93XX_GPIO_BASE               EP93XX_APB_IOMEM(0x00040000)
 #define EP93XX_GPIO_REG(x)             (EP93XX_GPIO_BASE + (x))
 #define EP93XX_GPIO_F_INT_TYPE1                EP93XX_GPIO_REG(0x4c)
 #define EP93XX_GPIO_F_INT_TYPE2                EP93XX_GPIO_REG(0x50)
 #define EP93XX_GPIO_B_INT_ENABLE       EP93XX_GPIO_REG(0xb8)
 #define EP93XX_GPIO_B_INT_STATUS       EP93XX_GPIO_REG(0xbc)
 
-#define EP93XX_AAC_BASE                        (EP93XX_APB_VIRT_BASE + 0x00080000)
+#define EP93XX_AAC_BASE                        EP93XX_APB_IOMEM(0x00080000)
 
-#define EP93XX_SPI_BASE                        (EP93XX_APB_VIRT_BASE + 0x000a0000)
+#define EP93XX_SPI_BASE                        EP93XX_APB_IOMEM(0x000a0000)
 
-#define EP93XX_IRDA_BASE               (EP93XX_APB_VIRT_BASE + 0x000b0000)
+#define EP93XX_IRDA_BASE               EP93XX_APB_IOMEM(0x000b0000)
 
-#define EP93XX_UART1_BASE              (EP93XX_APB_VIRT_BASE + 0x000c0000)
 #define EP93XX_UART1_PHYS_BASE         (EP93XX_APB_PHYS_BASE + 0x000c0000)
+#define EP93XX_UART1_BASE              EP93XX_APB_IOMEM(0x000c0000)
 
-#define EP93XX_UART2_BASE              (EP93XX_APB_VIRT_BASE + 0x000d0000)
 #define EP93XX_UART2_PHYS_BASE         (EP93XX_APB_PHYS_BASE + 0x000d0000)
+#define EP93XX_UART2_BASE              EP93XX_APB_IOMEM(0x000d0000)
 
-#define EP93XX_UART3_BASE              (EP93XX_APB_VIRT_BASE + 0x000e0000)
 #define EP93XX_UART3_PHYS_BASE         (EP93XX_APB_PHYS_BASE + 0x000e0000)
+#define EP93XX_UART3_BASE              EP93XX_APB_IOMEM(0x000e0000)
 
-#define EP93XX_KEY_MATRIX_BASE         (EP93XX_APB_VIRT_BASE + 0x000f0000)
+#define EP93XX_KEY_MATRIX_BASE         EP93XX_APB_IOMEM(0x000f0000)
 
-#define EP93XX_ADC_BASE                        (EP93XX_APB_VIRT_BASE + 0x00100000)
-#define EP93XX_TOUCHSCREEN_BASE                (EP93XX_APB_VIRT_BASE + 0x00100000)
+#define EP93XX_ADC_BASE                        EP93XX_APB_IOMEM(0x00100000)
+#define EP93XX_TOUCHSCREEN_BASE                EP93XX_APB_IOMEM(0x00100000)
 
-#define EP93XX_PWM_BASE                        (EP93XX_APB_VIRT_BASE + 0x00110000)
+#define EP93XX_PWM_PHYS_BASE           (EP93XX_APB_PHYS_BASE + 0x00110000)
+#define EP93XX_PWM_BASE                        EP93XX_APB_IOMEM(0x00110000)
 
-#define EP93XX_RTC_BASE                        (EP93XX_APB_VIRT_BASE + 0x00120000)
 #define EP93XX_RTC_PHYS_BASE           (EP93XX_APB_PHYS_BASE + 0x00120000)
+#define EP93XX_RTC_BASE                        EP93XX_APB_IOMEM(0x00120000)
 
-#define EP93XX_SYSCON_BASE             (EP93XX_APB_VIRT_BASE + 0x00130000)
+#define EP93XX_SYSCON_BASE             EP93XX_APB_IOMEM(0x00130000)
 #define EP93XX_SYSCON_REG(x)           (EP93XX_SYSCON_BASE + (x))
 #define EP93XX_SYSCON_POWER_STATE      EP93XX_SYSCON_REG(0x00)
 #define EP93XX_SYSCON_PWRCNT           EP93XX_SYSCON_REG(0x04)
 #define EP93XX_SYSCON_STANDBY          EP93XX_SYSCON_REG(0x0c)
 #define EP93XX_SYSCON_CLOCK_SET1       EP93XX_SYSCON_REG(0x20)
 #define EP93XX_SYSCON_CLOCK_SET2       EP93XX_SYSCON_REG(0x24)
-#define EP93XX_SYSCON_DEVICE_CONFIG    EP93XX_SYSCON_REG(0x80)
-#define EP93XX_SYSCON_DEVICE_CONFIG_U3EN               (1<<24)
-#define EP93XX_SYSCON_DEVICE_CONFIG_CRUNCH_ENABLE      (1<<23)
-#define EP93XX_SYSCON_DEVICE_CONFIG_U2EN               (1<<20)
-#define EP93XX_SYSCON_DEVICE_CONFIG_U1EN               (1<<18)
+#define EP93XX_SYSCON_DEVCFG           EP93XX_SYSCON_REG(0x80)
+#define EP93XX_SYSCON_DEVCFG_SWRST     (1<<31)
+#define EP93XX_SYSCON_DEVCFG_D1ONG     (1<<30)
+#define EP93XX_SYSCON_DEVCFG_D0ONG     (1<<29)
+#define EP93XX_SYSCON_DEVCFG_IONU2     (1<<28)
+#define EP93XX_SYSCON_DEVCFG_GONK      (1<<27)
+#define EP93XX_SYSCON_DEVCFG_TONG      (1<<26)
+#define EP93XX_SYSCON_DEVCFG_MONG      (1<<25)
+#define EP93XX_SYSCON_DEVCFG_U3EN      (1<<24)
+#define EP93XX_SYSCON_DEVCFG_CPENA     (1<<23)
+#define EP93XX_SYSCON_DEVCFG_A2ONG     (1<<22)
+#define EP93XX_SYSCON_DEVCFG_A1ONG     (1<<21)
+#define EP93XX_SYSCON_DEVCFG_U2EN      (1<<20)
+#define EP93XX_SYSCON_DEVCFG_EXVC      (1<<19)
+#define EP93XX_SYSCON_DEVCFG_U1EN      (1<<18)
+#define EP93XX_SYSCON_DEVCFG_TIN       (1<<17)
+#define EP93XX_SYSCON_DEVCFG_HC3IN     (1<<15)
+#define EP93XX_SYSCON_DEVCFG_HC3EN     (1<<14)
+#define EP93XX_SYSCON_DEVCFG_HC1IN     (1<<13)
+#define EP93XX_SYSCON_DEVCFG_HC1EN     (1<<12)
+#define EP93XX_SYSCON_DEVCFG_HONIDE    (1<<11)
+#define EP93XX_SYSCON_DEVCFG_GONIDE    (1<<10)
+#define EP93XX_SYSCON_DEVCFG_PONG      (1<<9)
+#define EP93XX_SYSCON_DEVCFG_EONIDE    (1<<8)
+#define EP93XX_SYSCON_DEVCFG_I2SONSSP  (1<<7)
+#define EP93XX_SYSCON_DEVCFG_I2SONAC97 (1<<6)
+#define EP93XX_SYSCON_DEVCFG_RASONP3   (1<<4)
+#define EP93XX_SYSCON_DEVCFG_RAS       (1<<3)
+#define EP93XX_SYSCON_DEVCFG_ADCPD     (1<<2)
+#define EP93XX_SYSCON_DEVCFG_KEYS      (1<<1)
+#define EP93XX_SYSCON_DEVCFG_SHENA     (1<<0)
+#define EP93XX_SYSCON_KEYTCHCLKDIV     EP93XX_SYSCON_REG(0x90)
+#define EP93XX_SYSCON_KEYTCHCLKDIV_TSEN        (1<<31)
+#define EP93XX_SYSCON_KEYTCHCLKDIV_ADIV        (1<<16)
+#define EP93XX_SYSCON_KEYTCHCLKDIV_KEN (1<<15)
+#define EP93XX_SYSCON_KEYTCHCLKDIV_KDIV        (1<<0)
 #define EP93XX_SYSCON_SWLOCK           EP93XX_SYSCON_REG(0xc0)
 
-#define EP93XX_WATCHDOG_BASE           (EP93XX_APB_VIRT_BASE + 0x00140000)
+#define EP93XX_WATCHDOG_BASE           EP93XX_APB_IOMEM(0x00140000)
 
 
 #endif
index 2866297310b7c9e38f80a7992921481e7140d00b..349fa7cb72d56a0148606a4369892571a474861f 100644 (file)
@@ -4,12 +4,23 @@
 #ifndef __ASM_ARCH_HARDWARE_H
 #define __ASM_ARCH_HARDWARE_H
 
-#include "ep93xx-regs.h"
+#include <mach/ep93xx-regs.h>
+#include <mach/platform.h>
 
 #define pcibios_assign_all_busses()    0
 
-#include "platform.h"
+/*
+ * The EP93xx has two external crystal oscillators.  To generate the
+ * required high-frequency clocks, the processor uses two phase-locked-
+ * loops (PLLs) to multiply the incoming external clock signal to much
+ * higher frequencies that are then divided down by programmable dividers
+ * to produce the needed clocks.  The PLLs operate independently of one
+ * another.
+ */
+#define EP93XX_EXT_CLK_RATE    14745600
+#define EP93XX_EXT_RTC_RATE    32768
 
-#include "ts72xx.h"
+#define EP93XX_KEYTCHCLK_DIV4  (EP93XX_EXT_CLK_RATE / 4)
+#define EP93XX_KEYTCHCLK_DIV16 (EP93XX_EXT_CLK_RATE / 16)
 
 #endif
index fd5f081cc8b7263e01cf40c3e8473f19a3763998..cebcc1c53d63e712948269731682227c7cc9c085 100644 (file)
@@ -1,8 +1,21 @@
 /*
  * arch/arm/mach-ep93xx/include/mach/io.h
  */
+#ifndef __ASM_MACH_IO_H
+#define __ASM_MACH_IO_H
 
 #define IO_SPACE_LIMIT         0xffffffff
 
-#define __io(p)                __typesafe_io(p)
-#define __mem_pci(p)   (p)
+#define __io(p)                        __typesafe_io(p)
+#define __mem_pci(p)           (p)
+
+/*
+ * A typesafe __io() variation for variable initialisers
+ */
+#ifdef __ASSEMBLER__
+#define IOMEM(p)               p
+#else
+#define IOMEM(p)               ((void __iomem __force *)(p))
+#endif
+
+#endif /* __ASM_MACH_IO_H */
index 05f0f4f2f3ce8939215a82795a0be73547a83b71..5f5fa6574d342c28eacf06dde9a4550575358a46 100644 (file)
@@ -5,6 +5,7 @@
 #ifndef __ASSEMBLY__
 
 struct i2c_board_info;
+struct platform_device;
 
 struct ep93xx_eth_data
 {
@@ -15,8 +16,27 @@ struct ep93xx_eth_data
 void ep93xx_map_io(void);
 void ep93xx_init_irq(void);
 void ep93xx_init_time(unsigned long);
+
+/* EP93xx System Controller software locked register write */
+void ep93xx_syscon_swlocked_write(unsigned int val, void __iomem *reg);
+void ep93xx_devcfg_set_clear(unsigned int set_bits, unsigned int clear_bits);
+
+static inline void ep93xx_devcfg_set_bits(unsigned int bits)
+{
+       ep93xx_devcfg_set_clear(bits, 0x00);
+}
+
+static inline void ep93xx_devcfg_clear_bits(unsigned int bits)
+{
+       ep93xx_devcfg_set_clear(0x00, bits);
+}
+
 void ep93xx_register_eth(struct ep93xx_eth_data *data, int copy_addr);
 void ep93xx_register_i2c(struct i2c_board_info *devices, int num);
+void ep93xx_register_pwm(int pwm0, int pwm1);
+int ep93xx_pwm_acquire_gpio(struct platform_device *pdev);
+void ep93xx_pwm_release_gpio(struct platform_device *pdev);
+
 void ep93xx_init_devices(void);
 extern struct sys_timer ep93xx_timer;
 
index ed8f35e4f068f29c6c6c39934cded13712108d88..6d661fe9d66c00d05ec8a8f61581206a007b6646 100644 (file)
@@ -11,15 +11,13 @@ static inline void arch_idle(void)
 
 static inline void arch_reset(char mode, const char *cmd)
 {
-       u32 devicecfg;
-
        local_irq_disable();
 
-       devicecfg = __raw_readl(EP93XX_SYSCON_DEVICE_CONFIG);
-       __raw_writel(0xaa, EP93XX_SYSCON_SWLOCK);
-       __raw_writel(devicecfg | 0x80000000, EP93XX_SYSCON_DEVICE_CONFIG);
-       __raw_writel(0xaa, EP93XX_SYSCON_SWLOCK);
-       __raw_writel(devicecfg & ~0x80000000, EP93XX_SYSCON_DEVICE_CONFIG);
+       /*
+        * Set then clear the SWRST bit to initiate a software reset
+        */
+       ep93xx_devcfg_set_bits(EP93XX_SYSCON_DEVCFG_SWRST);
+       ep93xx_devcfg_clear_bits(EP93XX_SYSCON_DEVCFG_SWRST);
 
        while (1)
                ;
index 34ddec081c40dd817b6ca4741a020e0f3880cab4..2737666e800e9cacfff2e8300a0168c1136e1888 100644 (file)
@@ -70,7 +70,6 @@
 
 
 #ifndef __ASSEMBLY__
-#include <linux/io.h>
 
 static inline int board_is_ts7200(void)
 {
index 15d6815d78c412b030f7d50a9b9de27de87de7cc..0a313e82fb7440054ebd604cbfdcbb0d15b0d66c 100644 (file)
@@ -9,21 +9,16 @@
  * published by the Free Software Foundation.
  */
 
-#include <linux/init.h>
-#include <linux/interrupt.h>
-#include <linux/ioport.h>
 #include <linux/kernel.h>
-#include <linux/mm.h>
+#include <linux/init.h>
 #include <linux/platform_device.h>
-#include <linux/sched.h>
-#include <linux/io.h>
-#include <linux/i2c.h>
 #include <linux/mtd/physmap.h>
 
 #include <mach/hardware.h>
 
-#include <asm/mach/arch.h>
 #include <asm/mach-types.h>
+#include <asm/mach/arch.h>
+
 
 static struct ep93xx_eth_data micro9_eth_data = {
        .phy_id         = 0x1f,
index 7ee024d3482984a339f854bc60df755a5ea4c781..5255dddd3067ac2f17afb26df721c0478b21a215 100644 (file)
 
 #include <linux/kernel.h>
 #include <linux/init.h>
-#include <linux/mm.h>
-#include <linux/sched.h>
-#include <linux/interrupt.h>
-#include <linux/ioport.h>
-#include <linux/mtd/physmap.h>
 #include <linux/platform_device.h>
-#include <linux/m48t86.h>
 #include <linux/io.h>
-#include <linux/i2c.h>
+#include <linux/m48t86.h>
+#include <linux/mtd/physmap.h>
+
 #include <mach/hardware.h>
+#include <mach/ts72xx.h>
+
 #include <asm/mach-types.h>
-#include <asm/mach/arch.h>
 #include <asm/mach/map.h>
+#include <asm/mach/arch.h>
+
 
 static struct map_desc ts72xx_io_desc[] __initdata = {
        {
index 4ac04055c2eadaefbffc0bdfa28372ab8d718ec9..69956cdae3c224901cc764042b2e28631ddedc75 100644 (file)
@@ -403,6 +403,8 @@ static unsigned int mmc_status(struct device *dev)
 static struct mmc_platform_data mmc_data = {
        .ocr_mask       = MMC_VDD_32_33|MMC_VDD_33_34,
        .status         = mmc_status,
+       .gpio_wp        = -1,
+       .gpio_cd        = -1,
 };
 
 static struct amba_device mmc_device = {
index 9ea9c05093cd47afed1d6798d5a2eeb9d9333f43..ab615e78b7984c57af5810f24a30b356db51aeef 100644 (file)
@@ -222,6 +222,9 @@ arch_initcall(realview_i2c_init);
 
 #define REALVIEW_SYSMCI        (__io_address(REALVIEW_SYS_BASE) + REALVIEW_SYS_MCI_OFFSET)
 
+/*
+ * This is only used if GPIOLIB support is disabled
+ */
 static unsigned int realview_mmc_status(struct device *dev)
 {
        struct amba_device *adev = container_of(dev, struct amba_device, dev);
@@ -238,11 +241,15 @@ static unsigned int realview_mmc_status(struct device *dev)
 struct mmc_platform_data realview_mmc0_plat_data = {
        .ocr_mask       = MMC_VDD_32_33|MMC_VDD_33_34,
        .status         = realview_mmc_status,
+       .gpio_wp        = 17,
+       .gpio_cd        = 16,
 };
 
 struct mmc_platform_data realview_mmc1_plat_data = {
        .ocr_mask       = MMC_VDD_32_33|MMC_VDD_33_34,
        .status         = realview_mmc_status,
+       .gpio_wp        = 19,
+       .gpio_cd        = 18,
 };
 
 /*
diff --git a/arch/arm/mach-realview/include/mach/gpio.h b/arch/arm/mach-realview/include/mach/gpio.h
new file mode 100644 (file)
index 0000000..94ff276
--- /dev/null
@@ -0,0 +1,6 @@
+#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
index 8dfa44e08a94e87181ca26c1724b9eaed15b615d..abd13b448671331b99eb1b88d9c21b6589238ef3 100644 (file)
@@ -23,6 +23,7 @@
 #include <linux/platform_device.h>
 #include <linux/sysdev.h>
 #include <linux/amba/bus.h>
+#include <linux/amba/pl061.h>
 #include <linux/io.h>
 
 #include <mach/hardware.h>
@@ -113,6 +114,21 @@ static void __init realview_eb_map_io(void)
                iotable_init(realview_eb11mp_io_desc, ARRAY_SIZE(realview_eb11mp_io_desc));
 }
 
+static struct pl061_platform_data gpio0_plat_data = {
+       .gpio_base      = 0,
+       .irq_base       = -1,
+};
+
+static struct pl061_platform_data gpio1_plat_data = {
+       .gpio_base      = 8,
+       .irq_base       = -1,
+};
+
+static struct pl061_platform_data gpio2_plat_data = {
+       .gpio_base      = 16,
+       .irq_base       = -1,
+};
+
 /*
  * RealView EB AMBA devices
  */
@@ -189,9 +205,9 @@ AMBA_DEVICE(clcd,  "dev:20",  EB_CLCD,  &clcd_plat_data);
 AMBA_DEVICE(dmac,  "dev:30",  DMAC,     NULL);
 AMBA_DEVICE(sctl,  "dev:e0",  SCTL,     NULL);
 AMBA_DEVICE(wdog,  "dev:e1",  EB_WATCHDOG, NULL);
-AMBA_DEVICE(gpio0, "dev:e4",  EB_GPIO0, NULL);
-AMBA_DEVICE(gpio1, "dev:e5",  GPIO1,    NULL);
-AMBA_DEVICE(gpio2, "dev:e6",  GPIO2,    NULL);
+AMBA_DEVICE(gpio0, "dev:e4",  EB_GPIO0, &gpio0_plat_data);
+AMBA_DEVICE(gpio1, "dev:e5",  GPIO1,    &gpio1_plat_data);
+AMBA_DEVICE(gpio2, "dev:e6",  GPIO2,    &gpio2_plat_data);
 AMBA_DEVICE(rtc,   "dev:e8",  EB_RTC,   NULL);
 AMBA_DEVICE(sci0,  "dev:f0",  SCI,      NULL);
 AMBA_DEVICE(uart0, "dev:f1",  EB_UART0, NULL);
index 25efe71a67c7a19d19229953a933776f719efc4f..17fbb0e889b630aa31fe5f7db436db06543e477e 100644 (file)
@@ -23,6 +23,7 @@
 #include <linux/platform_device.h>
 #include <linux/sysdev.h>
 #include <linux/amba/bus.h>
+#include <linux/amba/pl061.h>
 #include <linux/io.h>
 
 #include <mach/hardware.h>
@@ -107,6 +108,21 @@ static void __init realview_pb1176_map_io(void)
        iotable_init(realview_pb1176_io_desc, ARRAY_SIZE(realview_pb1176_io_desc));
 }
 
+static struct pl061_platform_data gpio0_plat_data = {
+       .gpio_base      = 0,
+       .irq_base       = -1,
+};
+
+static struct pl061_platform_data gpio1_plat_data = {
+       .gpio_base      = 8,
+       .irq_base       = -1,
+};
+
+static struct pl061_platform_data gpio2_plat_data = {
+       .gpio_base      = 16,
+       .irq_base       = -1,
+};
+
 /*
  * RealView PB1176 AMBA devices
  */
@@ -164,9 +180,9 @@ AMBA_DEVICE(uart3,  "fpga:09",      PB1176_UART3,   NULL);
 AMBA_DEVICE(smc,       "dev:00",       PB1176_SMC,     NULL);
 AMBA_DEVICE(sctl,      "dev:e0",       SCTL,           NULL);
 AMBA_DEVICE(wdog,      "dev:e1",       PB1176_WATCHDOG,        NULL);
-AMBA_DEVICE(gpio0,     "dev:e4",       PB1176_GPIO0,   NULL);
-AMBA_DEVICE(gpio1,     "dev:e5",       GPIO1,          NULL);
-AMBA_DEVICE(gpio2,     "dev:e6",       GPIO2,          NULL);
+AMBA_DEVICE(gpio0,     "dev:e4",       PB1176_GPIO0,   &gpio0_plat_data);
+AMBA_DEVICE(gpio1,     "dev:e5",       GPIO1,          &gpio1_plat_data);
+AMBA_DEVICE(gpio2,     "dev:e6",       GPIO2,          &gpio2_plat_data);
 AMBA_DEVICE(rtc,       "dev:e8",       PB1176_RTC,     NULL);
 AMBA_DEVICE(sci0,      "dev:f0",       SCI,            NULL);
 AMBA_DEVICE(uart0,     "dev:f1",       PB1176_UART0,   NULL);
index dc4b16943907d7f3778cf4d50b05a362ddc10281..fdd042b85f404ae44cb83d4f3c1c0a3ed7c736c6 100644 (file)
@@ -23,6 +23,7 @@
 #include <linux/platform_device.h>
 #include <linux/sysdev.h>
 #include <linux/amba/bus.h>
+#include <linux/amba/pl061.h>
 #include <linux/io.h>
 
 #include <mach/hardware.h>
@@ -108,6 +109,21 @@ static void __init realview_pb11mp_map_io(void)
        iotable_init(realview_pb11mp_io_desc, ARRAY_SIZE(realview_pb11mp_io_desc));
 }
 
+static struct pl061_platform_data gpio0_plat_data = {
+       .gpio_base      = 0,
+       .irq_base       = -1,
+};
+
+static struct pl061_platform_data gpio1_plat_data = {
+       .gpio_base      = 8,
+       .irq_base       = -1,
+};
+
+static struct pl061_platform_data gpio2_plat_data = {
+       .gpio_base      = 16,
+       .irq_base       = -1,
+};
+
 /*
  * RealView PB11MPCore AMBA devices
  */
@@ -166,9 +182,9 @@ AMBA_DEVICE(uart3,  "fpga:09",      PB11MP_UART3,   NULL);
 AMBA_DEVICE(smc,       "dev:00",       PB11MP_SMC,     NULL);
 AMBA_DEVICE(sctl,      "dev:e0",       SCTL,           NULL);
 AMBA_DEVICE(wdog,      "dev:e1",       PB11MP_WATCHDOG, NULL);
-AMBA_DEVICE(gpio0,     "dev:e4",       PB11MP_GPIO0,   NULL);
-AMBA_DEVICE(gpio1,     "dev:e5",       GPIO1,          NULL);
-AMBA_DEVICE(gpio2,     "dev:e6",       GPIO2,          NULL);
+AMBA_DEVICE(gpio0,     "dev:e4",       PB11MP_GPIO0,   &gpio0_plat_data);
+AMBA_DEVICE(gpio1,     "dev:e5",       GPIO1,          &gpio1_plat_data);
+AMBA_DEVICE(gpio2,     "dev:e6",       GPIO2,          &gpio2_plat_data);
 AMBA_DEVICE(rtc,       "dev:e8",       PB11MP_RTC,     NULL);
 AMBA_DEVICE(sci0,      "dev:f0",       SCI,            NULL);
 AMBA_DEVICE(uart0,     "dev:f1",       PB11MP_UART0,   NULL);
index d6ac1eb86576c36f8e8dcb13fd6f385b7432131a..70bba9900d9723c5376061c6044e25dfdde1083e 100644 (file)
@@ -23,6 +23,7 @@
 #include <linux/platform_device.h>
 #include <linux/sysdev.h>
 #include <linux/amba/bus.h>
+#include <linux/amba/pl061.h>
 #include <linux/io.h>
 
 #include <asm/irq.h>
@@ -98,6 +99,21 @@ static void __init realview_pba8_map_io(void)
        iotable_init(realview_pba8_io_desc, ARRAY_SIZE(realview_pba8_io_desc));
 }
 
+static struct pl061_platform_data gpio0_plat_data = {
+       .gpio_base      = 0,
+       .irq_base       = -1,
+};
+
+static struct pl061_platform_data gpio1_plat_data = {
+       .gpio_base      = 8,
+       .irq_base       = -1,
+};
+
+static struct pl061_platform_data gpio2_plat_data = {
+       .gpio_base      = 16,
+       .irq_base       = -1,
+};
+
 /*
  * RealView PBA8Core AMBA devices
  */
@@ -156,9 +172,9 @@ AMBA_DEVICE(uart3,  "fpga:09",      PBA8_UART3,     NULL);
 AMBA_DEVICE(smc,       "dev:00",       PBA8_SMC,       NULL);
 AMBA_DEVICE(sctl,      "dev:e0",       SCTL,           NULL);
 AMBA_DEVICE(wdog,      "dev:e1",       PBA8_WATCHDOG, NULL);
-AMBA_DEVICE(gpio0,     "dev:e4",       PBA8_GPIO0,     NULL);
-AMBA_DEVICE(gpio1,     "dev:e5",       GPIO1,          NULL);
-AMBA_DEVICE(gpio2,     "dev:e6",       GPIO2,          NULL);
+AMBA_DEVICE(gpio0,     "dev:e4",       PBA8_GPIO0,     &gpio0_plat_data);
+AMBA_DEVICE(gpio1,     "dev:e5",       GPIO1,          &gpio1_plat_data);
+AMBA_DEVICE(gpio2,     "dev:e6",       GPIO2,          &gpio2_plat_data);
 AMBA_DEVICE(rtc,       "dev:e8",       PBA8_RTC,       NULL);
 AMBA_DEVICE(sci0,      "dev:f0",       SCI,            NULL);
 AMBA_DEVICE(uart0,     "dev:f1",       PBA8_UART0,     NULL);
index ede2a57240a35ed22db90920fb913e835f12621b..ce6c5d25fbefcaaee054f26774325ae6c0886ade 100644 (file)
@@ -22,6 +22,7 @@
 #include <linux/platform_device.h>
 #include <linux/sysdev.h>
 #include <linux/amba/bus.h>
+#include <linux/amba/pl061.h>
 #include <linux/io.h>
 
 #include <asm/irq.h>
@@ -118,6 +119,21 @@ static void __init realview_pbx_map_io(void)
                iotable_init(realview_local_io_desc, ARRAY_SIZE(realview_local_io_desc));
 }
 
+static struct pl061_platform_data gpio0_plat_data = {
+       .gpio_base      = 0,
+       .irq_base       = -1,
+};
+
+static struct pl061_platform_data gpio1_plat_data = {
+       .gpio_base      = 8,
+       .irq_base       = -1,
+};
+
+static struct pl061_platform_data gpio2_plat_data = {
+       .gpio_base      = 16,
+       .irq_base       = -1,
+};
+
 /*
  * RealView PBXCore AMBA devices
  */
@@ -176,9 +192,9 @@ AMBA_DEVICE(uart3,  "fpga:09",      PBX_UART3,      NULL);
 AMBA_DEVICE(smc,       "dev:00",       PBX_SMC,        NULL);
 AMBA_DEVICE(sctl,      "dev:e0",       SCTL,           NULL);
 AMBA_DEVICE(wdog,      "dev:e1",       PBX_WATCHDOG,   NULL);
-AMBA_DEVICE(gpio0,     "dev:e4",       PBX_GPIO0,      NULL);
-AMBA_DEVICE(gpio1,     "dev:e5",       GPIO1,          NULL);
-AMBA_DEVICE(gpio2,     "dev:e6",       GPIO2,          NULL);
+AMBA_DEVICE(gpio0,     "dev:e4",       PBX_GPIO0,      &gpio0_plat_data);
+AMBA_DEVICE(gpio1,     "dev:e5",       GPIO1,          &gpio1_plat_data);
+AMBA_DEVICE(gpio2,     "dev:e6",       GPIO2,          &gpio2_plat_data);
 AMBA_DEVICE(rtc,       "dev:e8",       PBX_RTC,        NULL);
 AMBA_DEVICE(sci0,      "dev:f0",       SCI,            NULL);
 AMBA_DEVICE(uart0,     "dev:f1",       PBX_UART0,      NULL);
index 3138d3955c9eaabbaa24c62ec6fce9e90500ce31..585cc013639dee5f4cbbf521f7dde822d6944e88 100644 (file)
@@ -156,6 +156,8 @@ int __devinit mmc_init(struct amba_device *adev)
        mmci_card->mmc0_plat_data.ocr_mask = MMC_VDD_28_29;
        mmci_card->mmc0_plat_data.translate_vdd = mmc_translate_vdd;
        mmci_card->mmc0_plat_data.status = mmc_status;
+       mmci_card->mmc0_plat_data.gpio_wp = -1;
+       mmci_card->mmc0_plat_data.gpio_cd = -1;
 
        mmcsd_device->platform_data = (void *) &mmci_card->mmc0_plat_data;
 
index 69214fc8bd19576093accb6904549ecc2e12fa0c..afc0f87f3fa41c43fba36616dfec78aaa3f9bcbd 100644 (file)
@@ -26,6 +26,7 @@
 #include <linux/interrupt.h>
 #include <linux/amba/bus.h>
 #include <linux/amba/clcd.h>
+#include <linux/amba/pl061.h>
 #include <linux/clocksource.h>
 #include <linux/clockchips.h>
 #include <linux/cnt32_to_63.h>
@@ -372,6 +373,8 @@ unsigned int mmc_status(struct device *dev)
 static struct mmc_platform_data mmc0_plat_data = {
        .ocr_mask       = MMC_VDD_32_33|MMC_VDD_33_34,
        .status         = mmc_status,
+       .gpio_wp        = -1,
+       .gpio_cd        = -1,
 };
 
 /*
@@ -706,6 +709,16 @@ static struct clcd_board clcd_plat_data = {
        .remove         = versatile_clcd_remove,
 };
 
+static struct pl061_platform_data gpio0_plat_data = {
+       .gpio_base      = 0,
+       .irq_base       = IRQ_GPIO0_START,
+};
+
+static struct pl061_platform_data gpio1_plat_data = {
+       .gpio_base      = 8,
+       .irq_base       = IRQ_GPIO1_START,
+};
+
 #define AACI_IRQ       { IRQ_AACI, NO_IRQ }
 #define AACI_DMA       { 0x80, 0x81 }
 #define MMCI0_IRQ      { IRQ_MMCI0A,IRQ_SIC_MMCI0B }
@@ -768,8 +781,8 @@ AMBA_DEVICE(clcd,  "dev:20",  CLCD,     &clcd_plat_data);
 AMBA_DEVICE(dmac,  "dev:30",  DMAC,     NULL);
 AMBA_DEVICE(sctl,  "dev:e0",  SCTL,     NULL);
 AMBA_DEVICE(wdog,  "dev:e1",  WATCHDOG, NULL);
-AMBA_DEVICE(gpio0, "dev:e4",  GPIO0,    NULL);
-AMBA_DEVICE(gpio1, "dev:e5",  GPIO1,    NULL);
+AMBA_DEVICE(gpio0, "dev:e4",  GPIO0,    &gpio0_plat_data);
+AMBA_DEVICE(gpio1, "dev:e5",  GPIO1,    &gpio1_plat_data);
 AMBA_DEVICE(rtc,   "dev:e8",  RTC,      NULL);
 AMBA_DEVICE(sci0,  "dev:f0",  SCI,      NULL);
 AMBA_DEVICE(uart0, "dev:f1",  UART0,    NULL);
diff --git a/arch/arm/mach-versatile/include/mach/gpio.h b/arch/arm/mach-versatile/include/mach/gpio.h
new file mode 100644 (file)
index 0000000..94ff276
--- /dev/null
@@ -0,0 +1,6 @@
+#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
index 9bfdb30e1f3f3e91694464857b4e5c561752f3f1..bf44c61bd1f682f203d1169528542a93b6482404 100644 (file)
 #define IRQ_SIC_PCI3           (IRQ_SIC_START + SIC_INT_PCI3)
 #define IRQ_SIC_END            63
 
-#define NR_IRQS                        64
+#define IRQ_GPIO0_START                (IRQ_SIC_END + 1)
+#define IRQ_GPIO0_END          (IRQ_GPIO0_START + 31)
+#define IRQ_GPIO1_START                (IRQ_GPIO0_END + 1)
+#define IRQ_GPIO1_END          (IRQ_GPIO1_START + 31)
+#define IRQ_GPIO2_START                (IRQ_GPIO1_END + 1)
+#define IRQ_GPIO2_END          (IRQ_GPIO2_START + 31)
+#define IRQ_GPIO3_START                (IRQ_GPIO2_END + 1)
+#define IRQ_GPIO3_END          (IRQ_GPIO3_START + 31)
+
+#define NR_IRQS                        (IRQ_GPIO3_END + 1)
index aa051c0884f8372f88c0a62fec88ef481032bfde..9af8d8154df56e9d8da7c727d195762e51a34937 100644 (file)
@@ -23,6 +23,7 @@
 #include <linux/device.h>
 #include <linux/sysdev.h>
 #include <linux/amba/bus.h>
+#include <linux/amba/pl061.h>
 #include <linux/io.h>
 
 #include <mach/hardware.h>
 static struct mmc_platform_data mmc1_plat_data = {
        .ocr_mask       = MMC_VDD_32_33|MMC_VDD_33_34,
        .status         = mmc_status,
+       .gpio_wp        = -1,
+       .gpio_cd        = -1,
+};
+
+static struct pl061_platform_data gpio2_plat_data = {
+       .gpio_base      = 16,
+       .irq_base       = IRQ_GPIO2_START,
+};
+
+static struct pl061_platform_data gpio3_plat_data = {
+       .gpio_base      = 24,
+       .irq_base       = IRQ_GPIO3_START,
 };
 
 #define UART3_IRQ      { IRQ_SIC_UART3, NO_IRQ }
@@ -70,8 +83,8 @@ AMBA_DEVICE(sci1,  "fpga:0a", SCI1,     NULL);
 AMBA_DEVICE(mmc1,  "fpga:0b", MMCI1,    &mmc1_plat_data);
 
 /* DevChip Primecells */
-AMBA_DEVICE(gpio2, "dev:e6",  GPIO2,    NULL);
-AMBA_DEVICE(gpio3, "dev:e7",  GPIO3,    NULL);
+AMBA_DEVICE(gpio2, "dev:e6",  GPIO2,    &gpio2_plat_data);
+AMBA_DEVICE(gpio3, "dev:e7",  GPIO3,    &gpio3_plat_data);
 
 static struct amba_device *amba_devs[] __initdata = {
        &uart3_device,
index 8e4178fe5ec2b83b108e2dd72bc2239c39d3f637..69bab32a8bc25b33a4bae37233e53dd5f3e74642 100644 (file)
@@ -5,6 +5,16 @@ config CPU_W90P910
        help
          Support for W90P910 of Nuvoton W90X900 CPUs.
 
+config CPU_NUC950
+       bool
+       help
+         Support for NUCP950 of Nuvoton NUC900 CPUs.
+
+config CPU_NUC960
+       bool
+       help
+         Support for NUCP960 of Nuvoton NUC900 CPUs.
+
 menu "W90P910 Machines"
 
 config MACH_W90P910EVB
@@ -16,4 +26,24 @@ config MACH_W90P910EVB
 
 endmenu
 
+menu "NUC950 Machines"
+
+config MACH_W90P950EVB
+       bool "Nuvoton NUC950 Evaluation Board"
+       select CPU_NUC950
+       help
+          Say Y here if you are using the Nuvoton NUC950EVB
+
+endmenu
+
+menu "NUC960 Machines"
+
+config MACH_W90N960EVB
+       bool "Nuvoton NUC960 Evaluation Board"
+       select CPU_NUC960
+       help
+          Say Y here if you are using the Nuvoton NUC960EVB
+
+endmenu
+
 endif
index d50c94f4dbdfd27f45ea92e58c69cbffa25c45ce..828c0326441e74cf9fbedd4d852b61229ff98934 100644 (file)
@@ -4,12 +4,16 @@
 
 # Object file lists.
 
-obj-y                          := irq.o time.o mfp-w90p910.o gpio.o clock.o
-
+obj-y                          := irq.o time.o mfp.o gpio.o clock.o
+obj-y                          += clksel.o dev.o cpu.o
 # W90X900 CPU support files
 
-obj-$(CONFIG_CPU_W90P910)      += w90p910.o
+obj-$(CONFIG_CPU_W90P910)      += nuc910.o
+obj-$(CONFIG_CPU_NUC950)       += nuc950.o
+obj-$(CONFIG_CPU_NUC960)       += nuc960.o
 
 # machine support
 
-obj-$(CONFIG_MACH_W90P910EVB)  += mach-w90p910evb.o
+obj-$(CONFIG_MACH_W90P910EVB)  += mach-nuc910evb.o
+obj-$(CONFIG_MACH_W90P950EVB)  += mach-nuc950evb.o
+obj-$(CONFIG_MACH_W90N960EVB)  += mach-nuc960evb.o
diff --git a/arch/arm/mach-w90x900/clksel.c b/arch/arm/mach-w90x900/clksel.c
new file mode 100644 (file)
index 0000000..3de4a52
--- /dev/null
@@ -0,0 +1,91 @@
+/*
+ * linux/arch/arm/mach-w90x900/clksel.c
+ *
+ * Copyright (c) 2008 Nuvoton technology corporation
+ *
+ * Wan ZongShun <mcuos.com@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation;version 2 of the License.
+ */
+
+#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 <linux/io.h>
+
+#include <mach/hardware.h>
+#include <mach/regs-clock.h>
+
+#define PLL0           0x00
+#define PLL1           0x01
+#define OTHER          0x02
+#define EXT            0x03
+#define MSOFFSET       0x0C
+#define ATAOFFSET      0x0a
+#define LCDOFFSET      0x06
+#define AUDOFFSET      0x04
+#define CPUOFFSET      0x00
+
+static DEFINE_MUTEX(clksel_sem);
+
+static void clock_source_select(const char *dev_id, unsigned int clkval)
+{
+       unsigned int clksel, offset;
+
+       clksel = __raw_readl(REG_CLKSEL);
+
+       if (strcmp(dev_id, "nuc900-ms") == 0)
+               offset = MSOFFSET;
+       else if (strcmp(dev_id, "nuc900-atapi") == 0)
+               offset = ATAOFFSET;
+       else if (strcmp(dev_id, "nuc900-lcd") == 0)
+               offset = LCDOFFSET;
+       else if (strcmp(dev_id, "nuc900-audio") == 0)
+               offset = AUDOFFSET;
+       else
+               offset = CPUOFFSET;
+
+       clksel &= ~(0x03 << offset);
+       clksel |= (clkval << offset);
+
+       __raw_writel(clksel, REG_CLKSEL);
+}
+
+void nuc900_clock_source(struct device *dev, unsigned char *src)
+{
+       unsigned int clkval;
+       const char *dev_id;
+
+       BUG_ON(!src);
+       clkval = 0;
+
+       mutex_lock(&clksel_sem);
+
+       if (dev)
+               dev_id = dev_name(dev);
+       else
+               dev_id = "cpufreq";
+
+       if (strcmp(src, "pll0") == 0)
+               clkval = PLL0;
+       else if (strcmp(src, "pll1") == 0)
+               clkval = PLL1;
+       else if (strcmp(src, "ext") == 0)
+               clkval = EXT;
+       else if (strcmp(src, "oth") == 0)
+               clkval = OTHER;
+
+       clock_source_select(dev_id, clkval);
+
+       mutex_unlock(&clksel_sem);
+}
+EXPORT_SYMBOL(nuc900_clock_source);
+
index f420613cd395ddd6553f4ae4ab006e4570943aa5..b785994bab0a64fbe2bf5cf6f2cdd8e67f10306c 100644 (file)
@@ -25,6 +25,8 @@
 
 #include "clock.h"
 
+#define SUBCLK 0x24
+
 static DEFINE_SPINLOCK(clocks_lock);
 
 int clk_enable(struct clk *clk)
@@ -53,7 +55,13 @@ void clk_disable(struct clk *clk)
 }
 EXPORT_SYMBOL(clk_disable);
 
-void w90x900_clk_enable(struct clk *clk, int enable)
+unsigned long clk_get_rate(struct clk *clk)
+{
+       return 15000000;
+}
+EXPORT_SYMBOL(clk_get_rate);
+
+void nuc900_clk_enable(struct clk *clk, int enable)
 {
        unsigned int clocks = clk->cken;
        unsigned long clken;
@@ -68,6 +76,22 @@ void w90x900_clk_enable(struct clk *clk, int enable)
        __raw_writel(clken, W90X900_VA_CLKPWR);
 }
 
+void nuc900_subclk_enable(struct clk *clk, int enable)
+{
+       unsigned int clocks = clk->cken;
+       unsigned long clken;
+
+       clken = __raw_readl(W90X900_VA_CLKPWR + SUBCLK);
+
+       if (enable)
+               clken |= clocks;
+       else
+               clken &= ~clocks;
+
+       __raw_writel(clken, W90X900_VA_CLKPWR + SUBCLK);
+}
+
+
 void clks_register(struct clk_lookup *clks, size_t num)
 {
        int i;
index 4f27bda76d56c52cca80178c079279fd60dcc6d4..f5816a06eed6aa415bffd21b5dbd708266d404dc 100644 (file)
@@ -12,7 +12,8 @@
 
 #include <asm/clkdev.h>
 
-void w90x900_clk_enable(struct clk *clk, int enable);
+void nuc900_clk_enable(struct clk *clk, int enable);
+void nuc900_subclk_enable(struct clk *clk, int enable);
 void clks_register(struct clk_lookup *clks, size_t num);
 
 struct clk {
@@ -23,10 +24,17 @@ struct clk {
 
 #define DEFINE_CLK(_name, _ctrlbit)                    \
 struct clk clk_##_name = {                             \
-               .enable = w90x900_clk_enable,           \
+               .enable = nuc900_clk_enable,            \
                .cken   = (1 << _ctrlbit),              \
        }
 
+#define DEFINE_SUBCLK(_name, _ctrlbit)                 \
+struct clk clk_##_name = {                             \
+               .enable = nuc900_subclk_enable, \
+               .cken   = (1 << _ctrlbit),              \
+       }
+
+
 #define DEF_CLKLOOK(_clk, _devname, _conname)          \
        {                                               \
                .clk            = _clk,                 \
diff --git a/arch/arm/mach-w90x900/cpu.c b/arch/arm/mach-w90x900/cpu.c
new file mode 100644 (file)
index 0000000..921cef9
--- /dev/null
@@ -0,0 +1,212 @@
+/*
+ * linux/arch/arm/mach-w90x900/cpu.c
+ *
+ * Copyright (c) 2009 Nuvoton corporation.
+ *
+ * Wan ZongShun <mcuos.com@gmail.com>
+ *
+ * NUC900 series cpu common support
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation;version 2 of the License.
+ *
+ */
+
+#include <linux/kernel.h>
+#include <linux/types.h>
+#include <linux/interrupt.h>
+#include <linux/list.h>
+#include <linux/timer.h>
+#include <linux/init.h>
+#include <linux/platform_device.h>
+#include <linux/io.h>
+#include <linux/serial_8250.h>
+#include <linux/delay.h>
+
+#include <asm/mach/arch.h>
+#include <asm/mach/map.h>
+#include <asm/mach/irq.h>
+#include <asm/irq.h>
+
+#include <mach/hardware.h>
+#include <mach/regs-serial.h>
+#include <mach/regs-clock.h>
+#include <mach/regs-ebi.h>
+
+#include "cpu.h"
+#include "clock.h"
+
+/* Initial IO mappings */
+
+static struct map_desc nuc900_iodesc[] __initdata = {
+       IODESC_ENT(IRQ),
+       IODESC_ENT(GCR),
+       IODESC_ENT(UART),
+       IODESC_ENT(TIMER),
+       IODESC_ENT(EBI),
+};
+
+/* Initial clock declarations. */
+static DEFINE_CLK(lcd, 0);
+static DEFINE_CLK(audio, 1);
+static DEFINE_CLK(fmi, 4);
+static DEFINE_SUBCLK(ms, 0);
+static DEFINE_SUBCLK(sd, 1);
+static DEFINE_CLK(dmac, 5);
+static DEFINE_CLK(atapi, 6);
+static DEFINE_CLK(emc, 7);
+static DEFINE_SUBCLK(rmii, 2);
+static DEFINE_CLK(usbd, 8);
+static DEFINE_CLK(usbh, 9);
+static DEFINE_CLK(g2d, 10);;
+static DEFINE_CLK(pwm, 18);
+static DEFINE_CLK(ps2, 24);
+static DEFINE_CLK(kpi, 25);
+static DEFINE_CLK(wdt, 26);
+static DEFINE_CLK(gdma, 27);
+static DEFINE_CLK(adc, 28);
+static DEFINE_CLK(usi, 29);
+static DEFINE_CLK(ext, 0);
+
+static struct clk_lookup nuc900_clkregs[] = {
+       DEF_CLKLOOK(&clk_lcd, "nuc900-lcd", NULL),
+       DEF_CLKLOOK(&clk_audio, "nuc900-audio", NULL),
+       DEF_CLKLOOK(&clk_fmi, "nuc900-fmi", NULL),
+       DEF_CLKLOOK(&clk_ms, "nuc900-fmi", "MS"),
+       DEF_CLKLOOK(&clk_sd, "nuc900-fmi", "SD"),
+       DEF_CLKLOOK(&clk_dmac, "nuc900-dmac", NULL),
+       DEF_CLKLOOK(&clk_atapi, "nuc900-atapi", NULL),
+       DEF_CLKLOOK(&clk_emc, "nuc900-emc", NULL),
+       DEF_CLKLOOK(&clk_rmii, "nuc900-emc", "RMII"),
+       DEF_CLKLOOK(&clk_usbd, "nuc900-usbd", NULL),
+       DEF_CLKLOOK(&clk_usbh, "nuc900-usbh", NULL),
+       DEF_CLKLOOK(&clk_g2d, "nuc900-g2d", NULL),
+       DEF_CLKLOOK(&clk_pwm, "nuc900-pwm", NULL),
+       DEF_CLKLOOK(&clk_ps2, "nuc900-ps2", NULL),
+       DEF_CLKLOOK(&clk_kpi, "nuc900-kpi", NULL),
+       DEF_CLKLOOK(&clk_wdt, "nuc900-wdt", NULL),
+       DEF_CLKLOOK(&clk_gdma, "nuc900-gdma", NULL),
+       DEF_CLKLOOK(&clk_adc, "nuc900-adc", NULL),
+       DEF_CLKLOOK(&clk_usi, "nuc900-spi", NULL),
+       DEF_CLKLOOK(&clk_ext, NULL, "ext"),
+};
+
+/* Initial serial platform data */
+
+struct plat_serial8250_port nuc900_uart_data[] = {
+       NUC900_8250PORT(UART0),
+};
+
+struct platform_device nuc900_serial_device = {
+       .name                   = "serial8250",
+       .id                     = PLAT8250_DEV_PLATFORM,
+       .dev                    = {
+               .platform_data  = nuc900_uart_data,
+       },
+};
+
+/*Set NUC900 series cpu frequence*/
+static int __init nuc900_set_clkval(unsigned int cpufreq)
+{
+       unsigned int pllclk, ahbclk, apbclk, val;
+
+       pllclk = 0;
+       ahbclk = 0;
+       apbclk = 0;
+
+       switch (cpufreq) {
+       case 66:
+               pllclk = PLL_66MHZ;
+               ahbclk = AHB_CPUCLK_1_1;
+               apbclk = APB_AHB_1_2;
+               break;
+
+       case 100:
+               pllclk = PLL_100MHZ;
+               ahbclk = AHB_CPUCLK_1_1;
+               apbclk = APB_AHB_1_2;
+               break;
+
+       case 120:
+               pllclk = PLL_120MHZ;
+               ahbclk = AHB_CPUCLK_1_2;
+               apbclk = APB_AHB_1_2;
+               break;
+
+       case 166:
+               pllclk = PLL_166MHZ;
+               ahbclk = AHB_CPUCLK_1_2;
+               apbclk = APB_AHB_1_2;
+               break;
+
+       case 200:
+               pllclk = PLL_200MHZ;
+               ahbclk = AHB_CPUCLK_1_2;
+               apbclk = APB_AHB_1_2;
+               break;
+       }
+
+       __raw_writel(pllclk, REG_PLLCON0);
+
+       val = __raw_readl(REG_CLKDIV);
+       val &= ~(0x03 << 24 | 0x03 << 26);
+       val |= (ahbclk << 24 | apbclk << 26);
+       __raw_writel(val, REG_CLKDIV);
+
+       return  0;
+}
+static int __init nuc900_set_cpufreq(char *str)
+{
+       unsigned long cpufreq, val;
+
+       if (!*str)
+               return 0;
+
+       strict_strtoul(str, 0, &cpufreq);
+
+       nuc900_clock_source(NULL, "ext");
+
+       nuc900_set_clkval(cpufreq);
+
+       mdelay(1);
+
+       val = __raw_readl(REG_CKSKEW);
+       val &= ~0xff;
+       val |= DEFAULTSKEW;
+       __raw_writel(val, REG_CKSKEW);
+
+       nuc900_clock_source(NULL, "pll0");
+
+       return 1;
+}
+
+__setup("cpufreq=", nuc900_set_cpufreq);
+
+/*Init NUC900 evb io*/
+
+void __init nuc900_map_io(struct map_desc *mach_desc, int mach_size)
+{
+       unsigned long idcode = 0x0;
+
+       iotable_init(mach_desc, mach_size);
+       iotable_init(nuc900_iodesc, ARRAY_SIZE(nuc900_iodesc));
+
+       idcode = __raw_readl(NUC900PDID);
+       if (idcode == NUC910_CPUID)
+               printk(KERN_INFO "CPU type 0x%08lx is NUC910\n", idcode);
+       else if (idcode == NUC920_CPUID)
+               printk(KERN_INFO "CPU type 0x%08lx is NUC920\n", idcode);
+       else if (idcode == NUC950_CPUID)
+               printk(KERN_INFO "CPU type 0x%08lx is NUC950\n", idcode);
+       else if (idcode == NUC960_CPUID)
+               printk(KERN_INFO "CPU type 0x%08lx is NUC960\n", idcode);
+}
+
+/*Init NUC900 clock*/
+
+void __init nuc900_init_clocks(void)
+{
+       clks_register(nuc900_clkregs, ARRAY_SIZE(nuc900_clkregs));
+}
+
index 57b5dbabeb41a50b65c242038765bf2dc0faf65e..4d58ba164e252aa27a79ef54b3562a6abc5b04cd 100644 (file)
@@ -6,7 +6,7 @@
  * Copyright (c) 2008 Nuvoton technology corporation
  * All rights reserved.
  *
- * Header file for W90X900 CPU support
+ * Header file for NUC900 CPU support
  *
  * Wan ZongShun <mcuos.com@gmail.com>
  *
        .type    = MT_DEVICE,                           \
 }
 
-/*Cpu identifier register*/
-
-#define W90X900PDID    W90X900_VA_GCR
-#define W90P910_CPUID  0x02900910
-#define W90P920_CPUID  0x02900920
-#define W90P950_CPUID  0x02900950
-#define W90N960_CPUID  0x02900960
-
-struct w90x900_uartcfg;
-struct map_desc;
-struct sys_timer;
-
-/* core initialisation functions */
-
-extern void w90x900_init_irq(void);
-extern void w90p910_init_io(struct map_desc *mach_desc, int size);
-extern void w90p910_init_uarts(struct w90x900_uartcfg *cfg, int no);
-extern void w90p910_init_clocks(void);
-extern void w90p910_map_io(struct map_desc *mach_desc, int size);
-extern struct platform_device w90p910_serial_device;
-extern struct sys_timer w90x900_timer;
-
-#define W90X900_8250PORT(name)                                 \
+#define NUC900_8250PORT(name)                                  \
 {                                                              \
        .membase        = name##_BA,                            \
        .mapbase        = name##_PA,                            \
@@ -56,3 +34,26 @@ extern struct sys_timer w90x900_timer;
        .iotype         = UPIO_MEM,                             \
        .flags          = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST,    \
 }
+
+/*Cpu identifier register*/
+
+#define NUC900PDID     W90X900_VA_GCR
+#define NUC910_CPUID   0x02900910
+#define NUC920_CPUID   0x02900920
+#define NUC950_CPUID   0x02900950
+#define NUC960_CPUID   0x02900960
+
+/* extern file from cpu.c */
+
+extern void nuc900_clock_source(struct device *dev, unsigned char *src);
+extern void nuc900_init_clocks(void);
+extern void nuc900_map_io(struct map_desc *mach_desc, int mach_size);
+extern void nuc900_board_init(struct platform_device **device, int size);
+
+/* for either public between 910 and 920, or between 920 and 950 */
+
+extern struct platform_device nuc900_serial_device;
+extern struct platform_device nuc900_device_fmi;
+extern struct platform_device nuc900_device_kpi;
+extern struct platform_device nuc900_device_rtc;
+extern struct platform_device nuc900_device_ts;
diff --git a/arch/arm/mach-w90x900/dev.c b/arch/arm/mach-w90x900/dev.c
new file mode 100644 (file)
index 0000000..2a6f98d
--- /dev/null
@@ -0,0 +1,389 @@
+/*
+ * linux/arch/arm/mach-w90x900/dev.c
+ *
+ * Copyright (C) 2009 Nuvoton corporation.
+ *
+ * Wan ZongShun <mcuos.com@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation;version 2 of the License.
+ *
+ */
+
+#include <linux/kernel.h>
+#include <linux/types.h>
+#include <linux/interrupt.h>
+#include <linux/list.h>
+#include <linux/timer.h>
+#include <linux/init.h>
+#include <linux/platform_device.h>
+
+#include <linux/mtd/physmap.h>
+#include <linux/mtd/mtd.h>
+#include <linux/mtd/partitions.h>
+
+#include <linux/spi/spi.h>
+#include <linux/spi/flash.h>
+
+#include <asm/mach/arch.h>
+#include <asm/mach/map.h>
+#include <asm/mach/irq.h>
+#include <asm/mach-types.h>
+
+#include <mach/regs-serial.h>
+#include <mach/map.h>
+
+#include "cpu.h"
+
+/*NUC900 evb norflash driver data */
+
+#define NUC900_FLASH_BASE      0xA0000000
+#define NUC900_FLASH_SIZE      0x400000
+#define SPIOFFSET              0x200
+#define SPIOREG_SIZE           0x100
+
+static struct mtd_partition nuc900_flash_partitions[] = {
+       {
+               .name   =       "NOR Partition 1 for kernel (960K)",
+               .size   =       0xF0000,
+               .offset =       0x10000,
+       },
+       {
+               .name   =       "NOR Partition 2 for image (1M)",
+               .size   =       0x100000,
+               .offset =       0x100000,
+       },
+       {
+               .name   =       "NOR Partition 3 for user (2M)",
+               .size   =       0x200000,
+               .offset =       0x00200000,
+       }
+};
+
+static struct physmap_flash_data nuc900_flash_data = {
+       .width          =       2,
+       .parts          =       nuc900_flash_partitions,
+       .nr_parts       =       ARRAY_SIZE(nuc900_flash_partitions),
+};
+
+static struct resource nuc900_flash_resources[] = {
+       {
+               .start  =       NUC900_FLASH_BASE,
+               .end    =       NUC900_FLASH_BASE + NUC900_FLASH_SIZE - 1,
+               .flags  =       IORESOURCE_MEM,
+       }
+};
+
+static struct platform_device nuc900_flash_device = {
+       .name           =       "physmap-flash",
+       .id             =       0,
+       .dev            = {
+                               .platform_data = &nuc900_flash_data,
+                       },
+       .resource       =       nuc900_flash_resources,
+       .num_resources  =       ARRAY_SIZE(nuc900_flash_resources),
+};
+
+/* USB EHCI Host Controller */
+
+static struct resource nuc900_usb_ehci_resource[] = {
+       [0] = {
+               .start = W90X900_PA_USBEHCIHOST,
+               .end   = W90X900_PA_USBEHCIHOST + W90X900_SZ_USBEHCIHOST - 1,
+               .flags = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start = IRQ_USBH,
+               .end   = IRQ_USBH,
+               .flags = IORESOURCE_IRQ,
+       }
+};
+
+static u64 nuc900_device_usb_ehci_dmamask = 0xffffffffUL;
+
+static struct platform_device nuc900_device_usb_ehci = {
+       .name             = "nuc900-ehci",
+       .id               = -1,
+       .num_resources    = ARRAY_SIZE(nuc900_usb_ehci_resource),
+       .resource         = nuc900_usb_ehci_resource,
+       .dev              = {
+               .dma_mask = &nuc900_device_usb_ehci_dmamask,
+               .coherent_dma_mask = 0xffffffffUL
+       }
+};
+
+/* USB OHCI Host Controller */
+
+static struct resource nuc900_usb_ohci_resource[] = {
+       [0] = {
+               .start = W90X900_PA_USBOHCIHOST,
+               .end   = W90X900_PA_USBOHCIHOST + W90X900_SZ_USBOHCIHOST - 1,
+               .flags = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start = IRQ_USBH,
+               .end   = IRQ_USBH,
+               .flags = IORESOURCE_IRQ,
+       }
+};
+
+static u64 nuc900_device_usb_ohci_dmamask = 0xffffffffUL;
+static struct platform_device nuc900_device_usb_ohci = {
+       .name             = "nuc900-ohci",
+       .id               = -1,
+       .num_resources    = ARRAY_SIZE(nuc900_usb_ohci_resource),
+       .resource         = nuc900_usb_ohci_resource,
+       .dev              = {
+               .dma_mask = &nuc900_device_usb_ohci_dmamask,
+               .coherent_dma_mask = 0xffffffffUL
+       }
+};
+
+/* USB Device (Gadget)*/
+
+static struct resource nuc900_usbgadget_resource[] = {
+       [0] = {
+               .start = W90X900_PA_USBDEV,
+               .end   = W90X900_PA_USBDEV + W90X900_SZ_USBDEV - 1,
+               .flags = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start = IRQ_USBD,
+               .end   = IRQ_USBD,
+               .flags = IORESOURCE_IRQ,
+       }
+};
+
+static struct platform_device nuc900_device_usbgadget = {
+       .name           = "nuc900-usbgadget",
+       .id             = -1,
+       .num_resources  = ARRAY_SIZE(nuc900_usbgadget_resource),
+       .resource       = nuc900_usbgadget_resource,
+};
+
+/* MAC device */
+
+static struct resource nuc900_emc_resource[] = {
+       [0] = {
+               .start = W90X900_PA_EMC,
+               .end   = W90X900_PA_EMC + W90X900_SZ_EMC - 1,
+               .flags = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start = IRQ_EMCTX,
+               .end   = IRQ_EMCTX,
+               .flags = IORESOURCE_IRQ,
+       },
+       [2] = {
+               .start = IRQ_EMCRX,
+               .end   = IRQ_EMCRX,
+               .flags = IORESOURCE_IRQ,
+       }
+};
+
+static u64 nuc900_device_emc_dmamask = 0xffffffffUL;
+static struct platform_device nuc900_device_emc = {
+       .name           = "nuc900-emc",
+       .id             = -1,
+       .num_resources  = ARRAY_SIZE(nuc900_emc_resource),
+       .resource       = nuc900_emc_resource,
+       .dev              = {
+               .dma_mask = &nuc900_device_emc_dmamask,
+               .coherent_dma_mask = 0xffffffffUL
+       }
+};
+
+/* SPI device */
+
+static struct resource nuc900_spi_resource[] = {
+       [0] = {
+               .start = W90X900_PA_I2C + SPIOFFSET,
+               .end   = W90X900_PA_I2C + SPIOFFSET + SPIOREG_SIZE - 1,
+               .flags = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start = IRQ_SSP,
+               .end   = IRQ_SSP,
+               .flags = IORESOURCE_IRQ,
+       }
+};
+
+static struct platform_device nuc900_device_spi = {
+       .name           = "nuc900-spi",
+       .id             = -1,
+       .num_resources  = ARRAY_SIZE(nuc900_spi_resource),
+       .resource       = nuc900_spi_resource,
+};
+
+/* spi device, spi flash info */
+
+static struct mtd_partition nuc900_spi_flash_partitions[] = {
+       {
+               .name = "bootloader(spi)",
+               .size = 0x0100000,
+               .offset = 0,
+       },
+};
+
+static struct flash_platform_data nuc900_spi_flash_data = {
+       .name = "m25p80",
+       .parts =  nuc900_spi_flash_partitions,
+       .nr_parts = ARRAY_SIZE(nuc900_spi_flash_partitions),
+       .type = "w25x16",
+};
+
+static struct spi_board_info nuc900_spi_board_info[] __initdata = {
+       {
+               .modalias = "m25p80",
+               .max_speed_hz = 20000000,
+               .bus_num = 0,
+               .chip_select = 1,
+               .platform_data = &nuc900_spi_flash_data,
+               .mode = SPI_MODE_0,
+       },
+};
+
+/* WDT Device */
+
+static struct resource nuc900_wdt_resource[] = {
+       [0] = {
+               .start = W90X900_PA_TIMER,
+               .end   = W90X900_PA_TIMER + W90X900_SZ_TIMER - 1,
+               .flags = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start = IRQ_WDT,
+               .end   = IRQ_WDT,
+               .flags = IORESOURCE_IRQ,
+       }
+};
+
+static struct platform_device nuc900_device_wdt = {
+       .name           = "nuc900-wdt",
+       .id             = -1,
+       .num_resources  = ARRAY_SIZE(nuc900_wdt_resource),
+       .resource       = nuc900_wdt_resource,
+};
+
+/*
+ * public device definition between 910 and 920, or 910
+ * and 950 or 950 and 960...,their dev platform register
+ * should be in specific file such as nuc950, nuc960 c
+ * files rather than the public dev.c file here. so the
+ * corresponding platform_device definition should not be
+ * static.
+*/
+
+/* RTC controller*/
+
+static struct resource nuc900_rtc_resource[] = {
+       [0] = {
+               .start = W90X900_PA_RTC,
+               .end   = W90X900_PA_RTC + 0xff,
+               .flags = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start = IRQ_RTC,
+               .end   = IRQ_RTC,
+               .flags = IORESOURCE_IRQ,
+       },
+};
+
+struct platform_device nuc900_device_rtc = {
+       .name           = "nuc900-rtc",
+       .id             = -1,
+       .num_resources  = ARRAY_SIZE(nuc900_rtc_resource),
+       .resource       = nuc900_rtc_resource,
+};
+
+/*TouchScreen controller*/
+
+static struct resource nuc900_ts_resource[] = {
+       [0] = {
+               .start = W90X900_PA_ADC,
+               .end   = W90X900_PA_ADC + W90X900_SZ_ADC-1,
+               .flags = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start = IRQ_ADC,
+               .end   = IRQ_ADC,
+               .flags = IORESOURCE_IRQ,
+       },
+};
+
+struct platform_device nuc900_device_ts = {
+       .name           = "nuc900-ts",
+       .id             = -1,
+       .resource       = nuc900_ts_resource,
+       .num_resources  = ARRAY_SIZE(nuc900_ts_resource),
+};
+
+/* FMI Device */
+
+static struct resource nuc900_fmi_resource[] = {
+       [0] = {
+               .start = W90X900_PA_FMI,
+               .end   = W90X900_PA_FMI + W90X900_SZ_FMI - 1,
+               .flags = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start = IRQ_FMI,
+               .end   = IRQ_FMI,
+               .flags = IORESOURCE_IRQ,
+       }
+};
+
+struct platform_device nuc900_device_fmi = {
+       .name           = "nuc900-fmi",
+       .id             = -1,
+       .num_resources  = ARRAY_SIZE(nuc900_fmi_resource),
+       .resource       = nuc900_fmi_resource,
+};
+
+/* KPI controller*/
+
+static struct resource nuc900_kpi_resource[] = {
+       [0] = {
+               .start = W90X900_PA_KPI,
+               .end   = W90X900_PA_KPI + W90X900_SZ_KPI - 1,
+               .flags = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start = IRQ_KPI,
+               .end   = IRQ_KPI,
+               .flags = IORESOURCE_IRQ,
+       }
+
+};
+
+struct platform_device nuc900_device_kpi = {
+       .name           = "nuc900-kpi",
+       .id             = -1,
+       .num_resources  = ARRAY_SIZE(nuc900_kpi_resource),
+       .resource       = nuc900_kpi_resource,
+};
+
+/*Here should be your evb resourse,such as LCD*/
+
+static struct platform_device *nuc900_public_dev[] __initdata = {
+       &nuc900_serial_device,
+       &nuc900_flash_device,
+       &nuc900_device_usb_ehci,
+       &nuc900_device_usb_ohci,
+       &nuc900_device_usbgadget,
+       &nuc900_device_emc,
+       &nuc900_device_spi,
+       &nuc900_device_wdt,
+};
+
+/* Provide adding specific CPU platform devices API */
+
+void __init nuc900_board_init(struct platform_device **device, int size)
+{
+       platform_add_devices(device, size);
+       platform_add_devices(nuc900_public_dev, ARRAY_SIZE(nuc900_public_dev));
+       spi_register_board_info(nuc900_spi_board_info,
+                                       ARRAY_SIZE(nuc900_spi_board_info));
+}
+
index c72e0dfa182565d3b93611eb9d2b254c2c2d56d3..ba05aec7ea4b9bde50510a883a8f65f73d21ecbb 100644 (file)
@@ -1,7 +1,7 @@
 /*
- * linux/arch/arm/mach-w90p910/gpio.c
+ * linux/arch/arm/mach-w90x900/gpio.c
  *
- * Generic w90p910 GPIO handling
+ * Generic nuc900 GPIO handling
  *
  *  Wan ZongShun <mcuos.com@gmail.com>
  *
 #define GPIO_IN                        (0x0C)
 #define GROUPINERV             (0x10)
 #define GPIO_GPIO(Nb)          (0x00000001 << (Nb))
-#define to_w90p910_gpio_chip(c) container_of(c, struct w90p910_gpio_chip, chip)
+#define to_nuc900_gpio_chip(c) container_of(c, struct nuc900_gpio_chip, chip)
 
-#define W90P910_GPIO_CHIP(name, base_gpio, nr_gpio)                    \
+#define NUC900_GPIO_CHIP(name, base_gpio, nr_gpio)                     \
        {                                                               \
                .chip = {                                               \
                        .label            = name,                       \
-                       .direction_input  = w90p910_dir_input,          \
-                       .direction_output = w90p910_dir_output,         \
-                       .get              = w90p910_gpio_get,           \
-                       .set              = w90p910_gpio_set,           \
+                       .direction_input  = nuc900_dir_input,           \
+                       .direction_output = nuc900_dir_output,          \
+                       .get              = nuc900_gpio_get,            \
+                       .set              = nuc900_gpio_set,            \
                        .base             = base_gpio,                  \
                        .ngpio            = nr_gpio,                    \
                }                                                       \
        }
 
-struct w90p910_gpio_chip {
+struct nuc900_gpio_chip {
        struct gpio_chip        chip;
        void __iomem            *regbase;       /* Base of group register*/
        spinlock_t              gpio_lock;
 };
 
-static int w90p910_gpio_get(struct gpio_chip *chip, unsigned offset)
+static int nuc900_gpio_get(struct gpio_chip *chip, unsigned offset)
 {
-       struct w90p910_gpio_chip *w90p910_gpio = to_w90p910_gpio_chip(chip);
-       void __iomem *pio = w90p910_gpio->regbase + GPIO_IN;
+       struct nuc900_gpio_chip *nuc900_gpio = to_nuc900_gpio_chip(chip);
+       void __iomem *pio = nuc900_gpio->regbase + GPIO_IN;
        unsigned int regval;
 
        regval = __raw_readl(pio);
@@ -63,14 +63,14 @@ static int w90p910_gpio_get(struct gpio_chip *chip, unsigned offset)
        return (regval != 0);
 }
 
-static void w90p910_gpio_set(struct gpio_chip *chip, unsigned offset, int val)
+static void nuc900_gpio_set(struct gpio_chip *chip, unsigned offset, int val)
 {
-       struct w90p910_gpio_chip *w90p910_gpio = to_w90p910_gpio_chip(chip);
-       void __iomem *pio = w90p910_gpio->regbase + GPIO_OUT;
+       struct nuc900_gpio_chip *nuc900_gpio = to_nuc900_gpio_chip(chip);
+       void __iomem *pio = nuc900_gpio->regbase + GPIO_OUT;
        unsigned int regval;
        unsigned long flags;
 
-       spin_lock_irqsave(&w90p910_gpio->gpio_lock, flags);
+       spin_lock_irqsave(&nuc900_gpio->gpio_lock, flags);
 
        regval = __raw_readl(pio);
 
@@ -81,36 +81,36 @@ static void w90p910_gpio_set(struct gpio_chip *chip, unsigned offset, int val)
 
        __raw_writel(regval, pio);
 
-       spin_unlock_irqrestore(&w90p910_gpio->gpio_lock, flags);
+       spin_unlock_irqrestore(&nuc900_gpio->gpio_lock, flags);
 }
 
-static int w90p910_dir_input(struct gpio_chip *chip, unsigned offset)
+static int nuc900_dir_input(struct gpio_chip *chip, unsigned offset)
 {
-       struct w90p910_gpio_chip *w90p910_gpio = to_w90p910_gpio_chip(chip);
-       void __iomem *pio = w90p910_gpio->regbase + GPIO_DIR;
+       struct nuc900_gpio_chip *nuc900_gpio = to_nuc900_gpio_chip(chip);
+       void __iomem *pio = nuc900_gpio->regbase + GPIO_DIR;
        unsigned int regval;
        unsigned long flags;
 
-       spin_lock_irqsave(&w90p910_gpio->gpio_lock, flags);
+       spin_lock_irqsave(&nuc900_gpio->gpio_lock, flags);
 
        regval = __raw_readl(pio);
        regval &= ~GPIO_GPIO(offset);
        __raw_writel(regval, pio);
 
-       spin_unlock_irqrestore(&w90p910_gpio->gpio_lock, flags);
+       spin_unlock_irqrestore(&nuc900_gpio->gpio_lock, flags);
 
        return 0;
 }
 
-static int w90p910_dir_output(struct gpio_chip *chip, unsigned offset, int val)
+static int nuc900_dir_output(struct gpio_chip *chip, unsigned offset, int val)
 {
-       struct w90p910_gpio_chip *w90p910_gpio = to_w90p910_gpio_chip(chip);
-       void __iomem *outreg = w90p910_gpio->regbase + GPIO_OUT;
-       void __iomem *pio = w90p910_gpio->regbase + GPIO_DIR;
+       struct nuc900_gpio_chip *nuc900_gpio = to_nuc900_gpio_chip(chip);
+       void __iomem *outreg = nuc900_gpio->regbase + GPIO_OUT;
+       void __iomem *pio = nuc900_gpio->regbase + GPIO_DIR;
        unsigned int regval;
        unsigned long flags;
 
-       spin_lock_irqsave(&w90p910_gpio->gpio_lock, flags);
+       spin_lock_irqsave(&nuc900_gpio->gpio_lock, flags);
 
        regval = __raw_readl(pio);
        regval |= GPIO_GPIO(offset);
@@ -125,28 +125,28 @@ static int w90p910_dir_output(struct gpio_chip *chip, unsigned offset, int val)
 
        __raw_writel(regval, outreg);
 
-       spin_unlock_irqrestore(&w90p910_gpio->gpio_lock, flags);
+       spin_unlock_irqrestore(&nuc900_gpio->gpio_lock, flags);
 
        return 0;
 }
 
-static struct w90p910_gpio_chip w90p910_gpio[] = {
-       W90P910_GPIO_CHIP("GROUPC", 0, 16),
-       W90P910_GPIO_CHIP("GROUPD", 16, 10),
-       W90P910_GPIO_CHIP("GROUPE", 26, 14),
-       W90P910_GPIO_CHIP("GROUPF", 40, 10),
-       W90P910_GPIO_CHIP("GROUPG", 50, 17),
-       W90P910_GPIO_CHIP("GROUPH", 67, 8),
-       W90P910_GPIO_CHIP("GROUPI", 75, 17),
+static struct nuc900_gpio_chip nuc900_gpio[] = {
+       NUC900_GPIO_CHIP("GROUPC", 0, 16),
+       NUC900_GPIO_CHIP("GROUPD", 16, 10),
+       NUC900_GPIO_CHIP("GROUPE", 26, 14),
+       NUC900_GPIO_CHIP("GROUPF", 40, 10),
+       NUC900_GPIO_CHIP("GROUPG", 50, 17),
+       NUC900_GPIO_CHIP("GROUPH", 67, 8),
+       NUC900_GPIO_CHIP("GROUPI", 75, 17),
 };
 
-void __init w90p910_init_gpio(int nr_group)
+void __init nuc900_init_gpio(int nr_group)
 {
        unsigned        i;
-       struct w90p910_gpio_chip *gpio_chip;
+       struct nuc900_gpio_chip *gpio_chip;
 
        for (i = 0; i < nr_group; i++) {
-               gpio_chip = &w90p910_gpio[i];
+               gpio_chip = &nuc900_gpio[i];
                spin_lock_init(&gpio_chip->gpio_lock);
                gpio_chip->regbase = GPIO_BASE + i * GROUPINERV;
                gpiochip_add(&gpio_chip->chip);
index f10b6a8dc069aa17581c40abda1750b4e52570b8..516d6b477b6147c75614eb329f79fe4b13171b0f 100644 (file)
 #define REG_CLKEN1     (CLK_BA + 0x24)
 #define REG_CLKDIV1    (CLK_BA + 0x28)
 
+/* Define PLL freq setting */
+#define PLL_DISABLE            0x12B63
+#define        PLL_66MHZ               0x2B63
+#define        PLL_100MHZ              0x4F64
+#define PLL_120MHZ             0x4F63
+#define        PLL_166MHZ              0x4124
+#define        PLL_200MHZ              0x4F24
+
+/* Define AHB:CPUFREQ ratio */
+#define        AHB_CPUCLK_1_1          0x00
+#define        AHB_CPUCLK_1_2          0x01
+#define        AHB_CPUCLK_1_4          0x02
+#define        AHB_CPUCLK_1_8          0x03
+
+/* Define APB:AHB ratio */
+#define APB_AHB_1_2            0x01
+#define APB_AHB_1_4            0x02
+#define APB_AHB_1_8            0x03
+
+/* Define clock skew */
+#define DEFAULTSKEW            0x48
+
 #endif /*  __ASM_ARCH_REGS_CLOCK_H */
diff --git a/arch/arm/mach-w90x900/include/mach/regs-ebi.h b/arch/arm/mach-w90x900/include/mach/regs-ebi.h
new file mode 100644 (file)
index 0000000..b68455e
--- /dev/null
@@ -0,0 +1,33 @@
+/*
+ * arch/arm/mach-w90x900/include/mach/regs-ebi.h
+ *
+ * Copyright (c) 2009 Nuvoton technology corporation.
+ *
+ * Wan ZongShun <mcuos.com@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation;version 2 of the License.
+ *
+ */
+
+#ifndef __ASM_ARCH_REGS_EBI_H
+#define __ASM_ARCH_REGS_EBI_H
+
+/* EBI Control Registers */
+
+#define EBI_BA         W90X900_VA_EBI
+#define REG_EBICON     (EBI_BA + 0x00)
+#define REG_ROMCON     (EBI_BA + 0x04)
+#define REG_SDCONF0    (EBI_BA + 0x08)
+#define REG_SDCONF1    (EBI_BA + 0x0C)
+#define REG_SDTIME0    (EBI_BA + 0x10)
+#define REG_SDTIME1    (EBI_BA + 0x14)
+#define REG_EXT0CON    (EBI_BA + 0x18)
+#define REG_EXT1CON    (EBI_BA + 0x1C)
+#define REG_EXT2CON    (EBI_BA + 0x20)
+#define REG_EXT3CON    (EBI_BA + 0x24)
+#define REG_EXT4CON    (EBI_BA + 0x28)
+#define REG_CKSKEW     (EBI_BA + 0x2C)
+
+#endif /*  __ASM_ARCH_REGS_EBI_H */
index 0b4fc194729c7b56fa00f299be9ba213a777c835..0ce9d8e867eb1ced029f0c27eaa961c4c9e09b7e 100644 (file)
@@ -10,8 +10,7 @@
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
+ * the Free Software Foundation;version 2 of the License.
  *
  */
 
 #include <mach/hardware.h>
 #include <mach/regs-irq.h>
 
-static void w90x900_irq_mask(unsigned int irq)
+struct group_irq {
+       unsigned long           gpen;
+       unsigned int            enabled;
+       void                    (*enable)(struct group_irq *, int enable);
+};
+
+static DEFINE_SPINLOCK(groupirq_lock);
+
+#define DEFINE_GROUP(_name, _ctrlbit, _num)                            \
+struct group_irq group_##_name = {                                     \
+               .enable         = nuc900_group_enable,                  \
+               .gpen           = ((1 << _num) - 1) << _ctrlbit,        \
+       }
+
+static void nuc900_group_enable(struct group_irq *gpirq, int enable);
+
+static DEFINE_GROUP(nirq0, 0, 4);
+static DEFINE_GROUP(nirq1, 4, 4);
+static DEFINE_GROUP(usbh, 8, 2);
+static DEFINE_GROUP(ottimer, 16, 3);
+static DEFINE_GROUP(gdma, 20, 2);
+static DEFINE_GROUP(sc, 24, 2);
+static DEFINE_GROUP(i2c, 26, 2);
+static DEFINE_GROUP(ps2, 28, 2);
+
+static int group_irq_enable(struct group_irq *group_irq)
+{
+       unsigned long flags;
+
+       spin_lock_irqsave(&groupirq_lock, flags);
+       if (group_irq->enabled++ == 0)
+               (group_irq->enable)(group_irq, 1);
+       spin_unlock_irqrestore(&groupirq_lock, flags);
+
+       return 0;
+}
+
+static void group_irq_disable(struct group_irq *group_irq)
 {
+       unsigned long flags;
+
+       WARN_ON(group_irq->enabled == 0);
+
+       spin_lock_irqsave(&groupirq_lock, flags);
+       if (--group_irq->enabled == 0)
+               (group_irq->enable)(group_irq, 0);
+       spin_unlock_irqrestore(&groupirq_lock, flags);
+}
+
+static void nuc900_group_enable(struct group_irq *gpirq, int enable)
+{
+       unsigned int groupen = gpirq->gpen;
+       unsigned long regval;
+
+       regval = __raw_readl(REG_AIC_GEN);
+
+       if (enable)
+               regval |= groupen;
+       else
+               regval &= ~groupen;
+
+       __raw_writel(regval, REG_AIC_GEN);
+}
+
+static void nuc900_irq_mask(unsigned int irq)
+{
+       struct group_irq *group_irq;
+
+       group_irq = NULL;
+
        __raw_writel(1 << irq, REG_AIC_MDCR);
+
+       switch (irq) {
+       case IRQ_GROUP0:
+               group_irq = &group_nirq0;
+               break;
+
+       case IRQ_GROUP1:
+               group_irq = &group_nirq1;
+               break;
+
+       case IRQ_USBH:
+               group_irq = &group_usbh;
+               break;
+
+       case IRQ_T_INT_GROUP:
+               group_irq = &group_ottimer;
+               break;
+
+       case IRQ_GDMAGROUP:
+               group_irq = &group_gdma;
+               break;
+
+       case IRQ_SCGROUP:
+               group_irq = &group_sc;
+               break;
+
+       case IRQ_I2CGROUP:
+               group_irq = &group_i2c;
+               break;
+
+       case IRQ_P2SGROUP:
+               group_irq = &group_ps2;
+               break;
+       }
+
+       if (group_irq)
+               group_irq_disable(group_irq);
 }
 
 /*
@@ -39,37 +143,71 @@ static void w90x900_irq_mask(unsigned int irq)
  * to REG_AIC_EOSCR for ACK
  */
 
-static void w90x900_irq_ack(unsigned int irq)
+static void nuc900_irq_ack(unsigned int irq)
 {
        __raw_writel(0x01, REG_AIC_EOSCR);
 }
 
-static void w90x900_irq_unmask(unsigned int irq)
+static void nuc900_irq_unmask(unsigned int irq)
 {
-       unsigned long mask;
+       struct group_irq *group_irq;
+
+       group_irq = NULL;
 
-       if (irq == IRQ_T_INT_GROUP) {
-               mask = __raw_readl(REG_AIC_GEN);
-               __raw_writel(TIME_GROUP_IRQ | mask, REG_AIC_GEN);
-               __raw_writel(1 << IRQ_T_INT_GROUP, REG_AIC_MECR);
-       }
        __raw_writel(1 << irq, REG_AIC_MECR);
+
+       switch (irq) {
+       case IRQ_GROUP0:
+               group_irq = &group_nirq0;
+               break;
+
+       case IRQ_GROUP1:
+               group_irq = &group_nirq1;
+               break;
+
+       case IRQ_USBH:
+               group_irq = &group_usbh;
+               break;
+
+       case IRQ_T_INT_GROUP:
+               group_irq = &group_ottimer;
+               break;
+
+       case IRQ_GDMAGROUP:
+               group_irq = &group_gdma;
+               break;
+
+       case IRQ_SCGROUP:
+               group_irq = &group_sc;
+               break;
+
+       case IRQ_I2CGROUP:
+               group_irq = &group_i2c;
+               break;
+
+       case IRQ_P2SGROUP:
+               group_irq = &group_ps2;
+               break;
+       }
+
+       if (group_irq)
+               group_irq_enable(group_irq);
 }
 
-static struct irq_chip w90x900_irq_chip = {
-       .ack       = w90x900_irq_ack,
-       .mask      = w90x900_irq_mask,
-       .unmask    = w90x900_irq_unmask,
+static struct irq_chip nuc900_irq_chip = {
+       .ack       = nuc900_irq_ack,
+       .mask      = nuc900_irq_mask,
+       .unmask    = nuc900_irq_unmask,
 };
 
-void __init w90x900_init_irq(void)
+void __init nuc900_init_irq(void)
 {
        int irqno;
 
        __raw_writel(0xFFFFFFFE, REG_AIC_MDCR);
 
        for (irqno = IRQ_WDT; irqno <= IRQ_ADC; irqno++) {
-               set_irq_chip(irqno, &w90x900_irq_chip);
+               set_irq_chip(irqno, &nuc900_irq_chip);
                set_irq_handler(irqno, handle_level_irq);
                set_irq_flags(irqno, IRQF_VALID);
        }
diff --git a/arch/arm/mach-w90x900/mach-nuc910evb.c b/arch/arm/mach-w90x900/mach-nuc910evb.c
new file mode 100644 (file)
index 0000000..ec05bda
--- /dev/null
@@ -0,0 +1,44 @@
+/*
+ * linux/arch/arm/mach-w90x900/mach-nuc910evb.c
+ *
+ * Based on mach-s3c2410/mach-smdk2410.c by Jonas Dietsche
+ *
+ * Copyright (C) 2008 Nuvoton technology corporation.
+ *
+ * Wan ZongShun <mcuos.com@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation;version 2 of the License.
+ *
+ */
+
+#include <linux/platform_device.h>
+#include <asm/mach/arch.h>
+#include <asm/mach/map.h>
+#include <asm/mach-types.h>
+#include <mach/map.h>
+
+#include "nuc910.h"
+
+static void __init nuc910evb_map_io(void)
+{
+       nuc910_map_io();
+       nuc910_init_clocks();
+}
+
+static void __init nuc910evb_init(void)
+{
+       nuc910_board_init();
+}
+
+MACHINE_START(W90P910EVB, "W90P910EVB")
+       /* Maintainer: Wan ZongShun */
+       .phys_io        = W90X900_PA_UART,
+       .io_pg_offst    = (((u32)W90X900_VA_UART) >> 18) & 0xfffc,
+       .boot_params    = 0,
+       .map_io         = nuc910evb_map_io,
+       .init_irq       = nuc900_init_irq,
+       .init_machine   = nuc910evb_init,
+       .timer          = &nuc900_timer,
+MACHINE_END
diff --git a/arch/arm/mach-w90x900/mach-nuc950evb.c b/arch/arm/mach-w90x900/mach-nuc950evb.c
new file mode 100644 (file)
index 0000000..cef903b
--- /dev/null
@@ -0,0 +1,44 @@
+/*
+ * linux/arch/arm/mach-w90x900/mach-nuc950evb.c
+ *
+ * Based on mach-s3c2410/mach-smdk2410.c by Jonas Dietsche
+ *
+ * Copyright (C) 2008 Nuvoton technology corporation.
+ *
+ * Wan ZongShun <mcuos.com@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation;version 2 of the License.
+ *
+ */
+
+#include <linux/platform_device.h>
+#include <asm/mach/arch.h>
+#include <asm/mach/map.h>
+#include <asm/mach-types.h>
+#include <mach/map.h>
+
+#include "nuc950.h"
+
+static void __init nuc950evb_map_io(void)
+{
+       nuc950_map_io();
+       nuc950_init_clocks();
+}
+
+static void __init nuc950evb_init(void)
+{
+       nuc950_board_init();
+}
+
+MACHINE_START(W90P950EVB, "W90P950EVB")
+       /* Maintainer: Wan ZongShun */
+       .phys_io        = W90X900_PA_UART,
+       .io_pg_offst    = (((u32)W90X900_VA_UART) >> 18) & 0xfffc,
+       .boot_params    = 0,
+       .map_io         = nuc950evb_map_io,
+       .init_irq       = nuc900_init_irq,
+       .init_machine   = nuc950evb_init,
+       .timer          = &nuc900_timer,
+MACHINE_END
diff --git a/arch/arm/mach-w90x900/mach-nuc960evb.c b/arch/arm/mach-w90x900/mach-nuc960evb.c
new file mode 100644 (file)
index 0000000..e3a46f1
--- /dev/null
@@ -0,0 +1,44 @@
+/*
+ * linux/arch/arm/mach-w90x900/mach-nuc960evb.c
+ *
+ * Based on mach-s3c2410/mach-smdk2410.c by Jonas Dietsche
+ *
+ * Copyright (C) 2008 Nuvoton technology corporation.
+ *
+ * Wan ZongShun <mcuos.com@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation;version 2 of the License.
+ *
+ */
+
+#include <linux/platform_device.h>
+#include <asm/mach/arch.h>
+#include <asm/mach/map.h>
+#include <asm/mach-types.h>
+#include <mach/map.h>
+
+#include "nuc960.h"
+
+static void __init nuc960evb_map_io(void)
+{
+       nuc960_map_io();
+       nuc960_init_clocks();
+}
+
+static void __init nuc960evb_init(void)
+{
+       nuc960_board_init();
+}
+
+MACHINE_START(W90N960EVB, "W90N960EVB")
+       /* Maintainer: Wan ZongShun */
+       .phys_io        = W90X900_PA_UART,
+       .io_pg_offst    = (((u32)W90X900_VA_UART) >> 18) & 0xfffc,
+       .boot_params    = 0,
+       .map_io         = nuc960evb_map_io,
+       .init_irq       = nuc900_init_irq,
+       .init_machine   = nuc960evb_init,
+       .timer          = &nuc900_timer,
+MACHINE_END
diff --git a/arch/arm/mach-w90x900/mach-w90p910evb.c b/arch/arm/mach-w90x900/mach-w90p910evb.c
deleted file mode 100644 (file)
index 7a62bd3..0000000
+++ /dev/null
@@ -1,267 +0,0 @@
-/*
- * linux/arch/arm/mach-w90x900/mach-w90p910evb.c
- *
- * Based on mach-s3c2410/mach-smdk2410.c by Jonas Dietsche
- *
- * Copyright (C) 2008 Nuvoton technology corporation.
- *
- * Wan ZongShun <mcuos.com@gmail.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation;version 2 of the License.
- *
- */
-
-#include <linux/kernel.h>
-#include <linux/types.h>
-#include <linux/interrupt.h>
-#include <linux/list.h>
-#include <linux/timer.h>
-#include <linux/init.h>
-#include <linux/platform_device.h>
-#include <linux/mtd/physmap.h>
-
-#include <asm/mach/arch.h>
-#include <asm/mach/map.h>
-#include <asm/mach/irq.h>
-#include <asm/mach-types.h>
-
-#include <mach/regs-serial.h>
-#include <mach/map.h>
-
-#include "cpu.h"
-/*w90p910 evb norflash driver data */
-
-#define W90P910_FLASH_BASE     0xA0000000
-#define W90P910_FLASH_SIZE     0x400000
-
-static struct mtd_partition w90p910_flash_partitions[] = {
-       {
-               .name   =       "NOR Partition 1 for kernel (960K)",
-               .size   =       0xF0000,
-               .offset =       0x10000,
-       },
-       {
-               .name   =       "NOR Partition 2 for image (1M)",
-               .size   =       0x100000,
-               .offset =       0x100000,
-       },
-       {
-               .name   =       "NOR Partition 3 for user (2M)",
-               .size   =       0x200000,
-               .offset =       0x00200000,
-       }
-};
-
-static struct physmap_flash_data w90p910_flash_data = {
-       .width          =       2,
-       .parts          =       w90p910_flash_partitions,
-       .nr_parts       =       ARRAY_SIZE(w90p910_flash_partitions),
-};
-
-static struct resource w90p910_flash_resources[] = {
-       {
-               .start  =       W90P910_FLASH_BASE,
-               .end    =       W90P910_FLASH_BASE + W90P910_FLASH_SIZE - 1,
-               .flags  =       IORESOURCE_MEM,
-       }
-};
-
-static struct platform_device w90p910_flash_device = {
-       .name           =       "physmap-flash",
-       .id             =       0,
-       .dev            = {
-                               .platform_data = &w90p910_flash_data,
-                       },
-       .resource       =       w90p910_flash_resources,
-       .num_resources  =       ARRAY_SIZE(w90p910_flash_resources),
-};
-
-/* USB EHCI Host Controller */
-
-static struct resource w90x900_usb_ehci_resource[] = {
-       [0] = {
-               .start = W90X900_PA_USBEHCIHOST,
-               .end   = W90X900_PA_USBEHCIHOST + W90X900_SZ_USBEHCIHOST - 1,
-               .flags = IORESOURCE_MEM,
-       },
-       [1] = {
-               .start = IRQ_USBH,
-               .end   = IRQ_USBH,
-               .flags = IORESOURCE_IRQ,
-       }
-};
-
-static u64 w90x900_device_usb_ehci_dmamask = 0xffffffffUL;
-
-struct platform_device w90x900_device_usb_ehci = {
-       .name             = "w90x900-ehci",
-       .id               = -1,
-       .num_resources    = ARRAY_SIZE(w90x900_usb_ehci_resource),
-       .resource         = w90x900_usb_ehci_resource,
-       .dev              = {
-               .dma_mask = &w90x900_device_usb_ehci_dmamask,
-               .coherent_dma_mask = 0xffffffffUL
-       }
-};
-EXPORT_SYMBOL(w90x900_device_usb_ehci);
-
-/* USB OHCI Host Controller */
-
-static struct resource w90x900_usb_ohci_resource[] = {
-       [0] = {
-               .start = W90X900_PA_USBOHCIHOST,
-               .end   = W90X900_PA_USBOHCIHOST + W90X900_SZ_USBOHCIHOST - 1,
-               .flags = IORESOURCE_MEM,
-       },
-       [1] = {
-               .start = IRQ_USBH,
-               .end   = IRQ_USBH,
-               .flags = IORESOURCE_IRQ,
-       }
-};
-
-static u64 w90x900_device_usb_ohci_dmamask = 0xffffffffUL;
-struct platform_device w90x900_device_usb_ohci = {
-       .name             = "w90x900-ohci",
-       .id               = -1,
-       .num_resources    = ARRAY_SIZE(w90x900_usb_ohci_resource),
-       .resource         = w90x900_usb_ohci_resource,
-       .dev              = {
-               .dma_mask = &w90x900_device_usb_ohci_dmamask,
-               .coherent_dma_mask = 0xffffffffUL
-       }
-};
-EXPORT_SYMBOL(w90x900_device_usb_ohci);
-
-/*TouchScreen controller*/
-
-static struct resource w90x900_ts_resource[] = {
-       [0] = {
-               .start = W90X900_PA_ADC,
-               .end   = W90X900_PA_ADC + W90X900_SZ_ADC-1,
-               .flags = IORESOURCE_MEM,
-       },
-       [1] = {
-               .start = IRQ_ADC,
-               .end   = IRQ_ADC,
-               .flags = IORESOURCE_IRQ,
-       },
-};
-
-struct platform_device w90x900_device_ts = {
-       .name           = "w90x900-ts",
-       .id             = -1,
-       .resource       = w90x900_ts_resource,
-       .num_resources  = ARRAY_SIZE(w90x900_ts_resource),
-};
-EXPORT_SYMBOL(w90x900_device_ts);
-
-/* RTC controller*/
-
-static struct resource w90x900_rtc_resource[] = {
-       [0] = {
-               .start = W90X900_PA_RTC,
-               .end   = W90X900_PA_RTC + 0xff,
-               .flags = IORESOURCE_MEM,
-       },
-       [1] = {
-               .start = IRQ_RTC,
-               .end   = IRQ_RTC,
-               .flags = IORESOURCE_IRQ,
-       },
-};
-
-struct platform_device w90x900_device_rtc = {
-       .name           = "w90x900-rtc",
-       .id             = -1,
-       .num_resources  = ARRAY_SIZE(w90x900_rtc_resource),
-       .resource       = w90x900_rtc_resource,
-};
-EXPORT_SYMBOL(w90x900_device_rtc);
-
-/* KPI controller*/
-
-static struct resource w90x900_kpi_resource[] = {
-       [0] = {
-               .start = W90X900_PA_KPI,
-               .end   = W90X900_PA_KPI + W90X900_SZ_KPI - 1,
-               .flags = IORESOURCE_MEM,
-       },
-       [1] = {
-               .start = IRQ_KPI,
-               .end   = IRQ_KPI,
-               .flags = IORESOURCE_IRQ,
-       }
-
-};
-
-struct platform_device w90x900_device_kpi = {
-       .name           = "w90x900-kpi",
-       .id             = -1,
-       .num_resources  = ARRAY_SIZE(w90x900_kpi_resource),
-       .resource       = w90x900_kpi_resource,
-};
-EXPORT_SYMBOL(w90x900_device_kpi);
-
-/* USB Device (Gadget)*/
-
-static struct resource w90x900_usbgadget_resource[] = {
-       [0] = {
-               .start = W90X900_PA_USBDEV,
-               .end   = W90X900_PA_USBDEV + W90X900_SZ_USBDEV - 1,
-               .flags = IORESOURCE_MEM,
-       },
-       [1] = {
-               .start = IRQ_USBD,
-               .end   = IRQ_USBD,
-               .flags = IORESOURCE_IRQ,
-       }
-};
-
-struct platform_device w90x900_device_usbgadget = {
-       .name           = "w90x900-usbgadget",
-       .id             = -1,
-       .num_resources  = ARRAY_SIZE(w90x900_usbgadget_resource),
-       .resource       = w90x900_usbgadget_resource,
-};
-EXPORT_SYMBOL(w90x900_device_usbgadget);
-
-static struct map_desc w90p910_iodesc[] __initdata = {
-};
-
-/*Here should be your evb resourse,such as LCD*/
-
-static struct platform_device *w90p910evb_dev[] __initdata = {
-       &w90p910_serial_device,
-       &w90p910_flash_device,
-       &w90x900_device_usb_ehci,
-       &w90x900_device_usb_ohci,
-       &w90x900_device_ts,
-       &w90x900_device_rtc,
-       &w90x900_device_kpi,
-       &w90x900_device_usbgadget,
-};
-
-static void __init w90p910evb_map_io(void)
-{
-       w90p910_map_io(w90p910_iodesc, ARRAY_SIZE(w90p910_iodesc));
-       w90p910_init_clocks();
-}
-
-static void __init w90p910evb_init(void)
-{
-       platform_add_devices(w90p910evb_dev, ARRAY_SIZE(w90p910evb_dev));
-}
-
-MACHINE_START(W90P910EVB, "W90P910EVB")
-       /* Maintainer: Wan ZongShun */
-       .phys_io        = W90X900_PA_UART,
-       .io_pg_offst    = (((u32)W90X900_VA_UART) >> 18) & 0xfffc,
-       .boot_params    = 0,
-       .map_io         = w90p910evb_map_io,
-       .init_irq       = w90x900_init_irq,
-       .init_machine   = w90p910evb_init,
-       .timer          = &w90x900_timer,
-MACHINE_END
diff --git a/arch/arm/mach-w90x900/mfp-w90p910.c b/arch/arm/mach-w90x900/mfp-w90p910.c
deleted file mode 100644 (file)
index a3520fe..0000000
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * linux/arch/arm/mach-w90x900/mfp-w90p910.c
- *
- * Copyright (c) 2008 Nuvoton technology corporation
- *
- * Wan ZongShun <mcuos.com@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation;version 2 of the License.
- */
-
-#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 <linux/io.h>
-
-#include <mach/hardware.h>
-
-#define REG_MFSEL      (W90X900_VA_GCR + 0xC)
-
-#define GPSELF         (0x01 << 1)
-
-#define GPSELC         (0x03 << 2)
-#define ENKPI          (0x02 << 2)
-#define ENNAND         (0x01 << 2)
-
-#define GPSELEI0       (0x01 << 26)
-#define GPSELEI1       (0x01 << 27)
-
-static DECLARE_MUTEX(mfp_sem);
-
-void mfp_set_groupf(struct device *dev)
-{
-       unsigned long mfpen;
-       const char *dev_id;
-
-       BUG_ON(!dev);
-
-       down(&mfp_sem);
-
-       dev_id = dev_name(dev);
-
-       mfpen = __raw_readl(REG_MFSEL);
-
-       if (strcmp(dev_id, "w90p910-emc") == 0)
-               mfpen |= GPSELF;/*enable mac*/
-       else
-               mfpen &= ~GPSELF;/*GPIOF[9:0]*/
-
-       __raw_writel(mfpen, REG_MFSEL);
-
-       up(&mfp_sem);
-}
-EXPORT_SYMBOL(mfp_set_groupf);
-
-void mfp_set_groupc(struct device *dev)
-{
-       unsigned long mfpen;
-       const char *dev_id;
-
-       BUG_ON(!dev);
-
-       down(&mfp_sem);
-
-       dev_id = dev_name(dev);
-
-       mfpen = __raw_readl(REG_MFSEL);
-
-       if (strcmp(dev_id, "w90p910-lcd") == 0)
-               mfpen |= GPSELC;/*enable lcd*/
-       else if (strcmp(dev_id, "w90p910-kpi") == 0) {
-                       mfpen &= (~GPSELC);/*enable kpi*/
-                       mfpen |= ENKPI;
-               } else if (strcmp(dev_id, "w90p910-nand") == 0) {
-                               mfpen &= (~GPSELC);/*enable nand*/
-                               mfpen |= ENNAND;
-                       } else
-                               mfpen &= (~GPSELC);/*GPIOC[14:0]*/
-
-       __raw_writel(mfpen, REG_MFSEL);
-
-       up(&mfp_sem);
-}
-EXPORT_SYMBOL(mfp_set_groupc);
-
-void mfp_set_groupi(struct device *dev, int gpio)
-{
-       unsigned long mfpen;
-       const char *dev_id;
-
-       BUG_ON(!dev);
-
-       down(&mfp_sem);
-
-       dev_id = dev_name(dev);
-
-       mfpen = __raw_readl(REG_MFSEL);
-
-       if (strcmp(dev_id, "w90p910-wdog") == 0)
-               mfpen |= GPSELEI1;/*enable wdog*/
-               else if (strcmp(dev_id, "w90p910-atapi") == 0)
-                       mfpen |= GPSELEI0;/*enable atapi*/
-
-       __raw_writel(mfpen, REG_MFSEL);
-
-       up(&mfp_sem);
-}
-EXPORT_SYMBOL(mfp_set_groupi);
-
diff --git a/arch/arm/mach-w90x900/mfp.c b/arch/arm/mach-w90x900/mfp.c
new file mode 100644 (file)
index 0000000..a47dc9a
--- /dev/null
@@ -0,0 +1,158 @@
+/*
+ * linux/arch/arm/mach-w90x900/mfp.c
+ *
+ * Copyright (c) 2008 Nuvoton technology corporation
+ *
+ * Wan ZongShun <mcuos.com@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation;version 2 of the License.
+ */
+
+#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 <linux/io.h>
+
+#include <mach/hardware.h>
+
+#define REG_MFSEL      (W90X900_VA_GCR + 0xC)
+
+#define GPSELF         (0x01 << 1)
+
+#define GPSELC         (0x03 << 2)
+#define ENKPI          (0x02 << 2)
+#define ENNAND         (0x01 << 2)
+
+#define GPSELEI0       (0x01 << 26)
+#define GPSELEI1       (0x01 << 27)
+
+#define GPIOG0TO1      (0x03 << 14)
+#define GPIOG2TO3      (0x03 << 16)
+#define ENSPI          (0x0a << 14)
+#define ENI2C0         (0x01 << 14)
+#define ENI2C1         (0x01 << 16)
+
+static DEFINE_MUTEX(mfp_mutex);
+
+void mfp_set_groupf(struct device *dev)
+{
+       unsigned long mfpen;
+       const char *dev_id;
+
+       BUG_ON(!dev);
+
+       mutex_lock(&mfp_mutex);
+
+       dev_id = dev_name(dev);
+
+       mfpen = __raw_readl(REG_MFSEL);
+
+       if (strcmp(dev_id, "nuc900-emc") == 0)
+               mfpen |= GPSELF;/*enable mac*/
+       else
+               mfpen &= ~GPSELF;/*GPIOF[9:0]*/
+
+       __raw_writel(mfpen, REG_MFSEL);
+
+       mutex_unlock(&mfp_mutex);
+}
+EXPORT_SYMBOL(mfp_set_groupf);
+
+void mfp_set_groupc(struct device *dev)
+{
+       unsigned long mfpen;
+       const char *dev_id;
+
+       BUG_ON(!dev);
+
+       mutex_lock(&mfp_mutex);
+
+       dev_id = dev_name(dev);
+
+       mfpen = __raw_readl(REG_MFSEL);
+
+       if (strcmp(dev_id, "nuc900-lcd") == 0)
+               mfpen |= GPSELC;/*enable lcd*/
+       else if (strcmp(dev_id, "nuc900-kpi") == 0) {
+               mfpen &= (~GPSELC);/*enable kpi*/
+               mfpen |= ENKPI;
+       } else if (strcmp(dev_id, "nuc900-nand") == 0) {
+               mfpen &= (~GPSELC);/*enable nand*/
+               mfpen |= ENNAND;
+       } else
+               mfpen &= (~GPSELC);/*GPIOC[14:0]*/
+
+       __raw_writel(mfpen, REG_MFSEL);
+
+       mutex_unlock(&mfp_mutex);
+}
+EXPORT_SYMBOL(mfp_set_groupc);
+
+void mfp_set_groupi(struct device *dev)
+{
+       unsigned long mfpen;
+       const char *dev_id;
+
+       BUG_ON(!dev);
+
+       mutex_lock(&mfp_mutex);
+
+       dev_id = dev_name(dev);
+
+       mfpen = __raw_readl(REG_MFSEL);
+
+       mfpen &= ~GPSELEI1;/*default gpio16*/
+
+       if (strcmp(dev_id, "nuc900-wdog") == 0)
+               mfpen |= GPSELEI1;/*enable wdog*/
+       else if (strcmp(dev_id, "nuc900-atapi") == 0)
+               mfpen |= GPSELEI0;/*enable atapi*/
+       else if (strcmp(dev_id, "nuc900-keypad") == 0)
+               mfpen &= ~GPSELEI0;/*enable keypad*/
+
+       __raw_writel(mfpen, REG_MFSEL);
+
+       mutex_unlock(&mfp_mutex);
+}
+EXPORT_SYMBOL(mfp_set_groupi);
+
+void mfp_set_groupg(struct device *dev)
+{
+       unsigned long mfpen;
+       const char *dev_id;
+
+       BUG_ON(!dev);
+
+       mutex_lock(&mfp_mutex);
+
+       dev_id = dev_name(dev);
+
+       mfpen = __raw_readl(REG_MFSEL);
+
+       if (strcmp(dev_id, "nuc900-spi") == 0) {
+               mfpen &= ~(GPIOG0TO1 | GPIOG2TO3);
+               mfpen |= ENSPI;/*enable spi*/
+       } else if (strcmp(dev_id, "nuc900-i2c0") == 0) {
+               mfpen &= ~(GPIOG0TO1);
+               mfpen |= ENI2C0;/*enable i2c0*/
+       } else if (strcmp(dev_id, "nuc900-i2c1") == 0) {
+               mfpen &= ~(GPIOG2TO3);
+               mfpen |= ENI2C1;/*enable i2c1*/
+       } else {
+               mfpen &= ~(GPIOG0TO1 | GPIOG2TO3);/*GPIOG[3:0]*/
+       }
+
+       __raw_writel(mfpen, REG_MFSEL);
+
+       mutex_unlock(&mfp_mutex);
+}
+EXPORT_SYMBOL(mfp_set_groupg);
+
diff --git a/arch/arm/mach-w90x900/nuc910.c b/arch/arm/mach-w90x900/nuc910.c
new file mode 100644 (file)
index 0000000..656f03b
--- /dev/null
@@ -0,0 +1,60 @@
+/*
+ * linux/arch/arm/mach-w90x900/nuc910.c
+ *
+ * Based on linux/arch/arm/plat-s3c24xx/s3c244x.c by Ben Dooks
+ *
+ * Copyright (c) 2009 Nuvoton corporation.
+ *
+ * Wan ZongShun <mcuos.com@gmail.com>
+ *
+ * NUC910 cpu support
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation;version 2 of the License.
+ *
+ */
+
+#include <linux/platform_device.h>
+#include <asm/mach/map.h>
+#include <mach/hardware.h>
+#include "cpu.h"
+#include "clock.h"
+
+/* define specific CPU platform device */
+
+static struct platform_device *nuc910_dev[] __initdata = {
+       &nuc900_device_ts,
+       &nuc900_device_rtc,
+};
+
+/* define specific CPU platform io map */
+
+static struct map_desc nuc910evb_iodesc[] __initdata = {
+       IODESC_ENT(USBEHCIHOST),
+       IODESC_ENT(USBOHCIHOST),
+       IODESC_ENT(KPI),
+       IODESC_ENT(USBDEV),
+       IODESC_ENT(ADC),
+};
+
+/*Init NUC910 evb io*/
+
+void __init nuc910_map_io(void)
+{
+       nuc900_map_io(nuc910evb_iodesc, ARRAY_SIZE(nuc910evb_iodesc));
+}
+
+/*Init NUC910 clock*/
+
+void __init nuc910_init_clocks(void)
+{
+       nuc900_init_clocks();
+}
+
+/*Init NUC910 board info*/
+
+void __init nuc910_board_init(void)
+{
+       nuc900_board_init(nuc910_dev, ARRAY_SIZE(nuc910_dev));
+}
diff --git a/arch/arm/mach-w90x900/nuc910.h b/arch/arm/mach-w90x900/nuc910.h
new file mode 100644 (file)
index 0000000..83e9ba5
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * arch/arm/mach-w90x900/nuc910.h
+ *
+ * Copyright (c) 2008 Nuvoton corporation
+ *
+ * Header file for NUC900 CPU support
+ *
+ * Wan ZongShun <mcuos.com@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ */
+
+struct map_desc;
+struct sys_timer;
+
+/* core initialisation functions */
+
+extern void nuc900_init_irq(void);
+extern struct sys_timer nuc900_timer;
+
+/* extern file from nuc910.c */
+
+extern void nuc910_board_init(void);
+extern void nuc910_init_clocks(void);
+extern void nuc910_map_io(void);
diff --git a/arch/arm/mach-w90x900/nuc950.c b/arch/arm/mach-w90x900/nuc950.c
new file mode 100644 (file)
index 0000000..1495081
--- /dev/null
@@ -0,0 +1,54 @@
+/*
+ * linux/arch/arm/mach-w90x900/nuc950.c
+ *
+ * Based on linux/arch/arm/plat-s3c24xx/s3c244x.c by Ben Dooks
+ *
+ * Copyright (c) 2008 Nuvoton technology corporation.
+ *
+ * Wan ZongShun <mcuos.com@gmail.com>
+ *
+ * NUC950 cpu support
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation;version 2 of the License.
+ *
+ */
+
+#include <linux/platform_device.h>
+#include <asm/mach/map.h>
+#include <mach/hardware.h>
+#include "cpu.h"
+
+/* define specific CPU platform device */
+
+static struct platform_device *nuc950_dev[] __initdata = {
+       &nuc900_device_kpi,
+       &nuc900_device_fmi,
+};
+
+/* define specific CPU platform io map */
+
+static struct map_desc nuc950evb_iodesc[] __initdata = {
+};
+
+/*Init NUC950 evb io*/
+
+void __init nuc950_map_io(void)
+{
+       nuc900_map_io(nuc950evb_iodesc, ARRAY_SIZE(nuc950evb_iodesc));
+}
+
+/*Init NUC950 clock*/
+
+void __init nuc950_init_clocks(void)
+{
+       nuc900_init_clocks();
+}
+
+/*Init NUC950 board info*/
+
+void __init nuc950_board_init(void)
+{
+       nuc900_board_init(nuc950_dev, ARRAY_SIZE(nuc950_dev));
+}
diff --git a/arch/arm/mach-w90x900/nuc950.h b/arch/arm/mach-w90x900/nuc950.h
new file mode 100644 (file)
index 0000000..98a1148
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * arch/arm/mach-w90x900/nuc950.h
+ *
+ * Copyright (c) 2008 Nuvoton corporation
+ *
+ * Header file for NUC900 CPU support
+ *
+ * Wan ZongShun <mcuos.com@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ */
+
+struct map_desc;
+struct sys_timer;
+
+/* core initialisation functions */
+
+extern void nuc900_init_irq(void);
+extern struct sys_timer nuc900_timer;
+
+/* extern file from nuc950.c */
+
+extern void nuc950_board_init(void);
+extern void nuc950_init_clocks(void);
+extern void nuc950_map_io(void);
diff --git a/arch/arm/mach-w90x900/nuc960.c b/arch/arm/mach-w90x900/nuc960.c
new file mode 100644 (file)
index 0000000..8851a3a
--- /dev/null
@@ -0,0 +1,54 @@
+/*
+ * linux/arch/arm/mach-w90x900/nuc960.c
+ *
+ * Based on linux/arch/arm/plat-s3c24xx/s3c244x.c by Ben Dooks
+ *
+ * Copyright (c) 2008 Nuvoton technology corporation.
+ *
+ * Wan ZongShun <mcuos.com@gmail.com>
+ *
+ * NUC960 cpu support
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation;version 2 of the License.
+ *
+ */
+
+#include <linux/platform_device.h>
+#include <asm/mach/map.h>
+#include <mach/hardware.h>
+#include "cpu.h"
+
+/* define specific CPU platform device */
+
+static struct platform_device *nuc960_dev[] __initdata = {
+       &nuc900_device_kpi,
+       &nuc900_device_fmi,
+};
+
+/* define specific CPU platform io map */
+
+static struct map_desc nuc960evb_iodesc[] __initdata = {
+};
+
+/*Init NUC960 evb io*/
+
+void __init nuc960_map_io(void)
+{
+       nuc900_map_io(nuc960evb_iodesc, ARRAY_SIZE(nuc960evb_iodesc));
+}
+
+/*Init NUC960 clock*/
+
+void __init nuc960_init_clocks(void)
+{
+       nuc900_init_clocks();
+}
+
+/*Init NUC960 board info*/
+
+void __init nuc960_board_init(void)
+{
+       nuc900_board_init(nuc960_dev, ARRAY_SIZE(nuc960_dev));
+}
diff --git a/arch/arm/mach-w90x900/nuc960.h b/arch/arm/mach-w90x900/nuc960.h
new file mode 100644 (file)
index 0000000..f0c07cb
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * arch/arm/mach-w90x900/nuc960.h
+ *
+ * Copyright (c) 2008 Nuvoton corporation
+ *
+ * Header file for NUC900 CPU support
+ *
+ * Wan ZongShun <mcuos.com@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ */
+
+struct map_desc;
+struct sys_timer;
+
+/* core initialisation functions */
+
+extern void nuc900_init_irq(void);
+extern struct sys_timer nuc900_timer;
+
+/* extern file from nuc960.c */
+
+extern void nuc960_board_init(void);
+extern void nuc960_init_clocks(void);
+extern void nuc960_map_io(void);
index bcc838f6b3936236d68c50bc54be24f775ecb263..4128af870b41a0d343d209d6ac74ce7dc1d432ec 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Based on linux/arch/arm/plat-s3c24xx/time.c by Ben Dooks
  *
- * Copyright (c) 2008 Nuvoton technology corporation
+ * Copyright (c) 2009 Nuvoton technology corporation
  * All rights reserved.
  *
  * Wan ZongShun <mcuos.com@gmail.com>
@@ -23,6 +23,8 @@
 #include <linux/clk.h>
 #include <linux/io.h>
 #include <linux/leds.h>
+#include <linux/clocksource.h>
+#include <linux/clockchips.h>
 
 #include <asm/mach-types.h>
 #include <asm/mach/irq.h>
 #include <mach/map.h>
 #include <mach/regs-timer.h>
 
-static unsigned long w90x900_gettimeoffset(void)
+#define RESETINT       0x1f
+#define PERIOD         (0x01 << 27)
+#define ONESHOT                (0x00 << 27)
+#define COUNTEN                (0x01 << 30)
+#define INTEN          (0x01 << 29)
+
+#define TICKS_PER_SEC  100
+#define PRESCALE       0x63 /* Divider = prescale + 1 */
+
+unsigned int timer0_load;
+
+static void nuc900_clockevent_setmode(enum clock_event_mode mode,
+               struct clock_event_device *clk)
 {
+       unsigned int val;
+
+       val = __raw_readl(REG_TCSR0);
+       val &= ~(0x03 << 27);
+
+       switch (mode) {
+       case CLOCK_EVT_MODE_PERIODIC:
+               __raw_writel(timer0_load, REG_TICR0);
+               val |= (PERIOD | COUNTEN | INTEN | PRESCALE);
+               break;
+
+       case CLOCK_EVT_MODE_ONESHOT:
+               val |= (ONESHOT | COUNTEN | INTEN | PRESCALE);
+               break;
+
+       case CLOCK_EVT_MODE_UNUSED:
+       case CLOCK_EVT_MODE_SHUTDOWN:
+       case CLOCK_EVT_MODE_RESUME:
+               break;
+       }
+
+       __raw_writel(val, REG_TCSR0);
+}
+
+static int nuc900_clockevent_setnextevent(unsigned long evt,
+               struct clock_event_device *clk)
+{
+       unsigned int val;
+
+       __raw_writel(evt, REG_TICR0);
+
+       val = __raw_readl(REG_TCSR0);
+       val |= (COUNTEN | INTEN | PRESCALE);
+       __raw_writel(val, REG_TCSR0);
+
        return 0;
 }
 
+static struct clock_event_device nuc900_clockevent_device = {
+       .name           = "nuc900-timer0",
+       .shift          = 32,
+       .features       = CLOCK_EVT_MODE_PERIODIC | CLOCK_EVT_FEAT_ONESHOT,
+       .set_mode       = nuc900_clockevent_setmode,
+       .set_next_event = nuc900_clockevent_setnextevent,
+       .rating         = 300,
+};
+
 /*IRQ handler for the timer*/
 
-static irqreturn_t
-w90x900_timer_interrupt(int irq, void *dev_id)
+static irqreturn_t nuc900_timer0_interrupt(int irq, void *dev_id)
 {
-       timer_tick();
+       struct clock_event_device *evt = &nuc900_clockevent_device;
+
        __raw_writel(0x01, REG_TISR); /* clear TIF0 */
+
+       evt->event_handler(evt);
        return IRQ_HANDLED;
 }
 
-static struct irqaction w90x900_timer_irq = {
-       .name           = "w90x900 Timer Tick",
+static struct irqaction nuc900_timer0_irq = {
+       .name           = "nuc900-timer0",
        .flags          = IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL,
-       .handler        = w90x900_timer_interrupt,
+       .handler        = nuc900_timer0_interrupt,
 };
 
-/*Set up timer reg.*/
+static void __init nuc900_clockevents_init(unsigned int rate)
+{
+       nuc900_clockevent_device.mult = div_sc(rate, NSEC_PER_SEC,
+                                       nuc900_clockevent_device.shift);
+       nuc900_clockevent_device.max_delta_ns = clockevent_delta2ns(0xffffffff,
+                                       &nuc900_clockevent_device);
+       nuc900_clockevent_device.min_delta_ns = clockevent_delta2ns(0xf,
+                                       &nuc900_clockevent_device);
+       nuc900_clockevent_device.cpumask = cpumask_of(0);
 
-static void w90x900_timer_setup(void)
+       clockevents_register_device(&nuc900_clockevent_device);
+}
+
+static cycle_t nuc900_get_cycles(struct clocksource *cs)
 {
-       __raw_writel(0, REG_TCSR0);
-       __raw_writel(0, REG_TCSR1);
-       __raw_writel(0, REG_TCSR2);
-       __raw_writel(0, REG_TCSR3);
-       __raw_writel(0, REG_TCSR4);
-       __raw_writel(0x1F, REG_TISR);
-       __raw_writel(15000000/(100 * 100), REG_TICR0);
-       __raw_writel(0x68000063, REG_TCSR0);
+       return ~__raw_readl(REG_TDR1);
 }
 
-static void __init w90x900_timer_init(void)
+static struct clocksource clocksource_nuc900 = {
+       .name   = "nuc900-timer1",
+       .rating = 200,
+       .read   = nuc900_get_cycles,
+       .mask   = CLOCKSOURCE_MASK(32),
+       .shift  = 20,
+       .flags  = CLOCK_SOURCE_IS_CONTINUOUS,
+};
+
+static void __init nuc900_clocksource_init(unsigned int rate)
 {
-       w90x900_timer_setup();
-       setup_irq(IRQ_TIMER0, &w90x900_timer_irq);
+       unsigned int val;
+
+       __raw_writel(0xffffffff, REG_TICR1);
+
+       val = __raw_readl(REG_TCSR1);
+       val |= (COUNTEN | PERIOD);
+       __raw_writel(val, REG_TCSR1);
+
+       clocksource_nuc900.mult =
+               clocksource_khz2mult((rate / 1000), clocksource_nuc900.shift);
+       clocksource_register(&clocksource_nuc900);
+}
+
+static void __init nuc900_timer_init(void)
+{
+       struct clk *ck_ext = clk_get(NULL, "ext");
+       unsigned int    rate;
+
+       BUG_ON(IS_ERR(ck_ext));
+
+       rate = clk_get_rate(ck_ext);
+       clk_put(ck_ext);
+       rate = rate / (PRESCALE + 0x01);
+
+        /* set a known state */
+       __raw_writel(0x00, REG_TCSR0);
+       __raw_writel(0x00, REG_TCSR1);
+       __raw_writel(RESETINT, REG_TISR);
+       timer0_load = (rate / TICKS_PER_SEC);
+
+       setup_irq(IRQ_TIMER0, &nuc900_timer0_irq);
+
+       nuc900_clocksource_init(rate);
+       nuc900_clockevents_init(rate);
 }
 
-struct sys_timer w90x900_timer = {
-       .init           = w90x900_timer_init,
-       .offset         = w90x900_gettimeoffset,
-       .resume         = w90x900_timer_setup
+struct sys_timer nuc900_timer = {
+       .init           = nuc900_timer_init,
 };
diff --git a/arch/arm/mach-w90x900/w90p910.c b/arch/arm/mach-w90x900/w90p910.c
deleted file mode 100644 (file)
index 1c97e49..0000000
+++ /dev/null
@@ -1,136 +0,0 @@
-/*
- * linux/arch/arm/mach-w90x900/w90p910.c
- *
- * Based on linux/arch/arm/plat-s3c24xx/s3c244x.c by Ben Dooks
- *
- * Copyright (c) 2008 Nuvoton technology corporation.
- *
- * Wan ZongShun <mcuos.com@gmail.com>
- *
- * W90P910 cpu support
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation;version 2 of the License.
- *
- */
-
-#include <linux/kernel.h>
-#include <linux/types.h>
-#include <linux/interrupt.h>
-#include <linux/list.h>
-#include <linux/timer.h>
-#include <linux/init.h>
-#include <linux/platform_device.h>
-#include <linux/io.h>
-#include <linux/serial_8250.h>
-
-#include <asm/mach/arch.h>
-#include <asm/mach/map.h>
-#include <asm/mach/irq.h>
-#include <asm/irq.h>
-
-#include <mach/hardware.h>
-#include <mach/regs-serial.h>
-
-#include "cpu.h"
-#include "clock.h"
-
-/* Initial IO mappings */
-
-static struct map_desc w90p910_iodesc[] __initdata = {
-       IODESC_ENT(IRQ),
-       IODESC_ENT(GCR),
-       IODESC_ENT(UART),
-       IODESC_ENT(TIMER),
-       IODESC_ENT(EBI),
-       IODESC_ENT(USBEHCIHOST),
-       IODESC_ENT(USBOHCIHOST),
-       IODESC_ENT(ADC),
-       IODESC_ENT(RTC),
-       IODESC_ENT(KPI),
-       IODESC_ENT(USBDEV),
-       /*IODESC_ENT(LCD),*/
-};
-
-/* Initial clock declarations. */
-static DEFINE_CLK(lcd, 0);
-static DEFINE_CLK(audio, 1);
-static DEFINE_CLK(fmi, 4);
-static DEFINE_CLK(dmac, 5);
-static DEFINE_CLK(atapi, 6);
-static DEFINE_CLK(emc, 7);
-static DEFINE_CLK(usbd, 8);
-static DEFINE_CLK(usbh, 9);
-static DEFINE_CLK(g2d, 10);;
-static DEFINE_CLK(pwm, 18);
-static DEFINE_CLK(ps2, 24);
-static DEFINE_CLK(kpi, 25);
-static DEFINE_CLK(wdt, 26);
-static DEFINE_CLK(gdma, 27);
-static DEFINE_CLK(adc, 28);
-static DEFINE_CLK(usi, 29);
-
-static struct clk_lookup w90p910_clkregs[] = {
-       DEF_CLKLOOK(&clk_lcd, "w90p910-lcd", NULL),
-       DEF_CLKLOOK(&clk_audio, "w90p910-audio", NULL),
-       DEF_CLKLOOK(&clk_fmi, "w90p910-fmi", NULL),
-       DEF_CLKLOOK(&clk_dmac, "w90p910-dmac", NULL),
-       DEF_CLKLOOK(&clk_atapi, "w90p910-atapi", NULL),
-       DEF_CLKLOOK(&clk_emc, "w90p910-emc", NULL),
-       DEF_CLKLOOK(&clk_usbd, "w90p910-usbd", NULL),
-       DEF_CLKLOOK(&clk_usbh, "w90p910-usbh", NULL),
-       DEF_CLKLOOK(&clk_g2d, "w90p910-g2d", NULL),
-       DEF_CLKLOOK(&clk_pwm, "w90p910-pwm", NULL),
-       DEF_CLKLOOK(&clk_ps2, "w90p910-ps2", NULL),
-       DEF_CLKLOOK(&clk_kpi, "w90p910-kpi", NULL),
-       DEF_CLKLOOK(&clk_wdt, "w90p910-wdt", NULL),
-       DEF_CLKLOOK(&clk_gdma, "w90p910-gdma", NULL),
-       DEF_CLKLOOK(&clk_adc, "w90p910-adc", NULL),
-       DEF_CLKLOOK(&clk_usi, "w90p910-usi", NULL),
-};
-
-/* Initial serial platform data */
-
-struct plat_serial8250_port w90p910_uart_data[] = {
-       W90X900_8250PORT(UART0),
-};
-
-struct platform_device w90p910_serial_device = {
-       .name                   = "serial8250",
-       .id                     = PLAT8250_DEV_PLATFORM,
-       .dev                    = {
-               .platform_data  = w90p910_uart_data,
-       },
-};
-
-/*Init W90P910 evb io*/
-
-void __init w90p910_map_io(struct map_desc *mach_desc, int mach_size)
-{
-       unsigned long idcode = 0x0;
-
-       iotable_init(w90p910_iodesc, ARRAY_SIZE(w90p910_iodesc));
-
-       idcode = __raw_readl(W90X900PDID);
-       if (idcode != W90P910_CPUID)
-               printk(KERN_ERR "CPU type 0x%08lx is not W90P910\n", idcode);
-}
-
-/*Init W90P910 clock*/
-
-void __init w90p910_init_clocks(void)
-{
-       clks_register(w90p910_clkregs, ARRAY_SIZE(w90p910_clkregs));
-}
-
-static int __init w90p910_init_cpu(void)
-{
-       return 0;
-}
-
-static int __init w90x900_arch_init(void)
-{
-       return w90p910_init_cpu();
-}
-arch_initcall(w90x900_arch_init);
index 33026eff2aa47432265929583d1c9ba832091bd6..c8c55b46934283762bf062cb428020ece4ed5d7b 100644 (file)
@@ -12,7 +12,7 @@
 #
 #   http://www.arm.linux.org.uk/developer/machines/?action=new
 #
-# Last update: Sat Jun 20 22:28:39 2009
+# Last update: Sat Sep 12 12:00:16 2009
 #
 # machine_is_xxx       CONFIG_xxxx             MACH_TYPE_xxx           number
 #
@@ -1769,7 +1769,7 @@ mx31cicada                MACH_MX31CICADA         MX31CICADA              1777
 mi424wr                        MACH_MI424WR            MI424WR                 1778
 axs_ultrax             MACH_AXS_ULTRAX         AXS_ULTRAX              1779
 at572d940deb           MACH_AT572D940DEB       AT572D940DEB            1780
-davinci_da8xx_evm      MACH_DAVINCI_DA8XX_EVM  DAVINCI_DA8XX_EVM       1781
+davinci_da830_evm      MACH_DAVINCI_DA830_EVM  DAVINCI_DA830_EVM       1781
 ep9302                 MACH_EP9302             EP9302                  1782
 at572d940hfek          MACH_AT572D940HFEB      AT572D940HFEB           1783
 cybook3                        MACH_CYBOOK3            CYBOOK3                 1784
@@ -1962,7 +1962,7 @@ ethernut5         MACH_ETHERNUT5          ETHERNUT5               1971
 arm11                  MACH_ARM11              ARM11                   1972
 cpuat9260              MACH_CPUAT9260          CPUAT9260               1973
 cpupxa255              MACH_CPUPXA255          CPUPXA255               1974
-cpuimx27               MACH_CPUIMX27           CPUIMX27                1975
+eukrea_cpuimx27                MACH_CPUIMX27           CPUIMX27                1975
 cheflux                        MACH_CHEFLUX            CHEFLUX                 1976
 eb_cpux9k2             MACH_EB_CPUX9K2         EB_CPUX9K2              1977
 opcotec                        MACH_OPCOTEC            OPCOTEC                 1978
@@ -2249,14 +2249,14 @@ omap3_phrazer           MACH_OMAP3_PHRAZER      OMAP3_PHRAZER           2261
 darwin                 MACH_DARWIN             DARWIN                  2262
 oratiscomu             MACH_ORATISCOMU         ORATISCOMU              2263
 rtsbc20                        MACH_RTSBC20            RTSBC20                 2264
-i780                   MACH_I780               I780                    2265
+sgh_i780               MACH_I780               I780                    2265
 gemini324              MACH_GEMINI324          GEMINI324               2266
 oratislan              MACH_ORATISLAN          ORATISLAN               2267
 oratisalog             MACH_ORATISALOG         ORATISALOG              2268
 oratismadi             MACH_ORATISMADI         ORATISMADI              2269
 oratisot16             MACH_ORATISOT16         ORATISOT16              2270
 oratisdesk             MACH_ORATISDESK         ORATISDESK              2271
-v2p_ca9                        MACH_V2P_CA9            V2P_CA9                 2272
+v2_ca9                 MACH_V2P_CA9            V2P_CA9                 2272
 sintexo                        MACH_SINTEXO            SINTEXO                 2273
 cm3389                 MACH_CM3389             CM3389                  2274
 omap3_cio              MACH_OMAP3_CIO          OMAP3_CIO               2275
@@ -2280,3 +2280,132 @@ htcrhodium              MACH_HTCRHODIUM         HTCRHODIUM              2292
 htctopaz               MACH_HTCTOPAZ           HTCTOPAZ                2293
 matrix504              MACH_MATRIX504          MATRIX504               2294
 mrfsa                  MACH_MRFSA              MRFSA                   2295
+sc_p270                        MACH_SC_P270            SC_P270                 2296
+atlas5_evb             MACH_ATLAS5_EVB         ATLAS5_EVB              2297
+pelco_lobox            MACH_PELCO_LOBOX        PELCO_LOBOX             2298
+dilax_pcu200           MACH_DILAX_PCU200       DILAX_PCU200            2299
+leonardo               MACH_LEONARDO           LEONARDO                2300
+zoran_approach7                MACH_ZORAN_APPROACH7    ZORAN_APPROACH7         2301
+dp6xx                  MACH_DP6XX              DP6XX                   2302
+bcm2153_vesper         MACH_BCM2153_VESPER     BCM2153_VESPER          2303
+mahimahi               MACH_MAHIMAHI           MAHIMAHI                2304
+clickc                 MACH_CLICKC             CLICKC                  2305
+zb_gateway             MACH_ZB_GATEWAY         ZB_GATEWAY              2306
+tazcard                        MACH_TAZCARD            TAZCARD                 2307
+tazdev                 MACH_TAZDEV             TAZDEV                  2308
+annax_cb_arm           MACH_ANNAX_CB_ARM       ANNAX_CB_ARM            2309
+annax_dm3              MACH_ANNAX_DM3          ANNAX_DM3               2310
+cerebric               MACH_CEREBRIC           CEREBRIC                2311
+orca                   MACH_ORCA               ORCA                    2312
+pc9260                 MACH_PC9260             PC9260                  2313
+ems285a                        MACH_EMS285A            EMS285A                 2314
+gec2410                        MACH_GEC2410            GEC2410                 2315
+gec2440                        MACH_GEC2440            GEC2440                 2316
+mw903                  MACH_ARCH_MW903         ARCH_MW903              2317
+mw2440                 MACH_MW2440             MW2440                  2318
+ecac2378               MACH_ECAC2378           ECAC2378                2319
+tazkiosk               MACH_TAZKIOSK           TAZKIOSK                2320
+whiterabbit_mch                MACH_WHITERABBIT_MCH    WHITERABBIT_MCH         2321
+sbox9263               MACH_SBOX9263           SBOX9263                2322
+oreo                   MACH_OREO               OREO                    2323
+smdk6442               MACH_SMDK6442           SMDK6442                2324
+openrd_base            MACH_OPENRD_BASE        OPENRD_BASE             2325
+incredible             MACH_INCREDIBLE         INCREDIBLE              2326
+incrediblec            MACH_INCREDIBLEC        INCREDIBLEC             2327
+heroct                 MACH_HEROCT             HEROCT                  2328
+mmnet1000              MACH_MMNET1000          MMNET1000               2329
+devkit8000             MACH_DEVKIT8000         DEVKIT8000              2330
+devkit9000             MACH_DEVKIT9000         DEVKIT9000              2331
+mx31txtr               MACH_MX31TXTR           MX31TXTR                2332
+u380                   MACH_U380               U380                    2333
+oamp3_hualu            MACH_HUALU_BOARD        HUALU_BOARD             2334
+npcmx50                        MACH_NPCMX50            NPCMX50                 2335
+mx51_lange51           MACH_MX51_LANGE51       MX51_LANGE51            2336
+mx51_lange52           MACH_MX51_LANGE52       MX51_LANGE52            2337
+riom                   MACH_RIOM               RIOM                    2338
+comcas                 MACH_COMCAS             COMCAS                  2339
+wsi_mx27               MACH_WSI_MX27           WSI_MX27                2340
+cm_t35                 MACH_CM_T35             CM_T35                  2341
+net2big                        MACH_NET2BIG            NET2BIG                 2342
+motorola_a1600         MACH_MOTOROLA_A1600     MOTOROLA_A1600          2343
+igep0020               MACH_IGEP0020           IGEP0020                2344
+igep0010               MACH_IGEP0010           IGEP0010                2345
+mv6281gtwge2           MACH_MV6281GTWGE2       MV6281GTWGE2            2346
+scat100                        MACH_SCAT100            SCAT100                 2347
+sanmina                        MACH_SANMINA            SANMINA                 2348
+momento                        MACH_MOMENTO            MOMENTO                 2349
+nuc9xx                 MACH_NUC9XX             NUC9XX                  2350
+nuc910evb              MACH_NUC910EVB          NUC910EVB               2351
+nuc920evb              MACH_NUC920EVB          NUC920EVB               2352
+nuc950evb              MACH_NUC950EVB          NUC950EVB               2353
+nuc945evb              MACH_NUC945EVB          NUC945EVB               2354
+nuc960evb              MACH_NUC960EVB          NUC960EVB               2355
+nuc932evb              MACH_NUC932EVB          NUC932EVB               2356
+nuc900                 MACH_NUC900             NUC900                  2357
+sd1soc                 MACH_SD1SOC             SD1SOC                  2358
+ln2440bc               MACH_LN2440BC           LN2440BC                2359
+rsbc                   MACH_RSBC               RSBC                    2360
+openrd_client          MACH_OPENRD_CLIENT      OPENRD_CLIENT           2361
+hpipaq11x              MACH_HPIPAQ11X          HPIPAQ11X               2362
+wayland                        MACH_WAYLAND            WAYLAND                 2363
+acnbsx102              MACH_ACNBSX102          ACNBSX102               2364
+hwat91                 MACH_HWAT91             HWAT91                  2365
+at91sam9263cs          MACH_AT91SAM9263CS      AT91SAM9263CS           2366
+csb732                 MACH_CSB732             CSB732                  2367
+u8500                  MACH_U8500              U8500                   2368
+huqiu                  MACH_HUQIU              HUQIU                   2369
+mx51_kunlun            MACH_MX51_KUNLUN        MX51_KUNLUN             2370
+pmt1g                  MACH_PMT1G              PMT1G                   2371
+htcelf                 MACH_HTCELF             HTCELF                  2372
+armadillo420           MACH_ARMADILLO420       ARMADILLO420            2373
+armadillo440           MACH_ARMADILLO440       ARMADILLO440            2374
+u_chip_dual_arm                MACH_U_CHIP_DUAL_ARM    U_CHIP_DUAL_ARM         2375
+csr_bdb3               MACH_CSR_BDB3           CSR_BDB3                2376
+dolby_cat1018          MACH_DOLBY_CAT1018      DOLBY_CAT1018           2377
+hy9307                 MACH_HY9307             HY9307                  2378
+aspire_easystore       MACH_A_ES               A_ES                    2379
+davinci_irif           MACH_DAVINCI_IRIF       DAVINCI_IRIF            2380
+agama9263              MACH_AGAMA9263          AGAMA9263               2381
+marvell_jasper         MACH_MARVELL_JASPER     MARVELL_JASPER          2382
+flint                  MACH_FLINT              FLINT                   2383
+tavorevb3              MACH_TAVOREVB3          TAVOREVB3               2384
+sch_m490               MACH_SCH_M490           SCH_M490                2386
+rbl01                  MACH_RBL01              RBL01                   2387
+omnifi                 MACH_OMNIFI             OMNIFI                  2388
+otavalo                        MACH_OTAVALO            OTAVALO                 2389
+sienna                 MACH_SIENNA             SIENNA                  2390
+htc_excalibur_s620     MACH_HTC_EXCALIBUR_S620 HTC_EXCALIBUR_S620      2391
+htc_opal               MACH_HTC_OPAL           HTC_OPAL                2392
+touchbook              MACH_TOUCHBOOK          TOUCHBOOK               2393
+latte                  MACH_LATTE              LATTE                   2394
+xa200                  MACH_XA200              XA200                   2395
+nimrod                 MACH_NIMROD             NIMROD                  2396
+cc9p9215_3g            MACH_CC9P9215_3G        CC9P9215_3G             2397
+cc9p9215_3gjs          MACH_CC9P9215_3GJS      CC9P9215_3GJS           2398
+tk71                   MACH_TK71               TK71                    2399
+comham3525             MACH_COMHAM3525         COMHAM3525              2400
+mx31erebus             MACH_MX31EREBUS         MX31EREBUS              2401
+mcardmx27              MACH_MCARDMX27          MCARDMX27               2402
+paradise               MACH_PARADISE           PARADISE                2403
+tide                   MACH_TIDE               TIDE                    2404
+wzl2440                        MACH_WZL2440            WZL2440                 2405
+sdrdemo                        MACH_SDRDEMO            SDRDEMO                 2406
+ethercan2              MACH_ETHERCAN2          ETHERCAN2               2407
+ecmimg20               MACH_ECMIMG20           ECMIMG20                2408
+omap_dragon            MACH_OMAP_DRAGON        OMAP_DRAGON             2409
+halo                   MACH_HALO               HALO                    2410
+huangshan              MACH_HUANGSHAN          HUANGSHAN               2411
+vl_ma2sc               MACH_VL_MA2SC           VL_MA2SC                2412
+raumfeld_rc            MACH_RAUMFELD_RC        RAUMFELD_RC             2413
+raumfeld_connector     MACH_RAUMFELD_CONNECTOR RAUMFELD_CONNECTOR      2414
+raumfeld_speaker       MACH_RAUMFELD_SPEAKER   RAUMFELD_SPEAKER        2415
+multibus_master                MACH_MULTIBUS_MASTER    MULTIBUS_MASTER         2416
+multibus_pbk           MACH_MULTIBUS_PBK       MULTIBUS_PBK            2417
+tnetv107x              MACH_TNETV107X          TNETV107X               2418
+snake                  MACH_SNAKE              SNAKE                   2419
+cwmx27                 MACH_CWMX27             CWMX27                  2420
+sch_m480               MACH_SCH_M480           SCH_M480                2421
+platypus               MACH_PLATYPUS           PLATYPUS                2422
+pss2                   MACH_PSS2               PSS2                    2423
+davinci_apm150         MACH_DAVINCI_APM150     DAVINCI_APM150          2424
+str9100                        MACH_STR9100            STR9100                 2425
index 246650673010594d08c139551da1973318f78685..f60b2b6a0931d7d7279bfbfe7d29b3ac7ce6efea 100644 (file)
@@ -204,6 +204,7 @@ static void amba_device_release(struct device *dev)
 int amba_device_register(struct amba_device *dev, struct resource *parent)
 {
        u32 pid, cid;
+       u32 size;
        void __iomem *tmp;
        int i, ret;
 
@@ -229,16 +230,25 @@ int amba_device_register(struct amba_device *dev, struct resource *parent)
        if (ret)
                goto err_out;
 
-       tmp = ioremap(dev->res.start, SZ_4K);
+       /*
+        * Dynamically calculate the size of the resource
+        * and use this for iomap
+        */
+       size = resource_size(&dev->res);
+       tmp = ioremap(dev->res.start, size);
        if (!tmp) {
                ret = -ENOMEM;
                goto err_release;
        }
 
+       /*
+        * Read pid and cid based on size of resource
+        * they are located at end of region
+        */
        for (pid = 0, i = 0; i < 4; i++)
-               pid |= (readl(tmp + 0xfe0 + 4 * i) & 255) << (i * 8);
+               pid |= (readl(tmp + size - 0x20 + 4 * i) & 255) << (i * 8);
        for (cid = 0, i = 0; i < 4; i++)
-               cid |= (readl(tmp + 0xff0 + 4 * i) & 255) << (i * 8);
+               cid |= (readl(tmp + size - 0x10 + 4 * i) & 255) << (i * 8);
 
        iounmap(tmp);
 
@@ -353,11 +363,14 @@ amba_find_device(const char *busid, struct device *parent, unsigned int id,
 int amba_request_regions(struct amba_device *dev, const char *name)
 {
        int ret = 0;
+       u32 size;
 
        if (!name)
                name = dev->dev.driver->name;
 
-       if (!request_mem_region(dev->res.start, SZ_4K, name))
+       size = resource_size(&dev->res);
+
+       if (!request_mem_region(dev->res.start, size, name))
                ret = -EBUSY;
 
        return ret;
@@ -371,7 +384,10 @@ int amba_request_regions(struct amba_device *dev, const char *name)
  */
 void amba_release_regions(struct amba_device *dev)
 {
-       release_mem_region(dev->res.start, SZ_4K);
+       u32 size;
+
+       size = resource_size(&dev->res);
+       release_mem_region(dev->res.start, size);
 }
 
 EXPORT_SYMBOL(amba_driver_register);
index 6071f5882572e2659ec77eae1a7f4d62554cd2fc..937dfe4e9b12a25db1adacac19be628f686944ab 100644 (file)
@@ -326,7 +326,7 @@ static struct platform_driver w90x900ts_driver = {
        .probe          = w90x900ts_probe,
        .remove         = __devexit_p(w90x900ts_remove),
        .driver         = {
-               .name   = "w90x900-ts",
+               .name   = "nuc900-ts",
                .owner  = THIS_MODULE,
        },
 };
@@ -347,4 +347,4 @@ module_exit(w90x900ts_exit);
 MODULE_AUTHOR("Wan ZongShun <mcuos.com@gmail.com>");
 MODULE_DESCRIPTION("w90p910 touch screen driver!");
 MODULE_LICENSE("GPL");
-MODULE_ALIAS("platform:w90p910-ts");
+MODULE_ALIAS("platform:nuc900-ts");
index 68ab39d7cb3586eaf0260ba14e71b4b16efa0595..df1f86b5c83e417586f96f707aadfa3acd397aa9 100644 (file)
@@ -233,6 +233,19 @@ config ISL29003
          This driver can also be built as a module.  If so, the module
          will be called isl29003.
 
+config EP93XX_PWM
+       tristate "EP93xx PWM support"
+       depends on ARCH_EP93XX
+       help
+         This option enables device driver support for the PWM channels
+         on the Cirrus EP93xx processors.  The EP9307 chip only has one
+         PWM channel all the others have two, the second channel is an
+         alternate function of the EGPIO14 pin.  A sysfs interface is
+         provided to control the PWM channels.
+
+         To compile this driver as a module, choose M here: the module will
+         be called ep93xx_pwm.
+
 source "drivers/misc/c2port/Kconfig"
 source "drivers/misc/eeprom/Kconfig"
 source "drivers/misc/cb710/Kconfig"
index 36f733cd60e65fe772c10a0fd75ee1ba5defbb6a..f982d2ecfde7c16f56f2fdb50cb8640d43b1b627 100644 (file)
@@ -19,6 +19,7 @@ obj-$(CONFIG_SGI_XP)          += sgi-xp/
 obj-$(CONFIG_SGI_GRU)          += sgi-gru/
 obj-$(CONFIG_HP_ILO)           += hpilo.o
 obj-$(CONFIG_ISL29003)         += isl29003.o
+obj-$(CONFIG_EP93XX_PWM)       += ep93xx_pwm.o
 obj-$(CONFIG_C2PORT)           += c2port/
 obj-y                          += eeprom/
 obj-y                          += cb710/
diff --git a/drivers/misc/ep93xx_pwm.c b/drivers/misc/ep93xx_pwm.c
new file mode 100644 (file)
index 0000000..ba46941
--- /dev/null
@@ -0,0 +1,384 @@
+/*
+ *  Simple PWM driver for EP93XX
+ *
+ *     (c) Copyright 2009  Matthieu Crapet <mcrapet@gmail.com>
+ *     (c) Copyright 2009  H Hartley Sweeten <hsweeten@visionengravers.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.
+ *
+ *  EP9307 has only one channel:
+ *    - PWMOUT
+ *
+ *  EP9301/02/12/15 have two channels:
+ *    - PWMOUT
+ *    - PWMOUT1 (alternate function for EGPIO14)
+ */
+
+#include <linux/module.h>
+#include <linux/platform_device.h>
+#include <linux/clk.h>
+#include <linux/err.h>
+#include <linux/io.h>
+
+#include <mach/platform.h>
+
+#define EP93XX_PWMx_TERM_COUNT 0x00
+#define EP93XX_PWMx_DUTY_CYCLE 0x04
+#define EP93XX_PWMx_ENABLE     0x08
+#define EP93XX_PWMx_INVERT     0x0C
+
+#define EP93XX_PWM_MAX_COUNT   0xFFFF
+
+struct ep93xx_pwm {
+       void __iomem    *mmio_base;
+       struct clk      *clk;
+       u32             duty_percent;
+};
+
+static inline void ep93xx_pwm_writel(struct ep93xx_pwm *pwm,
+               unsigned int val, unsigned int off)
+{
+       __raw_writel(val, pwm->mmio_base + off);
+}
+
+static inline unsigned int ep93xx_pwm_readl(struct ep93xx_pwm *pwm,
+               unsigned int off)
+{
+       return __raw_readl(pwm->mmio_base + off);
+}
+
+static inline void ep93xx_pwm_write_tc(struct ep93xx_pwm *pwm, u16 value)
+{
+       ep93xx_pwm_writel(pwm, value, EP93XX_PWMx_TERM_COUNT);
+}
+
+static inline u16 ep93xx_pwm_read_tc(struct ep93xx_pwm *pwm)
+{
+       return ep93xx_pwm_readl(pwm, EP93XX_PWMx_TERM_COUNT);
+}
+
+static inline void ep93xx_pwm_write_dc(struct ep93xx_pwm *pwm, u16 value)
+{
+       ep93xx_pwm_writel(pwm, value, EP93XX_PWMx_DUTY_CYCLE);
+}
+
+static inline void ep93xx_pwm_enable(struct ep93xx_pwm *pwm)
+{
+       ep93xx_pwm_writel(pwm, 0x1, EP93XX_PWMx_ENABLE);
+}
+
+static inline void ep93xx_pwm_disable(struct ep93xx_pwm *pwm)
+{
+       ep93xx_pwm_writel(pwm, 0x0, EP93XX_PWMx_ENABLE);
+}
+
+static inline int ep93xx_pwm_is_enabled(struct ep93xx_pwm *pwm)
+{
+       return ep93xx_pwm_readl(pwm, EP93XX_PWMx_ENABLE) & 0x1;
+}
+
+static inline void ep93xx_pwm_invert(struct ep93xx_pwm *pwm)
+{
+       ep93xx_pwm_writel(pwm, 0x1, EP93XX_PWMx_INVERT);
+}
+
+static inline void ep93xx_pwm_normal(struct ep93xx_pwm *pwm)
+{
+       ep93xx_pwm_writel(pwm, 0x0, EP93XX_PWMx_INVERT);
+}
+
+static inline int ep93xx_pwm_is_inverted(struct ep93xx_pwm *pwm)
+{
+       return ep93xx_pwm_readl(pwm, EP93XX_PWMx_INVERT) & 0x1;
+}
+
+/*
+ * /sys/devices/platform/ep93xx-pwm.N
+ *   /min_freq      read-only   minimum pwm output frequency
+ *   /max_req       read-only   maximum pwm output frequency
+ *   /freq          read-write  pwm output frequency (0 = disable output)
+ *   /duty_percent  read-write  pwm duty cycle percent (1..99)
+ *   /invert        read-write  invert pwm output
+ */
+
+static ssize_t ep93xx_pwm_get_min_freq(struct device *dev,
+               struct device_attribute *attr, char *buf)
+{
+       struct platform_device *pdev = to_platform_device(dev);
+       struct ep93xx_pwm *pwm = platform_get_drvdata(pdev);
+       unsigned long rate = clk_get_rate(pwm->clk);
+
+       return sprintf(buf, "%ld\n", rate / (EP93XX_PWM_MAX_COUNT + 1));
+}
+
+static ssize_t ep93xx_pwm_get_max_freq(struct device *dev,
+               struct device_attribute *attr, char *buf)
+{
+       struct platform_device *pdev = to_platform_device(dev);
+       struct ep93xx_pwm *pwm = platform_get_drvdata(pdev);
+       unsigned long rate = clk_get_rate(pwm->clk);
+
+       return sprintf(buf, "%ld\n", rate / 2);
+}
+
+static ssize_t ep93xx_pwm_get_freq(struct device *dev,
+               struct device_attribute *attr, char *buf)
+{
+       struct platform_device *pdev = to_platform_device(dev);
+       struct ep93xx_pwm *pwm = platform_get_drvdata(pdev);
+
+       if (ep93xx_pwm_is_enabled(pwm)) {
+               unsigned long rate = clk_get_rate(pwm->clk);
+               u16 term = ep93xx_pwm_read_tc(pwm);
+
+               return sprintf(buf, "%ld\n", rate / (term + 1));
+       } else {
+               return sprintf(buf, "disabled\n");
+       }
+}
+
+static ssize_t ep93xx_pwm_set_freq(struct device *dev,
+               struct device_attribute *attr, const char *buf, size_t count)
+{
+       struct platform_device *pdev = to_platform_device(dev);
+       struct ep93xx_pwm *pwm = platform_get_drvdata(pdev);
+       long val;
+       int err;
+
+       err = strict_strtol(buf, 10, &val);
+       if (err)
+               return -EINVAL;
+
+       if (val == 0) {
+               ep93xx_pwm_disable(pwm);
+       } else if (val <= (clk_get_rate(pwm->clk) / 2)) {
+               u32 term, duty;
+
+               val = (clk_get_rate(pwm->clk) / val) - 1;
+               if (val > EP93XX_PWM_MAX_COUNT)
+                       val = EP93XX_PWM_MAX_COUNT;
+               if (val < 1)
+                       val = 1;
+
+               term = ep93xx_pwm_read_tc(pwm);
+               duty = ((val + 1) * pwm->duty_percent / 100) - 1;
+
+               /* If pwm is running, order is important */
+               if (val > term) {
+                       ep93xx_pwm_write_tc(pwm, val);
+                       ep93xx_pwm_write_dc(pwm, duty);
+               } else {
+                       ep93xx_pwm_write_dc(pwm, duty);
+                       ep93xx_pwm_write_tc(pwm, val);
+               }
+
+               if (!ep93xx_pwm_is_enabled(pwm))
+                       ep93xx_pwm_enable(pwm);
+       } else {
+               return -EINVAL;
+       }
+
+       return count;
+}
+
+static ssize_t ep93xx_pwm_get_duty_percent(struct device *dev,
+               struct device_attribute *attr, char *buf)
+{
+       struct platform_device *pdev = to_platform_device(dev);
+       struct ep93xx_pwm *pwm = platform_get_drvdata(pdev);
+
+       return sprintf(buf, "%d\n", pwm->duty_percent);
+}
+
+static ssize_t ep93xx_pwm_set_duty_percent(struct device *dev,
+               struct device_attribute *attr, const char *buf, size_t count)
+{
+       struct platform_device *pdev = to_platform_device(dev);
+       struct ep93xx_pwm *pwm = platform_get_drvdata(pdev);
+       long val;
+       int err;
+
+       err = strict_strtol(buf, 10, &val);
+       if (err)
+               return -EINVAL;
+
+       if (val > 0 && val < 100) {
+               u32 term = ep93xx_pwm_read_tc(pwm);
+               ep93xx_pwm_write_dc(pwm, ((term + 1) * val / 100) - 1);
+               pwm->duty_percent = val;
+               return count;
+       }
+
+       return -EINVAL;
+}
+
+static ssize_t ep93xx_pwm_get_invert(struct device *dev,
+               struct device_attribute *attr, char *buf)
+{
+       struct platform_device *pdev = to_platform_device(dev);
+       struct ep93xx_pwm *pwm = platform_get_drvdata(pdev);
+
+       return sprintf(buf, "%d\n", ep93xx_pwm_is_inverted(pwm));
+}
+
+static ssize_t ep93xx_pwm_set_invert(struct device *dev,
+               struct device_attribute *attr, const char *buf, size_t count)
+{
+       struct platform_device *pdev = to_platform_device(dev);
+       struct ep93xx_pwm *pwm = platform_get_drvdata(pdev);
+       long val;
+       int err;
+
+       err = strict_strtol(buf, 10, &val);
+       if (err)
+               return -EINVAL;
+
+       if (val == 0)
+               ep93xx_pwm_normal(pwm);
+       else if (val == 1)
+               ep93xx_pwm_invert(pwm);
+       else
+               return -EINVAL;
+
+       return count;
+}
+
+static DEVICE_ATTR(min_freq, S_IRUGO, ep93xx_pwm_get_min_freq, NULL);
+static DEVICE_ATTR(max_freq, S_IRUGO, ep93xx_pwm_get_max_freq, NULL);
+static DEVICE_ATTR(freq, S_IWUGO | S_IRUGO,
+                  ep93xx_pwm_get_freq, ep93xx_pwm_set_freq);
+static DEVICE_ATTR(duty_percent, S_IWUGO | S_IRUGO,
+                  ep93xx_pwm_get_duty_percent, ep93xx_pwm_set_duty_percent);
+static DEVICE_ATTR(invert, S_IWUGO | S_IRUGO,
+                  ep93xx_pwm_get_invert, ep93xx_pwm_set_invert);
+
+static struct attribute *ep93xx_pwm_attrs[] = {
+       &dev_attr_min_freq.attr,
+       &dev_attr_max_freq.attr,
+       &dev_attr_freq.attr,
+       &dev_attr_duty_percent.attr,
+       &dev_attr_invert.attr,
+       NULL
+};
+
+static const struct attribute_group ep93xx_pwm_sysfs_files = {
+       .attrs  = ep93xx_pwm_attrs,
+};
+
+static int __init ep93xx_pwm_probe(struct platform_device *pdev)
+{
+       struct ep93xx_pwm *pwm;
+       struct resource *res;
+       int err;
+
+       err = ep93xx_pwm_acquire_gpio(pdev);
+       if (err)
+               return err;
+
+       pwm = kzalloc(sizeof(struct ep93xx_pwm), GFP_KERNEL);
+       if (!pwm) {
+               err = -ENOMEM;
+               goto fail_no_mem;
+       }
+
+       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       if (res == NULL) {
+               err = -ENXIO;
+               goto fail_no_mem_resource;
+       }
+
+       res = request_mem_region(res->start, resource_size(res), pdev->name);
+       if (res == NULL) {
+               err = -EBUSY;
+               goto fail_no_mem_resource;
+       }
+
+       pwm->mmio_base = ioremap(res->start, resource_size(res));
+       if (pwm->mmio_base == NULL) {
+               err = -ENXIO;
+               goto fail_no_ioremap;
+       }
+
+       err = sysfs_create_group(&pdev->dev.kobj, &ep93xx_pwm_sysfs_files);
+       if (err)
+               goto fail_no_sysfs;
+
+       pwm->clk = clk_get(&pdev->dev, "pwm_clk");
+       if (IS_ERR(pwm->clk)) {
+               err = PTR_ERR(pwm->clk);
+               goto fail_no_clk;
+       }
+
+       pwm->duty_percent = 50;
+
+       platform_set_drvdata(pdev, pwm);
+
+       /* disable pwm at startup. Avoids zero value. */
+       ep93xx_pwm_disable(pwm);
+       ep93xx_pwm_write_tc(pwm, EP93XX_PWM_MAX_COUNT);
+       ep93xx_pwm_write_dc(pwm, EP93XX_PWM_MAX_COUNT / 2);
+
+       clk_enable(pwm->clk);
+
+       return 0;
+
+fail_no_clk:
+       sysfs_remove_group(&pdev->dev.kobj, &ep93xx_pwm_sysfs_files);
+fail_no_sysfs:
+       iounmap(pwm->mmio_base);
+fail_no_ioremap:
+       release_mem_region(res->start, resource_size(res));
+fail_no_mem_resource:
+       kfree(pwm);
+fail_no_mem:
+       ep93xx_pwm_release_gpio(pdev);
+       return err;
+}
+
+static int __exit ep93xx_pwm_remove(struct platform_device *pdev)
+{
+       struct ep93xx_pwm *pwm = platform_get_drvdata(pdev);
+       struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+
+       ep93xx_pwm_disable(pwm);
+       clk_disable(pwm->clk);
+       clk_put(pwm->clk);
+       platform_set_drvdata(pdev, NULL);
+       sysfs_remove_group(&pdev->dev.kobj, &ep93xx_pwm_sysfs_files);
+       iounmap(pwm->mmio_base);
+       release_mem_region(res->start, resource_size(res));
+       kfree(pwm);
+       ep93xx_pwm_release_gpio(pdev);
+
+       return 0;
+}
+
+static struct platform_driver ep93xx_pwm_driver = {
+       .driver         = {
+               .name   = "ep93xx-pwm",
+               .owner  = THIS_MODULE,
+       },
+       .remove         = __exit_p(ep93xx_pwm_remove),
+};
+
+static int __init ep93xx_pwm_init(void)
+{
+       return platform_driver_probe(&ep93xx_pwm_driver, ep93xx_pwm_probe);
+}
+
+static void __exit ep93xx_pwm_exit(void)
+{
+       platform_driver_unregister(&ep93xx_pwm_driver);
+}
+
+module_init(ep93xx_pwm_init);
+module_exit(ep93xx_pwm_exit);
+
+MODULE_AUTHOR("Matthieu Crapet <mcrapet@gmail.com>, "
+             "H Hartley Sweeten <hsweeten@visionengravers.com>");
+MODULE_DESCRIPTION("EP93xx PWM driver");
+MODULE_LICENSE("GPL");
+MODULE_ALIAS("platform:ep93xx-pwm");
index e1aa8471ab1c31ca31a0d7ad48bee0eb5187a46c..a923ee27c09eb38f76a862fdda7280e58e6aa765 100644 (file)
@@ -21,6 +21,7 @@
 #include <linux/amba/bus.h>
 #include <linux/clk.h>
 #include <linux/scatterlist.h>
+#include <linux/gpio.h>
 
 #include <asm/cacheflush.h>
 #include <asm/div64.h>
@@ -472,17 +473,41 @@ static void mmci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
        }
 }
 
+static int mmci_get_ro(struct mmc_host *mmc)
+{
+       struct mmci_host *host = mmc_priv(mmc);
+
+       if (host->gpio_wp == -ENOSYS)
+               return -ENOSYS;
+
+       return gpio_get_value(host->gpio_wp);
+}
+
+static int mmci_get_cd(struct mmc_host *mmc)
+{
+       struct mmci_host *host = mmc_priv(mmc);
+       unsigned int status;
+
+       if (host->gpio_cd == -ENOSYS)
+               status = host->plat->status(mmc_dev(host->mmc));
+       else
+               status = gpio_get_value(host->gpio_cd);
+
+       return !status;
+}
+
 static const struct mmc_host_ops mmci_ops = {
        .request        = mmci_request,
        .set_ios        = mmci_set_ios,
+       .get_ro         = mmci_get_ro,
+       .get_cd         = mmci_get_cd,
 };
 
 static void mmci_check_status(unsigned long data)
 {
        struct mmci_host *host = (struct mmci_host *)data;
-       unsigned int status;
+       unsigned int status = mmci_get_cd(host->mmc);
 
-       status = host->plat->status(mmc_dev(host->mmc));
        if (status ^ host->oldstat)
                mmc_detect_change(host->mmc, 0);
 
@@ -515,12 +540,15 @@ static int __devinit mmci_probe(struct amba_device *dev, struct amba_id *id)
 
        host = mmc_priv(mmc);
        host->mmc = mmc;
-       /* Bits 12 thru 19 is the designer */
-       host->hw_designer = (dev->periphid >> 12) & 0xff;
-       /* Bits 20 thru 23 is the revison */
-       host->hw_revision = (dev->periphid >> 20) & 0xf;
+
+       host->gpio_wp = -ENOSYS;
+       host->gpio_cd = -ENOSYS;
+
+       host->hw_designer = amba_manf(dev);
+       host->hw_revision = amba_rev(dev);
        DBG(host, "designer ID = 0x%02x\n", host->hw_designer);
        DBG(host, "revision = 0x%01x\n", host->hw_revision);
+
        host->clk = clk_get(&dev->dev, NULL);
        if (IS_ERR(host->clk)) {
                ret = PTR_ERR(host->clk);
@@ -591,6 +619,27 @@ static int __devinit mmci_probe(struct amba_device *dev, struct amba_id *id)
        writel(0, host->base + MMCIMASK1);
        writel(0xfff, host->base + MMCICLEAR);
 
+#ifdef CONFIG_GPIOLIB
+       if (gpio_is_valid(plat->gpio_cd)) {
+               ret = gpio_request(plat->gpio_cd, DRIVER_NAME " (cd)");
+               if (ret == 0)
+                       ret = gpio_direction_input(plat->gpio_cd);
+               if (ret == 0)
+                       host->gpio_cd = plat->gpio_cd;
+               else if (ret != -ENOSYS)
+                       goto err_gpio_cd;
+       }
+       if (gpio_is_valid(plat->gpio_wp)) {
+               ret = gpio_request(plat->gpio_wp, DRIVER_NAME " (wp)");
+               if (ret == 0)
+                       ret = gpio_direction_input(plat->gpio_wp);
+               if (ret == 0)
+                       host->gpio_wp = plat->gpio_wp;
+               else if (ret != -ENOSYS)
+                       goto err_gpio_wp;
+       }
+#endif
+
        ret = request_irq(dev->irq[0], mmci_irq, IRQF_SHARED, DRIVER_NAME " (cmd)", host);
        if (ret)
                goto unmap;
@@ -602,6 +651,7 @@ static int __devinit mmci_probe(struct amba_device *dev, struct amba_id *id)
        writel(MCI_IRQENABLE, host->base + MMCIMASK0);
 
        amba_set_drvdata(dev, mmc);
+       host->oldstat = mmci_get_cd(host->mmc);
 
        mmc_add_host(mmc);
 
@@ -620,6 +670,12 @@ static int __devinit mmci_probe(struct amba_device *dev, struct amba_id *id)
  irq0_free:
        free_irq(dev->irq[0], host);
  unmap:
+       if (host->gpio_wp != -ENOSYS)
+               gpio_free(host->gpio_wp);
+ err_gpio_wp:
+       if (host->gpio_cd != -ENOSYS)
+               gpio_free(host->gpio_cd);
+ err_gpio_cd:
        iounmap(host->base);
  clk_disable:
        clk_disable(host->clk);
@@ -655,6 +711,11 @@ static int __devexit mmci_remove(struct amba_device *dev)
                free_irq(dev->irq[0], host);
                free_irq(dev->irq[1], host);
 
+               if (host->gpio_wp != -ENOSYS)
+                       gpio_free(host->gpio_wp);
+               if (host->gpio_cd != -ENOSYS)
+                       gpio_free(host->gpio_cd);
+
                iounmap(host->base);
                clk_disable(host->clk);
                clk_put(host->clk);
index 0441bac1c0eca66de761c353fb69370c74382ca0..839f264c9725d27e5c5f72d5b9502e99fc17fb3c 100644 (file)
@@ -151,6 +151,8 @@ struct mmci_host {
        struct mmc_data         *data;
        struct mmc_host         *mmc;
        struct clk              *clk;
+       int                     gpio_cd;
+       int                     gpio_wp;
 
        unsigned int            data_xfered;
 
index 2c410a011317a8ba3c9ec6a178835c4ad24fe39d..0f5562aeedc1c75766bbd08b78ddadb3d8f04bbd 100644 (file)
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/nand.h>
 #include <linux/mtd/partitions.h>
-#include <asm/io.h>
+#include <linux/io.h>
+
 #include <mach/hardware.h>
+#include <mach/ts72xx.h>
+
 #include <asm/sizes.h>
 #include <asm/mach-types.h>
 
index c155bd3ec9f1a47640d4706626f544afe2e335bb..f053ba5c37ba0f778ad817c0c06c494b9921036a 100644 (file)
@@ -209,7 +209,7 @@ config MII
 
 config MACB
        tristate "Atmel MACB support"
-       depends on AVR32 || ARCH_AT91SAM9260 || ARCH_AT91SAM9263 || ARCH_AT91SAM9G20 || ARCH_AT91CAP9
+       depends on AVR32 || ARCH_AT91SAM9260 || ARCH_AT91SAM9263 || ARCH_AT91SAM9G20 || ARCH_AT91SAM9G45 || ARCH_AT91CAP9
        select PHYLIB
        help
          The Atmel MACB ethernet interface is found on many AT32 and AT91
index bf82e28770a9845af5cfef55098605e98bcef728..72ba0c6d3551b5d17d9c3cd0c4aa197c2163972b 100644 (file)
@@ -826,6 +826,28 @@ static int pl011_remove(struct amba_device *dev)
        return 0;
 }
 
+#ifdef CONFIG_PM
+static int pl011_suspend(struct amba_device *dev, pm_message_t state)
+{
+       struct uart_amba_port *uap = amba_get_drvdata(dev);
+
+       if (!uap)
+               return -EINVAL;
+
+       return uart_suspend_port(&amba_reg, &uap->port);
+}
+
+static int pl011_resume(struct amba_device *dev)
+{
+       struct uart_amba_port *uap = amba_get_drvdata(dev);
+
+       if (!uap)
+               return -EINVAL;
+
+       return uart_resume_port(&amba_reg, &uap->port);
+}
+#endif
+
 static struct amba_id pl011_ids[] __initdata = {
        {
                .id     = 0x00041011,
@@ -847,6 +869,10 @@ static struct amba_driver pl011_driver = {
        .id_table       = pl011_ids,
        .probe          = pl011_probe,
        .remove         = pl011_remove,
+#ifdef CONFIG_PM
+       .suspend        = pl011_suspend,
+       .resume         = pl011_resume,
+#endif
 };
 
 static int __init pl011_init(void)
index 8afcf08eba9868710366f23058f8793d71034fdc..41296a6807e2ff946f75d7ee79708a95b818a9ff 100644 (file)
@@ -935,7 +935,7 @@ config FB_S1D13XXX
 
 config FB_ATMEL
        tristate "AT91/AT32 LCD Controller support"
-       depends on FB && (ARCH_AT91SAM9261 || ARCH_AT91SAM9263 || ARCH_AT91SAM9RL || ARCH_AT91CAP9 || AVR32)
+       depends on FB && (ARCH_AT91SAM9261 || ARCH_AT91SAM9G10 || ARCH_AT91SAM9263 || ARCH_AT91SAM9RL || ARCH_AT91SAM9G45 || ARCH_AT91CAP9 || AVR32)
        select FB_CFB_FILLRECT
        select FB_CFB_COPYAREA
        select FB_CFB_IMAGEBLIT
@@ -951,7 +951,7 @@ config FB_INTSRAM
 
 config FB_ATMEL_STN
        bool "Use a STN display with AT91/AT32 LCD Controller"
-       depends on FB_ATMEL && MACH_AT91SAM9261EK
+       depends on FB_ATMEL && (MACH_AT91SAM9261EK || MACH_AT91SAM9G10EK)
        default n
        help
          Say Y if you want to connect a STN LCD display to the AT91/AT32 LCD
index da05f0801bb754221188d15ddcd070e85b796830..2830ffd729764fad573e68b1197d712571872ba8 100644 (file)
@@ -182,7 +182,8 @@ static unsigned long compute_hozval(unsigned long xres, unsigned long lcdcon2)
 {
        unsigned long value;
 
-       if (!(cpu_is_at91sam9261() || cpu_is_at32ap7000()))
+       if (!(cpu_is_at91sam9261() || cpu_is_at91sam9g10()
+               || cpu_is_at32ap7000()))
                return xres;
 
        value = xres;
@@ -824,7 +825,8 @@ static int __init atmel_lcdfb_probe(struct platform_device *pdev)
        info->fix = atmel_lcdfb_fix;
 
        /* Enable LCDC Clocks */
-       if (cpu_is_at91sam9261() || cpu_is_at32ap7000()) {
+       if (cpu_is_at91sam9261() || cpu_is_at91sam9g10()
+        || cpu_is_at32ap7000()) {
                sinfo->bus_clk = clk_get(dev, "hck1");
                if (IS_ERR(sinfo->bus_clk)) {
                        ret = PTR_ERR(sinfo->bus_clk);
index f9d19be05540a3a831886236f778b61645bfec0c..90861cd93165124461a2bcc18c57e603b86155df 100644 (file)
@@ -110,7 +110,7 @@ config BACKLIGHT_CLASS_DEVICE
 config BACKLIGHT_ATMEL_LCDC
        bool "Atmel LCDC Contrast-as-Backlight control"
        depends on BACKLIGHT_CLASS_DEVICE && FB_ATMEL
-       default y if MACH_SAM9261EK || MACH_SAM9263EK
+       default y if MACH_SAM9261EK || MACH_SAM9G10EK || MACH_SAM9263EK
        help
          This provides a backlight control internal to the Atmel LCDC
          driver.  If the LCD "contrast control" on your board is wired
index 173a239a541c3c1611be7a372a39d1d24901e3ce..bb0db55e0e98f75593df80869bd43bbf7fc6f1b2 100644 (file)
@@ -281,38 +281,6 @@ static struct snd_soc_card snd_soc_at91sam9g20ek = {
        .set_bias_level = at91sam9g20ek_set_bias_level,
 };
 
-/*
- * FIXME: This is a temporary bodge to avoid cross-tree merge issues.
- * New drivers should register the wm8731 I2C device in the machine
- * setup code (under arch/arm for ARM systems).
- */
-static int wm8731_i2c_register(void)
-{
-       struct i2c_board_info info;
-       struct i2c_adapter *adapter;
-       struct i2c_client *client;
-
-       memset(&info, 0, sizeof(struct i2c_board_info));
-       info.addr = 0x1b;
-       strlcpy(info.type, "wm8731", I2C_NAME_SIZE);
-
-       adapter = i2c_get_adapter(0);
-       if (!adapter) {
-               printk(KERN_ERR "can't get i2c adapter 0\n");
-               return -ENODEV;
-       }
-
-       client = i2c_new_device(adapter, &info);
-       i2c_put_adapter(adapter);
-       if (!client) {
-               printk(KERN_ERR "can't add i2c device at 0x%x\n",
-                       (unsigned int)info.addr);
-               return -ENODEV;
-       }
-
-       return 0;
-}
-
 static struct snd_soc_device at91sam9g20ek_snd_devdata = {
        .card = &snd_soc_at91sam9g20ek,
        .codec_dev = &soc_codec_dev_wm8731,
@@ -367,10 +335,6 @@ static int __init at91sam9g20ek_init(void)
        }
        ssc_p->ssc = ssc;
 
-       ret = wm8731_i2c_register();
-       if (ret != 0)
-               goto err_ssc;
-
        at91sam9g20ek_snd_device = platform_device_alloc("soc-audio", -1);
        if (!at91sam9g20ek_snd_device) {
                printk(KERN_ERR "ASoC: Platform device allocation failed\n");