mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-28 18:51:56 -04:00
Merge branches 'arm', 'at91', 'bcmring', 'ep93xx', 'mach-types', 'misc' and 'w90x900' into devel
This commit is contained in:
commit
cf7a2b4fb6
1298 changed files with 53846 additions and 14528 deletions
|
|
@ -495,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"
|
||||
|
|
@ -639,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"
|
||||
|
|
@ -732,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
|
||||
|
|
@ -1056,6 +1078,11 @@ config HIGHMEM
|
|||
|
||||
If unsure, say n.
|
||||
|
||||
config HIGHPTE
|
||||
bool "Allocate 2nd-level pagetables from highmem"
|
||||
depends on HIGHMEM
|
||||
depends on !OUTER_CACHE
|
||||
|
||||
source "mm/Kconfig"
|
||||
|
||||
config LEDS
|
||||
|
|
|
|||
|
|
@ -99,14 +99,6 @@ config DEBUG_CLPS711X_UART2
|
|||
output to the second serial port on these devices. Saying N will
|
||||
cause the debug messages to appear on the first serial port.
|
||||
|
||||
config DEBUG_S3C_PORT
|
||||
depends on DEBUG_LL && PLAT_S3C
|
||||
bool "Kernel low-level debugging messages via S3C UART"
|
||||
help
|
||||
Say Y here if you want debug print routines to go to one of the
|
||||
S3C internal UARTs. The chosen UART must have been configured
|
||||
before it is used.
|
||||
|
||||
config DEBUG_S3C_UART
|
||||
depends on PLAT_S3C
|
||||
int "S3C UART to use for low-level debug"
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
725
arch/arm/configs/bcmring_defconfig
Normal file
725
arch/arm/configs/bcmring_defconfig
Normal file
|
|
@ -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
|
||||
1338
arch/arm/configs/cpu9260_defconfig
Normal file
1338
arch/arm/configs/cpu9260_defconfig
Normal file
File diff suppressed because it is too large
Load diff
1328
arch/arm/configs/cpu9g20_defconfig
Normal file
1328
arch/arm/configs/cpu9g20_defconfig
Normal file
File diff suppressed because it is too large
Load diff
1316
arch/arm/configs/cpuat91_defconfig
Normal file
1316
arch/arm/configs/cpuat91_defconfig
Normal file
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
|
|
@ -260,6 +260,7 @@ CONFIG_MACH_NEXCODER_2440=y
|
|||
CONFIG_SMDK2440_CPU2440=y
|
||||
CONFIG_MACH_AT2440EVB=y
|
||||
CONFIG_CPU_S3C2442=y
|
||||
CONFIG_MACH_MINI2440=y
|
||||
|
||||
#
|
||||
# S3C2442 Machines
|
||||
|
|
@ -2298,7 +2299,6 @@ CONFIG_DEBUG_ERRORS=y
|
|||
# CONFIG_DEBUG_STACK_USAGE is not set
|
||||
CONFIG_DEBUG_LL=y
|
||||
# CONFIG_DEBUG_ICEDCC is not set
|
||||
CONFIG_DEBUG_S3C_PORT=y
|
||||
CONFIG_DEBUG_S3C_UART=0
|
||||
|
||||
#
|
||||
|
|
|
|||
|
|
@ -816,7 +816,6 @@ CONFIG_DEBUG_ERRORS=y
|
|||
# CONFIG_DEBUG_STACK_USAGE is not set
|
||||
CONFIG_DEBUG_LL=y
|
||||
# CONFIG_DEBUG_ICEDCC is not set
|
||||
CONFIG_DEBUG_S3C_PORT=y
|
||||
CONFIG_DEBUG_S3C_UART=0
|
||||
|
||||
#
|
||||
|
|
|
|||
|
|
@ -857,7 +857,6 @@ CONFIG_DEBUG_ERRORS=y
|
|||
# CONFIG_DEBUG_STACK_USAGE is not set
|
||||
CONFIG_DEBUG_LL=y
|
||||
# CONFIG_DEBUG_ICEDCC is not set
|
||||
# CONFIG_DEBUG_S3C_PORT is not set
|
||||
CONFIG_DEBUG_S3C_UART=0
|
||||
|
||||
#
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.30-rc6
|
||||
# Mon Jun 1 09:18:22 2009
|
||||
# Linux kernel version: 2.6.31-rc1
|
||||
# Thu Jul 2 00:16:59 2009
|
||||
#
|
||||
CONFIG_ARM=y
|
||||
CONFIG_SYS_SUPPORTS_APM_EMULATION=y
|
||||
|
|
@ -9,7 +9,7 @@ CONFIG_GENERIC_GPIO=y
|
|||
CONFIG_GENERIC_TIME=y
|
||||
CONFIG_GENERIC_CLOCKEVENTS=y
|
||||
CONFIG_MMU=y
|
||||
# CONFIG_NO_IOPORT is not set
|
||||
CONFIG_HAVE_TCM=y
|
||||
CONFIG_GENERIC_HARDIRQS=y
|
||||
CONFIG_STACKTRACE_SUPPORT=y
|
||||
CONFIG_HAVE_LATENCYTOP_SUPPORT=y
|
||||
|
|
@ -18,13 +18,12 @@ CONFIG_TRACE_IRQFLAGS_SUPPORT=y
|
|||
CONFIG_HARDIRQS_SW_RESEND=y
|
||||
CONFIG_GENERIC_IRQ_PROBE=y
|
||||
CONFIG_RWSEM_GENERIC_SPINLOCK=y
|
||||
# CONFIG_ARCH_HAS_ILOG2_U32 is not set
|
||||
# CONFIG_ARCH_HAS_ILOG2_U64 is not set
|
||||
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
|
||||
|
|
@ -68,7 +67,6 @@ CONFIG_SYSCTL_SYSCALL=y
|
|||
CONFIG_KALLSYMS=y
|
||||
# CONFIG_KALLSYMS_ALL is not set
|
||||
# CONFIG_KALLSYMS_EXTRA_PASS is not set
|
||||
# CONFIG_STRIP_ASM_SYMS is not set
|
||||
CONFIG_HOTPLUG=y
|
||||
CONFIG_PRINTK=y
|
||||
CONFIG_BUG=y
|
||||
|
|
@ -81,8 +79,13 @@ CONFIG_TIMERFD=y
|
|||
CONFIG_EVENTFD=y
|
||||
CONFIG_SHMEM=y
|
||||
# CONFIG_AIO is not set
|
||||
|
||||
#
|
||||
# Performance Counters
|
||||
#
|
||||
# CONFIG_VM_EVENT_COUNTERS is not set
|
||||
CONFIG_SLUB_DEBUG=y
|
||||
# CONFIG_STRIP_ASM_SYMS is not set
|
||||
CONFIG_COMPAT_BRK=y
|
||||
# CONFIG_SLAB is not set
|
||||
CONFIG_SLUB=y
|
||||
|
|
@ -94,6 +97,10 @@ CONFIG_HAVE_OPROFILE=y
|
|||
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
|
||||
|
|
@ -106,7 +113,7 @@ CONFIG_MODULE_UNLOAD=y
|
|||
# CONFIG_MODVERSIONS is not set
|
||||
# CONFIG_MODULE_SRCVERSION_ALL is not set
|
||||
CONFIG_BLOCK=y
|
||||
# CONFIG_LBD is not set
|
||||
CONFIG_LBDAF=y
|
||||
# CONFIG_BLK_DEV_BSG is not set
|
||||
# CONFIG_BLK_DEV_INTEGRITY is not set
|
||||
|
||||
|
|
@ -138,9 +145,9 @@ CONFIG_DEFAULT_IOSCHED="deadline"
|
|||
# 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_IMX is not set
|
||||
# CONFIG_ARCH_IOP13XX is not set
|
||||
# CONFIG_ARCH_IOP32X is not set
|
||||
# CONFIG_ARCH_IOP33X is not set
|
||||
|
|
@ -216,8 +223,8 @@ CONFIG_ARM_THUMB=y
|
|||
# CONFIG_CPU_DCACHE_DISABLE is not set
|
||||
# CONFIG_CPU_DCACHE_WRITETHROUGH is not set
|
||||
# CONFIG_CPU_CACHE_ROUND_ROBIN is not set
|
||||
# CONFIG_OUTER_CACHE is not set
|
||||
CONFIG_ARM_VIC=y
|
||||
CONFIG_ARM_VIC_NR=2
|
||||
CONFIG_COMMON_CLKDEV=y
|
||||
|
||||
#
|
||||
|
|
@ -243,7 +250,6 @@ CONFIG_PREEMPT=y
|
|||
CONFIG_HZ=100
|
||||
CONFIG_AEABI=y
|
||||
CONFIG_OABI_COMPAT=y
|
||||
CONFIG_ARCH_FLATMEM_HAS_HOLES=y
|
||||
# CONFIG_ARCH_SPARSEMEM_DEFAULT is not set
|
||||
# CONFIG_ARCH_SELECT_MEMORY_MODEL is not set
|
||||
# CONFIG_HIGHMEM is not set
|
||||
|
|
@ -258,17 +264,18 @@ CONFIG_SPLIT_PTLOCK_CPUS=4096
|
|||
# CONFIG_PHYS_ADDR_T_64BIT is not set
|
||||
CONFIG_ZONE_DMA_FLAG=0
|
||||
CONFIG_VIRT_TO_BUS=y
|
||||
CONFIG_UNEVICTABLE_LRU=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 is not set
|
||||
|
||||
#
|
||||
# Boot options
|
||||
#
|
||||
CONFIG_ZBOOT_ROM_TEXT=0x0
|
||||
CONFIG_ZBOOT_ROM_BSS=0x0
|
||||
CONFIG_CMDLINE="root=/dev/mtdblock2 rw rootfstype=yaffs2 console=ttyAMA0,115200n8 ab3100.force=0,0x48 mtdparts=u300nand:128k@0x0(bootrecords)ro,8064k@128k(free)ro,253952k@8192k(platform) lpj=515072"
|
||||
CONFIG_CMDLINE="root=/dev/ram0 rw rootfstype=rootfs console=ttyAMA0,115200n8 lpj=515072"
|
||||
# CONFIG_XIP_KERNEL is not set
|
||||
# CONFIG_KEXEC is not set
|
||||
|
||||
|
|
@ -359,6 +366,7 @@ CONFIG_DEFAULT_TCP_CONG="cubic"
|
|||
# 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
|
||||
|
||||
|
|
@ -497,6 +505,7 @@ CONFIG_MISC_DEVICES=y
|
|||
# CONFIG_EEPROM_AT24 is not set
|
||||
# CONFIG_EEPROM_AT25 is not set
|
||||
# CONFIG_EEPROM_LEGACY is not set
|
||||
# CONFIG_EEPROM_MAX6875 is not set
|
||||
# CONFIG_EEPROM_93CX6 is not set
|
||||
CONFIG_HAVE_IDE=y
|
||||
# CONFIG_IDE is not set
|
||||
|
|
@ -538,6 +547,7 @@ CONFIG_INPUT_KEYBOARD=y
|
|||
# CONFIG_KEYBOARD_XTKBD is not set
|
||||
# CONFIG_KEYBOARD_NEWTON is not set
|
||||
# CONFIG_KEYBOARD_STOWAWAY is not set
|
||||
# CONFIG_KEYBOARD_LM8323 is not set
|
||||
# CONFIG_KEYBOARD_GPIO is not set
|
||||
# CONFIG_INPUT_MOUSE is not set
|
||||
# CONFIG_INPUT_JOYSTICK is not set
|
||||
|
|
@ -597,9 +607,11 @@ CONFIG_I2C_HELPER_AUTO=y
|
|||
#
|
||||
# I2C system bus drivers (mostly embedded / system-on-chip)
|
||||
#
|
||||
# CONFIG_I2C_DESIGNWARE is not set
|
||||
# CONFIG_I2C_GPIO is not set
|
||||
# CONFIG_I2C_OCORES is not set
|
||||
# CONFIG_I2C_SIMTEC is not set
|
||||
CONFIG_I2C_STU300=y
|
||||
|
||||
#
|
||||
# External I2C/SMBus adapter drivers
|
||||
|
|
@ -620,7 +632,6 @@ CONFIG_I2C_HELPER_AUTO=y
|
|||
# CONFIG_SENSORS_PCF8574 is not set
|
||||
# CONFIG_PCF8575 is not set
|
||||
# CONFIG_SENSORS_PCA9539 is not set
|
||||
# CONFIG_SENSORS_MAX6875 is not set
|
||||
# CONFIG_SENSORS_TSL2550 is not set
|
||||
# CONFIG_I2C_DEBUG_CORE is not set
|
||||
# CONFIG_I2C_DEBUG_ALGO is not set
|
||||
|
|
@ -635,6 +646,7 @@ CONFIG_SPI_MASTER=y
|
|||
#
|
||||
# CONFIG_SPI_BITBANG is not set
|
||||
# CONFIG_SPI_GPIO is not set
|
||||
CONFIG_SPI_PL022=y
|
||||
|
||||
#
|
||||
# SPI Protocol Masters
|
||||
|
|
@ -647,6 +659,7 @@ CONFIG_POWER_SUPPLY=y
|
|||
# CONFIG_PDA_POWER is not set
|
||||
# CONFIG_BATTERY_DS2760 is not set
|
||||
# CONFIG_BATTERY_BQ27x00 is not set
|
||||
# CONFIG_BATTERY_MAX17040 is not set
|
||||
# CONFIG_HWMON is not set
|
||||
# CONFIG_THERMAL is not set
|
||||
# CONFIG_THERMAL_HWMON is not set
|
||||
|
|
@ -657,6 +670,7 @@ CONFIG_WATCHDOG=y
|
|||
# Watchdog Device Drivers
|
||||
#
|
||||
# CONFIG_SOFT_WATCHDOG is not set
|
||||
CONFIG_COH901327_WATCHDOG=y
|
||||
CONFIG_SSB_POSSIBLE=y
|
||||
|
||||
#
|
||||
|
|
@ -678,22 +692,9 @@ CONFIG_SSB_POSSIBLE=y
|
|||
# CONFIG_MFD_WM8400 is not set
|
||||
# CONFIG_MFD_WM8350_I2C is not set
|
||||
# CONFIG_MFD_PCF50633 is not set
|
||||
|
||||
#
|
||||
# Multimedia devices
|
||||
#
|
||||
|
||||
#
|
||||
# Multimedia core support
|
||||
#
|
||||
# CONFIG_VIDEO_DEV is not set
|
||||
# CONFIG_DVB_CORE is not set
|
||||
# CONFIG_VIDEO_MEDIA is not set
|
||||
|
||||
#
|
||||
# Multimedia drivers
|
||||
#
|
||||
# CONFIG_DAB is not set
|
||||
CONFIG_AB3100_CORE=y
|
||||
# CONFIG_EZX_PCAP is not set
|
||||
# CONFIG_MEDIA_SUPPORT is not set
|
||||
|
||||
#
|
||||
# Graphics support
|
||||
|
|
@ -760,6 +761,11 @@ CONFIG_SND_JACK=y
|
|||
# CONFIG_SND_VERBOSE_PROCFS is not set
|
||||
# CONFIG_SND_VERBOSE_PRINTK is not set
|
||||
# CONFIG_SND_DEBUG is not set
|
||||
# CONFIG_SND_RAWMIDI_SEQ is not set
|
||||
# CONFIG_SND_OPL3_LIB_SEQ is not set
|
||||
# CONFIG_SND_OPL4_LIB_SEQ is not set
|
||||
# CONFIG_SND_SBAWE_SEQ is not set
|
||||
# CONFIG_SND_EMU10K1_SEQ is not set
|
||||
# CONFIG_SND_DRIVERS is not set
|
||||
# CONFIG_SND_ARM is not set
|
||||
# CONFIG_SND_SPI is not set
|
||||
|
|
@ -770,7 +776,7 @@ CONFIG_SND_SOC_I2C_AND_SPI=y
|
|||
# CONFIG_HID_SUPPORT is not set
|
||||
# CONFIG_USB_SUPPORT is not set
|
||||
CONFIG_MMC=y
|
||||
# CONFIG_MMC_DEBUG is not set
|
||||
CONFIG_MMC_DEBUG=y
|
||||
# CONFIG_MMC_UNSAFE_RESUME is not set
|
||||
|
||||
#
|
||||
|
|
@ -797,7 +803,7 @@ CONFIG_LEDS_CLASS=y
|
|||
#
|
||||
# CONFIG_LEDS_PCA9532 is not set
|
||||
# CONFIG_LEDS_GPIO is not set
|
||||
# CONFIG_LEDS_LP5521 is not set
|
||||
# CONFIG_LEDS_LP3944 is not set
|
||||
# CONFIG_LEDS_PCA955X is not set
|
||||
# CONFIG_LEDS_DAC124S085 is not set
|
||||
# CONFIG_LEDS_BD2802 is not set
|
||||
|
|
@ -845,6 +851,7 @@ CONFIG_RTC_INTF_DEV=y
|
|||
# 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
|
||||
|
|
@ -887,7 +894,10 @@ CONFIG_REGULATOR=y
|
|||
# CONFIG_REGULATOR_DEBUG is not set
|
||||
# CONFIG_REGULATOR_FIXED_VOLTAGE is not set
|
||||
# CONFIG_REGULATOR_VIRTUAL_CONSUMER is not set
|
||||
# CONFIG_REGULATOR_USERSPACE_CONSUMER is not set
|
||||
# CONFIG_REGULATOR_BQ24022 is not set
|
||||
# CONFIG_REGULATOR_MAX1586 is not set
|
||||
# CONFIG_REGULATOR_LP3971 is not set
|
||||
# CONFIG_UIO is not set
|
||||
# CONFIG_STAGING is not set
|
||||
|
||||
|
|
@ -900,16 +910,20 @@ CONFIG_REGULATOR=y
|
|||
# CONFIG_REISERFS_FS is not set
|
||||
# CONFIG_JFS_FS is not set
|
||||
# CONFIG_FS_POSIX_ACL is not set
|
||||
CONFIG_FILE_LOCKING=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=y
|
||||
CONFIG_FSNOTIFY=y
|
||||
# CONFIG_DNOTIFY is not set
|
||||
# CONFIG_INOTIFY is not set
|
||||
CONFIG_INOTIFY_USER=y
|
||||
# CONFIG_QUOTA is not set
|
||||
# CONFIG_AUTOFS_FS is not set
|
||||
# CONFIG_AUTOFS4_FS is not set
|
||||
CONFIG_FUSE_FS=y
|
||||
# CONFIG_CUSE is not set
|
||||
|
||||
#
|
||||
# Caches
|
||||
|
|
@ -1033,6 +1047,7 @@ CONFIG_TIMER_STATS=y
|
|||
# CONFIG_DEBUG_OBJECTS is not set
|
||||
# CONFIG_SLUB_DEBUG_ON is not set
|
||||
# CONFIG_SLUB_STATS is not set
|
||||
# CONFIG_DEBUG_KMEMLEAK is not set
|
||||
# CONFIG_DEBUG_PREEMPT is not set
|
||||
# CONFIG_DEBUG_RT_MUTEXES is not set
|
||||
# CONFIG_RT_MUTEX_TESTER is not set
|
||||
|
|
@ -1063,18 +1078,16 @@ CONFIG_DEBUG_INFO=y
|
|||
# CONFIG_PAGE_POISONING is not set
|
||||
CONFIG_HAVE_FUNCTION_TRACER=y
|
||||
CONFIG_TRACING_SUPPORT=y
|
||||
|
||||
#
|
||||
# Tracers
|
||||
#
|
||||
CONFIG_FTRACE=y
|
||||
# CONFIG_FUNCTION_TRACER is not set
|
||||
# CONFIG_IRQSOFF_TRACER is not set
|
||||
# CONFIG_PREEMPT_TRACER is not set
|
||||
# CONFIG_SCHED_TRACER is not set
|
||||
# CONFIG_CONTEXT_SWITCH_TRACER is not set
|
||||
# CONFIG_EVENT_TRACER is not set
|
||||
# CONFIG_ENABLE_DEFAULT_TRACERS is not set
|
||||
# CONFIG_BOOT_TRACER is not set
|
||||
# CONFIG_TRACE_BRANCH_PROFILING is not set
|
||||
CONFIG_BRANCH_PROFILE_NONE=y
|
||||
# CONFIG_PROFILE_ANNOTATED_BRANCHES is not set
|
||||
# CONFIG_PROFILE_ALL_BRANCHES is not set
|
||||
# CONFIG_STACK_TRACER is not set
|
||||
# CONFIG_KMEMTRACE is not set
|
||||
# CONFIG_WORKQUEUE_TRACER is not set
|
||||
|
|
@ -1109,6 +1122,7 @@ CONFIG_GENERIC_FIND_LAST_BIT=y
|
|||
# CONFIG_CRC32 is not set
|
||||
# CONFIG_CRC7 is not set
|
||||
# CONFIG_LIBCRC32C is not set
|
||||
CONFIG_GENERIC_ALLOCATOR=y
|
||||
CONFIG_HAS_IOMEM=y
|
||||
CONFIG_HAS_IOPORT=y
|
||||
CONFIG_HAS_DMA=y
|
||||
|
|
|
|||
|
|
@ -11,4 +11,38 @@ extern void mcount(void);
|
|||
|
||||
#endif
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
#if defined(CONFIG_FRAME_POINTER) && !defined(CONFIG_ARM_UNWIND)
|
||||
/*
|
||||
* return_address uses walk_stackframe to do it's work. If both
|
||||
* CONFIG_FRAME_POINTER=y and CONFIG_ARM_UNWIND=y walk_stackframe uses unwind
|
||||
* information. For this to work in the function tracer many functions would
|
||||
* have to be marked with __notrace. So for now just depend on
|
||||
* !CONFIG_ARM_UNWIND.
|
||||
*/
|
||||
|
||||
void *return_address(unsigned int);
|
||||
|
||||
#else
|
||||
|
||||
extern inline void *return_address(unsigned int level)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#define HAVE_ARCH_CALLER_ADDR
|
||||
|
||||
#define CALLER_ADDR0 ((unsigned long)__builtin_return_address(0))
|
||||
#define CALLER_ADDR1 ((unsigned long)return_address(1))
|
||||
#define CALLER_ADDR2 ((unsigned long)return_address(2))
|
||||
#define CALLER_ADDR3 ((unsigned long)return_address(3))
|
||||
#define CALLER_ADDR4 ((unsigned long)return_address(4))
|
||||
#define CALLER_ADDR5 ((unsigned long)return_address(5))
|
||||
#define CALLER_ADDR6 ((unsigned long)return_address(6))
|
||||
|
||||
#endif /* ifndef __ASSEMBLY__ */
|
||||
|
||||
#endif /* _ASM_ARM_FTRACE */
|
||||
|
|
|
|||
|
|
@ -12,7 +12,7 @@
|
|||
|
||||
/* PAGE_SHIFT determines the page size */
|
||||
#define PAGE_SHIFT 12
|
||||
#define PAGE_SIZE (1UL << PAGE_SHIFT)
|
||||
#define PAGE_SIZE (_AC(1,UL) << PAGE_SHIFT)
|
||||
#define PAGE_MASK (~(PAGE_SIZE-1))
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
|
|
|||
|
|
@ -36,6 +36,8 @@ extern void free_pgd_slow(struct mm_struct *mm, pgd_t *pgd);
|
|||
#define pgd_alloc(mm) get_pgd_slow(mm)
|
||||
#define pgd_free(mm, pgd) free_pgd_slow(mm, pgd)
|
||||
|
||||
#define PGALLOC_GFP (GFP_KERNEL | __GFP_NOTRACK | __GFP_REPEAT | __GFP_ZERO)
|
||||
|
||||
/*
|
||||
* Allocate one PTE table.
|
||||
*
|
||||
|
|
@ -57,7 +59,7 @@ pte_alloc_one_kernel(struct mm_struct *mm, unsigned long addr)
|
|||
{
|
||||
pte_t *pte;
|
||||
|
||||
pte = (pte_t *)__get_free_page(GFP_KERNEL|__GFP_REPEAT|__GFP_ZERO);
|
||||
pte = (pte_t *)__get_free_page(PGALLOC_GFP);
|
||||
if (pte) {
|
||||
clean_dcache_area(pte, sizeof(pte_t) * PTRS_PER_PTE);
|
||||
pte += PTRS_PER_PTE;
|
||||
|
|
@ -71,10 +73,16 @@ pte_alloc_one(struct mm_struct *mm, unsigned long addr)
|
|||
{
|
||||
struct page *pte;
|
||||
|
||||
pte = alloc_pages(GFP_KERNEL|__GFP_REPEAT|__GFP_ZERO, 0);
|
||||
#ifdef CONFIG_HIGHPTE
|
||||
pte = alloc_pages(PGALLOC_GFP | __GFP_HIGHMEM, 0);
|
||||
#else
|
||||
pte = alloc_pages(PGALLOC_GFP, 0);
|
||||
#endif
|
||||
if (pte) {
|
||||
void *page = page_address(pte);
|
||||
clean_dcache_area(page, sizeof(pte_t) * PTRS_PER_PTE);
|
||||
if (!PageHighMem(pte)) {
|
||||
void *page = page_address(pte);
|
||||
clean_dcache_area(page, sizeof(pte_t) * PTRS_PER_PTE);
|
||||
}
|
||||
pgtable_page_ctor(pte);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -162,10 +162,8 @@ extern void __pgd_error(const char *file, int line, unsigned long val);
|
|||
* entries are stored 1024 bytes below.
|
||||
*/
|
||||
#define L_PTE_PRESENT (1 << 0)
|
||||
#define L_PTE_FILE (1 << 1) /* only when !PRESENT */
|
||||
#define L_PTE_YOUNG (1 << 1)
|
||||
#define L_PTE_BUFFERABLE (1 << 2) /* obsolete, matches PTE */
|
||||
#define L_PTE_CACHEABLE (1 << 3) /* obsolete, matches PTE */
|
||||
#define L_PTE_FILE (1 << 2) /* only when !PRESENT */
|
||||
#define L_PTE_DIRTY (1 << 6)
|
||||
#define L_PTE_WRITE (1 << 7)
|
||||
#define L_PTE_USER (1 << 8)
|
||||
|
|
@ -264,10 +262,19 @@ extern struct page *empty_zero_page;
|
|||
#define pte_clear(mm,addr,ptep) set_pte_ext(ptep, __pte(0), 0)
|
||||
#define pte_page(pte) (pfn_to_page(pte_pfn(pte)))
|
||||
#define pte_offset_kernel(dir,addr) (pmd_page_vaddr(*(dir)) + __pte_index(addr))
|
||||
#define pte_offset_map(dir,addr) (pmd_page_vaddr(*(dir)) + __pte_index(addr))
|
||||
#define pte_offset_map_nested(dir,addr) (pmd_page_vaddr(*(dir)) + __pte_index(addr))
|
||||
#define pte_unmap(pte) do { } while (0)
|
||||
#define pte_unmap_nested(pte) do { } while (0)
|
||||
|
||||
#define pte_offset_map(dir,addr) (__pte_map(dir, KM_PTE0) + __pte_index(addr))
|
||||
#define pte_offset_map_nested(dir,addr) (__pte_map(dir, KM_PTE1) + __pte_index(addr))
|
||||
#define pte_unmap(pte) __pte_unmap(pte, KM_PTE0)
|
||||
#define pte_unmap_nested(pte) __pte_unmap(pte, KM_PTE1)
|
||||
|
||||
#ifndef CONFIG_HIGHPTE
|
||||
#define __pte_map(dir,km) pmd_page_vaddr(*(dir))
|
||||
#define __pte_unmap(pte,km) do { } while (0)
|
||||
#else
|
||||
#define __pte_map(dir,km) ((pte_t *)kmap_atomic(pmd_page(*(dir)), km) + PTRS_PER_PTE)
|
||||
#define __pte_unmap(pte,km) kunmap_atomic((pte - PTRS_PER_PTE), km)
|
||||
#endif
|
||||
|
||||
#define set_pte_ext(ptep,pte,ext) cpu_set_pte_ext(ptep,pte,ext)
|
||||
|
||||
|
|
@ -285,15 +292,6 @@ extern struct page *empty_zero_page;
|
|||
#define pte_young(pte) (pte_val(pte) & L_PTE_YOUNG)
|
||||
#define pte_special(pte) (0)
|
||||
|
||||
/*
|
||||
* The following only works if pte_present() is not true.
|
||||
*/
|
||||
#define pte_file(pte) (pte_val(pte) & L_PTE_FILE)
|
||||
#define pte_to_pgoff(x) (pte_val(x) >> 2)
|
||||
#define pgoff_to_pte(x) __pte(((x) << 2) | L_PTE_FILE)
|
||||
|
||||
#define PTE_FILE_MAX_BITS 30
|
||||
|
||||
#define PTE_BIT_FUNC(fn,op) \
|
||||
static inline pte_t pte_##fn(pte_t pte) { pte_val(pte) op; return pte; }
|
||||
|
||||
|
|
@ -384,16 +382,50 @@ static inline pte_t pte_modify(pte_t pte, pgprot_t newprot)
|
|||
|
||||
extern pgd_t swapper_pg_dir[PTRS_PER_PGD];
|
||||
|
||||
/* Encode and decode a swap entry.
|
||||
/*
|
||||
* Encode and decode a swap entry. Swap entries are stored in the Linux
|
||||
* page tables as follows:
|
||||
*
|
||||
* We support up to 32GB of swap on 4k machines
|
||||
* 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
|
||||
* 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
|
||||
* <--------------- offset --------------------> <- type --> 0 0 0
|
||||
*
|
||||
* This gives us up to 63 swap files and 32GB per swap file. Note that
|
||||
* the offset field is always non-zero.
|
||||
*/
|
||||
#define __swp_type(x) (((x).val >> 2) & 0x7f)
|
||||
#define __swp_offset(x) ((x).val >> 9)
|
||||
#define __swp_entry(type,offset) ((swp_entry_t) { ((type) << 2) | ((offset) << 9) })
|
||||
#define __SWP_TYPE_SHIFT 3
|
||||
#define __SWP_TYPE_BITS 6
|
||||
#define __SWP_TYPE_MASK ((1 << __SWP_TYPE_BITS) - 1)
|
||||
#define __SWP_OFFSET_SHIFT (__SWP_TYPE_BITS + __SWP_TYPE_SHIFT)
|
||||
|
||||
#define __swp_type(x) (((x).val >> __SWP_TYPE_SHIFT) & __SWP_TYPE_MASK)
|
||||
#define __swp_offset(x) ((x).val >> __SWP_OFFSET_SHIFT)
|
||||
#define __swp_entry(type,offset) ((swp_entry_t) { ((type) << __SWP_TYPE_SHIFT) | ((offset) << __SWP_OFFSET_SHIFT) })
|
||||
|
||||
#define __pte_to_swp_entry(pte) ((swp_entry_t) { pte_val(pte) })
|
||||
#define __swp_entry_to_pte(swp) ((pte_t) { (swp).val })
|
||||
|
||||
/*
|
||||
* It is an error for the kernel to have more swap files than we can
|
||||
* encode in the PTEs. This ensures that we know when MAX_SWAPFILES
|
||||
* is increased beyond what we presently support.
|
||||
*/
|
||||
#define MAX_SWAPFILES_CHECK() BUILD_BUG_ON(MAX_SWAPFILES_SHIFT > __SWP_TYPE_BITS)
|
||||
|
||||
/*
|
||||
* Encode and decode a file entry. File entries are stored in the Linux
|
||||
* page tables as follows:
|
||||
*
|
||||
* 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
|
||||
* 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
|
||||
* <----------------------- offset ------------------------> 1 0 0
|
||||
*/
|
||||
#define pte_file(pte) (pte_val(pte) & L_PTE_FILE)
|
||||
#define pte_to_pgoff(x) (pte_val(x) >> 3)
|
||||
#define pgoff_to_pte(x) __pte(((x) << 3) | L_PTE_FILE)
|
||||
|
||||
#define PTE_FILE_MAX_BITS 29
|
||||
|
||||
/* Needs to be defined here and not in linux/mm.h, as it is arch dependent */
|
||||
/* FIXME: this is not correct */
|
||||
#define kern_addr_valid(addr) (1)
|
||||
|
|
|
|||
|
|
@ -73,7 +73,7 @@ struct thread_info {
|
|||
.task = &tsk, \
|
||||
.exec_domain = &default_exec_domain, \
|
||||
.flags = 0, \
|
||||
.preempt_count = 1, \
|
||||
.preempt_count = INIT_PREEMPT_COUNT, \
|
||||
.addr_limit = KERNEL_DS, \
|
||||
.cpu_domain = domain_val(DOMAIN_USER, DOMAIN_MANAGER) | \
|
||||
domain_val(DOMAIN_KERNEL, DOMAIN_MANAGER) | \
|
||||
|
|
@ -140,6 +140,7 @@ extern void vfp_sync_state(struct thread_info *thread);
|
|||
#define TIF_USING_IWMMXT 17
|
||||
#define TIF_MEMDIE 18
|
||||
#define TIF_FREEZE 19
|
||||
#define TIF_RESTORE_SIGMASK 20
|
||||
|
||||
#define _TIF_SIGPENDING (1 << TIF_SIGPENDING)
|
||||
#define _TIF_NEED_RESCHED (1 << TIF_NEED_RESCHED)
|
||||
|
|
@ -147,6 +148,7 @@ extern void vfp_sync_state(struct thread_info *thread);
|
|||
#define _TIF_POLLING_NRFLAG (1 << TIF_POLLING_NRFLAG)
|
||||
#define _TIF_USING_IWMMXT (1 << TIF_USING_IWMMXT)
|
||||
#define _TIF_FREEZE (1 << TIF_FREEZE)
|
||||
#define _TIF_RESTORE_SIGMASK (1 << TIF_RESTORE_SIGMASK)
|
||||
|
||||
/*
|
||||
* Change these and you break ASM code in entry-common.S
|
||||
|
|
|
|||
|
|
@ -360,8 +360,8 @@
|
|||
#define __NR_readlinkat (__NR_SYSCALL_BASE+332)
|
||||
#define __NR_fchmodat (__NR_SYSCALL_BASE+333)
|
||||
#define __NR_faccessat (__NR_SYSCALL_BASE+334)
|
||||
/* 335 for pselect6 */
|
||||
/* 336 for ppoll */
|
||||
#define __NR_pselect6 (__NR_SYSCALL_BASE+335)
|
||||
#define __NR_ppoll (__NR_SYSCALL_BASE+336)
|
||||
#define __NR_unshare (__NR_SYSCALL_BASE+337)
|
||||
#define __NR_set_robust_list (__NR_SYSCALL_BASE+338)
|
||||
#define __NR_get_robust_list (__NR_SYSCALL_BASE+339)
|
||||
|
|
@ -372,7 +372,7 @@
|
|||
#define __NR_vmsplice (__NR_SYSCALL_BASE+343)
|
||||
#define __NR_move_pages (__NR_SYSCALL_BASE+344)
|
||||
#define __NR_getcpu (__NR_SYSCALL_BASE+345)
|
||||
/* 346 for epoll_pwait */
|
||||
#define __NR_epoll_pwait (__NR_SYSCALL_BASE+346)
|
||||
#define __NR_kexec_load (__NR_SYSCALL_BASE+347)
|
||||
#define __NR_utimensat (__NR_SYSCALL_BASE+348)
|
||||
#define __NR_signalfd (__NR_SYSCALL_BASE+349)
|
||||
|
|
@ -432,6 +432,7 @@
|
|||
#define __ARCH_WANT_SYS_SIGPENDING
|
||||
#define __ARCH_WANT_SYS_SIGPROCMASK
|
||||
#define __ARCH_WANT_SYS_RT_SIGACTION
|
||||
#define __ARCH_WANT_SYS_RT_SIGSUSPEND
|
||||
|
||||
#if !defined(CONFIG_AEABI) || defined(CONFIG_OABI_COMPAT)
|
||||
#define __ARCH_WANT_SYS_TIME
|
||||
|
|
|
|||
|
|
@ -8,10 +8,12 @@ ifdef CONFIG_DYNAMIC_FTRACE
|
|||
CFLAGS_REMOVE_ftrace.o = -pg
|
||||
endif
|
||||
|
||||
CFLAGS_REMOVE_return_address.o = -pg
|
||||
|
||||
# Object file lists.
|
||||
|
||||
obj-y := compat.o elf.o entry-armv.o entry-common.o irq.o \
|
||||
process.o ptrace.o setup.o signal.o \
|
||||
process.o ptrace.o return_address.o setup.o signal.o \
|
||||
sys_arm.o stacktrace.o time.o traps.o
|
||||
|
||||
obj-$(CONFIG_ISA_DMA_API) += dma.o
|
||||
|
|
|
|||
|
|
@ -81,7 +81,7 @@
|
|||
CALL(sys_ni_syscall) /* was sys_ssetmask */
|
||||
/* 70 */ CALL(sys_setreuid16)
|
||||
CALL(sys_setregid16)
|
||||
CALL(sys_sigsuspend_wrapper)
|
||||
CALL(sys_sigsuspend)
|
||||
CALL(sys_sigpending)
|
||||
CALL(sys_sethostname)
|
||||
/* 75 */ CALL(sys_setrlimit)
|
||||
|
|
@ -188,7 +188,7 @@
|
|||
CALL(sys_rt_sigpending)
|
||||
CALL(sys_rt_sigtimedwait)
|
||||
CALL(sys_rt_sigqueueinfo)
|
||||
CALL(sys_rt_sigsuspend_wrapper)
|
||||
CALL(sys_rt_sigsuspend)
|
||||
/* 180 */ CALL(ABI(sys_pread64, sys_oabi_pread64))
|
||||
CALL(ABI(sys_pwrite64, sys_oabi_pwrite64))
|
||||
CALL(sys_chown16)
|
||||
|
|
@ -344,8 +344,8 @@
|
|||
CALL(sys_readlinkat)
|
||||
CALL(sys_fchmodat)
|
||||
CALL(sys_faccessat)
|
||||
/* 335 */ CALL(sys_ni_syscall) /* eventually pselect6 */
|
||||
CALL(sys_ni_syscall) /* eventually ppoll */
|
||||
/* 335 */ CALL(sys_pselect6)
|
||||
CALL(sys_ppoll)
|
||||
CALL(sys_unshare)
|
||||
CALL(sys_set_robust_list)
|
||||
CALL(sys_get_robust_list)
|
||||
|
|
@ -355,7 +355,7 @@
|
|||
CALL(sys_vmsplice)
|
||||
CALL(sys_move_pages)
|
||||
/* 345 */ CALL(sys_getcpu)
|
||||
CALL(sys_ni_syscall) /* eventually epoll_pwait */
|
||||
CALL(sys_epoll_pwait)
|
||||
CALL(sys_kexec_load)
|
||||
CALL(sys_utimensat)
|
||||
CALL(sys_signalfd)
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -373,16 +373,6 @@ sys_clone_wrapper:
|
|||
b sys_clone
|
||||
ENDPROC(sys_clone_wrapper)
|
||||
|
||||
sys_sigsuspend_wrapper:
|
||||
add r3, sp, #S_OFF
|
||||
b sys_sigsuspend
|
||||
ENDPROC(sys_sigsuspend_wrapper)
|
||||
|
||||
sys_rt_sigsuspend_wrapper:
|
||||
add r2, sp, #S_OFF
|
||||
b sys_rt_sigsuspend
|
||||
ENDPROC(sys_rt_sigsuspend_wrapper)
|
||||
|
||||
sys_sigreturn_wrapper:
|
||||
add r0, sp, #S_OFF
|
||||
b sys_sigreturn
|
||||
|
|
|
|||
|
|
@ -98,17 +98,6 @@ unlock:
|
|||
return 0;
|
||||
}
|
||||
|
||||
/* Handle bad interrupts */
|
||||
static struct irq_desc bad_irq_desc = {
|
||||
.handle_irq = handle_bad_irq,
|
||||
.lock = __SPIN_LOCK_UNLOCKED(bad_irq_desc.lock),
|
||||
};
|
||||
|
||||
#ifdef CONFIG_CPUMASK_OFFSTACK
|
||||
/* We are not allocating bad_irq_desc.affinity or .pending_mask */
|
||||
#error "ARM architecture does not support CONFIG_CPUMASK_OFFSTACK."
|
||||
#endif
|
||||
|
||||
/*
|
||||
* do_IRQ handles all hardware IRQ's. Decoded IRQs should not
|
||||
* come via this function. Instead, they should provide their
|
||||
|
|
@ -124,10 +113,13 @@ asmlinkage void __exception asm_do_IRQ(unsigned int irq, struct pt_regs *regs)
|
|||
* Some hardware gives randomly wrong interrupts. Rather
|
||||
* than crashing, do something sensible.
|
||||
*/
|
||||
if (irq >= NR_IRQS)
|
||||
handle_bad_irq(irq, &bad_irq_desc);
|
||||
else
|
||||
if (unlikely(irq >= NR_IRQS)) {
|
||||
if (printk_ratelimit())
|
||||
printk(KERN_WARNING "Bad IRQ%u\n", irq);
|
||||
ack_bad_irq(irq);
|
||||
} else {
|
||||
generic_handle_irq(irq);
|
||||
}
|
||||
|
||||
/* AT91 specific workaround */
|
||||
irq_finish(irq);
|
||||
|
|
@ -165,10 +157,6 @@ void __init init_IRQ(void)
|
|||
for (irq = 0; irq < NR_IRQS; irq++)
|
||||
irq_desc[irq].status |= IRQ_NOREQUEST | IRQ_NOPROBE;
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
cpumask_setall(bad_irq_desc.affinity);
|
||||
bad_irq_desc.node = smp_processor_id();
|
||||
#endif
|
||||
init_arch_irq();
|
||||
}
|
||||
|
||||
|
|
|
|||
71
arch/arm/kernel/return_address.c
Normal file
71
arch/arm/kernel/return_address.c
Normal file
|
|
@ -0,0 +1,71 @@
|
|||
/*
|
||||
* arch/arm/kernel/return_address.c
|
||||
*
|
||||
* Copyright (C) 2009 Uwe Kleine-Koenig <u.kleine-koenig@pengutronix.de>
|
||||
* for Pengutronix
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 as published by
|
||||
* the Free Software Foundation.
|
||||
*/
|
||||
#include <linux/module.h>
|
||||
|
||||
#if defined(CONFIG_FRAME_POINTER) && !defined(CONFIG_ARM_UNWIND)
|
||||
#include <linux/sched.h>
|
||||
|
||||
#include <asm/stacktrace.h>
|
||||
|
||||
struct return_address_data {
|
||||
unsigned int level;
|
||||
void *addr;
|
||||
};
|
||||
|
||||
static int save_return_addr(struct stackframe *frame, void *d)
|
||||
{
|
||||
struct return_address_data *data = d;
|
||||
|
||||
if (!data->level) {
|
||||
data->addr = (void *)frame->lr;
|
||||
|
||||
return 1;
|
||||
} else {
|
||||
--data->level;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
void *return_address(unsigned int level)
|
||||
{
|
||||
struct return_address_data data;
|
||||
struct stackframe frame;
|
||||
register unsigned long current_sp asm ("sp");
|
||||
|
||||
data.level = level + 1;
|
||||
|
||||
frame.fp = (unsigned long)__builtin_frame_address(0);
|
||||
frame.sp = current_sp;
|
||||
frame.lr = (unsigned long)__builtin_return_address(0);
|
||||
frame.pc = (unsigned long)return_address;
|
||||
|
||||
walk_stackframe(&frame, save_return_addr, &data);
|
||||
|
||||
if (!data.level)
|
||||
return data.addr;
|
||||
else
|
||||
return NULL;
|
||||
}
|
||||
|
||||
#else /* if defined(CONFIG_FRAME_POINTER) && !defined(CONFIG_ARM_UNWIND) */
|
||||
|
||||
#if defined(CONFIG_ARM_UNWIND)
|
||||
#warning "TODO: return_address should use unwind tables"
|
||||
#endif
|
||||
|
||||
void *return_address(unsigned int level)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
#endif /* if defined(CONFIG_FRAME_POINTER) && !defined(CONFIG_ARM_UNWIND) / else */
|
||||
|
||||
EXPORT_SYMBOL_GPL(return_address);
|
||||
|
|
@ -47,57 +47,22 @@ const unsigned long sigreturn_codes[7] = {
|
|||
MOV_R7_NR_RT_SIGRETURN, SWI_SYS_RT_SIGRETURN, SWI_THUMB_RT_SIGRETURN,
|
||||
};
|
||||
|
||||
static int do_signal(sigset_t *oldset, struct pt_regs * regs, int syscall);
|
||||
|
||||
/*
|
||||
* atomically swap in the new signal mask, and wait for a signal.
|
||||
*/
|
||||
asmlinkage int sys_sigsuspend(int restart, unsigned long oldmask, old_sigset_t mask, struct pt_regs *regs)
|
||||
asmlinkage int sys_sigsuspend(int restart, unsigned long oldmask, old_sigset_t mask)
|
||||
{
|
||||
sigset_t saveset;
|
||||
|
||||
mask &= _BLOCKABLE;
|
||||
spin_lock_irq(¤t->sighand->siglock);
|
||||
saveset = current->blocked;
|
||||
current->saved_sigmask = current->blocked;
|
||||
siginitset(¤t->blocked, mask);
|
||||
recalc_sigpending();
|
||||
spin_unlock_irq(¤t->sighand->siglock);
|
||||
regs->ARM_r0 = -EINTR;
|
||||
|
||||
while (1) {
|
||||
current->state = TASK_INTERRUPTIBLE;
|
||||
schedule();
|
||||
if (do_signal(&saveset, regs, 0))
|
||||
return regs->ARM_r0;
|
||||
}
|
||||
}
|
||||
|
||||
asmlinkage int
|
||||
sys_rt_sigsuspend(sigset_t __user *unewset, size_t sigsetsize, struct pt_regs *regs)
|
||||
{
|
||||
sigset_t saveset, newset;
|
||||
|
||||
/* XXX: Don't preclude handling different sized sigset_t's. */
|
||||
if (sigsetsize != sizeof(sigset_t))
|
||||
return -EINVAL;
|
||||
|
||||
if (copy_from_user(&newset, unewset, sizeof(newset)))
|
||||
return -EFAULT;
|
||||
sigdelsetmask(&newset, ~_BLOCKABLE);
|
||||
|
||||
spin_lock_irq(¤t->sighand->siglock);
|
||||
saveset = current->blocked;
|
||||
current->blocked = newset;
|
||||
recalc_sigpending();
|
||||
spin_unlock_irq(¤t->sighand->siglock);
|
||||
regs->ARM_r0 = -EINTR;
|
||||
|
||||
while (1) {
|
||||
current->state = TASK_INTERRUPTIBLE;
|
||||
schedule();
|
||||
if (do_signal(&saveset, regs, 0))
|
||||
return regs->ARM_r0;
|
||||
}
|
||||
current->state = TASK_INTERRUPTIBLE;
|
||||
schedule();
|
||||
set_restore_sigmask();
|
||||
return -ERESTARTNOHAND;
|
||||
}
|
||||
|
||||
asmlinkage int
|
||||
|
|
@ -545,7 +510,7 @@ static inline void setup_syscall_restart(struct pt_regs *regs)
|
|||
/*
|
||||
* OK, we're invoking a handler
|
||||
*/
|
||||
static void
|
||||
static int
|
||||
handle_signal(unsigned long sig, struct k_sigaction *ka,
|
||||
siginfo_t *info, sigset_t *oldset,
|
||||
struct pt_regs * regs, int syscall)
|
||||
|
|
@ -596,7 +561,7 @@ handle_signal(unsigned long sig, struct k_sigaction *ka,
|
|||
|
||||
if (ret != 0) {
|
||||
force_sigsegv(sig, tsk);
|
||||
return;
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -610,6 +575,7 @@ handle_signal(unsigned long sig, struct k_sigaction *ka,
|
|||
recalc_sigpending();
|
||||
spin_unlock_irq(&tsk->sighand->siglock);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -621,7 +587,7 @@ handle_signal(unsigned long sig, struct k_sigaction *ka,
|
|||
* the kernel can handle, and then we build all the user-level signal handling
|
||||
* stack-frames in one go after that.
|
||||
*/
|
||||
static int do_signal(sigset_t *oldset, struct pt_regs *regs, int syscall)
|
||||
static void do_signal(struct pt_regs *regs, int syscall)
|
||||
{
|
||||
struct k_sigaction ka;
|
||||
siginfo_t info;
|
||||
|
|
@ -634,7 +600,7 @@ static int do_signal(sigset_t *oldset, struct pt_regs *regs, int syscall)
|
|||
* if so.
|
||||
*/
|
||||
if (!user_mode(regs))
|
||||
return 0;
|
||||
return;
|
||||
|
||||
if (try_to_freeze())
|
||||
goto no_signal;
|
||||
|
|
@ -643,9 +609,24 @@ static int do_signal(sigset_t *oldset, struct pt_regs *regs, int syscall)
|
|||
|
||||
signr = get_signal_to_deliver(&info, &ka, regs, NULL);
|
||||
if (signr > 0) {
|
||||
handle_signal(signr, &ka, &info, oldset, regs, syscall);
|
||||
sigset_t *oldset;
|
||||
|
||||
if (test_thread_flag(TIF_RESTORE_SIGMASK))
|
||||
oldset = ¤t->saved_sigmask;
|
||||
else
|
||||
oldset = ¤t->blocked;
|
||||
if (handle_signal(signr, &ka, &info, oldset, regs, syscall) == 0) {
|
||||
/*
|
||||
* A signal was successfully delivered; the saved
|
||||
* sigmask will have been stored in the signal frame,
|
||||
* and will be restored by sigreturn, so we can simply
|
||||
* clear the TIF_RESTORE_SIGMASK flag.
|
||||
*/
|
||||
if (test_thread_flag(TIF_RESTORE_SIGMASK))
|
||||
clear_thread_flag(TIF_RESTORE_SIGMASK);
|
||||
}
|
||||
single_step_set(current);
|
||||
return 1;
|
||||
return;
|
||||
}
|
||||
|
||||
no_signal:
|
||||
|
|
@ -697,14 +678,21 @@ static int do_signal(sigset_t *oldset, struct pt_regs *regs, int syscall)
|
|||
regs->ARM_r0 == -ERESTARTNOINTR) {
|
||||
setup_syscall_restart(regs);
|
||||
}
|
||||
|
||||
/* If there's no signal to deliver, we just put the saved sigmask
|
||||
* back.
|
||||
*/
|
||||
if (test_thread_flag(TIF_RESTORE_SIGMASK)) {
|
||||
clear_thread_flag(TIF_RESTORE_SIGMASK);
|
||||
sigprocmask(SIG_SETMASK, ¤t->saved_sigmask, NULL);
|
||||
}
|
||||
}
|
||||
single_step_set(current);
|
||||
return 0;
|
||||
}
|
||||
|
||||
asmlinkage void
|
||||
do_notify_resume(struct pt_regs *regs, unsigned int thread_flags, int syscall)
|
||||
{
|
||||
if (thread_flags & _TIF_SIGPENDING)
|
||||
do_signal(¤t->blocked, regs, syscall);
|
||||
do_signal(regs, syscall);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -21,7 +21,7 @@
|
|||
* Note that with framepointer enabled, even the leaf functions have the same
|
||||
* prologue and epilogue, therefore we can ignore the LR value in this case.
|
||||
*/
|
||||
int unwind_frame(struct stackframe *frame)
|
||||
int notrace unwind_frame(struct stackframe *frame)
|
||||
{
|
||||
unsigned long high, low;
|
||||
unsigned long fp = frame->fp;
|
||||
|
|
@ -43,7 +43,7 @@ int unwind_frame(struct stackframe *frame)
|
|||
}
|
||||
#endif
|
||||
|
||||
void walk_stackframe(struct stackframe *frame,
|
||||
void notrace walk_stackframe(struct stackframe *frame,
|
||||
int (*fn)(struct stackframe *, void *), void *data)
|
||||
{
|
||||
while (1) {
|
||||
|
|
|
|||
|
|
@ -6,6 +6,7 @@
|
|||
#include <asm-generic/vmlinux.lds.h>
|
||||
#include <asm/thread_info.h>
|
||||
#include <asm/memory.h>
|
||||
#include <asm/page.h>
|
||||
|
||||
OUTPUT_ARCH(arm)
|
||||
ENTRY(stext)
|
||||
|
|
@ -63,7 +64,7 @@ SECTIONS
|
|||
usr/built-in.o(.init.ramfs)
|
||||
__initramfs_end = .;
|
||||
#endif
|
||||
. = ALIGN(4096);
|
||||
. = ALIGN(PAGE_SIZE);
|
||||
__per_cpu_load = .;
|
||||
__per_cpu_start = .;
|
||||
*(.data.percpu.page_aligned)
|
||||
|
|
@ -73,7 +74,7 @@ SECTIONS
|
|||
#ifndef CONFIG_XIP_KERNEL
|
||||
__init_begin = _stext;
|
||||
INIT_DATA
|
||||
. = ALIGN(4096);
|
||||
. = ALIGN(PAGE_SIZE);
|
||||
__init_end = .;
|
||||
#endif
|
||||
}
|
||||
|
|
@ -118,7 +119,7 @@ SECTIONS
|
|||
*(.got) /* Global offset table */
|
||||
}
|
||||
|
||||
RODATA
|
||||
RO_DATA(PAGE_SIZE)
|
||||
|
||||
_etext = .; /* End of text and rodata section */
|
||||
|
||||
|
|
@ -158,17 +159,17 @@ SECTIONS
|
|||
*(.data.init_task)
|
||||
|
||||
#ifdef CONFIG_XIP_KERNEL
|
||||
. = ALIGN(4096);
|
||||
. = ALIGN(PAGE_SIZE);
|
||||
__init_begin = .;
|
||||
INIT_DATA
|
||||
. = ALIGN(4096);
|
||||
. = ALIGN(PAGE_SIZE);
|
||||
__init_end = .;
|
||||
#endif
|
||||
|
||||
. = ALIGN(4096);
|
||||
. = ALIGN(PAGE_SIZE);
|
||||
__nosave_begin = .;
|
||||
*(.data.nosave)
|
||||
. = ALIGN(4096);
|
||||
. = ALIGN(PAGE_SIZE);
|
||||
__nosave_end = .;
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
/* -------------------------------------------------------------------- */
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
||||
|
|
|
|||
360
arch/arm/mach-at91/at91sam9g45.c
Normal file
360
arch/arm/mach-at91/at91sam9g45.c
Normal file
|
|
@ -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();
|
||||
}
|
||||
1230
arch/arm/mach-at91/at91sam9g45_devices.c
Normal file
1230
arch/arm/mach-at91/at91sam9g45_devices.c
Normal file
File diff suppressed because it is too large
Load diff
|
|
@ -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")
|
||||
|
|
|
|||
385
arch/arm/mach-at91/board-cpu9krea.c
Normal file
385
arch/arm/mach-at91/board-cpu9krea.c
Normal file
|
|
@ -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
|
||||
185
arch/arm/mach-at91/board-cpuat91.c
Normal file
185
arch/arm/mach-at91/board-cpuat91.c
Normal file
|
|
@ -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
|
||||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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 = {
|
||||
};
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -24,6 +24,8 @@
|
|||
#include <linux/platform_device.h>
|
||||
#include <linux/spi/spi.h>
|
||||
#include <linux/spi/at73c213.h>
|
||||
#include <linux/gpio_keys.h>
|
||||
#include <linux/input.h>
|
||||
#include <linux/clk.h>
|
||||
|
||||
#include <mach/hardware.h>
|
||||
|
|
@ -218,9 +220,60 @@ static struct gpio_led ek_leds[] = {
|
|||
}
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
* GPIO Buttons
|
||||
*/
|
||||
#if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE)
|
||||
static struct gpio_keys_button ek_buttons[] = {
|
||||
{
|
||||
.gpio = AT91_PIN_PA30,
|
||||
.code = BTN_3,
|
||||
.desc = "Button 3",
|
||||
.active_low = 1,
|
||||
.wakeup = 1,
|
||||
},
|
||||
{
|
||||
.gpio = AT91_PIN_PA31,
|
||||
.code = BTN_4,
|
||||
.desc = "Button 4",
|
||||
.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_PA30, 1); /* btn3 */
|
||||
at91_set_deglitch(AT91_PIN_PA30, 1);
|
||||
at91_set_gpio_input(AT91_PIN_PA31, 1); /* btn4 */
|
||||
at91_set_deglitch(AT91_PIN_PA31, 1);
|
||||
|
||||
platform_device_register(&ek_button_device);
|
||||
}
|
||||
#else
|
||||
static void __init ek_add_device_buttons(void) {}
|
||||
#endif
|
||||
|
||||
|
||||
static struct i2c_board_info __initdata ek_i2c_devices[] = {
|
||||
{
|
||||
I2C_BOARD_INFO("24c512", 0x50),
|
||||
I2C_BOARD_INFO("wm8731", 0x1b),
|
||||
},
|
||||
};
|
||||
|
||||
|
|
@ -245,6 +298,8 @@ static void __init ek_board_init(void)
|
|||
at91_add_device_i2c(ek_i2c_devices, ARRAY_SIZE(ek_i2c_devices));
|
||||
/* LEDs */
|
||||
at91_gpio_leds(ek_leds, ARRAY_SIZE(ek_leds));
|
||||
/* Push Buttons */
|
||||
ek_add_device_buttons();
|
||||
/* PCK0 provides MCLK to the WM8731 */
|
||||
at91_set_B_periph(AT91_PIN_PC1, 0);
|
||||
/* SSC (for WM8731) */
|
||||
|
|
|
|||
389
arch/arm/mach-at91/board-sam9m10g45ek.c
Normal file
389
arch/arm/mach-at91/board-sam9m10g45ek.c
Normal file
|
|
@ -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
|
||||
|
|
@ -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>
|
||||
|
||||
|
|
@ -186,19 +188,21 @@ static struct fb_monspecs at91fb_default_monspecs = {
|
|||
static void at91_lcdc_power_control(int on)
|
||||
{
|
||||
if (on)
|
||||
at91_set_gpio_value(AT91_PIN_PA30, 0); /* power up */
|
||||
at91_set_gpio_value(AT91_PIN_PC1, 0); /* power up */
|
||||
else
|
||||
at91_set_gpio_value(AT91_PIN_PA30, 1); /* power down */
|
||||
at91_set_gpio_value(AT91_PIN_PC1, 1); /* power down */
|
||||
}
|
||||
|
||||
/* Driver datas */
|
||||
static struct atmel_lcdfb_info __initdata ek_lcdc_data = {
|
||||
.lcdcon_is_backlight = true,
|
||||
.default_bpp = 16,
|
||||
.default_dmacon = ATMEL_LCDC_DMAEN,
|
||||
.default_lcdcon2 = AT91SAM9RL_DEFAULT_LCDCON2,
|
||||
.default_monspecs = &at91fb_default_monspecs,
|
||||
.atmel_lcdfb_power_control = at91_lcdc_power_control,
|
||||
.guard_time = 1,
|
||||
.lcd_wiring_mode = ATMEL_LCDC_WIRING_RGB,
|
||||
};
|
||||
|
||||
#else
|
||||
|
|
@ -206,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 */
|
||||
|
|
@ -224,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")
|
||||
|
|
|
|||
|
|
@ -47,20 +47,25 @@
|
|||
* 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 */
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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[]);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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) */
|
||||
|
||||
|
|
|
|||
155
arch/arm/mach-at91/include/mach/at91sam9g45.h
Normal file
155
arch/arm/mach-at91/include/mach/at91sam9g45.h
Normal file
|
|
@ -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
|
||||
153
arch/arm/mach-at91/include/mach/at91sam9g45_matrix.h
Normal file
153
arch/arm/mach-at91/include/mach/at91sam9g45_matrix.h
Normal file
|
|
@ -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
|
||||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -21,8 +21,10 @@
|
|||
#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)
|
||||
|
|
|
|||
|
|
@ -20,12 +20,14 @@
|
|||
#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)
|
||||
|
|
|
|||
|
|
@ -42,6 +42,11 @@
|
|||
#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)
|
||||
|
|
@ -62,6 +67,11 @@
|
|||
#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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
21
arch/arm/mach-bcmring/Kconfig
Normal file
21
arch/arm/mach-bcmring/Kconfig
Normal file
|
|
@ -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"
|
||||
8
arch/arm/mach-bcmring/Makefile
Normal file
8
arch/arm/mach-bcmring/Makefile
Normal file
|
|
@ -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/
|
||||
6
arch/arm/mach-bcmring/Makefile.boot
Normal file
6
arch/arm/mach-bcmring/Makefile.boot
Normal file
|
|
@ -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
|
||||
|
||||
157
arch/arm/mach-bcmring/arch.c
Normal file
157
arch/arm/mach-bcmring/arch.c
Normal file
|
|
@ -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
|
||||
224
arch/arm/mach-bcmring/clock.c
Normal file
224
arch/arm/mach-bcmring/clock.c
Normal file
|
|
@ -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);
|
||||
33
arch/arm/mach-bcmring/clock.h
Normal file
33
arch/arm/mach-bcmring/clock.h
Normal file
|
|
@ -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 */
|
||||
};
|
||||
367
arch/arm/mach-bcmring/core.c
Normal file
367
arch/arm/mach-bcmring/core.c
Normal file
|
|
@ -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,
|
||||
};
|
||||
30
arch/arm/mach-bcmring/core.h
Normal file
30
arch/arm/mach-bcmring/core.h
Normal file
|
|
@ -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
|
||||
3
arch/arm/mach-bcmring/csp/Makefile
Normal file
3
arch/arm/mach-bcmring/csp/Makefile
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
obj-y += dmac/
|
||||
obj-y += tmr/
|
||||
obj-y += chipc/
|
||||
1
arch/arm/mach-bcmring/csp/chipc/Makefile
Normal file
1
arch/arm/mach-bcmring/csp/chipc/Makefile
Normal file
|
|
@ -0,0 +1 @@
|
|||
obj-y += chipcHw.o chipcHw_str.o chipcHw_reset.o chipcHw_init.o
|
||||
776
arch/arm/mach-bcmring/csp/chipc/chipcHw.c
Normal file
776
arch/arm/mach-bcmring/csp/chipc/chipcHw.c
Normal file
|
|
@ -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;
|
||||
}
|
||||
293
arch/arm/mach-bcmring/csp/chipc/chipcHw_init.c
Normal file
293
arch/arm/mach-bcmring/csp/chipc/chipcHw_init.c
Normal file
|
|
@ -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);
|
||||
}
|
||||
124
arch/arm/mach-bcmring/csp/chipc/chipcHw_reset.c
Normal file
124
arch/arm/mach-bcmring/csp/chipc/chipcHw_reset.c
Normal file
|
|
@ -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"); */
|
||||
}
|
||||
64
arch/arm/mach-bcmring/csp/chipc/chipcHw_str.c
Normal file
64
arch/arm/mach-bcmring/csp/chipc/chipcHw_str.c
Normal file
|
|
@ -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)];
|
||||
}
|
||||
1
arch/arm/mach-bcmring/csp/dmac/Makefile
Normal file
1
arch/arm/mach-bcmring/csp/dmac/Makefile
Normal file
|
|
@ -0,0 +1 @@
|
|||
obj-y += dmacHw.o dmacHw_extra.o
|
||||
917
arch/arm/mach-bcmring/csp/dmac/dmacHw.c
Normal file
917
arch/arm/mach-bcmring/csp/dmac/dmacHw.c
Normal file
|
|
@ -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;
|
||||
}
|
||||
1017
arch/arm/mach-bcmring/csp/dmac/dmacHw_extra.c
Normal file
1017
arch/arm/mach-bcmring/csp/dmac/dmacHw_extra.c
Normal file
File diff suppressed because it is too large
Load diff
1
arch/arm/mach-bcmring/csp/tmr/Makefile
Normal file
1
arch/arm/mach-bcmring/csp/tmr/Makefile
Normal file
|
|
@ -0,0 +1 @@
|
|||
obj-y += tmrHw.o
|
||||
576
arch/arm/mach-bcmring/csp/tmr/tmrHw.c
Normal file
576
arch/arm/mach-bcmring/csp/tmr/tmrHw.c
Normal file
|
|
@ -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;
|
||||
}
|
||||
2321
arch/arm/mach-bcmring/dma.c
Normal file
2321
arch/arm/mach-bcmring/dma.c
Normal file
File diff suppressed because it is too large
Load diff
593
arch/arm/mach-bcmring/dma_device.c
Normal file
593
arch/arm/mach-bcmring/dma_device.c
Normal file
|
|
@ -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 */
|
||||
13
arch/arm/mach-bcmring/include/cfg_global.h
Normal file
13
arch/arm/mach-bcmring/include/cfg_global.h
Normal file
|
|
@ -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_ */
|
||||
40
arch/arm/mach-bcmring/include/cfg_global_defines.h
Normal file
40
arch/arm/mach-bcmring/include/cfg_global_defines.h
Normal file
|
|
@ -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
|
||||
35
arch/arm/mach-bcmring/include/csp/cache.h
Normal file
35
arch/arm/mach-bcmring/include/csp/cache.h
Normal file
|
|
@ -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 */
|
||||
36
arch/arm/mach-bcmring/include/csp/delay.h
Normal file
36
arch/arm/mach-bcmring/include/csp/delay.h
Normal file
|
|
@ -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 */
|
||||
596
arch/arm/mach-bcmring/include/csp/dmacHw.h
Normal file
596
arch/arm/mach-bcmring/include/csp/dmacHw.h
Normal file
|
|
@ -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 */
|
||||
32
arch/arm/mach-bcmring/include/csp/errno.h
Normal file
32
arch/arm/mach-bcmring/include/csp/errno.h
Normal file
|
|
@ -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 */
|
||||
40
arch/arm/mach-bcmring/include/csp/intcHw.h
Normal file
40
arch/arm/mach-bcmring/include/csp/intcHw.h
Normal file
|
|
@ -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 */
|
||||
|
||||
32
arch/arm/mach-bcmring/include/csp/module.h
Normal file
32
arch/arm/mach-bcmring/include/csp/module.h
Normal file
|
|
@ -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 */
|
||||
114
arch/arm/mach-bcmring/include/csp/reg.h
Normal file
114
arch/arm/mach-bcmring/include/csp/reg.h
Normal file
|
|
@ -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 */
|
||||
65
arch/arm/mach-bcmring/include/csp/secHw.h
Normal file
65
arch/arm/mach-bcmring/include/csp/secHw.h
Normal file
|
|
@ -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 */
|
||||
30
arch/arm/mach-bcmring/include/csp/stdint.h
Normal file
30
arch/arm/mach-bcmring/include/csp/stdint.h
Normal file
|
|
@ -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 */
|
||||
34
arch/arm/mach-bcmring/include/csp/string.h
Normal file
34
arch/arm/mach-bcmring/include/csp/string.h
Normal file
|
|
@ -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 */
|
||||
|
||||
263
arch/arm/mach-bcmring/include/csp/tmrHw.h
Normal file
263
arch/arm/mach-bcmring/include/csp/tmrHw.h
Normal file
|
|
@ -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 */
|
||||
7
arch/arm/mach-bcmring/include/mach/clkdev.h
Normal file
7
arch/arm/mach-bcmring/include/mach/clkdev.h
Normal file
|
|
@ -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
|
||||
63
arch/arm/mach-bcmring/include/mach/csp/cap.h
Normal file
63
arch/arm/mach-bcmring/include/mach/csp/cap.h
Normal file
|
|
@ -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
|
||||
409
arch/arm/mach-bcmring/include/mach/csp/cap_inline.h
Normal file
409
arch/arm/mach-bcmring/include/mach/csp/cap_inline.h
Normal file
|
|
@ -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
|
||||
1123
arch/arm/mach-bcmring/include/mach/csp/chipcHw_def.h
Normal file
1123
arch/arm/mach-bcmring/include/mach/csp/chipcHw_def.h
Normal file
File diff suppressed because it is too large
Load diff
1673
arch/arm/mach-bcmring/include/mach/csp/chipcHw_inline.h
Normal file
1673
arch/arm/mach-bcmring/include/mach/csp/chipcHw_inline.h
Normal file
File diff suppressed because it is too large
Load diff
530
arch/arm/mach-bcmring/include/mach/csp/chipcHw_reg.h
Normal file
530
arch/arm/mach-bcmring/include/mach/csp/chipcHw_reg.h
Normal file
|
|
@ -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 */
|
||||
872
arch/arm/mach-bcmring/include/mach/csp/ddrcReg.h
Normal file
872
arch/arm/mach-bcmring/include/mach/csp/ddrcReg.h
Normal file
|
|
@ -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 */
|
||||
145
arch/arm/mach-bcmring/include/mach/csp/dmacHw_priv.h
Normal file
145
arch/arm/mach-bcmring/include/mach/csp/dmacHw_priv.h
Normal file
|
|
@ -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 */
|
||||
406
arch/arm/mach-bcmring/include/mach/csp/dmacHw_reg.h
Normal file
406
arch/arm/mach-bcmring/include/mach/csp/dmacHw_reg.h
Normal file
|
|
@ -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 */
|
||||
73
arch/arm/mach-bcmring/include/mach/csp/hw_cfg.h
Normal file
73
arch/arm/mach-bcmring/include/mach/csp/hw_cfg.h
Normal file
|
|
@ -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 */
|
||||
|
||||
246
arch/arm/mach-bcmring/include/mach/csp/intcHw_reg.h
Normal file
246
arch/arm/mach-bcmring/include/mach/csp/intcHw_reg.h
Normal file
|
|
@ -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 */
|
||||
101
arch/arm/mach-bcmring/include/mach/csp/mm_addr.h
Normal file
101
arch/arm/mach-bcmring/include/mach/csp/mm_addr.h
Normal file
|
|
@ -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 */
|
||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue