mirror of https://gitee.com/openkylin/linux.git
Merge master.kernel.org:/home/rmk/linux-2.6-arm
This commit is contained in:
commit
bf785ee0ae
|
@ -84,7 +84,7 @@
|
|||
kputc #'\n'
|
||||
kphex r5, 8 /* decompressed kernel start */
|
||||
kputc #'-'
|
||||
kphex r8, 8 /* decompressed kernel end */
|
||||
kphex r9, 8 /* decompressed kernel end */
|
||||
kputc #'>'
|
||||
kphex r4, 8 /* kernel execution address */
|
||||
kputc #'\n'
|
||||
|
@ -116,7 +116,7 @@ start:
|
|||
.word start @ absolute load/run zImage address
|
||||
.word _edata @ zImage end address
|
||||
1: mov r7, r1 @ save architecture ID
|
||||
mov r8, #0 @ save r0
|
||||
mov r8, r2 @ save atags pointer
|
||||
|
||||
#ifndef __ARM_ARCH_2__
|
||||
/*
|
||||
|
@ -144,7 +144,7 @@ not_angel:
|
|||
|
||||
/*
|
||||
* some architecture specific code can be inserted
|
||||
* by the linker here, but it should preserve r7 and r8.
|
||||
* by the linker here, but it should preserve r7, r8, and r9.
|
||||
*/
|
||||
|
||||
.text
|
||||
|
@ -249,16 +249,17 @@ not_relocated: mov r0, #0
|
|||
* r5 = decompressed kernel start
|
||||
* r6 = processor ID
|
||||
* r7 = architecture ID
|
||||
* r8-r14 = unused
|
||||
* r8 = atags pointer
|
||||
* r9-r14 = corrupted
|
||||
*/
|
||||
add r1, r5, r0 @ end of decompressed kernel
|
||||
adr r2, reloc_start
|
||||
ldr r3, LC1
|
||||
add r3, r2, r3
|
||||
1: ldmia r2!, {r8 - r13} @ copy relocation code
|
||||
stmia r1!, {r8 - r13}
|
||||
ldmia r2!, {r8 - r13}
|
||||
stmia r1!, {r8 - r13}
|
||||
1: ldmia r2!, {r9 - r14} @ copy relocation code
|
||||
stmia r1!, {r9 - r14}
|
||||
ldmia r2!, {r9 - r14}
|
||||
stmia r1!, {r9 - r14}
|
||||
cmp r2, r3
|
||||
blo 1b
|
||||
|
||||
|
@ -308,11 +309,12 @@ params: ldr r0, =params_phys
|
|||
* r4 = kernel execution address
|
||||
* r6 = processor ID
|
||||
* r7 = architecture number
|
||||
* r8 = run-time address of "start"
|
||||
* r8 = atags pointer
|
||||
* r9 = run-time address of "start" (???)
|
||||
* On exit,
|
||||
* r1, r2, r3, r8, r9, r12 corrupted
|
||||
* r1, r2, r3, r9, r10, r12 corrupted
|
||||
* This routine must preserve:
|
||||
* r4, r5, r6, r7
|
||||
* r4, r5, r6, r7, r8
|
||||
*/
|
||||
.align 5
|
||||
cache_on: mov r3, #8 @ cache_on function
|
||||
|
@ -326,15 +328,15 @@ __setup_mmu: sub r3, r4, #16384 @ Page directory size
|
|||
* bits for the RAM area only.
|
||||
*/
|
||||
mov r0, r3
|
||||
mov r8, r0, lsr #18
|
||||
mov r8, r8, lsl #18 @ start of RAM
|
||||
add r9, r8, #0x10000000 @ a reasonable RAM size
|
||||
mov r9, r0, lsr #18
|
||||
mov r9, r9, lsl #18 @ start of RAM
|
||||
add r10, r9, #0x10000000 @ a reasonable RAM size
|
||||
mov r1, #0x12
|
||||
orr r1, r1, #3 << 10
|
||||
add r2, r3, #16384
|
||||
1: cmp r1, r8 @ if virt > start of RAM
|
||||
orrhs r1, r1, #0x0c @ set cacheable, bufferable
|
||||
cmp r1, r9 @ if virt > end of RAM
|
||||
cmp r1, r10 @ if virt > end of RAM
|
||||
bichs r1, r1, #0x0c @ clear cacheable, bufferable
|
||||
str r1, [r0], #4 @ 1:1 mapping
|
||||
add r1, r1, #1048576
|
||||
|
@ -403,26 +405,28 @@ __common_cache_on:
|
|||
* r5 = decompressed kernel start
|
||||
* r6 = processor ID
|
||||
* r7 = architecture ID
|
||||
* r8-r14 = unused
|
||||
* r8 = atags pointer
|
||||
* r9-r14 = corrupted
|
||||
*/
|
||||
.align 5
|
||||
reloc_start: add r8, r5, r0
|
||||
reloc_start: add r9, r5, r0
|
||||
debug_reloc_start
|
||||
mov r1, r4
|
||||
1:
|
||||
.rept 4
|
||||
ldmia r5!, {r0, r2, r3, r9 - r13} @ relocate kernel
|
||||
stmia r1!, {r0, r2, r3, r9 - r13}
|
||||
ldmia r5!, {r0, r2, r3, r10 - r14} @ relocate kernel
|
||||
stmia r1!, {r0, r2, r3, r10 - r14}
|
||||
.endr
|
||||
|
||||
cmp r5, r8
|
||||
cmp r5, r9
|
||||
blo 1b
|
||||
debug_reloc_end
|
||||
|
||||
call_kernel: bl cache_clean_flush
|
||||
bl cache_off
|
||||
mov r0, #0
|
||||
mov r0, #0 @ must be zero
|
||||
mov r1, r7 @ restore architecture number
|
||||
mov r2, r8 @ restore atags pointer
|
||||
mov pc, r4 @ call kernel
|
||||
|
||||
/*
|
||||
|
|
|
@ -19,6 +19,7 @@
|
|||
#include <linux/spinlock.h>
|
||||
#include <linux/capability.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/mutex.h>
|
||||
|
||||
#include <asm/rtc.h>
|
||||
#include <asm/semaphore.h>
|
||||
|
@ -35,7 +36,7 @@ static unsigned long rtc_irq_data;
|
|||
/*
|
||||
* rtc_sem protects rtc_inuse and rtc_ops
|
||||
*/
|
||||
static DECLARE_MUTEX(rtc_sem);
|
||||
static DEFINE_MUTEX(rtc_mutex);
|
||||
static unsigned long rtc_inuse;
|
||||
static struct rtc_ops *rtc_ops;
|
||||
|
||||
|
@ -356,7 +357,7 @@ static int rtc_open(struct inode *inode, struct file *file)
|
|||
{
|
||||
int ret;
|
||||
|
||||
down(&rtc_sem);
|
||||
mutex_lock(&rtc_mutex);
|
||||
|
||||
if (rtc_inuse) {
|
||||
ret = -EBUSY;
|
||||
|
@ -374,7 +375,7 @@ static int rtc_open(struct inode *inode, struct file *file)
|
|||
rtc_inuse = 1;
|
||||
}
|
||||
}
|
||||
up(&rtc_sem);
|
||||
mutex_unlock(&rtc_mutex);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
@ -480,7 +481,7 @@ int register_rtc(struct rtc_ops *ops)
|
|||
{
|
||||
int ret = -EBUSY;
|
||||
|
||||
down(&rtc_sem);
|
||||
mutex_lock(&rtc_mutex);
|
||||
if (rtc_ops == NULL) {
|
||||
rtc_ops = ops;
|
||||
|
||||
|
@ -489,7 +490,7 @@ int register_rtc(struct rtc_ops *ops)
|
|||
create_proc_read_entry("driver/rtc", 0, NULL,
|
||||
rtc_read_proc, ops);
|
||||
}
|
||||
up(&rtc_sem);
|
||||
mutex_unlock(&rtc_mutex);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
@ -497,12 +498,12 @@ EXPORT_SYMBOL(register_rtc);
|
|||
|
||||
void unregister_rtc(struct rtc_ops *rtc)
|
||||
{
|
||||
down(&rtc_sem);
|
||||
mutex_lock(&rtc_mutex);
|
||||
if (rtc == rtc_ops) {
|
||||
remove_proc_entry("driver/rtc", NULL);
|
||||
misc_deregister(&rtc_miscdev);
|
||||
rtc_ops = NULL;
|
||||
}
|
||||
up(&rtc_sem);
|
||||
mutex_unlock(&rtc_mutex);
|
||||
}
|
||||
EXPORT_SYMBOL(unregister_rtc);
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,998 @@
|
|||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.15
|
||||
# Mon Jan 9 20:57:31 2006
|
||||
#
|
||||
CONFIG_ARM=y
|
||||
CONFIG_MMU=y
|
||||
CONFIG_UID16=y
|
||||
CONFIG_RWSEM_GENERIC_SPINLOCK=y
|
||||
CONFIG_GENERIC_CALIBRATE_DELAY=y
|
||||
|
||||
#
|
||||
# Code maturity level options
|
||||
#
|
||||
CONFIG_EXPERIMENTAL=y
|
||||
CONFIG_CLEAN_COMPILE=y
|
||||
CONFIG_BROKEN_ON_SMP=y
|
||||
CONFIG_INIT_ENV_ARG_LIMIT=32
|
||||
|
||||
#
|
||||
# General setup
|
||||
#
|
||||
CONFIG_LOCALVERSION=""
|
||||
# CONFIG_LOCALVERSION_AUTO is not set
|
||||
# CONFIG_SWAP is not set
|
||||
CONFIG_SYSVIPC=y
|
||||
# CONFIG_POSIX_MQUEUE is not set
|
||||
# CONFIG_BSD_PROCESS_ACCT is not set
|
||||
CONFIG_SYSCTL=y
|
||||
# CONFIG_AUDIT is not set
|
||||
CONFIG_HOTPLUG=y
|
||||
CONFIG_KOBJECT_UEVENT=y
|
||||
# CONFIG_IKCONFIG is not set
|
||||
CONFIG_INITRAMFS_SOURCE=""
|
||||
CONFIG_CC_OPTIMIZE_FOR_SIZE=y
|
||||
# CONFIG_EMBEDDED is not set
|
||||
CONFIG_KALLSYMS=y
|
||||
# CONFIG_KALLSYMS_ALL is not set
|
||||
# CONFIG_KALLSYMS_EXTRA_PASS is not set
|
||||
CONFIG_PRINTK=y
|
||||
CONFIG_BUG=y
|
||||
CONFIG_BASE_FULL=y
|
||||
CONFIG_FUTEX=y
|
||||
CONFIG_EPOLL=y
|
||||
CONFIG_SHMEM=y
|
||||
CONFIG_CC_ALIGN_FUNCTIONS=0
|
||||
CONFIG_CC_ALIGN_LABELS=0
|
||||
CONFIG_CC_ALIGN_LOOPS=0
|
||||
CONFIG_CC_ALIGN_JUMPS=0
|
||||
# CONFIG_TINY_SHMEM is not set
|
||||
CONFIG_BASE_SMALL=0
|
||||
|
||||
#
|
||||
# Loadable module support
|
||||
#
|
||||
CONFIG_MODULES=y
|
||||
CONFIG_MODULE_UNLOAD=y
|
||||
# CONFIG_MODULE_FORCE_UNLOAD is not set
|
||||
CONFIG_OBSOLETE_MODPARM=y
|
||||
# CONFIG_MODVERSIONS is not set
|
||||
# CONFIG_MODULE_SRCVERSION_ALL is not set
|
||||
CONFIG_KMOD=y
|
||||
|
||||
#
|
||||
# Block layer
|
||||
#
|
||||
|
||||
#
|
||||
# IO Schedulers
|
||||
#
|
||||
CONFIG_IOSCHED_NOOP=y
|
||||
CONFIG_IOSCHED_AS=y
|
||||
# CONFIG_IOSCHED_DEADLINE is not set
|
||||
# CONFIG_IOSCHED_CFQ is not set
|
||||
CONFIG_DEFAULT_AS=y
|
||||
# CONFIG_DEFAULT_DEADLINE is not set
|
||||
# CONFIG_DEFAULT_CFQ is not set
|
||||
# CONFIG_DEFAULT_NOOP is not set
|
||||
CONFIG_DEFAULT_IOSCHED="anticipatory"
|
||||
|
||||
#
|
||||
# System Type
|
||||
#
|
||||
# CONFIG_ARCH_CLPS7500 is not set
|
||||
# CONFIG_ARCH_CLPS711X is not set
|
||||
# CONFIG_ARCH_CO285 is not set
|
||||
# CONFIG_ARCH_EBSA110 is not set
|
||||
# CONFIG_ARCH_CAMELOT is not set
|
||||
# CONFIG_ARCH_FOOTBRIDGE is not set
|
||||
# CONFIG_ARCH_INTEGRATOR is not set
|
||||
# CONFIG_ARCH_IOP3XX is not set
|
||||
# CONFIG_ARCH_IXP4XX is not set
|
||||
# CONFIG_ARCH_IXP2000 is not set
|
||||
# CONFIG_ARCH_L7200 is not set
|
||||
# CONFIG_ARCH_PXA is not set
|
||||
# CONFIG_ARCH_RPC is not set
|
||||
# CONFIG_ARCH_SA1100 is not set
|
||||
# CONFIG_ARCH_S3C2410 is not set
|
||||
# CONFIG_ARCH_SHARK is not set
|
||||
# CONFIG_ARCH_LH7A40X is not set
|
||||
# CONFIG_ARCH_OMAP is not set
|
||||
# CONFIG_ARCH_VERSATILE is not set
|
||||
# CONFIG_ARCH_REALVIEW is not set
|
||||
# CONFIG_ARCH_IMX is not set
|
||||
# CONFIG_ARCH_H720X is not set
|
||||
# CONFIG_ARCH_AAEC2000 is not set
|
||||
CONFIG_ARCH_AT91RM9200=y
|
||||
|
||||
#
|
||||
# AT91RM9200 Implementations
|
||||
#
|
||||
|
||||
#
|
||||
# AT91RM9200 Board Type
|
||||
#
|
||||
# CONFIG_ARCH_AT91RM9200DK is not set
|
||||
CONFIG_MACH_AT91RM9200EK=y
|
||||
# CONFIG_MACH_CSB337 is not set
|
||||
# CONFIG_MACH_CSB637 is not set
|
||||
# CONFIG_MACH_CARMEVA is not set
|
||||
# CONFIG_MACH_KB9200 is not set
|
||||
# CONFIG_MACH_ATEB9200 is not set
|
||||
|
||||
#
|
||||
# AT91RM9200 Feature Selections
|
||||
#
|
||||
CONFIG_AT91_PROGRAMMABLE_CLOCKS=y
|
||||
|
||||
#
|
||||
# Processor Type
|
||||
#
|
||||
CONFIG_CPU_32=y
|
||||
CONFIG_CPU_ARM920T=y
|
||||
CONFIG_CPU_32v4=y
|
||||
CONFIG_CPU_ABRT_EV4T=y
|
||||
CONFIG_CPU_CACHE_V4WT=y
|
||||
CONFIG_CPU_CACHE_VIVT=y
|
||||
CONFIG_CPU_COPY_V4WB=y
|
||||
CONFIG_CPU_TLB_V4WBI=y
|
||||
|
||||
#
|
||||
# Processor Features
|
||||
#
|
||||
# CONFIG_ARM_THUMB is not set
|
||||
# CONFIG_CPU_ICACHE_DISABLE is not set
|
||||
# CONFIG_CPU_DCACHE_DISABLE is not set
|
||||
# CONFIG_CPU_DCACHE_WRITETHROUGH is not set
|
||||
|
||||
#
|
||||
# Bus support
|
||||
#
|
||||
CONFIG_ISA_DMA_API=y
|
||||
|
||||
#
|
||||
# PCCARD (PCMCIA/CardBus) support
|
||||
#
|
||||
# CONFIG_PCCARD is not set
|
||||
|
||||
#
|
||||
# Kernel Features
|
||||
#
|
||||
# CONFIG_PREEMPT is not set
|
||||
# CONFIG_NO_IDLE_HZ is not set
|
||||
# CONFIG_ARCH_DISCONTIGMEM_ENABLE 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_SPARSEMEM_STATIC is not set
|
||||
CONFIG_SPLIT_PTLOCK_CPUS=4096
|
||||
CONFIG_LEDS=y
|
||||
CONFIG_LEDS_TIMER=y
|
||||
CONFIG_LEDS_CPU=y
|
||||
CONFIG_ALIGNMENT_TRAP=y
|
||||
|
||||
#
|
||||
# Boot options
|
||||
#
|
||||
CONFIG_ZBOOT_ROM_TEXT=0x0
|
||||
CONFIG_ZBOOT_ROM_BSS=0x0
|
||||
CONFIG_CMDLINE="mem=32M console=ttyS0,115200 initrd=0x20410000,3145728 root=/dev/ram0 rw"
|
||||
# CONFIG_XIP_KERNEL is not set
|
||||
|
||||
#
|
||||
# Floating point emulation
|
||||
#
|
||||
|
||||
#
|
||||
# At least one emulation must be selected
|
||||
#
|
||||
CONFIG_FPE_NWFPE=y
|
||||
# CONFIG_FPE_NWFPE_XP is not set
|
||||
# CONFIG_FPE_FASTFPE is not set
|
||||
|
||||
#
|
||||
# Userspace binary formats
|
||||
#
|
||||
CONFIG_BINFMT_ELF=y
|
||||
# CONFIG_BINFMT_AOUT is not set
|
||||
# CONFIG_BINFMT_MISC is not set
|
||||
# CONFIG_ARTHUR is not set
|
||||
|
||||
#
|
||||
# Power management options
|
||||
#
|
||||
# CONFIG_PM is not set
|
||||
|
||||
#
|
||||
# Networking
|
||||
#
|
||||
CONFIG_NET=y
|
||||
|
||||
#
|
||||
# Networking options
|
||||
#
|
||||
CONFIG_PACKET=y
|
||||
# CONFIG_PACKET_MMAP is not set
|
||||
CONFIG_UNIX=y
|
||||
# CONFIG_NET_KEY is not set
|
||||
CONFIG_INET=y
|
||||
# CONFIG_IP_MULTICAST is not set
|
||||
# CONFIG_IP_ADVANCED_ROUTER is not set
|
||||
CONFIG_IP_FIB_HASH=y
|
||||
CONFIG_IP_PNP=y
|
||||
# CONFIG_IP_PNP_DHCP is not set
|
||||
CONFIG_IP_PNP_BOOTP=y
|
||||
# CONFIG_IP_PNP_RARP is not set
|
||||
# CONFIG_NET_IPIP is not set
|
||||
# CONFIG_NET_IPGRE is not set
|
||||
# CONFIG_ARPD is not set
|
||||
# CONFIG_SYN_COOKIES is not set
|
||||
# CONFIG_INET_AH is not set
|
||||
# CONFIG_INET_ESP is not set
|
||||
# CONFIG_INET_IPCOMP is not set
|
||||
# CONFIG_INET_TUNNEL is not set
|
||||
CONFIG_INET_DIAG=y
|
||||
CONFIG_INET_TCP_DIAG=y
|
||||
# CONFIG_TCP_CONG_ADVANCED is not set
|
||||
CONFIG_TCP_CONG_BIC=y
|
||||
# CONFIG_IPV6 is not set
|
||||
# CONFIG_NETFILTER is not set
|
||||
|
||||
#
|
||||
# DCCP Configuration (EXPERIMENTAL)
|
||||
#
|
||||
# CONFIG_IP_DCCP is not set
|
||||
|
||||
#
|
||||
# SCTP Configuration (EXPERIMENTAL)
|
||||
#
|
||||
# CONFIG_IP_SCTP is not set
|
||||
# CONFIG_ATM is not set
|
||||
# CONFIG_BRIDGE 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_NET_DIVERT is not set
|
||||
# CONFIG_ECONET is not set
|
||||
# CONFIG_WAN_ROUTER is not set
|
||||
|
||||
#
|
||||
# QoS and/or fair queueing
|
||||
#
|
||||
# CONFIG_NET_SCHED is not set
|
||||
|
||||
#
|
||||
# Network testing
|
||||
#
|
||||
# CONFIG_NET_PKTGEN is not set
|
||||
# CONFIG_HAMRADIO is not set
|
||||
# CONFIG_IRDA is not set
|
||||
# CONFIG_BT is not set
|
||||
# CONFIG_IEEE80211 is not set
|
||||
|
||||
#
|
||||
# Device Drivers
|
||||
#
|
||||
|
||||
#
|
||||
# Generic Driver Options
|
||||
#
|
||||
CONFIG_STANDALONE=y
|
||||
CONFIG_PREVENT_FIRMWARE_BUILD=y
|
||||
# CONFIG_FW_LOADER is not set
|
||||
# CONFIG_DEBUG_DRIVER is not set
|
||||
|
||||
#
|
||||
# Connector - unified userspace <-> kernelspace linker
|
||||
#
|
||||
# CONFIG_CONNECTOR is not set
|
||||
|
||||
#
|
||||
# Memory Technology Devices (MTD)
|
||||
#
|
||||
CONFIG_MTD=y
|
||||
# CONFIG_MTD_DEBUG is not set
|
||||
# CONFIG_MTD_CONCAT is not set
|
||||
CONFIG_MTD_PARTITIONS=y
|
||||
# CONFIG_MTD_REDBOOT_PARTS is not set
|
||||
CONFIG_MTD_CMDLINE_PARTS=y
|
||||
# CONFIG_MTD_AFS_PARTS is not set
|
||||
|
||||
#
|
||||
# User Modules And Translation Layers
|
||||
#
|
||||
CONFIG_MTD_CHAR=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
|
||||
|
||||
#
|
||||
# RAM/ROM/Flash chip drivers
|
||||
#
|
||||
CONFIG_MTD_CFI=y
|
||||
CONFIG_MTD_JEDECPROBE=y
|
||||
CONFIG_MTD_GEN_PROBE=y
|
||||
# CONFIG_MTD_CFI_ADV_OPTIONS is not set
|
||||
CONFIG_MTD_MAP_BANK_WIDTH_1=y
|
||||
CONFIG_MTD_MAP_BANK_WIDTH_2=y
|
||||
CONFIG_MTD_MAP_BANK_WIDTH_4=y
|
||||
# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
|
||||
# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
|
||||
# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
|
||||
CONFIG_MTD_CFI_I1=y
|
||||
CONFIG_MTD_CFI_I2=y
|
||||
# CONFIG_MTD_CFI_I4 is not set
|
||||
# CONFIG_MTD_CFI_I8 is not set
|
||||
# CONFIG_MTD_CFI_INTELEXT is not set
|
||||
CONFIG_MTD_CFI_AMDSTD=y
|
||||
CONFIG_MTD_CFI_AMDSTD_RETRY=0
|
||||
# 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
|
||||
# CONFIG_MTD_XIP is not set
|
||||
|
||||
#
|
||||
# Mapping drivers for chip access
|
||||
#
|
||||
# CONFIG_MTD_COMPLEX_MAPPINGS is not set
|
||||
CONFIG_MTD_PHYSMAP=y
|
||||
CONFIG_MTD_PHYSMAP_START=0x10000000
|
||||
CONFIG_MTD_PHYSMAP_LEN=0x800000
|
||||
CONFIG_MTD_PHYSMAP_BANKWIDTH=2
|
||||
# CONFIG_MTD_ARM_INTEGRATOR is not set
|
||||
# CONFIG_MTD_IMPA7 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_BLKMTD 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_AT91_DATAFLASH=y
|
||||
CONFIG_MTD_AT91_DATAFLASH_CARD=y
|
||||
|
||||
#
|
||||
# NAND Flash Device Drivers
|
||||
#
|
||||
# CONFIG_MTD_NAND is not set
|
||||
|
||||
#
|
||||
# OneNAND Flash Device Drivers
|
||||
#
|
||||
# CONFIG_MTD_ONENAND is not set
|
||||
|
||||
#
|
||||
# Parallel port support
|
||||
#
|
||||
# CONFIG_PARPORT is not set
|
||||
|
||||
#
|
||||
# Plug and Play support
|
||||
#
|
||||
|
||||
#
|
||||
# Block devices
|
||||
#
|
||||
# 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_UB is not set
|
||||
CONFIG_BLK_DEV_RAM=y
|
||||
CONFIG_BLK_DEV_RAM_COUNT=16
|
||||
CONFIG_BLK_DEV_RAM_SIZE=8192
|
||||
CONFIG_BLK_DEV_INITRD=y
|
||||
# CONFIG_CDROM_PKTCDVD is not set
|
||||
# CONFIG_ATA_OVER_ETH is not set
|
||||
|
||||
#
|
||||
# SCSI device support
|
||||
#
|
||||
# CONFIG_RAID_ATTRS is not set
|
||||
# CONFIG_SCSI is not set
|
||||
|
||||
#
|
||||
# Multi-device support (RAID and LVM)
|
||||
#
|
||||
# CONFIG_MD is not set
|
||||
|
||||
#
|
||||
# Fusion MPT device support
|
||||
#
|
||||
# CONFIG_FUSION is not set
|
||||
|
||||
#
|
||||
# IEEE 1394 (FireWire) support
|
||||
#
|
||||
|
||||
#
|
||||
# I2O device support
|
||||
#
|
||||
|
||||
#
|
||||
# Network device support
|
||||
#
|
||||
CONFIG_NETDEVICES=y
|
||||
# CONFIG_DUMMY is not set
|
||||
# CONFIG_BONDING is not set
|
||||
# CONFIG_EQUALIZER is not set
|
||||
# CONFIG_TUN is not set
|
||||
|
||||
#
|
||||
# PHY device support
|
||||
#
|
||||
# CONFIG_PHYLIB is not set
|
||||
|
||||
#
|
||||
# Ethernet (10 or 100Mbit)
|
||||
#
|
||||
CONFIG_NET_ETHERNET=y
|
||||
CONFIG_MII=y
|
||||
CONFIG_ARM_AT91_ETHER=y
|
||||
# CONFIG_SMC91X is not set
|
||||
# CONFIG_DM9000 is not set
|
||||
|
||||
#
|
||||
# Ethernet (1000 Mbit)
|
||||
#
|
||||
|
||||
#
|
||||
# Ethernet (10000 Mbit)
|
||||
#
|
||||
|
||||
#
|
||||
# Token Ring devices
|
||||
#
|
||||
|
||||
#
|
||||
# Wireless LAN (non-hamradio)
|
||||
#
|
||||
# CONFIG_NET_RADIO is not set
|
||||
|
||||
#
|
||||
# Wan interfaces
|
||||
#
|
||||
# CONFIG_WAN is not set
|
||||
# CONFIG_PPP is not set
|
||||
# CONFIG_SLIP is not set
|
||||
# CONFIG_SHAPER is not set
|
||||
# CONFIG_NETCONSOLE is not set
|
||||
# CONFIG_NETPOLL is not set
|
||||
# CONFIG_NET_POLL_CONTROLLER is not set
|
||||
|
||||
#
|
||||
# ISDN subsystem
|
||||
#
|
||||
# CONFIG_ISDN is not set
|
||||
|
||||
#
|
||||
# Input device support
|
||||
#
|
||||
CONFIG_INPUT=y
|
||||
|
||||
#
|
||||
# Userland interfaces
|
||||
#
|
||||
CONFIG_INPUT_MOUSEDEV=y
|
||||
# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
|
||||
CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
|
||||
CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
|
||||
# CONFIG_INPUT_JOYDEV is not set
|
||||
# CONFIG_INPUT_TSDEV 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_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_VT_CONSOLE=y
|
||||
CONFIG_HW_CONSOLE=y
|
||||
# CONFIG_SERIAL_NONSTANDARD is not set
|
||||
|
||||
#
|
||||
# Serial drivers
|
||||
#
|
||||
# CONFIG_SERIAL_8250 is not set
|
||||
|
||||
#
|
||||
# Non-8250 serial port support
|
||||
#
|
||||
CONFIG_SERIAL_AT91=y
|
||||
CONFIG_SERIAL_AT91_CONSOLE=y
|
||||
# CONFIG_SERIAL_AT91_TTYAT is not set
|
||||
CONFIG_SERIAL_CORE=y
|
||||
CONFIG_SERIAL_CORE_CONSOLE=y
|
||||
CONFIG_UNIX98_PTYS=y
|
||||
CONFIG_LEGACY_PTYS=y
|
||||
CONFIG_LEGACY_PTY_COUNT=256
|
||||
|
||||
#
|
||||
# IPMI
|
||||
#
|
||||
# CONFIG_IPMI_HANDLER is not set
|
||||
|
||||
#
|
||||
# Watchdog Cards
|
||||
#
|
||||
CONFIG_WATCHDOG=y
|
||||
CONFIG_WATCHDOG_NOWAYOUT=y
|
||||
|
||||
#
|
||||
# Watchdog Device Drivers
|
||||
#
|
||||
# CONFIG_SOFT_WATCHDOG is not set
|
||||
CONFIG_AT91_WATCHDOG=y
|
||||
|
||||
#
|
||||
# USB-based Watchdog Cards
|
||||
#
|
||||
# CONFIG_USBPCWATCHDOG is not set
|
||||
# CONFIG_NVRAM is not set
|
||||
# CONFIG_RTC is not set
|
||||
CONFIG_AT91_RTC=y
|
||||
# CONFIG_DTLK is not set
|
||||
# CONFIG_R3964 is not set
|
||||
|
||||
#
|
||||
# Ftape, the floppy tape device driver
|
||||
#
|
||||
# CONFIG_RAW_DRIVER is not set
|
||||
|
||||
#
|
||||
# TPM devices
|
||||
#
|
||||
# CONFIG_TCG_TPM is not set
|
||||
# CONFIG_TELCLOCK is not set
|
||||
CONFIG_AT91_SPI=y
|
||||
CONFIG_AT91_SPIDEV=y
|
||||
|
||||
#
|
||||
# I2C support
|
||||
#
|
||||
CONFIG_I2C=y
|
||||
CONFIG_I2C_CHARDEV=y
|
||||
|
||||
#
|
||||
# I2C Algorithms
|
||||
#
|
||||
# CONFIG_I2C_ALGOBIT is not set
|
||||
# CONFIG_I2C_ALGOPCF is not set
|
||||
# CONFIG_I2C_ALGOPCA is not set
|
||||
|
||||
#
|
||||
# I2C Hardware Bus support
|
||||
#
|
||||
CONFIG_I2C_AT91=y
|
||||
# CONFIG_I2C_PARPORT_LIGHT is not set
|
||||
# CONFIG_I2C_STUB is not set
|
||||
# CONFIG_I2C_PCA_ISA is not set
|
||||
|
||||
#
|
||||
# Miscellaneous I2C Chip support
|
||||
#
|
||||
# CONFIG_SENSORS_DS1337 is not set
|
||||
# CONFIG_SENSORS_DS1374 is not set
|
||||
# CONFIG_SENSORS_EEPROM is not set
|
||||
# CONFIG_SENSORS_PCF8574 is not set
|
||||
# CONFIG_SENSORS_PCA9539 is not set
|
||||
# CONFIG_SENSORS_PCF8591 is not set
|
||||
# CONFIG_SENSORS_RTC8564 is not set
|
||||
# CONFIG_SENSORS_MAX6875 is not set
|
||||
# CONFIG_RTC_X1205_I2C is not set
|
||||
# CONFIG_I2C_DEBUG_CORE is not set
|
||||
# CONFIG_I2C_DEBUG_ALGO is not set
|
||||
# CONFIG_I2C_DEBUG_BUS is not set
|
||||
# CONFIG_I2C_DEBUG_CHIP is not set
|
||||
|
||||
#
|
||||
# Hardware Monitoring support
|
||||
#
|
||||
CONFIG_HWMON=y
|
||||
# CONFIG_HWMON_VID is not set
|
||||
# CONFIG_SENSORS_ADM1021 is not set
|
||||
# CONFIG_SENSORS_ADM1025 is not set
|
||||
# CONFIG_SENSORS_ADM1026 is not set
|
||||
# CONFIG_SENSORS_ADM1031 is not set
|
||||
# CONFIG_SENSORS_ADM9240 is not set
|
||||
# CONFIG_SENSORS_ASB100 is not set
|
||||
# CONFIG_SENSORS_ATXP1 is not set
|
||||
# CONFIG_SENSORS_DS1621 is not set
|
||||
# CONFIG_SENSORS_FSCHER is not set
|
||||
# CONFIG_SENSORS_FSCPOS is not set
|
||||
# CONFIG_SENSORS_GL518SM is not set
|
||||
# CONFIG_SENSORS_GL520SM is not set
|
||||
# CONFIG_SENSORS_IT87 is not set
|
||||
# CONFIG_SENSORS_LM63 is not set
|
||||
# CONFIG_SENSORS_LM75 is not set
|
||||
# CONFIG_SENSORS_LM77 is not set
|
||||
# CONFIG_SENSORS_LM78 is not set
|
||||
# CONFIG_SENSORS_LM80 is not set
|
||||
# CONFIG_SENSORS_LM83 is not set
|
||||
# CONFIG_SENSORS_LM85 is not set
|
||||
# CONFIG_SENSORS_LM87 is not set
|
||||
# CONFIG_SENSORS_LM90 is not set
|
||||
# CONFIG_SENSORS_LM92 is not set
|
||||
# CONFIG_SENSORS_MAX1619 is not set
|
||||
# CONFIG_SENSORS_PC87360 is not set
|
||||
# CONFIG_SENSORS_SMSC47M1 is not set
|
||||
# CONFIG_SENSORS_SMSC47B397 is not set
|
||||
# CONFIG_SENSORS_W83781D is not set
|
||||
# CONFIG_SENSORS_W83792D is not set
|
||||
# CONFIG_SENSORS_W83L785TS is not set
|
||||
# CONFIG_SENSORS_W83627HF is not set
|
||||
# CONFIG_SENSORS_W83627EHF is not set
|
||||
# CONFIG_HWMON_DEBUG_CHIP is not set
|
||||
|
||||
#
|
||||
# Misc devices
|
||||
#
|
||||
|
||||
#
|
||||
# Multimedia Capabilities Port drivers
|
||||
#
|
||||
|
||||
#
|
||||
# Multimedia devices
|
||||
#
|
||||
# CONFIG_VIDEO_DEV is not set
|
||||
|
||||
#
|
||||
# Digital Video Broadcasting Devices
|
||||
#
|
||||
# CONFIG_DVB is not set
|
||||
|
||||
#
|
||||
# Graphics support
|
||||
#
|
||||
CONFIG_FB=y
|
||||
CONFIG_FB_CFB_FILLRECT=y
|
||||
CONFIG_FB_CFB_COPYAREA=y
|
||||
CONFIG_FB_CFB_IMAGEBLIT=y
|
||||
# CONFIG_FB_MACMODES is not set
|
||||
# CONFIG_FB_MODE_HELPERS is not set
|
||||
# CONFIG_FB_TILEBLITTING is not set
|
||||
CONFIG_FB_S1D13XXX=y
|
||||
# CONFIG_FB_VIRTUAL is not set
|
||||
|
||||
#
|
||||
# Console display driver support
|
||||
#
|
||||
# CONFIG_VGA_CONSOLE is not set
|
||||
CONFIG_DUMMY_CONSOLE=y
|
||||
# CONFIG_FRAMEBUFFER_CONSOLE is not set
|
||||
|
||||
#
|
||||
# Logo configuration
|
||||
#
|
||||
# CONFIG_LOGO is not set
|
||||
# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
|
||||
|
||||
#
|
||||
# Sound
|
||||
#
|
||||
# CONFIG_SOUND is not set
|
||||
|
||||
#
|
||||
# USB support
|
||||
#
|
||||
CONFIG_USB_ARCH_HAS_HCD=y
|
||||
CONFIG_USB_ARCH_HAS_OHCI=y
|
||||
CONFIG_USB=y
|
||||
CONFIG_USB_DEBUG=y
|
||||
|
||||
#
|
||||
# Miscellaneous USB options
|
||||
#
|
||||
CONFIG_USB_DEVICEFS=y
|
||||
# CONFIG_USB_BANDWIDTH is not set
|
||||
# CONFIG_USB_DYNAMIC_MINORS is not set
|
||||
# CONFIG_USB_OTG is not set
|
||||
|
||||
#
|
||||
# USB Host Controller Drivers
|
||||
#
|
||||
# CONFIG_USB_ISP116X_HCD is not set
|
||||
CONFIG_USB_OHCI_HCD=y
|
||||
# CONFIG_USB_OHCI_BIG_ENDIAN is not set
|
||||
CONFIG_USB_OHCI_LITTLE_ENDIAN=y
|
||||
# CONFIG_USB_SL811_HCD is not set
|
||||
|
||||
#
|
||||
# USB Device Class drivers
|
||||
#
|
||||
# CONFIG_USB_ACM is not set
|
||||
# CONFIG_USB_PRINTER is not set
|
||||
|
||||
#
|
||||
# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
|
||||
#
|
||||
|
||||
#
|
||||
# may also be needed; see USB_STORAGE Help for more information
|
||||
#
|
||||
# CONFIG_USB_STORAGE is not set
|
||||
|
||||
#
|
||||
# USB Input Devices
|
||||
#
|
||||
# CONFIG_USB_HID is not set
|
||||
|
||||
#
|
||||
# USB HID Boot Protocol drivers
|
||||
#
|
||||
# CONFIG_USB_KBD is not set
|
||||
# CONFIG_USB_MOUSE is not set
|
||||
# CONFIG_USB_AIPTEK is not set
|
||||
# CONFIG_USB_WACOM is not set
|
||||
# CONFIG_USB_ACECAD is not set
|
||||
# CONFIG_USB_KBTAB is not set
|
||||
# CONFIG_USB_POWERMATE is not set
|
||||
# CONFIG_USB_MTOUCH is not set
|
||||
# CONFIG_USB_ITMTOUCH is not set
|
||||
# CONFIG_USB_EGALAX is not set
|
||||
# CONFIG_USB_YEALINK is not set
|
||||
# CONFIG_USB_XPAD is not set
|
||||
# CONFIG_USB_ATI_REMOTE is not set
|
||||
# CONFIG_USB_KEYSPAN_REMOTE is not set
|
||||
# CONFIG_USB_APPLETOUCH is not set
|
||||
|
||||
#
|
||||
# USB Imaging devices
|
||||
#
|
||||
# CONFIG_USB_MDC800 is not set
|
||||
|
||||
#
|
||||
# USB Multimedia devices
|
||||
#
|
||||
# CONFIG_USB_DABUSB is not set
|
||||
|
||||
#
|
||||
# Video4Linux support is needed for USB Multimedia device support
|
||||
#
|
||||
|
||||
#
|
||||
# USB Network Adapters
|
||||
#
|
||||
# CONFIG_USB_CATC is not set
|
||||
# CONFIG_USB_KAWETH is not set
|
||||
# CONFIG_USB_PEGASUS is not set
|
||||
# CONFIG_USB_RTL8150 is not set
|
||||
# CONFIG_USB_USBNET is not set
|
||||
CONFIG_USB_MON=y
|
||||
|
||||
#
|
||||
# USB port drivers
|
||||
#
|
||||
|
||||
#
|
||||
# USB Serial Converter support
|
||||
#
|
||||
# CONFIG_USB_SERIAL is not set
|
||||
|
||||
#
|
||||
# USB Miscellaneous drivers
|
||||
#
|
||||
# CONFIG_USB_EMI62 is not set
|
||||
# CONFIG_USB_EMI26 is not set
|
||||
# CONFIG_USB_AUERSWALD is not set
|
||||
# CONFIG_USB_RIO500 is not set
|
||||
# CONFIG_USB_LEGOTOWER is not set
|
||||
# CONFIG_USB_LCD is not set
|
||||
# CONFIG_USB_LED is not set
|
||||
# CONFIG_USB_CYTHERM is not set
|
||||
# CONFIG_USB_PHIDGETKIT is not set
|
||||
# CONFIG_USB_PHIDGETSERVO is not set
|
||||
# CONFIG_USB_IDMOUSE is not set
|
||||
# CONFIG_USB_LD is not set
|
||||
# CONFIG_USB_TEST is not set
|
||||
|
||||
#
|
||||
# USB DSL modem support
|
||||
#
|
||||
|
||||
#
|
||||
# USB Gadget Support
|
||||
#
|
||||
CONFIG_USB_GADGET=y
|
||||
# CONFIG_USB_GADGET_DEBUG_FILES is not set
|
||||
CONFIG_USB_GADGET_SELECTED=y
|
||||
# CONFIG_USB_GADGET_NET2280 is not set
|
||||
# CONFIG_USB_GADGET_PXA2XX is not set
|
||||
# CONFIG_USB_GADGET_GOKU is not set
|
||||
# CONFIG_USB_GADGET_LH7A40X is not set
|
||||
# CONFIG_USB_GADGET_OMAP is not set
|
||||
CONFIG_USB_GADGET_AT91=y
|
||||
CONFIG_USB_AT91=y
|
||||
# CONFIG_USB_GADGET_DUMMY_HCD is not set
|
||||
# CONFIG_USB_GADGET_DUALSPEED is not set
|
||||
# CONFIG_USB_ZERO is not set
|
||||
# CONFIG_USB_ETH is not set
|
||||
# CONFIG_USB_GADGETFS is not set
|
||||
# CONFIG_USB_FILE_STORAGE is not set
|
||||
# CONFIG_USB_G_SERIAL is not set
|
||||
|
||||
#
|
||||
# MMC/SD Card support
|
||||
#
|
||||
CONFIG_MMC=y
|
||||
# CONFIG_MMC_DEBUG is not set
|
||||
CONFIG_MMC_BLOCK=y
|
||||
# CONFIG_MMC_WBSD is not set
|
||||
CONFIG_MMC_AT91RM9200=y
|
||||
|
||||
#
|
||||
# File systems
|
||||
#
|
||||
CONFIG_EXT2_FS=y
|
||||
# CONFIG_EXT2_FS_XATTR is not set
|
||||
# CONFIG_EXT2_FS_XIP is not set
|
||||
# CONFIG_EXT3_FS is not set
|
||||
# CONFIG_JBD is not set
|
||||
# CONFIG_REISERFS_FS is not set
|
||||
# CONFIG_JFS_FS is not set
|
||||
# CONFIG_FS_POSIX_ACL is not set
|
||||
# CONFIG_XFS_FS is not set
|
||||
# CONFIG_MINIX_FS is not set
|
||||
# CONFIG_ROMFS_FS is not set
|
||||
CONFIG_INOTIFY=y
|
||||
# CONFIG_QUOTA is not set
|
||||
CONFIG_DNOTIFY=y
|
||||
# CONFIG_AUTOFS_FS is not set
|
||||
# CONFIG_AUTOFS4_FS is not set
|
||||
# CONFIG_FUSE_FS 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_SYSFS=y
|
||||
CONFIG_TMPFS=y
|
||||
# CONFIG_HUGETLB_PAGE is not set
|
||||
CONFIG_RAMFS=y
|
||||
# CONFIG_RELAYFS_FS is not set
|
||||
|
||||
#
|
||||
# Miscellaneous filesystems
|
||||
#
|
||||
# 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_JFFS_FS is not set
|
||||
# CONFIG_JFFS2_FS is not set
|
||||
CONFIG_CRAMFS=y
|
||||
# CONFIG_VXFS_FS is not set
|
||||
# CONFIG_HPFS_FS is not set
|
||||
# CONFIG_QNX4FS_FS is not set
|
||||
# CONFIG_SYSV_FS is not set
|
||||
# CONFIG_UFS_FS is not set
|
||||
|
||||
#
|
||||
# Network File Systems
|
||||
#
|
||||
# CONFIG_NFS_FS is not set
|
||||
# CONFIG_NFSD is not set
|
||||
# CONFIG_SMB_FS is not set
|
||||
# CONFIG_CIFS is not set
|
||||
# CONFIG_NCP_FS is not set
|
||||
# CONFIG_CODA_FS is not set
|
||||
# CONFIG_AFS_FS is not set
|
||||
# CONFIG_9P_FS is not set
|
||||
|
||||
#
|
||||
# Partition Types
|
||||
#
|
||||
# CONFIG_PARTITION_ADVANCED is not set
|
||||
CONFIG_MSDOS_PARTITION=y
|
||||
|
||||
#
|
||||
# Native Language Support
|
||||
#
|
||||
# CONFIG_NLS is not set
|
||||
|
||||
#
|
||||
# Profiling support
|
||||
#
|
||||
# CONFIG_PROFILING is not set
|
||||
|
||||
#
|
||||
# Kernel hacking
|
||||
#
|
||||
# CONFIG_PRINTK_TIME is not set
|
||||
CONFIG_DEBUG_KERNEL=y
|
||||
# CONFIG_MAGIC_SYSRQ is not set
|
||||
CONFIG_LOG_BUF_SHIFT=14
|
||||
CONFIG_DETECT_SOFTLOCKUP=y
|
||||
# CONFIG_SCHEDSTATS is not set
|
||||
# CONFIG_DEBUG_SLAB is not set
|
||||
# CONFIG_DEBUG_SPINLOCK is not set
|
||||
# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
|
||||
# CONFIG_DEBUG_KOBJECT is not set
|
||||
CONFIG_DEBUG_BUGVERBOSE=y
|
||||
# CONFIG_DEBUG_INFO is not set
|
||||
# CONFIG_DEBUG_FS is not set
|
||||
# CONFIG_DEBUG_VM is not set
|
||||
CONFIG_FRAME_POINTER=y
|
||||
# CONFIG_RCU_TORTURE_TEST is not set
|
||||
CONFIG_DEBUG_USER=y
|
||||
# CONFIG_DEBUG_WAITQ is not set
|
||||
# CONFIG_DEBUG_ERRORS is not set
|
||||
CONFIG_DEBUG_LL=y
|
||||
# CONFIG_DEBUG_ICEDCC is not set
|
||||
|
||||
#
|
||||
# Security options
|
||||
#
|
||||
# CONFIG_KEYS is not set
|
||||
# CONFIG_SECURITY is not set
|
||||
|
||||
#
|
||||
# Cryptographic options
|
||||
#
|
||||
# CONFIG_CRYPTO is not set
|
||||
|
||||
#
|
||||
# Hardware crypto devices
|
||||
#
|
||||
|
||||
#
|
||||
# Library routines
|
||||
#
|
||||
# CONFIG_CRC_CCITT is not set
|
||||
# CONFIG_CRC16 is not set
|
||||
CONFIG_CRC32=y
|
||||
# CONFIG_LIBCRC32C is not set
|
||||
CONFIG_ZLIB_INFLATE=y
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -40,6 +40,7 @@
|
|||
#include <linux/proc_fs.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/mutex.h>
|
||||
|
||||
#include <asm/dma.h>
|
||||
#include <asm/ecard.h>
|
||||
|
@ -206,7 +207,7 @@ static void ecard_task_readbytes(struct ecard_request *req)
|
|||
|
||||
static DECLARE_WAIT_QUEUE_HEAD(ecard_wait);
|
||||
static struct ecard_request *ecard_req;
|
||||
static DECLARE_MUTEX(ecard_sem);
|
||||
static DEFINE_MUTEX(ecard_mutex);
|
||||
|
||||
/*
|
||||
* Set up the expansion card daemon's page tables.
|
||||
|
@ -299,7 +300,7 @@ static void ecard_call(struct ecard_request *req)
|
|||
|
||||
req->complete = &completion;
|
||||
|
||||
down(&ecard_sem);
|
||||
mutex_lock(&ecard_mutex);
|
||||
ecard_req = req;
|
||||
wake_up(&ecard_wait);
|
||||
|
||||
|
@ -307,7 +308,7 @@ static void ecard_call(struct ecard_request *req)
|
|||
* Now wait for kecardd to run.
|
||||
*/
|
||||
wait_for_completion(&completion);
|
||||
up(&ecard_sem);
|
||||
mutex_unlock(&ecard_mutex);
|
||||
}
|
||||
|
||||
/* ======================= Mid-level card control ===================== */
|
||||
|
|
|
@ -101,7 +101,7 @@ void __attribute__((naked)) set_fiq_regs(struct pt_regs *regs)
|
|||
ldmia %1, {r8 - r14}\n\
|
||||
msr cpsr_c, %0 @ return to SVC mode\n\
|
||||
mov r0, r0\n\
|
||||
ldmea fp, {fp, sp, pc}"
|
||||
ldmfd sp, {fp, sp, pc}"
|
||||
: "=&r" (tmp)
|
||||
: "r" (®s->ARM_r8), "I" (PSR_I_BIT | PSR_F_BIT | FIQ_MODE));
|
||||
}
|
||||
|
@ -119,7 +119,7 @@ void __attribute__((naked)) get_fiq_regs(struct pt_regs *regs)
|
|||
stmia %1, {r8 - r14}\n\
|
||||
msr cpsr_c, %0 @ return to SVC mode\n\
|
||||
mov r0, r0\n\
|
||||
ldmea fp, {fp, sp, pc}"
|
||||
ldmfd sp, {fp, sp, pc}"
|
||||
: "=&r" (tmp)
|
||||
: "r" (®s->ARM_r8), "I" (PSR_I_BIT | PSR_F_BIT | FIQ_MODE));
|
||||
}
|
||||
|
|
|
@ -205,7 +205,7 @@ static const char *proc_arch[] = {
|
|||
"5TE",
|
||||
"5TEJ",
|
||||
"6TEJ",
|
||||
"?(10)",
|
||||
"7",
|
||||
"?(11)",
|
||||
"?(12)",
|
||||
"?(13)",
|
||||
|
@ -258,14 +258,17 @@ int cpu_architecture(void)
|
|||
{
|
||||
int cpu_arch;
|
||||
|
||||
if ((processor_id & 0x0000f000) == 0) {
|
||||
if ((processor_id & 0x0008f000) == 0) {
|
||||
cpu_arch = CPU_ARCH_UNKNOWN;
|
||||
} else if ((processor_id & 0x0000f000) == 0x00007000) {
|
||||
} else if ((processor_id & 0x0008f000) == 0x00007000) {
|
||||
cpu_arch = (processor_id & (1 << 23)) ? CPU_ARCH_ARMv4T : CPU_ARCH_ARMv3;
|
||||
} else {
|
||||
} else if ((processor_id & 0x00080000) == 0x00000000) {
|
||||
cpu_arch = (processor_id >> 16) & 7;
|
||||
if (cpu_arch)
|
||||
cpu_arch += CPU_ARCH_ARMv3;
|
||||
} else {
|
||||
/* the revised CPUID */
|
||||
cpu_arch = ((processor_id >> 12) & 0xf) - 0xb + CPU_ARCH_ARMv6;
|
||||
}
|
||||
|
||||
return cpu_arch;
|
||||
|
@ -863,11 +866,11 @@ static int c_show(struct seq_file *m, void *v)
|
|||
seq_printf(m, "\nCPU implementer\t: 0x%02x\n", processor_id >> 24);
|
||||
seq_printf(m, "CPU architecture: %s\n", proc_arch[cpu_architecture()]);
|
||||
|
||||
if ((processor_id & 0x0000f000) == 0x00000000) {
|
||||
if ((processor_id & 0x0008f000) == 0x00000000) {
|
||||
/* pre-ARM7 */
|
||||
seq_printf(m, "CPU part\t\t: %07x\n", processor_id >> 4);
|
||||
} else {
|
||||
if ((processor_id & 0x0000f000) == 0x00007000) {
|
||||
if ((processor_id & 0x0008f000) == 0x00007000) {
|
||||
/* ARM7 */
|
||||
seq_printf(m, "CPU variant\t: 0x%02x\n",
|
||||
(processor_id >> 16) & 127);
|
||||
|
|
|
@ -18,11 +18,13 @@
|
|||
*/
|
||||
|
||||
.macro save_regs
|
||||
mov ip, sp
|
||||
stmfd sp!, {r1, r4 - r8, fp, ip, lr, pc}
|
||||
sub fp, ip, #4
|
||||
.endm
|
||||
|
||||
.macro load_regs,flags
|
||||
LOADREGS(\flags,fp,{r1, r4 - r8, fp, sp, pc})
|
||||
.macro load_regs
|
||||
ldmfd sp, {r1, r4 - r8, fp, sp, pc}
|
||||
.endm
|
||||
|
||||
.macro load1b, reg1
|
||||
|
|
|
@ -23,7 +23,7 @@ len .req r2
|
|||
sum .req r3
|
||||
|
||||
.Lzero: mov r0, sum
|
||||
load_regs ea
|
||||
load_regs
|
||||
|
||||
/*
|
||||
* Align an unaligned destination pointer. We know that
|
||||
|
@ -87,9 +87,7 @@ sum .req r3
|
|||
b .Ldone
|
||||
|
||||
FN_ENTRY
|
||||
mov ip, sp
|
||||
save_regs
|
||||
sub fp, ip, #4
|
||||
|
||||
cmp len, #8 @ Ensure that we have at least
|
||||
blo .Lless8 @ 8 bytes to copy.
|
||||
|
@ -163,7 +161,7 @@ FN_ENTRY
|
|||
ldr sum, [sp, #0] @ dst
|
||||
tst sum, #1
|
||||
movne r0, r0, ror #8
|
||||
load_regs ea
|
||||
load_regs
|
||||
|
||||
.Lsrc_not_aligned:
|
||||
adc sum, sum, #0 @ include C from dst alignment
|
||||
|
|
|
@ -18,11 +18,13 @@
|
|||
.text
|
||||
|
||||
.macro save_regs
|
||||
mov ip, sp
|
||||
stmfd sp!, {r1 - r2, r4 - r8, fp, ip, lr, pc}
|
||||
sub fp, ip, #4
|
||||
.endm
|
||||
|
||||
.macro load_regs,flags
|
||||
ldm\flags fp, {r1, r2, r4-r8, fp, sp, pc}
|
||||
.macro load_regs
|
||||
ldmfd sp, {r1, r2, r4-r8, fp, sp, pc}
|
||||
.endm
|
||||
|
||||
.macro load1b, reg1
|
||||
|
@ -100,5 +102,5 @@
|
|||
6002: teq r2, r1
|
||||
strneb r0, [r1], #1
|
||||
bne 6002b
|
||||
load_regs ea
|
||||
load_regs
|
||||
.previous
|
||||
|
|
|
@ -16,26 +16,27 @@
|
|||
#include <linux/err.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/clk.h>
|
||||
#include <linux/mutex.h>
|
||||
|
||||
#include <asm/semaphore.h>
|
||||
|
||||
#include "clock.h"
|
||||
|
||||
static LIST_HEAD(clocks);
|
||||
static DECLARE_MUTEX(clocks_sem);
|
||||
static DEFINE_MUTEX(clocks_mutex);
|
||||
|
||||
struct clk *clk_get(struct device *dev, const char *id)
|
||||
{
|
||||
struct clk *p, *clk = ERR_PTR(-ENOENT);
|
||||
|
||||
down(&clocks_sem);
|
||||
mutex_lock(&clocks_mutex);
|
||||
list_for_each_entry(p, &clocks, node) {
|
||||
if (strcmp(id, p->name) == 0 && try_module_get(p->owner)) {
|
||||
clk = p;
|
||||
break;
|
||||
}
|
||||
}
|
||||
up(&clocks_sem);
|
||||
mutex_unlock(&clocks_mutex);
|
||||
|
||||
return clk;
|
||||
}
|
||||
|
@ -78,18 +79,18 @@ EXPORT_SYMBOL(clk_set_rate);
|
|||
|
||||
int clk_register(struct clk *clk)
|
||||
{
|
||||
down(&clocks_sem);
|
||||
mutex_lock(&clocks_mutex);
|
||||
list_add(&clk->node, &clocks);
|
||||
up(&clocks_sem);
|
||||
mutex_unlock(&clocks_mutex);
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(clk_register);
|
||||
|
||||
void clk_unregister(struct clk *clk)
|
||||
{
|
||||
down(&clocks_sem);
|
||||
mutex_lock(&clocks_mutex);
|
||||
list_del(&clk->node);
|
||||
up(&clocks_sem);
|
||||
mutex_unlock(&clocks_mutex);
|
||||
}
|
||||
EXPORT_SYMBOL(clk_unregister);
|
||||
|
||||
|
|
|
@ -8,10 +8,10 @@ obj-n :=
|
|||
obj- :=
|
||||
|
||||
# Board-specific support
|
||||
#obj-$(CONFIG_ARCH_AT91RM9200DK) += board-dk.o
|
||||
#obj-$(CONFIG_MACH_AT91RM9200EK) += board-ek.o
|
||||
#obj-$(CONFIG_MACH_CSB337) += board-csb337.o
|
||||
#obj-$(CONFIG_MACH_CSB637) += board-csb637.o
|
||||
obj-$(CONFIG_ARCH_AT91RM9200DK) += board-dk.o
|
||||
obj-$(CONFIG_MACH_AT91RM9200EK) += board-ek.o
|
||||
obj-$(CONFIG_MACH_CSB337) += board-csb337.o
|
||||
obj-$(CONFIG_MACH_CSB637) += board-csb637.o
|
||||
#obj-$(CONFIG_MACH_CARMEVA) += board-carmeva.o
|
||||
#obj-$(CONFIG_MACH_KB9200) += board-kb9202.o
|
||||
|
||||
|
|
|
@ -0,0 +1,143 @@
|
|||
/*
|
||||
* linux/arch/arm/mach-at91rm9200/board-csb337.c
|
||||
*
|
||||
* Copyright (C) 2005 SAN People
|
||||
*
|
||||
* 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/config.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/platform_device.h>
|
||||
|
||||
#include <asm/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 <asm/arch/hardware.h>
|
||||
#include <asm/mach/serial_at91rm9200.h>
|
||||
#include <asm/arch/board.h>
|
||||
|
||||
#include "generic.h"
|
||||
|
||||
static void __init csb337_init_irq(void)
|
||||
{
|
||||
/* Initialize AIC controller */
|
||||
at91rm9200_init_irq(NULL);
|
||||
|
||||
/* Set up the GPIO interrupts */
|
||||
at91_gpio_irq_setup(BGA_GPIO_BANKS);
|
||||
}
|
||||
|
||||
/*
|
||||
* Serial port configuration.
|
||||
* 0 .. 3 = USART0 .. USART3
|
||||
* 4 = DBGU
|
||||
*/
|
||||
#define CSB337_UART_MAP { 4, 1, -1, -1, -1 } /* ttyS0, ..., ttyS4 */
|
||||
#define CSB337_SERIAL_CONSOLE 0 /* ttyS0 */
|
||||
|
||||
static void __init csb337_map_io(void)
|
||||
{
|
||||
int serial[AT91_NR_UART] = CSB337_UART_MAP;
|
||||
int i;
|
||||
|
||||
at91rm9200_map_io();
|
||||
|
||||
/* Initialize clocks: 3.6864 MHz crystal */
|
||||
at91_clock_init(3686400);
|
||||
|
||||
#ifdef CONFIG_SERIAL_AT91
|
||||
at91_console_port = CSB337_SERIAL_CONSOLE;
|
||||
memcpy(at91_serial_map, serial, sizeof(serial));
|
||||
|
||||
/* Register UARTs */
|
||||
for (i = 0; i < AT91_NR_UART; i++) {
|
||||
if (serial[i] >= 0)
|
||||
at91_register_uart(i, serial[i]);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
static struct at91_eth_data __initdata csb337_eth_data = {
|
||||
.phy_irq_pin = AT91_PIN_PC2,
|
||||
.is_rmii = 0,
|
||||
};
|
||||
|
||||
static struct at91_usbh_data __initdata csb337_usbh_data = {
|
||||
.ports = 2,
|
||||
};
|
||||
|
||||
static struct at91_udc_data __initdata csb337_udc_data = {
|
||||
// this has no VBUS sensing pin
|
||||
.pullup_pin = AT91_PIN_PA24,
|
||||
};
|
||||
|
||||
static struct at91_cf_data __initdata csb337_cf_data = {
|
||||
/*
|
||||
* connector P4 on the CSB 337 mates to
|
||||
* connector P8 on the CSB 300CF
|
||||
*/
|
||||
|
||||
/* CSB337 specific */
|
||||
.det_pin = AT91_PIN_PC3,
|
||||
|
||||
/* CSB300CF specific */
|
||||
.irq_pin = AT91_PIN_PA19,
|
||||
.vcc_pin = AT91_PIN_PD0,
|
||||
.rst_pin = AT91_PIN_PD2,
|
||||
};
|
||||
|
||||
static struct at91_mmc_data __initdata csb337_mmc_data = {
|
||||
.det_pin = AT91_PIN_PD5,
|
||||
.is_b = 0,
|
||||
.wire4 = 1,
|
||||
.wp_pin = AT91_PIN_PD6,
|
||||
};
|
||||
|
||||
static void __init csb337_board_init(void)
|
||||
{
|
||||
/* Ethernet */
|
||||
at91_add_device_eth(&csb337_eth_data);
|
||||
/* USB Host */
|
||||
at91_add_device_usbh(&csb337_usbh_data);
|
||||
/* USB Device */
|
||||
at91_add_device_udc(&csb337_udc_data);
|
||||
/* Compact Flash */
|
||||
at91_set_gpio_input(AT91_PIN_PB22, 1); /* IOIS16 */
|
||||
at91_add_device_cf(&csb337_cf_data);
|
||||
/* MMC */
|
||||
at91_add_device_mmc(&csb337_mmc_data);
|
||||
}
|
||||
|
||||
MACHINE_START(CSB337, "Cogent CSB337")
|
||||
/* Maintainer: Bill Gatliff */
|
||||
.phys_ram = AT91_SDRAM_BASE,
|
||||
.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 = csb337_map_io,
|
||||
.init_irq = csb337_init_irq,
|
||||
.init_machine = csb337_board_init,
|
||||
MACHINE_END
|
|
@ -0,0 +1,116 @@
|
|||
/*
|
||||
* linux/arch/arm/mach-at91rm9200/board-csb637.c
|
||||
*
|
||||
* Copyright (C) 2005 SAN People
|
||||
*
|
||||
* 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/config.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/platform_device.h>
|
||||
|
||||
#include <asm/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 <asm/arch/hardware.h>
|
||||
#include <asm/mach/serial_at91rm9200.h>
|
||||
#include <asm/arch/board.h>
|
||||
|
||||
#include "generic.h"
|
||||
|
||||
static void __init csb637_init_irq(void)
|
||||
{
|
||||
/* Initialize AIC controller */
|
||||
at91rm9200_init_irq(NULL);
|
||||
|
||||
/* Set up the GPIO interrupts */
|
||||
at91_gpio_irq_setup(BGA_GPIO_BANKS);
|
||||
}
|
||||
|
||||
/*
|
||||
* Serial port configuration.
|
||||
* 0 .. 3 = USART0 .. USART3
|
||||
* 4 = DBGU
|
||||
*/
|
||||
#define CSB637_UART_MAP { 4, 1, -1, -1, -1 } /* ttyS0, ..., ttyS4 */
|
||||
#define CSB637_SERIAL_CONSOLE 0 /* ttyS0 */
|
||||
|
||||
static void __init csb637_map_io(void)
|
||||
{
|
||||
int serial[AT91_NR_UART] = CSB637_UART_MAP;
|
||||
int i;
|
||||
|
||||
at91rm9200_map_io();
|
||||
|
||||
/* Initialize clocks: 3.6864 MHz crystal */
|
||||
at91_clock_init(3686400);
|
||||
|
||||
#ifdef CONFIG_SERIAL_AT91
|
||||
at91_console_port = CSB637_SERIAL_CONSOLE;
|
||||
memcpy(at91_serial_map, serial, sizeof(serial));
|
||||
|
||||
/* Register UARTs */
|
||||
for (i = 0; i < AT91_NR_UART; i++) {
|
||||
if (serial[i] >= 0)
|
||||
at91_register_uart(i, serial[i]);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
static struct at91_eth_data __initdata csb637_eth_data = {
|
||||
.phy_irq_pin = AT91_PIN_PC0,
|
||||
.is_rmii = 0,
|
||||
};
|
||||
|
||||
static struct at91_usbh_data __initdata csb637_usbh_data = {
|
||||
.ports = 2,
|
||||
};
|
||||
|
||||
static struct at91_udc_data __initdata csb637_udc_data = {
|
||||
.vbus_pin = AT91_PIN_PB28,
|
||||
.pullup_pin = AT91_PIN_PB1,
|
||||
};
|
||||
|
||||
static void __init csb637_board_init(void)
|
||||
{
|
||||
/* Ethernet */
|
||||
at91_add_device_eth(&csb637_eth_data);
|
||||
/* USB Host */
|
||||
at91_add_device_usbh(&csb637_usbh_data);
|
||||
/* USB Device */
|
||||
at91_add_device_udc(&csb637_udc_data);
|
||||
}
|
||||
|
||||
MACHINE_START(CSB637, "Cogent CSB637")
|
||||
/* Maintainer: Bill Gatliff */
|
||||
.phys_ram = AT91_SDRAM_BASE,
|
||||
.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 = csb637_map_io,
|
||||
.init_irq = csb637_init_irq,
|
||||
.init_machine = csb637_board_init,
|
||||
MACHINE_END
|
|
@ -0,0 +1,138 @@
|
|||
/*
|
||||
* linux/arch/arm/mach-at91rm9200/board-dk.c
|
||||
*
|
||||
* Copyright (C) 2005 SAN People
|
||||
*
|
||||
* Epson S1D framebuffer glue code is:
|
||||
* Copyright (C) 2005 Thibaut VARENE <varenet@parisc-linux.org>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* 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/config.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/platform_device.h>
|
||||
|
||||
#include <asm/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 <asm/arch/hardware.h>
|
||||
#include <asm/mach/serial_at91rm9200.h>
|
||||
#include <asm/arch/board.h>
|
||||
|
||||
#include "generic.h"
|
||||
|
||||
static void __init dk_init_irq(void)
|
||||
{
|
||||
/* Initialize AIC controller */
|
||||
at91rm9200_init_irq(NULL);
|
||||
|
||||
/* Set up the GPIO interrupts */
|
||||
at91_gpio_irq_setup(BGA_GPIO_BANKS);
|
||||
}
|
||||
|
||||
/*
|
||||
* Serial port configuration.
|
||||
* 0 .. 3 = USART0 .. USART3
|
||||
* 4 = DBGU
|
||||
*/
|
||||
#define DK_UART_MAP { 4, 1, -1, -1, -1 } /* ttyS0, ..., ttyS4 */
|
||||
#define DK_SERIAL_CONSOLE 0 /* ttyS0 */
|
||||
|
||||
static void __init dk_map_io(void)
|
||||
{
|
||||
int serial[AT91_NR_UART] = DK_UART_MAP;
|
||||
int i;
|
||||
|
||||
at91rm9200_map_io();
|
||||
|
||||
/* Initialize clocks: 18.432 MHz crystal */
|
||||
at91_clock_init(18432000);
|
||||
|
||||
#ifdef CONFIG_SERIAL_AT91
|
||||
at91_console_port = DK_SERIAL_CONSOLE;
|
||||
memcpy(at91_serial_map, serial, sizeof(serial));
|
||||
|
||||
/* Register UARTs */
|
||||
for (i = 0; i < AT91_NR_UART; i++) {
|
||||
if (at91_serial_map[i] >= 0)
|
||||
at91_register_uart(i, at91_serial_map[i]);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
static struct at91_eth_data __initdata dk_eth_data = {
|
||||
.phy_irq_pin = AT91_PIN_PC4,
|
||||
.is_rmii = 1,
|
||||
};
|
||||
|
||||
static struct at91_usbh_data __initdata dk_usbh_data = {
|
||||
.ports = 2,
|
||||
};
|
||||
|
||||
static struct at91_udc_data __initdata dk_udc_data = {
|
||||
.vbus_pin = AT91_PIN_PD4,
|
||||
.pullup_pin = AT91_PIN_PD5,
|
||||
};
|
||||
|
||||
static struct at91_cf_data __initdata dk_cf_data = {
|
||||
.det_pin = AT91_PIN_PB0,
|
||||
.rst_pin = AT91_PIN_PC5,
|
||||
// .irq_pin = ... not connected
|
||||
// .vcc_pin = ... always powered
|
||||
};
|
||||
|
||||
static struct at91_mmc_data __initdata dk_mmc_data = {
|
||||
.is_b = 0,
|
||||
.wire4 = 1,
|
||||
};
|
||||
|
||||
static void __init dk_board_init(void)
|
||||
{
|
||||
/* Ethernet */
|
||||
at91_add_device_eth(&dk_eth_data);
|
||||
/* USB Host */
|
||||
at91_add_device_usbh(&dk_usbh_data);
|
||||
/* USB Device */
|
||||
at91_add_device_udc(&dk_udc_data);
|
||||
/* Compact Flash */
|
||||
at91_add_device_cf(&dk_cf_data);
|
||||
/* MMC */
|
||||
at91_set_gpio_output(AT91_PIN_PB7, 1); /* this MMC card slot can optionally use SPI signaling (CS3). default: MMC */
|
||||
at91_add_device_mmc(&dk_mmc_data);
|
||||
/* VGA */
|
||||
// dk_add_device_video();
|
||||
}
|
||||
|
||||
MACHINE_START(AT91RM9200DK, "Atmel AT91RM9200-DK")
|
||||
/* Maintainer: SAN People/Atmel */
|
||||
.phys_ram = AT91_SDRAM_BASE,
|
||||
.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 = dk_map_io,
|
||||
.init_irq = dk_init_irq,
|
||||
.init_machine = dk_board_init,
|
||||
MACHINE_END
|
|
@ -0,0 +1,131 @@
|
|||
/*
|
||||
* linux/arch/arm/mach-at91rm9200/board-ek.c
|
||||
*
|
||||
* Copyright (C) 2005 SAN People
|
||||
*
|
||||
* Epson S1D framebuffer glue code is:
|
||||
* Copyright (C) 2005 Thibaut VARENE <varenet@parisc-linux.org>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* 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/config.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/platform_device.h>
|
||||
|
||||
#include <asm/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 <asm/arch/hardware.h>
|
||||
#include <asm/mach/serial_at91rm9200.h>
|
||||
#include <asm/arch/board.h>
|
||||
|
||||
#include "generic.h"
|
||||
|
||||
static void __init ek_init_irq(void)
|
||||
{
|
||||
/* Initialize AIC controller */
|
||||
at91rm9200_init_irq(NULL);
|
||||
|
||||
/* Set up the GPIO interrupts */
|
||||
at91_gpio_irq_setup(BGA_GPIO_BANKS);
|
||||
}
|
||||
|
||||
/*
|
||||
* Serial port configuration.
|
||||
* 0 .. 3 = USART0 .. USART3
|
||||
* 4 = DBGU
|
||||
*/
|
||||
#define EK_UART_MAP { 4, 1, -1, -1, -1 } /* ttyS0, ..., ttyS4 */
|
||||
#define EK_SERIAL_CONSOLE 0 /* ttyS0 */
|
||||
|
||||
static void __init ek_map_io(void)
|
||||
{
|
||||
int serial[AT91_NR_UART] = EK_UART_MAP;
|
||||
int i;
|
||||
|
||||
at91rm9200_map_io();
|
||||
|
||||
/* Initialize clocks: 18.432 MHz crystal */
|
||||
at91_clock_init(18432000);
|
||||
|
||||
#ifdef CONFIG_SERIAL_AT91
|
||||
at91_console_port = EK_SERIAL_CONSOLE;
|
||||
memcpy(at91_serial_map, serial, sizeof(serial));
|
||||
|
||||
/* Register UARTs */
|
||||
for (i = 0; i < AT91_NR_UART; i++) {
|
||||
if (serial[i] >= 0)
|
||||
at91_register_uart(i, serial[i]);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
static struct at91_eth_data __initdata ek_eth_data = {
|
||||
.phy_irq_pin = AT91_PIN_PC4,
|
||||
.is_rmii = 1,
|
||||
};
|
||||
|
||||
static struct at91_usbh_data __initdata ek_usbh_data = {
|
||||
.ports = 2,
|
||||
};
|
||||
|
||||
static struct at91_udc_data __initdata ek_udc_data = {
|
||||
.vbus_pin = AT91_PIN_PD4,
|
||||
.pullup_pin = AT91_PIN_PD5,
|
||||
};
|
||||
|
||||
static struct at91_mmc_data __initdata ek_mmc_data = {
|
||||
.det_pin = AT91_PIN_PB27,
|
||||
.is_b = 0,
|
||||
.wire4 = 1,
|
||||
.wp_pin = AT91_PIN_PA17,
|
||||
};
|
||||
|
||||
static void __init ek_board_init(void)
|
||||
{
|
||||
/* Ethernet */
|
||||
at91_add_device_eth(&ek_eth_data);
|
||||
/* USB Host */
|
||||
at91_add_device_usbh(&ek_usbh_data);
|
||||
/* USB Device */
|
||||
at91_add_device_udc(&ek_udc_data);
|
||||
/* MMC */
|
||||
at91_set_gpio_output(AT91_PIN_PB22, 1); /* this MMC card slot can optionally use SPI signaling (CS3). default: MMC */
|
||||
at91_add_device_mmc(&ek_mmc_data);
|
||||
/* VGA */
|
||||
// ek_add_device_video();
|
||||
}
|
||||
|
||||
MACHINE_START(AT91RM9200EK, "Atmel AT91RM9200-EK")
|
||||
/* Maintainer: SAN People/Atmel */
|
||||
.phys_ram = AT91_SDRAM_BASE,
|
||||
.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 = ek_map_io,
|
||||
.init_irq = ek_init_irq,
|
||||
.init_machine = ek_board_init,
|
||||
MACHINE_END
|
|
@ -15,6 +15,7 @@
|
|||
#include <linux/err.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/clk.h>
|
||||
#include <linux/mutex.h>
|
||||
|
||||
#include <asm/semaphore.h>
|
||||
#include <asm/hardware/icst525.h>
|
||||
|
@ -22,20 +23,20 @@
|
|||
#include "clock.h"
|
||||
|
||||
static LIST_HEAD(clocks);
|
||||
static DECLARE_MUTEX(clocks_sem);
|
||||
static DEFINE_MUTEX(clocks_mutex);
|
||||
|
||||
struct clk *clk_get(struct device *dev, const char *id)
|
||||
{
|
||||
struct clk *p, *clk = ERR_PTR(-ENOENT);
|
||||
|
||||
down(&clocks_sem);
|
||||
mutex_lock(&clocks_mutex);
|
||||
list_for_each_entry(p, &clocks, node) {
|
||||
if (strcmp(id, p->name) == 0 && try_module_get(p->owner)) {
|
||||
clk = p;
|
||||
break;
|
||||
}
|
||||
}
|
||||
up(&clocks_sem);
|
||||
mutex_unlock(&clocks_mutex);
|
||||
|
||||
return clk;
|
||||
}
|
||||
|
@ -107,18 +108,18 @@ static struct clk uart_clk = {
|
|||
|
||||
int clk_register(struct clk *clk)
|
||||
{
|
||||
down(&clocks_sem);
|
||||
mutex_lock(&clocks_mutex);
|
||||
list_add(&clk->node, &clocks);
|
||||
up(&clocks_sem);
|
||||
mutex_unlock(&clocks_mutex);
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(clk_register);
|
||||
|
||||
void clk_unregister(struct clk *clk)
|
||||
{
|
||||
down(&clocks_sem);
|
||||
mutex_lock(&clocks_mutex);
|
||||
list_del(&clk->node);
|
||||
up(&clocks_sem);
|
||||
mutex_unlock(&clocks_mutex);
|
||||
}
|
||||
EXPORT_SYMBOL(clk_unregister);
|
||||
|
||||
|
|
|
@ -31,6 +31,7 @@
|
|||
#include <linux/interrupt.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/irq.h>
|
||||
#include <asm/hardware.h>
|
||||
|
@ -59,7 +60,7 @@ static const struct ssp_info_ ssp_info[PXA_SSP_PORTS] = {
|
|||
#endif
|
||||
};
|
||||
|
||||
static DECLARE_MUTEX(sem);
|
||||
static DEFINE_MUTEX(mutex);
|
||||
static int use_count[PXA_SSP_PORTS] = {0, 0, 0};
|
||||
|
||||
static irqreturn_t ssp_interrupt(int irq, void *dev_id, struct pt_regs *regs)
|
||||
|
@ -239,16 +240,16 @@ int ssp_init(struct ssp_dev *dev, u32 port, u32 init_flags)
|
|||
if (port > PXA_SSP_PORTS || port == 0)
|
||||
return -ENODEV;
|
||||
|
||||
down(&sem);
|
||||
mutex_lock(&mutex);
|
||||
if (use_count[port - 1]) {
|
||||
up(&sem);
|
||||
mutex_unlock(&mutex);
|
||||
return -EBUSY;
|
||||
}
|
||||
use_count[port - 1]++;
|
||||
|
||||
if (!request_mem_region(__PREG(SSCR0_P(port)), 0x2c, "SSP")) {
|
||||
use_count[port - 1]--;
|
||||
up(&sem);
|
||||
mutex_unlock(&mutex);
|
||||
return -EBUSY;
|
||||
}
|
||||
dev->port = port;
|
||||
|
@ -265,13 +266,13 @@ int ssp_init(struct ssp_dev *dev, u32 port, u32 init_flags)
|
|||
|
||||
/* turn on SSP port clock */
|
||||
pxa_set_cken(ssp_info[port-1].clock, 1);
|
||||
up(&sem);
|
||||
mutex_unlock(&mutex);
|
||||
return 0;
|
||||
|
||||
out_region:
|
||||
release_mem_region(__PREG(SSCR0_P(port)), 0x2c);
|
||||
use_count[port - 1]--;
|
||||
up(&sem);
|
||||
mutex_unlock(&mutex);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -282,7 +283,7 @@ int ssp_init(struct ssp_dev *dev, u32 port, u32 init_flags)
|
|||
*/
|
||||
void ssp_exit(struct ssp_dev *dev)
|
||||
{
|
||||
down(&sem);
|
||||
mutex_lock(&mutex);
|
||||
SSCR0_P(dev->port) &= ~SSCR0_SSE;
|
||||
|
||||
if (dev->port > PXA_SSP_PORTS || dev->port == 0) {
|
||||
|
@ -295,7 +296,7 @@ void ssp_exit(struct ssp_dev *dev)
|
|||
free_irq(dev->irq, dev);
|
||||
release_mem_region(__PREG(SSCR0_P(dev->port)), 0x2c);
|
||||
use_count[dev->port - 1]--;
|
||||
up(&sem);
|
||||
mutex_unlock(&mutex);
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(ssp_write_word);
|
||||
|
|
|
@ -14,6 +14,7 @@
|
|||
#include <linux/errno.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/clk.h>
|
||||
#include <linux/mutex.h>
|
||||
|
||||
#include <asm/semaphore.h>
|
||||
#include <asm/hardware/icst307.h>
|
||||
|
@ -21,20 +22,20 @@
|
|||
#include "clock.h"
|
||||
|
||||
static LIST_HEAD(clocks);
|
||||
static DECLARE_MUTEX(clocks_sem);
|
||||
static DEFINE_MUTEX(clocks_mutex);
|
||||
|
||||
struct clk *clk_get(struct device *dev, const char *id)
|
||||
{
|
||||
struct clk *p, *clk = ERR_PTR(-ENOENT);
|
||||
|
||||
down(&clocks_sem);
|
||||
mutex_lock(&clocks_mutex);
|
||||
list_for_each_entry(p, &clocks, node) {
|
||||
if (strcmp(id, p->name) == 0 && try_module_get(p->owner)) {
|
||||
clk = p;
|
||||
break;
|
||||
}
|
||||
}
|
||||
up(&clocks_sem);
|
||||
mutex_unlock(&clocks_mutex);
|
||||
|
||||
return clk;
|
||||
}
|
||||
|
@ -109,18 +110,18 @@ static struct clk mmci_clk = {
|
|||
|
||||
int clk_register(struct clk *clk)
|
||||
{
|
||||
down(&clocks_sem);
|
||||
mutex_lock(&clocks_mutex);
|
||||
list_add(&clk->node, &clocks);
|
||||
up(&clocks_sem);
|
||||
mutex_unlock(&clocks_mutex);
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(clk_register);
|
||||
|
||||
void clk_unregister(struct clk *clk)
|
||||
{
|
||||
down(&clocks_sem);
|
||||
mutex_lock(&clocks_mutex);
|
||||
list_del(&clk->node);
|
||||
up(&clocks_sem);
|
||||
mutex_unlock(&clocks_mutex);
|
||||
}
|
||||
EXPORT_SYMBOL(clk_unregister);
|
||||
|
||||
|
|
|
@ -37,6 +37,7 @@
|
|||
#include <linux/interrupt.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/clk.h>
|
||||
#include <linux/mutex.h>
|
||||
|
||||
#include <asm/hardware.h>
|
||||
#include <asm/atomic.h>
|
||||
|
@ -51,7 +52,7 @@
|
|||
/* clock information */
|
||||
|
||||
static LIST_HEAD(clocks);
|
||||
static DECLARE_MUTEX(clocks_sem);
|
||||
static DEFINE_MUTEX(clocks_mutex);
|
||||
|
||||
/* old functions */
|
||||
|
||||
|
@ -102,7 +103,7 @@ struct clk *clk_get(struct device *dev, const char *id)
|
|||
else
|
||||
idno = to_platform_device(dev)->id;
|
||||
|
||||
down(&clocks_sem);
|
||||
mutex_lock(&clocks_mutex);
|
||||
|
||||
list_for_each_entry(p, &clocks, list) {
|
||||
if (p->id == idno &&
|
||||
|
@ -126,7 +127,7 @@ struct clk *clk_get(struct device *dev, const char *id)
|
|||
}
|
||||
}
|
||||
|
||||
up(&clocks_sem);
|
||||
mutex_unlock(&clocks_mutex);
|
||||
return clk;
|
||||
}
|
||||
|
||||
|
@ -362,9 +363,9 @@ int s3c24xx_register_clock(struct clk *clk)
|
|||
|
||||
/* add to the list of available clocks */
|
||||
|
||||
down(&clocks_sem);
|
||||
mutex_lock(&clocks_mutex);
|
||||
list_add(&clk->list, &clocks);
|
||||
up(&clocks_sem);
|
||||
mutex_unlock(&clocks_mutex);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -15,6 +15,7 @@
|
|||
#include <linux/err.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/clk.h>
|
||||
#include <linux/mutex.h>
|
||||
|
||||
#include <asm/semaphore.h>
|
||||
#include <asm/hardware/icst307.h>
|
||||
|
@ -22,20 +23,20 @@
|
|||
#include "clock.h"
|
||||
|
||||
static LIST_HEAD(clocks);
|
||||
static DECLARE_MUTEX(clocks_sem);
|
||||
static DEFINE_MUTEX(clocks_mutex);
|
||||
|
||||
struct clk *clk_get(struct device *dev, const char *id)
|
||||
{
|
||||
struct clk *p, *clk = ERR_PTR(-ENOENT);
|
||||
|
||||
down(&clocks_sem);
|
||||
mutex_lock(&clocks_mutex);
|
||||
list_for_each_entry(p, &clocks, node) {
|
||||
if (strcmp(id, p->name) == 0 && try_module_get(p->owner)) {
|
||||
clk = p;
|
||||
break;
|
||||
}
|
||||
}
|
||||
up(&clocks_sem);
|
||||
mutex_unlock(&clocks_mutex);
|
||||
|
||||
return clk;
|
||||
}
|
||||
|
@ -110,18 +111,18 @@ static struct clk mmci_clk = {
|
|||
|
||||
int clk_register(struct clk *clk)
|
||||
{
|
||||
down(&clocks_sem);
|
||||
mutex_lock(&clocks_mutex);
|
||||
list_add(&clk->node, &clocks);
|
||||
up(&clocks_sem);
|
||||
mutex_unlock(&clocks_mutex);
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(clk_register);
|
||||
|
||||
void clk_unregister(struct clk *clk)
|
||||
{
|
||||
down(&clocks_sem);
|
||||
mutex_lock(&clocks_mutex);
|
||||
list_del(&clk->node);
|
||||
up(&clocks_sem);
|
||||
mutex_unlock(&clocks_mutex);
|
||||
}
|
||||
EXPORT_SYMBOL(clk_unregister);
|
||||
|
||||
|
|
|
@ -20,15 +20,25 @@
|
|||
|
||||
#include <asm/cacheflush.h>
|
||||
#include <asm/tlbflush.h>
|
||||
#include <asm/sizes.h>
|
||||
|
||||
/* Sanity check size */
|
||||
#if (CONSISTENT_DMA_SIZE % SZ_2M)
|
||||
#error "CONSISTENT_DMA_SIZE must be multiple of 2MiB"
|
||||
#endif
|
||||
|
||||
#define CONSISTENT_BASE (0xffc00000)
|
||||
#define CONSISTENT_END (0xffe00000)
|
||||
#define CONSISTENT_BASE (CONSISTENT_END - CONSISTENT_DMA_SIZE)
|
||||
|
||||
#define CONSISTENT_OFFSET(x) (((unsigned long)(x) - CONSISTENT_BASE) >> PAGE_SHIFT)
|
||||
#define CONSISTENT_PTE_INDEX(x) (((unsigned long)(x) - CONSISTENT_BASE) >> PGDIR_SHIFT)
|
||||
#define NUM_CONSISTENT_PTES (CONSISTENT_DMA_SIZE >> PGDIR_SHIFT)
|
||||
|
||||
|
||||
/*
|
||||
* This is the page table (2MB) covering uncached, DMA consistent allocations
|
||||
* These are the page tables (2MB each) covering uncached, DMA consistent allocations
|
||||
*/
|
||||
static pte_t *consistent_pte;
|
||||
static pte_t *consistent_pte[NUM_CONSISTENT_PTES];
|
||||
static DEFINE_SPINLOCK(consistent_lock);
|
||||
|
||||
/*
|
||||
|
@ -142,7 +152,7 @@ __dma_alloc(struct device *dev, size_t size, dma_addr_t *handle, gfp_t gfp,
|
|||
unsigned long order;
|
||||
u64 mask = ISA_DMA_THRESHOLD, limit;
|
||||
|
||||
if (!consistent_pte) {
|
||||
if (!consistent_pte[0]) {
|
||||
printk(KERN_ERR "%s: not initialised\n", __func__);
|
||||
dump_stack();
|
||||
return NULL;
|
||||
|
@ -205,9 +215,12 @@ __dma_alloc(struct device *dev, size_t size, dma_addr_t *handle, gfp_t gfp,
|
|||
c = vm_region_alloc(&consistent_head, size,
|
||||
gfp & ~(__GFP_DMA | __GFP_HIGHMEM));
|
||||
if (c) {
|
||||
pte_t *pte = consistent_pte + CONSISTENT_OFFSET(c->vm_start);
|
||||
pte_t *pte;
|
||||
struct page *end = page + (1 << order);
|
||||
int idx = CONSISTENT_PTE_INDEX(c->vm_start);
|
||||
u32 off = CONSISTENT_OFFSET(c->vm_start) & (PTRS_PER_PTE-1);
|
||||
|
||||
pte = consistent_pte[idx] + off;
|
||||
c->vm_pages = page;
|
||||
|
||||
/*
|
||||
|
@ -226,6 +239,11 @@ __dma_alloc(struct device *dev, size_t size, dma_addr_t *handle, gfp_t gfp,
|
|||
set_pte(pte, mk_pte(page, prot));
|
||||
page++;
|
||||
pte++;
|
||||
off++;
|
||||
if (off >= PTRS_PER_PTE) {
|
||||
off = 0;
|
||||
pte = consistent_pte[++idx];
|
||||
}
|
||||
} while (size -= PAGE_SIZE);
|
||||
|
||||
/*
|
||||
|
@ -327,6 +345,8 @@ void dma_free_coherent(struct device *dev, size_t size, void *cpu_addr, dma_addr
|
|||
struct vm_region *c;
|
||||
unsigned long flags, addr;
|
||||
pte_t *ptep;
|
||||
int idx;
|
||||
u32 off;
|
||||
|
||||
WARN_ON(irqs_disabled());
|
||||
|
||||
|
@ -347,7 +367,9 @@ void dma_free_coherent(struct device *dev, size_t size, void *cpu_addr, dma_addr
|
|||
size = c->vm_end - c->vm_start;
|
||||
}
|
||||
|
||||
ptep = consistent_pte + CONSISTENT_OFFSET(c->vm_start);
|
||||
idx = CONSISTENT_PTE_INDEX(c->vm_start);
|
||||
off = CONSISTENT_OFFSET(c->vm_start) & (PTRS_PER_PTE-1);
|
||||
ptep = consistent_pte[idx] + off;
|
||||
addr = c->vm_start;
|
||||
do {
|
||||
pte_t pte = ptep_get_and_clear(&init_mm, addr, ptep);
|
||||
|
@ -355,6 +377,11 @@ void dma_free_coherent(struct device *dev, size_t size, void *cpu_addr, dma_addr
|
|||
|
||||
ptep++;
|
||||
addr += PAGE_SIZE;
|
||||
off++;
|
||||
if (off >= PTRS_PER_PTE) {
|
||||
off = 0;
|
||||
ptep = consistent_pte[++idx];
|
||||
}
|
||||
|
||||
if (!pte_none(pte) && pte_present(pte)) {
|
||||
pfn = pte_pfn(pte);
|
||||
|
@ -401,11 +428,12 @@ static int __init consistent_init(void)
|
|||
pgd_t *pgd;
|
||||
pmd_t *pmd;
|
||||
pte_t *pte;
|
||||
int ret = 0;
|
||||
int ret = 0, i = 0;
|
||||
u32 base = CONSISTENT_BASE;
|
||||
|
||||
do {
|
||||
pgd = pgd_offset(&init_mm, CONSISTENT_BASE);
|
||||
pmd = pmd_alloc(&init_mm, pgd, CONSISTENT_BASE);
|
||||
pgd = pgd_offset(&init_mm, base);
|
||||
pmd = pmd_alloc(&init_mm, pgd, base);
|
||||
if (!pmd) {
|
||||
printk(KERN_ERR "%s: no pmd tables\n", __func__);
|
||||
ret = -ENOMEM;
|
||||
|
@ -413,15 +441,16 @@ static int __init consistent_init(void)
|
|||
}
|
||||
WARN_ON(!pmd_none(*pmd));
|
||||
|
||||
pte = pte_alloc_kernel(pmd, CONSISTENT_BASE);
|
||||
pte = pte_alloc_kernel(pmd, base);
|
||||
if (!pte) {
|
||||
printk(KERN_ERR "%s: no pte tables\n", __func__);
|
||||
ret = -ENOMEM;
|
||||
break;
|
||||
}
|
||||
|
||||
consistent_pte = pte;
|
||||
} while (0);
|
||||
consistent_pte[i++] = pte;
|
||||
base += (1 << PGDIR_SHIFT);
|
||||
} while (base < CONSISTENT_END);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
|
@ -20,6 +20,7 @@
|
|||
#include <linux/err.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/clk.h>
|
||||
#include <linux/mutex.h>
|
||||
|
||||
#include <asm/io.h>
|
||||
#include <asm/semaphore.h>
|
||||
|
@ -27,7 +28,7 @@
|
|||
#include <asm/arch/clock.h>
|
||||
|
||||
LIST_HEAD(clocks);
|
||||
static DECLARE_MUTEX(clocks_sem);
|
||||
static DEFINE_MUTEX(clocks_mutex);
|
||||
DEFINE_SPINLOCK(clockfw_lock);
|
||||
|
||||
static struct clk_functions *arch_clock;
|
||||
|
@ -40,14 +41,14 @@ struct clk * clk_get(struct device *dev, const char *id)
|
|||
{
|
||||
struct clk *p, *clk = ERR_PTR(-ENOENT);
|
||||
|
||||
down(&clocks_sem);
|
||||
mutex_lock(&clocks_mutex);
|
||||
list_for_each_entry(p, &clocks, node) {
|
||||
if (strcmp(id, p->name) == 0 && try_module_get(p->owner)) {
|
||||
clk = p;
|
||||
break;
|
||||
}
|
||||
}
|
||||
up(&clocks_sem);
|
||||
mutex_unlock(&clocks_mutex);
|
||||
|
||||
return clk;
|
||||
}
|
||||
|
@ -249,11 +250,11 @@ void propagate_rate(struct clk * tclk)
|
|||
|
||||
int clk_register(struct clk *clk)
|
||||
{
|
||||
down(&clocks_sem);
|
||||
mutex_lock(&clocks_mutex);
|
||||
list_add(&clk->node, &clocks);
|
||||
if (clk->init)
|
||||
clk->init(clk);
|
||||
up(&clocks_sem);
|
||||
mutex_unlock(&clocks_mutex);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -261,9 +262,9 @@ EXPORT_SYMBOL(clk_register);
|
|||
|
||||
void clk_unregister(struct clk *clk)
|
||||
{
|
||||
down(&clocks_sem);
|
||||
mutex_lock(&clocks_mutex);
|
||||
list_del(&clk->node);
|
||||
up(&clocks_sem);
|
||||
mutex_unlock(&clocks_mutex);
|
||||
}
|
||||
EXPORT_SYMBOL(clk_unregister);
|
||||
|
||||
|
|
|
@ -899,6 +899,12 @@ static int i2c_pxa_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num
|
|||
struct pxa_i2c *i2c = adap->algo_data;
|
||||
int ret, i;
|
||||
|
||||
/* If the I2C controller is disabled we need to reset it (probably due
|
||||
to a suspend/resume destroying state). We do this here as we can then
|
||||
avoid worrying about resuming the controller before its users. */
|
||||
if (!(ICR & ICR_IUE))
|
||||
i2c_pxa_reset(i2c);
|
||||
|
||||
for (i = adap->retries; i >= 0; i--) {
|
||||
ret = i2c_pxa_do_xfer(i2c, msgs, num);
|
||||
if (ret != I2C_RETRY)
|
||||
|
@ -939,7 +945,9 @@ static struct pxa_i2c i2c_pxa = {
|
|||
static int i2c_pxa_probe(struct platform_device *dev)
|
||||
{
|
||||
struct pxa_i2c *i2c = &i2c_pxa;
|
||||
#ifdef CONFIG_I2C_PXA_SLAVE
|
||||
struct i2c_pxa_platform_data *plat = dev->dev.platform_data;
|
||||
#endif
|
||||
int ret;
|
||||
|
||||
#ifdef CONFIG_PXA27x
|
||||
|
@ -1024,5 +1032,7 @@ static void i2c_adap_pxa_exit(void)
|
|||
return platform_driver_unregister(&i2c_pxa_driver);
|
||||
}
|
||||
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
module_init(i2c_adap_pxa_init);
|
||||
module_exit(i2c_adap_pxa_exit);
|
||||
|
|
|
@ -171,27 +171,22 @@ static int __init mst_pcmcia_init(void)
|
|||
{
|
||||
int ret;
|
||||
|
||||
mst_pcmcia_device = kzalloc(sizeof(*mst_pcmcia_device), GFP_KERNEL);
|
||||
mst_pcmcia_device = platform_device_alloc("pxa2xx-pcmcia", -1);
|
||||
if (!mst_pcmcia_device)
|
||||
return -ENOMEM;
|
||||
mst_pcmcia_device->name = "pxa2xx-pcmcia";
|
||||
|
||||
mst_pcmcia_device->dev.platform_data = &mst_pcmcia_ops;
|
||||
|
||||
ret = platform_device_register(mst_pcmcia_device);
|
||||
ret = platform_device_add(mst_pcmcia_device);
|
||||
|
||||
if (ret)
|
||||
kfree(mst_pcmcia_device);
|
||||
platform_device_put(mst_pcmcia_device);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void __exit mst_pcmcia_exit(void)
|
||||
{
|
||||
/*
|
||||
* This call is supposed to free our mst_pcmcia_device.
|
||||
* Unfortunately platform_device don't have a free method, and
|
||||
* we can't assume it's free of any reference at this point so we
|
||||
* can't free it either.
|
||||
*/
|
||||
platform_device_unregister(mst_pcmcia_device);
|
||||
}
|
||||
|
||||
|
|
|
@ -263,30 +263,25 @@ static int __init sharpsl_pcmcia_init(void)
|
|||
{
|
||||
int ret;
|
||||
|
||||
sharpsl_pcmcia_ops.nr=platform_scoop_config->num_devs;
|
||||
sharpsl_pcmcia_device = kzalloc(sizeof(*sharpsl_pcmcia_device), GFP_KERNEL);
|
||||
sharpsl_pcmcia_ops.nr = platform_scoop_config->num_devs;
|
||||
sharpsl_pcmcia_device = platform_device_alloc("pxa2xx-pcmcia", -1);
|
||||
|
||||
if (!sharpsl_pcmcia_device)
|
||||
return -ENOMEM;
|
||||
|
||||
sharpsl_pcmcia_device->name = "pxa2xx-pcmcia";
|
||||
sharpsl_pcmcia_device->dev.platform_data = &sharpsl_pcmcia_ops;
|
||||
sharpsl_pcmcia_device->dev.parent=platform_scoop_config->devs[0].dev;
|
||||
sharpsl_pcmcia_device->dev.parent = platform_scoop_config->devs[0].dev;
|
||||
|
||||
ret = platform_device_add(sharpsl_pcmcia_device);
|
||||
|
||||
ret = platform_device_register(sharpsl_pcmcia_device);
|
||||
if (ret)
|
||||
kfree(sharpsl_pcmcia_device);
|
||||
platform_device_put(sharpsl_pcmcia_device);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void __exit sharpsl_pcmcia_exit(void)
|
||||
{
|
||||
/*
|
||||
* This call is supposed to free our sharpsl_pcmcia_device.
|
||||
* Unfortunately platform_device don't have a free method, and
|
||||
* we can't assume it's free of any reference at this point so we
|
||||
* can't free it either.
|
||||
*/
|
||||
platform_device_unregister(sharpsl_pcmcia_device);
|
||||
}
|
||||
|
||||
|
|
|
@ -280,6 +280,40 @@ config SERIAL_AMBA_PL011_CONSOLE
|
|||
your boot loader (lilo or loadlin) about how to pass options to the
|
||||
kernel at boot time.)
|
||||
|
||||
config SERIAL_AT91
|
||||
bool "AT91RM9200 serial port support"
|
||||
depends on ARM && ARCH_AT91RM9200
|
||||
select SERIAL_CORE
|
||||
help
|
||||
This enables the driver for the on-chip UARTs of the AT91RM9200
|
||||
processor.
|
||||
|
||||
config SERIAL_AT91_CONSOLE
|
||||
bool "Support for console on AT91RM9200 serial port"
|
||||
depends on SERIAL_AT91=y
|
||||
select SERIAL_CORE_CONSOLE
|
||||
help
|
||||
Say Y here if you wish to use a UART on the AT91RM9200 as the system
|
||||
console (the system console is the device which receives all kernel
|
||||
messages and warnings and which allows logins in single user mode).
|
||||
|
||||
config SERIAL_AT91_TTYAT
|
||||
bool "Install as device ttyAT0-4 instead of ttyS0-4"
|
||||
depends on SERIAL_AT91=y
|
||||
help
|
||||
Say Y here if you wish to have the five internal AT91RM9200 UARTs
|
||||
appear as /dev/ttyAT0-4 (major 240, minor 0-4) instead of the
|
||||
normal /dev/ttyS0-4 (major 4, minor 64-68). This is necessary if
|
||||
you also want other UARTs, such as external 8250/16C550 compatible
|
||||
UARTs.
|
||||
The ttySn nodes are legally reserved for the 8250 serial driver
|
||||
but are often misused by other serial drivers.
|
||||
|
||||
To use this, you should create suitable ttyATn device nodes in
|
||||
/dev/, and pass "console=ttyATn" to the kernel.
|
||||
|
||||
Say Y if you have an external 8250/16C550 UART. If unsure, say N.
|
||||
|
||||
config SERIAL_CLPS711X
|
||||
tristate "CLPS711X serial port support"
|
||||
depends on ARM && ARCH_CLPS711X
|
||||
|
|
|
@ -56,3 +56,4 @@ obj-$(CONFIG_SERIAL_JSM) += jsm/
|
|||
obj-$(CONFIG_SERIAL_TXX9) += serial_txx9.o
|
||||
obj-$(CONFIG_SERIAL_VR41XX) += vr41xx_siu.o
|
||||
obj-$(CONFIG_SERIAL_SGI_IOC4) += ioc4_serial.o
|
||||
obj-$(CONFIG_SERIAL_AT91) += at91_serial.o
|
||||
|
|
|
@ -0,0 +1,894 @@
|
|||
/*
|
||||
* linux/drivers/char/at91_serial.c
|
||||
*
|
||||
* Driver for Atmel AT91RM9200 Serial ports
|
||||
*
|
||||
* Copyright (C) 2003 Rick Bronson
|
||||
*
|
||||
* Based on drivers/char/serial_sa1100.c, by Deep Blue Solutions Ltd.
|
||||
* Based on drivers/char/serial.c, by Linus Torvalds, Theodore Ts'o.
|
||||
*
|
||||
* 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/config.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/tty.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/serial.h>
|
||||
#include <linux/console.h>
|
||||
#include <linux/sysrq.h>
|
||||
#include <linux/tty_flip.h>
|
||||
|
||||
#include <asm/io.h>
|
||||
|
||||
#include <asm/arch/at91rm9200_usart.h>
|
||||
#include <asm/mach/serial_at91rm9200.h>
|
||||
#include <asm/arch/board.h>
|
||||
#include <asm/arch/pio.h>
|
||||
|
||||
|
||||
#if defined(CONFIG_SERIAL_AT91_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ)
|
||||
#define SUPPORT_SYSRQ
|
||||
#endif
|
||||
|
||||
#include <linux/serial_core.h>
|
||||
|
||||
#ifdef CONFIG_SERIAL_AT91_TTYAT
|
||||
|
||||
/* Use device name ttyAT, major 204 and minor 154-169. This is necessary if we
|
||||
* should coexist with the 8250 driver, such as if we have an external 16C550
|
||||
* UART. */
|
||||
#define SERIAL_AT91_MAJOR 204
|
||||
#define MINOR_START 154
|
||||
#define AT91_DEVICENAME "ttyAT"
|
||||
|
||||
#else
|
||||
|
||||
/* Use device name ttyS, major 4, minor 64-68. This is the usual serial port
|
||||
* name, but it is legally reserved for the 8250 driver. */
|
||||
#define SERIAL_AT91_MAJOR TTY_MAJOR
|
||||
#define MINOR_START 64
|
||||
#define AT91_DEVICENAME "ttyS"
|
||||
|
||||
#endif
|
||||
|
||||
#define AT91_VA_BASE_DBGU ((unsigned long) AT91_VA_BASE_SYS + AT91_DBGU)
|
||||
#define AT91_ISR_PASS_LIMIT 256
|
||||
|
||||
#define UART_PUT_CR(port,v) writel(v, (port)->membase + AT91_US_CR)
|
||||
#define UART_GET_MR(port) readl((port)->membase + AT91_US_MR)
|
||||
#define UART_PUT_MR(port,v) writel(v, (port)->membase + AT91_US_MR)
|
||||
#define UART_PUT_IER(port,v) writel(v, (port)->membase + AT91_US_IER)
|
||||
#define UART_PUT_IDR(port,v) writel(v, (port)->membase + AT91_US_IDR)
|
||||
#define UART_GET_IMR(port) readl((port)->membase + AT91_US_IMR)
|
||||
#define UART_GET_CSR(port) readl((port)->membase + AT91_US_CSR)
|
||||
#define UART_GET_CHAR(port) readl((port)->membase + AT91_US_RHR)
|
||||
#define UART_PUT_CHAR(port,v) writel(v, (port)->membase + AT91_US_THR)
|
||||
#define UART_GET_BRGR(port) readl((port)->membase + AT91_US_BRGR)
|
||||
#define UART_PUT_BRGR(port,v) writel(v, (port)->membase + AT91_US_BRGR)
|
||||
#define UART_PUT_RTOR(port,v) writel(v, (port)->membase + AT91_US_RTOR)
|
||||
|
||||
// #define UART_GET_CR(port) readl((port)->membase + AT91_US_CR) // is write-only
|
||||
|
||||
/* PDC registers */
|
||||
#define UART_PUT_PTCR(port,v) writel(v, (port)->membase + AT91_PDC_PTCR)
|
||||
#define UART_PUT_RPR(port,v) writel(v, (port)->membase + AT91_PDC_RPR)
|
||||
#define UART_PUT_RCR(port,v) writel(v, (port)->membase + AT91_PDC_RCR)
|
||||
#define UART_GET_RCR(port) readl((port)->membase + AT91_PDC_RCR)
|
||||
#define UART_PUT_RNPR(port,v) writel(v, (port)->membase + AT91_PDC_RNPR)
|
||||
#define UART_PUT_RNCR(port,v) writel(v, (port)->membase + AT91_PDC_RNCR)
|
||||
|
||||
|
||||
static int (*at91_open)(struct uart_port *);
|
||||
static void (*at91_close)(struct uart_port *);
|
||||
|
||||
#ifdef SUPPORT_SYSRQ
|
||||
static struct console at91_console;
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Return TIOCSER_TEMT when transmitter FIFO and Shift register is empty.
|
||||
*/
|
||||
static u_int at91_tx_empty(struct uart_port *port)
|
||||
{
|
||||
return (UART_GET_CSR(port) & AT91_US_TXEMPTY) ? TIOCSER_TEMT : 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Set state of the modem control output lines
|
||||
*/
|
||||
static void at91_set_mctrl(struct uart_port *port, u_int mctrl)
|
||||
{
|
||||
unsigned int control = 0;
|
||||
|
||||
/*
|
||||
* Errata #39: RTS0 is not internally connected to PA21. We need to drive
|
||||
* the pin manually.
|
||||
*/
|
||||
if (port->mapbase == AT91_VA_BASE_US0) {
|
||||
if (mctrl & TIOCM_RTS)
|
||||
at91_sys_write(AT91_PIOA + PIO_CODR, AT91_PA21_RTS0);
|
||||
else
|
||||
at91_sys_write(AT91_PIOA + PIO_SODR, AT91_PA21_RTS0);
|
||||
}
|
||||
|
||||
if (mctrl & TIOCM_RTS)
|
||||
control |= AT91_US_RTSEN;
|
||||
else
|
||||
control |= AT91_US_RTSDIS;
|
||||
|
||||
if (mctrl & TIOCM_DTR)
|
||||
control |= AT91_US_DTREN;
|
||||
else
|
||||
control |= AT91_US_DTRDIS;
|
||||
|
||||
UART_PUT_CR(port,control);
|
||||
}
|
||||
|
||||
/*
|
||||
* Get state of the modem control input lines
|
||||
*/
|
||||
static u_int at91_get_mctrl(struct uart_port *port)
|
||||
{
|
||||
unsigned int status, ret = 0;
|
||||
|
||||
status = UART_GET_CSR(port);
|
||||
|
||||
/*
|
||||
* The control signals are active low.
|
||||
*/
|
||||
if (!(status & AT91_US_DCD))
|
||||
ret |= TIOCM_CD;
|
||||
if (!(status & AT91_US_CTS))
|
||||
ret |= TIOCM_CTS;
|
||||
if (!(status & AT91_US_DSR))
|
||||
ret |= TIOCM_DSR;
|
||||
if (!(status & AT91_US_RI))
|
||||
ret |= TIOCM_RI;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
* Stop transmitting.
|
||||
*/
|
||||
static void at91_stop_tx(struct uart_port *port)
|
||||
{
|
||||
UART_PUT_IDR(port, AT91_US_TXRDY);
|
||||
port->read_status_mask &= ~AT91_US_TXRDY;
|
||||
}
|
||||
|
||||
/*
|
||||
* Start transmitting.
|
||||
*/
|
||||
static void at91_start_tx(struct uart_port *port)
|
||||
{
|
||||
port->read_status_mask |= AT91_US_TXRDY;
|
||||
UART_PUT_IER(port, AT91_US_TXRDY);
|
||||
}
|
||||
|
||||
/*
|
||||
* Stop receiving - port is in process of being closed.
|
||||
*/
|
||||
static void at91_stop_rx(struct uart_port *port)
|
||||
{
|
||||
UART_PUT_IDR(port, AT91_US_RXRDY);
|
||||
}
|
||||
|
||||
/*
|
||||
* Enable modem status interrupts
|
||||
*/
|
||||
static void at91_enable_ms(struct uart_port *port)
|
||||
{
|
||||
port->read_status_mask |= (AT91_US_RIIC | AT91_US_DSRIC | AT91_US_DCDIC | AT91_US_CTSIC);
|
||||
UART_PUT_IER(port, AT91_US_RIIC | AT91_US_DSRIC | AT91_US_DCDIC | AT91_US_CTSIC);
|
||||
}
|
||||
|
||||
/*
|
||||
* Control the transmission of a break signal
|
||||
*/
|
||||
static void at91_break_ctl(struct uart_port *port, int break_state)
|
||||
{
|
||||
if (break_state != 0)
|
||||
UART_PUT_CR(port, AT91_US_STTBRK); /* start break */
|
||||
else
|
||||
UART_PUT_CR(port, AT91_US_STPBRK); /* stop break */
|
||||
}
|
||||
|
||||
/*
|
||||
* Characters received (called from interrupt handler)
|
||||
*/
|
||||
static void at91_rx_chars(struct uart_port *port, struct pt_regs *regs)
|
||||
{
|
||||
struct tty_struct *tty = port->info->tty;
|
||||
unsigned int status, ch, flg;
|
||||
|
||||
status = UART_GET_CSR(port) & port->read_status_mask;
|
||||
while (status & (AT91_US_RXRDY)) {
|
||||
ch = UART_GET_CHAR(port);
|
||||
|
||||
if (tty->flip.count >= TTY_FLIPBUF_SIZE)
|
||||
goto ignore_char;
|
||||
port->icount.rx++;
|
||||
|
||||
flg = TTY_NORMAL;
|
||||
|
||||
/*
|
||||
* note that the error handling code is
|
||||
* out of the main execution path
|
||||
*/
|
||||
if (unlikely(status & (AT91_US_PARE | AT91_US_FRAME | AT91_US_OVRE))) {
|
||||
UART_PUT_CR(port, AT91_US_RSTSTA); /* clear error */
|
||||
if (status & (AT91_US_PARE))
|
||||
port->icount.parity++;
|
||||
if (status & (AT91_US_FRAME))
|
||||
port->icount.frame++;
|
||||
if (status & (AT91_US_OVRE))
|
||||
port->icount.overrun++;
|
||||
|
||||
if (status & AT91_US_PARE)
|
||||
flg = TTY_PARITY;
|
||||
else if (status & AT91_US_FRAME)
|
||||
flg = TTY_FRAME;
|
||||
if (status & AT91_US_OVRE) {
|
||||
/*
|
||||
* overrun does *not* affect the character
|
||||
* we read from the FIFO
|
||||
*/
|
||||
tty_insert_flip_char(tty, ch, flg);
|
||||
ch = 0;
|
||||
flg = TTY_OVERRUN;
|
||||
}
|
||||
#ifdef SUPPORT_SYSRQ
|
||||
port->sysrq = 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
if (uart_handle_sysrq_char(port, ch, regs))
|
||||
goto ignore_char;
|
||||
|
||||
tty_insert_flip_char(tty, ch, flg);
|
||||
|
||||
ignore_char:
|
||||
status = UART_GET_CSR(port) & port->read_status_mask;
|
||||
}
|
||||
|
||||
tty_flip_buffer_push(tty);
|
||||
}
|
||||
|
||||
/*
|
||||
* Transmit characters (called from interrupt handler)
|
||||
*/
|
||||
static void at91_tx_chars(struct uart_port *port)
|
||||
{
|
||||
struct circ_buf *xmit = &port->info->xmit;
|
||||
|
||||
if (port->x_char) {
|
||||
UART_PUT_CHAR(port, port->x_char);
|
||||
port->icount.tx++;
|
||||
port->x_char = 0;
|
||||
return;
|
||||
}
|
||||
if (uart_circ_empty(xmit) || uart_tx_stopped(port)) {
|
||||
at91_stop_tx(port);
|
||||
return;
|
||||
}
|
||||
|
||||
while (UART_GET_CSR(port) & AT91_US_TXRDY) {
|
||||
UART_PUT_CHAR(port, xmit->buf[xmit->tail]);
|
||||
xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1);
|
||||
port->icount.tx++;
|
||||
if (uart_circ_empty(xmit))
|
||||
break;
|
||||
}
|
||||
|
||||
if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS)
|
||||
uart_write_wakeup(port);
|
||||
|
||||
if (uart_circ_empty(xmit))
|
||||
at91_stop_tx(port);
|
||||
}
|
||||
|
||||
/*
|
||||
* Interrupt handler
|
||||
*/
|
||||
static irqreturn_t at91_interrupt(int irq, void *dev_id, struct pt_regs *regs)
|
||||
{
|
||||
struct uart_port *port = dev_id;
|
||||
unsigned int status, pending, pass_counter = 0;
|
||||
|
||||
status = UART_GET_CSR(port);
|
||||
pending = status & port->read_status_mask;
|
||||
if (pending) {
|
||||
do {
|
||||
if (pending & AT91_US_RXRDY)
|
||||
at91_rx_chars(port, regs);
|
||||
|
||||
/* Clear the relevent break bits */
|
||||
if (pending & AT91_US_RXBRK) {
|
||||
UART_PUT_CR(port, AT91_US_RSTSTA);
|
||||
port->icount.brk++;
|
||||
uart_handle_break(port);
|
||||
}
|
||||
|
||||
// TODO: All reads to CSR will clear these interrupts!
|
||||
if (pending & AT91_US_RIIC) port->icount.rng++;
|
||||
if (pending & AT91_US_DSRIC) port->icount.dsr++;
|
||||
if (pending & AT91_US_DCDIC)
|
||||
uart_handle_dcd_change(port, !(status & AT91_US_DCD));
|
||||
if (pending & AT91_US_CTSIC)
|
||||
uart_handle_cts_change(port, !(status & AT91_US_CTS));
|
||||
if (pending & (AT91_US_RIIC | AT91_US_DSRIC | AT91_US_DCDIC | AT91_US_CTSIC))
|
||||
wake_up_interruptible(&port->info->delta_msr_wait);
|
||||
|
||||
if (pending & AT91_US_TXRDY)
|
||||
at91_tx_chars(port);
|
||||
if (pass_counter++ > AT91_ISR_PASS_LIMIT)
|
||||
break;
|
||||
|
||||
status = UART_GET_CSR(port);
|
||||
pending = status & port->read_status_mask;
|
||||
} while (pending);
|
||||
}
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
/*
|
||||
* Perform initialization and enable port for reception
|
||||
*/
|
||||
static int at91_startup(struct uart_port *port)
|
||||
{
|
||||
int retval;
|
||||
|
||||
/*
|
||||
* Ensure that no interrupts are enabled otherwise when
|
||||
* request_irq() is called we could get stuck trying to
|
||||
* handle an unexpected interrupt
|
||||
*/
|
||||
UART_PUT_IDR(port, -1);
|
||||
|
||||
/*
|
||||
* Allocate the IRQ
|
||||
*/
|
||||
retval = request_irq(port->irq, at91_interrupt, SA_SHIRQ, "at91_serial", port);
|
||||
if (retval) {
|
||||
printk("at91_serial: at91_startup - Can't get irq\n");
|
||||
return retval;
|
||||
}
|
||||
|
||||
/*
|
||||
* If there is a specific "open" function (to register
|
||||
* control line interrupts)
|
||||
*/
|
||||
if (at91_open) {
|
||||
retval = at91_open(port);
|
||||
if (retval) {
|
||||
free_irq(port->irq, port);
|
||||
return retval;
|
||||
}
|
||||
}
|
||||
|
||||
port->read_status_mask = AT91_US_RXRDY | AT91_US_TXRDY | AT91_US_OVRE
|
||||
| AT91_US_FRAME | AT91_US_PARE | AT91_US_RXBRK;
|
||||
/*
|
||||
* Finally, enable the serial port
|
||||
*/
|
||||
UART_PUT_CR(port, AT91_US_RSTSTA | AT91_US_RSTRX);
|
||||
UART_PUT_CR(port, AT91_US_TXEN | AT91_US_RXEN); /* enable xmit & rcvr */
|
||||
UART_PUT_IER(port, AT91_US_RXRDY); /* do receive only */
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Disable the port
|
||||
*/
|
||||
static void at91_shutdown(struct uart_port *port)
|
||||
{
|
||||
/*
|
||||
* Disable all interrupts, port and break condition.
|
||||
*/
|
||||
UART_PUT_CR(port, AT91_US_RSTSTA);
|
||||
UART_PUT_IDR(port, -1);
|
||||
|
||||
/*
|
||||
* Free the interrupt
|
||||
*/
|
||||
free_irq(port->irq, port);
|
||||
|
||||
/*
|
||||
* If there is a specific "close" function (to unregister
|
||||
* control line interrupts)
|
||||
*/
|
||||
if (at91_close)
|
||||
at91_close(port);
|
||||
}
|
||||
|
||||
/*
|
||||
* Power / Clock management.
|
||||
*/
|
||||
static void at91_serial_pm(struct uart_port *port, unsigned int state, unsigned int oldstate)
|
||||
{
|
||||
switch (state) {
|
||||
case 0:
|
||||
/*
|
||||
* Enable the peripheral clock for this serial port.
|
||||
* This is called on uart_open() or a resume event.
|
||||
*/
|
||||
at91_sys_write(AT91_PMC_PCER, 1 << port->irq);
|
||||
break;
|
||||
case 3:
|
||||
/*
|
||||
* Disable the peripheral clock for this serial port.
|
||||
* This is called on uart_close() or a suspend event.
|
||||
*/
|
||||
if (port->irq != AT91_ID_SYS) /* is this a shared clock? */
|
||||
at91_sys_write(AT91_PMC_PCDR, 1 << port->irq);
|
||||
break;
|
||||
default:
|
||||
printk(KERN_ERR "at91_serial: unknown pm %d\n", state);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Change the port parameters
|
||||
*/
|
||||
static void at91_set_termios(struct uart_port *port, struct termios * termios, struct termios * old)
|
||||
{
|
||||
unsigned long flags;
|
||||
unsigned int mode, imr, quot, baud;
|
||||
|
||||
baud = uart_get_baud_rate(port, termios, old, 0, port->uartclk/16);
|
||||
quot = uart_get_divisor(port, baud);
|
||||
|
||||
/* Get current mode register */
|
||||
mode = UART_GET_MR(port) & ~(AT91_US_CHRL | AT91_US_NBSTOP | AT91_US_PAR);
|
||||
|
||||
/* byte size */
|
||||
switch (termios->c_cflag & CSIZE) {
|
||||
case CS5:
|
||||
mode |= AT91_US_CHRL_5;
|
||||
break;
|
||||
case CS6:
|
||||
mode |= AT91_US_CHRL_6;
|
||||
break;
|
||||
case CS7:
|
||||
mode |= AT91_US_CHRL_7;
|
||||
break;
|
||||
default:
|
||||
mode |= AT91_US_CHRL_8;
|
||||
break;
|
||||
}
|
||||
|
||||
/* stop bits */
|
||||
if (termios->c_cflag & CSTOPB)
|
||||
mode |= AT91_US_NBSTOP_2;
|
||||
|
||||
/* parity */
|
||||
if (termios->c_cflag & PARENB) {
|
||||
if (termios->c_cflag & CMSPAR) { /* Mark or Space parity */
|
||||
if (termios->c_cflag & PARODD)
|
||||
mode |= AT91_US_PAR_MARK;
|
||||
else
|
||||
mode |= AT91_US_PAR_SPACE;
|
||||
}
|
||||
else if (termios->c_cflag & PARODD)
|
||||
mode |= AT91_US_PAR_ODD;
|
||||
else
|
||||
mode |= AT91_US_PAR_EVEN;
|
||||
}
|
||||
else
|
||||
mode |= AT91_US_PAR_NONE;
|
||||
|
||||
spin_lock_irqsave(&port->lock, flags);
|
||||
|
||||
port->read_status_mask |= AT91_US_OVRE;
|
||||
if (termios->c_iflag & INPCK)
|
||||
port->read_status_mask |= AT91_US_FRAME | AT91_US_PARE;
|
||||
if (termios->c_iflag & (BRKINT | PARMRK))
|
||||
port->read_status_mask |= AT91_US_RXBRK;
|
||||
|
||||
/*
|
||||
* Characters to ignore
|
||||
*/
|
||||
port->ignore_status_mask = 0;
|
||||
if (termios->c_iflag & IGNPAR)
|
||||
port->ignore_status_mask |= (AT91_US_FRAME | AT91_US_PARE);
|
||||
if (termios->c_iflag & IGNBRK) {
|
||||
port->ignore_status_mask |= AT91_US_RXBRK;
|
||||
/*
|
||||
* If we're ignoring parity and break indicators,
|
||||
* ignore overruns too (for real raw support).
|
||||
*/
|
||||
if (termios->c_iflag & IGNPAR)
|
||||
port->ignore_status_mask |= AT91_US_OVRE;
|
||||
}
|
||||
|
||||
// TODO: Ignore all characters if CREAD is set.
|
||||
|
||||
/* update the per-port timeout */
|
||||
uart_update_timeout(port, termios->c_cflag, baud);
|
||||
|
||||
/* disable interrupts and drain transmitter */
|
||||
imr = UART_GET_IMR(port); /* get interrupt mask */
|
||||
UART_PUT_IDR(port, -1); /* disable all interrupts */
|
||||
while (!(UART_GET_CSR(port) & AT91_US_TXEMPTY)) { barrier(); }
|
||||
|
||||
/* disable receiver and transmitter */
|
||||
UART_PUT_CR(port, AT91_US_TXDIS | AT91_US_RXDIS);
|
||||
|
||||
/* set the parity, stop bits and data size */
|
||||
UART_PUT_MR(port, mode);
|
||||
|
||||
/* set the baud rate */
|
||||
UART_PUT_BRGR(port, quot);
|
||||
UART_PUT_CR(port, AT91_US_RSTSTA | AT91_US_RSTRX);
|
||||
UART_PUT_CR(port, AT91_US_TXEN | AT91_US_RXEN);
|
||||
|
||||
/* restore interrupts */
|
||||
UART_PUT_IER(port, imr);
|
||||
|
||||
/* CTS flow-control and modem-status interrupts */
|
||||
if (UART_ENABLE_MS(port, termios->c_cflag))
|
||||
port->ops->enable_ms(port);
|
||||
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
}
|
||||
|
||||
/*
|
||||
* Return string describing the specified port
|
||||
*/
|
||||
static const char *at91_type(struct uart_port *port)
|
||||
{
|
||||
return (port->type == PORT_AT91RM9200) ? "AT91_SERIAL" : NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
* Release the memory region(s) being used by 'port'.
|
||||
*/
|
||||
static void at91_release_port(struct uart_port *port)
|
||||
{
|
||||
release_mem_region(port->mapbase,
|
||||
(port->mapbase == AT91_VA_BASE_DBGU) ? 512 : SZ_16K);
|
||||
}
|
||||
|
||||
/*
|
||||
* Request the memory region(s) being used by 'port'.
|
||||
*/
|
||||
static int at91_request_port(struct uart_port *port)
|
||||
{
|
||||
return request_mem_region(port->mapbase,
|
||||
(port->mapbase == AT91_VA_BASE_DBGU) ? 512 : SZ_16K,
|
||||
"at91_serial") != NULL ? 0 : -EBUSY;
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
* Configure/autoconfigure the port.
|
||||
*/
|
||||
static void at91_config_port(struct uart_port *port, int flags)
|
||||
{
|
||||
if (flags & UART_CONFIG_TYPE) {
|
||||
port->type = PORT_AT91RM9200;
|
||||
at91_request_port(port);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Verify the new serial_struct (for TIOCSSERIAL).
|
||||
*/
|
||||
static int at91_verify_port(struct uart_port *port, struct serial_struct *ser)
|
||||
{
|
||||
int ret = 0;
|
||||
if (ser->type != PORT_UNKNOWN && ser->type != PORT_AT91RM9200)
|
||||
ret = -EINVAL;
|
||||
if (port->irq != ser->irq)
|
||||
ret = -EINVAL;
|
||||
if (ser->io_type != SERIAL_IO_MEM)
|
||||
ret = -EINVAL;
|
||||
if (port->uartclk / 16 != ser->baud_base)
|
||||
ret = -EINVAL;
|
||||
if ((void *)port->mapbase != ser->iomem_base)
|
||||
ret = -EINVAL;
|
||||
if (port->iobase != ser->port)
|
||||
ret = -EINVAL;
|
||||
if (ser->hub6 != 0)
|
||||
ret = -EINVAL;
|
||||
return ret;
|
||||
}
|
||||
|
||||
static struct uart_ops at91_pops = {
|
||||
.tx_empty = at91_tx_empty,
|
||||
.set_mctrl = at91_set_mctrl,
|
||||
.get_mctrl = at91_get_mctrl,
|
||||
.stop_tx = at91_stop_tx,
|
||||
.start_tx = at91_start_tx,
|
||||
.stop_rx = at91_stop_rx,
|
||||
.enable_ms = at91_enable_ms,
|
||||
.break_ctl = at91_break_ctl,
|
||||
.startup = at91_startup,
|
||||
.shutdown = at91_shutdown,
|
||||
.set_termios = at91_set_termios,
|
||||
.type = at91_type,
|
||||
.release_port = at91_release_port,
|
||||
.request_port = at91_request_port,
|
||||
.config_port = at91_config_port,
|
||||
.verify_port = at91_verify_port,
|
||||
.pm = at91_serial_pm,
|
||||
};
|
||||
|
||||
static struct uart_port at91_ports[AT91_NR_UART];
|
||||
|
||||
void __init at91_init_ports(void)
|
||||
{
|
||||
static int first = 1;
|
||||
int i;
|
||||
|
||||
if (!first)
|
||||
return;
|
||||
first = 0;
|
||||
|
||||
for (i = 0; i < AT91_NR_UART; i++) {
|
||||
at91_ports[i].iotype = UPIO_MEM;
|
||||
at91_ports[i].flags = UPF_BOOT_AUTOCONF;
|
||||
at91_ports[i].uartclk = at91_master_clock;
|
||||
at91_ports[i].ops = &at91_pops;
|
||||
at91_ports[i].fifosize = 1;
|
||||
at91_ports[i].line = i;
|
||||
}
|
||||
}
|
||||
|
||||
void __init at91_register_uart_fns(struct at91rm9200_port_fns *fns)
|
||||
{
|
||||
if (fns->enable_ms)
|
||||
at91_pops.enable_ms = fns->enable_ms;
|
||||
if (fns->get_mctrl)
|
||||
at91_pops.get_mctrl = fns->get_mctrl;
|
||||
if (fns->set_mctrl)
|
||||
at91_pops.set_mctrl = fns->set_mctrl;
|
||||
at91_open = fns->open;
|
||||
at91_close = fns->close;
|
||||
at91_pops.pm = fns->pm;
|
||||
at91_pops.set_wake = fns->set_wake;
|
||||
}
|
||||
|
||||
/*
|
||||
* Setup ports.
|
||||
*/
|
||||
void __init at91_register_uart(int idx, int port)
|
||||
{
|
||||
if ((idx < 0) || (idx >= AT91_NR_UART)) {
|
||||
printk(KERN_ERR "%s: bad index number %d\n", __FUNCTION__, idx);
|
||||
return;
|
||||
}
|
||||
|
||||
switch (port) {
|
||||
case 0:
|
||||
at91_ports[idx].membase = (void __iomem *) AT91_VA_BASE_US0;
|
||||
at91_ports[idx].mapbase = AT91_VA_BASE_US0;
|
||||
at91_ports[idx].irq = AT91_ID_US0;
|
||||
AT91_CfgPIO_USART0();
|
||||
break;
|
||||
case 1:
|
||||
at91_ports[idx].membase = (void __iomem *) AT91_VA_BASE_US1;
|
||||
at91_ports[idx].mapbase = AT91_VA_BASE_US1;
|
||||
at91_ports[idx].irq = AT91_ID_US1;
|
||||
AT91_CfgPIO_USART1();
|
||||
break;
|
||||
case 2:
|
||||
at91_ports[idx].membase = (void __iomem *) AT91_VA_BASE_US2;
|
||||
at91_ports[idx].mapbase = AT91_VA_BASE_US2;
|
||||
at91_ports[idx].irq = AT91_ID_US2;
|
||||
AT91_CfgPIO_USART2();
|
||||
break;
|
||||
case 3:
|
||||
at91_ports[idx].membase = (void __iomem *) AT91_VA_BASE_US3;
|
||||
at91_ports[idx].mapbase = AT91_VA_BASE_US3;
|
||||
at91_ports[idx].irq = AT91_ID_US3;
|
||||
AT91_CfgPIO_USART3();
|
||||
break;
|
||||
case 4:
|
||||
at91_ports[idx].membase = (void __iomem *) AT91_VA_BASE_DBGU;
|
||||
at91_ports[idx].mapbase = AT91_VA_BASE_DBGU;
|
||||
at91_ports[idx].irq = AT91_ID_SYS;
|
||||
AT91_CfgPIO_DBGU();
|
||||
break;
|
||||
default:
|
||||
printk(KERN_ERR "%s : bad port number %d\n", __FUNCTION__, port);
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SERIAL_AT91_CONSOLE
|
||||
|
||||
/*
|
||||
* Interrupts are disabled on entering
|
||||
*/
|
||||
static void at91_console_write(struct console *co, const char *s, u_int count)
|
||||
{
|
||||
struct uart_port *port = at91_ports + co->index;
|
||||
unsigned int status, i, imr;
|
||||
|
||||
/*
|
||||
* First, save IMR and then disable interrupts
|
||||
*/
|
||||
imr = UART_GET_IMR(port); /* get interrupt mask */
|
||||
UART_PUT_IDR(port, AT91_US_RXRDY | AT91_US_TXRDY);
|
||||
|
||||
/*
|
||||
* Now, do each character
|
||||
*/
|
||||
for (i = 0; i < count; i++) {
|
||||
do {
|
||||
status = UART_GET_CSR(port);
|
||||
} while (!(status & AT91_US_TXRDY));
|
||||
UART_PUT_CHAR(port, s[i]);
|
||||
if (s[i] == '\n') {
|
||||
do {
|
||||
status = UART_GET_CSR(port);
|
||||
} while (!(status & AT91_US_TXRDY));
|
||||
UART_PUT_CHAR(port, '\r');
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Finally, wait for transmitter to become empty
|
||||
* and restore IMR
|
||||
*/
|
||||
do {
|
||||
status = UART_GET_CSR(port);
|
||||
} while (!(status & AT91_US_TXRDY));
|
||||
UART_PUT_IER(port, imr); /* set interrupts back the way they were */
|
||||
}
|
||||
|
||||
/*
|
||||
* If the port was already initialised (eg, by a boot loader), try to determine
|
||||
* the current setup.
|
||||
*/
|
||||
static void __init at91_console_get_options(struct uart_port *port, int *baud, int *parity, int *bits)
|
||||
{
|
||||
unsigned int mr, quot;
|
||||
|
||||
// TODO: CR is a write-only register
|
||||
// unsigned int cr;
|
||||
//
|
||||
// cr = UART_GET_CR(port) & (AT91_US_RXEN | AT91_US_TXEN);
|
||||
// if (cr == (AT91_US_RXEN | AT91_US_TXEN)) {
|
||||
// /* ok, the port was enabled */
|
||||
// }
|
||||
|
||||
mr = UART_GET_MR(port) & AT91_US_CHRL;
|
||||
if (mr == AT91_US_CHRL_8)
|
||||
*bits = 8;
|
||||
else
|
||||
*bits = 7;
|
||||
|
||||
mr = UART_GET_MR(port) & AT91_US_PAR;
|
||||
if (mr == AT91_US_PAR_EVEN)
|
||||
*parity = 'e';
|
||||
else if (mr == AT91_US_PAR_ODD)
|
||||
*parity = 'o';
|
||||
|
||||
quot = UART_GET_BRGR(port);
|
||||
*baud = port->uartclk / (16 * (quot));
|
||||
}
|
||||
|
||||
static int __init at91_console_setup(struct console *co, char *options)
|
||||
{
|
||||
struct uart_port *port;
|
||||
int baud = 115200;
|
||||
int bits = 8;
|
||||
int parity = 'n';
|
||||
int flow = 'n';
|
||||
|
||||
/*
|
||||
* Check whether an invalid uart number has been specified, and
|
||||
* if so, search for the first available port that does have
|
||||
* console support.
|
||||
*/
|
||||
port = uart_get_console(at91_ports, AT91_NR_UART, co);
|
||||
|
||||
/*
|
||||
* Enable the serial console, in-case bootloader did not do it.
|
||||
*/
|
||||
at91_sys_write(AT91_PMC_PCER, 1 << port->irq); /* enable clock */
|
||||
UART_PUT_IDR(port, -1); /* disable interrupts */
|
||||
UART_PUT_CR(port, AT91_US_RSTSTA | AT91_US_RSTRX);
|
||||
UART_PUT_CR(port, AT91_US_TXEN | AT91_US_RXEN);
|
||||
|
||||
if (options)
|
||||
uart_parse_options(options, &baud, &parity, &bits, &flow);
|
||||
else
|
||||
at91_console_get_options(port, &baud, &parity, &bits);
|
||||
|
||||
return uart_set_options(port, co, baud, parity, bits, flow);
|
||||
}
|
||||
|
||||
static struct uart_driver at91_uart;
|
||||
|
||||
static struct console at91_console = {
|
||||
.name = AT91_DEVICENAME,
|
||||
.write = at91_console_write,
|
||||
.device = uart_console_device,
|
||||
.setup = at91_console_setup,
|
||||
.flags = CON_PRINTBUFFER,
|
||||
.index = -1,
|
||||
.data = &at91_uart,
|
||||
};
|
||||
|
||||
#define AT91_CONSOLE_DEVICE &at91_console
|
||||
|
||||
static int __init at91_console_init(void)
|
||||
{
|
||||
at91_init_ports();
|
||||
|
||||
at91_console.index = at91_console_port;
|
||||
register_console(&at91_console);
|
||||
return 0;
|
||||
}
|
||||
console_initcall(at91_console_init);
|
||||
|
||||
#else
|
||||
#define AT91_CONSOLE_DEVICE NULL
|
||||
#endif
|
||||
|
||||
static struct uart_driver at91_uart = {
|
||||
.owner = THIS_MODULE,
|
||||
.driver_name = AT91_DEVICENAME,
|
||||
.dev_name = AT91_DEVICENAME,
|
||||
.devfs_name = AT91_DEVICENAME,
|
||||
.major = SERIAL_AT91_MAJOR,
|
||||
.minor = MINOR_START,
|
||||
.nr = AT91_NR_UART,
|
||||
.cons = AT91_CONSOLE_DEVICE,
|
||||
};
|
||||
|
||||
static int __init at91_serial_init(void)
|
||||
{
|
||||
int ret, i;
|
||||
|
||||
at91_init_ports();
|
||||
|
||||
ret = uart_register_driver(&at91_uart);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
for (i = 0; i < AT91_NR_UART; i++) {
|
||||
if (at91_serial_map[i] >= 0)
|
||||
uart_add_one_port(&at91_uart, &at91_ports[i]);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void __exit at91_serial_exit(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < AT91_NR_UART; i++) {
|
||||
if (at91_serial_map[i] >= 0)
|
||||
uart_remove_one_port(&at91_uart, &at91_ports[i]);
|
||||
}
|
||||
|
||||
uart_unregister_driver(&at91_uart);
|
||||
}
|
||||
|
||||
module_init(at91_serial_init);
|
||||
module_exit(at91_serial_exit);
|
||||
|
||||
MODULE_AUTHOR("Rick Bronson");
|
||||
MODULE_DESCRIPTION("AT91 generic serial port driver");
|
||||
MODULE_LICENSE("GPL");
|
|
@ -0,0 +1,36 @@
|
|||
/*
|
||||
* include/asm-arm/arch-at91rm9200/at91rm9200_pdc.h
|
||||
*
|
||||
* Copyright (C) 2005 Ivan Kokshaysky
|
||||
* Copyright (C) SAN People
|
||||
*
|
||||
* Peripheral Data Controller (PDC) registers.
|
||||
* Based on AT91RM9200 datasheet revision E.
|
||||
*
|
||||
* 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 AT91RM9200_PDC_H
|
||||
#define AT91RM9200_PDC_H
|
||||
|
||||
#define AT91_PDC_RPR 0x100 /* Receive Pointer Register */
|
||||
#define AT91_PDC_RCR 0x104 /* Receive Counter Register */
|
||||
#define AT91_PDC_TPR 0x108 /* Transmit Pointer Register */
|
||||
#define AT91_PDC_TCR 0x10c /* Transmit Counter Register */
|
||||
#define AT91_PDC_RNPR 0x110 /* Receive Next Pointer Register */
|
||||
#define AT91_PDC_RNCR 0x114 /* Receive Next Counter Register */
|
||||
#define AT91_PDC_TNPR 0x118 /* Transmit Next Pointer Register */
|
||||
#define AT91_PDC_TNCR 0x11c /* Transmit Next Counter Register */
|
||||
|
||||
#define AT91_PDC_PTCR 0x120 /* Transfer Control Register */
|
||||
#define AT91_PDC_RXTEN (1 << 0) /* Receiver Transfer Enable */
|
||||
#define AT91_PDC_RXTDIS (1 << 1) /* Receiver Transfer Disable */
|
||||
#define AT91_PDC_TXTEN (1 << 8) /* Transmitter Transfer Enable */
|
||||
#define AT91_PDC_TXTDIS (1 << 9) /* Transmitter Transfer Disable */
|
||||
|
||||
#define AT91_PDC_PTSR 0x124 /* Transfer Status Register */
|
||||
|
||||
#endif
|
|
@ -0,0 +1,123 @@
|
|||
/*
|
||||
* include/asm-arm/arch-at91rm9200/at91rm9200_usart.h
|
||||
*
|
||||
* Copyright (C) 2005 Ivan Kokshaysky
|
||||
* Copyright (C) SAN People
|
||||
*
|
||||
* USART registers.
|
||||
* Based on AT91RM9200 datasheet revision E.
|
||||
*
|
||||
* 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 AT91RM9200_USART_H
|
||||
#define AT91RM9200_USART_H
|
||||
|
||||
#define AT91_US_CR 0x00 /* Control Register */
|
||||
#define AT91_US_RSTRX (1 << 2) /* Reset Receiver */
|
||||
#define AT91_US_RSTTX (1 << 3) /* Reset Transmitter */
|
||||
#define AT91_US_RXEN (1 << 4) /* Receiver Enable */
|
||||
#define AT91_US_RXDIS (1 << 5) /* Receiver Disable */
|
||||
#define AT91_US_TXEN (1 << 6) /* Transmitter Enable */
|
||||
#define AT91_US_TXDIS (1 << 7) /* Transmitter Disable */
|
||||
#define AT91_US_RSTSTA (1 << 8) /* Reset Status Bits */
|
||||
#define AT91_US_STTBRK (1 << 9) /* Start Break */
|
||||
#define AT91_US_STPBRK (1 << 10) /* Stop Break */
|
||||
#define AT91_US_STTTO (1 << 11) /* Start Time-out */
|
||||
#define AT91_US_SENDA (1 << 12) /* Send Address */
|
||||
#define AT91_US_RSTIT (1 << 13) /* Reset Iterations */
|
||||
#define AT91_US_RSTNACK (1 << 14) /* Reset Non Acknowledge */
|
||||
#define AT91_US_RETTO (1 << 15) /* Rearm Time-out */
|
||||
#define AT91_US_DTREN (1 << 16) /* Data Terminal Ready Enable */
|
||||
#define AT91_US_DTRDIS (1 << 17) /* Data Terminal Ready Disable */
|
||||
#define AT91_US_RTSEN (1 << 18) /* Request To Send Enable */
|
||||
#define AT91_US_RTSDIS (1 << 19) /* Request To Send Disable */
|
||||
|
||||
#define AT91_US_MR 0x04 /* Mode Register */
|
||||
#define AT91_US_USMODE (0xf << 0) /* Mode of the USART */
|
||||
#define AT91_US_USMODE_NORMAL 0
|
||||
#define AT91_US_USMODE_RS485 1
|
||||
#define AT91_US_USMODE_HWHS 2
|
||||
#define AT91_US_USMODE_MODEM 3
|
||||
#define AT91_US_USMODE_ISO7816_T0 4
|
||||
#define AT91_US_USMODE_ISO7816_T1 6
|
||||
#define AT91_US_USMODE_IRDA 8
|
||||
#define AT91_US_USCLKS (3 << 4) /* Clock Selection */
|
||||
#define AT91_US_CHRL (3 << 6) /* Character Length */
|
||||
#define AT91_US_CHRL_5 (0 << 6)
|
||||
#define AT91_US_CHRL_6 (1 << 6)
|
||||
#define AT91_US_CHRL_7 (2 << 6)
|
||||
#define AT91_US_CHRL_8 (3 << 6)
|
||||
#define AT91_US_SYNC (1 << 8) /* Synchronous Mode Select */
|
||||
#define AT91_US_PAR (7 << 9) /* Parity Type */
|
||||
#define AT91_US_PAR_EVEN (0 << 9)
|
||||
#define AT91_US_PAR_ODD (1 << 9)
|
||||
#define AT91_US_PAR_SPACE (2 << 9)
|
||||
#define AT91_US_PAR_MARK (3 << 9)
|
||||
#define AT91_US_PAR_NONE (4 << 9)
|
||||
#define AT91_US_PAR_MULTI_DROP (6 << 9)
|
||||
#define AT91_US_NBSTOP (3 << 12) /* Number of Stop Bits */
|
||||
#define AT91_US_NBSTOP_1 (0 << 12)
|
||||
#define AT91_US_NBSTOP_1_5 (1 << 12)
|
||||
#define AT91_US_NBSTOP_2 (2 << 12)
|
||||
#define AT91_US_CHMODE (3 << 14) /* Channel Mode */
|
||||
#define AT91_US_CHMODE_NORMAL (0 << 14)
|
||||
#define AT91_US_CHMODE_ECHO (1 << 14)
|
||||
#define AT91_US_CHMODE_LOC_LOOP (2 << 14)
|
||||
#define AT91_US_CHMODE_REM_LOOP (3 << 14)
|
||||
#define AT91_US_MSBF (1 << 16) /* Bit Order */
|
||||
#define AT91_US_MODE9 (1 << 17) /* 9-bit Character Length */
|
||||
#define AT91_US_CLKO (1 << 18) /* Clock Output Select */
|
||||
#define AT91_US_OVER (1 << 19) /* Oversampling Mode */
|
||||
#define AT91_US_INACK (1 << 20) /* Inhibit Non Acknowledge */
|
||||
#define AT91_US_DSNACK (1 << 21) /* Disable Successive NACK */
|
||||
#define AT91_US_MAX_ITER (7 << 24) /* Max Iterations */
|
||||
#define AT91_US_FILTER (1 << 28) /* Infrared Receive Line Filter */
|
||||
|
||||
#define AT91_US_IER 0x08 /* Interrupt Enable Register */
|
||||
#define AT91_US_RXRDY (1 << 0) /* Receiver Ready */
|
||||
#define AT91_US_TXRDY (1 << 1) /* Transmitter Ready */
|
||||
#define AT91_US_RXBRK (1 << 2) /* Break Received / End of Break */
|
||||
#define AT91_US_ENDRX (1 << 3) /* End of Receiver Transfer */
|
||||
#define AT91_US_ENDTX (1 << 4) /* End of Transmitter Transfer */
|
||||
#define AT91_US_OVRE (1 << 5) /* Overrun Error */
|
||||
#define AT91_US_FRAME (1 << 6) /* Framing Error */
|
||||
#define AT91_US_PARE (1 << 7) /* Parity Error */
|
||||
#define AT91_US_TIMEOUT (1 << 8) /* Receiver Time-out */
|
||||
#define AT91_US_TXEMPTY (1 << 9) /* Transmitter Empty */
|
||||
#define AT91_US_ITERATION (1 << 10) /* Max number of Repetitions Reached */
|
||||
#define AT91_US_TXBUFE (1 << 11) /* Transmission Buffer Empty */
|
||||
#define AT91_US_RXBUFF (1 << 12) /* Reception Buffer Full */
|
||||
#define AT91_US_NACK (1 << 13) /* Non Acknowledge */
|
||||
#define AT91_US_RIIC (1 << 16) /* Ring Indicator Input Change */
|
||||
#define AT91_US_DSRIC (1 << 17) /* Data Set Ready Input Change */
|
||||
#define AT91_US_DCDIC (1 << 18) /* Data Carrier Detect Input Change */
|
||||
#define AT91_US_CTSIC (1 << 19) /* Clear to Send Input Change */
|
||||
#define AT91_US_RI (1 << 20) /* RI */
|
||||
#define AT91_US_DSR (1 << 21) /* DSR */
|
||||
#define AT91_US_DCD (1 << 22) /* DCD */
|
||||
#define AT91_US_CTS (1 << 23) /* CTS */
|
||||
|
||||
#define AT91_US_IDR 0x0c /* Interrupt Disable Register */
|
||||
#define AT91_US_IMR 0x10 /* Interrupt Mask Register */
|
||||
#define AT91_US_CSR 0x14 /* Channel Status Register */
|
||||
#define AT91_US_RHR 0x18 /* Receiver Holding Register */
|
||||
#define AT91_US_THR 0x1c /* Transmitter Holding Register */
|
||||
|
||||
#define AT91_US_BRGR 0x20 /* Baud Rate Generator Register */
|
||||
#define AT91_US_CD (0xffff << 0) /* Clock Divider */
|
||||
|
||||
#define AT91_US_RTOR 0x24 /* Receiver Time-out Register */
|
||||
#define AT91_US_TO (0xffff << 0) /* Time-out Value */
|
||||
|
||||
#define AT91_US_TTGR 0x28 /* Transmitter Timeguard Register */
|
||||
#define AT91_US_TG (0xff << 0) /* Timeguard Value */
|
||||
|
||||
#define AT91_US_FIDI 0x40 /* FI DI Ratio Register */
|
||||
#define AT91_US_NER 0x44 /* Number of Errors Register */
|
||||
#define AT91_US_IF 0x4c /* IrDA Filter Register */
|
||||
|
||||
#endif
|
|
@ -22,7 +22,16 @@ static inline __attribute_const__ __u32 ___arch__swab32(__u32 x)
|
|||
{
|
||||
__u32 t;
|
||||
|
||||
t = x ^ ((x << 16) | (x >> 16)); /* eor r1,r0,r0,ror #16 */
|
||||
if (__builtin_constant_p(x)) {
|
||||
t = x ^ ((x << 16) | (x >> 16)); /* eor r1,r0,r0,ror #16 */
|
||||
} else {
|
||||
/*
|
||||
* The compiler needs a bit of a hint here to always do the
|
||||
* right thing and not screw it up to different degrees
|
||||
* depending on the gcc version.
|
||||
*/
|
||||
asm ("eor\t%0, %1, %1, ror #16" : "=r" (t) : "r" (x));
|
||||
}
|
||||
x = (x << 24) | (x >> 8); /* mov r0,r0,ror #8 */
|
||||
t &= ~0x00FF0000; /* bic r1,r1,#0x00FF0000 */
|
||||
x ^= (t >> 8); /* eor r0,r0,r1,lsr #8 */
|
||||
|
|
|
@ -0,0 +1,36 @@
|
|||
/*
|
||||
* linux/include/asm-arm/mach/serial_at91rm9200.h
|
||||
*
|
||||
* Based on serial_sa1100.h by Nicolas Pitre
|
||||
*
|
||||
* Copyright (C) 2002 ATMEL Rousset
|
||||
*
|
||||
* Low level machine dependent UART functions.
|
||||
*/
|
||||
#include <linux/config.h>
|
||||
|
||||
struct uart_port;
|
||||
|
||||
/*
|
||||
* This is a temporary structure for registering these
|
||||
* functions; it is intended to be discarded after boot.
|
||||
*/
|
||||
struct at91rm9200_port_fns {
|
||||
void (*set_mctrl)(struct uart_port *, u_int);
|
||||
u_int (*get_mctrl)(struct uart_port *);
|
||||
void (*enable_ms)(struct uart_port *);
|
||||
void (*pm)(struct uart_port *, u_int, u_int);
|
||||
int (*set_wake)(struct uart_port *, u_int);
|
||||
int (*open)(struct uart_port *);
|
||||
void (*close)(struct uart_port *);
|
||||
};
|
||||
|
||||
#if defined(CONFIG_SERIAL_AT91)
|
||||
void at91_register_uart_fns(struct at91rm9200_port_fns *fns);
|
||||
void at91_register_uart(int idx, int port);
|
||||
#else
|
||||
#define at91_register_uart_fns(fns) do { } while (0)
|
||||
#define at91_register_uart(idx,port) do { } while (0)
|
||||
#endif
|
||||
|
||||
|
|
@ -25,6 +25,7 @@
|
|||
#include <linux/config.h>
|
||||
#include <linux/compiler.h>
|
||||
#include <asm/arch/memory.h>
|
||||
#include <asm/sizes.h>
|
||||
|
||||
#ifndef TASK_SIZE
|
||||
/*
|
||||
|
@ -47,6 +48,14 @@
|
|||
#define PAGE_OFFSET UL(0xc0000000)
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Size of DMA-consistent memory region. Must be multiple of 2M,
|
||||
* between 2MB and 14MB inclusive.
|
||||
*/
|
||||
#ifndef CONSISTENT_DMA_SIZE
|
||||
#define CONSISTENT_DMA_SIZE SZ_2M
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Physical vs virtual RAM address space conversion. These are
|
||||
* private definitions which should NOT be used outside memory.h
|
||||
|
|
|
@ -67,6 +67,9 @@
|
|||
/* Parisc type numbers. */
|
||||
#define PORT_MUX 48
|
||||
|
||||
/* Atmel AT91RM9200 SoC */
|
||||
#define PORT_AT91RM9200 49
|
||||
|
||||
/* Macintosh Zilog type numbers */
|
||||
#define PORT_MAC_ZILOG 50 /* m68k : not yet implemented */
|
||||
#define PORT_PMAC_ZILOG 51
|
||||
|
|
Loading…
Reference in New Issue