diff options
author | Ulf Samuelsson <ulf.samuelsson@atmel.com> | 2008-03-12 01:04:17 +0000 |
---|---|---|
committer | Ulf Samuelsson <ulf.samuelsson@atmel.com> | 2008-03-12 01:04:17 +0000 |
commit | 8426570482756bd174be4290ba59e959a6cda8d0 (patch) | |
tree | 6dac379813a32c7d7764ecc7e11dbafe19d74c17 /target | |
parent | 9bb163d89803d7d4da154f94b80630080a6521ef (diff) |
Add support for 2.6.24 for AT91
Diffstat (limited to 'target')
-rw-r--r-- | target/device/Atmel/arch-arm/kernel-patches-2.6.24/2.6.24-at91.patch | 30343 |
1 files changed, 30343 insertions, 0 deletions
diff --git a/target/device/Atmel/arch-arm/kernel-patches-2.6.24/2.6.24-at91.patch b/target/device/Atmel/arch-arm/kernel-patches-2.6.24/2.6.24-at91.patch new file mode 100644 index 000000000..803cd265f --- /dev/null +++ b/target/device/Atmel/arch-arm/kernel-patches-2.6.24/2.6.24-at91.patch @@ -0,0 +1,30343 @@ +diff -urN -x CVS linux-2.6.24/MAINTAINERS linux-2.6/MAINTAINERS +--- linux-2.6.24/MAINTAINERS 2008-03-01 22:02:07.000000000 +0200 ++++ linux-2.6/MAINTAINERS 2008-01-16 13:15:25.000000000 +0200 +@@ -437,7 +437,7 @@ + + ARM/ATMEL AT91RM9200 ARM ARCHITECTURE + P: Andrew Victor +-M: andrew@sanpeople.com ++M: linux@maxim.org.za + L: linux-arm-kernel@lists.arm.linux.org.uk (subscribers-only) + W: http://maxim.org.za/at91_26.html + S: Maintained +diff -urN -x CVS linux-2.6.24/arch/arm/Kconfig linux-2.6/arch/arm/Kconfig +--- linux-2.6.24/arch/arm/Kconfig 2008-03-01 22:02:07.000000000 +0200 ++++ linux-2.6/arch/arm/Kconfig 2008-02-18 22:56:04.000000000 +0200 +@@ -180,8 +180,8 @@ + bool "Atmel AT91" + select GENERIC_GPIO + help +- This enables support for systems based on the Atmel AT91RM9200 +- and AT91SAM9xxx processors. ++ This enables support for systems based on the Atmel AT91RM9200, ++ AT91SAM9 and AT91CAP9 processors. + + config ARCH_CLPS7500 + bool "Cirrus CL-PS7500FE" +@@ -657,6 +657,7 @@ + default 128 if ARCH_L7200 + default 200 if ARCH_EBSA110 || ARCH_S3C2410 + default OMAP_32K_TIMER_HZ if ARCH_OMAP && OMAP_32K_TIMER ++ default AT91_TIMER_HZ if ARCH_AT91 + default 100 + + config AEABI +diff -urN -x CVS linux-2.6.24/arch/arm/boot/compressed/head-at91rm9200.S linux-2.6/arch/arm/boot/compressed/head-at91rm9200.S +--- linux-2.6.24/arch/arm/boot/compressed/head-at91rm9200.S 2007-10-09 22:31:38.000000000 +0200 ++++ linux-2.6/arch/arm/boot/compressed/head-at91rm9200.S 2007-12-31 10:43:35.000000000 +0200 +@@ -67,12 +67,36 @@ + cmp r7, r3 + beq 99f + ++ @ emQbit ECB_AT91 : 1072 ++ mov r3, #(MACH_TYPE_ECBAT91 & 0xff) ++ orr r3, r3, #(MACH_TYPE_ECBAT91 & 0xff00) ++ cmp r7, r3 ++ beq 99f ++ + @ Ajeco 1ARM : 1075 + mov r3, #(MACH_TYPE_ONEARM & 0xff) + orr r3, r3, #(MACH_TYPE_ONEARM & 0xff00) + cmp r7, r3 + beq 99f + ++ @ Promwad Chub : 1181 ++ mov r3, #(MACH_TYPE_CHUB & 0xff) ++ orr r3, r3, #(MACH_TYPE_CHUB & 0xff00) ++ cmp r7, r3 ++ beq 99f ++ ++ @ Sweda TMS-100: 1277 ++ mov r3, #(MACH_TYPE_SWEDATMS & 0xff) ++ orr r3, r3, #(MACH_TYPE_SWEDATMS & 0xff00) ++ cmp r7, r3 ++ beq 99f ++ ++ @ eQ-3 HomeMatic: 1392 ++ mov r3, #(MACH_TYPE_HOMEMATIC & 0xff) ++ orr r3, r3, #(MACH_TYPE_HOMEMATIC & 0xff00) ++ cmp r7, r3 ++ beq 99f ++ + @ Unknown board, use the AT91RM9200DK board + @ mov r7, #MACH_TYPE_AT91RM9200 + mov r7, #(MACH_TYPE_AT91RM9200DK & 0xff) +diff -urN -x CVS linux-2.6.24/arch/arm/configs/at91cap9adk_defconfig linux-2.6/arch/arm/configs/at91cap9adk_defconfig +--- linux-2.6.24/arch/arm/configs/at91cap9adk_defconfig 1970-01-01 02:00:00.000000000 +0200 ++++ linux-2.6/arch/arm/configs/at91cap9adk_defconfig 2008-02-18 22:52:04.000000000 +0200 +@@ -0,0 +1,1143 @@ ++# ++# Automatically generated make config: don't edit ++# Linux kernel version: 2.6.24-rc8 ++# Wed Jan 23 22:55:57 2008 ++# ++CONFIG_ARM=y ++CONFIG_SYS_SUPPORTS_APM_EMULATION=y ++CONFIG_GENERIC_GPIO=y ++# CONFIG_GENERIC_TIME is not set ++# CONFIG_GENERIC_CLOCKEVENTS is not set ++CONFIG_MMU=y ++# CONFIG_NO_IOPORT is not set ++CONFIG_GENERIC_HARDIRQS=y ++CONFIG_STACKTRACE_SUPPORT=y ++CONFIG_LOCKDEP_SUPPORT=y ++CONFIG_TRACE_IRQFLAGS_SUPPORT=y ++CONFIG_HARDIRQS_SW_RESEND=y ++CONFIG_GENERIC_IRQ_PROBE=y ++CONFIG_RWSEM_GENERIC_SPINLOCK=y ++# CONFIG_ARCH_HAS_ILOG2_U32 is not set ++# CONFIG_ARCH_HAS_ILOG2_U64 is not set ++CONFIG_GENERIC_HWEIGHT=y ++CONFIG_GENERIC_CALIBRATE_DELAY=y ++CONFIG_ZONE_DMA=y ++CONFIG_VECTORS_BASE=0xffff0000 ++CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" ++ ++# ++# General setup ++# ++CONFIG_EXPERIMENTAL=y ++CONFIG_BROKEN_ON_SMP=y ++CONFIG_INIT_ENV_ARG_LIMIT=32 ++CONFIG_LOCALVERSION="" ++# CONFIG_LOCALVERSION_AUTO is not set ++# CONFIG_SWAP is not set ++CONFIG_SYSVIPC=y ++CONFIG_SYSVIPC_SYSCTL=y ++# CONFIG_POSIX_MQUEUE is not set ++# CONFIG_BSD_PROCESS_ACCT is not set ++# CONFIG_TASKSTATS is not set ++# CONFIG_USER_NS is not set ++# CONFIG_PID_NS is not set ++# CONFIG_AUDIT is not set ++# CONFIG_IKCONFIG is not set ++CONFIG_LOG_BUF_SHIFT=14 ++# CONFIG_CGROUPS is not set ++CONFIG_FAIR_GROUP_SCHED=y ++CONFIG_FAIR_USER_SCHED=y ++# CONFIG_FAIR_CGROUP_SCHED is not set ++CONFIG_SYSFS_DEPRECATED=y ++# CONFIG_RELAY is not set ++CONFIG_BLK_DEV_INITRD=y ++CONFIG_INITRAMFS_SOURCE="" ++CONFIG_CC_OPTIMIZE_FOR_SIZE=y ++CONFIG_SYSCTL=y ++# CONFIG_EMBEDDED is not set ++CONFIG_UID16=y ++CONFIG_SYSCTL_SYSCALL=y ++CONFIG_KALLSYMS=y ++# CONFIG_KALLSYMS_ALL is not set ++# CONFIG_KALLSYMS_EXTRA_PASS is not set ++CONFIG_HOTPLUG=y ++CONFIG_PRINTK=y ++CONFIG_BUG=y ++CONFIG_ELF_CORE=y ++CONFIG_BASE_FULL=y ++CONFIG_FUTEX=y ++CONFIG_ANON_INODES=y ++CONFIG_EPOLL=y ++CONFIG_SIGNALFD=y ++CONFIG_EVENTFD=y ++CONFIG_SHMEM=y ++CONFIG_VM_EVENT_COUNTERS=y ++CONFIG_SLAB=y ++# CONFIG_SLUB is not set ++# CONFIG_SLOB is not set ++CONFIG_SLABINFO=y ++CONFIG_RT_MUTEXES=y ++# CONFIG_TINY_SHMEM is not set ++CONFIG_BASE_SMALL=0 ++CONFIG_MODULES=y ++CONFIG_MODULE_UNLOAD=y ++# CONFIG_MODULE_FORCE_UNLOAD is not set ++# CONFIG_MODVERSIONS is not set ++# CONFIG_MODULE_SRCVERSION_ALL is not set ++CONFIG_KMOD=y ++CONFIG_BLOCK=y ++# CONFIG_LBD is not set ++# CONFIG_BLK_DEV_IO_TRACE is not set ++# CONFIG_LSF is not set ++# CONFIG_BLK_DEV_BSG is not set ++ ++# ++# 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_AAEC2000 is not set ++# CONFIG_ARCH_INTEGRATOR is not set ++# CONFIG_ARCH_REALVIEW is not set ++# CONFIG_ARCH_VERSATILE is not set ++CONFIG_ARCH_AT91=y ++# CONFIG_ARCH_CLPS7500 is not set ++# CONFIG_ARCH_CLPS711X is not set ++# CONFIG_ARCH_CO285 is not set ++# CONFIG_ARCH_EBSA110 is not set ++# CONFIG_ARCH_EP93XX is not set ++# CONFIG_ARCH_FOOTBRIDGE is not set ++# CONFIG_ARCH_NETX is not set ++# CONFIG_ARCH_H720X is not set ++# CONFIG_ARCH_IMX is not set ++# CONFIG_ARCH_IOP13XX is not set ++# CONFIG_ARCH_IOP32X is not set ++# CONFIG_ARCH_IOP33X is not set ++# CONFIG_ARCH_IXP23XX is not set ++# CONFIG_ARCH_IXP2000 is not set ++# CONFIG_ARCH_IXP4XX is not set ++# CONFIG_ARCH_L7200 is not set ++# CONFIG_ARCH_KS8695 is not set ++# CONFIG_ARCH_NS9XXX is not set ++# CONFIG_ARCH_MXC is not set ++# CONFIG_ARCH_PNX4008 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_DAVINCI is not set ++# CONFIG_ARCH_OMAP is not set ++ ++# ++# Boot options ++# ++ ++# ++# Power management ++# ++ ++# ++# Atmel AT91 System-on-Chip ++# ++# CONFIG_ARCH_AT91RM9200 is not set ++# CONFIG_ARCH_AT91SAM9260 is not set ++# CONFIG_ARCH_AT91SAM9261 is not set ++# CONFIG_ARCH_AT91SAM9263 is not set ++# CONFIG_ARCH_AT91SAM9RL is not set ++CONFIG_ARCH_AT91CAP9=y ++# CONFIG_ARCH_AT91X40 is not set ++CONFIG_AT91_PMC_UNIT=y ++ ++# ++# AT91CAP9 Board Type ++# ++CONFIG_MACH_AT91CAP9ADK=y ++ ++# ++# AT91 Board Options ++# ++CONFIG_MTD_AT91_DATAFLASH_CARD=y ++# CONFIG_MTD_NAND_AT91_BUSWIDTH_16 is not set ++ ++# ++# AT91 Feature Selections ++# ++CONFIG_AT91_PROGRAMMABLE_CLOCKS=y ++CONFIG_AT91_TIMER_HZ=100 ++ ++# ++# Processor Type ++# ++CONFIG_CPU_32=y ++CONFIG_CPU_ARM926T=y ++CONFIG_CPU_32v5=y ++CONFIG_CPU_ABRT_EV5TJ=y ++CONFIG_CPU_CACHE_VIVT=y ++CONFIG_CPU_COPY_V4WB=y ++CONFIG_CPU_TLB_V4WBI=y ++CONFIG_CPU_CP15=y ++CONFIG_CPU_CP15_MMU=y ++ ++# ++# Processor Features ++# ++# CONFIG_ARM_THUMB is not set ++# CONFIG_CPU_ICACHE_DISABLE is not set ++# CONFIG_CPU_DCACHE_DISABLE is not set ++# CONFIG_CPU_DCACHE_WRITETHROUGH is not set ++# CONFIG_CPU_CACHE_ROUND_ROBIN is not set ++# CONFIG_OUTER_CACHE is not set ++ ++# ++# Bus support ++# ++# CONFIG_PCI_SYSCALL is not set ++# CONFIG_ARCH_SUPPORTS_MSI is not set ++# CONFIG_PCCARD is not set ++ ++# ++# Kernel Features ++# ++# CONFIG_TICK_ONESHOT is not set ++# CONFIG_PREEMPT is not set ++# CONFIG_NO_IDLE_HZ is not set ++CONFIG_HZ=100 ++CONFIG_AEABI=y ++CONFIG_OABI_COMPAT=y ++# 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_SPARSEMEM_VMEMMAP_ENABLE is not set ++CONFIG_SPLIT_PTLOCK_CPUS=4096 ++# CONFIG_RESOURCES_64BIT is not set ++CONFIG_ZONE_DMA_FLAG=1 ++CONFIG_BOUNCE=y ++CONFIG_VIRT_TO_BUS=y ++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="console=ttyS0,115200 root=/dev/ram0 rw" ++# CONFIG_XIP_KERNEL is not set ++# CONFIG_KEXEC 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 ++# CONFIG_VFP is not set ++ ++# ++# Userspace binary formats ++# ++CONFIG_BINFMT_ELF=y ++# CONFIG_BINFMT_AOUT is not set ++# CONFIG_BINFMT_MISC is not set ++ ++# ++# Power management options ++# ++# CONFIG_PM is not set ++CONFIG_SUSPEND_UP_POSSIBLE=y ++ ++# ++# 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=y ++# CONFIG_NET_IPIP is not set ++# CONFIG_NET_IPGRE is not set ++# CONFIG_ARPD is not set ++# CONFIG_SYN_COOKIES is not set ++# CONFIG_INET_AH is not set ++# CONFIG_INET_ESP is not set ++# CONFIG_INET_IPCOMP is not set ++# CONFIG_INET_XFRM_TUNNEL is not set ++# CONFIG_INET_TUNNEL is not set ++# CONFIG_INET_XFRM_MODE_TRANSPORT is not set ++# CONFIG_INET_XFRM_MODE_TUNNEL is not set ++# CONFIG_INET_XFRM_MODE_BEET is not set ++# CONFIG_INET_LRO is not set ++# CONFIG_INET_DIAG is not set ++# CONFIG_TCP_CONG_ADVANCED is not set ++CONFIG_TCP_CONG_CUBIC=y ++CONFIG_DEFAULT_TCP_CONG="cubic" ++# CONFIG_TCP_MD5SIG is not set ++# CONFIG_IPV6 is not set ++# CONFIG_INET6_XFRM_TUNNEL is not set ++# CONFIG_INET6_TUNNEL is not set ++# CONFIG_NETWORK_SECMARK is not set ++# CONFIG_NETFILTER is not set ++# CONFIG_IP_DCCP is not set ++# CONFIG_IP_SCTP is not set ++# CONFIG_TIPC is not set ++# CONFIG_ATM is not set ++# CONFIG_BRIDGE is not set ++# CONFIG_VLAN_8021Q is not set ++# CONFIG_DECNET is not set ++# CONFIG_LLC2 is not set ++# CONFIG_IPX is not set ++# CONFIG_ATALK is not set ++# CONFIG_X25 is not set ++# CONFIG_LAPB is not set ++# CONFIG_ECONET is not set ++# CONFIG_WAN_ROUTER is not set ++# CONFIG_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_AF_RXRPC is not set ++ ++# ++# Wireless ++# ++# CONFIG_CFG80211 is not set ++# CONFIG_WIRELESS_EXT is not set ++# CONFIG_MAC80211 is not set ++# CONFIG_IEEE80211 is not set ++# CONFIG_RFKILL is not set ++# CONFIG_NET_9P is not set ++ ++# ++# Device Drivers ++# ++ ++# ++# Generic Driver Options ++# ++CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" ++CONFIG_STANDALONE=y ++CONFIG_PREVENT_FIRMWARE_BUILD=y ++# CONFIG_FW_LOADER is not set ++# CONFIG_DEBUG_DRIVER is not set ++# CONFIG_DEBUG_DEVRES is not set ++# CONFIG_SYS_HYPERVISOR is not set ++# CONFIG_CONNECTOR is not set ++CONFIG_MTD=y ++# CONFIG_MTD_DEBUG is not set ++# CONFIG_MTD_CONCAT is not set ++CONFIG_MTD_PARTITIONS=y ++# CONFIG_MTD_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_BLKDEVS=y ++CONFIG_MTD_BLOCK=y ++# CONFIG_FTL is not set ++# CONFIG_NFTL is not set ++# CONFIG_INFTL is not set ++# CONFIG_RFD_FTL is not set ++# CONFIG_SSFDC is not set ++# CONFIG_MTD_OOPS is not set ++ ++# ++# RAM/ROM/Flash chip drivers ++# ++CONFIG_MTD_CFI=y ++CONFIG_MTD_JEDECPROBE=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_STAA is not set ++CONFIG_MTD_CFI_UTIL=y ++# CONFIG_MTD_RAM is not set ++# CONFIG_MTD_ROM is not set ++# CONFIG_MTD_ABSENT is not set ++ ++# ++# Mapping drivers for chip access ++# ++# CONFIG_MTD_COMPLEX_MAPPINGS is not set ++CONFIG_MTD_PHYSMAP=y ++CONFIG_MTD_PHYSMAP_START=0x0 ++CONFIG_MTD_PHYSMAP_LEN=0x0 ++CONFIG_MTD_PHYSMAP_BANKWIDTH=0 ++# 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_DATAFLASH=y ++# CONFIG_MTD_M25P80 is not set ++# CONFIG_MTD_SLRAM is not set ++# CONFIG_MTD_PHRAM is not set ++# CONFIG_MTD_MTDRAM is not set ++# CONFIG_MTD_BLOCK2MTD is not set ++ ++# ++# Disk-On-Chip Device Drivers ++# ++# CONFIG_MTD_DOC2000 is not set ++# CONFIG_MTD_DOC2001 is not set ++# CONFIG_MTD_DOC2001PLUS is not set ++CONFIG_MTD_NAND=y ++# CONFIG_MTD_NAND_VERIFY_WRITE is not set ++# CONFIG_MTD_NAND_ECC_SMC is not set ++# CONFIG_MTD_NAND_MUSEUM_IDS is not set ++CONFIG_MTD_NAND_IDS=y ++# CONFIG_MTD_NAND_DISKONCHIP is not set ++CONFIG_MTD_NAND_AT91=y ++# CONFIG_MTD_NAND_NANDSIM is not set ++# CONFIG_MTD_NAND_PLATFORM is not set ++# CONFIG_MTD_ALAUDA is not set ++# CONFIG_MTD_ONENAND is not set ++ ++# ++# UBI - Unsorted block images ++# ++# CONFIG_MTD_UBI is not set ++# CONFIG_PARPORT is not set ++CONFIG_BLK_DEV=y ++# CONFIG_BLK_DEV_COW_COMMON is not set ++CONFIG_BLK_DEV_LOOP=y ++# CONFIG_BLK_DEV_CRYPTOLOOP is not set ++# CONFIG_BLK_DEV_NBD 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_RAM_BLOCKSIZE=1024 ++# CONFIG_CDROM_PKTCDVD is not set ++# CONFIG_ATA_OVER_ETH is not set ++CONFIG_MISC_DEVICES=y ++# CONFIG_EEPROM_93CX6 is not set ++CONFIG_ATMEL_SSC=y ++ ++# ++# SCSI device support ++# ++# CONFIG_RAID_ATTRS is not set ++CONFIG_SCSI=y ++CONFIG_SCSI_DMA=y ++# CONFIG_SCSI_TGT is not set ++# CONFIG_SCSI_NETLINK is not set ++CONFIG_SCSI_PROC_FS=y ++ ++# ++# SCSI support type (disk, tape, CD-ROM) ++# ++CONFIG_BLK_DEV_SD=y ++# CONFIG_CHR_DEV_ST is not set ++# CONFIG_CHR_DEV_OSST is not set ++# CONFIG_BLK_DEV_SR is not set ++# CONFIG_CHR_DEV_SG is not set ++# CONFIG_CHR_DEV_SCH is not set ++ ++# ++# Some SCSI devices (e.g. CD jukebox) support multiple LUNs ++# ++CONFIG_SCSI_MULTI_LUN=y ++# CONFIG_SCSI_CONSTANTS is not set ++# CONFIG_SCSI_LOGGING is not set ++# CONFIG_SCSI_SCAN_ASYNC is not set ++CONFIG_SCSI_WAIT_SCAN=m ++ ++# ++# SCSI Transports ++# ++# CONFIG_SCSI_SPI_ATTRS is not set ++# CONFIG_SCSI_FC_ATTRS is not set ++# CONFIG_SCSI_ISCSI_ATTRS is not set ++# CONFIG_SCSI_SAS_LIBSAS is not set ++# CONFIG_SCSI_SRP_ATTRS is not set ++CONFIG_SCSI_LOWLEVEL=y ++# CONFIG_ISCSI_TCP is not set ++# CONFIG_SCSI_DEBUG is not set ++# CONFIG_ATA is not set ++# CONFIG_MD is not set ++CONFIG_NETDEVICES=y ++# CONFIG_NETDEVICES_MULTIQUEUE is not set ++# CONFIG_DUMMY is not set ++# CONFIG_BONDING is not set ++# CONFIG_MACVLAN is not set ++# CONFIG_EQUALIZER is not set ++# CONFIG_TUN is not set ++# CONFIG_VETH is not set ++CONFIG_PHYLIB=y ++ ++# ++# MII PHY device drivers ++# ++# CONFIG_MARVELL_PHY is not set ++# CONFIG_DAVICOM_PHY is not set ++# CONFIG_QSEMI_PHY is not set ++# CONFIG_LXT_PHY is not set ++# CONFIG_CICADA_PHY is not set ++# CONFIG_VITESSE_PHY is not set ++# CONFIG_SMSC_PHY is not set ++# CONFIG_BROADCOM_PHY is not set ++# CONFIG_ICPLUS_PHY is not set ++# CONFIG_FIXED_PHY is not set ++# CONFIG_MDIO_BITBANG is not set ++CONFIG_NET_ETHERNET=y ++CONFIG_MII=y ++CONFIG_MACB=y ++# CONFIG_AX88796 is not set ++# CONFIG_SMC91X is not set ++# CONFIG_DM9000 is not set ++# CONFIG_IBM_NEW_EMAC_ZMII is not set ++# CONFIG_IBM_NEW_EMAC_RGMII is not set ++# CONFIG_IBM_NEW_EMAC_TAH is not set ++# CONFIG_IBM_NEW_EMAC_EMAC4 is not set ++# CONFIG_B44 is not set ++# CONFIG_NETDEV_1000 is not set ++# CONFIG_NETDEV_10000 is not set ++ ++# ++# Wireless LAN ++# ++# CONFIG_WLAN_PRE80211 is not set ++# CONFIG_WLAN_80211 is not set ++ ++# ++# USB Network Adapters ++# ++# CONFIG_USB_CATC is not set ++# CONFIG_USB_KAWETH is not set ++# CONFIG_USB_PEGASUS is not set ++# CONFIG_USB_RTL8150 is not set ++# CONFIG_USB_USBNET is not set ++# CONFIG_WAN is not set ++# CONFIG_PPP is not set ++# CONFIG_SLIP is not set ++# CONFIG_SHAPER is not set ++# CONFIG_NETCONSOLE is not set ++# CONFIG_NETPOLL is not set ++# CONFIG_NET_POLL_CONTROLLER is not set ++# CONFIG_ISDN is not set ++ ++# ++# Input device support ++# ++CONFIG_INPUT=y ++# CONFIG_INPUT_FF_MEMLESS is not set ++# CONFIG_INPUT_POLLDEV is not set ++ ++# ++# Userland interfaces ++# ++CONFIG_INPUT_MOUSEDEV=y ++# CONFIG_INPUT_MOUSEDEV_PSAUX is not set ++CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 ++CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 ++# CONFIG_INPUT_JOYDEV is not set ++CONFIG_INPUT_EVDEV=y ++# CONFIG_INPUT_EVBUG is not set ++ ++# ++# Input Device Drivers ++# ++# CONFIG_INPUT_KEYBOARD is not set ++# CONFIG_INPUT_MOUSE is not set ++# CONFIG_INPUT_JOYSTICK is not set ++# CONFIG_INPUT_TABLET is not set ++CONFIG_INPUT_TOUCHSCREEN=y ++CONFIG_TOUCHSCREEN_ADS7846=y ++# CONFIG_TOUCHSCREEN_FUJITSU is not set ++# CONFIG_TOUCHSCREEN_GUNZE is not set ++# CONFIG_TOUCHSCREEN_ELO is not set ++# CONFIG_TOUCHSCREEN_MTOUCH is not set ++# CONFIG_TOUCHSCREEN_MK712 is not set ++# CONFIG_TOUCHSCREEN_PENMOUNT is not set ++# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set ++# CONFIG_TOUCHSCREEN_TOUCHWIN is not set ++# CONFIG_TOUCHSCREEN_UCB1400 is not set ++# CONFIG_TOUCHSCREEN_USB_COMPOSITE 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_VT_HW_CONSOLE_BINDING is not set ++# CONFIG_SERIAL_NONSTANDARD is not set ++ ++# ++# Serial drivers ++# ++# CONFIG_SERIAL_8250 is not set ++ ++# ++# Non-8250 serial port support ++# ++CONFIG_SERIAL_ATMEL=y ++CONFIG_SERIAL_ATMEL_CONSOLE=y ++# CONFIG_SERIAL_ATMEL_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 ++# CONFIG_IPMI_HANDLER is not set ++CONFIG_HW_RANDOM=y ++# CONFIG_NVRAM is not set ++# CONFIG_R3964 is not set ++# CONFIG_RAW_DRIVER is not set ++# CONFIG_TCG_TPM is not set ++CONFIG_I2C=y ++CONFIG_I2C_BOARDINFO=y ++CONFIG_I2C_CHARDEV=y ++ ++# ++# 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_GPIO is not set ++# CONFIG_I2C_OCORES is not set ++# CONFIG_I2C_PARPORT_LIGHT is not set ++# CONFIG_I2C_SIMTEC is not set ++# CONFIG_I2C_TAOS_EVM is not set ++# CONFIG_I2C_STUB is not set ++# CONFIG_I2C_TINY_USB is not set ++ ++# ++# Miscellaneous I2C Chip support ++# ++# CONFIG_SENSORS_DS1337 is not set ++# CONFIG_SENSORS_DS1374 is not set ++# CONFIG_DS1682 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_MAX6875 is not set ++# CONFIG_SENSORS_TSL2550 is not set ++# CONFIG_I2C_DEBUG_CORE is not set ++# CONFIG_I2C_DEBUG_ALGO is not set ++# CONFIG_I2C_DEBUG_BUS is not set ++# CONFIG_I2C_DEBUG_CHIP is not set ++ ++# ++# SPI support ++# ++CONFIG_SPI=y ++# CONFIG_SPI_DEBUG is not set ++CONFIG_SPI_MASTER=y ++ ++# ++# SPI Master Controller Drivers ++# ++CONFIG_SPI_ATMEL=y ++# CONFIG_SPI_BITBANG is not set ++ ++# ++# SPI Protocol Masters ++# ++# CONFIG_SPI_AT25 is not set ++# CONFIG_SPI_SPIDEV is not set ++# CONFIG_SPI_TLE62X0 is not set ++# CONFIG_W1 is not set ++# CONFIG_POWER_SUPPLY is not set ++# CONFIG_HWMON is not set ++CONFIG_WATCHDOG=y ++CONFIG_WATCHDOG_NOWAYOUT=y ++ ++# ++# Watchdog Device Drivers ++# ++# CONFIG_SOFT_WATCHDOG is not set ++ ++# ++# USB-based Watchdog Cards ++# ++# CONFIG_USBPCWATCHDOG is not set ++ ++# ++# Sonics Silicon Backplane ++# ++CONFIG_SSB_POSSIBLE=y ++# CONFIG_SSB is not set ++ ++# ++# Multifunction device drivers ++# ++# CONFIG_MFD_SM501 is not set ++ ++# ++# Multimedia devices ++# ++# CONFIG_VIDEO_DEV is not set ++# CONFIG_DVB_CORE is not set ++# CONFIG_DAB is not set ++ ++# ++# Graphics support ++# ++# CONFIG_VGASTATE is not set ++# CONFIG_VIDEO_OUTPUT_CONTROL is not set ++CONFIG_FB=y ++# CONFIG_FIRMWARE_EDID is not set ++# CONFIG_FB_DDC is not set ++CONFIG_FB_CFB_FILLRECT=y ++CONFIG_FB_CFB_COPYAREA=y ++CONFIG_FB_CFB_IMAGEBLIT=y ++# CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set ++# CONFIG_FB_SYS_FILLRECT is not set ++# CONFIG_FB_SYS_COPYAREA is not set ++# CONFIG_FB_SYS_IMAGEBLIT is not set ++# CONFIG_FB_SYS_FOPS is not set ++CONFIG_FB_DEFERRED_IO=y ++# CONFIG_FB_SVGALIB is not set ++# CONFIG_FB_MACMODES is not set ++# CONFIG_FB_BACKLIGHT is not set ++# CONFIG_FB_MODE_HELPERS is not set ++# CONFIG_FB_TILEBLITTING is not set ++ ++# ++# Frame buffer hardware drivers ++# ++# CONFIG_FB_S1D13XXX is not set ++CONFIG_FB_ATMEL=y ++# CONFIG_FB_VIRTUAL is not set ++# CONFIG_BACKLIGHT_LCD_SUPPORT is not set ++ ++# ++# Display device support ++# ++# CONFIG_DISPLAY_SUPPORT is not set ++ ++# ++# Console display driver support ++# ++# CONFIG_VGA_CONSOLE is not set ++CONFIG_DUMMY_CONSOLE=y ++# CONFIG_FRAMEBUFFER_CONSOLE is not set ++CONFIG_LOGO=y ++# CONFIG_LOGO_LINUX_MONO is not set ++CONFIG_LOGO_LINUX_VGA16=y ++# CONFIG_LOGO_LINUX_CLUT224 is not set ++ ++# ++# Sound ++# ++# CONFIG_SOUND is not set ++CONFIG_HID_SUPPORT=y ++CONFIG_HID=y ++CONFIG_HID_DEBUG=y ++# CONFIG_HIDRAW 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_SUPPORT=y ++CONFIG_USB_ARCH_HAS_HCD=y ++CONFIG_USB_ARCH_HAS_OHCI=y ++# CONFIG_USB_ARCH_HAS_EHCI is not set ++CONFIG_USB=y ++# CONFIG_USB_DEBUG is not set ++ ++# ++# Miscellaneous USB options ++# ++CONFIG_USB_DEVICEFS=y ++CONFIG_USB_DEVICE_CLASS=y ++# 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_DESC is not set ++# CONFIG_USB_OHCI_BIG_ENDIAN_MMIO is not set ++CONFIG_USB_OHCI_LITTLE_ENDIAN=y ++# CONFIG_USB_SL811_HCD is not set ++# CONFIG_USB_R8A66597_HCD is not set ++ ++# ++# 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=y ++# CONFIG_USB_STORAGE_DEBUG is not set ++# CONFIG_USB_STORAGE_DATAFAB is not set ++# CONFIG_USB_STORAGE_FREECOM is not set ++# CONFIG_USB_STORAGE_ISD200 is not set ++# CONFIG_USB_STORAGE_DPCM is not set ++# CONFIG_USB_STORAGE_USBAT is not set ++# CONFIG_USB_STORAGE_SDDR09 is not set ++# CONFIG_USB_STORAGE_SDDR55 is not set ++# CONFIG_USB_STORAGE_JUMPSHOT is not set ++# CONFIG_USB_STORAGE_ALAUDA is not set ++# CONFIG_USB_STORAGE_ONETOUCH is not set ++# CONFIG_USB_STORAGE_KARMA is not set ++# CONFIG_USB_LIBUSUAL is not set ++ ++# ++# USB Imaging devices ++# ++# CONFIG_USB_MDC800 is not set ++# CONFIG_USB_MICROTEK 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_ADUTUX 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_BERRY_CHARGE is not set ++# CONFIG_USB_LED is not set ++# CONFIG_USB_CYPRESS_CY7C63 is not set ++# CONFIG_USB_CYTHERM is not set ++# CONFIG_USB_PHIDGET is not set ++# CONFIG_USB_IDMOUSE is not set ++# CONFIG_USB_FTDI_ELAN is not set ++# CONFIG_USB_APPLEDISPLAY is not set ++# CONFIG_USB_LD is not set ++# CONFIG_USB_TRANCEVIBRATOR is not set ++# CONFIG_USB_IOWARRIOR is not set ++# CONFIG_USB_TEST is not set ++ ++# ++# USB DSL modem support ++# ++ ++# ++# USB Gadget Support ++# ++# CONFIG_USB_GADGET is not set ++CONFIG_MMC=y ++# CONFIG_MMC_DEBUG is not set ++# CONFIG_MMC_UNSAFE_RESUME is not set ++ ++# ++# MMC/SD Card Drivers ++# ++CONFIG_MMC_BLOCK=y ++CONFIG_MMC_BLOCK_BOUNCE=y ++# CONFIG_SDIO_UART is not set ++ ++# ++# MMC/SD Host Controller Drivers ++# ++CONFIG_MMC_AT91=y ++# CONFIG_MMC_SPI is not set ++# CONFIG_NEW_LEDS is not set ++CONFIG_RTC_LIB=y ++# CONFIG_RTC_CLASS is not set ++ ++# ++# File systems ++# ++CONFIG_EXT2_FS=y ++# CONFIG_EXT2_FS_XATTR is not set ++# CONFIG_EXT2_FS_XIP is not set ++# CONFIG_EXT3_FS is not set ++# CONFIG_EXT4DEV_FS 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_GFS2_FS is not set ++# CONFIG_OCFS2_FS is not set ++# CONFIG_MINIX_FS is not set ++# CONFIG_ROMFS_FS is not set ++CONFIG_INOTIFY=y ++CONFIG_INOTIFY_USER=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_FAT_FS=y ++# CONFIG_MSDOS_FS is not set ++CONFIG_VFAT_FS=y ++CONFIG_FAT_DEFAULT_CODEPAGE=437 ++CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" ++# CONFIG_NTFS_FS is not set ++ ++# ++# Pseudo filesystems ++# ++CONFIG_PROC_FS=y ++CONFIG_PROC_SYSCTL=y ++CONFIG_SYSFS=y ++CONFIG_TMPFS=y ++# CONFIG_TMPFS_POSIX_ACL is not set ++# CONFIG_HUGETLB_PAGE is not set ++# CONFIG_CONFIGFS_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_JFFS2_FS=y ++CONFIG_JFFS2_FS_DEBUG=0 ++CONFIG_JFFS2_FS_WRITEBUFFER=y ++# CONFIG_JFFS2_FS_WBUF_VERIFY is not set ++# CONFIG_JFFS2_SUMMARY is not set ++# CONFIG_JFFS2_FS_XATTR is not set ++# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set ++CONFIG_JFFS2_ZLIB=y ++# CONFIG_JFFS2_LZO is not set ++CONFIG_JFFS2_RTIME=y ++# CONFIG_JFFS2_RUBIN is not set ++CONFIG_CRAMFS=y ++# CONFIG_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 ++CONFIG_NETWORK_FILESYSTEMS=y ++CONFIG_NFS_FS=y ++# CONFIG_NFS_V3 is not set ++# CONFIG_NFS_V4 is not set ++# CONFIG_NFS_DIRECTIO is not set ++# CONFIG_NFSD is not set ++CONFIG_ROOT_NFS=y ++CONFIG_LOCKD=y ++CONFIG_NFS_COMMON=y ++CONFIG_SUNRPC=y ++# CONFIG_SUNRPC_BIND34 is not set ++# CONFIG_RPCSEC_GSS_KRB5 is not set ++# CONFIG_RPCSEC_GSS_SPKM3 is not set ++# CONFIG_SMB_FS is not set ++# CONFIG_CIFS is not set ++# CONFIG_NCP_FS is not set ++# CONFIG_CODA_FS is not set ++# CONFIG_AFS_FS is not set ++ ++# ++# Partition Types ++# ++# CONFIG_PARTITION_ADVANCED is not set ++CONFIG_MSDOS_PARTITION=y ++CONFIG_NLS=y ++CONFIG_NLS_DEFAULT="iso8859-1" ++CONFIG_NLS_CODEPAGE_437=y ++# CONFIG_NLS_CODEPAGE_737 is not set ++# CONFIG_NLS_CODEPAGE_775 is not set ++CONFIG_NLS_CODEPAGE_850=y ++# CONFIG_NLS_CODEPAGE_852 is not set ++# CONFIG_NLS_CODEPAGE_855 is not set ++# CONFIG_NLS_CODEPAGE_857 is not set ++# CONFIG_NLS_CODEPAGE_860 is not set ++# CONFIG_NLS_CODEPAGE_861 is not set ++# CONFIG_NLS_CODEPAGE_862 is not set ++# CONFIG_NLS_CODEPAGE_863 is not set ++# CONFIG_NLS_CODEPAGE_864 is not set ++# CONFIG_NLS_CODEPAGE_865 is not set ++# CONFIG_NLS_CODEPAGE_866 is not set ++# CONFIG_NLS_CODEPAGE_869 is not set ++# CONFIG_NLS_CODEPAGE_936 is not set ++# CONFIG_NLS_CODEPAGE_950 is not set ++# CONFIG_NLS_CODEPAGE_932 is not set ++# CONFIG_NLS_CODEPAGE_949 is not set ++# CONFIG_NLS_CODEPAGE_874 is not set ++# CONFIG_NLS_ISO8859_8 is not set ++# CONFIG_NLS_CODEPAGE_1250 is not set ++# CONFIG_NLS_CODEPAGE_1251 is not set ++# CONFIG_NLS_ASCII is not set ++CONFIG_NLS_ISO8859_1=y ++# CONFIG_NLS_ISO8859_2 is not set ++# CONFIG_NLS_ISO8859_3 is not set ++# CONFIG_NLS_ISO8859_4 is not set ++# CONFIG_NLS_ISO8859_5 is not set ++# CONFIG_NLS_ISO8859_6 is not set ++# CONFIG_NLS_ISO8859_7 is not set ++# CONFIG_NLS_ISO8859_9 is not set ++# CONFIG_NLS_ISO8859_13 is not set ++# CONFIG_NLS_ISO8859_14 is not set ++# CONFIG_NLS_ISO8859_15 is not set ++# CONFIG_NLS_KOI8_R is not set ++# CONFIG_NLS_KOI8_U is not set ++# CONFIG_NLS_UTF8 is not set ++# CONFIG_DLM is not set ++CONFIG_INSTRUMENTATION=y ++# CONFIG_PROFILING is not set ++# CONFIG_MARKERS is not set ++ ++# ++# Kernel hacking ++# ++# CONFIG_PRINTK_TIME is not set ++CONFIG_ENABLE_WARN_DEPRECATED=y ++CONFIG_ENABLE_MUST_CHECK=y ++# CONFIG_MAGIC_SYSRQ is not set ++# CONFIG_UNUSED_SYMBOLS is not set ++CONFIG_DEBUG_FS=y ++# CONFIG_HEADERS_CHECK is not set ++CONFIG_DEBUG_KERNEL=y ++# CONFIG_DEBUG_SHIRQ is not set ++CONFIG_DETECT_SOFTLOCKUP=y ++CONFIG_SCHED_DEBUG=y ++# CONFIG_SCHEDSTATS is not set ++# CONFIG_TIMER_STATS is not set ++# CONFIG_DEBUG_SLAB is not set ++# CONFIG_DEBUG_RT_MUTEXES is not set ++# CONFIG_RT_MUTEX_TESTER is not set ++# CONFIG_DEBUG_SPINLOCK is not set ++# CONFIG_DEBUG_MUTEXES is not set ++# CONFIG_DEBUG_LOCK_ALLOC is not set ++# CONFIG_PROVE_LOCKING is not set ++# CONFIG_LOCK_STAT is not set ++# CONFIG_DEBUG_SPINLOCK_SLEEP is not set ++# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set ++# CONFIG_DEBUG_KOBJECT is not set ++CONFIG_DEBUG_BUGVERBOSE=y ++CONFIG_DEBUG_INFO=y ++# CONFIG_DEBUG_VM is not set ++# CONFIG_DEBUG_LIST is not set ++# CONFIG_DEBUG_SG is not set ++CONFIG_FRAME_POINTER=y ++CONFIG_FORCED_INLINING=y ++# CONFIG_BOOT_PRINTK_DELAY is not set ++# CONFIG_RCU_TORTURE_TEST is not set ++# CONFIG_FAULT_INJECTION is not set ++# CONFIG_SAMPLES is not set ++CONFIG_DEBUG_USER=y ++# CONFIG_DEBUG_ERRORS is not set ++# CONFIG_DEBUG_LL is not set ++ ++# ++# Security options ++# ++# CONFIG_KEYS is not set ++# CONFIG_SECURITY is not set ++# CONFIG_SECURITY_FILE_CAPABILITIES is not set ++# CONFIG_CRYPTO is not set ++ ++# ++# Library routines ++# ++CONFIG_BITREVERSE=y ++# CONFIG_CRC_CCITT is not set ++# CONFIG_CRC16 is not set ++# CONFIG_CRC_ITU_T is not set ++CONFIG_CRC32=y ++# CONFIG_CRC7 is not set ++# CONFIG_LIBCRC32C is not set ++CONFIG_ZLIB_INFLATE=y ++CONFIG_ZLIB_DEFLATE=y ++CONFIG_PLIST=y ++CONFIG_HAS_IOMEM=y ++CONFIG_HAS_IOPORT=y ++CONFIG_HAS_DMA=y +diff -urN -x CVS linux-2.6.24/arch/arm/configs/at91rm9200dk_defconfig linux-2.6/arch/arm/configs/at91rm9200dk_defconfig +--- linux-2.6.24/arch/arm/configs/at91rm9200dk_defconfig 2007-10-09 22:31:38.000000000 +0200 ++++ linux-2.6/arch/arm/configs/at91rm9200dk_defconfig 2007-12-31 10:43:35.000000000 +0200 +@@ -620,14 +620,14 @@ + # + # I2C Algorithms + # +-# CONFIG_I2C_ALGOBIT is not set ++CONFIG_I2C_ALGOBIT=y + # CONFIG_I2C_ALGOPCF is not set + # CONFIG_I2C_ALGOPCA is not set + + # + # I2C Hardware Bus support + # +-CONFIG_I2C_AT91=y ++CONFIG_I2C_GPIO=y + # CONFIG_I2C_PARPORT_LIGHT is not set + # CONFIG_I2C_STUB is not set + # CONFIG_I2C_PCA_ISA is not set +diff -urN -x CVS linux-2.6.24/arch/arm/configs/at91rm9200ek_defconfig linux-2.6/arch/arm/configs/at91rm9200ek_defconfig +--- linux-2.6.24/arch/arm/configs/at91rm9200ek_defconfig 2007-10-09 22:31:38.000000000 +0200 ++++ linux-2.6/arch/arm/configs/at91rm9200ek_defconfig 2007-12-31 10:43:35.000000000 +0200 +@@ -594,14 +594,14 @@ + # + # I2C Algorithms + # +-# CONFIG_I2C_ALGOBIT is not set ++CONFIG_I2C_ALGOBIT=y + # CONFIG_I2C_ALGOPCF is not set + # CONFIG_I2C_ALGOPCA is not set + + # + # I2C Hardware Bus support + # +-CONFIG_I2C_AT91=y ++CONFIG_I2C_GPIO=y + # CONFIG_I2C_PARPORT_LIGHT is not set + # CONFIG_I2C_STUB is not set + # CONFIG_I2C_PCA_ISA is not set +diff -urN -x CVS linux-2.6.24/arch/arm/configs/at91sam9260ek_defconfig linux-2.6/arch/arm/configs/at91sam9260ek_defconfig +--- linux-2.6.24/arch/arm/configs/at91sam9260ek_defconfig 2007-10-09 22:31:38.000000000 +0200 ++++ linux-2.6/arch/arm/configs/at91sam9260ek_defconfig 2008-01-08 22:21:02.000000000 +0200 +@@ -1,43 +1,56 @@ + # + # Automatically generated make config: don't edit +-# Linux kernel version: 2.6.19-rc6 +-# Fri Nov 17 18:42:21 2006 ++# Linux kernel version: 2.6.24-rc7 ++# Tue Jan 8 22:20:50 2008 + # + CONFIG_ARM=y ++CONFIG_SYS_SUPPORTS_APM_EMULATION=y ++CONFIG_GENERIC_GPIO=y + # CONFIG_GENERIC_TIME is not set ++# CONFIG_GENERIC_CLOCKEVENTS is not set + CONFIG_MMU=y ++# CONFIG_NO_IOPORT is not set + CONFIG_GENERIC_HARDIRQS=y ++CONFIG_STACKTRACE_SUPPORT=y ++CONFIG_LOCKDEP_SUPPORT=y + CONFIG_TRACE_IRQFLAGS_SUPPORT=y + CONFIG_HARDIRQS_SW_RESEND=y + CONFIG_GENERIC_IRQ_PROBE=y + CONFIG_RWSEM_GENERIC_SPINLOCK=y ++# CONFIG_ARCH_HAS_ILOG2_U32 is not set ++# CONFIG_ARCH_HAS_ILOG2_U64 is not set + CONFIG_GENERIC_HWEIGHT=y + CONFIG_GENERIC_CALIBRATE_DELAY=y ++CONFIG_ZONE_DMA=y + CONFIG_VECTORS_BASE=0xffff0000 + CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" + + # +-# Code maturity level options ++# General setup + # + CONFIG_EXPERIMENTAL=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_IPC_NS is not set ++CONFIG_SYSVIPC_SYSCTL=y + # CONFIG_POSIX_MQUEUE is not set + # CONFIG_BSD_PROCESS_ACCT is not set + # CONFIG_TASKSTATS is not set +-# CONFIG_UTS_NS is not set ++# CONFIG_USER_NS is not set ++# CONFIG_PID_NS is not set + # CONFIG_AUDIT is not set + # CONFIG_IKCONFIG is not set ++CONFIG_LOG_BUF_SHIFT=14 ++# CONFIG_CGROUPS is not set ++CONFIG_FAIR_GROUP_SCHED=y ++CONFIG_FAIR_USER_SCHED=y ++# CONFIG_FAIR_CGROUP_SCHED is not set ++CONFIG_SYSFS_DEPRECATED=y + # CONFIG_RELAY is not set ++CONFIG_BLK_DEV_INITRD=y + CONFIG_INITRAMFS_SOURCE="" + CONFIG_CC_OPTIMIZE_FOR_SIZE=y + CONFIG_SYSCTL=y +@@ -53,30 +66,30 @@ + CONFIG_ELF_CORE=y + CONFIG_BASE_FULL=y + CONFIG_FUTEX=y ++CONFIG_ANON_INODES=y + CONFIG_EPOLL=y ++CONFIG_SIGNALFD=y ++CONFIG_EVENTFD=y + CONFIG_SHMEM=y +-CONFIG_SLAB=y + CONFIG_VM_EVENT_COUNTERS=y ++CONFIG_SLAB=y ++# CONFIG_SLUB is not set ++# CONFIG_SLOB is not set ++CONFIG_SLABINFO=y + CONFIG_RT_MUTEXES=y + # CONFIG_TINY_SHMEM is not set + CONFIG_BASE_SMALL=0 +-# CONFIG_SLOB is not set +- +-# +-# Loadable module support +-# + CONFIG_MODULES=y + CONFIG_MODULE_UNLOAD=y + # CONFIG_MODULE_FORCE_UNLOAD is not set + # CONFIG_MODVERSIONS is not set + # CONFIG_MODULE_SRCVERSION_ALL is not set + CONFIG_KMOD=y +- +-# +-# Block layer +-# + CONFIG_BLOCK=y ++# CONFIG_LBD is not set + # CONFIG_BLK_DEV_IO_TRACE is not set ++# CONFIG_LSF is not set ++# CONFIG_BLK_DEV_BSG is not set + + # + # IO Schedulers +@@ -108,12 +121,16 @@ + # CONFIG_ARCH_NETX is not set + # CONFIG_ARCH_H720X is not set + # CONFIG_ARCH_IMX is not set ++# CONFIG_ARCH_IOP13XX is not set + # CONFIG_ARCH_IOP32X is not set + # CONFIG_ARCH_IOP33X is not set +-# CONFIG_ARCH_IXP4XX is not set +-# CONFIG_ARCH_IXP2000 is not set + # CONFIG_ARCH_IXP23XX is not set ++# CONFIG_ARCH_IXP2000 is not set ++# CONFIG_ARCH_IXP4XX is not set + # CONFIG_ARCH_L7200 is not set ++# CONFIG_ARCH_KS8695 is not set ++# CONFIG_ARCH_NS9XXX is not set ++# CONFIG_ARCH_MXC is not set + # CONFIG_ARCH_PNX4008 is not set + # CONFIG_ARCH_PXA is not set + # CONFIG_ARCH_RPC is not set +@@ -121,29 +138,52 @@ + # CONFIG_ARCH_S3C2410 is not set + # CONFIG_ARCH_SHARK is not set + # CONFIG_ARCH_LH7A40X is not set ++# CONFIG_ARCH_DAVINCI is not set + # CONFIG_ARCH_OMAP is not set + + # ++# Boot options ++# ++ ++# ++# Power management ++# ++ ++# + # Atmel AT91 System-on-Chip + # + # CONFIG_ARCH_AT91RM9200 is not set + CONFIG_ARCH_AT91SAM9260=y + # CONFIG_ARCH_AT91SAM9261 is not set ++# CONFIG_ARCH_AT91SAM9263 is not set ++# CONFIG_ARCH_AT91SAM9RL is not set ++# CONFIG_ARCH_AT91X40 is not set ++CONFIG_AT91_PMC_UNIT=y ++ ++# ++# AT91SAM9260 Variants ++# ++# CONFIG_ARCH_AT91SAM9260_SAM9XE is not set + + # +-# AT91SAM9260 Board Type ++# AT91SAM9260 / AT91SAM9XE Board Type + # + CONFIG_MACH_AT91SAM9260EK=y ++# CONFIG_MACH_CAM60 is not set ++# CONFIG_MACH_SAM9_L9260 is not set + + # + # AT91 Board Options + # ++# CONFIG_MTD_AT91_DATAFLASH_CARD is not set + # CONFIG_MTD_NAND_AT91_BUSWIDTH_16 is not set + + # + # AT91 Feature Selections + # +-# CONFIG_AT91_PROGRAMMABLE_CLOCKS is not set ++CONFIG_AT91_PROGRAMMABLE_CLOCKS=y ++# CONFIG_ATMEL_TCLIB is not set ++CONFIG_AT91_TIMER_HZ=100 + + # + # Processor Type +@@ -166,19 +206,19 @@ + # CONFIG_CPU_DCACHE_DISABLE is not set + # CONFIG_CPU_DCACHE_WRITETHROUGH is not set + # CONFIG_CPU_CACHE_ROUND_ROBIN is not set ++# CONFIG_OUTER_CACHE is not set + + # + # Bus support + # +- +-# +-# PCCARD (PCMCIA/CardBus) support +-# ++# CONFIG_PCI_SYSCALL is not set ++# CONFIG_ARCH_SUPPORTS_MSI is not set + # CONFIG_PCCARD is not set + + # + # Kernel Features + # ++# CONFIG_TICK_ONESHOT is not set + # CONFIG_PREEMPT is not set + # CONFIG_NO_IDLE_HZ is not set + CONFIG_HZ=100 +@@ -191,8 +231,12 @@ + CONFIG_FLATMEM=y + CONFIG_FLAT_NODE_MEM_MAP=y + # CONFIG_SPARSEMEM_STATIC is not set ++# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set + CONFIG_SPLIT_PTLOCK_CPUS=4096 + # CONFIG_RESOURCES_64BIT is not set ++CONFIG_ZONE_DMA_FLAG=1 ++CONFIG_BOUNCE=y ++CONFIG_VIRT_TO_BUS=y + # CONFIG_LEDS is not set + CONFIG_ALIGNMENT_TRAP=y + +@@ -203,6 +247,7 @@ + CONFIG_ZBOOT_ROM_BSS=0x0 + CONFIG_CMDLINE="mem=64M console=ttyS0,115200 initrd=0x21100000,3145728 root=/dev/ram0 rw" + # CONFIG_XIP_KERNEL is not set ++# CONFIG_KEXEC is not set + + # + # Floating point emulation +@@ -228,7 +273,7 @@ + # Power management options + # + # CONFIG_PM is not set +-# CONFIG_APM is not set ++CONFIG_SUSPEND_UP_POSSIBLE=y + + # + # Networking +@@ -238,13 +283,9 @@ + # + # Networking options + # +-# CONFIG_NETDEBUG is not set + CONFIG_PACKET=y + # CONFIG_PACKET_MMAP is not set + CONFIG_UNIX=y +-CONFIG_XFRM=y +-# CONFIG_XFRM_USER is not set +-# CONFIG_XFRM_SUB_POLICY is not set + # CONFIG_NET_KEY is not set + CONFIG_INET=y + # CONFIG_IP_MULTICAST is not set +@@ -263,33 +304,23 @@ + # CONFIG_INET_IPCOMP is not set + # CONFIG_INET_XFRM_TUNNEL is not set + # CONFIG_INET_TUNNEL is not set +-CONFIG_INET_XFRM_MODE_TRANSPORT=y +-CONFIG_INET_XFRM_MODE_TUNNEL=y +-CONFIG_INET_XFRM_MODE_BEET=y ++# CONFIG_INET_XFRM_MODE_TRANSPORT is not set ++# CONFIG_INET_XFRM_MODE_TUNNEL is not set ++# CONFIG_INET_XFRM_MODE_BEET is not set ++# CONFIG_INET_LRO is not set + CONFIG_INET_DIAG=y + CONFIG_INET_TCP_DIAG=y + # CONFIG_TCP_CONG_ADVANCED is not set + CONFIG_TCP_CONG_CUBIC=y + CONFIG_DEFAULT_TCP_CONG="cubic" ++# CONFIG_TCP_MD5SIG is not set + # CONFIG_IPV6 is not set + # CONFIG_INET6_XFRM_TUNNEL is not set + # CONFIG_INET6_TUNNEL is not set + # CONFIG_NETWORK_SECMARK 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 +- +-# +-# TIPC Configuration (EXPERIMENTAL) +-# + # CONFIG_TIPC is not set + # CONFIG_ATM is not set + # CONFIG_BRIDGE is not set +@@ -302,10 +333,6 @@ + # CONFIG_LAPB 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 + + # +@@ -315,7 +342,17 @@ + # CONFIG_HAMRADIO is not set + # CONFIG_IRDA is not set + # CONFIG_BT is not set ++# CONFIG_AF_RXRPC is not set ++ ++# ++# Wireless ++# ++# CONFIG_CFG80211 is not set ++# CONFIG_WIRELESS_EXT is not set ++# CONFIG_MAC80211 is not set + # CONFIG_IEEE80211 is not set ++# CONFIG_RFKILL is not set ++# CONFIG_NET_9P is not set + + # + # Device Drivers +@@ -324,34 +361,17 @@ + # + # Generic Driver Options + # ++CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" + CONFIG_STANDALONE=y + CONFIG_PREVENT_FIRMWARE_BUILD=y + # CONFIG_FW_LOADER is not set + # CONFIG_DEBUG_DRIVER is not set ++# CONFIG_DEBUG_DEVRES is not set + # CONFIG_SYS_HYPERVISOR is not set +- +-# +-# Connector - unified userspace <-> kernelspace linker +-# + # CONFIG_CONNECTOR is not set +- +-# +-# Memory Technology Devices (MTD) +-# + # CONFIG_MTD is not set +- +-# +-# Parallel port support +-# + # CONFIG_PARPORT is not set +- +-# +-# Plug and Play support +-# +- +-# +-# Block devices +-# ++CONFIG_BLK_DEV=y + # CONFIG_BLK_DEV_COW_COMMON is not set + # CONFIG_BLK_DEV_LOOP is not set + # CONFIG_BLK_DEV_NBD is not set +@@ -360,15 +380,19 @@ + CONFIG_BLK_DEV_RAM_COUNT=16 + CONFIG_BLK_DEV_RAM_SIZE=8192 + CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024 +-CONFIG_BLK_DEV_INITRD=y + # CONFIG_CDROM_PKTCDVD is not set + # CONFIG_ATA_OVER_ETH is not set ++CONFIG_MISC_DEVICES=y ++# CONFIG_EEPROM_93CX6 is not set ++CONFIG_ATMEL_SSC=y + + # + # SCSI device support + # + # CONFIG_RAID_ATTRS is not set + CONFIG_SCSI=y ++CONFIG_SCSI_DMA=y ++# CONFIG_SCSI_TGT is not set + # CONFIG_SCSI_NETLINK is not set + CONFIG_SCSI_PROC_FS=y + +@@ -388,6 +412,8 @@ + CONFIG_SCSI_MULTI_LUN=y + # CONFIG_SCSI_CONSTANTS is not set + # CONFIG_SCSI_LOGGING is not set ++# CONFIG_SCSI_SCAN_ASYNC is not set ++CONFIG_SCSI_WAIT_SCAN=m + + # + # SCSI Transports +@@ -395,43 +421,72 @@ + # CONFIG_SCSI_SPI_ATTRS is not set + # CONFIG_SCSI_FC_ATTRS is not set + # CONFIG_SCSI_ISCSI_ATTRS is not set +-# CONFIG_SCSI_SAS_ATTRS is not set + # CONFIG_SCSI_SAS_LIBSAS is not set +- +-# +-# SCSI low-level drivers +-# ++# CONFIG_SCSI_SRP_ATTRS is not set ++CONFIG_SCSI_LOWLEVEL=y + # CONFIG_ISCSI_TCP is not set + # CONFIG_SCSI_DEBUG is not set +- +-# +-# Multi-device support (RAID and LVM) +-# ++# CONFIG_ATA is not set + # CONFIG_MD is not set ++CONFIG_NETDEVICES=y ++# CONFIG_NETDEVICES_MULTIQUEUE is not set ++# CONFIG_DUMMY is not set ++# CONFIG_BONDING is not set ++# CONFIG_MACVLAN is not set ++# CONFIG_EQUALIZER is not set ++# CONFIG_TUN is not set ++# CONFIG_VETH is not set ++CONFIG_PHYLIB=y ++ ++# ++# MII PHY device drivers ++# ++# CONFIG_MARVELL_PHY is not set ++# CONFIG_DAVICOM_PHY is not set ++# CONFIG_QSEMI_PHY is not set ++# CONFIG_LXT_PHY is not set ++# CONFIG_CICADA_PHY is not set ++# CONFIG_VITESSE_PHY is not set ++# CONFIG_SMSC_PHY is not set ++# CONFIG_BROADCOM_PHY is not set ++# CONFIG_ICPLUS_PHY is not set ++# CONFIG_FIXED_PHY is not set ++# CONFIG_MDIO_BITBANG is not set ++CONFIG_NET_ETHERNET=y ++CONFIG_MII=y ++CONFIG_MACB=y ++# CONFIG_AX88796 is not set ++# CONFIG_SMC91X is not set ++# CONFIG_DM9000 is not set ++# CONFIG_IBM_NEW_EMAC_ZMII is not set ++# CONFIG_IBM_NEW_EMAC_RGMII is not set ++# CONFIG_IBM_NEW_EMAC_TAH is not set ++# CONFIG_IBM_NEW_EMAC_EMAC4 is not set ++# CONFIG_B44 is not set ++CONFIG_NETDEV_1000=y ++CONFIG_NETDEV_10000=y + + # +-# Fusion MPT device support +-# +-# CONFIG_FUSION is not set +- +-# +-# IEEE 1394 (FireWire) support +-# +- +-# +-# I2O device support ++# Wireless LAN + # ++# CONFIG_WLAN_PRE80211 is not set ++# CONFIG_WLAN_80211 is not set + + # +-# Network device support ++# USB Network Adapters + # +-# CONFIG_NETDEVICES is not set ++# CONFIG_USB_CATC is not set ++# CONFIG_USB_KAWETH is not set ++# CONFIG_USB_PEGASUS is not set ++# CONFIG_USB_RTL8150 is not set ++# CONFIG_USB_USBNET is not set ++# CONFIG_WAN is not set ++# CONFIG_PPP is not set ++# CONFIG_SLIP is not set ++# CONFIG_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 + + # +@@ -439,6 +494,7 @@ + # + CONFIG_INPUT=y + # CONFIG_INPUT_FF_MEMLESS is not set ++# CONFIG_INPUT_POLLDEV is not set + + # + # Userland interfaces +@@ -448,7 +504,6 @@ + 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 + +@@ -458,6 +513,7 @@ + # CONFIG_INPUT_KEYBOARD is not set + # CONFIG_INPUT_MOUSE is not set + # CONFIG_INPUT_JOYSTICK is not set ++# CONFIG_INPUT_TABLET is not set + # CONFIG_INPUT_TOUCHSCREEN is not set + # CONFIG_INPUT_MISC is not set + +@@ -492,114 +548,131 @@ + 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 +- +-# +-# USB-based Watchdog Cards +-# +-# CONFIG_USBPCWATCHDOG is not set +-CONFIG_HW_RANDOM=y ++# CONFIG_HW_RANDOM is not set + # CONFIG_NVRAM is not set +-# 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 +- +-# +-# I2C support +-# +-# CONFIG_I2C is not set ++CONFIG_I2C=y ++CONFIG_I2C_BOARDINFO=y ++CONFIG_I2C_CHARDEV=y ++ ++# ++# I2C Algorithms ++# ++CONFIG_I2C_ALGOBIT=y ++# CONFIG_I2C_ALGOPCF is not set ++# CONFIG_I2C_ALGOPCA is not set ++ ++# ++# I2C Hardware Bus support ++# ++CONFIG_I2C_GPIO=y ++# CONFIG_I2C_OCORES is not set ++# CONFIG_I2C_PARPORT_LIGHT is not set ++# CONFIG_I2C_SIMTEC is not set ++# CONFIG_I2C_TAOS_EVM is not set ++# CONFIG_I2C_STUB is not set ++# CONFIG_I2C_TINY_USB is not set ++# CONFIG_I2C_PCA is not set ++ ++# ++# Miscellaneous I2C Chip support ++# ++# CONFIG_SENSORS_DS1337 is not set ++# CONFIG_SENSORS_DS1374 is not set ++# CONFIG_DS1682 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_MAX6875 is not set ++# CONFIG_SENSORS_TSL2550 is not set ++# CONFIG_I2C_DEBUG_CORE is not set ++# CONFIG_I2C_DEBUG_ALGO is not set ++# CONFIG_I2C_DEBUG_BUS is not set ++# CONFIG_I2C_DEBUG_CHIP is not set + + # + # SPI support + # + # CONFIG_SPI is not set + # CONFIG_SPI_MASTER is not set +- +-# +-# Dallas's 1-wire bus +-# + # CONFIG_W1 is not set +- +-# +-# Hardware Monitoring support +-# ++# CONFIG_POWER_SUPPLY is not set + # CONFIG_HWMON is not set +-# CONFIG_HWMON_VID is not set ++CONFIG_WATCHDOG=y ++CONFIG_WATCHDOG_NOWAYOUT=y + + # +-# Misc devices ++# Watchdog Device Drivers + # +-# CONFIG_TIFM_CORE is not set ++# CONFIG_SOFT_WATCHDOG is not set ++CONFIG_AT91SAM9_WATCHDOG=y + + # +-# LED devices ++# USB-based Watchdog Cards + # +-# CONFIG_NEW_LEDS is not set ++# CONFIG_USBPCWATCHDOG is not set + + # +-# LED drivers ++# Sonics Silicon Backplane + # ++CONFIG_SSB_POSSIBLE=y ++# CONFIG_SSB is not set + + # +-# LED Triggers ++# Multifunction device drivers + # ++# CONFIG_MFD_SM501 is not set + + # + # Multimedia devices + # + # CONFIG_VIDEO_DEV is not set ++# CONFIG_DVB_CORE is not set ++# CONFIG_DAB is not set + + # +-# Digital Video Broadcasting Devices ++# Graphics support + # +-# CONFIG_DVB is not set +-# CONFIG_USB_DABUSB is not set ++# CONFIG_VGASTATE is not set ++# CONFIG_VIDEO_OUTPUT_CONTROL is not set ++# CONFIG_FB is not set ++# CONFIG_BACKLIGHT_LCD_SUPPORT is not set + + # +-# Graphics support ++# Display device support + # +-# CONFIG_FIRMWARE_EDID is not set +-# CONFIG_FB is not set ++# CONFIG_DISPLAY_SUPPORT is not set + + # + # Console display driver support + # + # CONFIG_VGA_CONSOLE is not set + CONFIG_DUMMY_CONSOLE=y +-# CONFIG_BACKLIGHT_LCD_SUPPORT is not set + + # + # Sound + # + # CONFIG_SOUND is not set ++CONFIG_HID_SUPPORT=y ++CONFIG_HID=y ++# CONFIG_HID_DEBUG is not set ++# CONFIG_HIDRAW is not set + + # +-# USB support ++# 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_SUPPORT=y + CONFIG_USB_ARCH_HAS_HCD=y + CONFIG_USB_ARCH_HAS_OHCI=y + # CONFIG_USB_ARCH_HAS_EHCI is not set +@@ -610,7 +683,7 @@ + # Miscellaneous USB options + # + CONFIG_USB_DEVICEFS=y +-# CONFIG_USB_BANDWIDTH is not set ++CONFIG_USB_DEVICE_CLASS=y + # CONFIG_USB_DYNAMIC_MINORS is not set + # CONFIG_USB_OTG is not set + +@@ -619,9 +692,11 @@ + # + # CONFIG_USB_ISP116X_HCD is not set + CONFIG_USB_OHCI_HCD=y +-# CONFIG_USB_OHCI_BIG_ENDIAN is not set ++# CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set ++# CONFIG_USB_OHCI_BIG_ENDIAN_MMIO is not set + CONFIG_USB_OHCI_LITTLE_ENDIAN=y + # CONFIG_USB_SL811_HCD is not set ++# CONFIG_USB_R8A66597_HCD is not set + + # + # USB Device Class drivers +@@ -640,6 +715,7 @@ + CONFIG_USB_STORAGE_DEBUG=y + # CONFIG_USB_STORAGE_DATAFAB is not set + # CONFIG_USB_STORAGE_FREECOM is not set ++# CONFIG_USB_STORAGE_ISD200 is not set + # CONFIG_USB_STORAGE_DPCM is not set + # CONFIG_USB_STORAGE_USBAT is not set + # CONFIG_USB_STORAGE_SDDR09 is not set +@@ -650,43 +726,10 @@ + # CONFIG_USB_LIBUSUAL 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_TOUCHSCREEN is not set +-# CONFIG_USB_YEALINK is not set +-# CONFIG_USB_XPAD is not set +-# CONFIG_USB_ATI_REMOTE is not set +-# CONFIG_USB_ATI_REMOTE2 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 + # CONFIG_USB_MICROTEK is not set +- +-# +-# 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_MII is not set +-# CONFIG_USB_USBNET is not set + CONFIG_USB_MON=y + + # +@@ -708,6 +751,7 @@ + # CONFIG_USB_RIO500 is not set + # CONFIG_USB_LEGOTOWER is not set + # CONFIG_USB_LCD is not set ++# CONFIG_USB_BERRY_CHARGE is not set + # CONFIG_USB_LED is not set + # CONFIG_USB_CYPRESS_CY7C63 is not set + # CONFIG_USB_CYTHERM is not set +@@ -717,6 +761,7 @@ + # CONFIG_USB_APPLEDISPLAY is not set + # CONFIG_USB_LD is not set + # CONFIG_USB_TRANCEVIBRATOR is not set ++# CONFIG_USB_IOWARRIOR is not set + # CONFIG_USB_TEST is not set + + # +@@ -727,13 +772,19 @@ + # USB Gadget Support + # + CONFIG_USB_GADGET=y ++# CONFIG_USB_GADGET_DEBUG is not set + # CONFIG_USB_GADGET_DEBUG_FILES is not set + CONFIG_USB_GADGET_SELECTED=y ++# CONFIG_USB_GADGET_AMD5536UDC is not set ++# CONFIG_USB_GADGET_ATMEL_USBA is not set ++# CONFIG_USB_GADGET_FSL_USB2 is not set + # CONFIG_USB_GADGET_NET2280 is not set + # CONFIG_USB_GADGET_PXA2XX is not set ++# CONFIG_USB_GADGET_M66592 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_S3C2410 is not set + CONFIG_USB_GADGET_AT91=y + CONFIG_USB_AT91=y + # CONFIG_USB_GADGET_DUMMY_HCD is not set +@@ -745,17 +796,56 @@ + # CONFIG_USB_FILE_STORAGE_TEST is not set + CONFIG_USB_G_SERIAL=m + # CONFIG_USB_MIDI_GADGET is not set ++# CONFIG_MMC is not set ++# CONFIG_NEW_LEDS is not set ++CONFIG_RTC_LIB=y ++CONFIG_RTC_CLASS=y ++CONFIG_RTC_HCTOSYS=y ++CONFIG_RTC_HCTOSYS_DEVICE="rtc0" ++# CONFIG_RTC_DEBUG is not set + + # +-# MMC/SD Card support ++# RTC interfaces + # +-# CONFIG_MMC is not set ++CONFIG_RTC_INTF_SYSFS=y ++CONFIG_RTC_INTF_PROC=y ++CONFIG_RTC_INTF_DEV=y ++# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set ++# CONFIG_RTC_DRV_TEST is not set + + # +-# Real Time Clock ++# I2C RTC drivers ++# ++# CONFIG_RTC_DRV_DS1307 is not set ++# CONFIG_RTC_DRV_DS1374 is not set ++# CONFIG_RTC_DRV_DS1672 is not set ++# CONFIG_RTC_DRV_MAX6900 is not set ++# CONFIG_RTC_DRV_RS5C372 is not set ++# CONFIG_RTC_DRV_ISL1208 is not set ++# CONFIG_RTC_DRV_X1205 is not set ++# CONFIG_RTC_DRV_PCF8563 is not set ++# CONFIG_RTC_DRV_PCF8583 is not set ++# CONFIG_RTC_DRV_M41T80 is not set ++ ++# ++# SPI RTC drivers + # +-CONFIG_RTC_LIB=y +-# CONFIG_RTC_CLASS is not set ++ ++# ++# Platform RTC drivers ++# ++# CONFIG_RTC_DRV_CMOS is not set ++# CONFIG_RTC_DRV_DS1553 is not set ++# CONFIG_RTC_DRV_STK17TA8 is not set ++# CONFIG_RTC_DRV_DS1742 is not set ++# CONFIG_RTC_DRV_M48T86 is not set ++# CONFIG_RTC_DRV_M48T59 is not set ++# CONFIG_RTC_DRV_V3020 is not set ++ ++# ++# on-CPU RTC drivers ++# ++CONFIG_RTC_DRV_AT91SAM9=y + + # + # File systems +@@ -806,7 +896,6 @@ + CONFIG_TMPFS=y + # CONFIG_TMPFS_POSIX_ACL is not set + # CONFIG_HUGETLB_PAGE is not set +-CONFIG_RAMFS=y + # CONFIG_CONFIGFS_FS is not set + + # +@@ -825,10 +914,7 @@ + # CONFIG_QNX4FS_FS is not set + # CONFIG_SYSV_FS is not set + # CONFIG_UFS_FS is not set +- +-# +-# Network File Systems +-# ++CONFIG_NETWORK_FILESYSTEMS=y + # CONFIG_NFS_FS is not set + # CONFIG_NFSD is not set + # CONFIG_SMB_FS is not set +@@ -836,17 +922,12 @@ + # 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=y + CONFIG_NLS_DEFAULT="iso8859-1" + CONFIG_NLS_CODEPAGE_437=y +@@ -887,41 +968,49 @@ + # CONFIG_NLS_KOI8_R is not set + # CONFIG_NLS_KOI8_U is not set + # CONFIG_NLS_UTF8 is not set +- +-# +-# Profiling support +-# ++# CONFIG_DLM is not set ++CONFIG_INSTRUMENTATION=y + # CONFIG_PROFILING is not set ++# CONFIG_MARKERS is not set + + # + # Kernel hacking + # + # CONFIG_PRINTK_TIME is not set ++CONFIG_ENABLE_WARN_DEPRECATED=y + CONFIG_ENABLE_MUST_CHECK=y + # CONFIG_MAGIC_SYSRQ is not set + # CONFIG_UNUSED_SYMBOLS is not set ++# CONFIG_DEBUG_FS is not set ++# CONFIG_HEADERS_CHECK is not set + CONFIG_DEBUG_KERNEL=y +-CONFIG_LOG_BUF_SHIFT=14 ++# CONFIG_DEBUG_SHIRQ is not set + CONFIG_DETECT_SOFTLOCKUP=y ++CONFIG_SCHED_DEBUG=y + # CONFIG_SCHEDSTATS is not set ++# CONFIG_TIMER_STATS is not set + # CONFIG_DEBUG_SLAB is not set + # CONFIG_DEBUG_RT_MUTEXES is not set + # CONFIG_RT_MUTEX_TESTER is not set + # CONFIG_DEBUG_SPINLOCK is not set + # CONFIG_DEBUG_MUTEXES is not set +-# CONFIG_DEBUG_RWSEMS is not set ++# CONFIG_DEBUG_LOCK_ALLOC is not set ++# CONFIG_PROVE_LOCKING is not set ++# CONFIG_LOCK_STAT is not set + # CONFIG_DEBUG_SPINLOCK_SLEEP is not set + # CONFIG_DEBUG_LOCKING_API_SELFTESTS 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_DEBUG_LIST is not set ++# CONFIG_DEBUG_SG is not set + CONFIG_FRAME_POINTER=y + CONFIG_FORCED_INLINING=y +-# CONFIG_HEADERS_CHECK is not set ++# CONFIG_BOOT_PRINTK_DELAY is not set + # CONFIG_RCU_TORTURE_TEST is not set ++# CONFIG_FAULT_INJECTION is not set ++# CONFIG_SAMPLES is not set + CONFIG_DEBUG_USER=y + # CONFIG_DEBUG_ERRORS is not set + CONFIG_DEBUG_LL=y +@@ -932,18 +1021,21 @@ + # + # CONFIG_KEYS is not set + # CONFIG_SECURITY is not set +- +-# +-# Cryptographic options +-# ++# CONFIG_SECURITY_FILE_CAPABILITIES is not set + # CONFIG_CRYPTO is not set + + # + # Library routines + # ++CONFIG_BITREVERSE=y + # CONFIG_CRC_CCITT is not set + # CONFIG_CRC16 is not set ++# CONFIG_CRC_ITU_T is not set + CONFIG_CRC32=y ++# CONFIG_CRC7 is not set + # CONFIG_LIBCRC32C is not set + CONFIG_ZLIB_INFLATE=y + CONFIG_PLIST=y ++CONFIG_HAS_IOMEM=y ++CONFIG_HAS_IOPORT=y ++CONFIG_HAS_DMA=y +diff -urN -x CVS linux-2.6.24/arch/arm/configs/at91sam9261ek_defconfig linux-2.6/arch/arm/configs/at91sam9261ek_defconfig +--- linux-2.6.24/arch/arm/configs/at91sam9261ek_defconfig 2007-10-09 22:31:38.000000000 +0200 ++++ linux-2.6/arch/arm/configs/at91sam9261ek_defconfig 2008-01-08 22:21:57.000000000 +0200 +@@ -1,43 +1,56 @@ + # + # Automatically generated make config: don't edit +-# Linux kernel version: 2.6.19-rc6 +-# Fri Nov 17 18:00:38 2006 ++# Linux kernel version: 2.6.24-rc7 ++# Tue Jan 8 22:21:49 2008 + # + CONFIG_ARM=y ++CONFIG_SYS_SUPPORTS_APM_EMULATION=y ++CONFIG_GENERIC_GPIO=y + # CONFIG_GENERIC_TIME is not set ++# CONFIG_GENERIC_CLOCKEVENTS is not set + CONFIG_MMU=y ++# CONFIG_NO_IOPORT is not set + CONFIG_GENERIC_HARDIRQS=y ++CONFIG_STACKTRACE_SUPPORT=y ++CONFIG_LOCKDEP_SUPPORT=y + CONFIG_TRACE_IRQFLAGS_SUPPORT=y + CONFIG_HARDIRQS_SW_RESEND=y + CONFIG_GENERIC_IRQ_PROBE=y + CONFIG_RWSEM_GENERIC_SPINLOCK=y ++# CONFIG_ARCH_HAS_ILOG2_U32 is not set ++# CONFIG_ARCH_HAS_ILOG2_U64 is not set + CONFIG_GENERIC_HWEIGHT=y + CONFIG_GENERIC_CALIBRATE_DELAY=y ++CONFIG_ZONE_DMA=y + CONFIG_VECTORS_BASE=0xffff0000 + CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" + + # +-# Code maturity level options ++# General setup + # + CONFIG_EXPERIMENTAL=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_IPC_NS is not set ++CONFIG_SYSVIPC_SYSCTL=y + # CONFIG_POSIX_MQUEUE is not set + # CONFIG_BSD_PROCESS_ACCT is not set + # CONFIG_TASKSTATS is not set +-# CONFIG_UTS_NS is not set ++# CONFIG_USER_NS is not set ++# CONFIG_PID_NS is not set + # CONFIG_AUDIT is not set + # CONFIG_IKCONFIG is not set ++CONFIG_LOG_BUF_SHIFT=14 ++# CONFIG_CGROUPS is not set ++CONFIG_FAIR_GROUP_SCHED=y ++CONFIG_FAIR_USER_SCHED=y ++# CONFIG_FAIR_CGROUP_SCHED is not set ++CONFIG_SYSFS_DEPRECATED=y + # CONFIG_RELAY is not set ++CONFIG_BLK_DEV_INITRD=y + CONFIG_INITRAMFS_SOURCE="" + CONFIG_CC_OPTIMIZE_FOR_SIZE=y + CONFIG_SYSCTL=y +@@ -53,30 +66,30 @@ + CONFIG_ELF_CORE=y + CONFIG_BASE_FULL=y + CONFIG_FUTEX=y ++CONFIG_ANON_INODES=y + CONFIG_EPOLL=y ++CONFIG_SIGNALFD=y ++CONFIG_EVENTFD=y + CONFIG_SHMEM=y +-CONFIG_SLAB=y + CONFIG_VM_EVENT_COUNTERS=y ++CONFIG_SLAB=y ++# CONFIG_SLUB is not set ++# CONFIG_SLOB is not set ++CONFIG_SLABINFO=y + CONFIG_RT_MUTEXES=y + # CONFIG_TINY_SHMEM is not set + CONFIG_BASE_SMALL=0 +-# CONFIG_SLOB is not set +- +-# +-# Loadable module support +-# + CONFIG_MODULES=y + CONFIG_MODULE_UNLOAD=y + # CONFIG_MODULE_FORCE_UNLOAD is not set + # CONFIG_MODVERSIONS is not set + # CONFIG_MODULE_SRCVERSION_ALL is not set + CONFIG_KMOD=y +- +-# +-# Block layer +-# + CONFIG_BLOCK=y ++# CONFIG_LBD is not set + # CONFIG_BLK_DEV_IO_TRACE is not set ++# CONFIG_LSF is not set ++# CONFIG_BLK_DEV_BSG is not set + + # + # IO Schedulers +@@ -108,12 +121,16 @@ + # CONFIG_ARCH_NETX is not set + # CONFIG_ARCH_H720X is not set + # CONFIG_ARCH_IMX is not set ++# CONFIG_ARCH_IOP13XX is not set + # CONFIG_ARCH_IOP32X is not set + # CONFIG_ARCH_IOP33X is not set +-# CONFIG_ARCH_IXP4XX is not set +-# CONFIG_ARCH_IXP2000 is not set + # CONFIG_ARCH_IXP23XX is not set ++# CONFIG_ARCH_IXP2000 is not set ++# CONFIG_ARCH_IXP4XX is not set + # CONFIG_ARCH_L7200 is not set ++# CONFIG_ARCH_KS8695 is not set ++# CONFIG_ARCH_NS9XXX is not set ++# CONFIG_ARCH_MXC is not set + # CONFIG_ARCH_PNX4008 is not set + # CONFIG_ARCH_PXA is not set + # CONFIG_ARCH_RPC is not set +@@ -121,14 +138,27 @@ + # CONFIG_ARCH_S3C2410 is not set + # CONFIG_ARCH_SHARK is not set + # CONFIG_ARCH_LH7A40X is not set ++# CONFIG_ARCH_DAVINCI is not set + # CONFIG_ARCH_OMAP is not set + + # ++# Boot options ++# ++ ++# ++# Power management ++# ++ ++# + # Atmel AT91 System-on-Chip + # + # CONFIG_ARCH_AT91RM9200 is not set + # CONFIG_ARCH_AT91SAM9260 is not set + CONFIG_ARCH_AT91SAM9261=y ++# CONFIG_ARCH_AT91SAM9263 is not set ++# CONFIG_ARCH_AT91SAM9RL is not set ++# CONFIG_ARCH_AT91X40 is not set ++CONFIG_AT91_PMC_UNIT=y + + # + # AT91SAM9261 Board Type +@@ -138,12 +168,15 @@ + # + # AT91 Board Options + # ++# CONFIG_MTD_AT91_DATAFLASH_CARD is not set + # CONFIG_MTD_NAND_AT91_BUSWIDTH_16 is not set + + # + # AT91 Feature Selections + # +-# CONFIG_AT91_PROGRAMMABLE_CLOCKS is not set ++CONFIG_AT91_PROGRAMMABLE_CLOCKS=y ++# CONFIG_ATMEL_TCLIB is not set ++CONFIG_AT91_TIMER_HZ=100 + + # + # Processor Type +@@ -166,19 +199,19 @@ + # CONFIG_CPU_DCACHE_DISABLE is not set + # CONFIG_CPU_DCACHE_WRITETHROUGH is not set + # CONFIG_CPU_CACHE_ROUND_ROBIN is not set ++# CONFIG_OUTER_CACHE is not set + + # + # Bus support + # +- +-# +-# PCCARD (PCMCIA/CardBus) support +-# ++# CONFIG_PCI_SYSCALL is not set ++# CONFIG_ARCH_SUPPORTS_MSI is not set + # CONFIG_PCCARD is not set + + # + # Kernel Features + # ++# CONFIG_TICK_ONESHOT is not set + # CONFIG_PREEMPT is not set + # CONFIG_NO_IDLE_HZ is not set + CONFIG_HZ=100 +@@ -191,8 +224,12 @@ + CONFIG_FLATMEM=y + CONFIG_FLAT_NODE_MEM_MAP=y + # CONFIG_SPARSEMEM_STATIC is not set ++# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set + CONFIG_SPLIT_PTLOCK_CPUS=4096 + # CONFIG_RESOURCES_64BIT is not set ++CONFIG_ZONE_DMA_FLAG=1 ++CONFIG_BOUNCE=y ++CONFIG_VIRT_TO_BUS=y + # CONFIG_LEDS is not set + CONFIG_ALIGNMENT_TRAP=y + +@@ -203,6 +240,7 @@ + CONFIG_ZBOOT_ROM_BSS=0x0 + CONFIG_CMDLINE="mem=64M console=ttyS0,115200 initrd=0x21100000,3145728 root=/dev/ram0 rw" + # CONFIG_XIP_KERNEL is not set ++# CONFIG_KEXEC is not set + + # + # Floating point emulation +@@ -228,7 +266,7 @@ + # Power management options + # + # CONFIG_PM is not set +-# CONFIG_APM is not set ++CONFIG_SUSPEND_UP_POSSIBLE=y + + # + # Networking +@@ -238,13 +276,13 @@ + # + # Networking options + # +-# CONFIG_NETDEBUG is not set + CONFIG_PACKET=y + # CONFIG_PACKET_MMAP is not set + CONFIG_UNIX=y + CONFIG_XFRM=y + # CONFIG_XFRM_USER is not set + # CONFIG_XFRM_SUB_POLICY is not set ++# CONFIG_XFRM_MIGRATE is not set + # CONFIG_NET_KEY is not set + CONFIG_INET=y + # CONFIG_IP_MULTICAST is not set +@@ -266,30 +304,20 @@ + CONFIG_INET_XFRM_MODE_TRANSPORT=y + CONFIG_INET_XFRM_MODE_TUNNEL=y + CONFIG_INET_XFRM_MODE_BEET=y ++# CONFIG_INET_LRO is not set + CONFIG_INET_DIAG=y + CONFIG_INET_TCP_DIAG=y + # CONFIG_TCP_CONG_ADVANCED is not set + CONFIG_TCP_CONG_CUBIC=y + CONFIG_DEFAULT_TCP_CONG="cubic" ++# CONFIG_TCP_MD5SIG is not set + # CONFIG_IPV6 is not set + # CONFIG_INET6_XFRM_TUNNEL is not set + # CONFIG_INET6_TUNNEL is not set + # CONFIG_NETWORK_SECMARK 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 +- +-# +-# TIPC Configuration (EXPERIMENTAL) +-# + # CONFIG_TIPC is not set + # CONFIG_ATM is not set + # CONFIG_BRIDGE is not set +@@ -302,10 +330,6 @@ + # CONFIG_LAPB 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 + + # +@@ -315,7 +339,17 @@ + # CONFIG_HAMRADIO is not set + # CONFIG_IRDA is not set + # CONFIG_BT is not set ++# CONFIG_AF_RXRPC is not set ++ ++# ++# Wireless ++# ++# CONFIG_CFG80211 is not set ++# CONFIG_WIRELESS_EXT is not set ++# CONFIG_MAC80211 is not set + # CONFIG_IEEE80211 is not set ++# CONFIG_RFKILL is not set ++# CONFIG_NET_9P is not set + + # + # Device Drivers +@@ -324,20 +358,14 @@ + # + # Generic Driver Options + # ++CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" + CONFIG_STANDALONE=y + CONFIG_PREVENT_FIRMWARE_BUILD=y + # CONFIG_FW_LOADER is not set + # CONFIG_DEBUG_DRIVER is not set ++# CONFIG_DEBUG_DEVRES is not set + # CONFIG_SYS_HYPERVISOR 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 +@@ -350,12 +378,14 @@ + # User Modules And Translation Layers + # + # CONFIG_MTD_CHAR is not set ++CONFIG_MTD_BLKDEVS=y + CONFIG_MTD_BLOCK=y + # CONFIG_FTL is not set + # CONFIG_NFTL is not set + # CONFIG_INFTL is not set + # CONFIG_RFD_FTL is not set + # CONFIG_SSFDC is not set ++# CONFIG_MTD_OOPS is not set + + # + # RAM/ROM/Flash chip drivers +@@ -375,7 +405,6 @@ + # CONFIG_MTD_RAM is not set + # CONFIG_MTD_ROM is not set + # CONFIG_MTD_ABSENT is not set +-# CONFIG_MTD_OBSOLETE_CHIPS is not set + + # + # Mapping drivers for chip access +@@ -386,6 +415,8 @@ + # + # Self-contained MTD device drivers + # ++# CONFIG_MTD_DATAFLASH is not set ++# CONFIG_MTD_M25P80 is not set + # CONFIG_MTD_SLRAM is not set + # CONFIG_MTD_PHRAM is not set + # CONFIG_MTD_MTDRAM is not set +@@ -397,35 +428,24 @@ + # CONFIG_MTD_DOC2000 is not set + # CONFIG_MTD_DOC2001 is not set + # CONFIG_MTD_DOC2001PLUS is not set +- +-# +-# NAND Flash Device Drivers +-# + CONFIG_MTD_NAND=y + # CONFIG_MTD_NAND_VERIFY_WRITE is not set + # CONFIG_MTD_NAND_ECC_SMC is not set ++# CONFIG_MTD_NAND_MUSEUM_IDS is not set + CONFIG_MTD_NAND_IDS=y + # CONFIG_MTD_NAND_DISKONCHIP is not set + CONFIG_MTD_NAND_AT91=y + # CONFIG_MTD_NAND_NANDSIM is not set +- +-# +-# OneNAND Flash Device Drivers +-# ++# CONFIG_MTD_NAND_PLATFORM is not set ++# CONFIG_MTD_ALAUDA is not set + # CONFIG_MTD_ONENAND is not set + + # +-# Parallel port support ++# UBI - Unsorted block images + # ++# CONFIG_MTD_UBI is not set + # CONFIG_PARPORT is not set +- +-# +-# Plug and Play support +-# +- +-# +-# Block devices +-# ++CONFIG_BLK_DEV=y + # CONFIG_BLK_DEV_COW_COMMON is not set + # CONFIG_BLK_DEV_LOOP is not set + # CONFIG_BLK_DEV_NBD is not set +@@ -434,15 +454,19 @@ + CONFIG_BLK_DEV_RAM_COUNT=16 + CONFIG_BLK_DEV_RAM_SIZE=8192 + CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024 +-CONFIG_BLK_DEV_INITRD=y + # CONFIG_CDROM_PKTCDVD is not set + # CONFIG_ATA_OVER_ETH is not set ++CONFIG_MISC_DEVICES=y ++# CONFIG_EEPROM_93CX6 is not set ++CONFIG_ATMEL_SSC=y + + # + # SCSI device support + # + # CONFIG_RAID_ATTRS is not set + CONFIG_SCSI=y ++CONFIG_SCSI_DMA=y ++# CONFIG_SCSI_TGT is not set + # CONFIG_SCSI_NETLINK is not set + CONFIG_SCSI_PROC_FS=y + +@@ -462,6 +486,8 @@ + CONFIG_SCSI_MULTI_LUN=y + # CONFIG_SCSI_CONSTANTS is not set + # CONFIG_SCSI_LOGGING is not set ++# CONFIG_SCSI_SCAN_ASYNC is not set ++CONFIG_SCSI_WAIT_SCAN=m + + # + # SCSI Transports +@@ -469,75 +495,49 @@ + # CONFIG_SCSI_SPI_ATTRS is not set + # CONFIG_SCSI_FC_ATTRS is not set + # CONFIG_SCSI_ISCSI_ATTRS is not set +-# CONFIG_SCSI_SAS_ATTRS is not set + # CONFIG_SCSI_SAS_LIBSAS is not set +- +-# +-# SCSI low-level drivers +-# ++# CONFIG_SCSI_SRP_ATTRS is not set ++CONFIG_SCSI_LOWLEVEL=y + # CONFIG_ISCSI_TCP is not set + # CONFIG_SCSI_DEBUG is not set +- +-# +-# Multi-device support (RAID and LVM) +-# ++# CONFIG_ATA is not set + # 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_NETDEVICES_MULTIQUEUE is not set + # CONFIG_DUMMY is not set + # CONFIG_BONDING is not set ++# CONFIG_MACVLAN is not set + # CONFIG_EQUALIZER is not set + # CONFIG_TUN is not set +- +-# +-# PHY device support +-# ++# CONFIG_VETH is not set + # CONFIG_PHYLIB is not set +- +-# +-# Ethernet (10 or 100Mbit) +-# + CONFIG_NET_ETHERNET=y + CONFIG_MII=y ++# CONFIG_AX88796 is not set + # CONFIG_SMC91X is not set + CONFIG_DM9000=y ++# CONFIG_IBM_NEW_EMAC_ZMII is not set ++# CONFIG_IBM_NEW_EMAC_RGMII is not set ++# CONFIG_IBM_NEW_EMAC_TAH is not set ++# CONFIG_IBM_NEW_EMAC_EMAC4 is not set ++# CONFIG_B44 is not set ++# CONFIG_NETDEV_1000 is not set ++# CONFIG_NETDEV_10000 is not set + + # +-# Ethernet (1000 Mbit) +-# +- +-# +-# Ethernet (10000 Mbit) +-# +- +-# +-# Token Ring devices ++# Wireless LAN + # ++# CONFIG_WLAN_PRE80211 is not set ++# CONFIG_WLAN_80211 is not set + + # +-# Wireless LAN (non-hamradio) +-# +-# CONFIG_NET_RADIO is not set +- +-# +-# Wan interfaces ++# USB Network Adapters + # ++# CONFIG_USB_CATC is not set ++# CONFIG_USB_KAWETH is not set ++# CONFIG_USB_PEGASUS is not set ++# CONFIG_USB_RTL8150 is not set ++# CONFIG_USB_USBNET is not set + # CONFIG_WAN is not set + # CONFIG_PPP is not set + # CONFIG_SLIP is not set +@@ -545,10 +545,6 @@ + # CONFIG_NETCONSOLE is not set + # CONFIG_NETPOLL is not set + # CONFIG_NET_POLL_CONTROLLER is not set +- +-# +-# ISDN subsystem +-# + # CONFIG_ISDN is not set + + # +@@ -556,6 +552,7 @@ + # + CONFIG_INPUT=y + # CONFIG_INPUT_FF_MEMLESS is not set ++# CONFIG_INPUT_POLLDEV is not set + + # + # Userland interfaces +@@ -565,23 +562,43 @@ + 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_KEYBOARD=y ++# CONFIG_KEYBOARD_ATKBD is not set ++# CONFIG_KEYBOARD_SUNKBD is not set ++# CONFIG_KEYBOARD_LKKBD is not set ++# CONFIG_KEYBOARD_XTKBD is not set ++# CONFIG_KEYBOARD_NEWTON is not set ++# CONFIG_KEYBOARD_STOWAWAY is not set ++CONFIG_KEYBOARD_GPIO=y + # CONFIG_INPUT_MOUSE is not set + # CONFIG_INPUT_JOYSTICK is not set +-# CONFIG_INPUT_TOUCHSCREEN is not set ++# CONFIG_INPUT_TABLET is not set ++CONFIG_INPUT_TOUCHSCREEN=y ++CONFIG_TOUCHSCREEN_ADS7846=y ++# CONFIG_TOUCHSCREEN_FUJITSU is not set ++# CONFIG_TOUCHSCREEN_GUNZE is not set ++# CONFIG_TOUCHSCREEN_ELO is not set ++# CONFIG_TOUCHSCREEN_MTOUCH is not set ++# CONFIG_TOUCHSCREEN_MK712 is not set ++# CONFIG_TOUCHSCREEN_PENMOUNT is not set ++# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set ++# CONFIG_TOUCHSCREEN_TOUCHWIN is not set ++# CONFIG_TOUCHSCREEN_UCB1400 is not set ++# CONFIG_TOUCHSCREEN_USB_COMPOSITE is not set + # CONFIG_INPUT_MISC is not set + + # + # Hardware I/O ports + # +-# CONFIG_SERIO is not set ++CONFIG_SERIO=y ++CONFIG_SERIO_SERPORT=y ++# CONFIG_SERIO_RAW is not set + # CONFIG_GAMEPORT is not set + + # +@@ -609,75 +626,47 @@ + 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 +- +-# +-# USB-based Watchdog Cards +-# +-# CONFIG_USBPCWATCHDOG is not set + CONFIG_HW_RANDOM=y + # CONFIG_NVRAM is not set +-# 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 +- +-# +-# I2C support +-# + CONFIG_I2C=y ++CONFIG_I2C_BOARDINFO=y + CONFIG_I2C_CHARDEV=y + + # + # I2C Algorithms + # +-# CONFIG_I2C_ALGOBIT is not set ++CONFIG_I2C_ALGOBIT=y + # CONFIG_I2C_ALGOPCF is not set + # CONFIG_I2C_ALGOPCA is not set + + # + # I2C Hardware Bus support + # +-CONFIG_I2C_AT91=y ++CONFIG_I2C_GPIO=y + # CONFIG_I2C_OCORES is not set + # CONFIG_I2C_PARPORT_LIGHT is not set ++# CONFIG_I2C_SIMTEC is not set ++# CONFIG_I2C_TAOS_EVM is not set + # CONFIG_I2C_STUB is not set ++# CONFIG_I2C_TINY_USB is not set + # CONFIG_I2C_PCA 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_DS1682 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_MAX6875 is not set ++# CONFIG_SENSORS_TSL2550 is not set + # CONFIG_I2C_DEBUG_CORE is not set + # CONFIG_I2C_DEBUG_ALGO is not set + # CONFIG_I2C_DEBUG_BUS is not set +@@ -686,70 +675,125 @@ + # + # SPI support + # +-# CONFIG_SPI is not set +-# CONFIG_SPI_MASTER is not set ++CONFIG_SPI=y ++# CONFIG_SPI_DEBUG is not set ++CONFIG_SPI_MASTER=y + + # +-# Dallas's 1-wire bus ++# SPI Master Controller Drivers + # +-# CONFIG_W1 is not set ++CONFIG_SPI_ATMEL=y ++# CONFIG_SPI_BITBANG is not set + + # +-# Hardware Monitoring support ++# SPI Protocol Masters + # ++# CONFIG_SPI_AT25 is not set ++# CONFIG_SPI_SPIDEV is not set ++# CONFIG_SPI_TLE62X0 is not set ++# CONFIG_W1 is not set ++# CONFIG_POWER_SUPPLY is not set + # CONFIG_HWMON is not set +-# CONFIG_HWMON_VID is not set ++CONFIG_WATCHDOG=y ++CONFIG_WATCHDOG_NOWAYOUT=y + + # +-# Misc devices ++# Watchdog Device Drivers + # +-# CONFIG_TIFM_CORE is not set ++# CONFIG_SOFT_WATCHDOG is not set ++CONFIG_AT91SAM9_WATCHDOG=y + + # +-# LED devices ++# USB-based Watchdog Cards + # +-# CONFIG_NEW_LEDS is not set ++# CONFIG_USBPCWATCHDOG is not set + + # +-# LED drivers ++# Sonics Silicon Backplane + # ++CONFIG_SSB_POSSIBLE=y ++# CONFIG_SSB is not set + + # +-# LED Triggers ++# Multifunction device drivers + # ++# CONFIG_MFD_SM501 is not set + + # + # Multimedia devices + # + # CONFIG_VIDEO_DEV is not set +- +-# +-# Digital Video Broadcasting Devices +-# +-# CONFIG_DVB is not set ++# CONFIG_DVB_CORE is not set ++CONFIG_DAB=y + # CONFIG_USB_DABUSB is not set + + # + # Graphics support + # ++# CONFIG_VGASTATE is not set ++# CONFIG_VIDEO_OUTPUT_CONTROL is not set ++CONFIG_FB=y + # CONFIG_FIRMWARE_EDID is not set +-# CONFIG_FB is not set ++# CONFIG_FB_DDC is not set ++CONFIG_FB_CFB_FILLRECT=y ++CONFIG_FB_CFB_COPYAREA=y ++CONFIG_FB_CFB_IMAGEBLIT=y ++# CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set ++# CONFIG_FB_SYS_FILLRECT is not set ++# CONFIG_FB_SYS_COPYAREA is not set ++# CONFIG_FB_SYS_IMAGEBLIT is not set ++# CONFIG_FB_SYS_FOPS is not set ++CONFIG_FB_DEFERRED_IO=y ++# CONFIG_FB_SVGALIB is not set ++# CONFIG_FB_MACMODES is not set ++# CONFIG_FB_BACKLIGHT is not set ++# CONFIG_FB_MODE_HELPERS is not set ++# CONFIG_FB_TILEBLITTING is not set ++ ++# ++# Frame buffer hardware drivers ++# ++# CONFIG_FB_S1D15605 is not set ++# CONFIG_FB_S1D13XXX is not set ++CONFIG_FB_ATMEL=y ++# CONFIG_FB_INTSRAM is not set ++# CONFIG_FB_ATMEL_STN is not set ++# CONFIG_FB_VIRTUAL is not set ++# CONFIG_BACKLIGHT_LCD_SUPPORT is not set ++ ++# ++# Display device support ++# ++# CONFIG_DISPLAY_SUPPORT is not set + + # + # Console display driver support + # + # CONFIG_VGA_CONSOLE is not set + CONFIG_DUMMY_CONSOLE=y +-# CONFIG_BACKLIGHT_LCD_SUPPORT is not set ++# CONFIG_FRAMEBUFFER_CONSOLE is not set ++# CONFIG_LOGO is not set + + # + # Sound + # + # CONFIG_SOUND is not set ++CONFIG_HID_SUPPORT=y ++CONFIG_HID=y ++# CONFIG_HID_DEBUG is not set ++# CONFIG_HIDRAW is not set + + # +-# USB support ++# 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_SUPPORT=y + CONFIG_USB_ARCH_HAS_HCD=y + CONFIG_USB_ARCH_HAS_OHCI=y + # CONFIG_USB_ARCH_HAS_EHCI is not set +@@ -760,7 +804,7 @@ + # Miscellaneous USB options + # + CONFIG_USB_DEVICEFS=y +-# CONFIG_USB_BANDWIDTH is not set ++CONFIG_USB_DEVICE_CLASS=y + # CONFIG_USB_DYNAMIC_MINORS is not set + # CONFIG_USB_OTG is not set + +@@ -769,9 +813,11 @@ + # + # CONFIG_USB_ISP116X_HCD is not set + CONFIG_USB_OHCI_HCD=y +-# CONFIG_USB_OHCI_BIG_ENDIAN is not set ++# CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set ++# CONFIG_USB_OHCI_BIG_ENDIAN_MMIO is not set + CONFIG_USB_OHCI_LITTLE_ENDIAN=y + # CONFIG_USB_SL811_HCD is not set ++# CONFIG_USB_R8A66597_HCD is not set + + # + # USB Device Class drivers +@@ -790,6 +836,7 @@ + CONFIG_USB_STORAGE_DEBUG=y + # CONFIG_USB_STORAGE_DATAFAB is not set + # CONFIG_USB_STORAGE_FREECOM is not set ++# CONFIG_USB_STORAGE_ISD200 is not set + # CONFIG_USB_STORAGE_DPCM is not set + # CONFIG_USB_STORAGE_USBAT is not set + # CONFIG_USB_STORAGE_SDDR09 is not set +@@ -800,43 +847,10 @@ + # CONFIG_USB_LIBUSUAL 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_TOUCHSCREEN is not set +-# CONFIG_USB_YEALINK is not set +-# CONFIG_USB_XPAD is not set +-# CONFIG_USB_ATI_REMOTE is not set +-# CONFIG_USB_ATI_REMOTE2 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 + # CONFIG_USB_MICROTEK is not set +- +-# +-# 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_MII is not set +-# CONFIG_USB_USBNET is not set + CONFIG_USB_MON=y + + # +@@ -858,6 +872,7 @@ + # CONFIG_USB_RIO500 is not set + # CONFIG_USB_LEGOTOWER is not set + # CONFIG_USB_LCD is not set ++# CONFIG_USB_BERRY_CHARGE is not set + # CONFIG_USB_LED is not set + # CONFIG_USB_CYPRESS_CY7C63 is not set + # CONFIG_USB_CYTHERM is not set +@@ -867,6 +882,7 @@ + # CONFIG_USB_APPLEDISPLAY is not set + # CONFIG_USB_LD is not set + # CONFIG_USB_TRANCEVIBRATOR is not set ++# CONFIG_USB_IOWARRIOR is not set + # CONFIG_USB_TEST is not set + + # +@@ -877,13 +893,19 @@ + # USB Gadget Support + # + CONFIG_USB_GADGET=y ++# CONFIG_USB_GADGET_DEBUG is not set + # CONFIG_USB_GADGET_DEBUG_FILES is not set + CONFIG_USB_GADGET_SELECTED=y ++# CONFIG_USB_GADGET_AMD5536UDC is not set ++# CONFIG_USB_GADGET_ATMEL_USBA is not set ++# CONFIG_USB_GADGET_FSL_USB2 is not set + # CONFIG_USB_GADGET_NET2280 is not set + # CONFIG_USB_GADGET_PXA2XX is not set ++# CONFIG_USB_GADGET_M66592 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_S3C2410 is not set + CONFIG_USB_GADGET_AT91=y + CONFIG_USB_AT91=y + # CONFIG_USB_GADGET_DUMMY_HCD is not set +@@ -895,21 +917,73 @@ + # CONFIG_USB_FILE_STORAGE_TEST is not set + CONFIG_USB_G_SERIAL=m + # CONFIG_USB_MIDI_GADGET is not set ++CONFIG_MMC=y ++# CONFIG_MMC_DEBUG is not set ++# CONFIG_MMC_UNSAFE_RESUME is not set + + # +-# MMC/SD Card support ++# MMC/SD Card Drivers + # +-CONFIG_MMC=y +-# CONFIG_MMC_DEBUG is not set + CONFIG_MMC_BLOCK=y +-CONFIG_MMC_AT91=m +-# CONFIG_MMC_TIFM_SD is not set ++CONFIG_MMC_BLOCK_BOUNCE=y ++# CONFIG_SDIO_UART is not set + + # +-# Real Time Clock ++# MMC/SD Host Controller Drivers + # ++CONFIG_MMC_AT91=y ++# CONFIG_MMC_SPI is not set ++# CONFIG_NEW_LEDS is not set + CONFIG_RTC_LIB=y +-# CONFIG_RTC_CLASS is not set ++CONFIG_RTC_CLASS=y ++CONFIG_RTC_HCTOSYS=y ++CONFIG_RTC_HCTOSYS_DEVICE="rtc0" ++# CONFIG_RTC_DEBUG is not set ++ ++# ++# RTC interfaces ++# ++CONFIG_RTC_INTF_SYSFS=y ++CONFIG_RTC_INTF_PROC=y ++CONFIG_RTC_INTF_DEV=y ++# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set ++# CONFIG_RTC_DRV_TEST is not set ++ ++# ++# I2C RTC drivers ++# ++# CONFIG_RTC_DRV_DS1307 is not set ++# CONFIG_RTC_DRV_DS1374 is not set ++# CONFIG_RTC_DRV_DS1672 is not set ++# CONFIG_RTC_DRV_MAX6900 is not set ++# CONFIG_RTC_DRV_RS5C372 is not set ++# CONFIG_RTC_DRV_ISL1208 is not set ++# CONFIG_RTC_DRV_X1205 is not set ++# CONFIG_RTC_DRV_PCF8563 is not set ++# CONFIG_RTC_DRV_PCF8583 is not set ++# CONFIG_RTC_DRV_M41T80 is not set ++ ++# ++# SPI RTC drivers ++# ++# CONFIG_RTC_DRV_RS5C348 is not set ++# CONFIG_RTC_DRV_MAX6902 is not set ++ ++# ++# Platform RTC drivers ++# ++# CONFIG_RTC_DRV_CMOS is not set ++# CONFIG_RTC_DRV_DS1553 is not set ++# CONFIG_RTC_DRV_STK17TA8 is not set ++# CONFIG_RTC_DRV_DS1742 is not set ++# CONFIG_RTC_DRV_M48T86 is not set ++# CONFIG_RTC_DRV_M48T59 is not set ++# CONFIG_RTC_DRV_V3020 is not set ++ ++# ++# on-CPU RTC drivers ++# ++CONFIG_RTC_DRV_AT91SAM9=y + + # + # File systems +@@ -960,7 +1034,6 @@ + CONFIG_TMPFS=y + # CONFIG_TMPFS_POSIX_ACL is not set + # CONFIG_HUGETLB_PAGE is not set +-CONFIG_RAMFS=y + # CONFIG_CONFIGFS_FS is not set + + # +@@ -973,7 +1046,6 @@ + # 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 +@@ -981,10 +1053,7 @@ + # CONFIG_QNX4FS_FS is not set + # CONFIG_SYSV_FS is not set + # CONFIG_UFS_FS is not set +- +-# +-# Network File Systems +-# ++CONFIG_NETWORK_FILESYSTEMS=y + # CONFIG_NFS_FS is not set + # CONFIG_NFSD is not set + # CONFIG_SMB_FS is not set +@@ -992,17 +1061,12 @@ + # 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=y + CONFIG_NLS_DEFAULT="iso8859-1" + CONFIG_NLS_CODEPAGE_437=y +@@ -1043,41 +1107,49 @@ + # CONFIG_NLS_KOI8_R is not set + # CONFIG_NLS_KOI8_U is not set + # CONFIG_NLS_UTF8 is not set +- +-# +-# Profiling support +-# ++# CONFIG_DLM is not set ++CONFIG_INSTRUMENTATION=y + # CONFIG_PROFILING is not set ++# CONFIG_MARKERS is not set + + # + # Kernel hacking + # + # CONFIG_PRINTK_TIME is not set ++CONFIG_ENABLE_WARN_DEPRECATED=y + CONFIG_ENABLE_MUST_CHECK=y + # CONFIG_MAGIC_SYSRQ is not set + # CONFIG_UNUSED_SYMBOLS is not set ++# CONFIG_DEBUG_FS is not set ++# CONFIG_HEADERS_CHECK is not set + CONFIG_DEBUG_KERNEL=y +-CONFIG_LOG_BUF_SHIFT=14 ++# CONFIG_DEBUG_SHIRQ is not set + CONFIG_DETECT_SOFTLOCKUP=y ++CONFIG_SCHED_DEBUG=y + # CONFIG_SCHEDSTATS is not set ++# CONFIG_TIMER_STATS is not set + # CONFIG_DEBUG_SLAB is not set + # CONFIG_DEBUG_RT_MUTEXES is not set + # CONFIG_RT_MUTEX_TESTER is not set + # CONFIG_DEBUG_SPINLOCK is not set + # CONFIG_DEBUG_MUTEXES is not set +-# CONFIG_DEBUG_RWSEMS is not set ++# CONFIG_DEBUG_LOCK_ALLOC is not set ++# CONFIG_PROVE_LOCKING is not set ++# CONFIG_LOCK_STAT is not set + # CONFIG_DEBUG_SPINLOCK_SLEEP is not set + # CONFIG_DEBUG_LOCKING_API_SELFTESTS 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_DEBUG_LIST is not set ++# CONFIG_DEBUG_SG is not set + CONFIG_FRAME_POINTER=y + CONFIG_FORCED_INLINING=y +-# CONFIG_HEADERS_CHECK is not set ++# CONFIG_BOOT_PRINTK_DELAY is not set + # CONFIG_RCU_TORTURE_TEST is not set ++# CONFIG_FAULT_INJECTION is not set ++# CONFIG_SAMPLES is not set + CONFIG_DEBUG_USER=y + # CONFIG_DEBUG_ERRORS is not set + CONFIG_DEBUG_LL=y +@@ -1088,18 +1160,21 @@ + # + # CONFIG_KEYS is not set + # CONFIG_SECURITY is not set +- +-# +-# Cryptographic options +-# ++# CONFIG_SECURITY_FILE_CAPABILITIES is not set + # CONFIG_CRYPTO is not set + + # + # Library routines + # ++CONFIG_BITREVERSE=y + # CONFIG_CRC_CCITT is not set + # CONFIG_CRC16 is not set ++# CONFIG_CRC_ITU_T is not set + CONFIG_CRC32=y ++# CONFIG_CRC7 is not set + # CONFIG_LIBCRC32C is not set + CONFIG_ZLIB_INFLATE=y + CONFIG_PLIST=y ++CONFIG_HAS_IOMEM=y ++CONFIG_HAS_IOPORT=y ++CONFIG_HAS_DMA=y +diff -urN -x CVS linux-2.6.24/arch/arm/configs/at91sam9263ek_defconfig linux-2.6/arch/arm/configs/at91sam9263ek_defconfig +--- linux-2.6.24/arch/arm/configs/at91sam9263ek_defconfig 2007-10-09 22:31:38.000000000 +0200 ++++ linux-2.6/arch/arm/configs/at91sam9263ek_defconfig 2008-01-08 22:12:41.000000000 +0200 +@@ -1,12 +1,18 @@ + # + # Automatically generated make config: don't edit +-# Linux kernel version: 2.6.20-rc1 +-# Mon Jan 8 16:06:54 2007 ++# Linux kernel version: 2.6.24-rc7 ++# Tue Jan 8 22:12:20 2008 + # + CONFIG_ARM=y ++CONFIG_SYS_SUPPORTS_APM_EMULATION=y ++CONFIG_GENERIC_GPIO=y + # CONFIG_GENERIC_TIME is not set ++# CONFIG_GENERIC_CLOCKEVENTS is not set + CONFIG_MMU=y ++# CONFIG_NO_IOPORT is not set + CONFIG_GENERIC_HARDIRQS=y ++CONFIG_STACKTRACE_SUPPORT=y ++CONFIG_LOCKDEP_SUPPORT=y + CONFIG_TRACE_IRQFLAGS_SUPPORT=y + CONFIG_HARDIRQS_SW_RESEND=y + CONFIG_GENERIC_IRQ_PROBE=y +@@ -15,32 +21,36 @@ + # CONFIG_ARCH_HAS_ILOG2_U64 is not set + CONFIG_GENERIC_HWEIGHT=y + CONFIG_GENERIC_CALIBRATE_DELAY=y ++CONFIG_ZONE_DMA=y + CONFIG_VECTORS_BASE=0xffff0000 + CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" + + # +-# Code maturity level options ++# General setup + # + CONFIG_EXPERIMENTAL=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_IPC_NS is not set ++CONFIG_SYSVIPC_SYSCTL=y + # CONFIG_POSIX_MQUEUE is not set + # CONFIG_BSD_PROCESS_ACCT is not set + # CONFIG_TASKSTATS is not set +-# CONFIG_UTS_NS is not set ++# CONFIG_USER_NS is not set ++# CONFIG_PID_NS is not set + # CONFIG_AUDIT is not set + # CONFIG_IKCONFIG is not set ++CONFIG_LOG_BUF_SHIFT=14 ++# CONFIG_CGROUPS is not set ++CONFIG_FAIR_GROUP_SCHED=y ++CONFIG_FAIR_USER_SCHED=y ++# CONFIG_FAIR_CGROUP_SCHED is not set + CONFIG_SYSFS_DEPRECATED=y + # CONFIG_RELAY is not set ++CONFIG_BLK_DEV_INITRD=y + CONFIG_INITRAMFS_SOURCE="" + CONFIG_CC_OPTIMIZE_FOR_SIZE=y + CONFIG_SYSCTL=y +@@ -56,32 +66,30 @@ + CONFIG_ELF_CORE=y + CONFIG_BASE_FULL=y + CONFIG_FUTEX=y ++CONFIG_ANON_INODES=y + CONFIG_EPOLL=y ++CONFIG_SIGNALFD=y ++CONFIG_EVENTFD=y + CONFIG_SHMEM=y +-CONFIG_SLAB=y + CONFIG_VM_EVENT_COUNTERS=y ++CONFIG_SLAB=y ++# CONFIG_SLUB is not set ++# CONFIG_SLOB is not set ++CONFIG_SLABINFO=y + CONFIG_RT_MUTEXES=y + # CONFIG_TINY_SHMEM is not set + CONFIG_BASE_SMALL=0 +-# CONFIG_SLOB is not set +- +-# +-# Loadable module support +-# + CONFIG_MODULES=y + CONFIG_MODULE_UNLOAD=y + # CONFIG_MODULE_FORCE_UNLOAD is not set + # CONFIG_MODVERSIONS is not set + # CONFIG_MODULE_SRCVERSION_ALL is not set + CONFIG_KMOD=y +- +-# +-# Block layer +-# + CONFIG_BLOCK=y + # CONFIG_LBD is not set + # CONFIG_BLK_DEV_IO_TRACE is not set + # CONFIG_LSF is not set ++# CONFIG_BLK_DEV_BSG is not set + + # + # IO Schedulers +@@ -113,13 +121,16 @@ + # CONFIG_ARCH_NETX is not set + # CONFIG_ARCH_H720X is not set + # CONFIG_ARCH_IMX is not set ++# CONFIG_ARCH_IOP13XX is not set + # CONFIG_ARCH_IOP32X is not set + # CONFIG_ARCH_IOP33X is not set +-# CONFIG_ARCH_IOP13XX is not set +-# CONFIG_ARCH_IXP4XX is not set +-# CONFIG_ARCH_IXP2000 is not set + # CONFIG_ARCH_IXP23XX is not set ++# CONFIG_ARCH_IXP2000 is not set ++# CONFIG_ARCH_IXP4XX is not set + # CONFIG_ARCH_L7200 is not set ++# CONFIG_ARCH_KS8695 is not set ++# CONFIG_ARCH_NS9XXX is not set ++# CONFIG_ARCH_MXC is not set + # CONFIG_ARCH_PNX4008 is not set + # CONFIG_ARCH_PXA is not set + # CONFIG_ARCH_RPC is not set +@@ -127,15 +138,27 @@ + # CONFIG_ARCH_S3C2410 is not set + # CONFIG_ARCH_SHARK is not set + # CONFIG_ARCH_LH7A40X is not set ++# CONFIG_ARCH_DAVINCI is not set + # CONFIG_ARCH_OMAP is not set + + # ++# Boot options ++# ++ ++# ++# Power management ++# ++ ++# + # Atmel AT91 System-on-Chip + # + # CONFIG_ARCH_AT91RM9200 is not set + # CONFIG_ARCH_AT91SAM9260 is not set + # CONFIG_ARCH_AT91SAM9261 is not set + CONFIG_ARCH_AT91SAM9263=y ++# CONFIG_ARCH_AT91SAM9RL is not set ++# CONFIG_ARCH_AT91X40 is not set ++CONFIG_AT91_PMC_UNIT=y + + # + # AT91SAM9263 Board Type +@@ -152,6 +175,8 @@ + # AT91 Feature Selections + # + # CONFIG_AT91_PROGRAMMABLE_CLOCKS is not set ++# CONFIG_ATMEL_TCLIB is not set ++CONFIG_AT91_TIMER_HZ=100 + + # + # Processor Type +@@ -174,19 +199,19 @@ + # CONFIG_CPU_DCACHE_DISABLE is not set + # CONFIG_CPU_DCACHE_WRITETHROUGH is not set + # CONFIG_CPU_CACHE_ROUND_ROBIN is not set ++# CONFIG_OUTER_CACHE is not set + + # + # Bus support + # +- +-# +-# PCCARD (PCMCIA/CardBus) support +-# ++# CONFIG_PCI_SYSCALL is not set ++# CONFIG_ARCH_SUPPORTS_MSI is not set + # CONFIG_PCCARD is not set + + # + # Kernel Features + # ++# CONFIG_TICK_ONESHOT is not set + # CONFIG_PREEMPT is not set + # CONFIG_NO_IDLE_HZ is not set + CONFIG_HZ=100 +@@ -199,8 +224,12 @@ + CONFIG_FLATMEM=y + CONFIG_FLAT_NODE_MEM_MAP=y + # CONFIG_SPARSEMEM_STATIC is not set ++# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set + CONFIG_SPLIT_PTLOCK_CPUS=4096 + # CONFIG_RESOURCES_64BIT is not set ++CONFIG_ZONE_DMA_FLAG=1 ++CONFIG_BOUNCE=y ++CONFIG_VIRT_TO_BUS=y + # CONFIG_LEDS is not set + CONFIG_ALIGNMENT_TRAP=y + +@@ -211,6 +240,7 @@ + CONFIG_ZBOOT_ROM_BSS=0x0 + CONFIG_CMDLINE="mem=64M console=ttyS0,115200 initrd=0x21100000,3145728 root=/dev/ram0 rw" + # CONFIG_XIP_KERNEL is not set ++# CONFIG_KEXEC is not set + + # + # Floating point emulation +@@ -236,7 +266,7 @@ + # Power management options + # + # CONFIG_PM is not set +-# CONFIG_APM is not set ++CONFIG_SUSPEND_UP_POSSIBLE=y + + # + # Networking +@@ -246,7 +276,6 @@ + # + # Networking options + # +-# CONFIG_NETDEBUG is not set + CONFIG_PACKET=y + # CONFIG_PACKET_MMAP is not set + CONFIG_UNIX=y +@@ -271,6 +300,7 @@ + # CONFIG_INET_XFRM_MODE_TRANSPORT is not set + # CONFIG_INET_XFRM_MODE_TUNNEL is not set + # CONFIG_INET_XFRM_MODE_BEET is not set ++# CONFIG_INET_LRO is not set + # CONFIG_INET_DIAG is not set + # CONFIG_TCP_CONG_ADVANCED is not set + CONFIG_TCP_CONG_CUBIC=y +@@ -281,20 +311,8 @@ + # CONFIG_INET6_TUNNEL is not set + # CONFIG_NETWORK_SECMARK 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 +- +-# +-# TIPC Configuration (EXPERIMENTAL) +-# + # CONFIG_TIPC is not set + # CONFIG_ATM is not set + # CONFIG_BRIDGE is not set +@@ -307,10 +325,6 @@ + # CONFIG_LAPB 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 + + # +@@ -320,7 +334,17 @@ + # CONFIG_HAMRADIO is not set + # CONFIG_IRDA is not set + # CONFIG_BT is not set ++# CONFIG_AF_RXRPC is not set ++ ++# ++# Wireless ++# ++# CONFIG_CFG80211 is not set ++# CONFIG_WIRELESS_EXT is not set ++# CONFIG_MAC80211 is not set + # CONFIG_IEEE80211 is not set ++# CONFIG_RFKILL is not set ++# CONFIG_NET_9P is not set + + # + # Device Drivers +@@ -329,20 +353,14 @@ + # + # Generic Driver Options + # ++CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" + CONFIG_STANDALONE=y + CONFIG_PREVENT_FIRMWARE_BUILD=y + # CONFIG_FW_LOADER is not set + # CONFIG_DEBUG_DRIVER is not set ++# CONFIG_DEBUG_DEVRES is not set + # CONFIG_SYS_HYPERVISOR 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 +@@ -362,6 +380,7 @@ + # CONFIG_INFTL is not set + # CONFIG_RFD_FTL is not set + # CONFIG_SSFDC is not set ++# CONFIG_MTD_OOPS is not set + + # + # RAM/ROM/Flash chip drivers +@@ -381,7 +400,6 @@ + # CONFIG_MTD_RAM is not set + # CONFIG_MTD_ROM is not set + # CONFIG_MTD_ABSENT is not set +-# CONFIG_MTD_OBSOLETE_CHIPS is not set + + # + # Mapping drivers for chip access +@@ -405,35 +423,24 @@ + # CONFIG_MTD_DOC2000 is not set + # CONFIG_MTD_DOC2001 is not set + # CONFIG_MTD_DOC2001PLUS is not set +- +-# +-# NAND Flash Device Drivers +-# + CONFIG_MTD_NAND=y + # CONFIG_MTD_NAND_VERIFY_WRITE is not set + # CONFIG_MTD_NAND_ECC_SMC is not set ++# CONFIG_MTD_NAND_MUSEUM_IDS is not set + CONFIG_MTD_NAND_IDS=y + # CONFIG_MTD_NAND_DISKONCHIP is not set + CONFIG_MTD_NAND_AT91=y + # CONFIG_MTD_NAND_NANDSIM is not set +- +-# +-# OneNAND Flash Device Drivers +-# ++# CONFIG_MTD_NAND_PLATFORM is not set ++# CONFIG_MTD_ALAUDA is not set + # CONFIG_MTD_ONENAND is not set + + # +-# Parallel port support ++# UBI - Unsorted block images + # ++# CONFIG_MTD_UBI is not set + # CONFIG_PARPORT is not set +- +-# +-# Plug and Play support +-# +- +-# +-# Block devices +-# ++CONFIG_BLK_DEV=y + # CONFIG_BLK_DEV_COW_COMMON is not set + CONFIG_BLK_DEV_LOOP=y + # CONFIG_BLK_DEV_CRYPTOLOOP is not set +@@ -443,15 +450,18 @@ + CONFIG_BLK_DEV_RAM_COUNT=16 + CONFIG_BLK_DEV_RAM_SIZE=8192 + CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024 +-CONFIG_BLK_DEV_INITRD=y + # CONFIG_CDROM_PKTCDVD is not set + # CONFIG_ATA_OVER_ETH is not set ++CONFIG_MISC_DEVICES=y ++# CONFIG_EEPROM_93CX6 is not set ++CONFIG_ATMEL_SSC=y + + # + # SCSI device support + # + # CONFIG_RAID_ATTRS is not set + CONFIG_SCSI=y ++CONFIG_SCSI_DMA=y + # CONFIG_SCSI_TGT is not set + # CONFIG_SCSI_NETLINK is not set + CONFIG_SCSI_PROC_FS=y +@@ -473,6 +483,7 @@ + # CONFIG_SCSI_CONSTANTS is not set + # CONFIG_SCSI_LOGGING is not set + # CONFIG_SCSI_SCAN_ASYNC is not set ++CONFIG_SCSI_WAIT_SCAN=m + + # + # SCSI Transports +@@ -480,80 +491,65 @@ + # CONFIG_SCSI_SPI_ATTRS is not set + # CONFIG_SCSI_FC_ATTRS is not set + # CONFIG_SCSI_ISCSI_ATTRS is not set +-# CONFIG_SCSI_SAS_ATTRS is not set + # CONFIG_SCSI_SAS_LIBSAS is not set +- +-# +-# SCSI low-level drivers +-# ++# CONFIG_SCSI_SRP_ATTRS is not set ++CONFIG_SCSI_LOWLEVEL=y + # CONFIG_ISCSI_TCP is not set + # CONFIG_SCSI_DEBUG is not set +- +-# +-# Serial ATA (prod) and Parallel ATA (experimental) drivers +-# + # CONFIG_ATA 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_NETDEVICES_MULTIQUEUE is not set + # CONFIG_DUMMY is not set + # CONFIG_BONDING is not set ++# CONFIG_MACVLAN is not set + # CONFIG_EQUALIZER is not set + # CONFIG_TUN is not set ++# CONFIG_VETH is not set ++CONFIG_PHYLIB=y + + # +-# PHY device support +-# +-# CONFIG_PHYLIB is not set +- +-# +-# Ethernet (10 or 100Mbit) ++# MII PHY device drivers + # ++# CONFIG_MARVELL_PHY is not set ++# CONFIG_DAVICOM_PHY is not set ++# CONFIG_QSEMI_PHY is not set ++# CONFIG_LXT_PHY is not set ++# CONFIG_CICADA_PHY is not set ++# CONFIG_VITESSE_PHY is not set ++# CONFIG_SMSC_PHY is not set ++# CONFIG_BROADCOM_PHY is not set ++# CONFIG_ICPLUS_PHY is not set ++# CONFIG_FIXED_PHY is not set ++# CONFIG_MDIO_BITBANG is not set + CONFIG_NET_ETHERNET=y + CONFIG_MII=y ++CONFIG_MACB=y ++# CONFIG_AX88796 is not set + # CONFIG_SMC91X is not set + # CONFIG_DM9000 is not set ++# CONFIG_IBM_NEW_EMAC_ZMII is not set ++# CONFIG_IBM_NEW_EMAC_RGMII is not set ++# CONFIG_IBM_NEW_EMAC_TAH is not set ++# CONFIG_IBM_NEW_EMAC_EMAC4 is not set ++# CONFIG_B44 is not set ++CONFIG_NETDEV_1000=y ++CONFIG_NETDEV_10000=y + + # +-# Ethernet (1000 Mbit) +-# +- +-# +-# Ethernet (10000 Mbit) +-# +- +-# +-# Token Ring devices +-# +- +-# +-# Wireless LAN (non-hamradio) ++# Wireless LAN + # +-# CONFIG_NET_RADIO is not set ++# CONFIG_WLAN_PRE80211 is not set ++# CONFIG_WLAN_80211 is not set + + # +-# Wan interfaces ++# USB Network Adapters + # ++# CONFIG_USB_CATC is not set ++# CONFIG_USB_KAWETH is not set ++# CONFIG_USB_PEGASUS is not set ++# CONFIG_USB_RTL8150 is not set ++# CONFIG_USB_USBNET is not set + # CONFIG_WAN is not set + # CONFIG_PPP is not set + # CONFIG_SLIP is not set +@@ -561,10 +557,6 @@ + # CONFIG_NETCONSOLE is not set + # CONFIG_NETPOLL is not set + # CONFIG_NET_POLL_CONTROLLER is not set +- +-# +-# ISDN subsystem +-# + # CONFIG_ISDN is not set + + # +@@ -572,6 +564,7 @@ + # + CONFIG_INPUT=y + # CONFIG_INPUT_FF_MEMLESS is not set ++# CONFIG_INPUT_POLLDEV is not set + + # + # Userland interfaces +@@ -581,20 +574,26 @@ + CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 + CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 + # CONFIG_INPUT_JOYDEV is not set +-CONFIG_INPUT_TSDEV=y +-CONFIG_INPUT_TSDEV_SCREEN_X=240 +-CONFIG_INPUT_TSDEV_SCREEN_Y=320 + CONFIG_INPUT_EVDEV=y + # CONFIG_INPUT_EVBUG is not set + + # + # Input Device Drivers + # +-# CONFIG_INPUT_KEYBOARD is not set ++CONFIG_INPUT_KEYBOARD=y ++# CONFIG_KEYBOARD_ATKBD is not set ++# CONFIG_KEYBOARD_SUNKBD is not set ++# CONFIG_KEYBOARD_LKKBD is not set ++# CONFIG_KEYBOARD_XTKBD is not set ++# CONFIG_KEYBOARD_NEWTON is not set ++# CONFIG_KEYBOARD_STOWAWAY is not set ++CONFIG_KEYBOARD_GPIO=y + # CONFIG_INPUT_MOUSE is not set + # CONFIG_INPUT_JOYSTICK is not set ++# CONFIG_INPUT_TABLET is not set + CONFIG_INPUT_TOUCHSCREEN=y + CONFIG_TOUCHSCREEN_ADS7846=y ++# CONFIG_TOUCHSCREEN_FUJITSU is not set + # CONFIG_TOUCHSCREEN_GUNZE is not set + # CONFIG_TOUCHSCREEN_ELO is not set + # CONFIG_TOUCHSCREEN_MTOUCH is not set +@@ -603,6 +602,7 @@ + # CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set + # CONFIG_TOUCHSCREEN_TOUCHWIN is not set + # CONFIG_TOUCHSCREEN_UCB1400 is not set ++# CONFIG_TOUCHSCREEN_USB_COMPOSITE is not set + # CONFIG_INPUT_MISC is not set + + # +@@ -636,71 +636,47 @@ + 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 +- +-# +-# USB-based Watchdog Cards +-# +-# CONFIG_USBPCWATCHDOG is not set + CONFIG_HW_RANDOM=y + # CONFIG_NVRAM is not set +-# CONFIG_DTLK is not set + # CONFIG_R3964 is not set + # CONFIG_RAW_DRIVER is not set +- +-# +-# TPM devices +-# + # CONFIG_TCG_TPM is not set +- +-# +-# I2C support +-# + CONFIG_I2C=y ++CONFIG_I2C_BOARDINFO=y + CONFIG_I2C_CHARDEV=y + + # + # I2C Algorithms + # +-# CONFIG_I2C_ALGOBIT is not set ++CONFIG_I2C_ALGOBIT=y + # CONFIG_I2C_ALGOPCF is not set + # CONFIG_I2C_ALGOPCA is not set + + # + # I2C Hardware Bus support + # +-CONFIG_I2C_AT91=y ++CONFIG_I2C_GPIO=y + # CONFIG_I2C_OCORES is not set + # CONFIG_I2C_PARPORT_LIGHT is not set ++# CONFIG_I2C_SIMTEC is not set ++# CONFIG_I2C_TAOS_EVM is not set + # CONFIG_I2C_STUB is not set ++# CONFIG_I2C_TINY_USB is not set + # CONFIG_I2C_PCA 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_DS1682 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_MAX6875 is not set ++# CONFIG_SENSORS_TSL2550 is not set + # CONFIG_I2C_DEBUG_CORE is not set + # CONFIG_I2C_DEBUG_ALGO is not set + # CONFIG_I2C_DEBUG_BUS is not set +@@ -722,61 +698,80 @@ + # + # SPI Protocol Masters + # +- +-# +-# Dallas's 1-wire bus +-# ++# CONFIG_SPI_AT25 is not set ++# CONFIG_SPI_SPIDEV is not set ++# CONFIG_SPI_TLE62X0 is not set + # CONFIG_W1 is not set +- +-# +-# Hardware Monitoring support +-# ++# CONFIG_POWER_SUPPLY is not set + # CONFIG_HWMON is not set +-# CONFIG_HWMON_VID is not set ++CONFIG_WATCHDOG=y ++CONFIG_WATCHDOG_NOWAYOUT=y + + # +-# Misc devices ++# Watchdog Device Drivers + # +-# CONFIG_TIFM_CORE is not set ++# CONFIG_SOFT_WATCHDOG is not set ++CONFIG_AT91SAM9_WATCHDOG=y + + # +-# LED devices ++# USB-based Watchdog Cards + # +-# CONFIG_NEW_LEDS is not set ++# CONFIG_USBPCWATCHDOG is not set + + # +-# LED drivers ++# Sonics Silicon Backplane + # ++CONFIG_SSB_POSSIBLE=y ++# CONFIG_SSB is not set + + # +-# LED Triggers ++# Multifunction device drivers + # ++# CONFIG_MFD_SM501 is not set + + # + # Multimedia devices + # + # CONFIG_VIDEO_DEV is not set +- +-# +-# Digital Video Broadcasting Devices +-# +-# CONFIG_DVB is not set +-# CONFIG_USB_DABUSB is not set ++# CONFIG_DVB_CORE is not set ++# CONFIG_DAB is not set + + # + # Graphics support + # +-# CONFIG_FIRMWARE_EDID is not set ++# CONFIG_VGASTATE is not set ++# CONFIG_VIDEO_OUTPUT_CONTROL is not set + CONFIG_FB=y +-# CONFIG_FB_CFB_FILLRECT is not set +-# CONFIG_FB_CFB_COPYAREA is not set +-# CONFIG_FB_CFB_IMAGEBLIT is not set ++# CONFIG_FIRMWARE_EDID is not set ++# CONFIG_FB_DDC is not set ++CONFIG_FB_CFB_FILLRECT=y ++CONFIG_FB_CFB_COPYAREA=y ++CONFIG_FB_CFB_IMAGEBLIT=y ++# CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set ++# CONFIG_FB_SYS_FILLRECT is not set ++# CONFIG_FB_SYS_COPYAREA is not set ++# CONFIG_FB_SYS_IMAGEBLIT is not set ++# CONFIG_FB_SYS_FOPS is not set ++CONFIG_FB_DEFERRED_IO=y ++# CONFIG_FB_SVGALIB is not set + # CONFIG_FB_MACMODES is not set + # CONFIG_FB_BACKLIGHT is not set + # CONFIG_FB_MODE_HELPERS is not set + # CONFIG_FB_TILEBLITTING is not set ++ ++# ++# Frame buffer hardware drivers ++# ++# CONFIG_FB_S1D15605 is not set + # CONFIG_FB_S1D13XXX is not set ++CONFIG_FB_ATMEL=y + # CONFIG_FB_VIRTUAL is not set ++# CONFIG_BACKLIGHT_LCD_SUPPORT is not set ++ ++# ++# Display device support ++# ++# CONFIG_DISPLAY_SUPPORT is not set + + # + # Console display driver support +@@ -784,26 +779,28 @@ + # 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 ++CONFIG_HID_SUPPORT=y ++CONFIG_HID=y ++# CONFIG_HID_DEBUG is not set ++# CONFIG_HIDRAW is not set + + # +-# HID Devices ++# USB Input Devices + # +-CONFIG_HID=y ++# CONFIG_USB_HID is not set + + # +-# USB support ++# USB HID Boot Protocol drivers + # ++# CONFIG_USB_KBD is not set ++# CONFIG_USB_MOUSE is not set ++CONFIG_USB_SUPPORT=y + CONFIG_USB_ARCH_HAS_HCD=y + CONFIG_USB_ARCH_HAS_OHCI=y + # CONFIG_USB_ARCH_HAS_EHCI is not set +@@ -814,9 +811,8 @@ + # Miscellaneous USB options + # + CONFIG_USB_DEVICEFS=y +-# CONFIG_USB_BANDWIDTH is not set ++CONFIG_USB_DEVICE_CLASS=y + # CONFIG_USB_DYNAMIC_MINORS is not set +-# CONFIG_USB_MULTITHREAD_PROBE is not set + # CONFIG_USB_OTG is not set + + # +@@ -824,9 +820,11 @@ + # + # CONFIG_USB_ISP116X_HCD is not set + CONFIG_USB_OHCI_HCD=y +-# CONFIG_USB_OHCI_BIG_ENDIAN is not set ++# CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set ++# CONFIG_USB_OHCI_BIG_ENDIAN_MMIO is not set + CONFIG_USB_OHCI_LITTLE_ENDIAN=y + # CONFIG_USB_SL811_HCD is not set ++# CONFIG_USB_R8A66597_HCD is not set + + # + # USB Device Class drivers +@@ -845,6 +843,7 @@ + # CONFIG_USB_STORAGE_DEBUG is not set + # CONFIG_USB_STORAGE_DATAFAB is not set + # CONFIG_USB_STORAGE_FREECOM is not set ++# CONFIG_USB_STORAGE_ISD200 is not set + # CONFIG_USB_STORAGE_DPCM is not set + # CONFIG_USB_STORAGE_USBAT is not set + # CONFIG_USB_STORAGE_SDDR09 is not set +@@ -856,43 +855,10 @@ + # CONFIG_USB_LIBUSUAL 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_TOUCHSCREEN is not set +-# CONFIG_USB_YEALINK is not set +-# CONFIG_USB_XPAD is not set +-# CONFIG_USB_ATI_REMOTE is not set +-# CONFIG_USB_ATI_REMOTE2 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 + # CONFIG_USB_MICROTEK is not set +- +-# +-# 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_MII is not set +-# CONFIG_USB_USBNET is not set + CONFIG_USB_MON=y + + # +@@ -914,6 +880,7 @@ + # CONFIG_USB_RIO500 is not set + # CONFIG_USB_LEGOTOWER is not set + # CONFIG_USB_LCD is not set ++# CONFIG_USB_BERRY_CHARGE is not set + # CONFIG_USB_LED is not set + # CONFIG_USB_CYPRESS_CY7C63 is not set + # CONFIG_USB_CYTHERM is not set +@@ -923,6 +890,7 @@ + # CONFIG_USB_APPLEDISPLAY is not set + # CONFIG_USB_LD is not set + # CONFIG_USB_TRANCEVIBRATOR is not set ++# CONFIG_USB_IOWARRIOR is not set + # CONFIG_USB_TEST is not set + + # +@@ -933,13 +901,19 @@ + # USB Gadget Support + # + CONFIG_USB_GADGET=y ++# CONFIG_USB_GADGET_DEBUG is not set + # CONFIG_USB_GADGET_DEBUG_FILES is not set + CONFIG_USB_GADGET_SELECTED=y ++# CONFIG_USB_GADGET_AMD5536UDC is not set ++# CONFIG_USB_GADGET_ATMEL_USBA is not set ++# CONFIG_USB_GADGET_FSL_USB2 is not set + # CONFIG_USB_GADGET_NET2280 is not set + # CONFIG_USB_GADGET_PXA2XX is not set ++# CONFIG_USB_GADGET_M66592 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_S3C2410 is not set + CONFIG_USB_GADGET_AT91=y + CONFIG_USB_AT91=y + # CONFIG_USB_GADGET_DUMMY_HCD is not set +@@ -951,21 +925,73 @@ + # CONFIG_USB_FILE_STORAGE_TEST is not set + CONFIG_USB_G_SERIAL=m + # CONFIG_USB_MIDI_GADGET is not set ++CONFIG_MMC=y ++# CONFIG_MMC_DEBUG is not set ++# CONFIG_MMC_UNSAFE_RESUME is not set + + # +-# MMC/SD Card support ++# MMC/SD Card Drivers + # +-CONFIG_MMC=y +-# CONFIG_MMC_DEBUG is not set + CONFIG_MMC_BLOCK=y +-CONFIG_MMC_AT91=m +-# CONFIG_MMC_TIFM_SD is not set ++CONFIG_MMC_BLOCK_BOUNCE=y ++# CONFIG_SDIO_UART is not set + + # +-# Real Time Clock ++# MMC/SD Host Controller Drivers + # ++CONFIG_MMC_AT91=m ++# CONFIG_MMC_SPI is not set ++# CONFIG_NEW_LEDS is not set + CONFIG_RTC_LIB=y +-# CONFIG_RTC_CLASS is not set ++CONFIG_RTC_CLASS=y ++CONFIG_RTC_HCTOSYS=y ++CONFIG_RTC_HCTOSYS_DEVICE="rtc0" ++# CONFIG_RTC_DEBUG is not set ++ ++# ++# RTC interfaces ++# ++CONFIG_RTC_INTF_SYSFS=y ++CONFIG_RTC_INTF_PROC=y ++CONFIG_RTC_INTF_DEV=y ++# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set ++# CONFIG_RTC_DRV_TEST is not set ++ ++# ++# I2C RTC drivers ++# ++# CONFIG_RTC_DRV_DS1307 is not set ++# CONFIG_RTC_DRV_DS1374 is not set ++# CONFIG_RTC_DRV_DS1672 is not set ++# CONFIG_RTC_DRV_MAX6900 is not set ++# CONFIG_RTC_DRV_RS5C372 is not set ++# CONFIG_RTC_DRV_ISL1208 is not set ++# CONFIG_RTC_DRV_X1205 is not set ++# CONFIG_RTC_DRV_PCF8563 is not set ++# CONFIG_RTC_DRV_PCF8583 is not set ++# CONFIG_RTC_DRV_M41T80 is not set ++ ++# ++# SPI RTC drivers ++# ++# CONFIG_RTC_DRV_RS5C348 is not set ++# CONFIG_RTC_DRV_MAX6902 is not set ++ ++# ++# Platform RTC drivers ++# ++# CONFIG_RTC_DRV_CMOS is not set ++# CONFIG_RTC_DRV_DS1553 is not set ++# CONFIG_RTC_DRV_STK17TA8 is not set ++# CONFIG_RTC_DRV_DS1742 is not set ++# CONFIG_RTC_DRV_M48T86 is not set ++# CONFIG_RTC_DRV_M48T59 is not set ++# CONFIG_RTC_DRV_V3020 is not set ++ ++# ++# on-CPU RTC drivers ++# ++CONFIG_RTC_DRV_AT91SAM9=y + + # + # File systems +@@ -1016,7 +1042,6 @@ + CONFIG_TMPFS=y + # CONFIG_TMPFS_POSIX_ACL is not set + # CONFIG_HUGETLB_PAGE is not set +-CONFIG_RAMFS=y + # CONFIG_CONFIGFS_FS is not set + + # +@@ -1032,10 +1057,12 @@ + CONFIG_JFFS2_FS=y + CONFIG_JFFS2_FS_DEBUG=0 + CONFIG_JFFS2_FS_WRITEBUFFER=y ++# CONFIG_JFFS2_FS_WBUF_VERIFY is not set + # CONFIG_JFFS2_SUMMARY is not set + # CONFIG_JFFS2_FS_XATTR is not set + # CONFIG_JFFS2_COMPRESSION_OPTIONS is not set + CONFIG_JFFS2_ZLIB=y ++# CONFIG_JFFS2_LZO is not set + CONFIG_JFFS2_RTIME=y + # CONFIG_JFFS2_RUBIN is not set + CONFIG_CRAMFS=y +@@ -1044,10 +1071,7 @@ + # CONFIG_QNX4FS_FS is not set + # CONFIG_SYSV_FS is not set + # CONFIG_UFS_FS is not set +- +-# +-# Network File Systems +-# ++CONFIG_NETWORK_FILESYSTEMS=y + CONFIG_NFS_FS=y + # CONFIG_NFS_V3 is not set + # CONFIG_NFS_V4 is not set +@@ -1057,6 +1081,7 @@ + CONFIG_LOCKD=y + CONFIG_NFS_COMMON=y + CONFIG_SUNRPC=y ++# CONFIG_SUNRPC_BIND34 is not set + # CONFIG_RPCSEC_GSS_KRB5 is not set + # CONFIG_RPCSEC_GSS_SPKM3 is not set + # CONFIG_SMB_FS is not set +@@ -1064,17 +1089,12 @@ + # 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=y + CONFIG_NLS_DEFAULT="iso8859-1" + CONFIG_NLS_CODEPAGE_437=y +@@ -1115,36 +1135,35 @@ + # CONFIG_NLS_KOI8_R is not set + # CONFIG_NLS_KOI8_U is not set + # CONFIG_NLS_UTF8 is not set +- +-# +-# Distributed Lock Manager +-# + # CONFIG_DLM is not set +- +-# +-# Profiling support +-# ++CONFIG_INSTRUMENTATION=y + # CONFIG_PROFILING is not set ++# CONFIG_MARKERS is not set + + # + # Kernel hacking + # + # CONFIG_PRINTK_TIME is not set ++CONFIG_ENABLE_WARN_DEPRECATED=y + CONFIG_ENABLE_MUST_CHECK=y + # CONFIG_MAGIC_SYSRQ is not set + # CONFIG_UNUSED_SYMBOLS is not set + # CONFIG_DEBUG_FS is not set + # CONFIG_HEADERS_CHECK is not set + CONFIG_DEBUG_KERNEL=y +-CONFIG_LOG_BUF_SHIFT=14 ++# CONFIG_DEBUG_SHIRQ is not set + CONFIG_DETECT_SOFTLOCKUP=y ++CONFIG_SCHED_DEBUG=y + # CONFIG_SCHEDSTATS is not set ++# CONFIG_TIMER_STATS is not set + # CONFIG_DEBUG_SLAB is not set + # CONFIG_DEBUG_RT_MUTEXES is not set + # CONFIG_RT_MUTEX_TESTER is not set + # CONFIG_DEBUG_SPINLOCK is not set + # CONFIG_DEBUG_MUTEXES is not set +-# CONFIG_DEBUG_RWSEMS is not set ++# CONFIG_DEBUG_LOCK_ALLOC is not set ++# CONFIG_PROVE_LOCKING is not set ++# CONFIG_LOCK_STAT is not set + # CONFIG_DEBUG_SPINLOCK_SLEEP is not set + # CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set + # CONFIG_DEBUG_KOBJECT is not set +@@ -1152,9 +1171,13 @@ + # CONFIG_DEBUG_INFO is not set + # CONFIG_DEBUG_VM is not set + # CONFIG_DEBUG_LIST is not set ++# CONFIG_DEBUG_SG is not set + CONFIG_FRAME_POINTER=y + CONFIG_FORCED_INLINING=y ++# CONFIG_BOOT_PRINTK_DELAY is not set + # CONFIG_RCU_TORTURE_TEST is not set ++# CONFIG_FAULT_INJECTION is not set ++# CONFIG_SAMPLES is not set + CONFIG_DEBUG_USER=y + # CONFIG_DEBUG_ERRORS is not set + CONFIG_DEBUG_LL=y +@@ -1165,10 +1188,7 @@ + # + # CONFIG_KEYS is not set + # CONFIG_SECURITY is not set +- +-# +-# Cryptographic options +-# ++# CONFIG_SECURITY_FILE_CAPABILITIES is not set + # CONFIG_CRYPTO is not set + + # +@@ -1177,8 +1197,13 @@ + CONFIG_BITREVERSE=y + # CONFIG_CRC_CCITT is not set + # CONFIG_CRC16 is not set ++# CONFIG_CRC_ITU_T is not set + CONFIG_CRC32=y ++# CONFIG_CRC7 is not set + # CONFIG_LIBCRC32C is not set + CONFIG_ZLIB_INFLATE=y ++CONFIG_ZLIB_DEFLATE=y + CONFIG_PLIST=y +-CONFIG_IOMAP_COPY=y ++CONFIG_HAS_IOMEM=y ++CONFIG_HAS_IOPORT=y ++CONFIG_HAS_DMA=y +diff -urN -x CVS linux-2.6.24/arch/arm/configs/at91sam9rlek_defconfig linux-2.6/arch/arm/configs/at91sam9rlek_defconfig +--- linux-2.6.24/arch/arm/configs/at91sam9rlek_defconfig 2007-10-09 22:31:38.000000000 +0200 ++++ linux-2.6/arch/arm/configs/at91sam9rlek_defconfig 2008-01-08 22:24:22.000000000 +0200 +@@ -1,15 +1,18 @@ + # + # Automatically generated make config: don't edit +-# Linux kernel version: 2.6.21 +-# Mon May 7 16:30:40 2007 ++# Linux kernel version: 2.6.24-rc7 ++# Tue Jan 8 22:24:14 2008 + # + CONFIG_ARM=y + CONFIG_SYS_SUPPORTS_APM_EMULATION=y + CONFIG_GENERIC_GPIO=y + # CONFIG_GENERIC_TIME is not set ++# CONFIG_GENERIC_CLOCKEVENTS is not set + CONFIG_MMU=y + # CONFIG_NO_IOPORT is not set + CONFIG_GENERIC_HARDIRQS=y ++CONFIG_STACKTRACE_SUPPORT=y ++CONFIG_LOCKDEP_SUPPORT=y + CONFIG_TRACE_IRQFLAGS_SUPPORT=y + CONFIG_HARDIRQS_SW_RESEND=y + CONFIG_GENERIC_IRQ_PROBE=y +@@ -23,27 +26,28 @@ + CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" + + # +-# Code maturity level options ++# General setup + # + CONFIG_EXPERIMENTAL=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_IPC_NS is not set + CONFIG_SYSVIPC_SYSCTL=y + # CONFIG_POSIX_MQUEUE is not set + # CONFIG_BSD_PROCESS_ACCT is not set + # CONFIG_TASKSTATS is not set +-# CONFIG_UTS_NS is not set ++# CONFIG_USER_NS is not set ++# CONFIG_PID_NS is not set + # CONFIG_AUDIT is not set + # CONFIG_IKCONFIG is not set ++CONFIG_LOG_BUF_SHIFT=14 ++# CONFIG_CGROUPS is not set ++CONFIG_FAIR_GROUP_SCHED=y ++CONFIG_FAIR_USER_SCHED=y ++# CONFIG_FAIR_CGROUP_SCHED is not set + CONFIG_SYSFS_DEPRECATED=y + # CONFIG_RELAY is not set + CONFIG_BLK_DEV_INITRD=y +@@ -62,32 +66,30 @@ + CONFIG_ELF_CORE=y + CONFIG_BASE_FULL=y + CONFIG_FUTEX=y ++CONFIG_ANON_INODES=y + CONFIG_EPOLL=y ++CONFIG_SIGNALFD=y ++CONFIG_EVENTFD=y + CONFIG_SHMEM=y +-CONFIG_SLAB=y + CONFIG_VM_EVENT_COUNTERS=y ++CONFIG_SLAB=y ++# CONFIG_SLUB is not set ++# CONFIG_SLOB is not set ++CONFIG_SLABINFO=y + CONFIG_RT_MUTEXES=y + # CONFIG_TINY_SHMEM is not set + CONFIG_BASE_SMALL=0 +-# CONFIG_SLOB is not set +- +-# +-# Loadable module support +-# + CONFIG_MODULES=y + CONFIG_MODULE_UNLOAD=y + # CONFIG_MODULE_FORCE_UNLOAD is not set + # CONFIG_MODVERSIONS is not set + # CONFIG_MODULE_SRCVERSION_ALL is not set + CONFIG_KMOD=y +- +-# +-# Block layer +-# + CONFIG_BLOCK=y + # CONFIG_LBD is not set + # CONFIG_BLK_DEV_IO_TRACE is not set + # CONFIG_LSF is not set ++# CONFIG_BLK_DEV_BSG is not set + + # + # IO Schedulers +@@ -119,14 +121,16 @@ + # CONFIG_ARCH_NETX is not set + # CONFIG_ARCH_H720X is not set + # CONFIG_ARCH_IMX is not set ++# CONFIG_ARCH_IOP13XX is not set + # CONFIG_ARCH_IOP32X is not set + # CONFIG_ARCH_IOP33X is not set +-# CONFIG_ARCH_IOP13XX is not set +-# CONFIG_ARCH_IXP4XX is not set +-# CONFIG_ARCH_IXP2000 is not set + # CONFIG_ARCH_IXP23XX is not set ++# CONFIG_ARCH_IXP2000 is not set ++# CONFIG_ARCH_IXP4XX is not set + # CONFIG_ARCH_L7200 is not set ++# CONFIG_ARCH_KS8695 is not set + # CONFIG_ARCH_NS9XXX is not set ++# CONFIG_ARCH_MXC is not set + # CONFIG_ARCH_PNX4008 is not set + # CONFIG_ARCH_PXA is not set + # CONFIG_ARCH_RPC is not set +@@ -134,9 +138,18 @@ + # CONFIG_ARCH_S3C2410 is not set + # CONFIG_ARCH_SHARK is not set + # CONFIG_ARCH_LH7A40X is not set ++# CONFIG_ARCH_DAVINCI is not set + # CONFIG_ARCH_OMAP is not set + + # ++# Boot options ++# ++ ++# ++# Power management ++# ++ ++# + # Atmel AT91 System-on-Chip + # + # CONFIG_ARCH_AT91RM9200 is not set +@@ -144,6 +157,8 @@ + # CONFIG_ARCH_AT91SAM9261 is not set + # CONFIG_ARCH_AT91SAM9263 is not set + CONFIG_ARCH_AT91SAM9RL=y ++# CONFIG_ARCH_AT91X40 is not set ++CONFIG_AT91_PMC_UNIT=y + + # + # AT91SAM9RL Board Type +@@ -157,7 +172,9 @@ + # + # AT91 Feature Selections + # +-# CONFIG_AT91_PROGRAMMABLE_CLOCKS is not set ++CONFIG_AT91_PROGRAMMABLE_CLOCKS=y ++# CONFIG_ATMEL_TCLIB is not set ++CONFIG_AT91_TIMER_HZ=100 + + # + # Processor Type +@@ -185,15 +202,14 @@ + # + # Bus support + # +- +-# +-# PCCARD (PCMCIA/CardBus) support +-# ++# CONFIG_PCI_SYSCALL is not set ++# CONFIG_ARCH_SUPPORTS_MSI is not set + # CONFIG_PCCARD is not set + + # + # Kernel Features + # ++# CONFIG_TICK_ONESHOT is not set + # CONFIG_PREEMPT is not set + # CONFIG_NO_IDLE_HZ is not set + CONFIG_HZ=100 +@@ -206,9 +222,12 @@ + CONFIG_FLATMEM=y + CONFIG_FLAT_NODE_MEM_MAP=y + # CONFIG_SPARSEMEM_STATIC is not set ++# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set + CONFIG_SPLIT_PTLOCK_CPUS=4096 + # CONFIG_RESOURCES_64BIT is not set + CONFIG_ZONE_DMA_FLAG=1 ++CONFIG_BOUNCE=y ++CONFIG_VIRT_TO_BUS=y + # CONFIG_LEDS is not set + CONFIG_ALIGNMENT_TRAP=y + +@@ -245,6 +264,7 @@ + # Power management options + # + # CONFIG_PM is not set ++CONFIG_SUSPEND_UP_POSSIBLE=y + + # + # Networking +@@ -254,7 +274,6 @@ + # + # Networking options + # +-# CONFIG_NETDEBUG is not set + # CONFIG_PACKET is not set + CONFIG_UNIX=y + # CONFIG_NET_KEY is not set +@@ -271,10 +290,6 @@ + # CONFIG_X25 is not set + # CONFIG_LAPB is not set + # CONFIG_WAN_ROUTER is not set +- +-# +-# QoS and/or fair queueing +-# + # CONFIG_NET_SCHED is not set + + # +@@ -284,7 +299,16 @@ + # CONFIG_HAMRADIO is not set + # CONFIG_IRDA is not set + # CONFIG_BT is not set ++ ++# ++# Wireless ++# ++# CONFIG_CFG80211 is not set ++# CONFIG_WIRELESS_EXT is not set ++# CONFIG_MAC80211 is not set + # CONFIG_IEEE80211 is not set ++# CONFIG_RFKILL is not set ++# CONFIG_NET_9P is not set + + # + # Device Drivers +@@ -293,21 +317,14 @@ + # + # Generic Driver Options + # ++CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" + CONFIG_STANDALONE=y + CONFIG_PREVENT_FIRMWARE_BUILD=y + # CONFIG_FW_LOADER is not set + # CONFIG_DEBUG_DRIVER is not set + # CONFIG_DEBUG_DEVRES is not set + # CONFIG_SYS_HYPERVISOR 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=y +@@ -327,6 +344,7 @@ + # CONFIG_INFTL is not set + # CONFIG_RFD_FTL is not set + # CONFIG_SSFDC is not set ++# CONFIG_MTD_OOPS is not set + + # + # RAM/ROM/Flash chip drivers +@@ -346,7 +364,6 @@ + # CONFIG_MTD_RAM is not set + # CONFIG_MTD_ROM is not set + # CONFIG_MTD_ABSENT is not set +-# CONFIG_MTD_OBSOLETE_CHIPS is not set + + # + # Mapping drivers for chip access +@@ -370,36 +387,23 @@ + # CONFIG_MTD_DOC2000 is not set + # CONFIG_MTD_DOC2001 is not set + # CONFIG_MTD_DOC2001PLUS is not set +- +-# +-# NAND Flash Device Drivers +-# + CONFIG_MTD_NAND=y + # CONFIG_MTD_NAND_VERIFY_WRITE is not set + # CONFIG_MTD_NAND_ECC_SMC is not set ++# CONFIG_MTD_NAND_MUSEUM_IDS is not set + CONFIG_MTD_NAND_IDS=y + # CONFIG_MTD_NAND_DISKONCHIP is not set + CONFIG_MTD_NAND_AT91=y + # CONFIG_MTD_NAND_NANDSIM is not set +- +-# +-# OneNAND Flash Device Drivers +-# ++# CONFIG_MTD_NAND_PLATFORM is not set + # CONFIG_MTD_ONENAND is not set + + # +-# Parallel port support ++# UBI - Unsorted block images + # ++# CONFIG_MTD_UBI is not set + # CONFIG_PARPORT is not set +- +-# +-# Plug and Play support +-# +-# CONFIG_PNPACPI is not set +- +-# +-# Block devices +-# ++CONFIG_BLK_DEV=y + # CONFIG_BLK_DEV_COW_COMMON is not set + CONFIG_BLK_DEV_LOOP=y + # CONFIG_BLK_DEV_CRYPTOLOOP is not set +@@ -410,12 +414,16 @@ + CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024 + # CONFIG_CDROM_PKTCDVD is not set + # CONFIG_ATA_OVER_ETH is not set ++CONFIG_MISC_DEVICES=y ++# CONFIG_EEPROM_93CX6 is not set ++CONFIG_ATMEL_SSC=y + + # + # SCSI device support + # + # CONFIG_RAID_ATTRS is not set + CONFIG_SCSI=y ++CONFIG_SCSI_DMA=y + # CONFIG_SCSI_TGT is not set + # CONFIG_SCSI_NETLINK is not set + CONFIG_SCSI_PROC_FS=y +@@ -437,6 +445,7 @@ + # CONFIG_SCSI_CONSTANTS is not set + # CONFIG_SCSI_LOGGING is not set + # CONFIG_SCSI_SCAN_ASYNC is not set ++CONFIG_SCSI_WAIT_SCAN=m + + # + # SCSI Transports +@@ -444,47 +453,13 @@ + # CONFIG_SCSI_SPI_ATTRS is not set + # CONFIG_SCSI_FC_ATTRS is not set + # CONFIG_SCSI_ISCSI_ATTRS is not set +-# CONFIG_SCSI_SAS_ATTRS is not set + # CONFIG_SCSI_SAS_LIBSAS is not set +- +-# +-# SCSI low-level drivers +-# ++# CONFIG_SCSI_SRP_ATTRS is not set ++CONFIG_SCSI_LOWLEVEL=y + # CONFIG_SCSI_DEBUG is not set +- +-# +-# Serial ATA (prod) and Parallel ATA (experimental) drivers +-# + # CONFIG_ATA 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 is not set +-# CONFIG_NETPOLL is not set +-# CONFIG_NET_POLL_CONTROLLER is not set +- +-# +-# ISDN subsystem +-# + # CONFIG_ISDN is not set + + # +@@ -492,6 +467,7 @@ + # + CONFIG_INPUT=y + # CONFIG_INPUT_FF_MEMLESS is not set ++# CONFIG_INPUT_POLLDEV is not set + + # + # Userland interfaces +@@ -501,7 +477,6 @@ + CONFIG_INPUT_MOUSEDEV_SCREEN_X=320 + CONFIG_INPUT_MOUSEDEV_SCREEN_Y=240 + # CONFIG_INPUT_JOYDEV is not set +-# CONFIG_INPUT_TSDEV is not set + CONFIG_INPUT_EVDEV=y + # CONFIG_INPUT_EVBUG is not set + +@@ -511,8 +486,10 @@ + # CONFIG_INPUT_KEYBOARD is not set + # CONFIG_INPUT_MOUSE is not set + # CONFIG_INPUT_JOYSTICK is not set ++# CONFIG_INPUT_TABLET is not set + CONFIG_INPUT_TOUCHSCREEN=y + # CONFIG_TOUCHSCREEN_ADS7846 is not set ++# CONFIG_TOUCHSCREEN_FUJITSU is not set + # CONFIG_TOUCHSCREEN_GUNZE is not set + # CONFIG_TOUCHSCREEN_ELO is not set + # CONFIG_TOUCHSCREEN_MTOUCH is not set +@@ -521,6 +498,7 @@ + # CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set + # CONFIG_TOUCHSCREEN_TOUCHWIN is not set + # CONFIG_TOUCHSCREEN_UCB1400 is not set ++# CONFIG_TOUCHSCREEN_USB_COMPOSITE is not set + # CONFIG_INPUT_MISC is not set + + # +@@ -554,37 +532,50 @@ + 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_HW_RANDOM=y ++# CONFIG_HW_RANDOM is not set + # CONFIG_NVRAM is not set +-# CONFIG_DTLK is not set + # CONFIG_R3964 is not set + # CONFIG_RAW_DRIVER is not set +- +-# +-# TPM devices +-# + # CONFIG_TCG_TPM is not set +- +-# +-# I2C support +-# +-# CONFIG_I2C is not set ++CONFIG_I2C=y ++CONFIG_I2C_BOARDINFO=y ++CONFIG_I2C_CHARDEV=y ++ ++# ++# I2C Algorithms ++# ++CONFIG_I2C_ALGOBIT=y ++# CONFIG_I2C_ALGOPCF is not set ++# CONFIG_I2C_ALGOPCA is not set ++ ++# ++# I2C Hardware Bus support ++# ++CONFIG_I2C_GPIO=y ++# CONFIG_I2C_OCORES is not set ++# CONFIG_I2C_PARPORT_LIGHT is not set ++# CONFIG_I2C_SIMTEC is not set ++# CONFIG_I2C_TAOS_EVM is not set ++# CONFIG_I2C_STUB is not set ++# CONFIG_I2C_PCA is not set ++ ++# ++# Miscellaneous I2C Chip support ++# ++# CONFIG_SENSORS_DS1337 is not set ++# CONFIG_SENSORS_DS1374 is not set ++# CONFIG_DS1682 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_MAX6875 is not set ++# CONFIG_SENSORS_TSL2550 is not set ++# CONFIG_I2C_DEBUG_CORE is not set ++# CONFIG_I2C_DEBUG_ALGO is not set ++# CONFIG_I2C_DEBUG_BUS is not set ++# CONFIG_I2C_DEBUG_CHIP is not set + + # + # SPI support +@@ -603,21 +594,25 @@ + # SPI Protocol Masters + # + # CONFIG_SPI_AT25 is not set +- +-# +-# Dallas's 1-wire bus +-# ++# CONFIG_SPI_SPIDEV is not set ++# CONFIG_SPI_TLE62X0 is not set + # CONFIG_W1 is not set ++# CONFIG_POWER_SUPPLY is not set ++# CONFIG_HWMON is not set ++CONFIG_WATCHDOG=y ++CONFIG_WATCHDOG_NOWAYOUT=y + + # +-# Hardware Monitoring support ++# Watchdog Device Drivers + # +-# CONFIG_HWMON is not set +-# CONFIG_HWMON_VID is not set ++# CONFIG_SOFT_WATCHDOG is not set ++CONFIG_AT91SAM9_WATCHDOG=y + + # +-# Misc devices ++# Sonics Silicon Backplane + # ++CONFIG_SSB_POSSIBLE=y ++# CONFIG_SSB is not set + + # + # Multifunction device drivers +@@ -625,37 +620,28 @@ + # CONFIG_MFD_SM501 is not set + + # +-# LED devices +-# +-# CONFIG_NEW_LEDS is not set +- +-# +-# LED drivers +-# +- +-# +-# LED Triggers +-# +- +-# + # Multimedia devices + # + # CONFIG_VIDEO_DEV is not set +- +-# +-# Digital Video Broadcasting Devices +-# ++# CONFIG_DAB is not set + + # + # Graphics support + # +-# CONFIG_BACKLIGHT_LCD_SUPPORT is not set ++# CONFIG_VGASTATE is not set ++# CONFIG_VIDEO_OUTPUT_CONTROL is not set + CONFIG_FB=y + # CONFIG_FIRMWARE_EDID is not set + # CONFIG_FB_DDC is not set + CONFIG_FB_CFB_FILLRECT=y + CONFIG_FB_CFB_COPYAREA=y + CONFIG_FB_CFB_IMAGEBLIT=y ++# CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set ++# CONFIG_FB_SYS_FILLRECT is not set ++# CONFIG_FB_SYS_COPYAREA is not set ++# CONFIG_FB_SYS_IMAGEBLIT is not set ++# CONFIG_FB_SYS_FOPS is not set ++CONFIG_FB_DEFERRED_IO=y + # CONFIG_FB_SVGALIB is not set + # CONFIG_FB_MACMODES is not set + # CONFIG_FB_BACKLIGHT is not set +@@ -665,9 +651,16 @@ + # + # Frame buffer hardware drivers + # ++# CONFIG_FB_S1D15605 is not set + # CONFIG_FB_S1D13XXX is not set + CONFIG_FB_ATMEL=y + # CONFIG_FB_VIRTUAL is not set ++# CONFIG_BACKLIGHT_LCD_SUPPORT is not set ++ ++# ++# Display device support ++# ++# CONFIG_DISPLAY_SUPPORT is not set + + # + # Console display driver support +@@ -675,97 +668,97 @@ + # CONFIG_VGA_CONSOLE is not set + CONFIG_DUMMY_CONSOLE=y + # CONFIG_FRAMEBUFFER_CONSOLE is not set +- +-# +-# Logo configuration +-# + # CONFIG_LOGO is not set + + # + # Sound + # +-CONFIG_SOUND=y +- +-# +-# Advanced Linux Sound Architecture +-# +-CONFIG_SND=y +-CONFIG_SND_TIMER=y +-CONFIG_SND_PCM=y +-CONFIG_SND_SEQUENCER=y +-CONFIG_SND_SEQ_DUMMY=y +-CONFIG_SND_OSSEMUL=y +-CONFIG_SND_MIXER_OSS=y +-CONFIG_SND_PCM_OSS=y +-CONFIG_SND_PCM_OSS_PLUGINS=y +-CONFIG_SND_SEQUENCER_OSS=y +-# CONFIG_SND_DYNAMIC_MINORS is not set +-CONFIG_SND_SUPPORT_OLD_API=y +-CONFIG_SND_VERBOSE_PROCFS=y +-CONFIG_SND_VERBOSE_PRINTK=y +-CONFIG_SND_DEBUG=y +-CONFIG_SND_DEBUG_DETECT=y +-# CONFIG_SND_PCM_XRUN_DEBUG is not set +- +-# +-# Generic devices +-# +-# CONFIG_SND_DUMMY is not set +-# CONFIG_SND_VIRMIDI is not set +-# CONFIG_SND_MTPAV is not set +-# CONFIG_SND_SERIAL_U16550 is not set +-# CONFIG_SND_MPU401 is not set ++# CONFIG_SOUND is not set ++CONFIG_HID_SUPPORT=y ++CONFIG_HID=y ++# CONFIG_HID_DEBUG is not set ++# CONFIG_HIDRAW is not set ++CONFIG_USB_SUPPORT=y ++CONFIG_USB_ARCH_HAS_HCD=y ++CONFIG_USB_ARCH_HAS_OHCI=y ++# CONFIG_USB_ARCH_HAS_EHCI is not set ++# CONFIG_USB is not set + + # +-# ALSA ARM devices ++# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' + # + + # +-# SoC audio support ++# USB Gadget Support + # +-# CONFIG_SND_SOC is not set ++# CONFIG_USB_GADGET is not set ++CONFIG_MMC=y ++# CONFIG_MMC_DEBUG is not set ++# CONFIG_MMC_UNSAFE_RESUME is not set + + # +-# Open Sound System ++# MMC/SD Card Drivers + # +-# CONFIG_SOUND_PRIME is not set ++CONFIG_MMC_BLOCK=y ++CONFIG_MMC_BLOCK_BOUNCE=y ++# CONFIG_SDIO_UART is not set + + # +-# HID Devices ++# MMC/SD Host Controller Drivers + # +-CONFIG_HID=y +-# CONFIG_HID_DEBUG is not set ++CONFIG_MMC_AT91=y ++# CONFIG_MMC_SPI is not set ++# CONFIG_NEW_LEDS is not set ++CONFIG_RTC_LIB=y ++CONFIG_RTC_CLASS=y ++CONFIG_RTC_HCTOSYS=y ++CONFIG_RTC_HCTOSYS_DEVICE="rtc0" ++# CONFIG_RTC_DEBUG is not set + + # +-# USB support ++# RTC interfaces + # +-CONFIG_USB_ARCH_HAS_HCD=y +-CONFIG_USB_ARCH_HAS_OHCI=y +-# CONFIG_USB_ARCH_HAS_EHCI is not set +-# CONFIG_USB is not set ++CONFIG_RTC_INTF_SYSFS=y ++CONFIG_RTC_INTF_PROC=y ++CONFIG_RTC_INTF_DEV=y ++# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set ++# CONFIG_RTC_DRV_TEST is not set + + # +-# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' ++# I2C RTC drivers + # ++# CONFIG_RTC_DRV_DS1307 is not set ++# CONFIG_RTC_DRV_DS1374 is not set ++# CONFIG_RTC_DRV_DS1672 is not set ++# CONFIG_RTC_DRV_MAX6900 is not set ++# CONFIG_RTC_DRV_RS5C372 is not set ++# CONFIG_RTC_DRV_ISL1208 is not set ++# CONFIG_RTC_DRV_X1205 is not set ++# CONFIG_RTC_DRV_PCF8563 is not set ++# CONFIG_RTC_DRV_PCF8583 is not set ++# CONFIG_RTC_DRV_M41T80 is not set + + # +-# USB Gadget Support ++# SPI RTC drivers + # +-# CONFIG_USB_GADGET is not set ++# CONFIG_RTC_DRV_RS5C348 is not set ++# CONFIG_RTC_DRV_MAX6902 is not set + + # +-# MMC/SD Card support ++# Platform RTC drivers + # +-CONFIG_MMC=y +-# CONFIG_MMC_DEBUG is not set +-CONFIG_MMC_BLOCK=y +-CONFIG_MMC_AT91=y ++# CONFIG_RTC_DRV_CMOS is not set ++# CONFIG_RTC_DRV_DS1553 is not set ++# CONFIG_RTC_DRV_STK17TA8 is not set ++# CONFIG_RTC_DRV_DS1742 is not set ++# CONFIG_RTC_DRV_M48T86 is not set ++# CONFIG_RTC_DRV_M48T59 is not set ++# CONFIG_RTC_DRV_V3020 is not set + + # +-# Real Time Clock ++# on-CPU RTC drivers + # +-CONFIG_RTC_LIB=y +-# CONFIG_RTC_CLASS is not set ++CONFIG_RTC_DRV_AT91SAM9=y + + # + # File systems +@@ -816,7 +809,6 @@ + CONFIG_TMPFS=y + # CONFIG_TMPFS_POSIX_ACL is not set + # CONFIG_HUGETLB_PAGE is not set +-CONFIG_RAMFS=y + # CONFIG_CONFIGFS_FS is not set + + # +@@ -836,20 +828,13 @@ + # CONFIG_QNX4FS_FS is not set + # CONFIG_SYSV_FS is not set + # CONFIG_UFS_FS is not set +- +-# +-# Network File Systems +-# ++CONFIG_NETWORK_FILESYSTEMS=y + + # + # Partition Types + # + # CONFIG_PARTITION_ADVANCED is not set + CONFIG_MSDOS_PARTITION=y +- +-# +-# Native Language Support +-# + CONFIG_NLS=y + CONFIG_NLS_DEFAULT="iso8859-1" + CONFIG_NLS_CODEPAGE_437=y +@@ -890,16 +875,15 @@ + # CONFIG_NLS_KOI8_R is not set + # CONFIG_NLS_KOI8_U is not set + CONFIG_NLS_UTF8=y +- +-# +-# Profiling support +-# ++CONFIG_INSTRUMENTATION=y + # CONFIG_PROFILING is not set ++# CONFIG_MARKERS is not set + + # + # Kernel hacking + # + # CONFIG_PRINTK_TIME is not set ++CONFIG_ENABLE_WARN_DEPRECATED=y + CONFIG_ENABLE_MUST_CHECK=y + # CONFIG_MAGIC_SYSRQ is not set + # CONFIG_UNUSED_SYMBOLS is not set +@@ -907,8 +891,8 @@ + # CONFIG_HEADERS_CHECK is not set + CONFIG_DEBUG_KERNEL=y + # CONFIG_DEBUG_SHIRQ is not set +-CONFIG_LOG_BUF_SHIFT=14 + CONFIG_DETECT_SOFTLOCKUP=y ++CONFIG_SCHED_DEBUG=y + # CONFIG_SCHEDSTATS is not set + # CONFIG_TIMER_STATS is not set + # CONFIG_DEBUG_SLAB is not set +@@ -916,6 +900,9 @@ + # CONFIG_RT_MUTEX_TESTER is not set + # CONFIG_DEBUG_SPINLOCK is not set + # CONFIG_DEBUG_MUTEXES is not set ++# CONFIG_DEBUG_LOCK_ALLOC is not set ++# CONFIG_PROVE_LOCKING is not set ++# CONFIG_LOCK_STAT is not set + # CONFIG_DEBUG_SPINLOCK_SLEEP is not set + # CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set + # CONFIG_DEBUG_KOBJECT is not set +@@ -923,10 +910,13 @@ + CONFIG_DEBUG_INFO=y + # CONFIG_DEBUG_VM is not set + # CONFIG_DEBUG_LIST is not set ++# CONFIG_DEBUG_SG is not set + CONFIG_FRAME_POINTER=y + CONFIG_FORCED_INLINING=y ++# CONFIG_BOOT_PRINTK_DELAY is not set + # CONFIG_RCU_TORTURE_TEST is not set + # CONFIG_FAULT_INJECTION is not set ++# CONFIG_SAMPLES is not set + CONFIG_DEBUG_USER=y + # CONFIG_DEBUG_ERRORS is not set + CONFIG_DEBUG_LL=y +@@ -937,10 +927,7 @@ + # + # CONFIG_KEYS is not set + # CONFIG_SECURITY is not set +- +-# +-# Cryptographic options +-# ++# CONFIG_SECURITY_FILE_CAPABILITIES is not set + # CONFIG_CRYPTO is not set + + # +@@ -949,9 +936,12 @@ + CONFIG_BITREVERSE=y + # CONFIG_CRC_CCITT is not set + # CONFIG_CRC16 is not set ++# CONFIG_CRC_ITU_T is not set + CONFIG_CRC32=y ++# CONFIG_CRC7 is not set + # CONFIG_LIBCRC32C is not set + CONFIG_ZLIB_INFLATE=y + CONFIG_PLIST=y + CONFIG_HAS_IOMEM=y + CONFIG_HAS_IOPORT=y ++CONFIG_HAS_DMA=y +diff -urN -x CVS linux-2.6.24/arch/arm/configs/ateb9200_defconfig linux-2.6/arch/arm/configs/ateb9200_defconfig +--- linux-2.6.24/arch/arm/configs/ateb9200_defconfig 2007-10-09 22:31:38.000000000 +0200 ++++ linux-2.6/arch/arm/configs/ateb9200_defconfig 2007-12-31 10:43:35.000000000 +0200 +@@ -714,7 +714,7 @@ + # + # I2C Hardware Bus support + # +-CONFIG_I2C_AT91=m ++CONFIG_I2C_GPIO=m + # CONFIG_I2C_PARPORT_LIGHT is not set + # CONFIG_I2C_STUB is not set + # CONFIG_I2C_PCA_ISA is not set +diff -urN -x CVS linux-2.6.24/arch/arm/configs/cam60_defconfig linux-2.6/arch/arm/configs/cam60_defconfig +--- linux-2.6.24/arch/arm/configs/cam60_defconfig 1970-01-01 02:00:00.000000000 +0200 ++++ linux-2.6/arch/arm/configs/cam60_defconfig 2008-01-11 09:36:44.000000000 +0200 +@@ -0,0 +1,1217 @@ ++# ++# Automatically generated make config: don't edit ++# Linux kernel version: 2.6.23 ++# Wed Jan 9 22:44:49 2008 ++# ++CONFIG_ARM=y ++CONFIG_SYS_SUPPORTS_APM_EMULATION=y ++CONFIG_GENERIC_GPIO=y ++# CONFIG_GENERIC_TIME is not set ++# CONFIG_GENERIC_CLOCKEVENTS is not set ++CONFIG_MMU=y ++# CONFIG_NO_IOPORT is not set ++CONFIG_GENERIC_HARDIRQS=y ++CONFIG_STACKTRACE_SUPPORT=y ++CONFIG_LOCKDEP_SUPPORT=y ++CONFIG_TRACE_IRQFLAGS_SUPPORT=y ++CONFIG_HARDIRQS_SW_RESEND=y ++CONFIG_GENERIC_IRQ_PROBE=y ++CONFIG_RWSEM_GENERIC_SPINLOCK=y ++# CONFIG_ARCH_HAS_ILOG2_U32 is not set ++# CONFIG_ARCH_HAS_ILOG2_U64 is not set ++CONFIG_GENERIC_HWEIGHT=y ++CONFIG_GENERIC_CALIBRATE_DELAY=y ++CONFIG_ZONE_DMA=y ++CONFIG_VECTORS_BASE=0xffff0000 ++CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" ++ ++# ++# General setup ++# ++CONFIG_EXPERIMENTAL=y ++CONFIG_BROKEN_ON_SMP=y ++CONFIG_INIT_ENV_ARG_LIMIT=32 ++CONFIG_LOCALVERSION="" ++# CONFIG_LOCALVERSION_AUTO is not set ++CONFIG_SWAP=y ++CONFIG_SYSVIPC=y ++CONFIG_SYSVIPC_SYSCTL=y ++CONFIG_POSIX_MQUEUE=y ++CONFIG_BSD_PROCESS_ACCT=y ++CONFIG_BSD_PROCESS_ACCT_V3=y ++# CONFIG_TASKSTATS is not set ++# CONFIG_USER_NS is not set ++CONFIG_AUDIT=y ++CONFIG_IKCONFIG=y ++CONFIG_IKCONFIG_PROC=y ++CONFIG_LOG_BUF_SHIFT=17 ++CONFIG_SYSFS_DEPRECATED=y ++CONFIG_RELAY=y ++CONFIG_BLK_DEV_INITRD=y ++CONFIG_INITRAMFS_SOURCE="" ++# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set ++CONFIG_SYSCTL=y ++CONFIG_EMBEDDED=y ++CONFIG_UID16=y ++CONFIG_SYSCTL_SYSCALL=y ++CONFIG_KALLSYMS=y ++CONFIG_KALLSYMS_ALL=y ++# CONFIG_KALLSYMS_EXTRA_PASS is not set ++CONFIG_HOTPLUG=y ++CONFIG_PRINTK=y ++CONFIG_BUG=y ++CONFIG_ELF_CORE=y ++CONFIG_BASE_FULL=y ++CONFIG_FUTEX=y ++CONFIG_ANON_INODES=y ++CONFIG_EPOLL=y ++CONFIG_SIGNALFD=y ++CONFIG_EVENTFD=y ++CONFIG_SHMEM=y ++CONFIG_VM_EVENT_COUNTERS=y ++CONFIG_SLUB_DEBUG=y ++# CONFIG_SLAB is not set ++CONFIG_SLUB=y ++# CONFIG_SLOB is not set ++CONFIG_RT_MUTEXES=y ++# CONFIG_TINY_SHMEM is not set ++CONFIG_BASE_SMALL=0 ++CONFIG_MODULES=y ++CONFIG_MODULE_UNLOAD=y ++# CONFIG_MODULE_FORCE_UNLOAD is not set ++CONFIG_MODVERSIONS=y ++CONFIG_MODULE_SRCVERSION_ALL=y ++CONFIG_KMOD=y ++CONFIG_BLOCK=y ++CONFIG_LBD=y ++CONFIG_BLK_DEV_IO_TRACE=y ++# CONFIG_LSF is not set ++# CONFIG_BLK_DEV_BSG is not set ++ ++# ++# IO Schedulers ++# ++CONFIG_IOSCHED_NOOP=y ++CONFIG_IOSCHED_AS=y ++CONFIG_IOSCHED_DEADLINE=y ++CONFIG_IOSCHED_CFQ=y ++# CONFIG_DEFAULT_AS is not set ++# CONFIG_DEFAULT_DEADLINE is not set ++CONFIG_DEFAULT_CFQ=y ++# CONFIG_DEFAULT_NOOP is not set ++CONFIG_DEFAULT_IOSCHED="cfq" ++ ++# ++# System Type ++# ++# CONFIG_ARCH_AAEC2000 is not set ++# CONFIG_ARCH_INTEGRATOR is not set ++# CONFIG_ARCH_REALVIEW is not set ++# CONFIG_ARCH_VERSATILE is not set ++CONFIG_ARCH_AT91=y ++# CONFIG_ARCH_CLPS7500 is not set ++# CONFIG_ARCH_CLPS711X is not set ++# CONFIG_ARCH_CO285 is not set ++# CONFIG_ARCH_EBSA110 is not set ++# CONFIG_ARCH_EP93XX is not set ++# CONFIG_ARCH_FOOTBRIDGE is not set ++# CONFIG_ARCH_NETX is not set ++# CONFIG_ARCH_H720X is not set ++# CONFIG_ARCH_IMX is not set ++# CONFIG_ARCH_IOP13XX is not set ++# CONFIG_ARCH_IOP32X is not set ++# CONFIG_ARCH_IOP33X is not set ++# CONFIG_ARCH_IXP23XX is not set ++# CONFIG_ARCH_IXP2000 is not set ++# CONFIG_ARCH_IXP4XX is not set ++# CONFIG_ARCH_L7200 is not set ++# CONFIG_ARCH_KS8695 is not set ++# CONFIG_ARCH_NS9XXX is not set ++# CONFIG_ARCH_MXC is not set ++# CONFIG_ARCH_PNX4008 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_DAVINCI is not set ++# CONFIG_ARCH_OMAP is not set ++ ++# ++# Boot options ++# ++ ++# ++# Power management ++# ++ ++# ++# Atmel AT91 System-on-Chip ++# ++# CONFIG_ARCH_AT91RM9200 is not set ++CONFIG_ARCH_AT91SAM9260=y ++# CONFIG_ARCH_AT91SAM9261 is not set ++# CONFIG_ARCH_AT91SAM9263 is not set ++# CONFIG_ARCH_AT91SAM9RL is not set ++ ++# ++# AT91SAM9260 Variants ++# ++# CONFIG_ARCH_AT91SAM9260_SAM9XE is not set ++ ++# ++# AT91SAM9260 / AT91SAM9XE Board Type ++# ++# CONFIG_MACH_AT91SAM9260EK is not set ++CONFIG_MACH_CAM60=y ++# CONFIG_MACH_SAM9_L9260 is not set ++ ++# ++# AT91 Board Options ++# ++ ++# ++# AT91 Feature Selections ++# ++# CONFIG_AT91_PROGRAMMABLE_CLOCKS is not set ++# CONFIG_ATMEL_TCLIB is not set ++CONFIG_AT91_TIMER_HZ=100 ++ ++# ++# Processor Type ++# ++CONFIG_CPU_32=y ++CONFIG_CPU_ARM926T=y ++CONFIG_CPU_32v5=y ++CONFIG_CPU_ABRT_EV5TJ=y ++CONFIG_CPU_CACHE_VIVT=y ++CONFIG_CPU_COPY_V4WB=y ++CONFIG_CPU_TLB_V4WBI=y ++CONFIG_CPU_CP15=y ++CONFIG_CPU_CP15_MMU=y ++ ++# ++# Processor Features ++# ++CONFIG_ARM_THUMB=y ++# CONFIG_CPU_ICACHE_DISABLE is not set ++# CONFIG_CPU_DCACHE_DISABLE is not set ++# CONFIG_CPU_DCACHE_WRITETHROUGH is not set ++# CONFIG_CPU_CACHE_ROUND_ROBIN is not set ++# CONFIG_OUTER_CACHE is not set ++ ++# ++# Bus support ++# ++# CONFIG_PCI_SYSCALL is not set ++# CONFIG_ARCH_SUPPORTS_MSI is not set ++ ++# ++# PCCARD (PCMCIA/CardBus) support ++# ++CONFIG_PCCARD=m ++# CONFIG_PCMCIA_DEBUG is not set ++CONFIG_PCMCIA=m ++CONFIG_PCMCIA_LOAD_CIS=y ++CONFIG_PCMCIA_IOCTL=y ++ ++# ++# PC-card bridges ++# ++ ++# ++# Kernel Features ++# ++# CONFIG_TICK_ONESHOT is not set ++# CONFIG_PREEMPT is not set ++# CONFIG_NO_IDLE_HZ is not set ++CONFIG_HZ=100 ++# CONFIG_AEABI 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_RESOURCES_64BIT is not set ++CONFIG_ZONE_DMA_FLAG=1 ++CONFIG_BOUNCE=y ++CONFIG_VIRT_TO_BUS=y ++# CONFIG_LEDS is not set ++CONFIG_ALIGNMENT_TRAP=y ++ ++# ++# Boot options ++# ++CONFIG_ZBOOT_ROM_TEXT=0 ++CONFIG_ZBOOT_ROM_BSS=0x20004000 ++# CONFIG_ZBOOT_ROM is not set ++CONFIG_CMDLINE="console=ttyS0,115200 noinitrd root=/dev/mtdblock0 rootfstype=jffs2 mem=64M" ++# CONFIG_XIP_KERNEL is not set ++CONFIG_KEXEC=y ++ ++# ++# 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 ++# CONFIG_VFP is not set ++ ++# ++# Userspace binary formats ++# ++CONFIG_BINFMT_ELF=y ++CONFIG_BINFMT_AOUT=y ++CONFIG_BINFMT_MISC=y ++# CONFIG_ARTHUR is not set ++ ++# ++# Power management options ++# ++# CONFIG_PM is not set ++CONFIG_SUSPEND_UP_POSSIBLE=y ++ ++# ++# 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=y ++# CONFIG_IP_ADVANCED_ROUTER is not set ++CONFIG_IP_FIB_HASH=y ++CONFIG_IP_PNP=y ++CONFIG_IP_PNP_DHCP=y ++# CONFIG_IP_PNP_BOOTP is not set ++# CONFIG_IP_PNP_RARP is not set ++# CONFIG_NET_IPIP is not set ++# CONFIG_NET_IPGRE is not set ++# CONFIG_IP_MROUTE is not set ++# CONFIG_ARPD is not set ++# CONFIG_SYN_COOKIES is not set ++# CONFIG_INET_AH is not set ++# CONFIG_INET_ESP is not set ++# CONFIG_INET_IPCOMP is not set ++# CONFIG_INET_XFRM_TUNNEL is not set ++# CONFIG_INET_TUNNEL is not set ++# CONFIG_INET_XFRM_MODE_TRANSPORT is not set ++# CONFIG_INET_XFRM_MODE_TUNNEL is not set ++# CONFIG_INET_XFRM_MODE_BEET is not set ++# CONFIG_INET_DIAG is not set ++# CONFIG_TCP_CONG_ADVANCED is not set ++CONFIG_TCP_CONG_CUBIC=y ++CONFIG_DEFAULT_TCP_CONG="cubic" ++# CONFIG_TCP_MD5SIG is not set ++# CONFIG_IPV6 is not set ++# CONFIG_INET6_XFRM_TUNNEL is not set ++# CONFIG_INET6_TUNNEL is not set ++CONFIG_NETWORK_SECMARK=y ++# CONFIG_NETFILTER is not set ++# CONFIG_IP_DCCP is not set ++# CONFIG_IP_SCTP is not set ++# CONFIG_TIPC is not set ++# CONFIG_ATM is not set ++# CONFIG_BRIDGE is not set ++# CONFIG_VLAN_8021Q is not set ++# CONFIG_DECNET is not set ++# CONFIG_LLC2 is not set ++# CONFIG_IPX is not set ++# CONFIG_ATALK is not set ++# CONFIG_X25 is not set ++# CONFIG_LAPB is not set ++# CONFIG_ECONET is not set ++# CONFIG_WAN_ROUTER is not set ++ ++# ++# QoS and/or fair queueing ++# ++# CONFIG_NET_SCHED is not set ++CONFIG_NET_SCH_FIFO=y ++ ++# ++# Network testing ++# ++# CONFIG_NET_PKTGEN is not set ++# CONFIG_HAMRADIO is not set ++# CONFIG_IRDA is not set ++# CONFIG_BT is not set ++# CONFIG_AF_RXRPC is not set ++ ++# ++# Wireless ++# ++CONFIG_CFG80211=m ++CONFIG_WIRELESS_EXT=y ++CONFIG_MAC80211=m ++# CONFIG_MAC80211_DEBUGFS is not set ++# CONFIG_MAC80211_DEBUG is not set ++CONFIG_IEEE80211=m ++# CONFIG_IEEE80211_DEBUG is not set ++CONFIG_IEEE80211_CRYPT_WEP=m ++CONFIG_IEEE80211_CRYPT_CCMP=m ++CONFIG_IEEE80211_CRYPT_TKIP=m ++CONFIG_IEEE80211_SOFTMAC=m ++# CONFIG_IEEE80211_SOFTMAC_DEBUG is not set ++# CONFIG_RFKILL is not set ++# CONFIG_NET_9P is not set ++ ++# ++# Device Drivers ++# ++ ++# ++# Generic Driver Options ++# ++CONFIG_STANDALONE=y ++CONFIG_PREVENT_FIRMWARE_BUILD=y ++CONFIG_FW_LOADER=m ++# CONFIG_DEBUG_DRIVER is not set ++# CONFIG_DEBUG_DEVRES is not set ++# CONFIG_SYS_HYPERVISOR is not set ++# CONFIG_CONNECTOR is not set ++CONFIG_MTD=y ++# CONFIG_MTD_DEBUG is not set ++CONFIG_MTD_CONCAT=y ++CONFIG_MTD_PARTITIONS=y ++# CONFIG_MTD_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_BLKDEVS=y ++CONFIG_MTD_BLOCK=y ++# CONFIG_FTL is not set ++# CONFIG_NFTL is not set ++# CONFIG_INFTL is not set ++# CONFIG_RFD_FTL is not set ++# CONFIG_SSFDC is not set ++ ++# ++# RAM/ROM/Flash chip drivers ++# ++# CONFIG_MTD_CFI is not set ++# CONFIG_MTD_JEDECPROBE is not set ++CONFIG_MTD_MAP_BANK_WIDTH_1=y ++CONFIG_MTD_MAP_BANK_WIDTH_2=y ++CONFIG_MTD_MAP_BANK_WIDTH_4=y ++# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set ++# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set ++# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set ++CONFIG_MTD_CFI_I1=y ++CONFIG_MTD_CFI_I2=y ++# CONFIG_MTD_CFI_I4 is not set ++# CONFIG_MTD_CFI_I8 is not set ++CONFIG_MTD_RAM=m ++# CONFIG_MTD_ROM is not set ++# CONFIG_MTD_ABSENT is not set ++ ++# ++# Mapping drivers for chip access ++# ++CONFIG_MTD_COMPLEX_MAPPINGS=y ++CONFIG_MTD_PLATRAM=m ++ ++# ++# Self-contained MTD device drivers ++# ++CONFIG_MTD_DATAFLASH=y ++# CONFIG_MTD_M25P80 is not set ++# CONFIG_MTD_SLRAM is not set ++# CONFIG_MTD_PHRAM is not set ++# CONFIG_MTD_MTDRAM is not set ++CONFIG_MTD_BLOCK2MTD=y ++ ++# ++# Disk-On-Chip Device Drivers ++# ++# CONFIG_MTD_DOC2000 is not set ++# CONFIG_MTD_DOC2001 is not set ++# CONFIG_MTD_DOC2001PLUS is not set ++CONFIG_MTD_NAND=y ++CONFIG_MTD_NAND_VERIFY_WRITE=y ++# CONFIG_MTD_NAND_ECC_SMC is not set ++# CONFIG_MTD_NAND_MUSEUM_IDS is not set ++CONFIG_MTD_NAND_IDS=y ++# CONFIG_MTD_NAND_DISKONCHIP is not set ++CONFIG_MTD_NAND_AT91=y ++# CONFIG_MTD_NAND_NANDSIM is not set ++# CONFIG_MTD_NAND_PLATFORM is not set ++# CONFIG_MTD_ONENAND is not set ++ ++# ++# UBI - Unsorted block images ++# ++# CONFIG_MTD_UBI is not set ++# CONFIG_PARPORT is not set ++CONFIG_BLK_DEV=y ++# CONFIG_BLK_DEV_COW_COMMON is not set ++CONFIG_BLK_DEV_LOOP=y ++# CONFIG_BLK_DEV_CRYPTOLOOP is not set ++# CONFIG_BLK_DEV_NBD 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=4096 ++CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024 ++# CONFIG_CDROM_PKTCDVD is not set ++# CONFIG_ATA_OVER_ETH is not set ++# CONFIG_IDE is not set ++ ++# ++# SCSI device support ++# ++# CONFIG_RAID_ATTRS is not set ++CONFIG_SCSI=y ++CONFIG_SCSI_DMA=y ++CONFIG_SCSI_TGT=y ++CONFIG_SCSI_NETLINK=y ++CONFIG_SCSI_PROC_FS=y ++ ++# ++# SCSI support type (disk, tape, CD-ROM) ++# ++CONFIG_BLK_DEV_SD=y ++# CONFIG_CHR_DEV_ST is not set ++# CONFIG_CHR_DEV_OSST is not set ++# CONFIG_BLK_DEV_SR is not set ++CONFIG_CHR_DEV_SG=y ++CONFIG_CHR_DEV_SCH=y ++ ++# ++# Some SCSI devices (e.g. CD jukebox) support multiple LUNs ++# ++CONFIG_SCSI_MULTI_LUN=y ++# CONFIG_SCSI_CONSTANTS is not set ++CONFIG_SCSI_LOGGING=y ++CONFIG_SCSI_SCAN_ASYNC=y ++CONFIG_SCSI_WAIT_SCAN=m ++ ++# ++# SCSI Transports ++# ++CONFIG_SCSI_SPI_ATTRS=m ++CONFIG_SCSI_FC_ATTRS=m ++CONFIG_SCSI_ISCSI_ATTRS=m ++CONFIG_SCSI_SAS_ATTRS=m ++CONFIG_SCSI_SAS_LIBSAS=m ++# CONFIG_SCSI_SAS_LIBSAS_DEBUG is not set ++# CONFIG_SCSI_LOWLEVEL is not set ++# CONFIG_SCSI_LOWLEVEL_PCMCIA is not set ++# CONFIG_ATA is not set ++# CONFIG_MD is not set ++CONFIG_NETDEVICES=y ++# CONFIG_NETDEVICES_MULTIQUEUE is not set ++# CONFIG_DUMMY is not set ++# CONFIG_BONDING is not set ++# CONFIG_MACVLAN is not set ++# CONFIG_EQUALIZER is not set ++# CONFIG_TUN is not set ++CONFIG_PHYLIB=y ++ ++# ++# MII PHY device drivers ++# ++CONFIG_MARVELL_PHY=m ++CONFIG_DAVICOM_PHY=m ++CONFIG_QSEMI_PHY=m ++CONFIG_LXT_PHY=m ++CONFIG_CICADA_PHY=m ++CONFIG_VITESSE_PHY=m ++CONFIG_SMSC_PHY=m ++CONFIG_BROADCOM_PHY=m ++# CONFIG_ICPLUS_PHY is not set ++CONFIG_FIXED_PHY=m ++# CONFIG_FIXED_MII_10_FDX is not set ++# CONFIG_FIXED_MII_100_FDX is not set ++CONFIG_NET_ETHERNET=y ++CONFIG_MII=m ++CONFIG_MACB=y ++# CONFIG_AX88796 is not set ++# CONFIG_SMC91X is not set ++# CONFIG_DM9000 is not set ++# CONFIG_NETDEV_1000 is not set ++# CONFIG_NETDEV_10000 is not set ++ ++# ++# Wireless LAN ++# ++# CONFIG_WLAN_PRE80211 is not set ++# CONFIG_WLAN_80211 is not set ++ ++# ++# 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_MII is not set ++# CONFIG_USB_USBNET is not set ++# CONFIG_NET_PCMCIA is not set ++# 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 ++# CONFIG_ISDN is not set ++ ++# ++# Input device support ++# ++CONFIG_INPUT=y ++# CONFIG_INPUT_FF_MEMLESS is not set ++# CONFIG_INPUT_POLLDEV is not set ++ ++# ++# Userland interfaces ++# ++CONFIG_INPUT_MOUSEDEV=y ++CONFIG_INPUT_MOUSEDEV_PSAUX=y ++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=y ++# CONFIG_INPUT_EVBUG is not set ++ ++# ++# Input Device Drivers ++# ++CONFIG_INPUT_KEYBOARD=y ++CONFIG_KEYBOARD_ATKBD=y ++CONFIG_KEYBOARD_SUNKBD=m ++CONFIG_KEYBOARD_LKKBD=m ++CONFIG_KEYBOARD_XTKBD=m ++CONFIG_KEYBOARD_NEWTON=m ++CONFIG_KEYBOARD_STOWAWAY=m ++# CONFIG_KEYBOARD_GPIO is not set ++CONFIG_INPUT_MOUSE=y ++CONFIG_MOUSE_PS2=y ++CONFIG_MOUSE_PS2_ALPS=y ++CONFIG_MOUSE_PS2_LOGIPS2PP=y ++CONFIG_MOUSE_PS2_SYNAPTICS=y ++CONFIG_MOUSE_PS2_LIFEBOOK=y ++CONFIG_MOUSE_PS2_TRACKPOINT=y ++# CONFIG_MOUSE_PS2_TOUCHKIT is not set ++CONFIG_MOUSE_SERIAL=m ++CONFIG_MOUSE_APPLETOUCH=m ++CONFIG_MOUSE_VSXXXAA=m ++# CONFIG_MOUSE_GPIO is not set ++# CONFIG_INPUT_JOYSTICK is not set ++# CONFIG_INPUT_TABLET is not set ++# CONFIG_INPUT_TOUCHSCREEN is not set ++# CONFIG_INPUT_MISC is not set ++ ++# ++# Hardware I/O ports ++# ++CONFIG_SERIO=y ++# CONFIG_SERIO_SERPORT is not set ++CONFIG_SERIO_LIBPS2=y ++# CONFIG_SERIO_RAW is not set ++# CONFIG_GAMEPORT is not set ++ ++# ++# Character devices ++# ++CONFIG_VT=y ++CONFIG_VT_CONSOLE=y ++CONFIG_HW_CONSOLE=y ++CONFIG_VT_HW_CONSOLE_BINDING=y ++CONFIG_SERIAL_NONSTANDARD=y ++# CONFIG_MOXA_SMARTIO is not set ++# CONFIG_N_HDLC is not set ++# CONFIG_RISCOM8 is not set ++# CONFIG_SPECIALIX is not set ++# CONFIG_RIO is not set ++# CONFIG_STALDRV is not set ++ ++# ++# Serial drivers ++# ++# CONFIG_SERIAL_8250 is not set ++ ++# ++# Non-8250 serial port support ++# ++CONFIG_SERIAL_ATMEL=y ++CONFIG_SERIAL_ATMEL_CONSOLE=y ++# CONFIG_SERIAL_ATMEL_TTYAT is not set ++CONFIG_SERIAL_CORE=y ++CONFIG_SERIAL_CORE_CONSOLE=y ++CONFIG_UNIX98_PTYS=y ++# CONFIG_LEGACY_PTYS is not set ++# CONFIG_IPMI_HANDLER is not set ++# CONFIG_WATCHDOG is not set ++CONFIG_HW_RANDOM=y ++# CONFIG_NVRAM is not set ++# CONFIG_R3964 is not set ++ ++# ++# PCMCIA character devices ++# ++# CONFIG_SYNCLINK_CS is not set ++# CONFIG_CARDMAN_4000 is not set ++# CONFIG_CARDMAN_4040 is not set ++# CONFIG_RAW_DRIVER is not set ++# CONFIG_TCG_TPM is not set ++CONFIG_I2C=y ++CONFIG_I2C_BOARDINFO=y ++CONFIG_I2C_CHARDEV=y ++ ++# ++# I2C Algorithms ++# ++CONFIG_I2C_ALGOBIT=y ++# CONFIG_I2C_ALGOPCF is not set ++# CONFIG_I2C_ALGOPCA is not set ++ ++# ++# I2C Hardware Bus support ++# ++# CONFIG_I2C_AT91 is not set ++# CONFIG_I2C_GPIO is not set ++# CONFIG_I2C_OCORES is not set ++# CONFIG_I2C_PARPORT_LIGHT is not set ++# CONFIG_I2C_SIMTEC is not set ++# CONFIG_I2C_TAOS_EVM is not set ++# CONFIG_I2C_STUB is not set ++# CONFIG_I2C_TINY_USB is not set ++# CONFIG_I2C_PCA is not set ++ ++# ++# Miscellaneous I2C Chip support ++# ++# CONFIG_SENSORS_DS1337 is not set ++# CONFIG_SENSORS_DS1374 is not set ++# CONFIG_DS1682 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_MAX6875 is not set ++# CONFIG_SENSORS_TSL2550 is not set ++# CONFIG_I2C_DEBUG_CORE is not set ++# CONFIG_I2C_DEBUG_ALGO is not set ++# CONFIG_I2C_DEBUG_BUS is not set ++# CONFIG_I2C_DEBUG_CHIP is not set ++ ++# ++# SPI support ++# ++CONFIG_SPI=y ++# CONFIG_SPI_DEBUG is not set ++CONFIG_SPI_MASTER=y ++ ++# ++# SPI Master Controller Drivers ++# ++CONFIG_SPI_ATMEL=y ++# CONFIG_SPI_BITBANG is not set ++ ++# ++# SPI Protocol Masters ++# ++# CONFIG_SPI_AT25 is not set ++# CONFIG_SPI_SPIDEV is not set ++# CONFIG_SPI_TLE62X0 is not set ++# CONFIG_W1 is not set ++# CONFIG_HWMON is not set ++# CONFIG_MISC_DEVICES is not set ++ ++# ++# Multifunction device drivers ++# ++# CONFIG_MFD_SM501 is not set ++# CONFIG_NEW_LEDS is not set ++ ++# ++# Multimedia devices ++# ++# CONFIG_VIDEO_DEV is not set ++# CONFIG_DVB_CORE is not set ++# CONFIG_DAB is not set ++ ++# ++# Graphics support ++# ++# CONFIG_BACKLIGHT_LCD_SUPPORT is not set ++ ++# ++# Display device support ++# ++# CONFIG_DISPLAY_SUPPORT is not set ++# CONFIG_VGASTATE is not set ++# CONFIG_VIDEO_OUTPUT_CONTROL is not set ++# CONFIG_FB is not set ++ ++# ++# Console display driver support ++# ++# CONFIG_VGA_CONSOLE is not set ++CONFIG_DUMMY_CONSOLE=y ++ ++# ++# Sound ++# ++# CONFIG_SOUND is not set ++# CONFIG_HID_SUPPORT is not set ++CONFIG_USB_SUPPORT=y ++CONFIG_USB_ARCH_HAS_HCD=y ++CONFIG_USB_ARCH_HAS_OHCI=y ++# CONFIG_USB_ARCH_HAS_EHCI is not set ++CONFIG_USB=y ++# CONFIG_USB_DEBUG is not set ++ ++# ++# Miscellaneous USB options ++# ++CONFIG_USB_DEVICEFS=y ++CONFIG_USB_DEVICE_CLASS=y ++# 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_DESC is not set ++# CONFIG_USB_OHCI_BIG_ENDIAN_MMIO is not set ++CONFIG_USB_OHCI_LITTLE_ENDIAN=y ++# CONFIG_USB_SL811_HCD is not set ++# CONFIG_USB_R8A66597_HCD is not set ++ ++# ++# 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=y ++# CONFIG_USB_STORAGE_DEBUG is not set ++# CONFIG_USB_STORAGE_DATAFAB is not set ++# CONFIG_USB_STORAGE_FREECOM is not set ++# CONFIG_USB_STORAGE_DPCM is not set ++# CONFIG_USB_STORAGE_USBAT is not set ++# CONFIG_USB_STORAGE_SDDR09 is not set ++# CONFIG_USB_STORAGE_SDDR55 is not set ++# CONFIG_USB_STORAGE_JUMPSHOT is not set ++# CONFIG_USB_STORAGE_ALAUDA is not set ++# CONFIG_USB_STORAGE_ONETOUCH is not set ++# CONFIG_USB_STORAGE_KARMA is not set ++CONFIG_USB_LIBUSUAL=y ++ ++# ++# USB Imaging devices ++# ++# CONFIG_USB_MDC800 is not set ++# CONFIG_USB_MICROTEK is not set ++# CONFIG_USB_MON is not set ++ ++# ++# 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_ADUTUX 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_BERRY_CHARGE is not set ++# CONFIG_USB_LED is not set ++# CONFIG_USB_CYPRESS_CY7C63 is not set ++# CONFIG_USB_CYTHERM is not set ++# CONFIG_USB_PHIDGET is not set ++# CONFIG_USB_IDMOUSE is not set ++# CONFIG_USB_FTDI_ELAN is not set ++# CONFIG_USB_APPLEDISPLAY is not set ++# CONFIG_USB_LD is not set ++# CONFIG_USB_TRANCEVIBRATOR is not set ++# CONFIG_USB_IOWARRIOR is not set ++# CONFIG_USB_TEST is not set ++ ++# ++# USB DSL modem support ++# ++ ++# ++# USB Gadget Support ++# ++# CONFIG_USB_GADGET is not set ++# CONFIG_MMC is not set ++CONFIG_RTC_LIB=y ++CONFIG_RTC_CLASS=y ++CONFIG_RTC_HCTOSYS=y ++CONFIG_RTC_HCTOSYS_DEVICE="rtc0" ++# CONFIG_RTC_DEBUG is not set ++ ++# ++# RTC interfaces ++# ++CONFIG_RTC_INTF_SYSFS=y ++CONFIG_RTC_INTF_PROC=y ++CONFIG_RTC_INTF_DEV=y ++CONFIG_RTC_INTF_DEV_UIE_EMUL=y ++CONFIG_RTC_DRV_TEST=m ++ ++# ++# I2C RTC drivers ++# ++# CONFIG_RTC_DRV_DS1307 is not set ++# CONFIG_RTC_DRV_DS1672 is not set ++# CONFIG_RTC_DRV_MAX6900 is not set ++# CONFIG_RTC_DRV_RS5C372 is not set ++# CONFIG_RTC_DRV_ISL1208 is not set ++# CONFIG_RTC_DRV_X1205 is not set ++# CONFIG_RTC_DRV_PCF8563 is not set ++# CONFIG_RTC_DRV_PCF8583 is not set ++# CONFIG_RTC_DRV_M41T80 is not set ++ ++# ++# SPI RTC drivers ++# ++# CONFIG_RTC_DRV_RS5C348 is not set ++# CONFIG_RTC_DRV_MAX6902 is not set ++ ++# ++# Platform RTC drivers ++# ++# CONFIG_RTC_DRV_CMOS is not set ++# CONFIG_RTC_DRV_DS1553 is not set ++# CONFIG_RTC_DRV_STK17TA8 is not set ++# CONFIG_RTC_DRV_DS1742 is not set ++# CONFIG_RTC_DRV_M48T86 is not set ++# CONFIG_RTC_DRV_M48T59 is not set ++# CONFIG_RTC_DRV_V3020 is not set ++ ++# ++# on-CPU RTC drivers ++# ++CONFIG_RTC_DRV_AT91SAM9=y ++ ++# ++# DMA Engine support ++# ++# CONFIG_DMA_ENGINE is not set ++ ++# ++# DMA Clients ++# ++ ++# ++# DMA Devices ++# ++ ++# ++# File systems ++# ++CONFIG_EXT2_FS=y ++CONFIG_EXT2_FS_XATTR=y ++CONFIG_EXT2_FS_POSIX_ACL=y ++# CONFIG_EXT2_FS_SECURITY is not set ++# CONFIG_EXT2_FS_XIP is not set ++CONFIG_EXT3_FS=y ++CONFIG_EXT3_FS_XATTR=y ++# CONFIG_EXT3_FS_POSIX_ACL is not set ++# CONFIG_EXT3_FS_SECURITY is not set ++# CONFIG_EXT4DEV_FS is not set ++CONFIG_JBD=y ++# CONFIG_JBD_DEBUG is not set ++CONFIG_FS_MBCACHE=y ++# CONFIG_REISERFS_FS is not set ++# CONFIG_JFS_FS is not set ++CONFIG_FS_POSIX_ACL=y ++# CONFIG_XFS_FS is not set ++# CONFIG_GFS2_FS is not set ++# CONFIG_OCFS2_FS is not set ++# CONFIG_MINIX_FS is not set ++# CONFIG_ROMFS_FS is not set ++CONFIG_INOTIFY=y ++CONFIG_INOTIFY_USER=y ++CONFIG_QUOTA=y ++# CONFIG_QFMT_V1 is not set ++# CONFIG_QFMT_V2 is not set ++CONFIG_QUOTACTL=y ++CONFIG_DNOTIFY=y ++CONFIG_AUTOFS_FS=y ++CONFIG_AUTOFS4_FS=y ++# 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_FAT_FS=y ++CONFIG_MSDOS_FS=y ++CONFIG_VFAT_FS=y ++CONFIG_FAT_DEFAULT_CODEPAGE=437 ++CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" ++# CONFIG_NTFS_FS is not set ++ ++# ++# Pseudo filesystems ++# ++CONFIG_PROC_FS=y ++CONFIG_PROC_SYSCTL=y ++CONFIG_SYSFS=y ++CONFIG_TMPFS=y ++# CONFIG_TMPFS_POSIX_ACL is not set ++# CONFIG_HUGETLB_PAGE is not set ++CONFIG_RAMFS=y ++CONFIG_CONFIGFS_FS=y ++ ++# ++# 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_JFFS2_FS=y ++CONFIG_JFFS2_FS_DEBUG=0 ++CONFIG_JFFS2_FS_WRITEBUFFER=y ++# CONFIG_JFFS2_SUMMARY is not set ++# CONFIG_JFFS2_FS_XATTR is not set ++# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set ++CONFIG_JFFS2_ZLIB=y ++CONFIG_JFFS2_RTIME=y ++# CONFIG_JFFS2_RUBIN 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=y ++CONFIG_NFS_V3=y ++# CONFIG_NFS_V3_ACL is not set ++# CONFIG_NFS_V4 is not set ++# CONFIG_NFS_DIRECTIO is not set ++# CONFIG_NFSD is not set ++CONFIG_ROOT_NFS=y ++CONFIG_LOCKD=y ++CONFIG_LOCKD_V4=y ++CONFIG_NFS_COMMON=y ++CONFIG_SUNRPC=y ++# CONFIG_SUNRPC_BIND34 is not set ++# CONFIG_RPCSEC_GSS_KRB5 is not set ++# CONFIG_RPCSEC_GSS_SPKM3 is not set ++# CONFIG_SMB_FS is not set ++# CONFIG_CIFS is not set ++# CONFIG_NCP_FS is not set ++# CONFIG_CODA_FS is not set ++# CONFIG_AFS_FS is not set ++ ++# ++# Partition Types ++# ++# CONFIG_PARTITION_ADVANCED is not set ++CONFIG_MSDOS_PARTITION=y ++ ++# ++# Native Language Support ++# ++CONFIG_NLS=y ++CONFIG_NLS_DEFAULT="cp437" ++CONFIG_NLS_CODEPAGE_437=y ++# CONFIG_NLS_CODEPAGE_737 is not set ++# CONFIG_NLS_CODEPAGE_775 is not set ++# CONFIG_NLS_CODEPAGE_850 is not set ++# CONFIG_NLS_CODEPAGE_852 is not set ++# CONFIG_NLS_CODEPAGE_855 is not set ++# CONFIG_NLS_CODEPAGE_857 is not set ++# CONFIG_NLS_CODEPAGE_860 is not set ++# CONFIG_NLS_CODEPAGE_861 is not set ++# CONFIG_NLS_CODEPAGE_862 is not set ++# CONFIG_NLS_CODEPAGE_863 is not set ++# CONFIG_NLS_CODEPAGE_864 is not set ++# CONFIG_NLS_CODEPAGE_865 is not set ++# CONFIG_NLS_CODEPAGE_866 is not set ++# CONFIG_NLS_CODEPAGE_869 is not set ++# CONFIG_NLS_CODEPAGE_936 is not set ++# CONFIG_NLS_CODEPAGE_950 is not set ++# CONFIG_NLS_CODEPAGE_932 is not set ++# CONFIG_NLS_CODEPAGE_949 is not set ++# CONFIG_NLS_CODEPAGE_874 is not set ++# CONFIG_NLS_ISO8859_8 is not set ++# CONFIG_NLS_CODEPAGE_1250 is not set ++# CONFIG_NLS_CODEPAGE_1251 is not set ++CONFIG_NLS_ASCII=y ++CONFIG_NLS_ISO8859_1=y ++# CONFIG_NLS_ISO8859_2 is not set ++# CONFIG_NLS_ISO8859_3 is not set ++# CONFIG_NLS_ISO8859_4 is not set ++# CONFIG_NLS_ISO8859_5 is not set ++# CONFIG_NLS_ISO8859_6 is not set ++# CONFIG_NLS_ISO8859_7 is not set ++# CONFIG_NLS_ISO8859_9 is not set ++# CONFIG_NLS_ISO8859_13 is not set ++# CONFIG_NLS_ISO8859_14 is not set ++# CONFIG_NLS_ISO8859_15 is not set ++# CONFIG_NLS_KOI8_R is not set ++# CONFIG_NLS_KOI8_U is not set ++CONFIG_NLS_UTF8=y ++ ++# ++# Distributed Lock Manager ++# ++# CONFIG_DLM is not set ++ ++# ++# Profiling support ++# ++# CONFIG_PROFILING is not set ++ ++# ++# Kernel hacking ++# ++CONFIG_PRINTK_TIME=y ++# CONFIG_ENABLE_MUST_CHECK is not set ++CONFIG_MAGIC_SYSRQ=y ++CONFIG_UNUSED_SYMBOLS=y ++CONFIG_DEBUG_FS=y ++# CONFIG_HEADERS_CHECK is not set ++CONFIG_DEBUG_KERNEL=y ++# CONFIG_DEBUG_SHIRQ is not set ++CONFIG_DETECT_SOFTLOCKUP=y ++CONFIG_SCHED_DEBUG=y ++# CONFIG_SCHEDSTATS is not set ++# CONFIG_TIMER_STATS is not set ++# CONFIG_SLUB_DEBUG_ON is not set ++# CONFIG_DEBUG_RT_MUTEXES is not set ++# CONFIG_RT_MUTEX_TESTER is not set ++# CONFIG_DEBUG_SPINLOCK is not set ++# CONFIG_DEBUG_MUTEXES is not set ++# CONFIG_DEBUG_LOCK_ALLOC is not set ++# CONFIG_PROVE_LOCKING is not set ++# CONFIG_LOCK_STAT is not set ++# CONFIG_DEBUG_SPINLOCK_SLEEP is not set ++# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set ++# CONFIG_DEBUG_KOBJECT is not set ++# CONFIG_DEBUG_BUGVERBOSE is not set ++# CONFIG_DEBUG_INFO is not set ++# CONFIG_DEBUG_VM is not set ++# CONFIG_DEBUG_LIST is not set ++CONFIG_FRAME_POINTER=y ++# CONFIG_FORCED_INLINING is not set ++# CONFIG_RCU_TORTURE_TEST is not set ++# CONFIG_FAULT_INJECTION is not set ++# CONFIG_DEBUG_USER is not set ++# CONFIG_DEBUG_ERRORS is not set ++# CONFIG_DEBUG_LL is not set ++ ++# ++# Security options ++# ++# CONFIG_KEYS is not set ++# CONFIG_SECURITY is not set ++CONFIG_CRYPTO=y ++CONFIG_CRYPTO_ALGAPI=y ++CONFIG_CRYPTO_ABLKCIPHER=m ++CONFIG_CRYPTO_BLKCIPHER=m ++CONFIG_CRYPTO_HASH=y ++CONFIG_CRYPTO_MANAGER=y ++CONFIG_CRYPTO_HMAC=y ++CONFIG_CRYPTO_XCBC=m ++CONFIG_CRYPTO_NULL=m ++CONFIG_CRYPTO_MD4=m ++CONFIG_CRYPTO_MD5=y ++CONFIG_CRYPTO_SHA1=m ++CONFIG_CRYPTO_SHA256=m ++CONFIG_CRYPTO_SHA512=m ++CONFIG_CRYPTO_WP512=m ++CONFIG_CRYPTO_TGR192=m ++CONFIG_CRYPTO_GF128MUL=m ++CONFIG_CRYPTO_ECB=m ++CONFIG_CRYPTO_CBC=m ++CONFIG_CRYPTO_PCBC=m ++CONFIG_CRYPTO_LRW=m ++CONFIG_CRYPTO_CRYPTD=m ++CONFIG_CRYPTO_DES=m ++CONFIG_CRYPTO_FCRYPT=m ++CONFIG_CRYPTO_BLOWFISH=m ++CONFIG_CRYPTO_TWOFISH=m ++CONFIG_CRYPTO_TWOFISH_COMMON=m ++CONFIG_CRYPTO_SERPENT=m ++CONFIG_CRYPTO_AES=m ++CONFIG_CRYPTO_CAST5=m ++CONFIG_CRYPTO_CAST6=m ++CONFIG_CRYPTO_TEA=m ++CONFIG_CRYPTO_ARC4=m ++CONFIG_CRYPTO_KHAZAD=m ++CONFIG_CRYPTO_ANUBIS=m ++CONFIG_CRYPTO_DEFLATE=m ++CONFIG_CRYPTO_MICHAEL_MIC=m ++CONFIG_CRYPTO_CRC32C=m ++CONFIG_CRYPTO_CAMELLIA=m ++CONFIG_CRYPTO_TEST=m ++CONFIG_CRYPTO_HW=y ++ ++# ++# Library routines ++# ++CONFIG_BITREVERSE=y ++# CONFIG_CRC_CCITT is not set ++# CONFIG_CRC16 is not set ++# CONFIG_CRC_ITU_T is not set ++CONFIG_CRC32=y ++# CONFIG_CRC7 is not set ++CONFIG_LIBCRC32C=m ++CONFIG_AUDIT_GENERIC=y ++CONFIG_ZLIB_INFLATE=y ++CONFIG_ZLIB_DEFLATE=y ++CONFIG_PLIST=y ++CONFIG_HAS_IOMEM=y ++CONFIG_HAS_IOPORT=y ++CONFIG_HAS_DMA=y +diff -urN -x CVS linux-2.6.24/arch/arm/configs/csb337_defconfig linux-2.6/arch/arm/configs/csb337_defconfig +--- linux-2.6.24/arch/arm/configs/csb337_defconfig 2007-10-09 22:31:38.000000000 +0200 ++++ linux-2.6/arch/arm/configs/csb337_defconfig 2008-01-09 22:19:31.000000000 +0200 +@@ -1,69 +1,96 @@ + # + # Automatically generated make config: don't edit +-# Linux kernel version: 2.6.15 +-# Mon Jan 9 21:51:31 2006 ++# Linux kernel version: 2.6.24-rc7 ++# Wed Jan 9 22:19:24 2008 + # + CONFIG_ARM=y ++CONFIG_SYS_SUPPORTS_APM_EMULATION=y ++CONFIG_GENERIC_GPIO=y ++CONFIG_GENERIC_TIME=y ++CONFIG_GENERIC_CLOCKEVENTS=y + CONFIG_MMU=y +-CONFIG_UID16=y ++# CONFIG_NO_IOPORT is not set ++CONFIG_GENERIC_HARDIRQS=y ++CONFIG_STACKTRACE_SUPPORT=y ++CONFIG_LOCKDEP_SUPPORT=y ++CONFIG_TRACE_IRQFLAGS_SUPPORT=y ++CONFIG_HARDIRQS_SW_RESEND=y ++CONFIG_GENERIC_IRQ_PROBE=y + CONFIG_RWSEM_GENERIC_SPINLOCK=y ++# CONFIG_ARCH_HAS_ILOG2_U32 is not set ++# CONFIG_ARCH_HAS_ILOG2_U64 is not set ++CONFIG_GENERIC_HWEIGHT=y + CONFIG_GENERIC_CALIBRATE_DELAY=y ++CONFIG_ZONE_DMA=y ++CONFIG_VECTORS_BASE=0xffff0000 ++CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" + + # +-# Code maturity level options ++# General setup + # + 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=y + # CONFIG_SWAP is not set + CONFIG_SYSVIPC=y ++CONFIG_SYSVIPC_SYSCTL=y + # CONFIG_POSIX_MQUEUE is not set + # CONFIG_BSD_PROCESS_ACCT is not set +-CONFIG_SYSCTL=y ++# CONFIG_TASKSTATS is not set ++# CONFIG_USER_NS is not set ++# CONFIG_PID_NS is not set + # CONFIG_AUDIT is not set +-CONFIG_HOTPLUG=y +-CONFIG_KOBJECT_UEVENT=y + # CONFIG_IKCONFIG is not set ++CONFIG_LOG_BUF_SHIFT=14 ++# CONFIG_CGROUPS is not set ++CONFIG_FAIR_GROUP_SCHED=y ++CONFIG_FAIR_USER_SCHED=y ++# CONFIG_FAIR_CGROUP_SCHED is not set ++CONFIG_SYSFS_DEPRECATED=y ++# CONFIG_RELAY is not set ++CONFIG_BLK_DEV_INITRD=y + CONFIG_INITRAMFS_SOURCE="" + CONFIG_CC_OPTIMIZE_FOR_SIZE=y ++CONFIG_SYSCTL=y + # CONFIG_EMBEDDED is not set ++CONFIG_UID16=y ++CONFIG_SYSCTL_SYSCALL=y + CONFIG_KALLSYMS=y + # CONFIG_KALLSYMS_ALL is not set + # CONFIG_KALLSYMS_EXTRA_PASS is not set ++CONFIG_HOTPLUG=y + CONFIG_PRINTK=y + CONFIG_BUG=y ++CONFIG_ELF_CORE=y + CONFIG_BASE_FULL=y + CONFIG_FUTEX=y ++CONFIG_ANON_INODES=y + CONFIG_EPOLL=y ++CONFIG_SIGNALFD=y ++CONFIG_EVENTFD=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_VM_EVENT_COUNTERS=y ++CONFIG_SLUB_DEBUG=y ++# CONFIG_SLAB is not set ++CONFIG_SLUB=y ++# CONFIG_SLOB is not set ++CONFIG_SLABINFO=y ++CONFIG_RT_MUTEXES=y + # 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 +-# ++CONFIG_BLOCK=y ++# CONFIG_LBD is not set ++# CONFIG_BLK_DEV_IO_TRACE is not set ++# CONFIG_LSF is not set ++# CONFIG_BLK_DEV_BSG is not set + + # + # IO Schedulers +@@ -81,62 +108,101 @@ + # + # System Type + # ++# CONFIG_ARCH_AAEC2000 is not set ++# CONFIG_ARCH_INTEGRATOR is not set ++# CONFIG_ARCH_REALVIEW is not set ++# CONFIG_ARCH_VERSATILE is not set ++CONFIG_ARCH_AT91=y + # CONFIG_ARCH_CLPS7500 is not set + # CONFIG_ARCH_CLPS711X is not set + # CONFIG_ARCH_CO285 is not set + # CONFIG_ARCH_EBSA110 is not set ++# CONFIG_ARCH_EP93XX 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_NETX is not set ++# CONFIG_ARCH_H720X is not set ++# CONFIG_ARCH_IMX is not set ++# CONFIG_ARCH_IOP13XX is not set ++# CONFIG_ARCH_IOP32X is not set ++# CONFIG_ARCH_IOP33X is not set ++# CONFIG_ARCH_IXP23XX is not set + # CONFIG_ARCH_IXP2000 is not set ++# CONFIG_ARCH_IXP4XX is not set + # CONFIG_ARCH_L7200 is not set ++# CONFIG_ARCH_KS8695 is not set ++# CONFIG_ARCH_NS9XXX is not set ++# CONFIG_ARCH_MXC is not set ++# CONFIG_ARCH_PNX4008 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_DAVINCI 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_AT91=y +-CONFIG_ARCH_AT91RM9200=y + + # +-# AT91RM9200 Implementations ++# Boot options + # + + # ++# Power management ++# ++ ++# ++# Atmel AT91 System-on-Chip ++# ++CONFIG_ARCH_AT91RM9200=y ++# CONFIG_ARCH_AT91SAM9260 is not set ++# CONFIG_ARCH_AT91SAM9261 is not set ++# CONFIG_ARCH_AT91SAM9263 is not set ++# CONFIG_ARCH_AT91SAM9RL is not set ++# CONFIG_ARCH_AT91X40 is not set ++CONFIG_AT91_PMC_UNIT=y ++ ++# + # AT91RM9200 Board Type + # ++# CONFIG_MACH_ONEARM is not set + # CONFIG_ARCH_AT91RM9200DK is not set + # CONFIG_MACH_AT91RM9200EK is not set + CONFIG_MACH_CSB337=y + # CONFIG_MACH_CSB637 is not set + # CONFIG_MACH_CARMEVA is not set +-# CONFIG_MACH_KB9200 is not set + # CONFIG_MACH_ATEB9200 is not set ++# CONFIG_MACH_KB9200 is not set ++# CONFIG_MACH_PICOTUX2XX is not set ++# CONFIG_MACH_KAFA is not set ++# CONFIG_MACH_CHUB is not set ++# CONFIG_MACH_HOMEMATIC is not set ++# CONFIG_MACH_ECBAT91 is not set ++# CONFIG_MACH_SWEDATMS is not set + + # +-# AT91RM9200 Feature Selections ++# AT91 Board Options ++# ++ ++# ++# AT91 Feature Selections + # + CONFIG_AT91_PROGRAMMABLE_CLOCKS=y ++# CONFIG_ATMEL_TCLIB is not set ++CONFIG_AT91_TIMER_HZ=128 + + # + # Processor Type + # + CONFIG_CPU_32=y + CONFIG_CPU_ARM920T=y +-CONFIG_CPU_32v4=y ++CONFIG_CPU_32v4T=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 ++CONFIG_CPU_CP15=y ++CONFIG_CPU_CP15_MMU=y + + # + # Processor Features +@@ -145,15 +211,13 @@ + # CONFIG_CPU_ICACHE_DISABLE is not set + # CONFIG_CPU_DCACHE_DISABLE is not set + # CONFIG_CPU_DCACHE_WRITETHROUGH is not set ++# CONFIG_OUTER_CACHE is not set + + # + # Bus support + # +-CONFIG_ISA_DMA_API=y +- +-# +-# PCCARD (PCMCIA/CardBus) support +-# ++# CONFIG_PCI_SYSCALL is not set ++# CONFIG_ARCH_SUPPORTS_MSI is not set + CONFIG_PCCARD=y + # CONFIG_PCMCIA_DEBUG is not set + CONFIG_PCMCIA=y +@@ -168,8 +232,13 @@ + # + # Kernel Features + # ++# CONFIG_TICK_ONESHOT is not set ++# CONFIG_NO_HZ is not set ++# CONFIG_HIGH_RES_TIMERS is not set ++CONFIG_GENERIC_CLOCKEVENTS_BUILD=y + # CONFIG_PREEMPT is not set +-# CONFIG_NO_IDLE_HZ is not set ++CONFIG_HZ=128 ++# CONFIG_AEABI is not set + # CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set + CONFIG_SELECT_MEMORY_MODEL=y + CONFIG_FLATMEM_MANUAL=y +@@ -178,9 +247,13 @@ + CONFIG_FLATMEM=y + CONFIG_FLAT_NODE_MEM_MAP=y + # CONFIG_SPARSEMEM_STATIC is not set ++# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set + CONFIG_SPLIT_PTLOCK_CPUS=4096 ++# CONFIG_RESOURCES_64BIT is not set ++CONFIG_ZONE_DMA_FLAG=1 ++CONFIG_BOUNCE=y ++CONFIG_VIRT_TO_BUS=y + CONFIG_LEDS=y +-CONFIG_LEDS_TIMER=y + CONFIG_LEDS_CPU=y + CONFIG_ALIGNMENT_TRAP=y + +@@ -191,6 +264,7 @@ + CONFIG_ZBOOT_ROM_BSS=0x0 + CONFIG_CMDLINE="mem=32M console=ttyS0,38400 initrd=0x20410000,3145728 root=/dev/ram0 rw" + # CONFIG_XIP_KERNEL is not set ++# CONFIG_KEXEC is not set + + # + # Floating point emulation +@@ -215,6 +289,7 @@ + # Power management options + # + # CONFIG_PM is not set ++CONFIG_SUSPEND_UP_POSSIBLE=y + + # + # Networking +@@ -227,6 +302,10 @@ + CONFIG_PACKET=y + # CONFIG_PACKET_MMAP is not set + CONFIG_UNIX=y ++CONFIG_XFRM=y ++# CONFIG_XFRM_USER is not set ++# CONFIG_XFRM_SUB_POLICY is not set ++# CONFIG_XFRM_MIGRATE is not set + # CONFIG_NET_KEY is not set + CONFIG_INET=y + # CONFIG_IP_MULTICAST is not set +@@ -243,23 +322,26 @@ + # CONFIG_INET_AH is not set + # CONFIG_INET_ESP is not set + # CONFIG_INET_IPCOMP is not set ++# CONFIG_INET_XFRM_TUNNEL is not set + # CONFIG_INET_TUNNEL is not set ++CONFIG_INET_XFRM_MODE_TRANSPORT=y ++CONFIG_INET_XFRM_MODE_TUNNEL=y ++CONFIG_INET_XFRM_MODE_BEET=y ++# CONFIG_INET_LRO is not set + CONFIG_INET_DIAG=y + CONFIG_INET_TCP_DIAG=y + # CONFIG_TCP_CONG_ADVANCED is not set +-CONFIG_TCP_CONG_BIC=y ++CONFIG_TCP_CONG_CUBIC=y ++CONFIG_DEFAULT_TCP_CONG="cubic" ++# CONFIG_TCP_MD5SIG is not set + # CONFIG_IPV6 is not set ++# CONFIG_INET6_XFRM_TUNNEL is not set ++# CONFIG_INET6_TUNNEL is not set ++# CONFIG_NETWORK_SECMARK 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_TIPC is not set + # CONFIG_ATM is not set + # CONFIG_BRIDGE is not set + # CONFIG_VLAN_8021Q is not set +@@ -269,13 +351,8 @@ + # 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 + + # +@@ -285,7 +362,17 @@ + # CONFIG_HAMRADIO is not set + # CONFIG_IRDA is not set + # CONFIG_BT is not set ++# CONFIG_AF_RXRPC is not set ++ ++# ++# Wireless ++# ++# CONFIG_CFG80211 is not set ++# CONFIG_WIRELESS_EXT is not set ++# CONFIG_MAC80211 is not set + # CONFIG_IEEE80211 is not set ++# CONFIG_RFKILL is not set ++# CONFIG_NET_9P is not set + + # + # Device Drivers +@@ -294,19 +381,14 @@ + # + # Generic Driver Options + # ++CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" + CONFIG_STANDALONE=y + CONFIG_PREVENT_FIRMWARE_BUILD=y + CONFIG_FW_LOADER=y + # CONFIG_DEBUG_DRIVER is not set +- +-# +-# Connector - unified userspace <-> kernelspace linker +-# ++# CONFIG_DEBUG_DEVRES is not set ++# CONFIG_SYS_HYPERVISOR is not set + # CONFIG_CONNECTOR is not set +- +-# +-# Memory Technology Devices (MTD) +-# + CONFIG_MTD=y + # CONFIG_MTD_DEBUG is not set + # CONFIG_MTD_CONCAT is not set +@@ -319,11 +401,14 @@ + # User Modules And Translation Layers + # + CONFIG_MTD_CHAR=y ++CONFIG_MTD_BLKDEVS=y + CONFIG_MTD_BLOCK=y + # CONFIG_FTL is not set + # CONFIG_NFTL is not set + # CONFIG_INFTL is not set + # CONFIG_RFD_FTL is not set ++# CONFIG_SSFDC is not set ++# CONFIG_MTD_OOPS is not set + + # + # RAM/ROM/Flash chip drivers +@@ -349,15 +434,14 @@ + # 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=0 +-CONFIG_MTD_PHYSMAP_LEN=0 ++CONFIG_MTD_PHYSMAP_START=0x0 ++CONFIG_MTD_PHYSMAP_LEN=0x0 + CONFIG_MTD_PHYSMAP_BANKWIDTH=0 + # CONFIG_MTD_ARM_INTEGRATOR is not set + # CONFIG_MTD_PLATRAM is not set +@@ -368,7 +452,6 @@ + # 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 + + # +@@ -378,29 +461,15 @@ + # CONFIG_MTD_DOC2001 is not set + # CONFIG_MTD_DOC2001PLUS is not set + # CONFIG_MTD_AT91_DATAFLASH is not set +- +-# +-# NAND Flash Device Drivers +-# + # CONFIG_MTD_NAND is not set +- +-# +-# OneNAND Flash Device Drivers +-# + # CONFIG_MTD_ONENAND is not set + + # +-# Parallel port support ++# UBI - Unsorted block images + # ++# CONFIG_MTD_UBI is not set + # CONFIG_PARPORT is not set +- +-# +-# Plug and Play support +-# +- +-# +-# Block devices +-# ++CONFIG_BLK_DEV=y + # CONFIG_BLK_DEV_COW_COMMON is not set + CONFIG_BLK_DEV_LOOP=y + # CONFIG_BLK_DEV_CRYPTOLOOP is not set +@@ -409,13 +478,12 @@ + CONFIG_BLK_DEV_RAM=y + CONFIG_BLK_DEV_RAM_COUNT=16 + CONFIG_BLK_DEV_RAM_SIZE=8192 +-CONFIG_BLK_DEV_INITRD=y ++CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024 + # CONFIG_CDROM_PKTCDVD is not set + # CONFIG_ATA_OVER_ETH is not set +- +-# +-# ATA/ATAPI/MFM/RLL support +-# ++CONFIG_MISC_DEVICES=y ++# CONFIG_EEPROM_93CX6 is not set ++CONFIG_ATMEL_SSC=y + # CONFIG_IDE is not set + + # +@@ -423,6 +491,9 @@ + # + # CONFIG_RAID_ATTRS is not set + CONFIG_SCSI=y ++CONFIG_SCSI_DMA=y ++# CONFIG_SCSI_TGT is not set ++# CONFIG_SCSI_NETLINK is not set + CONFIG_SCSI_PROC_FS=y + + # +@@ -441,97 +512,61 @@ + # CONFIG_SCSI_MULTI_LUN is not set + # CONFIG_SCSI_CONSTANTS is not set + # CONFIG_SCSI_LOGGING is not set ++# CONFIG_SCSI_SCAN_ASYNC is not set ++CONFIG_SCSI_WAIT_SCAN=m + + # +-# SCSI Transport Attributes ++# SCSI Transports + # + # CONFIG_SCSI_SPI_ATTRS is not set + # CONFIG_SCSI_FC_ATTRS is not set + # CONFIG_SCSI_ISCSI_ATTRS is not set +-# CONFIG_SCSI_SAS_ATTRS is not set +- +-# +-# SCSI low-level drivers +-# ++# CONFIG_SCSI_SAS_LIBSAS is not set ++# CONFIG_SCSI_SRP_ATTRS is not set ++CONFIG_SCSI_LOWLEVEL=y + # CONFIG_ISCSI_TCP is not set +-# CONFIG_SCSI_SATA is not set + # CONFIG_SCSI_DEBUG is not set +- +-# +-# PCMCIA SCSI adapter support +-# +-# CONFIG_PCMCIA_AHA152X is not set +-# CONFIG_PCMCIA_FDOMAIN is not set +-# CONFIG_PCMCIA_NINJA_SCSI is not set +-# CONFIG_PCMCIA_QLOGIC is not set +-# CONFIG_PCMCIA_SYM53C500 is not set +- +-# +-# Multi-device support (RAID and LVM) +-# ++# CONFIG_SCSI_LOWLEVEL_PCMCIA is not set ++# CONFIG_ATA is not set + # 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_NETDEVICES_MULTIQUEUE is not set + # CONFIG_DUMMY is not set + # CONFIG_BONDING is not set ++# CONFIG_MACVLAN is not set + # CONFIG_EQUALIZER is not set + # CONFIG_TUN is not set +- +-# +-# PHY device support +-# ++# CONFIG_VETH is not set + # CONFIG_PHYLIB is not set +- +-# +-# Ethernet (10 or 100Mbit) +-# + CONFIG_NET_ETHERNET=y + CONFIG_MII=y + CONFIG_ARM_AT91_ETHER=y ++# CONFIG_AX88796 is not set + # CONFIG_SMC91X is not set + # CONFIG_DM9000 is not set ++# CONFIG_IBM_NEW_EMAC_ZMII is not set ++# CONFIG_IBM_NEW_EMAC_RGMII is not set ++# CONFIG_IBM_NEW_EMAC_TAH is not set ++# CONFIG_IBM_NEW_EMAC_EMAC4 is not set ++# CONFIG_B44 is not set ++CONFIG_NETDEV_1000=y ++CONFIG_NETDEV_10000=y + + # +-# Ethernet (1000 Mbit) +-# +- +-# +-# Ethernet (10000 Mbit) +-# +- +-# +-# Token Ring devices ++# Wireless LAN + # ++# CONFIG_WLAN_PRE80211 is not set ++# CONFIG_WLAN_80211 is not set + + # +-# Wireless LAN (non-hamradio) +-# +-# CONFIG_NET_RADIO is not set +- +-# +-# PCMCIA network 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_NET_PCMCIA is not set +- +-# +-# Wan interfaces +-# + # CONFIG_WAN is not set + # CONFIG_PPP is not set + # CONFIG_SLIP is not set +@@ -539,26 +574,23 @@ + # 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 ++# CONFIG_INPUT_FF_MEMLESS is not set ++# CONFIG_INPUT_POLLDEV is not set + + # + # Userland interfaces + # + CONFIG_INPUT_MOUSEDEV=y +-CONFIG_INPUT_MOUSEDEV_PSAUX=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 + +@@ -568,6 +600,7 @@ + # CONFIG_INPUT_KEYBOARD is not set + # CONFIG_INPUT_MOUSE is not set + # CONFIG_INPUT_JOYSTICK is not set ++# CONFIG_INPUT_TABLET is not set + # CONFIG_INPUT_TOUCHSCREEN is not set + # CONFIG_INPUT_MISC is not set + +@@ -583,6 +616,7 @@ + CONFIG_VT=y + CONFIG_VT_CONSOLE=y + CONFIG_HW_CONSOLE=y ++# CONFIG_VT_HW_CONSOLE_BINDING is not set + # CONFIG_SERIAL_NONSTANDARD is not set + + # +@@ -601,152 +635,114 @@ + 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_AT91RM9200_WATCHDOG=y +- +-# +-# USB-based Watchdog Cards +-# +-# CONFIG_USBPCWATCHDOG is not set + # CONFIG_HW_RANDOM is not set + # CONFIG_NVRAM is not set +-# CONFIG_DTLK is not set + # CONFIG_R3964 is not set + + # +-# Ftape, the floppy tape device driver +-# +- +-# + # PCMCIA character devices + # + # CONFIG_SYNCLINK_CS is not set + # CONFIG_CARDMAN_4000 is not set + # CONFIG_CARDMAN_4040 is not set + # 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_BOARDINFO=y + CONFIG_I2C_CHARDEV=y + + # + # I2C Algorithms + # +-# CONFIG_I2C_ALGOBIT is not set ++CONFIG_I2C_ALGOBIT=y + # CONFIG_I2C_ALGOPCF is not set + # CONFIG_I2C_ALGOPCA is not set + + # + # I2C Hardware Bus support + # +-CONFIG_I2C_AT91=y ++CONFIG_I2C_GPIO=y ++# CONFIG_I2C_OCORES is not set + # CONFIG_I2C_PARPORT_LIGHT is not set ++# CONFIG_I2C_SIMTEC is not set ++# CONFIG_I2C_TAOS_EVM is not set + # CONFIG_I2C_STUB is not set +-# CONFIG_I2C_PCA_ISA is not set ++# CONFIG_I2C_TINY_USB is not set ++# CONFIG_I2C_PCA is not set + + # + # Miscellaneous I2C Chip support + # + # CONFIG_SENSORS_DS1337 is not set + # CONFIG_SENSORS_DS1374 is not set ++# CONFIG_DS1682 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_SENSORS_TSL2550 is not set + # CONFIG_I2C_DEBUG_CORE is not set + # CONFIG_I2C_DEBUG_ALGO is not set + # CONFIG_I2C_DEBUG_BUS is not set + # CONFIG_I2C_DEBUG_CHIP is not set + + # +-# Hardware Monitoring support ++# SPI support ++# ++# CONFIG_SPI is not set ++# CONFIG_SPI_MASTER is not set ++# CONFIG_W1 is not set ++# CONFIG_POWER_SUPPLY is not set ++# CONFIG_HWMON is not set ++CONFIG_WATCHDOG=y ++CONFIG_WATCHDOG_NOWAYOUT=y ++ ++# ++# Watchdog Device Drivers + # +-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 ++# CONFIG_SOFT_WATCHDOG is not set ++CONFIG_AT91RM9200_WATCHDOG=y + + # +-# Misc devices ++# USB-based Watchdog Cards + # ++# CONFIG_USBPCWATCHDOG is not set + + # +-# Multimedia Capabilities Port drivers ++# Sonics Silicon Backplane + # ++CONFIG_SSB_POSSIBLE=y ++# CONFIG_SSB is not set + + # +-# Multimedia devices ++# Multifunction device drivers + # +-# CONFIG_VIDEO_DEV is not set ++# CONFIG_MFD_SM501 is not set + + # +-# Digital Video Broadcasting Devices ++# Multimedia devices + # +-# CONFIG_DVB is not set ++# CONFIG_VIDEO_DEV is not set ++# CONFIG_DVB_CORE is not set ++CONFIG_DAB=y ++# CONFIG_USB_DABUSB is not set + + # + # Graphics support + # ++# CONFIG_VGASTATE is not set ++# CONFIG_VIDEO_OUTPUT_CONTROL is not set + # CONFIG_FB is not set ++# CONFIG_BACKLIGHT_LCD_SUPPORT is not set ++ ++# ++# Display device support ++# ++# CONFIG_DISPLAY_SUPPORT is not set + + # + # Console display driver support +@@ -758,12 +754,25 @@ + # Sound + # + # CONFIG_SOUND is not set ++CONFIG_HID_SUPPORT=y ++CONFIG_HID=y ++CONFIG_HID_DEBUG=y ++# CONFIG_HIDRAW is not set + + # +-# USB support ++# 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_SUPPORT=y + CONFIG_USB_ARCH_HAS_HCD=y + CONFIG_USB_ARCH_HAS_OHCI=y ++# CONFIG_USB_ARCH_HAS_EHCI is not set + CONFIG_USB=y + CONFIG_USB_DEBUG=y + +@@ -771,7 +780,7 @@ + # Miscellaneous USB options + # + CONFIG_USB_DEVICEFS=y +-# CONFIG_USB_BANDWIDTH is not set ++CONFIG_USB_DEVICE_CLASS=y + # CONFIG_USB_DYNAMIC_MINORS is not set + # CONFIG_USB_OTG is not set + +@@ -780,9 +789,11 @@ + # + # CONFIG_USB_ISP116X_HCD is not set + CONFIG_USB_OHCI_HCD=y +-# CONFIG_USB_OHCI_BIG_ENDIAN is not set ++# CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set ++# CONFIG_USB_OHCI_BIG_ENDIAN_MMIO is not set + CONFIG_USB_OHCI_LITTLE_ENDIAN=y + # CONFIG_USB_SL811_HCD is not set ++# CONFIG_USB_R8A66597_HCD is not set + + # + # USB Device Class drivers +@@ -801,59 +812,21 @@ + # CONFIG_USB_STORAGE_DEBUG is not set + # CONFIG_USB_STORAGE_DATAFAB is not set + # CONFIG_USB_STORAGE_FREECOM is not set ++# CONFIG_USB_STORAGE_ISD200 is not set + # CONFIG_USB_STORAGE_DPCM is not set + # CONFIG_USB_STORAGE_USBAT is not set + # CONFIG_USB_STORAGE_SDDR09 is not set + # CONFIG_USB_STORAGE_SDDR55 is not set + # CONFIG_USB_STORAGE_JUMPSHOT is not set +- +-# +-# 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 ++# CONFIG_USB_STORAGE_ALAUDA is not set ++# CONFIG_USB_STORAGE_KARMA is not set ++# CONFIG_USB_LIBUSUAL is not set + + # + # USB Imaging devices + # + # CONFIG_USB_MDC800 is not set + # CONFIG_USB_MICROTEK is not set +- +-# +-# USB 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 + + # +@@ -866,15 +839,18 @@ + CONFIG_USB_SERIAL=y + CONFIG_USB_SERIAL_CONSOLE=y + CONFIG_USB_SERIAL_GENERIC=y ++# CONFIG_USB_SERIAL_AIRCABLE is not set + # CONFIG_USB_SERIAL_AIRPRIME is not set +-# CONFIG_USB_SERIAL_ANYDATA is not set ++# CONFIG_USB_SERIAL_ARK3116 is not set + # CONFIG_USB_SERIAL_BELKIN is not set ++# CONFIG_USB_SERIAL_CH341 is not set + # CONFIG_USB_SERIAL_WHITEHEAT is not set + # CONFIG_USB_SERIAL_DIGI_ACCELEPORT is not set + # CONFIG_USB_SERIAL_CP2101 is not set + # CONFIG_USB_SERIAL_CYPRESS_M8 is not set + # CONFIG_USB_SERIAL_EMPEG is not set + CONFIG_USB_SERIAL_FTDI_SIO=y ++# CONFIG_USB_SERIAL_FUNSOFT is not set + # CONFIG_USB_SERIAL_VISOR is not set + # CONFIG_USB_SERIAL_IPAQ is not set + # CONFIG_USB_SERIAL_IR is not set +@@ -899,14 +875,20 @@ + # CONFIG_USB_SERIAL_KLSI is not set + # CONFIG_USB_SERIAL_KOBIL_SCT is not set + CONFIG_USB_SERIAL_MCT_U232=y ++# CONFIG_USB_SERIAL_MOS7720 is not set ++# CONFIG_USB_SERIAL_MOS7840 is not set ++# CONFIG_USB_SERIAL_NAVMAN is not set + # CONFIG_USB_SERIAL_PL2303 is not set ++# CONFIG_USB_SERIAL_OTI6858 is not set + # CONFIG_USB_SERIAL_HP4X is not set + # CONFIG_USB_SERIAL_SAFE is not set ++# CONFIG_USB_SERIAL_SIERRAWIRELESS is not set + # CONFIG_USB_SERIAL_TI is not set + # CONFIG_USB_SERIAL_CYBERJACK is not set + # CONFIG_USB_SERIAL_XIRCOM is not set + # CONFIG_USB_SERIAL_OPTION is not set + # CONFIG_USB_SERIAL_OMNINET is not set ++# CONFIG_USB_SERIAL_DEBUG is not set + CONFIG_USB_EZUSB=y + + # +@@ -914,16 +896,22 @@ + # + # CONFIG_USB_EMI62 is not set + # CONFIG_USB_EMI26 is not set ++# CONFIG_USB_ADUTUX 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_BERRY_CHARGE is not set + # CONFIG_USB_LED is not set ++# CONFIG_USB_CYPRESS_CY7C63 is not set + # CONFIG_USB_CYTHERM is not set +-# CONFIG_USB_PHIDGETKIT is not set +-# CONFIG_USB_PHIDGETSERVO is not set ++# CONFIG_USB_PHIDGET is not set + # CONFIG_USB_IDMOUSE is not set ++# CONFIG_USB_FTDI_ELAN is not set ++# CONFIG_USB_APPLEDISPLAY is not set + # CONFIG_USB_LD is not set ++# CONFIG_USB_TRANCEVIBRATOR is not set ++# CONFIG_USB_IOWARRIOR is not set + # CONFIG_USB_TEST is not set + + # +@@ -934,13 +922,19 @@ + # USB Gadget Support + # + CONFIG_USB_GADGET=y ++# CONFIG_USB_GADGET_DEBUG is not set + # CONFIG_USB_GADGET_DEBUG_FILES is not set + CONFIG_USB_GADGET_SELECTED=y ++# CONFIG_USB_GADGET_AMD5536UDC is not set ++# CONFIG_USB_GADGET_ATMEL_USBA is not set ++# CONFIG_USB_GADGET_FSL_USB2 is not set + # CONFIG_USB_GADGET_NET2280 is not set + # CONFIG_USB_GADGET_PXA2XX is not set ++# CONFIG_USB_GADGET_M66592 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_S3C2410 is not set + CONFIG_USB_GADGET_AT91=y + CONFIG_USB_AT91=y + # CONFIG_USB_GADGET_DUMMY_HCD is not set +@@ -950,22 +944,28 @@ + # CONFIG_USB_GADGETFS is not set + # CONFIG_USB_FILE_STORAGE is not set + # CONFIG_USB_G_SERIAL is not set ++# CONFIG_USB_MIDI_GADGET is not set ++CONFIG_MMC=y ++# CONFIG_MMC_DEBUG is not set ++# CONFIG_MMC_UNSAFE_RESUME is not set + + # +-# MMC/SD Card support ++# MMC/SD Card Drivers + # +-CONFIG_MMC=y +-# CONFIG_MMC_DEBUG is not set + CONFIG_MMC_BLOCK=y +-CONFIG_MMC_AT91RM9200=y ++CONFIG_MMC_BLOCK_BOUNCE=y ++# CONFIG_SDIO_UART is not set + + # +-# Real Time Clock ++# MMC/SD Host Controller Drivers + # ++# CONFIG_MMC_AT91 is not set ++# CONFIG_NEW_LEDS is not set + CONFIG_RTC_LIB=y + CONFIG_RTC_CLASS=y + CONFIG_RTC_HCTOSYS=y + CONFIG_RTC_HCTOSYS_DEVICE="rtc1" ++# CONFIG_RTC_DEBUG is not set + + # + # RTC interfaces +@@ -974,39 +974,60 @@ + CONFIG_RTC_INTF_PROC=y + CONFIG_RTC_INTF_DEV=y + # CONFIG_RTC_INTF_DEV_UIE_EMUL is not set ++# CONFIG_RTC_DRV_TEST is not set + + # +-# RTC drivers ++# I2C RTC drivers + # +-# CONFIG_RTC_DRV_X1205 is not set + CONFIG_RTC_DRV_DS1307=y +-# CONFIG_RTC_DRV_DS1553 is not set +-# CONFIG_RTC_DRV_ISL1208 is not set ++# CONFIG_RTC_DRV_DS1374 is not set + # CONFIG_RTC_DRV_DS1672 is not set +-# CONFIG_RTC_DRV_DS1742 is not set ++# CONFIG_RTC_DRV_MAX6900 is not set ++# CONFIG_RTC_DRV_RS5C372 is not set ++# CONFIG_RTC_DRV_ISL1208 is not set ++# CONFIG_RTC_DRV_X1205 is not set + # CONFIG_RTC_DRV_PCF8563 is not set + # CONFIG_RTC_DRV_PCF8583 is not set +-# CONFIG_RTC_DRV_RS5C372 is not set ++# CONFIG_RTC_DRV_M41T80 is not set ++ ++# ++# SPI RTC drivers ++# ++ ++# ++# Platform RTC drivers ++# ++# CONFIG_RTC_DRV_CMOS is not set ++# CONFIG_RTC_DRV_DS1553 is not set ++# CONFIG_RTC_DRV_STK17TA8 is not set ++# CONFIG_RTC_DRV_DS1742 is not set + # CONFIG_RTC_DRV_M48T86 is not set +-CONFIG_RTC_DRV_AT91RM9200=y +-# CONFIG_RTC_DRV_TEST is not set ++# CONFIG_RTC_DRV_M48T59 is not set + # CONFIG_RTC_DRV_V3020 is not set + + # ++# on-CPU RTC drivers ++# ++CONFIG_RTC_DRV_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_EXT4DEV_FS 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_GFS2_FS is not set ++# CONFIG_OCFS2_FS is not set + # CONFIG_MINIX_FS is not set + # CONFIG_ROMFS_FS is not set + CONFIG_INOTIFY=y ++CONFIG_INOTIFY_USER=y + # CONFIG_QUOTA is not set + CONFIG_DNOTIFY=y + # CONFIG_AUTOFS_FS is not set +@@ -1030,11 +1051,12 @@ + # Pseudo filesystems + # + CONFIG_PROC_FS=y ++CONFIG_PROC_SYSCTL=y + CONFIG_SYSFS=y + CONFIG_TMPFS=y ++# CONFIG_TMPFS_POSIX_ACL is not set + # CONFIG_HUGETLB_PAGE is not set +-CONFIG_RAMFS=y +-# CONFIG_RELAYFS_FS is not set ++# CONFIG_CONFIGFS_FS is not set + + # + # Miscellaneous filesystems +@@ -1046,7 +1068,6 @@ + # 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 +@@ -1054,10 +1075,7 @@ + # CONFIG_QNX4FS_FS is not set + # CONFIG_SYSV_FS is not set + # CONFIG_UFS_FS is not set +- +-# +-# Network File Systems +-# ++CONFIG_NETWORK_FILESYSTEMS=y + CONFIG_NFS_FS=y + CONFIG_NFS_V3=y + # CONFIG_NFS_V3_ACL is not set +@@ -1070,6 +1088,7 @@ + CONFIG_NFS_COMMON=y + CONFIG_SUNRPC=y + CONFIG_SUNRPC_GSS=y ++# CONFIG_SUNRPC_BIND34 is not set + CONFIG_RPCSEC_GSS_KRB5=y + # CONFIG_RPCSEC_GSS_SPKM3 is not set + # CONFIG_SMB_FS is not set +@@ -1077,43 +1096,56 @@ + # 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_DLM is not set ++CONFIG_INSTRUMENTATION=y + # CONFIG_PROFILING is not set ++# CONFIG_MARKERS is not set + + # + # Kernel hacking + # + # CONFIG_PRINTK_TIME is not set +-CONFIG_DEBUG_KERNEL=y ++CONFIG_ENABLE_WARN_DEPRECATED=y ++CONFIG_ENABLE_MUST_CHECK=y + # CONFIG_MAGIC_SYSRQ is not set +-CONFIG_LOG_BUF_SHIFT=14 ++# CONFIG_UNUSED_SYMBOLS is not set ++# CONFIG_DEBUG_FS is not set ++# CONFIG_HEADERS_CHECK is not set ++CONFIG_DEBUG_KERNEL=y ++# CONFIG_DEBUG_SHIRQ is not set + CONFIG_DETECT_SOFTLOCKUP=y ++CONFIG_SCHED_DEBUG=y + # CONFIG_SCHEDSTATS is not set +-# CONFIG_DEBUG_SLAB is not set ++# CONFIG_TIMER_STATS is not set ++# CONFIG_SLUB_DEBUG_ON is not set ++# CONFIG_DEBUG_RT_MUTEXES is not set ++# CONFIG_RT_MUTEX_TESTER is not set + # CONFIG_DEBUG_SPINLOCK is not set ++# CONFIG_DEBUG_MUTEXES is not set ++# CONFIG_DEBUG_LOCK_ALLOC is not set ++# CONFIG_PROVE_LOCKING is not set ++# CONFIG_LOCK_STAT is not set + # CONFIG_DEBUG_SPINLOCK_SLEEP is not set ++# CONFIG_DEBUG_LOCKING_API_SELFTESTS 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_DEBUG_LIST is not set ++# CONFIG_DEBUG_SG is not set + CONFIG_FRAME_POINTER=y ++CONFIG_FORCED_INLINING=y ++# CONFIG_BOOT_PRINTK_DELAY is not set + # CONFIG_RCU_TORTURE_TEST is not set ++# CONFIG_FAULT_INJECTION is not set ++# CONFIG_SAMPLES is not set + CONFIG_DEBUG_USER=y + # CONFIG_DEBUG_ERRORS is not set + CONFIG_DEBUG_LL=y +@@ -1124,12 +1156,13 @@ + # + # CONFIG_KEYS is not set + # CONFIG_SECURITY is not set +- +-# +-# Cryptographic options +-# ++# CONFIG_SECURITY_FILE_CAPABILITIES is not set + CONFIG_CRYPTO=y ++CONFIG_CRYPTO_ALGAPI=y ++CONFIG_CRYPTO_BLKCIPHER=y ++CONFIG_CRYPTO_MANAGER=y + # CONFIG_CRYPTO_HMAC is not set ++# CONFIG_CRYPTO_XCBC is not set + # CONFIG_CRYPTO_NULL is not set + # CONFIG_CRYPTO_MD4 is not set + CONFIG_CRYPTO_MD5=y +@@ -1138,7 +1171,15 @@ + # CONFIG_CRYPTO_SHA512 is not set + # CONFIG_CRYPTO_WP512 is not set + # CONFIG_CRYPTO_TGR192 is not set ++# CONFIG_CRYPTO_GF128MUL is not set ++# CONFIG_CRYPTO_ECB is not set ++CONFIG_CRYPTO_CBC=y ++# CONFIG_CRYPTO_PCBC is not set ++# CONFIG_CRYPTO_LRW is not set ++# CONFIG_CRYPTO_XTS is not set ++# CONFIG_CRYPTO_CRYPTD is not set + CONFIG_CRYPTO_DES=y ++# CONFIG_CRYPTO_FCRYPT is not set + # CONFIG_CRYPTO_BLOWFISH is not set + # CONFIG_CRYPTO_TWOFISH is not set + # CONFIG_CRYPTO_SERPENT is not set +@@ -1149,20 +1190,27 @@ + # CONFIG_CRYPTO_ARC4 is not set + # CONFIG_CRYPTO_KHAZAD is not set + # CONFIG_CRYPTO_ANUBIS is not set ++# CONFIG_CRYPTO_SEED is not set + # CONFIG_CRYPTO_DEFLATE is not set + # CONFIG_CRYPTO_MICHAEL_MIC is not set + # CONFIG_CRYPTO_CRC32C is not set ++# CONFIG_CRYPTO_CAMELLIA is not set + # CONFIG_CRYPTO_TEST is not set +- +-# +-# Hardware crypto devices +-# ++# CONFIG_CRYPTO_AUTHENC is not set ++CONFIG_CRYPTO_HW=y + + # + # Library routines + # ++CONFIG_BITREVERSE=y + # CONFIG_CRC_CCITT is not set + # CONFIG_CRC16 is not set ++# CONFIG_CRC_ITU_T is not set + CONFIG_CRC32=y ++# CONFIG_CRC7 is not set + # CONFIG_LIBCRC32C is not set + CONFIG_ZLIB_INFLATE=y ++CONFIG_PLIST=y ++CONFIG_HAS_IOMEM=y ++CONFIG_HAS_IOPORT=y ++CONFIG_HAS_DMA=y +diff -urN -x CVS linux-2.6.24/arch/arm/configs/csb637_defconfig linux-2.6/arch/arm/configs/csb637_defconfig +--- linux-2.6.24/arch/arm/configs/csb637_defconfig 2007-10-09 22:31:38.000000000 +0200 ++++ linux-2.6/arch/arm/configs/csb637_defconfig 2007-12-31 10:43:35.000000000 +0200 +@@ -658,14 +658,14 @@ + # + # I2C Algorithms + # +-# CONFIG_I2C_ALGOBIT is not set ++CONFIG_I2C_ALGOBIT=y + # CONFIG_I2C_ALGOPCF is not set + # CONFIG_I2C_ALGOPCA is not set + + # + # I2C Hardware Bus support + # +-CONFIG_I2C_AT91=y ++CONFIG_I2C_GPIO=y + # CONFIG_I2C_PARPORT_LIGHT is not set + # CONFIG_I2C_STUB is not set + # CONFIG_I2C_PCA_ISA is not set +diff -urN -x CVS linux-2.6.24/arch/arm/configs/ecbat91_defconfig linux-2.6/arch/arm/configs/ecbat91_defconfig +--- linux-2.6.24/arch/arm/configs/ecbat91_defconfig 1970-01-01 02:00:00.000000000 +0200 ++++ linux-2.6/arch/arm/configs/ecbat91_defconfig 2007-12-31 15:18:42.000000000 +0200 +@@ -0,0 +1,1315 @@ ++# ++# Automatically generated make config: don't edit ++# Linux kernel version: 2.6.22-rc4 ++# Sat Jun 9 01:30:18 2007 ++# ++CONFIG_ARM=y ++CONFIG_SYS_SUPPORTS_APM_EMULATION=y ++CONFIG_GENERIC_GPIO=y ++# CONFIG_GENERIC_TIME is not set ++# CONFIG_GENERIC_CLOCKEVENTS is not set ++CONFIG_MMU=y ++# CONFIG_NO_IOPORT is not set ++CONFIG_GENERIC_HARDIRQS=y ++CONFIG_STACKTRACE_SUPPORT=y ++CONFIG_LOCKDEP_SUPPORT=y ++CONFIG_TRACE_IRQFLAGS_SUPPORT=y ++CONFIG_HARDIRQS_SW_RESEND=y ++CONFIG_GENERIC_IRQ_PROBE=y ++CONFIG_RWSEM_GENERIC_SPINLOCK=y ++# CONFIG_ARCH_HAS_ILOG2_U32 is not set ++# CONFIG_ARCH_HAS_ILOG2_U64 is not set ++CONFIG_GENERIC_HWEIGHT=y ++CONFIG_GENERIC_CALIBRATE_DELAY=y ++CONFIG_ZONE_DMA=y ++CONFIG_VECTORS_BASE=0xffff0000 ++CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" ++ ++# ++# Code maturity level options ++# ++CONFIG_EXPERIMENTAL=y ++CONFIG_BROKEN_ON_SMP=y ++CONFIG_LOCK_KERNEL=y ++CONFIG_INIT_ENV_ARG_LIMIT=32 ++ ++# ++# General setup ++# ++CONFIG_LOCALVERSION="" ++CONFIG_LOCALVERSION_AUTO=y ++CONFIG_SWAP=y ++CONFIG_SYSVIPC=y ++# CONFIG_IPC_NS is not set ++CONFIG_SYSVIPC_SYSCTL=y ++# CONFIG_POSIX_MQUEUE is not set ++# CONFIG_BSD_PROCESS_ACCT is not set ++# CONFIG_TASKSTATS is not set ++# CONFIG_UTS_NS is not set ++# CONFIG_AUDIT is not set ++CONFIG_IKCONFIG=y ++CONFIG_IKCONFIG_PROC=y ++CONFIG_LOG_BUF_SHIFT=14 ++CONFIG_SYSFS_DEPRECATED=y ++# CONFIG_RELAY is not set ++# CONFIG_BLK_DEV_INITRD is not set ++CONFIG_CC_OPTIMIZE_FOR_SIZE=y ++CONFIG_SYSCTL=y ++# CONFIG_EMBEDDED is not set ++CONFIG_UID16=y ++CONFIG_SYSCTL_SYSCALL=y ++CONFIG_KALLSYMS=y ++# CONFIG_KALLSYMS_EXTRA_PASS is not set ++CONFIG_HOTPLUG=y ++CONFIG_PRINTK=y ++CONFIG_BUG=y ++CONFIG_ELF_CORE=y ++CONFIG_BASE_FULL=y ++CONFIG_FUTEX=y ++CONFIG_ANON_INODES=y ++CONFIG_EPOLL=y ++CONFIG_SIGNALFD=y ++CONFIG_TIMERFD=y ++CONFIG_EVENTFD=y ++CONFIG_SHMEM=y ++CONFIG_VM_EVENT_COUNTERS=y ++CONFIG_SLAB=y ++# CONFIG_SLUB is not set ++# CONFIG_SLOB is not set ++CONFIG_RT_MUTEXES=y ++# 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_MODVERSIONS is not set ++# CONFIG_MODULE_SRCVERSION_ALL is not set ++CONFIG_KMOD=y ++ ++# ++# Block layer ++# ++CONFIG_BLOCK=y ++# CONFIG_LBD is not set ++# CONFIG_BLK_DEV_IO_TRACE is not set ++# CONFIG_LSF is not set ++ ++# ++# 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_AAEC2000 is not set ++# CONFIG_ARCH_INTEGRATOR is not set ++# CONFIG_ARCH_REALVIEW is not set ++# CONFIG_ARCH_VERSATILE is not set ++CONFIG_ARCH_AT91=y ++# CONFIG_ARCH_CLPS7500 is not set ++# CONFIG_ARCH_CLPS711X is not set ++# CONFIG_ARCH_CO285 is not set ++# CONFIG_ARCH_EBSA110 is not set ++# CONFIG_ARCH_EP93XX is not set ++# CONFIG_ARCH_FOOTBRIDGE is not set ++# CONFIG_ARCH_NETX is not set ++# CONFIG_ARCH_H720X is not set ++# CONFIG_ARCH_IMX is not set ++# CONFIG_ARCH_IOP13XX is not set ++# CONFIG_ARCH_IOP32X is not set ++# CONFIG_ARCH_IOP33X is not set ++# CONFIG_ARCH_IXP23XX is not set ++# CONFIG_ARCH_IXP2000 is not set ++# CONFIG_ARCH_IXP4XX is not set ++# CONFIG_ARCH_L7200 is not set ++# CONFIG_ARCH_KS8695 is not set ++# CONFIG_ARCH_NS9XXX is not set ++# CONFIG_ARCH_PNX4008 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_DAVINCI is not set ++# CONFIG_ARCH_OMAP is not set ++ ++# ++# Atmel AT91 System-on-Chip ++# ++CONFIG_ARCH_AT91RM9200=y ++# CONFIG_ARCH_AT91SAM9260 is not set ++# CONFIG_ARCH_AT91SAM9261 is not set ++# CONFIG_ARCH_AT91SAM9263 is not set ++# CONFIG_ARCH_AT91SAM9RL is not set ++ ++# ++# AT91RM9200 Board Type ++# ++# CONFIG_MACH_ONEARM is not set ++# CONFIG_ARCH_AT91RM9200DK is not set ++# CONFIG_MACH_AT91RM9200EK is not set ++# CONFIG_MACH_CSB337 is not set ++# CONFIG_MACH_CSB637 is not set ++# CONFIG_MACH_CARMEVA is not set ++# CONFIG_MACH_ATEB9200 is not set ++# CONFIG_MACH_KB9200 is not set ++# CONFIG_MACH_PICOTUX2XX is not set ++# CONFIG_MACH_KAFA is not set ++# CONFIG_MACH_CHUB is not set ++CONFIG_MACH_ECBAT91=y ++ ++# ++# AT91 Board Options ++# ++# CONFIG_MTD_AT91_DATAFLASH_CARD is not set ++ ++# ++# AT91 Feature Selections ++# ++CONFIG_AT91_PROGRAMMABLE_CLOCKS=y ++# CONFIG_ATMEL_TCLIB is not set ++ ++# ++# Processor Type ++# ++CONFIG_CPU_32=y ++CONFIG_CPU_ARM920T=y ++CONFIG_CPU_32v4T=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 ++CONFIG_CPU_CP15=y ++CONFIG_CPU_CP15_MMU=y ++ ++# ++# Processor Features ++# ++CONFIG_ARM_THUMB=y ++# CONFIG_CPU_ICACHE_DISABLE is not set ++# CONFIG_CPU_DCACHE_DISABLE is not set ++# CONFIG_CPU_DCACHE_WRITETHROUGH is not set ++# CONFIG_OUTER_CACHE is not set ++ ++# ++# Bus support ++# ++# CONFIG_ARCH_SUPPORTS_MSI is not set ++ ++# ++# PCCARD (PCMCIA/CardBus) support ++# ++CONFIG_PCCARD=y ++# CONFIG_PCMCIA_DEBUG is not set ++CONFIG_PCMCIA=y ++CONFIG_PCMCIA_LOAD_CIS=y ++CONFIG_PCMCIA_IOCTL=y ++ ++# ++# PC-card bridges ++# ++CONFIG_AT91_CF=y ++ ++# ++# Kernel Features ++# ++# CONFIG_TICK_ONESHOT is not set ++CONFIG_PREEMPT=y ++# CONFIG_NO_IDLE_HZ is not set ++CONFIG_HZ=100 ++# CONFIG_AEABI 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_RESOURCES_64BIT is not set ++CONFIG_ZONE_DMA_FLAG=1 ++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="rootfstype=reiserfs root=/dev/mmcblk0p1 console=ttyS0,115200n8 rootdelay=1" ++# CONFIG_XIP_KERNEL is not set ++# CONFIG_KEXEC 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_XFRM=y ++# CONFIG_XFRM_USER is not set ++# CONFIG_XFRM_SUB_POLICY is not set ++# CONFIG_XFRM_MIGRATE is not set ++# 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=y ++# CONFIG_IP_PNP_BOOTP is not set ++# CONFIG_IP_PNP_RARP is not set ++# CONFIG_NET_IPIP is not set ++# CONFIG_NET_IPGRE is not set ++# CONFIG_ARPD is not set ++# CONFIG_SYN_COOKIES is not set ++# CONFIG_INET_AH is not set ++# CONFIG_INET_ESP is not set ++# CONFIG_INET_IPCOMP is not set ++# CONFIG_INET_XFRM_TUNNEL is not set ++# CONFIG_INET_TUNNEL is not set ++CONFIG_INET_XFRM_MODE_TRANSPORT=y ++CONFIG_INET_XFRM_MODE_TUNNEL=y ++CONFIG_INET_XFRM_MODE_BEET=y ++CONFIG_INET_DIAG=y ++CONFIG_INET_TCP_DIAG=y ++# CONFIG_TCP_CONG_ADVANCED is not set ++CONFIG_TCP_CONG_CUBIC=y ++CONFIG_DEFAULT_TCP_CONG="cubic" ++# CONFIG_TCP_MD5SIG is not set ++# CONFIG_IPV6 is not set ++# CONFIG_INET6_XFRM_TUNNEL is not set ++# CONFIG_INET6_TUNNEL is not set ++# CONFIG_NETWORK_SECMARK is not set ++# CONFIG_NETFILTER is not set ++# CONFIG_IP_DCCP is not set ++# CONFIG_IP_SCTP is not set ++# CONFIG_TIPC is not set ++# CONFIG_ATM is not set ++# CONFIG_BRIDGE is not set ++# CONFIG_VLAN_8021Q is not set ++# CONFIG_DECNET is not set ++# CONFIG_LLC2 is not set ++# CONFIG_IPX is not set ++# CONFIG_ATALK is not set ++# CONFIG_X25 is not set ++# CONFIG_LAPB is not set ++# CONFIG_ECONET is not set ++# CONFIG_WAN_ROUTER is not set ++ ++# ++# QoS and/or fair queueing ++# ++# CONFIG_NET_SCHED is not set ++CONFIG_NET_SCH_FIFO=y ++ ++# ++# Network testing ++# ++# CONFIG_NET_PKTGEN is not set ++# CONFIG_HAMRADIO is not set ++# CONFIG_IRDA is not set ++# CONFIG_BT is not set ++# CONFIG_AF_RXRPC is not set ++ ++# ++# Wireless ++# ++CONFIG_CFG80211=y ++CONFIG_WIRELESS_EXT=y ++CONFIG_MAC80211=y ++# CONFIG_MAC80211_DEBUG is not set ++CONFIG_IEEE80211=y ++# CONFIG_IEEE80211_DEBUG is not set ++CONFIG_IEEE80211_CRYPT_WEP=y ++# CONFIG_IEEE80211_CRYPT_CCMP is not set ++# CONFIG_IEEE80211_CRYPT_TKIP is not set ++CONFIG_IEEE80211_SOFTMAC=y ++CONFIG_IEEE80211_SOFTMAC_DEBUG=y ++# CONFIG_RFKILL is not set ++ ++# ++# Device Drivers ++# ++ ++# ++# Generic Driver Options ++# ++# CONFIG_STANDALONE is not set ++# CONFIG_PREVENT_FIRMWARE_BUILD is not set ++CONFIG_FW_LOADER=y ++# CONFIG_SYS_HYPERVISOR is not set ++ ++# ++# Connector - unified userspace <-> kernelspace linker ++# ++# CONFIG_CONNECTOR is not set ++CONFIG_MTD=y ++# CONFIG_MTD_DEBUG is not set ++# CONFIG_MTD_CONCAT is not set ++CONFIG_MTD_PARTITIONS=y ++# CONFIG_MTD_REDBOOT_PARTS is not set ++CONFIG_MTD_CMDLINE_PARTS=y ++CONFIG_MTD_AFS_PARTS=y ++ ++# ++# User Modules And Translation Layers ++# ++CONFIG_MTD_CHAR=y ++CONFIG_MTD_BLKDEVS=y ++CONFIG_MTD_BLOCK=y ++# CONFIG_FTL is not set ++# CONFIG_NFTL is not set ++# CONFIG_INFTL is not set ++# CONFIG_RFD_FTL is not set ++# CONFIG_SSFDC is not set ++ ++# ++# RAM/ROM/Flash chip drivers ++# ++# CONFIG_MTD_CFI is not set ++# CONFIG_MTD_JEDECPROBE is not set ++CONFIG_MTD_MAP_BANK_WIDTH_1=y ++CONFIG_MTD_MAP_BANK_WIDTH_2=y ++CONFIG_MTD_MAP_BANK_WIDTH_4=y ++# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set ++# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set ++# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set ++CONFIG_MTD_CFI_I1=y ++CONFIG_MTD_CFI_I2=y ++# CONFIG_MTD_CFI_I4 is not set ++# CONFIG_MTD_CFI_I8 is not set ++# CONFIG_MTD_RAM is not set ++# CONFIG_MTD_ROM is not set ++# CONFIG_MTD_ABSENT is not set ++ ++# ++# Mapping drivers for chip access ++# ++# CONFIG_MTD_COMPLEX_MAPPINGS is not set ++# CONFIG_MTD_PLATRAM is not set ++ ++# ++# Self-contained MTD device drivers ++# ++CONFIG_MTD_DATAFLASH=y ++# CONFIG_MTD_M25P80 is not set ++# CONFIG_MTD_SLRAM is not set ++# CONFIG_MTD_PHRAM is not set ++# CONFIG_MTD_MTDRAM is not set ++# CONFIG_MTD_BLOCK2MTD is not set ++ ++# ++# Disk-On-Chip Device Drivers ++# ++# CONFIG_MTD_DOC2000 is not set ++# CONFIG_MTD_DOC2001 is not set ++# CONFIG_MTD_DOC2001PLUS is not set ++# CONFIG_MTD_NAND is not set ++# CONFIG_MTD_ONENAND is not set ++ ++# ++# UBI - Unsorted block images ++# ++# CONFIG_MTD_UBI is not set ++ ++# ++# Parallel port support ++# ++# CONFIG_PARPORT is not set ++ ++# ++# Plug and Play support ++# ++# CONFIG_PNPACPI is not set ++ ++# ++# Block devices ++# ++# CONFIG_BLK_DEV_COW_COMMON is not set ++CONFIG_BLK_DEV_LOOP=y ++# CONFIG_BLK_DEV_CRYPTOLOOP is not set ++# CONFIG_BLK_DEV_NBD is not set ++# CONFIG_BLK_DEV_UB is not set ++# CONFIG_BLK_DEV_RAM is not set ++# CONFIG_CDROM_PKTCDVD is not set ++# CONFIG_ATA_OVER_ETH is not set ++# CONFIG_IDE is not set ++ ++# ++# SCSI device support ++# ++# CONFIG_RAID_ATTRS is not set ++CONFIG_SCSI=y ++# CONFIG_SCSI_TGT is not set ++# CONFIG_SCSI_NETLINK is not set ++CONFIG_SCSI_PROC_FS=y ++ ++# ++# SCSI support type (disk, tape, CD-ROM) ++# ++CONFIG_BLK_DEV_SD=y ++# CONFIG_CHR_DEV_ST is not set ++# CONFIG_CHR_DEV_OSST is not set ++# CONFIG_BLK_DEV_SR is not set ++CONFIG_CHR_DEV_SG=y ++# CONFIG_CHR_DEV_SCH is not set ++ ++# ++# Some SCSI devices (e.g. CD jukebox) support multiple LUNs ++# ++# CONFIG_SCSI_MULTI_LUN is not set ++# CONFIG_SCSI_CONSTANTS is not set ++# CONFIG_SCSI_LOGGING is not set ++# CONFIG_SCSI_SCAN_ASYNC is not set ++CONFIG_SCSI_WAIT_SCAN=m ++ ++# ++# SCSI Transports ++# ++# CONFIG_SCSI_SPI_ATTRS is not set ++# CONFIG_SCSI_FC_ATTRS is not set ++# CONFIG_SCSI_ISCSI_ATTRS is not set ++# CONFIG_SCSI_SAS_ATTRS is not set ++# CONFIG_SCSI_SAS_LIBSAS is not set ++ ++# ++# SCSI low-level drivers ++# ++# CONFIG_ISCSI_TCP is not set ++# CONFIG_SCSI_DEBUG is not set ++ ++# ++# PCMCIA SCSI adapter support ++# ++# CONFIG_PCMCIA_AHA152X is not set ++# CONFIG_PCMCIA_FDOMAIN is not set ++# CONFIG_PCMCIA_NINJA_SCSI is not set ++# CONFIG_PCMCIA_QLOGIC is not set ++# CONFIG_PCMCIA_SYM53C500 is not set ++# CONFIG_ATA is not set ++ ++# ++# Multi-device support (RAID and LVM) ++# ++# CONFIG_MD is not set ++ ++# ++# 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 ++# 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 ++# CONFIG_NETDEV_1000 is not set ++# CONFIG_NETDEV_10000 is not set ++ ++# ++# Wireless LAN ++# ++# CONFIG_WLAN_PRE80211 is not set ++# CONFIG_WLAN_80211 is not set ++ ++# ++# 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_MII is not set ++# CONFIG_USB_USBNET is not set ++# CONFIG_NET_PCMCIA is not set ++# CONFIG_WAN is not set ++CONFIG_PPP=y ++CONFIG_PPP_MULTILINK=y ++CONFIG_PPP_FILTER=y ++CONFIG_PPP_ASYNC=y ++# CONFIG_PPP_SYNC_TTY is not set ++# CONFIG_PPP_DEFLATE is not set ++# CONFIG_PPP_BSDCOMP is not set ++# CONFIG_PPP_MPPE is not set ++# CONFIG_PPPOE is not set ++# CONFIG_SLIP is not set ++CONFIG_SLHC=y ++# 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 ++# CONFIG_INPUT_FF_MEMLESS is not set ++ ++# ++# Userland interfaces ++# ++CONFIG_INPUT_MOUSEDEV=y ++# CONFIG_INPUT_MOUSEDEV_PSAUX is not set ++CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 ++CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 ++# CONFIG_INPUT_JOYDEV is not set ++# CONFIG_INPUT_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_TABLET is not set ++# CONFIG_INPUT_TOUCHSCREEN is not set ++# CONFIG_INPUT_MISC is not set ++ ++# ++# Hardware I/O ports ++# ++# CONFIG_SERIO is not set ++# CONFIG_GAMEPORT is not set ++ ++# ++# Character devices ++# ++CONFIG_VT=y ++CONFIG_VT_CONSOLE=y ++CONFIG_HW_CONSOLE=y ++# CONFIG_VT_HW_CONSOLE_BINDING is not set ++# CONFIG_SERIAL_NONSTANDARD is not set ++ ++# ++# Serial drivers ++# ++# CONFIG_SERIAL_8250 is not set ++ ++# ++# Non-8250 serial port support ++# ++CONFIG_SERIAL_ATMEL=y ++CONFIG_SERIAL_ATMEL_CONSOLE=y ++# CONFIG_SERIAL_ATMEL_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 ++CONFIG_WATCHDOG=y ++CONFIG_WATCHDOG_NOWAYOUT=y ++ ++# ++# Watchdog Device Drivers ++# ++# CONFIG_SOFT_WATCHDOG is not set ++# CONFIG_AT91RM9200_WATCHDOG is not set ++ ++# ++# USB-based Watchdog Cards ++# ++# CONFIG_USBPCWATCHDOG is not set ++CONFIG_HW_RANDOM=y ++# CONFIG_NVRAM is not set ++# CONFIG_R3964 is not set ++ ++# ++# PCMCIA character devices ++# ++# CONFIG_SYNCLINK_CS is not set ++# CONFIG_CARDMAN_4000 is not set ++# CONFIG_CARDMAN_4040 is not set ++# CONFIG_RAW_DRIVER is not set ++ ++# ++# TPM devices ++# ++# CONFIG_TCG_TPM is not set ++# CONFIG_AT91_SPI is not set ++CONFIG_I2C=y ++CONFIG_I2C_BOARDINFO=y ++CONFIG_I2C_CHARDEV=y ++ ++# ++# I2C Algorithms ++# ++CONFIG_I2C_ALGOBIT=y ++# CONFIG_I2C_ALGOPCF is not set ++# CONFIG_I2C_ALGOPCA is not set ++ ++# ++# I2C Hardware Bus support ++# ++CONFIG_I2C_GPIO=y ++# CONFIG_I2C_GPIO is not set ++# CONFIG_I2C_OCORES is not set ++# CONFIG_I2C_PARPORT_LIGHT is not set ++# CONFIG_I2C_SIMTEC is not set ++# CONFIG_I2C_STUB is not set ++# CONFIG_I2C_TINY_USB is not set ++# CONFIG_I2C_PCA 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_MAX6875 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 ++ ++# ++# SPI support ++# ++CONFIG_SPI=y ++CONFIG_SPI_MASTER=y ++ ++# ++# SPI Master Controller Drivers ++# ++# CONFIG_SPI_ATMEL is not set ++CONFIG_SPI_BITBANG=y ++CONFIG_SPI_AT91=y ++ ++# ++# SPI Protocol Masters ++# ++# CONFIG_SPI_AT25 is not set ++# CONFIG_SPI_SPIDEV is not set ++ ++# ++# Dallas's 1-wire bus ++# ++# CONFIG_W1 is not set ++CONFIG_HWMON=y ++# CONFIG_HWMON_VID is not set ++# CONFIG_SENSORS_ABITUGURU is not set ++# CONFIG_SENSORS_AD7418 is not set ++# CONFIG_SENSORS_ADM1021 is not set ++# CONFIG_SENSORS_ADM1025 is not set ++# CONFIG_SENSORS_ADM1026 is not set ++# CONFIG_SENSORS_ADM1029 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_F71805F 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_LM70 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_MAX6650 is not set ++# CONFIG_SENSORS_PC87360 is not set ++# CONFIG_SENSORS_PC87427 is not set ++# CONFIG_SENSORS_SMSC47M1 is not set ++# CONFIG_SENSORS_SMSC47M192 is not set ++# CONFIG_SENSORS_SMSC47B397 is not set ++# CONFIG_SENSORS_VT1211 is not set ++# CONFIG_SENSORS_W83781D is not set ++# CONFIG_SENSORS_W83791D is not set ++# CONFIG_SENSORS_W83792D is not set ++# CONFIG_SENSORS_W83793 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 ++# ++# CONFIG_BLINK is not set ++ ++# ++# Multifunction device drivers ++# ++# CONFIG_MFD_SM501 is not set ++ ++# ++# LED devices ++# ++CONFIG_NEW_LEDS=y ++CONFIG_LEDS_CLASS=y ++ ++# ++# LED drivers ++# ++ ++# ++# LED Triggers ++# ++# CONFIG_LEDS_TRIGGERS is not set ++ ++# ++# Multimedia devices ++# ++# CONFIG_VIDEO_DEV is not set ++# CONFIG_DVB_CORE is not set ++CONFIG_DAB=y ++# CONFIG_USB_DABUSB is not set ++ ++# ++# Graphics support ++# ++# CONFIG_BACKLIGHT_LCD_SUPPORT is not set ++ ++# ++# Display device support ++# ++# CONFIG_DISPLAY_SUPPORT is not set ++# CONFIG_VGASTATE is not set ++# CONFIG_FB is not set ++ ++# ++# Console display driver support ++# ++# CONFIG_VGA_CONSOLE is not set ++CONFIG_DUMMY_CONSOLE=y ++ ++# ++# Sound ++# ++# CONFIG_SOUND is not set ++ ++# ++# HID Devices ++# ++CONFIG_HID=y ++# CONFIG_HID_DEBUG 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 ++ ++# ++# USB support ++# ++CONFIG_USB_ARCH_HAS_HCD=y ++CONFIG_USB_ARCH_HAS_OHCI=y ++# CONFIG_USB_ARCH_HAS_EHCI is not set ++CONFIG_USB=y ++# CONFIG_USB_DEBUG is not set ++ ++# ++# Miscellaneous USB options ++# ++CONFIG_USB_DEVICEFS=y ++# CONFIG_USB_DEVICE_CLASS is not set ++# CONFIG_USB_DYNAMIC_MINORS is not set ++# CONFIG_USB_OTG is not set ++ ++# ++# USB Host Controller Drivers ++# ++# CONFIG_USB_ISP116X_HCD is not set ++CONFIG_USB_OHCI_HCD=y ++# CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set ++# CONFIG_USB_OHCI_BIG_ENDIAN_MMIO is not set ++CONFIG_USB_OHCI_LITTLE_ENDIAN=y ++# CONFIG_USB_SL811_HCD is not set ++ ++# ++# USB Device Class drivers ++# ++# CONFIG_USB_ACM is not set ++CONFIG_USB_PRINTER=y ++ ++# ++# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' ++# ++ ++# ++# may also be needed; see USB_STORAGE Help for more information ++# ++CONFIG_USB_STORAGE=y ++# CONFIG_USB_STORAGE_DEBUG is not set ++# CONFIG_USB_STORAGE_DATAFAB is not set ++# CONFIG_USB_STORAGE_FREECOM is not set ++# CONFIG_USB_STORAGE_DPCM is not set ++# CONFIG_USB_STORAGE_USBAT is not set ++# CONFIG_USB_STORAGE_SDDR09 is not set ++# CONFIG_USB_STORAGE_SDDR55 is not set ++# CONFIG_USB_STORAGE_JUMPSHOT is not set ++# CONFIG_USB_STORAGE_ALAUDA is not set ++# CONFIG_USB_STORAGE_KARMA is not set ++# CONFIG_USB_LIBUSUAL is not set ++ ++# ++# USB Imaging devices ++# ++# CONFIG_USB_MDC800 is not set ++# CONFIG_USB_MICROTEK is not set ++# CONFIG_USB_MON is not set ++ ++# ++# 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_ADUTUX 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_BERRY_CHARGE is not set ++# CONFIG_USB_LED is not set ++# CONFIG_USB_CYPRESS_CY7C63 is not set ++# CONFIG_USB_CYTHERM is not set ++# CONFIG_USB_PHIDGET is not set ++# CONFIG_USB_IDMOUSE is not set ++# CONFIG_USB_FTDI_ELAN is not set ++# CONFIG_USB_APPLEDISPLAY is not set ++# CONFIG_USB_LD is not set ++# CONFIG_USB_TRANCEVIBRATOR is not set ++# CONFIG_USB_IOWARRIOR is not set ++# CONFIG_USB_TEST is not set ++ ++# ++# 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_FSL_USB2 is not set ++# 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 ++# CONFIG_USB_MIDI_GADGET is not set ++CONFIG_MMC=y ++CONFIG_MMC_DEBUG=y ++# CONFIG_MMC_UNSAFE_RESUME is not set ++ ++# ++# MMC/SD Card Drivers ++# ++CONFIG_MMC_BLOCK=y ++ ++# ++# MMC/SD Host Controller Drivers ++# ++CONFIG_MMC_AT91=y ++ ++# ++# Real Time Clock ++# ++CONFIG_RTC_LIB=y ++CONFIG_RTC_CLASS=y ++# CONFIG_RTC_HCTOSYS is not set ++# CONFIG_RTC_DEBUG is not set ++ ++# ++# RTC interfaces ++# ++CONFIG_RTC_INTF_SYSFS=y ++CONFIG_RTC_INTF_PROC=y ++CONFIG_RTC_INTF_DEV=y ++# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set ++# CONFIG_RTC_DRV_TEST is not set ++ ++# ++# I2C RTC drivers ++# ++# CONFIG_RTC_DRV_DS1307 is not set ++# CONFIG_RTC_DRV_DS1672 is not set ++# CONFIG_RTC_DRV_MAX6900 is not set ++# CONFIG_RTC_DRV_RS5C372 is not set ++# CONFIG_RTC_DRV_ISL1208 is not set ++# CONFIG_RTC_DRV_X1205 is not set ++# CONFIG_RTC_DRV_PCF8563 is not set ++# CONFIG_RTC_DRV_PCF8583 is not set ++ ++# ++# SPI RTC drivers ++# ++# CONFIG_RTC_DRV_RS5C348 is not set ++# CONFIG_RTC_DRV_MAX6902 is not set ++ ++# ++# Platform RTC drivers ++# ++# CONFIG_RTC_DRV_CMOS is not set ++# CONFIG_RTC_DRV_DS1553 is not set ++# CONFIG_RTC_DRV_DS1742 is not set ++# CONFIG_RTC_DRV_M48T86 is not set ++# CONFIG_RTC_DRV_V3020 is not set ++ ++# ++# on-CPU RTC drivers ++# ++CONFIG_RTC_DRV_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=y ++CONFIG_EXT3_FS_XATTR=y ++# CONFIG_EXT3_FS_POSIX_ACL is not set ++# CONFIG_EXT3_FS_SECURITY is not set ++# CONFIG_EXT4DEV_FS is not set ++CONFIG_JBD=y ++# CONFIG_JBD_DEBUG is not set ++CONFIG_FS_MBCACHE=y ++CONFIG_REISERFS_FS=y ++# CONFIG_REISERFS_CHECK is not set ++# CONFIG_REISERFS_PROC_INFO is not set ++# CONFIG_REISERFS_FS_XATTR is not set ++# CONFIG_JFS_FS is not set ++CONFIG_FS_POSIX_ACL=y ++# CONFIG_XFS_FS is not set ++# CONFIG_GFS2_FS is not set ++# CONFIG_OCFS2_FS is not set ++# CONFIG_MINIX_FS is not set ++# CONFIG_ROMFS_FS is not set ++CONFIG_INOTIFY=y ++CONFIG_INOTIFY_USER=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_PROC_SYSCTL=y ++CONFIG_SYSFS=y ++CONFIG_TMPFS=y ++# CONFIG_TMPFS_POSIX_ACL is not set ++# CONFIG_HUGETLB_PAGE is not set ++CONFIG_RAMFS=y ++CONFIG_CONFIGFS_FS=y ++ ++# ++# 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_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=y ++CONFIG_NFS_V3=y ++CONFIG_NFS_V3_ACL=y ++CONFIG_NFS_V4=y ++# CONFIG_NFS_DIRECTIO is not set ++# CONFIG_NFSD is not set ++CONFIG_ROOT_NFS=y ++CONFIG_LOCKD=y ++CONFIG_LOCKD_V4=y ++CONFIG_NFS_ACL_SUPPORT=y ++CONFIG_NFS_COMMON=y ++CONFIG_SUNRPC=y ++CONFIG_SUNRPC_GSS=y ++# CONFIG_SUNRPC_BIND34 is not set ++CONFIG_RPCSEC_GSS_KRB5=y ++# CONFIG_RPCSEC_GSS_SPKM3 is not set ++# CONFIG_SMB_FS is not set ++# CONFIG_CIFS is not set ++# CONFIG_NCP_FS is not set ++# CONFIG_CODA_FS is not set ++# CONFIG_AFS_FS is not set ++# CONFIG_9P_FS is not set ++ ++# ++# Partition Types ++# ++CONFIG_PARTITION_ADVANCED=y ++# CONFIG_ACORN_PARTITION is not set ++# CONFIG_OSF_PARTITION is not set ++# CONFIG_AMIGA_PARTITION is not set ++# CONFIG_ATARI_PARTITION is not set ++# CONFIG_MAC_PARTITION is not set ++CONFIG_MSDOS_PARTITION=y ++# CONFIG_BSD_DISKLABEL is not set ++# CONFIG_MINIX_SUBPARTITION is not set ++# CONFIG_SOLARIS_X86_PARTITION is not set ++# CONFIG_UNIXWARE_DISKLABEL is not set ++# CONFIG_LDM_PARTITION is not set ++# CONFIG_SGI_PARTITION is not set ++# CONFIG_ULTRIX_PARTITION is not set ++# CONFIG_SUN_PARTITION is not set ++# CONFIG_KARMA_PARTITION is not set ++# CONFIG_EFI_PARTITION is not set ++# CONFIG_SYSV68_PARTITION is not set ++ ++# ++# Native Language Support ++# ++CONFIG_NLS=y ++CONFIG_NLS_DEFAULT="iso8859-1" ++# CONFIG_NLS_CODEPAGE_437 is not set ++# CONFIG_NLS_CODEPAGE_737 is not set ++# CONFIG_NLS_CODEPAGE_775 is not set ++# CONFIG_NLS_CODEPAGE_850 is not set ++# CONFIG_NLS_CODEPAGE_852 is not set ++# CONFIG_NLS_CODEPAGE_855 is not set ++# CONFIG_NLS_CODEPAGE_857 is not set ++# CONFIG_NLS_CODEPAGE_860 is not set ++# CONFIG_NLS_CODEPAGE_861 is not set ++# CONFIG_NLS_CODEPAGE_862 is not set ++# CONFIG_NLS_CODEPAGE_863 is not set ++# CONFIG_NLS_CODEPAGE_864 is not set ++# CONFIG_NLS_CODEPAGE_865 is not set ++# CONFIG_NLS_CODEPAGE_866 is not set ++# CONFIG_NLS_CODEPAGE_869 is not set ++# CONFIG_NLS_CODEPAGE_936 is not set ++# CONFIG_NLS_CODEPAGE_950 is not set ++# CONFIG_NLS_CODEPAGE_932 is not set ++# CONFIG_NLS_CODEPAGE_949 is not set ++# CONFIG_NLS_CODEPAGE_874 is not set ++# CONFIG_NLS_ISO8859_8 is not set ++# CONFIG_NLS_CODEPAGE_1250 is not set ++# CONFIG_NLS_CODEPAGE_1251 is not set ++# CONFIG_NLS_ASCII is not set ++# CONFIG_NLS_ISO8859_1 is not set ++# CONFIG_NLS_ISO8859_2 is not set ++# CONFIG_NLS_ISO8859_3 is not set ++# CONFIG_NLS_ISO8859_4 is not set ++# CONFIG_NLS_ISO8859_5 is not set ++# CONFIG_NLS_ISO8859_6 is not set ++# CONFIG_NLS_ISO8859_7 is not set ++# CONFIG_NLS_ISO8859_9 is not set ++# CONFIG_NLS_ISO8859_13 is not set ++# CONFIG_NLS_ISO8859_14 is not set ++# CONFIG_NLS_ISO8859_15 is not set ++# CONFIG_NLS_KOI8_R is not set ++# CONFIG_NLS_KOI8_U is not set ++# CONFIG_NLS_UTF8 is not set ++ ++# ++# Distributed Lock Manager ++# ++# CONFIG_DLM is not set ++ ++# ++# Profiling support ++# ++# CONFIG_PROFILING is not set ++ ++# ++# Kernel hacking ++# ++# CONFIG_PRINTK_TIME is not set ++CONFIG_ENABLE_MUST_CHECK=y ++# CONFIG_MAGIC_SYSRQ is not set ++# CONFIG_UNUSED_SYMBOLS is not set ++# CONFIG_DEBUG_FS is not set ++# CONFIG_HEADERS_CHECK is not set ++# CONFIG_DEBUG_KERNEL is not set ++CONFIG_DEBUG_BUGVERBOSE=y ++CONFIG_FRAME_POINTER=y ++CONFIG_DEBUG_USER=y ++ ++# ++# Security options ++# ++# CONFIG_KEYS is not set ++# CONFIG_SECURITY is not set ++ ++# ++# Cryptographic options ++# ++CONFIG_CRYPTO=y ++CONFIG_CRYPTO_ALGAPI=y ++CONFIG_CRYPTO_BLKCIPHER=y ++CONFIG_CRYPTO_MANAGER=y ++# CONFIG_CRYPTO_HMAC is not set ++# CONFIG_CRYPTO_XCBC is not set ++# CONFIG_CRYPTO_NULL is not set ++# CONFIG_CRYPTO_MD4 is not set ++CONFIG_CRYPTO_MD5=y ++CONFIG_CRYPTO_SHA1=y ++# CONFIG_CRYPTO_SHA256 is not set ++# CONFIG_CRYPTO_SHA512 is not set ++# CONFIG_CRYPTO_WP512 is not set ++# CONFIG_CRYPTO_TGR192 is not set ++# CONFIG_CRYPTO_GF128MUL is not set ++CONFIG_CRYPTO_ECB=y ++CONFIG_CRYPTO_CBC=y ++CONFIG_CRYPTO_PCBC=y ++# CONFIG_CRYPTO_LRW is not set ++# CONFIG_CRYPTO_CRYPTD is not set ++CONFIG_CRYPTO_DES=y ++# CONFIG_CRYPTO_FCRYPT is not set ++# CONFIG_CRYPTO_BLOWFISH is not set ++# CONFIG_CRYPTO_TWOFISH is not set ++# CONFIG_CRYPTO_SERPENT is not set ++CONFIG_CRYPTO_AES=y ++# CONFIG_CRYPTO_CAST5 is not set ++# CONFIG_CRYPTO_CAST6 is not set ++# CONFIG_CRYPTO_TEA is not set ++CONFIG_CRYPTO_ARC4=y ++# CONFIG_CRYPTO_KHAZAD is not set ++# CONFIG_CRYPTO_ANUBIS is not set ++# CONFIG_CRYPTO_DEFLATE is not set ++# CONFIG_CRYPTO_MICHAEL_MIC is not set ++# CONFIG_CRYPTO_CRC32C is not set ++# CONFIG_CRYPTO_CAMELLIA is not set ++# CONFIG_CRYPTO_TEST is not set ++ ++# ++# Hardware crypto devices ++# ++ ++# ++# Library routines ++# ++CONFIG_BITREVERSE=y ++CONFIG_CRC_CCITT=y ++# CONFIG_CRC16 is not set ++# CONFIG_CRC_ITU_T is not set ++CONFIG_CRC32=y ++# CONFIG_LIBCRC32C is not set ++CONFIG_ZLIB_INFLATE=y ++CONFIG_PLIST=y ++CONFIG_HAS_IOMEM=y ++CONFIG_HAS_IOPORT=y ++CONFIG_HAS_DMA=y +diff -urN -x CVS linux-2.6.24/arch/arm/configs/homematic_defconfig linux-2.6/arch/arm/configs/homematic_defconfig +--- linux-2.6.24/arch/arm/configs/homematic_defconfig 1970-01-01 02:00:00.000000000 +0200 ++++ linux-2.6/arch/arm/configs/homematic_defconfig 2007-12-31 15:18:42.000000000 +0200 +@@ -0,0 +1,1263 @@ ++# ++# Automatically generated make config: don't edit ++# Linux kernel version: 2.6.21.3 ++# Mon Jun 18 12:28:42 2007 ++# ++CONFIG_ARM=y ++CONFIG_SYS_SUPPORTS_APM_EMULATION=y ++CONFIG_GENERIC_GPIO=y ++# CONFIG_GENERIC_TIME is not set ++CONFIG_MMU=y ++# CONFIG_NO_IOPORT is not set ++CONFIG_GENERIC_HARDIRQS=y ++CONFIG_TRACE_IRQFLAGS_SUPPORT=y ++CONFIG_HARDIRQS_SW_RESEND=y ++CONFIG_GENERIC_IRQ_PROBE=y ++CONFIG_RWSEM_GENERIC_SPINLOCK=y ++# CONFIG_ARCH_HAS_ILOG2_U32 is not set ++# CONFIG_ARCH_HAS_ILOG2_U64 is not set ++CONFIG_GENERIC_HWEIGHT=y ++CONFIG_GENERIC_CALIBRATE_DELAY=y ++CONFIG_ZONE_DMA=y ++CONFIG_VECTORS_BASE=0xffff0000 ++CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" ++ ++# ++# Code maturity level options ++# ++CONFIG_EXPERIMENTAL=y ++CONFIG_BROKEN_ON_SMP=y ++CONFIG_INIT_ENV_ARG_LIMIT=32 ++ ++# ++# General setup ++# ++CONFIG_LOCALVERSION="" ++CONFIG_LOCALVERSION_AUTO=y ++# CONFIG_SWAP is not set ++CONFIG_SYSVIPC=y ++# CONFIG_IPC_NS is not set ++CONFIG_SYSVIPC_SYSCTL=y ++# CONFIG_POSIX_MQUEUE is not set ++# CONFIG_BSD_PROCESS_ACCT is not set ++# CONFIG_TASKSTATS is not set ++# CONFIG_UTS_NS is not set ++# CONFIG_AUDIT is not set ++# CONFIG_IKCONFIG is not set ++# CONFIG_SYSFS_DEPRECATED is not set ++# CONFIG_RELAY is not set ++CONFIG_BLK_DEV_INITRD=y ++CONFIG_INITRAMFS_SOURCE="" ++# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set ++CONFIG_SYSCTL=y ++# CONFIG_EMBEDDED is not set ++CONFIG_UID16=y ++CONFIG_SYSCTL_SYSCALL=y ++CONFIG_KALLSYMS=y ++# CONFIG_KALLSYMS_EXTRA_PASS is not set ++CONFIG_HOTPLUG=y ++CONFIG_PRINTK=y ++CONFIG_BUG=y ++CONFIG_ELF_CORE=y ++CONFIG_BASE_FULL=y ++CONFIG_FUTEX=y ++CONFIG_EPOLL=y ++CONFIG_SHMEM=y ++CONFIG_SLAB=y ++CONFIG_VM_EVENT_COUNTERS=y ++CONFIG_RT_MUTEXES=y ++# CONFIG_TINY_SHMEM is not set ++CONFIG_BASE_SMALL=0 ++# CONFIG_SLOB is not set ++ ++# ++# Loadable module support ++# ++CONFIG_MODULES=y ++CONFIG_MODULE_UNLOAD=y ++# CONFIG_MODULE_FORCE_UNLOAD is not set ++# CONFIG_MODVERSIONS is not set ++# CONFIG_MODULE_SRCVERSION_ALL is not set ++CONFIG_KMOD=y ++ ++# ++# Block layer ++# ++CONFIG_BLOCK=y ++# CONFIG_LBD is not set ++# CONFIG_BLK_DEV_IO_TRACE is not set ++# CONFIG_LSF is not set ++ ++# ++# IO Schedulers ++# ++CONFIG_IOSCHED_NOOP=y ++# CONFIG_IOSCHED_AS is not set ++CONFIG_IOSCHED_DEADLINE=y ++# CONFIG_IOSCHED_CFQ is not set ++# CONFIG_DEFAULT_AS is not set ++CONFIG_DEFAULT_DEADLINE=y ++# CONFIG_DEFAULT_CFQ is not set ++# CONFIG_DEFAULT_NOOP is not set ++CONFIG_DEFAULT_IOSCHED="deadline" ++ ++# ++# System Type ++# ++# CONFIG_ARCH_AAEC2000 is not set ++# CONFIG_ARCH_INTEGRATOR is not set ++# CONFIG_ARCH_REALVIEW is not set ++# CONFIG_ARCH_VERSATILE is not set ++CONFIG_ARCH_AT91=y ++# CONFIG_ARCH_CLPS7500 is not set ++# CONFIG_ARCH_CLPS711X is not set ++# CONFIG_ARCH_CO285 is not set ++# CONFIG_ARCH_EBSA110 is not set ++# CONFIG_ARCH_EP93XX is not set ++# CONFIG_ARCH_FOOTBRIDGE is not set ++# CONFIG_ARCH_NETX is not set ++# CONFIG_ARCH_H720X is not set ++# CONFIG_ARCH_IMX is not set ++# CONFIG_ARCH_IOP32X is not set ++# CONFIG_ARCH_IOP33X is not set ++# CONFIG_ARCH_IOP13XX is not set ++# CONFIG_ARCH_IXP4XX is not set ++# CONFIG_ARCH_IXP2000 is not set ++# CONFIG_ARCH_IXP23XX is not set ++# CONFIG_ARCH_L7200 is not set ++# CONFIG_ARCH_NS9XXX is not set ++# CONFIG_ARCH_PNX4008 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 ++ ++# ++# Atmel AT91 System-on-Chip ++# ++CONFIG_ARCH_AT91RM9200=y ++# CONFIG_ARCH_AT91SAM9260 is not set ++# CONFIG_ARCH_AT91SAM9261 is not set ++# CONFIG_ARCH_AT91SAM9263 is not set ++# CONFIG_ARCH_AT91SAM9RL is not set ++ ++# ++# AT91RM9200 Board Type ++# ++# CONFIG_MACH_ONEARM is not set ++# CONFIG_ARCH_AT91RM9200DK is not set ++# CONFIG_MACH_AT91RM9200EK is not set ++# CONFIG_MACH_CSB337 is not set ++# CONFIG_MACH_CSB637 is not set ++# CONFIG_MACH_CARMEVA is not set ++# CONFIG_MACH_ATEB9200 is not set ++# CONFIG_MACH_KB9200 is not set ++# CONFIG_MACH_KAFA is not set ++# CONFIG_MACH_CHUB is not set ++CONFIG_MACH_HOMEMATIC=y ++ ++# ++# AT91 Board Options ++# ++ ++# ++# AT91 Feature Selections ++# ++# CONFIG_AT91_PROGRAMMABLE_CLOCKS is not set ++# CONFIG_ATMEL_TCLIB is not set ++ ++# ++# Processor Type ++# ++CONFIG_CPU_32=y ++CONFIG_CPU_ARM920T=y ++CONFIG_CPU_32v4T=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 ++CONFIG_CPU_CP15=y ++CONFIG_CPU_CP15_MMU=y ++ ++# ++# Processor Features ++# ++CONFIG_ARM_THUMB=y ++# CONFIG_CPU_ICACHE_DISABLE is not set ++# CONFIG_CPU_DCACHE_DISABLE is not set ++# CONFIG_CPU_DCACHE_WRITETHROUGH is not set ++# CONFIG_OUTER_CACHE is not set ++ ++# ++# Bus support ++# ++ ++# ++# PCCARD (PCMCIA/CardBus) support ++# ++# CONFIG_PCCARD is not set ++ ++# ++# Kernel Features ++# ++# CONFIG_PREEMPT is not set ++# CONFIG_NO_IDLE_HZ is not set ++CONFIG_HZ=100 ++# CONFIG_AEABI 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_RESOURCES_64BIT is not set ++CONFIG_ZONE_DMA_FLAG=1 ++# CONFIG_LEDS is not set ++CONFIG_ALIGNMENT_TRAP=y ++ ++# ++# Boot options ++# ++CONFIG_ZBOOT_ROM_TEXT=0x0 ++CONFIG_ZBOOT_ROM_BSS=0x0 ++CONFIG_CMDLINE="" ++# CONFIG_XIP_KERNEL is not set ++# CONFIG_KEXEC is not set ++ ++# ++# 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_NETDEBUG is not set ++CONFIG_PACKET=y ++# CONFIG_PACKET_MMAP is not set ++CONFIG_UNIX=y ++# CONFIG_NET_KEY is not set ++CONFIG_INET=y ++CONFIG_IP_MULTICAST=y ++# CONFIG_IP_ADVANCED_ROUTER is not set ++CONFIG_IP_FIB_HASH=y ++CONFIG_IP_PNP=y ++CONFIG_IP_PNP_DHCP=y ++# CONFIG_IP_PNP_BOOTP is not set ++# CONFIG_IP_PNP_RARP is not set ++# CONFIG_NET_IPIP is not set ++# CONFIG_NET_IPGRE is not set ++# CONFIG_IP_MROUTE is not set ++# CONFIG_ARPD is not set ++# CONFIG_SYN_COOKIES is not set ++# CONFIG_INET_AH is not set ++# CONFIG_INET_ESP is not set ++# CONFIG_INET_IPCOMP is not set ++# CONFIG_INET_XFRM_TUNNEL is not set ++# CONFIG_INET_TUNNEL is not set ++# CONFIG_INET_XFRM_MODE_TRANSPORT is not set ++# CONFIG_INET_XFRM_MODE_TUNNEL is not set ++# CONFIG_INET_XFRM_MODE_BEET is not set ++CONFIG_INET_DIAG=y ++CONFIG_INET_TCP_DIAG=y ++# CONFIG_TCP_CONG_ADVANCED is not set ++CONFIG_TCP_CONG_CUBIC=y ++CONFIG_DEFAULT_TCP_CONG="cubic" ++# CONFIG_TCP_MD5SIG is not set ++# CONFIG_IPV6 is not set ++# CONFIG_INET6_XFRM_TUNNEL is not set ++# CONFIG_INET6_TUNNEL is not set ++# CONFIG_NETWORK_SECMARK 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 ++ ++# ++# TIPC Configuration (EXPERIMENTAL) ++# ++# CONFIG_TIPC 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_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=m ++# CONFIG_IEEE80211_DEBUG is not set ++CONFIG_IEEE80211_CRYPT_WEP=m ++CONFIG_IEEE80211_CRYPT_CCMP=m ++CONFIG_IEEE80211_CRYPT_TKIP=m ++CONFIG_IEEE80211_SOFTMAC=m ++# CONFIG_IEEE80211_SOFTMAC_DEBUG is not set ++CONFIG_WIRELESS_EXT=y ++ ++# ++# Device Drivers ++# ++ ++# ++# Generic Driver Options ++# ++CONFIG_STANDALONE=y ++CONFIG_PREVENT_FIRMWARE_BUILD=y ++CONFIG_FW_LOADER=y ++# CONFIG_SYS_HYPERVISOR 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_BLKDEVS=y ++CONFIG_MTD_BLOCK=y ++# CONFIG_FTL is not set ++# CONFIG_NFTL is not set ++# CONFIG_INFTL is not set ++# CONFIG_RFD_FTL is not set ++# CONFIG_SSFDC is not set ++ ++# ++# RAM/ROM/Flash chip drivers ++# ++# CONFIG_MTD_CFI is not set ++# CONFIG_MTD_JEDECPROBE is not set ++CONFIG_MTD_MAP_BANK_WIDTH_1=y ++CONFIG_MTD_MAP_BANK_WIDTH_2=y ++CONFIG_MTD_MAP_BANK_WIDTH_4=y ++# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set ++# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set ++# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set ++CONFIG_MTD_CFI_I1=y ++CONFIG_MTD_CFI_I2=y ++# CONFIG_MTD_CFI_I4 is not set ++# CONFIG_MTD_CFI_I8 is not set ++# CONFIG_MTD_RAM is not set ++# CONFIG_MTD_ROM is not set ++# CONFIG_MTD_ABSENT is not set ++# CONFIG_MTD_OBSOLETE_CHIPS is not set ++ ++# ++# Mapping drivers for chip access ++# ++# CONFIG_MTD_COMPLEX_MAPPINGS is not set ++# CONFIG_MTD_PLATRAM is not set ++ ++# ++# Self-contained MTD device drivers ++# ++# CONFIG_MTD_SLRAM is not set ++# CONFIG_MTD_PHRAM is not set ++# CONFIG_MTD_MTDRAM is not set ++# CONFIG_MTD_BLOCK2MTD is not set ++ ++# ++# Disk-On-Chip Device Drivers ++# ++# CONFIG_MTD_DOC2000 is not set ++# CONFIG_MTD_DOC2001 is not set ++# CONFIG_MTD_DOC2001PLUS is not set ++CONFIG_MTD_AT91_DATAFLASH=y ++ ++# ++# NAND Flash Device Drivers ++# ++CONFIG_MTD_NAND=y ++# CONFIG_MTD_NAND_VERIFY_WRITE is not set ++# CONFIG_MTD_NAND_ECC_SMC is not set ++CONFIG_MTD_NAND_IDS=y ++# CONFIG_MTD_NAND_DISKONCHIP is not set ++CONFIG_MTD_NAND_AT91=y ++# CONFIG_MTD_NAND_NANDSIM 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 ++# ++# CONFIG_PNPACPI is not set ++ ++# ++# 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=4096 ++CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024 ++# CONFIG_CDROM_PKTCDVD is not set ++# CONFIG_ATA_OVER_ETH is not set ++ ++# ++# SCSI device support ++# ++# CONFIG_RAID_ATTRS is not set ++CONFIG_SCSI=y ++# CONFIG_SCSI_TGT is not set ++# CONFIG_SCSI_NETLINK is not set ++# CONFIG_SCSI_PROC_FS is not set ++ ++# ++# SCSI support type (disk, tape, CD-ROM) ++# ++CONFIG_BLK_DEV_SD=y ++# CONFIG_CHR_DEV_ST is not set ++# CONFIG_CHR_DEV_OSST is not set ++# CONFIG_BLK_DEV_SR is not set ++# CONFIG_CHR_DEV_SG is not set ++# CONFIG_CHR_DEV_SCH is not set ++ ++# ++# Some SCSI devices (e.g. CD jukebox) support multiple LUNs ++# ++# CONFIG_SCSI_MULTI_LUN is not set ++# CONFIG_SCSI_CONSTANTS is not set ++# CONFIG_SCSI_LOGGING is not set ++# CONFIG_SCSI_SCAN_ASYNC is not set ++ ++# ++# SCSI Transports ++# ++# CONFIG_SCSI_SPI_ATTRS is not set ++# CONFIG_SCSI_FC_ATTRS is not set ++# CONFIG_SCSI_ISCSI_ATTRS is not set ++# CONFIG_SCSI_SAS_ATTRS is not set ++# CONFIG_SCSI_SAS_LIBSAS is not set ++ ++# ++# SCSI low-level drivers ++# ++# CONFIG_ISCSI_TCP is not set ++# CONFIG_SCSI_DEBUG is not set ++ ++# ++# Serial ATA (prod) and Parallel ATA (experimental) drivers ++# ++# CONFIG_ATA 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=y ++# CONFIG_NET_WIRELESS_RTNETLINK is not set ++ ++# ++# Obsolete Wireless cards support (pre-802.11) ++# ++# CONFIG_STRIP is not set ++# CONFIG_USB_ZD1201 is not set ++# CONFIG_HOSTAP is not set ++CONFIG_ZD1211RW=m ++# CONFIG_ZD1211RW_DEBUG 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 ++# CONFIG_INPUT_FF_MEMLESS is not set ++ ++# ++# Userland interfaces ++# ++CONFIG_INPUT_MOUSEDEV=y ++# CONFIG_INPUT_MOUSEDEV_PSAUX is not set ++CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 ++CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 ++# CONFIG_INPUT_JOYDEV is not set ++# CONFIG_INPUT_TSDEV is not set ++# CONFIG_INPUT_EVDEV is not set ++# CONFIG_INPUT_EVBUG is not set ++ ++# ++# Input Device Drivers ++# ++CONFIG_INPUT_KEYBOARD=y ++CONFIG_KEYBOARD_ATKBD=y ++# CONFIG_KEYBOARD_SUNKBD is not set ++# CONFIG_KEYBOARD_LKKBD is not set ++# CONFIG_KEYBOARD_XTKBD is not set ++# CONFIG_KEYBOARD_NEWTON is not set ++# CONFIG_KEYBOARD_STOWAWAY is not set ++# CONFIG_KEYBOARD_GPIO 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=y ++CONFIG_SERIO_SERPORT=y ++CONFIG_SERIO_LIBPS2=y ++# CONFIG_SERIO_RAW is not set ++# CONFIG_GAMEPORT is not set ++ ++# ++# Character devices ++# ++CONFIG_VT=y ++CONFIG_VT_CONSOLE=y ++CONFIG_HW_CONSOLE=y ++# CONFIG_VT_HW_CONSOLE_BINDING is not set ++# CONFIG_SERIAL_NONSTANDARD is not set ++ ++# ++# Serial drivers ++# ++# CONFIG_SERIAL_8250 is not set ++ ++# ++# Non-8250 serial port support ++# ++CONFIG_SERIAL_ATMEL=y ++CONFIG_SERIAL_ATMEL_CONSOLE=y ++# CONFIG_SERIAL_ATMEL_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_AT91RM9200_WATCHDOG=y ++ ++# ++# USB-based Watchdog Cards ++# ++# CONFIG_USBPCWATCHDOG is not set ++# CONFIG_HW_RANDOM is not set ++# CONFIG_NVRAM is not set ++# CONFIG_DTLK is not set ++# CONFIG_R3964 is not set ++# CONFIG_RAW_DRIVER is not set ++ ++# ++# TPM devices ++# ++# CONFIG_TCG_TPM is not set ++CONFIG_AT91_SPI=y ++# CONFIG_AT91_SPIDEV is not set ++ ++# ++# I2C support ++# ++CONFIG_I2C=y ++CONFIG_I2C_CHARDEV=m ++ ++# ++# 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 is not set ++# CONFIG_I2C_OCORES is not set ++# CONFIG_I2C_PARPORT_LIGHT is not set ++# CONFIG_I2C_STUB is not set ++# CONFIG_I2C_PCA 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_MAX6875 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 ++ ++# ++# SPI support ++# ++# CONFIG_SPI is not set ++# CONFIG_SPI_MASTER is not set ++ ++# ++# Dallas's 1-wire bus ++# ++# CONFIG_W1 is not set ++ ++# ++# Hardware Monitoring support ++# ++# CONFIG_HWMON is not set ++# CONFIG_HWMON_VID is not set ++ ++# ++# Misc devices ++# ++ ++# ++# Multifunction device drivers ++# ++# CONFIG_MFD_SM501 is not set ++ ++# ++# LED devices ++# ++# CONFIG_NEW_LEDS is not set ++ ++# ++# LED drivers ++# ++ ++# ++# LED Triggers ++# ++ ++# ++# Multimedia devices ++# ++# CONFIG_VIDEO_DEV is not set ++ ++# ++# Digital Video Broadcasting Devices ++# ++# CONFIG_DVB is not set ++# CONFIG_USB_DABUSB is not set ++ ++# ++# Graphics support ++# ++# CONFIG_BACKLIGHT_LCD_SUPPORT is not set ++# CONFIG_FB is not set ++ ++# ++# Console display driver support ++# ++# CONFIG_VGA_CONSOLE is not set ++CONFIG_DUMMY_CONSOLE=y ++ ++# ++# Sound ++# ++# CONFIG_SOUND is not set ++ ++# ++# HID Devices ++# ++# CONFIG_HID is not set ++ ++# ++# USB support ++# ++CONFIG_USB_ARCH_HAS_HCD=y ++CONFIG_USB_ARCH_HAS_OHCI=y ++# CONFIG_USB_ARCH_HAS_EHCI is not set ++CONFIG_USB=y ++# CONFIG_USB_DEBUG is not set ++ ++# ++# Miscellaneous USB options ++# ++CONFIG_USB_DEVICEFS=y ++# 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_DESC is not set ++# CONFIG_USB_OHCI_BIG_ENDIAN_MMIO is not set ++CONFIG_USB_OHCI_LITTLE_ENDIAN=y ++# CONFIG_USB_SL811_HCD is not set ++ ++# ++# 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=y ++# CONFIG_USB_STORAGE_DEBUG is not set ++# CONFIG_USB_STORAGE_DATAFAB is not set ++# CONFIG_USB_STORAGE_FREECOM is not set ++# CONFIG_USB_STORAGE_DPCM is not set ++# CONFIG_USB_STORAGE_USBAT is not set ++# CONFIG_USB_STORAGE_SDDR09 is not set ++# CONFIG_USB_STORAGE_SDDR55 is not set ++# CONFIG_USB_STORAGE_JUMPSHOT is not set ++# CONFIG_USB_STORAGE_ALAUDA is not set ++# CONFIG_USB_STORAGE_KARMA is not set ++# CONFIG_USB_LIBUSUAL 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_TOUCHSCREEN is not set ++# CONFIG_USB_YEALINK is not set ++# CONFIG_USB_XPAD is not set ++# CONFIG_USB_ATI_REMOTE is not set ++# CONFIG_USB_ATI_REMOTE2 is not set ++# CONFIG_USB_KEYSPAN_REMOTE is not set ++# CONFIG_USB_APPLETOUCH is not set ++# CONFIG_USB_GTCO is not set ++ ++# ++# USB Imaging devices ++# ++# CONFIG_USB_MDC800 is not set ++# CONFIG_USB_MICROTEK is not set ++ ++# ++# 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_MII is not set ++# CONFIG_USB_USBNET is not set ++# CONFIG_USB_MON is not set ++ ++# ++# USB port drivers ++# ++ ++# ++# USB Serial Converter support ++# ++CONFIG_USB_SERIAL=m ++# CONFIG_USB_SERIAL_GENERIC is not set ++# CONFIG_USB_SERIAL_AIRCABLE is not set ++# CONFIG_USB_SERIAL_AIRPRIME is not set ++# CONFIG_USB_SERIAL_ARK3116 is not set ++# CONFIG_USB_SERIAL_BELKIN is not set ++# CONFIG_USB_SERIAL_WHITEHEAT is not set ++# CONFIG_USB_SERIAL_DIGI_ACCELEPORT is not set ++# CONFIG_USB_SERIAL_CP2101 is not set ++# CONFIG_USB_SERIAL_CYPRESS_M8 is not set ++# CONFIG_USB_SERIAL_EMPEG is not set ++CONFIG_USB_SERIAL_FTDI_SIO=m ++# CONFIG_USB_SERIAL_FUNSOFT is not set ++# CONFIG_USB_SERIAL_VISOR is not set ++# CONFIG_USB_SERIAL_IPAQ is not set ++# CONFIG_USB_SERIAL_IR is not set ++# CONFIG_USB_SERIAL_EDGEPORT is not set ++# CONFIG_USB_SERIAL_EDGEPORT_TI is not set ++# CONFIG_USB_SERIAL_GARMIN is not set ++# CONFIG_USB_SERIAL_IPW is not set ++# CONFIG_USB_SERIAL_KEYSPAN_PDA is not set ++# CONFIG_USB_SERIAL_KEYSPAN is not set ++# CONFIG_USB_SERIAL_KLSI is not set ++# CONFIG_USB_SERIAL_KOBIL_SCT is not set ++# CONFIG_USB_SERIAL_MCT_U232 is not set ++# CONFIG_USB_SERIAL_MOS7720 is not set ++# CONFIG_USB_SERIAL_MOS7840 is not set ++# CONFIG_USB_SERIAL_NAVMAN is not set ++# CONFIG_USB_SERIAL_PL2303 is not set ++# CONFIG_USB_SERIAL_HP4X is not set ++# CONFIG_USB_SERIAL_SAFE is not set ++# CONFIG_USB_SERIAL_SIERRAWIRELESS is not set ++# CONFIG_USB_SERIAL_TI is not set ++# CONFIG_USB_SERIAL_CYBERJACK is not set ++# CONFIG_USB_SERIAL_XIRCOM is not set ++# CONFIG_USB_SERIAL_OPTION is not set ++# CONFIG_USB_SERIAL_OMNINET is not set ++# CONFIG_USB_SERIAL_DEBUG is not set ++ ++# ++# USB Miscellaneous drivers ++# ++# CONFIG_USB_EMI62 is not set ++# CONFIG_USB_EMI26 is not set ++# CONFIG_USB_ADUTUX is not set ++# CONFIG_USB_AUERSWALD is not set ++# CONFIG_USB_RIO500 is not set ++# CONFIG_USB_LEGOTOWER is not set ++# CONFIG_USB_LCD is not set ++# CONFIG_USB_BERRY_CHARGE is not set ++# CONFIG_USB_LED is not set ++# CONFIG_USB_CYPRESS_CY7C63 is not set ++# CONFIG_USB_CYTHERM is not set ++# CONFIG_USB_PHIDGET is not set ++# CONFIG_USB_IDMOUSE is not set ++# CONFIG_USB_FTDI_ELAN is not set ++# CONFIG_USB_APPLEDISPLAY is not set ++# CONFIG_USB_LD is not set ++# CONFIG_USB_TRANCEVIBRATOR is not set ++# CONFIG_USB_IOWARRIOR is not set ++# CONFIG_USB_TEST is not set ++ ++# ++# USB DSL modem support ++# ++ ++# ++# USB Gadget Support ++# ++CONFIG_USB_GADGET=m ++# 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=m ++# CONFIG_USB_GADGET_DUMMY_HCD is not set ++# CONFIG_USB_GADGET_DUALSPEED is not set ++CONFIG_USB_ZERO=m ++CONFIG_USB_ETH=m ++CONFIG_USB_ETH_RNDIS=y ++CONFIG_USB_GADGETFS=m ++CONFIG_USB_FILE_STORAGE=m ++CONFIG_USB_FILE_STORAGE_TEST=y ++CONFIG_USB_G_SERIAL=m ++# CONFIG_USB_MIDI_GADGET is not set ++ ++# ++# MMC/SD Card support ++# ++# CONFIG_MMC is not set ++ ++# ++# Real Time Clock ++# ++CONFIG_RTC_LIB=y ++# CONFIG_RTC_CLASS is not set ++ ++# ++# File systems ++# ++# CONFIG_EXT2_FS is not set ++# CONFIG_EXT3_FS is not set ++# CONFIG_EXT4DEV_FS 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_GFS2_FS is not set ++# CONFIG_OCFS2_FS is not set ++CONFIG_MINIX_FS=y ++# CONFIG_ROMFS_FS is not set ++# CONFIG_INOTIFY is not set ++# 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_FAT_FS=m ++CONFIG_MSDOS_FS=m ++CONFIG_VFAT_FS=m ++CONFIG_FAT_DEFAULT_CODEPAGE=437 ++CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" ++# CONFIG_NTFS_FS is not set ++ ++# ++# Pseudo filesystems ++# ++CONFIG_PROC_FS=y ++CONFIG_PROC_SYSCTL=y ++CONFIG_SYSFS=y ++CONFIG_TMPFS=y ++# CONFIG_TMPFS_POSIX_ACL is not set ++# CONFIG_HUGETLB_PAGE is not set ++CONFIG_RAMFS=y ++# CONFIG_CONFIGFS_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_YAFFS_FS=y ++CONFIG_YAFFS_YAFFS1=y ++# CONFIG_YAFFS_DOES_ECC is not set ++CONFIG_YAFFS_YAFFS2=y ++CONFIG_YAFFS_AUTO_YAFFS2=y ++# CONFIG_YAFFS_DISABLE_LAZY_LOAD is not set ++CONFIG_YAFFS_CHECKPOINT_RESERVED_BLOCKS=10 ++# CONFIG_YAFFS_DISABLE_WIDE_TNODES is not set ++# CONFIG_YAFFS_ALWAYS_CHECK_CHUNK_ERASED is not set ++CONFIG_YAFFS_SHORT_NAMES_IN_RAM=y ++CONFIG_JFFS2_FS=y ++CONFIG_JFFS2_FS_DEBUG=0 ++CONFIG_JFFS2_FS_WRITEBUFFER=y ++# CONFIG_JFFS2_SUMMARY is not set ++# CONFIG_JFFS2_FS_XATTR is not set ++# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set ++CONFIG_JFFS2_ZLIB=y ++CONFIG_JFFS2_RTIME=y ++# CONFIG_JFFS2_RUBIN 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=y ++CONFIG_NFS_V3=y ++# CONFIG_NFS_V3_ACL is not set ++# CONFIG_NFS_V4 is not set ++# CONFIG_NFS_DIRECTIO is not set ++# CONFIG_NFSD is not set ++CONFIG_ROOT_NFS=y ++CONFIG_LOCKD=y ++CONFIG_LOCKD_V4=y ++CONFIG_NFS_COMMON=y ++CONFIG_SUNRPC=y ++# CONFIG_RPCSEC_GSS_KRB5 is not set ++# CONFIG_RPCSEC_GSS_SPKM3 is not set ++# CONFIG_SMB_FS is not set ++# CONFIG_CIFS is not set ++# CONFIG_NCP_FS is not set ++# CONFIG_CODA_FS is not set ++# CONFIG_AFS_FS is not set ++# CONFIG_9P_FS is not set ++ ++# ++# Partition Types ++# ++# CONFIG_PARTITION_ADVANCED is not set ++CONFIG_MSDOS_PARTITION=y ++ ++# ++# Native Language Support ++# ++CONFIG_NLS=m ++CONFIG_NLS_DEFAULT="iso8859-1" ++CONFIG_NLS_CODEPAGE_437=m ++# CONFIG_NLS_CODEPAGE_737 is not set ++# CONFIG_NLS_CODEPAGE_775 is not set ++CONFIG_NLS_CODEPAGE_850=m ++# CONFIG_NLS_CODEPAGE_852 is not set ++# CONFIG_NLS_CODEPAGE_855 is not set ++# CONFIG_NLS_CODEPAGE_857 is not set ++# CONFIG_NLS_CODEPAGE_860 is not set ++# CONFIG_NLS_CODEPAGE_861 is not set ++# CONFIG_NLS_CODEPAGE_862 is not set ++# CONFIG_NLS_CODEPAGE_863 is not set ++# CONFIG_NLS_CODEPAGE_864 is not set ++# CONFIG_NLS_CODEPAGE_865 is not set ++# CONFIG_NLS_CODEPAGE_866 is not set ++# CONFIG_NLS_CODEPAGE_869 is not set ++# CONFIG_NLS_CODEPAGE_936 is not set ++# CONFIG_NLS_CODEPAGE_950 is not set ++# CONFIG_NLS_CODEPAGE_932 is not set ++# CONFIG_NLS_CODEPAGE_949 is not set ++# CONFIG_NLS_CODEPAGE_874 is not set ++# CONFIG_NLS_ISO8859_8 is not set ++# CONFIG_NLS_CODEPAGE_1250 is not set ++# CONFIG_NLS_CODEPAGE_1251 is not set ++# CONFIG_NLS_ASCII is not set ++CONFIG_NLS_ISO8859_1=m ++# CONFIG_NLS_ISO8859_2 is not set ++# CONFIG_NLS_ISO8859_3 is not set ++# CONFIG_NLS_ISO8859_4 is not set ++# CONFIG_NLS_ISO8859_5 is not set ++# CONFIG_NLS_ISO8859_6 is not set ++# CONFIG_NLS_ISO8859_7 is not set ++# CONFIG_NLS_ISO8859_9 is not set ++# CONFIG_NLS_ISO8859_13 is not set ++# CONFIG_NLS_ISO8859_14 is not set ++# CONFIG_NLS_ISO8859_15 is not set ++# CONFIG_NLS_KOI8_R is not set ++# CONFIG_NLS_KOI8_U is not set ++# CONFIG_NLS_UTF8 is not set ++ ++# ++# Distributed Lock Manager ++# ++# CONFIG_DLM is not set ++ ++# ++# Profiling support ++# ++# CONFIG_PROFILING is not set ++ ++# ++# Kernel hacking ++# ++# CONFIG_PRINTK_TIME is not set ++CONFIG_ENABLE_MUST_CHECK=y ++# CONFIG_MAGIC_SYSRQ is not set ++# CONFIG_UNUSED_SYMBOLS is not set ++# CONFIG_DEBUG_FS is not set ++# CONFIG_HEADERS_CHECK is not set ++# CONFIG_DEBUG_KERNEL is not set ++CONFIG_LOG_BUF_SHIFT=14 ++CONFIG_DEBUG_BUGVERBOSE=y ++CONFIG_FRAME_POINTER=y ++# CONFIG_DEBUG_USER is not set ++ ++# ++# Security options ++# ++# CONFIG_KEYS is not set ++# CONFIG_SECURITY is not set ++ ++# ++# Cryptographic options ++# ++CONFIG_CRYPTO=y ++CONFIG_CRYPTO_ALGAPI=m ++CONFIG_CRYPTO_BLKCIPHER=m ++CONFIG_CRYPTO_MANAGER=m ++# CONFIG_CRYPTO_HMAC is not set ++# CONFIG_CRYPTO_XCBC is not set ++# CONFIG_CRYPTO_NULL is not set ++# CONFIG_CRYPTO_MD4 is not set ++# CONFIG_CRYPTO_MD5 is not set ++# CONFIG_CRYPTO_SHA1 is not set ++# CONFIG_CRYPTO_SHA256 is not set ++# CONFIG_CRYPTO_SHA512 is not set ++# CONFIG_CRYPTO_WP512 is not set ++# CONFIG_CRYPTO_TGR192 is not set ++# CONFIG_CRYPTO_GF128MUL is not set ++CONFIG_CRYPTO_ECB=m ++CONFIG_CRYPTO_CBC=m ++CONFIG_CRYPTO_PCBC=m ++# CONFIG_CRYPTO_LRW is not set ++# CONFIG_CRYPTO_DES is not set ++# CONFIG_CRYPTO_FCRYPT is not set ++# CONFIG_CRYPTO_BLOWFISH is not set ++# CONFIG_CRYPTO_TWOFISH is not set ++# CONFIG_CRYPTO_SERPENT is not set ++CONFIG_CRYPTO_AES=m ++# CONFIG_CRYPTO_CAST5 is not set ++# CONFIG_CRYPTO_CAST6 is not set ++# CONFIG_CRYPTO_TEA is not set ++CONFIG_CRYPTO_ARC4=m ++# CONFIG_CRYPTO_KHAZAD is not set ++# CONFIG_CRYPTO_ANUBIS is not set ++# CONFIG_CRYPTO_DEFLATE is not set ++CONFIG_CRYPTO_MICHAEL_MIC=m ++# CONFIG_CRYPTO_CRC32C is not set ++# CONFIG_CRYPTO_CAMELLIA is not set ++# CONFIG_CRYPTO_TEST is not set ++ ++# ++# Hardware crypto devices ++# ++ ++# ++# Library routines ++# ++CONFIG_BITREVERSE=y ++# CONFIG_CRC_CCITT is not set ++# CONFIG_CRC16 is not set ++CONFIG_CRC32=y ++# CONFIG_LIBCRC32C is not set ++CONFIG_ZLIB_INFLATE=y ++CONFIG_ZLIB_DEFLATE=y ++CONFIG_PLIST=y ++CONFIG_HAS_IOMEM=y ++CONFIG_HAS_IOPORT=y +diff -urN -x CVS linux-2.6.24/arch/arm/configs/kafa_defconfig linux-2.6/arch/arm/configs/kafa_defconfig +--- linux-2.6.24/arch/arm/configs/kafa_defconfig 2007-10-09 22:31:38.000000000 +0200 ++++ linux-2.6/arch/arm/configs/kafa_defconfig 2007-12-31 10:43:35.000000000 +0200 +@@ -587,14 +587,14 @@ + # + # I2C Algorithms + # +-# CONFIG_I2C_ALGOBIT is not set ++CONFIG_I2C_ALGOBIT=y + # CONFIG_I2C_ALGOPCF is not set + # CONFIG_I2C_ALGOPCA is not set + + # + # I2C Hardware Bus support + # +-CONFIG_I2C_AT91=y ++CONFIG_I2C_GPIO=y + # CONFIG_I2C_PARPORT_LIGHT is not set + # CONFIG_I2C_STUB is not set + # CONFIG_I2C_PCA_ISA is not set +diff -urN -x CVS linux-2.6.24/arch/arm/configs/kb9202_defconfig linux-2.6/arch/arm/configs/kb9202_defconfig +--- linux-2.6.24/arch/arm/configs/kb9202_defconfig 2007-10-09 22:31:38.000000000 +0200 ++++ linux-2.6/arch/arm/configs/kb9202_defconfig 2007-12-31 10:43:35.000000000 +0200 +@@ -1,19 +1,31 @@ + # + # Automatically generated make config: don't edit +-# Linux kernel version: 2.6.13-rc2 +-# Sun Aug 14 19:26:59 2005 ++# Linux kernel version: 2.6.21 ++# Mon May 7 11:43:14 2007 + # + CONFIG_ARM=y ++CONFIG_SYS_SUPPORTS_APM_EMULATION=y ++CONFIG_GENERIC_GPIO=y ++# CONFIG_GENERIC_TIME is not set + CONFIG_MMU=y +-CONFIG_UID16=y ++# CONFIG_NO_IOPORT is not set ++CONFIG_GENERIC_HARDIRQS=y ++CONFIG_TRACE_IRQFLAGS_SUPPORT=y ++CONFIG_HARDIRQS_SW_RESEND=y ++CONFIG_GENERIC_IRQ_PROBE=y + CONFIG_RWSEM_GENERIC_SPINLOCK=y ++# CONFIG_ARCH_HAS_ILOG2_U32 is not set ++# CONFIG_ARCH_HAS_ILOG2_U64 is not set ++CONFIG_GENERIC_HWEIGHT=y + CONFIG_GENERIC_CALIBRATE_DELAY=y ++CONFIG_ZONE_DMA=y ++CONFIG_VECTORS_BASE=0xffff0000 ++CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" + + # + # Code maturity level options + # +-# CONFIG_EXPERIMENTAL is not set +-CONFIG_CLEAN_COMPILE=y ++CONFIG_EXPERIMENTAL=y + CONFIG_BROKEN_ON_SMP=y + CONFIG_INIT_ENV_ARG_LIMIT=32 + +@@ -21,54 +33,103 @@ + # General setup + # + CONFIG_LOCALVERSION="" +-# CONFIG_SWAP is not set +-# CONFIG_SYSVIPC is not set +-# CONFIG_BSD_PROCESS_ACCT is not set ++CONFIG_LOCALVERSION_AUTO=y ++CONFIG_SWAP=y ++CONFIG_SYSVIPC=y ++# CONFIG_IPC_NS is not set ++CONFIG_SYSVIPC_SYSCTL=y ++CONFIG_POSIX_MQUEUE=y ++CONFIG_BSD_PROCESS_ACCT=y ++# CONFIG_BSD_PROCESS_ACCT_V3 is not set ++# CONFIG_TASKSTATS is not set ++# CONFIG_UTS_NS is not set ++CONFIG_AUDIT=y ++CONFIG_IKCONFIG=y ++CONFIG_IKCONFIG_PROC=y ++CONFIG_SYSFS_DEPRECATED=y ++# CONFIG_RELAY is not set ++CONFIG_BLK_DEV_INITRD=y ++CONFIG_INITRAMFS_SOURCE="" ++# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set + CONFIG_SYSCTL=y +-# CONFIG_AUDIT is not set +-CONFIG_HOTPLUG=y +-# CONFIG_KOBJECT_UEVENT is not set +-# CONFIG_IKCONFIG is not set + # CONFIG_EMBEDDED is not set ++CONFIG_UID16=y ++CONFIG_SYSCTL_SYSCALL=y + CONFIG_KALLSYMS=y + # CONFIG_KALLSYMS_ALL is not set +-# CONFIG_KALLSYMS_EXTRA_PASS is not set ++CONFIG_KALLSYMS_EXTRA_PASS=y ++CONFIG_HOTPLUG=y + CONFIG_PRINTK=y + CONFIG_BUG=y ++CONFIG_ELF_CORE=y + CONFIG_BASE_FULL=y + CONFIG_FUTEX=y + CONFIG_EPOLL=y +-CONFIG_CC_OPTIMIZE_FOR_SIZE=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_SLAB=y ++CONFIG_VM_EVENT_COUNTERS=y ++CONFIG_RT_MUTEXES=y + # CONFIG_TINY_SHMEM is not set + CONFIG_BASE_SMALL=0 ++# CONFIG_SLOB is not set + + # + # Loadable module support + # + CONFIG_MODULES=y + CONFIG_MODULE_UNLOAD=y +-CONFIG_OBSOLETE_MODPARM=y +-# CONFIG_MODULE_SRCVERSION_ALL is not set ++# CONFIG_MODULE_FORCE_UNLOAD is not set ++CONFIG_MODVERSIONS=y ++CONFIG_MODULE_SRCVERSION_ALL=y + CONFIG_KMOD=y + + # ++# Block layer ++# ++CONFIG_BLOCK=y ++CONFIG_LBD=y ++# CONFIG_BLK_DEV_IO_TRACE is not set ++# CONFIG_LSF is not set ++ ++# ++# IO Schedulers ++# ++CONFIG_IOSCHED_NOOP=y ++CONFIG_IOSCHED_AS=y ++CONFIG_IOSCHED_DEADLINE=y ++CONFIG_IOSCHED_CFQ=y ++# CONFIG_DEFAULT_AS is not set ++# CONFIG_DEFAULT_DEADLINE is not set ++CONFIG_DEFAULT_CFQ=y ++# CONFIG_DEFAULT_NOOP is not set ++CONFIG_DEFAULT_IOSCHED="cfq" ++ ++# + # System Type + # ++# CONFIG_ARCH_AAEC2000 is not set ++# CONFIG_ARCH_INTEGRATOR is not set ++# CONFIG_ARCH_REALVIEW is not set ++# CONFIG_ARCH_VERSATILE is not set ++CONFIG_ARCH_AT91=y + # CONFIG_ARCH_CLPS7500 is not set + # CONFIG_ARCH_CLPS711X is not set + # CONFIG_ARCH_CO285 is not set + # CONFIG_ARCH_EBSA110 is not set ++# CONFIG_ARCH_EP93XX is not set + # CONFIG_ARCH_FOOTBRIDGE is not set +-# CONFIG_ARCH_INTEGRATOR is not set +-# CONFIG_ARCH_IOP3XX is not set ++# CONFIG_ARCH_NETX is not set ++# CONFIG_ARCH_H720X is not set ++# CONFIG_ARCH_IMX is not set ++# CONFIG_ARCH_IOP32X is not set ++# CONFIG_ARCH_IOP33X is not set ++# CONFIG_ARCH_IOP13XX is not set + # CONFIG_ARCH_IXP4XX is not set + # CONFIG_ARCH_IXP2000 is not set ++# CONFIG_ARCH_IXP23XX is not set + # CONFIG_ARCH_L7200 is not set ++# CONFIG_ARCH_NS9XXX is not set ++# CONFIG_ARCH_PNX4008 is not set + # CONFIG_ARCH_PXA is not set + # CONFIG_ARCH_RPC is not set + # CONFIG_ARCH_SA1100 is not set +@@ -76,34 +137,52 @@ + # 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_IMX is not set +-# CONFIG_ARCH_H720X is not set +-# CONFIG_ARCH_AAEC2000 is not set +-CONFIG_ARCH_AT91=y ++ ++# ++# Atmel AT91 System-on-Chip ++# + CONFIG_ARCH_AT91RM9200=y ++# CONFIG_ARCH_AT91SAM9260 is not set ++# CONFIG_ARCH_AT91SAM9261 is not set ++# CONFIG_ARCH_AT91SAM9263 is not set + + # +-# AT91RM9200 Implementations ++# AT91RM9200 Board Type + # ++# CONFIG_MACH_ONEARM is not set + # CONFIG_ARCH_AT91RM9200DK is not set + # CONFIG_MACH_AT91RM9200EK is not set + # CONFIG_MACH_CSB337 is not set + # CONFIG_MACH_CSB637 is not set + # CONFIG_MACH_CARMEVA is not set ++# CONFIG_MACH_ATEB9200 is not set + CONFIG_MACH_KB9200=y ++# CONFIG_MACH_KAFA is not set ++# CONFIG_MACH_CHUB is not set ++ ++# ++# AT91 Board Options ++# ++ ++# ++# AT91 Feature Selections ++# ++# CONFIG_AT91_PROGRAMMABLE_CLOCKS is not set ++# CONFIG_ATMEL_TCLIB is not set + + # + # Processor Type + # + CONFIG_CPU_32=y + CONFIG_CPU_ARM920T=y +-CONFIG_CPU_32v4=y ++CONFIG_CPU_32v4T=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 ++CONFIG_CPU_CP15=y ++CONFIG_CPU_CP15_MMU=y + + # + # Processor Features +@@ -112,24 +191,44 @@ + # CONFIG_CPU_ICACHE_DISABLE is not set + # CONFIG_CPU_DCACHE_DISABLE is not set + # CONFIG_CPU_DCACHE_WRITETHROUGH is not set ++# CONFIG_OUTER_CACHE is not set + + # + # Bus support + # +-CONFIG_ISA_DMA_API=y + + # + # PCCARD (PCMCIA/CardBus) support + # +-# CONFIG_PCCARD is not set ++CONFIG_PCCARD=m ++# CONFIG_PCMCIA_DEBUG is not set ++CONFIG_PCMCIA=m ++CONFIG_PCMCIA_LOAD_CIS=y ++CONFIG_PCMCIA_IOCTL=y ++ ++# ++# PC-card bridges ++# ++# CONFIG_AT91_CF is not set + + # + # Kernel Features + # ++# CONFIG_PREEMPT is not set + # CONFIG_NO_IDLE_HZ is not set ++CONFIG_HZ=100 ++# CONFIG_AEABI 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_RESOURCES_64BIT is not set ++CONFIG_ZONE_DMA_FLAG=1 + # CONFIG_LEDS is not set + CONFIG_ALIGNMENT_TRAP=y + +@@ -138,8 +237,10 @@ + # + CONFIG_ZBOOT_ROM_TEXT=0x10000000 + CONFIG_ZBOOT_ROM_BSS=0x20040000 +-CONFIG_ZBOOT_ROM=y +-CONFIG_CMDLINE="console=ttyS0,115200 root=/dev/ram rw initrd=0x20210000,654933" ++# CONFIG_ZBOOT_ROM is not set ++CONFIG_CMDLINE="noinitrd root=/dev/mtdblock0 rootfstype=jffs2 mem=64M" ++# CONFIG_XIP_KERNEL is not set ++# CONFIG_KEXEC is not set + + # + # Floating point emulation +@@ -150,6 +251,7 @@ + # + CONFIG_FPE_NWFPE=y + # CONFIG_FPE_NWFPE_XP is not set ++# CONFIG_FPE_FASTFPE is not set + + # + # Userspace binary formats +@@ -165,6 +267,96 @@ + # CONFIG_PM is not set + + # ++# Networking ++# ++CONFIG_NET=y ++ ++# ++# Networking options ++# ++# CONFIG_NETDEBUG is not set ++CONFIG_PACKET=y ++# CONFIG_PACKET_MMAP is not set ++CONFIG_UNIX=y ++# CONFIG_NET_KEY is not set ++CONFIG_INET=y ++CONFIG_IP_MULTICAST=y ++# CONFIG_IP_ADVANCED_ROUTER is not set ++CONFIG_IP_FIB_HASH=y ++CONFIG_IP_PNP=y ++# CONFIG_IP_PNP_DHCP is not set ++# CONFIG_IP_PNP_BOOTP is not set ++# CONFIG_IP_PNP_RARP is not set ++# CONFIG_NET_IPIP is not set ++# CONFIG_NET_IPGRE is not set ++# CONFIG_IP_MROUTE is not set ++# CONFIG_ARPD is not set ++# CONFIG_SYN_COOKIES is not set ++# CONFIG_INET_AH is not set ++# CONFIG_INET_ESP is not set ++# CONFIG_INET_IPCOMP is not set ++# CONFIG_INET_XFRM_TUNNEL is not set ++# CONFIG_INET_TUNNEL is not set ++# CONFIG_INET_XFRM_MODE_TRANSPORT is not set ++# CONFIG_INET_XFRM_MODE_TUNNEL is not set ++# CONFIG_INET_XFRM_MODE_BEET is not set ++# CONFIG_INET_DIAG is not set ++# CONFIG_TCP_CONG_ADVANCED is not set ++CONFIG_TCP_CONG_CUBIC=y ++CONFIG_DEFAULT_TCP_CONG="cubic" ++# CONFIG_TCP_MD5SIG is not set ++# CONFIG_IPV6 is not set ++# CONFIG_INET6_XFRM_TUNNEL is not set ++# CONFIG_INET6_TUNNEL is not set ++# CONFIG_NETWORK_SECMARK is not set ++# CONFIG_NETFILTER is not set ++ ++# ++# DCCP Configuration (EXPERIMENTAL) ++# ++# CONFIG_IP_DCCP is not set ++ ++# ++# SCTP Configuration (EXPERIMENTAL) ++# ++CONFIG_IP_SCTP=m ++# CONFIG_SCTP_DBG_MSG is not set ++# CONFIG_SCTP_DBG_OBJCNT is not set ++# CONFIG_SCTP_HMAC_NONE is not set ++# CONFIG_SCTP_HMAC_SHA1 is not set ++CONFIG_SCTP_HMAC_MD5=y ++ ++# ++# TIPC Configuration (EXPERIMENTAL) ++# ++# CONFIG_TIPC 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_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 + # + +@@ -173,13 +365,95 @@ + # + CONFIG_STANDALONE=y + CONFIG_PREVENT_FIRMWARE_BUILD=y +-# CONFIG_FW_LOADER is not set +-CONFIG_DEBUG_DRIVER=y ++CONFIG_FW_LOADER=y ++# CONFIG_DEBUG_DRIVER is not set ++# CONFIG_DEBUG_DEVRES is not set ++# CONFIG_SYS_HYPERVISOR is not set ++ ++# ++# Connector - unified userspace <-> kernelspace linker ++# ++# CONFIG_CONNECTOR is not set + + # + # Memory Technology Devices (MTD) + # +-# CONFIG_MTD is not set ++CONFIG_MTD=y ++# CONFIG_MTD_DEBUG is not set ++CONFIG_MTD_CONCAT=y ++CONFIG_MTD_PARTITIONS=y ++# CONFIG_MTD_REDBOOT_PARTS is not set ++CONFIG_MTD_CMDLINE_PARTS=y ++# CONFIG_MTD_AFS_PARTS is not set ++ ++# ++# User Modules And Translation Layers ++# ++CONFIG_MTD_CHAR=y ++CONFIG_MTD_BLKDEVS=y ++CONFIG_MTD_BLOCK=y ++# CONFIG_FTL is not set ++# CONFIG_NFTL is not set ++# CONFIG_INFTL is not set ++# CONFIG_RFD_FTL is not set ++# CONFIG_SSFDC is not set ++ ++# ++# RAM/ROM/Flash chip drivers ++# ++# CONFIG_MTD_CFI is not set ++# CONFIG_MTD_JEDECPROBE is not set ++CONFIG_MTD_MAP_BANK_WIDTH_1=y ++CONFIG_MTD_MAP_BANK_WIDTH_2=y ++CONFIG_MTD_MAP_BANK_WIDTH_4=y ++# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set ++# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set ++# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set ++CONFIG_MTD_CFI_I1=y ++CONFIG_MTD_CFI_I2=y ++# CONFIG_MTD_CFI_I4 is not set ++# CONFIG_MTD_CFI_I8 is not set ++# CONFIG_MTD_RAM is not set ++# CONFIG_MTD_ROM is not set ++# CONFIG_MTD_ABSENT is not set ++# CONFIG_MTD_OBSOLETE_CHIPS is not set ++ ++# ++# Mapping drivers for chip access ++# ++CONFIG_MTD_COMPLEX_MAPPINGS=y ++# CONFIG_MTD_PLATRAM is not set ++ ++# ++# Self-contained MTD device drivers ++# ++# CONFIG_MTD_SLRAM is not set ++# CONFIG_MTD_PHRAM is not set ++# CONFIG_MTD_MTDRAM is not set ++# CONFIG_MTD_BLOCK2MTD is not set ++ ++# ++# Disk-On-Chip Device Drivers ++# ++# CONFIG_MTD_DOC2000 is not set ++# CONFIG_MTD_DOC2001 is not set ++# CONFIG_MTD_DOC2001PLUS is not set ++ ++# ++# NAND Flash Device Drivers ++# ++CONFIG_MTD_NAND=y ++# CONFIG_MTD_NAND_VERIFY_WRITE is not set ++# CONFIG_MTD_NAND_ECC_SMC is not set ++CONFIG_MTD_NAND_IDS=y ++# CONFIG_MTD_NAND_DISKONCHIP is not set ++CONFIG_MTD_NAND_AT91=y ++# CONFIG_MTD_NAND_NANDSIM is not set ++ ++# ++# OneNAND Flash Device Drivers ++# ++# CONFIG_MTD_ONENAND is not set + + # + # Parallel port support +@@ -189,6 +463,7 @@ + # + # Plug and Play support + # ++# CONFIG_PNPACPI is not set + + # + # Block devices +@@ -196,28 +471,27 @@ + # CONFIG_BLK_DEV_COW_COMMON is not set + CONFIG_BLK_DEV_LOOP=y + # CONFIG_BLK_DEV_CRYPTOLOOP is not set +-CONFIG_BLK_DEV_NBD=y ++# CONFIG_BLK_DEV_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=4096 +-CONFIG_BLK_DEV_INITRD=y +-CONFIG_INITRAMFS_SOURCE="" ++CONFIG_BLK_DEV_RAM_SIZE=16384 ++CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024 + # CONFIG_CDROM_PKTCDVD is not set ++# CONFIG_ATA_OVER_ETH is not set + + # +-# IO Schedulers ++# ATA/ATAPI/MFM/RLL support + # +-CONFIG_IOSCHED_NOOP=y +-CONFIG_IOSCHED_AS=y +-CONFIG_IOSCHED_DEADLINE=y +-CONFIG_IOSCHED_CFQ=y +-# CONFIG_ATA_OVER_ETH is not set ++# CONFIG_IDE is not set + + # + # SCSI device support + # ++# CONFIG_RAID_ATTRS is not set + CONFIG_SCSI=y ++# CONFIG_SCSI_TGT is not set ++# CONFIG_SCSI_NETLINK is not set + CONFIG_SCSI_PROC_FS=y + + # +@@ -233,97 +507,61 @@ + # + # Some SCSI devices (e.g. CD jukebox) support multiple LUNs + # +-# CONFIG_SCSI_MULTI_LUN is not set +-# CONFIG_SCSI_CONSTANTS is not set +-# CONFIG_SCSI_LOGGING is not set ++CONFIG_SCSI_MULTI_LUN=y ++CONFIG_SCSI_CONSTANTS=y ++CONFIG_SCSI_LOGGING=y ++# CONFIG_SCSI_SCAN_ASYNC is not set + + # +-# SCSI Transport Attributes ++# SCSI Transports + # +-# CONFIG_SCSI_SPI_ATTRS is not set ++CONFIG_SCSI_SPI_ATTRS=m + # CONFIG_SCSI_FC_ATTRS is not set + # CONFIG_SCSI_ISCSI_ATTRS is not set ++# CONFIG_SCSI_SAS_ATTRS is not set ++# CONFIG_SCSI_SAS_LIBSAS is not set + + # + # SCSI low-level drivers + # +-# CONFIG_SCSI_SATA is not set ++# CONFIG_ISCSI_TCP is not set + # CONFIG_SCSI_DEBUG is not set + + # +-# Multi-device support (RAID and LVM) +-# +-# CONFIG_MD is not set +- +-# +-# Fusion MPT device support ++# PCMCIA SCSI adapter support + # +-# CONFIG_FUSION is not set ++# CONFIG_PCMCIA_AHA152X is not set ++# CONFIG_PCMCIA_FDOMAIN is not set ++# CONFIG_PCMCIA_NINJA_SCSI is not set ++# CONFIG_PCMCIA_QLOGIC is not set ++# CONFIG_PCMCIA_SYM53C500 is not set + + # +-# IEEE 1394 (FireWire) support ++# Serial ATA (prod) and Parallel ATA (experimental) drivers + # ++# CONFIG_ATA is not set + + # +-# I2O device support ++# Multi-device support (RAID and LVM) + # ++# CONFIG_MD is not set + + # +-# Networking support ++# Fusion MPT device support + # +-CONFIG_NET=y ++# CONFIG_FUSION is not set + + # +-# Networking options ++# IEEE 1394 (FireWire) support + # +-CONFIG_PACKET=y +-# CONFIG_PACKET_MMAP is not set +-CONFIG_UNIX=y +-# CONFIG_NET_KEY is not set +-CONFIG_INET=y +-CONFIG_IP_MULTICAST=y +-# CONFIG_IP_ADVANCED_ROUTER is not set +-CONFIG_IP_FIB_HASH=y +-CONFIG_IP_PNP=y +-CONFIG_IP_PNP_DHCP=y +-# CONFIG_IP_PNP_BOOTP is not set +-# CONFIG_IP_PNP_RARP is not set +-# CONFIG_NET_IPIP is not set +-# CONFIG_NET_IPGRE is not set +-# CONFIG_IP_MROUTE 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_IP_TCPDIAG is not set +-# CONFIG_IP_TCPDIAG_IPV6 is not set +-# CONFIG_TCP_CONG_ADVANCED is not set +-CONFIG_TCP_CONG_BIC=y +-# CONFIG_IPV6 is not set +-# CONFIG_NETFILTER 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 + + # +-# QoS and/or fair queueing ++# I2O device support + # +-# CONFIG_NET_SCHED is not set +-# CONFIG_NET_CLS_ROUTE is not set + + # +-# Network testing ++# Network device support + # +-# CONFIG_NET_PKTGEN is not set +-# CONFIG_NETPOLL is not set +-# CONFIG_NET_POLL_CONTROLLER is not set +-# CONFIG_HAMRADIO is not set +-# CONFIG_IRDA is not set +-# CONFIG_BT is not set + CONFIG_NETDEVICES=y + # CONFIG_DUMMY is not set + # CONFIG_BONDING is not set +@@ -331,6 +569,11 @@ + # CONFIG_TUN is not set + + # ++# PHY device support ++# ++# CONFIG_PHYLIB is not set ++ ++# + # Ethernet (10 or 100Mbit) + # + CONFIG_NET_ETHERNET=y +@@ -357,11 +600,20 @@ + # CONFIG_NET_RADIO is not set + + # ++# PCMCIA network device support ++# ++# CONFIG_NET_PCMCIA 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 +@@ -372,6 +624,7 @@ + # Input device support + # + CONFIG_INPUT=y ++# CONFIG_INPUT_FF_MEMLESS is not set + + # + # Userland interfaces +@@ -397,9 +650,7 @@ + # + # Hardware I/O ports + # +-CONFIG_SERIO=y +-# CONFIG_SERIO_SERPORT is not set +-# CONFIG_SERIO_RAW is not set ++# CONFIG_SERIO is not set + # CONFIG_GAMEPORT is not set + + # +@@ -408,6 +659,7 @@ + CONFIG_VT=y + CONFIG_VT_CONSOLE=y + CONFIG_HW_CONSOLE=y ++# CONFIG_VT_HW_CONSOLE_BINDING is not set + # CONFIG_SERIAL_NONSTANDARD is not set + + # +@@ -420,11 +672,11 @@ + # + CONFIG_SERIAL_ATMEL=y + CONFIG_SERIAL_ATMEL_CONSOLE=y ++# CONFIG_SERIAL_ATMEL_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 ++# CONFIG_LEGACY_PTYS is not set + + # + # IPMI +@@ -435,21 +687,23 @@ + # Watchdog Cards + # + # CONFIG_WATCHDOG is not set ++# CONFIG_HW_RANDOM is not set + # CONFIG_NVRAM is not set +-# CONFIG_RTC is not set +-# CONFIG_AT91RM9200_RTC is not set + # CONFIG_DTLK is not set + # CONFIG_R3964 is not set + + # +-# Ftape, the floppy tape device driver ++# PCMCIA character devices + # ++# CONFIG_SYNCLINK_CS is not set ++# CONFIG_CARDMAN_4000 is not set ++# CONFIG_CARDMAN_4040 is not set + # CONFIG_RAW_DRIVER is not set + + # + # TPM devices + # +-# CONFIG_AT91_SPI is not set ++# CONFIG_TCG_TPM is not set + + # + # I2C support +@@ -457,10 +711,50 @@ + # CONFIG_I2C is not set + + # ++# SPI support ++# ++# CONFIG_SPI is not set ++# CONFIG_SPI_MASTER is not set ++ ++# ++# Dallas's 1-wire bus ++# ++# CONFIG_W1 is not set ++ ++# ++# Hardware Monitoring support ++# ++CONFIG_HWMON=y ++# CONFIG_HWMON_VID is not set ++# CONFIG_SENSORS_ABITUGURU is not set ++# CONFIG_SENSORS_F71805F is not set ++# CONFIG_SENSORS_PC87427 is not set ++# CONFIG_SENSORS_VT1211 is not set ++CONFIG_HWMON_DEBUG_CHIP=y ++ ++# + # Misc devices + # + + # ++# Multifunction device drivers ++# ++# CONFIG_MFD_SM501 is not set ++ ++# ++# LED devices ++# ++# CONFIG_NEW_LEDS is not set ++ ++# ++# LED drivers ++# ++ ++# ++# LED Triggers ++# ++ ++# + # Multimedia devices + # + # CONFIG_VIDEO_DEV is not set +@@ -469,17 +763,57 @@ + # Digital Video Broadcasting Devices + # + # CONFIG_DVB is not set ++# CONFIG_USB_DABUSB is not set + + # + # Graphics support + # +-# CONFIG_FB is not set ++CONFIG_BACKLIGHT_LCD_SUPPORT=y ++CONFIG_BACKLIGHT_CLASS_DEVICE=y ++# CONFIG_LCD_CLASS_DEVICE is not set ++CONFIG_BACKLIGHT_KB920x=y ++CONFIG_FB=y ++# CONFIG_FIRMWARE_EDID is not set ++# CONFIG_FB_DDC is not set ++CONFIG_FB_CFB_FILLRECT=y ++CONFIG_FB_CFB_COPYAREA=y ++CONFIG_FB_CFB_IMAGEBLIT=y ++# CONFIG_FB_SVGALIB is not set ++# CONFIG_FB_MACMODES is not set ++# CONFIG_FB_BACKLIGHT is not set ++CONFIG_FB_MODE_HELPERS=y ++CONFIG_FB_TILEBLITTING=y ++ ++# ++# Frame buffer hardware drivers ++# ++CONFIG_FB_S1D15605=y ++# CONFIG_FB_S1D13XXX is not set ++# CONFIG_FB_VIRTUAL is not set + + # + # Console display driver support + # + # CONFIG_VGA_CONSOLE is not set + CONFIG_DUMMY_CONSOLE=y ++CONFIG_FRAMEBUFFER_CONSOLE=y ++# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set ++CONFIG_FONTS=y ++# CONFIG_FONT_8x8 is not set ++# CONFIG_FONT_8x16 is not set ++# CONFIG_FONT_6x11 is not set ++# CONFIG_FONT_7x14 is not set ++# CONFIG_FONT_PEARL_8x8 is not set ++# CONFIG_FONT_ACORN_8x8 is not set ++CONFIG_FONT_MINI_4x6=y ++# CONFIG_FONT_SUN8x16 is not set ++# CONFIG_FONT_SUN12x22 is not set ++# CONFIG_FONT_10x18 is not set ++ ++# ++# Logo configuration ++# ++# CONFIG_LOGO is not set + + # + # Sound +@@ -487,82 +821,98 @@ + # CONFIG_SOUND is not set + + # ++# HID Devices ++# ++CONFIG_HID=y ++# CONFIG_HID_DEBUG is not set ++ ++# + # USB support + # + CONFIG_USB_ARCH_HAS_HCD=y + CONFIG_USB_ARCH_HAS_OHCI=y ++# CONFIG_USB_ARCH_HAS_EHCI is not set + CONFIG_USB=y +-CONFIG_USB_DEBUG=y ++# CONFIG_USB_DEBUG is not set + + # + # Miscellaneous USB options + # + CONFIG_USB_DEVICEFS=y ++# 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_BIG_ENDIAN_DESC is not set ++# CONFIG_USB_OHCI_BIG_ENDIAN_MMIO is not set + CONFIG_USB_OHCI_LITTLE_ENDIAN=y + # CONFIG_USB_SL811_HCD is not set + + # + # USB Device Class drivers + # +-# CONFIG_USB_BLUETOOTH_TTY is not set + # 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 ++# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' ++# ++ ++# ++# may also be needed; see USB_STORAGE Help for more information + # + CONFIG_USB_STORAGE=y +-CONFIG_USB_STORAGE_DEBUG=y ++# CONFIG_USB_STORAGE_DEBUG is not set ++# CONFIG_USB_STORAGE_DATAFAB is not set + # CONFIG_USB_STORAGE_FREECOM is not set + # CONFIG_USB_STORAGE_DPCM is not set ++# CONFIG_USB_STORAGE_USBAT is not set ++# CONFIG_USB_STORAGE_SDDR09 is not set ++# CONFIG_USB_STORAGE_SDDR55 is not set ++# CONFIG_USB_STORAGE_JUMPSHOT is not set ++# CONFIG_USB_STORAGE_ALAUDA is not set ++# CONFIG_USB_STORAGE_KARMA is not set ++CONFIG_USB_LIBUSUAL=y + + # + # 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_HID=y ++# CONFIG_USB_HIDINPUT_POWERBOOK is not set ++# CONFIG_HID_FF is not set ++# CONFIG_USB_HIDDEV 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_TOUCHSCREEN is not set ++# CONFIG_USB_YEALINK is not set + # CONFIG_USB_XPAD is not set + # CONFIG_USB_ATI_REMOTE is not set ++# CONFIG_USB_ATI_REMOTE2 is not set ++# CONFIG_USB_KEYSPAN_REMOTE is not set ++# CONFIG_USB_APPLETOUCH is not set ++# CONFIG_USB_GTCO is not set + + # + # USB Imaging devices + # ++# CONFIG_USB_MDC800 is not set + # CONFIG_USB_MICROTEK 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_MII is not set + # CONFIG_USB_USBNET is not set + # CONFIG_USB_MON is not set + +@@ -580,12 +930,23 @@ + # + # CONFIG_USB_EMI62 is not set + # CONFIG_USB_EMI26 is not set ++# CONFIG_USB_ADUTUX 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_BERRY_CHARGE is not set + # CONFIG_USB_LED is not set ++# CONFIG_USB_CYPRESS_CY7C63 is not set + # CONFIG_USB_CYTHERM is not set +-# CONFIG_USB_PHIDGETKIT is not set +-# CONFIG_USB_PHIDGETSERVO is not set ++# CONFIG_USB_PHIDGET is not set + # CONFIG_USB_IDMOUSE is not set ++# CONFIG_USB_FTDI_ELAN is not set ++# CONFIG_USB_APPLEDISPLAY is not set ++# CONFIG_USB_LD is not set ++# CONFIG_USB_TRANCEVIBRATOR is not set ++# CONFIG_USB_IOWARRIOR is not set ++# CONFIG_USB_TEST is not set + + # + # USB DSL modem support +@@ -599,36 +960,51 @@ + # + # MMC/SD Card support + # +-# CONFIG_MMC is not set ++CONFIG_MMC=y ++# CONFIG_MMC_DEBUG is not set ++CONFIG_MMC_BLOCK=y ++CONFIG_MMC_AT91=y ++ ++# ++# Real Time Clock ++# ++CONFIG_RTC_LIB=y ++# CONFIG_RTC_CLASS is not set + + # + # File systems + # + CONFIG_EXT2_FS=y + CONFIG_EXT2_FS_XATTR=y +-# CONFIG_EXT2_FS_POSIX_ACL is not set +-# CONFIG_EXT2_FS_SECURITY is not set ++CONFIG_EXT2_FS_POSIX_ACL=y ++CONFIG_EXT2_FS_SECURITY=y + # CONFIG_EXT2_FS_XIP is not set + CONFIG_EXT3_FS=y + CONFIG_EXT3_FS_XATTR=y +-# CONFIG_EXT3_FS_POSIX_ACL is not set +-# CONFIG_EXT3_FS_SECURITY is not set ++CONFIG_EXT3_FS_POSIX_ACL=y ++CONFIG_EXT3_FS_SECURITY=y ++# CONFIG_EXT4DEV_FS is not set + CONFIG_JBD=y + # CONFIG_JBD_DEBUG is not set + CONFIG_FS_MBCACHE=y + # CONFIG_REISERFS_FS is not set + # CONFIG_JFS_FS is not set +- +-# +-# XFS support +-# ++CONFIG_FS_POSIX_ACL=y + # CONFIG_XFS_FS is not set ++# CONFIG_GFS2_FS is not set ++# CONFIG_OCFS2_FS is not set + # CONFIG_MINIX_FS is not set + # CONFIG_ROMFS_FS is not set +-# CONFIG_QUOTA is not set ++CONFIG_INOTIFY=y ++CONFIG_INOTIFY_USER=y ++CONFIG_QUOTA=y ++# CONFIG_QFMT_V1 is not set ++CONFIG_QFMT_V2=y ++CONFIG_QUOTACTL=y + CONFIG_DNOTIFY=y +-CONFIG_AUTOFS_FS=y ++# CONFIG_AUTOFS_FS is not set + CONFIG_AUTOFS4_FS=y ++# CONFIG_FUSE_FS is not set + + # + # CD-ROM/DVD Filesystems +@@ -643,25 +1019,40 @@ + CONFIG_MSDOS_FS=y + CONFIG_VFAT_FS=y + CONFIG_FAT_DEFAULT_CODEPAGE=437 +-CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" ++CONFIG_FAT_DEFAULT_IOCHARSET="ascii" + # CONFIG_NTFS_FS is not set + + # + # Pseudo filesystems + # + CONFIG_PROC_FS=y ++CONFIG_PROC_SYSCTL=y + CONFIG_SYSFS=y +-CONFIG_DEVPTS_FS_XATTR=y +-# CONFIG_DEVPTS_FS_SECURITY is not set + CONFIG_TMPFS=y +-# CONFIG_TMPFS_XATTR is not set ++# CONFIG_TMPFS_POSIX_ACL is not set + # CONFIG_HUGETLB_PAGE is not set + CONFIG_RAMFS=y ++CONFIG_CONFIGFS_FS=y + + # + # 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_JFFS2_FS=y ++CONFIG_JFFS2_FS_DEBUG=0 ++CONFIG_JFFS2_FS_WRITEBUFFER=y ++# CONFIG_JFFS2_SUMMARY is not set ++# CONFIG_JFFS2_FS_XATTR is not set ++# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set ++CONFIG_JFFS2_ZLIB=y ++CONFIG_JFFS2_RTIME=y ++# CONFIG_JFFS2_RUBIN is not set + # CONFIG_CRAMFS is not set + # CONFIG_VXFS_FS is not set + # CONFIG_HPFS_FS is not set +@@ -675,16 +1066,23 @@ + CONFIG_NFS_FS=y + CONFIG_NFS_V3=y + # CONFIG_NFS_V3_ACL is not set ++CONFIG_NFS_V4=y ++# CONFIG_NFS_DIRECTIO is not set + # CONFIG_NFSD is not set + CONFIG_ROOT_NFS=y + CONFIG_LOCKD=y + CONFIG_LOCKD_V4=y + CONFIG_NFS_COMMON=y + CONFIG_SUNRPC=y ++CONFIG_SUNRPC_GSS=y ++CONFIG_RPCSEC_GSS_KRB5=y ++# CONFIG_RPCSEC_GSS_SPKM3 is not set + # CONFIG_SMB_FS is not set + # CONFIG_CIFS is not set + # CONFIG_NCP_FS is not set + # CONFIG_CODA_FS is not set ++# CONFIG_AFS_FS is not set ++# CONFIG_9P_FS is not set + + # + # Partition Types +@@ -734,26 +1132,51 @@ + # CONFIG_NLS_ISO8859_15 is not set + # CONFIG_NLS_KOI8_R is not set + # CONFIG_NLS_KOI8_U is not set +-# CONFIG_NLS_UTF8 is not set ++CONFIG_NLS_UTF8=y ++ ++# ++# Distributed Lock Manager ++# ++# CONFIG_DLM is not set ++ ++# ++# Profiling support ++# ++# CONFIG_PROFILING is not set + + # + # Kernel hacking + # + # CONFIG_PRINTK_TIME is not set ++CONFIG_ENABLE_MUST_CHECK=y ++CONFIG_MAGIC_SYSRQ=y ++# CONFIG_UNUSED_SYMBOLS is not set ++# CONFIG_DEBUG_FS is not set ++# CONFIG_HEADERS_CHECK is not set + CONFIG_DEBUG_KERNEL=y +-# CONFIG_MAGIC_SYSRQ is not set +-CONFIG_LOG_BUF_SHIFT=14 ++# CONFIG_DEBUG_SHIRQ is not set ++CONFIG_LOG_BUF_SHIFT=17 ++CONFIG_DETECT_SOFTLOCKUP=y + # CONFIG_SCHEDSTATS is not set ++# CONFIG_TIMER_STATS is not set + # CONFIG_DEBUG_SLAB is not set +-# CONFIG_DEBUG_SPINLOCK is not set +-# CONFIG_DEBUG_SPINLOCK_SLEEP is not set ++# CONFIG_DEBUG_RT_MUTEXES is not set ++# CONFIG_RT_MUTEX_TESTER is not set ++CONFIG_DEBUG_SPINLOCK=y ++# CONFIG_DEBUG_MUTEXES is not set ++CONFIG_DEBUG_SPINLOCK_SLEEP=y ++# CONFIG_DEBUG_LOCKING_API_SELFTESTS 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_DEBUG_LIST is not set + CONFIG_FRAME_POINTER=y +-CONFIG_DEBUG_USER=y +-CONFIG_DEBUG_ERRORS=y ++CONFIG_FORCED_INLINING=y ++# CONFIG_RCU_TORTURE_TEST is not set ++# CONFIG_FAULT_INJECTION is not set ++# CONFIG_DEBUG_USER is not set ++# CONFIG_DEBUG_ERRORS is not set + CONFIG_DEBUG_LL=y + # CONFIG_DEBUG_ICEDCC is not set + +@@ -766,7 +1189,43 @@ + # + # Cryptographic options + # +-# CONFIG_CRYPTO is not set ++CONFIG_CRYPTO=y ++CONFIG_CRYPTO_ALGAPI=y ++CONFIG_CRYPTO_BLKCIPHER=y ++CONFIG_CRYPTO_HASH=m ++CONFIG_CRYPTO_MANAGER=y ++CONFIG_CRYPTO_HMAC=m ++# CONFIG_CRYPTO_XCBC is not set ++# CONFIG_CRYPTO_NULL is not set ++# CONFIG_CRYPTO_MD4 is not set ++CONFIG_CRYPTO_MD5=y ++# CONFIG_CRYPTO_SHA1 is not set ++# CONFIG_CRYPTO_SHA256 is not set ++# CONFIG_CRYPTO_SHA512 is not set ++# CONFIG_CRYPTO_WP512 is not set ++# CONFIG_CRYPTO_TGR192 is not set ++# CONFIG_CRYPTO_GF128MUL is not set ++# CONFIG_CRYPTO_ECB is not set ++CONFIG_CRYPTO_CBC=y ++CONFIG_CRYPTO_PCBC=m ++# CONFIG_CRYPTO_LRW is not set ++CONFIG_CRYPTO_DES=y ++# CONFIG_CRYPTO_FCRYPT is not set ++# CONFIG_CRYPTO_BLOWFISH is not set ++# CONFIG_CRYPTO_TWOFISH is not set ++# CONFIG_CRYPTO_SERPENT is not set ++# CONFIG_CRYPTO_AES is not set ++# CONFIG_CRYPTO_CAST5 is not set ++# CONFIG_CRYPTO_CAST6 is not set ++# CONFIG_CRYPTO_TEA is not set ++# CONFIG_CRYPTO_ARC4 is not set ++# CONFIG_CRYPTO_KHAZAD is not set ++# CONFIG_CRYPTO_ANUBIS is not set ++# CONFIG_CRYPTO_DEFLATE is not set ++# CONFIG_CRYPTO_MICHAEL_MIC is not set ++# CONFIG_CRYPTO_CRC32C is not set ++# CONFIG_CRYPTO_CAMELLIA is not set ++# CONFIG_CRYPTO_TEST is not set + + # + # Hardware crypto devices +@@ -775,6 +1234,14 @@ + # + # Library routines + # ++CONFIG_BITREVERSE=y + # CONFIG_CRC_CCITT is not set ++# CONFIG_CRC16 is not set + CONFIG_CRC32=y + # CONFIG_LIBCRC32C is not set ++CONFIG_AUDIT_GENERIC=y ++CONFIG_ZLIB_INFLATE=y ++CONFIG_ZLIB_DEFLATE=y ++CONFIG_PLIST=y ++CONFIG_HAS_IOMEM=y ++CONFIG_HAS_IOPORT=y +diff -urN -x CVS linux-2.6.24/arch/arm/configs/picotux200_defconfig linux-2.6/arch/arm/configs/picotux200_defconfig +--- linux-2.6.24/arch/arm/configs/picotux200_defconfig 2007-10-09 22:31:38.000000000 +0200 ++++ linux-2.6/arch/arm/configs/picotux200_defconfig 2007-12-31 10:43:35.000000000 +0200 +@@ -727,14 +727,14 @@ + # + # I2C Algorithms + # +-# CONFIG_I2C_ALGOBIT is not set ++CONFIG_I2C_ALGOBIT=m + # CONFIG_I2C_ALGOPCF is not set + # CONFIG_I2C_ALGOPCA is not set + + # + # I2C Hardware Bus support + # +-CONFIG_I2C_AT91=m ++CONFIG_I2C_GPIO=m + # CONFIG_I2C_OCORES is not set + # CONFIG_I2C_PARPORT_LIGHT is not set + # CONFIG_I2C_STUB is not set +diff -urN -x CVS linux-2.6.24/arch/arm/configs/sam9_l9260_defconfig linux-2.6/arch/arm/configs/sam9_l9260_defconfig +--- linux-2.6.24/arch/arm/configs/sam9_l9260_defconfig 1970-01-01 02:00:00.000000000 +0200 ++++ linux-2.6/arch/arm/configs/sam9_l9260_defconfig 2007-12-31 15:18:42.000000000 +0200 +@@ -0,0 +1,1098 @@ ++# ++# Automatically generated make config: don't edit ++# Linux kernel version: 2.6.23 ++# Sun Oct 14 02:01:07 2007 ++# ++CONFIG_ARM=y ++CONFIG_SYS_SUPPORTS_APM_EMULATION=y ++CONFIG_GENERIC_GPIO=y ++# CONFIG_GENERIC_TIME is not set ++# CONFIG_GENERIC_CLOCKEVENTS is not set ++CONFIG_MMU=y ++# CONFIG_NO_IOPORT is not set ++CONFIG_GENERIC_HARDIRQS=y ++CONFIG_STACKTRACE_SUPPORT=y ++CONFIG_LOCKDEP_SUPPORT=y ++CONFIG_TRACE_IRQFLAGS_SUPPORT=y ++CONFIG_HARDIRQS_SW_RESEND=y ++CONFIG_GENERIC_IRQ_PROBE=y ++CONFIG_RWSEM_GENERIC_SPINLOCK=y ++# CONFIG_ARCH_HAS_ILOG2_U32 is not set ++# CONFIG_ARCH_HAS_ILOG2_U64 is not set ++CONFIG_GENERIC_HWEIGHT=y ++CONFIG_GENERIC_CALIBRATE_DELAY=y ++CONFIG_ZONE_DMA=y ++CONFIG_VECTORS_BASE=0xffff0000 ++CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" ++ ++# ++# General setup ++# ++CONFIG_EXPERIMENTAL=y ++CONFIG_BROKEN_ON_SMP=y ++CONFIG_LOCK_KERNEL=y ++CONFIG_INIT_ENV_ARG_LIMIT=32 ++CONFIG_LOCALVERSION="" ++# CONFIG_LOCALVERSION_AUTO is not set ++CONFIG_SWAP=y ++CONFIG_SYSVIPC=y ++CONFIG_SYSVIPC_SYSCTL=y ++CONFIG_POSIX_MQUEUE=y ++CONFIG_BSD_PROCESS_ACCT=y ++CONFIG_BSD_PROCESS_ACCT_V3=y ++# CONFIG_TASKSTATS is not set ++# CONFIG_USER_NS is not set ++CONFIG_AUDIT=y ++# CONFIG_IKCONFIG is not set ++CONFIG_LOG_BUF_SHIFT=15 ++CONFIG_SYSFS_DEPRECATED=y ++# CONFIG_RELAY is not set ++CONFIG_BLK_DEV_INITRD=y ++CONFIG_INITRAMFS_SOURCE="" ++CONFIG_CC_OPTIMIZE_FOR_SIZE=y ++CONFIG_SYSCTL=y ++# CONFIG_EMBEDDED is not set ++CONFIG_UID16=y ++CONFIG_SYSCTL_SYSCALL=y ++CONFIG_KALLSYMS=y ++# CONFIG_KALLSYMS_ALL is not set ++# CONFIG_KALLSYMS_EXTRA_PASS is not set ++CONFIG_HOTPLUG=y ++CONFIG_PRINTK=y ++CONFIG_BUG=y ++CONFIG_ELF_CORE=y ++CONFIG_BASE_FULL=y ++CONFIG_FUTEX=y ++CONFIG_ANON_INODES=y ++CONFIG_EPOLL=y ++CONFIG_SIGNALFD=y ++CONFIG_EVENTFD=y ++CONFIG_SHMEM=y ++CONFIG_VM_EVENT_COUNTERS=y ++CONFIG_SLAB=y ++# CONFIG_SLUB is not set ++# CONFIG_SLOB is not set ++CONFIG_RT_MUTEXES=y ++# CONFIG_TINY_SHMEM is not set ++CONFIG_BASE_SMALL=0 ++# CONFIG_MODULES is not set ++CONFIG_BLOCK=y ++CONFIG_LBD=y ++# CONFIG_BLK_DEV_IO_TRACE is not set ++CONFIG_LSF=y ++# CONFIG_BLK_DEV_BSG is not set ++ ++# ++# IO Schedulers ++# ++CONFIG_IOSCHED_NOOP=y ++CONFIG_IOSCHED_AS=y ++CONFIG_IOSCHED_DEADLINE=y ++CONFIG_IOSCHED_CFQ=y ++# CONFIG_DEFAULT_AS is not set ++# CONFIG_DEFAULT_DEADLINE is not set ++CONFIG_DEFAULT_CFQ=y ++# CONFIG_DEFAULT_NOOP is not set ++CONFIG_DEFAULT_IOSCHED="cfq" ++ ++# ++# System Type ++# ++# CONFIG_ARCH_AAEC2000 is not set ++# CONFIG_ARCH_INTEGRATOR is not set ++# CONFIG_ARCH_REALVIEW is not set ++# CONFIG_ARCH_VERSATILE is not set ++CONFIG_ARCH_AT91=y ++# CONFIG_ARCH_CLPS7500 is not set ++# CONFIG_ARCH_CLPS711X is not set ++# CONFIG_ARCH_CO285 is not set ++# CONFIG_ARCH_EBSA110 is not set ++# CONFIG_ARCH_EP93XX is not set ++# CONFIG_ARCH_FOOTBRIDGE is not set ++# CONFIG_ARCH_NETX is not set ++# CONFIG_ARCH_H720X is not set ++# CONFIG_ARCH_IMX is not set ++# CONFIG_ARCH_IOP13XX is not set ++# CONFIG_ARCH_IOP32X is not set ++# CONFIG_ARCH_IOP33X is not set ++# CONFIG_ARCH_IXP23XX is not set ++# CONFIG_ARCH_IXP2000 is not set ++# CONFIG_ARCH_IXP4XX is not set ++# CONFIG_ARCH_L7200 is not set ++# CONFIG_ARCH_KS8695 is not set ++# CONFIG_ARCH_NS9XXX is not set ++# CONFIG_ARCH_MXC is not set ++# CONFIG_ARCH_PNX4008 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_DAVINCI is not set ++# CONFIG_ARCH_OMAP is not set ++ ++# ++# Boot options ++# ++ ++# ++# Power management ++# ++ ++# ++# Atmel AT91 System-on-Chip ++# ++# CONFIG_ARCH_AT91RM9200 is not set ++CONFIG_ARCH_AT91SAM9260=y ++# CONFIG_ARCH_AT91SAM9261 is not set ++# CONFIG_ARCH_AT91SAM9263 is not set ++# CONFIG_ARCH_AT91SAM9RL is not set ++ ++# ++# AT91SAM9260 Variants ++# ++# CONFIG_ARCH_AT91SAM9260_SAM9XE is not set ++ ++# ++# AT91SAM9260 / AT91SAM9XE Board Type ++# ++# CONFIG_MACH_AT91SAM9260EK is not set ++# CONFIG_MACH_CAM60 is not set ++CONFIG_MACH_SAM9_L9260=y ++ ++# ++# AT91 Board Options ++# ++CONFIG_MTD_AT91_DATAFLASH_CARD=y ++ ++# ++# AT91 Feature Selections ++# ++# CONFIG_AT91_PROGRAMMABLE_CLOCKS is not set ++# CONFIG_ATMEL_TCLIB is not set ++ ++# ++# Processor Type ++# ++CONFIG_CPU_32=y ++CONFIG_CPU_ARM926T=y ++CONFIG_CPU_32v5=y ++CONFIG_CPU_ABRT_EV5TJ=y ++CONFIG_CPU_CACHE_VIVT=y ++CONFIG_CPU_COPY_V4WB=y ++CONFIG_CPU_TLB_V4WBI=y ++CONFIG_CPU_CP15=y ++CONFIG_CPU_CP15_MMU=y ++ ++# ++# Processor Features ++# ++CONFIG_ARM_THUMB=y ++# CONFIG_CPU_ICACHE_DISABLE is not set ++# CONFIG_CPU_DCACHE_DISABLE is not set ++# CONFIG_CPU_DCACHE_WRITETHROUGH is not set ++# CONFIG_CPU_CACHE_ROUND_ROBIN is not set ++# CONFIG_OUTER_CACHE is not set ++ ++# ++# Bus support ++# ++# CONFIG_PCI_SYSCALL is not set ++# CONFIG_ARCH_SUPPORTS_MSI is not set ++ ++# ++# PCCARD (PCMCIA/CardBus) support ++# ++# CONFIG_PCCARD is not set ++ ++# ++# Kernel Features ++# ++# CONFIG_TICK_ONESHOT is not set ++CONFIG_PREEMPT=y ++# CONFIG_NO_IDLE_HZ is not set ++CONFIG_HZ=100 ++# CONFIG_AEABI 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_RESOURCES_64BIT is not set ++CONFIG_ZONE_DMA_FLAG=1 ++CONFIG_BOUNCE=y ++CONFIG_VIRT_TO_BUS=y ++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="console=ttyS0,115200 mem=64M initrd=0x21100000,4194304 root=/dev/ram0 rw" ++# CONFIG_XIP_KERNEL is not set ++# CONFIG_KEXEC 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 ++# CONFIG_VFP 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 ++CONFIG_SUSPEND_UP_POSSIBLE=y ++ ++# ++# Networking ++# ++CONFIG_NET=y ++ ++# ++# Networking options ++# ++CONFIG_PACKET=y ++CONFIG_PACKET_MMAP=y ++CONFIG_UNIX=y ++CONFIG_XFRM=y ++CONFIG_XFRM_USER=y ++# CONFIG_XFRM_SUB_POLICY is not set ++# CONFIG_XFRM_MIGRATE is not set ++CONFIG_NET_KEY=y ++# CONFIG_NET_KEY_MIGRATE is not set ++CONFIG_INET=y ++# CONFIG_IP_MULTICAST is not set ++# CONFIG_IP_ADVANCED_ROUTER is not set ++CONFIG_IP_FIB_HASH=y ++# CONFIG_IP_PNP is not set ++# CONFIG_NET_IPIP is not set ++# CONFIG_NET_IPGRE is not set ++# CONFIG_ARPD is not set ++# CONFIG_SYN_COOKIES is not set ++# CONFIG_INET_AH is not set ++# CONFIG_INET_ESP is not set ++# CONFIG_INET_IPCOMP is not set ++# CONFIG_INET_XFRM_TUNNEL is not set ++# CONFIG_INET_TUNNEL is not set ++# CONFIG_INET_XFRM_MODE_TRANSPORT is not set ++# CONFIG_INET_XFRM_MODE_TUNNEL is not set ++# CONFIG_INET_XFRM_MODE_BEET is not set ++CONFIG_INET_DIAG=y ++CONFIG_INET_TCP_DIAG=y ++# CONFIG_TCP_CONG_ADVANCED is not set ++CONFIG_TCP_CONG_CUBIC=y ++CONFIG_DEFAULT_TCP_CONG="cubic" ++# CONFIG_TCP_MD5SIG is not set ++# CONFIG_IPV6 is not set ++# CONFIG_INET6_XFRM_TUNNEL is not set ++# CONFIG_INET6_TUNNEL is not set ++# CONFIG_NETWORK_SECMARK is not set ++# CONFIG_NETFILTER is not set ++# CONFIG_IP_DCCP is not set ++# CONFIG_IP_SCTP is not set ++# CONFIG_TIPC is not set ++# CONFIG_ATM is not set ++# CONFIG_BRIDGE is not set ++# CONFIG_VLAN_8021Q is not set ++# CONFIG_DECNET is not set ++# CONFIG_LLC2 is not set ++# CONFIG_IPX is not set ++# CONFIG_ATALK is not set ++# CONFIG_X25 is not set ++# CONFIG_LAPB is not set ++# CONFIG_ECONET is not set ++# CONFIG_WAN_ROUTER is not set ++ ++# ++# 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_AF_RXRPC is not set ++ ++# ++# Wireless ++# ++# CONFIG_CFG80211 is not set ++# CONFIG_WIRELESS_EXT is not set ++# CONFIG_MAC80211 is not set ++# CONFIG_IEEE80211 is not set ++# CONFIG_RFKILL is not set ++# CONFIG_NET_9P is not set ++ ++# ++# Device Drivers ++# ++ ++# ++# Generic Driver Options ++# ++CONFIG_STANDALONE=y ++CONFIG_PREVENT_FIRMWARE_BUILD=y ++CONFIG_FW_LOADER=y ++# CONFIG_DEBUG_DRIVER is not set ++# CONFIG_DEBUG_DEVRES is not set ++# CONFIG_SYS_HYPERVISOR is not set ++# CONFIG_CONNECTOR is not set ++CONFIG_MTD=y ++# CONFIG_MTD_DEBUG is not set ++# CONFIG_MTD_CONCAT is not set ++CONFIG_MTD_PARTITIONS=y ++# CONFIG_MTD_REDBOOT_PARTS is not set ++# CONFIG_MTD_CMDLINE_PARTS is not set ++# CONFIG_MTD_AFS_PARTS is not set ++ ++# ++# User Modules And Translation Layers ++# ++CONFIG_MTD_CHAR=y ++CONFIG_MTD_BLKDEVS=y ++CONFIG_MTD_BLOCK=y ++# CONFIG_FTL is not set ++# CONFIG_NFTL is not set ++# CONFIG_INFTL is not set ++# CONFIG_RFD_FTL is not set ++# CONFIG_SSFDC is not set ++ ++# ++# RAM/ROM/Flash chip drivers ++# ++# CONFIG_MTD_CFI is not set ++# CONFIG_MTD_JEDECPROBE is not set ++CONFIG_MTD_MAP_BANK_WIDTH_1=y ++CONFIG_MTD_MAP_BANK_WIDTH_2=y ++CONFIG_MTD_MAP_BANK_WIDTH_4=y ++# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set ++# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set ++# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set ++CONFIG_MTD_CFI_I1=y ++CONFIG_MTD_CFI_I2=y ++# CONFIG_MTD_CFI_I4 is not set ++# CONFIG_MTD_CFI_I8 is not set ++# CONFIG_MTD_RAM is not set ++# CONFIG_MTD_ROM is not set ++# CONFIG_MTD_ABSENT is not set ++ ++# ++# Mapping drivers for chip access ++# ++# CONFIG_MTD_COMPLEX_MAPPINGS is not set ++# CONFIG_MTD_PLATRAM is not set ++ ++# ++# Self-contained MTD device drivers ++# ++# CONFIG_MTD_SLRAM is not set ++# CONFIG_MTD_PHRAM is not set ++# CONFIG_MTD_MTDRAM is not set ++CONFIG_MTD_BLOCK2MTD=y ++ ++# ++# Disk-On-Chip Device Drivers ++# ++# CONFIG_MTD_DOC2000 is not set ++# CONFIG_MTD_DOC2001 is not set ++# CONFIG_MTD_DOC2001PLUS is not set ++CONFIG_MTD_NAND=y ++# CONFIG_MTD_NAND_VERIFY_WRITE is not set ++# CONFIG_MTD_NAND_ECC_SMC is not set ++# CONFIG_MTD_NAND_MUSEUM_IDS is not set ++CONFIG_MTD_NAND_IDS=y ++# CONFIG_MTD_NAND_DISKONCHIP is not set ++CONFIG_MTD_NAND_AT91=y ++# CONFIG_MTD_NAND_NANDSIM is not set ++CONFIG_MTD_NAND_PLATFORM=y ++# CONFIG_MTD_ONENAND is not set ++ ++# ++# UBI - Unsorted block images ++# ++CONFIG_MTD_UBI=y ++CONFIG_MTD_UBI_WL_THRESHOLD=4096 ++CONFIG_MTD_UBI_BEB_RESERVE=3 ++CONFIG_MTD_UBI_GLUEBI=y ++ ++# ++# UBI debugging options ++# ++# CONFIG_MTD_UBI_DEBUG is not set ++# CONFIG_PARPORT is not set ++CONFIG_BLK_DEV=y ++# CONFIG_BLK_DEV_COW_COMMON is not set ++CONFIG_BLK_DEV_LOOP=y ++# CONFIG_BLK_DEV_CRYPTOLOOP is not set ++# CONFIG_BLK_DEV_NBD 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_RAM_BLOCKSIZE=1024 ++# CONFIG_CDROM_PKTCDVD is not set ++# CONFIG_ATA_OVER_ETH is not set ++ ++# ++# SCSI device support ++# ++CONFIG_RAID_ATTRS=y ++CONFIG_SCSI=y ++CONFIG_SCSI_DMA=y ++# CONFIG_SCSI_TGT is not set ++# CONFIG_SCSI_NETLINK is not set ++CONFIG_SCSI_PROC_FS=y ++ ++# ++# SCSI support type (disk, tape, CD-ROM) ++# ++CONFIG_BLK_DEV_SD=y ++# CONFIG_CHR_DEV_ST is not set ++# CONFIG_CHR_DEV_OSST is not set ++# CONFIG_BLK_DEV_SR is not set ++CONFIG_CHR_DEV_SG=y ++# CONFIG_CHR_DEV_SCH is not set ++ ++# ++# Some SCSI devices (e.g. CD jukebox) support multiple LUNs ++# ++CONFIG_SCSI_MULTI_LUN=y ++CONFIG_SCSI_CONSTANTS=y ++CONFIG_SCSI_LOGGING=y ++# CONFIG_SCSI_SCAN_ASYNC is not set ++ ++# ++# SCSI Transports ++# ++# CONFIG_SCSI_SPI_ATTRS is not set ++# CONFIG_SCSI_FC_ATTRS is not set ++# CONFIG_SCSI_ISCSI_ATTRS is not set ++# CONFIG_SCSI_SAS_LIBSAS is not set ++# CONFIG_SCSI_LOWLEVEL is not set ++# CONFIG_ATA is not set ++# CONFIG_MD is not set ++CONFIG_NETDEVICES=y ++# CONFIG_NETDEVICES_MULTIQUEUE is not set ++# CONFIG_DUMMY is not set ++# CONFIG_BONDING is not set ++# CONFIG_MACVLAN is not set ++# CONFIG_EQUALIZER is not set ++# CONFIG_TUN is not set ++CONFIG_PHYLIB=y ++ ++# ++# MII PHY device drivers ++# ++# CONFIG_MARVELL_PHY is not set ++# CONFIG_DAVICOM_PHY is not set ++# CONFIG_QSEMI_PHY is not set ++# CONFIG_LXT_PHY is not set ++# CONFIG_CICADA_PHY is not set ++# CONFIG_VITESSE_PHY is not set ++# CONFIG_SMSC_PHY is not set ++# CONFIG_BROADCOM_PHY is not set ++# CONFIG_ICPLUS_PHY is not set ++# CONFIG_FIXED_PHY is not set ++CONFIG_NET_ETHERNET=y ++CONFIG_MII=y ++CONFIG_MACB=y ++# CONFIG_AX88796 is not set ++# CONFIG_SMC91X is not set ++# CONFIG_DM9000 is not set ++# CONFIG_NETDEV_1000 is not set ++# CONFIG_NETDEV_10000 is not set ++ ++# ++# Wireless LAN ++# ++# CONFIG_WLAN_PRE80211 is not set ++# CONFIG_WLAN_80211 is not set ++ ++# ++# 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_MII is not set ++# CONFIG_USB_USBNET is not set ++# CONFIG_WAN is not set ++# CONFIG_PPP is not set ++# CONFIG_SLIP is not set ++# CONFIG_SHAPER is not set ++# CONFIG_NETCONSOLE is not set ++# CONFIG_NETPOLL is not set ++# CONFIG_NET_POLL_CONTROLLER is not set ++# CONFIG_ISDN is not set ++ ++# ++# Input device support ++# ++CONFIG_INPUT=y ++# CONFIG_INPUT_FF_MEMLESS is not set ++# CONFIG_INPUT_POLLDEV is not set ++ ++# ++# Userland interfaces ++# ++CONFIG_INPUT_MOUSEDEV=y ++# CONFIG_INPUT_MOUSEDEV_PSAUX is not set ++CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 ++CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 ++# CONFIG_INPUT_JOYDEV is not set ++# CONFIG_INPUT_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_TABLET is not set ++# CONFIG_INPUT_TOUCHSCREEN is not set ++# CONFIG_INPUT_MISC is not set ++ ++# ++# Hardware I/O ports ++# ++# CONFIG_SERIO is not set ++# CONFIG_GAMEPORT is not set ++ ++# ++# Character devices ++# ++CONFIG_VT=y ++CONFIG_VT_CONSOLE=y ++CONFIG_HW_CONSOLE=y ++# CONFIG_VT_HW_CONSOLE_BINDING is not set ++# CONFIG_SERIAL_NONSTANDARD is not set ++ ++# ++# Serial drivers ++# ++# CONFIG_SERIAL_8250 is not set ++ ++# ++# Non-8250 serial port support ++# ++CONFIG_SERIAL_ATMEL=y ++CONFIG_SERIAL_ATMEL_CONSOLE=y ++# CONFIG_SERIAL_ATMEL_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=16 ++# CONFIG_IPMI_HANDLER is not set ++# CONFIG_WATCHDOG is not set ++# CONFIG_HW_RANDOM is not set ++# CONFIG_NVRAM is not set ++# CONFIG_R3964 is not set ++# CONFIG_RAW_DRIVER is not set ++# CONFIG_TCG_TPM is not set ++# CONFIG_I2C is not set ++ ++# ++# SPI support ++# ++# CONFIG_SPI is not set ++# CONFIG_SPI_MASTER is not set ++# CONFIG_W1 is not set ++# CONFIG_HWMON is not set ++# CONFIG_MISC_DEVICES is not set ++ ++# ++# Multifunction device drivers ++# ++# CONFIG_MFD_SM501 is not set ++CONFIG_NEW_LEDS=y ++CONFIG_LEDS_CLASS=y ++ ++# ++# LED drivers ++# ++CONFIG_LEDS_GPIO=y ++ ++# ++# LED Triggers ++# ++CONFIG_LEDS_TRIGGERS=y ++CONFIG_LEDS_TRIGGER_TIMER=y ++CONFIG_LEDS_TRIGGER_HEARTBEAT=y ++ ++# ++# Multimedia devices ++# ++# CONFIG_VIDEO_DEV is not set ++# CONFIG_DVB_CORE is not set ++# CONFIG_DAB is not set ++ ++# ++# Graphics support ++# ++# CONFIG_BACKLIGHT_LCD_SUPPORT is not set ++ ++# ++# Display device support ++# ++# CONFIG_DISPLAY_SUPPORT is not set ++# CONFIG_VGASTATE is not set ++# CONFIG_VIDEO_OUTPUT_CONTROL is not set ++# CONFIG_FB is not set ++ ++# ++# Console display driver support ++# ++# CONFIG_VGA_CONSOLE is not set ++CONFIG_DUMMY_CONSOLE=y ++ ++# ++# Sound ++# ++# CONFIG_SOUND is not set ++# CONFIG_HID_SUPPORT is not set ++CONFIG_USB_SUPPORT=y ++CONFIG_USB_ARCH_HAS_HCD=y ++CONFIG_USB_ARCH_HAS_OHCI=y ++# CONFIG_USB_ARCH_HAS_EHCI is not set ++CONFIG_USB=y ++# CONFIG_USB_DEBUG is not set ++ ++# ++# Miscellaneous USB options ++# ++CONFIG_USB_DEVICEFS=y ++CONFIG_USB_DEVICE_CLASS=y ++# 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_DESC is not set ++# CONFIG_USB_OHCI_BIG_ENDIAN_MMIO is not set ++CONFIG_USB_OHCI_LITTLE_ENDIAN=y ++# CONFIG_USB_SL811_HCD is not set ++# CONFIG_USB_R8A66597_HCD is not set ++ ++# ++# 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=y ++# CONFIG_USB_STORAGE_DEBUG is not set ++# CONFIG_USB_STORAGE_DATAFAB is not set ++# CONFIG_USB_STORAGE_FREECOM is not set ++# CONFIG_USB_STORAGE_DPCM is not set ++# CONFIG_USB_STORAGE_USBAT is not set ++# CONFIG_USB_STORAGE_SDDR09 is not set ++# CONFIG_USB_STORAGE_SDDR55 is not set ++# CONFIG_USB_STORAGE_JUMPSHOT is not set ++# CONFIG_USB_STORAGE_ALAUDA is not set ++# CONFIG_USB_STORAGE_KARMA is not set ++CONFIG_USB_LIBUSUAL=y ++ ++# ++# USB Imaging devices ++# ++# CONFIG_USB_MDC800 is not set ++# CONFIG_USB_MICROTEK is not set ++# CONFIG_USB_MON is not set ++ ++# ++# 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_ADUTUX 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_BERRY_CHARGE is not set ++# CONFIG_USB_LED is not set ++# CONFIG_USB_CYPRESS_CY7C63 is not set ++# CONFIG_USB_CYTHERM is not set ++# CONFIG_USB_PHIDGET is not set ++# CONFIG_USB_IDMOUSE is not set ++# CONFIG_USB_FTDI_ELAN is not set ++# CONFIG_USB_APPLEDISPLAY is not set ++# CONFIG_USB_LD is not set ++# CONFIG_USB_TRANCEVIBRATOR is not set ++# CONFIG_USB_IOWARRIOR is not set ++# CONFIG_USB_TEST is not set ++ ++# ++# USB DSL modem support ++# ++ ++# ++# USB Gadget Support ++# ++CONFIG_USB_GADGET=y ++# CONFIG_USB_GADGET_DEBUG is not set ++# CONFIG_USB_GADGET_DEBUG_FILES is not set ++CONFIG_USB_GADGET_SELECTED=y ++# CONFIG_USB_GADGET_AMD5536UDC is not set ++# CONFIG_USB_GADGET_FSL_USB2 is not set ++# CONFIG_USB_GADGET_NET2280 is not set ++# CONFIG_USB_GADGET_PXA2XX is not set ++# CONFIG_USB_GADGET_M66592 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_S3C2410 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=y ++CONFIG_USB_ETH_RNDIS=y ++# CONFIG_USB_GADGETFS is not set ++# CONFIG_USB_FILE_STORAGE is not set ++# CONFIG_USB_G_SERIAL is not set ++# CONFIG_USB_MIDI_GADGET is not set ++CONFIG_MMC=y ++CONFIG_MMC_DEBUG=y ++# CONFIG_MMC_UNSAFE_RESUME is not set ++ ++# ++# MMC/SD Card Drivers ++# ++CONFIG_MMC_BLOCK=y ++CONFIG_MMC_BLOCK_BOUNCE=y ++ ++# ++# MMC/SD Host Controller Drivers ++# ++CONFIG_MMC_AT91=y ++CONFIG_RTC_LIB=y ++CONFIG_RTC_CLASS=y ++CONFIG_RTC_HCTOSYS=y ++CONFIG_RTC_HCTOSYS_DEVICE="rtc0" ++# CONFIG_RTC_DEBUG is not set ++ ++# ++# RTC interfaces ++# ++CONFIG_RTC_INTF_SYSFS=y ++CONFIG_RTC_INTF_PROC=y ++CONFIG_RTC_INTF_DEV=y ++# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set ++# CONFIG_RTC_DRV_TEST is not set ++ ++# ++# SPI RTC drivers ++# ++ ++# ++# Platform RTC drivers ++# ++# CONFIG_RTC_DRV_CMOS is not set ++CONFIG_RTC_DRV_DS1553=y ++# CONFIG_RTC_DRV_STK17TA8 is not set ++CONFIG_RTC_DRV_DS1742=y ++CONFIG_RTC_DRV_M48T86=y ++# CONFIG_RTC_DRV_M48T59 is not set ++CONFIG_RTC_DRV_V3020=y ++ ++# ++# on-CPU RTC drivers ++# ++ ++# ++# DMA Engine support ++# ++# CONFIG_DMA_ENGINE is not set ++ ++# ++# DMA Clients ++# ++ ++# ++# DMA Devices ++# ++ ++# ++# File systems ++# ++CONFIG_EXT2_FS=y ++CONFIG_EXT2_FS_XATTR=y ++CONFIG_EXT2_FS_POSIX_ACL=y ++CONFIG_EXT2_FS_SECURITY=y ++# CONFIG_EXT2_FS_XIP is not set ++CONFIG_EXT3_FS=y ++CONFIG_EXT3_FS_XATTR=y ++CONFIG_EXT3_FS_POSIX_ACL=y ++CONFIG_EXT3_FS_SECURITY=y ++# CONFIG_EXT4DEV_FS is not set ++CONFIG_JBD=y ++# CONFIG_JBD_DEBUG is not set ++CONFIG_FS_MBCACHE=y ++# CONFIG_REISERFS_FS is not set ++# CONFIG_JFS_FS is not set ++CONFIG_FS_POSIX_ACL=y ++# CONFIG_XFS_FS is not set ++# CONFIG_GFS2_FS is not set ++# CONFIG_OCFS2_FS is not set ++# CONFIG_MINIX_FS is not set ++# CONFIG_ROMFS_FS is not set ++CONFIG_INOTIFY=y ++CONFIG_INOTIFY_USER=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_FAT_FS=y ++CONFIG_MSDOS_FS=y ++CONFIG_VFAT_FS=y ++CONFIG_FAT_DEFAULT_CODEPAGE=437 ++CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" ++# CONFIG_NTFS_FS is not set ++ ++# ++# Pseudo filesystems ++# ++CONFIG_PROC_FS=y ++CONFIG_PROC_SYSCTL=y ++CONFIG_SYSFS=y ++CONFIG_TMPFS=y ++# CONFIG_TMPFS_POSIX_ACL is not set ++# CONFIG_HUGETLB_PAGE is not set ++CONFIG_RAMFS=y ++# CONFIG_CONFIGFS_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_JFFS2_FS=y ++CONFIG_JFFS2_FS_DEBUG=0 ++CONFIG_JFFS2_FS_WRITEBUFFER=y ++# CONFIG_JFFS2_SUMMARY is not set ++# CONFIG_JFFS2_FS_XATTR is not set ++# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set ++CONFIG_JFFS2_ZLIB=y ++CONFIG_JFFS2_RTIME=y ++# CONFIG_JFFS2_RUBIN is not set ++# CONFIG_CRAMFS is not set ++# 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=y ++CONFIG_NFS_V3=y ++# CONFIG_NFS_V3_ACL is not set ++# CONFIG_NFS_V4 is not set ++CONFIG_NFS_DIRECTIO=y ++# CONFIG_NFSD is not set ++CONFIG_LOCKD=y ++CONFIG_LOCKD_V4=y ++CONFIG_NFS_COMMON=y ++CONFIG_SUNRPC=y ++# CONFIG_SUNRPC_BIND34 is not set ++# CONFIG_RPCSEC_GSS_KRB5 is not set ++# CONFIG_RPCSEC_GSS_SPKM3 is not set ++# CONFIG_SMB_FS is not set ++# CONFIG_CIFS is not set ++# CONFIG_NCP_FS is not set ++# CONFIG_CODA_FS is not set ++# CONFIG_AFS_FS is not set ++ ++# ++# Partition Types ++# ++# CONFIG_PARTITION_ADVANCED is not set ++CONFIG_MSDOS_PARTITION=y ++ ++# ++# Native Language Support ++# ++CONFIG_NLS=y ++CONFIG_NLS_DEFAULT="iso8859-1" ++CONFIG_NLS_CODEPAGE_437=y ++CONFIG_NLS_CODEPAGE_737=y ++CONFIG_NLS_CODEPAGE_775=y ++CONFIG_NLS_CODEPAGE_850=y ++CONFIG_NLS_CODEPAGE_852=y ++CONFIG_NLS_CODEPAGE_855=y ++CONFIG_NLS_CODEPAGE_857=y ++CONFIG_NLS_CODEPAGE_860=y ++CONFIG_NLS_CODEPAGE_861=y ++CONFIG_NLS_CODEPAGE_862=y ++CONFIG_NLS_CODEPAGE_863=y ++CONFIG_NLS_CODEPAGE_864=y ++CONFIG_NLS_CODEPAGE_865=y ++CONFIG_NLS_CODEPAGE_866=y ++CONFIG_NLS_CODEPAGE_869=y ++CONFIG_NLS_CODEPAGE_936=y ++CONFIG_NLS_CODEPAGE_950=y ++CONFIG_NLS_CODEPAGE_932=y ++CONFIG_NLS_CODEPAGE_949=y ++CONFIG_NLS_CODEPAGE_874=y ++CONFIG_NLS_ISO8859_8=y ++CONFIG_NLS_CODEPAGE_1250=y ++CONFIG_NLS_CODEPAGE_1251=y ++CONFIG_NLS_ASCII=y ++CONFIG_NLS_ISO8859_1=y ++CONFIG_NLS_ISO8859_2=y ++CONFIG_NLS_ISO8859_3=y ++CONFIG_NLS_ISO8859_4=y ++CONFIG_NLS_ISO8859_5=y ++CONFIG_NLS_ISO8859_6=y ++CONFIG_NLS_ISO8859_7=y ++CONFIG_NLS_ISO8859_9=y ++CONFIG_NLS_ISO8859_13=y ++CONFIG_NLS_ISO8859_14=y ++CONFIG_NLS_ISO8859_15=y ++CONFIG_NLS_KOI8_R=y ++CONFIG_NLS_KOI8_U=y ++CONFIG_NLS_UTF8=y ++ ++# ++# Distributed Lock Manager ++# ++# CONFIG_DLM is not set ++ ++# ++# Profiling support ++# ++# CONFIG_PROFILING is not set ++ ++# ++# Kernel hacking ++# ++# CONFIG_PRINTK_TIME is not set ++CONFIG_ENABLE_MUST_CHECK=y ++CONFIG_MAGIC_SYSRQ=y ++CONFIG_UNUSED_SYMBOLS=y ++CONFIG_DEBUG_FS=y ++# CONFIG_HEADERS_CHECK is not set ++CONFIG_DEBUG_KERNEL=y ++# CONFIG_DEBUG_SHIRQ is not set ++CONFIG_DETECT_SOFTLOCKUP=y ++CONFIG_SCHED_DEBUG=y ++# CONFIG_SCHEDSTATS is not set ++# CONFIG_TIMER_STATS is not set ++# CONFIG_DEBUG_SLAB is not set ++CONFIG_DEBUG_PREEMPT=y ++# CONFIG_DEBUG_RT_MUTEXES is not set ++# CONFIG_RT_MUTEX_TESTER is not set ++# CONFIG_DEBUG_SPINLOCK is not set ++# CONFIG_DEBUG_MUTEXES is not set ++# CONFIG_DEBUG_LOCK_ALLOC is not set ++# CONFIG_PROVE_LOCKING is not set ++# CONFIG_LOCK_STAT is not set ++# CONFIG_DEBUG_SPINLOCK_SLEEP is not set ++# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set ++# CONFIG_DEBUG_KOBJECT is not set ++CONFIG_DEBUG_BUGVERBOSE=y ++# CONFIG_DEBUG_INFO is not set ++# CONFIG_DEBUG_VM is not set ++# CONFIG_DEBUG_LIST is not set ++CONFIG_FRAME_POINTER=y ++CONFIG_FORCED_INLINING=y ++# CONFIG_FAULT_INJECTION is not set ++# CONFIG_DEBUG_USER 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 ++# CONFIG_CRYPTO is not set ++ ++# ++# Library routines ++# ++CONFIG_BITREVERSE=y ++# CONFIG_CRC_CCITT is not set ++# CONFIG_CRC16 is not set ++# CONFIG_CRC_ITU_T is not set ++CONFIG_CRC32=y ++# CONFIG_CRC7 is not set ++# CONFIG_LIBCRC32C is not set ++CONFIG_AUDIT_GENERIC=y ++CONFIG_ZLIB_INFLATE=y ++CONFIG_ZLIB_DEFLATE=y ++CONFIG_PLIST=y ++CONFIG_HAS_IOMEM=y ++CONFIG_HAS_IOPORT=y ++CONFIG_HAS_DMA=y +diff -urN -x CVS linux-2.6.24/arch/arm/mach-at91/Kconfig linux-2.6/arch/arm/mach-at91/Kconfig +--- linux-2.6.24/arch/arm/mach-at91/Kconfig 2008-03-01 22:02:07.000000000 +0200 ++++ linux-2.6/arch/arm/mach-at91/Kconfig 2008-03-01 19:29:48.000000000 +0200 +@@ -12,15 +12,28 @@ + + config ARCH_AT91SAM9260 + bool "AT91SAM9260 or AT91SAM9XE" ++ select GENERIC_TIME ++ select GENERIC_CLOCKEVENTS + + config ARCH_AT91SAM9261 + bool "AT91SAM9261" ++ select GENERIC_TIME ++ select GENERIC_CLOCKEVENTS + + config ARCH_AT91SAM9263 + bool "AT91SAM9263" ++ select GENERIC_TIME ++ select GENERIC_CLOCKEVENTS + + config ARCH_AT91SAM9RL + bool "AT91SAM9RL" ++ select GENERIC_TIME ++ select GENERIC_CLOCKEVENTS ++ ++config ARCH_AT91CAP9 ++ bool "AT91CAP9" ++ select GENERIC_TIME ++ select GENERIC_CLOCKEVENTS + + config ARCH_AT91X40 + bool "AT91x40" +@@ -42,7 +55,7 @@ + depends on ARCH_AT91RM9200 + help + Select this if you are using Ajeco's 1ARM Single Board Computer. +- <http://www.ajeco.fi/products.htm> ++ <http://www.ajeco.fi/eng/products_e.htm> + + config ARCH_AT91RM9200DK + bool "Atmel AT91RM9200-DK Development board" +@@ -106,6 +119,32 @@ + help + Select this if you are using Sperry-Sun's KAFA board. + ++config MACH_CHUB ++ bool "Promwad Chub board" ++ depends on ARCH_AT91RM9200 ++ help ++ Select this if you are using Promwad's Chub board. ++ ++config MACH_HOMEMATIC ++ bool "eQ-3 HomeMatic" ++ depends on ARCH_AT91RM9200 ++ help ++ Select this if you are using eQ-3's HomeMatic device. ++ <http://www.eq-3.com> ++ ++config MACH_ECBAT91 ++ bool "emQbit ECB_AT91 SBC" ++ depends on ARCH_AT91RM9200 ++ help ++ Select this if you are using emQbit's ECB_AT91 board. ++ <http://wiki.emqbit.com/free-ecb-at91> ++ ++config MACH_SWEDATMS ++ bool "Sweda TMS Board" ++ depends on ARCH_AT91RM9200 ++ help ++ Select this if you are using Sweda TMS-100 board. ++ + endif + + # ---------------------------------------------------------- +@@ -130,6 +169,20 @@ + Select this if you are using Atmel's AT91SAM9260-EK or AT91SAM9XE Evaluation Kit + <http://www.atmel.com/dyn/products/tools_card.asp?tool_id=3933> + ++config MACH_CAM60 ++ bool "KwikByte CAM60 board" ++ depends on ARCH_AT91SAM9260 ++ help ++ Select this if you are using KwikByte's CAM60 board based on the Atmel AT91SAM9260. ++ <http://www.kwikbyte.com> ++ ++config MACH_SAM9_L9260 ++ bool "Olimex SAM9-L9260 board" ++ depends on ARCH_AT91SAM9260 ++ help ++ Select this if you are using Olimex's SAM9-L9260 board based on the Atmel AT91SAM9260. ++ http://www.olimex.com/dev/sam9-L9260.html ++ + endif + + # ---------------------------------------------------------- +@@ -178,6 +231,21 @@ + + # ---------------------------------------------------------- + ++if ARCH_AT91CAP9 ++ ++comment "AT91CAP9 Board Type" ++ ++config MACH_AT91CAP9ADK ++ bool "Atmel AT91CAP9A-DK Evaluation Kit" ++ depends on ARCH_AT91CAP9 ++ help ++ Select this if you are using Atmel's AT91CAP9A-DK Evaluation Kit. ++ <http://www.atmel.com/dyn/products/tools_card.asp?tool_id=4138> ++ ++endif ++ ++# ---------------------------------------------------------- ++ + if ARCH_AT91X40 + + comment "AT91X40 Board Type" +@@ -198,13 +266,13 @@ + + config MTD_AT91_DATAFLASH_CARD + bool "Enable DataFlash Card support" +- depends on (ARCH_AT91RM9200DK || MACH_AT91RM9200EK || MACH_AT91SAM9260EK || MACH_AT91SAM9261EK || MACH_AT91SAM9263EK) ++ depends on (ARCH_AT91RM9200DK || MACH_AT91RM9200EK || MACH_AT91SAM9260EK || MACH_AT91SAM9261EK || MACH_AT91SAM9263EK || MACH_ECBAT91 || MACH_SAM9_L9260 || MACH_AT91CAP9ADK) + help + Enable support for the DataFlash card. + + config MTD_NAND_AT91_BUSWIDTH_16 + bool "Enable 16-bit data bus interface to NAND flash" +- depends on (MACH_AT91SAM9260EK || MACH_AT91SAM9261EK || MACH_AT91SAM9263EK) ++ depends on (MACH_AT91SAM9260EK || MACH_AT91SAM9261EK || MACH_AT91SAM9263EK || MACH_AT91CAP9ADK) + help + On AT91SAM926x boards both types of NAND flash can be present + (8 and 16 bit data bus width). +@@ -219,6 +287,65 @@ + Select this if you need to program one or more of the PCK0..PCK3 + programmable clock outputs. + ++config AT91_SLOW_CLOCK ++ bool "Suspend-to-RAM disables main oscillator" ++ depends on SUSPEND ++ help ++ Select this if you want Suspend-to-RAM to save the most power ++ possible (without powering off the CPU) by disabling the PLLs ++ and main oscillator so that only the 32 KiHz clock is available. ++ ++ When only that slow-clock is available, some peripherals lose ++ functionality. Many can't issue wakeup events unless faster ++ clocks are available. Some lose their operating state and ++ need to be completely re-initialized. ++ ++config AT91_TIMER_HZ ++ int "Kernel HZ (jiffies per second)" ++ range 32 1024 ++ depends on ARCH_AT91 ++ default "128" if ARCH_AT91RM9200 ++ default "100" ++ help ++ On AT91rm9200 chips where you're using a system clock derived ++ from the 32768 Hz hardware clock, this tick rate should divide ++ it exactly: use a power-of-two value, such as 128 or 256, to ++ reduce timing errors caused by rounding. ++ ++ On AT91sam926x chips, or otherwise using a higher precision ++ system clock (of at least several MHz), rounding is less of a ++ problem so it can be safer to use a decimal values like 100. ++ ++choice ++ prompt "Select a UART for early kernel messages" ++ ++config AT91_EARLY_DBGU ++ bool "DBGU" ++ ++config AT91_EARLY_USART0 ++ bool "USART0" ++ ++config AT91_EARLY_USART1 ++ bool "USART1" ++ ++config AT91_EARLY_USART2 ++ bool "USART2" ++ depends on ! ARCH_AT91X40 ++ ++config AT91_EARLY_USART3 ++ bool "USART3" ++ depends on (ARCH_AT91RM9200 || ARCH_AT91SAM9RL || ARCH_AT91SAM9260) ++ ++config AT91_EARLY_USART4 ++ bool "USART4" ++ depends on ARCH_AT91SAM9260 ++ ++config AT91_EARLY_USART5 ++ bool "USART5" ++ depends on ARCH_AT91SAM9260 ++ ++endchoice ++ + endmenu + + endif +diff -urN -x CVS linux-2.6.24/arch/arm/mach-at91/Makefile linux-2.6/arch/arm/mach-at91/Makefile +--- linux-2.6.24/arch/arm/mach-at91/Makefile 2008-03-01 22:02:07.000000000 +0200 ++++ linux-2.6/arch/arm/mach-at91/Makefile 2008-03-01 18:45:33.000000000 +0200 +@@ -8,7 +8,6 @@ + obj- := + + obj-$(CONFIG_AT91_PMC_UNIT) += clock.o +-obj-$(CONFIG_PM) += pm.o + + # CPU-specific support + obj-$(CONFIG_ARCH_AT91RM9200) += at91rm9200.o at91rm9200_time.o at91rm9200_devices.o +@@ -16,6 +15,7 @@ + obj-$(CONFIG_ARCH_AT91SAM9261) += at91sam9261.o at91sam926x_time.o at91sam9261_devices.o + obj-$(CONFIG_ARCH_AT91SAM9263) += at91sam9263.o at91sam926x_time.o at91sam9263_devices.o + obj-$(CONFIG_ARCH_AT91SAM9RL) += at91sam9rl.o at91sam926x_time.o at91sam9rl_devices.o ++obj-$(CONFIG_ARCH_AT91CAP9) += at91cap9.o at91sam926x_time.o at91cap9_devices.o + obj-$(CONFIG_ARCH_AT91X40) += at91x40.o at91x40_time.o + + # AT91RM9200 board-specific support +@@ -28,11 +28,16 @@ + obj-$(CONFIG_MACH_KB9200) += board-kb9202.o + obj-$(CONFIG_MACH_ATEB9200) += board-eb9200.o + obj-$(CONFIG_MACH_KAFA) += board-kafa.o ++obj-$(CONFIG_MACH_CHUB) += board-chub.o + obj-$(CONFIG_MACH_PICOTUX2XX) += board-picotux200.o +-obj-$(CONFIG_MACH_AT91EB01) += board-eb01.o ++obj-$(CONFIG_MACH_HOMEMATIC) += board-homematic.o ++obj-$(CONFIG_MACH_ECBAT91) += board-ecbat91.o ++obj-$(CONFIG_MACH_SWEDATMS) += board-tms.o + + # AT91SAM9260 board-specific support + obj-$(CONFIG_MACH_AT91SAM9260EK) += board-sam9260ek.o ++obj-$(CONFIG_MACH_CAM60) += board-cam60.o ++obj-$(CONFIG_MACH_SAM9_L9260) += board-sam9-l9260.o + + # AT91SAM9261 board-specific support + obj-$(CONFIG_MACH_AT91SAM9261EK) += board-sam9261ek.o +@@ -43,19 +48,19 @@ + # AT91SAM9RL board-specific support + obj-$(CONFIG_MACH_AT91SAM9RLEK) += board-sam9rlek.o + +-# LEDs support +-led-$(CONFIG_ARCH_AT91RM9200DK) += leds.o +-led-$(CONFIG_MACH_AT91RM9200EK) += leds.o +-led-$(CONFIG_MACH_AT91SAM9261EK)+= leds.o +-led-$(CONFIG_MACH_CSB337) += leds.o +-led-$(CONFIG_MACH_CSB637) += leds.o +-led-$(CONFIG_MACH_KB9200) += leds.o +-led-$(CONFIG_MACH_KAFA) += leds.o +-obj-$(CONFIG_LEDS) += $(led-y) ++# AT91CAP9 board-specific support ++obj-$(CONFIG_MACH_AT91CAP9ADK) += board-cap9adk.o + +-# VGA support +-#obj-$(CONFIG_FB_S1D13XXX) += ics1523.o ++# AT91X40 board-specific support ++obj-$(CONFIG_MACH_AT91EB01) += board-eb01.o + ++# Drivers ++obj-y += leds.o ++obj-$(CONFIG_FB_S1D13XXX) += ics1523.o ++ ++# Power Management ++obj-$(CONFIG_PM) += pm.o ++obj-$(CONFIG_AT91_SLOW_CLOCK) += pm_slowclock.o + + ifeq ($(CONFIG_PM_DEBUG),y) + CFLAGS_pm.o += -DDEBUG +diff -urN -x CVS linux-2.6.24/arch/arm/mach-at91/Makefile.boot linux-2.6/arch/arm/mach-at91/Makefile.boot +--- linux-2.6.24/arch/arm/mach-at91/Makefile.boot 2007-10-09 22:31:38.000000000 +0200 ++++ linux-2.6/arch/arm/mach-at91/Makefile.boot 2008-01-16 20:26:54.000000000 +0200 +@@ -3,7 +3,12 @@ + # PARAMS_PHYS must be within 4MB of ZRELADDR + # INITRD_PHYS must be in RAM + ++ifeq ($(CONFIG_ARCH_AT91CAP9),y) ++ zreladdr-y := 0x70008000 ++params_phys-y := 0x70000100 ++initrd_phys-y := 0x70410000 ++else + zreladdr-y := 0x20008000 + params_phys-y := 0x20000100 + initrd_phys-y := 0x20410000 +- ++endif +diff -urN -x CVS linux-2.6.24/arch/arm/mach-at91/at91cap9.c linux-2.6/arch/arm/mach-at91/at91cap9.c +--- linux-2.6.24/arch/arm/mach-at91/at91cap9.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-2.6/arch/arm/mach-at91/at91cap9.c 2008-03-01 19:34:19.000000000 +0200 +@@ -0,0 +1,374 @@ ++/* ++ * arch/arm/mach-at91/at91cap9.c ++ * ++ * Copyright (C) 2007 Stelian Pop <stelian.pop@leadtechdesign.com> ++ * Copyright (C) 2007 Lead Tech Design <www.leadtechdesign.com> ++ * Copyright (C) 2007 Atmel Corporation. ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ */ ++ ++#include <linux/module.h> ++#include <linux/pm.h> ++ ++#include <asm/mach/arch.h> ++#include <asm/mach/map.h> ++#include <asm/arch/at91cap9.h> ++#include <asm/arch/at91_pmc.h> ++#include <asm/arch/at91_rstc.h> ++#include <asm/arch/at91_shdwc.h> ++ ++#include "generic.h" ++#include "clock.h" ++ ++static struct map_desc at91cap9_io_desc[] __initdata = { ++ { ++ .virtual = AT91_VA_BASE_SYS, ++ .pfn = __phys_to_pfn(AT91_BASE_SYS), ++ .length = SZ_16K, ++ .type = MT_DEVICE, ++ }, { ++ .virtual = AT91_IO_VIRT_BASE - AT91CAP9_SRAM_SIZE, ++ .pfn = __phys_to_pfn(AT91CAP9_SRAM_BASE), ++ .length = AT91CAP9_SRAM_SIZE, ++ .type = MT_DEVICE, ++ }, ++}; ++ ++/* -------------------------------------------------------------------- ++ * Clocks ++ * -------------------------------------------------------------------- */ ++ ++/* ++ * The peripheral clocks. ++ */ ++static struct clk pioABCD_clk = { ++ .name = "pioABCD_clk", ++ .pmc_mask = 1 << AT91CAP9_ID_PIOABCD, ++ .type = CLK_TYPE_PERIPHERAL, ++}; ++static struct clk mpb0_clk = { ++ .name = "mpb0_clk", ++ .pmc_mask = 1 << AT91CAP9_ID_MPB0, ++ .type = CLK_TYPE_PERIPHERAL, ++}; ++static struct clk mpb1_clk = { ++ .name = "mpb1_clk", ++ .pmc_mask = 1 << AT91CAP9_ID_MPB1, ++ .type = CLK_TYPE_PERIPHERAL, ++}; ++static struct clk mpb2_clk = { ++ .name = "mpb2_clk", ++ .pmc_mask = 1 << AT91CAP9_ID_MPB2, ++ .type = CLK_TYPE_PERIPHERAL, ++}; ++static struct clk mpb3_clk = { ++ .name = "mpb3_clk", ++ .pmc_mask = 1 << AT91CAP9_ID_MPB3, ++ .type = CLK_TYPE_PERIPHERAL, ++}; ++static struct clk mpb4_clk = { ++ .name = "mpb4_clk", ++ .pmc_mask = 1 << AT91CAP9_ID_MPB4, ++ .type = CLK_TYPE_PERIPHERAL, ++}; ++static struct clk usart0_clk = { ++ .name = "usart0_clk", ++ .pmc_mask = 1 << AT91CAP9_ID_US0, ++ .type = CLK_TYPE_PERIPHERAL, ++}; ++static struct clk usart1_clk = { ++ .name = "usart1_clk", ++ .pmc_mask = 1 << AT91CAP9_ID_US1, ++ .type = CLK_TYPE_PERIPHERAL, ++}; ++static struct clk usart2_clk = { ++ .name = "usart2_clk", ++ .pmc_mask = 1 << AT91CAP9_ID_US2, ++ .type = CLK_TYPE_PERIPHERAL, ++}; ++static struct clk mmc0_clk = { ++ .name = "mci0_clk", ++ .pmc_mask = 1 << AT91CAP9_ID_MCI0, ++ .type = CLK_TYPE_PERIPHERAL, ++}; ++static struct clk mmc1_clk = { ++ .name = "mci1_clk", ++ .pmc_mask = 1 << AT91CAP9_ID_MCI1, ++ .type = CLK_TYPE_PERIPHERAL, ++}; ++static struct clk can_clk = { ++ .name = "can_clk", ++ .pmc_mask = 1 << AT91CAP9_ID_CAN, ++ .type = CLK_TYPE_PERIPHERAL, ++}; ++static struct clk twi_clk = { ++ .name = "twi_clk", ++ .pmc_mask = 1 << AT91CAP9_ID_TWI, ++ .type = CLK_TYPE_PERIPHERAL, ++}; ++static struct clk spi0_clk = { ++ .name = "spi0_clk", ++ .pmc_mask = 1 << AT91CAP9_ID_SPI0, ++ .type = CLK_TYPE_PERIPHERAL, ++}; ++static struct clk spi1_clk = { ++ .name = "spi1_clk", ++ .pmc_mask = 1 << AT91CAP9_ID_SPI1, ++ .type = CLK_TYPE_PERIPHERAL, ++}; ++static struct clk ssc0_clk = { ++ .name = "ssc0_clk", ++ .pmc_mask = 1 << AT91CAP9_ID_SSC0, ++ .type = CLK_TYPE_PERIPHERAL, ++}; ++static struct clk ssc1_clk = { ++ .name = "ssc1_clk", ++ .pmc_mask = 1 << AT91CAP9_ID_SSC1, ++ .type = CLK_TYPE_PERIPHERAL, ++}; ++static struct clk ac97_clk = { ++ .name = "ac97_clk", ++ .pmc_mask = 1 << AT91CAP9_ID_AC97C, ++ .type = CLK_TYPE_PERIPHERAL, ++}; ++static struct clk tcb_clk = { ++ .name = "tcb_clk", ++ .pmc_mask = 1 << AT91CAP9_ID_TCB, ++ .type = CLK_TYPE_PERIPHERAL, ++}; ++static struct clk pwmc_clk = { ++ .name = "pwmc_clk", ++ .pmc_mask = 1 << AT91CAP9_ID_PWMC, ++ .type = CLK_TYPE_PERIPHERAL, ++}; ++static struct clk macb_clk = { ++ .name = "macb_clk", ++ .pmc_mask = 1 << AT91CAP9_ID_EMAC, ++ .type = CLK_TYPE_PERIPHERAL, ++}; ++static struct clk aestdes_clk = { ++ .name = "aestdes_clk", ++ .pmc_mask = 1 << AT91CAP9_ID_AESTDES, ++ .type = CLK_TYPE_PERIPHERAL, ++}; ++static struct clk adc_clk = { ++ .name = "adc_clk", ++ .pmc_mask = 1 << AT91CAP9_ID_ADC, ++ .type = CLK_TYPE_PERIPHERAL, ++}; ++static struct clk isi_clk = { ++ .name = "isi_clk", ++ .pmc_mask = 1 << AT91CAP9_ID_ISI, ++ .type = CLK_TYPE_PERIPHERAL, ++}; ++static struct clk lcdc_clk = { ++ .name = "lcdc_clk", ++ .pmc_mask = 1 << AT91CAP9_ID_LCDC, ++ .type = CLK_TYPE_PERIPHERAL, ++}; ++static struct clk dma_clk = { ++ .name = "dma_clk", ++ .pmc_mask = 1 << AT91CAP9_ID_DMA, ++ .type = CLK_TYPE_PERIPHERAL, ++}; ++static struct clk udphs_clk = { ++ .name = "udphs_clk", ++ .pmc_mask = 1 << AT91CAP9_ID_UDPHS, ++ .type = CLK_TYPE_PERIPHERAL, ++}; ++static struct clk ohci_clk = { ++ .name = "ohci_clk", ++ .pmc_mask = 1 << AT91CAP9_ID_UHP, ++ .type = CLK_TYPE_PERIPHERAL, ++}; ++ ++static struct clk *periph_clocks[] __initdata = { ++ &pioABCD_clk, ++ &mpb0_clk, ++ &mpb1_clk, ++ &mpb2_clk, ++ &mpb3_clk, ++ &mpb4_clk, ++ &usart0_clk, ++ &usart1_clk, ++ &usart2_clk, ++ &mmc0_clk, ++ &mmc1_clk, ++ &can_clk, ++ &twi_clk, ++ &spi0_clk, ++ &spi1_clk, ++ &ssc0_clk, ++ &ssc1_clk, ++ &ac97_clk, ++ &tcb_clk, ++ &pwmc_clk, ++ &macb_clk, ++ &aestdes_clk, ++ &adc_clk, ++ &isi_clk, ++ &lcdc_clk, ++ &dma_clk, ++ &udphs_clk, ++ &ohci_clk, ++ // irq0 .. irq1 ++}; ++ ++/* ++ * The four programmable clocks. ++ * You must configure pin multiplexing to bring these signals out. ++ */ ++static struct clk pck0 = { ++ .name = "pck0", ++ .pmc_mask = AT91_PMC_PCK0, ++ .type = CLK_TYPE_PROGRAMMABLE, ++ .id = 0, ++}; ++static struct clk pck1 = { ++ .name = "pck1", ++ .pmc_mask = AT91_PMC_PCK1, ++ .type = CLK_TYPE_PROGRAMMABLE, ++ .id = 1, ++}; ++static struct clk pck2 = { ++ .name = "pck2", ++ .pmc_mask = AT91_PMC_PCK2, ++ .type = CLK_TYPE_PROGRAMMABLE, ++ .id = 2, ++}; ++static struct clk pck3 = { ++ .name = "pck3", ++ .pmc_mask = AT91_PMC_PCK3, ++ .type = CLK_TYPE_PROGRAMMABLE, ++ .id = 3, ++}; ++ ++static void __init at91cap9_register_clocks(void) ++{ ++ int i; ++ ++ for (i = 0; i < ARRAY_SIZE(periph_clocks); i++) ++ clk_register(periph_clocks[i]); ++ ++ clk_register(&pck0); ++ clk_register(&pck1); ++ clk_register(&pck2); ++ clk_register(&pck3); ++} ++ ++/* -------------------------------------------------------------------- ++ * GPIO ++ * -------------------------------------------------------------------- */ ++ ++static struct at91_gpio_bank at91cap9_gpio[] = { ++ { ++ .id = AT91CAP9_ID_PIOABCD, ++ .offset = AT91_PIOA, ++ .clock = &pioABCD_clk, ++ }, { ++ .id = AT91CAP9_ID_PIOABCD, ++ .offset = AT91_PIOB, ++ .clock = &pioABCD_clk, ++ }, { ++ .id = AT91CAP9_ID_PIOABCD, ++ .offset = AT91_PIOC, ++ .clock = &pioABCD_clk, ++ }, { ++ .id = AT91CAP9_ID_PIOABCD, ++ .offset = AT91_PIOD, ++ .clock = &pioABCD_clk, ++ } ++}; ++ ++static void at91cap9_reset(void) ++{ ++ at91_sys_write(AT91_RSTC_CR, AT91_RSTC_KEY | AT91_RSTC_PROCRST | AT91_RSTC_PERRST); ++} ++ ++static void at91cap9_poweroff(void) ++{ ++ at91_sys_write(AT91_SHDW_CR, AT91_SHDW_KEY | AT91_SHDW_SHDW); ++} ++ ++ ++/* -------------------------------------------------------------------- ++ * AT91CAP9 processor initialization ++ * -------------------------------------------------------------------- */ ++ ++void __init at91cap9_initialize(unsigned long main_clock) ++{ ++ /* Map peripherals */ ++ iotable_init(at91cap9_io_desc, ARRAY_SIZE(at91cap9_io_desc)); ++ ++ at91_arch_reset = at91cap9_reset; ++ pm_power_off = at91cap9_poweroff; ++ at91_extern_irq = (1 << AT91CAP9_ID_IRQ0) | (1 << AT91CAP9_ID_IRQ1); ++ ++ /* Init clock subsystem */ ++ at91_clock_init(main_clock); ++ ++ /* Register the processor-specific clocks */ ++ at91cap9_register_clocks(); ++ ++ /* Register GPIO subsystem */ ++ at91_gpio_init(at91cap9_gpio, 4); ++} ++ ++/* -------------------------------------------------------------------- ++ * Interrupt initialization ++ * -------------------------------------------------------------------- */ ++ ++/* ++ * The default interrupt priority levels (0 = lowest, 7 = highest). ++ */ ++static unsigned int at91cap9_default_irq_priority[NR_AIC_IRQS] __initdata = { ++ 7, /* Advanced Interrupt Controller (FIQ) */ ++ 7, /* System Peripherals */ ++ 1, /* Parallel IO Controller A, B, C and D */ ++ 0, /* MP Block Peripheral 0 */ ++ 0, /* MP Block Peripheral 1 */ ++ 0, /* MP Block Peripheral 2 */ ++ 0, /* MP Block Peripheral 3 */ ++ 0, /* MP Block Peripheral 4 */ ++ 5, /* USART 0 */ ++ 5, /* USART 1 */ ++ 5, /* USART 2 */ ++ 0, /* Multimedia Card Interface 0 */ ++ 0, /* Multimedia Card Interface 1 */ ++ 3, /* CAN */ ++ 6, /* Two-Wire Interface */ ++ 5, /* Serial Peripheral Interface 0 */ ++ 5, /* Serial Peripheral Interface 1 */ ++ 4, /* Serial Synchronous Controller 0 */ ++ 4, /* Serial Synchronous Controller 1 */ ++ 5, /* AC97 Controller */ ++ 0, /* Timer Counter 0, 1 and 2 */ ++ 0, /* Pulse Width Modulation Controller */ ++ 3, /* Ethernet */ ++ 0, /* Advanced Encryption Standard, Triple DES*/ ++ 0, /* Analog-to-Digital Converter */ ++ 0, /* Image Sensor Interface */ ++ 3, /* LCD Controller */ ++ 0, /* DMA Controller */ ++ 2, /* USB Device Port */ ++ 2, /* USB Host port */ ++ 0, /* Advanced Interrupt Controller (IRQ0) */ ++ 0, /* Advanced Interrupt Controller (IRQ1) */ ++}; ++ ++void __init at91cap9_init_interrupts(unsigned int priority[NR_AIC_IRQS]) ++{ ++ if (!priority) ++ priority = at91cap9_default_irq_priority; ++ ++ /* Initialize the AIC interrupt controller */ ++ at91_aic_init(priority); ++ ++ /* Enable GPIO interrupts */ ++ at91_gpio_irq_setup(); ++} +diff -urN -x CVS linux-2.6.24/arch/arm/mach-at91/at91cap9_devices.c linux-2.6/arch/arm/mach-at91/at91cap9_devices.c +--- linux-2.6.24/arch/arm/mach-at91/at91cap9_devices.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-2.6/arch/arm/mach-at91/at91cap9_devices.c 2008-03-01 20:41:49.000000000 +0200 +@@ -0,0 +1,1119 @@ ++/* ++ * arch/arm/mach-at91/at91cap9_devices.c ++ * ++ * Copyright (C) 2007 Stelian Pop <stelian.pop@leadtechdesign.com> ++ * Copyright (C) 2007 Lead Tech Design <www.leadtechdesign.com> ++ * Copyright (C) 2007 Atmel Corporation. ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ */ ++#include <asm/mach/arch.h> ++#include <asm/mach/map.h> ++ ++#include <linux/dma-mapping.h> ++#include <linux/platform_device.h> ++#include <linux/i2c-gpio.h> ++ ++#include <video/atmel_lcdc.h> ++ ++#include <asm/arch/board.h> ++#include <asm/arch/gpio.h> ++#include <asm/arch/at91cap9.h> ++#include <asm/arch/at91sam926x_smc.h> ++#include <asm/arch/at91cap9_matrix.h> ++ ++#include "generic.h" ++ ++ ++/* -------------------------------------------------------------------- ++ * USB Host ++ * -------------------------------------------------------------------- */ ++ ++#if defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE) ++static u64 ohci_dmamask = DMA_BIT_MASK(32); ++static struct at91_usbh_data usbh_data; ++ ++static struct resource usbh_resources[] = { ++ [0] = { ++ .start = AT91CAP9_UHP_BASE, ++ .end = AT91CAP9_UHP_BASE + SZ_1M - 1, ++ .flags = IORESOURCE_MEM, ++ }, ++ [1] = { ++ .start = AT91CAP9_ID_UHP, ++ .end = AT91CAP9_ID_UHP, ++ .flags = IORESOURCE_IRQ, ++ }, ++}; ++ ++static struct platform_device at91_usbh_device = { ++ .name = "at91_ohci", ++ .id = -1, ++ .dev = { ++ .dma_mask = &ohci_dmamask, ++ .coherent_dma_mask = DMA_BIT_MASK(32), ++ .platform_data = &usbh_data, ++ }, ++ .resource = usbh_resources, ++ .num_resources = ARRAY_SIZE(usbh_resources), ++}; ++ ++void __init at91_add_device_usbh(struct at91_usbh_data *data) ++{ ++ int i; ++ ++ if (!data) ++ return; ++ ++ /* Enable VBus control for UHP ports */ ++ for (i = 0; i < data->ports; i++) { ++ if (data->vbus_pin[i]) ++ at91_set_gpio_output(data->vbus_pin[i], 0); ++ } ++ ++ usbh_data = *data; ++ platform_device_register(&at91_usbh_device); ++} ++#else ++void __init at91_add_device_usbh(struct at91_usbh_data *data) {} ++#endif ++ ++ ++/* -------------------------------------------------------------------- ++ * Ethernet ++ * -------------------------------------------------------------------- */ ++ ++#if defined(CONFIG_MACB) || defined(CONFIG_MACB_MODULE) ++static u64 eth_dmamask = DMA_BIT_MASK(32); ++static struct at91_eth_data eth_data; ++ ++static struct resource eth_resources[] = { ++ [0] = { ++ .start = AT91CAP9_BASE_EMAC, ++ .end = AT91CAP9_BASE_EMAC + SZ_16K - 1, ++ .flags = IORESOURCE_MEM, ++ }, ++ [1] = { ++ .start = AT91CAP9_ID_EMAC, ++ .end = AT91CAP9_ID_EMAC, ++ .flags = IORESOURCE_IRQ, ++ }, ++}; ++ ++static struct platform_device at91cap9_eth_device = { ++ .name = "macb", ++ .id = -1, ++ .dev = { ++ .dma_mask = ð_dmamask, ++ .coherent_dma_mask = DMA_BIT_MASK(32), ++ .platform_data = ð_data, ++ }, ++ .resource = eth_resources, ++ .num_resources = ARRAY_SIZE(eth_resources), ++}; ++ ++void __init at91_add_device_eth(struct at91_eth_data *data) ++{ ++ if (!data) ++ return; ++ ++ if (data->phy_irq_pin) { ++ at91_set_gpio_input(data->phy_irq_pin, 0); ++ at91_set_deglitch(data->phy_irq_pin, 1); ++ } ++ ++ /* Pins used for MII and RMII */ ++ at91_set_A_periph(AT91_PIN_PB21, 0); /* ETXCK_EREFCK */ ++ at91_set_A_periph(AT91_PIN_PB22, 0); /* ERXDV */ ++ at91_set_A_periph(AT91_PIN_PB25, 0); /* ERX0 */ ++ at91_set_A_periph(AT91_PIN_PB26, 0); /* ERX1 */ ++ at91_set_A_periph(AT91_PIN_PB27, 0); /* ERXER */ ++ at91_set_A_periph(AT91_PIN_PB28, 0); /* ETXEN */ ++ at91_set_A_periph(AT91_PIN_PB23, 0); /* ETX0 */ ++ at91_set_A_periph(AT91_PIN_PB24, 0); /* ETX1 */ ++ at91_set_A_periph(AT91_PIN_PB30, 0); /* EMDIO */ ++ at91_set_A_periph(AT91_PIN_PB29, 0); /* EMDC */ ++ ++ if (!data->is_rmii) { ++ at91_set_B_periph(AT91_PIN_PC25, 0); /* ECRS */ ++ at91_set_B_periph(AT91_PIN_PC26, 0); /* ECOL */ ++ at91_set_B_periph(AT91_PIN_PC22, 0); /* ERX2 */ ++ at91_set_B_periph(AT91_PIN_PC23, 0); /* ERX3 */ ++ at91_set_B_periph(AT91_PIN_PC27, 0); /* ERXCK */ ++ at91_set_B_periph(AT91_PIN_PC20, 0); /* ETX2 */ ++ at91_set_B_periph(AT91_PIN_PC21, 0); /* ETX3 */ ++ at91_set_B_periph(AT91_PIN_PC24, 0); /* ETXER */ ++ } ++ ++ eth_data = *data; ++ platform_device_register(&at91cap9_eth_device); ++} ++#else ++void __init at91_add_device_eth(struct at91_eth_data *data) {} ++#endif ++ ++ ++/* -------------------------------------------------------------------- ++ * MMC / SD ++ * -------------------------------------------------------------------- */ ++ ++#if defined(CONFIG_MMC_AT91) || defined(CONFIG_MMC_AT91_MODULE) ++static u64 mmc_dmamask = DMA_BIT_MASK(32); ++static struct at91_mmc_data mmc0_data, mmc1_data; ++ ++static struct resource mmc0_resources[] = { ++ [0] = { ++ .start = AT91CAP9_BASE_MCI0, ++ .end = AT91CAP9_BASE_MCI0 + SZ_16K - 1, ++ .flags = IORESOURCE_MEM, ++ }, ++ [1] = { ++ .start = AT91CAP9_ID_MCI0, ++ .end = AT91CAP9_ID_MCI0, ++ .flags = IORESOURCE_IRQ, ++ }, ++}; ++ ++static struct platform_device at91cap9_mmc0_device = { ++ .name = "at91_mci", ++ .id = 0, ++ .dev = { ++ .dma_mask = &mmc_dmamask, ++ .coherent_dma_mask = DMA_BIT_MASK(32), ++ .platform_data = &mmc0_data, ++ }, ++ .resource = mmc0_resources, ++ .num_resources = ARRAY_SIZE(mmc0_resources), ++}; ++ ++static struct resource mmc1_resources[] = { ++ [0] = { ++ .start = AT91CAP9_BASE_MCI1, ++ .end = AT91CAP9_BASE_MCI1 + SZ_16K - 1, ++ .flags = IORESOURCE_MEM, ++ }, ++ [1] = { ++ .start = AT91CAP9_ID_MCI1, ++ .end = AT91CAP9_ID_MCI1, ++ .flags = IORESOURCE_IRQ, ++ }, ++}; ++ ++static struct platform_device at91cap9_mmc1_device = { ++ .name = "at91_mci", ++ .id = 1, ++ .dev = { ++ .dma_mask = &mmc_dmamask, ++ .coherent_dma_mask = DMA_BIT_MASK(32), ++ .platform_data = &mmc1_data, ++ }, ++ .resource = mmc1_resources, ++ .num_resources = ARRAY_SIZE(mmc1_resources), ++}; ++ ++void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data) ++{ ++ if (!data) ++ return; ++ ++ /* input/irq */ ++ if (data->det_pin) { ++ at91_set_gpio_input(data->det_pin, 1); ++ at91_set_deglitch(data->det_pin, 1); ++ } ++ if (data->wp_pin) ++ at91_set_gpio_input(data->wp_pin, 1); ++ if (data->vcc_pin) ++ at91_set_gpio_output(data->vcc_pin, 0); ++ ++ if (mmc_id == 0) { /* MCI0 */ ++ /* CLK */ ++ at91_set_A_periph(AT91_PIN_PA2, 0); ++ ++ /* CMD */ ++ at91_set_A_periph(AT91_PIN_PA1, 1); ++ ++ /* DAT0, maybe DAT1..DAT3 */ ++ at91_set_A_periph(AT91_PIN_PA0, 1); ++ if (data->wire4) { ++ at91_set_A_periph(AT91_PIN_PA3, 1); ++ at91_set_A_periph(AT91_PIN_PA4, 1); ++ at91_set_A_periph(AT91_PIN_PA5, 1); ++ } ++ ++ mmc0_data = *data; ++ at91_clock_associate("mci0_clk", &at91cap9_mmc1_device.dev, "mci_clk"); ++ platform_device_register(&at91cap9_mmc0_device); ++ } else { /* MCI1 */ ++ /* CLK */ ++ at91_set_A_periph(AT91_PIN_PA16, 0); ++ ++ /* CMD */ ++ at91_set_A_periph(AT91_PIN_PA17, 1); ++ ++ /* DAT0, maybe DAT1..DAT3 */ ++ at91_set_A_periph(AT91_PIN_PA18, 1); ++ if (data->wire4) { ++ at91_set_A_periph(AT91_PIN_PA19, 1); ++ at91_set_A_periph(AT91_PIN_PA20, 1); ++ at91_set_A_periph(AT91_PIN_PA21, 1); ++ } ++ ++ mmc1_data = *data; ++ at91_clock_associate("mci1_clk", &at91cap9_mmc1_device.dev, "mci_clk"); ++ platform_device_register(&at91cap9_mmc1_device); ++ } ++} ++#else ++void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data) {} ++#endif ++ ++ ++/* -------------------------------------------------------------------- ++ * NAND / SmartMedia ++ * -------------------------------------------------------------------- */ ++ ++#if defined(CONFIG_MTD_NAND_AT91) || defined(CONFIG_MTD_NAND_AT91_MODULE) ++static struct at91_nand_data nand_data; ++ ++#define NAND_BASE AT91_CHIPSELECT_3 ++ ++static struct resource nand_resources[] = { ++ [0] = { ++ .start = NAND_BASE, ++ .end = NAND_BASE + SZ_256M - 1, ++ .flags = IORESOURCE_MEM, ++ }, ++ [1] = { ++ .start = AT91_BASE_SYS + AT91_ECC, ++ .end = AT91_BASE_SYS + AT91_ECC + SZ_512 - 1, ++ .flags = IORESOURCE_MEM, ++ } ++}; ++ ++static struct platform_device at91cap9_nand_device = { ++ .name = "at91_nand", ++ .id = -1, ++ .dev = { ++ .platform_data = &nand_data, ++ }, ++ .resource = nand_resources, ++ .num_resources = ARRAY_SIZE(nand_resources), ++}; ++ ++void __init at91_add_device_nand(struct at91_nand_data *data) ++{ ++ unsigned long csa, mode; ++ ++ if (!data) ++ return; ++ ++ csa = at91_sys_read(AT91_MATRIX_EBICSA); ++ at91_sys_write(AT91_MATRIX_EBICSA, csa | AT91_MATRIX_EBI_CS3A_SMC_SMARTMEDIA | AT91_MATRIX_EBI_VDDIOMSEL_3_3V); ++ ++ /* set the bus interface characteristics */ ++ at91_sys_write(AT91_SMC_SETUP(3), AT91_SMC_NWESETUP_(2) | AT91_SMC_NCS_WRSETUP_(1) ++ | AT91_SMC_NRDSETUP_(2) | AT91_SMC_NCS_RDSETUP_(1)); ++ ++ at91_sys_write(AT91_SMC_PULSE(3), AT91_SMC_NWEPULSE_(4) | AT91_SMC_NCS_WRPULSE_(6) ++ | AT91_SMC_NRDPULSE_(4) | AT91_SMC_NCS_RDPULSE_(6)); ++ ++ at91_sys_write(AT91_SMC_CYCLE(3), AT91_SMC_NWECYCLE_(8) | AT91_SMC_NRDCYCLE_(8)); ++ ++ if (data->bus_width_16) ++ mode = AT91_SMC_DBW_16; ++ else ++ mode = AT91_SMC_DBW_8; ++ at91_sys_write(AT91_SMC_MODE(3), mode | AT91_SMC_READMODE | AT91_SMC_WRITEMODE | AT91_SMC_EXNWMODE_DISABLE | AT91_SMC_TDF_(1)); ++ ++ /* enable pin */ ++ if (data->enable_pin) ++ at91_set_gpio_output(data->enable_pin, 1); ++ ++ /* ready/busy pin */ ++ if (data->rdy_pin) ++ at91_set_gpio_input(data->rdy_pin, 1); ++ ++ /* card detect pin */ ++ if (data->det_pin) ++ at91_set_gpio_input(data->det_pin, 1); ++ ++ nand_data = *data; ++ platform_device_register(&at91cap9_nand_device); ++} ++#else ++void __init at91_add_device_nand(struct at91_nand_data *data) {} ++#endif ++ ++ ++/* -------------------------------------------------------------------- ++ * TWI (i2c) ++ * -------------------------------------------------------------------- */ ++ ++/* ++ * Prefer the GPIO code since the TWI controller isn't robust ++ * (gets overruns and underruns under load) and can only issue ++ * repeated STARTs in one scenario (the driver doesn't yet handle them). ++ */ ++#if defined(CONFIG_I2C_GPIO) || defined(CONFIG_I2C_GPIO_MODULE) ++ ++static struct i2c_gpio_platform_data pdata = { ++ .sda_pin = AT91_PIN_PB4, ++ .sda_is_open_drain = 1, ++ .scl_pin = AT91_PIN_PB5, ++ .scl_is_open_drain = 1, ++ .udelay = 2, /* ~100 kHz */ ++}; ++ ++static struct platform_device at91cap9_twi_device = { ++ .name = "i2c-gpio", ++ .id = -1, ++ .dev.platform_data = &pdata, ++}; ++ ++void __init at91_add_device_i2c(struct i2c_board_info *devices, int nr_devices) ++{ ++ at91_set_GPIO_periph(AT91_PIN_PB4, 1); /* TWD (SDA) */ ++ at91_set_multi_drive(AT91_PIN_PB4, 1); ++ ++ at91_set_GPIO_periph(AT91_PIN_PB5, 1); /* TWCK (SCL) */ ++ at91_set_multi_drive(AT91_PIN_PB5, 1); ++ ++ i2c_register_board_info(0, devices, nr_devices); ++ platform_device_register(&at91cap9_twi_device); ++} ++ ++#elif defined(CONFIG_I2C_AT91) || defined(CONFIG_I2C_AT91_MODULE) ++ ++static struct resource twi_resources[] = { ++ [0] = { ++ .start = AT91CAP9_BASE_TWI, ++ .end = AT91CAP9_BASE_TWI + SZ_16K - 1, ++ .flags = IORESOURCE_MEM, ++ }, ++ [1] = { ++ .start = AT91CAP9_ID_TWI, ++ .end = AT91CAP9_ID_TWI, ++ .flags = IORESOURCE_IRQ, ++ }, ++}; ++ ++static struct platform_device at91cap9_twi_device = { ++ .name = "at91_i2c", ++ .id = -1, ++ .resource = twi_resources, ++ .num_resources = ARRAY_SIZE(twi_resources), ++}; ++ ++void __init at91_add_device_i2c(struct i2c_board_info *devices, int nr_devices) ++{ ++ /* pins used for TWI interface */ ++ at91_set_B_periph(AT91_PIN_PB4, 0); /* TWD */ ++ at91_set_multi_drive(AT91_PIN_PB4, 1); ++ ++ at91_set_B_periph(AT91_PIN_PB5, 0); /* TWCK */ ++ at91_set_multi_drive(AT91_PIN_PB5, 1); ++ ++ i2c_register_board_info(0, devices, nr_devices); ++ platform_device_register(&at91cap9_twi_device); ++} ++#else ++void __init at91_add_device_i2c(struct i2c_board_info *devices, int nr_devices) {} ++#endif ++ ++/* -------------------------------------------------------------------- ++ * SPI ++ * -------------------------------------------------------------------- */ ++ ++#if defined(CONFIG_SPI_ATMEL) || defined(CONFIG_SPI_ATMEL_MODULE) ++static u64 spi_dmamask = DMA_BIT_MASK(32); ++ ++static struct resource spi0_resources[] = { ++ [0] = { ++ .start = AT91CAP9_BASE_SPI0, ++ .end = AT91CAP9_BASE_SPI0 + SZ_16K - 1, ++ .flags = IORESOURCE_MEM, ++ }, ++ [1] = { ++ .start = AT91CAP9_ID_SPI0, ++ .end = AT91CAP9_ID_SPI0, ++ .flags = IORESOURCE_IRQ, ++ }, ++}; ++ ++static struct platform_device at91cap9_spi0_device = { ++ .name = "atmel_spi", ++ .id = 0, ++ .dev = { ++ .dma_mask = &spi_dmamask, ++ .coherent_dma_mask = DMA_BIT_MASK(32), ++ }, ++ .resource = spi0_resources, ++ .num_resources = ARRAY_SIZE(spi0_resources), ++}; ++ ++static const unsigned spi0_standard_cs[4] = { AT91_PIN_PA5, AT91_PIN_PA3, AT91_PIN_PD0, AT91_PIN_PD1 }; ++ ++static struct resource spi1_resources[] = { ++ [0] = { ++ .start = AT91CAP9_BASE_SPI1, ++ .end = AT91CAP9_BASE_SPI1 + SZ_16K - 1, ++ .flags = IORESOURCE_MEM, ++ }, ++ [1] = { ++ .start = AT91CAP9_ID_SPI1, ++ .end = AT91CAP9_ID_SPI1, ++ .flags = IORESOURCE_IRQ, ++ }, ++}; ++ ++static struct platform_device at91cap9_spi1_device = { ++ .name = "atmel_spi", ++ .id = 1, ++ .dev = { ++ .dma_mask = &spi_dmamask, ++ .coherent_dma_mask = DMA_BIT_MASK(32), ++ }, ++ .resource = spi1_resources, ++ .num_resources = ARRAY_SIZE(spi1_resources), ++}; ++ ++static const unsigned spi1_standard_cs[4] = { AT91_PIN_PB15, AT91_PIN_PB16, AT91_PIN_PB17, AT91_PIN_PB18 }; ++ ++void __init at91_add_device_spi(struct spi_board_info *devices, int nr_devices) ++{ ++ int i; ++ unsigned long cs_pin; ++ short enable_spi0 = 0; ++ short enable_spi1 = 0; ++ ++ /* Choose SPI chip-selects */ ++ for (i = 0; i < nr_devices; i++) { ++ if (devices[i].controller_data) ++ cs_pin = (unsigned long) devices[i].controller_data; ++ else if (devices[i].bus_num == 0) ++ cs_pin = spi0_standard_cs[devices[i].chip_select]; ++ else ++ cs_pin = spi1_standard_cs[devices[i].chip_select]; ++ ++ if (devices[i].bus_num == 0) ++ enable_spi0 = 1; ++ else ++ enable_spi1 = 1; ++ ++ /* enable chip-select pin */ ++ at91_set_gpio_output(cs_pin, 1); ++ ++ /* pass chip-select pin to driver */ ++ devices[i].controller_data = (void *) cs_pin; ++ } ++ ++ spi_register_board_info(devices, nr_devices); ++ ++ /* Configure SPI bus(es) */ ++ if (enable_spi0) { ++ at91_set_B_periph(AT91_PIN_PA0, 0); /* SPI0_MISO */ ++ at91_set_B_periph(AT91_PIN_PA1, 0); /* SPI0_MOSI */ ++ at91_set_B_periph(AT91_PIN_PA2, 0); /* SPI0_SPCK */ ++ ++ at91_clock_associate("spi0_clk", &at91cap9_spi0_device.dev, "spi_clk"); ++ platform_device_register(&at91cap9_spi0_device); ++ } ++ if (enable_spi1) { ++ at91_set_A_periph(AT91_PIN_PB12, 0); /* SPI1_MISO */ ++ at91_set_A_periph(AT91_PIN_PB13, 0); /* SPI1_MOSI */ ++ at91_set_A_periph(AT91_PIN_PB14, 0); /* SPI1_SPCK */ ++ ++ at91_clock_associate("spi1_clk", &at91cap9_spi1_device.dev, "spi_clk"); ++ platform_device_register(&at91cap9_spi1_device); ++ } ++} ++#else ++void __init at91_add_device_spi(struct spi_board_info *devices, int nr_devices) {} ++#endif ++ ++ ++/* -------------------------------------------------------------------- ++ * Timer/Counter block ++ * -------------------------------------------------------------------- */ ++ ++#ifdef CONFIG_ATMEL_TCLIB ++ ++static struct resource tcb_resources[] = { ++ [0] = { ++ .start = AT91CAP9_BASE_TCB0, ++ .end = AT91CAP9_BASE_TCB0 + SZ_16K - 1, ++ .flags = IORESOURCE_MEM, ++ }, ++ [1] = { ++ .start = AT91CAP9_ID_TCB, ++ .end = AT91CAP9_ID_TCB, ++ .flags = IORESOURCE_IRQ, ++ }, ++}; ++ ++static struct platform_device at91cap9_tcb_device = { ++ .name = "atmel_tcb", ++ .id = 0, ++ .resource = tcb_resources, ++ .num_resources = ARRAY_SIZE(tcb_resources), ++}; ++ ++static void __init at91_add_device_tc(void) ++{ ++ /* this chip has one clock and irq for all three TC channels */ ++ at91_clock_associate("tcb_clk", &at91cap9_tcb_device.dev, "t0_clk"); ++ platform_device_register(&at91cap9_tcb_device); ++} ++#else ++static void __init at91_add_device_tc(void) { } ++#endif ++ ++/* -------------------------------------------------------------------- ++ * RTT ++ * -------------------------------------------------------------------- */ ++ ++static struct resource rtt_resources[] = { ++ { ++ .start = AT91_BASE_SYS + AT91_RTT, ++ .end = AT91_BASE_SYS + AT91_RTT + SZ_16 - 1, ++ .flags = IORESOURCE_MEM, ++ } ++}; ++ ++static struct platform_device at91cap9_rtt_device = { ++ .name = "at91_rtt", ++ .id = -1, ++ .resource = rtt_resources, ++ .num_resources = ARRAY_SIZE(rtt_resources), ++}; ++ ++static void __init at91_add_device_rtt(void) ++{ ++ device_init_wakeup(&at91cap9_rtt_device.dev, 1); ++ platform_device_register(&at91cap9_rtt_device); ++} ++ ++ ++/* -------------------------------------------------------------------- ++ * Watchdog ++ * -------------------------------------------------------------------- */ ++ ++#if defined(CONFIG_AT91SAM9_WATCHDOG) || defined(CONFIG_AT91SAM9_WATCHDOG_MODULE) ++static struct platform_device at91cap9_wdt_device = { ++ .name = "at91_wdt", ++ .id = -1, ++ .num_resources = 0, ++}; ++ ++static void __init at91_add_device_watchdog(void) ++{ ++ platform_device_register(&at91cap9_wdt_device); ++} ++#else ++static void __init at91_add_device_watchdog(void) {} ++#endif ++ ++ ++/* -------------------------------------------------------------------- ++ * AC97 ++ * -------------------------------------------------------------------- */ ++ ++#if defined(CONFIG_SND_AT91_AC97) || defined(CONFIG_SND_AT91_AC97_MODULE) ++static u64 ac97_dmamask = DMA_BIT_MASK(32); ++static struct atmel_ac97_data ac97_data; ++ ++static struct resource ac97_resources[] = { ++ [0] = { ++ .start = AT91CAP9_BASE_AC97C, ++ .end = AT91CAP9_BASE_AC97C + SZ_16K - 1, ++ .flags = IORESOURCE_MEM, ++ }, ++ [1] = { ++ .start = AT91CAP9_ID_AC97C, ++ .end = AT91CAP9_ID_AC97C, ++ .flags = IORESOURCE_IRQ, ++ }, ++}; ++ ++static struct platform_device at91cap9_ac97_device = { ++ .name = "ac97c", ++ .id = 1, ++ .dev = { ++ .dma_mask = &ac97_dmamask, ++ .coherent_dma_mask = DMA_BIT_MASK(32), ++ .platform_data = &ac97_data, ++ }, ++ .resource = ac97_resources, ++ .num_resources = ARRAY_SIZE(ac97_resources), ++}; ++ ++void __init at91_add_device_ac97(struct atmel_ac97_data *data) ++{ ++ if (!data) ++ return; ++ ++ at91_set_A_periph(AT91_PIN_PA6, 0); /* AC97FS */ ++ at91_set_A_periph(AT91_PIN_PA7, 0); /* AC97CK */ ++ at91_set_A_periph(AT91_PIN_PA8, 0); /* AC97TX */ ++ at91_set_A_periph(AT91_PIN_PA9, 0); /* AC97RX */ ++ ++ /* reset */ ++ if (data->reset_pin) ++ at91_set_gpio_output(data->reset_pin, 0); ++ ++ ac97_data = *data; ++ platform_device_register(&at91cap9_ac97_device); ++} ++#else ++void __init at91_add_device_ac97(struct atmel_ac97_data *data) {} ++#endif ++ ++ ++/* -------------------------------------------------------------------- ++ * LCD Controller ++ * -------------------------------------------------------------------- */ ++ ++#if defined(CONFIG_FB_ATMEL) || defined(CONFIG_FB_ATMEL_MODULE) ++static u64 lcdc_dmamask = DMA_BIT_MASK(32); ++static struct atmel_lcdfb_info lcdc_data; ++ ++static struct resource lcdc_resources[] = { ++ [0] = { ++ .start = AT91CAP9_LCDC_BASE, ++ .end = AT91CAP9_LCDC_BASE + SZ_4K - 1, ++ .flags = IORESOURCE_MEM, ++ }, ++ [1] = { ++ .start = AT91CAP9_ID_LCDC, ++ .end = AT91CAP9_ID_LCDC, ++ .flags = IORESOURCE_IRQ, ++ }, ++}; ++ ++static struct platform_device at91_lcdc_device = { ++ .name = "atmel_lcdfb", ++ .id = 0, ++ .dev = { ++ .dma_mask = &lcdc_dmamask, ++ .coherent_dma_mask = DMA_BIT_MASK(32), ++ .platform_data = &lcdc_data, ++ }, ++ .resource = lcdc_resources, ++ .num_resources = ARRAY_SIZE(lcdc_resources), ++}; ++ ++void __init at91_add_device_lcdc(struct atmel_lcdfb_info *data) ++{ ++ if (!data) ++ return; ++ ++ at91_set_A_periph(AT91_PIN_PC1, 0); /* LCDHSYNC */ ++ at91_set_A_periph(AT91_PIN_PC2, 0); /* LCDDOTCK */ ++ at91_set_A_periph(AT91_PIN_PC3, 0); /* LCDDEN */ ++ at91_set_B_periph(AT91_PIN_PB9, 0); /* LCDCC */ ++ at91_set_A_periph(AT91_PIN_PC6, 0); /* LCDD2 */ ++ at91_set_A_periph(AT91_PIN_PC7, 0); /* LCDD3 */ ++ at91_set_A_periph(AT91_PIN_PC8, 0); /* LCDD4 */ ++ at91_set_A_periph(AT91_PIN_PC9, 0); /* LCDD5 */ ++ at91_set_A_periph(AT91_PIN_PC10, 0); /* LCDD6 */ ++ at91_set_A_periph(AT91_PIN_PC11, 0); /* LCDD7 */ ++ at91_set_A_periph(AT91_PIN_PC14, 0); /* LCDD10 */ ++ at91_set_A_periph(AT91_PIN_PC15, 0); /* LCDD11 */ ++ at91_set_A_periph(AT91_PIN_PC16, 0); /* LCDD12 */ ++ at91_set_A_periph(AT91_PIN_PC17, 0); /* LCDD13 */ ++ at91_set_A_periph(AT91_PIN_PC18, 0); /* LCDD14 */ ++ at91_set_A_periph(AT91_PIN_PC19, 0); /* LCDD15 */ ++ at91_set_A_periph(AT91_PIN_PC22, 0); /* LCDD18 */ ++ at91_set_A_periph(AT91_PIN_PC23, 0); /* LCDD19 */ ++ at91_set_A_periph(AT91_PIN_PC24, 0); /* LCDD20 */ ++ at91_set_A_periph(AT91_PIN_PC25, 0); /* LCDD21 */ ++ at91_set_A_periph(AT91_PIN_PC26, 0); /* LCDD22 */ ++ at91_set_A_periph(AT91_PIN_PC27, 0); /* LCDD23 */ ++ ++ lcdc_data = *data; ++ platform_device_register(&at91_lcdc_device); ++} ++#else ++void __init at91_add_device_lcdc(struct atmel_lcdfb_info *data) {} ++#endif ++ ++ ++/* -------------------------------------------------------------------- ++ * SSC -- Synchronous Serial Controller ++ * -------------------------------------------------------------------- */ ++ ++#if defined(CONFIG_ATMEL_SSC) || defined(CONFIG_ATMEL_SSC_MODULE) ++static u64 ssc0_dmamask = DMA_BIT_MASK(32); ++ ++static struct resource ssc0_resources[] = { ++ [0] = { ++ .start = AT91CAP9_BASE_SSC0, ++ .end = AT91CAP9_BASE_SSC0 + SZ_16K - 1, ++ .flags = IORESOURCE_MEM, ++ }, ++ [1] = { ++ .start = AT91CAP9_ID_SSC0, ++ .end = AT91CAP9_ID_SSC0, ++ .flags = IORESOURCE_IRQ, ++ }, ++}; ++ ++static struct platform_device at91cap9_ssc0_device = { ++ .name = "ssc", ++ .id = 0, ++ .dev = { ++ .dma_mask = &ssc0_dmamask, ++ .coherent_dma_mask = DMA_BIT_MASK(32), ++ }, ++ .resource = ssc0_resources, ++ .num_resources = ARRAY_SIZE(ssc0_resources), ++}; ++ ++static inline void configure_ssc0_pins(unsigned pins) ++{ ++ if (pins & ATMEL_SSC_TF) ++ at91_set_A_periph(AT91_PIN_PB0, 1); ++ if (pins & ATMEL_SSC_TK) ++ at91_set_A_periph(AT91_PIN_PB1, 1); ++ if (pins & ATMEL_SSC_TD) ++ at91_set_A_periph(AT91_PIN_PB2, 1); ++ if (pins & ATMEL_SSC_RD) ++ at91_set_A_periph(AT91_PIN_PB3, 1); ++ if (pins & ATMEL_SSC_RK) ++ at91_set_A_periph(AT91_PIN_PB4, 1); ++ if (pins & ATMEL_SSC_RF) ++ at91_set_A_periph(AT91_PIN_PB5, 1); ++} ++ ++static u64 ssc1_dmamask = DMA_BIT_MASK(32); ++ ++static struct resource ssc1_resources[] = { ++ [0] = { ++ .start = AT91CAP9_BASE_SSC1, ++ .end = AT91CAP9_BASE_SSC1 + SZ_16K - 1, ++ .flags = IORESOURCE_MEM, ++ }, ++ [1] = { ++ .start = AT91CAP9_ID_SSC1, ++ .end = AT91CAP9_ID_SSC1, ++ .flags = IORESOURCE_IRQ, ++ }, ++}; ++ ++static struct platform_device at91cap9_ssc1_device = { ++ .name = "ssc", ++ .id = 1, ++ .dev = { ++ .dma_mask = &ssc1_dmamask, ++ .coherent_dma_mask = DMA_BIT_MASK(32), ++ }, ++ .resource = ssc1_resources, ++ .num_resources = ARRAY_SIZE(ssc1_resources), ++}; ++ ++static inline void configure_ssc1_pins(unsigned pins) ++{ ++ if (pins & ATMEL_SSC_TF) ++ at91_set_A_periph(AT91_PIN_PB6, 1); ++ if (pins & ATMEL_SSC_TK) ++ at91_set_A_periph(AT91_PIN_PB7, 1); ++ if (pins & ATMEL_SSC_TD) ++ at91_set_A_periph(AT91_PIN_PB8, 1); ++ if (pins & ATMEL_SSC_RD) ++ at91_set_A_periph(AT91_PIN_PB9, 1); ++ if (pins & ATMEL_SSC_RK) ++ at91_set_A_periph(AT91_PIN_PB10, 1); ++ if (pins & ATMEL_SSC_RF) ++ at91_set_A_periph(AT91_PIN_PB11, 1); ++} ++ ++/* ++ * SSC controllers are accessed through library code, instead of any ++ * kind of all-singing/all-dancing driver. For example one could be ++ * used by a particular I2S audio codec's driver, while another one ++ * on the same system might be used by a custom data capture driver. ++ */ ++void __init at91_add_device_ssc(unsigned id, unsigned pins) ++{ ++ struct platform_device *pdev; ++ ++ /* ++ * NOTE: caller is responsible for passing information matching ++ * "pins" to whatever will be using each particular controller. ++ */ ++ switch (id) { ++ case AT91CAP9_ID_SSC0: ++ pdev = &at91cap9_ssc0_device; ++ configure_ssc0_pins(pins); ++ at91_clock_associate("ssc0_clk", &pdev->dev, "ssc"); ++ break; ++ case AT91CAP9_ID_SSC1: ++ pdev = &at91cap9_ssc1_device; ++ configure_ssc1_pins(pins); ++ at91_clock_associate("ssc1_clk", &pdev->dev, "ssc"); ++ break; ++ default: ++ return; ++ } ++ ++ platform_device_register(pdev); ++} ++ ++#else ++void __init at91_add_device_ssc(unsigned id, unsigned pins) {} ++#endif ++ ++ ++/* -------------------------------------------------------------------- ++ * UART ++ * -------------------------------------------------------------------- */ ++ ++#if defined(CONFIG_SERIAL_ATMEL) ++static struct resource dbgu_resources[] = { ++ [0] = { ++ .start = AT91_VA_BASE_SYS + AT91_DBGU, ++ .end = AT91_VA_BASE_SYS + AT91_DBGU + SZ_512 - 1, ++ .flags = IORESOURCE_MEM, ++ }, ++ [1] = { ++ .start = AT91_ID_SYS, ++ .end = AT91_ID_SYS, ++ .flags = IORESOURCE_IRQ, ++ }, ++}; ++ ++static struct atmel_uart_data dbgu_data = { ++ .use_dma_tx = 0, ++ .use_dma_rx = 0, /* DBGU not capable of receive DMA */ ++ .regs = (void __iomem *)(AT91_VA_BASE_SYS + AT91_DBGU), ++}; ++ ++static u64 dbgu_dmamask = DMA_BIT_MASK(32); ++ ++static struct platform_device at91cap9_dbgu_device = { ++ .name = "atmel_usart", ++ .id = 0, ++ .dev = { ++ .dma_mask = &dbgu_dmamask, ++ .coherent_dma_mask = DMA_BIT_MASK(32), ++ .platform_data = &dbgu_data, ++ }, ++ .resource = dbgu_resources, ++ .num_resources = ARRAY_SIZE(dbgu_resources), ++}; ++ ++static inline void configure_dbgu_pins(void) ++{ ++ at91_set_A_periph(AT91_PIN_PC30, 0); /* DRXD */ ++ at91_set_A_periph(AT91_PIN_PC31, 1); /* DTXD */ ++} ++ ++static struct resource uart0_resources[] = { ++ [0] = { ++ .start = AT91CAP9_BASE_US0, ++ .end = AT91CAP9_BASE_US0 + SZ_16K - 1, ++ .flags = IORESOURCE_MEM, ++ }, ++ [1] = { ++ .start = AT91CAP9_ID_US0, ++ .end = AT91CAP9_ID_US0, ++ .flags = IORESOURCE_IRQ, ++ }, ++}; ++ ++static struct atmel_uart_data uart0_data = { ++ .use_dma_tx = 1, ++ .use_dma_rx = 1, ++}; ++ ++static u64 uart0_dmamask = DMA_BIT_MASK(32); ++ ++static struct platform_device at91cap9_uart0_device = { ++ .name = "atmel_usart", ++ .id = 1, ++ .dev = { ++ .dma_mask = &uart0_dmamask, ++ .coherent_dma_mask = DMA_BIT_MASK(32), ++ .platform_data = &uart0_data, ++ }, ++ .resource = uart0_resources, ++ .num_resources = ARRAY_SIZE(uart0_resources), ++}; ++ ++static inline void configure_usart0_pins(unsigned pins) ++{ ++ at91_set_A_periph(AT91_PIN_PA22, 1); /* TXD0 */ ++ at91_set_A_periph(AT91_PIN_PA23, 0); /* RXD0 */ ++ ++ if (pins & ATMEL_UART_RTS) ++ at91_set_A_periph(AT91_PIN_PA24, 0); /* RTS0 */ ++ if (pins & ATMEL_UART_CTS) ++ at91_set_A_periph(AT91_PIN_PA25, 0); /* CTS0 */ ++} ++ ++static struct resource uart1_resources[] = { ++ [0] = { ++ .start = AT91CAP9_BASE_US1, ++ .end = AT91CAP9_BASE_US1 + SZ_16K - 1, ++ .flags = IORESOURCE_MEM, ++ }, ++ [1] = { ++ .start = AT91CAP9_ID_US1, ++ .end = AT91CAP9_ID_US1, ++ .flags = IORESOURCE_IRQ, ++ }, ++}; ++ ++static struct atmel_uart_data uart1_data = { ++ .use_dma_tx = 1, ++ .use_dma_rx = 1, ++}; ++ ++static u64 uart1_dmamask = DMA_BIT_MASK(32); ++ ++static struct platform_device at91cap9_uart1_device = { ++ .name = "atmel_usart", ++ .id = 2, ++ .dev = { ++ .dma_mask = &uart1_dmamask, ++ .coherent_dma_mask = DMA_BIT_MASK(32), ++ .platform_data = &uart1_data, ++ }, ++ .resource = uart1_resources, ++ .num_resources = ARRAY_SIZE(uart1_resources), ++}; ++ ++static inline void configure_usart1_pins(unsigned pins) ++{ ++ at91_set_A_periph(AT91_PIN_PD0, 1); /* TXD1 */ ++ at91_set_A_periph(AT91_PIN_PD1, 0); /* RXD1 */ ++ ++ if (pins & ATMEL_UART_RTS) ++ at91_set_B_periph(AT91_PIN_PD7, 0); /* RTS1 */ ++ if (pins & ATMEL_UART_CTS) ++ at91_set_B_periph(AT91_PIN_PD8, 0); /* CTS1 */ ++} ++ ++static struct resource uart2_resources[] = { ++ [0] = { ++ .start = AT91CAP9_BASE_US2, ++ .end = AT91CAP9_BASE_US2 + SZ_16K - 1, ++ .flags = IORESOURCE_MEM, ++ }, ++ [1] = { ++ .start = AT91CAP9_ID_US2, ++ .end = AT91CAP9_ID_US2, ++ .flags = IORESOURCE_IRQ, ++ }, ++}; ++ ++static struct atmel_uart_data uart2_data = { ++ .use_dma_tx = 1, ++ .use_dma_rx = 1, ++}; ++ ++static u64 uart2_dmamask = DMA_BIT_MASK(32); ++ ++static struct platform_device at91cap9_uart2_device = { ++ .name = "atmel_usart", ++ .id = 3, ++ .dev = { ++ .dma_mask = &uart2_dmamask, ++ .coherent_dma_mask = DMA_BIT_MASK(32), ++ .platform_data = &uart2_data, ++ }, ++ .resource = uart2_resources, ++ .num_resources = ARRAY_SIZE(uart2_resources), ++}; ++ ++static inline void configure_usart2_pins(unsigned pins) ++{ ++ at91_set_A_periph(AT91_PIN_PD2, 1); /* TXD2 */ ++ at91_set_A_periph(AT91_PIN_PD3, 0); /* RXD2 */ ++ ++ if (pins & ATMEL_UART_RTS) ++ at91_set_B_periph(AT91_PIN_PD5, 0); /* RTS2 */ ++ if (pins & ATMEL_UART_CTS) ++ at91_set_B_periph(AT91_PIN_PD6, 0); /* CTS2 */ ++} ++ ++static struct platform_device *at91_uarts[ATMEL_MAX_UART]; /* the UARTs to use */ ++struct platform_device *atmel_default_console_device; /* the serial console device */ ++ ++void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins) ++{ ++ struct platform_device *pdev; ++ ++ switch (id) { ++ case 0: /* DBGU */ ++ pdev = &at91cap9_dbgu_device; ++ configure_dbgu_pins(); ++ at91_clock_associate("mck", &pdev->dev, "usart"); ++ break; ++ case AT91CAP9_ID_US0: ++ pdev = &at91cap9_uart0_device; ++ configure_usart0_pins(pins); ++ at91_clock_associate("usart0_clk", &pdev->dev, "usart"); ++ break; ++ case AT91CAP9_ID_US1: ++ pdev = &at91cap9_uart1_device; ++ configure_usart1_pins(pins); ++ at91_clock_associate("usart1_clk", &pdev->dev, "usart"); ++ break; ++ case AT91CAP9_ID_US2: ++ pdev = &at91cap9_uart2_device; ++ configure_usart2_pins(pins); ++ at91_clock_associate("usart2_clk", &pdev->dev, "usart"); ++ break; ++ default: ++ return; ++ } ++ pdev->id = portnr; /* update to mapped ID */ ++ ++ if (portnr < ATMEL_MAX_UART) ++ at91_uarts[portnr] = pdev; ++} ++ ++void __init at91_set_serial_console(unsigned portnr) ++{ ++ if (portnr < ATMEL_MAX_UART) ++ atmel_default_console_device = at91_uarts[portnr]; ++ if (!atmel_default_console_device) ++ printk(KERN_INFO "AT91: No default serial console defined.\n"); ++} ++ ++void __init at91_add_device_serial(void) ++{ ++ int i; ++ ++ for (i = 0; i < ATMEL_MAX_UART; i++) { ++ if (at91_uarts[i]) ++ platform_device_register(at91_uarts[i]); ++ } ++} ++#else ++void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins) {} ++void __init at91_set_serial_console(unsigned portnr) {} ++void __init at91_add_device_serial(void) {} ++#endif ++ ++ ++/* -------------------------------------------------------------------- */ ++/* ++ * These devices are always present and don't need any board-specific ++ * setup. ++ */ ++static int __init at91_add_standard_devices(void) ++{ ++ at91_add_device_rtt(); ++ at91_add_device_watchdog(); ++ at91_add_device_tc(); ++ return 0; ++} ++ ++arch_initcall(at91_add_standard_devices); +diff -urN -x CVS linux-2.6.24/arch/arm/mach-at91/at91rm9200.c linux-2.6/arch/arm/mach-at91/at91rm9200.c +--- linux-2.6.24/arch/arm/mach-at91/at91rm9200.c 2007-10-09 22:31:38.000000000 +0200 ++++ linux-2.6/arch/arm/mach-at91/at91rm9200.c 2008-03-01 18:46:49.000000000 +0200 +@@ -301,28 +301,28 @@ + static unsigned int at91rm9200_default_irq_priority[NR_AIC_IRQS] __initdata = { + 7, /* Advanced Interrupt Controller (FIQ) */ + 7, /* System Peripherals */ +- 0, /* Parallel IO Controller A */ +- 0, /* Parallel IO Controller B */ +- 0, /* Parallel IO Controller C */ +- 0, /* Parallel IO Controller D */ +- 6, /* USART 0 */ +- 6, /* USART 1 */ +- 6, /* USART 2 */ +- 6, /* USART 3 */ ++ 1, /* Parallel IO Controller A */ ++ 1, /* Parallel IO Controller B */ ++ 1, /* Parallel IO Controller C */ ++ 1, /* Parallel IO Controller D */ ++ 5, /* USART 0 */ ++ 5, /* USART 1 */ ++ 5, /* USART 2 */ ++ 5, /* USART 3 */ + 0, /* Multimedia Card Interface */ +- 4, /* USB Device Port */ +- 0, /* Two-Wire Interface */ +- 6, /* Serial Peripheral Interface */ +- 5, /* Serial Synchronous Controller 0 */ +- 5, /* Serial Synchronous Controller 1 */ +- 5, /* Serial Synchronous Controller 2 */ ++ 2, /* USB Device Port */ ++ 6, /* Two-Wire Interface */ ++ 5, /* Serial Peripheral Interface */ ++ 4, /* Serial Synchronous Controller 0 */ ++ 4, /* Serial Synchronous Controller 1 */ ++ 4, /* Serial Synchronous Controller 2 */ + 0, /* Timer Counter 0 */ + 0, /* Timer Counter 1 */ + 0, /* Timer Counter 2 */ + 0, /* Timer Counter 3 */ + 0, /* Timer Counter 4 */ + 0, /* Timer Counter 5 */ +- 3, /* USB Host port */ ++ 2, /* USB Host port */ + 3, /* Ethernet MAC */ + 0, /* Advanced Interrupt Controller (IRQ0) */ + 0, /* Advanced Interrupt Controller (IRQ1) */ +diff -urN -x CVS linux-2.6.24/arch/arm/mach-at91/at91rm9200_devices.c linux-2.6/arch/arm/mach-at91/at91rm9200_devices.c +--- linux-2.6.24/arch/arm/mach-at91/at91rm9200_devices.c 2008-03-01 22:02:07.000000000 +0200 ++++ linux-2.6/arch/arm/mach-at91/at91rm9200_devices.c 2008-03-01 18:50:43.000000000 +0200 +@@ -13,6 +13,7 @@ + #include <asm/mach/arch.h> + #include <asm/mach/map.h> + ++#include <linux/dma-mapping.h> + #include <linux/platform_device.h> + #include <linux/i2c-gpio.h> + +@@ -29,7 +30,7 @@ + * -------------------------------------------------------------------- */ + + #if defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE) +-static u64 ohci_dmamask = 0xffffffffUL; ++static u64 ohci_dmamask = DMA_BIT_MASK(32); + static struct at91_usbh_data usbh_data; + + static struct resource usbh_resources[] = { +@@ -50,7 +51,7 @@ + .id = -1, + .dev = { + .dma_mask = &ohci_dmamask, +- .coherent_dma_mask = 0xffffffff, ++ .coherent_dma_mask = DMA_BIT_MASK(32), + .platform_data = &usbh_data, + }, + .resource = usbh_resources, +@@ -125,7 +126,7 @@ + * -------------------------------------------------------------------- */ + + #if defined(CONFIG_ARM_AT91_ETHER) || defined(CONFIG_ARM_AT91_ETHER_MODULE) +-static u64 eth_dmamask = 0xffffffffUL; ++static u64 eth_dmamask = DMA_BIT_MASK(32); + static struct at91_eth_data eth_data; + + static struct resource eth_resources[] = { +@@ -146,7 +147,7 @@ + .id = -1, + .dev = { + .dma_mask = ð_dmamask, +- .coherent_dma_mask = 0xffffffff, ++ .coherent_dma_mask = DMA_BIT_MASK(32), + .platform_data = ð_data, + }, + .resource = eth_resources, +@@ -285,7 +286,7 @@ + * -------------------------------------------------------------------- */ + + #if defined(CONFIG_MMC_AT91) || defined(CONFIG_MMC_AT91_MODULE) +-static u64 mmc_dmamask = 0xffffffffUL; ++static u64 mmc_dmamask = DMA_BIT_MASK(32); + static struct at91_mmc_data mmc_data; + + static struct resource mmc_resources[] = { +@@ -306,7 +307,7 @@ + .id = -1, + .dev = { + .dma_mask = &mmc_dmamask, +- .coherent_dma_mask = 0xffffffff, ++ .coherent_dma_mask = DMA_BIT_MASK(32), + .platform_data = &mmc_data, + }, + .resource = mmc_resources, +@@ -375,7 +376,7 @@ + static struct resource nand_resources[] = { + { + .start = NAND_BASE, +- .end = NAND_BASE + SZ_8M - 1, ++ .end = NAND_BASE + SZ_256M - 1, + .flags = IORESOURCE_MEM, + } + }; +@@ -512,8 +513,19 @@ + * SPI + * -------------------------------------------------------------------- */ + +-#if defined(CONFIG_SPI_ATMEL) || defined(CONFIG_SPI_ATMEL_MODULE) +-static u64 spi_dmamask = 0xffffffffUL; ++#if defined(CONFIG_AT91_SPI) || defined(CONFIG_AT91_SPI_MODULE) /* legacy SPI driver */ ++#define SPI_DEVNAME "at91_spi" ++ ++#elif defined(CONFIG_SPI_AT91) || defined(CONFIG_SPI_AT91_MODULE) /* SPI bitbanging driver */ ++#define SPI_DEVNAME "at91_spi" ++ ++#elif defined(CONFIG_SPI_ATMEL) || defined(CONFIG_SPI_ATMEL_MODULE) /* new SPI driver */ ++#define SPI_DEVNAME "atmel_spi" ++ ++#endif ++ ++#ifdef SPI_DEVNAME ++static u64 spi_dmamask = DMA_BIT_MASK(32); + + static struct resource spi_resources[] = { + [0] = { +@@ -529,11 +541,11 @@ + }; + + static struct platform_device at91rm9200_spi_device = { +- .name = "atmel_spi", ++ .name = SPI_DEVNAME, + .id = 0, + .dev = { + .dma_mask = &spi_dmamask, +- .coherent_dma_mask = 0xffffffff, ++ .coherent_dma_mask = DMA_BIT_MASK(32), + }, + .resource = spi_resources, + .num_resources = ARRAY_SIZE(spi_resources), +@@ -557,8 +569,17 @@ + else + cs_pin = spi_standard_cs[devices[i].chip_select]; + +- /* enable chip-select pin */ +- at91_set_gpio_output(cs_pin, 1); ++ if (devices[i].chip_select == 0) /* for CS0 errata */ ++ at91_set_A_periph(cs_pin, 0); ++ else ++ at91_set_gpio_output(cs_pin, 1); ++ ++#if defined(CONFIG_AT91_SPI) || defined(CONFIG_AT91_SPI_MODULE) ++ /* ++ * Force peripheral mode when using the legacy SPI driver. ++ */ ++ at91_set_A_periph(cs_pin, 0); ++#endif + + /* pass chip-select pin to driver */ + devices[i].controller_data = (void *) cs_pin; +@@ -573,6 +594,90 @@ + + + /* -------------------------------------------------------------------- ++ * Timer/Counter blocks ++ * -------------------------------------------------------------------- */ ++ ++#ifdef CONFIG_ATMEL_TCLIB ++ ++static struct resource tcb0_resources[] = { ++ [0] = { ++ .start = AT91RM9200_BASE_TCB0, ++ .end = AT91RM9200_BASE_TCB0 + SZ_16K - 1, ++ .flags = IORESOURCE_MEM, ++ }, ++ [1] = { ++ .start = AT91RM9200_ID_TC0, ++ .end = AT91RM9200_ID_TC0, ++ .flags = IORESOURCE_IRQ, ++ }, ++ [2] = { ++ .start = AT91RM9200_ID_TC1, ++ .end = AT91RM9200_ID_TC1, ++ .flags = IORESOURCE_IRQ, ++ }, ++ [3] = { ++ .start = AT91RM9200_ID_TC2, ++ .end = AT91RM9200_ID_TC2, ++ .flags = IORESOURCE_IRQ, ++ }, ++}; ++ ++static struct platform_device at91rm9200_tcb0_device = { ++ .name = "atmel_tcb", ++ .id = 0, ++ .resource = tcb0_resources, ++ .num_resources = ARRAY_SIZE(tcb0_resources), ++}; ++ ++static struct resource tcb1_resources[] = { ++ [0] = { ++ .start = AT91RM9200_BASE_TCB1, ++ .end = AT91RM9200_BASE_TCB1 + SZ_16K - 1, ++ .flags = IORESOURCE_MEM, ++ }, ++ [1] = { ++ .start = AT91RM9200_ID_TC3, ++ .end = AT91RM9200_ID_TC3, ++ .flags = IORESOURCE_IRQ, ++ }, ++ [2] = { ++ .start = AT91RM9200_ID_TC4, ++ .end = AT91RM9200_ID_TC4, ++ .flags = IORESOURCE_IRQ, ++ }, ++ [3] = { ++ .start = AT91RM9200_ID_TC5, ++ .end = AT91RM9200_ID_TC5, ++ .flags = IORESOURCE_IRQ, ++ }, ++}; ++ ++static struct platform_device at91rm9200_tcb1_device = { ++ .name = "atmel_tcb", ++ .id = 1, ++ .resource = tcb1_resources, ++ .num_resources = ARRAY_SIZE(tcb1_resources), ++}; ++ ++static void __init at91_add_device_tc(void) ++{ ++ /* this chip has a separate clock and irq for each TC channel */ ++ at91_clock_associate("tc0_clk", &at91rm9200_tcb0_device.dev, "t0_clk"); ++ at91_clock_associate("tc1_clk", &at91rm9200_tcb0_device.dev, "t1_clk"); ++ at91_clock_associate("tc2_clk", &at91rm9200_tcb0_device.dev, "t2_clk"); ++ platform_device_register(&at91rm9200_tcb0_device); ++ ++ at91_clock_associate("tc3_clk", &at91rm9200_tcb1_device.dev, "t0_clk"); ++ at91_clock_associate("tc4_clk", &at91rm9200_tcb1_device.dev, "t1_clk"); ++ at91_clock_associate("tc5_clk", &at91rm9200_tcb1_device.dev, "t2_clk"); ++ platform_device_register(&at91rm9200_tcb1_device); ++} ++#else ++static void __init at91_add_device_tc(void) { } ++#endif ++ ++ ++/* -------------------------------------------------------------------- + * RTC + * -------------------------------------------------------------------- */ + +@@ -585,6 +690,7 @@ + + static void __init at91_add_device_rtc(void) + { ++ device_init_wakeup(&at91rm9200_rtc_device.dev, 1); + platform_device_register(&at91rm9200_rtc_device); + } + #else +@@ -613,24 +719,175 @@ + + + /* -------------------------------------------------------------------- +- * LEDs ++ * SSC -- Synchronous Serial Controller + * -------------------------------------------------------------------- */ + +-#if defined(CONFIG_LEDS) +-u8 at91_leds_cpu; +-u8 at91_leds_timer; ++#if defined(CONFIG_ATMEL_SSC) || defined(CONFIG_ATMEL_SSC_MODULE) ++static u64 ssc0_dmamask = DMA_BIT_MASK(32); ++ ++static struct resource ssc0_resources[] = { ++ [0] = { ++ .start = AT91RM9200_BASE_SSC0, ++ .end = AT91RM9200_BASE_SSC0 + SZ_16K - 1, ++ .flags = IORESOURCE_MEM, ++ }, ++ [1] = { ++ .start = AT91RM9200_ID_SSC0, ++ .end = AT91RM9200_ID_SSC0, ++ .flags = IORESOURCE_IRQ, ++ }, ++}; ++ ++static struct platform_device at91rm9200_ssc0_device = { ++ .name = "ssc", ++ .id = 0, ++ .dev = { ++ .dma_mask = &ssc0_dmamask, ++ .coherent_dma_mask = DMA_BIT_MASK(32), ++ }, ++ .resource = ssc0_resources, ++ .num_resources = ARRAY_SIZE(ssc0_resources), ++}; ++ ++static inline void configure_ssc0_pins(unsigned pins) ++{ ++ if (pins & ATMEL_SSC_TF) ++ at91_set_A_periph(AT91_PIN_PB0, 1); ++ if (pins & ATMEL_SSC_TK) ++ at91_set_A_periph(AT91_PIN_PB1, 1); ++ if (pins & ATMEL_SSC_TD) ++ at91_set_A_periph(AT91_PIN_PB2, 1); ++ if (pins & ATMEL_SSC_RD) ++ at91_set_A_periph(AT91_PIN_PB3, 1); ++ if (pins & ATMEL_SSC_RK) ++ at91_set_A_periph(AT91_PIN_PB4, 1); ++ if (pins & ATMEL_SSC_RF) ++ at91_set_A_periph(AT91_PIN_PB5, 1); ++} ++ ++static u64 ssc1_dmamask = DMA_BIT_MASK(32); ++ ++static struct resource ssc1_resources[] = { ++ [0] = { ++ .start = AT91RM9200_BASE_SSC1, ++ .end = AT91RM9200_BASE_SSC1 + SZ_16K - 1, ++ .flags = IORESOURCE_MEM, ++ }, ++ [1] = { ++ .start = AT91RM9200_ID_SSC1, ++ .end = AT91RM9200_ID_SSC1, ++ .flags = IORESOURCE_IRQ, ++ }, ++}; ++ ++static struct platform_device at91rm9200_ssc1_device = { ++ .name = "ssc", ++ .id = 1, ++ .dev = { ++ .dma_mask = &ssc1_dmamask, ++ .coherent_dma_mask = DMA_BIT_MASK(32), ++ }, ++ .resource = ssc1_resources, ++ .num_resources = ARRAY_SIZE(ssc1_resources), ++}; + +-void __init at91_init_leds(u8 cpu_led, u8 timer_led) ++static inline void configure_ssc1_pins(unsigned pins) + { +- /* Enable GPIO to access the LEDs */ +- at91_set_gpio_output(cpu_led, 1); +- at91_set_gpio_output(timer_led, 1); ++ if (pins & ATMEL_SSC_TF) ++ at91_set_A_periph(AT91_PIN_PB6, 1); ++ if (pins & ATMEL_SSC_TK) ++ at91_set_A_periph(AT91_PIN_PB7, 1); ++ if (pins & ATMEL_SSC_TD) ++ at91_set_A_periph(AT91_PIN_PB8, 1); ++ if (pins & ATMEL_SSC_RD) ++ at91_set_A_periph(AT91_PIN_PB9, 1); ++ if (pins & ATMEL_SSC_RK) ++ at91_set_A_periph(AT91_PIN_PB10, 1); ++ if (pins & ATMEL_SSC_RF) ++ at91_set_A_periph(AT91_PIN_PB11, 1); ++} ++ ++static u64 ssc2_dmamask = DMA_BIT_MASK(32); + +- at91_leds_cpu = cpu_led; +- at91_leds_timer = timer_led; ++static struct resource ssc2_resources[] = { ++ [0] = { ++ .start = AT91RM9200_BASE_SSC2, ++ .end = AT91RM9200_BASE_SSC2 + SZ_16K - 1, ++ .flags = IORESOURCE_MEM, ++ }, ++ [1] = { ++ .start = AT91RM9200_ID_SSC2, ++ .end = AT91RM9200_ID_SSC2, ++ .flags = IORESOURCE_IRQ, ++ }, ++}; ++ ++static struct platform_device at91rm9200_ssc2_device = { ++ .name = "ssc", ++ .id = 2, ++ .dev = { ++ .dma_mask = &ssc2_dmamask, ++ .coherent_dma_mask = DMA_BIT_MASK(32), ++ }, ++ .resource = ssc2_resources, ++ .num_resources = ARRAY_SIZE(ssc2_resources), ++}; ++ ++static inline void configure_ssc2_pins(unsigned pins) ++{ ++ if (pins & ATMEL_SSC_TF) ++ at91_set_A_periph(AT91_PIN_PB12, 1); ++ if (pins & ATMEL_SSC_TK) ++ at91_set_A_periph(AT91_PIN_PB13, 1); ++ if (pins & ATMEL_SSC_TD) ++ at91_set_A_periph(AT91_PIN_PB14, 1); ++ if (pins & ATMEL_SSC_RD) ++ at91_set_A_periph(AT91_PIN_PB15, 1); ++ if (pins & ATMEL_SSC_RK) ++ at91_set_A_periph(AT91_PIN_PB16, 1); ++ if (pins & ATMEL_SSC_RF) ++ at91_set_A_periph(AT91_PIN_PB17, 1); + } ++ ++/* ++ * SSC controllers are accessed through library code, instead of any ++ * kind of all-singing/all-dancing driver. For example one could be ++ * used by a particular I2S audio codec's driver, while another one ++ * on the same system might be used by a custom data capture driver. ++ */ ++void __init at91_add_device_ssc(unsigned id, unsigned pins) ++{ ++ struct platform_device *pdev; ++ ++ /* ++ * NOTE: caller is responsible for passing information matching ++ * "pins" to whatever will be using each particular controller. ++ */ ++ switch (id) { ++ case AT91RM9200_ID_SSC0: ++ pdev = &at91rm9200_ssc0_device; ++ configure_ssc0_pins(pins); ++ at91_clock_associate("ssc0_clk", &pdev->dev, "ssc"); ++ break; ++ case AT91RM9200_ID_SSC1: ++ pdev = &at91rm9200_ssc1_device; ++ configure_ssc1_pins(pins); ++ at91_clock_associate("ssc1_clk", &pdev->dev, "ssc"); ++ break; ++ case AT91RM9200_ID_SSC2: ++ pdev = &at91rm9200_ssc2_device; ++ configure_ssc2_pins(pins); ++ at91_clock_associate("ssc2_clk", &pdev->dev, "ssc"); ++ break; ++ default: ++ return; ++ } ++ ++ platform_device_register(pdev); ++} ++ + #else +-void __init at91_init_leds(u8 cpu_led, u8 timer_led) {} ++void __init at91_add_device_ssc(unsigned id, unsigned pins) {} + #endif + + +@@ -657,13 +914,15 @@ + .use_dma_rx = 0, /* DBGU not capable of receive DMA */ + .regs = (void __iomem *)(AT91_VA_BASE_SYS + AT91_DBGU), + }; ++static u64 dbgu_dmamask = DMA_BIT_MASK(32); + + static struct platform_device at91rm9200_dbgu_device = { + .name = "atmel_usart", + .id = 0, + .dev = { +- .platform_data = &dbgu_data, +- .coherent_dma_mask = 0xffffffff, ++ .dma_mask = &dbgu_dmamask, ++ .coherent_dma_mask = DMA_BIT_MASK(32), ++ .platform_data = &dbgu_data, + }, + .resource = dbgu_resources, + .num_resources = ARRAY_SIZE(dbgu_resources), +@@ -692,29 +951,36 @@ + .use_dma_tx = 1, + .use_dma_rx = 1, + }; ++static u64 uart0_dmamask = DMA_BIT_MASK(32); + + static struct platform_device at91rm9200_uart0_device = { + .name = "atmel_usart", + .id = 1, + .dev = { +- .platform_data = &uart0_data, +- .coherent_dma_mask = 0xffffffff, ++ .dma_mask = &uart0_dmamask, ++ .coherent_dma_mask = DMA_BIT_MASK(32), ++ .platform_data = &uart0_data, + }, + .resource = uart0_resources, + .num_resources = ARRAY_SIZE(uart0_resources), + }; + +-static inline void configure_usart0_pins(void) ++static inline void configure_usart0_pins(unsigned pins) + { + at91_set_A_periph(AT91_PIN_PA17, 1); /* TXD0 */ + at91_set_A_periph(AT91_PIN_PA18, 0); /* RXD0 */ +- at91_set_A_periph(AT91_PIN_PA20, 0); /* CTS0 */ + +- /* +- * AT91RM9200 Errata #39 - RTS0 is not internally connected to PA21. +- * We need to drive the pin manually. Default is off (RTS is active low). +- */ +- at91_set_gpio_output(AT91_PIN_PA21, 1); ++ if (pins & ATMEL_UART_CTS) ++ at91_set_A_periph(AT91_PIN_PA20, 0); /* CTS0 */ ++ ++ if (pins & ATMEL_UART_RTS) { ++ /* ++ * AT91RM9200 Errata #39 - RTS0 is not internally connected ++ * to PA21, so we need to drive the pin manually. ++ * Default is off (RTS is active low). ++ */ ++ at91_set_gpio_output(AT91_PIN_PA21, 1); ++ } + } + + static struct resource uart1_resources[] = { +@@ -734,28 +1000,37 @@ + .use_dma_tx = 1, + .use_dma_rx = 1, + }; ++static u64 uart1_dmamask = DMA_BIT_MASK(32); + + static struct platform_device at91rm9200_uart1_device = { + .name = "atmel_usart", + .id = 2, + .dev = { +- .platform_data = &uart1_data, +- .coherent_dma_mask = 0xffffffff, ++ .dma_mask = &uart1_dmamask, ++ .coherent_dma_mask = DMA_BIT_MASK(32), ++ .platform_data = &uart1_data, + }, + .resource = uart1_resources, + .num_resources = ARRAY_SIZE(uart1_resources), + }; + +-static inline void configure_usart1_pins(void) ++static inline void configure_usart1_pins(unsigned pins) + { +- at91_set_A_periph(AT91_PIN_PB18, 0); /* RI1 */ +- at91_set_A_periph(AT91_PIN_PB19, 0); /* DTR1 */ + at91_set_A_periph(AT91_PIN_PB20, 1); /* TXD1 */ + at91_set_A_periph(AT91_PIN_PB21, 0); /* RXD1 */ +- at91_set_A_periph(AT91_PIN_PB23, 0); /* DCD1 */ +- at91_set_A_periph(AT91_PIN_PB24, 0); /* CTS1 */ +- at91_set_A_periph(AT91_PIN_PB25, 0); /* DSR1 */ +- at91_set_A_periph(AT91_PIN_PB26, 0); /* RTS1 */ ++ ++ if (pins & ATMEL_UART_RI) ++ at91_set_A_periph(AT91_PIN_PB18, 0); /* RI1 */ ++ if (pins & ATMEL_UART_DTR) ++ at91_set_A_periph(AT91_PIN_PB19, 0); /* DTR1 */ ++ if (pins & ATMEL_UART_DCD) ++ at91_set_A_periph(AT91_PIN_PB23, 0); /* DCD1 */ ++ if (pins & ATMEL_UART_CTS) ++ at91_set_A_periph(AT91_PIN_PB24, 0); /* CTS1 */ ++ if (pins & ATMEL_UART_DSR) ++ at91_set_A_periph(AT91_PIN_PB25, 0); /* DSR1 */ ++ if (pins & ATMEL_UART_RTS) ++ at91_set_A_periph(AT91_PIN_PB26, 0); /* RTS1 */ + } + + static struct resource uart2_resources[] = { +@@ -775,22 +1050,29 @@ + .use_dma_tx = 1, + .use_dma_rx = 1, + }; ++static u64 uart2_dmamask = DMA_BIT_MASK(32); + + static struct platform_device at91rm9200_uart2_device = { + .name = "atmel_usart", + .id = 3, + .dev = { +- .platform_data = &uart2_data, +- .coherent_dma_mask = 0xffffffff, ++ .dma_mask = &uart2_dmamask, ++ .coherent_dma_mask = DMA_BIT_MASK(32), ++ .platform_data = &uart2_data, + }, + .resource = uart2_resources, + .num_resources = ARRAY_SIZE(uart2_resources), + }; + +-static inline void configure_usart2_pins(void) ++static inline void configure_usart2_pins(unsigned pins) + { + at91_set_A_periph(AT91_PIN_PA22, 0); /* RXD2 */ + at91_set_A_periph(AT91_PIN_PA23, 1); /* TXD2 */ ++ ++ if (pins & ATMEL_UART_CTS) ++ at91_set_B_periph(AT91_PIN_PA30, 0); /* CTS2 */ ++ if (pins & ATMEL_UART_RTS) ++ at91_set_B_periph(AT91_PIN_PA31, 0); /* RTS2 */ + } + + static struct resource uart3_resources[] = { +@@ -810,28 +1092,35 @@ + .use_dma_tx = 1, + .use_dma_rx = 1, + }; ++static u64 uart3_dmamask = DMA_BIT_MASK(32); + + static struct platform_device at91rm9200_uart3_device = { + .name = "atmel_usart", + .id = 4, + .dev = { +- .platform_data = &uart3_data, +- .coherent_dma_mask = 0xffffffff, ++ .dma_mask = &uart3_dmamask, ++ .coherent_dma_mask = DMA_BIT_MASK(32), ++ .platform_data = &uart3_data, + }, + .resource = uart3_resources, + .num_resources = ARRAY_SIZE(uart3_resources), + }; + +-static inline void configure_usart3_pins(void) ++static inline void configure_usart3_pins(unsigned pins) + { + at91_set_B_periph(AT91_PIN_PA5, 1); /* TXD3 */ + at91_set_B_periph(AT91_PIN_PA6, 0); /* RXD3 */ ++ ++ if (pins & ATMEL_UART_CTS) ++ at91_set_B_periph(AT91_PIN_PB1, 0); /* CTS3 */ ++ if (pins & ATMEL_UART_RTS) ++ at91_set_B_periph(AT91_PIN_PB0, 0); /* RTS3 */ + } + +-struct platform_device *at91_uarts[ATMEL_MAX_UART]; /* the UARTs to use */ ++static struct platform_device *__initdata at91_uarts[ATMEL_MAX_UART]; /* UARTs to use */ + struct platform_device *atmel_default_console_device; /* the serial console device */ + +-void __init at91_init_serial(struct at91_uart_config *config) ++void __init __deprecated at91_init_serial(struct at91_uart_config *config) + { + int i; + +@@ -839,22 +1128,22 @@ + for (i = 0; i < config->nr_tty; i++) { + switch (config->tty_map[i]) { + case 0: +- configure_usart0_pins(); ++ configure_usart0_pins(ATMEL_UART_CTS | ATMEL_UART_RTS); + at91_uarts[i] = &at91rm9200_uart0_device; + at91_clock_associate("usart0_clk", &at91rm9200_uart0_device.dev, "usart"); + break; + case 1: +- configure_usart1_pins(); ++ configure_usart1_pins(ATMEL_UART_CTS | ATMEL_UART_RTS | ATMEL_UART_DSR | ATMEL_UART_DTR | ATMEL_UART_DCD | ATMEL_UART_RI); + at91_uarts[i] = &at91rm9200_uart1_device; + at91_clock_associate("usart1_clk", &at91rm9200_uart1_device.dev, "usart"); + break; + case 2: +- configure_usart2_pins(); ++ configure_usart2_pins(0); + at91_uarts[i] = &at91rm9200_uart2_device; + at91_clock_associate("usart2_clk", &at91rm9200_uart2_device.dev, "usart"); + break; + case 3: +- configure_usart3_pins(); ++ configure_usart3_pins(0); + at91_uarts[i] = &at91rm9200_uart3_device; + at91_clock_associate("usart3_clk", &at91rm9200_uart3_device.dev, "usart"); + break; +@@ -876,6 +1165,53 @@ + printk(KERN_INFO "AT91: No default serial console defined.\n"); + } + ++void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins) ++{ ++ struct platform_device *pdev; ++ ++ switch (id) { ++ case 0: /* DBGU */ ++ pdev = &at91rm9200_dbgu_device; ++ configure_dbgu_pins(); ++ at91_clock_associate("mck", &pdev->dev, "usart"); ++ break; ++ case AT91RM9200_ID_US0: ++ pdev = &at91rm9200_uart0_device; ++ configure_usart0_pins(pins); ++ at91_clock_associate("usart0_clk", &pdev->dev, "usart"); ++ break; ++ case AT91RM9200_ID_US1: ++ pdev = &at91rm9200_uart1_device; ++ configure_usart1_pins(pins); ++ at91_clock_associate("usart1_clk", &pdev->dev, "usart"); ++ break; ++ case AT91RM9200_ID_US2: ++ pdev = &at91rm9200_uart2_device; ++ configure_usart2_pins(pins); ++ at91_clock_associate("usart2_clk", &pdev->dev, "usart"); ++ break; ++ case AT91RM9200_ID_US3: ++ pdev = &at91rm9200_uart3_device; ++ configure_usart3_pins(pins); ++ at91_clock_associate("usart3_clk", &pdev->dev, "usart"); ++ break; ++ default: ++ return; ++ } ++ pdev->id = portnr; /* update to mapped ID */ ++ ++ if (portnr < ATMEL_MAX_UART) ++ at91_uarts[portnr] = pdev; ++} ++ ++void __init at91_set_serial_console(unsigned portnr) ++{ ++ if (portnr < ATMEL_MAX_UART) ++ atmel_default_console_device = at91_uarts[portnr]; ++ if (!atmel_default_console_device) ++ printk(KERN_INFO "AT91: No default serial console defined.\n"); ++} ++ + void __init at91_add_device_serial(void) + { + int i; +@@ -886,7 +1222,9 @@ + } + } + #else +-void __init at91_init_serial(struct at91_uart_config *config) {} ++void __init __deprecated at91_init_serial(struct at91_uart_config *config) {} ++void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins) {} ++void __init at91_set_serial_console(unsigned portnr) {} + void __init at91_add_device_serial(void) {} + #endif + +@@ -901,6 +1239,7 @@ + { + at91_add_device_rtc(); + at91_add_device_watchdog(); ++ at91_add_device_tc(); + return 0; + } + +diff -urN -x CVS linux-2.6.24/arch/arm/mach-at91/at91rm9200_time.c linux-2.6/arch/arm/mach-at91/at91rm9200_time.c +--- linux-2.6.24/arch/arm/mach-at91/at91rm9200_time.c 2008-03-01 22:02:07.000000000 +0200 ++++ linux-2.6/arch/arm/mach-at91/at91rm9200_time.c 2007-12-31 15:04:28.000000000 +0200 +@@ -136,8 +136,6 @@ + u32 alm; + int status = 0; + +- BUG_ON(delta < 2); +- + /* Use "raw" primitives so we behave correctly on RT kernels. */ + raw_local_irq_save(flags); + +diff -urN -x CVS linux-2.6.24/arch/arm/mach-at91/at91sam9260.c linux-2.6/arch/arm/mach-at91/at91sam9260.c +--- linux-2.6.24/arch/arm/mach-at91/at91sam9260.c 2007-10-09 22:31:38.000000000 +0200 ++++ linux-2.6/arch/arm/mach-at91/at91sam9260.c 2008-03-01 19:03:06.000000000 +0200 +@@ -11,6 +11,7 @@ + */ + + #include <linux/module.h> ++#include <linux/pm.h> + + #include <asm/mach/arch.h> + #include <asm/mach/map.h> +@@ -18,6 +19,7 @@ + #include <asm/arch/at91sam9260.h> + #include <asm/arch/at91_pmc.h> + #include <asm/arch/at91_rstc.h> ++#include <asm/arch/at91_shdwc.h> + + #include "generic.h" + #include "clock.h" +@@ -267,6 +269,11 @@ + at91_sys_write(AT91_RSTC_CR, AT91_RSTC_KEY | AT91_RSTC_PROCRST | AT91_RSTC_PERRST); + } + ++static void at91sam9260_poweroff(void) ++{ ++ at91_sys_write(AT91_SHDW_CR, AT91_SHDW_KEY | AT91_SHDW_SHDW); ++} ++ + + /* -------------------------------------------------------------------- + * AT91SAM9260 processor initialization +@@ -304,6 +311,7 @@ + iotable_init(at91sam9260_sram_desc, ARRAY_SIZE(at91sam9260_sram_desc)); + + at91_arch_reset = at91sam9260_reset; ++ pm_power_off = at91sam9260_poweroff; + at91_extern_irq = (1 << AT91SAM9260_ID_IRQ0) | (1 << AT91SAM9260_ID_IRQ1) + | (1 << AT91SAM9260_ID_IRQ2); + +@@ -327,30 +335,30 @@ + static unsigned int at91sam9260_default_irq_priority[NR_AIC_IRQS] __initdata = { + 7, /* Advanced Interrupt Controller */ + 7, /* System Peripherals */ +- 0, /* Parallel IO Controller A */ +- 0, /* Parallel IO Controller B */ +- 0, /* Parallel IO Controller C */ ++ 1, /* Parallel IO Controller A */ ++ 1, /* Parallel IO Controller B */ ++ 1, /* Parallel IO Controller C */ + 0, /* Analog-to-Digital Converter */ +- 6, /* USART 0 */ +- 6, /* USART 1 */ +- 6, /* USART 2 */ ++ 5, /* USART 0 */ ++ 5, /* USART 1 */ ++ 5, /* USART 2 */ + 0, /* Multimedia Card Interface */ +- 4, /* USB Device Port */ +- 0, /* Two-Wire Interface */ +- 6, /* Serial Peripheral Interface 0 */ +- 6, /* Serial Peripheral Interface 1 */ ++ 2, /* USB Device Port */ ++ 6, /* Two-Wire Interface */ ++ 5, /* Serial Peripheral Interface 0 */ ++ 5, /* Serial Peripheral Interface 1 */ + 5, /* Serial Synchronous Controller */ + 0, + 0, + 0, /* Timer Counter 0 */ + 0, /* Timer Counter 1 */ + 0, /* Timer Counter 2 */ +- 3, /* USB Host port */ ++ 2, /* USB Host port */ + 3, /* Ethernet */ + 0, /* Image Sensor Interface */ +- 6, /* USART 3 */ +- 6, /* USART 4 */ +- 6, /* USART 5 */ ++ 5, /* USART 3 */ ++ 5, /* USART 4 */ ++ 5, /* USART 5 */ + 0, /* Timer Counter 3 */ + 0, /* Timer Counter 4 */ + 0, /* Timer Counter 5 */ +diff -urN -x CVS linux-2.6.24/arch/arm/mach-at91/at91sam9260_devices.c linux-2.6/arch/arm/mach-at91/at91sam9260_devices.c +--- linux-2.6.24/arch/arm/mach-at91/at91sam9260_devices.c 2008-03-01 22:02:07.000000000 +0200 ++++ linux-2.6/arch/arm/mach-at91/at91sam9260_devices.c 2008-03-01 22:09:03.000000000 +0200 +@@ -12,13 +12,14 @@ + #include <asm/mach/arch.h> + #include <asm/mach/map.h> + ++#include <linux/dma-mapping.h> + #include <linux/platform_device.h> + #include <linux/i2c-gpio.h> + + #include <asm/arch/board.h> + #include <asm/arch/gpio.h> + #include <asm/arch/at91sam9260.h> +-#include <asm/arch/at91sam926x_mc.h> ++#include <asm/arch/at91sam926x_smc.h> + #include <asm/arch/at91sam9260_matrix.h> + + #include "generic.h" +@@ -29,7 +30,7 @@ + * -------------------------------------------------------------------- */ + + #if defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE) +-static u64 ohci_dmamask = 0xffffffffUL; ++static u64 ohci_dmamask = DMA_BIT_MASK(32); + static struct at91_usbh_data usbh_data; + + static struct resource usbh_resources[] = { +@@ -50,7 +51,7 @@ + .id = -1, + .dev = { + .dma_mask = &ohci_dmamask, +- .coherent_dma_mask = 0xffffffff, ++ .coherent_dma_mask = DMA_BIT_MASK(32), + .platform_data = &usbh_data, + }, + .resource = usbh_resources, +@@ -125,7 +126,7 @@ + * -------------------------------------------------------------------- */ + + #if defined(CONFIG_MACB) || defined(CONFIG_MACB_MODULE) +-static u64 eth_dmamask = 0xffffffffUL; ++static u64 eth_dmamask = DMA_BIT_MASK(32); + static struct at91_eth_data eth_data; + + static struct resource eth_resources[] = { +@@ -146,7 +147,7 @@ + .id = -1, + .dev = { + .dma_mask = ð_dmamask, +- .coherent_dma_mask = 0xffffffff, ++ .coherent_dma_mask = DMA_BIT_MASK(32), + .platform_data = ð_data, + }, + .resource = eth_resources, +@@ -199,7 +200,7 @@ + * -------------------------------------------------------------------- */ + + #if defined(CONFIG_MMC_AT91) || defined(CONFIG_MMC_AT91_MODULE) +-static u64 mmc_dmamask = 0xffffffffUL; ++static u64 mmc_dmamask = DMA_BIT_MASK(32); + static struct at91_mmc_data mmc_data; + + static struct resource mmc_resources[] = { +@@ -220,7 +221,7 @@ + .id = -1, + .dev = { + .dma_mask = &mmc_dmamask, +- .coherent_dma_mask = 0xffffffff, ++ .coherent_dma_mask = DMA_BIT_MASK(32), + .platform_data = &mmc_data, + }, + .resource = mmc_resources, +@@ -287,9 +288,14 @@ + #define NAND_BASE AT91_CHIPSELECT_3 + + static struct resource nand_resources[] = { +- { ++ [0] = { + .start = NAND_BASE, +- .end = NAND_BASE + SZ_8M - 1, ++ .end = NAND_BASE + SZ_256M - 1, ++ .flags = IORESOURCE_MEM, ++ }, ++ [1] = { ++ .start = AT91_BASE_SYS + AT91_ECC, ++ .end = AT91_BASE_SYS + AT91_ECC + SZ_512 - 1, + .flags = IORESOURCE_MEM, + } + }; +@@ -312,7 +318,7 @@ + return; + + csa = at91_sys_read(AT91_MATRIX_EBICSA); +- at91_sys_write(AT91_MATRIX_EBICSA, csa | AT91_MATRIX_CS3A_SMC); ++ at91_sys_write(AT91_MATRIX_EBICSA, csa | AT91_MATRIX_CS3A_SMC_SMARTMEDIA); + + /* set the bus interface characteristics */ + at91_sys_write(AT91_SMC_SETUP(3), AT91_SMC_NWESETUP_(0) | AT91_SMC_NCS_WRSETUP_(0) +@@ -431,7 +437,7 @@ + * -------------------------------------------------------------------- */ + + #if defined(CONFIG_SPI_ATMEL) || defined(CONFIG_SPI_ATMEL_MODULE) +-static u64 spi_dmamask = 0xffffffffUL; ++static u64 spi_dmamask = DMA_BIT_MASK(32); + + static struct resource spi0_resources[] = { + [0] = { +@@ -451,7 +457,7 @@ + .id = 0, + .dev = { + .dma_mask = &spi_dmamask, +- .coherent_dma_mask = 0xffffffff, ++ .coherent_dma_mask = DMA_BIT_MASK(32), + }, + .resource = spi0_resources, + .num_resources = ARRAY_SIZE(spi0_resources), +@@ -477,7 +483,7 @@ + .id = 1, + .dev = { + .dma_mask = &spi_dmamask, +- .coherent_dma_mask = 0xffffffff, ++ .coherent_dma_mask = DMA_BIT_MASK(32), + }, + .resource = spi1_resources, + .num_resources = ARRAY_SIZE(spi1_resources), +@@ -539,24 +545,211 @@ + + + /* -------------------------------------------------------------------- +- * LEDs ++ * Timer/Counter blocks + * -------------------------------------------------------------------- */ + +-#if defined(CONFIG_LEDS) +-u8 at91_leds_cpu; +-u8 at91_leds_timer; ++#ifdef CONFIG_ATMEL_TCLIB ++ ++static struct resource tcb0_resources[] = { ++ [0] = { ++ .start = AT91SAM9260_BASE_TCB0, ++ .end = AT91SAM9260_BASE_TCB0 + SZ_16K - 1, ++ .flags = IORESOURCE_MEM, ++ }, ++ [1] = { ++ .start = AT91SAM9260_ID_TC0, ++ .end = AT91SAM9260_ID_TC0, ++ .flags = IORESOURCE_IRQ, ++ }, ++ [2] = { ++ .start = AT91SAM9260_ID_TC1, ++ .end = AT91SAM9260_ID_TC1, ++ .flags = IORESOURCE_IRQ, ++ }, ++ [3] = { ++ .start = AT91SAM9260_ID_TC2, ++ .end = AT91SAM9260_ID_TC2, ++ .flags = IORESOURCE_IRQ, ++ }, ++}; ++ ++static struct platform_device at91sam9260_tcb0_device = { ++ .name = "atmel_tcb", ++ .id = 0, ++ .resource = tcb0_resources, ++ .num_resources = ARRAY_SIZE(tcb0_resources), ++}; ++ ++static struct resource tcb1_resources[] = { ++ [0] = { ++ .start = AT91SAM9260_BASE_TCB1, ++ .end = AT91SAM9260_BASE_TCB1 + SZ_16K - 1, ++ .flags = IORESOURCE_MEM, ++ }, ++ [1] = { ++ .start = AT91SAM9260_ID_TC3, ++ .end = AT91SAM9260_ID_TC3, ++ .flags = IORESOURCE_IRQ, ++ }, ++ [2] = { ++ .start = AT91SAM9260_ID_TC4, ++ .end = AT91SAM9260_ID_TC4, ++ .flags = IORESOURCE_IRQ, ++ }, ++ [3] = { ++ .start = AT91SAM9260_ID_TC5, ++ .end = AT91SAM9260_ID_TC5, ++ .flags = IORESOURCE_IRQ, ++ }, ++}; ++ ++static struct platform_device at91sam9260_tcb1_device = { ++ .name = "atmel_tcb", ++ .id = 1, ++ .resource = tcb1_resources, ++ .num_resources = ARRAY_SIZE(tcb1_resources), ++}; + +-void __init at91_init_leds(u8 cpu_led, u8 timer_led) ++static void __init at91_add_device_tc(void) + { +- /* Enable GPIO to access the LEDs */ +- at91_set_gpio_output(cpu_led, 1); +- at91_set_gpio_output(timer_led, 1); ++ /* this chip has a separate clock and irq for each TC channel */ ++ at91_clock_associate("tc0_clk", &at91sam9260_tcb0_device.dev, "t0_clk"); ++ at91_clock_associate("tc1_clk", &at91sam9260_tcb0_device.dev, "t1_clk"); ++ at91_clock_associate("tc2_clk", &at91sam9260_tcb0_device.dev, "t2_clk"); ++ platform_device_register(&at91sam9260_tcb0_device); ++ ++ at91_clock_associate("tc3_clk", &at91sam9260_tcb1_device.dev, "t0_clk"); ++ at91_clock_associate("tc4_clk", &at91sam9260_tcb1_device.dev, "t1_clk"); ++ at91_clock_associate("tc5_clk", &at91sam9260_tcb1_device.dev, "t2_clk"); ++ platform_device_register(&at91sam9260_tcb1_device); ++} ++#else ++static void __init at91_add_device_tc(void) { } ++#endif + +- at91_leds_cpu = cpu_led; +- at91_leds_timer = timer_led; ++ ++/* -------------------------------------------------------------------- ++ * RTT ++ * -------------------------------------------------------------------- */ ++ ++static struct resource rtt_resources[] = { ++ { ++ .start = AT91_BASE_SYS + AT91_RTT, ++ .end = AT91_BASE_SYS + AT91_RTT + SZ_16 - 1, ++ .flags = IORESOURCE_MEM, ++ } ++}; ++ ++static struct platform_device at91sam9260_rtt_device = { ++ .name = "at91_rtt", ++ .id = -1, ++ .resource = rtt_resources, ++ .num_resources = ARRAY_SIZE(rtt_resources), ++}; ++ ++static void __init at91_add_device_rtt(void) ++{ ++ device_init_wakeup(&at91sam9260_rtt_device.dev, 1); ++ platform_device_register(&at91sam9260_rtt_device); ++} ++ ++ ++/* -------------------------------------------------------------------- ++ * Watchdog ++ * -------------------------------------------------------------------- */ ++ ++#if defined(CONFIG_AT91SAM9_WATCHDOG) || defined(CONFIG_AT91SAM9_WATCHDOG_MODULE) ++static struct platform_device at91sam9260_wdt_device = { ++ .name = "at91_wdt", ++ .id = -1, ++ .num_resources = 0, ++}; ++ ++static void __init at91_add_device_watchdog(void) ++{ ++ platform_device_register(&at91sam9260_wdt_device); + } + #else +-void __init at91_init_leds(u8 cpu_led, u8 timer_led) {} ++static void __init at91_add_device_watchdog(void) {} ++#endif ++ ++ ++/* -------------------------------------------------------------------- ++ * SSC -- Synchronous Serial Controller ++ * -------------------------------------------------------------------- */ ++ ++#if defined(CONFIG_ATMEL_SSC) || defined(CONFIG_ATMEL_SSC_MODULE) ++static u64 ssc_dmamask = DMA_BIT_MASK(32); ++ ++static struct resource ssc_resources[] = { ++ [0] = { ++ .start = AT91SAM9260_BASE_SSC, ++ .end = AT91SAM9260_BASE_SSC + SZ_16K - 1, ++ .flags = IORESOURCE_MEM, ++ }, ++ [1] = { ++ .start = AT91SAM9260_ID_SSC, ++ .end = AT91SAM9260_ID_SSC, ++ .flags = IORESOURCE_IRQ, ++ }, ++}; ++ ++static struct platform_device at91sam9260_ssc_device = { ++ .name = "ssc", ++ .id = 0, ++ .dev = { ++ .dma_mask = &ssc_dmamask, ++ .coherent_dma_mask = DMA_BIT_MASK(32), ++ }, ++ .resource = ssc_resources, ++ .num_resources = ARRAY_SIZE(ssc_resources), ++}; ++ ++static inline void configure_ssc_pins(unsigned pins) ++{ ++ if (pins & ATMEL_SSC_TF) ++ at91_set_A_periph(AT91_PIN_PB17, 1); ++ if (pins & ATMEL_SSC_TK) ++ at91_set_A_periph(AT91_PIN_PB16, 1); ++ if (pins & ATMEL_SSC_TD) ++ at91_set_A_periph(AT91_PIN_PB18, 1); ++ if (pins & ATMEL_SSC_RD) ++ at91_set_A_periph(AT91_PIN_PB19, 1); ++ if (pins & ATMEL_SSC_RK) ++ at91_set_A_periph(AT91_PIN_PB20, 1); ++ if (pins & ATMEL_SSC_RF) ++ at91_set_A_periph(AT91_PIN_PB21, 1); ++} ++ ++/* ++ * SSC controllers are accessed through library code, instead of any ++ * kind of all-singing/all-dancing driver. For example one could be ++ * used by a particular I2S audio codec's driver, while another one ++ * on the same system might be used by a custom data capture driver. ++ */ ++void __init at91_add_device_ssc(unsigned id, unsigned pins) ++{ ++ struct platform_device *pdev; ++ ++ /* ++ * NOTE: caller is responsible for passing information matching ++ * "pins" to whatever will be using each particular controller. ++ */ ++ switch (id) { ++ case AT91SAM9260_ID_SSC: ++ pdev = &at91sam9260_ssc_device; ++ configure_ssc_pins(pins); ++ at91_clock_associate("ssc_clk", &pdev->dev, "pclk"); ++ break; ++ default: ++ return; ++ } ++ ++ platform_device_register(pdev); ++} ++ ++#else ++struct platform_device *__init at91_add_device_ssc(unsigned id, unsigned pins) {} + #endif + + +@@ -582,13 +775,15 @@ + .use_dma_rx = 0, /* DBGU not capable of receive DMA */ + .regs = (void __iomem *)(AT91_VA_BASE_SYS + AT91_DBGU), + }; ++static u64 dbgu_dmamask = DMA_BIT_MASK(32); + + static struct platform_device at91sam9260_dbgu_device = { + .name = "atmel_usart", + .id = 0, + .dev = { +- .platform_data = &dbgu_data, +- .coherent_dma_mask = 0xffffffff, ++ .dma_mask = &dbgu_dmamask, ++ .coherent_dma_mask = DMA_BIT_MASK(32), ++ .platform_data = &dbgu_data, + }, + .resource = dbgu_resources, + .num_resources = ARRAY_SIZE(dbgu_resources), +@@ -617,28 +812,37 @@ + .use_dma_tx = 1, + .use_dma_rx = 1, + }; ++static u64 uart0_dmamask = DMA_BIT_MASK(32); + + static struct platform_device at91sam9260_uart0_device = { + .name = "atmel_usart", + .id = 1, + .dev = { +- .platform_data = &uart0_data, +- .coherent_dma_mask = 0xffffffff, ++ .dma_mask = &uart0_dmamask, ++ .coherent_dma_mask = DMA_BIT_MASK(32), ++ .platform_data = &uart0_data, + }, + .resource = uart0_resources, + .num_resources = ARRAY_SIZE(uart0_resources), + }; + +-static inline void configure_usart0_pins(void) ++static inline void configure_usart0_pins(unsigned pins) + { + at91_set_A_periph(AT91_PIN_PB4, 1); /* TXD0 */ + at91_set_A_periph(AT91_PIN_PB5, 0); /* RXD0 */ +- at91_set_A_periph(AT91_PIN_PB26, 0); /* RTS0 */ +- at91_set_A_periph(AT91_PIN_PB27, 0); /* CTS0 */ +- at91_set_A_periph(AT91_PIN_PB24, 0); /* DTR0 */ +- at91_set_A_periph(AT91_PIN_PB22, 0); /* DSR0 */ +- at91_set_A_periph(AT91_PIN_PB23, 0); /* DCD0 */ +- at91_set_A_periph(AT91_PIN_PB25, 0); /* RI0 */ ++ ++ if (pins & ATMEL_UART_RTS) ++ at91_set_A_periph(AT91_PIN_PB26, 0); /* RTS0 */ ++ if (pins & ATMEL_UART_CTS) ++ at91_set_A_periph(AT91_PIN_PB27, 0); /* CTS0 */ ++ if (pins & ATMEL_UART_DTR) ++ at91_set_A_periph(AT91_PIN_PB24, 0); /* DTR0 */ ++ if (pins & ATMEL_UART_DSR) ++ at91_set_A_periph(AT91_PIN_PB22, 0); /* DSR0 */ ++ if (pins & ATMEL_UART_DCD) ++ at91_set_A_periph(AT91_PIN_PB23, 0); /* DCD0 */ ++ if (pins & ATMEL_UART_RI) ++ at91_set_A_periph(AT91_PIN_PB25, 0); /* RI0 */ + } + + static struct resource uart1_resources[] = { +@@ -658,24 +862,29 @@ + .use_dma_tx = 1, + .use_dma_rx = 1, + }; ++static u64 uart1_dmamask = DMA_BIT_MASK(32); + + static struct platform_device at91sam9260_uart1_device = { + .name = "atmel_usart", + .id = 2, + .dev = { +- .platform_data = &uart1_data, +- .coherent_dma_mask = 0xffffffff, ++ .dma_mask = &uart1_dmamask, ++ .coherent_dma_mask = DMA_BIT_MASK(32), ++ .platform_data = &uart1_data, + }, + .resource = uart1_resources, + .num_resources = ARRAY_SIZE(uart1_resources), + }; + +-static inline void configure_usart1_pins(void) ++static inline void configure_usart1_pins(unsigned pins) + { + at91_set_A_periph(AT91_PIN_PB6, 1); /* TXD1 */ + at91_set_A_periph(AT91_PIN_PB7, 0); /* RXD1 */ +- at91_set_A_periph(AT91_PIN_PB28, 0); /* RTS1 */ +- at91_set_A_periph(AT91_PIN_PB29, 0); /* CTS1 */ ++ ++ if (pins & ATMEL_UART_RTS) ++ at91_set_A_periph(AT91_PIN_PB28, 0); /* RTS1 */ ++ if (pins & ATMEL_UART_CTS) ++ at91_set_A_periph(AT91_PIN_PB29, 0); /* CTS1 */ + } + + static struct resource uart2_resources[] = { +@@ -695,22 +904,29 @@ + .use_dma_tx = 1, + .use_dma_rx = 1, + }; ++static u64 uart2_dmamask = DMA_BIT_MASK(32); + + static struct platform_device at91sam9260_uart2_device = { + .name = "atmel_usart", + .id = 3, + .dev = { +- .platform_data = &uart2_data, +- .coherent_dma_mask = 0xffffffff, ++ .dma_mask = &uart2_dmamask, ++ .coherent_dma_mask = DMA_BIT_MASK(32), ++ .platform_data = &uart2_data, + }, + .resource = uart2_resources, + .num_resources = ARRAY_SIZE(uart2_resources), + }; + +-static inline void configure_usart2_pins(void) ++static inline void configure_usart2_pins(unsigned pins) + { + at91_set_A_periph(AT91_PIN_PB8, 1); /* TXD2 */ + at91_set_A_periph(AT91_PIN_PB9, 0); /* RXD2 */ ++ ++ if (pins & ATMEL_UART_RTS) ++ at91_set_A_periph(AT91_PIN_PA4, 0); /* RTS2 */ ++ if (pins & ATMEL_UART_CTS) ++ at91_set_A_periph(AT91_PIN_PA5, 0); /* CTS2 */ + } + + static struct resource uart3_resources[] = { +@@ -730,22 +946,29 @@ + .use_dma_tx = 1, + .use_dma_rx = 1, + }; ++static u64 uart3_dmamask = DMA_BIT_MASK(32); + + static struct platform_device at91sam9260_uart3_device = { + .name = "atmel_usart", + .id = 4, + .dev = { +- .platform_data = &uart3_data, +- .coherent_dma_mask = 0xffffffff, ++ .dma_mask = &uart3_dmamask, ++ .coherent_dma_mask = DMA_BIT_MASK(32), ++ .platform_data = &uart3_data, + }, + .resource = uart3_resources, + .num_resources = ARRAY_SIZE(uart3_resources), + }; + +-static inline void configure_usart3_pins(void) ++static inline void configure_usart3_pins(unsigned pins) + { + at91_set_A_periph(AT91_PIN_PB10, 1); /* TXD3 */ + at91_set_A_periph(AT91_PIN_PB11, 0); /* RXD3 */ ++ ++ if (pins & ATMEL_UART_RTS) ++ at91_set_B_periph(AT91_PIN_PC8, 0); /* RTS3 */ ++ if (pins & ATMEL_UART_CTS) ++ at91_set_B_periph(AT91_PIN_PC10, 0); /* CTS3 */ + } + + static struct resource uart4_resources[] = { +@@ -765,13 +988,15 @@ + .use_dma_tx = 1, + .use_dma_rx = 1, + }; ++static u64 uart4_dmamask = DMA_BIT_MASK(32); + + static struct platform_device at91sam9260_uart4_device = { + .name = "atmel_usart", + .id = 5, + .dev = { +- .platform_data = &uart4_data, +- .coherent_dma_mask = 0xffffffff, ++ .dma_mask = &uart4_dmamask, ++ .coherent_dma_mask = DMA_BIT_MASK(32), ++ .platform_data = &uart4_data, + }, + .resource = uart4_resources, + .num_resources = ARRAY_SIZE(uart4_resources), +@@ -800,13 +1025,15 @@ + .use_dma_tx = 1, + .use_dma_rx = 1, + }; ++static u64 uart5_dmamask = DMA_BIT_MASK(32); + + static struct platform_device at91sam9260_uart5_device = { + .name = "atmel_usart", + .id = 6, + .dev = { +- .platform_data = &uart5_data, +- .coherent_dma_mask = 0xffffffff, ++ .dma_mask = &uart5_dmamask, ++ .coherent_dma_mask = DMA_BIT_MASK(32), ++ .platform_data = &uart5_data, + }, + .resource = uart5_resources, + .num_resources = ARRAY_SIZE(uart5_resources), +@@ -818,10 +1045,10 @@ + at91_set_A_periph(AT91_PIN_PB13, 0); /* RXD5 */ + } + +-struct platform_device *at91_uarts[ATMEL_MAX_UART]; /* the UARTs to use */ ++static struct platform_device *__initdata at91_uarts[ATMEL_MAX_UART]; /* the UARTs to use */ + struct platform_device *atmel_default_console_device; /* the serial console device */ + +-void __init at91_init_serial(struct at91_uart_config *config) ++void __init __deprecated at91_init_serial(struct at91_uart_config *config) + { + int i; + +@@ -829,22 +1056,22 @@ + for (i = 0; i < config->nr_tty; i++) { + switch (config->tty_map[i]) { + case 0: +- configure_usart0_pins(); ++ configure_usart0_pins(ATMEL_UART_CTS | ATMEL_UART_RTS | ATMEL_UART_DSR | ATMEL_UART_DTR | ATMEL_UART_DCD | ATMEL_UART_RI); + at91_uarts[i] = &at91sam9260_uart0_device; + at91_clock_associate("usart0_clk", &at91sam9260_uart0_device.dev, "usart"); + break; + case 1: +- configure_usart1_pins(); ++ configure_usart1_pins(ATMEL_UART_CTS | ATMEL_UART_RTS); + at91_uarts[i] = &at91sam9260_uart1_device; + at91_clock_associate("usart1_clk", &at91sam9260_uart1_device.dev, "usart"); + break; + case 2: +- configure_usart2_pins(); ++ configure_usart2_pins(0); + at91_uarts[i] = &at91sam9260_uart2_device; + at91_clock_associate("usart2_clk", &at91sam9260_uart2_device.dev, "usart"); + break; + case 3: +- configure_usart3_pins(); ++ configure_usart3_pins(0); + at91_uarts[i] = &at91sam9260_uart3_device; + at91_clock_associate("usart3_clk", &at91sam9260_uart3_device.dev, "usart"); + break; +@@ -876,6 +1103,63 @@ + printk(KERN_INFO "AT91: No default serial console defined.\n"); + } + ++void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins) ++{ ++ struct platform_device *pdev; ++ ++ switch (id) { ++ case 0: /* DBGU */ ++ pdev = &at91sam9260_dbgu_device; ++ configure_dbgu_pins(); ++ at91_clock_associate("mck", &pdev->dev, "usart"); ++ break; ++ case AT91SAM9260_ID_US0: ++ pdev = &at91sam9260_uart0_device; ++ configure_usart0_pins(pins); ++ at91_clock_associate("usart0_clk", &pdev->dev, "usart"); ++ break; ++ case AT91SAM9260_ID_US1: ++ pdev = &at91sam9260_uart1_device; ++ configure_usart1_pins(pins); ++ at91_clock_associate("usart1_clk", &pdev->dev, "usart"); ++ break; ++ case AT91SAM9260_ID_US2: ++ pdev = &at91sam9260_uart2_device; ++ configure_usart2_pins(pins); ++ at91_clock_associate("usart2_clk", &pdev->dev, "usart"); ++ break; ++ case AT91SAM9260_ID_US3: ++ pdev = &at91sam9260_uart3_device; ++ configure_usart3_pins(pins); ++ at91_clock_associate("usart3_clk", &pdev->dev, "usart"); ++ break; ++ case AT91SAM9260_ID_US4: ++ pdev = &at91sam9260_uart4_device; ++ configure_usart4_pins(); ++ at91_clock_associate("usart4_clk", &pdev->dev, "usart"); ++ break; ++ case AT91SAM9260_ID_US5: ++ pdev = &at91sam9260_uart5_device; ++ configure_usart5_pins(); ++ at91_clock_associate("usart5_clk", &pdev->dev, "usart"); ++ break; ++ default: ++ return; ++ } ++ pdev->id = portnr; /* update to mapped ID */ ++ ++ if (portnr < ATMEL_MAX_UART) ++ at91_uarts[portnr] = pdev; ++} ++ ++void __init at91_set_serial_console(unsigned portnr) ++{ ++ if (portnr < ATMEL_MAX_UART) ++ atmel_default_console_device = at91_uarts[portnr]; ++ if (!atmel_default_console_device) ++ printk(KERN_INFO "AT91: No default serial console defined.\n"); ++} ++ + void __init at91_add_device_serial(void) + { + int i; +@@ -886,7 +1170,9 @@ + } + } + #else +-void __init at91_init_serial(struct at91_uart_config *config) {} ++void __init __deprecated at91_init_serial(struct at91_uart_config *config) {} ++void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins) {} ++void __init at91_set_serial_console(unsigned portnr) {} + void __init at91_add_device_serial(void) {} + #endif + +@@ -898,6 +1184,9 @@ + */ + static int __init at91_add_standard_devices(void) + { ++ at91_add_device_rtt(); ++ at91_add_device_watchdog(); ++ at91_add_device_tc(); + return 0; + } + +diff -urN -x CVS linux-2.6.24/arch/arm/mach-at91/at91sam9261.c linux-2.6/arch/arm/mach-at91/at91sam9261.c +--- linux-2.6.24/arch/arm/mach-at91/at91sam9261.c 2007-10-09 22:31:38.000000000 +0200 ++++ linux-2.6/arch/arm/mach-at91/at91sam9261.c 2008-03-01 19:03:29.000000000 +0200 +@@ -11,12 +11,14 @@ + */ + + #include <linux/module.h> ++#include <linux/pm.h> + + #include <asm/mach/arch.h> + #include <asm/mach/map.h> + #include <asm/arch/at91sam9261.h> + #include <asm/arch/at91_pmc.h> + #include <asm/arch/at91_rstc.h> ++#include <asm/arch/at91_shdwc.h> + + #include "generic.h" + #include "clock.h" +@@ -245,6 +247,11 @@ + at91_sys_write(AT91_RSTC_CR, AT91_RSTC_KEY | AT91_RSTC_PROCRST | AT91_RSTC_PERRST); + } + ++static void at91sam9261_poweroff(void) ++{ ++ at91_sys_write(AT91_SHDW_CR, AT91_SHDW_KEY | AT91_SHDW_SHDW); ++} ++ + + /* -------------------------------------------------------------------- + * AT91SAM9261 processor initialization +@@ -256,6 +263,7 @@ + iotable_init(at91sam9261_io_desc, ARRAY_SIZE(at91sam9261_io_desc)); + + at91_arch_reset = at91sam9261_reset; ++ pm_power_off = at91sam9261_poweroff; + at91_extern_irq = (1 << AT91SAM9261_ID_IRQ0) | (1 << AT91SAM9261_ID_IRQ1) + | (1 << AT91SAM9261_ID_IRQ2); + +@@ -279,25 +287,25 @@ + static unsigned int at91sam9261_default_irq_priority[NR_AIC_IRQS] __initdata = { + 7, /* Advanced Interrupt Controller */ + 7, /* System Peripherals */ +- 0, /* Parallel IO Controller A */ +- 0, /* Parallel IO Controller B */ +- 0, /* Parallel IO Controller C */ ++ 1, /* Parallel IO Controller A */ ++ 1, /* Parallel IO Controller B */ ++ 1, /* Parallel IO Controller C */ + 0, +- 6, /* USART 0 */ +- 6, /* USART 1 */ +- 6, /* USART 2 */ ++ 5, /* USART 0 */ ++ 5, /* USART 1 */ ++ 5, /* USART 2 */ + 0, /* Multimedia Card Interface */ +- 4, /* USB Device Port */ +- 0, /* Two-Wire Interface */ +- 6, /* Serial Peripheral Interface 0 */ +- 6, /* Serial Peripheral Interface 1 */ +- 5, /* Serial Synchronous Controller 0 */ +- 5, /* Serial Synchronous Controller 1 */ +- 5, /* Serial Synchronous Controller 2 */ ++ 2, /* USB Device Port */ ++ 6, /* Two-Wire Interface */ ++ 5, /* Serial Peripheral Interface 0 */ ++ 5, /* Serial Peripheral Interface 1 */ ++ 4, /* Serial Synchronous Controller 0 */ ++ 4, /* Serial Synchronous Controller 1 */ ++ 4, /* Serial Synchronous Controller 2 */ + 0, /* Timer Counter 0 */ + 0, /* Timer Counter 1 */ + 0, /* Timer Counter 2 */ +- 3, /* USB Host port */ ++ 2, /* USB Host port */ + 3, /* LCD Controller */ + 0, + 0, +diff -urN -x CVS linux-2.6.24/arch/arm/mach-at91/at91sam9261_devices.c linux-2.6/arch/arm/mach-at91/at91sam9261_devices.c +--- linux-2.6.24/arch/arm/mach-at91/at91sam9261_devices.c 2008-03-01 22:02:07.000000000 +0200 ++++ linux-2.6/arch/arm/mach-at91/at91sam9261_devices.c 2008-03-01 22:09:18.000000000 +0200 +@@ -13,6 +13,7 @@ + #include <asm/mach/arch.h> + #include <asm/mach/map.h> + ++#include <linux/dma-mapping.h> + #include <linux/platform_device.h> + #include <linux/i2c-gpio.h> + +@@ -23,7 +24,7 @@ + #include <asm/arch/gpio.h> + #include <asm/arch/at91sam9261.h> + #include <asm/arch/at91sam9261_matrix.h> +-#include <asm/arch/at91sam926x_mc.h> ++#include <asm/arch/at91sam926x_smc.h> + + #include "generic.h" + +@@ -33,7 +34,7 @@ + * -------------------------------------------------------------------- */ + + #if defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE) +-static u64 ohci_dmamask = 0xffffffffUL; ++static u64 ohci_dmamask = DMA_BIT_MASK(32); + static struct at91_usbh_data usbh_data; + + static struct resource usbh_resources[] = { +@@ -54,7 +55,7 @@ + .id = -1, + .dev = { + .dma_mask = &ohci_dmamask, +- .coherent_dma_mask = 0xffffffff, ++ .coherent_dma_mask = DMA_BIT_MASK(32), + .platform_data = &usbh_data, + }, + .resource = usbh_resources, +@@ -106,8 +107,6 @@ + + void __init at91_add_device_udc(struct at91_udc_data *data) + { +- unsigned long x; +- + if (!data) + return; + +@@ -116,9 +115,7 @@ + at91_set_deglitch(data->vbus_pin, 1); + } + +- /* Pullup pin is handled internally */ +- x = at91_sys_read(AT91_MATRIX_USBPUCR); +- at91_sys_write(AT91_MATRIX_USBPUCR, x | AT91_MATRIX_USBPUCR_PUON); ++ /* Pullup pin is handled internally by USB device peripheral */ + + udc_data = *data; + platform_device_register(&at91sam9261_udc_device); +@@ -132,7 +129,7 @@ + * -------------------------------------------------------------------- */ + + #if defined(CONFIG_MMC_AT91) || defined(CONFIG_MMC_AT91_MODULE) +-static u64 mmc_dmamask = 0xffffffffUL; ++static u64 mmc_dmamask = DMA_BIT_MASK(32); + static struct at91_mmc_data mmc_data; + + static struct resource mmc_resources[] = { +@@ -153,7 +150,7 @@ + .id = -1, + .dev = { + .dma_mask = &mmc_dmamask, +- .coherent_dma_mask = 0xffffffff, ++ .coherent_dma_mask = DMA_BIT_MASK(32), + .platform_data = &mmc_data, + }, + .resource = mmc_resources, +@@ -232,7 +229,7 @@ + return; + + csa = at91_sys_read(AT91_MATRIX_EBICSA); +- at91_sys_write(AT91_MATRIX_EBICSA, csa | AT91_MATRIX_CS3A_SMC); ++ at91_sys_write(AT91_MATRIX_EBICSA, csa | AT91_MATRIX_CS3A_SMC_SMARTMEDIA); + + /* set the bus interface characteristics */ + at91_sys_write(AT91_SMC_SETUP(3), AT91_SMC_NWESETUP_(0) | AT91_SMC_NCS_WRSETUP_(0) +@@ -354,7 +351,7 @@ + * -------------------------------------------------------------------- */ + + #if defined(CONFIG_SPI_ATMEL) || defined(CONFIG_SPI_ATMEL_MODULE) +-static u64 spi_dmamask = 0xffffffffUL; ++static u64 spi_dmamask = DMA_BIT_MASK(32); + + static struct resource spi0_resources[] = { + [0] = { +@@ -374,7 +371,7 @@ + .id = 0, + .dev = { + .dma_mask = &spi_dmamask, +- .coherent_dma_mask = 0xffffffff, ++ .coherent_dma_mask = DMA_BIT_MASK(32), + }, + .resource = spi0_resources, + .num_resources = ARRAY_SIZE(spi0_resources), +@@ -400,7 +397,7 @@ + .id = 1, + .dev = { + .dma_mask = &spi_dmamask, +- .coherent_dma_mask = 0xffffffff, ++ .coherent_dma_mask = DMA_BIT_MASK(32), + }, + .resource = spi1_resources, + .num_resources = ARRAY_SIZE(spi1_resources), +@@ -466,7 +463,7 @@ + * -------------------------------------------------------------------- */ + + #if defined(CONFIG_FB_ATMEL) || defined(CONFIG_FB_ATMEL_MODULE) +-static u64 lcdc_dmamask = 0xffffffffUL; ++static u64 lcdc_dmamask = DMA_BIT_MASK(32); + static struct atmel_lcdfb_info lcdc_data; + + static struct resource lcdc_resources[] = { +@@ -494,7 +491,7 @@ + .id = 0, + .dev = { + .dma_mask = &lcdc_dmamask, +- .coherent_dma_mask = 0xffffffff, ++ .coherent_dma_mask = DMA_BIT_MASK(32), + .platform_data = &lcdc_data, + }, + .resource = lcdc_resources, +@@ -507,6 +504,17 @@ + return; + } + ++#if defined(CONFIG_FB_ATMEL_STN) ++ at91_set_A_periph(AT91_PIN_PB0, 0); /* LCDVSYNC */ ++ at91_set_A_periph(AT91_PIN_PB1, 0); /* LCDHSYNC */ ++ at91_set_A_periph(AT91_PIN_PB2, 0); /* LCDDOTCK */ ++ at91_set_A_periph(AT91_PIN_PB3, 0); /* LCDDEN */ ++ at91_set_A_periph(AT91_PIN_PB4, 0); /* LCDCC */ ++ at91_set_A_periph(AT91_PIN_PB5, 0); /* LCDD0 */ ++ at91_set_A_periph(AT91_PIN_PB6, 0); /* LCDD1 */ ++ at91_set_A_periph(AT91_PIN_PB7, 0); /* LCDD2 */ ++ at91_set_A_periph(AT91_PIN_PB8, 0); /* LCDD3 */ ++#else + at91_set_A_periph(AT91_PIN_PB1, 0); /* LCDHSYNC */ + at91_set_A_periph(AT91_PIN_PB2, 0); /* LCDDOTCK */ + at91_set_A_periph(AT91_PIN_PB3, 0); /* LCDDEN */ +@@ -529,6 +537,7 @@ + at91_set_B_periph(AT91_PIN_PB26, 0); /* LCDD21 */ + at91_set_B_periph(AT91_PIN_PB27, 0); /* LCDD22 */ + at91_set_B_periph(AT91_PIN_PB28, 0); /* LCDD23 */ ++#endif + + lcdc_data = *data; + platform_device_register(&at91_lcdc_device); +@@ -539,24 +548,270 @@ + + + /* -------------------------------------------------------------------- +- * LEDs ++ * Timer/Counter block ++ * -------------------------------------------------------------------- */ ++ ++#ifdef CONFIG_ATMEL_TCLIB ++ ++static struct resource tcb_resources[] = { ++ [0] = { ++ .start = AT91SAM9261_BASE_TCB0, ++ .end = AT91SAM9261_BASE_TCB0 + SZ_16K - 1, ++ .flags = IORESOURCE_MEM, ++ }, ++ [1] = { ++ .start = AT91SAM9261_ID_TC0, ++ .end = AT91SAM9261_ID_TC0, ++ .flags = IORESOURCE_IRQ, ++ }, ++ [2] = { ++ .start = AT91SAM9261_ID_TC1, ++ .end = AT91SAM9261_ID_TC1, ++ .flags = IORESOURCE_IRQ, ++ }, ++ [3] = { ++ .start = AT91SAM9261_ID_TC2, ++ .end = AT91SAM9261_ID_TC2, ++ .flags = IORESOURCE_IRQ, ++ }, ++}; ++ ++static struct platform_device at91sam9261_tcb_device = { ++ .name = "atmel_tcb", ++ .id = 0, ++ .resource = tcb_resources, ++ .num_resources = ARRAY_SIZE(tcb_resources), ++}; ++ ++static void __init at91_add_device_tc(void) ++{ ++ /* this chip has a separate clock and irq for each TC channel */ ++ at91_clock_associate("tc0_clk", &at91sam9261_tcb_device.dev, "t0_clk"); ++ at91_clock_associate("tc1_clk", &at91sam9261_tcb_device.dev, "t1_clk"); ++ at91_clock_associate("tc2_clk", &at91sam9261_tcb_device.dev, "t2_clk"); ++ platform_device_register(&at91sam9261_tcb_device); ++} ++#else ++static void __init at91_add_device_tc(void) { } ++#endif ++ ++ ++/* -------------------------------------------------------------------- ++ * RTT ++ * -------------------------------------------------------------------- */ ++ ++static struct resource rtt_resources[] = { ++ { ++ .start = AT91_BASE_SYS + AT91_RTT, ++ .end = AT91_BASE_SYS + AT91_RTT + SZ_16 - 1, ++ .flags = IORESOURCE_MEM, ++ } ++}; ++ ++static struct platform_device at91sam9261_rtt_device = { ++ .name = "at91_rtt", ++ .id = -1, ++ .resource = rtt_resources, ++ .num_resources = ARRAY_SIZE(rtt_resources), ++}; ++ ++static void __init at91_add_device_rtt(void) ++{ ++ device_init_wakeup(&at91sam9261_rtt_device.dev, 1); ++ platform_device_register(&at91sam9261_rtt_device); ++} ++ ++ ++/* -------------------------------------------------------------------- ++ * Watchdog ++ * -------------------------------------------------------------------- */ ++ ++#if defined(CONFIG_AT91SAM9_WATCHDOG) || defined(CONFIG_AT91SAM9_WATCHDOG_MODULE) ++static struct platform_device at91sam9261_wdt_device = { ++ .name = "at91_wdt", ++ .id = -1, ++ .num_resources = 0, ++}; ++ ++static void __init at91_add_device_watchdog(void) ++{ ++ platform_device_register(&at91sam9261_wdt_device); ++} ++#else ++static void __init at91_add_device_watchdog(void) {} ++#endif ++ ++ ++/* -------------------------------------------------------------------- ++ * SSC -- Synchronous Serial Controller + * -------------------------------------------------------------------- */ + +-#if defined(CONFIG_LEDS) +-u8 at91_leds_cpu; +-u8 at91_leds_timer; ++#if defined(CONFIG_ATMEL_SSC) || defined(CONFIG_ATMEL_SSC_MODULE) ++static u64 ssc0_dmamask = DMA_BIT_MASK(32); ++ ++static struct resource ssc0_resources[] = { ++ [0] = { ++ .start = AT91SAM9261_BASE_SSC0, ++ .end = AT91SAM9261_BASE_SSC0 + SZ_16K - 1, ++ .flags = IORESOURCE_MEM, ++ }, ++ [1] = { ++ .start = AT91SAM9261_ID_SSC0, ++ .end = AT91SAM9261_ID_SSC0, ++ .flags = IORESOURCE_IRQ, ++ }, ++}; ++ ++static struct platform_device at91sam9261_ssc0_device = { ++ .name = "ssc", ++ .id = 0, ++ .dev = { ++ .dma_mask = &ssc0_dmamask, ++ .coherent_dma_mask = DMA_BIT_MASK(32), ++ }, ++ .resource = ssc0_resources, ++ .num_resources = ARRAY_SIZE(ssc0_resources), ++}; ++ ++static inline void configure_ssc0_pins(unsigned pins) ++{ ++ if (pins & ATMEL_SSC_TF) ++ at91_set_A_periph(AT91_PIN_PB21, 1); ++ if (pins & ATMEL_SSC_TK) ++ at91_set_A_periph(AT91_PIN_PB22, 1); ++ if (pins & ATMEL_SSC_TD) ++ at91_set_A_periph(AT91_PIN_PB23, 1); ++ if (pins & ATMEL_SSC_RD) ++ at91_set_A_periph(AT91_PIN_PB24, 1); ++ if (pins & ATMEL_SSC_RK) ++ at91_set_A_periph(AT91_PIN_PB25, 1); ++ if (pins & ATMEL_SSC_RF) ++ at91_set_A_periph(AT91_PIN_PB26, 1); ++} ++ ++static u64 ssc1_dmamask = DMA_BIT_MASK(32); ++ ++static struct resource ssc1_resources[] = { ++ [0] = { ++ .start = AT91SAM9261_BASE_SSC1, ++ .end = AT91SAM9261_BASE_SSC1 + SZ_16K - 1, ++ .flags = IORESOURCE_MEM, ++ }, ++ [1] = { ++ .start = AT91SAM9261_ID_SSC1, ++ .end = AT91SAM9261_ID_SSC1, ++ .flags = IORESOURCE_IRQ, ++ }, ++}; ++ ++static struct platform_device at91sam9261_ssc1_device = { ++ .name = "ssc", ++ .id = 1, ++ .dev = { ++ .dma_mask = &ssc1_dmamask, ++ .coherent_dma_mask = DMA_BIT_MASK(32), ++ }, ++ .resource = ssc1_resources, ++ .num_resources = ARRAY_SIZE(ssc1_resources), ++}; ++ ++static inline void configure_ssc1_pins(unsigned pins) ++{ ++ if (pins & ATMEL_SSC_TF) ++ at91_set_B_periph(AT91_PIN_PA17, 1); ++ if (pins & ATMEL_SSC_TK) ++ at91_set_B_periph(AT91_PIN_PA18, 1); ++ if (pins & ATMEL_SSC_TD) ++ at91_set_B_periph(AT91_PIN_PA19, 1); ++ if (pins & ATMEL_SSC_RD) ++ at91_set_B_periph(AT91_PIN_PA20, 1); ++ if (pins & ATMEL_SSC_RK) ++ at91_set_B_periph(AT91_PIN_PA21, 1); ++ if (pins & ATMEL_SSC_RF) ++ at91_set_B_periph(AT91_PIN_PA22, 1); ++} ++ ++static u64 ssc2_dmamask = DMA_BIT_MASK(32); ++ ++static struct resource ssc2_resources[] = { ++ [0] = { ++ .start = AT91SAM9261_BASE_SSC2, ++ .end = AT91SAM9261_BASE_SSC2 + SZ_16K - 1, ++ .flags = IORESOURCE_MEM, ++ }, ++ [1] = { ++ .start = AT91SAM9261_ID_SSC2, ++ .end = AT91SAM9261_ID_SSC2, ++ .flags = IORESOURCE_IRQ, ++ }, ++}; ++ ++static struct platform_device at91sam9261_ssc2_device = { ++ .name = "ssc", ++ .id = 2, ++ .dev = { ++ .dma_mask = &ssc2_dmamask, ++ .coherent_dma_mask = DMA_BIT_MASK(32), ++ }, ++ .resource = ssc2_resources, ++ .num_resources = ARRAY_SIZE(ssc2_resources), ++}; + +-void __init at91_init_leds(u8 cpu_led, u8 timer_led) ++static inline void configure_ssc2_pins(unsigned pins) + { +- /* Enable GPIO to access the LEDs */ +- at91_set_gpio_output(cpu_led, 1); +- at91_set_gpio_output(timer_led, 1); ++ if (pins & ATMEL_SSC_TF) ++ at91_set_B_periph(AT91_PIN_PC25, 1); ++ if (pins & ATMEL_SSC_TK) ++ at91_set_B_periph(AT91_PIN_PC26, 1); ++ if (pins & ATMEL_SSC_TD) ++ at91_set_B_periph(AT91_PIN_PC27, 1); ++ if (pins & ATMEL_SSC_RD) ++ at91_set_B_periph(AT91_PIN_PC28, 1); ++ if (pins & ATMEL_SSC_RK) ++ at91_set_B_periph(AT91_PIN_PC29, 1); ++ if (pins & ATMEL_SSC_RF) ++ at91_set_B_periph(AT91_PIN_PC30, 1); ++} ++ ++/* ++ * SSC controllers are accessed through library code, instead of any ++ * kind of all-singing/all-dancing driver. For example one could be ++ * used by a particular I2S audio codec's driver, while another one ++ * on the same system might be used by a custom data capture driver. ++ */ ++void __init at91_add_device_ssc(unsigned id, unsigned pins) ++{ ++ struct platform_device *pdev; ++ ++ /* ++ * NOTE: caller is responsible for passing information matching ++ * "pins" to whatever will be using each particular controller. ++ */ ++ switch (id) { ++ case AT91SAM9261_ID_SSC0: ++ pdev = &at91sam9261_ssc0_device; ++ configure_ssc0_pins(pins); ++ at91_clock_associate("ssc0_clk", &pdev->dev, "pclk"); ++ break; ++ case AT91SAM9261_ID_SSC1: ++ pdev = &at91sam9261_ssc1_device; ++ configure_ssc1_pins(pins); ++ at91_clock_associate("ssc1_clk", &pdev->dev, "pclk"); ++ break; ++ case AT91SAM9261_ID_SSC2: ++ pdev = &at91sam9261_ssc2_device; ++ configure_ssc2_pins(pins); ++ at91_clock_associate("ssc2_clk", &pdev->dev, "pclk"); ++ break; ++ default: ++ return; ++ } + +- at91_leds_cpu = cpu_led; +- at91_leds_timer = timer_led; ++ platform_device_register(pdev); + } ++ + #else +-void __init at91_init_leds(u8 cpu_led, u8 timer_led) {} ++struct platform_device *__init at91_add_device_ssc(unsigned id, unsigned pins) {} + #endif + + +@@ -583,13 +838,15 @@ + .use_dma_rx = 0, /* DBGU not capable of receive DMA */ + .regs = (void __iomem *)(AT91_VA_BASE_SYS + AT91_DBGU), + }; ++static u64 dbgu_dmamask = DMA_BIT_MASK(32); + + static struct platform_device at91sam9261_dbgu_device = { + .name = "atmel_usart", + .id = 0, + .dev = { +- .platform_data = &dbgu_data, +- .coherent_dma_mask = 0xffffffff, ++ .dma_mask = &dbgu_dmamask, ++ .coherent_dma_mask = DMA_BIT_MASK(32), ++ .platform_data = &dbgu_data, + }, + .resource = dbgu_resources, + .num_resources = ARRAY_SIZE(dbgu_resources), +@@ -618,24 +875,29 @@ + .use_dma_tx = 1, + .use_dma_rx = 1, + }; ++static u64 uart0_dmamask = DMA_BIT_MASK(32); + + static struct platform_device at91sam9261_uart0_device = { + .name = "atmel_usart", + .id = 1, + .dev = { +- .platform_data = &uart0_data, +- .coherent_dma_mask = 0xffffffff, ++ .dma_mask = &uart0_dmamask, ++ .coherent_dma_mask = DMA_BIT_MASK(32), ++ .platform_data = &uart0_data, + }, + .resource = uart0_resources, + .num_resources = ARRAY_SIZE(uart0_resources), + }; + +-static inline void configure_usart0_pins(void) ++static inline void configure_usart0_pins(unsigned pins) + { + at91_set_A_periph(AT91_PIN_PC8, 1); /* TXD0 */ + at91_set_A_periph(AT91_PIN_PC9, 0); /* RXD0 */ +- at91_set_A_periph(AT91_PIN_PC10, 0); /* RTS0 */ +- at91_set_A_periph(AT91_PIN_PC11, 0); /* CTS0 */ ++ ++ if (pins & ATMEL_UART_RTS) ++ at91_set_A_periph(AT91_PIN_PC10, 0); /* RTS0 */ ++ if (pins & ATMEL_UART_CTS) ++ at91_set_A_periph(AT91_PIN_PC11, 0); /* CTS0 */ + } + + static struct resource uart1_resources[] = { +@@ -655,22 +917,29 @@ + .use_dma_tx = 1, + .use_dma_rx = 1, + }; ++static u64 uart1_dmamask = DMA_BIT_MASK(32); + + static struct platform_device at91sam9261_uart1_device = { + .name = "atmel_usart", + .id = 2, + .dev = { +- .platform_data = &uart1_data, +- .coherent_dma_mask = 0xffffffff, ++ .dma_mask = &uart1_dmamask, ++ .coherent_dma_mask = DMA_BIT_MASK(32), ++ .platform_data = &uart1_data, + }, + .resource = uart1_resources, + .num_resources = ARRAY_SIZE(uart1_resources), + }; + +-static inline void configure_usart1_pins(void) ++static inline void configure_usart1_pins(unsigned pins) + { + at91_set_A_periph(AT91_PIN_PC12, 1); /* TXD1 */ + at91_set_A_periph(AT91_PIN_PC13, 0); /* RXD1 */ ++ ++ if (pins & ATMEL_UART_RTS) ++ at91_set_B_periph(AT91_PIN_PA12, 0); /* RTS1 */ ++ if (pins & ATMEL_UART_CTS) ++ at91_set_B_periph(AT91_PIN_PA13, 0); /* CTS1 */ + } + + static struct resource uart2_resources[] = { +@@ -690,28 +959,35 @@ + .use_dma_tx = 1, + .use_dma_rx = 1, + }; ++static u64 uart2_dmamask = DMA_BIT_MASK(32); + + static struct platform_device at91sam9261_uart2_device = { + .name = "atmel_usart", + .id = 3, + .dev = { +- .platform_data = &uart2_data, +- .coherent_dma_mask = 0xffffffff, ++ .dma_mask = &uart2_dmamask, ++ .coherent_dma_mask = DMA_BIT_MASK(32), ++ .platform_data = &uart2_data, + }, + .resource = uart2_resources, + .num_resources = ARRAY_SIZE(uart2_resources), + }; + +-static inline void configure_usart2_pins(void) ++static inline void configure_usart2_pins(unsigned pins) + { + at91_set_A_periph(AT91_PIN_PC15, 0); /* RXD2 */ + at91_set_A_periph(AT91_PIN_PC14, 1); /* TXD2 */ ++ ++ if (pins & ATMEL_UART_RTS) ++ at91_set_B_periph(AT91_PIN_PA15, 0); /* RTS2*/ ++ if (pins & ATMEL_UART_CTS) ++ at91_set_B_periph(AT91_PIN_PA16, 0); /* CTS2 */ + } + +-struct platform_device *at91_uarts[ATMEL_MAX_UART]; /* the UARTs to use */ ++static struct platform_device *__initdata at91_uarts[ATMEL_MAX_UART]; /* the UARTs to use */ + struct platform_device *atmel_default_console_device; /* the serial console device */ + +-void __init at91_init_serial(struct at91_uart_config *config) ++void __init __deprecated at91_init_serial(struct at91_uart_config *config) + { + int i; + +@@ -719,17 +995,17 @@ + for (i = 0; i < config->nr_tty; i++) { + switch (config->tty_map[i]) { + case 0: +- configure_usart0_pins(); ++ configure_usart0_pins(ATMEL_UART_CTS | ATMEL_UART_RTS); + at91_uarts[i] = &at91sam9261_uart0_device; + at91_clock_associate("usart0_clk", &at91sam9261_uart0_device.dev, "usart"); + break; + case 1: +- configure_usart1_pins(); ++ configure_usart1_pins(0); + at91_uarts[i] = &at91sam9261_uart1_device; + at91_clock_associate("usart1_clk", &at91sam9261_uart1_device.dev, "usart"); + break; + case 2: +- configure_usart2_pins(); ++ configure_usart2_pins(0); + at91_uarts[i] = &at91sam9261_uart2_device; + at91_clock_associate("usart2_clk", &at91sam9261_uart2_device.dev, "usart"); + break; +@@ -751,6 +1027,48 @@ + printk(KERN_INFO "AT91: No default serial console defined.\n"); + } + ++void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins) ++{ ++ struct platform_device *pdev; ++ ++ switch (id) { ++ case 0: /* DBGU */ ++ pdev = &at91sam9261_dbgu_device; ++ configure_dbgu_pins(); ++ at91_clock_associate("mck", &pdev->dev, "usart"); ++ break; ++ case AT91SAM9261_ID_US0: ++ pdev = &at91sam9261_uart0_device; ++ configure_usart0_pins(pins); ++ at91_clock_associate("usart0_clk", &pdev->dev, "usart"); ++ break; ++ case AT91SAM9261_ID_US1: ++ pdev = &at91sam9261_uart1_device; ++ configure_usart1_pins(pins); ++ at91_clock_associate("usart1_clk", &pdev->dev, "usart"); ++ break; ++ case AT91SAM9261_ID_US2: ++ pdev = &at91sam9261_uart2_device; ++ configure_usart2_pins(pins); ++ at91_clock_associate("usart2_clk", &pdev->dev, "usart"); ++ break; ++ default: ++ return; ++ } ++ pdev->id = portnr; /* update to mapped ID */ ++ ++ if (portnr < ATMEL_MAX_UART) ++ at91_uarts[portnr] = pdev; ++} ++ ++void __init at91_set_serial_console(unsigned portnr) ++{ ++ if (portnr < ATMEL_MAX_UART) ++ atmel_default_console_device = at91_uarts[portnr]; ++ if (!atmel_default_console_device) ++ printk(KERN_INFO "AT91: No default serial console defined.\n"); ++} ++ + void __init at91_add_device_serial(void) + { + int i; +@@ -761,7 +1079,9 @@ + } + } + #else +-void __init at91_init_serial(struct at91_uart_config *config) {} ++void __init __deprecated at91_init_serial(struct at91_uart_config *config) {} ++void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins) {} ++void __init at91_set_serial_console(unsigned portnr) {} + void __init at91_add_device_serial(void) {} + #endif + +@@ -774,6 +1094,9 @@ + */ + static int __init at91_add_standard_devices(void) + { ++ at91_add_device_rtt(); ++ at91_add_device_watchdog(); ++ at91_add_device_tc(); + return 0; + } + +diff -urN -x CVS linux-2.6.24/arch/arm/mach-at91/at91sam9263.c linux-2.6/arch/arm/mach-at91/at91sam9263.c +--- linux-2.6.24/arch/arm/mach-at91/at91sam9263.c 2007-10-09 22:31:38.000000000 +0200 ++++ linux-2.6/arch/arm/mach-at91/at91sam9263.c 2008-03-01 19:03:55.000000000 +0200 +@@ -11,12 +11,14 @@ + */ + + #include <linux/module.h> ++#include <linux/pm.h> + + #include <asm/mach/arch.h> + #include <asm/mach/map.h> + #include <asm/arch/at91sam9263.h> + #include <asm/arch/at91_pmc.h> + #include <asm/arch/at91_rstc.h> ++#include <asm/arch/at91_shdwc.h> + + #include "generic.h" + #include "clock.h" +@@ -271,6 +273,11 @@ + at91_sys_write(AT91_RSTC_CR, AT91_RSTC_KEY | AT91_RSTC_PROCRST | AT91_RSTC_PERRST); + } + ++static void at91sam9263_poweroff(void) ++{ ++ at91_sys_write(AT91_SHDW_CR, AT91_SHDW_KEY | AT91_SHDW_SHDW); ++} ++ + + /* -------------------------------------------------------------------- + * AT91SAM9263 processor initialization +@@ -282,6 +289,7 @@ + iotable_init(at91sam9263_io_desc, ARRAY_SIZE(at91sam9263_io_desc)); + + at91_arch_reset = at91sam9263_reset; ++ pm_power_off = at91sam9263_poweroff; + at91_extern_irq = (1 << AT91SAM9263_ID_IRQ0) | (1 << AT91SAM9263_ID_IRQ1); + + /* Init clock subsystem */ +@@ -304,34 +312,34 @@ + static unsigned int at91sam9263_default_irq_priority[NR_AIC_IRQS] __initdata = { + 7, /* Advanced Interrupt Controller (FIQ) */ + 7, /* System Peripherals */ +- 0, /* Parallel IO Controller A */ +- 0, /* Parallel IO Controller B */ +- 0, /* Parallel IO Controller C, D and E */ ++ 1, /* Parallel IO Controller A */ ++ 1, /* Parallel IO Controller B */ ++ 1, /* Parallel IO Controller C, D and E */ + 0, + 0, +- 6, /* USART 0 */ +- 6, /* USART 1 */ +- 6, /* USART 2 */ ++ 5, /* USART 0 */ ++ 5, /* USART 1 */ ++ 5, /* USART 2 */ + 0, /* Multimedia Card Interface 0 */ + 0, /* Multimedia Card Interface 1 */ +- 4, /* CAN */ +- 0, /* Two-Wire Interface */ +- 6, /* Serial Peripheral Interface 0 */ +- 6, /* Serial Peripheral Interface 1 */ +- 5, /* Serial Synchronous Controller 0 */ +- 5, /* Serial Synchronous Controller 1 */ +- 6, /* AC97 Controller */ ++ 3, /* CAN */ ++ 6, /* Two-Wire Interface */ ++ 5, /* Serial Peripheral Interface 0 */ ++ 5, /* Serial Peripheral Interface 1 */ ++ 4, /* Serial Synchronous Controller 0 */ ++ 4, /* Serial Synchronous Controller 1 */ ++ 5, /* AC97 Controller */ + 0, /* Timer Counter 0, 1 and 2 */ + 0, /* Pulse Width Modulation Controller */ + 3, /* Ethernet */ + 0, + 0, /* 2D Graphic Engine */ +- 3, /* USB Device Port */ ++ 2, /* USB Device Port */ + 0, /* Image Sensor Interface */ + 3, /* LDC Controller */ + 0, /* DMA Controller */ + 0, +- 3, /* USB Host port */ ++ 2, /* USB Host port */ + 0, /* Advanced Interrupt Controller (IRQ0) */ + 0, /* Advanced Interrupt Controller (IRQ1) */ + }; +diff -urN -x CVS linux-2.6.24/arch/arm/mach-at91/at91sam9263_devices.c linux-2.6/arch/arm/mach-at91/at91sam9263_devices.c +--- linux-2.6.24/arch/arm/mach-at91/at91sam9263_devices.c 2008-03-01 22:02:07.000000000 +0200 ++++ linux-2.6/arch/arm/mach-at91/at91sam9263_devices.c 2008-03-01 22:09:36.000000000 +0200 +@@ -12,6 +12,7 @@ + #include <asm/mach/arch.h> + #include <asm/mach/map.h> + ++#include <linux/dma-mapping.h> + #include <linux/platform_device.h> + #include <linux/i2c-gpio.h> + +@@ -21,7 +22,7 @@ + #include <asm/arch/board.h> + #include <asm/arch/gpio.h> + #include <asm/arch/at91sam9263.h> +-#include <asm/arch/at91sam926x_mc.h> ++#include <asm/arch/at91sam926x_smc.h> + #include <asm/arch/at91sam9263_matrix.h> + + #include "generic.h" +@@ -32,7 +33,7 @@ + * -------------------------------------------------------------------- */ + + #if defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE) +-static u64 ohci_dmamask = 0xffffffffUL; ++static u64 ohci_dmamask = DMA_BIT_MASK(32); + static struct at91_usbh_data usbh_data; + + static struct resource usbh_resources[] = { +@@ -53,7 +54,7 @@ + .id = -1, + .dev = { + .dma_mask = &ohci_dmamask, +- .coherent_dma_mask = 0xffffffff, ++ .coherent_dma_mask = DMA_BIT_MASK(32), + .platform_data = &usbh_data, + }, + .resource = usbh_resources, +@@ -136,7 +137,7 @@ + * -------------------------------------------------------------------- */ + + #if defined(CONFIG_MACB) || defined(CONFIG_MACB_MODULE) +-static u64 eth_dmamask = 0xffffffffUL; ++static u64 eth_dmamask = DMA_BIT_MASK(32); + static struct at91_eth_data eth_data; + + static struct resource eth_resources[] = { +@@ -157,7 +158,7 @@ + .id = -1, + .dev = { + .dma_mask = ð_dmamask, +- .coherent_dma_mask = 0xffffffff, ++ .coherent_dma_mask = DMA_BIT_MASK(32), + .platform_data = ð_data, + }, + .resource = eth_resources, +@@ -210,7 +211,7 @@ + * -------------------------------------------------------------------- */ + + #if defined(CONFIG_MMC_AT91) || defined(CONFIG_MMC_AT91_MODULE) +-static u64 mmc_dmamask = 0xffffffffUL; ++static u64 mmc_dmamask = DMA_BIT_MASK(32); + static struct at91_mmc_data mmc0_data, mmc1_data; + + static struct resource mmc0_resources[] = { +@@ -231,7 +232,7 @@ + .id = 0, + .dev = { + .dma_mask = &mmc_dmamask, +- .coherent_dma_mask = 0xffffffff, ++ .coherent_dma_mask = DMA_BIT_MASK(32), + .platform_data = &mmc0_data, + }, + .resource = mmc0_resources, +@@ -256,7 +257,7 @@ + .id = 1, + .dev = { + .dma_mask = &mmc_dmamask, +- .coherent_dma_mask = 0xffffffff, ++ .coherent_dma_mask = DMA_BIT_MASK(32), + .platform_data = &mmc1_data, + }, + .resource = mmc1_resources, +@@ -357,10 +358,15 @@ + #define NAND_BASE AT91_CHIPSELECT_3 + + static struct resource nand_resources[] = { +- { ++ [0] = { + .start = NAND_BASE, + .end = NAND_BASE + SZ_256M - 1, + .flags = IORESOURCE_MEM, ++ }, ++ [1] = { ++ .start = AT91_BASE_SYS + AT91_ECC0, ++ .end = AT91_BASE_SYS + AT91_ECC0 + SZ_512 - 1, ++ .flags = IORESOURCE_MEM, + } + }; + +@@ -382,7 +388,7 @@ + return; + + csa = at91_sys_read(AT91_MATRIX_EBI0CSA); +- at91_sys_write(AT91_MATRIX_EBI0CSA, csa | AT91_MATRIX_EBI0_CS3A_SMC); ++ at91_sys_write(AT91_MATRIX_EBI0CSA, csa | AT91_MATRIX_EBI0_CS3A_SMC_SMARTMEDIA); + + /* set the bus interface characteristics */ + at91_sys_write(AT91_SMC_SETUP(3), AT91_SMC_NWESETUP_(0) | AT91_SMC_NCS_WRSETUP_(0) +@@ -500,7 +506,7 @@ + * -------------------------------------------------------------------- */ + + #if defined(CONFIG_SPI_ATMEL) || defined(CONFIG_SPI_ATMEL_MODULE) +-static u64 spi_dmamask = 0xffffffffUL; ++static u64 spi_dmamask = DMA_BIT_MASK(32); + + static struct resource spi0_resources[] = { + [0] = { +@@ -520,7 +526,7 @@ + .id = 0, + .dev = { + .dma_mask = &spi_dmamask, +- .coherent_dma_mask = 0xffffffff, ++ .coherent_dma_mask = DMA_BIT_MASK(32), + }, + .resource = spi0_resources, + .num_resources = ARRAY_SIZE(spi0_resources), +@@ -546,7 +552,7 @@ + .id = 1, + .dev = { + .dma_mask = &spi_dmamask, +- .coherent_dma_mask = 0xffffffff, ++ .coherent_dma_mask = DMA_BIT_MASK(32), + }, + .resource = spi1_resources, + .num_resources = ARRAY_SIZE(spi1_resources), +@@ -612,7 +618,7 @@ + * -------------------------------------------------------------------- */ + + #if defined(CONFIG_SND_AT91_AC97) || defined(CONFIG_SND_AT91_AC97_MODULE) +-static u64 ac97_dmamask = 0xffffffffUL; ++static u64 ac97_dmamask = DMA_BIT_MASK(32); + static struct atmel_ac97_data ac97_data; + + static struct resource ac97_resources[] = { +@@ -633,7 +639,7 @@ + .id = 1, + .dev = { + .dma_mask = &ac97_dmamask, +- .coherent_dma_mask = 0xffffffff, ++ .coherent_dma_mask = DMA_BIT_MASK(32), + .platform_data = &ac97_data, + }, + .resource = ac97_resources, +@@ -663,11 +669,61 @@ + + + /* -------------------------------------------------------------------- ++ * Image Sensor Interface ++ * -------------------------------------------------------------------- */ ++ ++#if defined(CONFIG_VIDEO_AT91_ISI) || defined(CONFIG_VIDEO_AT91_ISI_MODULE) ++ ++struct resource isi_resources[] = { ++ [0] = { ++ .start = AT91SAM9263_BASE_ISI, ++ .end = AT91SAM9263_BASE_ISI + SZ_16K - 1, ++ .flags = IORESOURCE_MEM, ++ }, ++ [1] = { ++ .start = AT91SAM9263_ID_ISI, ++ .end = AT91SAM9263_ID_ISI, ++ .flags = IORESOURCE_IRQ, ++ }, ++}; ++ ++static struct platform_device at91sam9263_isi_device = { ++ .name = "at91_isi", ++ .id = -1, ++ .resource = isi_resources, ++ .num_resources = ARRAY_SIZE(isi_resources), ++}; ++ ++void __init at91_add_device_isi(void) ++{ ++ at91_set_A_periph(AT91_PIN_PE0, 0); /* ISI_D0 */ ++ at91_set_A_periph(AT91_PIN_PE1, 0); /* ISI_D1 */ ++ at91_set_A_periph(AT91_PIN_PE2, 0); /* ISI_D2 */ ++ at91_set_A_periph(AT91_PIN_PE3, 0); /* ISI_D3 */ ++ at91_set_A_periph(AT91_PIN_PE4, 0); /* ISI_D4 */ ++ at91_set_A_periph(AT91_PIN_PE5, 0); /* ISI_D5 */ ++ at91_set_A_periph(AT91_PIN_PE6, 0); /* ISI_D6 */ ++ at91_set_A_periph(AT91_PIN_PE7, 0); /* ISI_D7 */ ++ at91_set_A_periph(AT91_PIN_PE8, 0); /* ISI_PCK */ ++ at91_set_A_periph(AT91_PIN_PE9, 0); /* ISI_HSYNC */ ++ at91_set_A_periph(AT91_PIN_PE10, 0); /* ISI_VSYNC */ ++ at91_set_B_periph(AT91_PIN_PE11, 0); /* ISI_MCK (PCK3) */ ++ at91_set_B_periph(AT91_PIN_PE12, 0); /* ISI_PD8 */ ++ at91_set_B_periph(AT91_PIN_PE13, 0); /* ISI_PD9 */ ++ at91_set_B_periph(AT91_PIN_PE14, 0); /* ISI_PD10 */ ++ at91_set_B_periph(AT91_PIN_PE15, 0); /* ISI_PD11 */ ++} ++#else ++void __init at91_add_device_isi(void) {} ++#endif ++ ++ ++/* -------------------------------------------------------------------- + * LCD Controller + * -------------------------------------------------------------------- */ + + #if defined(CONFIG_FB_ATMEL) || defined(CONFIG_FB_ATMEL_MODULE) +-static u64 lcdc_dmamask = 0xffffffffUL; ++static u64 lcdc_dmamask = DMA_BIT_MASK(32); + static struct atmel_lcdfb_info lcdc_data; + + static struct resource lcdc_resources[] = { +@@ -688,7 +744,7 @@ + .id = 0, + .dev = { + .dma_mask = &lcdc_dmamask, +- .coherent_dma_mask = 0xffffffff, ++ .coherent_dma_mask = DMA_BIT_MASK(32), + .platform_data = &lcdc_data, + }, + .resource = lcdc_resources, +@@ -732,24 +788,227 @@ + + + /* -------------------------------------------------------------------- +- * LEDs ++ * Timer/Counter block ++ * -------------------------------------------------------------------- */ ++ ++#ifdef CONFIG_ATMEL_TCLIB ++ ++static struct resource tcb_resources[] = { ++ [0] = { ++ .start = AT91SAM9263_BASE_TCB0, ++ .end = AT91SAM9263_BASE_TCB0 + SZ_16K - 1, ++ .flags = IORESOURCE_MEM, ++ }, ++ [1] = { ++ .start = AT91SAM9263_ID_TCB, ++ .end = AT91SAM9263_ID_TCB, ++ .flags = IORESOURCE_IRQ, ++ }, ++}; ++ ++static struct platform_device at91sam9263_tcb_device = { ++ .name = "atmel_tcb", ++ .id = 0, ++ .resource = tcb_resources, ++ .num_resources = ARRAY_SIZE(tcb_resources), ++}; ++ ++static void __init at91_add_device_tc(void) ++{ ++ /* this chip has one clock and irq for all three TC channels */ ++ at91_clock_associate("tcb_clk", &at91sam9263_tcb_device.dev, "t0_clk"); ++ platform_device_register(&at91sam9263_tcb_device); ++} ++#else ++static void __init at91_add_device_tc(void) { } ++#endif ++ ++/* -------------------------------------------------------------------- ++ * RTT ++ * -------------------------------------------------------------------- */ ++ ++static struct resource rtt0_resources[] = { ++ { ++ .start = AT91_BASE_SYS + AT91_RTT0, ++ .end = AT91_BASE_SYS + AT91_RTT0 + SZ_16 - 1, ++ .flags = IORESOURCE_MEM, ++ } ++}; ++ ++static struct platform_device at91sam9263_rtt0_device = { ++ .name = "at91_rtt", ++ .id = 0, ++ .resource = rtt0_resources, ++ .num_resources = ARRAY_SIZE(rtt0_resources), ++}; ++ ++static struct resource rtt1_resources[] = { ++ { ++ .start = AT91_BASE_SYS + AT91_RTT1, ++ .end = AT91_BASE_SYS + AT91_RTT1 + SZ_16 - 1, ++ .flags = IORESOURCE_MEM, ++ } ++}; ++ ++static struct platform_device at91sam9263_rtt1_device = { ++ .name = "at91_rtt", ++ .id = 1, ++ .resource = rtt1_resources, ++ .num_resources = ARRAY_SIZE(rtt1_resources), ++}; ++ ++static void __init at91_add_device_rtt(void) ++{ ++ device_init_wakeup(&at91sam9263_rtt0_device.dev, 1); ++ platform_device_register(&at91sam9263_rtt0_device); ++ device_init_wakeup(&at91sam9263_rtt1_device.dev, 1); ++ platform_device_register(&at91sam9263_rtt1_device); ++} ++ ++ ++/* -------------------------------------------------------------------- ++ * Watchdog ++ * -------------------------------------------------------------------- */ ++ ++#if defined(CONFIG_AT91SAM9_WATCHDOG) || defined(CONFIG_AT91SAM9_WATCHDOG_MODULE) ++static struct platform_device at91sam9263_wdt_device = { ++ .name = "at91_wdt", ++ .id = -1, ++ .num_resources = 0, ++}; ++ ++static void __init at91_add_device_watchdog(void) ++{ ++ platform_device_register(&at91sam9263_wdt_device); ++} ++#else ++static void __init at91_add_device_watchdog(void) {} ++#endif ++ ++ ++/* -------------------------------------------------------------------- ++ * SSC -- Synchronous Serial Controller + * -------------------------------------------------------------------- */ + +-#if defined(CONFIG_LEDS) +-u8 at91_leds_cpu; +-u8 at91_leds_timer; ++#if defined(CONFIG_ATMEL_SSC) || defined(CONFIG_ATMEL_SSC_MODULE) ++static u64 ssc0_dmamask = DMA_BIT_MASK(32); + +-void __init at91_init_leds(u8 cpu_led, u8 timer_led) ++static struct resource ssc0_resources[] = { ++ [0] = { ++ .start = AT91SAM9263_BASE_SSC0, ++ .end = AT91SAM9263_BASE_SSC0 + SZ_16K - 1, ++ .flags = IORESOURCE_MEM, ++ }, ++ [1] = { ++ .start = AT91SAM9263_ID_SSC0, ++ .end = AT91SAM9263_ID_SSC0, ++ .flags = IORESOURCE_IRQ, ++ }, ++}; ++ ++static struct platform_device at91sam9263_ssc0_device = { ++ .name = "ssc", ++ .id = 0, ++ .dev = { ++ .dma_mask = &ssc0_dmamask, ++ .coherent_dma_mask = DMA_BIT_MASK(32), ++ }, ++ .resource = ssc0_resources, ++ .num_resources = ARRAY_SIZE(ssc0_resources), ++}; ++ ++static inline void configure_ssc0_pins(unsigned pins) + { +- /* Enable GPIO to access the LEDs */ +- at91_set_gpio_output(cpu_led, 1); +- at91_set_gpio_output(timer_led, 1); ++ if (pins & ATMEL_SSC_TF) ++ at91_set_B_periph(AT91_PIN_PB0, 1); ++ if (pins & ATMEL_SSC_TK) ++ at91_set_B_periph(AT91_PIN_PB1, 1); ++ if (pins & ATMEL_SSC_TD) ++ at91_set_B_periph(AT91_PIN_PB2, 1); ++ if (pins & ATMEL_SSC_RD) ++ at91_set_B_periph(AT91_PIN_PB3, 1); ++ if (pins & ATMEL_SSC_RK) ++ at91_set_B_periph(AT91_PIN_PB4, 1); ++ if (pins & ATMEL_SSC_RF) ++ at91_set_B_periph(AT91_PIN_PB5, 1); ++} ++ ++static u64 ssc1_dmamask = DMA_BIT_MASK(32); + +- at91_leds_cpu = cpu_led; +- at91_leds_timer = timer_led; ++static struct resource ssc1_resources[] = { ++ [0] = { ++ .start = AT91SAM9263_BASE_SSC1, ++ .end = AT91SAM9263_BASE_SSC1 + SZ_16K - 1, ++ .flags = IORESOURCE_MEM, ++ }, ++ [1] = { ++ .start = AT91SAM9263_ID_SSC1, ++ .end = AT91SAM9263_ID_SSC1, ++ .flags = IORESOURCE_IRQ, ++ }, ++}; ++ ++static struct platform_device at91sam9263_ssc1_device = { ++ .name = "ssc", ++ .id = 1, ++ .dev = { ++ .dma_mask = &ssc1_dmamask, ++ .coherent_dma_mask = DMA_BIT_MASK(32), ++ }, ++ .resource = ssc1_resources, ++ .num_resources = ARRAY_SIZE(ssc1_resources), ++}; ++ ++static inline void configure_ssc1_pins(unsigned pins) ++{ ++ if (pins & ATMEL_SSC_TF) ++ at91_set_A_periph(AT91_PIN_PB6, 1); ++ if (pins & ATMEL_SSC_TK) ++ at91_set_A_periph(AT91_PIN_PB7, 1); ++ if (pins & ATMEL_SSC_TD) ++ at91_set_A_periph(AT91_PIN_PB8, 1); ++ if (pins & ATMEL_SSC_RD) ++ at91_set_A_periph(AT91_PIN_PB9, 1); ++ if (pins & ATMEL_SSC_RK) ++ at91_set_A_periph(AT91_PIN_PB10, 1); ++ if (pins & ATMEL_SSC_RF) ++ at91_set_A_periph(AT91_PIN_PB11, 1); ++} ++ ++/* ++ * SSC controllers are accessed through library code, instead of any ++ * kind of all-singing/all-dancing driver. For example one could be ++ * used by a particular I2S audio codec's driver, while another one ++ * on the same system might be used by a custom data capture driver. ++ */ ++void __init at91_add_device_ssc(unsigned id, unsigned pins) ++{ ++ struct platform_device *pdev; ++ ++ /* ++ * NOTE: caller is responsible for passing information matching ++ * "pins" to whatever will be using each particular controller. ++ */ ++ switch (id) { ++ case AT91SAM9263_ID_SSC0: ++ pdev = &at91sam9263_ssc0_device; ++ configure_ssc0_pins(pins); ++ at91_clock_associate("ssc0_clk", &pdev->dev, "pclk"); ++ break; ++ case AT91SAM9263_ID_SSC1: ++ pdev = &at91sam9263_ssc1_device; ++ configure_ssc1_pins(pins); ++ at91_clock_associate("ssc1_clk", &pdev->dev, "pclk"); ++ break; ++ default: ++ return; ++ } ++ ++ platform_device_register(pdev); + } ++ + #else +-void __init at91_init_leds(u8 cpu_led, u8 timer_led) {} ++struct platform_device *__init at91_add_device_ssc(unsigned id, unsigned pins) {} + #endif + + +@@ -777,13 +1036,15 @@ + .use_dma_rx = 0, /* DBGU not capable of receive DMA */ + .regs = (void __iomem *)(AT91_VA_BASE_SYS + AT91_DBGU), + }; ++static u64 dbgu_dmamask = DMA_BIT_MASK(32); + + static struct platform_device at91sam9263_dbgu_device = { + .name = "atmel_usart", + .id = 0, + .dev = { +- .platform_data = &dbgu_data, +- .coherent_dma_mask = 0xffffffff, ++ .dma_mask = &dbgu_dmamask, ++ .coherent_dma_mask = DMA_BIT_MASK(32), ++ .platform_data = &dbgu_data, + }, + .resource = dbgu_resources, + .num_resources = ARRAY_SIZE(dbgu_resources), +@@ -812,24 +1073,29 @@ + .use_dma_tx = 1, + .use_dma_rx = 1, + }; ++static u64 uart0_dmamask = DMA_BIT_MASK(32); + + static struct platform_device at91sam9263_uart0_device = { + .name = "atmel_usart", + .id = 1, + .dev = { +- .platform_data = &uart0_data, +- .coherent_dma_mask = 0xffffffff, ++ .dma_mask = &uart0_dmamask, ++ .coherent_dma_mask = DMA_BIT_MASK(32), ++ .platform_data = &uart0_data, + }, + .resource = uart0_resources, + .num_resources = ARRAY_SIZE(uart0_resources), + }; + +-static inline void configure_usart0_pins(void) ++static inline void configure_usart0_pins(unsigned pins) + { + at91_set_A_periph(AT91_PIN_PA26, 1); /* TXD0 */ + at91_set_A_periph(AT91_PIN_PA27, 0); /* RXD0 */ +- at91_set_A_periph(AT91_PIN_PA28, 0); /* RTS0 */ +- at91_set_A_periph(AT91_PIN_PA29, 0); /* CTS0 */ ++ ++ if (pins & ATMEL_UART_RTS) ++ at91_set_A_periph(AT91_PIN_PA28, 0); /* RTS0 */ ++ if (pins & ATMEL_UART_CTS) ++ at91_set_A_periph(AT91_PIN_PA29, 0); /* CTS0 */ + } + + static struct resource uart1_resources[] = { +@@ -849,24 +1115,29 @@ + .use_dma_tx = 1, + .use_dma_rx = 1, + }; ++static u64 uart1_dmamask = DMA_BIT_MASK(32); + + static struct platform_device at91sam9263_uart1_device = { + .name = "atmel_usart", + .id = 2, + .dev = { +- .platform_data = &uart1_data, +- .coherent_dma_mask = 0xffffffff, ++ .dma_mask = &uart1_dmamask, ++ .coherent_dma_mask = DMA_BIT_MASK(32), ++ .platform_data = &uart1_data, + }, + .resource = uart1_resources, + .num_resources = ARRAY_SIZE(uart1_resources), + }; + +-static inline void configure_usart1_pins(void) ++static inline void configure_usart1_pins(unsigned pins) + { + at91_set_A_periph(AT91_PIN_PD0, 1); /* TXD1 */ + at91_set_A_periph(AT91_PIN_PD1, 0); /* RXD1 */ +- at91_set_B_periph(AT91_PIN_PD7, 0); /* RTS1 */ +- at91_set_B_periph(AT91_PIN_PD8, 0); /* CTS1 */ ++ ++ if (pins & ATMEL_UART_RTS) ++ at91_set_B_periph(AT91_PIN_PD7, 0); /* RTS1 */ ++ if (pins & ATMEL_UART_CTS) ++ at91_set_B_periph(AT91_PIN_PD8, 0); /* CTS1 */ + } + + static struct resource uart2_resources[] = { +@@ -886,30 +1157,35 @@ + .use_dma_tx = 1, + .use_dma_rx = 1, + }; ++static u64 uart2_dmamask = DMA_BIT_MASK(32); + + static struct platform_device at91sam9263_uart2_device = { + .name = "atmel_usart", + .id = 3, + .dev = { +- .platform_data = &uart2_data, +- .coherent_dma_mask = 0xffffffff, ++ .dma_mask = &uart2_dmamask, ++ .coherent_dma_mask = DMA_BIT_MASK(32), ++ .platform_data = &uart2_data, + }, + .resource = uart2_resources, + .num_resources = ARRAY_SIZE(uart2_resources), + }; + +-static inline void configure_usart2_pins(void) ++static inline void configure_usart2_pins(unsigned pins) + { + at91_set_A_periph(AT91_PIN_PD2, 1); /* TXD2 */ + at91_set_A_periph(AT91_PIN_PD3, 0); /* RXD2 */ +- at91_set_B_periph(AT91_PIN_PD5, 0); /* RTS2 */ +- at91_set_B_periph(AT91_PIN_PD6, 0); /* CTS2 */ ++ ++ if (pins & ATMEL_UART_RTS) ++ at91_set_B_periph(AT91_PIN_PD5, 0); /* RTS2 */ ++ if (pins & ATMEL_UART_CTS) ++ at91_set_B_periph(AT91_PIN_PD6, 0); /* CTS2 */ + } + +-struct platform_device *at91_uarts[ATMEL_MAX_UART]; /* the UARTs to use */ ++static struct platform_device *__initdata at91_uarts[ATMEL_MAX_UART]; /* the UARTs to use */ + struct platform_device *atmel_default_console_device; /* the serial console device */ + +-void __init at91_init_serial(struct at91_uart_config *config) ++void __init __deprecated at91_init_serial(struct at91_uart_config *config) + { + int i; + +@@ -917,17 +1193,17 @@ + for (i = 0; i < config->nr_tty; i++) { + switch (config->tty_map[i]) { + case 0: +- configure_usart0_pins(); ++ configure_usart0_pins(ATMEL_UART_CTS | ATMEL_UART_RTS); + at91_uarts[i] = &at91sam9263_uart0_device; + at91_clock_associate("usart0_clk", &at91sam9263_uart0_device.dev, "usart"); + break; + case 1: +- configure_usart1_pins(); ++ configure_usart1_pins(ATMEL_UART_CTS | ATMEL_UART_RTS); + at91_uarts[i] = &at91sam9263_uart1_device; + at91_clock_associate("usart1_clk", &at91sam9263_uart1_device.dev, "usart"); + break; + case 2: +- configure_usart2_pins(); ++ configure_usart2_pins(ATMEL_UART_CTS | ATMEL_UART_RTS); + at91_uarts[i] = &at91sam9263_uart2_device; + at91_clock_associate("usart2_clk", &at91sam9263_uart2_device.dev, "usart"); + break; +@@ -949,6 +1225,48 @@ + printk(KERN_INFO "AT91: No default serial console defined.\n"); + } + ++void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins) ++{ ++ struct platform_device *pdev; ++ ++ switch (id) { ++ case 0: /* DBGU */ ++ pdev = &at91sam9263_dbgu_device; ++ configure_dbgu_pins(); ++ at91_clock_associate("mck", &pdev->dev, "usart"); ++ break; ++ case AT91SAM9263_ID_US0: ++ pdev = &at91sam9263_uart0_device; ++ configure_usart0_pins(pins); ++ at91_clock_associate("usart0_clk", &pdev->dev, "usart"); ++ break; ++ case AT91SAM9263_ID_US1: ++ pdev = &at91sam9263_uart1_device; ++ configure_usart1_pins(pins); ++ at91_clock_associate("usart1_clk", &pdev->dev, "usart"); ++ break; ++ case AT91SAM9263_ID_US2: ++ pdev = &at91sam9263_uart2_device; ++ configure_usart2_pins(pins); ++ at91_clock_associate("usart2_clk", &pdev->dev, "usart"); ++ break; ++ default: ++ return; ++ } ++ pdev->id = portnr; /* update to mapped ID */ ++ ++ if (portnr < ATMEL_MAX_UART) ++ at91_uarts[portnr] = pdev; ++} ++ ++void __init at91_set_serial_console(unsigned portnr) ++{ ++ if (portnr < ATMEL_MAX_UART) ++ atmel_default_console_device = at91_uarts[portnr]; ++ if (!atmel_default_console_device) ++ printk(KERN_INFO "AT91: No default serial console defined.\n"); ++} ++ + void __init at91_add_device_serial(void) + { + int i; +@@ -959,7 +1277,9 @@ + } + } + #else +-void __init at91_init_serial(struct at91_uart_config *config) {} ++void __init __deprecated at91_init_serial(struct at91_uart_config *config) {} ++void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins) {} ++void __init at91_set_serial_console(unsigned portnr) {} + void __init at91_add_device_serial(void) {} + #endif + +@@ -971,6 +1291,9 @@ + */ + static int __init at91_add_standard_devices(void) + { ++ at91_add_device_rtt(); ++ at91_add_device_watchdog(); ++ at91_add_device_tc(); + return 0; + } + +diff -urN -x CVS linux-2.6.24/arch/arm/mach-at91/at91sam926x_time.c linux-2.6/arch/arm/mach-at91/at91sam926x_time.c +--- linux-2.6.24/arch/arm/mach-at91/at91sam926x_time.c 2007-10-09 22:31:38.000000000 +0200 ++++ linux-2.6/arch/arm/mach-at91/at91sam926x_time.c 2008-02-25 22:18:18.000000000 +0200 +@@ -1,23 +1,20 @@ + /* +- * linux/arch/arm/mach-at91/at91sam926x_time.c ++ * at91sam926x_time.c - Periodic Interval Timer (PIT) for at91sam926x + * + * Copyright (C) 2005-2006 M. Amine SAYA, ATMEL Rousset, France + * Revision 2005 M. Nicolas Diremdjian, ATMEL Rousset, France ++ * Converted to ClockSource/ClockEvents by David Brownell. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ +- +-#include <linux/init.h> + #include <linux/interrupt.h> + #include <linux/irq.h> + #include <linux/kernel.h> +-#include <linux/sched.h> +-#include <linux/time.h> ++#include <linux/clk.h> ++#include <linux/clockchips.h> + +-#include <asm/hardware.h> +-#include <asm/io.h> + #include <asm/mach/time.h> + + #include <asm/arch/at91_pit.h> +@@ -26,88 +23,166 @@ + #define PIT_CPIV(x) ((x) & AT91_PIT_CPIV) + #define PIT_PICNT(x) (((x) & AT91_PIT_PICNT) >> 20) + ++static u32 pit_cycle; /* write-once */ ++static u32 pit_cnt; /* access only w/system irq blocked */ ++ ++ + /* +- * Returns number of microseconds since last timer interrupt. Note that interrupts +- * will have been disabled by do_gettimeofday() +- * 'LATCH' is hwclock ticks (see CLOCK_TICK_RATE in timex.h) per jiffy. ++ * Clocksource: just a monotonic counter of MCK/16 cycles. ++ * We don't care whether or not PIT irqs are enabled. + */ +-static unsigned long at91sam926x_gettimeoffset(void) ++static cycle_t read_pit_clk(void) + { +- unsigned long elapsed; +- unsigned long t = at91_sys_read(AT91_PIT_PIIR); ++ unsigned long flags; ++ u32 elapsed; ++ u32 t; ++ ++ raw_local_irq_save(flags); ++ elapsed = pit_cnt; ++ t = at91_sys_read(AT91_PIT_PIIR); ++ raw_local_irq_restore(flags); ++ ++ elapsed += PIT_PICNT(t) * pit_cycle; ++ elapsed += PIT_CPIV(t); ++ return elapsed; ++} + +- elapsed = (PIT_PICNT(t) * LATCH) + PIT_CPIV(t); /* hardware clock cycles */ ++static struct clocksource pit_clk = { ++ .name = "pit", ++ .rating = 175, ++ .read = read_pit_clk, ++ .shift = 20, ++ .flags = CLOCK_SOURCE_IS_CONTINUOUS, ++}; ++ ++ ++/* ++ * Clockevent device: interrupts every 1/HZ (== pit_cycles * MCK/16) ++ */ ++static void ++pit_clkevt_mode(enum clock_event_mode mode, struct clock_event_device *dev) ++{ ++ unsigned long flags; + +- return (unsigned long)(elapsed * jiffies_to_usecs(1)) / LATCH; ++ switch (mode) { ++ case CLOCK_EVT_MODE_PERIODIC: ++ case CLOCK_EVT_MODE_RESUME: ++ /* update clocksource counter, then enable the IRQ */ ++ raw_local_irq_save(flags); ++ pit_cnt += pit_cycle * PIT_PICNT(at91_sys_read(AT91_PIT_PIVR)); ++ at91_sys_write(AT91_PIT_MR, (pit_cycle - 1) | AT91_PIT_PITEN ++ | AT91_PIT_PITIEN); ++ raw_local_irq_restore(flags); ++ break; ++ case CLOCK_EVT_MODE_ONESHOT: ++ BUG(); ++ /* FALLTHROUGH */ ++ case CLOCK_EVT_MODE_SHUTDOWN: ++ case CLOCK_EVT_MODE_UNUSED: ++ /* disable irq, leaving the clocksource active */ ++ at91_sys_write(AT91_PIT_MR, (pit_cycle - 1) | AT91_PIT_PITEN); ++ break; ++ } + } + ++static struct clock_event_device pit_clkevt = { ++ .name = "pit", ++ .features = CLOCK_EVT_FEAT_PERIODIC, ++ .shift = 32, ++ .rating = 100, ++ .cpumask = CPU_MASK_CPU0, ++ .set_mode = pit_clkevt_mode, ++}; ++ ++ + /* + * IRQ handler for the timer. + */ +-static irqreturn_t at91sam926x_timer_interrupt(int irq, void *dev_id) ++static irqreturn_t at91sam926x_pit_interrupt(int irq, void *dev_id) + { +- volatile long nr_ticks; + +- if (at91_sys_read(AT91_PIT_SR) & AT91_PIT_PITS) { /* This is a shared interrupt */ +- write_seqlock(&xtime_lock); ++ /* The PIT interrupt may be disabled, and is shared */ ++ if ((pit_clkevt.mode == CLOCK_EVT_MODE_PERIODIC) ++ && (at91_sys_read(AT91_PIT_SR) & AT91_PIT_PITS)) { ++ unsigned nr_ticks; + +- /* Get number to ticks performed before interrupt and clear PIT interrupt */ ++ /* Get number of ticks performed before irq, and ack it */ + nr_ticks = PIT_PICNT(at91_sys_read(AT91_PIT_PIVR)); + do { +- timer_tick(); ++ pit_cnt += pit_cycle; ++ pit_clkevt.event_handler(&pit_clkevt); + nr_ticks--; + } while (nr_ticks); + +- write_sequnlock(&xtime_lock); + return IRQ_HANDLED; +- } else +- return IRQ_NONE; /* not handled */ ++ } ++ ++ return IRQ_NONE; + } + +-static struct irqaction at91sam926x_timer_irq = { ++static struct irqaction at91sam926x_pit_irq = { + .name = "at91_tick", + .flags = IRQF_SHARED | IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL, +- .handler = at91sam926x_timer_interrupt ++ .handler = at91sam926x_pit_interrupt + }; + +-void at91sam926x_timer_reset(void) ++static void at91sam926x_pit_reset(void) + { +- /* Disable timer */ ++ /* Disable timer and irqs */ + at91_sys_write(AT91_PIT_MR, 0); + +- /* Clear any pending interrupts */ +- (void) at91_sys_read(AT91_PIT_PIVR); ++ /* Clear any pending interrupts, wait for PIT to stop counting */ ++ while (PIT_CPIV(at91_sys_read(AT91_PIT_PIVR)) != 0) ++ cpu_relax(); + +- /* Set Period Interval timer and enable its interrupt */ +- at91_sys_write(AT91_PIT_MR, (LATCH & AT91_PIT_PIV) | AT91_PIT_PITIEN | AT91_PIT_PITEN); ++ /* Start PIT but don't enable IRQ */ ++ at91_sys_write(AT91_PIT_MR, (pit_cycle - 1) | AT91_PIT_PITEN); + } + + /* +- * Set up timer interrupt. ++ * Set up both clocksource and clockevent support. + */ +-void __init at91sam926x_timer_init(void) ++static void __init at91sam926x_pit_init(void) + { ++ unsigned long pit_rate; ++ unsigned bits; ++ ++ /* ++ * Use our actual MCK to figure out how many MCK/16 ticks per ++ * 1/HZ period (instead of a compile-time constant LATCH). ++ */ ++ pit_rate = clk_get_rate(clk_get(NULL, "mck")) / 16; ++ pit_cycle = (pit_rate + HZ/2) / HZ; ++ WARN_ON(((pit_cycle - 1) & ~AT91_PIT_PIV) != 0); ++ + /* Initialize and enable the timer */ +- at91sam926x_timer_reset(); ++ at91sam926x_pit_reset(); + +- /* Make IRQs happen for the system timer. */ +- setup_irq(AT91_ID_SYS, &at91sam926x_timer_irq); ++ /* ++ * Register clocksource. The high order bits of PIV are unused, ++ * so this isn't a 32-bit counter unless we get clockevent irqs. ++ */ ++ pit_clk.mult = clocksource_hz2mult(pit_rate, pit_clk.shift); ++ bits = 12 /* PICNT */ + ilog2(pit_cycle) /* PIV */; ++ pit_clk.mask = CLOCKSOURCE_MASK(bits); ++ clocksource_register(&pit_clk); ++ ++ /* Set up irq handler */ ++ setup_irq(AT91_ID_SYS, &at91sam926x_pit_irq); ++ ++ /* Set up and register clockevents */ ++ pit_clkevt.mult = div_sc(pit_rate, NSEC_PER_SEC, pit_clkevt.shift); ++ clockevents_register_device(&pit_clkevt); + } + +-#ifdef CONFIG_PM +-static void at91sam926x_timer_suspend(void) ++static void at91sam926x_pit_suspend(void) + { + /* Disable timer */ + at91_sys_write(AT91_PIT_MR, 0); + } +-#else +-#define at91sam926x_timer_suspend NULL +-#endif + + struct sys_timer at91sam926x_timer = { +- .init = at91sam926x_timer_init, +- .offset = at91sam926x_gettimeoffset, +- .suspend = at91sam926x_timer_suspend, +- .resume = at91sam926x_timer_reset, ++ .init = at91sam926x_pit_init, ++ .suspend = at91sam926x_pit_suspend, ++ .resume = at91sam926x_pit_reset, + }; +- +diff -urN -x CVS linux-2.6.24/arch/arm/mach-at91/at91sam9rl.c linux-2.6/arch/arm/mach-at91/at91sam9rl.c +--- linux-2.6.24/arch/arm/mach-at91/at91sam9rl.c 2007-10-09 22:31:38.000000000 +0200 ++++ linux-2.6/arch/arm/mach-at91/at91sam9rl.c 2008-03-01 19:04:12.000000000 +0200 +@@ -10,6 +10,7 @@ + */ + + #include <linux/module.h> ++#include <linux/pm.h> + + #include <asm/mach/arch.h> + #include <asm/mach/map.h> +@@ -17,6 +18,7 @@ + #include <asm/arch/at91sam9rl.h> + #include <asm/arch/at91_pmc.h> + #include <asm/arch/at91_rstc.h> ++#include <asm/arch/at91_shdwc.h> + + #include "generic.h" + #include "clock.h" +@@ -244,6 +246,11 @@ + at91_sys_write(AT91_RSTC_CR, AT91_RSTC_KEY | AT91_RSTC_PROCRST | AT91_RSTC_PERRST); + } + ++static void at91sam9rl_poweroff(void) ++{ ++ at91_sys_write(AT91_SHDW_CR, AT91_SHDW_KEY | AT91_SHDW_SHDW); ++} ++ + + /* -------------------------------------------------------------------- + * AT91SAM9RL processor initialization +@@ -274,6 +281,7 @@ + iotable_init(at91sam9rl_sram_desc, ARRAY_SIZE(at91sam9rl_sram_desc)); + + at91_arch_reset = at91sam9rl_reset; ++ pm_power_off = at91sam9rl_poweroff; + at91_extern_irq = (1 << AT91SAM9RL_ID_IRQ0); + + /* Init clock subsystem */ +diff -urN -x CVS linux-2.6.24/arch/arm/mach-at91/at91sam9rl_devices.c linux-2.6/arch/arm/mach-at91/at91sam9rl_devices.c +--- linux-2.6.24/arch/arm/mach-at91/at91sam9rl_devices.c 2008-03-01 22:02:07.000000000 +0200 ++++ linux-2.6/arch/arm/mach-at91/at91sam9rl_devices.c 2008-03-01 22:10:11.000000000 +0200 +@@ -9,6 +9,7 @@ + #include <asm/mach/arch.h> + #include <asm/mach/map.h> + ++#include <linux/dma-mapping.h> + #include <linux/platform_device.h> + #include <linux/i2c-gpio.h> + +@@ -19,7 +20,7 @@ + #include <asm/arch/gpio.h> + #include <asm/arch/at91sam9rl.h> + #include <asm/arch/at91sam9rl_matrix.h> +-#include <asm/arch/at91sam926x_mc.h> ++#include <asm/arch/at91sam926x_smc.h> + + #include "generic.h" + +@@ -29,7 +30,7 @@ + * -------------------------------------------------------------------- */ + + #if defined(CONFIG_MMC_AT91) || defined(CONFIG_MMC_AT91_MODULE) +-static u64 mmc_dmamask = 0xffffffffUL; ++static u64 mmc_dmamask = DMA_BIT_MASK(32); + static struct at91_mmc_data mmc_data; + + static struct resource mmc_resources[] = { +@@ -50,7 +51,7 @@ + .id = -1, + .dev = { + .dma_mask = &mmc_dmamask, +- .coherent_dma_mask = 0xffffffff, ++ .coherent_dma_mask = DMA_BIT_MASK(32), + .platform_data = &mmc_data, + }, + .resource = mmc_resources, +@@ -104,10 +105,15 @@ + #define NAND_BASE AT91_CHIPSELECT_3 + + static struct resource nand_resources[] = { +- { ++ [0] = { + .start = NAND_BASE, + .end = NAND_BASE + SZ_256M - 1, + .flags = IORESOURCE_MEM, ++ }, ++ [1] = { ++ .start = AT91_BASE_SYS + AT91_ECC, ++ .end = AT91_BASE_SYS + AT91_ECC + SZ_512 - 1, ++ .flags = IORESOURCE_MEM, + } + }; + +@@ -247,7 +253,7 @@ + * -------------------------------------------------------------------- */ + + #if defined(CONFIG_SPI_ATMEL) || defined(CONFIG_SPI_ATMEL_MODULE) +-static u64 spi_dmamask = 0xffffffffUL; ++static u64 spi_dmamask = DMA_BIT_MASK(32); + + static struct resource spi_resources[] = { + [0] = { +@@ -267,7 +273,7 @@ + .id = 0, + .dev = { + .dma_mask = &spi_dmamask, +- .coherent_dma_mask = 0xffffffff, ++ .coherent_dma_mask = DMA_BIT_MASK(32), + }, + .resource = spi_resources, + .num_resources = ARRAY_SIZE(spi_resources), +@@ -312,7 +318,7 @@ + * -------------------------------------------------------------------- */ + + #if defined(CONFIG_FB_ATMEL) || defined(CONFIG_FB_ATMEL_MODULE) +-static u64 lcdc_dmamask = 0xffffffffUL; ++static u64 lcdc_dmamask = DMA_BIT_MASK(32); + static struct atmel_lcdfb_info lcdc_data; + + static struct resource lcdc_resources[] = { +@@ -340,7 +346,7 @@ + .id = 0, + .dev = { + .dma_mask = &lcdc_dmamask, +- .coherent_dma_mask = 0xffffffff, ++ .coherent_dma_mask = DMA_BIT_MASK(32), + .platform_data = &lcdc_data, + }, + .resource = lcdc_resources, +@@ -384,24 +390,244 @@ + + + /* -------------------------------------------------------------------- +- * LEDs ++ * Timer/Counter block ++ * -------------------------------------------------------------------- */ ++ ++#ifdef CONFIG_ATMEL_TCLIB ++ ++static struct resource tcb_resources[] = { ++ [0] = { ++ .start = AT91SAM9RL_BASE_TCB0, ++ .end = AT91SAM9RL_BASE_TCB0 + SZ_16K - 1, ++ .flags = IORESOURCE_MEM, ++ }, ++ [1] = { ++ .start = AT91SAM9RL_ID_TC0, ++ .end = AT91SAM9RL_ID_TC0, ++ .flags = IORESOURCE_IRQ, ++ }, ++ [2] = { ++ .start = AT91SAM9RL_ID_TC1, ++ .end = AT91SAM9RL_ID_TC1, ++ .flags = IORESOURCE_IRQ, ++ }, ++ [3] = { ++ .start = AT91SAM9RL_ID_TC2, ++ .end = AT91SAM9RL_ID_TC2, ++ .flags = IORESOURCE_IRQ, ++ }, ++}; ++ ++static struct platform_device at91sam9rl_tcb_device = { ++ .name = "atmel_tcb", ++ .id = 0, ++ .resource = tcb_resources, ++ .num_resources = ARRAY_SIZE(tcb_resources), ++}; ++ ++static void __init at91_add_device_tc(void) ++{ ++ /* this chip has a separate clock and irq for each TC channel */ ++ at91_clock_associate("tc0_clk", &at91sam9rl_tcb_device.dev, "t0_clk"); ++ at91_clock_associate("tc1_clk", &at91sam9rl_tcb_device.dev, "t1_clk"); ++ at91_clock_associate("tc2_clk", &at91sam9rl_tcb_device.dev, "t2_clk"); ++ platform_device_register(&at91sam9rl_tcb_device); ++} ++#else ++static void __init at91_add_device_tc(void) { } ++#endif ++ ++ ++/* -------------------------------------------------------------------- ++ * RTC ++ * -------------------------------------------------------------------- */ ++ ++#if defined(CONFIG_RTC_DRV_AT91RM9200) || defined(CONFIG_RTC_DRV_AT91RM9200_MODULE) ++static struct platform_device at91sam9rl_rtc_device = { ++ .name = "at91_rtc", ++ .id = -1, ++ .num_resources = 0, ++}; ++ ++static void __init at91_add_device_rtc(void) ++{ ++ device_init_wakeup(&at91sam9rl_rtc_device.dev, 1); ++ platform_device_register(&at91sam9rl_rtc_device); ++} ++#else ++static void __init at91_add_device_rtc(void) {} ++#endif ++ ++ ++/* -------------------------------------------------------------------- ++ * RTT ++ * -------------------------------------------------------------------- */ ++ ++static struct resource rtt_resources[] = { ++ { ++ .start = AT91_BASE_SYS + AT91_RTT, ++ .end = AT91_BASE_SYS + AT91_RTT + SZ_16 - 1, ++ .flags = IORESOURCE_MEM, ++ } ++}; ++ ++static struct platform_device at91sam9rl_rtt_device = { ++ .name = "at91_rtt", ++ .id = -1, ++ .resource = rtt_resources, ++ .num_resources = ARRAY_SIZE(rtt_resources), ++}; ++ ++static void __init at91_add_device_rtt(void) ++{ ++ device_init_wakeup(&at91sam9rl_rtt_device.dev, 1); ++ platform_device_register(&at91sam9rl_rtt_device); ++} ++ ++ ++/* -------------------------------------------------------------------- ++ * Watchdog ++ * -------------------------------------------------------------------- */ ++ ++#if defined(CONFIG_AT91SAM9_WATCHDOG) || defined(CONFIG_AT91SAM9_WATCHDOG_MODULE) ++static struct platform_device at91sam9rl_wdt_device = { ++ .name = "at91_wdt", ++ .id = -1, ++ .num_resources = 0, ++}; ++ ++static void __init at91_add_device_watchdog(void) ++{ ++ platform_device_register(&at91sam9rl_wdt_device); ++} ++#else ++static void __init at91_add_device_watchdog(void) {} ++#endif ++ ++ ++/* -------------------------------------------------------------------- ++ * SSC -- Synchronous Serial Controller + * -------------------------------------------------------------------- */ + +-#if defined(CONFIG_LEDS) +-u8 at91_leds_cpu; +-u8 at91_leds_timer; ++#if defined(CONFIG_ATMEL_SSC) || defined(CONFIG_ATMEL_SSC_MODULE) ++static u64 ssc0_dmamask = DMA_BIT_MASK(32); ++ ++static struct resource ssc0_resources[] = { ++ [0] = { ++ .start = AT91SAM9RL_BASE_SSC0, ++ .end = AT91SAM9RL_BASE_SSC0 + SZ_16K - 1, ++ .flags = IORESOURCE_MEM, ++ }, ++ [1] = { ++ .start = AT91SAM9RL_ID_SSC0, ++ .end = AT91SAM9RL_ID_SSC0, ++ .flags = IORESOURCE_IRQ, ++ }, ++}; ++ ++static struct platform_device at91sam9rl_ssc0_device = { ++ .name = "ssc", ++ .id = 0, ++ .dev = { ++ .dma_mask = &ssc0_dmamask, ++ .coherent_dma_mask = DMA_BIT_MASK(32), ++ }, ++ .resource = ssc0_resources, ++ .num_resources = ARRAY_SIZE(ssc0_resources), ++}; ++ ++static inline void configure_ssc0_pins(unsigned pins) ++{ ++ if (pins & ATMEL_SSC_TF) ++ at91_set_A_periph(AT91_PIN_PC0, 1); ++ if (pins & ATMEL_SSC_TK) ++ at91_set_A_periph(AT91_PIN_PC1, 1); ++ if (pins & ATMEL_SSC_TD) ++ at91_set_A_periph(AT91_PIN_PA15, 1); ++ if (pins & ATMEL_SSC_RD) ++ at91_set_A_periph(AT91_PIN_PA16, 1); ++ if (pins & ATMEL_SSC_RK) ++ at91_set_B_periph(AT91_PIN_PA10, 1); ++ if (pins & ATMEL_SSC_RF) ++ at91_set_B_periph(AT91_PIN_PA22, 1); ++} ++ ++static u64 ssc1_dmamask = DMA_BIT_MASK(32); ++ ++static struct resource ssc1_resources[] = { ++ [0] = { ++ .start = AT91SAM9RL_BASE_SSC1, ++ .end = AT91SAM9RL_BASE_SSC1 + SZ_16K - 1, ++ .flags = IORESOURCE_MEM, ++ }, ++ [1] = { ++ .start = AT91SAM9RL_ID_SSC1, ++ .end = AT91SAM9RL_ID_SSC1, ++ .flags = IORESOURCE_IRQ, ++ }, ++}; ++ ++static struct platform_device at91sam9rl_ssc1_device = { ++ .name = "ssc", ++ .id = 1, ++ .dev = { ++ .dma_mask = &ssc1_dmamask, ++ .coherent_dma_mask = DMA_BIT_MASK(32), ++ }, ++ .resource = ssc1_resources, ++ .num_resources = ARRAY_SIZE(ssc1_resources), ++}; ++ ++static inline void configure_ssc1_pins(unsigned pins) ++{ ++ if (pins & ATMEL_SSC_TF) ++ at91_set_B_periph(AT91_PIN_PA29, 1); ++ if (pins & ATMEL_SSC_TK) ++ at91_set_B_periph(AT91_PIN_PA30, 1); ++ if (pins & ATMEL_SSC_TD) ++ at91_set_B_periph(AT91_PIN_PA13, 1); ++ if (pins & ATMEL_SSC_RD) ++ at91_set_B_periph(AT91_PIN_PA14, 1); ++ if (pins & ATMEL_SSC_RK) ++ at91_set_B_periph(AT91_PIN_PA9, 1); ++ if (pins & ATMEL_SSC_RF) ++ at91_set_B_periph(AT91_PIN_PA8, 1); ++} + +-void __init at91_init_leds(u8 cpu_led, u8 timer_led) ++/* ++ * SSC controllers are accessed through library code, instead of any ++ * kind of all-singing/all-dancing driver. For example one could be ++ * used by a particular I2S audio codec's driver, while another one ++ * on the same system might be used by a custom data capture driver. ++ */ ++void __init at91_add_device_ssc(unsigned id, unsigned pins) + { +- /* Enable GPIO to access the LEDs */ +- at91_set_gpio_output(cpu_led, 1); +- at91_set_gpio_output(timer_led, 1); ++ struct platform_device *pdev; + +- at91_leds_cpu = cpu_led; +- at91_leds_timer = timer_led; ++ /* ++ * NOTE: caller is responsible for passing information matching ++ * "pins" to whatever will be using each particular controller. ++ */ ++ switch (id) { ++ case AT91SAM9RL_ID_SSC0: ++ pdev = &at91sam9rl_ssc0_device; ++ configure_ssc0_pins(pins); ++ at91_clock_associate("ssc0_clk", &pdev->dev, "pclk"); ++ break; ++ case AT91SAM9RL_ID_SSC1: ++ pdev = &at91sam9rl_ssc1_device; ++ configure_ssc1_pins(pins); ++ at91_clock_associate("ssc1_clk", &pdev->dev, "pclk"); ++ break; ++ default: ++ return; ++ } ++ ++ platform_device_register(pdev); + } ++ + #else +-void __init at91_init_leds(u8 cpu_led, u8 timer_led) {} ++struct platform_device *__init at91_add_device_ssc(unsigned id, unsigned pins) {} + #endif + + +@@ -428,13 +654,15 @@ + .use_dma_rx = 0, /* DBGU not capable of receive DMA */ + .regs = (void __iomem *)(AT91_VA_BASE_SYS + AT91_DBGU), + }; ++static u64 dbgu_dmamask = DMA_BIT_MASK(32); + + static struct platform_device at91sam9rl_dbgu_device = { + .name = "atmel_usart", + .id = 0, + .dev = { +- .platform_data = &dbgu_data, +- .coherent_dma_mask = 0xffffffff, ++ .dma_mask = &dbgu_dmamask, ++ .coherent_dma_mask = DMA_BIT_MASK(32), ++ .platform_data = &dbgu_data, + }, + .resource = dbgu_resources, + .num_resources = ARRAY_SIZE(dbgu_resources), +@@ -463,24 +691,37 @@ + .use_dma_tx = 1, + .use_dma_rx = 1, + }; ++static u64 uart0_dmamask = DMA_BIT_MASK(32); + + static struct platform_device at91sam9rl_uart0_device = { + .name = "atmel_usart", + .id = 1, + .dev = { +- .platform_data = &uart0_data, +- .coherent_dma_mask = 0xffffffff, ++ .dma_mask = &uart0_dmamask, ++ .coherent_dma_mask = DMA_BIT_MASK(32), ++ .platform_data = &uart0_data, + }, + .resource = uart0_resources, + .num_resources = ARRAY_SIZE(uart0_resources), + }; + +-static inline void configure_usart0_pins(void) ++static inline void configure_usart0_pins(unsigned pins) + { +- at91_set_A_periph(AT91_PIN_PA6, 1); /* TXD0 */ +- at91_set_A_periph(AT91_PIN_PA7, 0); /* RXD0 */ +- at91_set_A_periph(AT91_PIN_PA9, 0); /* RTS0 */ +- at91_set_A_periph(AT91_PIN_PA10, 0); /* CTS0 */ ++ at91_set_A_periph(AT91_PIN_PA6, 1); /* TXD0 */ ++ at91_set_A_periph(AT91_PIN_PA7, 0); /* RXD0 */ ++ ++ if (pins & ATMEL_UART_RTS) ++ at91_set_A_periph(AT91_PIN_PA9, 0); /* RTS0 */ ++ if (pins & ATMEL_UART_CTS) ++ at91_set_A_periph(AT91_PIN_PA10, 0); /* CTS0 */ ++ if (pins & ATMEL_UART_DSR) ++ at91_set_A_periph(AT91_PIN_PD14, 0); /* DSR0 */ ++ if (pins & ATMEL_UART_DTR) ++ at91_set_A_periph(AT91_PIN_PD15, 0); /* DTR0 */ ++ if (pins & ATMEL_UART_DCD) ++ at91_set_A_periph(AT91_PIN_PD16, 0); /* DCD0 */ ++ if (pins & ATMEL_UART_RI) ++ at91_set_A_periph(AT91_PIN_PD17, 0); /* RI0 */ + } + + static struct resource uart1_resources[] = { +@@ -500,22 +741,29 @@ + .use_dma_tx = 1, + .use_dma_rx = 1, + }; ++static u64 uart1_dmamask = DMA_BIT_MASK(32); + + static struct platform_device at91sam9rl_uart1_device = { + .name = "atmel_usart", + .id = 2, + .dev = { +- .platform_data = &uart1_data, +- .coherent_dma_mask = 0xffffffff, ++ .dma_mask = &uart1_dmamask, ++ .coherent_dma_mask = DMA_BIT_MASK(32), ++ .platform_data = &uart1_data, + }, + .resource = uart1_resources, + .num_resources = ARRAY_SIZE(uart1_resources), + }; + +-static inline void configure_usart1_pins(void) ++static inline void configure_usart1_pins(unsigned pins) + { + at91_set_A_periph(AT91_PIN_PA11, 1); /* TXD1 */ + at91_set_A_periph(AT91_PIN_PA12, 0); /* RXD1 */ ++ ++ if (pins & ATMEL_UART_RTS) ++ at91_set_B_periph(AT91_PIN_PA18, 0); /* RTS1 */ ++ if (pins & ATMEL_UART_CTS) ++ at91_set_B_periph(AT91_PIN_PA19, 0); /* CTS1 */ + } + + static struct resource uart2_resources[] = { +@@ -535,22 +783,29 @@ + .use_dma_tx = 1, + .use_dma_rx = 1, + }; ++static u64 uart2_dmamask = DMA_BIT_MASK(32); + + static struct platform_device at91sam9rl_uart2_device = { + .name = "atmel_usart", + .id = 3, + .dev = { +- .platform_data = &uart2_data, +- .coherent_dma_mask = 0xffffffff, ++ .dma_mask = &uart2_dmamask, ++ .coherent_dma_mask = DMA_BIT_MASK(32), ++ .platform_data = &uart2_data, + }, + .resource = uart2_resources, + .num_resources = ARRAY_SIZE(uart2_resources), + }; + +-static inline void configure_usart2_pins(void) ++static inline void configure_usart2_pins(unsigned pins) + { + at91_set_A_periph(AT91_PIN_PA13, 1); /* TXD2 */ + at91_set_A_periph(AT91_PIN_PA14, 0); /* RXD2 */ ++ ++ if (pins & ATMEL_UART_RTS) ++ at91_set_A_periph(AT91_PIN_PA29, 0); /* RTS2 */ ++ if (pins & ATMEL_UART_CTS) ++ at91_set_A_periph(AT91_PIN_PA30, 0); /* CTS2 */ + } + + static struct resource uart3_resources[] = { +@@ -570,28 +825,35 @@ + .use_dma_tx = 1, + .use_dma_rx = 1, + }; ++static u64 uart3_dmamask = DMA_BIT_MASK(32); + + static struct platform_device at91sam9rl_uart3_device = { + .name = "atmel_usart", + .id = 4, + .dev = { +- .platform_data = &uart3_data, +- .coherent_dma_mask = 0xffffffff, ++ .dma_mask = &uart3_dmamask, ++ .coherent_dma_mask = DMA_BIT_MASK(32), ++ .platform_data = &uart3_data, + }, + .resource = uart3_resources, + .num_resources = ARRAY_SIZE(uart3_resources), + }; + +-static inline void configure_usart3_pins(void) ++static inline void configure_usart3_pins(unsigned pins) + { + at91_set_A_periph(AT91_PIN_PB0, 1); /* TXD3 */ + at91_set_A_periph(AT91_PIN_PB1, 0); /* RXD3 */ ++ ++ if (pins & ATMEL_UART_RTS) ++ at91_set_B_periph(AT91_PIN_PD4, 0); /* RTS3 */ ++ if (pins & ATMEL_UART_CTS) ++ at91_set_B_periph(AT91_PIN_PD3, 0); /* CTS3 */ + } + +-struct platform_device *at91_uarts[ATMEL_MAX_UART]; /* the UARTs to use */ ++static struct platform_device *__initdata at91_uarts[ATMEL_MAX_UART]; /* the UARTs to use */ + struct platform_device *atmel_default_console_device; /* the serial console device */ + +-void __init at91_init_serial(struct at91_uart_config *config) ++void __init __deprecated at91_init_serial(struct at91_uart_config *config) + { + int i; + +@@ -599,22 +861,22 @@ + for (i = 0; i < config->nr_tty; i++) { + switch (config->tty_map[i]) { + case 0: +- configure_usart0_pins(); ++ configure_usart0_pins(ATMEL_UART_CTS | ATMEL_UART_RTS); + at91_uarts[i] = &at91sam9rl_uart0_device; + at91_clock_associate("usart0_clk", &at91sam9rl_uart0_device.dev, "usart"); + break; + case 1: +- configure_usart1_pins(); ++ configure_usart1_pins(0); + at91_uarts[i] = &at91sam9rl_uart1_device; + at91_clock_associate("usart1_clk", &at91sam9rl_uart1_device.dev, "usart"); + break; + case 2: +- configure_usart2_pins(); ++ configure_usart2_pins(0); + at91_uarts[i] = &at91sam9rl_uart2_device; + at91_clock_associate("usart2_clk", &at91sam9rl_uart2_device.dev, "usart"); + break; + case 3: +- configure_usart3_pins(); ++ configure_usart3_pins(0); + at91_uarts[i] = &at91sam9rl_uart3_device; + at91_clock_associate("usart3_clk", &at91sam9rl_uart3_device.dev, "usart"); + break; +@@ -636,6 +898,53 @@ + printk(KERN_INFO "AT91: No default serial console defined.\n"); + } + ++void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins) ++{ ++ struct platform_device *pdev; ++ ++ switch (id) { ++ case 0: /* DBGU */ ++ pdev = &at91sam9rl_dbgu_device; ++ configure_dbgu_pins(); ++ at91_clock_associate("mck", &pdev->dev, "usart"); ++ break; ++ case AT91SAM9RL_ID_US0: ++ pdev = &at91sam9rl_uart0_device; ++ configure_usart0_pins(pins); ++ at91_clock_associate("usart0_clk", &pdev->dev, "usart"); ++ break; ++ case AT91SAM9RL_ID_US1: ++ pdev = &at91sam9rl_uart1_device; ++ configure_usart1_pins(pins); ++ at91_clock_associate("usart1_clk", &pdev->dev, "usart"); ++ break; ++ case AT91SAM9RL_ID_US2: ++ pdev = &at91sam9rl_uart2_device; ++ configure_usart2_pins(pins); ++ at91_clock_associate("usart2_clk", &pdev->dev, "usart"); ++ break; ++ case AT91SAM9RL_ID_US3: ++ pdev = &at91sam9rl_uart3_device; ++ configure_usart3_pins(pins); ++ at91_clock_associate("usart3_clk", &pdev->dev, "usart"); ++ break; ++ default: ++ return; ++ } ++ pdev->id = portnr; /* update to mapped ID */ ++ ++ if (portnr < ATMEL_MAX_UART) ++ at91_uarts[portnr] = pdev; ++} ++ ++void __init at91_set_serial_console(unsigned portnr) ++{ ++ if (portnr < ATMEL_MAX_UART) ++ atmel_default_console_device = at91_uarts[portnr]; ++ if (!atmel_default_console_device) ++ printk(KERN_INFO "AT91: No default serial console defined.\n"); ++} ++ + void __init at91_add_device_serial(void) + { + int i; +@@ -646,7 +955,9 @@ + } + } + #else +-void __init at91_init_serial(struct at91_uart_config *config) {} ++void __init __deprecated at91_init_serial(struct at91_uart_config *config) {} ++void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins) {} ++void __init at91_set_serial_console(unsigned portnr) {} + void __init at91_add_device_serial(void) {} + #endif + +@@ -659,6 +970,10 @@ + */ + static int __init at91_add_standard_devices(void) + { ++ at91_add_device_rtc(); ++ at91_add_device_rtt(); ++ at91_add_device_watchdog(); ++ at91_add_device_tc(); + return 0; + } + +diff -urN -x CVS linux-2.6.24/arch/arm/mach-at91/board-cam60.c linux-2.6/arch/arm/mach-at91/board-cam60.c +--- linux-2.6.24/arch/arm/mach-at91/board-cam60.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-2.6/arch/arm/mach-at91/board-cam60.c 2008-03-01 20:40:51.000000000 +0200 +@@ -0,0 +1,188 @@ ++/* ++ * KwikByte CAM60 ++ * ++ * based on board-sam9260ek.c ++ * Copyright (C) 2005 SAN People ++ * Copyright (C) 2006 Atmel ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ++ */ ++ ++#include <linux/types.h> ++#include <linux/init.h> ++#include <linux/mm.h> ++#include <linux/module.h> ++#include <linux/platform_device.h> ++#include <linux/spi/spi.h> ++#include <linux/spi/flash.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/board.h> ++#include <asm/arch/gpio.h> ++ ++#include "generic.h" ++ ++ ++/* ++ * Serial port configuration. ++ * 0 .. 5 = USART0 .. USART5 ++ * 6 = DBGU ++ */ ++static struct at91_uart_config __initdata cam60_uart_config = { ++ .console_tty = 0, /* ttyS0 */ ++ .nr_tty = 1, ++ .tty_map = { 6, -1, -1, -1, -1, -1, -1 } /* ttyS0, ..., ttyS6 */ ++}; ++ ++static void __init cam60_map_io(void) ++{ ++ /* Initialize processor: 10 MHz crystal */ ++ at91sam9260_initialize(10000000); ++ ++ /* Setup the serial ports and console */ ++ at91_init_serial(&cam60_uart_config); ++} ++ ++static void __init cam60_init_irq(void) ++{ ++ at91sam9260_init_interrupts(NULL); ++} ++ ++ ++/* ++ * USB Host ++ */ ++static struct at91_usbh_data __initdata cam60_usbh_data = { ++ .ports = 1, ++}; ++ ++ ++/* ++ * SPI devices. ++ */ ++#if defined(CONFIG_MTD_DATAFLASH) ++static struct mtd_partition __initdata cam60_spi_partitions[] = { ++ { ++ .name = "BOOT1", ++ .offset = 0, ++ .size = 4 * 1056, ++ }, ++ { ++ .name = "BOOT2", ++ .offset = MTDPART_OFS_NXTBLK, ++ .size = 256 * 1056, ++ }, ++ { ++ .name = "kernel", ++ .offset = MTDPART_OFS_NXTBLK, ++ .size = 2222 * 1056, ++ }, ++ { ++ .name = "file system", ++ .offset = MTDPART_OFS_NXTBLK, ++ .size = MTDPART_SIZ_FULL, ++ }, ++}; ++ ++static struct flash_platform_data __initdata cam60_spi_flash_platform_data = { ++ .name = "spi_flash", ++ .parts = cam60_spi_partitions, ++ .nr_parts = ARRAY_SIZE(cam60_spi_partitions) ++}; ++#endif ++ ++static struct spi_board_info cam60_spi_devices[] = { ++#if defined(CONFIG_MTD_DATAFLASH) ++ { /* DataFlash chip */ ++ .modalias = "mtd_dataflash", ++ .chip_select = 0, ++ .max_speed_hz = 15 * 1000 * 1000, ++ .bus_num = 0, ++ .platform_data = &cam60_spi_flash_platform_data ++ }, ++#endif ++}; ++ ++ ++/* ++ * MACB Ethernet device ++ */ ++static struct __initdata at91_eth_data cam60_macb_data = { ++ .phy_irq_pin = AT91_PIN_PB5, ++ .is_rmii = 0, ++}; ++ ++ ++/* ++ * NAND Flash ++ */ ++static struct mtd_partition __initdata cam60_nand_partition[] = { ++ { ++ .name = "nand_fs", ++ .offset = 0, ++ .size = MTDPART_SIZ_FULL, ++ }, ++}; ++ ++static struct mtd_partition * __init nand_partitions(int size, int *num_partitions) ++{ ++ *num_partitions = ARRAY_SIZE(cam60_nand_partition); ++ return cam60_nand_partition; ++} ++ ++static struct at91_nand_data __initdata cam60_nand_data = { ++ .ale = 21, ++ .cle = 22, ++ // .det_pin = ... not there ++ .rdy_pin = AT91_PIN_PA9, ++ .enable_pin = AT91_PIN_PA7, ++ .partition_info = nand_partitions, ++}; ++ ++ ++static void __init cam60_board_init(void) ++{ ++ /* Serial */ ++ at91_add_device_serial(); ++ /* SPI */ ++ at91_add_device_spi(cam60_spi_devices, ARRAY_SIZE(cam60_spi_devices)); ++ /* Ethernet */ ++ at91_add_device_eth(&cam60_macb_data); ++ /* USB Host */ ++ /* enable USB power supply circuit */ ++ at91_set_gpio_output(AT91_PIN_PB18, 1); ++ at91_add_device_usbh(&cam60_usbh_data); ++ /* NAND */ ++ at91_add_device_nand(&cam60_nand_data); ++} ++ ++MACHINE_START(CAM60, "KwikByte CAM60") ++ /* Maintainer: KwikByte */ ++ .phys_io = AT91_BASE_SYS, ++ .io_pg_offst = (AT91_VA_BASE_SYS >> 18) & 0xfffc, ++ .boot_params = AT91_SDRAM_BASE + 0x100, ++ .timer = &at91sam926x_timer, ++ .map_io = cam60_map_io, ++ .init_irq = cam60_init_irq, ++ .init_machine = cam60_board_init, ++MACHINE_END +diff -urN -x CVS linux-2.6.24/arch/arm/mach-at91/board-cap9adk.c linux-2.6/arch/arm/mach-at91/board-cap9adk.c +--- linux-2.6.24/arch/arm/mach-at91/board-cap9adk.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-2.6/arch/arm/mach-at91/board-cap9adk.c 2008-03-01 20:43:07.000000000 +0200 +@@ -0,0 +1,359 @@ ++/* ++ * linux/arch/arm/mach-at91/board-cap9adk.c ++ * ++ * Copyright (C) 2007 Stelian Pop <stelian.pop@leadtechdesign.com> ++ * Copyright (C) 2007 Lead Tech Design <www.leadtechdesign.com> ++ * Copyright (C) 2005 SAN People ++ * Copyright (C) 2007 Atmel Corporation. ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ++ */ ++ ++#include <linux/types.h> ++#include <linux/init.h> ++#include <linux/mm.h> ++#include <linux/module.h> ++#include <linux/platform_device.h> ++#include <linux/spi/spi.h> ++#include <linux/spi/ads7846.h> ++#include <linux/fb.h> ++#include <linux/mtd/physmap.h> ++ ++#include <video/atmel_lcdc.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/board.h> ++#include <asm/arch/gpio.h> ++#include <asm/arch/at91cap9_matrix.h> ++#include <asm/arch/at91sam926x_smc.h> ++ ++#include "generic.h" ++ ++ ++static void __init cap9adk_map_io(void) ++{ ++ /* Initialize processor: 12 MHz crystal */ ++ at91cap9_initialize(12000000); ++ ++ /* Setup the LEDs: USER1 and USER2 LED for cpu/timer... */ ++ at91_init_leds(AT91_PIN_PA10, AT91_PIN_PA11); ++ /* ... POWER LED always on */ ++ at91_set_gpio_output(AT91_PIN_PC29, 1); ++ ++ /* Setup the serial ports and console */ ++ at91_register_uart(0, 0, 0); /* DBGU = ttyS0 */ ++ at91_set_serial_console(0); ++} ++ ++static void __init cap9adk_init_irq(void) ++{ ++ at91cap9_init_interrupts(NULL); ++} ++ ++ ++/* ++ * USB Host port ++ */ ++static struct at91_usbh_data __initdata cap9adk_usbh_data = { ++ .ports = 2, ++}; ++ ++ ++/* ++ * ADS7846 Touchscreen ++ */ ++#if defined(CONFIG_TOUCHSCREEN_ADS7846) || defined(CONFIG_TOUCHSCREEN_ADS7846_MODULE) ++static int ads7843_pendown_state(void) ++{ ++ return !at91_get_gpio_value(AT91_PIN_PC4); /* Touchscreen PENIRQ */ ++} ++ ++static struct ads7846_platform_data ads_info = { ++ .model = 7843, ++ .x_min = 150, ++ .x_max = 3830, ++ .y_min = 190, ++ .y_max = 3830, ++ .vref_delay_usecs = 100, ++ .x_plate_ohms = 450, ++ .y_plate_ohms = 250, ++ .pressure_max = 15000, ++ .debounce_max = 1, ++ .debounce_rep = 0, ++ .debounce_tol = (~0), ++ .get_pendown_state = ads7843_pendown_state, ++}; ++ ++static void __init cap9adk_add_device_ts(void) ++{ ++ at91_set_gpio_input(AT91_PIN_PC4, 1); /* Touchscreen PENIRQ */ ++ at91_set_gpio_input(AT91_PIN_PC5, 1); /* Touchscreen BUSY */ ++} ++#else ++static void __init cap9adk_add_device_ts(void) {} ++#endif ++ ++ ++/* ++ * SPI devices. ++ */ ++static struct spi_board_info cap9adk_spi_devices[] = { ++#if defined(CONFIG_MTD_AT91_DATAFLASH_CARD) ++ { /* DataFlash card */ ++ .modalias = "mtd_dataflash", ++ .chip_select = 0, ++ .max_speed_hz = 15 * 1000 * 1000, ++ .bus_num = 0, ++ }, ++#endif ++#if defined(CONFIG_TOUCHSCREEN_ADS7846) || defined(CONFIG_TOUCHSCREEN_ADS7846_MODULE) ++ { ++ .modalias = "ads7846", ++ .chip_select = 3, /* can be 2 or 3, depending on J2 jumper */ ++ .max_speed_hz = 125000 * 26, /* (max sample rate @ 3V) * (cmd + data + overhead) */ ++ .bus_num = 0, ++ .platform_data = &ads_info, ++ .irq = AT91_PIN_PC4, ++ }, ++#endif ++}; ++ ++ ++/* ++ * MCI (SD/MMC) ++ */ ++static struct at91_mmc_data __initdata cap9adk_mmc_data = { ++ .wire4 = 1, ++// .det_pin = ... not connected ++// .wp_pin = ... not connected ++// .vcc_pin = ... not connected ++}; ++ ++ ++/* ++ * MACB Ethernet device ++ */ ++static struct at91_eth_data __initdata cap9adk_macb_data = { ++ .is_rmii = 1, ++}; ++ ++ ++/* ++ * NAND flash ++ */ ++static struct mtd_partition __initdata cap9adk_nand_partitions[] = { ++ { ++ .name = "NAND partition", ++ .offset = 0, ++ .size = MTDPART_SIZ_FULL, ++ }, ++}; ++ ++static struct mtd_partition * __init nand_partitions(int size, int *num_partitions) ++{ ++ *num_partitions = ARRAY_SIZE(cap9adk_nand_partitions); ++ return cap9adk_nand_partitions; ++} ++ ++static struct at91_nand_data __initdata cap9adk_nand_data = { ++ .ale = 21, ++ .cle = 22, ++// .det_pin = ... not connected ++// .rdy_pin = ... not connected ++ .enable_pin = AT91_PIN_PD15, ++ .partition_info = nand_partitions, ++#if defined(CONFIG_MTD_NAND_AT91_BUSWIDTH_16) ++ .bus_width_16 = 1, ++#else ++ .bus_width_16 = 0, ++#endif ++}; ++ ++ ++/* ++ * NOR flash ++ */ ++static struct mtd_partition cap9adk_nor_partitions[] = { ++ { ++ .name = "NOR partition", ++ .offset = 0, ++ .size = MTDPART_SIZ_FULL, ++ }, ++}; ++ ++static struct physmap_flash_data cap9adk_nor_data = { ++ .width = 2, ++ .parts = cap9adk_nor_partitions, ++ .nr_parts = ARRAY_SIZE(cap9adk_nor_partitions), ++}; ++ ++#define NOR_BASE AT91_CHIPSELECT_0 ++#define NOR_SIZE 0x800000 ++ ++static struct resource nor_flash_resources[] = { ++ { ++ .start = NOR_BASE, ++ .end = NOR_BASE + NOR_SIZE - 1, ++ .flags = IORESOURCE_MEM, ++ } ++}; ++ ++static struct platform_device cap9adk_nor_flash = { ++ .name = "physmap-flash", ++ .id = 0, ++ .dev = { ++ .platform_data = &cap9adk_nor_data, ++ }, ++ .resource = nor_flash_resources, ++ .num_resources = ARRAY_SIZE(nor_flash_resources), ++}; ++ ++static __init void cap9adk_add_device_nor(void) ++{ ++ unsigned long csa; ++ ++ csa = at91_sys_read(AT91_MATRIX_EBICSA); ++ at91_sys_write(AT91_MATRIX_EBICSA, csa | AT91_MATRIX_EBI_VDDIOMSEL_3_3V); ++ ++ /* set the bus interface characteristics */ ++ at91_sys_write(AT91_SMC_SETUP(0), AT91_SMC_NWESETUP_(4) | AT91_SMC_NCS_WRSETUP_(2) ++ | AT91_SMC_NRDSETUP_(4) | AT91_SMC_NCS_RDSETUP_(2)); ++ ++ at91_sys_write(AT91_SMC_PULSE(0), AT91_SMC_NWEPULSE_(8) | AT91_SMC_NCS_WRPULSE_(10) ++ | AT91_SMC_NRDPULSE_(8) | AT91_SMC_NCS_RDPULSE_(10)); ++ ++ at91_sys_write(AT91_SMC_CYCLE(0), AT91_SMC_NWECYCLE_(16) | AT91_SMC_NRDCYCLE_(16)); ++ ++ at91_sys_write(AT91_SMC_MODE(0), AT91_SMC_READMODE | AT91_SMC_WRITEMODE ++ | AT91_SMC_EXNWMODE_DISABLE | AT91_SMC_BAT_WRITE ++ | AT91_SMC_DBW_16 | AT91_SMC_TDF_(1)); ++ ++ platform_device_register(&cap9adk_nor_flash); ++} ++ ++ ++/* ++ * LCD Controller ++ */ ++#if defined(CONFIG_FB_ATMEL) || defined(CONFIG_FB_ATMEL_MODULE) ++static struct fb_videomode at91_tft_vga_modes[] = { ++ { ++ .name = "TX09D50VM1CCA @ 60", ++ .refresh = 60, ++ .xres = 240, .yres = 320, ++ .pixclock = KHZ2PICOS(4965), ++ ++ .left_margin = 1, .right_margin = 33, ++ .upper_margin = 1, .lower_margin = 0, ++ .hsync_len = 5, .vsync_len = 1, ++ ++ .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, ++ .vmode = FB_VMODE_NONINTERLACED, ++ }, ++}; ++ ++static struct fb_monspecs at91fb_default_monspecs = { ++ .manufacturer = "HIT", ++ .monitor = "TX09D70VM1CCA", ++ ++ .modedb = at91_tft_vga_modes, ++ .modedb_len = ARRAY_SIZE(at91_tft_vga_modes), ++ .hfmin = 15000, ++ .hfmax = 64000, ++ .vfmin = 50, ++ .vfmax = 150, ++}; ++ ++#define AT91CAP9_DEFAULT_LCDCON2 (ATMEL_LCDC_MEMOR_LITTLE \ ++ | ATMEL_LCDC_DISTYPE_TFT \ ++ | ATMEL_LCDC_CLKMOD_ALWAYSACTIVE) ++ ++static void at91_lcdc_power_control(int on) ++{ ++ if (on) ++ at91_set_gpio_value(AT91_PIN_PC0, 0); /* power up */ ++ else ++ at91_set_gpio_value(AT91_PIN_PC0, 1); /* power down */ ++} ++ ++/* Driver datas */ ++static struct atmel_lcdfb_info __initdata cap9adk_lcdc_data = { ++ .default_bpp = 16, ++ .default_dmacon = ATMEL_LCDC_DMAEN, ++ .default_lcdcon2 = AT91CAP9_DEFAULT_LCDCON2, ++ .default_monspecs = &at91fb_default_monspecs, ++ .atmel_lcdfb_power_control = at91_lcdc_power_control, ++ .guard_time = 1, ++}; ++ ++#else ++static struct atmel_lcdfb_info __initdata cap9adk_lcdc_data; ++#endif ++ ++ ++/* ++ * AC97 ++ */ ++static struct atmel_ac97_data cap9adk_ac97_data = { ++// .reset_pin = ... not connected ++}; ++ ++ ++static void __init cap9adk_board_init(void) ++{ ++ /* Serial */ ++ at91_add_device_serial(); ++ /* USB Host */ ++ set_irq_type(AT91CAP9_ID_UHP, IRQT_HIGH); ++ at91_add_device_usbh(&cap9adk_usbh_data); ++ /* SPI */ ++ at91_add_device_spi(cap9adk_spi_devices, ARRAY_SIZE(cap9adk_spi_devices)); ++ /* Touchscreen */ ++ cap9adk_add_device_ts(); ++ /* MMC */ ++ at91_add_device_mmc(1, &cap9adk_mmc_data); ++ /* Ethernet */ ++ at91_add_device_eth(&cap9adk_macb_data); ++ /* NAND */ ++ at91_add_device_nand(&cap9adk_nand_data); ++ /* NOR Flash */ ++ cap9adk_add_device_nor(); ++ /* I2C */ ++ at91_add_device_i2c(NULL, 0); ++ /* LCD Controller */ ++ set_irq_type(AT91CAP9_ID_LCDC, IRQT_HIGH); ++ at91_add_device_lcdc(&cap9adk_lcdc_data); ++ /* AC97 */ ++ at91_add_device_ac97(&cap9adk_ac97_data); ++} ++ ++MACHINE_START(AT91CAP9ADK, "Atmel AT91CAP9A-DK") ++ /* Maintainer: Stelian Pop <stelian.pop@leadtechdesign.com> */ ++ .phys_io = AT91_BASE_SYS, ++ .io_pg_offst = (AT91_VA_BASE_SYS >> 18) & 0xfffc, ++ .boot_params = AT91_SDRAM_BASE + 0x100, ++ .timer = &at91sam926x_timer, ++ .map_io = cap9adk_map_io, ++ .init_irq = cap9adk_init_irq, ++ .init_machine = cap9adk_board_init, ++MACHINE_END +diff -urN -x CVS linux-2.6.24/arch/arm/mach-at91/board-chub.c linux-2.6/arch/arm/mach-at91/board-chub.c +--- linux-2.6.24/arch/arm/mach-at91/board-chub.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-2.6/arch/arm/mach-at91/board-chub.c 2007-12-31 15:18:42.000000000 +0200 +@@ -0,0 +1,132 @@ ++/* ++ * linux/arch/arm/mach-at91/board-chub.c ++ * ++ * Copyright (C) 2005 SAN People, adapted for Promwad Chub board ++ * by Kuten Ivan ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ++ */ ++ ++#include <linux/types.h> ++#include <linux/init.h> ++#include <linux/mm.h> ++#include <linux/module.h> ++#include <linux/platform_device.h> ++ ++#include <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/board.h> ++#include <asm/arch/gpio.h> ++ ++#include "generic.h" ++ ++/* ++ * Serial port configuration. ++ * 0 .. 3 = USART0 .. USART3 ++ * 4 = DBGU ++ */ ++static struct at91_uart_config __initdata chub_uart_config = { ++ .console_tty = 0, /* ttyS0 */ ++ .nr_tty = 5, ++ .tty_map = { 4, 0, 1, 2, 3 } /* ttyS0, ..., ttyS4 */ ++}; ++ ++static void __init chub_init_irq(void) ++{ ++ at91rm9200_init_interrupts(NULL); ++} ++ ++static void __init chub_map_io(void) ++{ ++ /* Initialize clocks: 18.432 MHz crystal */ ++ at91rm9200_initialize(18432000, AT91RM9200_PQFP); ++ ++ /* Setup the serial ports and console */ ++ at91_init_serial(&chub_uart_config); ++} ++ ++static struct at91_eth_data __initdata chub_eth_data = { ++ .phy_irq_pin = AT91_PIN_PB29, ++ .is_rmii = 0, ++}; ++ ++static struct mtd_partition __initdata chub_nand_partition[] = { ++ { ++ .name = "NAND Partition 1", ++ .offset = 0, ++ .size = MTDPART_SIZ_FULL, ++ }, ++}; ++ ++static struct mtd_partition * __init nand_partitions(int size, int *num_partitions) ++{ ++ *num_partitions = ARRAY_SIZE(chub_nand_partition); ++ return chub_nand_partition; ++} ++ ++static struct at91_nand_data __initdata chub_nand_data = { ++ .ale = 22, ++ .cle = 21, ++ .enable_pin = AT91_PIN_PA27, ++ .partition_info = nand_partitions, ++}; ++ ++static struct spi_board_info chub_spi_devices[] = { ++ { /* DataFlash chip */ ++ .modalias = "mtd_dataflash", ++ .chip_select = 0, ++ .max_speed_hz = 15 * 1000 * 1000, ++ }, ++}; ++ ++static void __init chub_board_init(void) ++{ ++ /* Serial */ ++ at91_add_device_serial(); ++ /* I2C */ ++ at91_add_device_i2c(NULL, 0); ++ /* Ethernet */ ++ at91_add_device_eth(&chub_eth_data); ++ /* SPI */ ++ at91_add_device_spi(chub_spi_devices, ARRAY_SIZE(chub_spi_devices)); ++ /* NAND Flash */ ++ at91_add_device_nand(&chub_nand_data); ++ /* Disable write protect for NAND */ ++ at91_set_gpio_output(AT91_PIN_PB7, 1); ++ /* Power enable for 3x RS-232 and 1x RS-485 */ ++ at91_set_gpio_output(AT91_PIN_PB9, 1); ++ /* Disable write protect for FRAM */ ++ at91_set_gpio_output(AT91_PIN_PA21, 1); ++ /* Disable write protect for Dataflash */ ++ at91_set_gpio_output(AT91_PIN_PA19, 1); ++} ++ ++MACHINE_START(CHUB, "Promwad Chub") ++ /* Maintainer: Ivan Kuten AT Promwad DOT com */ ++ .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 = chub_map_io, ++ .init_irq = chub_init_irq, ++ .init_machine = chub_board_init, ++MACHINE_END +diff -urN -x CVS linux-2.6.24/arch/arm/mach-at91/board-csb337.c linux-2.6/arch/arm/mach-at91/board-csb337.c +--- linux-2.6.24/arch/arm/mach-at91/board-csb337.c 2008-03-01 22:02:07.000000000 +0200 ++++ linux-2.6/arch/arm/mach-at91/board-csb337.c 2008-03-01 22:04:55.000000000 +0200 +@@ -24,6 +24,9 @@ + #include <linux/module.h> + #include <linux/platform_device.h> + #include <linux/spi/spi.h> ++#include <linux/interrupt.h> ++#include <linux/input.h> ++#include <linux/gpio_keys.h> + #include <linux/mtd/physmap.h> + + #include <asm/hardware.h> +@@ -59,6 +62,7 @@ + + /* Setup the LEDs */ + at91_init_leds(AT91_PIN_PB0, AT91_PIN_PB1); ++ at91_set_gpio_output(AT91_PIN_PB2, 1); /* third (unused) LED */ + + /* Setup the serial ports and console */ + at91_init_serial(&csb337_uart_config); +@@ -156,6 +160,84 @@ + .num_resources = ARRAY_SIZE(csb_flash_resources), + }; + ++static struct gpio_led csb337_leds[] = { ++ { /* "led0", yellow */ ++ .name = "led0", ++ .gpio = AT91_PIN_PB2, ++ .active_low = 1, ++ .default_trigger = "heartbeat", ++ }, ++ { /* "led1", green */ ++ .name = "led1", ++ .gpio = AT91_PIN_PB1, ++ .active_low = 1, ++ .default_trigger = "mmc0", ++ }, ++ { /* "led2", yellow */ ++ .name = "led2", ++ .gpio = AT91_PIN_PB0, ++ .active_low = 1, ++ .default_trigger = "ide-disk", ++ } ++}; ++ ++/* ++ * GPIO Buttons ++ */ ++#if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE) ++static struct gpio_keys_button csb300_buttons[] = { ++ { ++ .gpio = AT91_PIN_PB29, ++ .code = BTN_0, ++ .desc = "sw0", ++ .active_low = 1, ++ .wakeup = 1, ++ }, ++ { ++ .gpio = AT91_PIN_PB28, ++ .code = BTN_1, ++ .desc = "sw1", ++ .active_low = 1, ++ .wakeup = 1, ++ }, ++ { ++ .gpio = AT91_PIN_PA21, ++ .code = BTN_2, ++ .desc = "sw2", ++ .active_low = 1, ++ .wakeup = 1, ++ } ++}; ++ ++static struct gpio_keys_platform_data csb300_button_data = { ++ .buttons = csb300_buttons, ++ .nbuttons = ARRAY_SIZE(csb300_buttons), ++}; ++ ++static struct platform_device csb300_button_device = { ++ .name = "gpio-keys", ++ .id = -1, ++ .num_resources = 0, ++ .dev = { ++ .platform_data = &csb300_button_data, ++ } ++}; ++ ++static void __init csb300_add_device_buttons(void) ++{ ++ at91_set_gpio_input(AT91_PIN_PB29, 0); /* sw0 */ ++ at91_set_deglitch(AT91_PIN_PB29, 1); ++ at91_set_gpio_input(AT91_PIN_PB28, 0); /* sw1 */ ++ at91_set_deglitch(AT91_PIN_PB28, 1); ++ at91_set_gpio_input(AT91_PIN_PA21, 0); /* sw2 */ ++ at91_set_deglitch(AT91_PIN_PA21, 1); ++ ++ platform_device_register(&csb300_button_device); ++} ++#else ++static void __init csb300_add_device_buttons(void) {} ++#endif ++ + static void __init csb337_board_init(void) + { + /* Serial */ +@@ -175,8 +257,12 @@ + at91_add_device_spi(csb337_spi_devices, ARRAY_SIZE(csb337_spi_devices)); + /* MMC */ + at91_add_device_mmc(0, &csb337_mmc_data); ++ /* LEDS */ ++ at91_gpio_leds(csb337_leds, ARRAY_SIZE(csb337_leds)); + /* NOR flash */ + platform_device_register(&csb_flash); ++ /* Switches on CSB300 */ ++ csb300_add_device_buttons(); + } + + MACHINE_START(CSB337, "Cogent CSB337") +diff -urN -x CVS linux-2.6.24/arch/arm/mach-at91/board-dk.c linux-2.6/arch/arm/mach-at91/board-dk.c +--- linux-2.6.24/arch/arm/mach-at91/board-dk.c 2008-03-01 22:02:07.000000000 +0200 ++++ linux-2.6/arch/arm/mach-at91/board-dk.c 2008-02-18 23:23:26.000000000 +0200 +@@ -25,6 +25,7 @@ + #include <linux/init.h> + #include <linux/mm.h> + #include <linux/module.h> ++#include <linux/dma-mapping.h> + #include <linux/platform_device.h> + #include <linux/spi/spi.h> + #include <linux/mtd/physmap.h> +@@ -73,6 +74,185 @@ + at91rm9200_init_interrupts(NULL); + } + ++#if defined(CONFIG_FB_S1D13XXX) || defined(CONFIG_FB_S1D13XXX_MODULE) ++#include <video/s1d13xxxfb.h> ++#include <asm/arch/ics1523.h> ++ ++/* EPSON S1D13806 FB */ ++#define AT91_FB_REG_BASE 0x30000000L ++#define AT91_FB_REG_SIZE 0x200 ++#define AT91_FB_VMEM_BASE 0x30200000L ++#define AT91_FB_VMEM_SIZE 0x140000L ++ ++static void __init dk_init_video(void) ++{ ++ /* NWAIT Signal */ ++ at91_set_A_periph(AT91_PIN_PC6, 0); ++ ++ /* Initialization of the Static Memory Controller for Chip Select 2 */ ++ at91_sys_write(AT91_SMC_CSR(2), AT91_SMC_DBW_16 /* 16 bit */ ++ | AT91_SMC_WSEN | AT91_SMC_NWS_(4) /* wait states */ ++ | AT91_SMC_TDF_(1) /* float time */ ++ ); ++ ++ at91_ics1523_init(); ++} ++ ++/* CRT: (active) 640x480 60Hz (PCLK=CLKI=25.175MHz) ++ Memory: Embedded SDRAM (MCLK=CLKI3=50.000MHz) (BUSCLK=60.000MHz) */ ++static const struct s1d13xxxfb_regval dk_s1dfb_initregs[] = { ++ {S1DREG_MISC, 0x00}, /* Enable Memory/Register select bit */ ++ {S1DREG_COM_DISP_MODE, 0x00}, /* disable display output */ ++ {S1DREG_GPIO_CNF0, 0x00}, ++ {S1DREG_GPIO_CNF1, 0x00}, ++ {S1DREG_GPIO_CTL0, 0x08}, ++ {S1DREG_GPIO_CTL1, 0x00}, ++ {S1DREG_CLK_CNF, 0x01}, /* no divide, MCLK source is CLKI3 0x02*/ ++ {S1DREG_LCD_CLK_CNF, 0x00}, ++ {S1DREG_CRT_CLK_CNF, 0x00}, ++ {S1DREG_MPLUG_CLK_CNF, 0x00}, ++ {S1DREG_CPU2MEM_WST_SEL, 0x01}, /* 2*period(MCLK) - 4ns > period(BCLK) */ ++ {S1DREG_SDRAM_REF_RATE, 0x03}, /* 32768 <= MCLK <= 50000 (MHz) */ ++ {S1DREG_SDRAM_TC0, 0x00}, /* MCLK source freq (MHz): */ ++ {S1DREG_SDRAM_TC1, 0x01}, /* 42 <= MCLK <= 50 */ ++ {S1DREG_MEM_CNF, 0x80}, /* SDRAM Initialization - needed before mem access */ ++ {S1DREG_PANEL_TYPE, 0x25}, /* std TFT 16bit, 8bit SCP format 2, single passive LCD */ ++ {S1DREG_MOD_RATE, 0x00}, /* toggle every FPFRAME */ ++ {S1DREG_LCD_DISP_HWIDTH, 0x4F}, /* 680 pix */ ++ {S1DREG_LCD_NDISP_HPER, 0x12}, /* 152 pix */ ++ {S1DREG_TFT_FPLINE_START, 0x01}, /* 13 pix */ ++ {S1DREG_TFT_FPLINE_PWIDTH, 0x0B}, /* 96 pix */ ++ {S1DREG_LCD_DISP_VHEIGHT0, 0xDF}, ++ {S1DREG_LCD_DISP_VHEIGHT1, 0x01}, /* 480 lines */ ++ {S1DREG_LCD_NDISP_VPER, 0x2C}, /* 44 lines */ ++ {S1DREG_TFT_FPFRAME_START, 0x0A}, /* 10 lines */ ++ {S1DREG_TFT_FPFRAME_PWIDTH, 0x01}, /* 2 lines */ ++ {S1DREG_LCD_DISP_MODE, 0x05}, /* 16 bpp */ ++ {S1DREG_LCD_MISC, 0x00}, /* dithering enabled, dual panel buffer enabled */ ++ {S1DREG_LCD_DISP_START0, 0x00}, ++ {S1DREG_LCD_DISP_START1, 0xC8}, ++ {S1DREG_LCD_DISP_START2, 0x00}, ++ {S1DREG_LCD_MEM_OFF0, 0x80}, ++ {S1DREG_LCD_MEM_OFF1, 0x02}, ++ {S1DREG_LCD_PIX_PAN, 0x00}, ++ {S1DREG_LCD_DISP_FIFO_HTC, 0x3B}, ++ {S1DREG_LCD_DISP_FIFO_LTC, 0x3C}, ++ {S1DREG_CRT_DISP_HWIDTH, 0x4F}, /* 680 pix */ ++ {S1DREG_CRT_NDISP_HPER, 0x13}, /* 160 pix */ ++ {S1DREG_CRT_HRTC_START, 0x01}, /* 13 pix */ ++ {S1DREG_CRT_HRTC_PWIDTH, 0x0B}, /* 96 pix */ ++ {S1DREG_CRT_DISP_VHEIGHT0, 0xDF}, ++ {S1DREG_CRT_DISP_VHEIGHT1, 0x01}, /* 480 lines */ ++ {S1DREG_CRT_NDISP_VPER, 0x2B}, /* 44 lines */ ++ {S1DREG_CRT_VRTC_START, 0x09}, /* 10 lines */ ++ {S1DREG_CRT_VRTC_PWIDTH, 0x01}, /* 2 lines */ ++ {S1DREG_TV_OUT_CTL, 0x10}, ++ {S1DREG_CRT_DISP_MODE, 0x05}, /* 16 bpp */ ++ {S1DREG_CRT_DISP_START0, 0x00}, ++ {S1DREG_CRT_DISP_START1, 0x00}, ++ {S1DREG_CRT_DISP_START2, 0x00}, ++ {S1DREG_CRT_MEM_OFF0, 0x80}, ++ {S1DREG_CRT_MEM_OFF1, 0x02}, ++ {S1DREG_CRT_PIX_PAN, 0x00}, ++ {S1DREG_CRT_DISP_FIFO_HTC, 0x3B}, ++ {S1DREG_CRT_DISP_FIFO_LTC, 0x3C}, ++ {S1DREG_LCD_CUR_CTL, 0x00}, /* inactive */ ++ {S1DREG_LCD_CUR_START, 0x01}, ++ {S1DREG_LCD_CUR_XPOS0, 0x00}, ++ {S1DREG_LCD_CUR_XPOS1, 0x00}, ++ {S1DREG_LCD_CUR_YPOS0, 0x00}, ++ {S1DREG_LCD_CUR_YPOS1, 0x00}, ++ {S1DREG_LCD_CUR_BCTL0, 0x00}, ++ {S1DREG_LCD_CUR_GCTL0, 0x00}, ++ {S1DREG_LCD_CUR_RCTL0, 0x00}, ++ {S1DREG_LCD_CUR_BCTL1, 0x1F}, ++ {S1DREG_LCD_CUR_GCTL1, 0x3F}, ++ {S1DREG_LCD_CUR_RCTL1, 0x1F}, ++ {S1DREG_LCD_CUR_FIFO_HTC, 0x00}, ++ {S1DREG_CRT_CUR_CTL, 0x00}, /* inactive */ ++ {S1DREG_CRT_CUR_START, 0x01}, ++ {S1DREG_CRT_CUR_XPOS0, 0x00}, ++ {S1DREG_CRT_CUR_XPOS1, 0x00}, ++ {S1DREG_CRT_CUR_YPOS0, 0x00}, ++ {S1DREG_CRT_CUR_YPOS1, 0x00}, ++ {S1DREG_CRT_CUR_BCTL0, 0x00}, ++ {S1DREG_CRT_CUR_GCTL0, 0x00}, ++ {S1DREG_CRT_CUR_RCTL0, 0x00}, ++ {S1DREG_CRT_CUR_BCTL1, 0x1F}, ++ {S1DREG_CRT_CUR_GCTL1, 0x3F}, ++ {S1DREG_CRT_CUR_RCTL1, 0x1F}, ++ {S1DREG_CRT_CUR_FIFO_HTC, 0x00}, ++ {S1DREG_BBLT_CTL0, 0x00}, ++ {S1DREG_BBLT_CTL0, 0x00}, ++ {S1DREG_BBLT_CC_EXP, 0x00}, ++ {S1DREG_BBLT_OP, 0x00}, ++ {S1DREG_BBLT_SRC_START0, 0x00}, ++ {S1DREG_BBLT_SRC_START1, 0x00}, ++ {S1DREG_BBLT_SRC_START2, 0x00}, ++ {S1DREG_BBLT_DST_START0, 0x00}, ++ {S1DREG_BBLT_DST_START1, 0x00}, ++ {S1DREG_BBLT_DST_START2, 0x00}, ++ {S1DREG_BBLT_MEM_OFF0, 0x00}, ++ {S1DREG_BBLT_MEM_OFF1, 0x00}, ++ {S1DREG_BBLT_WIDTH0, 0x00}, ++ {S1DREG_BBLT_WIDTH1, 0x00}, ++ {S1DREG_BBLT_HEIGHT0, 0x00}, ++ {S1DREG_BBLT_HEIGHT1, 0x00}, ++ {S1DREG_BBLT_BGC0, 0x00}, ++ {S1DREG_BBLT_BGC1, 0x00}, ++ {S1DREG_BBLT_FGC0, 0x00}, ++ {S1DREG_BBLT_FGC1, 0x00}, ++ {S1DREG_LKUP_MODE, 0x00}, /* LCD LUT r | LCD and CRT/TV LUT w */ ++ {S1DREG_LKUP_ADDR, 0x00}, ++ {S1DREG_PS_CNF, 0x00}, /* Power Save disable */ ++ {S1DREG_PS_STATUS, 0x02}, /* LCD Panel down, mem up */ ++ {S1DREG_CPU2MEM_WDOGT, 0x00}, ++ {S1DREG_COM_DISP_MODE, 0x02}, /* enable CRT display output */ ++}; ++ ++static struct s1d13xxxfb_pdata dk_s1dfb_pdata = { ++ .initregs = dk_s1dfb_initregs, ++ .initregssize = ARRAY_SIZE(dk_s1dfb_initregs), ++ .platform_init_video = dk_init_video, ++}; ++ ++static u64 s1dfb_dmamask = DMA_BIT_MASK(32); ++ ++static struct resource dk_s1dfb_resource[] = { ++ [0] = { /* video mem */ ++ .name = "s1d13806 memory", ++ .start = AT91_FB_VMEM_BASE, ++ .end = AT91_FB_VMEM_BASE + AT91_FB_VMEM_SIZE -1, ++ .flags = IORESOURCE_MEM, ++ }, ++ [1] = { /* video registers */ ++ .name = "s1d13806 registers", ++ .start = AT91_FB_REG_BASE, ++ .end = AT91_FB_REG_BASE + AT91_FB_REG_SIZE -1, ++ .flags = IORESOURCE_MEM, ++ }, ++}; ++ ++static struct platform_device dk_s1dfb_device = { ++ .name = "s1d13806fb", ++ .id = -1, ++ .dev = { ++ .dma_mask = &s1dfb_dmamask, ++ .coherent_dma_mask = DMA_BIT_MASK(32), ++ .platform_data = &dk_s1dfb_pdata, ++ }, ++ .resource = dk_s1dfb_resource, ++ .num_resources = ARRAY_SIZE(dk_s1dfb_resource), ++}; ++ ++static void __init dk_add_device_video(void) ++{ ++ platform_device_register(&dk_s1dfb_device); ++} ++#else ++static void __init dk_add_device_video(void) {} ++#endif ++ + static struct at91_eth_data __initdata dk_eth_data = { + .phy_irq_pin = AT91_PIN_PC4, + .is_rmii = 1, +@@ -164,7 +344,7 @@ + #define DK_FLASH_SIZE 0x200000 + + static struct physmap_flash_data dk_flash_data = { +- .width = 2, ++ .width = 2, + }; + + static struct resource dk_flash_resource = { +@@ -183,6 +363,14 @@ + .num_resources = 1, + }; + ++static struct gpio_led dk_leds[] = { ++ { ++ .name = "led0", ++ .gpio = AT91_PIN_PB2, ++ .active_low = 1, ++ .default_trigger = "heartbeat", ++ } ++}; + + static void __init dk_board_init(void) + { +@@ -213,8 +401,14 @@ + at91_add_device_nand(&dk_nand_data); + /* NOR Flash */ + platform_device_register(&dk_flash); ++ /* LEDs */ ++ at91_gpio_leds(dk_leds, ARRAY_SIZE(dk_leds)); ++ /* SSC (to LM4549 audio codec) */ ++ at91_add_device_ssc(AT91RM9200_ID_SSC1, ATMEL_SSC_TD | ATMEL_SSC_RX); ++ /* SSC (to SI3021 line interface) */ ++ at91_add_device_ssc(AT91RM9200_ID_SSC2, ATMEL_SSC_TD | ATMEL_SSC_TK | ATMEL_SSC_RD | ATMEL_SSC_RF); + /* VGA */ +-// dk_add_device_video(); ++ dk_add_device_video(); + } + + MACHINE_START(AT91RM9200DK, "Atmel AT91RM9200-DK") +diff -urN -x CVS linux-2.6.24/arch/arm/mach-at91/board-ecbat91.c linux-2.6/arch/arm/mach-at91/board-ecbat91.c +--- linux-2.6.24/arch/arm/mach-at91/board-ecbat91.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-2.6/arch/arm/mach-at91/board-ecbat91.c 2007-12-31 15:18:42.000000000 +0200 +@@ -0,0 +1,183 @@ ++/* ++ * linux/arch/arm/mach-at91rm9200/board-ecbat91.c ++ * Copyright (C) 2007 emQbit.com. ++ * ++ * We started from board-dk.c, which is 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/types.h> ++#include <linux/init.h> ++#include <linux/mm.h> ++#include <linux/module.h> ++#include <linux/platform_device.h> ++#include <linux/spi/spi.h> ++#include <linux/spi/flash.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/board.h> ++#include <asm/arch/gpio.h> ++ ++#include "generic.h" ++ ++ ++/* ++ * Serial port configuration. ++ * 0 .. 3 = USART0 .. USART3 ++ * 4 = DBGU ++ */ ++static struct at91_uart_config __initdata ecb_at91uart_config = { ++ .console_tty = 0, /* ttyS0 */ ++ .nr_tty = 2, ++ .tty_map = { 4, 0, -1, -1, -1 } /* ttyS0, ..., ttyS4 */ ++}; ++ ++static void __init ecb_at91map_io(void) ++{ ++ /* Initialize processor: 18.432 MHz crystal */ ++ at91rm9200_initialize(18432000, AT91RM9200_PQFP); ++ ++ /* Setup the LEDs */ ++ at91_init_leds(AT91_PIN_PC7, AT91_PIN_PC7); ++ ++ /* Setup the serial ports and console */ ++ at91_init_serial(&ecb_at91uart_config); ++} ++ ++static void __init ecb_at91init_irq(void) ++{ ++ at91rm9200_init_interrupts(NULL); ++} ++ ++static struct at91_eth_data __initdata ecb_at91eth_data = { ++ .phy_irq_pin = AT91_PIN_PC4, ++ .is_rmii = 0, ++}; ++ ++static struct at91_usbh_data __initdata ecb_at91usbh_data = { ++ .ports = 1, ++}; ++ ++static struct at91_mmc_data __initdata ecb_at91mmc_data = { ++ .slot_b = 0, ++ .wire4 = 1, ++}; ++ ++ ++#if defined(CONFIG_MTD_DATAFLASH) ++static struct mtd_partition __initdata my_flash0_partitions[] = ++{ ++ { /* 0x8400 */ ++ .name = "Darrell-loader", ++ .offset = 0, ++ .size = 12* 1056, ++ }, ++ { ++ .name = "U-boot", ++ .offset = MTDPART_OFS_NXTBLK, ++ .size = 110 * 1056, ++ }, ++ { /* 1336 (167 blocks) pages * 1056 bytes = 0x158700 bytes */ ++ .name = "Uoot-env", ++ .offset = MTDPART_OFS_NXTBLK, ++ .size = 8 * 1056, ++ }, ++ { /* 1336 (167 blocks) pages * 1056 bytes = 0x158700 bytes */ ++ .name = "Kernel", ++ .offset = MTDPART_OFS_NXTBLK, ++ .size = 1534 * 1056, ++ }, ++ { /* 190200 - jffs2 root filesystem */ ++ .name = "Filesystem", ++ .offset = MTDPART_OFS_NXTBLK, ++ .size = MTDPART_SIZ_FULL, /* 26 sectors */ ++ } ++}; ++ ++static struct flash_platform_data __initdata my_flash0_platform = { ++ .name = "Removable flash card", ++ .parts = my_flash0_partitions, ++ .nr_parts = ARRAY_SIZE(my_flash0_partitions) ++}; ++ ++#endif ++ ++static struct spi_board_info __initdata ecb_at91spi_devices[] = { ++ { /* DataFlash chip */ ++ .modalias = "mtd_dataflash", ++ .chip_select = 0, ++ .max_speed_hz = 10 * 1000 * 1000, ++ .bus_num = 0, ++#if defined(CONFIG_MTD_DATAFLASH) ++ .platform_data = &my_flash0_platform, ++#endif ++ }, ++ { /* User accessable spi - cs1 (250KHz) */ ++ .modalias = "spi-cs1", ++ .chip_select = 1, ++ .max_speed_hz = 250 * 1000, ++ }, ++ { /* User accessable spi - cs2 (1MHz) */ ++ .modalias = "spi-cs2", ++ .chip_select = 2, ++ .max_speed_hz = 1 * 1000 * 1000, ++ }, ++ { /* User accessable spi - cs3 (10MHz) */ ++ .modalias = "spi-cs3", ++ .chip_select = 3, ++ .max_speed_hz = 10 * 1000 * 1000, ++ }, ++}; ++ ++static void __init ecb_at91board_init(void) ++{ ++ /* Serial */ ++ at91_add_device_serial(); ++ ++ /* Ethernet */ ++ at91_add_device_eth(&ecb_at91eth_data); ++ ++ /* USB Host */ ++ at91_add_device_usbh(&ecb_at91usbh_data); ++ ++ /* I2C */ ++ at91_add_device_i2c(NULL, 0); ++ ++ /* MMC */ ++ at91_add_device_mmc(0, &ecb_at91mmc_data); ++ ++ /* SPI */ ++ at91_add_device_spi(ecb_at91spi_devices, ARRAY_SIZE(ecb_at91spi_devices)); ++} ++ ++MACHINE_START(ECBAT91, "emQbit's ECB_AT91") ++ /* Maintainer: emQbit.com */ ++ .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 = ecb_at91map_io, ++ .init_irq = ecb_at91init_irq, ++ .init_machine = ecb_at91board_init, ++MACHINE_END +diff -urN -x CVS linux-2.6.24/arch/arm/mach-at91/board-ek.c linux-2.6/arch/arm/mach-at91/board-ek.c +--- linux-2.6.24/arch/arm/mach-at91/board-ek.c 2008-03-01 22:02:07.000000000 +0200 ++++ linux-2.6/arch/arm/mach-at91/board-ek.c 2008-02-18 22:26:42.000000000 +0200 +@@ -25,6 +25,7 @@ + #include <linux/init.h> + #include <linux/mm.h> + #include <linux/module.h> ++#include <linux/dma-mapping.h> + #include <linux/platform_device.h> + #include <linux/spi/spi.h> + #include <linux/mtd/physmap.h> +@@ -73,6 +74,187 @@ + at91rm9200_init_interrupts(NULL); + } + ++#if defined(CONFIG_FB_S1D13XXX) || defined(CONFIG_FB_S1D13XXX_MODULE) ++#include <video/s1d13xxxfb.h> ++#include <asm/arch/ics1523.h> ++ ++/* EPSON S1D13806 FB */ ++#define AT91_FB_REG_BASE 0x40000000L ++#define AT91_FB_REG_SIZE 0x200 ++#define AT91_FB_VMEM_BASE 0x40200000L ++#define AT91_FB_VMEM_SIZE 0x140000L ++ ++static void __init ek_init_video(void) ++{ ++ /* NWAIT Signal */ ++ at91_set_A_periph(AT91_PIN_PC6, 0); ++ ++ /* Initialization of the Static Memory Controller for Chip Select 3 */ ++ at91_sys_write(AT91_SMC_CSR(3), AT91_SMC_DBW_16 /* 16 bit */ ++ | AT91_SMC_WSEN | AT91_SMC_NWS_(5) /* wait states */ ++ | AT91_SMC_TDF_(1) /* float time */ ++ ); ++ ++ at91_ics1523_init(); ++} ++ ++/* CRT: (active) 640x480 60Hz (PCLK=CLKI=25.175MHz) ++ Memory: Embedded SDRAM (MCLK=CLKI3=50.000MHz) (BUSCLK=60.000MHz) */ ++static const struct s1d13xxxfb_regval ek_s1dfb_initregs[] = { ++ {S1DREG_MISC, 0x00}, /* Enable Memory/Register select bit */ ++ {S1DREG_COM_DISP_MODE, 0x00}, /* disable display output */ ++ {S1DREG_GPIO_CNF0, 0xFF}, // 0x00 ++ {S1DREG_GPIO_CNF1, 0x1F}, // 0x08 ++ {S1DREG_GPIO_CTL0, 0x00}, ++ {S1DREG_GPIO_CTL1, 0x00}, ++ {S1DREG_CLK_CNF, 0x01}, /* no divide, MCLK source is CLKI3 0x02*/ ++ {S1DREG_LCD_CLK_CNF, 0x00}, ++ {S1DREG_CRT_CLK_CNF, 0x00}, ++ {S1DREG_MPLUG_CLK_CNF, 0x00}, ++ {S1DREG_CPU2MEM_WST_SEL, 0x01}, /* 2*period(MCLK) - 4ns > period(BCLK) */ ++ {S1DREG_SDRAM_REF_RATE, 0x03}, /* 32768 <= MCLK <= 50000 (MHz) */ ++ {S1DREG_SDRAM_TC0, 0x00}, /* MCLK source freq (MHz): */ ++ {S1DREG_SDRAM_TC1, 0x01}, /* 42 <= MCLK <= 50 */ ++ {S1DREG_MEM_CNF, 0x80}, /* SDRAM Initialization - needed before mem access */ ++ {S1DREG_PANEL_TYPE, 0x25}, /* std TFT 16bit, 8bit SCP format 2, single passive LCD */ ++ {S1DREG_MOD_RATE, 0x00}, /* toggle every FPFRAME */ ++ {S1DREG_LCD_DISP_HWIDTH, 0x4F}, /* 680 pix */ ++ {S1DREG_LCD_NDISP_HPER, 0x12}, /* 152 pix */ ++ {S1DREG_TFT_FPLINE_START, 0x01}, /* 13 pix */ ++ {S1DREG_TFT_FPLINE_PWIDTH, 0x0B}, /* 96 pix */ ++ {S1DREG_LCD_DISP_VHEIGHT0, 0xDF}, ++ {S1DREG_LCD_DISP_VHEIGHT1, 0x01}, /* 480 lines */ ++ {S1DREG_LCD_NDISP_VPER, 0x2C}, /* 44 lines */ ++ {S1DREG_TFT_FPFRAME_START, 0x0A}, /* 10 lines */ ++ {S1DREG_TFT_FPFRAME_PWIDTH, 0x01}, /* 2 lines */ ++ {S1DREG_LCD_DISP_MODE, 0x05}, /* 16 bpp */ ++ {S1DREG_LCD_MISC, 0x00}, /* dithering enabled, dual panel buffer enabled */ ++ {S1DREG_LCD_DISP_START0, 0x00}, ++ {S1DREG_LCD_DISP_START1, 0xC8}, ++ {S1DREG_LCD_DISP_START2, 0x00}, ++ {S1DREG_LCD_MEM_OFF0, 0x80}, ++ {S1DREG_LCD_MEM_OFF1, 0x02}, ++ {S1DREG_LCD_PIX_PAN, 0x00}, ++ {S1DREG_LCD_DISP_FIFO_HTC, 0x3B}, ++ {S1DREG_LCD_DISP_FIFO_LTC, 0x3C}, ++ {S1DREG_CRT_DISP_HWIDTH, 0x4F}, /* 680 pix */ ++ {S1DREG_CRT_NDISP_HPER, 0x13}, /* 160 pix */ ++ {S1DREG_CRT_HRTC_START, 0x01}, /* 13 pix */ ++ {S1DREG_CRT_HRTC_PWIDTH, 0x0B}, /* 96 pix */ ++ {S1DREG_CRT_DISP_VHEIGHT0, 0xDF}, ++ {S1DREG_CRT_DISP_VHEIGHT1, 0x01}, /* 480 lines */ ++ {S1DREG_CRT_NDISP_VPER, 0x2B}, /* 44 lines */ ++ {S1DREG_CRT_VRTC_START, 0x09}, /* 10 lines */ ++ {S1DREG_CRT_VRTC_PWIDTH, 0x01}, /* 2 lines */ ++ {S1DREG_TV_OUT_CTL, 0x10}, ++ {0x005E, 0x9F}, ++ {0x005F, 0x00}, ++ {S1DREG_CRT_DISP_MODE, 0x05}, /* 16 bpp */ ++ {S1DREG_CRT_DISP_START0, 0x00}, ++ {S1DREG_CRT_DISP_START1, 0x00}, ++ {S1DREG_CRT_DISP_START2, 0x00}, ++ {S1DREG_CRT_MEM_OFF0, 0x80}, ++ {S1DREG_CRT_MEM_OFF1, 0x02}, ++ {S1DREG_CRT_PIX_PAN, 0x00}, ++ {S1DREG_CRT_DISP_FIFO_HTC, 0x3B}, ++ {S1DREG_CRT_DISP_FIFO_LTC, 0x3C}, ++ {S1DREG_LCD_CUR_CTL, 0x00}, /* inactive */ ++ {S1DREG_LCD_CUR_START, 0x01}, ++ {S1DREG_LCD_CUR_XPOS0, 0x00}, ++ {S1DREG_LCD_CUR_XPOS1, 0x00}, ++ {S1DREG_LCD_CUR_YPOS0, 0x00}, ++ {S1DREG_LCD_CUR_YPOS1, 0x00}, ++ {S1DREG_LCD_CUR_BCTL0, 0x00}, ++ {S1DREG_LCD_CUR_GCTL0, 0x00}, ++ {S1DREG_LCD_CUR_RCTL0, 0x00}, ++ {S1DREG_LCD_CUR_BCTL1, 0x1F}, ++ {S1DREG_LCD_CUR_GCTL1, 0x3F}, ++ {S1DREG_LCD_CUR_RCTL1, 0x1F}, ++ {S1DREG_LCD_CUR_FIFO_HTC, 0x00}, ++ {S1DREG_CRT_CUR_CTL, 0x00}, /* inactive */ ++ {S1DREG_CRT_CUR_START, 0x01}, ++ {S1DREG_CRT_CUR_XPOS0, 0x00}, ++ {S1DREG_CRT_CUR_XPOS1, 0x00}, ++ {S1DREG_CRT_CUR_YPOS0, 0x00}, ++ {S1DREG_CRT_CUR_YPOS1, 0x00}, ++ {S1DREG_CRT_CUR_BCTL0, 0x00}, ++ {S1DREG_CRT_CUR_GCTL0, 0x00}, ++ {S1DREG_CRT_CUR_RCTL0, 0x00}, ++ {S1DREG_CRT_CUR_BCTL1, 0x1F}, ++ {S1DREG_CRT_CUR_GCTL1, 0x3F}, ++ {S1DREG_CRT_CUR_RCTL1, 0x1F}, ++ {S1DREG_CRT_CUR_FIFO_HTC, 0x00}, ++ {S1DREG_BBLT_CTL0, 0x00}, ++ {S1DREG_BBLT_CTL0, 0x00}, ++ {S1DREG_BBLT_CC_EXP, 0x00}, ++ {S1DREG_BBLT_OP, 0x00}, ++ {S1DREG_BBLT_SRC_START0, 0x00}, ++ {S1DREG_BBLT_SRC_START1, 0x00}, ++ {S1DREG_BBLT_SRC_START2, 0x00}, ++ {S1DREG_BBLT_DST_START0, 0x00}, ++ {S1DREG_BBLT_DST_START1, 0x00}, ++ {S1DREG_BBLT_DST_START2, 0x00}, ++ {S1DREG_BBLT_MEM_OFF0, 0x00}, ++ {S1DREG_BBLT_MEM_OFF1, 0x00}, ++ {S1DREG_BBLT_WIDTH0, 0x00}, ++ {S1DREG_BBLT_WIDTH1, 0x00}, ++ {S1DREG_BBLT_HEIGHT0, 0x00}, ++ {S1DREG_BBLT_HEIGHT1, 0x00}, ++ {S1DREG_BBLT_BGC0, 0x00}, ++ {S1DREG_BBLT_BGC1, 0x00}, ++ {S1DREG_BBLT_FGC0, 0x00}, ++ {S1DREG_BBLT_FGC1, 0x00}, ++ {S1DREG_LKUP_MODE, 0x00}, /* LCD LUT r | LCD and CRT/TV LUT w */ ++ {S1DREG_LKUP_ADDR, 0x00}, ++ {S1DREG_PS_CNF, 0x10}, /* Power Save disable */ ++ {S1DREG_PS_STATUS, 0x02}, /* LCD Panel down, mem up */ ++ {S1DREG_CPU2MEM_WDOGT, 0x00}, ++ {S1DREG_COM_DISP_MODE, 0x02}, /* enable CRT display output */ ++}; ++ ++static struct s1d13xxxfb_pdata ek_s1dfb_pdata = { ++ .initregs = ek_s1dfb_initregs, ++ .initregssize = ARRAY_SIZE(ek_s1dfb_initregs), ++ .platform_init_video = ek_init_video, ++}; ++ ++static u64 s1dfb_dmamask = DMA_BIT_MASK(32); ++ ++static struct resource ek_s1dfb_resource[] = { ++ [0] = { /* video mem */ ++ .name = "s1d13806 memory", ++ .start = AT91_FB_VMEM_BASE, ++ .end = AT91_FB_VMEM_BASE + AT91_FB_VMEM_SIZE -1, ++ .flags = IORESOURCE_MEM, ++ }, ++ [1] = { /* video registers */ ++ .name = "s1d13806 registers", ++ .start = AT91_FB_REG_BASE, ++ .end = AT91_FB_REG_BASE + AT91_FB_REG_SIZE -1, ++ .flags = IORESOURCE_MEM, ++ }, ++}; ++ ++static struct platform_device ek_s1dfb_device = { ++ .name = "s1d13806fb", ++ .id = -1, ++ .dev = { ++ .dma_mask = &s1dfb_dmamask, ++ .coherent_dma_mask = DMA_BIT_MASK(32), ++ .platform_data = &ek_s1dfb_pdata, ++ }, ++ .resource = ek_s1dfb_resource, ++ .num_resources = ARRAY_SIZE(ek_s1dfb_resource), ++}; ++ ++static void __init ek_add_device_video(void) ++{ ++ platform_device_register(&ek_s1dfb_device); ++} ++#else ++static void __init ek_add_device_video(void) {} ++#endif ++ + static struct at91_eth_data __initdata ek_eth_data = { + .phy_irq_pin = AT91_PIN_PC4, + .is_rmii = 1, +@@ -122,7 +304,7 @@ + #define EK_FLASH_SIZE 0x200000 + + static struct physmap_flash_data ek_flash_data = { +- .width = 2, ++ .width = 2, + }; + + static struct resource ek_flash_resource = { +@@ -141,6 +323,25 @@ + .num_resources = 1, + }; + ++static struct gpio_led ek_leds[] = { ++ { /* "user led 1", DS2 */ ++ .name = "green", ++ .gpio = AT91_PIN_PB0, ++ .active_low = 1, ++ .default_trigger = "mmc0", ++ }, ++ { /* "user led 2", DS4 */ ++ .name = "yellow", ++ .gpio = AT91_PIN_PB1, ++ .active_low = 1, ++ .default_trigger = "heartbeat", ++ }, ++ { /* "user led 3", DS6 */ ++ .name = "red", ++ .gpio = AT91_PIN_PB2, ++ .active_low = 1, ++ } ++}; + + static void __init ek_board_init(void) + { +@@ -167,8 +368,10 @@ + #endif + /* NOR Flash */ + platform_device_register(&ek_flash); ++ /* LEDs */ ++ at91_gpio_leds(ek_leds, ARRAY_SIZE(ek_leds)); + /* VGA */ +-// ek_add_device_video(); ++ ek_add_device_video(); + } + + MACHINE_START(AT91RM9200EK, "Atmel AT91RM9200-EK") +diff -urN -x CVS linux-2.6.24/arch/arm/mach-at91/board-homematic.c linux-2.6/arch/arm/mach-at91/board-homematic.c +--- linux-2.6.24/arch/arm/mach-at91/board-homematic.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-2.6/arch/arm/mach-at91/board-homematic.c 2007-12-31 15:18:42.000000000 +0200 +@@ -0,0 +1,163 @@ ++/* ++ * linux/arch/arm/mach-at91/board-homematic.c ++ * ++ * Copyright (C) 2007 eQ-3 Entwicklung GmbH ++ * ++ * based on work ++ * 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/types.h> ++#include <linux/init.h> ++#include <linux/mm.h> ++#include <linux/module.h> ++#include <linux/platform_device.h> ++#include <linux/spi/spi.h> ++#include <linux/mtd/physmap.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/board.h> ++#include <asm/arch/gpio.h> ++#include <asm/arch/at91rm9200_mc.h> ++ ++#include "generic.h" ++ ++ ++/* ++ * Serial port configuration. ++ * 0 .. 3 = USART0 .. USART3 ++ * 4 = DBGU ++ */ ++static struct at91_uart_config __initdata homematic_uart_config = { ++ .console_tty = 0, /* ttyS0 */ ++ .nr_tty = 2, ++ .tty_map = { 4, 1, -1, -1, -1 } /* ttyS0, ..., ttyS4 */ ++}; ++ ++static void __init homematic_map_io(void) ++{ ++ /* Initialize processor: 18.432 MHz crystal */ ++ at91rm9200_initialize(18432000, AT91RM9200_BGA); ++ ++ /* Setup the serial ports and console */ ++ at91_init_serial(&homematic_uart_config); ++} ++ ++static void __init homematic_init_irq(void) ++{ ++ at91rm9200_init_interrupts(NULL); ++} ++ ++static struct at91_eth_data __initdata homematic_eth_data = { ++ .phy_irq_pin = AT91_PIN_PC4, ++ .is_rmii = 0, ++}; ++ ++static struct at91_usbh_data __initdata homematic_usbh_data = { ++ .ports = 2, ++}; ++ ++static struct at91_udc_data __initdata homematic_udc_data = { ++ .vbus_pin = AT91_PIN_PD4, ++ .pullup_pin = AT91_PIN_PD5, ++}; ++ ++static struct at91_mmc_data __initdata homematic_mmc_data = { ++ .slot_b = 0, ++ .wire4 = 1, ++}; ++ ++static struct spi_board_info homematic_spi_devices[] = { ++ { /* DataFlash chip */ ++ .modalias = "mtd_dataflash", ++ .chip_select = 0, ++ .max_speed_hz = 15 * 1000 * 1000, ++ }, ++}; ++ ++static struct mtd_partition __initdata homematic_nand_partition[] = { ++ { ++ .name = "root", ++ .offset = 0, ++ .size = 0x02000000, ++ }, { ++ .name = "storage", ++ .offset = 0x02000000, ++ .size = MTDPART_SIZ_FULL, ++ }, ++}; ++ ++static struct mtd_partition * __init nand_partitions(int size, int *num_partitions) ++{ ++ *num_partitions = ARRAY_SIZE(homematic_nand_partition); ++ return homematic_nand_partition; ++} ++ ++static struct at91_nand_data __initdata homematic_nand_data = { ++ .ale = 22, ++ .cle = 21, ++// .det_pin = AT91_PIN_PB1, ++ .rdy_pin = AT91_PIN_PC2, ++ .enable_pin = AT91_PIN_PC0, ++ .partition_info = nand_partitions, ++}; ++ ++static void __init homematic_board_init(void) ++{ ++ /* Serial */ ++ at91_add_device_serial(); ++ /* Ethernet */ ++ at91_add_device_eth(&homematic_eth_data); ++ /* USB Host */ ++ at91_add_device_usbh(&homematic_usbh_data); ++ /* USB Device */ ++ at91_add_device_udc(&homematic_udc_data); ++ at91_set_multi_drive(homematic_udc_data.pullup_pin, 1); /* pullup_pin is connected to reset */ ++ /* I2C */ ++ at91_add_device_i2c(NULL, 0); ++ /* SPI */ ++ at91_add_device_spi(homematic_spi_devices, ARRAY_SIZE(homematic_spi_devices)); ++#ifdef CONFIG_MTD_AT91_DATAFLASH_CARD ++ /* DataFlash card */ ++ at91_set_gpio_output(AT91_PIN_PB7, 0); ++#else ++ /* MMC */ ++ at91_set_gpio_output(AT91_PIN_PB7, 1); /* this MMC card slot can optionally use SPI signaling (CS3). */ ++ at91_add_device_mmc(0, &homematic_mmc_data); ++#endif ++ /* NAND */ ++ at91_add_device_nand(&homematic_nand_data); ++} ++ ++MACHINE_START(HOMEMATIC, "HomeMatic") ++ /* Maintainer: eQ-3 */ ++ .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 = homematic_map_io, ++ .init_irq = homematic_init_irq, ++ .init_machine = homematic_board_init, ++MACHINE_END +diff -urN -x CVS linux-2.6.24/arch/arm/mach-at91/board-kb9202.c linux-2.6/arch/arm/mach-at91/board-kb9202.c +--- linux-2.6.24/arch/arm/mach-at91/board-kb9202.c 2008-03-01 22:02:07.000000000 +0200 ++++ linux-2.6/arch/arm/mach-at91/board-kb9202.c 2008-02-18 23:21:36.000000000 +0200 +@@ -37,6 +37,8 @@ + #include <asm/arch/board.h> + #include <asm/arch/gpio.h> + ++#include <asm/arch/at91rm9200_mc.h> ++ + #include "generic.h" + + +@@ -111,6 +113,48 @@ + .partition_info = nand_partitions, + }; + ++ ++#if defined(CONFIG_FB_S1D15605) ++#warning "The Reset pin must be passed via platform_data, not this way" ++static struct resource kb9202_lcd_resources[] = { ++ [0] = { ++ .start = AT91_CHIPSELECT_2, ++ .end = AT91_CHIPSELECT_2 + 0x200FF, ++ .flags = IORESOURCE_MEM ++ }, ++ [1] = { /* reset pin */ ++ .start = AT91_PIN_PC22, ++ .end = AT91_PIN_PC22, ++ .flags = IORESOURCE_MEM ++ }, ++}; ++ ++static struct platform_device kb9202_lcd_device = { ++ .name = "s1d15605fb", ++ .id = 0, ++ .num_resources = ARRAY_SIZE(kb9202_lcd_resources), ++ .resource = kb9202_lcd_resources, ++}; ++ ++static void __init kb9202_add_device_lcd(void) ++{ ++ /* In case the boot loader did not set the chip select mode and timing */ ++ at91_sys_write(AT91_SMC_CSR(2), ++ AT91_SMC_WSEN | AT91_SMC_NWS_(18) | AT91_SMC_TDF_(1) | AT91_SMC_DBW_8 | ++ AT91_SMC_RWSETUP_(1) | AT91_SMC_RWHOLD_(1)); ++ ++ /* Backlight pin = output, off */ ++ at91_set_gpio_output(AT91_PIN_PC23, 0); ++ ++ /* Reset pin = output, in reset */ ++ at91_set_gpio_output(AT91_PIN_PC22, 0); ++ ++ platform_device_register(&kb9202_lcd_device); ++} ++#else ++static void __init kb9202_add_device_lcd(void) {} ++#endif ++ + static void __init kb9202_board_init(void) + { + /* Serial */ +@@ -129,6 +173,8 @@ + at91_add_device_spi(NULL, 0); + /* NAND */ + at91_add_device_nand(&kb9202_nand_data); ++ /* LCD */ ++ kb9202_add_device_lcd(); + } + + MACHINE_START(KB9200, "KB920x") +diff -urN -x CVS linux-2.6.24/arch/arm/mach-at91/board-sam9-l9260.c linux-2.6/arch/arm/mach-at91/board-sam9-l9260.c +--- linux-2.6.24/arch/arm/mach-at91/board-sam9-l9260.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-2.6/arch/arm/mach-at91/board-sam9-l9260.c 2008-03-01 20:39:38.000000000 +0200 +@@ -0,0 +1,199 @@ ++/* ++ * linux/arch/arm/mach-at91/board-sam9-l9260.c ++ * ++ * Copyright (C) 2005 SAN People ++ * Copyright (C) 2006 Atmel ++ * Copyright (C) 2007 Olimex Ltd ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ++ */ ++ ++#include <linux/types.h> ++#include <linux/init.h> ++#include <linux/mm.h> ++#include <linux/module.h> ++#include <linux/platform_device.h> ++#include <linux/spi/spi.h> ++ ++#include <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/board.h> ++#include <asm/arch/gpio.h> ++ ++#include "generic.h" ++ ++ ++/* ++ * Serial port configuration. ++ * 0 .. 5 = USART0 .. USART5 ++ * 6 = DBGU ++ */ ++static struct at91_uart_config __initdata ek_uart_config = { ++ .console_tty = 0, /* ttyS0 */ ++ .nr_tty = 3, ++ .tty_map = { 6, 0, 1, -1, -1, -1, -1 } /* ttyS0, ..., ttyS6 */ ++}; ++ ++static void __init ek_map_io(void) ++{ ++ /* Initialize processor: 18.432 MHz crystal */ ++ at91sam9260_initialize(18432000); ++ ++ /* Setup the LEDs */ ++ at91_init_leds(AT91_PIN_PA9, AT91_PIN_PA6); ++ ++ /* Setup the serial ports and console */ ++ at91_init_serial(&ek_uart_config); ++} ++ ++static void __init ek_init_irq(void) ++{ ++ at91sam9260_init_interrupts(NULL); ++} ++ ++ ++/* ++ * USB Host port ++ */ ++static struct at91_usbh_data __initdata ek_usbh_data = { ++ .ports = 2, ++}; ++ ++/* ++ * USB Device port ++ */ ++static struct at91_udc_data __initdata ek_udc_data = { ++ .vbus_pin = AT91_PIN_PC5, ++ .pullup_pin = 0, /* pull-up driven by UDC */ ++}; ++ ++ ++/* ++ * SPI devices. ++ */ ++static struct spi_board_info ek_spi_devices[] = { ++#if !defined(CONFIG_MMC_AT91) ++ { /* DataFlash chip */ ++ .modalias = "mtd_dataflash", ++ .chip_select = 1, ++ .max_speed_hz = 15 * 1000 * 1000, ++ .bus_num = 0, ++ }, ++#if defined(CONFIG_MTD_AT91_DATAFLASH_CARD) ++ { /* DataFlash card */ ++ .modalias = "mtd_dataflash", ++ .chip_select = 0, ++ .max_speed_hz = 15 * 1000 * 1000, ++ .bus_num = 0, ++ }, ++#endif ++#endif ++}; ++ ++ ++/* ++ * MACB Ethernet device ++ */ ++static struct at91_eth_data __initdata ek_macb_data = { ++ .phy_irq_pin = AT91_PIN_PA7, ++ .is_rmii = 0, ++}; ++ ++ ++/* ++ * NAND flash ++ */ ++static struct mtd_partition __initdata ek_nand_partition[] = { ++ { ++ .name = "Bootloader Area", ++ .offset = 0, ++ .size = 10 * 1024 * 1024, ++ }, ++ { ++ .name = "User Area", ++ .offset = 10 * 1024 * 1024, ++ .size = MTDPART_SIZ_FULL, ++ }, ++}; ++ ++static struct mtd_partition * __init nand_partitions(int size, int *num_partitions) ++{ ++ *num_partitions = ARRAY_SIZE(ek_nand_partition); ++ return ek_nand_partition; ++} ++ ++static struct at91_nand_data __initdata ek_nand_data = { ++ .ale = 21, ++ .cle = 22, ++// .det_pin = ... not connected ++ .rdy_pin = AT91_PIN_PC13, ++ .enable_pin = AT91_PIN_PC14, ++ .partition_info = nand_partitions, ++#if defined(CONFIG_MTD_NAND_AT91_BUSWIDTH_16) ++ .bus_width_16 = 1, ++#else ++ .bus_width_16 = 0, ++#endif ++}; ++ ++ ++/* ++ * MCI (SD/MMC) ++ */ ++static struct at91_mmc_data __initdata ek_mmc_data = { ++ .slot_b = 1, ++ .wire4 = 1, ++ .det_pin = AT91_PIN_PC8, ++ .wp_pin = AT91_PIN_PC4, ++// .vcc_pin = ... not connected ++}; ++ ++static void __init ek_board_init(void) ++{ ++ /* Serial */ ++ at91_add_device_serial(); ++ /* USB Host */ ++ at91_add_device_usbh(&ek_usbh_data); ++ /* USB Device */ ++ at91_add_device_udc(&ek_udc_data); ++ /* SPI */ ++ at91_add_device_spi(ek_spi_devices, ARRAY_SIZE(ek_spi_devices)); ++ /* NAND */ ++ at91_add_device_nand(&ek_nand_data); ++ /* Ethernet */ ++ at91_add_device_eth(&ek_macb_data); ++ /* MMC */ ++ at91_add_device_mmc(0, &ek_mmc_data); ++ /* I2C */ ++ at91_add_device_i2c(NULL, 0); ++} ++ ++MACHINE_START(SAM9_L9260, "Olimex SAM9-L9260") ++ /* Maintainer: Olimex */ ++ .phys_io = AT91_BASE_SYS, ++ .io_pg_offst = (AT91_VA_BASE_SYS >> 18) & 0xfffc, ++ .boot_params = AT91_SDRAM_BASE + 0x100, ++ .timer = &at91sam926x_timer, ++ .map_io = ek_map_io, ++ .init_irq = ek_init_irq, ++ .init_machine = ek_board_init, ++MACHINE_END +diff -urN -x CVS linux-2.6.24/arch/arm/mach-at91/board-sam9260ek.c linux-2.6/arch/arm/mach-at91/board-sam9260ek.c +--- linux-2.6.24/arch/arm/mach-at91/board-sam9260ek.c 2008-03-01 22:02:07.000000000 +0200 ++++ linux-2.6/arch/arm/mach-at91/board-sam9260ek.c 2008-03-01 20:40:19.000000000 +0200 +@@ -25,6 +25,8 @@ + #include <linux/module.h> + #include <linux/platform_device.h> + #include <linux/spi/spi.h> ++#include <linux/spi/at73c213.h> ++#include <linux/clk.h> + + #include <asm/hardware.h> + #include <asm/setup.h> +@@ -37,29 +39,29 @@ + + #include <asm/arch/board.h> + #include <asm/arch/gpio.h> +-#include <asm/arch/at91sam926x_mc.h> ++#include <asm/arch/at91_shdwc.h> + + #include "generic.h" + + +-/* +- * Serial port configuration. +- * 0 .. 5 = USART0 .. USART5 +- * 6 = DBGU +- */ +-static struct at91_uart_config __initdata ek_uart_config = { +- .console_tty = 0, /* ttyS0 */ +- .nr_tty = 3, +- .tty_map = { 6, 0, 1, -1, -1, -1, -1 } /* ttyS0, ..., ttyS6 */ +-}; +- + static void __init ek_map_io(void) + { + /* Initialize processor: 18.432 MHz crystal */ + at91sam9260_initialize(18432000); + +- /* Setup the serial ports and console */ +- at91_init_serial(&ek_uart_config); ++ /* DGBU on ttyS0. (Rx & Tx only) */ ++ at91_register_uart(0, 0, 0); ++ ++ /* USART0 on ttyS1. (Rx, Tx, CTS, RTS, DTR, DSR, DCD, RI) */ ++ at91_register_uart(AT91SAM9260_ID_US0, 1, ATMEL_UART_CTS | ATMEL_UART_RTS ++ | ATMEL_UART_DTR | ATMEL_UART_DSR | ATMEL_UART_DCD ++ | ATMEL_UART_RI); ++ ++ /* USART1 on ttyS2. (Rx, Tx, RTS, CTS) */ ++ at91_register_uart(AT91SAM9260_ID_US1, 2, ATMEL_UART_CTS | ATMEL_UART_RTS); ++ ++ /* set serial console to ttyS0 (ie, DBGU) */ ++ at91_set_serial_console(0); + } + + static void __init ek_init_irq(void) +@@ -85,6 +87,36 @@ + + + /* ++ * Audio ++ */ ++static struct at73c213_board_info at73c213_data = { ++ .ssc_id = 0, ++ .shortname = "AT91SAM9260-EK external DAC", ++}; ++ ++#if defined(CONFIG_SND_AT73C213) || defined(CONFIG_SND_AT73C213_MODULE) ++static void __init at73c213_set_clk(struct at73c213_board_info *info) ++{ ++ struct clk *pck0; ++ struct clk *plla; ++ ++ pck0 = clk_get(NULL, "pck0"); ++ plla = clk_get(NULL, "plla"); ++ ++ /* AT73C213 MCK Clock */ ++ at91_set_B_periph(AT91_PIN_PC1, 0); /* PCK0 */ ++ ++ clk_set_parent(pck0, plla); ++ clk_set_rate(pck0, 12416000); ++ clk_enable(pck0); ++ ++ info->dac_clk = pck0; ++} ++#else ++static void __init at73c213_set_clk(struct at73c213_board_info *info) {} ++#endif ++ ++/* + * SPI devices. + */ + static struct spi_board_info ek_spi_devices[] = { +@@ -110,6 +142,8 @@ + .chip_select = 0, + .max_speed_hz = 10 * 1000 * 1000, + .bus_num = 1, ++ .mode = SPI_MODE_1, ++ .platform_data = &at73c213_data, + }, + #endif + }; +@@ -172,6 +206,24 @@ + // .vcc_pin = ... not connected + }; + ++ ++/* ++ * LEDs ++ */ ++static struct gpio_led ek_leds[] = { ++ { /* "bottom" led, green, userled1 to be defined */ ++ .name = "ds5", ++ .gpio = AT91_PIN_PA6, ++ .active_low = 1, ++ .default_trigger = "none", ++ }, ++ { /* "power" led, yellow */ ++ .name = "ds1", ++ .gpio = AT91_PIN_PA9, ++ .default_trigger = "heartbeat", ++ } ++}; ++ + static void __init ek_board_init(void) + { + /* Serial */ +@@ -190,6 +242,14 @@ + at91_add_device_mmc(0, &ek_mmc_data); + /* I2C */ + at91_add_device_i2c(NULL, 0); ++ /* SSC (to AT73C213) */ ++ at73c213_set_clk(&at73c213_data); ++ at91_add_device_ssc(AT91SAM9260_ID_SSC, ATMEL_SSC_TX); ++ /* LEDs */ ++ at91_gpio_leds(ek_leds, ARRAY_SIZE(ek_leds)); ++ /* shutdown controller, wakeup button (5 msec low) */ ++ at91_sys_write(AT91_SHDW_MR, AT91_SHDW_CPTWK0_(10) | AT91_SHDW_WKMODE0_LOW ++ | AT91_SHDW_RTTWKEN); + } + + MACHINE_START(AT91SAM9260EK, "Atmel AT91SAM9260-EK") +diff -urN -x CVS linux-2.6.24/arch/arm/mach-at91/board-sam9261ek.c linux-2.6/arch/arm/mach-at91/board-sam9261ek.c +--- linux-2.6.24/arch/arm/mach-at91/board-sam9261ek.c 2008-03-01 22:02:07.000000000 +0200 ++++ linux-2.6/arch/arm/mach-at91/board-sam9261ek.c 2008-03-04 21:05:58.000000000 +0200 +@@ -26,6 +26,8 @@ + #include <linux/platform_device.h> + #include <linux/spi/spi.h> + #include <linux/spi/ads7846.h> ++#include <linux/spi/at73c213.h> ++#include <linux/clk.h> + #include <linux/dm9000.h> + #include <linux/fb.h> + #include <linux/gpio_keys.h> +@@ -44,22 +46,12 @@ + + #include <asm/arch/board.h> + #include <asm/arch/gpio.h> +-#include <asm/arch/at91sam926x_mc.h> ++#include <asm/arch/at91sam926x_smc.h> ++#include <asm/arch/at91_shdwc.h> + + #include "generic.h" + + +-/* +- * Serial port configuration. +- * 0 .. 2 = USART0 .. USART2 +- * 3 = DBGU +- */ +-static struct at91_uart_config __initdata ek_uart_config = { +- .console_tty = 0, /* ttyS0 */ +- .nr_tty = 1, +- .tty_map = { 3, -1, -1, -1 } /* ttyS0, ..., ttyS3 */ +-}; +- + static void __init ek_map_io(void) + { + /* Initialize processor: 18.432 MHz crystal */ +@@ -68,8 +60,11 @@ + /* Setup the LEDs */ + at91_init_leds(AT91_PIN_PA13, AT91_PIN_PA14); + +- /* Setup the serial ports and console */ +- at91_init_serial(&ek_uart_config); ++ /* DGBU on ttyS0. (Rx & Tx only) */ ++ at91_register_uart(0, 0, 0); ++ ++ /* set serial console to ttyS0 (ie, DBGU) */ ++ at91_set_serial_console(0); + } + + static void __init ek_init_irq(void) +@@ -239,6 +234,36 @@ + #endif + + /* ++ * Audio ++ */ ++static struct at73c213_board_info at73c213_data = { ++ .ssc_id = 1, ++ .shortname = "AT91SAM9261-EK external DAC", ++}; ++ ++#if defined(CONFIG_SND_AT73C213) || defined(CONFIG_SND_AT73C213_MODULE) ++static void __init at73c213_set_clk(struct at73c213_board_info *info) ++{ ++ struct clk *pck2; ++ struct clk *plla; ++ ++ pck2 = clk_get(NULL, "pck2"); ++ plla = clk_get(NULL, "plla"); ++ ++ /* AT73C213 MCK Clock */ ++ at91_set_B_periph(AT91_PIN_PB31, 0); /* PCK2 */ ++ ++ clk_set_parent(pck2, plla); ++ clk_set_rate(pck2, 12416000); ++ clk_enable(pck2); ++ ++ info->dac_clk = pck2; ++} ++#else ++static void __init at73c213_set_clk(struct at73c213_board_info *info) {} ++#endif ++ ++/* + * SPI devices + */ + static struct spi_board_info ek_spi_devices[] = { +@@ -256,6 +281,7 @@ + .bus_num = 0, + .platform_data = &ads_info, + .irq = AT91SAM9261_ID_IRQ0, ++ .controller_data = (void *) AT91_PIN_PA28, /* CS pin */ + }, + #endif + #if defined(CONFIG_MTD_AT91_DATAFLASH_CARD) +@@ -271,6 +297,9 @@ + .chip_select = 3, + .max_speed_hz = 10 * 1000 * 1000, + .bus_num = 0, ++ .mode = SPI_MODE_1, ++ .platform_data = &at73c213_data, ++ .controller_data = (void*) AT91_PIN_PA29, /* default for CS3 is PA6, but it must be PA29 */ + }, + #endif + }; +@@ -280,6 +309,68 @@ + * LCD Controller + */ + #if defined(CONFIG_FB_ATMEL) || defined(CONFIG_FB_ATMEL_MODULE) ++ ++#if defined(CONFIG_FB_ATMEL_STN) ++ ++/* STN */ ++static struct fb_videomode at91_stn_modes[] = { ++ { ++ .name = "SP06Q002 @ 75", ++ .refresh = 75, ++ .xres = 320, .yres = 240, ++ .pixclock = KHZ2PICOS(1440), ++ ++ .left_margin = 1, .right_margin = 1, ++ .upper_margin = 0, .lower_margin = 0, ++ .hsync_len = 1, .vsync_len = 1, ++ ++ .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, ++ .vmode = FB_VMODE_NONINTERLACED, ++ }, ++}; ++ ++static struct fb_monspecs at91fb_default_stn_monspecs = { ++ .manufacturer = "HIT", ++ .monitor = "SP06Q002", ++ ++ .modedb = at91_stn_modes, ++ .modedb_len = ARRAY_SIZE(at91_stn_modes), ++ .hfmin = 15000, ++ .hfmax = 64000, ++ .vfmin = 50, ++ .vfmax = 150, ++}; ++ ++#define AT91SAM9261_DEFAULT_STN_LCDCON2 (ATMEL_LCDC_MEMOR_LITTLE \ ++ | ATMEL_LCDC_DISTYPE_STNMONO \ ++ | ATMEL_LCDC_CLKMOD_ALWAYSACTIVE \ ++ | ATMEL_LCDC_IFWIDTH_4 \ ++ | ATMEL_LCDC_SCANMOD_SINGLE) ++ ++static void at91_lcdc_stn_power_control(int on) ++{ ++ /* backlight */ ++ if (on) { /* power up */ ++ at91_set_gpio_value(AT91_PIN_PC14, 0); ++ at91_set_gpio_value(AT91_PIN_PC15, 0); ++ } else { /* power down */ ++ at91_set_gpio_value(AT91_PIN_PC14, 1); ++ at91_set_gpio_value(AT91_PIN_PC15, 1); ++ } ++} ++ ++static struct atmel_lcdfb_info __initdata ek_lcdc_data = { ++ .default_bpp = 1, ++ .default_dmacon = ATMEL_LCDC_DMAEN, ++ .default_lcdcon2 = AT91SAM9261_DEFAULT_STN_LCDCON2, ++ .default_monspecs = &at91fb_default_stn_monspecs, ++ .atmel_lcdfb_power_control = at91_lcdc_stn_power_control, ++ .guard_time = 1, ++}; ++ ++#else ++ ++/* TFT */ + static struct fb_videomode at91_tft_vga_modes[] = { + { + .name = "TX09D50VM1CCA @ 60", +@@ -296,7 +387,7 @@ + }, + }; + +-static struct fb_monspecs at91fb_default_monspecs = { ++static struct fb_monspecs at91fb_default_tft_monspecs = { + .manufacturer = "HIT", + .monitor = "TX09D50VM1CCA", + +@@ -308,11 +399,11 @@ + .vfmax = 150, + }; + +-#define AT91SAM9261_DEFAULT_LCDCON2 (ATMEL_LCDC_MEMOR_LITTLE \ ++#define AT91SAM9261_DEFAULT_TFT_LCDCON2 (ATMEL_LCDC_MEMOR_LITTLE \ + | ATMEL_LCDC_DISTYPE_TFT \ + | ATMEL_LCDC_CLKMOD_ALWAYSACTIVE) + +-static void at91_lcdc_power_control(int on) ++static void at91_lcdc_tft_power_control(int on) + { + if (on) + at91_set_gpio_value(AT91_PIN_PA12, 0); /* power up */ +@@ -320,15 +411,16 @@ + at91_set_gpio_value(AT91_PIN_PA12, 1); /* power down */ + } + +-/* Driver datas */ + static struct atmel_lcdfb_info __initdata ek_lcdc_data = { ++ .lcdcon_is_backlight = true, + .default_bpp = 16, + .default_dmacon = ATMEL_LCDC_DMAEN, +- .default_lcdcon2 = AT91SAM9261_DEFAULT_LCDCON2, +- .default_monspecs = &at91fb_default_monspecs, +- .atmel_lcdfb_power_control = at91_lcdc_power_control, ++ .default_lcdcon2 = AT91SAM9261_DEFAULT_TFT_LCDCON2, ++ .default_monspecs = &at91fb_default_tft_monspecs, ++ .atmel_lcdfb_power_control = at91_lcdc_tft_power_control, + .guard_time = 1, + }; ++#endif + + #else + static struct atmel_lcdfb_info __initdata ek_lcdc_data; +@@ -342,25 +434,25 @@ + static struct gpio_keys_button ek_buttons[] = { + { + .gpio = AT91_PIN_PA27, +- .keycode = BTN_0, ++ .code = BTN_0, + .desc = "Button 0", + .active_low = 1, + }, + { + .gpio = AT91_PIN_PA26, +- .keycode = BTN_1, ++ .code = BTN_1, + .desc = "Button 1", + .active_low = 1, + }, + { + .gpio = AT91_PIN_PA25, +- .keycode = BTN_2, ++ .code = BTN_2, + .desc = "Button 2", + .active_low = 1, + }, + { + .gpio = AT91_PIN_PA24, +- .keycode = BTN_3, ++ .code = BTN_3, + .desc = "Button 3", + .active_low = 1, + } +@@ -397,6 +489,29 @@ + static void __init ek_add_device_buttons(void) {} + #endif + ++/* ++ * LEDs ++ */ ++static struct gpio_led ek_leds[] = { ++ { /* "bottom" led, green, userled1 to be defined */ ++ .name = "ds7", ++ .gpio = AT91_PIN_PA14, ++ .active_low = 1, ++ .default_trigger = "none", ++ }, ++ { /* "top" led, green, userled2 to be defined */ ++ .name = "ds8", ++ .gpio = AT91_PIN_PA13, ++ .active_low = 1, ++ .default_trigger = "none", ++ }, ++ { /* "power" led, yellow */ ++ .name = "ds1", ++ .gpio = AT91_PIN_PA23, ++ .default_trigger = "heartbeat", ++ } ++}; ++ + static void __init ek_board_init(void) + { + /* Serial */ +@@ -418,6 +533,9 @@ + at91_add_device_spi(ek_spi_devices, ARRAY_SIZE(ek_spi_devices)); + /* Touchscreen */ + ek_add_device_ts(); ++ /* SSC (to AT73C213) */ ++ at73c213_set_clk(&at73c213_data); ++ at91_add_device_ssc(AT91SAM9261_ID_SSC1, ATMEL_SSC_TX); + #else + /* MMC */ + at91_add_device_mmc(0, &ek_mmc_data); +@@ -426,6 +544,11 @@ + at91_add_device_lcdc(&ek_lcdc_data); + /* Push Buttons */ + ek_add_device_buttons(); ++ /* LEDs */ ++ at91_gpio_leds(ek_leds, ARRAY_SIZE(ek_leds)); ++ /* shutdown controller, wakeup button (5 msec low) */ ++ at91_sys_write(AT91_SHDW_MR, AT91_SHDW_CPTWK0_(10) | AT91_SHDW_WKMODE0_LOW ++ | AT91_SHDW_RTTWKEN); + } + + MACHINE_START(AT91SAM9261EK, "Atmel AT91SAM9261-EK") +diff -urN -x CVS linux-2.6.24/arch/arm/mach-at91/board-sam9263ek.c linux-2.6/arch/arm/mach-at91/board-sam9263ek.c +--- linux-2.6.24/arch/arm/mach-at91/board-sam9263ek.c 2008-03-01 22:02:07.000000000 +0200 ++++ linux-2.6/arch/arm/mach-at91/board-sam9263ek.c 2008-03-01 20:41:13.000000000 +0200 +@@ -27,6 +27,8 @@ + #include <linux/spi/spi.h> + #include <linux/spi/ads7846.h> + #include <linux/fb.h> ++#include <linux/gpio_keys.h> ++#include <linux/input.h> + + #include <video/atmel_lcdc.h> + +@@ -41,29 +43,24 @@ + + #include <asm/arch/board.h> + #include <asm/arch/gpio.h> +-#include <asm/arch/at91sam926x_mc.h> ++#include <asm/arch/at91_shdwc.h> + + #include "generic.h" + + +-/* +- * Serial port configuration. +- * 0 .. 2 = USART0 .. USART2 +- * 3 = DBGU +- */ +-static struct at91_uart_config __initdata ek_uart_config = { +- .console_tty = 0, /* ttyS0 */ +- .nr_tty = 2, +- .tty_map = { 3, 0, -1, -1, } /* ttyS0, ..., ttyS3 */ +-}; +- + static void __init ek_map_io(void) + { + /* Initialize processor: 16.367 MHz crystal */ + at91sam9263_initialize(16367660); + +- /* Setup the serial ports and console */ +- at91_init_serial(&ek_uart_config); ++ /* DGBU on ttyS0. (Rx & Tx only) */ ++ at91_register_uart(0, 0, 0); ++ ++ /* USART0 on ttyS1. (Rx, Tx, RTS, CTS) */ ++ at91_register_uart(AT91SAM9263_ID_US0, 1, ATMEL_UART_CTS | ATMEL_UART_RTS); ++ ++ /* set serial console to ttyS0 (ie, DBGU) */ ++ at91_set_serial_console(0); + } + + static void __init ek_init_irq(void) +@@ -163,6 +160,7 @@ + * MACB Ethernet device + */ + static struct at91_eth_data __initdata ek_macb_data = { ++ .phy_irq_pin = AT91_PIN_PE31, + .is_rmii = 1, + }; + +@@ -242,14 +240,12 @@ + + static void at91_lcdc_power_control(int on) + { +- if (on) +- at91_set_gpio_value(AT91_PIN_PD12, 0); /* power up */ +- else +- at91_set_gpio_value(AT91_PIN_PD12, 1); /* power down */ ++ at91_set_gpio_value(AT91_PIN_PA30, on); + } + + /* Driver datas */ + static struct atmel_lcdfb_info __initdata ek_lcdc_data = { ++ .lcdcon_is_backlight = true, + .default_bpp = 16, + .default_dmacon = ATMEL_LCDC_DMAEN, + .default_lcdcon2 = AT91SAM9263_DEFAULT_LCDCON2, +@@ -264,6 +260,55 @@ + + + /* ++ * GPIO Buttons ++ */ ++#if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE) ++static struct gpio_keys_button ek_buttons[] = { ++ { /* BP1, "leftclic" */ ++ .code = BTN_LEFT, ++ .gpio = AT91_PIN_PC5, ++ .active_low = 1, ++ .desc = "left_click", ++ .wakeup = 1, ++ }, ++ { /* BP2, "rightclic" */ ++ .code = BTN_RIGHT, ++ .gpio = AT91_PIN_PC4, ++ .active_low = 1, ++ .desc = "right_click", ++ .wakeup = 1, ++ }, ++}; ++ ++static struct gpio_keys_platform_data ek_button_data = { ++ .buttons = ek_buttons, ++ .nbuttons = ARRAY_SIZE(ek_buttons), ++}; ++ ++static struct platform_device ek_button_device = { ++ .name = "gpio-keys", ++ .id = -1, ++ .num_resources = 0, ++ .dev = { ++ .platform_data = &ek_button_data, ++ } ++}; ++ ++static void __init ek_add_device_buttons(void) ++{ ++ at91_set_GPIO_periph(AT91_PIN_PC5, 0); /* left button */ ++ at91_set_deglitch(AT91_PIN_PC5, 1); ++ at91_set_GPIO_periph(AT91_PIN_PC4, 0); /* right button */ ++ at91_set_deglitch(AT91_PIN_PC4, 1); ++ ++ platform_device_register(&ek_button_device); ++} ++#else ++static void __init ek_add_device_buttons(void) {} ++#endif ++ ++ ++/* + * AC97 + */ + static struct atmel_ac97_data ek_ac97_data = { +@@ -271,6 +316,30 @@ + }; + + ++/* ++ * LEDs ... these could all be PWM-driven, for variable brightness ++ */ ++static struct gpio_led ek_leds[] = { ++ { /* "left" led, green, userled1, pwm1 */ ++ .name = "ds1", ++ .gpio = AT91_PIN_PB8, ++ .active_low = 1, ++ .default_trigger = "mmc0", ++ }, ++ { /* "right" led, green, userled2, pwm2 */ ++ .name = "ds2", ++ .gpio = AT91_PIN_PC29, ++ .active_low = 1, ++ .default_trigger = "nand-disk", ++ }, ++ { /* "power" led, yellow, pwm0 */ ++ .name = "ds3", ++ .gpio = AT91_PIN_PB7, ++ .default_trigger = "heartbeat", ++ } ++}; ++ ++ + static void __init ek_board_init(void) + { + /* Serial */ +@@ -294,8 +363,15 @@ + at91_add_device_i2c(NULL, 0); + /* LCD Controller */ + at91_add_device_lcdc(&ek_lcdc_data); ++ /* Push Buttons */ ++ ek_add_device_buttons(); + /* AC97 */ + at91_add_device_ac97(&ek_ac97_data); ++ /* LEDs */ ++ at91_gpio_leds(ek_leds, ARRAY_SIZE(ek_leds)); ++ /* shutdown controller, wakeup button (5 msec low) */ ++ at91_sys_write(AT91_SHDW_MR, AT91_SHDW_CPTWK0_(10) | AT91_SHDW_WKMODE0_LOW ++ | AT91_SHDW_RTTWKEN); + } + + MACHINE_START(AT91SAM9263EK, "Atmel AT91SAM9263-EK") +diff -urN -x CVS linux-2.6.24/arch/arm/mach-at91/board-sam9rlek.c linux-2.6/arch/arm/mach-at91/board-sam9rlek.c +--- linux-2.6.24/arch/arm/mach-at91/board-sam9rlek.c 2008-03-01 22:02:07.000000000 +0200 ++++ linux-2.6/arch/arm/mach-at91/board-sam9rlek.c 2008-03-01 20:39:17.000000000 +0200 +@@ -29,29 +29,24 @@ + + #include <asm/arch/board.h> + #include <asm/arch/gpio.h> +-#include <asm/arch/at91sam926x_mc.h> ++#include <asm/arch/at91_shdwc.h> + + #include "generic.h" + + +-/* +- * Serial port configuration. +- * 0 .. 3 = USART0 .. USART3 +- * 4 = DBGU +- */ +-static struct at91_uart_config __initdata ek_uart_config = { +- .console_tty = 0, /* ttyS0 */ +- .nr_tty = 2, +- .tty_map = { 4, 0, -1, -1, -1 } /* ttyS0, ..., ttyS4 */ +-}; +- + static void __init ek_map_io(void) + { + /* Initialize processor: 12.000 MHz crystal */ + at91sam9rl_initialize(12000000); + +- /* Setup the serial ports and console */ +- at91_init_serial(&ek_uart_config); ++ /* DGBU on ttyS0. (Rx & Tx only) */ ++ at91_register_uart(0, 0, 0); ++ ++ /* USART0 on ttyS1. (Rx, Tx, CTS, RTS) */ ++ at91_register_uart(AT91SAM9RL_ID_US0, 1, ATMEL_UART_CTS | ATMEL_UART_RTS); ++ ++ /* set serial console to ttyS0 (ie, DBGU) */ ++ at91_set_serial_console(0); + } + + static void __init ek_init_irq(void) +@@ -190,6 +185,9 @@ + at91_add_device_mmc(0, &ek_mmc_data); + /* LCD Controller */ + at91_add_device_lcdc(&ek_lcdc_data); ++ /* shutdown controller, wakeup button (5 msec low) */ ++ at91_sys_write(AT91_SHDW_MR, AT91_SHDW_CPTWK0_(10) | AT91_SHDW_WKMODE0_LOW ++ | AT91_SHDW_RTTWKEN); + } + + MACHINE_START(AT91SAM9RLEK, "Atmel AT91SAM9RL-EK") +diff -urN -x CVS linux-2.6.24/arch/arm/mach-at91/board-tms.c linux-2.6/arch/arm/mach-at91/board-tms.c +--- linux-2.6.24/arch/arm/mach-at91/board-tms.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-2.6/arch/arm/mach-at91/board-tms.c 2007-12-31 15:18:42.000000000 +0200 +@@ -0,0 +1,198 @@ ++/* ++* linux/arch/arm/mach-at91/board-tms.c ++* ++* Copyright (C) 2005 SAN People ++* ++* Adapted from board-dk to sweda TMS-100 by Luiz de Barros <lboneto@gmail.com> ++* ++* This program is free software; you can redistribute it and/or modify ++* it under the terms of the GNU General Public License as published by ++* the Free Software Foundation; either version 2 of the License, or ++* (at your option) any later version. ++* ++* This program is distributed in the hope that it will be useful, ++* but WITHOUT ANY WARRANTY; without even the implied warranty of ++* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++* GNU General Public License for more details. ++* ++* You should have received a copy of the GNU General Public License ++* along with this program; if not, write to the Free Software ++* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ++*/ ++ ++#include <linux/types.h> ++#include <linux/init.h> ++#include <linux/mm.h> ++#include <linux/module.h> ++#include <linux/platform_device.h> ++#include <linux/spi/spi.h> ++#include <linux/mtd/physmap.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/board.h> ++#include <asm/arch/gpio.h> ++#include <asm/arch/at91rm9200_mc.h> ++ ++#include "generic.h" ++#include <linux/serial_8250.h> ++ ++ ++#define SERIAL_FLAGS (UPF_BOOT_AUTOCONF | UPF_IOREMAP| UPF_SHARE_IRQ) ++#define SERIAL_CLK (1843200) ++ ++ ++/*--------------------------------------------------------------------- ++ * External UART ++ */ ++ ++#define PORT(_base, _irq) \ ++ { \ ++ .mapbase = _base, \ ++ .irq = _irq, \ ++ .uartclk = SERIAL_CLK, \ ++ .iotype = UPIO_MEM, \ ++ .regshift = 0, \ ++ .flags = SERIAL_FLAGS, \ ++ } ++ ++static struct plat_serial8250_port tms_data[] = { ++ PORT(0x70000000, AT91_PIN_PC3), ++ PORT(0x80000000, AT91_PIN_PC5), ++ { }, ++}; ++ ++static struct platform_device tms_device = { ++ .name = "serial8250", ++ .id = PLAT8250_DEV_PLATFORM, ++ .dev = ++ { ++ .platform_data = &tms_data, ++ }, ++}; ++ ++static void setup_external_uart(void) ++{ ++ at91_sys_write(AT91_SMC_CSR(2), ++ AT91_SMC_ACSS_STD ++ | AT91_SMC_DBW_8 ++ | AT91_SMC_BAT ++ | AT91_SMC_WSEN ++ | AT91_SMC_NWS_(32) /* wait states */ ++ | AT91_SMC_RWSETUP_(6) /* setup time */ ++ | AT91_SMC_RWHOLD_(4) /* hold time */ ++ ++ ); ++ at91_sys_write(AT91_SMC_CSR(6), ++ AT91_SMC_ACSS_STD ++ | AT91_SMC_DBW_8 ++ | AT91_SMC_BAT ++ | AT91_SMC_WSEN ++ | AT91_SMC_NWS_(32) /* wait states */ ++ | AT91_SMC_RWSETUP_(6) /* setup time */ ++ | AT91_SMC_RWHOLD_(4) /* hold time */ ++ ++ ); ++ at91_sys_write(AT91_SMC_CSR(7), ++ AT91_SMC_ACSS_STD ++ | AT91_SMC_DBW_8 ++ | AT91_SMC_BAT ++ | AT91_SMC_WSEN ++ | AT91_SMC_NWS_(32) /* wait states */ ++ | AT91_SMC_RWSETUP_(6) /* setup time */ ++ | AT91_SMC_RWHOLD_(4) /* hold time */ ++ ); ++ ++ platform_device_register(&tms_device); ++} ++ ++ ++/* ++ * Serial port configuration. ++ * 0 .. 3 = USART0 .. USART3 ++ * 4 = DBGU ++ */ ++static struct at91_uart_config __initdata tms_uart_config = { ++ .console_tty = 0, /* ttyS0 */ ++ .nr_tty = 5, ++ .tty_map = { 4, 0, 1, 2, 3 } /* ttyS0, ..., ttyS4 */ ++}; ++ ++static void __init tms_map_io(void) ++{ ++ /* Initialize processor: 18.432 MHz crystal */ ++ at91rm9200_initialize(18432000, AT91RM9200_BGA); ++ ++ /* Setup the LEDs */ ++ at91_init_leds(AT91_PIN_PB2, AT91_PIN_PB2); ++ ++ /* Setup the serial ports and console */ ++ at91_init_serial(&tms_uart_config); ++} ++ ++static void __init tms_init_irq(void) ++{ ++ at91rm9200_init_interrupts(NULL); ++} ++ ++ ++static struct at91_eth_data __initdata tms_eth_data = { ++ .phy_irq_pin = AT91_PIN_PC4, ++ .is_rmii = 1, ++}; ++ ++static struct at91_usbh_data __initdata tms_usbh_data = { ++ .ports = 2, ++}; ++ ++static struct spi_board_info tms_spi_devices[] = { ++ { /* DataFlash chip */ ++ .modalias = "mtd_dataflash", ++ .chip_select = 0, ++ .max_speed_hz = 15 * 1000 * 1000, ++ }, ++ { /* DataFlash chip */ ++ .modalias = "mtd_dataflash", ++ .chip_select = 1, ++ .max_speed_hz = 15 * 1000 * 1000, ++ } ++}; ++ ++static struct i2c_board_info __initdata tms_i2c_devices[] = { ++ { ++ I2C_BOARD_INFO("isl1208", 0x6f), ++ } ++}; ++ ++static void __init tms_board_init(void) ++{ ++ /* Serial */ ++ at91_add_device_serial(); ++ /* Ethernet */ ++ at91_add_device_eth(&tms_eth_data); ++ at91_add_device_usbh(&tms_usbh_data); ++ /* I2C */ ++ at91_add_device_i2c(tms_i2c_devices, ARRAY_SIZE(tms_i2c_devices)); ++ /* SPI */ ++ at91_add_device_spi(tms_spi_devices, ARRAY_SIZE(tms_spi_devices)); ++ /* Two port external UART */ ++ setup_external_uart(); ++} ++ ++MACHINE_START(SWEDATMS, "Sweda TMS-100 Board") ++ /* Maintainer: Luiz de Barros */ ++ .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 = tms_map_io, ++ .init_irq = tms_init_irq, ++ .init_machine = tms_board_init, ++MACHINE_END +diff -urN -x CVS linux-2.6.24/arch/arm/mach-at91/clock.c linux-2.6/arch/arm/mach-at91/clock.c +--- linux-2.6.24/arch/arm/mach-at91/clock.c 2008-03-01 22:02:07.000000000 +0200 ++++ linux-2.6/arch/arm/mach-at91/clock.c 2008-02-18 18:34:06.000000000 +0200 +@@ -32,6 +32,7 @@ + #include <asm/arch/cpu.h> + + #include "clock.h" ++#include "generic.h" + + + /* +@@ -254,6 +255,23 @@ + + /*------------------------------------------------------------------------*/ + ++#ifdef CONFIG_PM ++ ++int clk_must_disable(struct clk *clk) ++{ ++ if (!at91_suspend_entering_slow_clock()) ++ return 0; ++ ++ while (clk->parent) ++ clk = clk->parent; ++ return clk != &clk32k; ++} ++EXPORT_SYMBOL(clk_must_disable); ++ ++#endif ++ ++/*------------------------------------------------------------------------*/ ++ + #ifdef CONFIG_AT91_PROGRAMMABLE_CLOCKS + + /* +@@ -343,7 +361,7 @@ + EXPORT_SYMBOL(clk_set_parent); + + /* establish PCK0..PCK3 parentage and rate */ +-static void init_programmable_clock(struct clk *clk) ++static void __init init_programmable_clock(struct clk *clk) + { + struct clk *parent; + u32 pckr; +@@ -574,6 +592,8 @@ + } else if (cpu_is_at91sam9260() || cpu_is_at91sam9261() || cpu_is_at91sam9263()) { + uhpck.pmc_mask = AT91SAM926x_PMC_UHP; + udpck.pmc_mask = AT91SAM926x_PMC_UDP; ++ } else if (cpu_is_at91cap9()) { ++ uhpck.pmc_mask = AT91CAP9_PMC_UHP; + } + at91_sys_write(AT91_CKGR_PLLBR, 0); + +diff -urN -x CVS linux-2.6.24/arch/arm/mach-at91/generic.h linux-2.6/arch/arm/mach-at91/generic.h +--- linux-2.6.24/arch/arm/mach-at91/generic.h 2008-03-01 22:02:07.000000000 +0200 ++++ linux-2.6/arch/arm/mach-at91/generic.h 2008-02-18 23:29:29.000000000 +0200 +@@ -15,6 +15,7 @@ + extern void __init at91sam9263_initialize(unsigned long main_clock); + extern void __init at91sam9rl_initialize(unsigned long main_clock); + extern void __init at91x40_initialize(unsigned long main_clock); ++extern void __init at91cap9_initialize(unsigned long main_clock); + + /* Interrupts */ + extern void __init at91rm9200_init_interrupts(unsigned int priority[]); +@@ -23,6 +24,7 @@ + extern void __init at91sam9263_init_interrupts(unsigned int priority[]); + extern void __init at91sam9rl_init_interrupts(unsigned int priority[]); + extern void __init at91x40_init_interrupts(unsigned int priority[]); ++extern void __init at91cap9_init_interrupts(unsigned int priority[]); + extern void __init at91_aic_init(unsigned int priority[]); + + /* Timer */ +@@ -39,12 +41,16 @@ + /* Power Management */ + extern void at91_irq_suspend(void); + extern void at91_irq_resume(void); ++extern int at91_suspend_entering_slow_clock(void); + + /* GPIO */ + #define AT91RM9200_PQFP 3 /* AT91RM9200 PQFP package has 3 banks */ + #define AT91RM9200_BGA 4 /* AT91RM9200 BGA package has 4 banks */ + + struct at91_gpio_bank { ++ unsigned chipbase; /* bank's first GPIO number */ ++ void __iomem *regbase; /* base of register bank */ ++ struct at91_gpio_bank *next; /* bank sharing same IRQ/clock/... */ + unsigned short id; /* peripheral ID */ + unsigned long offset; /* offset from system peripheral base */ + struct clk *clock; /* associated clock */ +diff -urN -x CVS linux-2.6.24/arch/arm/mach-at91/gpio.c linux-2.6/arch/arm/mach-at91/gpio.c +--- linux-2.6.24/arch/arm/mach-at91/gpio.c 2008-03-01 22:02:07.000000000 +0200 ++++ linux-2.6/arch/arm/mach-at91/gpio.c 2008-03-01 18:01:29.000000000 +0200 +@@ -13,6 +13,8 @@ + #include <linux/errno.h> + #include <linux/interrupt.h> + #include <linux/irq.h> ++#include <linux/debugfs.h> ++#include <linux/seq_file.h> + #include <linux/kernel.h> + #include <linux/list.h> + #include <linux/module.h> +@@ -31,12 +33,10 @@ + + static inline void __iomem *pin_to_controller(unsigned pin) + { +- void __iomem *sys_base = (void __iomem *) AT91_VA_BASE_SYS; +- + pin -= PIN_BASE; + pin /= 32; + if (likely(pin < gpio_banks)) +- return sys_base + gpio[pin].offset; ++ return gpio[pin].regbase; + + return NULL; + } +@@ -292,11 +292,11 @@ + int i; + + for (i = 0; i < gpio_banks; i++) { +- u32 pio = gpio[i].offset; ++ void __iomem *pio = gpio[i].regbase; + +- backups[i] = at91_sys_read(pio + PIO_IMR); +- at91_sys_write(pio + PIO_IDR, backups[i]); +- at91_sys_write(pio + PIO_IER, wakeups[i]); ++ backups[i] = __raw_readl(pio + PIO_IMR); ++ __raw_writel(backups[i], pio + PIO_IDR); ++ __raw_writel(wakeups[i], pio + PIO_IER); + + if (!wakeups[i]) + clk_disable(gpio[i].clock); +@@ -313,13 +313,13 @@ + int i; + + for (i = 0; i < gpio_banks; i++) { +- u32 pio = gpio[i].offset; ++ void __iomem *pio = gpio[i].regbase; + + if (!wakeups[i]) + clk_enable(gpio[i].clock); + +- at91_sys_write(pio + PIO_IDR, wakeups[i]); +- at91_sys_write(pio + PIO_IER, backups[i]); ++ __raw_writel(wakeups[i], pio + PIO_IDR); ++ __raw_writel(backups[i], pio + PIO_IER); + } + } + +@@ -359,7 +359,13 @@ + + static int gpio_irq_type(unsigned pin, unsigned type) + { +- return (type == IRQT_BOTHEDGE) ? 0 : -EINVAL; ++ switch (type) { ++ case IRQ_TYPE_NONE: ++ case IRQ_TYPE_EDGE_BOTH: ++ return 0; ++ default: ++ return -EINVAL; ++ } + } + + static struct irq_chip gpio_irqchip = { +@@ -374,20 +380,30 @@ + { + unsigned pin; + struct irq_desc *gpio; ++ struct at91_gpio_bank *bank; + void __iomem *pio; + u32 isr; + +- pio = get_irq_chip_data(irq); ++ bank = get_irq_chip_data(irq); ++ pio = bank->regbase; + + /* temporarily mask (level sensitive) parent IRQ */ + desc->chip->ack(irq); + for (;;) { +- /* reading ISR acks the pending (edge triggered) GPIO interrupt */ ++ /* Reading ISR acks pending (edge triggered) GPIO interrupts. ++ * When there none are pending, we're finished unless we need ++ * to process multiple banks (like ID_PIOCDE on sam9263). ++ */ + isr = __raw_readl(pio + PIO_ISR) & __raw_readl(pio + PIO_IMR); +- if (!isr) +- break; ++ if (!isr) { ++ if (!bank->next) ++ break; ++ bank = bank->next; ++ pio = bank->regbase; ++ continue; ++ } + +- pin = (unsigned) get_irq_data(irq); ++ pin = bank->chipbase; + gpio = &irq_desc[pin]; + + while (isr) { +@@ -414,29 +430,94 @@ + + /*--------------------------------------------------------------------------*/ + ++#ifdef CONFIG_DEBUG_FS ++ ++static int at91_gpio_show(struct seq_file *s, void *unused) ++{ ++ int bank, j; ++ ++ /* print heading */ ++ seq_printf(s, "Pin\t"); ++ for (bank = 0; bank < gpio_banks; bank++) { ++ seq_printf(s, "PIO%c\t", 'A' + bank); ++ }; ++ seq_printf(s, "\n\n"); ++ ++ /* print pin status */ ++ for (j = 0; j < 32; j++) { ++ seq_printf(s, "%i:\t", j); ++ ++ for (bank = 0; bank < gpio_banks; bank++) { ++ unsigned pin = PIN_BASE + (32 * bank) + j; ++ void __iomem *pio = pin_to_controller(pin); ++ unsigned mask = pin_to_mask(pin); ++ ++ if (__raw_readl(pio + PIO_PSR) & mask) ++ seq_printf(s, "GPIO:%s", __raw_readl(pio + PIO_PDSR) & mask ? "1" : "0"); ++ else ++ seq_printf(s, "%s", __raw_readl(pio + PIO_ABSR) & mask ? "B" : "A"); ++ ++ seq_printf(s, "\t"); ++ } ++ ++ seq_printf(s, "\n"); ++ } ++ ++ return 0; ++} ++ ++static int at91_gpio_open(struct inode *inode, struct file *file) ++{ ++ return single_open(file, at91_gpio_show, NULL); ++} ++ ++static const struct file_operations at91_gpio_operations = { ++ .open = at91_gpio_open, ++ .read = seq_read, ++ .llseek = seq_lseek, ++ .release = single_release, ++}; ++ ++static int __init at91_gpio_debugfs_init(void) ++{ ++ /* /sys/kernel/debug/at91_gpio */ ++ (void) debugfs_create_file("at91_gpio", S_IFREG | S_IRUGO, NULL, NULL, &at91_gpio_operations); ++ return 0; ++} ++postcore_initcall(at91_gpio_debugfs_init); ++ ++#endif ++ ++/*--------------------------------------------------------------------------*/ ++ ++/* ++ * This lock class tells lockdep that GPIO irqs are in a different ++ * category than their parents, so it won't report false recursion. ++ */ ++static struct lock_class_key gpio_lock_class; ++ + /* + * Called from the processor-specific init to enable GPIO interrupt support. + */ + void __init at91_gpio_irq_setup(void) + { +- unsigned pioc, pin; ++ unsigned pioc, pin; ++ struct at91_gpio_bank *this, *prev; + +- for (pioc = 0, pin = PIN_BASE; +- pioc < gpio_banks; +- pioc++) { +- void __iomem *controller; +- unsigned id = gpio[pioc].id; ++ for (pioc = 0, pin = PIN_BASE, this = gpio, prev = NULL; ++ pioc++ < gpio_banks; ++ prev = this, this++) { ++ unsigned id = this->id; + unsigned i; + +- clk_enable(gpio[pioc].clock); /* enable PIO controller's clock */ ++ /* enable PIO controller's clock */ ++ clk_enable(this->clock); + +- controller = (void __iomem *) AT91_VA_BASE_SYS + gpio[pioc].offset; +- __raw_writel(~0, controller + PIO_IDR); ++ __raw_writel(~0, this->regbase + PIO_IDR); + +- set_irq_data(id, (void *) pin); +- set_irq_chip_data(id, controller); ++ for (i = 0, pin = this->chipbase; i < 32; i++, pin++) { ++ lockdep_set_class(&irq_desc[pin].lock, &gpio_lock_class); + +- for (i = 0; i < 32; i++, pin++) { + /* + * Can use the "simple" and not "edge" handler since it's + * shorter, and the AIC handles interrupts sanely. +@@ -446,6 +527,14 @@ + set_irq_flags(pin, IRQF_VALID); + } + ++ /* The toplevel handler handles one bank of GPIOs, except ++ * AT91SAM9263_ID_PIOCDE handles three... PIOC is first in ++ * the list, so we only set up that handler. ++ */ ++ if (prev && prev->next == this) ++ continue; ++ ++ set_irq_chip_data(id, this); + set_irq_chained_handler(id, gpio_irq_handler); + } + pr_info("AT91: %d gpio irqs in %d banks\n", pin - PIN_BASE, gpio_banks); +@@ -456,8 +545,21 @@ + */ + void __init at91_gpio_init(struct at91_gpio_bank *data, int nr_banks) + { ++ unsigned i; ++ struct at91_gpio_bank *last; ++ + BUG_ON(nr_banks > MAX_GPIO_BANKS); + + gpio = data; + gpio_banks = nr_banks; ++ ++ for (i = 0, last = NULL; i < nr_banks; i++, last = data, data++) { ++ data->chipbase = PIN_BASE + i * 32; ++ data->regbase = data->offset + (void __iomem *)AT91_VA_BASE_SYS; ++ ++ /* AT91SAM9263_ID_PIOCDE groups PIOC, PIOD, PIOE */ ++ /* AT91CAP9_ID_PIOABCD groups PIOA, PIOB, PIOC, PIOD */ ++ if (last && last->id == data->id) ++ last->next = data; ++ } + } +diff -urN -x CVS linux-2.6.24/arch/arm/mach-at91/ics1523.c linux-2.6/arch/arm/mach-at91/ics1523.c +--- linux-2.6.24/arch/arm/mach-at91/ics1523.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-2.6/arch/arm/mach-at91/ics1523.c 2008-03-01 22:05:07.000000000 +0200 +@@ -0,0 +1,208 @@ ++/* ++ * arch/arm/mach-at91rm9200/ics1523.c ++ * ++ * Copyright (C) 2003 ATMEL Rousset ++ * ++ * 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 <asm/hardware.h> ++#include <asm/io.h> ++ ++#include <linux/clk.h> ++#include <linux/delay.h> ++#include <linux/err.h> ++#include <linux/init.h> ++#include <linux/kernel.h> ++ ++#include <asm/arch/ics1523.h> ++#include <asm/arch/at91_twi.h> ++#include <asm/arch/gpio.h> ++ ++/* TWI Errors */ ++#define AT91_TWI_ERROR (AT91_TWI_NACK | AT91_TWI_UNRE | AT91_TWI_OVRE) ++ ++ ++static void __iomem *twi_base; ++ ++#define at91_twi_read(reg) __raw_readl(twi_base + (reg)) ++#define at91_twi_write(reg, val) __raw_writel((val), twi_base + (reg)) ++ ++ ++/* ----------------------------------------------------------------------------- ++ * Initialization of TWI CLOCK ++ * ----------------------------------------------------------------------------- */ ++ ++static void at91_ics1523_SetTwiClock(unsigned int mck_khz) ++{ ++ int sclock; ++ ++ /* Here, CKDIV = 1 and CHDIV = CLDIV ==> CLDIV = CHDIV = 1/4*((Fmclk/FTWI) -6) */ ++ sclock = (10*mck_khz / ICS_TRANSFER_RATE); ++ if (sclock % 10 >= 5) ++ sclock = (sclock /10) - 5; ++ else ++ sclock = (sclock /10)- 6; ++ sclock = (sclock + (4 - sclock %4)) >> 2; /* div 4 */ ++ ++ at91_twi_write(AT91_TWI_CWGR, 0x00010000 | sclock | (sclock << 8)); ++} ++ ++/* ----------------------------------------------------------------------------- ++ * Read a byte with TWI Interface from the Clock Generator ICS1523 ++ * ----------------------------------------------------------------------------- */ ++ ++static int at91_ics1523_ReadByte(unsigned char reg_address, unsigned char *data_in) ++{ ++ int Status, nb_trial; ++ ++ at91_twi_write(AT91_TWI_MMR, AT91_TWI_MREAD | AT91_TWI_IADRSZ_1 | ((ICS_ADDR << 16) & AT91_TWI_DADR)); ++ at91_twi_write(AT91_TWI_IADR, reg_address); ++ at91_twi_write(AT91_TWI_CR, AT91_TWI_START | AT91_TWI_STOP); ++ ++ /* Program temporizing period (300us) */ ++ udelay(300); ++ ++ /* Wait TXcomplete ... */ ++ nb_trial = 0; ++ Status = at91_twi_read(AT91_TWI_SR); ++ while (!(Status & AT91_TWI_TXCOMP) && (nb_trial < 10)) { ++ nb_trial++; ++ Status = at91_twi_read(AT91_TWI_SR); ++ } ++ ++ if (Status & AT91_TWI_TXCOMP) { ++ *data_in = (unsigned char) at91_twi_read(AT91_TWI_RHR); ++ return ICS1523_ACCESS_OK; ++ } ++ else ++ return ICS1523_ACCESS_ERROR; ++} ++ ++/* ----------------------------------------------------------------------------- ++ * Write a byte with TWI Interface to the Clock Generator ICS1523 ++ * ----------------------------------------------------------------------------- */ ++ ++static int at91_ics1523_WriteByte(unsigned char reg_address, unsigned char data_out) ++{ ++ int Status, nb_trial; ++ ++ at91_twi_write(AT91_TWI_MMR, AT91_TWI_IADRSZ_1 | ((ICS_ADDR << 16) & AT91_TWI_DADR)); ++ at91_twi_write(AT91_TWI_IADR, reg_address); ++ at91_twi_write(AT91_TWI_THR, data_out); ++ at91_twi_write(AT91_TWI_CR, AT91_TWI_START | AT91_TWI_STOP); ++ ++ /* Program temporizing period (300us) */ ++ udelay(300); ++ ++ nb_trial = 0; ++ Status = at91_twi_read(AT91_TWI_SR); ++ while (!(Status & AT91_TWI_TXCOMP) && (nb_trial < 10)) { ++ nb_trial++; ++ if (Status & AT91_TWI_ERROR) { ++ /* If Underrun OR NACK - Start again */ ++ at91_twi_write(AT91_TWI_CR, AT91_TWI_START | AT91_TWI_STOP); ++ ++ /* Program temporizing period (300us) */ ++ udelay(300); ++ } ++ Status = at91_twi_read(AT91_TWI_SR); ++ }; ++ ++ if (Status & AT91_TWI_TXCOMP) ++ return ICS1523_ACCESS_OK; ++ else ++ return ICS1523_ACCESS_ERROR; ++} ++ ++/* ----------------------------------------------------------------------------- ++ * Initialization of the Clock Generator ICS1523 ++ * ----------------------------------------------------------------------------- */ ++ ++int at91_ics1523_init(void) ++{ ++ int nb_trial; ++ int ack = ICS1523_ACCESS_OK; ++ unsigned int status = 0xffffffff; ++ struct clk *twi_clk; ++ ++ /* Map in TWI peripheral */ ++ twi_base = ioremap(AT91RM9200_BASE_TWI, SZ_16K); ++ if (!twi_base) ++ return -ENOMEM; ++ ++ /* pins used for TWI interface */ ++ at91_set_A_periph(AT91_PIN_PA25, 0); /* TWD */ ++ at91_set_multi_drive(AT91_PIN_PA25, 1); ++ at91_set_A_periph(AT91_PIN_PA26, 0); /* TWCK */ ++ at91_set_multi_drive(AT91_PIN_PA26, 1); ++ ++ /* Enable the TWI clock */ ++ twi_clk = clk_get(NULL, "twi_clk"); ++ if (IS_ERR(twi_clk)) ++ return ICS1523_ACCESS_ERROR; ++ clk_enable(twi_clk); ++ ++ /* Disable interrupts */ ++ at91_twi_write(AT91_TWI_IDR, -1); ++ ++ /* Reset peripheral */ ++ at91_twi_write(AT91_TWI_CR, AT91_TWI_SWRST); ++ ++ /* Set Master mode */ ++ at91_twi_write(AT91_TWI_CR, AT91_TWI_MSEN); ++ ++ /* Set TWI Clock Waveform Generator Register */ ++ at91_ics1523_SetTwiClock(60000); /* MCK in KHz = 60000 KHz */ ++ ++ /* ICS1523 Initialisation */ ++ ack |= at91_ics1523_WriteByte ((unsigned char) ICS_ICR, (unsigned char) 0); ++ ack |= at91_ics1523_WriteByte ((unsigned char) ICS_OE, (unsigned char) (ICS_OEF | ICS_OET2 | ICS_OETCK)); ++ ack |= at91_ics1523_WriteByte ((unsigned char) ICS_OD, (unsigned char) (ICS_INSEL | 0x7F)); ++ ack |= at91_ics1523_WriteByte ((unsigned char) ICS_DPAO, (unsigned char) 0); ++ ++ nb_trial = 0; ++ do { ++ nb_trial++; ++ ack |= at91_ics1523_WriteByte ((unsigned char) ICS_ICR, (unsigned char) (ICS_ENDLS | ICS_ENPLS | ICS_PDEN /*| ICS_FUNCSEL*/)); ++ ack |= at91_ics1523_WriteByte ((unsigned char) ICS_LCR, (unsigned char) (ICS_PSD | ICS_PFD)); ++ ack |= at91_ics1523_WriteByte ((unsigned char) ICS_FD0, (unsigned char) 0x39) ; /* 0x7A */ ++ ack |= at91_ics1523_WriteByte ((unsigned char) ICS_FD1, (unsigned char) 0x00); ++ ack |= at91_ics1523_WriteByte ((unsigned char) ICS_SWRST, (unsigned char) (ICS_PLLR)); ++ ++ /* Program 1ms temporizing period */ ++ mdelay(1); ++ ++ at91_ics1523_ReadByte ((unsigned char) ICS_SR, (char *)&status); ++ } while (!((unsigned int) status & (unsigned int) ICS_PLLLOCK) && (nb_trial < 10)); ++ ++ ack |= at91_ics1523_WriteByte ((unsigned char) ICS_DPAC, (unsigned char) 0x03) ; /* 0x01 */ ++ ack |= at91_ics1523_WriteByte ((unsigned char) ICS_SWRST, (unsigned char) (ICS_DPAR)); ++ ++ /* Program 1ms temporizing period */ ++ mdelay(1); ++ ++ ack |= at91_ics1523_WriteByte ((unsigned char) ICS_DPAO, (unsigned char) 0x00); ++ ++ /* Program 1ms temporizing period */ ++ mdelay(1); ++ ++ /* All done - cleanup */ ++ iounmap(twi_base); ++ clk_disable(twi_clk); ++ clk_put(twi_clk); ++ ++ return ack; ++} +diff -urN -x CVS linux-2.6.24/arch/arm/mach-at91/leds.c linux-2.6/arch/arm/mach-at91/leds.c +--- linux-2.6.24/arch/arm/mach-at91/leds.c 2007-10-09 22:31:38.000000000 +0200 ++++ linux-2.6/arch/arm/mach-at91/leds.c 2008-02-18 22:20:11.000000000 +0200 +@@ -14,11 +14,63 @@ + #include <linux/init.h> + + #include <asm/mach-types.h> +-#include <asm/leds.h> + #include <asm/arch/board.h> + #include <asm/arch/gpio.h> + + ++/* ------------------------------------------------------------------------- */ ++ ++#if defined(CONFIG_NEW_LEDS) ++ ++#include <linux/platform_device.h> ++ ++/* ++ * New cross-platform LED support. ++ */ ++ ++static struct gpio_led_platform_data led_data; ++ ++static struct platform_device at91_leds = { ++ .name = "leds-gpio", ++ .id = -1, ++ .dev.platform_data = &led_data, ++}; ++ ++void __init at91_gpio_leds(struct gpio_led *leds, int nr) ++{ ++ int i; ++ ++ if (!nr) ++ return; ++ ++ for (i = 0; i < nr; i++) ++ at91_set_gpio_output(leds[i].gpio, leds[i].active_low); ++ ++ led_data.leds = leds; ++ led_data.num_leds = nr; ++ platform_device_register(&at91_leds); ++} ++ ++#else ++void __init at91_gpio_leds(struct gpio_led *leds, int nr) {} ++#endif ++ ++ ++/* ------------------------------------------------------------------------- */ ++ ++#if defined(CONFIG_LEDS) ++ ++#include <asm/leds.h> ++ ++/* ++ * Old ARM-specific LED framework; not fully functional when generic time is ++ * in use. ++ */ ++ ++static u8 at91_leds_cpu; ++static u8 at91_leds_timer; ++ ++ + static inline void at91_led_on(unsigned int led) + { + at91_set_gpio_value(led, 0); +@@ -93,3 +145,18 @@ + } + + __initcall(leds_init); ++ ++ ++void __init at91_init_leds(u8 cpu_led, u8 timer_led) ++{ ++ /* Enable GPIO to access the LEDs */ ++ at91_set_gpio_output(cpu_led, 1); ++ at91_set_gpio_output(timer_led, 1); ++ ++ at91_leds_cpu = cpu_led; ++ at91_leds_timer = timer_led; ++} ++ ++#else ++void __init at91_init_leds(u8 cpu_led, u8 timer_led) {} ++#endif +diff -urN -x CVS linux-2.6.24/arch/arm/mach-at91/pm.c linux-2.6/arch/arm/mach-at91/pm.c +--- linux-2.6.24/arch/arm/mach-at91/pm.c 2008-03-01 22:02:07.000000000 +0200 ++++ linux-2.6/arch/arm/mach-at91/pm.c 2008-03-01 22:05:23.000000000 +0200 +@@ -26,12 +26,140 @@ + #include <asm/mach-types.h> + + #include <asm/arch/at91_pmc.h> +-#include <asm/arch/at91rm9200_mc.h> + #include <asm/arch/gpio.h> + #include <asm/arch/cpu.h> + + #include "generic.h" + ++#ifdef CONFIG_ARCH_AT91RM9200 ++#include <asm/arch/at91rm9200_mc.h> ++ ++/* ++ * The AT91RM9200 goes into self-refresh mode with this command, and will ++ * terminate self-refresh automatically on the next SDRAM access. ++ */ ++#define sdram_selfrefresh_enable() at91_sys_write(AT91_SDRAMC_SRR, 1) ++#define sdram_selfrefresh_disable() do {} while (0) ++ ++#elif defined(CONFIG_ARCH_AT91CAP9) ++#include <asm/arch/at91cap9_ddrsdr.h> ++ ++static u32 saved_lpr; ++ ++static inline void sdram_selfrefresh_enable(void) ++{ ++ u32 lpr; ++ ++ saved_lpr = at91_sys_read(AT91_DDRSDRC_LPR); ++ ++ lpr = saved_lpr & ~AT91_DDRSDRC_LPCB; ++ at91_sys_write(AT91_DDRSDRC_LPR, lpr | AT91_DDRSDRC_LPCB_SELF_REFRESH); ++} ++ ++#define sdram_selfrefresh_disable() at91_sys_write(AT91_DDRSDRC_LPR, saved_lpr) ++ ++#else ++#include <asm/arch/at91sam926x_sdramc.h> ++ ++static u32 saved_lpr; ++ ++static inline void sdram_selfrefresh_enable(void) ++{ ++ u32 lpr; ++ ++ saved_lpr = at91_sys_read(AT91_SDRAMC_LPR); ++ ++ lpr = saved_lpr & ~AT91_SDRAMC_LPCB; ++ at91_sys_write(AT91_SDRAMC_LPR, lpr | AT91_SDRAMC_LPCB_SELF_REFRESH); ++} ++ ++#define sdram_selfrefresh_disable() at91_sys_write(AT91_SDRAMC_LPR, saved_lpr) ++ ++/* ++ * FIXME: The AT91SAM9263 has a second EBI controller which may have ++ * additional SDRAM. pm_slowclock.S will require a similar fix. ++ */ ++ ++#endif ++ ++ ++#if defined(AT91_SHDWC) ++ ++#include <asm/arch/at91_rstc.h> ++#include <asm/arch/at91_shdwc.h> ++ ++/* ++ * Show the reason for the previous system reset. ++ */ ++static void __init show_reset_status(void) ++{ ++ static char reset[] __initdata = "reset"; ++ ++ static char general[] __initdata = "general"; ++ static char wakeup[] __initdata = "wakeup"; ++ static char watchdog[] __initdata = "watchdog"; ++ static char software[] __initdata = "software"; ++ static char user[] __initdata = "user"; ++ static char unknown[] __initdata = "unknown"; ++ ++ static char signal[] __initdata = "signal"; ++ static char rtc[] __initdata = "rtc"; ++ static char rtt[] __initdata = "rtt"; ++ static char restore[] __initdata = "power-restored"; ++ ++ char *reason, *r2 = reset; ++ u32 reset_type, wake_type; ++ ++ reset_type = at91_sys_read(AT91_RSTC_SR) & AT91_RSTC_RSTTYP; ++ wake_type = at91_sys_read(AT91_SHDW_SR); ++ ++ switch (reset_type) { ++ case AT91_RSTC_RSTTYP_GENERAL: ++ reason = general; ++ break; ++ case AT91_RSTC_RSTTYP_WAKEUP: ++ /* board-specific code enabled the wakeup sources */ ++ reason = wakeup; ++ ++ /* "wakeup signal" */ ++ if (wake_type & AT91_SHDW_WAKEUP0) ++ r2 = signal; ++ else { ++ r2 = reason; ++ if (wake_type & AT91_SHDW_RTTWK) /* rtt wakeup */ ++ reason = rtt; ++ else if (wake_type & AT91_SHDW_RTCWK) /* rtc wakeup */ ++ reason = rtc; ++ else if (wake_type == 0) /* power-restored wakeup */ ++ reason = restore; ++ else /* unknown wakeup */ ++ reason = unknown; ++ } ++ break; ++ case AT91_RSTC_RSTTYP_WATCHDOG: ++ reason = watchdog; ++ break; ++ case AT91_RSTC_RSTTYP_SOFTWARE: ++ reason = software; ++ break; ++ case AT91_RSTC_RSTTYP_USER: ++ reason = user; ++ break; ++ default: ++ reason = unknown; ++ break; ++ } ++ pr_info("AT91: Starting after %s %s\n", reason, r2); ++} ++#else ++static void __init show_reset_status(void) {} ++#endif ++ ++#ifdef CONFIG_AT91_SLOW_CLOCK ++extern void at91_slow_clock(void); ++extern u32 at91_slow_clock_sz; ++#endif ++ + + static int at91_pm_valid_state(suspend_state_t state) + { +@@ -62,6 +190,7 @@ + * Verify that all the clocks are correct before entering + * slow-clock mode. + */ ++#warning "This should probably be moved to clocks.c" + static int at91_pm_verify_clocks(void) + { + unsigned long scsr; +@@ -80,6 +209,11 @@ + pr_debug("AT91: PM - Suspend-to-RAM with USB still active\n"); + return 0; + } ++ } else if (cpu_is_at91cap9()) { ++ if ((scsr & AT91CAP9_PMC_UHP) != 0) { ++ pr_debug("AT91: PM - Suspend-to-RAM with USB still active\n"); ++ return 0; ++ } + } + + #ifdef CONFIG_AT91_PROGRAMMABLE_CLOCKS +@@ -102,20 +236,15 @@ + } + + /* +- * Call this from platform driver suspend() to see how deeply to suspend. ++ * This is called from clk_must_disable(), to see how deeply to suspend. + * For example, some controllers (like OHCI) need one of the PLL clocks + * in order to act as a wakeup source, and those are not available when + * going into slow clock mode. +- * +- * REVISIT: generalize as clk_will_be_available(clk)? Other platforms have +- * the very same problem (but not using at91 main_clk), and it'd be better +- * to add one generic API rather than lots of platform-specific ones. + */ + int at91_suspend_entering_slow_clock(void) + { + return (target_state == PM_SUSPEND_MEM); + } +-EXPORT_SYMBOL(at91_suspend_entering_slow_clock); + + + static void (*slow_clock)(void); +@@ -153,11 +282,12 @@ + * turning off the main oscillator; reverse on wakeup. + */ + if (slow_clock) { ++ /* copy slow_clock handler to SRAM, and call it */ ++ memcpy(slow_clock, at91_slow_clock, at91_slow_clock_sz); + slow_clock(); + break; + } else { +- /* DEVELOPMENT ONLY */ +- pr_info("AT91: PM - no slow clock mode yet ...\n"); ++ pr_info("AT91: PM - no slow clock mode enabled ...\n"); + /* FALLTHROUGH leaving master clock alone */ + } + +@@ -170,13 +300,15 @@ + case PM_SUSPEND_STANDBY: + /* + * NOTE: the Wait-for-Interrupt instruction needs to be +- * in icache so the SDRAM stays in self-refresh mode until +- * the wakeup IRQ occurs. ++ * in icache so no SDRAM accesses are needed until the ++ * wakeup IRQ occurs and self-refresh is terminated. + */ + asm("b 1f; .align 5; 1:"); + asm("mcr p15, 0, r0, c7, c10, 4"); /* drain write buffer */ +- at91_sys_write(AT91_SDRAMC_SRR, 1); /* self-refresh mode */ +- /* fall though to next state */ ++ sdram_selfrefresh_enable(); ++ asm("mcr p15, 0, r0, c7, c0, 4"); /* wait for interrupt */ ++ sdram_selfrefresh_disable(); ++ break; + + case PM_SUSPEND_ON: + asm("mcr p15, 0, r0, c7, c0, 4"); /* wait for interrupt */ +@@ -191,6 +323,7 @@ + at91_sys_read(AT91_AIC_IPR) & at91_sys_read(AT91_AIC_IMR)); + + error: ++ sdram_selfrefresh_disable(); + target_state = PM_SUSPEND_ON; + at91_irq_resume(); + at91_gpio_resume(); +@@ -204,23 +337,24 @@ + .enter = at91_pm_enter, + }; + ++ + static int __init at91_pm_init(void) + { +- printk("AT91: Power Management\n"); +- +-#ifdef CONFIG_AT91_PM_SLOW_CLOCK +- /* REVISIT allocations of SRAM should be dynamically managed. +- * FIQ handlers and other components will want SRAM/TCM too... +- */ +- slow_clock = (void *) (AT91_VA_BASE_SRAM + (3 * SZ_4K)); +- memcpy(slow_clock, at91rm9200_slow_clock, at91rm9200_slow_clock_sz); ++#ifdef CONFIG_AT91_SLOW_CLOCK ++ slow_clock = (void *) (AT91_IO_VIRT_BASE - at91_slow_clock_sz); ++ pr_info("AT91: Power Management (with slow clock mode)\n"); ++#else ++ pr_info("AT91: Power Management\n"); + #endif + +- /* Disable SDRAM low-power mode. Cannot be used with self-refresh. */ ++#ifdef CONFIG_ARCH_AT91RM9200 ++ /* AT91RM9200 SDRAM low-power mode cannot be used with self-refresh. */ + at91_sys_write(AT91_SDRAMC_LPR, 0); ++#endif + + suspend_set_ops(&at91_pm_ops); + ++ show_reset_status(); + return 0; + } + arch_initcall(at91_pm_init); +diff -urN -x CVS linux-2.6.24/arch/arm/mach-at91/pm_slowclock.S linux-2.6/arch/arm/mach-at91/pm_slowclock.S +--- linux-2.6.24/arch/arm/mach-at91/pm_slowclock.S 1970-01-01 02:00:00.000000000 +0200 ++++ linux-2.6/arch/arm/mach-at91/pm_slowclock.S 2008-03-01 21:38:50.000000000 +0200 +@@ -0,0 +1,273 @@ ++/* ++ * arch/arm/mach-at91/pm_slow_clock.S ++ * ++ * Copyright (C) 2006 Savin Zlobec ++ * ++ * AT91SAM9 support: ++ * Copyright (C) 2007 Anti Sullin <anti.sullin@artecdesign.ee ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License version 2 as ++ * published by the Free Software Foundation. ++ * ++ */ ++ ++#include <linux/linkage.h> ++#include <asm/hardware.h> ++#include <asm/arch/at91_pmc.h> ++ ++#ifdef CONFIG_ARCH_AT91RM9200 ++#include <asm/arch/at91rm9200_mc.h> ++#elif defined(CONFIG_ARCH_AT91CAP9) ++#include <asm/arch/at91cap9_ddrsdr.h> ++#else ++#include <asm/arch/at91sam926x_sdramc.h> ++#endif ++ ++/* ++ * When SLOWDOWN_MASTER_CLOCK is defined we will also slow down the Master ++ * clock during suspend by adjusting its prescalar and divisor. ++ * NOTE: This hasn't been shown to be stable on SAM9s; and on the RM9200 there ++ * are errata regarding adjusting the prescalar and divisor. ++ */ ++#undef SLOWDOWN_MASTER_CLOCK ++ ++#define MCKRDY_TIMEOUT 1000 ++#define MOSCRDY_TIMEOUT 1000 ++#define PLLALOCK_TIMEOUT 1000 ++#define PLLBLOCK_TIMEOUT 1000 ++ ++ ++/* ++ * Wait until master clock is ready (after switching master clock source) ++ */ ++ .macro wait_mckrdy ++ mov r4, #MCKRDY_TIMEOUT ++1: sub r4, r4, #1 ++ cmp r4, #0 ++ beq 2f ++ ldr r3, [r1, #(AT91_PMC_SR - AT91_PMC)] ++ tst r3, #AT91_PMC_MCKRDY ++ beq 1b ++2: ++ .endm ++ ++/* ++ * Wait until master oscillator has stabilized. ++ */ ++ .macro wait_moscrdy ++ mov r4, #MOSCRDY_TIMEOUT ++1: sub r4, r4, #1 ++ cmp r4, #0 ++ beq 2f ++ ldr r3, [r1, #(AT91_PMC_SR - AT91_PMC)] ++ tst r3, #AT91_PMC_MOSCS ++ beq 1b ++2: ++ .endm ++ ++/* ++ * Wait until PLLA has locked. ++ */ ++ .macro wait_pllalock ++ mov r4, #PLLALOCK_TIMEOUT ++1: sub r4, r4, #1 ++ cmp r4, #0 ++ beq 2f ++ ldr r3, [r1, #(AT91_PMC_SR - AT91_PMC)] ++ tst r3, #AT91_PMC_LOCKA ++ beq 1b ++2: ++ .endm ++ ++/* ++ * Wait until PLLB has locked. ++ */ ++ .macro wait_pllblock ++ mov r4, #PLLBLOCK_TIMEOUT ++1: sub r4, r4, #1 ++ cmp r4, #0 ++ beq 2f ++ ldr r3, [r1, #(AT91_PMC_SR - AT91_PMC)] ++ tst r3, #AT91_PMC_LOCKB ++ beq 1b ++2: ++ .endm ++ ++ .text ++ ++ENTRY(at91_slow_clock) ++ /* Save registers on stack */ ++ stmfd sp!, {r0 - r12, lr} ++ ++ /* ++ * Register usage: ++ * R1 = Base address of AT91_PMC ++ * R2 = Base address of AT91_SDRAMC (or AT91_SYS on AT91RM9200) ++ * R3 = temporary register ++ * R4 = temporary register ++ */ ++ ldr r1, .at91_va_base_pmc ++ ldr r2, .at91_va_base_sdramc ++ ++ /* Drain write buffer */ ++ mcr p15, 0, r0, c7, c10, 4 ++ ++#ifdef CONFIG_ARCH_AT91RM9200 ++ /* Put SDRAM in self-refresh mode */ ++ mov r3, #1 ++ str r3, [r2, #AT91_SDRAMC_SRR] ++#elif defined(CONFIG_ARCH_AT91CAP9) ++ /* Enable SDRAM self-refresh mode */ ++ ldr r3, [r2, #AT91_DDRSDRC_LPR - AT91_DDRSDRC] ++ str r3, .saved_sam9_lpr ++ ++ mov r3, #AT91_DDRSDRC_LPCB_SELF_REFRESH ++ str r3, [r2, #AT91_DDRSDRC_LPR - AT91_DDRSDRC] ++#else ++ /* Enable SDRAM self-refresh mode */ ++ ldr r3, [r2, #AT91_SDRAMC_LPR - AT91_SDRAMC] ++ str r3, .saved_sam9_lpr ++ ++ mov r3, #AT91_SDRAMC_LPCB_SELF_REFRESH ++ str r3, [r2, #AT91_SDRAMC_LPR - AT91_SDRAMC] ++#endif ++ ++ /* Save Master clock setting */ ++ ldr r3, [r1, #(AT91_PMC_MCKR - AT91_PMC)] ++ str r3, .saved_mckr ++ ++ /* ++ * Set the Master clock source to slow clock ++ */ ++ bic r3, r3, #AT91_PMC_CSS ++ str r3, [r1, #(AT91_PMC_MCKR - AT91_PMC)] ++ ++ wait_mckrdy ++ ++#ifdef SLOWDOWN_MASTER_CLOCK ++ /* ++ * Set the Master Clock PRES and MDIV fields. ++ * ++ * See AT91RM9200 errata #27 and #28 for details. ++ */ ++ mov r3, #0 ++ str r3, [r1, #(AT91_PMC_MCKR - AT91_PMC)] ++ ++ wait_mckrdy ++#endif ++ ++ /* Save PLLA setting and disable it */ ++ ldr r3, [r1, #(AT91_CKGR_PLLAR - AT91_PMC)] ++ str r3, .saved_pllar ++ ++ mov r3, #AT91_PMC_PLLCOUNT ++ orr r3, r3, #(1 << 29) /* bit 29 always set */ ++ str r3, [r1, #(AT91_CKGR_PLLAR - AT91_PMC)] ++ ++ wait_pllalock ++ ++ /* Save PLLB setting and disable it */ ++ ldr r3, [r1, #(AT91_CKGR_PLLBR - AT91_PMC)] ++ str r3, .saved_pllbr ++ ++ mov r3, #AT91_PMC_PLLCOUNT ++ str r3, [r1, #(AT91_CKGR_PLLBR - AT91_PMC)] ++ ++ wait_pllblock ++ ++ /* Turn off the main oscillator */ ++ ldr r3, [r1, #(AT91_CKGR_MOR - AT91_PMC)] ++ bic r3, r3, #AT91_PMC_MOSCEN ++ str r3, [r1, #(AT91_CKGR_MOR - AT91_PMC)] ++ ++ /* Wait for interrupt */ ++ mcr p15, 0, r0, c7, c0, 4 ++ ++ /* Turn on the main oscillator */ ++ ldr r3, [r1, #(AT91_CKGR_MOR - AT91_PMC)] ++ orr r3, r3, #AT91_PMC_MOSCEN ++ str r3, [r1, #(AT91_CKGR_MOR - AT91_PMC)] ++ ++ wait_moscrdy ++ ++ /* Restore PLLB setting */ ++ ldr r3, .saved_pllbr ++ str r3, [r1, #(AT91_CKGR_PLLBR - AT91_PMC)] ++ ++ wait_pllblock ++ ++ /* Restore PLLA setting */ ++ ldr r3, .saved_pllar ++ str r3, [r1, #(AT91_CKGR_PLLAR - AT91_PMC)] ++ ++ wait_pllalock ++ ++#ifdef SLOWDOWN_MASTER_CLOCK ++ /* ++ * First set PRES if it was not 0, ++ * than set CSS and MDIV fields. ++ * ++ * See AT91RM9200 errata #27 and #28 for details. ++ */ ++ ldr r3, .saved_mckr ++ tst r3, #AT91_PMC_PRES ++ beq 2f ++ and r3, r3, #AT91_PMC_PRES ++ str r3, [r1, #(AT91_PMC_MCKR - AT91_PMC)] ++ ++ wait_mckrdy ++#endif ++ ++ /* ++ * Restore master clock setting ++ */ ++2: ldr r3, .saved_mckr ++ str r3, [r1, #(AT91_PMC_MCKR - AT91_PMC)] ++ ++ wait_mckrdy ++ ++#ifdef CONFIG_ARCH_AT91RM9200 ++ /* Do nothing - self-refresh is automatically disabled. */ ++#elif defined(CONFIG_ARCH_AT91CAP9) ++ /* Restore LPR on AT91CAP9 */ ++ ldr r3, .saved_sam9_lpr ++ str r3, [r2, #AT91_DDRSDRC_LPR - AT91_DDRSDRC] ++#else ++ /* Restore LPR on AT91SAM9 */ ++ ldr r3, .saved_sam9_lpr ++ str r3, [r2, #AT91_SDRAMC_LPR - AT91_SDRAMC] ++#endif ++ ++ /* Restore registers, and return */ ++ ldmfd sp!, {r0 - r12, pc} ++ ++ ++.saved_mckr: ++ .word 0 ++ ++.saved_pllar: ++ .word 0 ++ ++.saved_pllbr: ++ .word 0 ++ ++.saved_sam9_lpr: ++ .word 0 ++ ++.at91_va_base_pmc: ++ .word AT91_VA_BASE_SYS + AT91_PMC ++ ++#ifdef CONFIG_ARCH_AT91RM9200 ++.at91_va_base_sdramc: ++ .word AT91_VA_BASE_SYS ++#elif defined(CONFIG_ARCH_AT91CAP9) ++.at91_va_base_sdramc: ++ .word AT91_VA_BASE_SYS + AT91_DDRSDRC ++#else ++.at91_va_base_sdramc: ++ .word AT91_VA_BASE_SYS + AT91_SDRAMC ++#endif ++ ++ENTRY(at91_slow_clock_sz) ++ .word .-at91_slow_clock +diff -urN -x CVS linux-2.6.24/arch/arm/mm/Kconfig linux-2.6/arch/arm/mm/Kconfig +--- linux-2.6.24/arch/arm/mm/Kconfig 2008-03-01 22:02:07.000000000 +0200 ++++ linux-2.6/arch/arm/mm/Kconfig 2008-01-16 20:26:55.000000000 +0200 +@@ -171,8 +171,8 @@ + # ARM926T + config CPU_ARM926T + bool "Support ARM926T processor" +- depends on ARCH_INTEGRATOR || ARCH_VERSATILE_PB || MACH_VERSATILE_AB || ARCH_OMAP730 || ARCH_OMAP16XX || MACH_REALVIEW_EB || ARCH_PNX4008 || ARCH_NETX || CPU_S3C2412 || ARCH_AT91SAM9260 || ARCH_AT91SAM9261 || ARCH_AT91SAM9263 || ARCH_AT91SAM9RL || ARCH_NS9XXX || ARCH_DAVINCI +- default y if ARCH_VERSATILE_PB || MACH_VERSATILE_AB || ARCH_OMAP730 || ARCH_OMAP16XX || ARCH_PNX4008 || ARCH_NETX || CPU_S3C2412 || ARCH_AT91SAM9260 || ARCH_AT91SAM9261 || ARCH_AT91SAM9263 || ARCH_AT91SAM9RL || ARCH_NS9XXX || ARCH_DAVINCI ++ depends on ARCH_INTEGRATOR || ARCH_VERSATILE_PB || MACH_VERSATILE_AB || ARCH_OMAP730 || ARCH_OMAP16XX || MACH_REALVIEW_EB || ARCH_PNX4008 || ARCH_NETX || CPU_S3C2412 || ARCH_AT91SAM9260 || ARCH_AT91SAM9261 || ARCH_AT91SAM9263 || ARCH_AT91SAM9RL || ARCH_AT91CAP9 || ARCH_NS9XXX || ARCH_DAVINCI ++ default y if ARCH_VERSATILE_PB || MACH_VERSATILE_AB || ARCH_OMAP730 || ARCH_OMAP16XX || ARCH_PNX4008 || ARCH_NETX || CPU_S3C2412 || ARCH_AT91SAM9260 || ARCH_AT91SAM9261 || ARCH_AT91SAM9263 || ARCH_AT91SAM9RL || ARCH_AT91CAP9 || ARCH_NS9XXX || ARCH_DAVINCI + select CPU_32v5 + select CPU_ABRT_EV5TJ + select CPU_CACHE_VIVT +diff -urN -x CVS linux-2.6.24/arch/arm/tools/mach-types linux-2.6/arch/arm/tools/mach-types +--- linux-2.6.24/arch/arm/tools/mach-types 2007-10-09 22:31:38.000000000 +0200 ++++ linux-2.6/arch/arm/tools/mach-types 2008-01-16 21:25:12.000000000 +0200 +@@ -12,7 +12,7 @@ + # + # http://www.arm.linux.org.uk/developer/machines/?action=new + # +-# Last update: Fri May 11 19:53:41 2007 ++# Last update: Mon Nov 12 14:39:37 2007 + # + # machine_is_xxx CONFIG_xxxx MACH_TYPE_xxx number + # +@@ -266,7 +266,7 @@ + wismo SA1100_WISMO WISMO 249 + ezlinx ARCH_EZLINX EZLINX 250 + at91rm9200 ARCH_AT91RM9200 AT91RM9200 251 +-orion ARCH_ORION ORION 252 ++adtech_orion ARCH_ADTECH_ORION ADTECH_ORION 252 + neptune ARCH_NEPTUNE NEPTUNE 253 + hackkit SA1100_HACKKIT HACKKIT 254 + pxa_wins30 ARCH_PXA_WINS30 PXA_WINS30 255 +@@ -661,7 +661,7 @@ + pnx0105 MACH_PNX0105 PNX0105 646 + adcpoecpu MACH_ADCPOECPU ADCPOECPU 647 + csb637 MACH_CSB637 CSB637 648 +-ml69q6203 MACH_ML69Q6203 ML69Q6203 649 ++ml675050 MACH_ML69Q6203 ML69Q6203 649 + mb9200 MACH_MB9200 MB9200 650 + kulun MACH_KULUN KULUN 651 + snapper MACH_SNAPPER SNAPPER 652 +@@ -953,7 +953,7 @@ + ttg_color1 MACH_TTG_COLOR1 TTG_COLOR1 940 + nxeb500hmi MACH_NXEB500HMI NXEB500HMI 941 + netdcu8 MACH_NETDCU8 NETDCU8 942 +-ml675050_cpu_boa MACH_ML675050_CPU_BOA ML675050_CPU_BOA 943 ++ml675050_dev_sys MACH_ML675050_CPU_BOA ML675050_CPU_BOA 943 + ng_fvx538 MACH_NG_FVX538 NG_FVX538 944 + ng_fvs338 MACH_NG_FVS338 NG_FVS338 945 + pnx4103 MACH_PNX4103 PNX4103 946 +@@ -1148,7 +1148,7 @@ + rema MACH_REMA REMA 1135 + bps1000 MACH_BPS1000 BPS1000 1136 + hw90350 MACH_HW90350 HW90350 1137 +-omap_sdp3430 MACH_OMAP_SDP3430 OMAP_SDP3430 1138 ++omap_3430sdp MACH_OMAP_3430SDP OMAP_3430SDP 1138 + bluetouch MACH_BLUETOUCH BLUETOUCH 1139 + vstms MACH_VSTMS VSTMS 1140 + xsbase270 MACH_XSBASE270 XSBASE270 1141 +@@ -1214,7 +1214,7 @@ + kbat9261 MACH_KBAT9261 KBAT9261 1204 + ct1100 MACH_CT1100 CT1100 1205 + akcppxa MACH_AKCPPXA AKCPPXA 1206 +-zevio_1020 MACH_ZEVIO_1020 ZEVIO_1020 1207 ++ochaya1020 MACH_OCHAYA1020 OCHAYA1020 1207 + hitrack MACH_HITRACK HITRACK 1208 + syme1 MACH_SYME1 SYME1 1209 + syhl1 MACH_SYHL1 SYHL1 1210 +@@ -1299,7 +1299,7 @@ + h4300 MACH_H4300 H4300 1291 + goramo_mlr MACH_GORAMO_MLR GORAMO_MLR 1292 + mxc30020evb MACH_MXC30020EVB MXC30020EVB 1293 +-adsbitsymx MACH_ADSBITSIMX ADSBITSIMX 1294 ++adsbitsyg5 MACH_ADSBITSIMX ADSBITSIMX 1294 + adsportalplus MACH_ADSPORTALPLUS ADSPORTALPLUS 1295 + mmsp2plus MACH_MMSP2PLUS MMSP2PLUS 1296 + em_x270 MACH_EM_X270 EM_X270 1297 +@@ -1367,3 +1367,190 @@ + csb726 MACH_CSB726 CSB726 1359 + tik27 MACH_TIK27 TIK27 1360 + mx_uc7420 MACH_MX_UC7420 MX_UC7420 1361 ++rirm3 MACH_RIRM3 RIRM3 1362 ++pelco_odyssey MACH_PELCO_ODYSSEY PELCO_ODYSSEY 1363 ++arm920t MACH_ARM920T ARM920T 1364 ++add_abox MACH_ADD_ABOX ADD_ABOX 1365 ++add_tpid MACH_ADD_TPID ADD_TPID 1366 ++minicheck MACH_MINICHECK MINICHECK 1367 ++idam MACH_IDAM IDAM 1368 ++mario_mx MACH_MARIO_MX MARIO_MX 1369 ++vi1888 MACH_VI1888 VI1888 1370 ++zr4230 MACH_ZR4230 ZR4230 1371 ++t1_ix_blue MACH_T1_IX_BLUE T1_IX_BLUE 1372 ++syhq2 MACH_SYHQ2 SYHQ2 1373 ++computime_r3 MACH_COMPUTIME_R3 COMPUTIME_R3 1374 ++oratis MACH_ORATIS ORATIS 1375 ++mikko MACH_MIKKO MIKKO 1376 ++holon MACH_HOLON HOLON 1377 ++olip8 MACH_OLIP8 OLIP8 1378 ++ghi270hg MACH_GHI270HG GHI270HG 1379 ++davinci_dm6467_evm MACH_DAVINCI_DM6467_EVM DAVINCI_DM6467_EVM 1380 ++davinci_dm355_evm MACH_DAVINCI_DM350_EVM DAVINCI_DM350_EVM 1381 ++ocearm MACH_OCEARMTEST OCEARMTEST 1382 ++blackriver MACH_BLACKRIVER BLACKRIVER 1383 ++sandgate_wp MACH_SANDGATEWP SANDGATEWP 1384 ++cdotbwsg MACH_CDOTBWSG CDOTBWSG 1385 ++quark963 MACH_QUARK963 QUARK963 1386 ++csb735 MACH_CSB735 CSB735 1387 ++littleton MACH_LITTLETON LITTLETON 1388 ++mio_p550 MACH_MIO_P550 MIO_P550 1389 ++motion2440 MACH_MOTION2440 MOTION2440 1390 ++imm500 MACH_IMM500 IMM500 1391 ++homematic MACH_HOMEMATIC HOMEMATIC 1392 ++ermine MACH_ERMINE ERMINE 1393 ++kb9202b MACH_KB9202B KB9202B 1394 ++hs1xx MACH_HS1XX HS1XX 1395 ++studentmate2440 MACH_STUDENTMATE2440 STUDENTMATE2440 1396 ++arvoo_l1_z1 MACH_ARVOO_L1_Z1 ARVOO_L1_Z1 1397 ++dep2410k MACH_DEP2410K DEP2410K 1398 ++xxsvideo MACH_XXSVIDEO XXSVIDEO 1399 ++im4004 MACH_IM4004 IM4004 1400 ++ochaya1050 MACH_OCHAYA1050 OCHAYA1050 1401 ++lep9261 MACH_LEP9261 LEP9261 1402 ++svenmeb MACH_SVENMEB SVENMEB 1403 ++fortunet2ne MACH_FORTUNET2NE FORTUNET2NE 1404 ++omap2 MACH_OMAP2 OMAP2 1405 ++nxhx MACH_NXHX NXHX 1406 ++realview_pb11mp MACH_REALVIEW_PB11MP REALVIEW_PB11MP 1407 ++ids500 MACH_IDS500 IDS500 1408 ++ors_n725 MACH_ORS_N725 ORS_N725 1409 ++hsdarm MACH_HSDARM HSDARM 1410 ++sha_pon003 MACH_SHA_PON003 SHA_PON003 1411 ++sha_pon004 MACH_SHA_PON004 SHA_PON004 1412 ++sha_pon007 MACH_SHA_PON007 SHA_PON007 1413 ++sha_pon011 MACH_SHA_PON011 SHA_PON011 1414 ++h6042 MACH_H6042 H6042 1415 ++h6043 MACH_H6043 H6043 1416 ++looxc550 MACH_LOOXC550 LOOXC550 1417 ++cnty_titan MACH_CNTY_TITAN CNTY_TITAN 1418 ++app3xx MACH_APP3XX APP3XX 1419 ++sideoatsgrama MACH_SIDEOATSGRAMA SIDEOATSGRAMA 1420 ++xscale_palmt700p MACH_XSCALE_PALMT700P XSCALE_PALMT700P 1421 ++xscale_palmt700w MACH_XSCALE_PALMT700W XSCALE_PALMT700W 1422 ++xscale_palmt750 MACH_XSCALE_PALMT750 XSCALE_PALMT750 1423 ++xscale_palmt755p MACH_XSCALE_PALMT755P XSCALE_PALMT755P 1424 ++ezreganut9200 MACH_EZREGANUT9200 EZREGANUT9200 1425 ++sarge MACH_SARGE SARGE 1426 ++a696 MACH_A696 A696 1427 ++turtle1916 MACH_TURTLE TURTLE 1428 ++pxa1916 MACH_MY5910TURTLE MY5910TURTLE 1429 ++mx27_3ds MACH_MX27_3DS MX27_3DS 1430 ++bishop MACH_BISHOP BISHOP 1431 ++pxx MACH_PXX PXX 1432 ++redwood MACH_REDWOOD REDWOOD 1433 ++dummy MACH_OMAP2430DLP OMAP2430DLP 1434 ++dummy_board MACH_OMAP2430OSK OMAP2430OSK 1435 ++omap_2430dlp MACH_OMAP_2430DLP OMAP_2430DLP 1436 ++omap_2430osk MACH_OMAP_2430OSK OMAP_2430OSK 1437 ++sardine MACH_SARDINE SARDINE 1438 ++halibut MACH_HALIBUT HALIBUT 1439 ++trout MACH_TROUT TROUT 1440 ++goldfish MACH_GOLDFISH GOLDFISH 1441 ++gesbc2440 MACH_GESBC2440 GESBC2440 1442 ++nomad MACH_NOMAD NOMAD 1443 ++rosalind MACH_ROSALIND ROSALIND 1444 ++cc9p9215 MACH_CC9P9215 CC9P9215 1445 ++cc9p9210 MACH_CC9P9210 CC9P9210 1446 ++cc9p9215js MACH_CC9P9215JS CC9P9215JS 1447 ++cc9p9210js MACH_CC9P9210JS CC9P9210JS 1448 ++nasffe MACH_NASFFE NASFFE 1449 ++tn2x0bd MACH_TN2X0BD TN2X0BD 1450 ++gwmpxa MACH_GWMPXA GWMPXA 1451 ++exyplus MACH_EXYPLUS EXYPLUS 1452 ++jadoo21 MACH_JADOO21 JADOO21 1453 ++looxn560 MACH_LOOXN560 LOOXN560 1454 ++bonsai MACH_BONSAI BONSAI 1455 ++adsmilgato MACH_ADSMILGATO ADSMILGATO 1456 ++gba MACH_GBA GBA 1457 ++h6044 MACH_H6044 H6044 1458 ++app MACH_APP APP 1459 ++tct_hammer MACH_TCT_HAMMER TCT_HAMMER 1460 ++herald MACH_HERMES HERMES 1461 ++artemis MACH_ARTEMIS ARTEMIS 1462 ++htctitan MACH_HTCTITAN HTCTITAN 1463 ++qranium MACH_QRANIUM QRANIUM 1464 ++add_wsc2 MACH_ADD_WSC2 ADD_WSC2 1465 ++add_medinet MACH_ADD_MEDINET ADD_MEDINET 1466 ++bboard MACH_BBOARD BBOARD 1467 ++cambria MACH_CAMBRIA CAMBRIA 1468 ++mt7xxx MACH_MT7XXX MT7XXX 1469 ++matrix512 MACH_MATRIX512 MATRIX512 1470 ++matrix522 MACH_MATRIX522 MATRIX522 1471 ++ipac5010 MACH_IPAC5010 IPAC5010 1472 ++sakura MACH_SAKURA SAKURA 1473 ++grocx MACH_GROCX GROCX 1474 ++pm9263 MACH_PM9263 PM9263 1475 ++sim_one MACH_SIM_ONE SIM_ONE 1476 ++acq132 MACH_ACQ132 ACQ132 1477 ++datr MACH_DATR DATR 1478 ++actux1 MACH_ACTUX1 ACTUX1 1479 ++actux2 MACH_ACTUX2 ACTUX2 1480 ++actux3 MACH_ACTUX3 ACTUX3 1481 ++flexit MACH_FLEXIT FLEXIT 1482 ++bh2x0bd MACH_BH2X0BD BH2X0BD 1483 ++atb2002 MACH_ATB2002 ATB2002 1484 ++xenon MACH_XENON XENON 1485 ++fm607 MACH_FM607 FM607 1486 ++matrix514 MACH_MATRIX514 MATRIX514 1487 ++matrix524 MACH_MATRIX524 MATRIX524 1488 ++inpod MACH_INPOD INPOD 1489 ++jive MACH_JIVE JIVE 1490 ++tll_mx21 MACH_TLL_MX21 TLL_MX21 1491 ++sbc2800 MACH_SBC2800 SBC2800 1492 ++cc7ucamry MACH_CC7UCAMRY CC7UCAMRY 1493 ++ubisys_p9_sc15 MACH_UBISYS_P9_SC15 UBISYS_P9_SC15 1494 ++ubisys_p9_ssc2d10 MACH_UBISYS_P9_SSC2D10 UBISYS_P9_SSC2D10 1495 ++ubisys_p9_rcu3 MACH_UBISYS_P9_RCU3 UBISYS_P9_RCU3 1496 ++aml_m8000 MACH_AML_M8000 AML_M8000 1497 ++snapper_270 MACH_SNAPPER_270 SNAPPER_270 1498 ++omap_bbx MACH_OMAP_BBX OMAP_BBX 1499 ++ucn2410 MACH_UCN2410 UCN2410 1500 ++sam9_l9260 MACH_SAM9_L9260 SAM9_L9260 1501 ++eti_c2 MACH_ETI_C2 ETI_C2 1502 ++avalanche MACH_AVALANCHE AVALANCHE 1503 ++realview_pb1176 MACH_REALVIEW_PB1176 REALVIEW_PB1176 1504 ++dp1500 MACH_DP1500 DP1500 1505 ++apple_iphone MACH_APPLE_IPHONE APPLE_IPHONE 1506 ++yl9200 MACH_YL9200 YL9200 1507 ++rd88f5182 MACH_RD88F5182 RD88F5182 1508 ++kurobox_pro MACH_KUROBOX_PRO KUROBOX_PRO 1509 ++se_poet MACH_SE_POET SE_POET 1510 ++mx31_3ds MACH_MX31_3DS MX31_3DS 1511 ++r270 MACH_R270 R270 1512 ++armour21 MACH_ARMOUR21 ARMOUR21 1513 ++dt2 MACH_DT2 DT2 1514 ++vt4 MACH_VT4 VT4 1515 ++tyco320 MACH_TYCO320 TYCO320 1516 ++adma MACH_ADMA ADMA 1517 ++wp188 MACH_WP188 WP188 1518 ++corsica MACH_CORSICA CORSICA 1519 ++bigeye MACH_BIGEYE BIGEYE 1520 ++machine_is_arm2410 MACH_MACHINE_IS_ARM2410 MACHINE_IS_ARM2410 1521 ++tll5000 MACH_TLL5000 TLL5000 1522 ++hni270 MACH_HNI_X270 HNI_X270 1523 ++qong MACH_QONG QONG 1524 ++tcompact MACH_TCOMPACT TCOMPACT 1525 ++puma5 MACH_PUMA5 PUMA5 1526 ++elara MACH_ELARA ELARA 1527 ++ellington MACH_ELLINGTON ELLINGTON 1528 ++xda_atom MACH_XDA_ATOM XDA_ATOM 1529 ++energizer2 MACH_ENERGIZER2 ENERGIZER2 1530 ++odin MACH_ODIN ODIN 1531 ++actux4 MACH_ACTUX4 ACTUX4 1532 ++esl_omap MACH_ESL_OMAP ESL_OMAP 1533 ++omap2evm MACH_OMAP2EVM OMAP2EVM 1534 ++omap3evm MACH_OMAP3EVM OMAP3EVM 1535 ++add_pcu57 MACH_ADD_PCU57 ADD_PCU57 1536 ++monaco MACH_MONACO MONACO 1537 ++levante MACH_LEVANTE LEVANTE 1538 ++tmxipx425 MACH_TMXIPX425 TMXIPX425 1539 ++leep MACH_LEEP LEEP 1540 ++raad MACH_RAAD RAAD 1541 ++dns323 MACH_DNS323 DNS323 1542 ++ap1000 MACH_AP1000 AP1000 1543 ++a9sam6432 MACH_A9SAM6432 A9SAM6432 1544 ++shiny MACH_SHINY SHINY 1545 ++omap3_beagle MACH_OMAP3_BEAGLE OMAP3_BEAGLE 1546 ++csr_bdb2 MACH_CSR_BDB2 CSR_BDB2 1547 ++at91cap9adk MACH_AT91CAP9ADK AT91CAP9ADK 1566 +diff -urN -x CVS linux-2.6.24/drivers/char/Kconfig linux-2.6/drivers/char/Kconfig +--- linux-2.6.24/drivers/char/Kconfig 2008-03-01 22:02:10.000000000 +0200 ++++ linux-2.6/drivers/char/Kconfig 2008-02-18 22:56:04.000000000 +0200 +@@ -1040,5 +1040,21 @@ + + source "drivers/s390/char/Kconfig" + ++config AT91_SPI ++ bool "SPI driver (legacy) for AT91RM9200 processors" ++ depends on ARCH_AT91RM9200 ++ default y ++ help ++ The SPI driver gives access to this serial bus on the AT91RM9200 ++ processor. ++ ++config AT91_SPIDEV ++ bool "SPI device interface (legacy) for AT91RM9200 processors" ++ depends on ARCH_AT91RM9200 && AT91_SPI ++ default n ++ help ++ The SPI driver gives user mode access to this serial ++ bus on the AT91RM9200 processor. ++ + endmenu + +diff -urN -x CVS linux-2.6.24/drivers/char/Makefile linux-2.6/drivers/char/Makefile +--- linux-2.6.24/drivers/char/Makefile 2008-03-01 22:02:10.000000000 +0200 ++++ linux-2.6/drivers/char/Makefile 2007-12-31 10:43:55.000000000 +0200 +@@ -96,6 +96,8 @@ + obj-$(CONFIG_GPIO_VR41XX) += vr41xx_giu.o + obj-$(CONFIG_GPIO_TB0219) += tb0219.o + obj-$(CONFIG_TELCLOCK) += tlclk.o ++obj-$(CONFIG_AT91_SPI) += at91_spi.o ++obj-$(CONFIG_AT91_SPIDEV) += at91_spidev.o + + obj-$(CONFIG_MWAVE) += mwave/ + obj-$(CONFIG_AGP) += agp/ +diff -urN -x CVS linux-2.6.24/drivers/char/at91_spi.c linux-2.6/drivers/char/at91_spi.c +--- linux-2.6.24/drivers/char/at91_spi.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-2.6/drivers/char/at91_spi.c 2007-12-31 15:18:43.000000000 +0200 +@@ -0,0 +1,336 @@ ++/* ++ * Serial Peripheral Interface (SPI) driver for the Atmel AT91RM9200 (Thunder) ++ * ++ * Copyright (C) SAN People (Pty) Ltd ++ * ++ * This program is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU General Public License ++ * as published by the Free Software Foundation; either version ++ * 2 of the License, or (at your option) any later version. ++ */ ++ ++#include <linux/init.h> ++#include <linux/dma-mapping.h> ++#include <linux/module.h> ++#include <linux/sched.h> ++#include <linux/completion.h> ++#include <linux/interrupt.h> ++#include <linux/clk.h> ++#include <linux/platform_device.h> ++#include <linux/atmel_pdc.h> ++#include <asm/io.h> ++#include <asm/semaphore.h> ++ ++#include <asm/arch/at91_spi.h> ++#include <asm/arch/board.h> ++#include <asm/arch/spi.h> ++ ++#undef DEBUG_SPI ++ ++static struct spi_local spi_dev[NR_SPI_DEVICES]; /* state of the SPI devices */ ++static int spi_enabled = 0; ++static struct semaphore spi_lock; /* protect access to SPI bus */ ++static int current_device = -1; /* currently selected SPI device */ ++static struct clk *spi_clk; /* SPI clock */ ++static void __iomem *spi_base; /* SPI peripheral base-address */ ++ ++DECLARE_COMPLETION(transfer_complete); ++ ++ ++#define at91_spi_read(reg) __raw_readl(spi_base + (reg)) ++#define at91_spi_write(reg, val) __raw_writel((val), spi_base + (reg)) ++ ++ ++/* ......................................................................... */ ++ ++/* ++ * Access and enable the SPI bus. ++ * This MUST be called before any transfers are performed. ++ */ ++void spi_access_bus(short device) ++{ ++ /* Ensure that requested device is valid */ ++ if ((device < 0) || (device >= NR_SPI_DEVICES)) ++ panic("at91_spi: spi_access_bus called with invalid device"); ++ ++ if (spi_enabled == 0) { ++ clk_enable(spi_clk); /* Enable Peripheral clock */ ++ at91_spi_write(AT91_SPI_CR, AT91_SPI_SPIEN); /* Enable SPI */ ++#ifdef DEBUG_SPI ++ printk("SPI on\n"); ++#endif ++ } ++ spi_enabled++; ++ ++ /* Lock the SPI bus */ ++ down(&spi_lock); ++ current_device = device; ++ ++ /* Configure SPI bus for device */ ++ at91_spi_write(AT91_SPI_MR, AT91_SPI_MSTR | AT91_SPI_MODFDIS | (spi_dev[device].pcs << 16)); ++} ++ ++/* ++ * Relinquish control of the SPI bus. ++ */ ++void spi_release_bus(short device) ++{ ++ if (device != current_device) ++ panic("at91_spi: spi_release called with invalid device"); ++ ++ /* Release the SPI bus */ ++ current_device = -1; ++ up(&spi_lock); ++ ++ spi_enabled--; ++ if (spi_enabled == 0) { ++ at91_spi_write(AT91_SPI_CR, AT91_SPI_SPIDIS); /* Disable SPI */ ++ clk_disable(spi_clk); /* Disable Peripheral clock */ ++#ifdef DEBUG_SPI ++ printk("SPI off\n"); ++#endif ++ } ++} ++ ++/* ++ * Perform a data transfer over the SPI bus ++ */ ++int spi_transfer(struct spi_transfer_list* list) ++{ ++ struct spi_local *device = (struct spi_local *) &spi_dev[current_device]; ++ int tx_size; ++ ++ if (!list) ++ panic("at91_spi: spi_transfer called with NULL transfer list"); ++ if (current_device == -1) ++ panic("at91_spi: spi_transfer called without acquiring bus"); ++ ++#ifdef DEBUG_SPI ++ printk("SPI transfer start [%i]\n", list->nr_transfers); ++#endif ++ ++ /* If we are in 16-bit mode, we need to modify what we pass to the PDC */ ++ tx_size = (at91_spi_read(AT91_SPI_CSR(current_device)) & AT91_SPI_BITS_16) ? 2 : 1; ++ ++ /* Store transfer list */ ++ device->xfers = list; ++ list->curr = 0; ++ ++ /* Assume there must be at least one transfer */ ++ device->tx = dma_map_single(NULL, list->tx[0], list->txlen[0], DMA_TO_DEVICE); ++ device->rx = dma_map_single(NULL, list->rx[0], list->rxlen[0], DMA_FROM_DEVICE); ++ ++ /* Program PDC registers */ ++ at91_spi_write(ATMEL_PDC_TPR, device->tx); ++ at91_spi_write(ATMEL_PDC_RPR, device->rx); ++ at91_spi_write(ATMEL_PDC_TCR, list->txlen[0] / tx_size); ++ at91_spi_write(ATMEL_PDC_RCR, list->rxlen[0] / tx_size); ++ ++ /* Is there a second transfer? */ ++ if (list->nr_transfers > 1) { ++ device->txnext = dma_map_single(NULL, list->tx[1], list->txlen[1], DMA_TO_DEVICE); ++ device->rxnext = dma_map_single(NULL, list->rx[1], list->rxlen[1], DMA_FROM_DEVICE); ++ ++ /* Program Next PDC registers */ ++ at91_spi_write(ATMEL_PDC_TNPR, device->txnext); ++ at91_spi_write(ATMEL_PDC_RNPR, device->rxnext); ++ at91_spi_write(ATMEL_PDC_TNCR, list->txlen[1] / tx_size); ++ at91_spi_write(ATMEL_PDC_RNCR, list->rxlen[1] / tx_size); ++ } ++ else { ++ device->txnext = 0; ++ device->rxnext = 0; ++ at91_spi_write(ATMEL_PDC_TNCR, 0); ++ at91_spi_write(ATMEL_PDC_RNCR, 0); ++ } ++ ++ // TODO: If we are doing consecutive transfers (at high speed, or ++ // small buffers), then it might be worth modifying the 'Delay between ++ // Consecutive Transfers' in the CSR registers. ++ // This is an issue if we cannot chain the next buffer fast enough ++ // in the interrupt handler. ++ ++ /* Enable transmitter and receiver */ ++ at91_spi_write(ATMEL_PDC_PTCR, ATMEL_PDC_RXTEN | ATMEL_PDC_TXTEN); ++ ++ at91_spi_write(AT91_SPI_IER, AT91_SPI_ENDRX); /* enable buffer complete interrupt */ ++ wait_for_completion(&transfer_complete); ++ ++#ifdef DEBUG_SPI ++ printk("SPI transfer end\n"); ++#endif ++ ++ return 0; ++} ++ ++/* ......................................................................... */ ++ ++/* ++ * Handle interrupts from the SPI controller. ++ */ ++static irqreturn_t at91spi_interrupt(int irq, void *dev_id) ++{ ++ unsigned int status; ++ struct spi_local *device = (struct spi_local *) &spi_dev[current_device]; ++ struct spi_transfer_list *list = device->xfers; ++ ++#ifdef DEBUG_SPI ++ printk("SPI interrupt %i\n", current_device); ++#endif ++ ++ if (!list) ++ panic("at91_spi: spi_interrupt with a NULL transfer list"); ++ ++ status = at91_spi_read(AT91_SPI_SR) & at91_spi_read(AT91_SPI_IMR); /* read status */ ++ ++ dma_unmap_single(NULL, device->tx, list->txlen[list->curr], DMA_TO_DEVICE); ++ dma_unmap_single(NULL, device->rx, list->rxlen[list->curr], DMA_FROM_DEVICE); ++ ++ device->tx = device->txnext; /* move next transfer to current transfer */ ++ device->rx = device->rxnext; ++ ++ list->curr = list->curr + 1; ++ if (list->curr == list->nr_transfers) { /* all transfers complete */ ++ at91_spi_write(AT91_SPI_IDR, AT91_SPI_ENDRX); /* disable interrupt */ ++ ++ /* Disable transmitter and receiver */ ++ at91_spi_write(ATMEL_PDC_PTCR, ATMEL_PDC_RXTDIS | ATMEL_PDC_TXTDIS); ++ ++ device->xfers = NULL; ++ complete(&transfer_complete); ++ } ++ else if (list->curr+1 == list->nr_transfers) { /* no more next transfers */ ++ device->txnext = 0; ++ device->rxnext = 0; ++ at91_spi_write(ATMEL_PDC_TNCR, 0); ++ at91_spi_write(ATMEL_PDC_RNCR, 0); ++ } ++ else { ++ int i = (list->curr)+1; ++ ++ /* If we are in 16-bit mode, we need to modify what we pass to the PDC */ ++ int tx_size = (at91_spi_read(AT91_SPI_CSR(current_device)) & AT91_SPI_BITS_16) ? 2 : 1; ++ ++ device->txnext = dma_map_single(NULL, list->tx[i], list->txlen[i], DMA_TO_DEVICE); ++ device->rxnext = dma_map_single(NULL, list->rx[i], list->rxlen[i], DMA_FROM_DEVICE); ++ at91_spi_write(ATMEL_PDC_TNPR, device->txnext); ++ at91_spi_write(ATMEL_PDC_RNPR, device->rxnext); ++ at91_spi_write(ATMEL_PDC_TNCR, list->txlen[i] / tx_size); ++ at91_spi_write(ATMEL_PDC_RNCR, list->rxlen[i] / tx_size); ++ } ++ return IRQ_HANDLED; ++} ++ ++/* ......................................................................... */ ++ ++/* ++ * Initialize the SPI controller ++ */ ++static int __init at91spi_probe(struct platform_device *pdev) ++{ ++ int i; ++ unsigned long scbr; ++ struct resource *res; ++ ++ init_MUTEX(&spi_lock); ++ ++ res = platform_get_resource(pdev, IORESOURCE_MEM, 0); ++ if (!res) ++ return -ENXIO; ++ ++ if (!request_mem_region(res->start, res->end - res->start + 1, "at91_spi")) ++ return -EBUSY; ++ ++ spi_base = ioremap(res->start, res->end - res->start + 1); ++ if (!spi_base) { ++ release_mem_region(res->start, res->end - res->start + 1); ++ return -ENOMEM; ++ } ++ ++ spi_clk = clk_get(NULL, "spi_clk"); ++ if (IS_ERR(spi_clk)) { ++ printk(KERN_ERR "at91_spi: no clock defined\n"); ++ iounmap(spi_base); ++ release_mem_region(res->start, res->end - res->start + 1); ++ return -ENODEV; ++ } ++ ++ at91_spi_write(AT91_SPI_CR, AT91_SPI_SWRST); /* software reset of SPI controller */ ++ ++ /* ++ * Calculate the correct SPI baud-rate divisor. ++ */ ++ scbr = clk_get_rate(spi_clk) / (2 * DEFAULT_SPI_CLK); ++ scbr = scbr + 1; /* round up */ ++ ++ printk(KERN_INFO "at91_spi: Baud rate set to %ld\n", clk_get_rate(spi_clk) / (2 * scbr)); ++ ++ /* Set Chip Select registers to good defaults */ ++ for (i = 0; i < 4; i++) { ++ at91_spi_write(AT91_SPI_CSR(i), AT91_SPI_CPOL | AT91_SPI_BITS_8 | (16 << 16) | (scbr << 8)); ++ } ++ ++ at91_spi_write(ATMEL_PDC_PTCR, ATMEL_PDC_RXTDIS | ATMEL_PDC_TXTDIS); ++ ++ memset(&spi_dev, 0, sizeof(spi_dev)); ++ spi_dev[0].pcs = 0xE; ++ spi_dev[1].pcs = 0xD; ++ spi_dev[2].pcs = 0xB; ++ spi_dev[3].pcs = 0x7; ++ ++ if (request_irq(AT91RM9200_ID_SPI, at91spi_interrupt, 0, "spi", NULL)) { ++ clk_put(spi_clk); ++ iounmap(spi_base); ++ release_mem_region(res->start, res->end - res->start + 1); ++ return -EBUSY; ++ } ++ ++ at91_spi_write(AT91_SPI_CR, AT91_SPI_SPIEN); /* Enable SPI */ ++ ++ return 0; ++} ++ ++static int __devexit at91spi_remove(struct platform_device *pdev) ++{ ++ struct resource *res; ++ ++ at91_spi_write(AT91_SPI_CR, AT91_SPI_SPIDIS); /* Disable SPI */ ++ clk_put(spi_clk); ++ ++ res = platform_get_resource(pdev, IORESOURCE_MEM, 0); ++ iounmap(spi_base); ++ release_mem_region(res->start, res->end - res->start + 1); ++ ++ free_irq(AT91RM9200_ID_SPI, 0); ++ return 0; ++} ++ ++static struct platform_driver at91spi_driver = { ++ .probe = at91spi_probe, ++ .remove = __devexit_p(at91spi_remove), ++ .driver = { ++ .name = "at91_spi", ++ .owner = THIS_MODULE, ++ }, ++}; ++ ++static int __init at91spi_init(void) ++{ ++ return platform_driver_register(&at91spi_driver); ++} ++ ++static void __exit at91spi_exit(void) ++{ ++ platform_driver_unregister(&at91spi_driver); ++} ++ ++EXPORT_SYMBOL(spi_access_bus); ++EXPORT_SYMBOL(spi_release_bus); ++EXPORT_SYMBOL(spi_transfer); ++ ++module_init(at91spi_init); ++module_exit(at91spi_exit); ++ ++MODULE_LICENSE("GPL") ++MODULE_AUTHOR("Andrew Victor") ++MODULE_DESCRIPTION("SPI driver for Atmel AT91RM9200") +diff -urN -x CVS linux-2.6.24/drivers/char/at91_spidev.c linux-2.6/drivers/char/at91_spidev.c +--- linux-2.6.24/drivers/char/at91_spidev.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-2.6/drivers/char/at91_spidev.c 2007-12-31 15:18:43.000000000 +0200 +@@ -0,0 +1,233 @@ ++/* ++ * User-space interface to the SPI bus on Atmel AT91RM9200 ++ * ++ * Copyright (C) 2003 SAN People (Pty) Ltd ++ * ++ * Based on SPI driver by Rick Bronson ++ * ++ * This program is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU General Public License ++ * as published by the Free Software Foundation; either version ++ * 2 of the License, or (at your option) any later version. ++ */ ++ ++#include <linux/module.h> ++#include <linux/init.h> ++#include <linux/slab.h> ++#include <linux/highmem.h> ++#include <linux/pagemap.h> ++#include <asm/arch/spi.h> ++ ++#ifdef CONFIG_DEVFS_FS ++#include <linux/devfs_fs_kernel.h> ++#endif ++ ++ ++#undef DEBUG_SPIDEV ++ ++/* ......................................................................... */ ++ ++/* ++ * Read or Write to SPI bus. ++ */ ++static ssize_t spidev_rd_wr(struct file *file, char *buf, size_t count, loff_t *offset) ++{ ++ unsigned int spi_device = (unsigned int) file->private_data; ++ ++ struct mm_struct * mm; ++ struct page ** maplist; ++ struct spi_transfer_list* list; ++ int pgcount; ++ ++ unsigned int ofs, pagelen; ++ int res, i, err; ++ ++ if (!count) { ++ return 0; ++ } ++ ++ list = kmalloc(sizeof(struct spi_transfer_list), GFP_KERNEL); ++ if (!list) { ++ return -ENOMEM; ++ } ++ ++ mm = current->mm; ++ ++ pgcount = ((unsigned long)buf+count+PAGE_SIZE-1)/PAGE_SIZE - (unsigned long)buf/PAGE_SIZE; ++ ++ if (pgcount >= MAX_SPI_TRANSFERS) { ++ kfree(list); ++ return -EFBIG; ++ } ++ ++ maplist = kmalloc (pgcount * sizeof (struct page *), GFP_KERNEL); ++ ++ if (!maplist) { ++ kfree(list); ++ return -ENOMEM; ++ } ++ flush_cache_all(); ++ down_read(&mm->mmap_sem); ++ err= get_user_pages(current, mm, (unsigned long)buf, pgcount, 1, 0, maplist, NULL); ++ up_read(&mm->mmap_sem); ++ ++ if (err < 0) { ++ kfree(list); ++ kfree(maplist); ++ return err; ++ } ++ pgcount = err; ++ ++#ifdef DEBUG_SPIDEV ++ printk("spidev_rd_rw: %i %i\n", count, pgcount); ++#endif ++ ++ /* Set default return value = transfer length */ ++ res = count; ++ ++ /* ++ * At this point, the virtual area buf[0] .. buf[count-1] will have ++ * corresponding pages mapped in the physical memory and locked until ++ * we unmap the kiobuf. The pages cannot be swapped out or moved ++ * around. ++ */ ++ ofs = (unsigned long) buf & (PAGE_SIZE -1); ++ pagelen = PAGE_SIZE - ofs; ++ if (count < pagelen) ++ pagelen = count; ++ ++ for (i = 0; i < pgcount; i++) { ++ flush_dcache_page(maplist[i]); ++ ++ list->tx[i] = list->rx[i] = page_address(maplist[i]) + ofs; ++ list->txlen[i] = list->rxlen[i] = pagelen; ++ ++#ifdef DEBUG_SPIDEV ++ printk(" %i: %x (%i)\n", i, list->tx[i], list->txlen[i]); ++#endif ++ ++ ofs = 0; /* all subsequent transfers start at beginning of a page */ ++ count = count - pagelen; ++ pagelen = (count < PAGE_SIZE) ? count : PAGE_SIZE; ++ } ++ list->nr_transfers = pgcount; ++ ++ /* Perform transfer on SPI bus */ ++ spi_access_bus(spi_device); ++ spi_transfer(list); ++ spi_release_bus(spi_device); ++ ++ while (pgcount--) { ++ page_cache_release (maplist[pgcount]); ++ } ++ flush_cache_all(); ++ ++ kfree(maplist); ++ kfree(list); ++ ++ return res; ++} ++ ++static int spidev_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) ++{ ++ int spi_device = MINOR(inode->i_rdev); ++ ++ if (spi_device >= NR_SPI_DEVICES) ++ return -ENODEV; ++ ++ // TODO: This interface can be used to configure the SPI bus. ++ // Configurable options could include: Speed, Clock Polarity, Clock Phase ++ ++ switch(cmd) { ++ default: ++ return -ENOIOCTLCMD; ++ } ++} ++ ++/* ++ * Open the SPI device ++ */ ++static int spidev_open(struct inode *inode, struct file *file) ++{ ++ unsigned int spi_device = MINOR(inode->i_rdev); ++ ++ if (spi_device >= NR_SPI_DEVICES) ++ return -ENODEV; ++ ++ /* ++ * 'private_data' is actually a pointer, but we overload it with the ++ * value we want to store. ++ */ ++ file->private_data = (void *)spi_device; ++ ++ return 0; ++} ++ ++/* ++ * Close the SPI device ++ */ ++static int spidev_close(struct inode *inode, struct file *file) ++{ ++ return 0; ++} ++ ++/* ......................................................................... */ ++ ++static struct file_operations spidev_fops = { ++ .owner = THIS_MODULE, ++ .llseek = no_llseek, ++ .read = spidev_rd_wr, ++ .write = (int (*) (struct file *file, const char *buf, size_t count, loff_t *offset))spidev_rd_wr, ++ .ioctl = spidev_ioctl, ++ .open = spidev_open, ++ .release = spidev_close, ++}; ++ ++/* ++ * Install the SPI /dev interface driver ++ */ ++static int __init at91_spidev_init(void) ++{ ++#ifdef CONFIG_DEVFS_FS ++ int i; ++#endif ++ ++ if (register_chrdev(SPI_MAJOR, "spi", &spidev_fops)) { ++ printk(KERN_ERR "at91_spidev: Unable to get major %d for SPI bus\n", SPI_MAJOR); ++ return -EIO; ++ } ++ ++#ifdef CONFIG_DEVFS_FS ++ devfs_mk_dir("spi"); ++ for (i = 0; i < NR_SPI_DEVICES; i++) { ++ devfs_mk_cdev(MKDEV(SPI_MAJOR, i), S_IFCHR | S_IRUSR | S_IWUSR, "spi/%d",i); ++ } ++#endif ++ printk(KERN_INFO "AT91 SPI driver loaded\n"); ++ ++ return 0; ++} ++ ++/* ++ * Remove the SPI /dev interface driver ++ */ ++static void __exit at91_spidev_exit(void) ++{ ++#ifdef CONFIG_DEVFS_FS ++ int i; ++ for (i = 0; i < NR_SPI_DEVICES; i++) { ++ devfs_remove("spi/%d", i); ++ } ++ ++ devfs_remove("spi"); ++#endif ++ ++ unregister_chrdev(SPI_MAJOR, "spi"); ++} ++ ++module_init(at91_spidev_init); ++module_exit(at91_spidev_exit); ++ ++MODULE_LICENSE("GPL") ++MODULE_AUTHOR("Andrew Victor") ++MODULE_DESCRIPTION("SPI /dev interface for Atmel AT91RM9200") +diff -urN -x CVS linux-2.6.24/drivers/i2c/busses/Kconfig linux-2.6/drivers/i2c/busses/Kconfig +--- linux-2.6.24/drivers/i2c/busses/Kconfig 2008-03-01 22:02:10.000000000 +0200 ++++ linux-2.6/drivers/i2c/busses/Kconfig 2007-12-31 10:44:20.000000000 +0200 +@@ -88,6 +88,14 @@ + to support combined I2C messages. Use the i2c-gpio driver + unless your system can cope with those limitations. + ++config I2C_AT91_CLOCKRATE ++ prompt "Atmel AT91 I2C/TWI clock-rate" ++ depends on I2C_AT91 ++ int ++ default 100000 ++ help ++ Set the AT91 I2C/TWI clock-rate. ++ + config I2C_AU1550 + tristate "Au1550/Au1200 SMBus interface" + depends on SOC_AU1550 || SOC_AU1200 +@@ -629,6 +637,14 @@ + This driver can also be built as a module. If so, the module + will be called i2c-voodoo3. + ++config I2C_PCA ++ tristate "PCA9564" ++ depends on I2C ++ select I2C_ALGOPCA ++ help ++ This driver support the Philips PCA 9564 Parallel bus to I2C ++ bus controller. ++ + config I2C_PCA_ISA + tristate "PCA9564 on an ISA bus" + depends on ISA +diff -urN -x CVS linux-2.6.24/drivers/i2c/busses/Makefile linux-2.6/drivers/i2c/busses/Makefile +--- linux-2.6.24/drivers/i2c/busses/Makefile 2008-03-01 22:02:10.000000000 +0200 ++++ linux-2.6/drivers/i2c/busses/Makefile 2007-12-31 10:44:20.000000000 +0200 +@@ -30,6 +30,7 @@ + obj-$(CONFIG_I2C_PARPORT) += i2c-parport.o + obj-$(CONFIG_I2C_PARPORT_LIGHT) += i2c-parport-light.o + obj-$(CONFIG_I2C_PASEMI) += i2c-pasemi.o ++obj-$(CONFIG_I2C_PCA) += i2c-pca.o + obj-$(CONFIG_I2C_PCA_ISA) += i2c-pca-isa.o + obj-$(CONFIG_I2C_PIIX4) += i2c-piix4.o + obj-$(CONFIG_I2C_PMCMSP) += i2c-pmcmsp.o +diff -urN -x CVS linux-2.6.24/drivers/i2c/busses/i2c-at91.c linux-2.6/drivers/i2c/busses/i2c-at91.c +--- linux-2.6.24/drivers/i2c/busses/i2c-at91.c 2008-03-01 22:02:10.000000000 +0200 ++++ linux-2.6/drivers/i2c/busses/i2c-at91.c 2008-01-16 13:15:34.000000000 +0200 +@@ -31,8 +31,11 @@ + #include <asm/arch/board.h> + #include <asm/arch/cpu.h> + +-#define TWI_CLOCK 100000 /* Hz. max 400 Kbits/sec */ + ++/* Clockrate is configurable - max 400 Kbits/sec */ ++static unsigned int clockrate = CONFIG_I2C_AT91_CLOCKRATE; ++module_param(clockrate, uint, 0); ++MODULE_PARM_DESC(clockrate, "The TWI clockrate"); + + static struct clk *twi_clk; + static void __iomem *twi_base; +@@ -53,7 +56,7 @@ + at91_twi_write(AT91_TWI_CR, AT91_TWI_MSEN); /* Set Master mode */ + + /* Calcuate clock dividers */ +- cdiv = (clk_get_rate(twi_clk) / (2 * TWI_CLOCK)) - 3; ++ cdiv = (clk_get_rate(twi_clk) / (2 * clockrate)) - 3; + cdiv = cdiv + 1; /* round up */ + ckdiv = 0; + while (cdiv > 255) { +@@ -61,11 +64,12 @@ + cdiv = cdiv >> 1; + } + +- if (cpu_is_at91rm9200()) { /* AT91RM9200 Errata #22 */ +- if (ckdiv > 5) { +- printk(KERN_ERR "AT91 I2C: Invalid TWI_CLOCK value!\n"); +- ckdiv = 5; +- } ++ if (cpu_is_at91rm9200() && (ckdiv > 5)) { /* AT91RM9200 Errata #22 */ ++ printk(KERN_ERR "AT91 I2C: Invalid TWI clockrate!\n"); ++ ckdiv = 5; ++ } else if (ckdiv > 7) { ++ printk(KERN_ERR "AT91 I2C: Invalid TWI clockrate!\n"); ++ ckdiv = 7; + } + + at91_twi_write(AT91_TWI_CWGR, (ckdiv << 16) | (cdiv << 8) | cdiv); +diff -urN -x CVS linux-2.6.24/drivers/i2c/busses/i2c-pca.c linux-2.6/drivers/i2c/busses/i2c-pca.c +--- linux-2.6.24/drivers/i2c/busses/i2c-pca.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-2.6/drivers/i2c/busses/i2c-pca.c 2007-12-31 15:18:43.000000000 +0200 +@@ -0,0 +1,213 @@ ++/* ++ * Platform driver for PCA9564 I2C bus controller. ++ * ++ * (C) 2006 Andrew Victor ++ * ++ * Based on i2c-pca-isa.c driver for PCA9564 on ISA boards ++ * Copyright (C) 2004 Arcom Control Systems ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ++ */ ++ ++#include <linux/kernel.h> ++#include <linux/module.h> ++#include <linux/moduleparam.h> ++#include <linux/delay.h> ++#include <linux/init.h> ++#include <linux/interrupt.h> ++#include <linux/wait.h> ++#include <linux/platform_device.h> ++ ++#include <linux/i2c.h> ++#include <linux/i2c-algo-pca.h> ++ ++#include <asm/io.h> ++ ++#include "../algos/i2c-algo-pca.h" ++ ++#define PCA_OWN_ADDRESS 0x55 /* our address for slave mode */ ++#define PCA_CLOCK I2C_PCA_CON_59kHz ++ ++//#define REG_SHIFT 2 ++#define REG_SHIFT 0 ++ ++//#define DEBUG_IO ++ ++#define PCA_IO_SIZE 4 ++ ++static void __iomem *base_addr; ++static int irq; ++static wait_queue_head_t pca_wait; ++ ++static int pca_getown(struct i2c_algo_pca_data *adap) ++{ ++ return PCA_OWN_ADDRESS; ++} ++ ++static int pca_getclock(struct i2c_algo_pca_data *adap) ++{ ++ return PCA_CLOCK; ++} ++ ++static void pca_writebyte(struct i2c_algo_pca_data *adap, int reg, int val) ++{ ++#ifdef DEBUG_IO ++ static char *names[] = { "T/O", "DAT", "ADR", "CON" }; ++ printk("*** write %s at %#lx <= %#04x\n", names[reg], (unsigned long) base_addr+reg, val); ++#endif ++ udelay(1); ++ outb(val, base_addr + (reg << REG_SHIFT)); ++} ++ ++static int pca_readbyte(struct i2c_algo_pca_data *adap, int reg) ++{ ++ int res; ++ ++ udelay(1); ++ res = inb(base_addr + (reg << REG_SHIFT)); ++#ifdef DEBUG_IO ++ { ++ static char *names[] = { "STA", "DAT", "ADR", "CON" }; ++ printk("*** read %s => %#04x\n", names[reg], res); ++ } ++#endif ++ return res; ++} ++ ++static int pca_waitforinterrupt(struct i2c_algo_pca_data *adap) ++{ ++ int ret = 0; ++ ++ if (irq > -1) { ++ ret = wait_event_interruptible(pca_wait, ++ pca_readbyte(adap, I2C_PCA_CON) & I2C_PCA_CON_SI); ++ } else { ++ while ((pca_readbyte(adap, I2C_PCA_CON) & I2C_PCA_CON_SI) == 0) ++ udelay(100); ++ } ++ return ret; ++} ++ ++static irqreturn_t pca_handler(int this_irq, void *dev_id) ++{ ++ wake_up_interruptible(&pca_wait); ++ return IRQ_HANDLED; ++} ++ ++static struct i2c_algo_pca_data pca_i2c_data = { ++ .get_own = pca_getown, ++ .get_clock = pca_getclock, ++ .write_byte = pca_writebyte, ++ .read_byte = pca_readbyte, ++ .wait_for_interrupt = pca_waitforinterrupt, ++}; ++ ++static struct i2c_adapter pca_i2c_ops = { ++ .owner = THIS_MODULE, ++ .id = I2C_HW_A_PLAT, ++ .algo_data = &pca_i2c_data, ++ .name = "PCA9564", ++ .class = I2C_CLASS_HWMON, ++}; ++ ++static int __devinit pca_i2c_probe(struct platform_device *pdev) ++{ ++ struct resource *res; ++ ++ init_waitqueue_head(&pca_wait); ++ ++ res = platform_get_resource(pdev, IORESOURCE_MEM, 0); ++ if (!res) ++ return -ENODEV; ++ ++ if (!request_mem_region(res->start, PCA_IO_SIZE, "PCA9564")) ++ return -ENXIO; ++ ++ base_addr = ioremap(res->start, PCA_IO_SIZE); ++ if (base_addr == NULL) ++ goto out_region; ++ ++ irq = platform_get_irq(pdev, 0); ++ if (irq > -1) { ++ if (request_irq(irq, pca_handler, 0, "pca9564", NULL) < 0) { ++ printk(KERN_ERR "i2c-pca: Request irq%d failed\n", irq); ++ goto out_remap; ++ } ++ } ++ ++ /* set up the driverfs linkage to our parent device */ ++ pca_i2c_ops.dev.parent = &pdev->dev; ++ ++ if (i2c_pca_add_bus(&pca_i2c_ops) < 0) { ++ printk(KERN_ERR "i2c-pca: Failed to add i2c bus\n"); ++ goto out_irq; ++ } ++ ++ return 0; ++ ++ out_irq: ++ if (irq > -1) ++ free_irq(irq, &pca_i2c_ops); ++ ++ out_remap: ++ iounmap(base_addr); ++ ++ out_region: ++ release_mem_region(res->start, PCA_IO_SIZE); ++ return -ENODEV; ++} ++ ++static int __devexit pca_i2c_remove(struct platform_device *pdev) ++{ ++ struct resource *res; ++ ++ i2c_del_adapter(&pca_i2c_ops); ++ ++ if (irq > 0) ++ free_irq(irq, NULL); ++ ++ iounmap(base_addr); ++ ++ res = platform_get_resource(pdev, IORESOURCE_MEM, 0); ++ release_mem_region(res->start, PCA_IO_SIZE); ++ ++ return 0; ++} ++ ++static struct platform_driver pca_i2c_driver = { ++ .probe = pca_i2c_probe, ++ .remove = __devexit_p(pca_i2c_remove), ++ .driver = { ++ .name = "pca9564", ++ .owner = THIS_MODULE, ++ }, ++}; ++ ++static int __init pca_i2c_init(void) ++{ ++ return platform_driver_register(&pca_i2c_driver); ++} ++ ++static void __exit pca_i2c_exit(void) ++{ ++ platform_driver_unregister(&pca_i2c_driver); ++} ++ ++module_init(pca_i2c_init); ++module_exit(pca_i2c_exit); ++ ++MODULE_AUTHOR("Andrew Victor"); ++MODULE_DESCRIPTION("PCA9564 platform driver"); ++MODULE_LICENSE("GPL"); +diff -urN -x CVS linux-2.6.24/drivers/mmc/host/at91_mci.c linux-2.6/drivers/mmc/host/at91_mci.c +--- linux-2.6.24/drivers/mmc/host/at91_mci.c 2008-03-01 22:02:12.000000000 +0200 ++++ linux-2.6/drivers/mmc/host/at91_mci.c 2008-02-25 22:21:36.000000000 +0200 +@@ -70,10 +70,11 @@ + + #include <asm/io.h> + #include <asm/irq.h> ++#include <asm/gpio.h> ++ + #include <asm/mach/mmc.h> + #include <asm/arch/board.h> + #include <asm/arch/cpu.h> +-#include <asm/arch/gpio.h> + #include <asm/arch/at91_mci.h> + + #define DRIVER_NAME "at91_mci" +@@ -658,13 +659,14 @@ + /* maybe switch power to the card */ + if (host->board->vcc_pin) { + switch (ios->power_mode) { +- case MMC_POWER_OFF: +- at91_set_gpio_value(host->board->vcc_pin, 0); +- break; +- case MMC_POWER_UP: +- case MMC_POWER_ON: +- at91_set_gpio_value(host->board->vcc_pin, 1); +- break; ++ case MMC_POWER_OFF: ++ gpio_set_value(host->board->vcc_pin, 0); ++ break; ++ case MMC_POWER_UP: ++ gpio_set_value(host->board->vcc_pin, 1); ++ break; ++ default: ++ break; + } + } + } +@@ -768,7 +770,7 @@ + static irqreturn_t at91_mmc_det_irq(int irq, void *_host) + { + struct at91mci_host *host = _host; +- int present = !at91_get_gpio_value(irq); ++ int present = !gpio_get_value(irq_to_gpio(irq)); + + /* + * we expect this irq on both insert and remove, +@@ -793,7 +795,7 @@ + struct at91mci_host *host = mmc_priv(mmc); + + if (host->board->wp_pin) { +- read_only = at91_get_gpio_value(host->board->wp_pin); ++ read_only = gpio_get_value(host->board->wp_pin); + printk(KERN_WARNING "%s: card is %s\n", mmc_hostname(mmc), + (read_only ? "read-only" : "read-write") ); + } +@@ -820,8 +822,6 @@ + struct resource *res; + int ret; + +- pr_debug("Probe MCI devices\n"); +- + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); + if (!res) + return -ENXIO; +@@ -831,9 +831,9 @@ + + mmc = mmc_alloc_host(sizeof(struct at91mci_host), &pdev->dev); + if (!mmc) { +- pr_debug("Failed to allocate mmc host\n"); +- release_mem_region(res->start, res->end - res->start + 1); +- return -ENOMEM; ++ ret = -ENOMEM; ++ dev_dbg(&pdev->dev, "couldn't allocate mmc host\n"); ++ goto fail6; + } + + mmc->ops = &at91_mci_ops; +@@ -853,19 +853,44 @@ + if (cpu_is_at91sam9260() || cpu_is_at91sam9263()) + mmc->caps |= MMC_CAP_4_BIT_DATA; + else +- printk("AT91 MMC: 4 wire bus mode not supported" ++ dev_warn(&pdev->dev, "4 wire bus mode not supported" + " - using 1 wire\n"); + } + + /* ++ * Reserve GPIOs ... board init code makes sure these pins are set ++ * up as GPIOs with the right direction (input, except for vcc) ++ */ ++ if (host->board->det_pin) { ++ ret = gpio_request(host->board->det_pin, "mmc_detect"); ++ if (ret < 0) { ++ dev_dbg(&pdev->dev, "couldn't claim card detect pin\n"); ++ goto fail5; ++ } ++ } ++ if (host->board->wp_pin) { ++ ret = gpio_request(host->board->wp_pin, "mmc_wp"); ++ if (ret < 0) { ++ dev_dbg(&pdev->dev, "couldn't claim wp sense pin\n"); ++ goto fail4; ++ } ++ } ++ if (host->board->vcc_pin) { ++ ret = gpio_request(host->board->vcc_pin, "mmc_vcc"); ++ if (ret < 0) { ++ dev_dbg(&pdev->dev, "couldn't claim vcc switch pin\n"); ++ goto fail3; ++ } ++ } ++ ++ /* + * Get Clock + */ + host->mci_clk = clk_get(&pdev->dev, "mci_clk"); + if (IS_ERR(host->mci_clk)) { +- printk(KERN_ERR "AT91 MMC: no clock defined.\n"); +- mmc_free_host(mmc); +- release_mem_region(res->start, res->end - res->start + 1); +- return -ENODEV; ++ ret = -ENODEV; ++ dev_dbg(&pdev->dev, "no mci_clk?\n"); ++ goto fail2; + } + + /* +@@ -873,10 +898,8 @@ + */ + host->baseaddr = ioremap(res->start, res->end - res->start + 1); + if (!host->baseaddr) { +- clk_put(host->mci_clk); +- mmc_free_host(mmc); +- release_mem_region(res->start, res->end - res->start + 1); +- return -ENOMEM; ++ ret = -ENOMEM; ++ goto fail1; + } + + /* +@@ -890,15 +913,11 @@ + * Allocate the MCI interrupt + */ + host->irq = platform_get_irq(pdev, 0); +- ret = request_irq(host->irq, at91_mci_irq, IRQF_SHARED, DRIVER_NAME, host); ++ ret = request_irq(host->irq, at91_mci_irq, IRQF_SHARED, ++ mmc_hostname(mmc), host); + if (ret) { +- printk(KERN_ERR "AT91 MMC: Failed to request MCI interrupt\n"); +- clk_disable(host->mci_clk); +- clk_put(host->mci_clk); +- mmc_free_host(mmc); +- iounmap(host->baseaddr); +- release_mem_region(res->start, res->end - res->start + 1); +- return ret; ++ dev_dbg(&pdev->dev, "request MCI interrupt failed\n"); ++ goto fail0; + } + + platform_set_drvdata(pdev, mmc); +@@ -907,8 +926,7 @@ + * Add host to MMC layer + */ + if (host->board->det_pin) { +- host->present = !at91_get_gpio_value(host->board->det_pin); +- device_init_wakeup(&pdev->dev, 1); ++ host->present = !gpio_get_value(host->board->det_pin); + } + else + host->present = -1; +@@ -919,15 +937,38 @@ + * monitor card insertion/removal if we can + */ + if (host->board->det_pin) { +- ret = request_irq(host->board->det_pin, at91_mmc_det_irq, +- 0, DRIVER_NAME, host); ++ ret = request_irq(gpio_to_irq(host->board->det_pin), ++ at91_mmc_det_irq, 0, mmc_hostname(mmc), host); + if (ret) +- printk(KERN_ERR "AT91 MMC: Couldn't allocate MMC detect irq\n"); ++ dev_warn(&pdev->dev, "request MMC detect irq failed\n"); ++ else ++ device_init_wakeup(&pdev->dev, 1); + } + + pr_debug("Added MCI driver\n"); + + return 0; ++ ++fail0: ++ clk_disable(host->mci_clk); ++ iounmap(host->baseaddr); ++fail1: ++ clk_put(host->mci_clk); ++fail2: ++ if (host->board->vcc_pin) ++ gpio_free(host->board->vcc_pin); ++fail3: ++ if (host->board->wp_pin) ++ gpio_free(host->board->wp_pin); ++fail4: ++ if (host->board->det_pin) ++ gpio_free(host->board->det_pin); ++fail5: ++ mmc_free_host(mmc); ++fail6: ++ release_mem_region(res->start, res->end - res->start + 1); ++ dev_err(&pdev->dev, "probe failed, err %d\n", ret); ++ return ret; + } + + /* +@@ -945,9 +986,10 @@ + host = mmc_priv(mmc); + + if (host->board->det_pin) { ++ if (device_can_wakeup(&pdev->dev)) ++ free_irq(gpio_to_irq(host->board->det_pin), host); + device_init_wakeup(&pdev->dev, 0); +- free_irq(host->board->det_pin, host); +- cancel_delayed_work(&host->mmc->detect); ++ gpio_free(host->board->det_pin); + } + + at91_mci_disable(host); +@@ -957,6 +999,11 @@ + clk_disable(host->mci_clk); /* Disable the peripheral clock */ + clk_put(host->mci_clk); + ++ if (host->board->vcc_pin) ++ gpio_free(host->board->vcc_pin); ++ if (host->board->wp_pin) ++ gpio_free(host->board->wp_pin); ++ + iounmap(host->baseaddr); + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); + release_mem_region(res->start, res->end - res->start + 1); +diff -urN -x CVS linux-2.6.24/drivers/mtd/devices/Kconfig linux-2.6/drivers/mtd/devices/Kconfig +--- linux-2.6.24/drivers/mtd/devices/Kconfig 2008-03-01 22:02:12.000000000 +0200 ++++ linux-2.6/drivers/mtd/devices/Kconfig 2007-12-31 10:44:25.000000000 +0200 +@@ -270,5 +270,17 @@ + LinuxBIOS or if you need to recover a DiskOnChip Millennium on which + you have managed to wipe the first block. + +-endmenu ++config MTD_AT91_DATAFLASH ++ tristate "AT91RM9200 DataFlash AT45DBxxx (legacy driver)" ++ depends on MTD && ARCH_AT91RM9200 && AT91_SPI ++ help ++ This enables access to the DataFlash (AT45DBxxx) on the AT91RM9200. ++ If you have such a board, say 'Y'. ++ ++config DATAFLASH_ALWAYS_ADD_DEVICE ++ bool "Register whole DataFlash device" ++ depends on MTD_AT91_DATAFLASH ++ help ++ Always add the whole DataFlash device when using MTD partitions. + ++endmenu +diff -urN -x CVS linux-2.6.24/drivers/mtd/devices/Makefile linux-2.6/drivers/mtd/devices/Makefile +--- linux-2.6.24/drivers/mtd/devices/Makefile 2008-03-01 22:02:12.000000000 +0200 ++++ linux-2.6/drivers/mtd/devices/Makefile 2007-12-31 10:48:27.000000000 +0200 +@@ -17,3 +17,4 @@ + obj-$(CONFIG_MTD_BLOCK2MTD) += block2mtd.o + obj-$(CONFIG_MTD_DATAFLASH) += mtd_dataflash.o + obj-$(CONFIG_MTD_M25P80) += m25p80.o ++obj-$(CONFIG_MTD_AT91_DATAFLASH)+= at91_dataflash.o +diff -urN -x CVS linux-2.6.24/drivers/mtd/devices/at91_dataflash.c linux-2.6/drivers/mtd/devices/at91_dataflash.c +--- linux-2.6.24/drivers/mtd/devices/at91_dataflash.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-2.6/drivers/mtd/devices/at91_dataflash.c 2007-12-31 15:18:43.000000000 +0200 +@@ -0,0 +1,673 @@ ++/* ++ * Atmel DataFlash driver for Atmel AT91RM9200 (Thunder) ++ * ++ * Copyright (C) SAN People (Pty) Ltd ++ * ++ * This program is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU General Public License ++ * as published by the Free Software Foundation; either version ++ * 2 of the License, or (at your option) any later version. ++*/ ++ ++#include <linux/module.h> ++#include <linux/init.h> ++#include <linux/slab.h> ++#include <linux/pci.h> ++#include <linux/mtd/mtd.h> ++#include <linux/mtd/partitions.h> ++ ++#include <asm/mach-types.h> ++ ++#include <asm/arch/spi.h> ++ ++ ++#undef DEBUG_DATAFLASH ++ ++#define DATAFLASH_MAX_DEVICES 4 /* max number of dataflash devices */ ++ ++#define OP_READ_CONTINUOUS 0xE8 ++#define OP_READ_PAGE 0xD2 ++#define OP_READ_BUFFER1 0xD4 ++#define OP_READ_BUFFER2 0xD6 ++#define OP_READ_STATUS 0xD7 ++ ++#define OP_ERASE_PAGE 0x81 ++#define OP_ERASE_BLOCK 0x50 ++ ++#define OP_TRANSFER_BUF1 0x53 ++#define OP_TRANSFER_BUF2 0x55 ++#define OP_COMPARE_BUF1 0x60 ++#define OP_COMPARE_BUF2 0x61 ++ ++#define OP_PROGRAM_VIA_BUF1 0x82 ++#define OP_PROGRAM_VIA_BUF2 0x85 ++ ++struct dataflash_local ++{ ++ int spi; /* SPI chip-select number */ ++ ++ unsigned int page_size; /* number of bytes per page */ ++ unsigned short page_offset; /* page offset in flash address */ ++}; ++ ++ ++/* Detected DataFlash devices */ ++static struct mtd_info* mtd_devices[DATAFLASH_MAX_DEVICES]; ++static int nr_devices = 0; ++ ++/* ......................................................................... */ ++ ++#ifdef CONFIG_MTD_PARTITIONS ++ ++static struct mtd_partition static_partitions_2M[] = ++{ ++ { ++ .name = "bootloader", ++ .offset = 0, ++ .size = 1 * 32 * 8 * 528, /* 1st sector = 32 blocks * 8 pages * 528 bytes */ ++ .mask_flags = MTD_WRITEABLE, /* read-only */ ++ }, ++ { ++ .name = "kernel", ++ .offset = MTDPART_OFS_NXTBLK, ++ .size = 6 * 32 * 8 * 528, /* 6 sectors */ ++ }, ++ { ++ .name = "filesystem", ++ .offset = MTDPART_OFS_NXTBLK, ++ .size = MTDPART_SIZ_FULL, /* rest = 9 sectors */ ++ } ++}; ++ ++static struct mtd_partition static_partitions_4M[] = ++{ ++ { ++ .name = "bootloader", ++ .offset = 0, ++ .size = 1 * 64 * 8 * 528, /* 1st sector = 64 blocks * 8 pages * 528 bytes */ ++ .mask_flags = MTD_WRITEABLE, /* read-only */ ++ }, ++ { ++ .name = "kernel", ++ .offset = MTDPART_OFS_NXTBLK, ++ .size = 4 * 64 * 8 * 528, /* 4 sectors */ ++ }, ++ { ++ .name = "filesystem", ++ .offset = MTDPART_OFS_NXTBLK, ++ .size = MTDPART_SIZ_FULL, /* rest = 11 sectors */ ++ } ++}; ++ ++#if defined(CONFIG_MACH_KAFA) ++static struct mtd_partition static_partitions_8M[] = ++{ ++ { ++ name: "romboot", ++ offset: 0, ++ size: 16 * 1056, /* 160 Kb */ ++ mask_flags: MTD_WRITEABLE, /* read-only */ ++ }, ++ { ++ name: "uboot", ++ offset: MTDPART_OFS_APPEND, /* Sperry, NXTBLK is broken */ ++ size: 128 * 1056, /* 1 MB */ ++ }, ++ { ++ name: "kernel", ++ offset: MTDPART_OFS_APPEND, /* Sperry, NXTBLK is broken */ ++ size: 1024 * 1056, /* 1 MB */ ++ }, ++ { ++ name: "filesystem", ++ offset: MTDPART_OFS_APPEND, /* Sperry, NXTBLK is broken */ ++ size: MTDPART_SIZ_FULL, ++ } ++}; ++ ++#elif defined(CONFIG_MACH_MULTMDP) ++ ++static struct mtd_partition static_partitions_8M[] = ++{ ++ { ++ .name = "bootloader", ++ .offset = 0, ++ .size = 12 * 1056, /* 1st sector = 32 blocks * 8 pages * 1056 bytes */ ++ .mask_flags = MTD_WRITEABLE, /* read-only */ ++ }, ++ { ++ .name = "configuration", ++ .offset = MTDPART_OFS_NXTBLK, ++ .size = 20 * 1056, ++ }, ++ { ++ .name = "kernel", ++ .offset = MTDPART_OFS_NXTBLK, ++ .size = 1520 * 1056, ++ }, ++ { ++ .name = "filesystem", ++ .offset = MTDPART_OFS_NXTBLK, ++ .size = MTDPART_SIZ_FULL, ++ } ++}; ++ ++#else ++ ++static struct mtd_partition static_partitions_8M[] = ++{ ++ { ++ .name = "bootloader", ++ .offset = 0, ++ .size = 1 * 32 * 8 * 1056, /* 1st sector = 32 blocks * 8 pages * 1056 bytes */ ++ .mask_flags = MTD_WRITEABLE, /* read-only */ ++ }, ++ { ++ .name = "kernel", ++ .offset = MTDPART_OFS_NXTBLK, ++ .size = 5 * 32 * 8 * 1056, /* 5 sectors */ ++ }, ++ { ++ .name = "filesystem", ++ .offset = MTDPART_OFS_NXTBLK, ++ .size = MTDPART_SIZ_FULL, /* rest = 26 sectors */ ++ } ++}; ++#endif ++ ++static const char *part_probes[] = { "cmdlinepart", NULL, }; ++ ++#endif ++ ++/* ......................................................................... */ ++ ++/* Allocate a single SPI transfer descriptor. We're assuming that if multiple ++ SPI transfers occur at the same time, spi_access_bus() will serialize them. ++ If this is not valid, then either (i) each dataflash 'priv' structure ++ needs it's own transfer descriptor, (ii) we lock this one, or (iii) use ++ another mechanism. */ ++static struct spi_transfer_list* spi_transfer_desc; ++ ++/* ++ * Perform a SPI transfer to access the DataFlash device. ++ */ ++static int do_spi_transfer(int nr, char* tx, int tx_len, char* rx, int rx_len, ++ char* txnext, int txnext_len, char* rxnext, int rxnext_len) ++{ ++ struct spi_transfer_list* list = spi_transfer_desc; ++ ++ list->tx[0] = tx; list->txlen[0] = tx_len; ++ list->rx[0] = rx; list->rxlen[0] = rx_len; ++ ++ list->tx[1] = txnext; list->txlen[1] = txnext_len; ++ list->rx[1] = rxnext; list->rxlen[1] = rxnext_len; ++ ++ list->nr_transfers = nr; ++ ++ return spi_transfer(list); ++} ++ ++/* ......................................................................... */ ++ ++/* ++ * Poll the DataFlash device until it is READY. ++ */ ++static void at91_dataflash_waitready(void) ++{ ++ char* command = kmalloc(2, GFP_KERNEL); ++ ++ if (!command) ++ return; ++ ++ do { ++ command[0] = OP_READ_STATUS; ++ command[1] = 0; ++ ++ do_spi_transfer(1, command, 2, command, 2, NULL, 0, NULL, 0); ++ } while ((command[1] & 0x80) == 0); ++ ++ kfree(command); ++} ++ ++/* ++ * Return the status of the DataFlash device. ++ */ ++static unsigned short at91_dataflash_status(void) ++{ ++ unsigned short status; ++ char* command = kmalloc(2, GFP_KERNEL); ++ ++ if (!command) ++ return 0; ++ ++ command[0] = OP_READ_STATUS; ++ command[1] = 0; ++ ++ do_spi_transfer(1, command, 2, command, 2, NULL, 0, NULL, 0); ++ status = command[1]; ++ ++ kfree(command); ++ return status; ++} ++ ++/* ......................................................................... */ ++ ++/* ++ * Erase blocks of flash. ++ */ ++static int at91_dataflash_erase(struct mtd_info *mtd, struct erase_info *instr) ++{ ++ struct dataflash_local *priv = (struct dataflash_local *) mtd->priv; ++ unsigned int pageaddr; ++ char* command; ++ ++#ifdef DEBUG_DATAFLASH ++ printk("dataflash_erase: addr=%i len=%i\n", instr->addr, instr->len); ++#endif ++ ++ /* Sanity checks */ ++ if (instr->addr + instr->len > mtd->size) ++ return -EINVAL; ++ if ((instr->len % mtd->erasesize != 0) || (instr->len % priv->page_size != 0)) ++ return -EINVAL; ++ if ((instr->addr % priv->page_size) != 0) ++ return -EINVAL; ++ ++ command = kmalloc(4, GFP_KERNEL); ++ if (!command) ++ return -ENOMEM; ++ ++ while (instr->len > 0) { ++ /* Calculate flash page address */ ++ pageaddr = (instr->addr / priv->page_size) << priv->page_offset; ++ ++ command[0] = OP_ERASE_PAGE; ++ command[1] = (pageaddr & 0x00FF0000) >> 16; ++ command[2] = (pageaddr & 0x0000FF00) >> 8; ++ command[3] = 0; ++#ifdef DEBUG_DATAFLASH ++ printk("ERASE: (%x) %x %x %x [%i]\n", command[0], command[1], command[2], command[3], pageaddr); ++#endif ++ ++ /* Send command to SPI device */ ++ spi_access_bus(priv->spi); ++ do_spi_transfer(1, command, 4, command, 4, NULL, 0, NULL, 0); ++ ++ at91_dataflash_waitready(); /* poll status until ready */ ++ spi_release_bus(priv->spi); ++ ++ instr->addr += priv->page_size; /* next page */ ++ instr->len -= priv->page_size; ++ } ++ ++ kfree(command); ++ ++ /* Inform MTD subsystem that erase is complete */ ++ instr->state = MTD_ERASE_DONE; ++ if (instr->callback) ++ instr->callback(instr); ++ ++ return 0; ++} ++ ++/* ++ * Read from the DataFlash device. ++ * from : Start offset in flash device ++ * len : Amount to read ++ * retlen : About of data actually read ++ * buf : Buffer containing the data ++ */ ++static int at91_dataflash_read(struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf) ++{ ++ struct dataflash_local *priv = (struct dataflash_local *) mtd->priv; ++ unsigned int addr; ++ char* command; ++ ++#ifdef DEBUG_DATAFLASH ++ printk("dataflash_read: %lli .. %lli\n", from, from+len); ++#endif ++ ++ *retlen = 0; ++ ++ /* Sanity checks */ ++ if (!len) ++ return 0; ++ if (from + len > mtd->size) ++ return -EINVAL; ++ ++ /* Calculate flash page/byte address */ ++ addr = (((unsigned)from / priv->page_size) << priv->page_offset) + ((unsigned)from % priv->page_size); ++ ++ command = kmalloc(8, GFP_KERNEL); ++ if (!command) ++ return -ENOMEM; ++ ++ command[0] = OP_READ_CONTINUOUS; ++ command[1] = (addr & 0x00FF0000) >> 16; ++ command[2] = (addr & 0x0000FF00) >> 8; ++ command[3] = (addr & 0x000000FF); ++#ifdef DEBUG_DATAFLASH ++ printk("READ: (%x) %x %x %x\n", command[0], command[1], command[2], command[3]); ++#endif ++ ++ /* Send command to SPI device */ ++ spi_access_bus(priv->spi); ++ do_spi_transfer(2, command, 8, command, 8, buf, len, buf, len); ++ spi_release_bus(priv->spi); ++ ++ *retlen = len; ++ kfree(command); ++ return 0; ++} ++ ++/* ++ * Write to the DataFlash device. ++ * to : Start offset in flash device ++ * len : Amount to write ++ * retlen : Amount of data actually written ++ * buf : Buffer containing the data ++ */ ++static int at91_dataflash_write(struct mtd_info *mtd, loff_t to, size_t len, size_t *retlen, const u_char *buf) ++{ ++ struct dataflash_local *priv = (struct dataflash_local *) mtd->priv; ++ unsigned int pageaddr, addr, offset, writelen; ++ size_t remaining; ++ u_char *writebuf; ++ unsigned short status; ++ int res = 0; ++ char* command; ++ char* tmpbuf = NULL; ++ ++#ifdef DEBUG_DATAFLASH ++ printk("dataflash_write: %lli .. %lli\n", to, to+len); ++#endif ++ ++ *retlen = 0; ++ ++ /* Sanity checks */ ++ if (!len) ++ return 0; ++ if (to + len > mtd->size) ++ return -EINVAL; ++ ++ command = kmalloc(4, GFP_KERNEL); ++ if (!command) ++ return -ENOMEM; ++ ++ pageaddr = ((unsigned)to / priv->page_size); ++ offset = ((unsigned)to % priv->page_size); ++ if (offset + len > priv->page_size) ++ writelen = priv->page_size - offset; ++ else ++ writelen = len; ++ writebuf = (u_char *)buf; ++ remaining = len; ++ ++ /* Allocate temporary buffer */ ++ tmpbuf = kmalloc(priv->page_size, GFP_KERNEL); ++ if (!tmpbuf) { ++ kfree(command); ++ return -ENOMEM; ++ } ++ ++ /* Gain access to the SPI bus */ ++ spi_access_bus(priv->spi); ++ ++ while (remaining > 0) { ++#ifdef DEBUG_DATAFLASH ++ printk("write @ %i:%i len=%i\n", pageaddr, offset, writelen); ++#endif ++ ++ /* (1) Transfer to Buffer1 */ ++ if (writelen != priv->page_size) { ++ addr = pageaddr << priv->page_offset; ++ command[0] = OP_TRANSFER_BUF1; ++ command[1] = (addr & 0x00FF0000) >> 16; ++ command[2] = (addr & 0x0000FF00) >> 8; ++ command[3] = 0; ++#ifdef DEBUG_DATAFLASH ++ printk("TRANSFER: (%x) %x %x %x\n", command[0], command[1], command[2], command[3]); ++#endif ++ do_spi_transfer(1, command, 4, command, 4, NULL, 0, NULL, 0); ++ at91_dataflash_waitready(); ++ } ++ ++ /* (2) Program via Buffer1 */ ++ addr = (pageaddr << priv->page_offset) + offset; ++ command[0] = OP_PROGRAM_VIA_BUF1; ++ command[1] = (addr & 0x00FF0000) >> 16; ++ command[2] = (addr & 0x0000FF00) >> 8; ++ command[3] = (addr & 0x000000FF); ++#ifdef DEBUG_DATAFLASH ++ printk("PROGRAM: (%x) %x %x %x\n", command[0], command[1], command[2], command[3]); ++#endif ++ do_spi_transfer(2, command, 4, command, 4, writebuf, writelen, tmpbuf, writelen); ++ at91_dataflash_waitready(); ++ ++ /* (3) Compare to Buffer1 */ ++ addr = pageaddr << priv->page_offset; ++ command[0] = OP_COMPARE_BUF1; ++ command[1] = (addr & 0x00FF0000) >> 16; ++ command[2] = (addr & 0x0000FF00) >> 8; ++ command[3] = 0; ++#ifdef DEBUG_DATAFLASH ++ printk("COMPARE: (%x) %x %x %x\n", command[0], command[1], command[2], command[3]); ++#endif ++ do_spi_transfer(1, command, 4, command, 4, NULL, 0, NULL, 0); ++ at91_dataflash_waitready(); ++ ++ /* Get result of the compare operation */ ++ status = at91_dataflash_status(); ++ if (status & 0x40) { ++ printk("at91_dataflash: Write error on page %i\n", pageaddr); ++ remaining = 0; ++ writelen = 0; ++ res = -EIO; ++ } ++ ++ remaining = remaining - writelen; ++ pageaddr++; ++ offset = 0; ++ writebuf += writelen; ++ *retlen += writelen; ++ ++ if (remaining > priv->page_size) ++ writelen = priv->page_size; ++ else ++ writelen = remaining; ++ } ++ ++ /* Release SPI bus */ ++ spi_release_bus(priv->spi); ++ ++ kfree(tmpbuf); ++ kfree(command); ++ return res; ++} ++ ++/* ......................................................................... */ ++ ++/* ++ * Initialize and register DataFlash device with MTD subsystem. ++ */ ++static int __init add_dataflash(int channel, char *name, int IDsize, ++ int nr_pages, int pagesize, int pageoffset) ++{ ++ struct mtd_info *device; ++ struct dataflash_local *priv; ++#ifdef CONFIG_MTD_PARTITIONS ++ struct mtd_partition *mtd_parts = 0; ++ int mtd_parts_nr = 0; ++#endif ++ ++ if (nr_devices >= DATAFLASH_MAX_DEVICES) { ++ printk(KERN_ERR "at91_dataflash: Too many devices detected\n"); ++ return 0; ++ } ++ ++ device = kmalloc(sizeof(struct mtd_info) + strlen(name) + 8, GFP_KERNEL); ++ if (!device) ++ return -ENOMEM; ++ memset(device, 0, sizeof(struct mtd_info)); ++ ++ device->name = (char *)&device[1]; ++ sprintf(device->name, "%s.spi%d", name, channel); ++ device->size = nr_pages * pagesize; ++ device->erasesize = pagesize; ++ device->writesize = pagesize; ++ device->owner = THIS_MODULE; ++ device->type = MTD_DATAFLASH; ++ device->flags = MTD_WRITEABLE; ++ device->erase = at91_dataflash_erase; ++ device->read = at91_dataflash_read; ++ device->write = at91_dataflash_write; ++ ++ priv = (struct dataflash_local *) kmalloc(sizeof(struct dataflash_local), GFP_KERNEL); ++ if (!priv) { ++ kfree(device); ++ return -ENOMEM; ++ } ++ memset(priv, 0, sizeof(struct dataflash_local)); ++ ++ priv->spi = channel; ++ priv->page_size = pagesize; ++ priv->page_offset = pageoffset; ++ device->priv = priv; ++ ++ mtd_devices[nr_devices] = device; ++ nr_devices++; ++ printk("at91_dataflash: %s detected [spi%i] (%i bytes)\n", name, channel, device->size); ++ ++#ifdef CONFIG_MTD_PARTITIONS ++#ifdef CONFIG_MTD_CMDLINE_PARTS ++ mtd_parts_nr = parse_mtd_partitions(device, part_probes, &mtd_parts, 0); ++#endif ++ if (mtd_parts_nr <= 0) { ++ switch (IDsize) { ++ case SZ_2M: ++ mtd_parts = static_partitions_2M; ++ mtd_parts_nr = ARRAY_SIZE(static_partitions_2M); ++ break; ++ case SZ_4M: ++ mtd_parts = static_partitions_4M; ++ mtd_parts_nr = ARRAY_SIZE(static_partitions_4M); ++ break; ++ case SZ_8M: ++ mtd_parts = static_partitions_8M; ++ mtd_parts_nr = ARRAY_SIZE(static_partitions_8M); ++ break; ++ } ++ } ++ ++ if (mtd_parts_nr > 0) { ++#ifdef CONFIG_DATAFLASH_ALWAYS_ADD_DEVICE ++ add_mtd_device(device); ++#endif ++ return add_mtd_partitions(device, mtd_parts, mtd_parts_nr); ++ } ++#endif ++ return add_mtd_device(device); /* add whole device */ ++} ++ ++/* ++ * Detect and initialize DataFlash device connected to specified SPI channel. ++ * ++ * Device Density ID code Nr Pages Page Size Page offset ++ * AT45DB011B 1Mbit (128K) xx0011xx (0x0c) 512 264 9 ++ * AT45DB021B 2Mbit (256K) xx0101xx (0x14) 1025 264 9 ++ * AT45DB041B 4Mbit (512K) xx0111xx (0x1c) 2048 264 9 ++ * AT45DB081B 8Mbit (1M) xx1001xx (0x24) 4096 264 9 ++ * AT45DB0161B 16Mbit (2M) xx1011xx (0x2c) 4096 528 10 ++ * AT45DB0321B 32Mbit (4M) xx1101xx (0x34) 8192 528 10 ++ * AT45DB0642 64Mbit (8M) xx1111xx (0x3c) 8192 1056 11 ++ * AT45DB1282 128Mbit (16M) xx0100xx (0x10) 16384 1056 11 ++ */ ++static int __init at91_dataflash_detect(int channel) ++{ ++ int res = 0; ++ unsigned short status; ++ ++ spi_access_bus(channel); ++ status = at91_dataflash_status(); ++ spi_release_bus(channel); ++ if (status != 0xff) { /* no dataflash device there */ ++ switch (status & 0x3c) { ++ case 0x0c: /* 0 0 1 1 */ ++ res = add_dataflash(channel, "AT45DB011B", SZ_128K, 512, 264, 9); ++ break; ++ case 0x14: /* 0 1 0 1 */ ++ res = add_dataflash(channel, "AT45DB021B", SZ_256K, 1025, 264, 9); ++ break; ++ case 0x1c: /* 0 1 1 1 */ ++ res = add_dataflash(channel, "AT45DB041B", SZ_512K, 2048, 264, 9); ++ break; ++ case 0x24: /* 1 0 0 1 */ ++ res = add_dataflash(channel, "AT45DB081B", SZ_1M, 4096, 264, 9); ++ break; ++ case 0x2c: /* 1 0 1 1 */ ++ res = add_dataflash(channel, "AT45DB161B", SZ_2M, 4096, 528, 10); ++ break; ++ case 0x34: /* 1 1 0 1 */ ++ res = add_dataflash(channel, "AT45DB321B", SZ_4M, 8192, 528, 10); ++ break; ++ case 0x3c: /* 1 1 1 1 */ ++ res = add_dataflash(channel, "AT45DB642", SZ_8M, 8192, 1056, 11); ++ break; ++// Currently unsupported since Atmel removed the "Main Memory Program via Buffer" commands. ++// case 0x10: /* 0 1 0 0 */ ++// res = add_dataflash(channel, "AT45DB1282", SZ_16M, 16384, 1056, 11); ++// break; ++ default: ++ printk(KERN_ERR "at91_dataflash: Unknown device (%x)\n", status & 0x3c); ++ } ++ } ++ ++ return res; ++} ++ ++static int __init at91_dataflash_init(void) ++{ ++ spi_transfer_desc = kmalloc(sizeof(struct spi_transfer_list), GFP_KERNEL); ++ if (!spi_transfer_desc) ++ return -ENOMEM; ++ ++ /* DataFlash (SPI chip select 0) */ ++ at91_dataflash_detect(0); ++ ++ if (machine_is_sweda_tms()) ++ at91_dataflash_detect(1); /* DataFlash device (SPI chip select 1) */ ++ ++#ifdef CONFIG_MTD_AT91_DATAFLASH_CARD ++ /* DataFlash card (SPI chip select 3) */ ++ at91_dataflash_detect(3); ++#endif ++ ++ return 0; ++} ++ ++static void __exit at91_dataflash_exit(void) ++{ ++ int i; ++ ++ for (i = 0; i < DATAFLASH_MAX_DEVICES; i++) { ++ if (mtd_devices[i]) { ++#ifdef CONFIG_MTD_PARTITIONS ++ del_mtd_partitions(mtd_devices[i]); ++#else ++ del_mtd_device(mtd_devices[i]); ++#endif ++ kfree(mtd_devices[i]->priv); ++ kfree(mtd_devices[i]); ++ } ++ } ++ nr_devices = 0; ++ kfree(spi_transfer_desc); ++} ++ ++ ++module_init(at91_dataflash_init); ++module_exit(at91_dataflash_exit); ++ ++MODULE_LICENSE("GPL"); ++MODULE_AUTHOR("Andrew Victor"); ++MODULE_DESCRIPTION("DataFlash driver for Atmel AT91RM9200"); +diff -urN -x CVS linux-2.6.24/drivers/mtd/devices/mtd_dataflash.c linux-2.6/drivers/mtd/devices/mtd_dataflash.c +--- linux-2.6.24/drivers/mtd/devices/mtd_dataflash.c 2008-03-01 22:02:12.000000000 +0200 ++++ linux-2.6/drivers/mtd/devices/mtd_dataflash.c 2007-12-31 10:44:31.000000000 +0200 +@@ -420,7 +420,7 @@ + status = dataflash_waitready(priv->spi); + + /* Check result of the compare operation */ +- if ((status & (1 << 6)) == 1) { ++ if (status & (1 << 6)) { + printk(KERN_ERR "%s: compare page %u, err %d\n", + spi->dev.bus_id, pageaddr, status); + remaining = 0; +diff -urN -x CVS linux-2.6.24/drivers/mtd/nand/Kconfig linux-2.6/drivers/mtd/nand/Kconfig +--- linux-2.6.24/drivers/mtd/nand/Kconfig 2008-03-01 22:02:12.000000000 +0200 ++++ linux-2.6/drivers/mtd/nand/Kconfig 2008-03-04 21:14:54.000000000 +0200 +@@ -279,6 +279,47 @@ + Enables support for NAND Flash / Smart Media Card interface + on Atmel AT91 processors. + ++choice ++ prompt "ECC management for NAND Flash / SmartMedia on AT91" ++ depends on MTD_NAND_AT91 ++ ++config MTD_NAND_AT91_ECC_SOFT ++ bool "Software ECC" ++ depends on MTD_NAND_AT91 ++ help ++ Uses software ECC. ++ ++ NB : hardware and software ECC schemes are incompatible. ++ If you switch from one to another, you'll have to erase your ++ mtd partition. ++ ++config MTD_NAND_AT91_ECC_HW ++ bool "Hardware ECC" ++ depends on MTD_NAND_AT91 && (ARCH_AT91SAM9260 || ARCH_AT91SAM9263 || ARCH_AT91SAM9RL || ARCH_AT91CAP9) ++ help ++ Uses hardware ECC provided by the AT91 processor ++ instead of software ECC. ++ The hardware ECC controller is capable of single bit error ++ correction and 2-bit random detection per page. ++ ++ NB : hardware and software ECC schemes are incompatible. ++ If you switch from one to another, you'll have to erase your ++ mtd partition. ++ ++ If unsure, say Y ++ ++config MTD_NAND_AT91_ECC_NONE ++ bool "No ECC (Testing Only)" ++ depends on MTD_NAND_AT91 ++ help ++ No ECC will be used. ++ It's not a good idea and it should be reserved for testing ++ purpose only. ++ ++ If unsure, say N ++ ++endchoice ++ + config MTD_NAND_CM_X270 + tristate "Support for NAND Flash on CM-X270 modules" + depends on MTD_NAND && MACH_ARMCORE +diff -urN -x CVS linux-2.6.24/drivers/mtd/nand/at91_nand.c linux-2.6/drivers/mtd/nand/at91_nand.c +--- linux-2.6.24/drivers/mtd/nand/at91_nand.c 2007-10-09 22:31:38.000000000 +0200 ++++ linux-2.6/drivers/mtd/nand/at91_nand.c 2008-03-04 21:41:16.000000000 +0200 +@@ -9,6 +9,15 @@ + * Derived from drivers/mtd/spia.c + * Copyright (C) 2000 Steven J. Hill (sjhill@cotw.com) + * ++ * ++ * Add Hardware ECC support for AT91SAM9260 / AT91SAM9263 ++ * Richard Genoud (richard.genoud@gmail.com), Adeneo Copyright (C) 2007 ++ * ++ * Derived from Das U-Boot source code ++ * (u-boot-1.1.5/board/atmel/at91sam9263ek/nand.c) ++ * (C) Copyright 2006 ATMEL Rousset, Lacressonniere Nicolas ++ * ++ * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. +@@ -28,12 +37,54 @@ + #include <asm/hardware.h> + #include <asm/arch/board.h> + #include <asm/arch/gpio.h> ++#include <asm/arch/at91_ecc.h> ++ ++#ifdef CONFIG_MTD_NAND_AT91_ECC_HW ++#define hard_ecc 1 ++#else ++#define hard_ecc 0 ++#endif ++ ++#ifdef CONFIG_MTD_NAND_AT91_ECC_NONE ++#define no_ecc 1 ++#else ++#define no_ecc 0 ++#endif ++ ++/* Register access macros */ ++#define ecc_readl(base, reg) __raw_readl(base + reg) ++#define ecc_writel(base, reg, value) __raw_writel((value), base + reg) ++ ++ ++/* ++ * OOB layout for large page size. ++ * bad block info is on bytes 0 and 1 ++ * the bytes must be consecutives to avoid several NAND_CMD_RNDOUT during read. ++ */ ++static struct nand_ecclayout at91_oobinfo_large = { ++ .eccbytes = 4, ++ .eccpos = {60, 61, 62, 63}, ++ .oobfree = { {2, 58} }, ++}; ++ ++/* ++ * OOB layout for small page size ++ * bad block info is on bytes 4 and 5 ++ * the bytes must be consecutives to avoid several NAND_CMD_RNDOUT during read. ++ */ ++static struct nand_ecclayout at91_oobinfo_small = { ++ .eccbytes = 4, ++ .eccpos = {0, 1, 2, 3}, ++ .oobfree = { {6, 10} }, ++}; + + struct at91_nand_host { + struct nand_chip nand_chip; + struct mtd_info mtd; + void __iomem *io_base; + struct at91_nand_data *board; ++ struct device *dev; ++ void __iomem *ecc; + }; + + /* +@@ -82,10 +133,250 @@ + at91_set_gpio_value(host->board->enable_pin, 1); + } + ++/* ++ * write oob for small pages ++ */ ++static int at91_nand_write_oob_512(struct mtd_info *mtd, ++ struct nand_chip *chip, int page) ++{ ++ int chunk = chip->ecc.bytes + chip->ecc.prepad + chip->ecc.postpad; ++ int eccsize = chip->ecc.size, length = mtd->oobsize; ++ int len, pos, status = 0; ++ const uint8_t *bufpoi = chip->oob_poi; ++ ++ pos = eccsize + chunk; ++ ++ chip->cmdfunc(mtd, NAND_CMD_SEQIN, pos, page); ++ len = min_t(int, length, chunk); ++ chip->write_buf(mtd, bufpoi, len); ++ bufpoi += len; ++ length -= len; ++ if (length > 0) ++ chip->write_buf(mtd, bufpoi, length); ++ ++ chip->cmdfunc(mtd, NAND_CMD_PAGEPROG, -1, -1); ++ status = chip->waitfunc(mtd, chip); ++ ++ return status & NAND_STATUS_FAIL ? -EIO : 0; ++ ++} ++ ++/* ++ * read oob for small pages ++ */ ++static int at91_nand_read_oob_512(struct mtd_info *mtd, ++ struct nand_chip *chip, int page, int sndcmd) ++{ ++ if (sndcmd) { ++ chip->cmdfunc(mtd, NAND_CMD_READOOB, 0, page); ++ sndcmd = 0; ++ } ++ chip->read_buf(mtd, chip->oob_poi, mtd->oobsize); ++ return sndcmd; ++} ++ ++/* ++ * Calculate HW ECC ++ * ++ * mtd: MTD block structure ++ * dat: raw data (unused) ++ * ecc_code: buffer for ECC ++ */ ++static int at91_nand_calculate(struct mtd_info *mtd, ++ const u_char *dat, unsigned char *ecc_code) ++{ ++ struct nand_chip *nand_chip = mtd->priv; ++ struct at91_nand_host *host = nand_chip->priv; ++ uint32_t *eccpos = nand_chip->ecc.layout->eccpos; ++ unsigned int ecc_value; ++ ++ /* get the first 2 ECC bytes */ ++ ecc_value = ecc_readl(host->ecc, AT91_ECC_PR) & (AT91_ECC_BITADDR | AT91_ECC_WORDADDR); ++ ++ ecc_code[eccpos[0]] = ecc_value & 0xFF; ++ ecc_code[eccpos[1]] = (ecc_value >> 8) & 0xFF; ++ ++ /* get the last 2 ECC bytes */ ++ ecc_value = ecc_readl(host->ecc, AT91_ECC_NPR) & AT91_ECC_NPARITY; ++ ++ ecc_code[eccpos[2]] = ecc_value & 0xFF; ++ ecc_code[eccpos[3]] = (ecc_value >> 8) & 0xFF; ++ ++ return 0; ++} ++ ++/* ++ * HW ECC read page function ++ * ++ * mtd: mtd info structure ++ * chip: nand chip info structure ++ * buf: buffer to store read data ++ */ ++static int at91_nand_read_page(struct mtd_info *mtd, ++ struct nand_chip *chip, uint8_t *buf) ++{ ++ int eccsize = chip->ecc.size; ++ int eccbytes = chip->ecc.bytes; ++ uint32_t *eccpos = chip->ecc.layout->eccpos; ++ uint8_t *p = buf; ++ uint8_t *oob = chip->oob_poi; ++ uint8_t *ecc_pos; ++ int stat; ++ ++ /* read the page */ ++ chip->read_buf(mtd, p, eccsize); ++ ++ /* move to ECC position if needed */ ++ if (eccpos[0] != 0) { ++ /* ++ * This only works on large pages because the ECC controller ++ * waits for NAND_CMD_RNDOUTSTART after the NAND_CMD_RNDOUT. ++ * Anyway, for small pages, the eccpos[0] == 0 ++ */ ++ chip->cmdfunc(mtd, NAND_CMD_RNDOUT, ++ mtd->writesize + eccpos[0], -1); ++ } ++ ++ /* the ECC controller needs to read the ECC just after the data */ ++ ecc_pos = oob + eccpos[0]; ++ chip->read_buf(mtd, ecc_pos, eccbytes); ++ ++ /* check if there's an error */ ++ stat = chip->ecc.correct(mtd, p, oob, NULL); ++ ++ if (stat < 0) ++ mtd->ecc_stats.failed++; ++ else ++ mtd->ecc_stats.corrected += stat; ++ ++ /* get back to oob start (end of page) */ ++ chip->cmdfunc(mtd, NAND_CMD_RNDOUT, mtd->writesize, -1); ++ ++ /* read the oob */ ++ chip->read_buf(mtd, oob, mtd->oobsize); ++ ++ return 0; ++} ++ ++/* ++ * HW ECC Correction ++ * ++ * mtd: MTD block structure ++ * dat: raw data read from the chip ++ * read_ecc: ECC from the chip (unused) ++ * isnull: unused ++ * ++ * Detect and correct a 1 bit error for a page ++ */ ++static int at91_nand_correct(struct mtd_info *mtd, u_char *dat, ++ u_char *read_ecc, u_char *isnull) ++{ ++ struct nand_chip *nand_chip = mtd->priv; ++ struct at91_nand_host *host = nand_chip->priv; ++ unsigned int ecc_status; ++ unsigned int ecc_word, ecc_bit; ++ ++ /* get the status from the Status Register */ ++ ecc_status = ecc_readl(host->ecc, AT91_ECC_SR); ++ ++ /* if there's no error */ ++ if (likely(!(ecc_status & AT91_ECC_RECERR))) ++ return 0; ++ ++ /* get error bit offset (4 bits) */ ++ ecc_bit = ecc_readl(host->ecc, AT91_ECC_PR) & AT91_ECC_BITADDR; ++ /* get word address (12 bits) */ ++ ecc_word = ecc_readl(host->ecc, AT91_ECC_PR) & AT91_ECC_WORDADDR; ++ ecc_word >>= 4; ++ ++ /* if there are multiple errors */ ++ if (ecc_status & AT91_ECC_MULERR) { ++ /* Check if it is a freshly erased block (filled with 0xff) */ ++ if ((ecc_bit == AT91_ECC_BITADDR) ++ && (ecc_word == (AT91_ECC_WORDADDR >> 4))) { ++ /* the block has just been erased, return OK */ ++ return 0; ++ } ++ /* ++ * It doesn't seems to be a freshly-erased block. ++ * We can't correct so many errors. ++ */ ++ dev_dbg(host->dev, "at91_nand : multiple errors detected." ++ " Unable to correct.\n"); ++ return -EIO; ++ } ++ ++ /* if there's a single bit error : we can correct it */ ++ if (ecc_status & AT91_ECC_ECCERR) { ++ /* ++ * There's nothing much to do here. ++ * The bit error is on the ECC itself. ++ */ ++ dev_dbg(host->dev, "at91_nand : one bit error on ECC code." ++ " Nothing to correct\n"); ++ return 0; ++ } ++ ++ dev_dbg(host->dev, "at91_nand : one bit error on data." ++ " (word offset in the page :" ++ " 0x%x bit offset : 0x%x)\n", ++ ecc_word, ecc_bit); ++ /* correct the error */ ++ if (nand_chip->options & NAND_BUSWIDTH_16) { ++ /* 16 bits words */ ++ ((unsigned short *) dat)[ecc_word] ^= (1 << ecc_bit); ++ } else { ++ /* 8 bits words */ ++ dat[ecc_word] ^= (1 << ecc_bit); ++ } ++ dev_dbg(host->dev, "at91_nand : error corrected\n"); ++ return 1; ++} ++ ++/* ++ * Enable HW ECC : unsused ++ */ ++static void at91_nand_hwctl(struct mtd_info *mtd, int mode) { ; } ++ ++/* ++ * Over-ride the standard functions with our optimized versions. ++ * We can use read/write blocks to move data to/from the controller. ++ */ ++static void at91_read_buf8(struct mtd_info *mtd, u8 *buf, int len) ++{ ++ struct nand_chip *nand_chip = mtd->priv; ++ ++ __raw_readsb(nand_chip->IO_ADDR_R, buf, len); ++} ++ ++static void at91_read_buf16(struct mtd_info *mtd, u8 *buf, int len) ++{ ++ struct nand_chip *nand_chip = mtd->priv; ++ ++ __raw_readsw(nand_chip->IO_ADDR_R, buf, len / 2); ++} ++ ++static void at91_write_buf8(struct mtd_info *mtd, const u8 *buf, int len) ++{ ++ struct nand_chip *nand_chip = mtd->priv; ++ ++ __raw_writesb(nand_chip->IO_ADDR_W, buf, len); ++} ++ ++static void at91_write_buf16(struct mtd_info *mtd, const u8 *buf, int len) ++{ ++ struct nand_chip *nand_chip = mtd->priv; ++ ++ __raw_writesw(nand_chip->IO_ADDR_W, buf, len / 2); ++} ++ ++ + #ifdef CONFIG_MTD_PARTITIONS +-const char *part_probes[] = { "cmdlinepart", NULL }; ++static const char *part_probes[] = { "cmdlinepart", NULL }; + #endif + ++static char* ecc_modes[] __initdata = { "No", "Software", "Hardware" }; ++ + /* + * Probe for the NAND device. + */ +@@ -94,6 +385,8 @@ + struct at91_nand_host *host; + struct mtd_info *mtd; + struct nand_chip *nand_chip; ++ struct resource *regs; ++ struct resource *mem; + int res; + + #ifdef CONFIG_MTD_PARTITIONS +@@ -108,8 +401,13 @@ + return -ENOMEM; + } + +- host->io_base = ioremap(pdev->resource[0].start, +- pdev->resource[0].end - pdev->resource[0].start + 1); ++ mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); ++ if (!mem) { ++ printk(KERN_ERR "at91_nand: can't get I/O resource mem\n"); ++ return -ENXIO; ++ } ++ ++ host->io_base = ioremap(mem->start, mem->end - mem->start + 1); + if (host->io_base == NULL) { + printk(KERN_ERR "at91_nand: ioremap failed\n"); + kfree(host); +@@ -119,6 +417,7 @@ + mtd = &host->mtd; + nand_chip = &host->nand_chip; + host->board = pdev->dev.platform_data; ++ host->dev = &pdev->dev; + + nand_chip->priv = host; /* link the private data structures */ + mtd->priv = nand_chip; +@@ -132,11 +431,40 @@ + if (host->board->rdy_pin) + nand_chip->dev_ready = at91_nand_device_ready; + ++ regs = platform_get_resource(pdev, IORESOURCE_MEM, 1); ++ if (!regs && hard_ecc) { ++ printk(KERN_ERR "at91_nand: can't get I/O resource " ++ "regs\nFalling back on software ECC\n"); ++ } ++ + nand_chip->ecc.mode = NAND_ECC_SOFT; /* enable ECC */ ++ if (no_ecc) ++ nand_chip->ecc.mode = NAND_ECC_NONE; ++ if (hard_ecc && regs) { ++ host->ecc = (void __force __iomem *) (AT91_VA_BASE_SYS - AT91_BASE_SYS); ++ host->ecc += regs->start; ++ ++ nand_chip->ecc.mode = NAND_ECC_HW_SYNDROME; /* HW SYNDROME ECC */ ++ nand_chip->ecc.calculate = at91_nand_calculate; /* function called after a write */ ++ nand_chip->ecc.correct = at91_nand_correct; /* function called after a read */ ++ nand_chip->ecc.hwctl = at91_nand_hwctl; /* unused */ ++ nand_chip->ecc.read_page = at91_nand_read_page; /* read page function */ ++ nand_chip->ecc.bytes = 4; /* 4 ECC bytes for any page size */ ++ nand_chip->ecc.prepad = 0; ++ nand_chip->ecc.postpad = 0; ++ } ++ + nand_chip->chip_delay = 20; /* 20us command delay time */ + +- if (host->board->bus_width_16) /* 16-bit bus width */ ++ if (host->board->bus_width_16) { /* 16-bit bus width */ + nand_chip->options |= NAND_BUSWIDTH_16; ++ nand_chip->read_buf = at91_read_buf16; ++ nand_chip->write_buf = at91_write_buf16; ++ } ++ else { ++ nand_chip->read_buf = at91_read_buf8; ++ nand_chip->write_buf = at91_write_buf8; ++ } + + platform_set_drvdata(pdev, host); + at91_nand_enable(host); +@@ -149,21 +477,73 @@ + } + } + +- /* Scan to find existance of the device */ +- if (nand_scan(mtd, 1)) { ++ /* first scan to find the device and get the page size */ ++ if (nand_scan_ident(mtd, 1)) { ++ res = -ENXIO; ++ goto out; ++ } ++ ++ if (nand_chip->ecc.mode == NAND_ECC_HW_SYNDROME) { ++ /* ECC is calculated for the whole page (1 step) */ ++ nand_chip->ecc.size = mtd->writesize; ++ ++ /* set ECC page size and oob layout */ ++ switch (mtd->writesize) { ++ case 512: ++ nand_chip->ecc.layout = &at91_oobinfo_small; ++ nand_chip->ecc.read_oob = at91_nand_read_oob_512; ++ nand_chip->ecc.write_oob = at91_nand_write_oob_512; ++ ecc_writel(host->ecc, AT91_ECC_MR, AT91_ECC_PAGESIZE_528); ++ break; ++ case 1024: ++ nand_chip->ecc.layout = &at91_oobinfo_large; ++ ecc_writel(host->ecc, AT91_ECC_MR, AT91_ECC_PAGESIZE_1056); ++ break; ++ case 2048: ++ nand_chip->ecc.layout = &at91_oobinfo_large; ++ ecc_writel(host->ecc, AT91_ECC_MR, AT91_ECC_PAGESIZE_2112); ++ break; ++ case 4096: ++ nand_chip->ecc.layout = &at91_oobinfo_large; ++ ecc_writel(host->ecc, AT91_ECC_MR, AT91_ECC_PAGESIZE_4224); ++ break; ++ default: ++ /* ++ * Page size not supported by HW ECC. ++ * So switch back to soft ECC ++ */ ++ nand_chip->ecc.mode = NAND_ECC_SOFT; ++ nand_chip->ecc.calculate = NULL; ++ nand_chip->ecc.correct = NULL; ++ nand_chip->ecc.hwctl = NULL; ++ nand_chip->ecc.read_page = NULL; ++ nand_chip->ecc.postpad = 0; ++ nand_chip->ecc.prepad = 0; ++ nand_chip->ecc.bytes = 0; ++ break; ++ } ++ } ++ ++ printk(KERN_INFO "AT91 NAND: %i-bit, %s ECC\n", ++ (nand_chip->options & NAND_BUSWIDTH_16) ? 16 : 8, ++ ecc_modes[nand_chip->ecc.mode] ++ ); ++ ++ /* second phase scan */ ++ if (nand_scan_tail(mtd)) { + res = -ENXIO; + goto out; + } + + #ifdef CONFIG_MTD_PARTITIONS +- if (host->board->partition_info) +- partitions = host->board->partition_info(mtd->size, &num_partitions); + #ifdef CONFIG_MTD_CMDLINE_PARTS +- else { +- mtd->name = "at91_nand"; +- num_partitions = parse_mtd_partitions(mtd, part_probes, &partitions, 0); +- } ++ mtd->name = "at91_nand"; ++ num_partitions = parse_mtd_partitions(mtd, part_probes, ++ &partitions, 0); + #endif ++ if (num_partitions <= 0 && host->board->partition_info) ++ partitions = host->board->partition_info(mtd->size, ++ &num_partitions); + + if ((!partitions) || (num_partitions == 0)) { + printk(KERN_ERR "at91_nand: No parititions defined, or unsupported device.\n"); +@@ -179,8 +559,11 @@ + if (!res) + return res; + ++#ifdef CONFIG_MTD_PARTITIONS + release: ++#endif + nand_release(mtd); ++ + out: + at91_nand_disable(host); + platform_set_drvdata(pdev, NULL); +@@ -192,7 +575,7 @@ + /* + * Remove a NAND device. + */ +-static int __devexit at91_nand_remove(struct platform_device *pdev) ++static int __exit at91_nand_remove(struct platform_device *pdev) + { + struct at91_nand_host *host = platform_get_drvdata(pdev); + struct mtd_info *mtd = &host->mtd; +@@ -208,8 +591,7 @@ + } + + static struct platform_driver at91_nand_driver = { +- .probe = at91_nand_probe, +- .remove = at91_nand_remove, ++ .remove = __exit_p(at91_nand_remove), + .driver = { + .name = "at91_nand", + .owner = THIS_MODULE, +@@ -218,7 +600,7 @@ + + static int __init at91_nand_init(void) + { +- return platform_driver_register(&at91_nand_driver); ++ return platform_driver_probe(&at91_nand_driver, at91_nand_probe); + } + + +@@ -233,4 +615,4 @@ + + MODULE_LICENSE("GPL"); + MODULE_AUTHOR("Rick Bronson"); +-MODULE_DESCRIPTION("NAND/SmartMedia driver for AT91RM9200"); ++MODULE_DESCRIPTION("NAND/SmartMedia driver for AT91RM9200 / AT91SAM9 / AT91CAP9"); +diff -urN -x CVS linux-2.6.24/drivers/net/Kconfig linux-2.6/drivers/net/Kconfig +--- linux-2.6.24/drivers/net/Kconfig 2008-03-01 22:02:12.000000000 +0200 ++++ linux-2.6/drivers/net/Kconfig 2008-02-18 22:56:04.000000000 +0200 +@@ -212,7 +212,7 @@ + + config MACB + tristate "Atmel MACB support" +- depends on AVR32 || ARCH_AT91SAM9260 || ARCH_AT91SAM9263 ++ depends on AVR32 || ARCH_AT91SAM9260 || ARCH_AT91SAM9263 || ARCH_AT91CAP9 + select PHYLIB + help + The Atmel MACB ethernet interface is found on many AT32 and AT91 +diff -urN -x CVS linux-2.6.24/drivers/net/arm/at91_ether.c linux-2.6/drivers/net/arm/at91_ether.c +--- linux-2.6.24/drivers/net/arm/at91_ether.c 2008-03-01 22:02:12.000000000 +0200 ++++ linux-2.6/drivers/net/arm/at91_ether.c 2008-03-04 22:17:26.000000000 +0200 +@@ -220,7 +220,7 @@ + if (!(phy & (1 << 0))) + goto done; + } +- else if (lp->phy_type == MII_KS8721_ID) { ++ else if ((lp->phy_type == MII_KS8721_ID) || (lp->phy_type == MII_KSZ8041_ID)) { + read_phy(lp->phy_address, MII_TPISTATUS, &phy); /* ack interrupt in Micrel PHY */ + if (!(phy & ((1 << 2) | 1))) + goto done; +@@ -286,7 +286,7 @@ + dsintr = (1 << 15) | ( 1 << 14); + write_phy(lp->phy_address, MII_BCMINTR_REG, dsintr); + } +- else if (lp->phy_type == MII_KS8721_ID) { /* for Micrel PHY */ ++ else if ((lp->phy_type == MII_KS8721_ID) || (lp->phy_type == MII_KSZ8041_ID)) { /* for Micrel PHY */ + dsintr = (1 << 10) | ( 1 << 8); + write_phy(lp->phy_address, MII_TPISTATUS, dsintr); + } +@@ -341,7 +341,7 @@ + dsintr = ~(1 << 14); + write_phy(lp->phy_address, MII_BCMINTR_REG, dsintr); + } +- else if (lp->phy_type == MII_KS8721_ID) { /* for Micrel PHY */ ++ else if ((lp->phy_type == MII_KS8721_ID) || (lp->phy_type == MII_KSZ8041_ID)) { /* for Micrel PHY */ + read_phy(lp->phy_address, MII_TPISTATUS, &dsintr); + dsintr = ~((1 << 10) | (1 << 8)); + write_phy(lp->phy_address, MII_TPISTATUS, dsintr); +@@ -384,7 +384,7 @@ + /* Wait until PHY reset is complete */ + do { + read_phy(lp->phy_address, MII_BMCR, &bmcr); +- } while (!(bmcr && BMCR_RESET)); ++ } while (!(bmcr & BMCR_RESET)); + + disable_mdi(); + spin_unlock_irq(&lp->lock); +@@ -978,15 +978,22 @@ + struct net_device *dev; + struct at91_private *lp; + unsigned int val; +- int res; ++ struct resource *res; ++ int ret; + DECLARE_MAC_BUF(mac); + + dev = alloc_etherdev(sizeof(struct at91_private)); + if (!dev) + return -ENOMEM; + +- dev->base_addr = AT91_VA_BASE_EMAC; +- dev->irq = AT91RM9200_ID_EMAC; ++ /* Get I/O base address and IRQ */ ++ res = platform_get_resource(pdev, IORESOURCE_MEM, 0); ++ if (!res) { ++ free_netdev(dev); ++ return -ENODEV; ++ } ++ dev->base_addr = res->start; ++ dev->irq = platform_get_irq(pdev, 0); + + /* Install the interrupt handler */ + if (request_irq(dev->irq, at91ether_interrupt, 0, dev->name, dev)) { +@@ -1043,7 +1050,9 @@ + } else if (machine_is_csb337()) { + /* mix link activity status into LED2 link state */ + write_phy(phy_address, MII_LEDCTRL_REG, 0x0d22); +- } ++ } else if (machine_is_ecbat91()) ++ write_phy(phy_address, MII_LEDCTRL_REG, 0x156A); ++ + disable_mdi(); + spin_unlock_irq(&lp->lock); + +@@ -1058,12 +1067,12 @@ + lp->phy_address = phy_address; /* MDI address of PHY */ + + /* Register the network interface */ +- res = register_netdev(dev); +- if (res) { ++ ret = register_netdev(dev); ++ if (ret) { + free_irq(dev->irq, dev); + free_netdev(dev); + dma_free_coherent(NULL, sizeof(struct recv_desc_bufs), lp->dlist, (dma_addr_t)lp->dlist_phys); +- return res; ++ return ret; + } + + /* Determine current link speed */ +@@ -1101,6 +1110,8 @@ + printk(KERN_INFO "%s: National Semiconductor DP83848 PHY\n", dev->name); + else if (phy_type == MII_AC101L_ID) + printk(KERN_INFO "%s: Altima AC101L PHY\n", dev->name); ++ else if (phy_type == MII_KSZ8041_ID) ++ printk(KERN_INFO "%s: Micrel KSZ8041 PHY\n", dev->name); + else if (phy_type == MII_KS8721_ID) + printk(KERN_INFO "%s: Micrel KS8721 PHY\n", dev->name); + else if (phy_type == MII_T78Q21x3_ID) +@@ -1146,6 +1157,7 @@ + case MII_DP83847_ID: /* National Semiconductor DP83847: */ + case MII_DP83848_ID: /* National Semiconductor DP83848: */ + case MII_AC101L_ID: /* Altima AC101L: PHY_ID1 = 0x22, PHY_ID2 = 0x5520 */ ++ case MII_KSZ8041_ID: /* Micrel KSZ8041: PHY_ID1 = 0x22, PHY_ID2 = 0x1512 */ + case MII_KS8721_ID: /* Micrel KS8721: PHY_ID1 = 0x22, PHY_ID2 = 0x1610 */ + case MII_T78Q21x3_ID: /* Teridian 78Q21x3: PHY_ID1 = 0x0E, PHY_ID2 = 7237 */ + case MII_LAN83C185_ID: /* SMSC LAN83C185: PHY_ID1 = 0x0007, PHY_ID2 = 0xC0A1 */ +diff -urN -x CVS linux-2.6.24/drivers/net/arm/at91_ether.h linux-2.6/drivers/net/arm/at91_ether.h +--- linux-2.6.24/drivers/net/arm/at91_ether.h 2007-10-09 22:31:38.000000000 +0200 ++++ linux-2.6/drivers/net/arm/at91_ether.h 2008-01-01 15:13:39.000000000 +0200 +@@ -48,6 +48,9 @@ + /* Altima AC101L PHY */ + #define MII_AC101L_ID 0x00225520 + ++/* Micrel KSZ8041 PHY */ ++#define MII_KSZ8041_ID 0x00221510 ++ + /* Micrel KS8721 PHY */ + #define MII_KS8721_ID 0x00221610 + +diff -urN -x CVS linux-2.6.24/drivers/rtc/Kconfig linux-2.6/drivers/rtc/Kconfig +--- linux-2.6.24/drivers/rtc/Kconfig 2008-03-01 22:02:13.000000000 +0200 ++++ linux-2.6/drivers/rtc/Kconfig 2008-02-24 18:13:06.000000000 +0200 +@@ -440,10 +440,47 @@ + AT32AP700x family processors. + + config RTC_DRV_AT91RM9200 +- tristate "AT91RM9200" +- depends on ARCH_AT91RM9200 ++ tristate "AT91RM9200 or AT91SAM9RL" ++ depends on ARCH_AT91RM9200 || ARCH_AT91SAM9RL + help +- Driver for the Atmel AT91RM9200's internal RTC (Realtime Clock). ++ Driver for the internal RTC (Realtime Clock) module found on ++ Atmel AT91RM9200's and AT91SAM9RL chips. On SAM9RL chips ++ this is powered by the backup power supply. ++ ++config RTC_DRV_AT91SAM9 ++ tristate "AT91SAM9x" ++ depends on ARCH_AT91 && !(ARCH_AT91RM9200 || ARCH_AT91X40) ++ help ++ RTC driver for the Atmel AT91SAM9x internal RTT (Real Time Timer). ++ These timers are powered by the backup power supply (such as a ++ small coin cell battery), but do not need to be used as RTCs. ++ ++ (On AT91SAM9rl chips you probably want to use the dedicated RTC ++ module and leave the RTT available for other uses.) ++ ++config RTC_DRV_AT91SAM9_RTT ++ int ++ range 0 1 ++ default 0 ++ prompt "RTT module Number" if ARCH_AT91SAM9263 ++ depends on RTC_DRV_AT91SAM9 ++ help ++ More than one RTT module is available. You can choose which ++ one will be used as an RTC. The default of zero is normally ++ OK to use, though some systems use that for non-RTC purposes. ++ ++config RTC_DRV_AT91SAM9_GPBR ++ int ++ range 0 3 if !ARCH_AT91SAM9263 ++ range 0 15 if ARCH_AT91SAM9263 ++ default 0 ++ prompt "Backup Register Number" ++ depends on RTC_DRV_AT91SAM9 ++ help ++ The RTC driver needs to use one of the General Purpose Backup ++ Registers (GPBRs) as well as the RTT. You can choose which one ++ will be used. The default of zero is normally OK to use, but ++ on some systems other software needs to use that register. + + config RTC_DRV_BFIN + tristate "Blackfin On-Chip RTC" +diff -urN -x CVS linux-2.6.24/drivers/rtc/Makefile linux-2.6/drivers/rtc/Makefile +--- linux-2.6.24/drivers/rtc/Makefile 2008-03-01 22:02:13.000000000 +0200 ++++ linux-2.6/drivers/rtc/Makefile 2007-12-31 10:44:31.000000000 +0200 +@@ -19,6 +19,7 @@ + + obj-$(CONFIG_RTC_DRV_AT32AP700X)+= rtc-at32ap700x.o + obj-$(CONFIG_RTC_DRV_AT91RM9200)+= rtc-at91rm9200.o ++obj-$(CONFIG_RTC_DRV_AT91SAM9) += rtc-at91sam9.o + obj-$(CONFIG_RTC_DRV_BFIN) += rtc-bfin.o + obj-$(CONFIG_RTC_DRV_CMOS) += rtc-cmos.o + obj-$(CONFIG_RTC_DRV_DS1216) += rtc-ds1216.o +diff -urN -x CVS linux-2.6.24/drivers/rtc/rtc-at91rm9200.c linux-2.6/drivers/rtc/rtc-at91rm9200.c +--- linux-2.6.24/drivers/rtc/rtc-at91rm9200.c 2007-10-09 22:31:38.000000000 +0200 ++++ linux-2.6/drivers/rtc/rtc-at91rm9200.c 2008-02-25 22:32:47.000000000 +0200 +@@ -307,12 +307,6 @@ + return ret; + } + +- /* cpu init code should really have flagged this device as +- * being wake-capable; if it didn't, do that here. +- */ +- if (!device_can_wakeup(&pdev->dev)) +- device_init_wakeup(&pdev->dev, 1); +- + rtc = rtc_device_register(pdev->name, &pdev->dev, + &at91_rtc_ops, THIS_MODULE); + if (IS_ERR(rtc)) { +diff -urN -x CVS linux-2.6.24/drivers/rtc/rtc-at91sam9.c linux-2.6/drivers/rtc/rtc-at91sam9.c +--- linux-2.6.24/drivers/rtc/rtc-at91sam9.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-2.6/drivers/rtc/rtc-at91sam9.c 2008-03-01 21:54:39.000000000 +0200 +@@ -0,0 +1,526 @@ ++/* ++ * "RTT as Real Time Clock" driver for AT91SAM9 SoC family ++ * ++ * (C) 2007 Michel Benoit ++ * ++ * Based on rtc-at91rm9200.c by Rick Bronson ++ * ++ * This program is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU General Public License ++ * as published by the Free Software Foundation; either version ++ * 2 of the License, or (at your option) any later version. ++ */ ++ ++#include <linux/module.h> ++#include <linux/kernel.h> ++#include <linux/platform_device.h> ++#include <linux/time.h> ++#include <linux/rtc.h> ++#include <linux/interrupt.h> ++#include <linux/ioctl.h> ++ ++#include <asm/mach/time.h> ++#include <asm/arch/board.h> ++#include <asm/arch/at91_rtt.h> ++ ++ ++/* ++ * This driver uses two configurable hardware resources that live in the ++ * AT91SAM9 backup power domain (intended to be powered at all times) ++ * to implement the Real Time Clock interfaces ++ * ++ * - A "Real-time Timer" (RTT) counts up in seconds from a base time. ++ * We can't assign the counter value (CRTV) ... but we can reset it. ++ * ++ * - One of the "General Purpose Backup Registers" (GPBRs) holds the ++ * base time, normally an offset from the beginning of the POSIX ++ * epoch (1970-Jan-1 00:00:00 UTC). Some systems also include the ++ * local timezone's offset. ++ * ++ * The RTC's value is the RTT counter plus that offset. The RTC's alarm ++ * is likewise a base (ALMV) plus that offset. ++ * ++ * Not all RTTs will be used as RTCs; some systems have multiple RTTs to ++ * choose from, or a "real" RTC module. All systems have multiple GPBR ++ * registers available, likewise usable for more than "RTC" support. ++ */ ++ ++/* ++ * We store ALARM_DISABLED in ALMV to record that no alarm is set. ++ * It's also the reset value for that field. ++ */ ++#define ALARM_DISABLED ((u32)~0) ++ ++ ++struct sam9_rtc { ++ void __iomem *rtt; ++ struct rtc_device *rtcdev; ++ u32 imr; ++}; ++ ++#define rtt_readl(rtc, field) \ ++ __raw_readl((rtc)->rtt + AT91_RTT_ ## field) ++#define rtt_writel(rtc, field, val) \ ++ __raw_writel((val), (rtc)->rtt + AT91_RTT_ ## field) ++ ++#define gpbr_readl(rtc) \ ++ at91_sys_read(AT91_GPBR + 4 * CONFIG_RTC_DRV_AT91SAM9_GPBR) ++#define gpbr_writel(rtc, val) \ ++ at91_sys_write(AT91_GPBR + 4 * CONFIG_RTC_DRV_AT91SAM9_GPBR, (val)) ++ ++/* ++ * Read current time and date in RTC ++ */ ++static int at91_rtc_readtime(struct device *dev, struct rtc_time *tm) ++{ ++ struct sam9_rtc *rtc = dev_get_drvdata(dev); ++ u32 secs, secs2; ++ u32 offset; ++ ++ /* read current time offset */ ++ offset = gpbr_readl(rtc); ++ if (offset == 0) ++ return -EILSEQ; ++ ++ /* reread the counter to help sync the two clock domains */ ++ secs = rtt_readl(rtc, VR); ++ secs2 = rtt_readl(rtc, VR); ++ if (secs != secs2) ++ secs = rtt_readl(rtc, VR); ++ ++ rtc_time_to_tm(offset + secs, tm); ++ ++ dev_dbg(dev, "%s: %4d-%02d-%02d %02d:%02d:%02d\n", "readtime", ++ 1900 + tm->tm_year, tm->tm_mon, tm->tm_mday, ++ tm->tm_hour, tm->tm_min, tm->tm_sec); ++ ++ return 0; ++} ++ ++/* ++ * Set current time and date in RTC ++ */ ++static int at91_rtc_settime(struct device *dev, struct rtc_time *tm) ++{ ++ struct sam9_rtc *rtc = dev_get_drvdata(dev); ++ int err; ++ u32 offset, alarm, mr; ++ unsigned long secs; ++ ++ dev_dbg(dev, "%s: %4d-%02d-%02d %02d:%02d:%02d\n", "settime", ++ 1900 + tm->tm_year, tm->tm_mon, tm->tm_mday, ++ tm->tm_hour, tm->tm_min, tm->tm_sec); ++ ++ err = rtc_tm_to_time(tm, &secs); ++ if (err != 0) ++ return err; ++ ++ mr = rtt_readl(rtc, MR); ++ ++ /* disable interrupts */ ++ rtt_writel(rtc, MR, mr & ~(AT91_RTT_ALMIEN | AT91_RTT_RTTINCIEN)); ++ ++ /* read current time offset */ ++ offset = gpbr_readl(rtc); ++ ++ /* store the new base time in a battery backup register */ ++ secs += 1; ++ gpbr_writel(rtc, secs); ++ ++ /* adjust the alarm time for the new base */ ++ alarm = rtt_readl(rtc, AR); ++ if (alarm != ALARM_DISABLED) { ++ if (offset > secs) { ++ /* time jumped backwards, increase time until alarm */ ++ alarm += (offset - secs); ++ } else if ((alarm + offset) > secs) { ++ /* time jumped forwards, decrease time until alarm */ ++ alarm -= (secs - offset); ++ } else { ++ /* time jumped past the alarm, disable alarm */ ++ alarm = ALARM_DISABLED; ++ mr &= ~AT91_RTT_ALMIEN; ++ } ++ rtt_writel(rtc, AR, alarm); ++ } ++ ++ /* reset the timer, and re-enable interrupts */ ++ rtt_writel(rtc, MR, mr | AT91_RTT_RTTRST); ++ ++ return 0; ++} ++ ++/* ++ * Read alarm time and date in RTC ++ */ ++static int at91_rtc_readalarm(struct device *dev, struct rtc_wkalrm *alrm) ++{ ++ struct sam9_rtc *rtc = dev_get_drvdata(dev); ++ struct rtc_time *tm = &alrm->time; ++ u32 alarm = rtt_readl(rtc, AR); ++ u32 offset; ++ ++ offset = gpbr_readl(rtc); ++ if (offset == 0) ++ return -EILSEQ; ++ ++ memset(alrm, 0, sizeof(alrm)); ++ if (alarm != ALARM_DISABLED && offset != 0) { ++ rtc_time_to_tm(offset + alarm, tm); ++ ++ dev_dbg(dev, "%s: %4d-%02d-%02d %02d:%02d:%02d\n", "readalarm", ++ 1900 + tm->tm_year, tm->tm_mon, tm->tm_mday, ++ tm->tm_hour, tm->tm_min, tm->tm_sec); ++ ++ if (rtt_readl(rtc, MR) & AT91_RTT_ALMIEN) ++ alrm->enabled = 1; ++ } ++ ++ return 0; ++} ++ ++/* ++ * Set alarm time and date in RTC ++ */ ++static int at91_rtc_setalarm(struct device *dev, struct rtc_wkalrm *alrm) ++{ ++ struct sam9_rtc *rtc = dev_get_drvdata(dev); ++ struct rtc_time *tm = &alrm->time; ++ unsigned long secs; ++ u32 offset; ++ u32 mr; ++ int err; ++ ++ err = rtc_tm_to_time(tm, &secs); ++ if (err != 0) ++ return err; ++ ++ offset = gpbr_readl(rtc); ++ if (offset == 0) { ++ /* time is not set */ ++ return -EILSEQ; ++ } ++ mr = rtt_readl(rtc, MR); ++ rtt_writel(rtc, MR, mr & ~AT91_RTT_ALMIEN); ++ ++ /* alarm in the past? finish and leave disabled */ ++ if (secs <= offset) { ++ rtt_writel(rtc, AR, ALARM_DISABLED); ++ return 0; ++ } ++ ++ /* else set alarm and maybe enable it */ ++ rtt_writel(rtc, AR, secs - offset); ++ if (alrm->enabled) ++ rtt_writel(rtc, MR, mr | AT91_RTT_ALMIEN); ++ ++ dev_dbg(dev, "%s: %4d-%02d-%02d %02d:%02d:%02d\n", "setalarm", ++ tm->tm_year, tm->tm_mon, tm->tm_mday, tm->tm_hour, ++ tm->tm_min, tm->tm_sec); ++ ++ return 0; ++} ++ ++/* ++ * Handle commands from user-space ++ */ ++static int at91_rtc_ioctl(struct device *dev, unsigned int cmd, ++ unsigned long arg) ++{ ++ struct sam9_rtc *rtc = dev_get_drvdata(dev); ++ int ret = 0; ++ u32 mr = rtt_readl(rtc, MR); ++ ++ dev_dbg(dev, "ioctl: cmd=%08x, arg=%08lx, mr %08x\n", cmd, arg, mr); ++ ++ switch (cmd) { ++ case RTC_AIE_OFF: /* alarm off */ ++ rtt_writel(rtc, MR, mr & ~AT91_RTT_ALMIEN); ++ break; ++ case RTC_AIE_ON: /* alarm on */ ++ rtt_writel(rtc, MR, mr | AT91_RTT_ALMIEN); ++ break; ++ case RTC_UIE_OFF: /* update off */ ++ rtt_writel(rtc, MR, mr & ~AT91_RTT_RTTINCIEN); ++ break; ++ case RTC_UIE_ON: /* update on */ ++ rtt_writel(rtc, MR, mr | AT91_RTT_RTTINCIEN); ++ break; ++ default: ++ ret = -ENOIOCTLCMD; ++ break; ++ } ++ ++ return ret; ++} ++ ++/* ++ * Provide additional RTC information in /proc/driver/rtc ++ */ ++static int at91_rtc_proc(struct device *dev, struct seq_file *seq) ++{ ++ struct sam9_rtc *rtc = dev_get_drvdata(dev); ++ u32 mr = mr = rtt_readl(rtc, MR); ++ ++ seq_printf(seq, "update_IRQ\t: %s\n", ++ (mr & AT91_RTT_RTTINCIEN) ? "yes" : "no"); ++ return 0; ++} ++ ++/* ++ * IRQ handler for the RTC ++ */ ++static irqreturn_t at91_rtc_interrupt(int irq, void *_rtc) ++{ ++ struct sam9_rtc *rtc = _rtc; ++ u32 sr, mr; ++ unsigned long events = 0; ++ ++ /* Shared interrupt may be for another device. Note: reading ++ * SR clears it, so we must only read it in this irq handler! ++ */ ++ mr = rtt_readl(rtc, MR) & (AT91_RTT_ALMIEN | AT91_RTT_RTTINCIEN); ++ sr = rtt_readl(rtc, SR) & mr; ++ if (!sr) ++ return IRQ_NONE; ++ ++ /* alarm status */ ++ if (sr & AT91_RTT_ALMS) ++ events |= (RTC_AF | RTC_IRQF); ++ ++ /* timer update/increment */ ++ if (sr & AT91_RTT_RTTINC) ++ events |= (RTC_UF | RTC_IRQF); ++ ++ rtc_update_irq(rtc->rtcdev, 1, events); ++ ++ pr_debug("%s: num=%ld, events=0x%02lx\n", __FUNCTION__, ++ events >> 8, events & 0x000000FF); ++ ++ return IRQ_HANDLED; ++} ++ ++static const struct rtc_class_ops at91_rtc_ops = { ++ .ioctl = at91_rtc_ioctl, ++ .read_time = at91_rtc_readtime, ++ .set_time = at91_rtc_settime, ++ .read_alarm = at91_rtc_readalarm, ++ .set_alarm = at91_rtc_setalarm, ++ .proc = at91_rtc_proc, ++}; ++ ++/* ++ * Initialize and install RTC driver ++ */ ++static int __init at91_rtc_probe(struct platform_device *pdev) ++{ ++ struct resource *r; ++ struct sam9_rtc *rtc; ++ int ret; ++ u32 mr; ++ ++ r = platform_get_resource(pdev, IORESOURCE_MEM, 0); ++ if (!r) ++ return -ENODEV; ++ ++ rtc = kzalloc(sizeof *rtc, GFP_KERNEL); ++ if (!rtc) ++ return -ENOMEM; ++ ++ platform_set_drvdata(pdev, rtc); ++ rtc->rtt = (void __force __iomem *) (AT91_VA_BASE_SYS - AT91_BASE_SYS); ++ rtc->rtt += r->start; ++ ++ mr = rtt_readl(rtc, MR); ++ ++ /* unless RTT is counting at 1 Hz, re-initialize it */ ++ if ((mr & AT91_RTT_RTPRES) != AT91_SLOW_CLOCK) { ++ mr = AT91_RTT_RTTRST | (AT91_SLOW_CLOCK & AT91_RTT_RTPRES); ++ gpbr_writel(rtc, 0); ++ } ++ ++ /* disable all interrupts (same as on shutdown path) */ ++ mr &= ~(AT91_RTT_ALMIEN | AT91_RTT_RTTINCIEN); ++ rtt_writel(rtc, MR, mr); ++ ++ rtc->rtcdev = rtc_device_register(pdev->name, &pdev->dev, ++ &at91_rtc_ops, THIS_MODULE); ++ if (IS_ERR(rtc->rtcdev)) { ++ ret = PTR_ERR(rtc->rtcdev); ++ goto fail; ++ } ++ ++ /* register irq handler after we know what name we'll use */ ++ ret = request_irq(AT91_ID_SYS, at91_rtc_interrupt, ++ IRQF_DISABLED | IRQF_SHARED, ++ rtc->rtcdev->dev.bus_id, rtc); ++ if (ret) { ++ dev_dbg(&pdev->dev, "can't share IRQ %d?\n", AT91_ID_SYS); ++ rtc_device_unregister(rtc->rtcdev); ++ goto fail; ++ } ++ ++ /* NOTE: sam9260 rev A silicon has a ROM bug which resets the ++ * RTT on at least some reboots. If you have that chip, you must ++ * initialize the time from some external source like a GPS, wall ++ * clock, discrete RTC, etc ++ */ ++ ++ if (gpbr_readl(rtc) == 0) ++ dev_warn(&pdev->dev, "%s: SET TIME!\n", ++ rtc->rtcdev->dev.bus_id); ++ ++ return 0; ++ ++fail: ++ platform_set_drvdata(pdev, NULL); ++ kfree(rtc); ++ return ret; ++} ++ ++/* ++ * Disable and remove the RTC driver ++ */ ++static int __exit at91_rtc_remove(struct platform_device *pdev) ++{ ++ struct sam9_rtc *rtc = platform_get_drvdata(pdev); ++ u32 mr = rtt_readl(rtc, MR); ++ ++ /* disable all interrupts */ ++ rtt_writel(rtc, MR, mr & ~(AT91_RTT_ALMIEN | AT91_RTT_RTTINCIEN)); ++ free_irq(AT91_ID_SYS, rtc); ++ ++ rtc_device_unregister(rtc->rtcdev); ++ ++ platform_set_drvdata(pdev, NULL); ++ kfree(rtc); ++ return 0; ++} ++ ++static void at91_rtc_shutdown(struct platform_device *pdev) ++{ ++ struct sam9_rtc *rtc = platform_get_drvdata(pdev); ++ u32 mr = rtt_readl(rtc, MR); ++ ++ rtc->imr = mr & (AT91_RTT_ALMIEN | AT91_RTT_RTTINCIEN); ++ rtt_writel(rtc, MR, mr & ~rtc->imr); ++} ++ ++#ifdef CONFIG_PM ++ ++/* AT91SAM9 RTC Power management control */ ++ ++static int at91_rtc_suspend(struct platform_device *pdev, ++ pm_message_t state) ++{ ++ struct sam9_rtc *rtc = platform_get_drvdata(pdev); ++ u32 mr = rtt_readl(rtc, MR); ++ ++ /* ++ * This IRQ is shared with DBGU and other hardware which isn't ++ * necessarily a wakeup event source. ++ */ ++ rtc->imr = mr & (AT91_RTT_ALMIEN | AT91_RTT_RTTINCIEN); ++ if (rtc->imr) { ++ if (device_may_wakeup(&pdev->dev) && (mr & AT91_RTT_ALMIEN)) { ++ enable_irq_wake(AT91_ID_SYS); ++ /* don't let RTTINC cause wakeups */ ++ if (mr & AT91_RTT_RTTINCIEN) ++ rtt_writel(rtc, MR, mr & ~AT91_RTT_RTTINCIEN); ++ } else ++ rtt_writel(rtc, MR, mr & ~rtc->imr); ++ } ++ ++ return 0; ++} ++ ++static int at91_rtc_resume(struct platform_device *pdev) ++{ ++ struct sam9_rtc *rtc = platform_get_drvdata(pdev); ++ u32 mr; ++ ++ if (rtc->imr) { ++ if (device_may_wakeup(&pdev->dev)) ++ disable_irq_wake(AT91_ID_SYS); ++ mr = rtt_readl(rtc, MR); ++ rtt_writel(rtc, MR, mr | rtc->imr); ++ } ++ ++ return 0; ++} ++#else ++#define at91_rtc_suspend NULL ++#define at91_rtc_resume NULL ++#endif ++ ++static struct platform_driver at91_rtc_driver = { ++ .driver.name = "rtc-at91sam9", ++ .driver.owner = THIS_MODULE, ++ .remove = __exit_p(at91_rtc_remove), ++ .shutdown = at91_rtc_shutdown, ++ .suspend = at91_rtc_suspend, ++ .resume = at91_rtc_resume, ++}; ++ ++/* Chips can have more than one RTT module, and they can be used for more ++ * than just RTCs. So we can't just register as "the" RTT driver. ++ * ++ * A normal approach in such cases is to create a library to allocate and ++ * free the modules. Here we just use bus_find_device() as like such a ++ * library, binding directly ... no runtime "library" footprint is needed. ++ */ ++static int __init at91_rtc_match(struct device *dev, void *v) ++{ ++ struct platform_device *pdev = to_platform_device(dev); ++ int ret; ++ ++ /* continue searching if this isn't the RTT we need */ ++ if (strcmp("at91_rtt", pdev->name) != 0 ++ || pdev->id != CONFIG_RTC_DRV_AT91SAM9_RTT) ++ goto fail; ++ ++ /* else we found it ... but fail unless we can bind to the RTC driver */ ++ if (dev->driver) { ++ dev_dbg(dev, "busy, can't use as RTC!\n"); ++ goto fail; ++ } ++ dev->driver = &at91_rtc_driver.driver; ++ if (device_attach(dev) == 0) { ++ dev_dbg(dev, "can't attach RTC!\n"); ++ goto fail; ++ } ++ ret = at91_rtc_probe(pdev); ++ if (ret == 0) ++ return true; ++ ++ dev_dbg(dev, "RTC probe err %d!\n", ret); ++fail: ++ return false; ++} ++ ++static int __init at91_rtc_init(void) ++{ ++ int status; ++ struct device *rtc; ++ ++ status = platform_driver_register(&at91_rtc_driver); ++ if (status) ++ return status; ++ rtc = bus_find_device(&platform_bus_type, NULL, ++ NULL, at91_rtc_match); ++ if (!rtc) ++ platform_driver_unregister(&at91_rtc_driver); ++ return rtc ? 0 : -ENODEV; ++} ++module_init(at91_rtc_init); ++ ++static void __exit at91_rtc_exit(void) ++{ ++ platform_driver_unregister(&at91_rtc_driver); ++} ++module_exit(at91_rtc_exit); ++ ++ ++MODULE_AUTHOR("Michel Benoit"); ++MODULE_DESCRIPTION("RTC driver for Atmel AT91SAM9x"); ++MODULE_LICENSE("GPL"); +diff -urN -x CVS linux-2.6.24/drivers/serial/atmel_serial.c linux-2.6/drivers/serial/atmel_serial.c +--- linux-2.6.24/drivers/serial/atmel_serial.c 2008-03-01 22:02:13.000000000 +0200 ++++ linux-2.6/drivers/serial/atmel_serial.c 2008-02-24 19:02:50.000000000 +0200 +@@ -7,6 +7,8 @@ + * Based on drivers/char/serial_sa1100.c, by Deep Blue Solutions Ltd. + * Based on drivers/char/serial.c, by Linus Torvalds, Theodore Ts'o. + * ++ * DMA support added by Chip Coldwell. ++ * + * 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 +@@ -33,7 +35,9 @@ + #include <linux/sysrq.h> + #include <linux/tty_flip.h> + #include <linux/platform_device.h> ++#include <linux/dma-mapping.h> + #include <linux/atmel_pdc.h> ++#include <linux/atmel_serial.h> + + #include <asm/io.h> + +@@ -45,7 +49,10 @@ + #include <asm/arch/gpio.h> + #endif + +-#include "atmel_serial.h" ++#define SUPPORT_PDC ++#define PDC_BUFFER_SIZE (L1_CACHE_BYTES << 3) ++#warning "Revisit" ++#define PDC_RX_TIMEOUT (3 * 10) /* 3 bytes */ + + #if defined(CONFIG_SERIAL_ATMEL_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ) + #define SUPPORT_SYSRQ +@@ -107,6 +114,13 @@ + static int (*atmel_open_hook)(struct uart_port *); + static void (*atmel_close_hook)(struct uart_port *); + ++struct atmel_dma_buffer { ++ unsigned char *buf; ++ dma_addr_t dma_addr; ++ size_t dma_size; ++ unsigned int ofs; ++}; ++ + /* + * We wrap our port structure around the generic uart_port. + */ +@@ -115,10 +129,20 @@ + struct clk *clk; /* uart clock */ + unsigned short suspended; /* is port suspended? */ + int break_active; /* break being received */ ++ ++ short use_dma_rx; /* enable PDC receiver */ ++ short pdc_rx_idx; /* current PDC RX buffer */ ++ struct atmel_dma_buffer pdc_rx[2]; /* PDC receier */ ++ ++ short use_dma_tx; /* enable PDC transmitter */ ++ struct atmel_dma_buffer pdc_tx; /* PDC transmitter */ + }; + + static struct atmel_uart_port atmel_ports[ATMEL_MAX_UART]; + ++#define PDC_RX_BUF(port) &(port)->pdc_rx[(port)->pdc_rx_idx] ++#define PDC_RX_SWITCH(port) (port)->pdc_rx_idx = !(port)->pdc_rx_idx ++ + #ifdef SUPPORT_SYSRQ + static struct console atmel_console; + #endif +@@ -204,7 +228,14 @@ + */ + static void atmel_stop_tx(struct uart_port *port) + { +- UART_PUT_IDR(port, ATMEL_US_TXRDY); ++ struct atmel_uart_port *atmel_port = (struct atmel_uart_port *) port; ++ ++ if (atmel_port->use_dma_tx) { ++ UART_PUT_PTCR(port, ATMEL_PDC_TXTDIS); /* disable PDC transmit */ ++ UART_PUT_IDR(port, ATMEL_US_ENDTX | ATMEL_US_TXBUFE); ++ } ++ else ++ UART_PUT_IDR(port, ATMEL_US_TXRDY); + } + + /* +@@ -212,7 +243,19 @@ + */ + static void atmel_start_tx(struct uart_port *port) + { +- UART_PUT_IER(port, ATMEL_US_TXRDY); ++ struct atmel_uart_port *atmel_port = (struct atmel_uart_port *) port; ++ ++ if (atmel_port->use_dma_tx) { ++ if (UART_GET_PTSR(port) & ATMEL_PDC_TXTEN) ++ /* The transmitter is already running. Yes, we ++ really need this.*/ ++ return; ++ ++ UART_PUT_IER(port, ATMEL_US_ENDTX | ATMEL_US_TXBUFE); ++ UART_PUT_PTCR(port, ATMEL_PDC_TXTEN); /* re-enable PDC transmit */ ++ } ++ else ++ UART_PUT_IER(port, ATMEL_US_TXRDY); + } + + /* +@@ -220,7 +263,14 @@ + */ + static void atmel_stop_rx(struct uart_port *port) + { +- UART_PUT_IDR(port, ATMEL_US_RXRDY); ++ struct atmel_uart_port *atmel_port = (struct atmel_uart_port *) port; ++ ++ if (atmel_port->use_dma_rx) { ++ UART_PUT_PTCR(port, ATMEL_PDC_RXTDIS); /* disable PDC receive */ ++ UART_PUT_IDR(port, ATMEL_US_ENDRX | ATMEL_US_TIMEOUT); ++ } ++ else ++ UART_PUT_IDR(port, ATMEL_US_RXRDY); + } + + /* +@@ -243,6 +293,134 @@ + } + + /* ++ * Receive data via the PDC. A buffer has been fulled. ++ */ ++static void atmel_pdc_endrx(struct uart_port *port) ++{ ++ struct atmel_uart_port *atmel_port = (struct atmel_uart_port *) port; ++ struct tty_struct *tty = port->info->tty; ++ struct atmel_dma_buffer *pdc = PDC_RX_BUF(atmel_port); ++ unsigned int count; ++ ++ count = pdc->dma_size - pdc->ofs; ++ if (likely(count > 0)) { ++ dma_sync_single_for_cpu(port->dev, pdc->dma_addr, pdc->dma_size, DMA_FROM_DEVICE); ++ tty_insert_flip_string(tty, pdc->buf + pdc->ofs, count); ++ tty_flip_buffer_push(tty); ++ ++ port->icount.rx += count; ++ } ++ ++ /* Set this buffer as the next receive buffer */ ++ pdc->ofs = 0; ++ UART_PUT_RNPR(port, pdc->dma_addr); ++ UART_PUT_RNCR(port, pdc->dma_size); ++ ++ /* Switch to next buffer */ ++ PDC_RX_SWITCH(atmel_port); /* next PDC buffer */ ++} ++ ++/* ++ * Receive data via the PDC. At least one byte was received, but the ++ * buffer was not full when the inter-character timeout expired. ++ */ ++static void atmel_pdc_timeout(struct uart_port *port) ++{ ++ struct atmel_uart_port *atmel_port = (struct atmel_uart_port *) port; ++ struct tty_struct *tty = port->info->tty; ++ struct atmel_dma_buffer *pdc = PDC_RX_BUF(atmel_port); ++ /* unsigned */ int ofs, count; ++ ++ ofs = UART_GET_RPR(port) - pdc->dma_addr; /* current DMA adress */ ++ count = ofs - pdc->ofs; ++ ++ if (likely(count > 0)) { ++ dma_sync_single_for_cpu(port->dev, pdc->dma_addr, pdc->dma_size, DMA_FROM_DEVICE); ++ tty_insert_flip_string(tty, pdc->buf + pdc->ofs, count); ++ tty_flip_buffer_push(tty); ++ ++ pdc->ofs = ofs; ++ port->icount.rx += count; ++ } ++ ++ /* reset the UART timeout */ ++ UART_PUT_CR(port, ATMEL_US_STTTO); ++} ++ ++/* ++ * Deal with parity, framing and overrun errors. ++ */ ++static void atmel_pdc_rxerr(struct uart_port *port, unsigned int status) ++{ ++ /* clear error */ ++ UART_PUT_CR(port, ATMEL_US_RSTSTA); ++ ++ if (status & ATMEL_US_RXBRK) { ++ status &= ~(ATMEL_US_PARE | ATMEL_US_FRAME); /* ignore side-effect */ ++ port->icount.brk++; ++ } ++ if (status & ATMEL_US_PARE) ++ port->icount.parity++; ++ if (status & ATMEL_US_FRAME) ++ port->icount.frame++; ++ if (status & ATMEL_US_OVRE) ++ port->icount.overrun++; ++} ++ ++/* ++ * A transmission via the PDC is complete. ++ */ ++static void atmel_pdc_endtx(struct uart_port *port) ++{ ++ struct atmel_uart_port *atmel_port = (struct atmel_uart_port *) port; ++ struct circ_buf *xmit = &port->info->xmit; ++ struct atmel_dma_buffer *pdc = &atmel_port->pdc_tx; ++ ++ xmit->tail += pdc->ofs; ++ if (xmit->tail >= SERIAL_XMIT_SIZE) ++ xmit->tail -= SERIAL_XMIT_SIZE; ++ ++ port->icount.tx += pdc->ofs; ++ pdc->ofs = 0; ++ ++ if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS) ++ uart_write_wakeup(port); ++} ++ ++/* ++ * The PDC transmitter is idle, so either start the next transfer or ++ * disable the transmitter. ++ */ ++static void atmel_pdc_txbufe(struct uart_port *port) ++{ ++ struct atmel_uart_port *atmel_port = (struct atmel_uart_port *) port; ++ struct circ_buf *xmit = &port->info->xmit; ++ struct atmel_dma_buffer *pdc = &atmel_port->pdc_tx; ++ int count; ++ ++ if (!uart_circ_empty(xmit)) { ++ /* more to transmit - setup next transfer */ ++ UART_PUT_PTCR(port, ATMEL_PDC_TXTDIS); /* disable PDC transmit */ ++ dma_sync_single_for_device(port->dev, pdc->dma_addr, pdc->dma_size, DMA_TO_DEVICE); ++ ++ if (xmit->tail < xmit->head) ++ count = xmit->head - xmit->tail; ++ else ++ count = SERIAL_XMIT_SIZE - xmit->tail; ++ pdc->ofs = count; ++ ++ UART_PUT_TPR(port, pdc->dma_addr + xmit->tail); ++ UART_PUT_TCR(port, count); ++ UART_PUT_PTCR(port, ATMEL_PDC_TXTEN); /* re-enable PDC transmit */ ++ } ++ else { ++ /* nothing left to transmit - disable the transmitter */ ++ UART_PUT_PTCR(port, ATMEL_PDC_TXTDIS); /* disable PDC transmit */ ++ UART_PUT_IDR(port, ATMEL_US_ENDTX | ATMEL_US_TXBUFE); ++ } ++} ++ ++/* + * Characters received (called from interrupt handler) + */ + static void atmel_rx_chars(struct uart_port *port) +@@ -361,6 +539,14 @@ + status = UART_GET_CSR(port); + pending = status & UART_GET_IMR(port); + while (pending) { ++ /* PDC receive */ ++ if (pending & ATMEL_US_ENDRX) ++ atmel_pdc_endrx(port); ++ if (pending & ATMEL_US_TIMEOUT) ++ atmel_pdc_timeout(port); ++ if (atmel_port->use_dma_rx && pending & (ATMEL_US_RXBRK | ATMEL_US_OVRE | ATMEL_US_FRAME | ATMEL_US_PARE)) ++ atmel_pdc_rxerr(port, pending); ++ + /* Interrupt receive */ + if (pending & ATMEL_US_RXRDY) + atmel_rx_chars(port); +@@ -385,6 +571,12 @@ + if (pending & (ATMEL_US_RIIC | ATMEL_US_DSRIC | ATMEL_US_DCDIC | ATMEL_US_CTSIC)) + wake_up_interruptible(&port->info->delta_msr_wait); + ++ /* PDC transmit */ ++ if (pending & ATMEL_US_ENDTX) ++ atmel_pdc_endtx(port); ++ if (pending & ATMEL_US_TXBUFE) ++ atmel_pdc_txbufe(port); ++ + /* Interrupt transmit */ + if (pending & ATMEL_US_TXRDY) + atmel_tx_chars(port); +@@ -403,6 +595,7 @@ + */ + static int atmel_startup(struct uart_port *port) + { ++ struct atmel_uart_port *atmel_port = (struct atmel_uart_port *) port; + int retval; + + /* +@@ -422,6 +615,47 @@ + } + + /* ++ * Initialize DMA (if necessary) ++ */ ++ if (atmel_port->use_dma_rx) { ++ int i; ++ ++ for (i = 0; i < 2; i++) { ++ struct atmel_dma_buffer *pdc = &atmel_port->pdc_rx[i]; ++ ++ pdc->buf = kmalloc(PDC_BUFFER_SIZE, GFP_KERNEL); ++ if (pdc->buf == NULL) { ++ if (i != 0) { ++ dma_unmap_single(port->dev, atmel_port->pdc_rx[0].dma_addr, PDC_BUFFER_SIZE, DMA_FROM_DEVICE); ++ kfree(atmel_port->pdc_rx[0].buf); ++ } ++ free_irq(port->irq, port); ++ return -ENOMEM; ++ } ++ pdc->dma_addr = dma_map_single(port->dev, pdc->buf, PDC_BUFFER_SIZE, DMA_FROM_DEVICE); ++ pdc->dma_size = PDC_BUFFER_SIZE; ++ pdc->ofs = 0; ++ } ++ ++ atmel_port->pdc_rx_idx = 0; ++ ++ UART_PUT_RPR(port, atmel_port->pdc_rx[0].dma_addr); ++ UART_PUT_RCR(port, PDC_BUFFER_SIZE); ++ ++ UART_PUT_RNPR(port, atmel_port->pdc_rx[1].dma_addr); ++ UART_PUT_RNCR(port, PDC_BUFFER_SIZE); ++ } ++ if (atmel_port->use_dma_tx) { ++ struct atmel_dma_buffer *pdc = &atmel_port->pdc_tx; ++ struct circ_buf *xmit = &port->info->xmit; ++ ++ pdc->buf = xmit->buf; ++ pdc->dma_addr = dma_map_single(port->dev, pdc->buf, SERIAL_XMIT_SIZE, DMA_TO_DEVICE); ++ pdc->dma_size = SERIAL_XMIT_SIZE; ++ pdc->ofs = 0; ++ } ++ ++ /* + * If there is a specific "open" function (to register + * control line interrupts) + */ +@@ -439,7 +673,15 @@ + UART_PUT_CR(port, ATMEL_US_RSTSTA | ATMEL_US_RSTRX); + UART_PUT_CR(port, ATMEL_US_TXEN | ATMEL_US_RXEN); /* enable xmit & rcvr */ + +- UART_PUT_IER(port, ATMEL_US_RXRDY); /* enable receive only */ ++ if (atmel_port->use_dma_rx) { ++ UART_PUT_RTOR(port, PDC_RX_TIMEOUT); /* set UART timeout */ ++ UART_PUT_CR(port, ATMEL_US_STTTO); ++ ++ UART_PUT_IER(port, ATMEL_US_ENDRX | ATMEL_US_TIMEOUT); ++ UART_PUT_PTCR(port, ATMEL_PDC_RXTEN); /* enable PDC controller */ ++ } ++ else ++ UART_PUT_IER(port, ATMEL_US_RXRDY); /* enable receive only */ + + return 0; + } +@@ -449,6 +691,33 @@ + */ + static void atmel_shutdown(struct uart_port *port) + { ++ struct atmel_uart_port *atmel_port = (struct atmel_uart_port *) port; ++ ++ /* ++ * Ensure everything is stopped. ++ */ ++ atmel_stop_rx(port); ++ atmel_stop_tx(port); ++ ++ /* ++ * Shut-down the DMA. ++ */ ++ if (atmel_port->use_dma_rx) { ++ int i; ++ ++ for (i = 0; i < 2; i++) { ++ struct atmel_dma_buffer *pdc = &atmel_port->pdc_rx[i]; ++ ++ dma_unmap_single(port->dev, pdc->dma_addr, pdc->dma_size, DMA_FROM_DEVICE); ++ kfree(pdc->buf); ++ } ++ } ++ if (atmel_port->use_dma_tx) { ++ struct atmel_dma_buffer *pdc = &atmel_port->pdc_tx; ++ ++ dma_unmap_single(port->dev, pdc->dma_addr, pdc->dma_size, DMA_TO_DEVICE); ++ } ++ + /* + * Disable all interrupts, port and break condition. + */ +@@ -500,6 +769,7 @@ + */ + static void atmel_set_termios(struct uart_port *port, struct ktermios * termios, struct ktermios * old) + { ++ struct atmel_uart_port *atmel_port = (struct atmel_uart_port *) port; + unsigned long flags; + unsigned int mode, imr, quot, baud; + +@@ -509,7 +779,7 @@ + baud = uart_get_baud_rate(port, termios, old, 0, port->uartclk/16); + quot = uart_get_divisor(port, baud); + +- if (quot > 65535) { /* BRGR is 16-bit, so switch to slower clock */ ++ if (quot > 65535) { /* BRGR is 16-bit, so switch to slower clock */ + quot /= 8; + mode |= ATMEL_US_USCLKS_MCK_DIV8; + } +@@ -558,6 +828,9 @@ + if (termios->c_iflag & (BRKINT | PARMRK)) + port->read_status_mask |= ATMEL_US_RXBRK; + ++ if (atmel_port->use_dma_rx) /* need to enable error interrupts */ ++ UART_PUT_IER(port, port->read_status_mask); ++ + /* + * Characters to ignore + */ +@@ -582,7 +855,8 @@ + /* 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) & ATMEL_US_TXEMPTY)) { barrier(); } ++ while (!(UART_GET_CSR(port) & ATMEL_US_TXEMPTY)) ++ cpu_relax(); + + /* disable receiver and transmitter */ + UART_PUT_CR(port, ATMEL_US_TXDIS | ATMEL_US_RXDIS); +@@ -736,6 +1010,13 @@ + clk_enable(atmel_port->clk); + port->uartclk = clk_get_rate(atmel_port->clk); + } ++ ++#ifdef SUPPORT_PDC ++ atmel_port->use_dma_rx = data->use_dma_rx; ++ atmel_port->use_dma_tx = data->use_dma_tx; ++ if (atmel_port->use_dma_tx) ++ port->fifosize = PDC_BUFFER_SIZE; ++#endif + } + + /* +@@ -760,7 +1041,7 @@ + static void atmel_console_putchar(struct uart_port *port, int ch) + { + while (!(UART_GET_CSR(port) & ATMEL_US_TXRDY)) +- barrier(); ++ cpu_relax(); + UART_PUT_CHAR(port, ch); + } + +@@ -798,13 +1079,13 @@ + { + unsigned int mr, quot; + +-// TODO: CR is a write-only register +-// unsigned int cr; +-// +-// cr = UART_GET_CR(port) & (ATMEL_US_RXEN | ATMEL_US_TXEN); +-// if (cr == (ATMEL_US_RXEN | ATMEL_US_TXEN)) { +-// /* ok, the port was enabled */ +-// } ++ /* ++ * If the baud rate generator isn't running, the port wasn't ++ * initialized by the boot loader. ++ */ ++ quot = UART_GET_BRGR(port); ++ if (!quot) ++ return; + + mr = UART_GET_MR(port) & ATMEL_US_CHRL; + if (mr == ATMEL_US_CHRL_8) +@@ -824,7 +1105,6 @@ + * lower than one of those, as it would make us fall through + * to a much lower baud rate than we really want. + */ +- quot = UART_GET_BRGR(port); + *baud = port->uartclk / (16 * (quot - 1)); + } + +@@ -912,7 +1192,8 @@ + struct uart_port *port = platform_get_drvdata(pdev); + struct atmel_uart_port *atmel_port = (struct atmel_uart_port *) port; + +- if (device_may_wakeup(&pdev->dev) && !at91_suspend_entering_slow_clock()) ++ if (device_may_wakeup(&pdev->dev) ++ && !clk_must_disable(atmel_port->clk)) + enable_irq_wake(port->irq); + else { + uart_suspend_port(&atmel_uart, port); +diff -urN -x CVS linux-2.6.24/drivers/serial/atmel_serial.h linux-2.6/drivers/serial/atmel_serial.h +--- linux-2.6.24/drivers/serial/atmel_serial.h 2007-10-09 22:31:38.000000000 +0200 ++++ linux-2.6/drivers/serial/atmel_serial.h 1970-01-01 02:00:00.000000000 +0200 +@@ -1,127 +0,0 @@ +-/* +- * drivers/serial/atmel_serial.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 ATMEL_SERIAL_H +-#define ATMEL_SERIAL_H +- +-#define ATMEL_US_CR 0x00 /* Control Register */ +-#define ATMEL_US_RSTRX (1 << 2) /* Reset Receiver */ +-#define ATMEL_US_RSTTX (1 << 3) /* Reset Transmitter */ +-#define ATMEL_US_RXEN (1 << 4) /* Receiver Enable */ +-#define ATMEL_US_RXDIS (1 << 5) /* Receiver Disable */ +-#define ATMEL_US_TXEN (1 << 6) /* Transmitter Enable */ +-#define ATMEL_US_TXDIS (1 << 7) /* Transmitter Disable */ +-#define ATMEL_US_RSTSTA (1 << 8) /* Reset Status Bits */ +-#define ATMEL_US_STTBRK (1 << 9) /* Start Break */ +-#define ATMEL_US_STPBRK (1 << 10) /* Stop Break */ +-#define ATMEL_US_STTTO (1 << 11) /* Start Time-out */ +-#define ATMEL_US_SENDA (1 << 12) /* Send Address */ +-#define ATMEL_US_RSTIT (1 << 13) /* Reset Iterations */ +-#define ATMEL_US_RSTNACK (1 << 14) /* Reset Non Acknowledge */ +-#define ATMEL_US_RETTO (1 << 15) /* Rearm Time-out */ +-#define ATMEL_US_DTREN (1 << 16) /* Data Terminal Ready Enable [AT91RM9200 only] */ +-#define ATMEL_US_DTRDIS (1 << 17) /* Data Terminal Ready Disable [AT91RM9200 only] */ +-#define ATMEL_US_RTSEN (1 << 18) /* Request To Send Enable */ +-#define ATMEL_US_RTSDIS (1 << 19) /* Request To Send Disable */ +- +-#define ATMEL_US_MR 0x04 /* Mode Register */ +-#define ATMEL_US_USMODE (0xf << 0) /* Mode of the USART */ +-#define ATMEL_US_USMODE_NORMAL 0 +-#define ATMEL_US_USMODE_RS485 1 +-#define ATMEL_US_USMODE_HWHS 2 +-#define ATMEL_US_USMODE_MODEM 3 +-#define ATMEL_US_USMODE_ISO7816_T0 4 +-#define ATMEL_US_USMODE_ISO7816_T1 6 +-#define ATMEL_US_USMODE_IRDA 8 +-#define ATMEL_US_USCLKS (3 << 4) /* Clock Selection */ +-#define ATMEL_US_USCLKS_MCK (0 << 4) +-#define ATMEL_US_USCLKS_MCK_DIV8 (1 << 4) +-#define ATMEL_US_USCLKS_SCK (3 << 4) +-#define ATMEL_US_CHRL (3 << 6) /* Character Length */ +-#define ATMEL_US_CHRL_5 (0 << 6) +-#define ATMEL_US_CHRL_6 (1 << 6) +-#define ATMEL_US_CHRL_7 (2 << 6) +-#define ATMEL_US_CHRL_8 (3 << 6) +-#define ATMEL_US_SYNC (1 << 8) /* Synchronous Mode Select */ +-#define ATMEL_US_PAR (7 << 9) /* Parity Type */ +-#define ATMEL_US_PAR_EVEN (0 << 9) +-#define ATMEL_US_PAR_ODD (1 << 9) +-#define ATMEL_US_PAR_SPACE (2 << 9) +-#define ATMEL_US_PAR_MARK (3 << 9) +-#define ATMEL_US_PAR_NONE (4 << 9) +-#define ATMEL_US_PAR_MULTI_DROP (6 << 9) +-#define ATMEL_US_NBSTOP (3 << 12) /* Number of Stop Bits */ +-#define ATMEL_US_NBSTOP_1 (0 << 12) +-#define ATMEL_US_NBSTOP_1_5 (1 << 12) +-#define ATMEL_US_NBSTOP_2 (2 << 12) +-#define ATMEL_US_CHMODE (3 << 14) /* Channel Mode */ +-#define ATMEL_US_CHMODE_NORMAL (0 << 14) +-#define ATMEL_US_CHMODE_ECHO (1 << 14) +-#define ATMEL_US_CHMODE_LOC_LOOP (2 << 14) +-#define ATMEL_US_CHMODE_REM_LOOP (3 << 14) +-#define ATMEL_US_MSBF (1 << 16) /* Bit Order */ +-#define ATMEL_US_MODE9 (1 << 17) /* 9-bit Character Length */ +-#define ATMEL_US_CLKO (1 << 18) /* Clock Output Select */ +-#define ATMEL_US_OVER (1 << 19) /* Oversampling Mode */ +-#define ATMEL_US_INACK (1 << 20) /* Inhibit Non Acknowledge */ +-#define ATMEL_US_DSNACK (1 << 21) /* Disable Successive NACK */ +-#define ATMEL_US_MAX_ITER (7 << 24) /* Max Iterations */ +-#define ATMEL_US_FILTER (1 << 28) /* Infrared Receive Line Filter */ +- +-#define ATMEL_US_IER 0x08 /* Interrupt Enable Register */ +-#define ATMEL_US_RXRDY (1 << 0) /* Receiver Ready */ +-#define ATMEL_US_TXRDY (1 << 1) /* Transmitter Ready */ +-#define ATMEL_US_RXBRK (1 << 2) /* Break Received / End of Break */ +-#define ATMEL_US_ENDRX (1 << 3) /* End of Receiver Transfer */ +-#define ATMEL_US_ENDTX (1 << 4) /* End of Transmitter Transfer */ +-#define ATMEL_US_OVRE (1 << 5) /* Overrun Error */ +-#define ATMEL_US_FRAME (1 << 6) /* Framing Error */ +-#define ATMEL_US_PARE (1 << 7) /* Parity Error */ +-#define ATMEL_US_TIMEOUT (1 << 8) /* Receiver Time-out */ +-#define ATMEL_US_TXEMPTY (1 << 9) /* Transmitter Empty */ +-#define ATMEL_US_ITERATION (1 << 10) /* Max number of Repetitions Reached */ +-#define ATMEL_US_TXBUFE (1 << 11) /* Transmission Buffer Empty */ +-#define ATMEL_US_RXBUFF (1 << 12) /* Reception Buffer Full */ +-#define ATMEL_US_NACK (1 << 13) /* Non Acknowledge */ +-#define ATMEL_US_RIIC (1 << 16) /* Ring Indicator Input Change [AT91RM9200 only] */ +-#define ATMEL_US_DSRIC (1 << 17) /* Data Set Ready Input Change [AT91RM9200 only] */ +-#define ATMEL_US_DCDIC (1 << 18) /* Data Carrier Detect Input Change [AT91RM9200 only] */ +-#define ATMEL_US_CTSIC (1 << 19) /* Clear to Send Input Change */ +-#define ATMEL_US_RI (1 << 20) /* RI */ +-#define ATMEL_US_DSR (1 << 21) /* DSR */ +-#define ATMEL_US_DCD (1 << 22) /* DCD */ +-#define ATMEL_US_CTS (1 << 23) /* CTS */ +- +-#define ATMEL_US_IDR 0x0c /* Interrupt Disable Register */ +-#define ATMEL_US_IMR 0x10 /* Interrupt Mask Register */ +-#define ATMEL_US_CSR 0x14 /* Channel Status Register */ +-#define ATMEL_US_RHR 0x18 /* Receiver Holding Register */ +-#define ATMEL_US_THR 0x1c /* Transmitter Holding Register */ +-#define ATMEL_US_SYNH (1 << 15) /* Transmit/Receive Sync [AT91SAM9261 only] */ +- +-#define ATMEL_US_BRGR 0x20 /* Baud Rate Generator Register */ +-#define ATMEL_US_CD (0xffff << 0) /* Clock Divider */ +- +-#define ATMEL_US_RTOR 0x24 /* Receiver Time-out Register */ +-#define ATMEL_US_TO (0xffff << 0) /* Time-out Value */ +- +-#define ATMEL_US_TTGR 0x28 /* Transmitter Timeguard Register */ +-#define ATMEL_US_TG (0xff << 0) /* Timeguard Value */ +- +-#define ATMEL_US_FIDI 0x40 /* FI DI Ratio Register */ +-#define ATMEL_US_NER 0x44 /* Number of Errors Register */ +-#define ATMEL_US_IF 0x4c /* IrDA Filter Register */ +- +-#endif +diff -urN -x CVS linux-2.6.24/drivers/spi/Kconfig linux-2.6/drivers/spi/Kconfig +--- linux-2.6.24/drivers/spi/Kconfig 2008-03-01 22:02:13.000000000 +0200 ++++ linux-2.6/drivers/spi/Kconfig 2007-12-31 10:44:31.000000000 +0200 +@@ -100,6 +100,15 @@ + inexpensive battery powered microcontroller evaluation board. + This same cable can be used to flash new firmware. + ++config SPI_AT91 ++ tristate "AT91RM9200 Bitbang SPI Master" ++ depends on SPI_MASTER && ARCH_AT91RM9200 && !SPI_ATMEL && EXPERIMENTAL ++ select SPI_BITBANG ++ help ++ This is dumb PIO bitbanging driver for the Atmel AT91RM9200. ++ The SPI_ATMEL driver will be its replacement, using the native ++ SPI hardware and its DMA controller. ++ + config SPI_IMX + tristate "Freescale iMX SPI controller" + depends on SPI_MASTER && ARCH_IMX && EXPERIMENTAL +diff -urN -x CVS linux-2.6.24/drivers/spi/Makefile linux-2.6/drivers/spi/Makefile +--- linux-2.6.24/drivers/spi/Makefile 2007-10-09 22:31:38.000000000 +0200 ++++ linux-2.6/drivers/spi/Makefile 2007-12-31 10:44:31.000000000 +0200 +@@ -27,6 +27,7 @@ + obj-$(CONFIG_SPI_S3C24XX) += spi_s3c24xx.o + obj-$(CONFIG_SPI_TXX9) += spi_txx9.o + obj-$(CONFIG_SPI_XILINX) += xilinx_spi.o ++obj-$(CONFIG_SPI_AT91) += spi_at91_bitbang.o + # ... add above this line ... + + # SPI protocol drivers (device/link on bus) +diff -urN -x CVS linux-2.6.24/drivers/spi/spi_at91_bitbang.c linux-2.6/drivers/spi/spi_at91_bitbang.c +--- linux-2.6.24/drivers/spi/spi_at91_bitbang.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-2.6/drivers/spi/spi_at91_bitbang.c 2007-12-31 15:18:43.000000000 +0200 +@@ -0,0 +1,207 @@ ++/* ++ * at91_spi.c - at91 SPI driver (BOOTSTRAP/BITBANG VERSION) ++ * ++ * Copyright (C) 2006 David Brownell ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ++ */ ++#include <linux/kernel.h> ++#include <linux/init.h> ++#include <linux/platform_device.h> ++ ++#include <linux/spi/spi.h> ++#include <linux/spi/spi_bitbang.h> ++ ++#include <asm/arch/gpio.h> ++ ++ ++/* ++ * FIXME this bitbanging version is just to help bootstrap systems until ++ * there's a native SPI+IRQ+DMA controller driver ... such a driver should ++ * be a drop-in replacement for this one, and much faster. ++ * ++ * remember: ++ * ++ * - other at91 parts (like at91sam9) have multiple controllers ++ * and different pin muxing; this version is at91rm9200 specfic. ++ * ++ * - at91sam9261 SPI0 pins are directly muxed with MMC/SD pins. ++ * ++ * - rm9200 spi chipselects drop wrongly, so the native driver ++ * will need to use gpios much like this does. ++ * ++ * - real hardware only allows 8..16 bits per word, while this ++ * bitbanger allows 1..32 (incompatible superset). ++ * ++ * - this disregards clock parameters. with inlined gpio calls, ++ * gcc 3.4.4 produces about 1.5 mbit/sec, more than 2x faster ++ * than using the subroutined veresion from txrx_word(). ++ * ++ * - suspend/resume and <linux/clk.h> support is missing ... ++ */ ++ ++#define spi_miso_bit AT91_PIN_PA0 ++#define spi_mosi_bit AT91_PIN_PA1 ++#define spi_sck_bit AT91_PIN_PA2 ++ ++struct at91_spi { ++ struct spi_bitbang bitbang; ++ struct platform_device *pdev; ++}; ++ ++/*----------------------------------------------------------------------*/ ++ ++static inline void setsck(struct spi_device *spi, int is_on) ++{ ++ at91_set_gpio_value(spi_sck_bit, is_on); ++} ++ ++static inline void setmosi(struct spi_device *spi, int is_on) ++{ ++ at91_set_gpio_value(spi_mosi_bit, is_on); ++} ++ ++static inline int getmiso(struct spi_device *spi) ++{ ++ return at91_get_gpio_value(spi_miso_bit); ++} ++ ++static void at91_spi_chipselect(struct spi_device *spi, int is_active) ++{ ++ unsigned long cs = (unsigned long) spi->controller_data; ++ ++ /* set default clock polarity */ ++ if (is_active) ++ setsck(spi, spi->mode & SPI_CPOL); ++ ++ /* only support active-low (default) */ ++ at91_set_gpio_value(cs, !is_active); ++} ++ ++/* ++ * NOTE: this is "as fast as we can"; it should be a function of ++ * the device clock ... ++ */ ++#define spidelay(X) do{} while(0) ++ ++#define EXPAND_BITBANG_TXRX ++#include <linux/spi/spi_bitbang.h> ++ ++static u32 at91_spi_txrx_word_mode0(struct spi_device *spi, ++ unsigned nsecs, u32 word, u8 bits) ++{ ++ return bitbang_txrx_be_cpha0(spi, nsecs, 0, word, 8); ++} ++ ++static u32 at91_spi_txrx_word_mode1(struct spi_device *spi, ++ unsigned nsecs, u32 word, u8 bits) ++{ ++ return bitbang_txrx_be_cpha1(spi, nsecs, 0, word, 8); ++} ++ ++static u32 at91_spi_txrx_word_mode2(struct spi_device *spi, ++ unsigned nsecs, u32 word, u8 bits) ++{ ++ return bitbang_txrx_be_cpha0(spi, nsecs, 1, word, 8); ++} ++ ++static u32 at91_spi_txrx_word_mode3(struct spi_device *spi, ++ unsigned nsecs, u32 word, u8 bits) ++{ ++ return bitbang_txrx_be_cpha1(spi, nsecs, 1, word, 8); ++} ++ ++/*----------------------------------------------------------------------*/ ++ ++static int __init at91_spi_probe(struct platform_device *pdev) ++{ ++ int status; ++ struct spi_master *master; ++ struct at91_spi *at91_spi; ++ ++ if (pdev->id != 0) /* SPI0 bus */ ++ return -EINVAL; ++ ++ master = spi_alloc_master(&pdev->dev, sizeof *at91_spi); ++ if (!master) ++ return -ENOMEM; ++ ++ at91_spi = spi_master_get_devdata(master); ++ at91_spi->pdev = pdev; ++ platform_set_drvdata(pdev, at91_spi); ++ ++ /* SPI and bitbang hookup */ ++ master->bus_num = 0; ++ master->num_chipselect = 4; ++ ++ at91_spi->bitbang.master = spi_master_get(master); ++ at91_spi->bitbang.chipselect = at91_spi_chipselect; ++ at91_spi->bitbang.txrx_word[SPI_MODE_0] = at91_spi_txrx_word_mode0; ++ at91_spi->bitbang.txrx_word[SPI_MODE_1] = at91_spi_txrx_word_mode1; ++ at91_spi->bitbang.txrx_word[SPI_MODE_2] = at91_spi_txrx_word_mode2; ++ at91_spi->bitbang.txrx_word[SPI_MODE_3] = at91_spi_txrx_word_mode3; ++ ++ status = spi_bitbang_start(&at91_spi->bitbang); ++ if (status < 0) ++ (void) spi_master_put(at91_spi->bitbang.master); ++ ++ return status; ++} ++ ++static int __exit at91_spi_remove(struct platform_device *pdev) ++{ ++ struct at91_spi *at91_spi = platform_get_drvdata(pdev); ++ int status; ++ ++ /* stop() unregisters child devices too */ ++ status = spi_bitbang_stop(&at91_spi->bitbang); ++ (void) spi_master_put(at91_spi->bitbang.master); ++ ++ platform_set_drvdata(pdev, NULL); ++ return status; ++} ++ ++static struct platform_driver at91_spi_driver = { ++ .probe = at91_spi_probe, ++ .remove = __exit_p(at91_spi_remove), ++ .driver = { ++ .name = "at91_spi", ++ .owner = THIS_MODULE, ++ }, ++}; ++ ++static int __init at91_spi_init(void) ++{ ++ at91_set_gpio_output(spi_sck_bit, 0); ++ at91_set_gpio_output(spi_mosi_bit, 0); ++ at91_set_gpio_input(spi_miso_bit, 1 /* pullup */); ++ ++ /* register driver */ ++ return platform_driver_register(&at91_spi_driver); ++} ++ ++static void __exit at91_spi_exit(void) ++{ ++ platform_driver_unregister(&at91_spi_driver); ++} ++ ++device_initcall(at91_spi_init); ++module_exit(at91_spi_exit); ++ ++MODULE_ALIAS("at91_spi.0"); ++ ++MODULE_DESCRIPTION("AT91 SPI support (BOOTSTRAP/BITBANG VERSION)"); ++MODULE_AUTHOR("David Brownell"); ++MODULE_LICENSE("GPL"); +diff -urN -x CVS linux-2.6.24/drivers/usb/gadget/Kconfig linux-2.6/drivers/usb/gadget/Kconfig +--- linux-2.6.24/drivers/usb/gadget/Kconfig 2008-03-01 22:02:13.000000000 +0200 ++++ linux-2.6/drivers/usb/gadget/Kconfig 2008-01-16 20:26:55.000000000 +0200 +@@ -308,7 +308,7 @@ + + config USB_GADGET_AT91 + boolean "AT91 USB Device Port" +- depends on ARCH_AT91 && !ARCH_AT91SAM9RL ++ depends on ARCH_AT91 && !ARCH_AT91SAM9RL && !ARCH_AT91CAP9 + select USB_GADGET_SELECTED + help + Many Atmel AT91 processors (such as the AT91RM2000) have a +diff -urN -x CVS linux-2.6.24/drivers/usb/gadget/at91_udc.c linux-2.6/drivers/usb/gadget/at91_udc.c +--- linux-2.6.24/drivers/usb/gadget/at91_udc.c 2008-03-01 22:02:13.000000000 +0200 ++++ linux-2.6/drivers/usb/gadget/at91_udc.c 2007-12-31 10:44:31.000000000 +0200 +@@ -1784,7 +1784,7 @@ + */ + if ((!udc->suspended && udc->addr) + || !wake +- || at91_suspend_entering_slow_clock()) { ++ || clk_must_disable(udc->fclk)) { + pullup(udc, 0); + wake = 0; + } else +diff -urN -x CVS linux-2.6.24/drivers/usb/host/ohci-at91.c linux-2.6/drivers/usb/host/ohci-at91.c +--- linux-2.6.24/drivers/usb/host/ohci-at91.c 2007-10-09 22:31:38.000000000 +0200 ++++ linux-2.6/drivers/usb/host/ohci-at91.c 2007-12-31 14:05:15.000000000 +0200 +@@ -299,7 +299,7 @@ + * + * REVISIT: some boards will be able to turn VBUS off... + */ +- if (at91_suspend_entering_slow_clock()) { ++ if (clk_must_disable(fclk)) { + ohci_usb_reset (ohci); + at91_stop_clock(); + } +diff -urN -x CVS linux-2.6.24/drivers/video/Kconfig linux-2.6/drivers/video/Kconfig +--- linux-2.6.24/drivers/video/Kconfig 2008-03-01 22:02:13.000000000 +0200 ++++ linux-2.6/drivers/video/Kconfig 2008-01-16 21:25:17.000000000 +0200 +@@ -876,6 +876,17 @@ + framebuffer. Product specs at + <http://www.erd.epson.com/vdc/html/products.htm>. + ++config FB_S1D15605 ++ tristate "Epson S1D15605 framebuffer support" ++ depends on FB ++ default m if MACH_KB9200 ++ select FB_CFB_FILLRECT ++ select FB_CFB_COPYAREA ++ select FB_CFB_IMAGEBLIT ++ help ++ Build in support for the S1D15605 Epson Research 128x64 ++ LCD controller as a framebuffer. ++ + config FB_S1D13XXX + tristate "Epson S1D13XXX framebuffer support" + depends on FB +@@ -889,7 +900,7 @@ + + config FB_ATMEL + tristate "AT91/AT32 LCD Controller support" +- depends on FB && (ARCH_AT91SAM9261 || ARCH_AT91SAM9263 || AVR32) ++ depends on FB && (ARCH_AT91SAM9261 || ARCH_AT91SAM9263 || ARCH_AT91SAM9RL || ARCH_AT91CAP9 || AVR32) + select FB_CFB_FILLRECT + select FB_CFB_COPYAREA + select FB_CFB_IMAGEBLIT +diff -urN -x CVS linux-2.6.24/drivers/video/Makefile linux-2.6/drivers/video/Makefile +--- linux-2.6.24/drivers/video/Makefile 2008-03-01 22:02:13.000000000 +0200 ++++ linux-2.6/drivers/video/Makefile 2007-12-31 10:44:31.000000000 +0200 +@@ -87,7 +87,8 @@ + obj-$(CONFIG_FB_SA1100) += sa1100fb.o + obj-$(CONFIG_FB_HIT) += hitfb.o + obj-$(CONFIG_FB_EPSON1355) += epson1355fb.o +-obj-$(CONFIG_FB_ATMEL) += atmel_lcdfb.o ++obj-$(CONFIG_FB_S1D15605) += s1d15605fb.o ++obj-$(CONFIG_FB_ATMEL) += atmel_lcdfb.o + obj-$(CONFIG_FB_PVR2) += pvr2fb.o + obj-$(CONFIG_FB_VOODOO1) += sstfb.o + obj-$(CONFIG_FB_ARMCLCD) += amba-clcd.o +diff -urN -x CVS linux-2.6.24/drivers/video/atmel_lcdfb.c linux-2.6/drivers/video/atmel_lcdfb.c +--- linux-2.6.24/drivers/video/atmel_lcdfb.c 2008-03-01 22:02:13.000000000 +0200 ++++ linux-2.6/drivers/video/atmel_lcdfb.c 2008-02-25 22:42:48.000000000 +0200 +@@ -16,6 +16,7 @@ + #include <linux/fb.h> + #include <linux/init.h> + #include <linux/delay.h> ++#include <linux/backlight.h> + + #include <asm/arch/board.h> + #include <asm/arch/cpu.h> +@@ -30,7 +31,7 @@ + #define ATMEL_LCDC_CVAL_DEFAULT 0xc8 + #define ATMEL_LCDC_DMA_BURST_LEN 8 + +-#if defined(CONFIG_ARCH_AT91SAM9263) ++#if defined(CONFIG_ARCH_AT91SAM9263) || defined(CONFIG_ARCH_AT91CAP9) + #define ATMEL_LCDC_FIFO_SIZE 2048 + #else + #define ATMEL_LCDC_FIFO_SIZE 512 +@@ -69,6 +70,107 @@ + } + #endif + ++static const u32 contrast_ctr = ATMEL_LCDC_PS_DIV8 ++ | ATMEL_LCDC_POL_POSITIVE ++ | ATMEL_LCDC_ENA_PWMENABLE; ++ ++#ifdef CONFIG_BACKLIGHT_ATMEL_LCDC ++ ++/* some bl->props field just changed */ ++static int atmel_bl_update_status(struct backlight_device *bl) ++{ ++ struct atmel_lcdfb_info *sinfo = bl_get_data(bl); ++ int power = sinfo->bl_power; ++ int brightness = bl->props.brightness; ++ ++ /* REVISIT there may be a meaningful difference between ++ * fb_blank and power ... there seem to be some cases ++ * this doesn't handle correctly. ++ */ ++ if (bl->props.fb_blank != sinfo->bl_power) ++ power = bl->props.fb_blank; ++ else if (bl->props.power != sinfo->bl_power) ++ power = bl->props.power; ++ ++ if (brightness < 0 && power == FB_BLANK_UNBLANK) ++ brightness = lcdc_readl(sinfo, ATMEL_LCDC_CONTRAST_VAL); ++ else if (power != FB_BLANK_UNBLANK) ++ brightness = 0; ++ ++ lcdc_writel(sinfo, ATMEL_LCDC_CONTRAST_VAL, brightness); ++ lcdc_writel(sinfo, ATMEL_LCDC_CONTRAST_CTR, ++ brightness ? contrast_ctr : 0); ++ ++ bl->props.fb_blank = bl->props.power = sinfo->bl_power = power; ++ ++ return 0; ++} ++ ++static int atmel_bl_get_brightness(struct backlight_device *bl) ++{ ++ struct atmel_lcdfb_info *sinfo = bl_get_data(bl); ++ ++ return lcdc_readl(sinfo, ATMEL_LCDC_CONTRAST_VAL); ++} ++ ++static struct backlight_ops atmel_lcdc_bl_ops = { ++ .update_status = atmel_bl_update_status, ++ .get_brightness = atmel_bl_get_brightness, ++}; ++ ++static void init_backlight(struct atmel_lcdfb_info *sinfo) ++{ ++ struct backlight_device *bl; ++ ++ sinfo->bl_power = FB_BLANK_UNBLANK; ++ ++ if (sinfo->backlight) ++ return; ++ ++ bl = backlight_device_register("backlight", &sinfo->pdev->dev, ++ sinfo, &atmel_lcdc_bl_ops); ++ if (IS_ERR(sinfo->backlight)) { ++ dev_err(&sinfo->pdev->dev, "error %ld on backlight register\n", ++ PTR_ERR(bl)); ++ return; ++ } ++ sinfo->backlight = bl; ++ ++ bl->props.power = FB_BLANK_UNBLANK; ++ bl->props.fb_blank = FB_BLANK_UNBLANK; ++ bl->props.max_brightness = 0xff; ++ bl->props.brightness = atmel_bl_get_brightness(bl); ++} ++ ++static void exit_backlight(struct atmel_lcdfb_info *sinfo) ++{ ++ if (sinfo->backlight) ++ backlight_device_unregister(sinfo->backlight); ++} ++ ++#else ++ ++static void init_backlight(struct atmel_lcdfb_info *sinfo) ++{ ++ dev_warn(&sinfo->pdev->dev, "backlight control is not available\n"); ++} ++ ++static void exit_backlight(struct atmel_lcdfb_info *sinfo) ++{ ++} ++ ++#endif ++ ++static void init_contrast(struct atmel_lcdfb_info *sinfo) ++{ ++ /* have some default contrast/backlight settings */ ++ lcdc_writel(sinfo, ATMEL_LCDC_CONTRAST_CTR, contrast_ctr); ++ lcdc_writel(sinfo, ATMEL_LCDC_CONTRAST_VAL, ATMEL_LCDC_CVAL_DEFAULT); ++ ++ if (sinfo->lcdcon_is_backlight) ++ init_backlight(sinfo); ++} ++ + + static struct fb_fix_screeninfo atmel_lcdfb_fix __initdata = { + .type = FB_TYPE_PACKED_PIXELS, +@@ -370,10 +472,6 @@ + /* Disable all interrupts */ + lcdc_writel(sinfo, ATMEL_LCDC_IDR, ~0UL); + +- /* Set contrast */ +- value = ATMEL_LCDC_PS_DIV8 | ATMEL_LCDC_POL_POSITIVE | ATMEL_LCDC_ENA_PWMENABLE; +- lcdc_writel(sinfo, ATMEL_LCDC_CONTRAST_CTR, value); +- lcdc_writel(sinfo, ATMEL_LCDC_CONTRAST_VAL, ATMEL_LCDC_CVAL_DEFAULT); + /* ...wait for DMA engine to become idle... */ + while (lcdc_readl(sinfo, ATMEL_LCDC_DMACON) & ATMEL_LCDC_DMABUSY) + msleep(10); +@@ -577,6 +675,7 @@ + sinfo->default_monspecs = pdata_sinfo->default_monspecs; + sinfo->atmel_lcdfb_power_control = pdata_sinfo->atmel_lcdfb_power_control; + sinfo->guard_time = pdata_sinfo->guard_time; ++ sinfo->lcdcon_is_backlight = pdata_sinfo->lcdcon_is_backlight; + } else { + dev_err(dev, "cannot get default configuration\n"); + goto free_info; +@@ -670,6 +769,9 @@ + goto release_mem; + } + ++ /* Initialize PWM for contrast or backlight ("off") */ ++ init_contrast(sinfo); ++ + /* interrupt */ + ret = request_irq(sinfo->irq_base, atmel_lcdfb_interrupt, 0, pdev->name, info); + if (ret) { +@@ -721,6 +823,7 @@ + unregister_irqs: + free_irq(sinfo->irq_base, info); + unmap_mmio: ++ exit_backlight(sinfo); + iounmap(sinfo->mmio); + release_mem: + release_mem_region(info->fix.mmio_start, info->fix.mmio_len); +@@ -755,6 +858,7 @@ + if (!sinfo) + return 0; + ++ exit_backlight(sinfo); + if (sinfo->atmel_lcdfb_power_control) + sinfo->atmel_lcdfb_power_control(0); + unregister_framebuffer(info); +@@ -779,8 +883,45 @@ + return 0; + } + ++#ifdef CONFIG_PM ++ ++static int atmel_lcdfb_suspend(struct platform_device *pdev, pm_message_t mesg) ++{ ++ struct fb_info *info = platform_get_drvdata(pdev); ++ struct atmel_lcdfb_info *sinfo = info->par; ++ ++ sinfo->saved_lcdcon = lcdc_readl(sinfo, ATMEL_LCDC_CONTRAST_VAL); ++ lcdc_writel(sinfo, ATMEL_LCDC_CONTRAST_CTR, 0); ++ if (sinfo->atmel_lcdfb_power_control) ++ sinfo->atmel_lcdfb_power_control(0); ++ atmel_lcdfb_stop_clock(sinfo); ++ ++ return 0; ++} ++ ++static int atmel_lcdfb_resume(struct platform_device *pdev) ++{ ++ struct fb_info *info = platform_get_drvdata(pdev); ++ struct atmel_lcdfb_info *sinfo = info->par; ++ ++ atmel_lcdfb_start_clock(sinfo); ++ if (sinfo->atmel_lcdfb_power_control) ++ sinfo->atmel_lcdfb_power_control(1); ++ lcdc_writel(sinfo, ATMEL_LCDC_CONTRAST_CTR, sinfo->saved_lcdcon); ++ ++ return 0; ++} ++ ++#else ++#define atmel_lcdfb_suspend NULL ++#define atmel_lcdfb_resume NULL ++#endif ++ ++ + static struct platform_driver atmel_lcdfb_driver = { + .remove = __exit_p(atmel_lcdfb_remove), ++ .suspend = atmel_lcdfb_suspend, ++ .resume = atmel_lcdfb_resume, + .driver = { + .name = "atmel_lcdfb", + .owner = THIS_MODULE, +diff -urN -x CVS linux-2.6.24/drivers/video/backlight/Kconfig linux-2.6/drivers/video/backlight/Kconfig +--- linux-2.6.24/drivers/video/backlight/Kconfig 2008-03-01 22:02:14.000000000 +0200 ++++ linux-2.6/drivers/video/backlight/Kconfig 2008-02-25 22:42:48.000000000 +0200 +@@ -50,6 +50,19 @@ + To have support for your specific LCD panel you will have to + select the proper drivers which depend on this option. + ++config BACKLIGHT_ATMEL_LCDC ++ bool "Atmel LCDC Contrast-as-Backlight control" ++ depends on BACKLIGHT_CLASS_DEVICE && FB_ATMEL ++ default y if MACH_SAM9261EK || MACH_SAM9263EK ++ help ++ This provides a backlight control internal to the Atmel LCDC ++ driver. If the LCD "contrast control" on your board is wired ++ so it controls the backlight brightness, select this option to ++ export this as a PWM-based backlight control. ++ ++ If in doubt, it's safe to enable this option; it doesn't kick ++ in unless the board's description says it's wired that way. ++ + config BACKLIGHT_CORGI + tristate "Generic (aka Sharp Corgi) Backlight Driver" + depends on BACKLIGHT_CLASS_DEVICE +@@ -90,3 +103,11 @@ + help + If you have a Intel LE80578 (Carillo Ranch) say Y to enable the + backlight driver. ++ ++config BACKLIGHT_KB920x ++ tristate "KwikByte KB9202 Backlight Driver" ++ depends on BACKLIGHT_CLASS_DEVICE && MACH_KB9200 ++ default y ++ help ++ If you have a KwikByte KB9202 board, say Y to enable the ++ backlight driver. +diff -urN -x CVS linux-2.6.24/drivers/video/backlight/Makefile linux-2.6/drivers/video/backlight/Makefile +--- linux-2.6.24/drivers/video/backlight/Makefile 2008-03-01 22:02:14.000000000 +0200 ++++ linux-2.6/drivers/video/backlight/Makefile 2007-12-31 10:44:34.000000000 +0200 +@@ -9,3 +9,4 @@ + obj-$(CONFIG_BACKLIGHT_LOCOMO) += locomolcd.o + obj-$(CONFIG_BACKLIGHT_PROGEAR) += progear_bl.o + obj-$(CONFIG_BACKLIGHT_CARILLO_RANCH) += cr_bllcd.o ++obj-$(CONFIG_BACKLIGHT_KB920x) += kb920x_bl.o +diff -urN -x CVS linux-2.6.24/drivers/video/backlight/kb920x_bl.c linux-2.6/drivers/video/backlight/kb920x_bl.c +--- linux-2.6.24/drivers/video/backlight/kb920x_bl.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-2.6/drivers/video/backlight/kb920x_bl.c 2007-12-31 10:44:34.000000000 +0200 +@@ -0,0 +1,164 @@ ++/* ++ * Backlight Driver for KB9202 ++ * ++ * Copyright (c) 2006 KwikByte ++ * ++ * Based on Sharp's Corgi Backlight Driver ++ * ++ * This file is subject to the terms and conditions of the GNU General Public ++ * License. See the file "COPYING" in the main directory of this archive ++ * for more details. ++ */ ++ ++#include <linux/module.h> ++#include <linux/kernel.h> ++#include <linux/init.h> ++#include <linux/platform_device.h> ++#include <linux/spinlock.h> ++#include <linux/fb.h> ++#include <linux/backlight.h> ++ ++#include <asm/arch/gpio.h> ++ ++/* The backlight is on(1)/off(0) */ ++#define KB9202_DEFAULT_INTENSITY 1 ++#define KB9202_MAX_INTENSITY 1 ++ ++static int kb9202bl_suspended; ++static int current_intensity = 0; ++static DEFINE_SPINLOCK(bl_lock); ++ ++static int kb9202bl_set_intensity(struct backlight_device *bd) ++{ ++ unsigned long flags; ++ int intensity = bd->props.brightness; ++ ++ if (bd->props.power != FB_BLANK_UNBLANK) ++ intensity = 0; ++ if (bd->props.fb_blank != FB_BLANK_UNBLANK) ++ intensity = 0; ++ if (kb9202bl_suspended) ++ intensity = 0; ++ ++ if ((!current_intensity) && (bd->props.power == FB_BLANK_UNBLANK)) ++ intensity = 1; ++ ++ spin_lock_irqsave(&bl_lock, flags); ++ if (intensity) ++ gpio_set_value(AT91_PIN_PC23, 1); ++ else ++ gpio_set_value(AT91_PIN_PC23, 0); ++ spin_unlock_irqrestore(&bl_lock, flags); ++ ++ current_intensity = intensity; ++ ++ return 0; ++} ++ ++static int kb9202bl_get_intensity(struct backlight_device *bd) ++{ ++ return current_intensity; ++} ++ ++static struct backlight_ops kb9202bl_ops = { ++ .get_brightness = kb9202bl_get_intensity, ++ .update_status = kb9202bl_set_intensity, ++}; ++ ++static int __init kb9202bl_probe(struct platform_device *pdev) ++{ ++ struct backlight_device *bd; ++ ++ bd = backlight_device_register ("kb9202-bl", &pdev->dev, NULL, &kb9202bl_ops); ++ if (IS_ERR(bd)) ++ return PTR_ERR(bd); ++ ++ platform_set_drvdata(pdev, bd); ++ ++ bd->props.max_brightness = KB9202_MAX_INTENSITY; ++ bd->props.brightness = KB9202_DEFAULT_INTENSITY; ++ (void) kb9202bl_set_intensity(bd); ++ ++ return 0; ++} ++ ++static int kb9202bl_remove(struct platform_device *pdev) ++{ ++ struct backlight_device *bd = platform_get_drvdata(pdev); ++ ++ bd->props.brightness = 0; ++ bd->props.power = 0; ++ (void) kb9202bl_set_intensity(bd); ++ ++ backlight_device_unregister(bd); ++ ++ return 0; ++} ++ ++#ifdef CONFIG_PM ++static int kb9202bl_suspend(struct platform_device *pdev, pm_message_t state) ++{ ++ struct backlight_device *bd = platform_get_drvdata(pdev); ++ ++ kb9202bl_suspended = 1; ++ (void) kb9202bl_set_intensity(bd); ++ return 0; ++} ++ ++static int kb9202bl_resume(struct platform_device *pdev) ++{ ++ struct backlight_device *bd = platform_get_drvdata(pdev); ++ ++ kb9202bl_suspended = 0; ++ (void) kb9202bl_set_intensity(bd); ++ return 0; ++} ++#else ++#define kb9202bl_suspend NULL ++#define kb9202bl_resume NULL ++#endif ++ ++static struct platform_driver kb9202bl_driver = { ++ .probe = kb9202bl_probe, ++ .remove = kb9202bl_remove, ++ .suspend = kb9202bl_suspend, ++ .resume = kb9202bl_resume, ++ .driver = { ++ .name = "kb9202-bl", ++ .owner = THIS_MODULE, ++ }, ++}; ++ ++static struct platform_device *kb9202bl_device; ++ ++static int __init kb9202bl_init(void) ++{ ++ int ret; ++ ++ ret = platform_driver_register(&kb9202bl_driver); ++ if (!ret) { ++ kb9202bl_device = platform_device_alloc("kb9202-bl", -1); ++ if (!kb9202bl_device) ++ return -ENOMEM; ++ ++ ret = platform_device_add(kb9202bl_device); ++ if (ret) { ++ platform_device_put(kb9202bl_device); ++ platform_driver_unregister(&kb9202bl_driver); ++ } ++ } ++ return ret; ++} ++ ++static void __exit kb9202bl_exit(void) ++{ ++ platform_device_unregister(kb9202bl_device); ++ platform_driver_unregister(&kb9202bl_driver); ++} ++ ++module_init(kb9202bl_init); ++module_exit(kb9202bl_exit); ++ ++MODULE_AUTHOR("KwikByte <kb9200_dev@kwikbyte.com>"); ++MODULE_DESCRIPTION("KB9202 Backlight Driver"); ++MODULE_LICENSE("GPL"); +diff -urN -x CVS linux-2.6.24/drivers/video/s1d15605fb.c linux-2.6/drivers/video/s1d15605fb.c +--- linux-2.6.24/drivers/video/s1d15605fb.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-2.6/drivers/video/s1d15605fb.c 2007-12-31 10:44:34.000000000 +0200 +@@ -0,0 +1,658 @@ ++/* ++ * drivers/video/s1d15605.c ++ * ++ * Adapted from several sources including: ++ * 1) Driver for AT91 LCD Controller ++ * Copyright (C) 2006 Atmel ++ * ++ * 2) Copyright (C) 2005 S. Kevin Hester ++ * ++ * This file is subject to the terms and conditions of the GNU General Public ++ * License. See the file COPYING in the main directory of this archive for ++ * more details. ++ * ++ * This is a basic framebuffer driver for the Optrex F-51320 128x64 mono LCD ++ * display. This display uses a clone of the common Epson SED 1531 display ++ * controller. ++ * ++ * I've heavily borrowed code from the vfb.c driver. ++ * ++ * 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 ++ */ ++ ++#ifdef DEBUG ++#define MSG(string, args...) printk("s1d15605fb:" string, ##args) ++#else ++#define MSG(string, args...) ++#endif ++ ++#include <linux/kernel.h> ++#include <linux/platform_device.h> ++#include <linux/dma-mapping.h> ++#include <linux/interrupt.h> ++#include <linux/clk.h> ++#include <linux/fb.h> ++#include <linux/init.h> ++#include <linux/delay.h> ++ ++#include <asm/uaccess.h> ++ ++#include <asm/arch/board.h> ++#include <asm/arch/gpio.h> ++ ++#ifdef CONFIG_PMAC_BACKLIGHT ++#include <asm/backlight.h> ++#endif ++ ++#define VIDEOWIDTH 128 ++#define VIDEOHEIGHT 64 ++#define VIDEODEPTH 1 /* bits/pixel */ ++#define VIDEOWIDTH_BYTES ((VIDEOWIDTH * VIDEODEPTH) / 8) ++ ++/* The number of bytes that actually go to the device */ ++#define ACTUALVIDEOMEMSIZE (VIDEOWIDTH_BYTES * VIDEOHEIGHT) ++#define VIDEOMEMSIZE PAGE_SIZE ++ ++static struct fb_var_screeninfo s1d15605_default __initdata = { ++ .xres = VIDEOWIDTH, ++ .yres = VIDEOHEIGHT, ++ .xres_virtual = VIDEOWIDTH, ++ .yres_virtual = VIDEOHEIGHT, ++ .bits_per_pixel = VIDEODEPTH, ++ .red = { 0, 1, 0 }, ++ .green = { 0, 1, 0 }, ++ .blue = { 0, 1, 0 }, ++ .activate = FB_ACTIVATE_NOW, ++ .pixclock = 20000, ++ .vmode = FB_VMODE_NONINTERLACED, ++}; ++ ++static struct fb_fix_screeninfo s1d15605_fix __initdata = { ++ .id = "s1d15605", ++ .type = FB_TYPE_PACKED_PIXELS, ++ .visual = FB_VISUAL_MONO10, ++ .xpanstep = 0, ++ .ypanstep = 0, ++ .ywrapstep = 0, ++ .accel = FB_ACCEL_NONE, ++}; ++ ++struct s1d15605fb_info { ++ struct fb_info *info; ++ char *mmio; ++ unsigned long reset_pin; ++ struct platform_device *pdev; ++}; ++ ++/* ++ * LCD device interface ++ */ ++#define RESET_DISPLAY 0xE2 ++#define LCD_BIAS_1_9 0xA2 ++#define ADC_SELECT_REVERSE 0xA1 ++#define COMMON_OUTPUT_NORMAL 0xC0 ++#define V5_RESISTOR_RATIO 0x26 ++#define ELECTRONIC_VOLUME_SET 0x81 ++#define ELECTRONIC_VOLUME_INIT 0x20 ++#define POWER_CONTROL_SET 0x28 ++#define VOLTAGE_REGULATOR 0x02 ++#define VOLTAGE_FOLLOWER 0x01 ++#define BOOSTER_CIRCUIT 0x04 ++#define DISPLAY_ON 0xAF ++#define START_LINE_SET 0x40 ++#define PAGE_ADDRESS_SET 0xB0 ++#define COLUMN_ADDRESS_HIGH 0x10 ++#define COLUMN_ADDRESS_LOW 0x00 ++#define RESISTOR_RATIO_START 0x20 ++ ++#define NUM_OF_PAGES 8 ++#define NUM_OF_COLUMNS 128 ++ ++#define WRITE_COMMAND(x) __raw_writeb((x), (sinfo)->mmio) ++#define READ_COMMAND __raw_readb((sinfo)->mmio) ++#define WRITE_DATA(x) __raw_writeb((x), (sinfo)->mmio + (0x10000)) ++#define READ_DATA __raw_readb((sinfo)->mmio + (0x10000)) ++ ++ ++/* ++ * s1d15605fb_resize_framebuffer ++ * ++ * Free allocated space if different. Allocate on new of changed. ++ * Returns -ENOMEM if the new framebuffer can not be allocated, ++ * zero on success. ++ */ ++static int s1d15605fb_resize_framebuffer(struct s1d15605fb_info *sinfo) ++{ ++ struct fb_info *info = sinfo->info; ++ struct fb_fix_screeninfo *fix = &info->fix; ++ struct fb_var_screeninfo *var = &info->var; ++ unsigned int new_size; ++ void *new_vaddr; ++ ++ new_size = ((var->xres_virtual * var->yres_virtual * var->bits_per_pixel) / 8); ++ ++ MSG("%s: x (%d) y (%d) bpp (%d): new size 0x%08x\n", __FUNCTION__, ++ var->xres_virtual, var->yres_virtual, var->bits_per_pixel, new_size); ++ ++ if (new_size == fix->smem_len) ++ return 0; ++ ++ if (fix->smem_len) { ++ kfree(info->screen_base); ++ } ++ ++ new_vaddr = kmalloc(new_size, GFP_KERNEL); ++ ++ if (!new_vaddr) { ++ fix->smem_len = 0; ++ return -ENOMEM; ++ } ++ ++ info->screen_base = new_vaddr; ++ fix->smem_start = (unsigned)new_vaddr; ++ fix->smem_len = new_size; ++ fix->line_length = (var->xres_virtual * var->bits_per_pixel) / 8; ++ ++ dev_info(info->device, ++ "%luKiB frame buffer at %08lx (mapped at %p)\n", ++ (unsigned long)info->fix.smem_len / 1024, ++ (unsigned long)info->fix.smem_start, ++ info->screen_base); ++ ++ return 0; ++} ++ ++ ++/* ++ * The s1d15605 seems to be divided into eight 128 pixel wide pages (from top to ++ * bottom) each page seems to be eight pixels high, where these eight pixels are ++ * one byte ++ */ ++static void s1d15605_update(struct fb_info *info) ++{ ++ struct s1d15605fb_info *sinfo = info->par; ++ int page, i, row, colmask; ++ u8 retVal, *rowPtr; ++ ++ WRITE_COMMAND(START_LINE_SET); ++ for (page = 0; page < NUM_OF_PAGES; ++page) { ++ WRITE_COMMAND(PAGE_ADDRESS_SET + page); ++ WRITE_COMMAND(COLUMN_ADDRESS_HIGH); ++ WRITE_COMMAND(COLUMN_ADDRESS_LOW); ++ ++ for (i = 0; i < NUM_OF_COLUMNS; ++i) ++ { ++ /* point of opportunity: optimization */ ++ colmask = (1 << (i & 0x7)); ++ rowPtr = (u8*)(info->screen_base); ++ rowPtr += (VIDEOWIDTH_BYTES * 8 * page); ++ rowPtr += (i >> 3); ++ retVal = 0; ++ for (row = 0; row < 8; ++row) ++ { ++ retVal = (retVal >> 1) | (((*rowPtr) & colmask) ? 0x80 : 0); ++ rowPtr += VIDEOWIDTH_BYTES; ++ } ++ WRITE_DATA(retVal); ++ } ++ } ++ ++ WRITE_COMMAND(DISPLAY_ON); ++} ++ ++ ++/* ++ * Setting the video mode has been split into two parts. ++ * First part, xxxfb_check_var, must not write anything ++ * to hardware, it should only verify and adjust var. ++ * This means it doesn't alter par but it does use hardware ++ * data from it to check this var. ++ */ ++static int s1d15605_check_var(struct fb_var_screeninfo *var, struct fb_info *info) ++{ ++ /* ++ * Some very basic checks ++ */ ++ if (!var->xres) ++ var->xres = 1; ++ if (!var->yres) ++ var->yres = 1; ++ if (var->xres > var->xres_virtual) ++ var->xres_virtual = var->xres; ++ if (var->yres > var->yres_virtual) ++ var->yres_virtual = var->yres; ++ ++ if(var->bits_per_pixel > VIDEODEPTH) ++ return -EINVAL; ++ ++ /* ++ * Memory limit ++ */ ++ if (((var->yres_virtual * var->bits_per_pixel * var->yres_virtual) >> 3) > ++ ACTUALVIDEOMEMSIZE) ++ return -ENOMEM; ++ ++ /* ++ * Now that we checked it we alter var. The reason being is that the video ++ * mode passed in might not work but slight changes to it might make it ++ * work. This way we let the user know what is acceptable. ++ */ ++ switch (var->bits_per_pixel) { ++ case 1: ++ var->red.offset = var->green.offset = var->blue.offset = 0; ++ var->red.length = var->green.length = var->blue.length ++ = var->bits_per_pixel; ++ break; ++ default: ++ return -EINVAL; ++ } ++ ++ var->xoffset = var->yoffset = 0; ++ var->red.msb_right = var->green.msb_right = var->blue.msb_right = ++ var->transp.msb_right = 0; ++ ++ return 0; ++} ++ ++ ++/* ++ * This routine actually sets the video mode. It's in here where we ++ * the hardware state info->par and fix which can be affected by the ++ * change in par. For this driver it doesn't do much. ++ */ ++static int s1d15605_set_par(struct fb_info *info) ++{ ++ int ret; ++ ++ MSG("%s:\n", __func__); ++ MSG(" * resolution: %ux%u (%ux%u virtual)\n", ++ info->var.xres, info->var.yres, ++ info->var.xres_virtual, info->var.yres_virtual); ++ ++ ret = s1d15605fb_resize_framebuffer(info->par); ++ ++ info->fix.visual = FB_VISUAL_MONO10; ++ return ret; ++} ++ ++ ++/* ++ * Set a single color register. The values supplied are already ++ * rounded down to the hardware's capabilities (according to the ++ * entries in the var structure). Return != 0 for invalid regno. ++ */ ++static int s1d15605_setcolreg(u_int regno, u_int red, u_int green, u_int blue, ++ u_int transp, struct fb_info *info) ++{ ++ if (regno > 1) /* no. of hw registers - we only do mono now */ ++ return 1; ++ ++ return 0; ++} ++ ++ ++/* ++ * Currently, the routine will simply shut-off the backlight and prevent ++ * updates/refreshes. Modify according to application. ++ * ++ * 0 unblank, 1 blank, 2 no vsync, 3 no hsync, 4 off ++ */ ++static int s1d15605_blank(int blank, struct fb_info *info) ++{ ++#ifdef CONFIG_PMAC_BACKLIGHT ++ if (blank) ++ pmac_backlight->props.power = FB_BLANK_POWERDOWN; ++ else ++ pmac_backlight->props.power = FB_BLANK_UNBLANK; ++ backlight_update_status(pmac_backlight); ++#endif ++ return 1; ++} ++ ++ ++/* ++ * Pan or Wrap the Display ++ * ++ * This call looks only at xoffset, yoffset and the FB_VMODE_YWRAP flag ++ */ ++/* ++static int s1d15605_pan_display(struct fb_var_screeninfo *var, ++ struct fb_info *info) ++{ ++ if (var->vmode & FB_VMODE_YWRAP) { ++ if (var->yoffset < 0 ++ || var->yoffset >= info->var.yres_virtual ++ || var->xoffset) ++ return -EINVAL; ++ } else { ++ if (var->xoffset + var->xres > info->var.xres_virtual || ++ var->yoffset + var->yres > info->var.yres_virtual) ++ return -EINVAL; ++ } ++ info->var.xoffset = var->xoffset; ++ info->var.yoffset = var->yoffset; ++ if (var->vmode & FB_VMODE_YWRAP) ++ info->var.vmode |= FB_VMODE_YWRAP; ++ else ++ info->var.vmode &= ~FB_VMODE_YWRAP; ++ return 0; ++} ++*/ ++ ++ ++static void s1d15605_copyarea(struct fb_info *info, const struct fb_copyarea *region) ++{ ++ cfb_copyarea(info, region); ++ s1d15605_update(info); ++} ++ ++ ++static void s1d15605_fillrect (struct fb_info *info, const struct fb_fillrect *rect) ++{ ++ cfb_fillrect(info, rect); ++ s1d15605_update(info); ++} ++ ++ ++static void s1d15605_imageblit(struct fb_info *p, const struct fb_image *image) ++{ ++ cfb_imageblit(p, image); ++ s1d15605_update(p); ++} ++ ++ ++/* ++ * Write the users data to our framebuffer, and then trigger a psuedo DMA ++ */ ++static ssize_t s1d15605_write(struct file *file, const char *buf, ++ size_t count, loff_t *ppos) ++{ ++ unsigned long p = *ppos; ++ struct inode *inode = file->f_dentry->d_inode; ++ int fbidx = iminor(inode); ++ struct fb_info *info = registered_fb[fbidx]; ++ int err; ++ ++ if (p > info->fix.smem_len) ++ return -ENOSPC; ++ if (count >= info->fix.smem_len) ++ count = info->fix.smem_len; ++ err = 0; ++ if (count + p > info->fix.smem_len) { ++ count = info->fix.smem_len - p; ++ err = -ENOSPC; ++ } ++ if (count) { ++ char *base_addr; ++ ++ base_addr = info->screen_base; ++ count -= copy_from_user(base_addr+p, buf, count); ++ *ppos += count; ++ err = -EFAULT; ++ } ++ ++ s1d15605_update(info); ++ ++ if (count) ++ return count; ++ ++ return err; ++} ++ ++#ifdef USE_PRIVATE_VMA_FXS ++static void s1d15605_vma_open(struct vm_area_struct *vma) ++{ ++ // FIXME - store stats in the device data via vm_private_data ++} ++ ++ ++static void s1d15605_vma_close(struct vm_area_struct *vma) ++{ ++ // FIXME - store stats in the device data via vm_private_data ++} ++ ++ ++static struct page *s1d15605_vma_nopage(struct vm_area_struct *vma, ++ unsigned long address, int *type) ++{ ++ struct page *page; ++ struct fb_info *info = vma->vm_private_data; ++ ++ page = virt_to_page(info->screen_base); ++ get_page(page); ++ ++ // FIXME - now someone has a link to our page, start periodically blitting ++ // latest updates to the actual device. ++ ++ return page; ++} ++ ++ ++static struct vm_operations_struct s1d15605_vm_ops = { ++ .open = s1d15605_vma_open, ++ .close = s1d15605_vma_close, ++ .nopage = s1d15605_vma_nopage ++}; ++ ++ ++/* We don't do much here - because we have special vm_ops */ ++static int s1d15605_mmap(struct fb_info *info, struct vm_area_struct *vma) ++{ ++ vma->vm_ops = &s1d15605_vm_ops; ++ vma->vm_flags |= VM_RESERVED; ++ vma->vm_private_data = info; ++ s1d15605_vma_open(vma); ++ ++ return 0; ++} ++#endif /* USE_PRIVATE_VMA_FXS */ ++ ++ ++static struct fb_ops s1d15605fb_ops = { ++ .owner = THIS_MODULE, ++ .fb_check_var = s1d15605_check_var, ++ .fb_set_par = s1d15605_set_par, ++ .fb_setcolreg = s1d15605_setcolreg, ++ .fb_blank = s1d15605_blank, ++// .fb_pan_display = s1d15605_pan_display, ++ .fb_fillrect = s1d15605_fillrect, ++ .fb_copyarea = s1d15605_copyarea, ++ .fb_imageblit = s1d15605_imageblit, ++ .fb_write = s1d15605_write, ++#ifdef USE_PRIVATE_VMA_FXS ++ .fb_mmap = s1d15605_mmap, ++#endif ++}; ++ ++ ++static void s1d15605_device_init(struct s1d15605fb_info *sinfo) { ++ ++ char value; ++ ++ /* release the reset line by reading the device - proto hardware */ ++ value = READ_COMMAND; ++ value = READ_COMMAND; ++ ++#ifdef CONFIG_MACH_KB9200 ++ /* new boards have dedicated reset line */ ++ gpio_set_value(sinfo->reset_pin, 1); ++#endif ++ ++ /* initialize the device within 5ms */ ++ WRITE_COMMAND(RESET_DISPLAY); ++ WRITE_COMMAND(LCD_BIAS_1_9); ++ WRITE_COMMAND(ADC_SELECT_REVERSE); ++ WRITE_COMMAND(COMMON_OUTPUT_NORMAL); ++ WRITE_COMMAND(V5_RESISTOR_RATIO); ++ WRITE_COMMAND(ELECTRONIC_VOLUME_SET); ++ WRITE_COMMAND(ELECTRONIC_VOLUME_INIT); ++ WRITE_COMMAND(POWER_CONTROL_SET | VOLTAGE_REGULATOR | VOLTAGE_FOLLOWER | BOOSTER_CIRCUIT); ++ WRITE_COMMAND(DISPLAY_ON); ++ ++ WRITE_COMMAND(RESISTOR_RATIO_START + 4); ++ WRITE_COMMAND(ELECTRONIC_VOLUME_SET); ++ WRITE_COMMAND(0x33); ++} ++ ++ ++static int __init s1d15605fb_probe(struct platform_device *pdev) ++{ ++ struct device *dev = &pdev->dev; ++ struct fb_info *info; ++ struct s1d15605fb_info *sinfo; ++ int ret; ++ ++ MSG("%s\n", __func__); ++ ++ if (!(info = framebuffer_alloc(sizeof(struct s1d15605fb_info), dev))) { ++ dev_err(dev, "Cannot allocate framebuffer struct\n"); ++ return -ENOMEM; ++ } ++ ++ sinfo = info->par; ++ sinfo->info = info; ++ sinfo->pdev = pdev; ++ ++ if (pdev->num_resources < 2) { ++ dev_err(dev, "Resources unusable\n"); ++ ret = -ENODEV; ++ goto free_info; ++ } ++ ++ info->fbops = &s1d15605fb_ops; ++ strcpy(info->fix.id, pdev->name); ++ ++ info->fix.mmio_start = pdev->resource[0].start; ++ info->fix.mmio_len = pdev->resource[0].end - pdev->resource[0].start + 1; ++ sinfo->reset_pin = pdev->resource[1].start; ++ ++ ret = s1d15605fb_resize_framebuffer(sinfo); ++ if (ret < 0) { ++ dev_err(dev, "Cannot resize framebuffer: %d\n", ret); ++ goto free_fb; ++ } ++ ++ if (!request_mem_region(info->fix.mmio_start, ++ info->fix.mmio_len, pdev->name)) { ++ ret = -EBUSY; ++ goto free_fb; ++ } ++ ++ sinfo->mmio = ioremap(info->fix.mmio_start, info->fix.mmio_len); ++ if (!sinfo->mmio) { ++ dev_err(dev, "Cannot map LCD memory region\n"); ++ goto release_mem; ++ } ++ ++ s1d15605_device_init(sinfo); ++ ++ ret = fb_find_mode(&info->var, info, NULL, NULL, 0, NULL, 1); ++ ++ if (!ret || (ret == 4)) ++ info->var = s1d15605_default; ++ ++ info->fix = s1d15605_fix; ++ info->flags = FBINFO_FLAG_DEFAULT | ++/* FBINFO_HWACCEL_YPAN | */ ++ FBINFO_HWACCEL_FILLRECT | FBINFO_HWACCEL_COPYAREA; ++ ++ ret = register_framebuffer(info); ++ if (ret < 0) { ++ dev_err(dev, "Failed to register framebuffer device: %d\n", ret); ++ goto unmap_mmio; ++ } ++ ++ dev_set_drvdata(dev, info); ++ ++ memset(info->screen_base, 0, info->fix.smem_len); ++ info->var.activate |= FB_ACTIVATE_NOW; ++ ret = fb_set_var(info, &info->var); ++ if (ret) { ++ dev_warn(dev, "Unable to set display parameters\n"); ++ } ++ ++ info->var.activate &= ~(FB_ACTIVATE_FORCE | FB_ACTIVATE_NOW); ++ ++ dev_dbg(dev, "%s SUCCESS\n", __func__); ++ ++ dev_info(dev, "Driver $Revision: 1.1 $\n"); ++ ++ return 0; ++ ++unmap_mmio: ++ iounmap(sinfo->mmio); ++release_mem: ++ release_mem_region(info->fix.mmio_start, info->fix.mmio_len); ++free_fb: ++ kfree(info->screen_base); ++ ++free_info: ++ framebuffer_release(info); ++ ++ dev_dbg(dev, "%s FAILED\n", __func__); ++ return ret; ++} ++ ++ ++static int __exit s1d15605fb_remove(struct platform_device *pdev) ++{ ++ struct device *dev = &pdev->dev; ++ struct fb_info *info = dev_get_drvdata(dev); ++ struct s1d15605fb_info *sinfo = info->par; ++ ++ if (!sinfo) ++ return 0; ++ ++ unregister_framebuffer(info); ++ ++ iounmap(sinfo->mmio); ++ release_mem_region(info->fix.mmio_start, info->fix.mmio_len); ++ ++ kfree(info->screen_base); ++ ++ dev_set_drvdata(dev, NULL); ++ framebuffer_release(info); ++ return 0; ++} ++ ++ ++static struct platform_driver s1d15605fb_driver = { ++ .remove = __exit_p(s1d15605fb_remove), ++ .driver = { ++ .name = "s1d15605fb", ++ .owner = THIS_MODULE, ++ }, ++}; ++ ++ ++static int __init s1d15605fb_init(void) ++{ ++ return platform_driver_probe(&s1d15605fb_driver, s1d15605fb_probe); ++} ++ ++ ++static void __exit s1d15605fb_exit(void) ++{ ++ platform_driver_unregister(&s1d15605fb_driver); ++} ++ ++ ++module_init(s1d15605fb_init); ++module_exit(s1d15605fb_exit); ++ ++ ++MODULE_AUTHOR("KwikByte"); ++MODULE_DESCRIPTION("Epson S1D15605 LCD Controller framebuffer driver"); ++MODULE_LICENSE("GPL"); +diff -urN -x CVS linux-2.6.24/drivers/watchdog/Kconfig linux-2.6/drivers/watchdog/Kconfig +--- linux-2.6.24/drivers/watchdog/Kconfig 2008-03-01 22:02:14.000000000 +0200 ++++ linux-2.6/drivers/watchdog/Kconfig 2007-12-31 10:44:10.000000000 +0200 +@@ -66,6 +66,14 @@ + Watchdog timer embedded into AT91RM9200 chips. This will reboot your + system when the timeout is reached. + ++config AT91SAM9_WATCHDOG ++ tristate "AT91SAM9 watchdog" ++ depends on ARCH_AT91 && !ARCH_AT91RM9200 ++ select WATCHDOG_NOWAYOUT ++ help ++ Watchdog timer embedded into AT91SAM9 chips. This will reboot your ++ system when the timeout is reached. ++ + config 21285_WATCHDOG + tristate "DC21285 watchdog" + depends on FOOTBRIDGE +diff -urN -x CVS linux-2.6.24/drivers/watchdog/Makefile linux-2.6/drivers/watchdog/Makefile +--- linux-2.6.24/drivers/watchdog/Makefile 2008-03-01 22:02:14.000000000 +0200 ++++ linux-2.6/drivers/watchdog/Makefile 2007-12-31 10:44:20.000000000 +0200 +@@ -26,6 +26,7 @@ + + # ARM Architecture + obj-$(CONFIG_AT91RM9200_WATCHDOG) += at91rm9200_wdt.o ++obj-$(CONFIG_AT91SAM9_WATCHDOG) += at91sam9_wdt.o + obj-$(CONFIG_OMAP_WATCHDOG) += omap_wdt.o + obj-$(CONFIG_21285_WATCHDOG) += wdt285.o + obj-$(CONFIG_977_WATCHDOG) += wdt977.o +diff -urN -x CVS linux-2.6.24/drivers/watchdog/at91sam9_wdt.c linux-2.6/drivers/watchdog/at91sam9_wdt.c +--- linux-2.6.24/drivers/watchdog/at91sam9_wdt.c 1970-01-01 02:00:00.000000000 +0200 ++++ linux-2.6/drivers/watchdog/at91sam9_wdt.c 2007-12-31 15:18:43.000000000 +0200 +@@ -0,0 +1,258 @@ ++/* ++ * Watchdog driver for Atmel AT91SAM9x processors. ++ * ++ * Copyright (C) 2007 Renaud CERRATO r.cerrato@til-technologies.fr ++ * ++ * This program is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU General Public License ++ * as published by the Free Software Foundation; either version ++ * 2 of the License, or (at your option) any later version. ++ */ ++ ++/* ++ * The Watchdog Timer Mode Register can be only written to once. If the ++ * timeout need to be set from Linux, be sure that the bootstrap or the ++ * bootloader doesn't write to this register. ++ */ ++ ++#include <linux/errno.h> ++#include <linux/fs.h> ++#include <linux/init.h> ++#include <linux/kernel.h> ++#include <linux/miscdevice.h> ++#include <linux/module.h> ++#include <linux/moduleparam.h> ++#include <linux/platform_device.h> ++#include <linux/types.h> ++#include <linux/watchdog.h> ++#include <linux/bitops.h> ++#include <linux/uaccess.h> ++ ++#include <asm/arch/at91_wdt.h> ++ ++ ++#define WDT_MAX_TIME 16 /* seconds */ ++ ++static int wdt_timeout = -1; /* invalid */ ++ ++module_param(wdt_timeout, int, 0); ++MODULE_PARM_DESC(wdt_timeout, "Watchdog time in seconds. (default = disabled)"); ++ ++ ++static unsigned long at91wdt_busy; ++ ++/* ......................................................................... */ ++ ++/* ++ * Reload the watchdog timer. (ie, pat the watchdog) ++ */ ++static void inline at91_wdt_reload(void) ++{ ++ at91_sys_write(AT91_WDT_CR, AT91_WDT_KEY | AT91_WDT_WDRSTT); ++} ++ ++/* ......................................................................... */ ++ ++/* ++ * Watchdog device is opened, and watchdog starts running. ++ */ ++static int at91_wdt_open(struct inode *inode, struct file *file) ++{ ++ if (test_and_set_bit(0, &at91wdt_busy)) ++ return -EBUSY; ++ ++ return nonseekable_open(inode, file); ++} ++ ++/* ++ * Close the watchdog device. ++ */ ++static int at91_wdt_close(struct inode *inode, struct file *file) ++{ ++ clear_bit(0, &at91wdt_busy); ++ return 0; ++} ++ ++/* ++ * Change the watchdog time interval. ++ */ ++static int at91_wdt_settimeout(int new_time) ++{ ++ unsigned int reg, mr; ++ /* ++ * All counting occurs at SLOW_CLOCK / 128 = 256 Hz ++ * ++ * Since WDV is a 12-bit counter, the maximum period is ++ * 4096 / 256 = 16 seconds. ++ */ ++ if ((new_time <= 0) || (new_time > WDT_MAX_TIME)) ++ return -EINVAL; ++ ++ wdt_timeout = new_time; ++ ++ /* Program the Watchdog */ ++ reg = AT91_WDT_WDRSTEN /* causes watchdog reset */ ++ | AT91_WDT_WDRPROC /* causes processor reset */ ++ | AT91_WDT_WDDBGHLT /* disabled in debug mode */ ++ | AT91_WDT_WDD /* restart at any time */ ++ | (((wdt_timeout * 256) - 1) & AT91_WDT_WDV); /* timer value */ ++ at91_sys_write(AT91_WDT_MR, reg); ++ ++ /* Check if watchdog could be programmed */ ++ mr = at91_sys_read(AT91_WDT_MR); ++ if (mr != reg) { ++ printk(KERN_ERR "at91sam9_wdt: Watchdog register already programmed.\n"); ++ return -EIO; ++ } ++ ++ at91_wdt_reload(); ++ ++ printk(KERN_INFO "AT91SAM9 Watchdog enabled (%d seconds, nowayout)\n", wdt_timeout); ++ return 0; ++} ++ ++static struct watchdog_info at91_wdt_info = { ++ .identity = "at91sam9 watchdog", ++ .options = WDIOF_SETTIMEOUT | WDIOF_KEEPALIVEPING, ++}; ++ ++/* ++ * Handle commands from user-space. ++ */ ++static int at91_wdt_ioctl(struct inode *inode, struct file *file, ++ unsigned int cmd, unsigned long arg) ++{ ++ void __user *argp = (void __user *)arg; ++ int __user *p = argp; ++ int new_value, err; ++ ++ switch (cmd) { ++ case WDIOC_KEEPALIVE: ++ at91_wdt_reload(); /* pat the watchdog */ ++ return 0; ++ ++ case WDIOC_GETSUPPORT: ++ return copy_to_user(argp, &at91_wdt_info, sizeof(at91_wdt_info)) ? -EFAULT : 0; ++ ++ case WDIOC_SETTIMEOUT: ++ if (get_user(new_value, p)) ++ return -EFAULT; ++ ++ err = at91_wdt_settimeout(new_value); ++ if (err) ++ return err; ++ ++ return put_user(wdt_timeout, p); /* return current value */ ++ ++ case WDIOC_GETTIMEOUT: ++ return put_user(wdt_timeout, p); ++ ++ case WDIOC_GETSTATUS: ++ case WDIOC_GETBOOTSTATUS: ++ return put_user(0, p); ++ } ++ return -ENOTTY; ++} ++ ++/* ++ * Pat the watchdog whenever device is written to. ++ */ ++static ssize_t at91_wdt_write(struct file *file, const char *data, size_t len, loff_t *ppos) ++{ ++ at91_wdt_reload(); /* pat the watchdog */ ++ return len; ++} ++ ++/* ......................................................................... */ ++ ++static const struct file_operations at91wdt_fops = { ++ .owner = THIS_MODULE, ++ .llseek = no_llseek, ++ .ioctl = at91_wdt_ioctl, ++ .open = at91_wdt_open, ++ .release = at91_wdt_close, ++ .write = at91_wdt_write, ++}; ++ ++static struct miscdevice at91wdt_miscdev = { ++ .minor = WATCHDOG_MINOR, ++ .name = "watchdog", ++ .fops = &at91wdt_fops, ++}; ++ ++static int __init at91wdt_probe(struct platform_device *pdev) ++{ ++ int res; ++ ++ if (at91wdt_miscdev.parent) ++ return -EBUSY; ++ at91wdt_miscdev.parent = &pdev->dev; ++ ++ res = misc_register(&at91wdt_miscdev); ++ if (res) ++ return res; ++ ++ /* Set watchdog */ ++ if (at91_wdt_settimeout(wdt_timeout) == -EINVAL) { ++ pr_info("at91sam9_wdt: invalid timeout (must be between 1 and %d)\n", WDT_MAX_TIME); ++ return 0; ++ } ++ ++ return 0; ++} ++ ++static int __exit at91wdt_remove(struct platform_device *pdev) ++{ ++ int res; ++ ++ res = misc_deregister(&at91wdt_miscdev); ++ if (!res) ++ at91wdt_miscdev.parent = NULL; ++ ++ return res; ++} ++ ++#ifdef CONFIG_PM ++ ++static int at91wdt_suspend(struct platform_device *pdev, pm_message_t message) ++{ ++ return 0; ++} ++ ++static int at91wdt_resume(struct platform_device *pdev) ++{ ++ return 0; ++} ++ ++#else ++#define at91wdt_suspend NULL ++#define at91wdt_resume NULL ++#endif ++ ++static struct platform_driver at91wdt_driver = { ++ .remove = __exit_p(at91wdt_remove), ++ .suspend = at91wdt_suspend, ++ .resume = at91wdt_resume, ++ .driver = { ++ .name = "at91_wdt", ++ .owner = THIS_MODULE, ++ }, ++}; ++ ++static int __init at91sam_wdt_init(void) ++{ ++ return platform_driver_probe(&at91wdt_driver, at91wdt_probe); ++} ++ ++static void __exit at91sam_wdt_exit(void) ++{ ++ platform_driver_unregister(&at91wdt_driver); ++} ++ ++module_init(at91sam_wdt_init); ++module_exit(at91sam_wdt_exit); ++ ++MODULE_AUTHOR("Renaud CERRATO"); ++MODULE_DESCRIPTION("Watchdog driver for Atmel AT91SAM9x processors"); ++MODULE_LICENSE("GPL"); ++MODULE_ALIAS_MISCDEV(WATCHDOG_MINOR); +diff -urN -x CVS linux-2.6.24/include/asm-arm/arch-at91/at91_ecc.h linux-2.6/include/asm-arm/arch-at91/at91_ecc.h +--- linux-2.6.24/include/asm-arm/arch-at91/at91_ecc.h 2007-10-09 22:31:38.000000000 +0200 ++++ linux-2.6/include/asm-arm/arch-at91/at91_ecc.h 2008-02-25 21:15:20.000000000 +0200 +@@ -13,26 +13,26 @@ + #ifndef AT91_ECC_H + #define AT91_ECC_H + +-#define AT91_ECC_CR (AT91_ECC + 0x00) /* Control register */ ++#define AT91_ECC_CR (0x00) /* Control register */ + #define AT91_ECC_RST (1 << 0) /* Reset parity */ + +-#define AT91_ECC_MR (AT91_ECC + 0x04) /* Mode register */ ++#define AT91_ECC_MR (0x04) /* Mode register */ + #define AT91_ECC_PAGESIZE (3 << 0) /* Page Size */ + #define AT91_ECC_PAGESIZE_528 (0) + #define AT91_ECC_PAGESIZE_1056 (1) + #define AT91_ECC_PAGESIZE_2112 (2) + #define AT91_ECC_PAGESIZE_4224 (3) + +-#define AT91_ECC_SR (AT91_ECC + 0x08) /* Status register */ ++#define AT91_ECC_SR (0x08) /* Status register */ + #define AT91_ECC_RECERR (1 << 0) /* Recoverable Error */ + #define AT91_ECC_ECCERR (1 << 1) /* ECC Single Bit Error */ + #define AT91_ECC_MULERR (1 << 2) /* Multiple Errors */ + +-#define AT91_ECC_PR (AT91_ECC + 0x0c) /* Parity register */ ++#define AT91_ECC_PR (0x0c) /* Parity register */ + #define AT91_ECC_BITADDR (0xf << 0) /* Bit Error Address */ + #define AT91_ECC_WORDADDR (0xfff << 4) /* Word Error Address */ + +-#define AT91_ECC_NPR (AT91_ECC + 0x10) /* NParity register */ ++#define AT91_ECC_NPR (0x10) /* NParity register */ + #define AT91_ECC_NPARITY (0xffff << 0) /* NParity */ + + #endif +diff -urN -x CVS linux-2.6.24/include/asm-arm/arch-at91/at91_lcdc.h linux-2.6/include/asm-arm/arch-at91/at91_lcdc.h +--- linux-2.6.24/include/asm-arm/arch-at91/at91_lcdc.h 2007-10-09 22:31:38.000000000 +0200 ++++ linux-2.6/include/asm-arm/arch-at91/at91_lcdc.h 1970-01-01 02:00:00.000000000 +0200 +@@ -1,148 +0,0 @@ +-/* +- * include/asm-arm/arch-at91/at91_lcdc.h +- * +- * LCD Controller (LCDC). +- * Based on AT91SAM9261 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 AT91_LCDC_H +-#define AT91_LCDC_H +- +-#define AT91_LCDC_DMABADDR1 0x00 /* DMA Base Address Register 1 */ +-#define AT91_LCDC_DMABADDR2 0x04 /* DMA Base Address Register 2 */ +-#define AT91_LCDC_DMAFRMPT1 0x08 /* DMA Frame Pointer Register 1 */ +-#define AT91_LCDC_DMAFRMPT2 0x0c /* DMA Frame Pointer Register 2 */ +-#define AT91_LCDC_DMAFRMADD1 0x10 /* DMA Frame Address Register 1 */ +-#define AT91_LCDC_DMAFRMADD2 0x14 /* DMA Frame Address Register 2 */ +- +-#define AT91_LCDC_DMAFRMCFG 0x18 /* DMA Frame Configuration Register */ +-#define AT91_LCDC_FRSIZE (0x7fffff << 0) /* Frame Size */ +-#define AT91_LCDC_BLENGTH (0x7f << 24) /* Burst Length */ +- +-#define AT91_LCDC_DMACON 0x1c /* DMA Control Register */ +-#define AT91_LCDC_DMAEN (0x1 << 0) /* DMA Enable */ +-#define AT91_LCDC_DMARST (0x1 << 1) /* DMA Reset */ +-#define AT91_LCDC_DMABUSY (0x1 << 2) /* DMA Busy */ +- +-#define AT91_LCDC_LCDCON1 0x0800 /* LCD Control Register 1 */ +-#define AT91_LCDC_BYPASS (1 << 0) /* Bypass lcd_dotck divider */ +-#define AT91_LCDC_CLKVAL (0x1ff << 12) /* Clock Divider */ +-#define AT91_LCDC_LINCNT (0x7ff << 21) /* Line Counter */ +- +-#define AT91_LCDC_LCDCON2 0x0804 /* LCD Control Register 2 */ +-#define AT91_LCDC_DISTYPE (3 << 0) /* Display Type */ +-#define AT91_LCDC_DISTYPE_STNMONO (0 << 0) +-#define AT91_LCDC_DISTYPE_STNCOLOR (1 << 0) +-#define AT91_LCDC_DISTYPE_TFT (2 << 0) +-#define AT91_LCDC_SCANMOD (1 << 2) /* Scan Mode */ +-#define AT91_LCDC_SCANMOD_SINGLE (0 << 2) +-#define AT91_LCDC_SCANMOD_DUAL (1 << 2) +-#define AT91_LCDC_IFWIDTH (3 << 3) /*Interface Width */ +-#define AT91_LCDC_IFWIDTH_4 (0 << 3) +-#define AT91_LCDC_IFWIDTH_8 (1 << 3) +-#define AT91_LCDC_IFWIDTH_16 (2 << 3) +-#define AT91_LCDC_PIXELSIZE (7 << 5) /* Bits per pixel */ +-#define AT91_LCDC_PIXELSIZE_1 (0 << 5) +-#define AT91_LCDC_PIXELSIZE_2 (1 << 5) +-#define AT91_LCDC_PIXELSIZE_4 (2 << 5) +-#define AT91_LCDC_PIXELSIZE_8 (3 << 5) +-#define AT91_LCDC_PIXELSIZE_16 (4 << 5) +-#define AT91_LCDC_PIXELSIZE_24 (5 << 5) +-#define AT91_LCDC_INVVD (1 << 8) /* LCD Data polarity */ +-#define AT91_LCDC_INVVD_NORMAL (0 << 8) +-#define AT91_LCDC_INVVD_INVERTED (1 << 8) +-#define AT91_LCDC_INVFRAME (1 << 9 ) /* LCD VSync polarity */ +-#define AT91_LCDC_INVFRAME_NORMAL (0 << 9) +-#define AT91_LCDC_INVFRAME_INVERTED (1 << 9) +-#define AT91_LCDC_INVLINE (1 << 10) /* LCD HSync polarity */ +-#define AT91_LCDC_INVLINE_NORMAL (0 << 10) +-#define AT91_LCDC_INVLINE_INVERTED (1 << 10) +-#define AT91_LCDC_INVCLK (1 << 11) /* LCD dotclk polarity */ +-#define AT91_LCDC_INVCLK_NORMAL (0 << 11) +-#define AT91_LCDC_INVCLK_INVERTED (1 << 11) +-#define AT91_LCDC_INVDVAL (1 << 12) /* LCD dval polarity */ +-#define AT91_LCDC_INVDVAL_NORMAL (0 << 12) +-#define AT91_LCDC_INVDVAL_INVERTED (1 << 12) +-#define AT91_LCDC_CLKMOD (1 << 15) /* LCD dotclk mode */ +-#define AT91_LCDC_CLKMOD_ACTIVEDISPLAY (0 << 15) +-#define AT91_LCDC_CLKMOD_ALWAYSACTIVE (1 << 15) +-#define AT91_LCDC_MEMOR (1 << 31) /* Memory Ordering Format */ +-#define AT91_LCDC_MEMOR_BIG (0 << 31) +-#define AT91_LCDC_MEMOR_LITTLE (1 << 31) +- +-#define AT91_LCDC_TIM1 0x0808 /* LCD Timing Register 1 */ +-#define AT91_LCDC_VFP (0xff << 0) /* Vertical Front Porch */ +-#define AT91_LCDC_VBP (0xff << 8) /* Vertical Back Porch */ +-#define AT91_LCDC_VPW (0x3f << 16) /* Vertical Synchronization Pulse Width */ +-#define AT91_LCDC_VHDLY (0xf << 24) /* Vertical to Horizontal Delay */ +- +-#define AT91_LCDC_TIM2 0x080c /* LCD Timing Register 2 */ +-#define AT91_LCDC_HBP (0xff << 0) /* Horizontal Back Porch */ +-#define AT91_LCDC_HPW (0x3f << 8) /* Horizontal Synchronization Pulse Width */ +-#define AT91_LCDC_HFP (0x7ff << 21) /* Horizontal Front Porch */ +- +-#define AT91_LCDC_LCDFRMCFG 0x0810 /* LCD Frame Configuration Register */ +-#define AT91_LCDC_LINEVAL (0x7ff << 0) /* Vertical Size of LCD Module */ +-#define AT91_LCDC_HOZVAL (0x7ff << 21) /* Horizontal Size of LCD Module */ +- +-#define AT91_LCDC_FIFO 0x0814 /* LCD FIFO Register */ +-#define AT91_LCDC_FIFOTH (0xffff) /* FIFO Threshold */ +- +-#define AT91_LCDC_DP1_2 0x081c /* Dithering Pattern DP1_2 Register */ +-#define AT91_LCDC_DP4_7 0x0820 /* Dithering Pattern DP4_7 Register */ +-#define AT91_LCDC_DP3_5 0x0824 /* Dithering Pattern DP3_5 Register */ +-#define AT91_LCDC_DP2_3 0x0828 /* Dithering Pattern DP2_3 Register */ +-#define AT91_LCDC_DP5_7 0x082c /* Dithering Pattern DP5_7 Register */ +-#define AT91_LCDC_DP3_4 0x0830 /* Dithering Pattern DP3_4 Register */ +-#define AT91_LCDC_DP4_5 0x0834 /* Dithering Pattern DP4_5 Register */ +-#define AT91_LCDC_DP6_7 0x0838 /* Dithering Pattern DP6_7 Register */ +-#define AT91_LCDC_DP1_2_VAL (0xff) +-#define AT91_LCDC_DP4_7_VAL (0xfffffff) +-#define AT91_LCDC_DP3_5_VAL (0xfffff) +-#define AT91_LCDC_DP2_3_VAL (0xfff) +-#define AT91_LCDC_DP5_7_VAL (0xfffffff) +-#define AT91_LCDC_DP3_4_VAL (0xffff) +-#define AT91_LCDC_DP4_5_VAL (0xfffff) +-#define AT91_LCDC_DP6_7_VAL (0xfffffff) +- +-#define AT91_LCDC_PWRCON 0x083c /* Power Control Register */ +-#define AT91_LCDC_PWR (1 << 0) /* LCD Module Power Control */ +-#define AT91_LCDC_GUARDT (0x7f << 1) /* Delay in Frame Period */ +-#define AT91_LCDC_BUSY (1 << 31) /* LCD Busy */ +- +-#define AT91_LCDC_CONTRAST_CTR 0x0840 /* Contrast Control Register */ +-#define AT91_LCDC_PS (3 << 0) /* Contrast Counter Prescaler */ +-#define AT91_LCDC_PS_DIV1 (0 << 0) +-#define AT91_LCDC_PS_DIV2 (1 << 0) +-#define AT91_LCDC_PS_DIV4 (2 << 0) +-#define AT91_LCDC_PS_DIV8 (3 << 0) +-#define AT91_LCDC_POL (1 << 2) /* Polarity of output Pulse */ +-#define AT91_LCDC_POL_NEGATIVE (0 << 2) +-#define AT91_LCDC_POL_POSITIVE (1 << 2) +-#define AT91_LCDC_ENA (1 << 3) /* PWM generator Control */ +-#define AT91_LCDC_ENA_PWMDISABLE (0 << 3) +-#define AT91_LCDC_ENA_PWMENABLE (1 << 3) +- +-#define AT91_LCDC_CONTRAST_VAL 0x0844 /* Contrast Value Register */ +-#define AT91_LCDC_CVAL (0xff) /* PWM compare value */ +- +-#define AT91_LCDC_IER 0x0848 /* Interrupt Enable Register */ +-#define AT91_LCDC_IDR 0x084c /* Interrupt Disable Register */ +-#define AT91_LCDC_IMR 0x0850 /* Interrupt Mask Register */ +-#define AT91_LCDC_ISR 0x0854 /* Interrupt Enable Register */ +-#define AT91_LCDC_ICR 0x0858 /* Interrupt Clear Register */ +-#define AT91_LCDC_LNI (1 << 0) /* Line Interrupt */ +-#define AT91_LCDC_LSTLNI (1 << 1) /* Last Line Interrupt */ +-#define AT91_LCDC_EOFI (1 << 2) /* DMA End Of Frame Interrupt */ +-#define AT91_LCDC_UFLWI (1 << 4) /* FIFO Underflow Interrupt */ +-#define AT91_LCDC_OWRI (1 << 5) /* FIFO Overwrite Interrupt */ +-#define AT91_LCDC_MERI (1 << 6) /* DMA Memory Error Interrupt */ +- +-#define AT91_LCDC_LUT_(n) (0x0c00 + ((n)*4)) /* Palette Entry 0..255 */ +- +-#endif +diff -urN -x CVS linux-2.6.24/include/asm-arm/arch-at91/at91_mci.h linux-2.6/include/asm-arm/arch-at91/at91_mci.h +--- linux-2.6.24/include/asm-arm/arch-at91/at91_mci.h 2007-10-09 22:31:38.000000000 +0200 ++++ linux-2.6/include/asm-arm/arch-at91/at91_mci.h 2008-01-16 21:24:29.000000000 +0200 +@@ -89,7 +89,7 @@ + #define AT91_MCI_ENDRX (1 << 6) /* End of RX Buffer */ + #define AT91_MCI_ENDTX (1 << 7) /* End fo TX Buffer */ + #define AT91_MCI_SDIOIRQA (1 << 8) /* SDIO Interrupt for Slot A */ +-#define At91_MCI_SDIOIRQB (1 << 9) /* SDIO Interrupt for Slot B [AT91RM9200 only] */ ++#define AT91_MCI_SDIOIRQB (1 << 9) /* SDIO Interrupt for Slot B */ + #define AT91_MCI_RXBUFF (1 << 14) /* RX Buffer Full */ + #define AT91_MCI_TXBUFE (1 << 15) /* TX Buffer Empty */ + #define AT91_MCI_RINDE (1 << 16) /* Response Index Error */ +diff -urN -x CVS linux-2.6.24/include/asm-arm/arch-at91/at91_pmc.h linux-2.6/include/asm-arm/arch-at91/at91_pmc.h +--- linux-2.6.24/include/asm-arm/arch-at91/at91_pmc.h 2007-10-09 22:31:38.000000000 +0200 ++++ linux-2.6/include/asm-arm/arch-at91/at91_pmc.h 2008-03-01 22:06:19.000000000 +0200 +@@ -25,6 +25,7 @@ + #define AT91RM9200_PMC_MCKUDP (1 << 2) /* USB Device Port Master Clock Automatic Disable on Suspend [AT91RM9200 only] */ + #define AT91RM9200_PMC_UHP (1 << 4) /* USB Host Port Clock [AT91RM9200 only] */ + #define AT91SAM926x_PMC_UHP (1 << 6) /* USB Host Port Clock [AT91SAM926x only] */ ++#define AT91CAP9_PMC_UHP (1 << 6) /* USB Host Port Clock [AT91CAP9 only] */ + #define AT91SAM926x_PMC_UDP (1 << 7) /* USB Devcice Port Clock [AT91SAM926x only] */ + #define AT91_PMC_PCK0 (1 << 8) /* Programmable Clock 0 */ + #define AT91_PMC_PCK1 (1 << 9) /* Programmable Clock 1 */ +@@ -37,7 +38,9 @@ + #define AT91_PMC_PCDR (AT91_PMC + 0x14) /* Peripheral Clock Disable Register */ + #define AT91_PMC_PCSR (AT91_PMC + 0x18) /* Peripheral Clock Status Register */ + +-#define AT91_CKGR_MOR (AT91_PMC + 0x20) /* Main Oscillator Register */ ++#define AT91_CKGR_UCKR (AT91_PMC + 0x1C) /* UTMI Clock Register [SAM9RL, CAP9] */ ++ ++#define AT91_CKGR_MOR (AT91_PMC + 0x20) /* Main Oscillator Register [not on SAM9RL] */ + #define AT91_PMC_MOSCEN (1 << 0) /* Main Oscillator Enable */ + #define AT91_PMC_OSCBYPASS (1 << 1) /* Oscillator Bypass [AT91SAM926x only] */ + #define AT91_PMC_OSCOUNT (0xff << 8) /* Main Oscillator Start-up Time */ +@@ -52,6 +55,10 @@ + #define AT91_PMC_PLLCOUNT (0x3f << 8) /* PLL Counter */ + #define AT91_PMC_OUT (3 << 14) /* PLL Clock Frequency Range */ + #define AT91_PMC_MUL (0x7ff << 16) /* PLL Multiplier */ ++#define AT91_PMC_USBDIV (3 << 28) /* USB Divisor (PLLB only) */ ++#define AT91_PMC_USBDIV_1 (0 << 28) ++#define AT91_PMC_USBDIV_2 (1 << 28) ++#define AT91_PMC_USBDIV_4 (2 << 28) + #define AT91_PMC_USB96M (1 << 28) /* Divider by 2 Enable (PLLB only) */ + + #define AT91_PMC_MCKR (AT91_PMC + 0x30) /* Master Clock Register */ +@@ -69,10 +76,13 @@ + #define AT91_PMC_PRES_32 (5 << 2) + #define AT91_PMC_PRES_64 (6 << 2) + #define AT91_PMC_MDIV (3 << 8) /* Master Clock Division */ +-#define AT91_PMC_MDIV_1 (0 << 8) +-#define AT91_PMC_MDIV_2 (1 << 8) +-#define AT91_PMC_MDIV_3 (2 << 8) +-#define AT91_PMC_MDIV_4 (3 << 8) ++#define AT91RM9200_PMC_MDIV_1 (0 << 8) /* [AT91RM9200 only] */ ++#define AT91RM9200_PMC_MDIV_2 (1 << 8) ++#define AT91RM9200_PMC_MDIV_3 (2 << 8) ++#define AT91RM9200_PMC_MDIV_4 (3 << 8) ++#define AT91SAM9_PMC_MDIV_1 (0 << 8) /* [SAM9,CAP9 only] */ ++#define AT91SAM9_PMC_MDIV_2 (1 << 8) ++#define AT91SAM9_PMC_MDIV_4 (2 << 8) + + #define AT91_PMC_PCKR(n) (AT91_PMC + 0x40 + ((n) * 4)) /* Programmable Clock 0-3 Registers */ + +diff -urN -x CVS linux-2.6.24/include/asm-arm/arch-at91/at91_rtt.h linux-2.6/include/asm-arm/arch-at91/at91_rtt.h +--- linux-2.6.24/include/asm-arm/arch-at91/at91_rtt.h 2007-10-09 22:31:38.000000000 +0200 ++++ linux-2.6/include/asm-arm/arch-at91/at91_rtt.h 2008-02-18 18:50:29.000000000 +0200 +@@ -13,19 +13,19 @@ + #ifndef AT91_RTT_H + #define AT91_RTT_H + +-#define AT91_RTT_MR (AT91_RTT + 0x00) /* Real-time Mode Register */ ++#define AT91_RTT_MR (0x00) /* Real-time Mode Register */ + #define AT91_RTT_RTPRES (0xffff << 0) /* Real-time Timer Prescaler Value */ + #define AT91_RTT_ALMIEN (1 << 16) /* Alarm Interrupt Enable */ + #define AT91_RTT_RTTINCIEN (1 << 17) /* Real Time Timer Increment Interrupt Enable */ + #define AT91_RTT_RTTRST (1 << 18) /* Real Time Timer Restart */ + +-#define AT91_RTT_AR (AT91_RTT + 0x04) /* Real-time Alarm Register */ ++#define AT91_RTT_AR (0x04) /* Real-time Alarm Register */ + #define AT91_RTT_ALMV (0xffffffff) /* Alarm Value */ + +-#define AT91_RTT_VR (AT91_RTT + 0x08) /* Real-time Value Register */ ++#define AT91_RTT_VR (0x08) /* Real-time Value Register */ + #define AT91_RTT_CRTV (0xffffffff) /* Current Real-time Value */ + +-#define AT91_RTT_SR (AT91_RTT + 0x0c) /* Real-time Status Register */ ++#define AT91_RTT_SR (0x0c) /* Real-time Status Register */ + #define AT91_RTT_ALMS (1 << 0) /* Real-time Alarm Status */ + #define AT91_RTT_RTTINC (1 << 1) /* Real-time Timer Increment */ + +diff -urN -x CVS linux-2.6.24/include/asm-arm/arch-at91/at91_shdwc.h linux-2.6/include/asm-arm/arch-at91/at91_shdwc.h +--- linux-2.6.24/include/asm-arm/arch-at91/at91_shdwc.h 2007-10-09 22:31:38.000000000 +0200 ++++ linux-2.6/include/asm-arm/arch-at91/at91_shdwc.h 2008-02-24 23:02:31.000000000 +0200 +@@ -24,10 +24,12 @@ + #define AT91_SHDW_WKMODE0_LOW 2 + #define AT91_SHDW_WKMODE0_ANYLEVEL 3 + #define AT91_SHDW_CPTWK0 (0xf << 4) /* Counter On Wake Up 0 */ ++#define AT91_SHDW_CPTWK0_(x) ((x) << 4) + #define AT91_SHDW_RTTWKEN (1 << 16) /* Real Time Timer Wake-up Enable */ + + #define AT91_SHDW_SR (AT91_SHDWC + 0x08) /* Shut Down Status Register */ + #define AT91_SHDW_WAKEUP0 (1 << 0) /* Wake-up 0 Status */ + #define AT91_SHDW_RTTWK (1 << 16) /* Real-time Timer Wake-up */ ++#define AT91_SHDW_RTCWK (1 << 17) /* Real-time Clock Wake-up [SAM9RL] */ + + #endif +diff -urN -x CVS linux-2.6.24/include/asm-arm/arch-at91/at91_twi.h linux-2.6/include/asm-arm/arch-at91/at91_twi.h +--- linux-2.6.24/include/asm-arm/arch-at91/at91_twi.h 2007-10-09 22:31:38.000000000 +0200 ++++ linux-2.6/include/asm-arm/arch-at91/at91_twi.h 2008-01-16 21:24:29.000000000 +0200 +@@ -21,6 +21,8 @@ + #define AT91_TWI_STOP (1 << 1) /* Send a Stop Condition */ + #define AT91_TWI_MSEN (1 << 2) /* Master Transfer Enable */ + #define AT91_TWI_MSDIS (1 << 3) /* Master Transfer Disable */ ++#define AT91_TWI_SVEN (1 << 4) /* Slave Transfer Enable [SAM9260 only] */ ++#define AT91_TWI_SVDIS (1 << 5) /* Slave Transfer Disable [SAM9260 only] */ + #define AT91_TWI_SWRST (1 << 7) /* Software Reset */ + + #define AT91_TWI_MMR 0x04 /* Master Mode Register */ +@@ -32,6 +34,9 @@ + #define AT91_TWI_MREAD (1 << 12) /* Master Read Direction */ + #define AT91_TWI_DADR (0x7f << 16) /* Device Address */ + ++#define AT91_TWI_SMR 0x08 /* Slave Mode Register [SAM9260 only] */ ++#define AT91_TWI_SADR (0x7f << 16) /* Slave Address */ ++ + #define AT91_TWI_IADR 0x0c /* Internal Address Register */ + + #define AT91_TWI_CWGR 0x10 /* Clock Waveform Generator Register */ +@@ -43,9 +48,15 @@ + #define AT91_TWI_TXCOMP (1 << 0) /* Transmission Complete */ + #define AT91_TWI_RXRDY (1 << 1) /* Receive Holding Register Ready */ + #define AT91_TWI_TXRDY (1 << 2) /* Transmit Holding Register Ready */ ++#define AT91_TWI_SVREAD (1 << 3) /* Slave Read [SAM9260 only] */ ++#define AT91_TWI_SVACC (1 << 4) /* Slave Access [SAM9260 only] */ ++#define AT91_TWI_GACC (1 << 5) /* General Call Access [SAM9260 only] */ + #define AT91_TWI_OVRE (1 << 6) /* Overrun Error [AT91RM9200 only] */ + #define AT91_TWI_UNRE (1 << 7) /* Underrun Error [AT91RM9200 only] */ + #define AT91_TWI_NACK (1 << 8) /* Not Acknowledged */ ++#define AT91_TWI_ARBLST (1 << 9) /* Arbitration Lost [SAM9260 only] */ ++#define AT91_TWI_SCLWS (1 << 10) /* Clock Wait State [SAM9260 only] */ ++#define AT91_TWI_EOSACC (1 << 11) /* End of Slave Address [SAM9260 only] */ + + #define AT91_TWI_IER 0x24 /* Interrupt Enable Register */ + #define AT91_TWI_IDR 0x28 /* Interrupt Disable Register */ +diff -urN -x CVS linux-2.6.24/include/asm-arm/arch-at91/at91cap9.h linux-2.6/include/asm-arm/arch-at91/at91cap9.h +--- linux-2.6.24/include/asm-arm/arch-at91/at91cap9.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-2.6/include/asm-arm/arch-at91/at91cap9.h 2008-03-01 19:37:40.000000000 +0200 +@@ -0,0 +1,126 @@ ++/* ++ * include/asm-arm/arch-at91/at91cap9.h ++ * ++ * Copyright (C) 2007 Stelian Pop <stelian.pop@leadtechdesign.com> ++ * Copyright (C) 2007 Lead Tech Design <www.leadtechdesign.com> ++ * Copyright (C) 2007 Atmel Corporation. ++ * ++ * Common definitions. ++ * Based on AT91CAP9 datasheet revision B (Preliminary). ++ * ++ * 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 AT91CAP9_H ++#define AT91CAP9_H ++ ++/* ++ * Peripheral identifiers/interrupts. ++ */ ++#define AT91_ID_FIQ 0 /* Advanced Interrupt Controller (FIQ) */ ++#define AT91_ID_SYS 1 /* System Peripherals */ ++#define AT91CAP9_ID_PIOABCD 2 /* Parallel IO Controller A, B, C and D */ ++#define AT91CAP9_ID_MPB0 3 /* MP Block Peripheral 0 */ ++#define AT91CAP9_ID_MPB1 4 /* MP Block Peripheral 1 */ ++#define AT91CAP9_ID_MPB2 5 /* MP Block Peripheral 2 */ ++#define AT91CAP9_ID_MPB3 6 /* MP Block Peripheral 3 */ ++#define AT91CAP9_ID_MPB4 7 /* MP Block Peripheral 4 */ ++#define AT91CAP9_ID_US0 8 /* USART 0 */ ++#define AT91CAP9_ID_US1 9 /* USART 1 */ ++#define AT91CAP9_ID_US2 10 /* USART 2 */ ++#define AT91CAP9_ID_MCI0 11 /* Multimedia Card Interface 0 */ ++#define AT91CAP9_ID_MCI1 12 /* Multimedia Card Interface 1 */ ++#define AT91CAP9_ID_CAN 13 /* CAN */ ++#define AT91CAP9_ID_TWI 14 /* Two-Wire Interface */ ++#define AT91CAP9_ID_SPI0 15 /* Serial Peripheral Interface 0 */ ++#define AT91CAP9_ID_SPI1 16 /* Serial Peripheral Interface 0 */ ++#define AT91CAP9_ID_SSC0 17 /* Serial Synchronous Controller 0 */ ++#define AT91CAP9_ID_SSC1 18 /* Serial Synchronous Controller 1 */ ++#define AT91CAP9_ID_AC97C 19 /* AC97 Controller */ ++#define AT91CAP9_ID_TCB 20 /* Timer Counter 0, 1 and 2 */ ++#define AT91CAP9_ID_PWMC 21 /* Pulse Width Modulation Controller */ ++#define AT91CAP9_ID_EMAC 22 /* Ethernet */ ++#define AT91CAP9_ID_AESTDES 23 /* Advanced Encryption Standard, Triple DES */ ++#define AT91CAP9_ID_ADC 24 /* Analog-to-Digital Converter */ ++#define AT91CAP9_ID_ISI 25 /* Image Sensor Interface */ ++#define AT91CAP9_ID_LCDC 26 /* LCD Controller */ ++#define AT91CAP9_ID_DMA 27 /* DMA Controller */ ++#define AT91CAP9_ID_UDPHS 28 /* USB High Speed Device Port */ ++#define AT91CAP9_ID_UHP 29 /* USB Host Port */ ++#define AT91CAP9_ID_IRQ0 30 /* Advanced Interrupt Controller (IRQ0) */ ++#define AT91CAP9_ID_IRQ1 31 /* Advanced Interrupt Controller (IRQ1) */ ++ ++/* ++ * User Peripheral physical base addresses. ++ */ ++#define AT91CAP9_BASE_UDPHS 0xfff78000 ++#define AT91CAP9_BASE_TCB0 0xfff7c000 ++#define AT91CAP9_BASE_TC0 0xfff7c000 ++#define AT91CAP9_BASE_TC1 0xfff7c040 ++#define AT91CAP9_BASE_TC2 0xfff7c080 ++#define AT91CAP9_BASE_MCI0 0xfff80000 ++#define AT91CAP9_BASE_MCI1 0xfff84000 ++#define AT91CAP9_BASE_TWI 0xfff88000 ++#define AT91CAP9_BASE_US0 0xfff8c000 ++#define AT91CAP9_BASE_US1 0xfff90000 ++#define AT91CAP9_BASE_US2 0xfff94000 ++#define AT91CAP9_BASE_SSC0 0xfff98000 ++#define AT91CAP9_BASE_SSC1 0xfff9c000 ++#define AT91CAP9_BASE_AC97C 0xfffa0000 ++#define AT91CAP9_BASE_SPI0 0xfffa4000 ++#define AT91CAP9_BASE_SPI1 0xfffa8000 ++#define AT91CAP9_BASE_CAN 0xfffac000 ++#define AT91CAP9_BASE_PWMC 0xfffb8000 ++#define AT91CAP9_BASE_EMAC 0xfffbc000 ++#define AT91CAP9_BASE_ADC 0xfffc0000 ++#define AT91CAP9_BASE_ISI 0xfffc4000 ++#define AT91_BASE_SYS 0xffffe200 ++ ++/* ++ * System Peripherals (offset from AT91_BASE_SYS) ++ */ ++#define AT91_ECC (0xffffe200 - AT91_BASE_SYS) ++#define AT91_BCRAMC (0xffffe400 - AT91_BASE_SYS) ++#define AT91_DDRSDRC (0xffffe600 - AT91_BASE_SYS) ++#define AT91_SMC (0xffffe800 - AT91_BASE_SYS) ++#define AT91_MATRIX (0xffffea00 - AT91_BASE_SYS) ++#define AT91_CCFG (0xffffeb10 - AT91_BASE_SYS) ++#define AT91_DMA (0xffffec00 - AT91_BASE_SYS) ++#define AT91_DBGU (0xffffee00 - AT91_BASE_SYS) ++#define AT91_AIC (0xfffff000 - AT91_BASE_SYS) ++#define AT91_PIOA (0xfffff200 - AT91_BASE_SYS) ++#define AT91_PIOB (0xfffff400 - AT91_BASE_SYS) ++#define AT91_PIOC (0xfffff600 - AT91_BASE_SYS) ++#define AT91_PIOD (0xfffff800 - AT91_BASE_SYS) ++#define AT91_PMC (0xfffffc00 - AT91_BASE_SYS) ++#define AT91_RSTC (0xfffffd00 - AT91_BASE_SYS) ++#define AT91_SHDWC (0xfffffd10 - AT91_BASE_SYS) ++#define AT91_RTT (0xfffffd20 - AT91_BASE_SYS) ++#define AT91_PIT (0xfffffd30 - AT91_BASE_SYS) ++#define AT91_WDT (0xfffffd40 - AT91_BASE_SYS) ++#define AT91_GPBR (0xfffffd50 - AT91_BASE_SYS) ++ ++#define AT91_USART0 AT91CAP9_BASE_US0 ++#define AT91_USART1 AT91CAP9_BASE_US1 ++#define AT91_USART2 AT91CAP9_BASE_US2 ++ ++ ++/* ++ * Internal Memory. ++ */ ++#define AT91CAP9_SRAM_BASE 0x00100000 /* Internal SRAM base address */ ++#define AT91CAP9_SRAM_SIZE (32 * SZ_1K) /* Internal SRAM size (32Kb) */ ++ ++#define AT91CAP9_ROM_BASE 0x00400000 /* Internal ROM base address */ ++#define AT91CAP9_ROM_SIZE (32 * SZ_1K) /* Internal ROM size (32Kb) */ ++ ++#define AT91CAP9_LCDC_BASE 0x00500000 /* LCD Controller */ ++#define AT91CAP9_UDPHS_BASE 0x00600000 /* USB High Speed Device Port */ ++#define AT91CAP9_UHP_BASE 0x00700000 /* USB Host controller */ ++ ++#define CONFIG_DRAM_BASE AT91_CHIPSELECT_6 ++ ++#endif +diff -urN -x CVS linux-2.6.24/include/asm-arm/arch-at91/at91cap9_ddrsdr.h linux-2.6/include/asm-arm/arch-at91/at91cap9_ddrsdr.h +--- linux-2.6.24/include/asm-arm/arch-at91/at91cap9_ddrsdr.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-2.6/include/asm-arm/arch-at91/at91cap9_ddrsdr.h 2008-03-01 21:29:08.000000000 +0200 +@@ -0,0 +1,100 @@ ++/* ++ * include/asm-arm/arch-at91/at91cap9_ddrsdr.h ++ * ++ * DDR/SDR Controller (DDRSDRC) - System peripherals registers. ++ * Based on AT91CAP9 datasheet revision B. ++ * ++ * 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 AT91CAP9_DDRSDR_H ++#define AT91CAP9_DDRSDR_H ++ ++#define AT91_DDRSDRC_MR (AT91_DDRSDRC + 0x00) /* Mode Register */ ++#define AT91_DDRSDRC_MODE (0xf << 0) /* Command Mode */ ++#define AT91_DDRSDRC_MODE_NORMAL 0 ++#define AT91_DDRSDRC_MODE_NOP 1 ++#define AT91_DDRSDRC_MODE_PRECHARGE 2 ++#define AT91_DDRSDRC_MODE_LMR 3 ++#define AT91_DDRSDRC_MODE_REFRESH 4 ++#define AT91_DDRSDRC_MODE_EXT_LMR 5 ++#define AT91_DDRSDRC_MODE_DEEP 6 ++ ++#define AT91_DDRSDRC_RTR (AT91_DDRSDRC + 0x04) /* Refresh Timer Register */ ++#define AT91_DDRSDRC_COUNT (0xfff << 0) /* Refresh Timer Counter */ ++ ++#define AT91_DDRSDRC_CR (AT91_DDRSDRC + 0x08) /* Configuration Register */ ++#define AT91_DDRSDRC_NC (3 << 0) /* Number of Column Bits */ ++#define AT91_DDRSDRC_NC_SDR8 (0 << 0) ++#define AT91_DDRSDRC_NC_SDR9 (1 << 0) ++#define AT91_DDRSDRC_NC_SDR10 (2 << 0) ++#define AT91_DDRSDRC_NC_SDR11 (3 << 0) ++#define AT91_DDRSDRC_NC_DDR9 (0 << 0) ++#define AT91_DDRSDRC_NC_DDR10 (1 << 0) ++#define AT91_DDRSDRC_NC_DDR11 (2 << 0) ++#define AT91_DDRSDRC_NC_DDR12 (3 << 0) ++#define AT91_DDRSDRC_NR (3 << 2) /* Number of Row Bits */ ++#define AT91_DDRSDRC_NR_11 (0 << 2) ++#define AT91_DDRSDRC_NR_12 (1 << 2) ++#define AT91_DDRSDRC_NR_13 (2 << 2) ++#define AT91_DDRSDRC_CAS (7 << 4) /* CAS Latency */ ++#define AT91_DDRSDRC_CAS_2 (2 << 4) ++#define AT91_DDRSDRC_CAS_3 (3 << 4) ++#define AT91_DDRSDRC_CAS_25 (6 << 4) ++#define AT91_DDRSDRC_DLL (1 << 7) /* Reset DLL */ ++#define AT91_DDRSDRC_DICDS (1 << 8) /* Output impedance control */ ++ ++#define AT91_DDRSDRC_T0PR (AT91_DDRSDRC + 0x0C) /* Timing 0 Register */ ++#define AT91_DDRSDRC_TRAS (0xf << 0) /* Active to Precharge delay */ ++#define AT91_DDRSDRC_TRCD (0xf << 4) /* Row to Column delay */ ++#define AT91_DDRSDRC_TWR (0xf << 8) /* Write recovery delay */ ++#define AT91_DDRSDRC_TRC (0xf << 12) /* Row cycle delay */ ++#define AT91_DDRSDRC_TRP (0xf << 16) /* Row precharge delay */ ++#define AT91_DDRSDRC_TRRD (0xf << 20) /* Active BankA to BankB */ ++#define AT91_DDRSDRC_TWTR (1 << 24) /* Internal Write to Read delay */ ++#define AT91_DDRSDRC_TMRD (0xf << 28) /* Load mode to active/refresh delay */ ++ ++#define AT91_DDRSDRC_T1PR (AT91_DDRSDRC + 0x10) /* Timing 1 Register */ ++#define AT91_DDRSDRC_TRFC (0x1f << 0) /* Row Cycle Delay */ ++#define AT91_DDRSDRC_TXSNR (0xff << 8) /* Exit self-refresh to non-read */ ++#define AT91_DDRSDRC_TXSRD (0xff << 16) /* Exit self-refresh to read */ ++#define AT91_DDRSDRC_TXP (0xf << 24) /* Exit power-down delay */ ++ ++#define AT91_DDRSDRC_LPR (AT91_DDRSDRC + 0x18) /* Low Power Register */ ++#define AT91_DDRSDRC_LPCB (3 << 0) /* Low-power Configurations */ ++#define AT91_DDRSDRC_LPCB_DISABLE 0 ++#define AT91_DDRSDRC_LPCB_SELF_REFRESH 1 ++#define AT91_DDRSDRC_LPCB_POWER_DOWN 2 ++#define AT91_DDRSDRC_LPCB_DEEP_POWER_DOWN 3 ++#define AT91_DDRSDRC_CLKFR (1 << 2) /* Clock Frozen */ ++#define AT91_DDRSDRC_PASR (7 << 4) /* Partial Array Self Refresh */ ++#define AT91_DDRSDRC_TCSR (3 << 8) /* Temperature Compensated Self Refresh */ ++#define AT91_DDRSDRC_DS (3 << 10) /* Drive Strength */ ++#define AT91_DDRSDRC_TIMEOUT (3 << 12) /* Time to define when Low Power Mode is enabled */ ++#define AT91_DDRSDRC_TIMEOUT_0_CLK_CYCLES (0 << 12) ++#define AT91_DDRSDRC_TIMEOUT_64_CLK_CYCLES (1 << 12) ++#define AT91_DDRSDRC_TIMEOUT_128_CLK_CYCLES (2 << 12) ++ ++#define AT91_DDRSDRC_MDR (AT91_DDRSDRC + 0x1C) /* Memory Device Register */ ++#define AT91_DDRSDRC_MD (3 << 0) /* Memory Device Type */ ++#define AT91_DDRSDRC_MD_SDR 0 ++#define AT91_DDRSDRC_MD_LOW_POWER_SDR 1 ++#define AT91_DDRSDRC_MD_DDR 2 ++#define AT91_DDRSDRC_MD_LOW_POWER_DDR 3 ++ ++#define AT91_DDRSDRC_DLLR (AT91_DDRSDRC + 0x20) /* DLL Information Register */ ++#define AT91_DDRSDRC_MDINC (1 << 0) /* Master Delay increment */ ++#define AT91_DDRSDRC_MDDEC (1 << 1) /* Master Delay decrement */ ++#define AT91_DDRSDRC_MDOVF (1 << 2) /* Master Delay Overflow */ ++#define AT91_DDRSDRC_SDCOVF (1 << 3) /* Slave Delay Correction Overflow */ ++#define AT91_DDRSDRC_SDCUDF (1 << 4) /* Slave Delay Correction Underflow */ ++#define AT91_DDRSDRC_SDERF (1 << 5) /* Slave Delay Correction error */ ++#define AT91_DDRSDRC_MDVAL (0xff << 8) /* Master Delay value */ ++#define AT91_DDRSDRC_SDVAL (0xff << 16) /* Slave Delay value */ ++#define AT91_DDRSDRC_SDCVAL (0xff << 24) /* Slave Delay Correction value */ ++ ++ ++#endif +diff -urN -x CVS linux-2.6.24/include/asm-arm/arch-at91/at91cap9_matrix.h linux-2.6/include/asm-arm/arch-at91/at91cap9_matrix.h +--- linux-2.6.24/include/asm-arm/arch-at91/at91cap9_matrix.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-2.6/include/asm-arm/arch-at91/at91cap9_matrix.h 2008-02-18 22:43:38.000000000 +0200 +@@ -0,0 +1,132 @@ ++/* ++ * include/asm-arm/arch-at91/at91cap9_matrix.h ++ * ++ * Copyright (C) 2007 Stelian Pop <stelian.pop@leadtechdesign.com> ++ * Copyright (C) 2007 Lead Tech Design <www.leadtechdesign.com> ++ * Copyright (C) 2006 Atmel Corporation. ++ * ++ * Memory Controllers (MATRIX, EBI) - System peripherals registers. ++ * Based on AT91CAP9 datasheet revision B (Preliminary). ++ * ++ * 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 AT91CAP9_MATRIX_H ++#define AT91CAP9_MATRIX_H ++ ++#define AT91_MATRIX_MCFG0 (AT91_MATRIX + 0x00) /* Master Configuration Register 0 */ ++#define AT91_MATRIX_MCFG1 (AT91_MATRIX + 0x04) /* Master Configuration Register 1 */ ++#define AT91_MATRIX_MCFG2 (AT91_MATRIX + 0x08) /* Master Configuration Register 2 */ ++#define AT91_MATRIX_MCFG3 (AT91_MATRIX + 0x0C) /* Master Configuration Register 3 */ ++#define AT91_MATRIX_MCFG4 (AT91_MATRIX + 0x10) /* Master Configuration Register 4 */ ++#define AT91_MATRIX_MCFG5 (AT91_MATRIX + 0x14) /* Master Configuration Register 5 */ ++#define AT91_MATRIX_MCFG6 (AT91_MATRIX + 0x18) /* Master Configuration Register 6 */ ++#define AT91_MATRIX_MCFG7 (AT91_MATRIX + 0x1C) /* Master Configuration Register 7 */ ++#define AT91_MATRIX_MCFG8 (AT91_MATRIX + 0x20) /* Master Configuration Register 8 */ ++#define AT91_MATRIX_MCFG9 (AT91_MATRIX + 0x24) /* Master Configuration Register 9 */ ++#define AT91_MATRIX_MCFG10 (AT91_MATRIX + 0x28) /* Master Configuration Register 10 */ ++#define AT91_MATRIX_MCFG11 (AT91_MATRIX + 0x2C) /* Master Configuration Register 11 */ ++#define AT91_MATRIX_ULBT (7 << 0) /* Undefined Length Burst Type */ ++#define AT91_MATRIX_ULBT_INFINITE (0 << 0) ++#define AT91_MATRIX_ULBT_SINGLE (1 << 0) ++#define AT91_MATRIX_ULBT_FOUR (2 << 0) ++#define AT91_MATRIX_ULBT_EIGHT (3 << 0) ++#define AT91_MATRIX_ULBT_SIXTEEN (4 << 0) ++ ++#define AT91_MATRIX_SCFG0 (AT91_MATRIX + 0x40) /* Slave Configuration Register 0 */ ++#define AT91_MATRIX_SCFG1 (AT91_MATRIX + 0x44) /* Slave Configuration Register 1 */ ++#define AT91_MATRIX_SCFG2 (AT91_MATRIX + 0x48) /* Slave Configuration Register 2 */ ++#define AT91_MATRIX_SCFG3 (AT91_MATRIX + 0x4C) /* Slave Configuration Register 3 */ ++#define AT91_MATRIX_SCFG4 (AT91_MATRIX + 0x50) /* Slave Configuration Register 4 */ ++#define AT91_MATRIX_SCFG5 (AT91_MATRIX + 0x54) /* Slave Configuration Register 5 */ ++#define AT91_MATRIX_SCFG6 (AT91_MATRIX + 0x58) /* Slave Configuration Register 6 */ ++#define AT91_MATRIX_SCFG7 (AT91_MATRIX + 0x5C) /* Slave Configuration Register 7 */ ++#define AT91_MATRIX_SCFG8 (AT91_MATRIX + 0x60) /* Slave Configuration Register 8 */ ++#define AT91_MATRIX_SCFG9 (AT91_MATRIX + 0x64) /* Slave Configuration Register 9 */ ++#define AT91_MATRIX_SLOT_CYCLE (0xff << 0) /* Maximum Number of Allowed Cycles for a Burst */ ++#define AT91_MATRIX_DEFMSTR_TYPE (3 << 16) /* Default Master Type */ ++#define AT91_MATRIX_DEFMSTR_TYPE_NONE (0 << 16) ++#define AT91_MATRIX_DEFMSTR_TYPE_LAST (1 << 16) ++#define AT91_MATRIX_DEFMSTR_TYPE_FIXED (2 << 16) ++#define AT91_MATRIX_FIXED_DEFMSTR (0xf << 18) /* Fixed Index of Default Master */ ++#define AT91_MATRIX_ARBT (3 << 24) /* Arbitration Type */ ++#define AT91_MATRIX_ARBT_ROUND_ROBIN (0 << 24) ++#define AT91_MATRIX_ARBT_FIXED_PRIORITY (1 << 24) ++ ++#define AT91_MATRIX_PRAS0 (AT91_MATRIX + 0x80) /* Priority Register A for Slave 0 */ ++#define AT91_MATRIX_PRBS0 (AT91_MATRIX + 0x84) /* Priority Register B for Slave 0 */ ++#define AT91_MATRIX_PRAS1 (AT91_MATRIX + 0x88) /* Priority Register A for Slave 1 */ ++#define AT91_MATRIX_PRBS1 (AT91_MATRIX + 0x8C) /* Priority Register B for Slave 1 */ ++#define AT91_MATRIX_PRAS2 (AT91_MATRIX + 0x90) /* Priority Register A for Slave 2 */ ++#define AT91_MATRIX_PRBS2 (AT91_MATRIX + 0x94) /* Priority Register B for Slave 2 */ ++#define AT91_MATRIX_PRAS3 (AT91_MATRIX + 0x98) /* Priority Register A for Slave 3 */ ++#define AT91_MATRIX_PRBS3 (AT91_MATRIX + 0x9C) /* Priority Register B for Slave 3 */ ++#define AT91_MATRIX_PRAS4 (AT91_MATRIX + 0xA0) /* Priority Register A for Slave 4 */ ++#define AT91_MATRIX_PRBS4 (AT91_MATRIX + 0xA4) /* Priority Register B for Slave 4 */ ++#define AT91_MATRIX_PRAS5 (AT91_MATRIX + 0xA8) /* Priority Register A for Slave 5 */ ++#define AT91_MATRIX_PRBS5 (AT91_MATRIX + 0xAC) /* Priority Register B for Slave 5 */ ++#define AT91_MATRIX_PRAS6 (AT91_MATRIX + 0xB0) /* Priority Register A for Slave 6 */ ++#define AT91_MATRIX_PRBS6 (AT91_MATRIX + 0xB4) /* Priority Register B for Slave 6 */ ++#define AT91_MATRIX_PRAS7 (AT91_MATRIX + 0xB8) /* Priority Register A for Slave 7 */ ++#define AT91_MATRIX_PRBS7 (AT91_MATRIX + 0xBC) /* Priority Register B for Slave 7 */ ++#define AT91_MATRIX_PRAS8 (AT91_MATRIX + 0xC0) /* Priority Register A for Slave 8 */ ++#define AT91_MATRIX_PRBS8 (AT91_MATRIX + 0xC4) /* Priority Register B for Slave 8 */ ++#define AT91_MATRIX_PRAS9 (AT91_MATRIX + 0xC8) /* Priority Register A for Slave 9 */ ++#define AT91_MATRIX_PRBS9 (AT91_MATRIX + 0xCC) /* Priority Register B for Slave 9 */ ++#define AT91_MATRIX_M0PR (3 << 0) /* Master 0 Priority */ ++#define AT91_MATRIX_M1PR (3 << 4) /* Master 1 Priority */ ++#define AT91_MATRIX_M2PR (3 << 8) /* Master 2 Priority */ ++#define AT91_MATRIX_M3PR (3 << 12) /* Master 3 Priority */ ++#define AT91_MATRIX_M4PR (3 << 16) /* Master 4 Priority */ ++#define AT91_MATRIX_M5PR (3 << 20) /* Master 5 Priority */ ++#define AT91_MATRIX_M6PR (3 << 24) /* Master 6 Priority */ ++#define AT91_MATRIX_M7PR (3 << 28) /* Master 7 Priority */ ++#define AT91_MATRIX_M8PR (3 << 0) /* Master 8 Priority (in Register B) */ ++#define AT91_MATRIX_M9PR (3 << 4) /* Master 9 Priority (in Register B) */ ++#define AT91_MATRIX_M10PR (3 << 8) /* Master 10 Priority (in Register B) */ ++#define AT91_MATRIX_M11PR (3 << 12) /* Master 11 Priority (in Register B) */ ++ ++#define AT91_MATRIX_MRCR (AT91_MATRIX + 0x100) /* Master Remap Control Register */ ++#define AT91_MATRIX_RCB0 (1 << 0) /* Remap Command for AHB Master 0 (ARM926EJ-S Instruction Master) */ ++#define AT91_MATRIX_RCB1 (1 << 1) /* Remap Command for AHB Master 1 (ARM926EJ-S Data Master) */ ++#define AT91_MATRIX_RCB2 (1 << 2) ++#define AT91_MATRIX_RCB3 (1 << 3) ++#define AT91_MATRIX_RCB4 (1 << 4) ++#define AT91_MATRIX_RCB5 (1 << 5) ++#define AT91_MATRIX_RCB6 (1 << 6) ++#define AT91_MATRIX_RCB7 (1 << 7) ++#define AT91_MATRIX_RCB8 (1 << 8) ++#define AT91_MATRIX_RCB9 (1 << 9) ++#define AT91_MATRIX_RCB10 (1 << 10) ++#define AT91_MATRIX_RCB11 (1 << 11) ++ ++#define AT91_MPBS0_SFR (AT91_MATRIX + 0x114) /* MPBlock Slave 0 Special Function Register */ ++#define AT91_MPBS1_SFR (AT91_MATRIX + 0x11C) /* MPBlock Slave 1 Special Function Register */ ++ ++#define AT91_MATRIX_EBICSA (AT91_MATRIX + 0x120) /* EBI Chip Select Assignment Register */ ++#define AT91_MATRIX_EBI_CS1A (1 << 1) /* Chip Select 1 Assignment */ ++#define AT91_MATRIX_EBI_CS1A_SMC (0 << 1) ++#define AT91_MATRIX_EBI_CS1A_BCRAMC (1 << 1) ++#define AT91_MATRIX_EBI_CS3A (1 << 3) /* Chip Select 3 Assignment */ ++#define AT91_MATRIX_EBI_CS3A_SMC (0 << 3) ++#define AT91_MATRIX_EBI_CS3A_SMC_SMARTMEDIA (1 << 3) ++#define AT91_MATRIX_EBI_CS4A (1 << 4) /* Chip Select 4 Assignment */ ++#define AT91_MATRIX_EBI_CS4A_SMC (0 << 4) ++#define AT91_MATRIX_EBI_CS4A_SMC_CF1 (1 << 4) ++#define AT91_MATRIX_EBI_CS5A (1 << 5) /* Chip Select 5 Assignment */ ++#define AT91_MATRIX_EBI_CS5A_SMC (0 << 5) ++#define AT91_MATRIX_EBI_CS5A_SMC_CF2 (1 << 5) ++#define AT91_MATRIX_EBI_DBPUC (1 << 8) /* Data Bus Pull-up Configuration */ ++#define AT91_MATRIX_EBI_DQSPDC (1 << 9) /* Data Qualifier Strobe Pull-Down Configuration */ ++#define AT91_MATRIX_EBI_VDDIOMSEL (1 << 16) /* Memory voltage selection */ ++#define AT91_MATRIX_EBI_VDDIOMSEL_1_8V (0 << 16) ++#define AT91_MATRIX_EBI_VDDIOMSEL_3_3V (1 << 16) ++ ++#define AT91_MPBS2_SFR (AT91_MATRIX + 0x12C) /* MPBlock Slave 2 Special Function Register */ ++#define AT91_MPBS3_SFR (AT91_MATRIX + 0x130) /* MPBlock Slave 3 Special Function Register */ ++#define AT91_APB_SFR (AT91_MATRIX + 0x134) /* APB Bridge Special Function Register */ ++ ++#endif +diff -urN -x CVS linux-2.6.24/include/asm-arm/arch-at91/at91rm9200.h linux-2.6/include/asm-arm/arch-at91/at91rm9200.h +--- linux-2.6.24/include/asm-arm/arch-at91/at91rm9200.h 2007-10-09 22:31:38.000000000 +0200 ++++ linux-2.6/include/asm-arm/arch-at91/at91rm9200.h 2008-02-24 19:07:01.000000000 +0200 +@@ -95,6 +95,12 @@ + + #define AT91_MATRIX 0 /* not supported */ + ++#define AT91_USART0 AT91RM9200_BASE_US0 ++#define AT91_USART1 AT91RM9200_BASE_US1 ++#define AT91_USART2 AT91RM9200_BASE_US2 ++#define AT91_USART3 AT91RM9200_BASE_US3 ++ ++ + /* + * Internal Memory. + */ +diff -urN -x CVS linux-2.6.24/include/asm-arm/arch-at91/at91sam9260.h linux-2.6/include/asm-arm/arch-at91/at91sam9260.h +--- linux-2.6.24/include/asm-arm/arch-at91/at91sam9260.h 2007-10-09 22:31:38.000000000 +0200 ++++ linux-2.6/include/asm-arm/arch-at91/at91sam9260.h 2008-02-24 19:00:30.000000000 +0200 +@@ -99,6 +99,13 @@ + #define AT91_WDT (0xfffffd40 - AT91_BASE_SYS) + #define AT91_GPBR (0xfffffd50 - AT91_BASE_SYS) + ++#define AT91_USART0 AT91SAM9260_BASE_US0 ++#define AT91_USART1 AT91SAM9260_BASE_US1 ++#define AT91_USART2 AT91SAM9260_BASE_US2 ++#define AT91_USART3 AT91SAM9260_BASE_US3 ++#define AT91_USART4 AT91SAM9260_BASE_US4 ++#define AT91_USART5 AT91SAM9260_BASE_US5 ++ + + /* + * Internal Memory. +diff -urN -x CVS linux-2.6.24/include/asm-arm/arch-at91/at91sam9260_matrix.h linux-2.6/include/asm-arm/arch-at91/at91sam9260_matrix.h +--- linux-2.6.24/include/asm-arm/arch-at91/at91sam9260_matrix.h 2007-10-09 22:31:38.000000000 +0200 ++++ linux-2.6/include/asm-arm/arch-at91/at91sam9260_matrix.h 2008-01-16 21:24:29.000000000 +0200 +@@ -67,7 +67,7 @@ + #define AT91_MATRIX_CS4A (1 << 4) /* Chip Select 4 Assignment */ + #define AT91_MATRIX_CS4A_SMC (0 << 4) + #define AT91_MATRIX_CS4A_SMC_CF1 (1 << 4) +-#define AT91_MATRIX_CS5A (1 << 5 ) /* Chip Select 5 Assignment */ ++#define AT91_MATRIX_CS5A (1 << 5) /* Chip Select 5 Assignment */ + #define AT91_MATRIX_CS5A_SMC (0 << 5) + #define AT91_MATRIX_CS5A_SMC_CF2 (1 << 5) + #define AT91_MATRIX_DBPUC (1 << 8) /* Data Bus Pull-up Configuration */ +diff -urN -x CVS linux-2.6.24/include/asm-arm/arch-at91/at91sam9261.h linux-2.6/include/asm-arm/arch-at91/at91sam9261.h +--- linux-2.6.24/include/asm-arm/arch-at91/at91sam9261.h 2007-10-09 22:31:38.000000000 +0200 ++++ linux-2.6/include/asm-arm/arch-at91/at91sam9261.h 2008-02-24 19:00:30.000000000 +0200 +@@ -84,6 +84,10 @@ + #define AT91_WDT (0xfffffd40 - AT91_BASE_SYS) + #define AT91_GPBR (0xfffffd50 - AT91_BASE_SYS) + ++#define AT91_USART0 AT91SAM9261_BASE_US0 ++#define AT91_USART1 AT91SAM9261_BASE_US1 ++#define AT91_USART2 AT91SAM9261_BASE_US2 ++ + + /* + * Internal Memory. +diff -urN -x CVS linux-2.6.24/include/asm-arm/arch-at91/at91sam9263.h linux-2.6/include/asm-arm/arch-at91/at91sam9263.h +--- linux-2.6.24/include/asm-arm/arch-at91/at91sam9263.h 2007-10-09 22:31:38.000000000 +0200 ++++ linux-2.6/include/asm-arm/arch-at91/at91sam9263.h 2008-02-25 21:16:43.000000000 +0200 +@@ -101,8 +101,14 @@ + #define AT91_RTT1 (0xfffffd50 - AT91_BASE_SYS) + #define AT91_GPBR (0xfffffd60 - AT91_BASE_SYS) + ++#define AT91_SDRAMC AT91_SDRAMC0 + #define AT91_SMC AT91_SMC0 + ++#define AT91_USART0 AT91SAM9263_BASE_US0 ++#define AT91_USART1 AT91SAM9263_BASE_US1 ++#define AT91_USART2 AT91SAM9263_BASE_US2 ++ ++ + /* + * Internal Memory. + */ +diff -urN -x CVS linux-2.6.24/include/asm-arm/arch-at91/at91sam9263_matrix.h linux-2.6/include/asm-arm/arch-at91/at91sam9263_matrix.h +--- linux-2.6.24/include/asm-arm/arch-at91/at91sam9263_matrix.h 2007-10-09 22:31:38.000000000 +0200 ++++ linux-2.6/include/asm-arm/arch-at91/at91sam9263_matrix.h 2008-02-18 22:44:20.000000000 +0200 +@@ -44,7 +44,7 @@ + #define AT91_MATRIX_DEFMSTR_TYPE_NONE (0 << 16) + #define AT91_MATRIX_DEFMSTR_TYPE_LAST (1 << 16) + #define AT91_MATRIX_DEFMSTR_TYPE_FIXED (2 << 16) +-#define AT91_MATRIX_FIXED_DEFMSTR (7 << 18) /* Fixed Index of Default Master */ ++#define AT91_MATRIX_FIXED_DEFMSTR (0xf << 18) /* Fixed Index of Default Master */ + #define AT91_MATRIX_ARBT (3 << 24) /* Arbitration Type */ + #define AT91_MATRIX_ARBT_ROUND_ROBIN (0 << 24) + #define AT91_MATRIX_ARBT_FIXED_PRIORITY (1 << 24) +diff -urN -x CVS linux-2.6.24/include/asm-arm/arch-at91/at91sam926x_mc.h linux-2.6/include/asm-arm/arch-at91/at91sam926x_mc.h +--- linux-2.6.24/include/asm-arm/arch-at91/at91sam926x_mc.h 2007-10-09 22:31:38.000000000 +0200 ++++ linux-2.6/include/asm-arm/arch-at91/at91sam926x_mc.h 1970-01-01 02:00:00.000000000 +0200 +@@ -1,141 +0,0 @@ +-/* +- * include/asm-arm/arch-at91/at91sam926x_mc.h +- * +- * Memory Controllers (SMC, SDRAMC) - System peripherals registers. +- * Based on AT91SAM9261 datasheet revision D. +- * +- * 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 AT91SAM926x_MC_H +-#define AT91SAM926x_MC_H +- +-/* SDRAM Controller (SDRAMC) registers */ +-#define AT91_SDRAMC_MR (AT91_SDRAMC + 0x00) /* SDRAM Controller Mode Register */ +-#define AT91_SDRAMC_MODE (0xf << 0) /* Command Mode */ +-#define AT91_SDRAMC_MODE_NORMAL 0 +-#define AT91_SDRAMC_MODE_NOP 1 +-#define AT91_SDRAMC_MODE_PRECHARGE 2 +-#define AT91_SDRAMC_MODE_LMR 3 +-#define AT91_SDRAMC_MODE_REFRESH 4 +-#define AT91_SDRAMC_MODE_EXT_LMR 5 +-#define AT91_SDRAMC_MODE_DEEP 6 +- +-#define AT91_SDRAMC_TR (AT91_SDRAMC + 0x04) /* SDRAM Controller Refresh Timer Register */ +-#define AT91_SDRAMC_COUNT (0xfff << 0) /* Refresh Timer Counter */ +- +-#define AT91_SDRAMC_CR (AT91_SDRAMC + 0x08) /* SDRAM Controller Configuration Register */ +-#define AT91_SDRAMC_NC (3 << 0) /* Number of Column Bits */ +-#define AT91_SDRAMC_NC_8 (0 << 0) +-#define AT91_SDRAMC_NC_9 (1 << 0) +-#define AT91_SDRAMC_NC_10 (2 << 0) +-#define AT91_SDRAMC_NC_11 (3 << 0) +-#define AT91_SDRAMC_NR (3 << 2) /* Number of Row Bits */ +-#define AT91_SDRAMC_NR_11 (0 << 2) +-#define AT91_SDRAMC_NR_12 (1 << 2) +-#define AT91_SDRAMC_NR_13 (2 << 2) +-#define AT91_SDRAMC_NB (1 << 4) /* Number of Banks */ +-#define AT91_SDRAMC_NB_2 (0 << 4) +-#define AT91_SDRAMC_NB_4 (1 << 4) +-#define AT91_SDRAMC_CAS (3 << 5) /* CAS Latency */ +-#define AT91_SDRAMC_CAS_1 (1 << 5) +-#define AT91_SDRAMC_CAS_2 (2 << 5) +-#define AT91_SDRAMC_CAS_3 (3 << 5) +-#define AT91_SDRAMC_DBW (1 << 7) /* Data Bus Width */ +-#define AT91_SDRAMC_DBW_32 (0 << 7) +-#define AT91_SDRAMC_DBW_16 (1 << 7) +-#define AT91_SDRAMC_TWR (0xf << 8) /* Write Recovery Delay */ +-#define AT91_SDRAMC_TRC (0xf << 12) /* Row Cycle Delay */ +-#define AT91_SDRAMC_TRP (0xf << 16) /* Row Precharge Delay */ +-#define AT91_SDRAMC_TRCD (0xf << 20) /* Row to Column Delay */ +-#define AT91_SDRAMC_TRAS (0xf << 24) /* Active to Precharge Delay */ +-#define AT91_SDRAMC_TXSR (0xf << 28) /* Exit Self Refresh to Active Delay */ +- +-#define AT91_SDRAMC_LPR (AT91_SDRAMC + 0x10) /* SDRAM Controller Low Power Register */ +-#define AT91_SDRAMC_LPCB (3 << 0) /* Low-power Configurations */ +-#define AT91_SDRAMC_LPCB_DISABLE 0 +-#define AT91_SDRAMC_LPCB_SELF_REFRESH 1 +-#define AT91_SDRAMC_LPCB_POWER_DOWN 2 +-#define AT91_SDRAMC_LPCB_DEEP_POWER_DOWN 3 +-#define AT91_SDRAMC_PASR (7 << 4) /* Partial Array Self Refresh */ +-#define AT91_SDRAMC_TCSR (3 << 8) /* Temperature Compensated Self Refresh */ +-#define AT91_SDRAMC_DS (3 << 10) /* Drive Strenght */ +-#define AT91_SDRAMC_TIMEOUT (3 << 12) /* Time to define when Low Power Mode is enabled */ +-#define AT91_SDRAMC_TIMEOUT_0_CLK_CYCLES (0 << 12) +-#define AT91_SDRAMC_TIMEOUT_64_CLK_CYCLES (1 << 12) +-#define AT91_SDRAMC_TIMEOUT_128_CLK_CYCLES (2 << 12) +- +-#define AT91_SDRAMC_IER (AT91_SDRAMC + 0x14) /* SDRAM Controller Interrupt Enable Register */ +-#define AT91_SDRAMC_IDR (AT91_SDRAMC + 0x18) /* SDRAM Controller Interrupt Disable Register */ +-#define AT91_SDRAMC_IMR (AT91_SDRAMC + 0x1C) /* SDRAM Controller Interrupt Mask Register */ +-#define AT91_SDRAMC_ISR (AT91_SDRAMC + 0x20) /* SDRAM Controller Interrupt Status Register */ +-#define AT91_SDRAMC_RES (1 << 0) /* Refresh Error Status */ +- +-#define AT91_SDRAMC_MDR (AT91_SDRAMC + 0x24) /* SDRAM Memory Device Register */ +-#define AT91_SDRAMC_MD (3 << 0) /* Memory Device Type */ +-#define AT91_SDRAMC_MD_SDRAM 0 +-#define AT91_SDRAMC_MD_LOW_POWER_SDRAM 1 +- +- +-/* Static Memory Controller (SMC) registers */ +-#define AT91_SMC_SETUP(n) (AT91_SMC + 0x00 + ((n)*0x10)) /* Setup Register for CS n */ +-#define AT91_SMC_NWESETUP (0x3f << 0) /* NWE Setup Length */ +-#define AT91_SMC_NWESETUP_(x) ((x) << 0) +-#define AT91_SMC_NCS_WRSETUP (0x3f << 8) /* NCS Setup Length in Write Access */ +-#define AT91_SMC_NCS_WRSETUP_(x) ((x) << 8) +-#define AT91_SMC_NRDSETUP (0x3f << 16) /* NRD Setup Length */ +-#define AT91_SMC_NRDSETUP_(x) ((x) << 16) +-#define AT91_SMC_NCS_RDSETUP (0x3f << 24) /* NCS Setup Length in Read Access */ +-#define AT91_SMC_NCS_RDSETUP_(x) ((x) << 24) +- +-#define AT91_SMC_PULSE(n) (AT91_SMC + 0x04 + ((n)*0x10)) /* Pulse Register for CS n */ +-#define AT91_SMC_NWEPULSE (0x7f << 0) /* NWE Pulse Length */ +-#define AT91_SMC_NWEPULSE_(x) ((x) << 0) +-#define AT91_SMC_NCS_WRPULSE (0x7f << 8) /* NCS Pulse Length in Write Access */ +-#define AT91_SMC_NCS_WRPULSE_(x)((x) << 8) +-#define AT91_SMC_NRDPULSE (0x7f << 16) /* NRD Pulse Length */ +-#define AT91_SMC_NRDPULSE_(x) ((x) << 16) +-#define AT91_SMC_NCS_RDPULSE (0x7f << 24) /* NCS Pulse Length in Read Access */ +-#define AT91_SMC_NCS_RDPULSE_(x)((x) << 24) +- +-#define AT91_SMC_CYCLE(n) (AT91_SMC + 0x08 + ((n)*0x10)) /* Cycle Register for CS n */ +-#define AT91_SMC_NWECYCLE (0x1ff << 0 ) /* Total Write Cycle Length */ +-#define AT91_SMC_NWECYCLE_(x) ((x) << 0) +-#define AT91_SMC_NRDCYCLE (0x1ff << 16) /* Total Read Cycle Length */ +-#define AT91_SMC_NRDCYCLE_(x) ((x) << 16) +- +-#define AT91_SMC_MODE(n) (AT91_SMC + 0x0c + ((n)*0x10)) /* Mode Register for CS n */ +-#define AT91_SMC_READMODE (1 << 0) /* Read Mode */ +-#define AT91_SMC_WRITEMODE (1 << 1) /* Write Mode */ +-#define AT91_SMC_EXNWMODE (3 << 4) /* NWAIT Mode */ +-#define AT91_SMC_EXNWMODE_DISABLE (0 << 4) +-#define AT91_SMC_EXNWMODE_FROZEN (2 << 4) +-#define AT91_SMC_EXNWMODE_READY (3 << 4) +-#define AT91_SMC_BAT (1 << 8) /* Byte Access Type */ +-#define AT91_SMC_BAT_SELECT (0 << 8) +-#define AT91_SMC_BAT_WRITE (1 << 8) +-#define AT91_SMC_DBW (3 << 12) /* Data Bus Width */ +-#define AT91_SMC_DBW_8 (0 << 12) +-#define AT91_SMC_DBW_16 (1 << 12) +-#define AT91_SMC_DBW_32 (2 << 12) +-#define AT91_SMC_TDF (0xf << 16) /* Data Float Time. */ +-#define AT91_SMC_TDF_(x) ((x) << 16) +-#define AT91_SMC_TDFMODE (1 << 20) /* TDF Optimization - Enabled */ +-#define AT91_SMC_PMEN (1 << 24) /* Page Mode Enabled */ +-#define AT91_SMC_PS (3 << 28) /* Page Size */ +-#define AT91_SMC_PS_4 (0 << 28) +-#define AT91_SMC_PS_8 (1 << 28) +-#define AT91_SMC_PS_16 (2 << 28) +-#define AT91_SMC_PS_32 (3 << 28) +- +-#if defined(AT91_SMC1) /* The AT91SAM9263 has 2 Static Memory contollers */ +-#define AT91_SMC1_SETUP(n) (AT91_SMC1 + 0x00 + ((n)*0x10)) /* Setup Register for CS n */ +-#define AT91_SMC1_PULSE(n) (AT91_SMC1 + 0x04 + ((n)*0x10)) /* Pulse Register for CS n */ +-#define AT91_SMC1_CYCLE(n) (AT91_SMC1 + 0x08 + ((n)*0x10)) /* Cycle Register for CS n */ +-#define AT91_SMC1_MODE(n) (AT91_SMC1 + 0x0c + ((n)*0x10)) /* Mode Register for CS n */ +-#endif +- +-#endif +diff -urN -x CVS linux-2.6.24/include/asm-arm/arch-at91/at91sam926x_sdramc.h linux-2.6/include/asm-arm/arch-at91/at91sam926x_sdramc.h +--- linux-2.6.24/include/asm-arm/arch-at91/at91sam926x_sdramc.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-2.6/include/asm-arm/arch-at91/at91sam926x_sdramc.h 2008-03-01 21:17:06.000000000 +0200 +@@ -0,0 +1,83 @@ ++/* ++ * include/asm-arm/arch-at91/at91sam926x_sdramc.h ++ * ++ * SDRAM Controllers (SDRAMC) - System peripherals registers. ++ * Based on AT91SAM9261 datasheet revision D. ++ * ++ * 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 AT91SAM926x_SDRAMC_H ++#define AT91SAM926x_SDRAMC_H ++ ++/* SDRAM Controller (SDRAMC) registers */ ++#define AT91_SDRAMC_MR (AT91_SDRAMC + 0x00) /* SDRAM Controller Mode Register */ ++#define AT91_SDRAMC_MODE (0xf << 0) /* Command Mode */ ++#define AT91_SDRAMC_MODE_NORMAL 0 ++#define AT91_SDRAMC_MODE_NOP 1 ++#define AT91_SDRAMC_MODE_PRECHARGE 2 ++#define AT91_SDRAMC_MODE_LMR 3 ++#define AT91_SDRAMC_MODE_REFRESH 4 ++#define AT91_SDRAMC_MODE_EXT_LMR 5 ++#define AT91_SDRAMC_MODE_DEEP 6 ++ ++#define AT91_SDRAMC_TR (AT91_SDRAMC + 0x04) /* SDRAM Controller Refresh Timer Register */ ++#define AT91_SDRAMC_COUNT (0xfff << 0) /* Refresh Timer Counter */ ++ ++#define AT91_SDRAMC_CR (AT91_SDRAMC + 0x08) /* SDRAM Controller Configuration Register */ ++#define AT91_SDRAMC_NC (3 << 0) /* Number of Column Bits */ ++#define AT91_SDRAMC_NC_8 (0 << 0) ++#define AT91_SDRAMC_NC_9 (1 << 0) ++#define AT91_SDRAMC_NC_10 (2 << 0) ++#define AT91_SDRAMC_NC_11 (3 << 0) ++#define AT91_SDRAMC_NR (3 << 2) /* Number of Row Bits */ ++#define AT91_SDRAMC_NR_11 (0 << 2) ++#define AT91_SDRAMC_NR_12 (1 << 2) ++#define AT91_SDRAMC_NR_13 (2 << 2) ++#define AT91_SDRAMC_NB (1 << 4) /* Number of Banks */ ++#define AT91_SDRAMC_NB_2 (0 << 4) ++#define AT91_SDRAMC_NB_4 (1 << 4) ++#define AT91_SDRAMC_CAS (3 << 5) /* CAS Latency */ ++#define AT91_SDRAMC_CAS_1 (1 << 5) ++#define AT91_SDRAMC_CAS_2 (2 << 5) ++#define AT91_SDRAMC_CAS_3 (3 << 5) ++#define AT91_SDRAMC_DBW (1 << 7) /* Data Bus Width */ ++#define AT91_SDRAMC_DBW_32 (0 << 7) ++#define AT91_SDRAMC_DBW_16 (1 << 7) ++#define AT91_SDRAMC_TWR (0xf << 8) /* Write Recovery Delay */ ++#define AT91_SDRAMC_TRC (0xf << 12) /* Row Cycle Delay */ ++#define AT91_SDRAMC_TRP (0xf << 16) /* Row Precharge Delay */ ++#define AT91_SDRAMC_TRCD (0xf << 20) /* Row to Column Delay */ ++#define AT91_SDRAMC_TRAS (0xf << 24) /* Active to Precharge Delay */ ++#define AT91_SDRAMC_TXSR (0xf << 28) /* Exit Self Refresh to Active Delay */ ++ ++#define AT91_SDRAMC_LPR (AT91_SDRAMC + 0x10) /* SDRAM Controller Low Power Register */ ++#define AT91_SDRAMC_LPCB (3 << 0) /* Low-power Configurations */ ++#define AT91_SDRAMC_LPCB_DISABLE 0 ++#define AT91_SDRAMC_LPCB_SELF_REFRESH 1 ++#define AT91_SDRAMC_LPCB_POWER_DOWN 2 ++#define AT91_SDRAMC_LPCB_DEEP_POWER_DOWN 3 ++#define AT91_SDRAMC_PASR (7 << 4) /* Partial Array Self Refresh */ ++#define AT91_SDRAMC_TCSR (3 << 8) /* Temperature Compensated Self Refresh */ ++#define AT91_SDRAMC_DS (3 << 10) /* Drive Strength */ ++#define AT91_SDRAMC_TIMEOUT (3 << 12) /* Time to define when Low Power Mode is enabled */ ++#define AT91_SDRAMC_TIMEOUT_0_CLK_CYCLES (0 << 12) ++#define AT91_SDRAMC_TIMEOUT_64_CLK_CYCLES (1 << 12) ++#define AT91_SDRAMC_TIMEOUT_128_CLK_CYCLES (2 << 12) ++ ++#define AT91_SDRAMC_IER (AT91_SDRAMC + 0x14) /* SDRAM Controller Interrupt Enable Register */ ++#define AT91_SDRAMC_IDR (AT91_SDRAMC + 0x18) /* SDRAM Controller Interrupt Disable Register */ ++#define AT91_SDRAMC_IMR (AT91_SDRAMC + 0x1C) /* SDRAM Controller Interrupt Mask Register */ ++#define AT91_SDRAMC_ISR (AT91_SDRAMC + 0x20) /* SDRAM Controller Interrupt Status Register */ ++#define AT91_SDRAMC_RES (1 << 0) /* Refresh Error Status */ ++ ++#define AT91_SDRAMC_MDR (AT91_SDRAMC + 0x24) /* SDRAM Memory Device Register */ ++#define AT91_SDRAMC_MD (3 << 0) /* Memory Device Type */ ++#define AT91_SDRAMC_MD_SDRAM 0 ++#define AT91_SDRAMC_MD_LOW_POWER_SDRAM 1 ++ ++ ++#endif +diff -urN -x CVS linux-2.6.24/include/asm-arm/arch-at91/at91sam926x_smc.h linux-2.6/include/asm-arm/arch-at91/at91sam926x_smc.h +--- linux-2.6.24/include/asm-arm/arch-at91/at91sam926x_smc.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-2.6/include/asm-arm/arch-at91/at91sam926x_smc.h 2008-03-01 20:28:24.000000000 +0200 +@@ -0,0 +1,73 @@ ++/* ++ * include/asm-arm/arch-at91/at91sam926x_smc.h ++ * ++ * Static Memory Controllers (SMC) - System peripherals registers. ++ * Based on AT91SAM9261 datasheet revision D. ++ * ++ * 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 AT91SAM926x_SMC_H ++#define AT91SAM926x_SMC_H ++ ++#define AT91_SMC_SETUP(n) (AT91_SMC + 0x00 + ((n)*0x10)) /* Setup Register for CS n */ ++#define AT91_SMC_NWESETUP (0x3f << 0) /* NWE Setup Length */ ++#define AT91_SMC_NWESETUP_(x) ((x) << 0) ++#define AT91_SMC_NCS_WRSETUP (0x3f << 8) /* NCS Setup Length in Write Access */ ++#define AT91_SMC_NCS_WRSETUP_(x) ((x) << 8) ++#define AT91_SMC_NRDSETUP (0x3f << 16) /* NRD Setup Length */ ++#define AT91_SMC_NRDSETUP_(x) ((x) << 16) ++#define AT91_SMC_NCS_RDSETUP (0x3f << 24) /* NCS Setup Length in Read Access */ ++#define AT91_SMC_NCS_RDSETUP_(x) ((x) << 24) ++ ++#define AT91_SMC_PULSE(n) (AT91_SMC + 0x04 + ((n)*0x10)) /* Pulse Register for CS n */ ++#define AT91_SMC_NWEPULSE (0x7f << 0) /* NWE Pulse Length */ ++#define AT91_SMC_NWEPULSE_(x) ((x) << 0) ++#define AT91_SMC_NCS_WRPULSE (0x7f << 8) /* NCS Pulse Length in Write Access */ ++#define AT91_SMC_NCS_WRPULSE_(x)((x) << 8) ++#define AT91_SMC_NRDPULSE (0x7f << 16) /* NRD Pulse Length */ ++#define AT91_SMC_NRDPULSE_(x) ((x) << 16) ++#define AT91_SMC_NCS_RDPULSE (0x7f << 24) /* NCS Pulse Length in Read Access */ ++#define AT91_SMC_NCS_RDPULSE_(x)((x) << 24) ++ ++#define AT91_SMC_CYCLE(n) (AT91_SMC + 0x08 + ((n)*0x10)) /* Cycle Register for CS n */ ++#define AT91_SMC_NWECYCLE (0x1ff << 0 ) /* Total Write Cycle Length */ ++#define AT91_SMC_NWECYCLE_(x) ((x) << 0) ++#define AT91_SMC_NRDCYCLE (0x1ff << 16) /* Total Read Cycle Length */ ++#define AT91_SMC_NRDCYCLE_(x) ((x) << 16) ++ ++#define AT91_SMC_MODE(n) (AT91_SMC + 0x0c + ((n)*0x10)) /* Mode Register for CS n */ ++#define AT91_SMC_READMODE (1 << 0) /* Read Mode */ ++#define AT91_SMC_WRITEMODE (1 << 1) /* Write Mode */ ++#define AT91_SMC_EXNWMODE (3 << 4) /* NWAIT Mode */ ++#define AT91_SMC_EXNWMODE_DISABLE (0 << 4) ++#define AT91_SMC_EXNWMODE_FROZEN (2 << 4) ++#define AT91_SMC_EXNWMODE_READY (3 << 4) ++#define AT91_SMC_BAT (1 << 8) /* Byte Access Type */ ++#define AT91_SMC_BAT_SELECT (0 << 8) ++#define AT91_SMC_BAT_WRITE (1 << 8) ++#define AT91_SMC_DBW (3 << 12) /* Data Bus Width */ ++#define AT91_SMC_DBW_8 (0 << 12) ++#define AT91_SMC_DBW_16 (1 << 12) ++#define AT91_SMC_DBW_32 (2 << 12) ++#define AT91_SMC_TDF (0xf << 16) /* Data Float Time. */ ++#define AT91_SMC_TDF_(x) ((x) << 16) ++#define AT91_SMC_TDFMODE (1 << 20) /* TDF Optimization - Enabled */ ++#define AT91_SMC_PMEN (1 << 24) /* Page Mode Enabled */ ++#define AT91_SMC_PS (3 << 28) /* Page Size */ ++#define AT91_SMC_PS_4 (0 << 28) ++#define AT91_SMC_PS_8 (1 << 28) ++#define AT91_SMC_PS_16 (2 << 28) ++#define AT91_SMC_PS_32 (3 << 28) ++ ++#if defined(AT91_SMC1) /* The AT91SAM9263 has 2 Static Memory contollers */ ++#define AT91_SMC1_SETUP(n) (AT91_SMC1 + 0x00 + ((n)*0x10)) /* Setup Register for CS n */ ++#define AT91_SMC1_PULSE(n) (AT91_SMC1 + 0x04 + ((n)*0x10)) /* Pulse Register for CS n */ ++#define AT91_SMC1_CYCLE(n) (AT91_SMC1 + 0x08 + ((n)*0x10)) /* Cycle Register for CS n */ ++#define AT91_SMC1_MODE(n) (AT91_SMC1 + 0x0c + ((n)*0x10)) /* Mode Register for CS n */ ++#endif ++ ++#endif +diff -urN -x CVS linux-2.6.24/include/asm-arm/arch-at91/at91sam9rl.h linux-2.6/include/asm-arm/arch-at91/at91sam9rl.h +--- linux-2.6.24/include/asm-arm/arch-at91/at91sam9rl.h 2007-10-09 22:31:38.000000000 +0200 ++++ linux-2.6/include/asm-arm/arch-at91/at91sam9rl.h 2008-02-24 19:00:30.000000000 +0200 +@@ -94,6 +94,11 @@ + #define AT91_GPBR (0xfffffd60 - AT91_BASE_SYS) + #define AT91_RTC (0xfffffe00 - AT91_BASE_SYS) + ++#define AT91_USART0 AT91SAM9RL_BASE_US0 ++#define AT91_USART1 AT91SAM9RL_BASE_US1 ++#define AT91_USART2 AT91SAM9RL_BASE_US2 ++#define AT91_USART3 AT91SAM9RL_BASE_US3 ++ + + /* + * Internal Memory. +diff -urN -x CVS linux-2.6.24/include/asm-arm/arch-at91/at91sam9rl_matrix.h linux-2.6/include/asm-arm/arch-at91/at91sam9rl_matrix.h +--- linux-2.6.24/include/asm-arm/arch-at91/at91sam9rl_matrix.h 2007-10-09 22:31:38.000000000 +0200 ++++ linux-2.6/include/asm-arm/arch-at91/at91sam9rl_matrix.h 2008-02-18 22:44:40.000000000 +0200 +@@ -38,7 +38,7 @@ + #define AT91_MATRIX_DEFMSTR_TYPE_NONE (0 << 16) + #define AT91_MATRIX_DEFMSTR_TYPE_LAST (1 << 16) + #define AT91_MATRIX_DEFMSTR_TYPE_FIXED (2 << 16) +-#define AT91_MATRIX_FIXED_DEFMSTR (7 << 18) /* Fixed Index of Default Master */ ++#define AT91_MATRIX_FIXED_DEFMSTR (0xf << 18) /* Fixed Index of Default Master */ + #define AT91_MATRIX_ARBT (3 << 24) /* Arbitration Type */ + #define AT91_MATRIX_ARBT_ROUND_ROBIN (0 << 24) + #define AT91_MATRIX_ARBT_FIXED_PRIORITY (1 << 24) +diff -urN -x CVS linux-2.6.24/include/asm-arm/arch-at91/board.h linux-2.6/include/asm-arm/arch-at91/board.h +--- linux-2.6.24/include/asm-arm/arch-at91/board.h 2008-03-01 22:02:15.000000000 +0200 ++++ linux-2.6/include/asm-arm/arch-at91/board.h 2008-03-01 23:39:28.000000000 +0200 +@@ -34,6 +34,7 @@ + #include <linux/mtd/partitions.h> + #include <linux/device.h> + #include <linux/i2c.h> ++#include <linux/leds.h> + #include <linux/spi/spi.h> + + /* USB Device */ +@@ -71,7 +72,7 @@ + }; + extern void __init at91_add_device_eth(struct at91_eth_data *data); + +-#if defined(CONFIG_ARCH_AT91SAM9260) || defined(CONFIG_ARCH_AT91SAM9263) ++#if defined(CONFIG_ARCH_AT91SAM9260) || defined(CONFIG_ARCH_AT91SAM9263) || defined(CONFIG_ARCH_AT91CAP9) + #define eth_platform_data at91_eth_data + #endif + +@@ -101,13 +102,23 @@ + extern void __init at91_add_device_spi(struct spi_board_info *devices, int nr_devices); + + /* Serial */ ++#define ATMEL_UART_CTS 0x01 ++#define ATMEL_UART_RTS 0x02 ++#define ATMEL_UART_DSR 0x04 ++#define ATMEL_UART_DTR 0x08 ++#define ATMEL_UART_DCD 0x10 ++#define ATMEL_UART_RI 0x20 ++ ++extern void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins); ++extern void __init at91_set_serial_console(unsigned portnr); ++ + struct at91_uart_config { + unsigned short console_tty; /* tty number of serial console */ + unsigned short nr_tty; /* number of serial tty's */ + short tty_map[]; /* map UART to tty number */ + }; + extern struct platform_device *atmel_default_console_device; +-extern void __init at91_init_serial(struct at91_uart_config *config); ++extern void __init __deprecated at91_init_serial(struct at91_uart_config *config); + + struct atmel_uart_data { + short use_dma_tx; /* use transmit DMA? */ +@@ -116,6 +127,23 @@ + }; + extern void __init at91_add_device_serial(void); + ++ /* ++ * SSC -- accessed through ssc_request(id). Drivers don't bind to SSC ++ * platform devices. Their SSC ID is part of their configuration data, ++ * along with information about which SSC signals they should use. ++ */ ++#define ATMEL_SSC_TK 0x01 ++#define ATMEL_SSC_TF 0x02 ++#define ATMEL_SSC_TD 0x04 ++#define ATMEL_SSC_TX (ATMEL_SSC_TK | ATMEL_SSC_TF | ATMEL_SSC_TD) ++ ++#define ATMEL_SSC_RK 0x10 ++#define ATMEL_SSC_RF 0x20 ++#define ATMEL_SSC_RD 0x40 ++#define ATMEL_SSC_RX (ATMEL_SSC_RK | ATMEL_SSC_RF | ATMEL_SSC_RD) ++ ++extern void __init at91_add_device_ssc(unsigned id, unsigned pins); ++ + /* LCD Controller */ + struct atmel_lcdfb_info; + extern void __init at91_add_device_lcdc(struct atmel_lcdfb_info *data); +@@ -126,10 +154,12 @@ + }; + extern void __init at91_add_device_ac97(struct atmel_ac97_data *data); + ++ /* ISI */ ++extern void __init at91_add_device_isi(void); ++ + /* LEDs */ +-extern u8 at91_leds_cpu; +-extern u8 at91_leds_timer; + extern void __init at91_init_leds(u8 cpu_led, u8 timer_led); ++extern void __init at91_gpio_leds(struct gpio_led *leds, int nr); + + /* FIXME: this needs a better location, but gets stuff building again */ + extern int at91_suspend_entering_slow_clock(void); +diff -urN -x CVS linux-2.6.24/include/asm-arm/arch-at91/cpu.h linux-2.6/include/asm-arm/arch-at91/cpu.h +--- linux-2.6.24/include/asm-arm/arch-at91/cpu.h 2007-10-09 22:31:38.000000000 +0200 ++++ linux-2.6/include/asm-arm/arch-at91/cpu.h 2008-01-17 11:41:08.000000000 +0200 +@@ -21,13 +21,13 @@ + #define ARCH_ID_AT91SAM9260 0x019803a0 + #define ARCH_ID_AT91SAM9261 0x019703a0 + #define ARCH_ID_AT91SAM9263 0x019607a0 ++#define ARCH_ID_AT91SAM9RL64 0x019b03a0 ++#define ARCH_ID_AT91CAP9 0x039A03A0 + + #define ARCH_ID_AT91SAM9XE128 0x329973a0 + #define ARCH_ID_AT91SAM9XE256 0x329a93a0 + #define ARCH_ID_AT91SAM9XE512 0x329aa3a0 + +-#define ARCH_ID_AT91SAM9RL64 0x019b03a0 +- + #define ARCH_ID_AT91M40800 0x14080044 + #define ARCH_ID_AT91R40807 0x44080746 + #define ARCH_ID_AT91M40807 0x14080745 +@@ -81,6 +81,11 @@ + #define cpu_is_at91sam9rl() (0) + #endif + ++#ifdef CONFIG_ARCH_AT91CAP9 ++#define cpu_is_at91cap9() (at91_cpu_identify() == ARCH_ID_AT91CAP9) ++#else ++#define cpu_is_at91cap9() (0) ++#endif + + /* + * Since this is ARM, we will never run on any AVR32 CPU. But these +diff -urN -x CVS linux-2.6.24/include/asm-arm/arch-at91/entry-macro.S linux-2.6/include/asm-arm/arch-at91/entry-macro.S +--- linux-2.6.24/include/asm-arm/arch-at91/entry-macro.S 2007-10-09 22:31:38.000000000 +0200 ++++ linux-2.6/include/asm-arm/arch-at91/entry-macro.S 2008-01-16 21:24:29.000000000 +0200 +@@ -17,13 +17,13 @@ + .endm + + .macro get_irqnr_preamble, base, tmp ++ ldr \base, =(AT91_VA_BASE_SYS + AT91_AIC) @ base virtual address of AIC peripheral + .endm + + .macro arch_ret_to_user, tmp1, tmp2 + .endm + + .macro get_irqnr_and_base, irqnr, irqstat, base, tmp +- ldr \base, =(AT91_VA_BASE_SYS + AT91_AIC) @ base virtual address of AIC peripheral + ldr \irqnr, [\base, #(AT91_AIC_IVR - AT91_AIC)] @ read IRQ vector register: de-asserts nIRQ to processor (and clears interrupt) + ldr \irqstat, [\base, #(AT91_AIC_ISR - AT91_AIC)] @ read interrupt source number + teq \irqstat, #0 @ ISR is 0 when no current interrupt, or spurious interrupt +diff -urN -x CVS linux-2.6.24/include/asm-arm/arch-at91/hardware.h linux-2.6/include/asm-arm/arch-at91/hardware.h +--- linux-2.6.24/include/asm-arm/arch-at91/hardware.h 2007-10-09 22:31:38.000000000 +0200 ++++ linux-2.6/include/asm-arm/arch-at91/hardware.h 2008-01-16 21:25:18.000000000 +0200 +@@ -26,6 +26,8 @@ + #include <asm/arch/at91sam9263.h> + #elif defined(CONFIG_ARCH_AT91SAM9RL) + #include <asm/arch/at91sam9rl.h> ++#elif defined(CONFIG_ARCH_AT91CAP9) ++#include <asm/arch/at91cap9.h> + #elif defined(CONFIG_ARCH_AT91X40) + #include <asm/arch/at91x40.h> + #else +diff -urN -x CVS linux-2.6.24/include/asm-arm/arch-at91/ics1523.h linux-2.6/include/asm-arm/arch-at91/ics1523.h +--- linux-2.6.24/include/asm-arm/arch-at91/ics1523.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-2.6/include/asm-arm/arch-at91/ics1523.h 2008-01-16 21:24:29.000000000 +0200 +@@ -0,0 +1,154 @@ ++//*---------------------------------------------------------------------------- ++//* ATMEL Microcontroller Software Support - ROUSSET - ++//*---------------------------------------------------------------------------- ++//* The software is delivered "AS IS" without warranty or condition of any ++//* kind, either express, implied or statutory. This includes without ++//* limitation any warranty or condition with respect to merchantability or ++//* fitness for any particular purpose, or against the infringements of ++//* intellectual property rights of others. ++//*---------------------------------------------------------------------------- ++//* File Name : ics1523.h ++//* Object : Clock Generator Prototyping File. ++//* ++//* 1.0 08/28/02 ED : Creation ++//* 1.2 13/01/03 FB : Update on lib V3 ++//*---------------------------------------------------------------------------- ++ ++#ifndef ics1523_h ++#define ics1523_h ++ ++/*-------------------------------------------*/ ++/* ICS1523 TWI Serial Clock Definition */ ++/*-------------------------------------------*/ ++ ++#define ICS_MIN_CLOCK 100 /* Min Frequency Access Clock KHz */ ++#define ICS_MAX_CLOCK 400 /* Max Frequency Access Clock KHz */ ++#define ICS_TRANSFER_RATE ICS_MAX_CLOCK /* Transfer speed to apply */ ++ ++#define ICS_WRITE_CLK_PNB 30 /* TWCK Clock Periods required to write */ ++#define ICS_READ_CLK_PNB 40 /* TWCK Clock Periods required to read */ ++ ++/*-------------------------------------------*/ ++/* ICS1523 Write Operation Definition */ ++/*-------------------------------------------*/ ++ ++#define ICS1523_ACCESS_OK 0 /* OK */ ++#define ICS1523_ACCESS_ERROR -1 /* NOK */ ++ ++/*-------------------------------------------*/ ++/* ICS1523 Device Addresses Definition */ ++/*-------------------------------------------*/ ++ ++#define ICS_ADDR 0x26 /* Device Address */ ++ ++/*--------------------------------------------------*/ ++/* ICS1523 Registers Internal Addresses Definition */ ++/*--------------------------------------------------*/ ++ ++#define ICS_ICR 0x0 /* Input Control Register */ ++#define ICS_LCR 0x1 /* Loop Control Register */ ++#define ICS_FD0 0x2 /* PLL FeedBack Divider LSBs */ ++#define ICS_FD1 0x3 /* PLL FeedBack Divider MSBs */ ++#define ICS_DPAO 0x4 /* Dynamic Phase Aligner Offset */ ++#define ICS_DPAC 0x5 /* Dynamic Phase Aligner Resolution */ ++#define ICS_OE 0x6 /* Output Enables Register */ ++#define ICS_OD 0x7 /* Osc Divider Register */ ++#define ICS_SWRST 0x8 /* DPA & PLL Reset Register */ ++#define ICS_VID 0x10 /* Chip Version Register */ ++#define ICS_RID 0x11 /* Chip Revision Register */ ++#define ICS_SR 0x12 /* Status Register */ ++ ++/*------------------------------------------------------*/ ++/* ICS1523 Input Control Register Bits Definition */ ++/*------------------------------------------------------*/ ++ ++#define ICS_PDEN 0x1 /* Phase Detector Enable */ ++#define ICS_PDPOL 0x2 /* Phase Detector Enable Polarity */ ++#define ICS_REFPOL 0x4 /* External Reference Polarity */ ++#define ICS_FBKPOL 0x8 /* External Feedback Polarity */ ++#define ICS_FBKSEL 0x10 /* External Feedback Select */ ++#define ICS_FUNCSEL 0x20 /* Function Out Select */ ++#define ICS_ENPLS 0x40 /* Enable PLL Lock/Ref Status Output */ ++#define ICS_ENDLS 0x80 /* Enable DPA Lock/Ref Status Output */ ++ ++/*-----------------------------------------------------*/ ++/* ICS1523 Loop Control Register Bits Definition */ ++/*-----------------------------------------------------*/ ++ ++#define ICS_PFD 0x7 /* Phase Detector Gain */ ++#define ICS_PSD 0x30 /* Post-Scaler Divider */ ++ ++/*----------------------------------------------------*/ ++/* ICS1523 PLL FeedBack Divider LSBs Definition */ ++/*----------------------------------------------------*/ ++ ++#define ICS_FBDL 0xFF /* PLL FeedBack Divider LSBs */ ++ ++/*----------------------------------------------------*/ ++/* ICS1523 PLL FeedBack Divider MSBs Definition */ ++/*----------------------------------------------------*/ ++ ++#define ICS_FBDM 0xF /* PLL FeedBack Divider MSBs */ ++ ++/*------------------------------------------------------------*/ ++/* ICS1523 Dynamic Phase Aligner Offset Bits Definition */ ++/*------------------------------------------------------------*/ ++ ++#define ICS_DPAOS 0x2F /* Dynamic Phase Aligner Offset */ ++#define ICS_FILSEL 0x80 /* Loop Filter Select */ ++ ++/*----------------------------------------------------------------*/ ++/* ICS1523 Dynamic Phase Aligner Resolution Bits Definition */ ++/*----------------------------------------------------------------*/ ++ ++#define ICS_DPARES 0x3 /* Dynamic Phase Aligner Resolution */ ++#define ICS_MMREV 0xFC /* Metal Mask Revision Number */ ++ ++/*-------------------------------------------------------*/ ++/* ICS1523 Output Enables Register Bits Definition */ ++/*-------------------------------------------------------*/ ++ ++#define ICS_OEPCK 0x1 /* Output Enable for PECL PCLK Outputs */ ++#define ICS_OETCK 0x2 /* Output Enable for STTL CLK Output */ ++#define ICS_OEP2 0x4 /* Output Enable for PECL CLK/2 Outputs */ ++#define ICS_OET2 0x8 /* Output Enable for STTL CLK/2 Output */ ++#define ICS_OEF 0x10 /* Output Enable for STTL FUNC Output */ ++#define ICS_CLK2INV 0x20 /* CLK/2 Invert */ ++#define ICS_OSCL 0xC0 /* SSTL Clock Scaler */ ++ ++/*----------------------------------------------------*/ ++/* ICS1523 Osc Divider Register Bits Definition */ ++/*----------------------------------------------------*/ ++ ++#define ICS_OSCDIV 0x7F /* Oscillator Divider Modulus */ ++#define ICS_INSEL 0x80 /* Input Select */ ++ ++/*---------------------------------------------------*/ ++/* ICS1523 DPA & PLL Reset Register Definition */ ++/*---------------------------------------------------*/ ++ ++#define ICS_DPAR 0x0A /* DPA Reset Command */ ++#define ICS_PLLR 0x50 /* PLL Reset Command */ ++ ++/*------------------------------------------------*/ ++/* ICS1523 Chip Version Register Definition */ ++/*------------------------------------------------*/ ++ ++#define ICS_CHIPV 0xFF /* Chip Version */ ++ ++/*-------------------------------------------------*/ ++/* ICS1523 Chip Revision Register Definition */ ++/*-------------------------------------------------*/ ++ ++#define ICS_CHIPR 0xFF /* Chip Revision */ ++ ++/*------------------------------------------*/ ++/* ICS1523 Status Register Definition */ ++/*------------------------------------------*/ ++ ++#define ICS_DPALOCK 0x1 /* DPA Lock Status */ ++#define ICS_PLLLOCK 0x2 /* PLL Lock Status */ ++ ++int at91_ics1523_init(void); ++ ++#endif /* ics1523_h */ +diff -urN -x CVS linux-2.6.24/include/asm-arm/arch-at91/spi.h linux-2.6/include/asm-arm/arch-at91/spi.h +--- linux-2.6.24/include/asm-arm/arch-at91/spi.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-2.6/include/asm-arm/arch-at91/spi.h 2008-01-16 21:24:29.000000000 +0200 +@@ -0,0 +1,54 @@ ++/* ++ * Serial Peripheral Interface (SPI) driver for the Atmel AT91RM9200 ++ * ++ * (c) SAN People (Pty) Ltd ++ * ++ * This program is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU General Public License ++ * as published by the Free Software Foundation; either version ++ * 2 of the License, or (at your option) any later version. ++ */ ++ ++#ifndef AT91_LEGACY_SPI_H ++#define AT91_LEGACY_SPI_H ++ ++#define SPI_MAJOR 153 /* registered device number */ ++ ++#define DEFAULT_SPI_CLK 6000000 ++ ++ ++/* Maximum number of buffers in a single SPI transfer. ++ * DataFlash uses maximum of 2 ++ * spidev interface supports up to 8. ++ */ ++#define MAX_SPI_TRANSFERS 8 ++#define NR_SPI_DEVICES 4 /* number of devices on SPI bus */ ++ ++/* ++ * Describes the buffers for a SPI transfer. ++ * A transmit & receive buffer must be specified for each transfer ++ */ ++struct spi_transfer_list { ++ void* tx[MAX_SPI_TRANSFERS]; /* transmit */ ++ int txlen[MAX_SPI_TRANSFERS]; ++ void* rx[MAX_SPI_TRANSFERS]; /* receive */ ++ int rxlen[MAX_SPI_TRANSFERS]; ++ int nr_transfers; /* number of transfers */ ++ int curr; /* current transfer */ ++}; ++ ++struct spi_local { ++ unsigned int pcs; /* Peripheral Chip Select value */ ++ ++ struct spi_transfer_list *xfers; /* current transfer list */ ++ dma_addr_t tx, rx; /* DMA address for current transfer */ ++ dma_addr_t txnext, rxnext; /* DMA address for next transfer */ ++}; ++ ++ ++/* Exported functions */ ++extern void spi_access_bus(short device); ++extern void spi_release_bus(short device); ++extern int spi_transfer(struct spi_transfer_list* list); ++ ++#endif +diff -urN -x CVS linux-2.6.24/include/asm-arm/arch-at91/timex.h linux-2.6/include/asm-arm/arch-at91/timex.h +--- linux-2.6.24/include/asm-arm/arch-at91/timex.h 2007-10-09 22:31:38.000000000 +0200 ++++ linux-2.6/include/asm-arm/arch-at91/timex.h 2008-01-16 21:25:18.000000000 +0200 +@@ -42,6 +42,11 @@ + #define AT91SAM9_MASTER_CLOCK 100000000 + #define CLOCK_TICK_RATE (AT91SAM9_MASTER_CLOCK/16) + ++#elif defined(CONFIG_ARCH_AT91CAP9) ++ ++#define AT91CAP9_MASTER_CLOCK 100000000 ++#define CLOCK_TICK_RATE (AT91CAP9_MASTER_CLOCK/16) ++ + #elif defined(CONFIG_ARCH_AT91X40) + + #define AT91X40_MASTER_CLOCK 40000000 +diff -urN -x CVS linux-2.6.24/include/asm-arm/arch-at91/uncompress.h linux-2.6/include/asm-arm/arch-at91/uncompress.h +--- linux-2.6.24/include/asm-arm/arch-at91/uncompress.h 2007-10-09 22:31:38.000000000 +0200 ++++ linux-2.6/include/asm-arm/arch-at91/uncompress.h 2008-02-24 19:00:30.000000000 +0200 +@@ -22,7 +22,23 @@ + #define __ASM_ARCH_UNCOMPRESS_H + + #include <asm/io.h> +-#include <asm/arch/at91_dbgu.h> ++#include <linux/atmel_serial.h> ++ ++#if defined(CONFIG_AT91_EARLY_DBGU) ++#define UART_OFFSET (AT91_DBGU + AT91_BASE_SYS) ++#elif defined(CONFIG_AT91_EARLY_USART0) ++#define UART_OFFSET AT91_USART0 ++#elif defined(CONFIG_AT91_EARLY_USART1) ++#define UART_OFFSET AT91_USART1 ++#elif defined(CONFIG_AT91_EARLY_USART2) ++#define UART_OFFSET AT91_USART2 ++#elif defined(CONFIG_AT91_EARLY_USART3) ++#define UART_OFFSET AT91_USART3 ++#elif defined(CONFIG_AT91_EARLY_USART4) ++#define UART_OFFSET AT91_USART4 ++#elif defined(CONFIG_AT91_EARLY_USART5) ++#define UART_OFFSET AT91_USART5 ++#endif + + /* + * The following code assumes the serial port has already been +@@ -33,22 +49,22 @@ + */ + static void putc(int c) + { +-#ifdef AT91_DBGU +- void __iomem *sys = (void __iomem *) AT91_BASE_SYS; /* physical address */ ++#ifdef UART_OFFSET ++ void __iomem *sys = (void __iomem *) UART_OFFSET; /* physical address */ + +- while (!(__raw_readl(sys + AT91_DBGU_SR) & AT91_DBGU_TXRDY)) ++ while (!(__raw_readl(sys + ATMEL_US_CSR) & ATMEL_US_TXRDY)) + barrier(); +- __raw_writel(c, sys + AT91_DBGU_THR); ++ __raw_writel(c, sys + ATMEL_US_THR); + #endif + } + + static inline void flush(void) + { +-#ifdef AT91_DBGU +- void __iomem *sys = (void __iomem *) AT91_BASE_SYS; /* physical address */ ++#ifdef UART_OFFSET ++ void __iomem *sys = (void __iomem *) UART_OFFSET; /* physical address */ + + /* wait for transmission to complete */ +- while (!(__raw_readl(sys + AT91_DBGU_SR) & AT91_DBGU_TXEMPTY)) ++ while (!(__raw_readl(sys + ATMEL_US_CSR) & ATMEL_US_TXEMPTY)) + barrier(); + #endif + } +diff -urN -x CVS linux-2.6.24/include/asm-avr32/arch-at32ap/cpu.h linux-2.6/include/asm-avr32/arch-at32ap/cpu.h +--- linux-2.6.24/include/asm-avr32/arch-at32ap/cpu.h 2007-10-09 22:31:38.000000000 +0200 ++++ linux-2.6/include/asm-avr32/arch-at32ap/cpu.h 2008-01-16 21:35:26.000000000 +0200 +@@ -30,5 +30,6 @@ + #define cpu_is_at91sam9261() (0) + #define cpu_is_at91sam9263() (0) + #define cpu_is_at91sam9rl() (0) ++#define cpu_is_at91cap9() (0) + + #endif /* __ASM_ARCH_CPU_H */ +diff -urN -x CVS linux-2.6.24/include/linux/atmel_serial.h linux-2.6/include/linux/atmel_serial.h +--- linux-2.6.24/include/linux/atmel_serial.h 1970-01-01 02:00:00.000000000 +0200 ++++ linux-2.6/include/linux/atmel_serial.h 2008-02-24 19:00:30.000000000 +0200 +@@ -0,0 +1,127 @@ ++/* ++ * include/linux/atmel_serial.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 ATMEL_SERIAL_H ++#define ATMEL_SERIAL_H ++ ++#define ATMEL_US_CR 0x00 /* Control Register */ ++#define ATMEL_US_RSTRX (1 << 2) /* Reset Receiver */ ++#define ATMEL_US_RSTTX (1 << 3) /* Reset Transmitter */ ++#define ATMEL_US_RXEN (1 << 4) /* Receiver Enable */ ++#define ATMEL_US_RXDIS (1 << 5) /* Receiver Disable */ ++#define ATMEL_US_TXEN (1 << 6) /* Transmitter Enable */ ++#define ATMEL_US_TXDIS (1 << 7) /* Transmitter Disable */ ++#define ATMEL_US_RSTSTA (1 << 8) /* Reset Status Bits */ ++#define ATMEL_US_STTBRK (1 << 9) /* Start Break */ ++#define ATMEL_US_STPBRK (1 << 10) /* Stop Break */ ++#define ATMEL_US_STTTO (1 << 11) /* Start Time-out */ ++#define ATMEL_US_SENDA (1 << 12) /* Send Address */ ++#define ATMEL_US_RSTIT (1 << 13) /* Reset Iterations */ ++#define ATMEL_US_RSTNACK (1 << 14) /* Reset Non Acknowledge */ ++#define ATMEL_US_RETTO (1 << 15) /* Rearm Time-out */ ++#define ATMEL_US_DTREN (1 << 16) /* Data Terminal Ready Enable [AT91RM9200 only] */ ++#define ATMEL_US_DTRDIS (1 << 17) /* Data Terminal Ready Disable [AT91RM9200 only] */ ++#define ATMEL_US_RTSEN (1 << 18) /* Request To Send Enable */ ++#define ATMEL_US_RTSDIS (1 << 19) /* Request To Send Disable */ ++ ++#define ATMEL_US_MR 0x04 /* Mode Register */ ++#define ATMEL_US_USMODE (0xf << 0) /* Mode of the USART */ ++#define ATMEL_US_USMODE_NORMAL 0 ++#define ATMEL_US_USMODE_RS485 1 ++#define ATMEL_US_USMODE_HWHS 2 ++#define ATMEL_US_USMODE_MODEM 3 ++#define ATMEL_US_USMODE_ISO7816_T0 4 ++#define ATMEL_US_USMODE_ISO7816_T1 6 ++#define ATMEL_US_USMODE_IRDA 8 ++#define ATMEL_US_USCLKS (3 << 4) /* Clock Selection */ ++#define ATMEL_US_USCLKS_MCK (0 << 4) ++#define ATMEL_US_USCLKS_MCK_DIV8 (1 << 4) ++#define ATMEL_US_USCLKS_SCK (3 << 4) ++#define ATMEL_US_CHRL (3 << 6) /* Character Length */ ++#define ATMEL_US_CHRL_5 (0 << 6) ++#define ATMEL_US_CHRL_6 (1 << 6) ++#define ATMEL_US_CHRL_7 (2 << 6) ++#define ATMEL_US_CHRL_8 (3 << 6) ++#define ATMEL_US_SYNC (1 << 8) /* Synchronous Mode Select */ ++#define ATMEL_US_PAR (7 << 9) /* Parity Type */ ++#define ATMEL_US_PAR_EVEN (0 << 9) ++#define ATMEL_US_PAR_ODD (1 << 9) ++#define ATMEL_US_PAR_SPACE (2 << 9) ++#define ATMEL_US_PAR_MARK (3 << 9) ++#define ATMEL_US_PAR_NONE (4 << 9) ++#define ATMEL_US_PAR_MULTI_DROP (6 << 9) ++#define ATMEL_US_NBSTOP (3 << 12) /* Number of Stop Bits */ ++#define ATMEL_US_NBSTOP_1 (0 << 12) ++#define ATMEL_US_NBSTOP_1_5 (1 << 12) ++#define ATMEL_US_NBSTOP_2 (2 << 12) ++#define ATMEL_US_CHMODE (3 << 14) /* Channel Mode */ ++#define ATMEL_US_CHMODE_NORMAL (0 << 14) ++#define ATMEL_US_CHMODE_ECHO (1 << 14) ++#define ATMEL_US_CHMODE_LOC_LOOP (2 << 14) ++#define ATMEL_US_CHMODE_REM_LOOP (3 << 14) ++#define ATMEL_US_MSBF (1 << 16) /* Bit Order */ ++#define ATMEL_US_MODE9 (1 << 17) /* 9-bit Character Length */ ++#define ATMEL_US_CLKO (1 << 18) /* Clock Output Select */ ++#define ATMEL_US_OVER (1 << 19) /* Oversampling Mode */ ++#define ATMEL_US_INACK (1 << 20) /* Inhibit Non Acknowledge */ ++#define ATMEL_US_DSNACK (1 << 21) /* Disable Successive NACK */ ++#define ATMEL_US_MAX_ITER (7 << 24) /* Max Iterations */ ++#define ATMEL_US_FILTER (1 << 28) /* Infrared Receive Line Filter */ ++ ++#define ATMEL_US_IER 0x08 /* Interrupt Enable Register */ ++#define ATMEL_US_RXRDY (1 << 0) /* Receiver Ready */ ++#define ATMEL_US_TXRDY (1 << 1) /* Transmitter Ready */ ++#define ATMEL_US_RXBRK (1 << 2) /* Break Received / End of Break */ ++#define ATMEL_US_ENDRX (1 << 3) /* End of Receiver Transfer */ ++#define ATMEL_US_ENDTX (1 << 4) /* End of Transmitter Transfer */ ++#define ATMEL_US_OVRE (1 << 5) /* Overrun Error */ ++#define ATMEL_US_FRAME (1 << 6) /* Framing Error */ ++#define ATMEL_US_PARE (1 << 7) /* Parity Error */ ++#define ATMEL_US_TIMEOUT (1 << 8) /* Receiver Time-out */ ++#define ATMEL_US_TXEMPTY (1 << 9) /* Transmitter Empty */ ++#define ATMEL_US_ITERATION (1 << 10) /* Max number of Repetitions Reached */ ++#define ATMEL_US_TXBUFE (1 << 11) /* Transmission Buffer Empty */ ++#define ATMEL_US_RXBUFF (1 << 12) /* Reception Buffer Full */ ++#define ATMEL_US_NACK (1 << 13) /* Non Acknowledge */ ++#define ATMEL_US_RIIC (1 << 16) /* Ring Indicator Input Change [AT91RM9200 only] */ ++#define ATMEL_US_DSRIC (1 << 17) /* Data Set Ready Input Change [AT91RM9200 only] */ ++#define ATMEL_US_DCDIC (1 << 18) /* Data Carrier Detect Input Change [AT91RM9200 only] */ ++#define ATMEL_US_CTSIC (1 << 19) /* Clear to Send Input Change */ ++#define ATMEL_US_RI (1 << 20) /* RI */ ++#define ATMEL_US_DSR (1 << 21) /* DSR */ ++#define ATMEL_US_DCD (1 << 22) /* DCD */ ++#define ATMEL_US_CTS (1 << 23) /* CTS */ ++ ++#define ATMEL_US_IDR 0x0c /* Interrupt Disable Register */ ++#define ATMEL_US_IMR 0x10 /* Interrupt Mask Register */ ++#define ATMEL_US_CSR 0x14 /* Channel Status Register */ ++#define ATMEL_US_RHR 0x18 /* Receiver Holding Register */ ++#define ATMEL_US_THR 0x1c /* Transmitter Holding Register */ ++#define ATMEL_US_SYNH (1 << 15) /* Transmit/Receive Sync [AT91SAM9261 only] */ ++ ++#define ATMEL_US_BRGR 0x20 /* Baud Rate Generator Register */ ++#define ATMEL_US_CD (0xffff << 0) /* Clock Divider */ ++ ++#define ATMEL_US_RTOR 0x24 /* Receiver Time-out Register */ ++#define ATMEL_US_TO (0xffff << 0) /* Time-out Value */ ++ ++#define ATMEL_US_TTGR 0x28 /* Transmitter Timeguard Register */ ++#define ATMEL_US_TG (0xff << 0) /* Timeguard Value */ ++ ++#define ATMEL_US_FIDI 0x40 /* FI DI Ratio Register */ ++#define ATMEL_US_NER 0x44 /* Number of Errors Register */ ++#define ATMEL_US_IF 0x4c /* IrDA Filter Register */ ++ ++#endif +diff -urN -x CVS linux-2.6.24/include/linux/clk.h linux-2.6/include/linux/clk.h +--- linux-2.6.24/include/linux/clk.h 2007-10-09 22:31:38.000000000 +0200 ++++ linux-2.6/include/linux/clk.h 2007-12-31 10:44:34.000000000 +0200 +@@ -121,4 +121,24 @@ + */ + struct clk *clk_get_parent(struct clk *clk); + ++/** ++ * clk_must_disable - report whether a clock's users must disable it ++ * @clk: one node in the clock tree ++ * ++ * This routine returns true only if the upcoming system state requires ++ * disabling the specified clock. ++ * ++ * It's common for platform power states to constrain certain clocks (and ++ * their descendants) to be unavailable, while other states allow that ++ * clock to be active. A platform's power states often include an "all on" ++ * mode; system wide sleep states like "standby" or "suspend-to-RAM"; and ++ * operating states which sacrifice functionality for lower power usage. ++ * ++ * The constraint value is commonly tested in device driver suspend(), to ++ * leave clocks active if they are needed for features like wakeup events. ++ * On platforms that support reduced functionality operating states, the ++ * constraint may also need to be tested during resume() and probe() calls. ++ */ ++int clk_must_disable(struct clk *clk); ++ + #endif +diff -urN -x CVS linux-2.6.24/include/linux/i2c-id.h linux-2.6/include/linux/i2c-id.h +--- linux-2.6.24/include/linux/i2c-id.h 2008-03-01 22:02:17.000000000 +0200 ++++ linux-2.6/include/linux/i2c-id.h 2008-01-16 13:15:35.000000000 +0200 +@@ -211,6 +211,7 @@ + + /* --- PCA 9564 based algorithms */ + #define I2C_HW_A_ISA 0x1a0000 /* generic ISA Bus interface card */ ++#define I2C_HW_A_PLAT 0x1a0001 /* generic platform_bus interface */ + + /* --- ACPI Embedded controller algorithms */ + #define I2C_HW_ACPI_EC 0x1f0000 +diff -urN -x CVS linux-2.6.24/include/video/atmel_lcdc.h linux-2.6/include/video/atmel_lcdc.h +--- linux-2.6.24/include/video/atmel_lcdc.h 2007-10-09 22:31:38.000000000 +0200 ++++ linux-2.6/include/video/atmel_lcdc.h 2008-02-25 22:45:57.000000000 +0200 +@@ -22,7 +22,7 @@ + #ifndef __ATMEL_LCDC_H__ + #define __ATMEL_LCDC_H__ + +- /* LCD Controller info data structure */ ++ /* LCD Controller info data structure, stored in device platform_data */ + struct atmel_lcdfb_info { + spinlock_t lock; + struct fb_info *info; +@@ -33,7 +33,15 @@ + struct platform_device *pdev; + struct clk *bus_clk; + struct clk *lcdc_clk; +- unsigned int default_bpp; ++ ++#ifdef CONFIG_BACKLIGHT_ATMEL_LCDC ++ struct backlight_device *backlight; ++ u8 bl_power; ++#endif ++ bool lcdcon_is_backlight; ++ u8 saved_lcdcon; ++ ++ u8 default_bpp; + unsigned int default_lcdcon2; + unsigned int default_dmacon; + void (*atmel_lcdfb_power_control)(int on); +diff -urN -x CVS linux-2.6.24/sound/soc/at91/eti_b1_wm8731.c linux-2.6/sound/soc/at91/eti_b1_wm8731.c +--- linux-2.6.24/sound/soc/at91/eti_b1_wm8731.c 2007-10-09 22:31:38.000000000 +0200 ++++ linux-2.6/sound/soc/at91/eti_b1_wm8731.c 2008-03-01 22:06:40.000000000 +0200 +@@ -34,8 +34,7 @@ + #include <sound/soc.h> + #include <sound/soc-dapm.h> + +-#include <asm/arch/hardware.h> +-#include <asm/arch/at91_pio.h> ++#include <asm/hardware.h> + #include <asm/arch/gpio.h> + + #include "../codecs/wm8731.h" +@@ -48,13 +47,6 @@ + #define DBG(x...) + #endif + +-#define AT91_PIO_TF1 (1 << (AT91_PIN_PB6 - PIN_BASE) % 32) +-#define AT91_PIO_TK1 (1 << (AT91_PIN_PB7 - PIN_BASE) % 32) +-#define AT91_PIO_TD1 (1 << (AT91_PIN_PB8 - PIN_BASE) % 32) +-#define AT91_PIO_RD1 (1 << (AT91_PIN_PB9 - PIN_BASE) % 32) +-#define AT91_PIO_RK1 (1 << (AT91_PIN_PB10 - PIN_BASE) % 32) +-#define AT91_PIO_RF1 (1 << (AT91_PIN_PB11 - PIN_BASE) % 32) +- + static struct clk *pck1_clk; + static struct clk *pllb_clk; + +@@ -277,7 +269,6 @@ + static int __init eti_b1_init(void) + { + int ret; +- u32 ssc_pio_lines; + struct at91_ssc_periph *ssc = eti_b1_dai.cpu_dai->private_data; + + if (!request_mem_region(AT91RM9200_BASE_SSC1, SZ_16K, "soc-audio")) { +@@ -311,19 +302,12 @@ + goto fail_io_unmap; + } + +- ssc_pio_lines = AT91_PIO_TF1 | AT91_PIO_TK1 | AT91_PIO_TD1 +- | AT91_PIO_RD1 /* | AT91_PIO_RK1 */ | AT91_PIO_RF1; +- +- /* Reset all PIO registers and assign lines to peripheral A */ +- at91_sys_write(AT91_PIOB + PIO_PDR, ssc_pio_lines); +- at91_sys_write(AT91_PIOB + PIO_ODR, ssc_pio_lines); +- at91_sys_write(AT91_PIOB + PIO_IFDR, ssc_pio_lines); +- at91_sys_write(AT91_PIOB + PIO_CODR, ssc_pio_lines); +- at91_sys_write(AT91_PIOB + PIO_IDR, ssc_pio_lines); +- at91_sys_write(AT91_PIOB + PIO_MDDR, ssc_pio_lines); +- at91_sys_write(AT91_PIOB + PIO_PUDR, ssc_pio_lines); +- at91_sys_write(AT91_PIOB + PIO_ASR, ssc_pio_lines); +- at91_sys_write(AT91_PIOB + PIO_OWDR, ssc_pio_lines); ++ at91_set_A_periph(AT91_PIN_PB6, 0); /* TF1 */ ++ at91_set_A_periph(AT91_PIN_PB7, 0); /* TK1 */ ++ at91_set_A_periph(AT91_PIN_PB8, 0); /* TD1 */ ++ at91_set_A_periph(AT91_PIN_PB9, 0); /* RD1 */ ++/* at91_set_A_periph(AT91_PIN_PB10, 0);*/ /* RK1 */ ++ at91_set_A_periph(AT91_PIN_PB11, 0); /* RF1 */ + + /* + * Set PCK1 parent to PLLB and its rate to 12 Mhz. +diff -urN -x CVS linux-2.6.24/sound/spi/at73c213.c linux-2.6/sound/spi/at73c213.c +--- linux-2.6.24/sound/spi/at73c213.c 2008-03-01 22:02:18.000000000 +0200 ++++ linux-2.6/sound/spi/at73c213.c 2008-02-26 20:37:07.000000000 +0200 +@@ -112,7 +112,11 @@ + static struct snd_pcm_hardware snd_at73c213_playback_hw = { + .info = SNDRV_PCM_INFO_INTERLEAVED | + SNDRV_PCM_INFO_BLOCK_TRANSFER, ++#ifdef __BIG_ENDIAN + .formats = SNDRV_PCM_FMTBIT_S16_BE, ++#else ++ .formats = SNDRV_PCM_FMTBIT_S16_LE, ++#endif + .rates = SNDRV_PCM_RATE_CONTINUOUS, + .rate_min = 8000, /* Replaced by chip->bitrate later. */ + .rate_max = 50000, /* Replaced by chip->bitrate later. */ |